From 3e0867c59352f1f36c92266bca0526d92a85f014 Mon Sep 17 00:00:00 2001 From: Shrukan Date: Sat, 17 Feb 2024 15:30:44 -0700 Subject: [PATCH 01/14] First cut at CI workflows --- .gitea/workflows/build_and_test.yml | 55 +++++++++++++++ .gitea/workflows/build_docs.yml | 25 +++++++ .gitea/workflows/build_image.yml | 36 ++++++++++ ci/build-and-test.yml | 100 ---------------------------- 4 files changed, 116 insertions(+), 100 deletions(-) create mode 100644 .gitea/workflows/build_and_test.yml create mode 100644 .gitea/workflows/build_docs.yml create mode 100644 .gitea/workflows/build_image.yml delete mode 100644 ci/build-and-test.yml diff --git a/.gitea/workflows/build_and_test.yml b/.gitea/workflows/build_and_test.yml new file mode 100644 index 0000000..e59e07b --- /dev/null +++ b/.gitea/workflows/build_and_test.yml @@ -0,0 +1,55 @@ +name: Build and Test Code +run-name: ${{ gitea.ref }} Build +on: + push: + +jobs: + test: + runs-on: ubuntu-latest + container: gitea.shrukanslab.xyz/CppTemplate/dev-environment:latest + steps: + - name: Check out repository code + uses: actions/checkout@v3 + + - name: Unit test + run: just test + + coverage: + runs-on: ubuntu-latest + container: gitea.shrukanslab.xyz/CppTemplate/dev-environment:latest + steps: + - name: Check out repository code + uses: actions/checkout@v3 + + - name: Coverage + run: just coverage + + - name: Compress coverage report + run: tar -czf build/coverage.tar.gz build/meson-logs/coveragereport + + - name: Archive coverage report + uses: actions/upload-artifact@v4 + with: + name: docs + path: build/coverage.tar.gz + retention-days: 5 + + static_analysis: + runs-on: ubuntu-latest + container: gitea.shrukanslab.xyz/CppTemplate/dev-environment:latest + steps: + - name: Check out repository code + uses: actions/checkout@v3 + + - name: Static analysis + run: just check + + sanitize: + runs-on: ubuntu-latest + container: gitea.shrukanslab.xyz/CppTemplate/dev-environment:latest + steps: + - name: Check out repository code + uses: actions/checkout@v3 + + - name: Sanitize + run: just sanitize diff --git a/.gitea/workflows/build_docs.yml b/.gitea/workflows/build_docs.yml new file mode 100644 index 0000000..7c779ae --- /dev/null +++ b/.gitea/workflows/build_docs.yml @@ -0,0 +1,25 @@ +name: Build Docs +run-name: ${{ gitea.ref }} Build +on: + push: + +jobs: + build-docs: + runs-on: ubuntu-latest + container: gitea.shrukanslab.xyz/CppTemplate/dev-environment:latest + steps: + - name: Check out repository code + uses: actions/checkout@v3 + + - name: Build docs + run: just docs + + - name: Compress docs + run: tar -czf build/docs.tar.gz build/docs + + - name: Archive docs + uses: actions/upload-artifact@v4 + with: + name: docs + path: build/docs.tar.gz + retention-days: 5 diff --git a/.gitea/workflows/build_image.yml b/.gitea/workflows/build_image.yml new file mode 100644 index 0000000..a6fbc2b --- /dev/null +++ b/.gitea/workflows/build_image.yml @@ -0,0 +1,36 @@ +name: Build Image +run-name: ${{ gitea.ref }} Build +on: + push: + +jobs: + build-dev-image: + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v3 + + - name: Install Docker + run: curl -fsSL https://get.docker.com | sh + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log into Gitea + uses: docker/login-action@v1 + with: + registry: gitea.shrukanslab.xyz + username: ${{ secrets.ROBOT_USERNAME }} + password: ${{ secrets.ROBOT_PASSWORD }} + + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + platforms: linux/amd64 + push: true + tags: | + gitea.shrukanslab.xyz/CppTemplate/dev-environment:latest + + - name: Logout from Docker Registry + run: docker logout gitea.shrukanslab.xyz diff --git a/ci/build-and-test.yml b/ci/build-and-test.yml deleted file mode 100644 index 85df50a..0000000 --- a/ci/build-and-test.yml +++ /dev/null @@ -1,100 +0,0 @@ -resources: -- name: build-image - type: registry-image - icon: docker - source: - repository: gitea.shrukanslab.xyz/sl-devs/meson-build - -- name: cpp-src - type: git - icon: git - source: - uri: ((git-repo-url)) - branch: main - username: ((gitea.username)) - password: ((gitea.password)) - -- name: dev-image - type: registry-image - icon: docker - source: - repository: gitea.shrukanslab.xyz/sl-devs/((image-name)) - tag: latest - username: ((gitea.username)) - password: ((gitea.password)) - -jobs: -- name: unit - plan: - - in_parallel: - - get: build-image - - get: cpp-src - trigger: true - - task: run-test - image: build-image - config: - platform: linux - inputs: - - name: cpp-src - path: "./" - run: - path: make - args: ["test"] - -- name: coverage - plan: - - in_parallel: - - get: build-image - - get: cpp-src - trigger: true - - task: run-test - image: build-image - config: - platform: linux - inputs: - - name: cpp-src - path: "./" - run: - path: make - args: ["coverage"] - -- name: docs - plan: - - in_parallel: - - get: build-image - - get: cpp-src - trigger: true - - task: run-test - image: build-image - config: - platform: linux - inputs: - - name: cpp-src - path: "./" - run: - path: make - args: ["configure", "docs/html"] - -- name: build-image - plan: - - get: cpp-src - - task: build-image - privileged: true # oci-build-task must run in a privileged container - config: - platform: linux - image_resource: - type: registry-image - source: - repository: concourse/oci-build-task - inputs: - - name: cpp-src - outputs: - - name: image - params: - CONTEXT: cpp-src - run: - path: build - - - put: dev-image - params: - image: image/image.tar \ No newline at end of file -- 2.49.0 From c44db2b219840fc5d386125fe7d4c42474e878bb Mon Sep 17 00:00:00 2001 From: Shrukan Date: Sat, 17 Feb 2024 16:43:10 -0700 Subject: [PATCH 02/14] Testing different container settings --- .gitea/workflows/build_and_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/build_and_test.yml b/.gitea/workflows/build_and_test.yml index e59e07b..38ed16f 100644 --- a/.gitea/workflows/build_and_test.yml +++ b/.gitea/workflows/build_and_test.yml @@ -6,7 +6,7 @@ on: jobs: test: runs-on: ubuntu-latest - container: gitea.shrukanslab.xyz/CppTemplate/dev-environment:latest + #container: gitea.shrukanslab.xyz/sl-devs/cpp-template/dev-environment:latest steps: - name: Check out repository code uses: actions/checkout@v3 -- 2.49.0 From 5a21c793a576b1617c56300a13cb697a52e2ce76 Mon Sep 17 00:00:00 2001 From: Shrukan Date: Sat, 17 Feb 2024 16:54:34 -0700 Subject: [PATCH 03/14] Fix artifact version --- .gitea/workflows/build_and_test.yml | 2 +- .gitea/workflows/build_docs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/build_and_test.yml b/.gitea/workflows/build_and_test.yml index b4d36e8..dd18d56 100644 --- a/.gitea/workflows/build_and_test.yml +++ b/.gitea/workflows/build_and_test.yml @@ -28,7 +28,7 @@ jobs: run: tar -czf build/coverage.tar.gz build/meson-logs/coveragereport - name: Archive coverage report - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v3 with: name: docs path: build/coverage.tar.gz diff --git a/.gitea/workflows/build_docs.yml b/.gitea/workflows/build_docs.yml index 7ce7979..95e6046 100644 --- a/.gitea/workflows/build_docs.yml +++ b/.gitea/workflows/build_docs.yml @@ -19,7 +19,7 @@ jobs: run: tar -czf build/docs.tar.gz build/docs - name: Archive docs - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v3 with: name: docs path: build/docs.tar.gz -- 2.49.0 From 519906b3edcd0bb39a8622298b03c62781558448 Mon Sep 17 00:00:00 2001 From: Shrukan Date: Sat, 17 Feb 2024 16:55:41 -0700 Subject: [PATCH 04/14] Fix static analysis jobs --- .gitea/workflows/build_and_test.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitea/workflows/build_and_test.yml b/.gitea/workflows/build_and_test.yml index dd18d56..e9c6334 100644 --- a/.gitea/workflows/build_and_test.yml +++ b/.gitea/workflows/build_and_test.yml @@ -41,6 +41,9 @@ jobs: - name: Check out repository code uses: actions/checkout@v4 + - name: Configure + run: just configure + - name: Static analysis run: just check @@ -51,5 +54,8 @@ jobs: - name: Check out repository code uses: actions/checkout@v4 + - name: Configure + run: just configure + - name: Sanitize run: just sanitize -- 2.49.0 From 236e919ef849761bd4539b495c367d8daa3e677c Mon Sep 17 00:00:00 2001 From: Shrukan Date: Sat, 17 Feb 2024 17:12:03 -0700 Subject: [PATCH 05/14] Fix CI configs --- .gitea/workflows/build_and_test.yml | 2 +- .gitea/workflows/build_docs.yml | 5 +++++ .gitea/workflows/build_image.yml | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/build_and_test.yml b/.gitea/workflows/build_and_test.yml index e9c6334..1195336 100644 --- a/.gitea/workflows/build_and_test.yml +++ b/.gitea/workflows/build_and_test.yml @@ -30,7 +30,7 @@ jobs: - name: Archive coverage report uses: actions/upload-artifact@v3 with: - name: docs + name: coverage_report path: build/coverage.tar.gz retention-days: 5 diff --git a/.gitea/workflows/build_docs.yml b/.gitea/workflows/build_docs.yml index 95e6046..dfb05d7 100644 --- a/.gitea/workflows/build_docs.yml +++ b/.gitea/workflows/build_docs.yml @@ -2,6 +2,8 @@ name: Build Docs run-name: ${{ gitea.ref }} Build on: push: + branches: + - main jobs: build-docs: @@ -12,6 +14,9 @@ jobs: - name: Check out repository code uses: actions/checkout@v4 + - name: Configure + run: just configure + - name: Build docs run: just docs diff --git a/.gitea/workflows/build_image.yml b/.gitea/workflows/build_image.yml index 2792231..ac67b33 100644 --- a/.gitea/workflows/build_image.yml +++ b/.gitea/workflows/build_image.yml @@ -2,6 +2,8 @@ name: Build Image run-name: ${{ gitea.ref }} Build on: push: + branches: + - main jobs: build-dev-image: -- 2.49.0 From f03782c3802ee377ea2018f90bba6a82a6077d9f Mon Sep 17 00:00:00 2001 From: Shrukan Date: Sun, 18 Feb 2024 00:15:05 +0000 Subject: [PATCH 06/14] Fix CI configs to actually work Co-authored-by: Shrukan Reviewed-on: https://gitea.shrukanslab.xyz/sl-devs/cpp-template/pulls/7 --- .gitea/workflows/build_and_test.yml | 10 ++++++++-- .gitea/workflows/build_docs.yml | 8 +++++++- .gitea/workflows/build_image.yml | 2 ++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/build_and_test.yml b/.gitea/workflows/build_and_test.yml index b4d36e8..1195336 100644 --- a/.gitea/workflows/build_and_test.yml +++ b/.gitea/workflows/build_and_test.yml @@ -28,9 +28,9 @@ jobs: run: tar -czf build/coverage.tar.gz build/meson-logs/coveragereport - name: Archive coverage report - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v3 with: - name: docs + name: coverage_report path: build/coverage.tar.gz retention-days: 5 @@ -41,6 +41,9 @@ jobs: - name: Check out repository code uses: actions/checkout@v4 + - name: Configure + run: just configure + - name: Static analysis run: just check @@ -51,5 +54,8 @@ jobs: - name: Check out repository code uses: actions/checkout@v4 + - name: Configure + run: just configure + - name: Sanitize run: just sanitize diff --git a/.gitea/workflows/build_docs.yml b/.gitea/workflows/build_docs.yml index 0ac25e2..dfb05d7 100644 --- a/.gitea/workflows/build_docs.yml +++ b/.gitea/workflows/build_docs.yml @@ -2,15 +2,21 @@ name: Build Docs run-name: ${{ gitea.ref }} Build on: push: + branches: + - main jobs: build-docs: runs-on: ubuntu-latest + container: gitea.shrukanslab.xyz/sl-devs/cpp-template/dev-environment:latest steps: - name: Check out repository code uses: actions/checkout@v4 + - name: Configure + run: just configure + - name: Build docs run: just docs @@ -18,7 +24,7 @@ jobs: run: tar -czf build/docs.tar.gz build/docs - name: Archive docs - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v3 with: name: docs path: build/docs.tar.gz diff --git a/.gitea/workflows/build_image.yml b/.gitea/workflows/build_image.yml index 2792231..ac67b33 100644 --- a/.gitea/workflows/build_image.yml +++ b/.gitea/workflows/build_image.yml @@ -2,6 +2,8 @@ name: Build Image run-name: ${{ gitea.ref }} Build on: push: + branches: + - main jobs: build-dev-image: -- 2.49.0 From 30e9e356008f52beb5b378ffd1491d10ed8cef0d Mon Sep 17 00:00:00 2001 From: Shrukan Date: Sat, 17 Feb 2024 18:18:19 -0700 Subject: [PATCH 07/14] Bump doctest version --- subprojects/doctest.wrap | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/subprojects/doctest.wrap b/subprojects/doctest.wrap index 88fa287..f9a150f 100644 --- a/subprojects/doctest.wrap +++ b/subprojects/doctest.wrap @@ -1,9 +1,10 @@ [wrap-file] -directory = doctest-2.4.9 -source_url = https://github.com/doctest/doctest/archive/refs/tags/v2.4.9.tar.gz -source_filename = doctest-2.4.9.tar.gz -source_hash = 19b2df757f2f3703a5e63cee553d85596875f06d91a3333acd80a969ef210856 -wrapdb_version = 2.4.9-1 +directory = doctest-2.4.11 +source_url = https://github.com/doctest/doctest/archive/refs/tags/v2.4.11.tar.gz +source_filename = doctest-2.4.11.tar.gz +source_hash = 632ed2c05a7f53fa961381497bf8069093f0d6628c5f26286161fbd32a560186 +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/doctest_2.4.11-1/doctest-2.4.11.tar.gz +wrapdb_version = 2.4.11-1 [provide] dependency_names = doctest -- 2.49.0 From b1c58e77ddc4f235667afc5f789fdf7bbf8033b8 Mon Sep 17 00:00:00 2001 From: Shrukan Date: Sat, 17 Feb 2024 18:18:38 -0700 Subject: [PATCH 08/14] Use mold as linker --- Dockerfile | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Dockerfile b/Dockerfile index 913250e..ac6f343 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,6 +8,17 @@ RUN pip install --break-system-packages meson gcovr RUN curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to /usr/bin +# Install mold from tarball, as the version in the package manager is very old +RUN wget -O mold.tar.gz https://github.com/rui314/mold/releases/download/v2.4.0/mold-2.4.0-x86_64-linux.tar.gz && \ + tar -xzf mold.tar.gz && \ + cp -r mold-2.4.0-x86_64-linux/* /usr/local/ && \ + rm -r mold-2.4.0-x86_64-linux && \ + rm mold.tar.gz + +# Set mold as the default linker +ENV CC_LD=mold +ENV CXX_LD=mold + # Install node for actions RUN curl -fsSL https://deb.nodesource.com/setup_current.x | bash - && apt-get install -y nodejs -- 2.49.0 From e7aca940f101b432690adc92f1507ae1037a7fb6 Mon Sep 17 00:00:00 2001 From: Shrukan Date: Sat, 17 Feb 2024 18:46:26 -0700 Subject: [PATCH 09/14] Add support for commitizen and pre-commit --- .cz.toml | 8 ++++++++ .pre-commit-config.yaml | 16 ++++++++++++++++ Justfile | 21 ++++++++++++--------- meson.build | 2 +- 4 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 .cz.toml create mode 100644 .pre-commit-config.yaml diff --git a/.cz.toml b/.cz.toml new file mode 100644 index 0000000..c4f4bed --- /dev/null +++ b/.cz.toml @@ -0,0 +1,8 @@ +[tool.commitizen] +name = "cz_conventional_commits" +tag_format = "0.0.1" +version_scheme = "semver" +version = "1.0.0" +update_changelog_on_bump = true +major_version_zero = true +version_files = ["meson.build:version"] diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..7fd3e70 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,16 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-added-large-files + + - repo: https://github.com/commitizen-tools/commitizen + rev: 3.8.0 + hooks: + - id: commitizen + - id: commitizen-branch + stages: [push] diff --git a/Justfile b/Justfile index 1975e3f..28ca546 100644 --- a/Justfile +++ b/Justfile @@ -1,26 +1,28 @@ -# Set default values for variables. Justfile doesn't support dynamic defaulting in -# the same way Make does, so we have to handle it within the command executions. - # Default build prefix and type BUILD_PREFIX := "./build" BUILD_TYPE := "release" set positional-arguments -# Set up the actual BUILD_PREFIX based on the presence of the directory -#BUILD_PREFIX := `mkdir -p {{BUILD_PREFIX}} && cd {{BUILD_PREFIX}} && pwd` - -default: build +# List all available targets +default: + just --list +# Build and run the development environment dev: docker build -t dev-container -f Dockerfile . + # Note: running with the volumes mounted in the same directory allows clangd to work docker run -it --rm -v $(pwd):$(pwd) dev-container -c "cd $(pwd) && /bin/zsh" +# Bootstrap the project when cloning for the first time by installing git hooks and others +bootstrap: + pre-commit install --hook-type commit-msg --hook-type pre-push + # Recipe to configure the build environment configure: @echo "\nBUILD_PREFIX: {{BUILD_PREFIX}}\n\n" meson setup --buildtype={{BUILD_TYPE}} {{BUILD_PREFIX}} -# Default build target +# Build a target, or default if none is specified build target="": configure ninja -C {{BUILD_PREFIX}} {{target}} @@ -32,7 +34,7 @@ test: build coverage: test ninja -C {{BUILD_PREFIX}} coverage -# Debug build +# Debug buildoutdated debug: meson configure {{BUILD_PREFIX}} --buildtype=debug ninja -C {{BUILD_PREFIX}} @@ -46,6 +48,7 @@ release: sanitize: meson configure {{BUILD_PREFIX}} -Db_sanitize=address ninja -C {{BUILD_PREFIX}} + ninja -C {{BUILD_PREFIX}} test # Static analysis check: diff --git a/meson.build b/meson.build index a8d081c..4bdb078 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('${REPO_NAME_PASCAL}', 'cpp', - version : '0.1', + version : '0.0.1', default_options : ['warning_level=3', 'cpp_std=c++20', 'b_coverage=true']) -- 2.49.0 From 61fa5ae7bba6b82acfb549e54a5e414031fe124c Mon Sep 17 00:00:00 2001 From: Shrukan Date: Sat, 17 Feb 2024 18:46:45 -0700 Subject: [PATCH 10/14] Archive unit test report as an artifact --- .gitea/workflows/build_and_test.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitea/workflows/build_and_test.yml b/.gitea/workflows/build_and_test.yml index 1195336..70a5c71 100644 --- a/.gitea/workflows/build_and_test.yml +++ b/.gitea/workflows/build_and_test.yml @@ -14,6 +14,11 @@ jobs: - name: Unit test run: just test + - name: Compress test report + run: tar -czf build/test_logs.tar.gz build/meson-logs + + - name: Archive test report + coverage: runs-on: ubuntu-latest container: gitea.shrukanslab.xyz/sl-devs/cpp-template/dev-environment:latest -- 2.49.0 From 28eafc2bd38dc3bea3a9925bb51e6ca66466f97e Mon Sep 17 00:00:00 2001 From: Shrukan Date: Sat, 17 Feb 2024 18:47:51 -0700 Subject: [PATCH 11/14] Fix unit test archive task --- .gitea/workflows/build_and_test.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitea/workflows/build_and_test.yml b/.gitea/workflows/build_and_test.yml index 70a5c71..bdb78b0 100644 --- a/.gitea/workflows/build_and_test.yml +++ b/.gitea/workflows/build_and_test.yml @@ -18,6 +18,11 @@ jobs: run: tar -czf build/test_logs.tar.gz build/meson-logs - name: Archive test report + uses: actions/upload-artifact@v3 + with: + name: test_logs + path: build/test_logs.tar.gz + retention-days: 5 coverage: runs-on: ubuntu-latest -- 2.49.0 From cd8b676bcf91e35496973b41e0871350ca94671d Mon Sep 17 00:00:00 2001 From: Shrukan Date: Sat, 17 Feb 2024 20:04:15 -0700 Subject: [PATCH 12/14] Only run image build if the Dockerfile changes --- .gitea/workflows/build_image.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitea/workflows/build_image.yml b/.gitea/workflows/build_image.yml index ac67b33..827b349 100644 --- a/.gitea/workflows/build_image.yml +++ b/.gitea/workflows/build_image.yml @@ -4,6 +4,8 @@ on: push: branches: - main + paths: + - "Dockerfile" jobs: build-dev-image: -- 2.49.0 From f040771918e5f9041af8ee9b647176f72d6abf22 Mon Sep 17 00:00:00 2001 From: Shrukan Date: Sat, 17 Feb 2024 20:07:53 -0700 Subject: [PATCH 13/14] Fix doxygen-awesome and update docs --- Justfile | 9 +- README.md | 36 +- docs/Dockerfile | 2 + docs/Doxyfile.in | 318 +- docs/doxygen-awesome.css | 7908 ----------------- .../doxygen-awesome-darkmode-toggle.js | 157 + .../doxygen-awesome-fragment-copy-button.js | 85 + .../doxygen-awesome-interactive-toc.js | 81 + .../doxygen-awesome-paragraph-link.js | 51 + ...n-awesome-sidebar-only-darkmode-toggle.css | 40 + .../doxygen-awesome-sidebar-only.css | 116 + docs/doxygen_awesome/doxygen-awesome-tabs.js | 90 + docs/doxygen_awesome/doxygen-awesome.css | 2669 ++++++ docs/logo.png | Bin 0 -> 7586 bytes docs/mainpage.md | 4 - docs/meson.build | 6 +- 16 files changed, 3545 insertions(+), 8027 deletions(-) create mode 100644 docs/Dockerfile delete mode 100644 docs/doxygen-awesome.css create mode 100644 docs/doxygen_awesome/doxygen-awesome-darkmode-toggle.js create mode 100644 docs/doxygen_awesome/doxygen-awesome-fragment-copy-button.js create mode 100644 docs/doxygen_awesome/doxygen-awesome-interactive-toc.js create mode 100644 docs/doxygen_awesome/doxygen-awesome-paragraph-link.js create mode 100644 docs/doxygen_awesome/doxygen-awesome-sidebar-only-darkmode-toggle.css create mode 100644 docs/doxygen_awesome/doxygen-awesome-sidebar-only.css create mode 100644 docs/doxygen_awesome/doxygen-awesome-tabs.js create mode 100644 docs/doxygen_awesome/doxygen-awesome.css create mode 100644 docs/logo.png delete mode 100644 docs/mainpage.md diff --git a/Justfile b/Justfile index 28ca546..0866b06 100644 --- a/Justfile +++ b/Justfile @@ -9,11 +9,12 @@ default: # Build and run the development environment dev: + # For flexibility, we just build it locally. This can be edited to pull from a remote image docker build -t dev-container -f Dockerfile . # Note: running with the volumes mounted in the same directory allows clangd to work docker run -it --rm -v $(pwd):$(pwd) dev-container -c "cd $(pwd) && /bin/zsh" -# Bootstrap the project when cloning for the first time by installing git hooks and others +# Bootstrap the project when cloning for the first time by installing git hooks bootstrap: pre-commit install --hook-type commit-msg --hook-type pre-push @@ -26,7 +27,7 @@ configure: build target="": configure ninja -C {{BUILD_PREFIX}} {{target}} -# Test recipe +# Run the unit tests test: build ninja -C {{BUILD_PREFIX}} test @@ -34,7 +35,7 @@ test: build coverage: test ninja -C {{BUILD_PREFIX}} coverage -# Debug buildoutdated +# Debug build debug: meson configure {{BUILD_PREFIX}} --buildtype=debug ninja -C {{BUILD_PREFIX}} @@ -44,7 +45,7 @@ release: meson configure {{BUILD_PREFIX}} --buildtype=release ninja -C {{BUILD_PREFIX}} -# Sanitize build +# Run tests with address sanitizer sanitize: meson configure {{BUILD_PREFIX}} -Db_sanitize=address ninja -C {{BUILD_PREFIX}} diff --git a/README.md b/README.md index 6cd8450..af835aa 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,29 @@ # ${REPO_NAME_PASCAL} -![CI](https://concourse.shrukanslab.xyz/api/v1/teams/sl-devs/pipelines/cpp-template/badge) - ${REPO_DESCRIPTION} ## Build Instructions + The provided Docker image includes all necessary dependencies to build and debug -C/C++ applications. While the main build system is Meson, a Makefile is provided +C/C++ applications. While the main build system is Meson, a Justfile is provided for convenience. With dependencies installed, or inside the Docker container, run the following: -- `make` to build the application -- `make test` to run all configured tests -- `make coverage` to run tests and generate coverage reports -- `make debug` to compile with debug flags -- `make release` to compile with release optimization (default) -- `make sanitize` to compile with address sanitizer -- `make scan-build` to run LLVM scan-build, if installed (not by default in the docker image) -- `make docs/html` to build the HTML Doxygen documentation -- `make clang-format` to run the autoformatter -- `make clean` to delete artifacts from the build directory -- `make spotless` to delete the build directory altogether and purge subprojects - -All other targets are passed directly to the Ninja backend. \ No newline at end of file +``` +Available recipes: + bootstrap # Bootstrap the project when cloning for the first time by installing git hooks + build target="" # Build a target, or default if none is specified + check # Static analysis + clean # Clean the build directory + configure # Recipe to configure the build environment + coverage # Coverage recipe + debug # Debug build + default # List all available targets + dev # Build and run the development environment + docs # Build the documentation + format # Run the autoformatter + release # Release build + sanitize # Run tests with address sanitizer + spotless # Obliterate the build directory + test # Run the unit tests +``` diff --git a/docs/Dockerfile b/docs/Dockerfile new file mode 100644 index 0000000..babfb8d --- /dev/null +++ b/docs/Dockerfile @@ -0,0 +1,2 @@ +FROM nginx:latest +COPY ./build/docs/html /usr/share/nginx/html diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in index a8e0f76..a8d7bb7 100644 --- a/docs/Doxyfile.in +++ b/docs/Doxyfile.in @@ -1,4 +1,4 @@ -# Doxyfile 1.9.5 +# Doxyfile 1.10.0 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -61,7 +61,13 @@ PROJECT_BRIEF = # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = +PROJECT_LOGO = @TOP_SRCDIR@/docs/logo.png + +# With the PROJECT_ICON tag one can specify an icon that is included in the tabs +# when the HTML document is shown. Doxygen will copy the logo to the output +# directory. + +PROJECT_ICON = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is @@ -86,7 +92,7 @@ CREATE_SUBDIRS = NO # level increment doubles the number of directories, resulting in 4096 # directories at level 8 which is the default and also the maximum value. The # sub-directories are organized in 2 levels, the first level always has a fixed -# numer of 16 directories. +# number of 16 directories. # Minimum value: 0, maximum value: 8, default value: 8. # This tag requires that the tag CREATE_SUBDIRS is set to YES. @@ -363,6 +369,17 @@ MARKDOWN_SUPPORT = YES TOC_INCLUDE_HEADINGS = 5 +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = DOXYGEN + # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or @@ -487,6 +504,14 @@ LOOKUP_CACHE_SIZE = 0 NUM_PROC_THREADS = 0 +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = NO + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -568,7 +593,8 @@ HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO @@ -859,11 +885,26 @@ WARN_IF_INCOMPLETE_DOC = YES WARN_NO_PARAMDOC = NO +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS # then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but # at the end of the doxygen process doxygen will return with a non-zero status. -# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. # The default value is: NO. WARN_AS_ERROR = NO @@ -909,8 +950,8 @@ WARN_LOGFILE = # Note: If this tag is empty the current directory is searched. INPUT = @TOP_SRCDIR@/include \ - @TOP_SRCDIR@/src \ - @TOP_SRCDIR@/docs + @TOP_SRCDIR@/docs \ + @TOP_SRCDIR@/README.md # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -943,12 +984,12 @@ INPUT_FILE_ENCODING = # Note the list of default checked file patterns might differ from the list of # default file extension mappings. # -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, -# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C -# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, -# *.vhdl, *.ucf, *.qsf and *.ice. +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.ccm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, +# *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, +# *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to +# be provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ @@ -999,6 +1040,7 @@ RECURSIVE = YES EXCLUDE = @TOP_SRCDIR@/test \ @TOP_SRCDIR@/include/test \ + @TOP_SRCDIR@/src/test \ *test.cpp # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or @@ -1022,9 +1064,6 @@ EXCLUDE_PATTERNS = # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # ANamespace::AClass, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = @@ -1113,7 +1152,7 @@ FILTER_SOURCE_PATTERNS = # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. -USE_MDFILE_AS_MAINPAGE = +USE_MDFILE_AS_MAINPAGE = @TOP_SRCDIR@/README.md # The Fortran standard specifies that for fixed formatted Fortran code all # characters from position 72 are to be considered as comment. A common @@ -1138,7 +1177,8 @@ FORTRAN_COMMENT_AFTER = 72 SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. +# multi-line macros, enums or list initialized variables directly into the +# documentation. # The default value is: NO. INLINE_SOURCES = NO @@ -1261,10 +1301,11 @@ CLANG_DATABASE_PATH = ALPHABETICAL_INDEX = YES -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = @@ -1343,10 +1384,17 @@ HTML_STYLESHEET = # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = @DOXYGEN_AWESOME@ +HTML_EXTRA_STYLESHEET = @TOP_SRCDIR@/docs/doxygen_awesome/doxygen-awesome.css \ + @TOP_SRCDIR@/docs/doxygen_awesome/doxygen-awesome-sidebar-only.css \ + @TOP_SRCDIR@/docs/doxygen_awesome/doxygen-awesome-sidebar-only-darkmode-toggle.css # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1356,24 +1404,25 @@ HTML_EXTRA_STYLESHEET = @DOXYGEN_AWESOME@ # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_FILES = +HTML_EXTRA_FILES = @TOP_SRCDIR@/docs/doxygen_awesome/doxygen-awesome-darkmode-toggle.js \ + @TOP_SRCDIR@/docs/doxygen_awesome/doxygen-awesome-fragment-copy-button.js \ + @TOP_SRCDIR@/docs/doxygen_awesome/doxygen-awesome-paragraph-link.js \ + @TOP_SRCDIR@/docs/doxygen_awesome/doxygen-custom/toggle-alternative-theme.js \ + @TOP_SRCDIR@/docs/doxygen_awesome/doxygen-awesome-interactive-toc.js \ + @TOP_SRCDIR@/docs/doxygen_awesome/doxygen-awesome-tabs.js # The HTML_COLORSTYLE tag can be used to specify if the generated HTML output -# should be rendered with a dark or light theme. Default setting AUTO_LIGHT -# enables light output unless the user preference is dark output. Other options -# are DARK to always use dark mode, LIGHT to always use light mode, AUTO_DARK to -# default to dark mode unless the user prefers light mode, and TOGGLE to let the -# user toggle between dark and light mode via a button. -# Possible values are: LIGHT Always generate light output., DARK Always generate -# dark output., AUTO_LIGHT Automatically set the mode according to the user -# preference, use light mode if no preference is set (the default)., AUTO_DARK -# Automatically set the mode according to the user preference, use dark mode if -# no preference is set. and TOGGLE Allow to user to switch between light and -# dark mode via a button.. +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. # The default value is: AUTO_LIGHT. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_COLORSTYLE = AUTO_LIGHT +HTML_COLORSTYLE = AUTO_DARK # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to @@ -1405,15 +1454,6 @@ HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = NO - # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that # are dynamically created via JavaScript. If disabled, the navigation index will @@ -1433,6 +1473,33 @@ HTML_DYNAMIC_MENUS = YES HTML_DYNAMIC_SECTIONS = YES +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES + +# If the HTML_COPY_CLIPBOARD tag is set to YES then doxygen will show an icon in +# the top right corner of code and text fragments that allows the user to copy +# its content to the clipboard. Note this only works if supported by the browser +# and the web page is served via a secure context (see: +# https://www.w3.org/TR/secure-contexts/), i.e. using the https: or file: +# protocol. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COPY_CLIPBOARD = YES + +# Doxygen stores a couple of settings persistently in the browser (via e.g. +# cookies). By default these settings apply to all HTML pages generated by +# doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store +# the settings under a project specific key, such that the user preferences will +# be stored separately. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_PROJECT_COOKIE = + # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to @@ -1563,6 +1630,16 @@ BINARY_TOC = NO TOC_EXPAND = NO +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = + # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help @@ -1799,8 +1876,8 @@ MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example -# for MathJax version 2 (see https://docs.mathjax.org/en/v2.7-latest/tex.html -# #tex-and-latex-extensions): +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # For example for MathJax version 3 (see # http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): @@ -2051,9 +2128,16 @@ PDF_HYPERLINKS = YES USE_PDFLATEX = YES -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode -# command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. +# The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error. +# Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch +# mode nothing is printed on the terminal, errors are scrolled as if is +# hit at every error; missing files that TeX tries to input or request from +# keyboard input (\read on a not open input stream) cause the job to abort, +# NON_STOP In nonstop mode the diagnostic message will appear on the terminal, +# but there is no possibility of user interaction just like in batch mode, +# SCROLL In scroll mode, TeX will stop only for missing files to input or if +# keyboard input is necessary and ERROR_STOP In errorstop mode, TeX will stop at +# each error, asking for user intervention. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -2074,14 +2158,6 @@ LATEX_HIDE_INDICES = NO LATEX_BIB_STYLE = plain -# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_TIMESTAMP = NO - # The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) # path from which the emoji images will be read. If a relative path is entered, # it will be relative to the LATEX_OUTPUT directory. If left blank the @@ -2247,13 +2323,39 @@ DOCBOOK_OUTPUT = docbook #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an -# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures +# AutoGen Definitions (see https://autogen.sourceforge.net/) file that captures # the structure of the code including all documentation. Note that this feature # is still experimental and incomplete at the moment. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# Configuration options related to Sqlite3 output +#--------------------------------------------------------------------------- + +# If the GENERATE_SQLITE3 tag is set to YES doxygen will generate a Sqlite3 +# database with symbols found by doxygen stored in tables. +# The default value is: NO. + +GENERATE_SQLITE3 = NO + +# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be +# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put +# in front of it. +# The default directory is: sqlite3. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_OUTPUT = sqlite3 + +# The SQLITE3_RECREATE_DB tag is set to YES, the existing doxygen_sqlite3.db +# database file will be recreated with each doxygen run. If set to NO, doxygen +# will warn if a database file is already found and not modify it. +# The default value is: YES. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_RECREATE_DB = YES + #--------------------------------------------------------------------------- # Configuration options related to the Perl module output #--------------------------------------------------------------------------- @@ -2397,15 +2499,15 @@ TAGFILES = GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES, all external class will be listed in -# the class index. If set to NO, only the inherited external classes will be -# listed. +# If the ALLEXTERNALS tag is set to YES, all external classes and namespaces +# will be listed in the class and namespace index. If set to NO, only the +# inherited external classes will be listed. # The default value is: NO. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will be +# in the topic index. If set to NO, only the current project's groups will be # listed. # The default value is: YES. @@ -2419,16 +2521,9 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES #--------------------------------------------------------------------------- -# Configuration options related to the dot tool +# Configuration options related to diagram generator tools #--------------------------------------------------------------------------- -# You can include diagrams made with dia in doxygen documentation. Doxygen will -# then run dia to produce the diagram and insert it in the documentation. The -# DIA_PATH tag allows you to specify the directory where the dia binary resides. -# If left empty dia is assumed to be found in the default search path. - -DIA_PATH = - # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. # The default value is: YES. @@ -2437,7 +2532,7 @@ HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz (see: -# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # Bell Labs. The other options in this section have no effect if this option is # set to NO # The default value is: NO. @@ -2490,13 +2585,19 @@ DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" DOT_FONTPATH = -# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a -# graph for each documented class showing the direct and indirect inheritance -# relations. In case HAVE_DOT is set as well dot will be used to draw the graph, -# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set -# to TEXT the direct and indirect inheritance relations will be shown as texts / -# links. -# Possible values are: NO, YES, TEXT and GRAPH. +# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then doxygen will +# generate a graph for each documented class showing the direct and indirect +# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and +# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case +# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the +# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used. +# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance +# relations will be shown as texts / links. Explicit enabling an inheritance +# graph or choosing a different representation for an inheritance graph of a +# specific class, can be accomplished by means of the command \inheritancegraph. +# Disabling an inheritance graph can be accomplished by means of the command +# \hideinheritancegraph. +# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN. # The default value is: YES. CLASS_GRAPH = YES @@ -2504,15 +2605,21 @@ CLASS_GRAPH = YES # If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a # graph for each documented class showing the direct and indirect implementation # dependencies (inheritance, containment, and class references variables) of the -# class with other documented classes. +# class with other documented classes. Explicit enabling a collaboration graph, +# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the +# command \collaborationgraph. Disabling a collaboration graph can be +# accomplished by means of the command \hidecollaborationgraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. See also the chapter Grouping -# in the manual. +# groups, showing the direct groups dependencies. Explicit enabling a group +# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means +# of the command \groupgraph. Disabling a directory graph can be accomplished by +# means of the command \hidegroupgraph. See also the chapter Grouping in the +# manual. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2554,8 +2661,8 @@ DOT_UML_DETAILS = NO # The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters # to display on a single line. If the actual line length exceeds this threshold -# significantly it will wrapped across multiple lines. Some heuristics are apply -# to avoid ugly line breaks. +# significantly it will be wrapped across multiple lines. Some heuristics are +# applied to avoid ugly line breaks. # Minimum value: 0, maximum value: 1000, default value: 17. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2572,7 +2679,9 @@ TEMPLATE_RELATIONS = NO # If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to # YES then doxygen will generate a graph for each documented file showing the # direct and indirect include dependencies of the file with other documented -# files. +# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO, +# can be accomplished by means of the command \includegraph. Disabling an +# include graph can be accomplished by means of the command \hideincludegraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2581,7 +2690,10 @@ INCLUDE_GRAPH = YES # If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are # set to YES then doxygen will generate a graph for each documented file showing # the direct and indirect include dependencies of the file with other documented -# files. +# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set +# to NO, can be accomplished by means of the command \includedbygraph. Disabling +# an included by graph can be accomplished by means of the command +# \hideincludedbygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2621,7 +2733,10 @@ GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the # dependencies a directory has on other directories in a graphical way. The # dependency relations are determined by the #include relations between the -# files in the directories. +# files in the directories. Explicit enabling a directory graph, when +# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command +# \directorygraph. Disabling a directory graph can be accomplished by means of +# the command \hidedirectorygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2637,7 +2752,7 @@ DIR_GRAPH_MAX_DEPTH = 1 # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: -# http://www.graphviz.org/)). +# https://www.graphviz.org/)). # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # to make the SVG files visible in IE 9+ (other browsers do not have this # requirement). @@ -2674,11 +2789,12 @@ DOT_PATH = DOTFILE_DIRS = -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the \mscfile -# command). +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. -MSCFILE_DIRS = +DIA_PATH = # The DIAFILE_DIRS tag can be used to specify one or more directories that # contain dia files that are included in the documentation (see the \diafile @@ -2755,3 +2871,19 @@ GENERATE_LEGEND = YES # The default value is: YES. DOT_CLEANUP = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. If the MSCGEN_TOOL tag is left empty (the default), then doxygen will +# use a built-in version of mscgen tool to produce the charts. Alternatively, +# the MSCGEN_TOOL tag can also specify the name an external tool. For instance, +# specifying prog as the value, doxygen will call the tool as prog -T +# -o . The external tool should support +# output file formats "png", "eps", "svg", and "ismap". + +MSCGEN_TOOL = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = diff --git a/docs/doxygen-awesome.css b/docs/doxygen-awesome.css deleted file mode 100644 index 7262d37..0000000 --- a/docs/doxygen-awesome.css +++ /dev/null @@ -1,7908 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - doxygen-awesome-css/doxygen-awesome.css at main · jothepro/doxygen-awesome-css · GitHub - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to content - - - - - - - - - - -
- -
- - - - - - - -
- - - -
- - - - - - - - - - -
-
-
- - - - - - - - - - - - - - -
-
- - - - - - - - -
- - - - - Permalink - - -
- -
-
- - - main - - - - -
-
-
- Switch branches/tags - -
- - - -
- -
- -
- - -
- -
- - - - - - - - - - - - - - - - -
- - -
-
-
-
- -
- -
- - - - Go to file - - -
- - - - -
-
-
- - - - -
- -
-
- - @briederer - -
- - - - - - - - - -
-
- - Latest commit - d4c30c7 - Dec 23, 2021 - - - - - - History - - -
-
-
* Adding support for `todo` and `remark` blocks
-
-Co-authored-by: jothepro <github@jothe.pro>
- -
- -
-
- - - 4 - - contributors - - -
- -

- Users who have contributed to this file -

-
- - - - - - -
-
- - - @jothepro - - @r0ckarong - - @wroy-ca - - @briederer - - - -
-
- - - - - - - -
- -
- - -
- - 1524 lines (1237 sloc) - - 35.3 KB -
- -
- - - - - -
- -
- -
-
- - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/**
Doxygen Awesome
https://github.com/jothepro/doxygen-awesome-css
MIT License
Copyright (c) 2021 jothepro
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
-
html {
/* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */
--primary-color: #1779c4;
--primary-dark-color: #00559f;
--primary-light-color: #7aabd6;
--primary-lighter-color: #cae1f1;
--primary-lightest-color: #e9f1f8;
-
/* page base colors */
--page-background-color: white;
--page-foreground-color: #2c3e50;
--page-secondary-foreground-color: #67727e;
-
/* color for all separators on the website: hr, borders, ... */
--separator-color: #dedede;
-
/* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */
--border-radius-large: 8px;
--border-radius-small: 4px;
--border-radius-medium: 6px;
-
/* default spacings. Most compontest reference these values for spacing, to provide uniform spacing on the page. */
--spacing-small: 5px;
--spacing-medium: 10px;
--spacing-large: 16px;
-
/* default box shadow used for raising an element above the normal content. Used in dropdowns, Searchresult, ... */
--box-shadow: 0 2px 10px 0 rgba(0,0,0,.1);
-
--odd-color: rgba(0,0,0,.03);
-
/* font-families. will affect all text on the website
* font-family: the normal font for text, headlines, menus
* font-family-monospace: used for preformatted text in memtitle, code, fragments
*/
--font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;
--font-family-monospace: source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace;
-
/* font sizes */
--page-font-size: 15.6px;
--navigation-font-size: 14.4px;
--code-font-size: 14.4px; /* affects code, fragment */
--title-font-size: 22px;
-
/* content text properties. These only affect the page content, not the navigation or any other ui elements */
--content-line-height: 27px;
/* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/
--content-maxwidth: 1000px;
-
/* colors for various content boxes: @warning, @note, @deprecated @bug */
--warning-color: #fca49b;
--warning-color-dark: #b61825;
--warning-color-darker: #75070f;
--note-color: rgba(255,229,100,.3);
--note-color-dark: #c39900;
--note-color-darker: #8d7400;
--todo-color: rgba(100,160,200,.3);
--todo-color-dark: #00C0E0;
--todo-color-darker: #274a5c;
--deprecated-color: rgb(214, 216, 224);
--deprecated-color-dark: #5b6269;
--deprecated-color-darker: #43454a;
--bug-color: rgb(246, 208, 178);
--bug-color-dark: #a53a00;
--bug-color-darker: #5b1d00;
--invariant-color: #b7f8d0;
--invariant-color-dark: #00ba44;
--invariant-color-darker: #008622;
-
/* blockquote colors */
--blockquote-background: #f5f5f5;
--blockquote-foreground: #727272;
-
/* table colors */
--tablehead-background: #f1f1f1;
--tablehead-foreground: var(--page-foreground-color);
-
/* menu-display: block | none
* Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible.
* `GENERATE_TREEVIEW` MUST be enabled!
*/
--menu-display: block;
-
--menu-focus-foreground: var(--page-background-color);
--menu-focus-background: var(--primary-color);
--menu-selected-background: rgba(0,0,0,.05);
-
-
--header-background: var(--page-background-color);
--header-foreground: var(--page-foreground-color);
-
/* searchbar colors */
--searchbar-background: var(--side-nav-background);
--searchbar-foreground: var(--page-foreground-color);
-
/* searchbar size
* (`searchbar-width` is only applied on screens >= 768px.
* on smaller screens the searchbar will always fill the entire screen width) */
--searchbar-height: 33px;
--searchbar-width: 210px;
-
/* code block colors */
--code-background: #f5f5f5;
--code-foreground: var(--page-foreground-color);
-
/* fragment colors */
--fragment-background: #282c34;
--fragment-foreground: #ffffff;
--fragment-keyword: #cc99cd;
--fragment-keywordtype: #ab99cd;
--fragment-keywordflow: #e08000;
--fragment-token: #7ec699;
--fragment-comment: #999999;
--fragment-link: #98c0e3;
--fragment-preprocessor: #65cabe;
--fragment-linenumber-color: #cccccc;
--fragment-linenumber-background: #35393c;
--fragment-linenumber-border: #1f1f1f;
--fragment-lineheight: 20px;
-
/* sidebar navigation (treeview) colors */
--side-nav-background: #fbfbfb;
--side-nav-foreground: var(--page-foreground-color);
--side-nav-arrow-opacity: 0;
--side-nav-arrow-hover-opacity: 0.9;
-
/* height of an item in any tree / collapsable table */
--tree-item-height: 30px;
-
--darkmode-toggle-button-icon: '☀️'
}
-
@media screen and (max-width: 767px) {
html {
--page-font-size: 16px;
--navigation-font-size: 16px;
--code-font-size: 15px; /* affects code, fragment */
--title-font-size: 22px;
}
}
-
@media (prefers-color-scheme: dark) {
html:not(.light-mode) {
color-scheme: dark;
-
--primary-color: #1982d2;
--primary-dark-color: #5ca8e2;
--primary-light-color: #4779ac;
--primary-lighter-color: #191e21;
--primary-lightest-color: #191a1c;
-
--box-shadow: 0 2px 10px 0 rgba(0,0,0,.35);
-
--odd-color: rgba(0,0,0,.1);
-
--menu-selected-background: rgba(0,0,0,.4);
-
--page-background-color: #1C1D1F;
--page-foreground-color: #d2dbde;
--page-secondary-foreground-color: #859399;
--separator-color: #000000;
--side-nav-background: #252628;
-
--code-background: #2a2c2f;
-
--tablehead-background: #2a2c2f;
-
--blockquote-background: #1f2022;
--blockquote-foreground: #77848a;
-
--warning-color: #b61825;
--warning-color-dark: #510a02;
--warning-color-darker: #f5b1aa;
--note-color: rgb(255, 183, 0);
--note-color-dark: #9f7300;
--note-color-darker: #645b39;
--todo-color: rgba(100,160,200,.3);
--todo-color-dark: #00C0E0;
--todo-color-darker: #dcf0fa;
--deprecated-color: rgb(88, 90, 96);
--deprecated-color-dark: #262e37;
--deprecated-color-darker: #a0a5b0;
--bug-color: rgb(248, 113, 0);
--bug-color-dark: #812a00;
--bug-color-darker: #ffd3be;
-
--darkmode-toggle-button-icon: '🌛';
}
}
-
/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */
html.dark-mode {
color-scheme: dark;
-
--primary-color: #1982d2;
--primary-dark-color: #5ca8e2;
--primary-light-color: #4779ac;
--primary-lighter-color: #191e21;
--primary-lightest-color: #191a1c;
-
--box-shadow: 0 2px 10px 0 rgba(0,0,0,.35);
-
--odd-color: rgba(0,0,0,.1);
-
--menu-selected-background: rgba(0,0,0,.4);
-
--page-background-color: #1C1D1F;
--page-foreground-color: #d2dbde;
--page-secondary-foreground-color: #859399;
--separator-color: #000000;
--side-nav-background: #252628;
-
--code-background: #2a2c2f;
-
--tablehead-background: #2a2c2f;
-
--blockquote-background: #1f2022;
--blockquote-foreground: #77848a;
-
--warning-color: #b61825;
--warning-color-dark: #510a02;
--warning-color-darker: #f5b1aa;
--note-color: rgb(255, 183, 0);
--note-color-dark: #9f7300;
--note-color-darker: #645b39;
--todo-color: rgba(100,160,200,.3);
--todo-color-dark: #00C0E0;
--todo-color-darker: #dcf0fa;
--deprecated-color: rgb(88, 90, 96);
--deprecated-color-dark: #262e37;
--deprecated-color-darker: #a0a5b0;
--bug-color: rgb(248, 113, 0);
--bug-color-dark: #812a00;
--bug-color-darker: #ffd3be;
-
--darkmode-toggle-button-icon: '🌛';
}
-
body {
color: var(--page-foreground-color);
background-color: var(--page-background-color);
font-size: var(--page-font-size);
}
-
body, table, div, p, dl, #nav-tree .label, .title, .sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, .SelectItem, #MSearchField, .navpath li.navelem a, .navpath li.navelem a:hover {
font-family: var(--font-family);
}
-
h1, h2, h3, h4, h5 {
margin-top: .9em;
font-weight: 600;
line-height: initial;
}
-
p, div, table, dl {
font-size: var(--page-font-size);
}
-
a:link, a:visited, a:hover, a:focus, a:active {
color: var(--primary-color) !important;
font-weight: 500;
}
-
/*
Title and top navigation
*/
-
#top {
background: var(--header-background);
border-bottom: 1px solid var(--separator-color);
}
-
@media screen and (min-width: 768px) {
#top {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
}
}
-
#main-nav {
flex-grow: 5;
padding: var(--spacing-small) var(--spacing-medium);
}
-
#titlearea {
width: auto;
padding: var(--spacing-medium) var(--spacing-large);
background: none;
color: var(--header-foreground);
border-bottom: none;
}
-
@media screen and (max-width: 767px) {
#titlearea {
padding-bottom: var(--spacing-small);
}
}
-
#titlearea table tbody tr {
height: auto !important;
}
-
#projectname {
font-size: var(--title-font-size);
font-weight: 600;
}
-
#projectnumber {
font-family: inherit;
font-size: 60%;
}
-
#projectbrief {
font-family: inherit;
font-size: 80%;
}
-
#projectlogo {
vertical-align: middle;
}
-
#projectlogo img {
max-height: calc(var(--title-font-size) * 2);
margin-right: var(--spacing-small);
}
-
.sm-dox, .tabs, .tabs2, .tabs3 {
background: none;
padding: 0;
}
-
.tabs, .tabs2, .tabs3 {
border-bottom: 1px solid var(--separator-color);
margin-bottom: -1px;
}
-
@media screen and (max-width: 767px) {
.sm-dox a span.sub-arrow {
background: var(--code-background);
}
}
-
@media screen and (min-width: 768px) {
.sm-dox li, .tablist li {
display: var(--menu-display);
}
-
.sm-dox a span.sub-arrow {
border-color: var(--header-foreground) transparent transparent transparent;
}
-
.sm-dox a:hover span.sub-arrow {
border-color: var(--menu-focus-foreground) transparent transparent transparent;
}
-
.sm-dox ul a span.sub-arrow {
border-color: transparent transparent transparent var(--page-foreground-color);
}
-
.sm-dox ul a:hover span.sub-arrow {
border-color: transparent transparent transparent var(--menu-focus-foreground);
}
}
-
.sm-dox ul {
background: var(--page-background-color);
box-shadow: var(--box-shadow);
border: 1px solid var(--separator-color);
border-radius: var(--border-radius-medium) !important;
padding: var(--spacing-small);
animation: ease-out 150ms slideInMenu;
}
-
@keyframes slideInMenu {
from {
opacity: 0;
transform: translate(0px, -2px);
}
-
to {
opacity: 1;
transform: translate(0px, 0px);
}
}
-
.sm-dox ul a {
color: var(--page-foreground-color) !important;
background: var(--page-background-color);
font-size: var(--navigation-font-size);
}
-
.sm-dox>li>ul:after {
border-bottom-color: var(--page-background-color) !important;
}
-
.sm-dox>li>ul:before {
border-bottom-color: var(--separator-color) !important;
}
-
.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus {
font-size: var(--navigation-font-size) !important;
color: var(--menu-focus-foreground) !important;
text-shadow: none;
background-color: var(--menu-focus-background);
border-radius: var(--border-radius-small) !important;
}
-
.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a {
text-shadow: none;
background: transparent;
background-image: none !important;
color: var(--header-foreground) !important;
font-weight: normal;
font-size: var(--navigation-font-size);
}
-
.sm-dox a:focus {
outline: auto;
}
-
.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover {
text-shadow: none;
font-weight: normal;
background: var(--menu-focus-background);
color: var(--menu-focus-foreground) !important;
border-radius: var(--border-radius-small) !important;
font-size: var(--navigation-font-size);
}
-
.tablist li.current {
border-radius: var(--border-radius-small);
background: var(--menu-selected-background);
}
-
.tablist li {
margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small);
}
-
.tablist a {
padding: 0 var(--spacing-large);
}
-
-
/*
Search box
*/
-
#MSearchBox {
height: var(--searchbar-height);
background: var(--searchbar-background);
border-radius: var(--searchbar-height);
border: 1px solid var(--separator-color);
overflow: hidden;
width: var(--searchbar-width);
position: relative;
box-shadow: none;
display: block;
margin-top: 0;
}
-
.left #MSearchSelect {
left: 0;
}
-
.tabs .left #MSearchSelect {
padding-left: 0;
}
-
.tabs #MSearchBox {
position: absolute;
right: var(--spacing-medium);
}
-
@media screen and (max-width: 767px) {
.tabs #MSearchBox {
position: relative;
right: 0;
margin-left: var(--spacing-medium);
margin-top: 0;
}
}
-
#MSearchSelectWindow, #MSearchResultsWindow {
z-index: 9999;
}
-
#MSearchBox.MSearchBoxActive {
border-color: var(--primary-color);
box-shadow: inset 0 0 0 1px var(--primary-color);
}
-
#main-menu > li:last-child {
margin-right: 0;
}
-
@media screen and (max-width: 767px) {
#main-menu > li:last-child {
height: 50px;
}
}
-
#MSearchField {
font-size: var(--navigation-font-size);
height: calc(var(--searchbar-height) - 2px);
background: transparent;
width: calc(var(--searchbar-width) - 64px);
}
-
.MSearchBoxActive #MSearchField {
color: var(--searchbar-foreground);
}
-
#MSearchSelect {
top: calc(calc(var(--searchbar-height) / 2) - 11px);
}
-
.left #MSearchSelect {
padding-left: 8px;
}
-
#MSearchBox span.left, #MSearchBox span.right {
background: none;
}
-
#MSearchBox span.right {
padding-top: calc(calc(var(--searchbar-height) / 2) - 12px);
position: absolute;
right: var(--spacing-small);
}
-
.tabs #MSearchBox span.right {
top: calc(calc(var(--searchbar-height) / 2) - 12px);
}
-
@keyframes slideInSearchResults {
from {
opacity: 0;
transform: translate(0, 15px);
}
-
to {
opacity: 1;
transform: translate(0, 20px);
}
}
-
#MSearchResultsWindow {
left: auto !important;
right: var(--spacing-medium);
border-radius: var(--border-radius-large);
border: 1px solid var(--separator-color);
transform: translate(0, 20px);
box-shadow: var(--box-shadow);
animation: ease-out 280ms slideInSearchResults;
background: var(--page-background-color);
}
-
iframe#MSearchResults {
margin: 4px;
}
-
iframe {
color-scheme: normal;
}
-
@media (prefers-color-scheme: dark) {
html:not(.light-mode) iframe#MSearchResults {
filter: invert() hue-rotate(180deg);
}
}
-
html.dark-mode iframe#MSearchResults {
filter: invert() hue-rotate(180deg);
}
-
#MSearchSelectWindow {
border: 1px solid var(--separator-color);
border-radius: var(--border-radius-medium);
box-shadow: var(--box-shadow);
background: var(--page-background-color);
}
-
#MSearchSelectWindow a.SelectItem {
font-size: var(--navigation-font-size);
line-height: var(--content-line-height);
margin: 0 var(--spacing-small);
border-radius: var(--border-radius-small);
color: var(--page-foreground-color) !important;
font-weight: normal;
}
-
#MSearchSelectWindow a.SelectItem:hover {
background: var(--menu-focus-background);
color: var(--menu-focus-foreground) !important;
}
-
@media screen and (max-width: 767px) {
#MSearchBox {
margin-top: var(--spacing-medium);
margin-bottom: var(--spacing-medium);
width: calc(100vw - 30px);
}
-
#main-menu > li:last-child {
float: none !important;
}
-
#MSearchField {
width: calc(100vw - 110px);
}
-
@keyframes slideInSearchResultsMobile {
from {
opacity: 0;
transform: translate(0, 15px);
}
-
to {
opacity: 1;
transform: translate(0, 20px);
}
}
-
#MSearchResultsWindow {
left: var(--spacing-medium) !important;
right: var(--spacing-medium);
overflow: auto;
transform: translate(0, 20px);
animation: ease-out 280ms slideInSearchResultsMobile;
}
-
/*
* Overwrites for fixing the searchbox on mobile in doxygen 1.9.2
*/
label.main-menu-btn ~ #searchBoxPos1 {
top: 3px !important;
right: 6px !important;
left: 45px;
display: flex;
}
-
label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox {
margin-top: 0;
margin-bottom: 0;
flex-grow: 2;
float: left;
}
}
-
/*
Tree view
*/
-
#side-nav {
padding: 0 !important;
background: var(--side-nav-background);
}
-
@media screen and (max-width: 767px) {
#side-nav {
display: none;
}
-
#doc-content {
margin-left: 0 !important;
height: auto !important;
padding-bottom: calc(2 * var(--spacing-large));
}
}
-
#nav-tree {
background: transparent;
}
-
#nav-tree .label {
font-size: var(--navigation-font-size);
}
-
#nav-tree .item {
height: var(--tree-item-height);
line-height: var(--tree-item-height);
}
-
#nav-sync {
top: 12px !important;
right: 12px;
}
-
#nav-tree .selected {
text-shadow: none;
background-image: none;
background-color: transparent;
box-shadow: inset 4px 0 0 0 var(--primary-color);
}
-
#nav-tree a {
color: var(--side-nav-foreground) !important;
font-weight: normal;
}
-
#nav-tree a:focus {
outline-style: auto;
}
-
#nav-tree .arrow {
opacity: var(--side-nav-arrow-opacity);
}
-
.arrow {
color: inherit;
cursor: pointer;
font-size: 45%;
vertical-align: middle;
margin-right: 2px;
font-family: serif;
height: auto;
text-align: right;
}
-
#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow {
opacity: var(--side-nav-arrow-hover-opacity);
}
-
#nav-tree .selected a {
color: var(--primary-color) !important;
font-weight: bolder;
font-weight: 600;
}
-
.ui-resizable-e {
background: var(--separator-color);
width: 1px;
}
-
/*
Contents
*/
-
div.header {
border-bottom: 1px solid var(--separator-color);
background-color: var(--page-background-color);
background-image: none;
}
-
div.contents, div.header .title, div.header .summary {
max-width: var(--content-maxwidth);
}
-
div.contents, div.header .title {
line-height: initial;
margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto;
}
-
div.header .summary {
margin: var(--spacing-medium) auto 0 auto;
}
-
div.headertitle {
padding: 0;
}
-
div.header .title {
font-weight: 600;
font-size: 210%;
padding: var(--spacing-medium) var(--spacing-large);
word-break: break-word;
}
-
div.header .summary {
width: auto;
display: block;
float: none;
padding: 0 var(--spacing-large);
}
-
td.memSeparator {
border-color: var(--separator-color);
}
-
.mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams {
background: var(--code-background);
}
-
.mdescRight {
color: var(--page-secondary-foreground-color);
}
-
span.mlabel {
background: var(--primary-color);
border: none;
padding: 4px 9px;
border-radius: 12px;
margin-right: var(--spacing-medium);
}
-
span.mlabel:last-of-type {
margin-right: 2px;
}
-
div.contents {
padding: 0 var(--spacing-large);
}
-
div.contents p, div.contents li {
line-height: var(--content-line-height);
}
-
div.contents div.dyncontent {
margin: var(--spacing-medium) 0;
}
-
@media (prefers-color-scheme: dark) {
html:not(.light-mode) div.contents div.dyncontent img,
html:not(.light-mode) div.contents center img,
html:not(.light-mode) div.contents table img,
html:not(.light-mode) div.contents div.dyncontent iframe,
html:not(.light-mode) div.contents center iframe,
html:not(.light-mode) div.contents table iframe {
filter: hue-rotate(180deg) invert();
}
}
-
html.dark-mode div.contents div.dyncontent img,
html.dark-mode div.contents center img,
html.dark-mode div.contents table img,
html.dark-mode div.contents div.dyncontent iframe,
html.dark-mode div.contents center iframe,
html.dark-mode div.contents table iframe {
filter: hue-rotate(180deg) invert();
}
-
h2.groupheader {
border-bottom: 1px solid var(--separator-color);
color: var(--page-foreground-color);
}
-
blockquote {
padding: var(--spacing-small) var(--spacing-medium);
background: var(--blockquote-background);
color: var(--blockquote-foreground);
border-left: 2px solid var(--blockquote-foreground);
margin: 0;
}
-
blockquote p {
margin: var(--spacing-small) 0 var(--spacing-medium) 0;
}
.paramname {
font-weight: 600;
color: var(--primary-dark-color);
}
-
.glow {
text-shadow: 0 0 15px var(--primary-light-color) !important;
}
-
.alphachar a {
color: var(--page-foreground-color);
}
-
/*
Table of Contents
*/
-
div.toc {
background-color: var(--side-nav-background);
border: 1px solid var(--separator-color);
border-radius: var(--border-radius-medium);
box-shadow: var(--box-shadow);
padding: 0 var(--spacing-large);
margin: 0 0 var(--spacing-medium) var(--spacing-medium);
}
-
div.toc h3 {
color: var(--side-nav-foreground);
font-size: var(--navigation-font-size);
margin: var(--spacing-large) 0;
}
-
div.toc li {
font-size: var(--navigation-font-size);
padding: 0;
background: none;
}
-
div.toc li:before {
content: '↓';
font-weight: 800;
font-family: var(--font-family);
margin-right: var(--spacing-small);
color: var(--side-nav-foreground);
opacity: .4;
}
-
div.toc ul li.level1 {
margin: 0;
}
-
div.toc ul li.level2, div.toc ul li.level3 {
margin-top: 0;
}
-
-
@media screen and (max-width: 767px) {
div.toc {
float: none;
width: auto;
margin: 0 0 var(--spacing-medium) 0;
}
}
-
/*
Code & Fragments
*/
-
code, div.fragment, pre.fragment {
border-radius: var(--border-radius-small);
border: none;
overflow: hidden;
}
-
code {
display: inline;
background: var(--code-background);
color: var(--code-foreground);
padding: 2px 6px;
word-break: break-word;
}
-
div.fragment, pre.fragment {
margin: var(--spacing-medium) 0;
padding: 14px 16px;
background: var(--fragment-background);
color: var(--fragment-foreground);
overflow-x: auto;
}
-
@media screen and (max-width: 767px) {
div.fragment, pre.fragment {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
-
.contents > div.fragment, .textblock > div.fragment, .textblock > pre.fragment {
margin: var(--spacing-medium) calc(0px - var(--spacing-large));
border-radius: 0;
}
-
.textblock li > .fragment {
margin: var(--spacing-medium) calc(0px - var(--spacing-large));
}
-
.memdoc li > .fragment {
margin: var(--spacing-medium) calc(0px - var(--spacing-medium));
}
-
.memdoc > div.fragment, .memdoc > pre.fragment, dl dd > div.fragment, dl dd pre.fragment {
margin: var(--spacing-medium) calc(0px - var(--spacing-medium));
border-radius: 0;
}
}
-
code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span {
font-family: var(--font-family-monospace);
font-size: var(--code-font-size) !important;
}
-
div.line:after {
margin-right: var(--spacing-medium);
}
-
div.fragment .line, pre.fragment {
white-space: pre;
word-wrap: initial;
line-height: var(--fragment-lineheight);
}
-
div.fragment span.keyword {
color: var(--fragment-keyword);
}
-
div.fragment span.keywordtype {
color: var(--fragment-keywordtype);
}
-
div.fragment span.keywordflow {
color: var(--fragment-keywordflow);
}
-
div.fragment span.stringliteral {
color: var(--fragment-token)
}
-
div.fragment span.comment {
color: var(--fragment-comment);
}
-
div.fragment a.code {
color: var(--fragment-link) !important;
}
-
div.fragment span.preprocessor {
color: var(--fragment-preprocessor);
}
-
div.fragment span.lineno {
display: inline-block;
width: 27px;
border-right: none;
background: var(--fragment-linenumber-background);
color: var(--fragment-linenumber-color);
}
-
div.fragment span.lineno a {
background: none;
color: var(--fragment-link) !important;
}
-
div.fragment .line:first-child .lineno {
box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border);
}
-
/*
dl warning, attention, note, deprecated, bug, ...
*/
-
dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.todo, dl.remark {
padding: var(--spacing-medium);
margin: var(--spacing-medium) 0;
color: var(--page-background-color);
overflow: hidden;
margin-left: 0;
border-radius: var(--border-radius-small);
}
-
dl.section dd {
margin-bottom: 2px;
}
-
dl.warning, dl.attention {
background: var(--warning-color);
border-left: 8px solid var(--warning-color-dark);
color: var(--warning-color-darker);
}
-
dl.warning dt, dl.attention dt {
color: var(--warning-color-dark);
}
-
dl.note, dl.remark {
background: var(--note-color);
border-left: 8px solid var(--note-color-dark);
color: var(--note-color-darker);
}
-
dl.note dt, dl.remark dt {
color: var(--note-color-dark);
}
-
dl.todo {
background: var(--todo-color);
border-left: 8px solid var(--todo-color-dark);
color: var(--todo-color-darker);
}
-
dl.todo dt {
color: var(--todo-color-dark);
}
-
dl.bug {
background: var(--bug-color);
border-left: 8px solid var(--bug-color-dark);
color: var(--bug-color-darker);
}
-
dl.bug dt a {
color: var(--bug-color-dark) !important;
}
-
dl.deprecated {
background: var(--deprecated-color);
border-left: 8px solid var(--deprecated-color-dark);
color: var(--deprecated-color-darker);
}
-
dl.deprecated dt a {
color: var(--deprecated-color-dark) !important;
}
-
dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd {
margin-inline-start: 0px;
}
-
dl.invariant, dl.pre {
background: var(--invariant-color);
border-left: 8px solid var(--invariant-color-dark);
color: var(--invariant-color-darker);
}
-
/*
memitem
*/
-
div.memdoc, div.memproto, h2.memtitle {
box-shadow: none;
background-image: none;
border: none;
}
-
div.memdoc {
padding: 0 var(--spacing-medium);
background: var(--page-background-color);
}
-
h2.memtitle, div.memitem {
border: 1px solid var(--separator-color);
}
-
div.memproto, h2.memtitle {
background: var(--code-background);
text-shadow: none;
}
-
h2.memtitle {
font-weight: 500;
font-family: monospace, fixed;
border-bottom: none;
border-top-left-radius: var(--border-radius-medium);
border-top-right-radius: var(--border-radius-medium);
word-break: break-all;
}
-
a:target + h2.memtitle, a:target + h2.memtitle + div.memitem {
border-color: var(--primary-light-color);
}
-
a:target + h2.memtitle {
box-shadow: -3px -3px 3px 0 var(--primary-lightest-color), 3px -3px 3px 0 var(--primary-lightest-color);
}
-
a:target + h2.memtitle + div.memitem {
box-shadow: 0 0 10px 0 var(--primary-lighter-color);
}
-
div.memitem {
border-top-right-radius: var(--border-radius-medium);
border-bottom-right-radius: var(--border-radius-medium);
border-bottom-left-radius: var(--border-radius-medium);
overflow: hidden;
display: block !important;
}
-
div.memdoc {
border-radius: 0;
}
-
div.memproto {
border-radius: 0 var(--border-radius-small) 0 0;
overflow: auto;
border-bottom: 1px solid var(--separator-color);
padding: var(--spacing-medium);
margin-bottom: -1px;
}
-
div.memtitle {
border-top-right-radius: var(--border-radius-medium);
border-top-left-radius: var(--border-radius-medium);
}
-
div.memproto table.memname {
font-family: monospace, fixed;
color: var(--page-foreground-color);
}
-
table.mlabels, table.mlabels > tbody {
display: block;
}
-
td.mlabels-left {
width: auto;
}
-
table.mlabels > tbody > tr:first-child {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
-
.memname, .memitem span.mlabels {
margin: 0
}
-
/*
reflist
*/
-
dl.reflist {
box-shadow: var(--box-shadow);
border-radius: var(--border-radius-medium);
border: 1px solid var(--separator-color);
overflow: hidden;
padding: 0;
}
-
-
dl.reflist dt, dl.reflist dd {
box-shadow: none;
text-shadow: none;
background-image: none;
border: none;
padding: 12px;
}
-
-
dl.reflist dt {
font-weight: 500;
border-radius: 0;
background: var(--code-background);
border-bottom: 1px solid var(--separator-color);
color: var(--page-foreground-color)
}
-
-
dl.reflist dd {
background: none;
}
-
/*
Table
*/
-
table.markdownTable, table.fieldtable {
width: 100%;
border: 1px solid var(--separator-color);
margin: var(--spacing-medium) 0;
}
-
table.fieldtable {
box-shadow: none;
border-radius: var(--border-radius-small);
}
-
th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
background: var(--tablehead-background);
color: var(--tablehead-foreground);
font-weight: 600;
font-size: var(--page-font-size);
}
-
table.markdownTable td, table.markdownTable th, table.fieldtable dt {
border: 1px solid var(--separator-color);
padding: var(--spacing-small) var(--spacing-medium);
}
-
table.fieldtable th {
font-size: var(--page-font-size);
font-weight: 600;
background-image: none;
background-color: var(--tablehead-background);
color: var(--tablehead-foreground);
border-bottom: 1px solid var(--separator-color);
}
-
.fieldtable td.fieldtype, .fieldtable td.fieldname {
border-bottom: 1px solid var(--separator-color);
border-right: 1px solid var(--separator-color);
}
-
.fieldtable td.fielddoc {
border-bottom: 1px solid var(--separator-color);
}
-
.memberdecls td.glow, .fieldtable tr.glow {
background-color: var(--primary-light-color);
box-shadow: 0 0 15px var(--primary-lighter-color);
}
-
table.memberdecls {
display: block;
overflow-x: auto;
overflow-y: hidden;
}
-
-
/*
Horizontal Rule
*/
-
hr {
margin-top: var(--spacing-large);
margin-bottom: var(--spacing-large);
border-top:1px solid var(--separator-color);
}
-
.contents hr {
box-shadow: var(--content-maxwidth) 0 0 0 var(--separator-color), calc(0px - var(--content-maxwidth)) 0 0 0 var(--separator-color);
}
-
.contents img, .contents .center, .contents center {
max-width: 100%;
overflow: scroll;
}
-
/*
Directories
*/
div.directory {
border-top: 1px solid var(--separator-color);
border-bottom: 1px solid var(--separator-color);
width: auto;
}
-
table.directory {
font-family: var(--font-family);
font-size: var(--page-font-size);
font-weight: normal;
}
-
.directory td.entry {
padding: var(--spacing-small);
display: flex;
align-items: center;
}
-
.directory tr.even {
background-color: var(--odd-color);
}
-
.icona {
width: auto;
height: auto;
margin: 0 var(--spacing-small);
}
-
.icon {
background: var(--primary-color);
width: 18px;
height: 18px;
line-height: 18px;
}
-
.iconfopen, .icondoc, .iconfclosed {
background-position: center;
margin-bottom: 0;
}
-
.icondoc {
filter: saturate(0.2);
}
-
@media screen and (max-width: 767px) {
div.directory {
margin-left: calc(0px - var(--spacing-medium));
margin-right: calc(0px - var(--spacing-medium));
}
}
-
@media (prefers-color-scheme: dark) {
html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed {
filter: hue-rotate(180deg) invert();
}
}
-
html.dark-mode .iconfopen, html.dark-mode .iconfclosed {
filter: hue-rotate(180deg) invert();
}
-
/*
Class list
*/
-
.classindex dl.odd {
background: var(--odd-color);
border-radius: var(--border-radius-small);
}
-
@media screen and (max-width: 767px) {
.classindex {
margin: 0 calc(0px - var(--spacing-small));
}
}
-
/*
Footer and nav-path
*/
-
#nav-path {
margin-bottom: -1px;
width: 100%;
}
-
#nav-path ul {
background-image: none;
background: var(--page-background-color);
border: none;
border-top: 1px solid var(--separator-color);
border-bottom: 1px solid var(--separator-color);
font-size: var(--navigation-font-size);
}
-
img.footer {
width: 60px;
}
-
.navpath li.footer {
color: var(--page-secondary-foreground-color);
}
-
address.footer {
margin-bottom: var(--spacing-large);
}
-
#nav-path li.navelem {
background-image: none;
display: flex;
align-items: center;
}
-
.navpath li.navelem a {
text-shadow: none;
display: inline-block;
color: var(--primary-color) !important;
}
-
.navpath li.navelem b {
color: var(--primary-dark-color);
font-weight: 500;
}
-
li.navelem {
padding: 0;
margin-left: -8px;
}
-
li.navelem:first-child {
margin-left: var(--spacing-large);
}
-
li.navelem:first-child:before {
display: none;
}
-
#nav-path li.navelem:after {
content: '';
border: 5px solid var(--page-background-color);
border-bottom-color: transparent;
border-right-color: transparent;
border-top-color: transparent;
transform: scaleY(4.2);
z-index: 10;
margin-left: 6px;
}
-
#nav-path li.navelem:before {
content: '';
border: 5px solid var(--separator-color);
border-bottom-color: transparent;
border-right-color: transparent;
border-top-color: transparent;
transform: scaleY(3.2);
margin-right: var(--spacing-small);
}
-
.navpath li.navelem a:hover {
color: var(--primary-color);
}
-
/*
Optional Dark mode toggle button
*/
-
doxygen-awesome-dark-mode-toggle {
display: inline-block;
margin: 0 0 0 var(--spacing-small);
padding: 0;
width: var(--searchbar-height);
height: var(--searchbar-height);
background: none;
border: none;
font-size: 23px;
border-radius: var(--border-radius-medium);
vertical-align: middle;
text-align: center;
line-height: var(--searchbar-height);
}
-
doxygen-awesome-dark-mode-toggle:hover {
background: var(--separator-color);
}
-
doxygen-awesome-dark-mode-toggle:after {
content: var(--darkmode-toggle-button-icon)
}
-
- - - -
- -
- - - - -
- - -
- - -
-
- - -
- - - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - diff --git a/docs/doxygen_awesome/doxygen-awesome-darkmode-toggle.js b/docs/doxygen_awesome/doxygen-awesome-darkmode-toggle.js new file mode 100644 index 0000000..40fe2d3 --- /dev/null +++ b/docs/doxygen_awesome/doxygen-awesome-darkmode-toggle.js @@ -0,0 +1,157 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeDarkModeToggle extends HTMLElement { + // SVG icons from https://fonts.google.com/icons + // Licensed under the Apache 2.0 license: + // https://www.apache.org/licenses/LICENSE-2.0.html + static lightModeIcon = `` + static darkModeIcon = `` + static title = "Toggle Light/Dark Mode" + + static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode" + static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode" + + static _staticConstructor = function() { + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.userPreference) + // Update the color scheme when the browsers preference changes + // without user interaction on the website. + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() + }) + // Update the color scheme when the tab is made visible again. + // It is possible that the appearance was changed in another tab + // while this tab was in the background. + document.addEventListener("visibilitychange", visibilityState => { + if (document.visibilityState === 'visible') { + DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() + } + }); + }() + + static init() { + $(function() { + $(document).ready(function() { + const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle') + toggleButton.title = DoxygenAwesomeDarkModeToggle.title + toggleButton.updateIcon() + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + toggleButton.updateIcon() + }) + document.addEventListener("visibilitychange", visibilityState => { + if (document.visibilityState === 'visible') { + toggleButton.updateIcon() + } + }); + + $(document).ready(function(){ + document.getElementById("MSearchBox").parentNode.appendChild(toggleButton) + }) + $(window).resize(function(){ + document.getElementById("MSearchBox").parentNode.appendChild(toggleButton) + }) + }) + }) + } + + constructor() { + super(); + this.onclick=this.toggleDarkMode + } + + /** + * @returns `true` for dark-mode, `false` for light-mode system preference + */ + static get systemPreference() { + return window.matchMedia('(prefers-color-scheme: dark)').matches + } + + /** + * @returns `true` for dark-mode, `false` for light-mode user preference + */ + static get userPreference() { + return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) || + (DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)) + } + + static set userPreference(userPreference) { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference + if(!userPreference) { + if(DoxygenAwesomeDarkModeToggle.systemPreference) { + localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true) + } else { + localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey) + } + } else { + if(!DoxygenAwesomeDarkModeToggle.systemPreference) { + localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true) + } else { + localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey) + } + } + DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged() + } + + static enableDarkMode(enable) { + if(enable) { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = true + document.documentElement.classList.add("dark-mode") + document.documentElement.classList.remove("light-mode") + } else { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = false + document.documentElement.classList.remove("dark-mode") + document.documentElement.classList.add("light-mode") + } + } + + static onSystemPreferenceChanged() { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) + } + + static onUserPreferenceChanged() { + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) + } + + toggleDarkMode() { + DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference + this.updateIcon() + } + + updateIcon() { + if(DoxygenAwesomeDarkModeToggle.darkModeEnabled) { + this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon + } else { + this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon + } + } +} + +customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle); diff --git a/docs/doxygen_awesome/doxygen-awesome-fragment-copy-button.js b/docs/doxygen_awesome/doxygen-awesome-fragment-copy-button.js new file mode 100644 index 0000000..86c16fd --- /dev/null +++ b/docs/doxygen_awesome/doxygen-awesome-fragment-copy-button.js @@ -0,0 +1,85 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeFragmentCopyButton extends HTMLElement { + constructor() { + super(); + this.onclick=this.copyContent + } + static title = "Copy to clipboard" + static copyIcon = `` + static successIcon = `` + static successDuration = 980 + static init() { + $(function() { + $(document).ready(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const fragmentWrapper = document.createElement("div") + fragmentWrapper.className = "doxygen-awesome-fragment-wrapper" + const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button") + fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon + fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title + + fragment.parentNode.replaceChild(fragmentWrapper, fragment) + fragmentWrapper.appendChild(fragment) + fragmentWrapper.appendChild(fragmentCopyButton) + + } + } + }) + }) + } + + + copyContent() { + const content = this.previousSibling.cloneNode(true) + // filter out line number from file listings + content.querySelectorAll(".lineno, .ttc").forEach((node) => { + node.remove() + }) + let textContent = content.textContent + // remove trailing newlines that appear in file listings + let numberOfTrailingNewlines = 0 + while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') { + numberOfTrailingNewlines++; + } + textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines) + navigator.clipboard.writeText(textContent); + this.classList.add("success") + this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon + window.setTimeout(() => { + this.classList.remove("success") + this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon + }, DoxygenAwesomeFragmentCopyButton.successDuration); + } +} + +customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton) diff --git a/docs/doxygen_awesome/doxygen-awesome-interactive-toc.js b/docs/doxygen_awesome/doxygen-awesome-interactive-toc.js new file mode 100644 index 0000000..20a9669 --- /dev/null +++ b/docs/doxygen_awesome/doxygen-awesome-interactive-toc.js @@ -0,0 +1,81 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeInteractiveToc { + static topOffset = 38 + static hideMobileMenu = true + static headers = [] + + static init() { + window.addEventListener("load", () => { + let toc = document.querySelector(".contents > .toc") + if(toc) { + toc.classList.add("interactive") + if(!DoxygenAwesomeInteractiveToc.hideMobileMenu) { + toc.classList.add("open") + } + document.querySelector(".contents > .toc > h3")?.addEventListener("click", () => { + if(toc.classList.contains("open")) { + toc.classList.remove("open") + } else { + toc.classList.add("open") + } + }) + + document.querySelectorAll(".contents > .toc > ul a").forEach((node) => { + let id = node.getAttribute("href").substring(1) + DoxygenAwesomeInteractiveToc.headers.push({ + node: node, + headerNode: document.getElementById(id) + }) + + document.getElementById("doc-content")?.addEventListener("scroll", () => { + DoxygenAwesomeInteractiveToc.update() + }) + }) + DoxygenAwesomeInteractiveToc.update() + } + }) + } + + static update() { + let active = DoxygenAwesomeInteractiveToc.headers[0]?.node + DoxygenAwesomeInteractiveToc.headers.forEach((header) => { + let position = header.headerNode.getBoundingClientRect().top + header.node.classList.remove("active") + header.node.classList.remove("aboveActive") + if(position < DoxygenAwesomeInteractiveToc.topOffset) { + active = header.node + active?.classList.add("aboveActive") + } + }) + active?.classList.add("active") + active?.classList.remove("aboveActive") + } +} \ No newline at end of file diff --git a/docs/doxygen_awesome/doxygen-awesome-paragraph-link.js b/docs/doxygen_awesome/doxygen-awesome-paragraph-link.js new file mode 100644 index 0000000..e53d132 --- /dev/null +++ b/docs/doxygen_awesome/doxygen-awesome-paragraph-link.js @@ -0,0 +1,51 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeParagraphLink { + // Icon from https://fonts.google.com/icons + // Licensed under the Apache 2.0 license: + // https://www.apache.org/licenses/LICENSE-2.0.html + static icon = `` + static title = "Permanent Link" + static init() { + $(function() { + $(document).ready(function() { + document.querySelectorAll(".contents a.anchor[id], .contents .groupheader > a[id]").forEach((node) => { + let anchorlink = document.createElement("a") + anchorlink.setAttribute("href", `#${node.getAttribute("id")}`) + anchorlink.setAttribute("title", DoxygenAwesomeParagraphLink.title) + anchorlink.classList.add("anchorlink") + node.classList.add("anchor") + anchorlink.innerHTML = DoxygenAwesomeParagraphLink.icon + node.parentElement.appendChild(anchorlink) + }) + }) + }) + } +} diff --git a/docs/doxygen_awesome/doxygen-awesome-sidebar-only-darkmode-toggle.css b/docs/doxygen_awesome/doxygen-awesome-sidebar-only-darkmode-toggle.css new file mode 100644 index 0000000..d207446 --- /dev/null +++ b/docs/doxygen_awesome/doxygen-awesome-sidebar-only-darkmode-toggle.css @@ -0,0 +1,40 @@ + +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +@media screen and (min-width: 768px) { + + #MSearchBox { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - var(--searchbar-height) - 1px); + } + + #MSearchField { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 66px - var(--searchbar-height)); + } +} diff --git a/docs/doxygen_awesome/doxygen-awesome-sidebar-only.css b/docs/doxygen_awesome/doxygen-awesome-sidebar-only.css new file mode 100644 index 0000000..853f6d6 --- /dev/null +++ b/docs/doxygen_awesome/doxygen-awesome-sidebar-only.css @@ -0,0 +1,116 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + */ + +html { + /* side nav width. MUST be = `TREEVIEW_WIDTH`. + * Make sure it is wide enough to contain the page title (logo + title + version) + */ + --side-nav-fixed-width: 335px; + --menu-display: none; + + --top-height: 120px; + --toc-sticky-top: -25px; + --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 25px); +} + +#projectname { + white-space: nowrap; +} + + +@media screen and (min-width: 768px) { + html { + --searchbar-background: var(--page-background-color); + } + + #side-nav { + min-width: var(--side-nav-fixed-width); + max-width: var(--side-nav-fixed-width); + top: var(--top-height); + overflow: visible; + } + + #nav-tree, #side-nav { + height: calc(100vh - var(--top-height)) !important; + } + + #nav-tree { + padding: 0; + } + + #top { + display: block; + border-bottom: none; + height: var(--top-height); + margin-bottom: calc(0px - var(--top-height)); + max-width: var(--side-nav-fixed-width); + overflow: hidden; + background: var(--side-nav-background); + } + #main-nav { + float: left; + padding-right: 0; + } + + .ui-resizable-handle { + cursor: default; + width: 1px !important; + background: var(--separator-color); + box-shadow: 0 calc(-2 * var(--top-height)) 0 0 var(--separator-color); + } + + #nav-path { + position: fixed; + right: 0; + left: var(--side-nav-fixed-width); + bottom: 0; + width: auto; + } + + #doc-content { + height: calc(100vh - 31px) !important; + padding-bottom: calc(3 * var(--spacing-large)); + padding-top: calc(var(--top-height) - 80px); + box-sizing: border-box; + margin-left: var(--side-nav-fixed-width) !important; + } + + #MSearchBox { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium))); + } + + #MSearchField { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 65px); + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: auto; + } +} diff --git a/docs/doxygen_awesome/doxygen-awesome-tabs.js b/docs/doxygen_awesome/doxygen-awesome-tabs.js new file mode 100644 index 0000000..8a7c3f1 --- /dev/null +++ b/docs/doxygen_awesome/doxygen-awesome-tabs.js @@ -0,0 +1,90 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeTabs { + + static init() { + window.addEventListener("load", () => { + document.querySelectorAll(".tabbed:not(:empty)").forEach((tabbed, tabbedIndex) => { + let tabLinkList = [] + tabbed.querySelectorAll("li").forEach((tab, tabIndex) => { + tab.id = "tab_" + tabbedIndex + "_" + tabIndex + let header = tab.querySelector(".tab-title") + let tabLink = document.createElement("button") + tabLink.classList.add("tab-button") + tabLink.appendChild(header) + header.title = header.textContent + tabLink.addEventListener("click", () => { + tabbed.querySelectorAll("li").forEach((tab) => { + tab.classList.remove("selected") + }) + tabLinkList.forEach((tabLink) => { + tabLink.classList.remove("active") + }) + tab.classList.add("selected") + tabLink.classList.add("active") + }) + tabLinkList.push(tabLink) + if(tabIndex == 0) { + tab.classList.add("selected") + tabLink.classList.add("active") + } + }) + let tabsOverview = document.createElement("div") + tabsOverview.classList.add("tabs-overview") + let tabsOverviewContainer = document.createElement("div") + tabsOverviewContainer.classList.add("tabs-overview-container") + tabLinkList.forEach((tabLink) => { + tabsOverview.appendChild(tabLink) + }) + tabsOverviewContainer.appendChild(tabsOverview) + tabbed.before(tabsOverviewContainer) + + function resize() { + let maxTabHeight = 0 + tabbed.querySelectorAll("li").forEach((tab, tabIndex) => { + let visibility = tab.style.display + tab.style.display = "block" + maxTabHeight = Math.max(tab.offsetHeight, maxTabHeight) + tab.style.display = visibility + }) + tabbed.style.height = `${maxTabHeight + 10}px` + } + + resize() + new ResizeObserver(resize).observe(tabbed) + }) + }) + + } + + static resize(tabbed) { + + } +} \ No newline at end of file diff --git a/docs/doxygen_awesome/doxygen-awesome.css b/docs/doxygen_awesome/doxygen-awesome.css new file mode 100644 index 0000000..ac7f060 --- /dev/null +++ b/docs/doxygen_awesome/doxygen-awesome.css @@ -0,0 +1,2669 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +html { + /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ + --primary-color: #1779c4; + --primary-dark-color: #335c80; + --primary-light-color: #70b1e9; + + /* page base colors */ + --page-background-color: #ffffff; + --page-foreground-color: #2f4153; + --page-secondary-foreground-color: #6f7e8e; + + /* color for all separators on the website: hr, borders, ... */ + --separator-color: #dedede; + + /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ + --border-radius-large: 8px; + --border-radius-small: 4px; + --border-radius-medium: 6px; + + /* default spacings. Most components reference these values for spacing, to provide uniform spacing on the page. */ + --spacing-small: 5px; + --spacing-medium: 10px; + --spacing-large: 16px; + + /* default box shadow used for raising an element above the normal content. Used in dropdowns, search result, ... */ + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + + --odd-color: rgba(0,0,0,.028); + + /* font-families. will affect all text on the website + * font-family: the normal font for text, headlines, menus + * font-family-monospace: used for preformatted text in memtitle, code, fragments + */ + --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif; + --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; + + /* font sizes */ + --page-font-size: 15.6px; + --navigation-font-size: 14.4px; + --toc-font-size: 13.4px; + --code-font-size: 14px; /* affects code, fragment */ + --title-font-size: 22px; + + /* content text properties. These only affect the page content, not the navigation or any other ui elements */ + --content-line-height: 27px; + /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/ + --content-maxwidth: 1050px; + --table-line-height: 24px; + --toc-sticky-top: var(--spacing-medium); + --toc-width: 200px; + --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 85px); + + /* colors for various content boxes: @warning, @note, @deprecated @bug */ + --warning-color: #faf3d8; + --warning-color-dark: #f3a600; + --warning-color-darker: #5f4204; + --note-color: #e4f3ff; + --note-color-dark: #1879C4; + --note-color-darker: #274a5c; + --todo-color: #e4dafd; + --todo-color-dark: #5b2bdd; + --todo-color-darker: #2a0d72; + --deprecated-color: #ecf0f3; + --deprecated-color-dark: #5b6269; + --deprecated-color-darker: #43454a; + --bug-color: #f8d1cc; + --bug-color-dark: #b61825; + --bug-color-darker: #75070f; + --invariant-color: #d8f1e3; + --invariant-color-dark: #44b86f; + --invariant-color-darker: #265532; + + /* blockquote colors */ + --blockquote-background: #f8f9fa; + --blockquote-foreground: #636568; + + /* table colors */ + --tablehead-background: #f1f1f1; + --tablehead-foreground: var(--page-foreground-color); + + /* menu-display: block | none + * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible. + * `GENERATE_TREEVIEW` MUST be enabled! + */ + --menu-display: block; + + --menu-focus-foreground: var(--page-background-color); + --menu-focus-background: var(--primary-color); + --menu-selected-background: rgba(0,0,0,.05); + + + --header-background: var(--page-background-color); + --header-foreground: var(--page-foreground-color); + + /* searchbar colors */ + --searchbar-background: var(--side-nav-background); + --searchbar-foreground: var(--page-foreground-color); + + /* searchbar size + * (`searchbar-width` is only applied on screens >= 768px. + * on smaller screens the searchbar will always fill the entire screen width) */ + --searchbar-height: 33px; + --searchbar-width: 210px; + --searchbar-border-radius: var(--searchbar-height); + + /* code block colors */ + --code-background: #f5f5f5; + --code-foreground: var(--page-foreground-color); + + /* fragment colors */ + --fragment-background: #F8F9FA; + --fragment-foreground: #37474F; + --fragment-keyword: #bb6bb2; + --fragment-keywordtype: #8258b3; + --fragment-keywordflow: #d67c3b; + --fragment-token: #438a59; + --fragment-comment: #969696; + --fragment-link: #5383d6; + --fragment-preprocessor: #46aaa5; + --fragment-linenumber-color: #797979; + --fragment-linenumber-background: #f4f4f5; + --fragment-linenumber-border: #e3e5e7; + --fragment-lineheight: 20px; + + /* sidebar navigation (treeview) colors */ + --side-nav-background: #fbfbfb; + --side-nav-foreground: var(--page-foreground-color); + --side-nav-arrow-opacity: 0; + --side-nav-arrow-hover-opacity: 0.9; + + --toc-background: var(--side-nav-background); + --toc-foreground: var(--side-nav-foreground); + + /* height of an item in any tree / collapsible table */ + --tree-item-height: 30px; + + --memname-font-size: var(--code-font-size); + --memtitle-font-size: 18px; + + --webkit-scrollbar-size: 7px; + --webkit-scrollbar-padding: 4px; + --webkit-scrollbar-color: var(--separator-color); + + --animation-duration: .12s +} + +@media screen and (max-width: 767px) { + html { + --page-font-size: 16px; + --navigation-font-size: 16px; + --toc-font-size: 15px; + --code-font-size: 15px; /* affects code, fragment */ + --title-font-size: 22px; + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #3b2e04; + --warning-color-dark: #f1b602; + --warning-color-darker: #ceb670; + --note-color: #163750; + --note-color-dark: #1982D2; + --note-color-darker: #dcf0fa; + --todo-color: #2a2536; + --todo-color-dark: #7661b3; + --todo-color-darker: #ae9ed6; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2e1917; + --bug-color-dark: #ad2617; + --bug-color-darker: #f5b1aa; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; + } +} + +/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */ +html.dark-mode { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #3b2e04; + --warning-color-dark: #f1b602; + --warning-color-darker: #ceb670; + --note-color: #163750; + --note-color-dark: #1982D2; + --note-color-darker: #dcf0fa; + --todo-color: #2a2536; + --todo-color-dark: #7661b3; + --todo-color-darker: #ae9ed6; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2e1917; + --bug-color-dark: #ad2617; + --bug-color-darker: #f5b1aa; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; +} + +body { + color: var(--page-foreground-color); + background-color: var(--page-background-color); + font-size: var(--page-font-size); +} + +body, table, div, p, dl, #nav-tree .label, .title, +.sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, +.SelectItem, #MSearchField, .navpath li.navelem a, +.navpath li.navelem a:hover, p.reference, p.definition { + font-family: var(--font-family); +} + +h1, h2, h3, h4, h5 { + margin-top: 1em; + font-weight: 600; + line-height: initial; +} + +p, div, table, dl, p.reference, p.definition { + font-size: var(--page-font-size); +} + +p.reference, p.definition { + color: var(--page-secondary-foreground-color); +} + +a:link, a:visited, a:hover, a:focus, a:active { + color: var(--primary-color) !important; + font-weight: 500; +} + +a.anchor { + scroll-margin-top: var(--spacing-large); + display: block; +} + +/* + Title and top navigation + */ + +#top { + background: var(--header-background); + border-bottom: 1px solid var(--separator-color); +} + +@media screen and (min-width: 768px) { + #top { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + } +} + +#main-nav { + flex-grow: 5; + padding: var(--spacing-small) var(--spacing-medium); +} + +#titlearea { + width: auto; + padding: var(--spacing-medium) var(--spacing-large); + background: none; + color: var(--header-foreground); + border-bottom: none; +} + +@media screen and (max-width: 767px) { + #titlearea { + padding-bottom: var(--spacing-small); + } +} + +#titlearea table tbody tr { + height: auto !important; +} + +#projectname { + font-size: var(--title-font-size); + font-weight: 600; +} + +#projectnumber { + font-family: inherit; + font-size: 60%; +} + +#projectbrief { + font-family: inherit; + font-size: 80%; +} + +#projectlogo { + vertical-align: middle; +} + +#projectlogo img { + max-height: calc(var(--title-font-size) * 2); + margin-right: var(--spacing-small); +} + +.sm-dox, .tabs, .tabs2, .tabs3 { + background: none; + padding: 0; +} + +.tabs, .tabs2, .tabs3 { + border-bottom: 1px solid var(--separator-color); + margin-bottom: -1px; +} + +.main-menu-btn-icon, .main-menu-btn-icon:before, .main-menu-btn-icon:after { + background: var(--page-secondary-foreground-color); +} + +@media screen and (max-width: 767px) { + .sm-dox a span.sub-arrow { + background: var(--code-background); + } + + #main-menu a.has-submenu span.sub-arrow { + color: var(--page-secondary-foreground-color); + border-radius: var(--border-radius-medium); + } + + #main-menu a.has-submenu:hover span.sub-arrow { + color: var(--page-foreground-color); + } +} + +@media screen and (min-width: 768px) { + .sm-dox li, .tablist li { + display: var(--menu-display); + } + + .sm-dox a span.sub-arrow { + border-color: var(--header-foreground) transparent transparent transparent; + } + + .sm-dox a:hover span.sub-arrow { + border-color: var(--menu-focus-foreground) transparent transparent transparent; + } + + .sm-dox ul a span.sub-arrow { + border-color: transparent transparent transparent var(--page-foreground-color); + } + + .sm-dox ul a:hover span.sub-arrow { + border-color: transparent transparent transparent var(--menu-focus-foreground); + } +} + +.sm-dox ul { + background: var(--page-background-color); + box-shadow: var(--box-shadow); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium) !important; + padding: var(--spacing-small); + animation: ease-out 150ms slideInMenu; +} + +@keyframes slideInMenu { + from { + opacity: 0; + transform: translate(0px, -2px); + } + + to { + opacity: 1; + transform: translate(0px, 0px); + } +} + +.sm-dox ul a { + color: var(--page-foreground-color) !important; + background: var(--page-background-color); + font-size: var(--navigation-font-size); +} + +.sm-dox>li>ul:after { + border-bottom-color: var(--page-background-color) !important; +} + +.sm-dox>li>ul:before { + border-bottom-color: var(--separator-color) !important; +} + +.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus { + font-size: var(--navigation-font-size) !important; + color: var(--menu-focus-foreground) !important; + text-shadow: none; + background-color: var(--menu-focus-background); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a { + text-shadow: none; + background: transparent; + background-image: none !important; + color: var(--header-foreground) !important; + font-weight: normal; + font-size: var(--navigation-font-size); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a:focus { + outline: auto; +} + +.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover { + text-shadow: none; + font-weight: normal; + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; + border-radius: var(--border-radius-small) !important; + font-size: var(--navigation-font-size); +} + +.tablist li.current { + border-radius: var(--border-radius-small); + background: var(--menu-selected-background); +} + +.tablist li { + margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small); +} + +.tablist a { + padding: 0 var(--spacing-large); +} + + +/* + Search box + */ + +#MSearchBox { + height: var(--searchbar-height); + background: var(--searchbar-background); + border-radius: var(--searchbar-border-radius); + border: 1px solid var(--separator-color); + overflow: hidden; + width: var(--searchbar-width); + position: relative; + box-shadow: none; + display: block; + margin-top: 0; +} + +/* until Doxygen 1.9.4 */ +.left img#MSearchSelect { + left: 0; + user-select: none; + padding-left: 8px; +} + +/* Doxygen 1.9.5 */ +.left span#MSearchSelect { + left: 0; + user-select: none; + margin-left: 8px; + padding: 0; +} + +.left #MSearchSelect[src$=".png"] { + padding-left: 0 +} + +.SelectionMark { + user-select: none; +} + +.tabs .left #MSearchSelect { + padding-left: 0; +} + +.tabs #MSearchBox { + position: absolute; + right: var(--spacing-medium); +} + +@media screen and (max-width: 767px) { + .tabs #MSearchBox { + position: relative; + right: 0; + margin-left: var(--spacing-medium); + margin-top: 0; + } +} + +#MSearchSelectWindow, #MSearchResultsWindow { + z-index: 9999; +} + +#MSearchBox.MSearchBoxActive { + border-color: var(--primary-color); + box-shadow: inset 0 0 0 1px var(--primary-color); +} + +#main-menu > li:last-child { + margin-right: 0; +} + +@media screen and (max-width: 767px) { + #main-menu > li:last-child { + height: 50px; + } +} + +#MSearchField { + font-size: var(--navigation-font-size); + height: calc(var(--searchbar-height) - 2px); + background: transparent; + width: calc(var(--searchbar-width) - 64px); +} + +.MSearchBoxActive #MSearchField { + color: var(--searchbar-foreground); +} + +#MSearchSelect { + top: calc(calc(var(--searchbar-height) / 2) - 11px); +} + +#MSearchBox span.left, #MSearchBox span.right { + background: none; + background-image: none; +} + +#MSearchBox span.right { + padding-top: calc(calc(var(--searchbar-height) / 2) - 12px); + position: absolute; + right: var(--spacing-small); +} + +.tabs #MSearchBox span.right { + top: calc(calc(var(--searchbar-height) / 2) - 12px); +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + left: auto !important; + right: var(--spacing-medium); + border-radius: var(--border-radius-large); + border: 1px solid var(--separator-color); + transform: translate(0, 20px); + box-shadow: var(--box-shadow); + animation: ease-out 280ms slideInSearchResults; + background: var(--page-background-color); +} + +iframe#MSearchResults { + margin: 4px; +} + +iframe { + color-scheme: normal; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) iframe#MSearchResults { + filter: invert() hue-rotate(180deg); + } +} + +html.dark-mode iframe#MSearchResults { + filter: invert() hue-rotate(180deg); +} + +#MSearchResults .SRPage { + background-color: transparent; +} + +#MSearchResults .SRPage .SREntry { + font-size: 10pt; + padding: var(--spacing-small) var(--spacing-medium); +} + +#MSearchSelectWindow { + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + background: var(--page-background-color); + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); +} + +#MSearchSelectWindow a.SelectItem { + font-size: var(--navigation-font-size); + line-height: var(--content-line-height); + margin: 0 var(--spacing-small); + border-radius: var(--border-radius-small); + color: var(--page-foreground-color) !important; + font-weight: normal; +} + +#MSearchSelectWindow a.SelectItem:hover { + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; +} + +@media screen and (max-width: 767px) { + #MSearchBox { + margin-top: var(--spacing-medium); + margin-bottom: var(--spacing-medium); + width: calc(100vw - 30px); + } + + #main-menu > li:last-child { + float: none !important; + } + + #MSearchField { + width: calc(100vw - 110px); + } + + @keyframes slideInSearchResultsMobile { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: var(--spacing-medium); + overflow: auto; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResultsMobile; + width: auto !important; + } + + /* + * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2 + */ + label.main-menu-btn ~ #searchBoxPos1 { + top: 3px !important; + right: 6px !important; + left: 45px; + display: flex; + } + + label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox { + margin-top: 0; + margin-bottom: 0; + flex-grow: 2; + float: left; + } +} + +/* + Tree view + */ + +#side-nav { + padding: 0 !important; + background: var(--side-nav-background); + min-width: 8px; + max-width: 50vw; +} + +@media screen and (max-width: 767px) { + #side-nav { + display: none; + } + + #doc-content { + margin-left: 0 !important; + } +} + +#nav-tree { + background: transparent; + margin-right: 1px; +} + +#nav-tree .label { + font-size: var(--navigation-font-size); +} + +#nav-tree .item { + height: var(--tree-item-height); + line-height: var(--tree-item-height); +} + +#nav-sync { + bottom: 12px; + right: 12px; + top: auto !important; + user-select: none; +} + +#nav-tree .selected { + text-shadow: none; + background-image: none; + background-color: transparent; + position: relative; +} + +#nav-tree .selected::after { + content: ""; + position: absolute; + top: 1px; + bottom: 1px; + left: 0; + width: 4px; + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + background: var(--primary-color); +} + + +#nav-tree a { + color: var(--side-nav-foreground) !important; + font-weight: normal; +} + +#nav-tree a:focus { + outline-style: auto; +} + +#nav-tree .arrow { + opacity: var(--side-nav-arrow-opacity); +} + +.arrow { + color: inherit; + cursor: pointer; + font-size: 45%; + vertical-align: middle; + margin-right: 2px; + font-family: serif; + height: auto; + text-align: right; +} + +#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow { + opacity: var(--side-nav-arrow-hover-opacity); +} + +#nav-tree .selected a { + color: var(--primary-color) !important; + font-weight: bolder; + font-weight: 600; +} + +.ui-resizable-e { + width: 4px; + background: transparent; + box-shadow: inset -1px 0 0 0 var(--separator-color); +} + +/* + Contents + */ + +div.header { + border-bottom: 1px solid var(--separator-color); + background-color: var(--page-background-color); + background-image: none; +} + +@media screen and (min-width: 1000px) { + #doc-content > div > div.contents, + .PageDoc > div.contents { + display: flex; + flex-direction: row-reverse; + flex-wrap: nowrap; + align-items: flex-start; + } + + div.contents .textblock { + min-width: 200px; + flex-grow: 1; + } +} + +div.contents, div.header .title, div.header .summary { + max-width: var(--content-maxwidth); +} + +div.contents, div.header .title { + line-height: initial; + margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto; +} + +div.header .summary { + margin: var(--spacing-medium) auto 0 auto; +} + +div.headertitle { + padding: 0; +} + +div.header .title { + font-weight: 600; + font-size: 225%; + padding: var(--spacing-medium) var(--spacing-large); + word-break: break-word; +} + +div.header .summary { + width: auto; + display: block; + float: none; + padding: 0 var(--spacing-large); +} + +td.memSeparator { + border-color: var(--separator-color); +} + +span.mlabel { + background: var(--primary-color); + border: none; + padding: 4px 9px; + border-radius: 12px; + margin-right: var(--spacing-medium); +} + +span.mlabel:last-of-type { + margin-right: 2px; +} + +div.contents { + padding: 0 var(--spacing-large); +} + +div.contents p, div.contents li { + line-height: var(--content-line-height); +} + +div.contents div.dyncontent { + margin: var(--spacing-medium) 0; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) div.contents div.dyncontent img, + html:not(.light-mode) div.contents center img, + html:not(.light-mode) div.contents > table img, + html:not(.light-mode) div.contents div.dyncontent iframe, + html:not(.light-mode) div.contents center iframe, + html:not(.light-mode) div.contents table iframe, + html:not(.light-mode) div.contents .dotgraph iframe { + filter: brightness(89%) hue-rotate(180deg) invert(); + } +} + +html.dark-mode div.contents div.dyncontent img, +html.dark-mode div.contents center img, +html.dark-mode div.contents > table img, +html.dark-mode div.contents div.dyncontent iframe, +html.dark-mode div.contents center iframe, +html.dark-mode div.contents table iframe, +html.dark-mode div.contents .dotgraph iframe + { + filter: brightness(89%) hue-rotate(180deg) invert(); +} + +h2.groupheader { + border-bottom: 0px; + color: var(--page-foreground-color); + box-shadow: + 100px 0 var(--page-background-color), + -100px 0 var(--page-background-color), + 100px 0.75px var(--separator-color), + -100px 0.75px var(--separator-color), + 500px 0 var(--page-background-color), + -500px 0 var(--page-background-color), + 500px 0.75px var(--separator-color), + -500px 0.75px var(--separator-color), + 900px 0 var(--page-background-color), + -900px 0 var(--page-background-color), + 900px 0.75px var(--separator-color), + -900px 0.75px var(--separator-color), + 1400px 0 var(--page-background-color), + -1400px 0 var(--page-background-color), + 1400px 0.75px var(--separator-color), + -1400px 0.75px var(--separator-color), + 1900px 0 var(--page-background-color), + -1900px 0 var(--page-background-color), + 1900px 0.75px var(--separator-color), + -1900px 0.75px var(--separator-color); +} + +blockquote { + margin: 0 var(--spacing-medium) 0 var(--spacing-medium); + padding: var(--spacing-small) var(--spacing-large); + background: var(--blockquote-background); + color: var(--blockquote-foreground); + border-left: 0; + overflow: visible; + border-radius: var(--border-radius-medium); + overflow: visible; + position: relative; +} + +blockquote::before, blockquote::after { + font-weight: bold; + font-family: serif; + font-size: 360%; + opacity: .15; + position: absolute; +} + +blockquote::before { + content: "“"; + left: -10px; + top: 4px; +} + +blockquote::after { + content: "”"; + right: -8px; + bottom: -25px; +} + +blockquote p { + margin: var(--spacing-small) 0 var(--spacing-medium) 0; +} +.paramname { + font-weight: 600; + color: var(--primary-dark-color); +} + +.paramname > code { + border: 0; +} + +table.params .paramname { + font-weight: 600; + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + padding-right: var(--spacing-small); + line-height: var(--table-line-height); +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--primary-light-color); +} + +.alphachar a { + color: var(--page-foreground-color); +} + +.dotgraph { + max-width: 100%; + overflow-x: scroll; +} + +.dotgraph .caption { + position: sticky; + left: 0; +} + +/* Wrap Graphviz graphs with the `interactive_dotgraph` class if `INTERACTIVE_SVG = YES` */ +.interactive_dotgraph .dotgraph iframe { + max-width: 100%; +} + +/* + Table of Contents + */ + +div.contents .toc { + max-height: var(--toc-max-height); + min-width: var(--toc-width); + border: 0; + border-left: 1px solid var(--separator-color); + border-radius: 0; + background-color: transparent; + box-shadow: none; + position: sticky; + top: var(--toc-sticky-top); + padding: 0 var(--spacing-large); + margin: var(--spacing-small) 0 var(--spacing-large) var(--spacing-large); +} + +div.toc h3 { + color: var(--toc-foreground); + font-size: var(--navigation-font-size); + margin: var(--spacing-large) 0 var(--spacing-medium) 0; +} + +div.toc li { + padding: 0; + background: none; + line-height: var(--toc-font-size); + margin: var(--toc-font-size) 0 0 0; +} + +div.toc li::before { + display: none; +} + +div.toc ul { + margin-top: 0 +} + +div.toc li a { + font-size: var(--toc-font-size); + color: var(--page-foreground-color) !important; + text-decoration: none; +} + +div.toc li a:hover, div.toc li a.active { + color: var(--primary-color) !important; +} + +div.toc li a.aboveActive { + color: var(--page-secondary-foreground-color) !important; +} + + +@media screen and (max-width: 999px) { + div.contents .toc { + max-height: 45vh; + float: none; + width: auto; + margin: 0 0 var(--spacing-medium) 0; + position: relative; + top: 0; + position: relative; + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + background-color: var(--toc-background); + box-shadow: var(--box-shadow); + } + + div.contents .toc.interactive { + max-height: calc(var(--navigation-font-size) + 2 * var(--spacing-large)); + overflow: hidden; + } + + div.contents .toc > h3 { + -webkit-tap-highlight-color: transparent; + cursor: pointer; + position: sticky; + top: 0; + background-color: var(--toc-background); + margin: 0; + padding: var(--spacing-large) 0; + display: block; + } + + div.contents .toc.interactive > h3::before { + content: ""; + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + display: inline-block; + margin-right: var(--spacing-small); + margin-bottom: calc(var(--navigation-font-size) / 4); + transform: rotate(-90deg); + transition: transform var(--animation-duration) ease-out; + } + + div.contents .toc.interactive.open > h3::before { + transform: rotate(0deg); + } + + div.contents .toc.interactive.open { + max-height: 45vh; + overflow: auto; + transition: max-height 0.2s ease-in-out; + } + + div.contents .toc a, div.contents .toc a.active { + color: var(--primary-color) !important; + } + + div.contents .toc a:hover { + text-decoration: underline; + } +} + +/* + Code & Fragments + */ + +code, div.fragment, pre.fragment { + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + overflow: hidden; +} + +code { + display: inline; + background: var(--code-background); + color: var(--code-foreground); + padding: 2px 6px; +} + +div.fragment, pre.fragment { + margin: var(--spacing-medium) 0; + padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large); + background: var(--fragment-background); + color: var(--fragment-foreground); + overflow-x: auto; +} + +@media screen and (max-width: 767px) { + div.fragment, pre.fragment { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + } + + .contents > div.fragment, + .textblock > div.fragment, + .textblock > pre.fragment, + .textblock > .tabbed > ul > li > div.fragment, + .textblock > .tabbed > ul > li > pre.fragment, + .contents > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment, + .textblock > .tabbed > ul > li > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .tabbed > ul > li > .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + border-radius: 0; + border-left: 0; + } + + .textblock li > .fragment, + .textblock li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + } + + .memdoc li > .fragment, + .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + } + + .textblock ul, .memdoc ul { + overflow: initial; + } + + .memdoc > div.fragment, + .memdoc > pre.fragment, + dl dd > div.fragment, + dl dd pre.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment, + dl dd > .doxygen-awesome-fragment-wrapper > div.fragment, + dl dd .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + border-radius: 0; + border-left: 0; + } +} + +code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size) !important; +} + +div.line:after { + margin-right: var(--spacing-medium); +} + +div.fragment .line, pre.fragment { + white-space: pre; + word-wrap: initial; + line-height: var(--fragment-lineheight); +} + +div.fragment span.keyword { + color: var(--fragment-keyword); +} + +div.fragment span.keywordtype { + color: var(--fragment-keywordtype); +} + +div.fragment span.keywordflow { + color: var(--fragment-keywordflow); +} + +div.fragment span.stringliteral { + color: var(--fragment-token) +} + +div.fragment span.comment { + color: var(--fragment-comment); +} + +div.fragment a.code { + color: var(--fragment-link) !important; +} + +div.fragment span.preprocessor { + color: var(--fragment-preprocessor); +} + +div.fragment span.lineno { + display: inline-block; + width: 27px; + border-right: none; + background: var(--fragment-linenumber-background); + color: var(--fragment-linenumber-color); +} + +div.fragment span.lineno a { + background: none; + color: var(--fragment-link) !important; +} + +div.fragment > .line:first-child .lineno { + box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border); + background-color: var(--fragment-linenumber-background) !important; +} + +div.line { + border-radius: var(--border-radius-small); +} + +div.line.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +/* + dl warning, attention, note, deprecated, bug, ... + */ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.post, dl.todo, dl.remark { + padding: var(--spacing-medium); + margin: var(--spacing-medium) 0; + color: var(--page-background-color); + overflow: hidden; + margin-left: 0; + border-radius: var(--border-radius-small); +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention { + background: var(--warning-color); + border-left: 8px solid var(--warning-color-dark); + color: var(--warning-color-darker); +} + +dl.warning dt, dl.attention dt { + color: var(--warning-color-dark); +} + +dl.note, dl.remark { + background: var(--note-color); + border-left: 8px solid var(--note-color-dark); + color: var(--note-color-darker); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-dark); +} + +dl.todo { + background: var(--todo-color); + border-left: 8px solid var(--todo-color-dark); + color: var(--todo-color-darker); +} + +dl.todo dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug { + background: var(--bug-color); + border-left: 8px solid var(--bug-color-dark); + color: var(--bug-color-darker); +} + +dl.bug dt a { + color: var(--bug-color-dark) !important; +} + +dl.deprecated { + background: var(--deprecated-color); + border-left: 8px solid var(--deprecated-color-dark); + color: var(--deprecated-color-darker); +} + +dl.deprecated dt a { + color: var(--deprecated-color-dark) !important; +} + +dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color); + border-left: 8px solid var(--invariant-color-dark); + color: var(--invariant-color-darker); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-dark); +} + +/* + memitem + */ + +div.memdoc, div.memproto, h2.memtitle { + box-shadow: none; + background-image: none; + border: none; +} + +div.memdoc { + padding: 0 var(--spacing-medium); + background: var(--page-background-color); +} + +h2.memtitle, div.memitem { + border: 1px solid var(--separator-color); + box-shadow: var(--box-shadow); +} + +h2.memtitle { + box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow); +} + +div.memitem { + transition: none; +} + +div.memproto, h2.memtitle { + background: var(--fragment-background); +} + +h2.memtitle { + font-weight: 500; + font-size: var(--memtitle-font-size); + font-family: var(--font-family-monospace); + border-bottom: none; + border-top-left-radius: var(--border-radius-medium); + border-top-right-radius: var(--border-radius-medium); + word-break: break-all; + position: relative; +} + +h2.memtitle:after { + content: ""; + display: block; + background: var(--fragment-background); + height: var(--spacing-medium); + bottom: calc(0px - var(--spacing-medium)); + left: 0; + right: -14px; + position: absolute; + border-top-right-radius: var(--border-radius-medium); +} + +h2.memtitle > span.permalink { + font-size: inherit; +} + +h2.memtitle > span.permalink > a { + text-decoration: none; + padding-left: 3px; + margin-right: -4px; + user-select: none; + display: inline-block; + margin-top: -6px; +} + +h2.memtitle > span.permalink > a:hover { + color: var(--primary-dark-color) !important; +} + +a:target + h2.memtitle, a:target + h2.memtitle + div.memitem { + border-color: var(--primary-light-color); +} + +div.memitem { + border-top-right-radius: var(--border-radius-medium); + border-bottom-right-radius: var(--border-radius-medium); + border-bottom-left-radius: var(--border-radius-medium); + overflow: hidden; + display: block !important; +} + +div.memdoc { + border-radius: 0; +} + +div.memproto { + border-radius: 0 var(--border-radius-small) 0 0; + overflow: auto; + border-bottom: 1px solid var(--separator-color); + padding: var(--spacing-medium); + margin-bottom: -1px; +} + +div.memtitle { + border-top-right-radius: var(--border-radius-medium); + border-top-left-radius: var(--border-radius-medium); +} + +div.memproto table.memname { + font-family: var(--font-family-monospace); + color: var(--page-foreground-color); + font-size: var(--memname-font-size); + text-shadow: none; +} + +div.memproto div.memtemplate { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--memname-font-size); + margin-left: 2px; + text-shadow: none; +} + +table.mlabels, table.mlabels > tbody { + display: block; +} + +td.mlabels-left { + width: auto; +} + +td.mlabels-right { + margin-top: 3px; + position: sticky; + left: 0; +} + +table.mlabels > tbody > tr:first-child { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.memname, .memitem span.mlabels { + margin: 0 +} + +/* + reflist + */ + +dl.reflist { + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-medium); + border: 1px solid var(--separator-color); + overflow: hidden; + padding: 0; +} + + +dl.reflist dt, dl.reflist dd { + box-shadow: none; + text-shadow: none; + background-image: none; + border: none; + padding: 12px; +} + + +dl.reflist dt { + font-weight: 500; + border-radius: 0; + background: var(--code-background); + border-bottom: 1px solid var(--separator-color); + color: var(--page-foreground-color) +} + + +dl.reflist dd { + background: none; +} + +/* + Table + */ + +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname), +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: inline-block; + max-width: 100%; +} + +.contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); +} + +table.fieldtable, +table.markdownTable tbody, +table.doxtable tbody { + border: none; + margin: var(--spacing-medium) 0; + box-shadow: 0 0 0 1px var(--separator-color); + border-radius: var(--border-radius-small); +} + +table.markdownTable, table.doxtable, table.fieldtable { + padding: 1px; +} + +table.doxtable caption { + display: block; +} + +table.fieldtable { + border-collapse: collapse; + width: 100%; +} + +th.markdownTableHeadLeft, +th.markdownTableHeadRight, +th.markdownTableHeadCenter, +th.markdownTableHeadNone, +table.doxtable th { + background: var(--tablehead-background); + color: var(--tablehead-foreground); + font-weight: 600; + font-size: var(--page-font-size); +} + +th.markdownTableHeadLeft:first-child, +th.markdownTableHeadRight:first-child, +th.markdownTableHeadCenter:first-child, +th.markdownTableHeadNone:first-child, +table.doxtable tr th:first-child { + border-top-left-radius: var(--border-radius-small); +} + +th.markdownTableHeadLeft:last-child, +th.markdownTableHeadRight:last-child, +th.markdownTableHeadCenter:last-child, +th.markdownTableHeadNone:last-child, +table.doxtable tr th:last-child { + border-top-right-radius: var(--border-radius-small); +} + +table.markdownTable td, +table.markdownTable th, +table.fieldtable td, +table.fieldtable th, +table.doxtable td, +table.doxtable th { + border: 1px solid var(--separator-color); + padding: var(--spacing-small) var(--spacing-medium); +} + +table.markdownTable td:last-child, +table.markdownTable th:last-child, +table.fieldtable td:last-child, +table.fieldtable th:last-child, +table.doxtable td:last-child, +table.doxtable th:last-child { + border-right: none; +} + +table.markdownTable td:first-child, +table.markdownTable th:first-child, +table.fieldtable td:first-child, +table.fieldtable th:first-child, +table.doxtable td:first-child, +table.doxtable th:first-child { + border-left: none; +} + +table.markdownTable tr:first-child td, +table.markdownTable tr:first-child th, +table.fieldtable tr:first-child td, +table.fieldtable tr:first-child th, +table.doxtable tr:first-child td, +table.doxtable tr:first-child th { + border-top: none; +} + +table.markdownTable tr:last-child td, +table.markdownTable tr:last-child th, +table.fieldtable tr:last-child td, +table.fieldtable tr:last-child th, +table.doxtable tr:last-child td, +table.doxtable tr:last-child th { + border-bottom: none; +} + +table.markdownTable tr, table.doxtable tr { + border-bottom: 1px solid var(--separator-color); +} + +table.markdownTable tr:last-child, table.doxtable tr:last-child { + border-bottom: none; +} + +.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { + display: block; +} + +.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: table; + width: 100%; +} + +table.fieldtable th { + font-size: var(--page-font-size); + font-weight: 600; + background-image: none; + background-color: var(--tablehead-background); + color: var(--tablehead-foreground); +} + +table.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fielddoc, .fieldtable th { + border-bottom: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); +} + +table.fieldtable tr:last-child td:first-child { + border-bottom-left-radius: var(--border-radius-small); +} + +table.fieldtable tr:last-child td:last-child { + border-bottom-right-radius: var(--border-radius-small); +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +table.memberdecls { + display: block; + -webkit-tap-highlight-color: transparent; +} + +table.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); +} + +table.memberdecls tr[class^='memitem'] .memTemplParams { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + color: var(--primary-dark-color); + white-space: normal; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memItemRight, +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight, +table.memberdecls .memTemplParams { + transition: none; + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + background-color: var(--fragment-background); +} + +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight { + padding-top: 2px; +} + +table.memberdecls .memTemplParams { + border-bottom: 0; + border-left: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + padding-bottom: var(--spacing-small); +} + +table.memberdecls .memTemplItemLeft { + border-radius: 0 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + border-top: 0; +} + +table.memberdecls .memTemplItemRight { + border-radius: 0 0 var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-left: 0; + border-top: 0; +} + +table.memberdecls .memItemLeft { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + padding-left: var(--spacing-medium); + padding-right: 0; +} + +table.memberdecls .memItemRight { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-right: var(--spacing-medium); + padding-left: 0; + +} + +table.memberdecls .mdescLeft, table.memberdecls .mdescRight { + background: none; + color: var(--page-foreground-color); + padding: var(--spacing-small) 0; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memTemplItemLeft { + padding-right: var(--spacing-medium); +} + +table.memberdecls .memSeparator { + background: var(--page-background-color); + height: var(--spacing-large); + border: 0; + transition: none; +} + +table.memberdecls .groupheader { + margin-bottom: var(--spacing-large); +} + +table.memberdecls .inherit_header td { + padding: 0 0 var(--spacing-medium) 0; + text-indent: -12px; + color: var(--page-secondary-foreground-color); +} + +table.memberdecls img[src="closed.png"], +table.memberdecls img[src="open.png"], +div.dynheader img[src="open.png"], +div.dynheader img[src="closed.png"] { + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + margin-top: 8px; + display: block; + float: left; + margin-left: -10px; + transition: transform var(--animation-duration) ease-out; +} + +table.memberdecls img { + margin-right: 10px; +} + +table.memberdecls img[src="closed.png"], +div.dynheader img[src="closed.png"] { + transform: rotate(-90deg); + +} + +.compoundTemplParams { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--code-font-size); +} + +@media screen and (max-width: 767px) { + + table.memberdecls .memItemLeft, + table.memberdecls .memItemRight, + table.memberdecls .mdescLeft, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemLeft, + table.memberdecls .memTemplItemRight, + table.memberdecls .memTemplParams { + display: block; + text-align: left; + padding-left: var(--spacing-large); + margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large)); + border-right: none; + border-left: none; + border-radius: 0; + white-space: normal; + } + + table.memberdecls .memItemLeft, + table.memberdecls .mdescLeft, + table.memberdecls .memTemplItemLeft { + border-bottom: 0; + padding-bottom: 0; + } + + table.memberdecls .memTemplItemLeft { + padding-top: 0; + } + + table.memberdecls .mdescLeft { + margin-bottom: calc(0px - var(--page-font-size)); + } + + table.memberdecls .memItemRight, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemRight { + border-top: 0; + padding-top: 0; + padding-right: var(--spacing-large); + overflow-x: auto; + } + + table.memberdecls tr[class^='memitem']:not(.inherit) { + display: block; + width: calc(100vw - 2 * var(--spacing-large)); + } + + table.memberdecls .mdescRight { + color: var(--page-foreground-color); + } + + table.memberdecls tr.inherit { + visibility: hidden; + } + + table.memberdecls tr[style="display: table-row;"] { + display: block !important; + visibility: visible; + width: calc(100vw - 2 * var(--spacing-large)); + animation: fade .5s; + } + + @keyframes fade { + 0% { + opacity: 0; + max-height: 0; + } + + 100% { + opacity: 1; + max-height: 200px; + } + } +} + + +/* + Horizontal Rule + */ + +hr { + margin-top: var(--spacing-large); + margin-bottom: var(--spacing-large); + height: 1px; + background-color: var(--separator-color); + border: 0; +} + +.contents hr { + box-shadow: 100px 0 0 var(--separator-color), + -100px 0 0 var(--separator-color), + 500px 0 0 var(--separator-color), + -500px 0 0 var(--separator-color), + 1500px 0 0 var(--separator-color), + -1500px 0 0 var(--separator-color), + 2000px 0 0 var(--separator-color), + -2000px 0 0 var(--separator-color); +} + +.contents img, .contents .center, .contents center, .contents div.image object { + max-width: 100%; + overflow: auto; +} + +@media screen and (max-width: 767px) { + .contents .dyncontent > .center, .contents > center { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); + } +} + +/* + Directories + */ +div.directory { + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + width: auto; +} + +table.directory { + font-family: var(--font-family); + font-size: var(--page-font-size); + font-weight: normal; + width: 100%; +} + +table.directory td.entry, table.directory td.desc { + padding: calc(var(--spacing-small) / 2) var(--spacing-small); + line-height: var(--table-line-height); +} + +table.directory tr.even td:last-child { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; +} + +table.directory tr.even td:first-child { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); +} + +table.directory tr.even:last-child td:last-child { + border-radius: 0 var(--border-radius-small) 0 0; +} + +table.directory tr.even:last-child td:first-child { + border-radius: var(--border-radius-small) 0 0 0; +} + +table.directory td.desc { + min-width: 250px; +} + +table.directory tr.even { + background-color: var(--odd-color); +} + +table.directory tr.odd { + background-color: transparent; +} + +.icona { + width: auto; + height: auto; + margin: 0 var(--spacing-small); +} + +.icon { + background: var(--primary-color); + border-radius: var(--border-radius-small); + font-size: var(--page-font-size); + padding: calc(var(--page-font-size) / 5); + line-height: var(--page-font-size); + transform: scale(0.8); + height: auto; + width: var(--page-font-size); + user-select: none; +} + +.iconfopen, .icondoc, .iconfclosed { + background-position: center; + margin-bottom: 0; + height: var(--table-line-height); +} + +.icondoc { + filter: saturate(0.2); +} + +@media screen and (max-width: 767px) { + div.directory { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode .iconfopen, html.dark-mode .iconfclosed { + filter: hue-rotate(180deg) invert(); +} + +/* + Class list + */ + +.classindex dl.odd { + background: var(--odd-color); + border-radius: var(--border-radius-small); +} + +.classindex dl.even { + background-color: transparent; +} + +/* + Class Index Doxygen 1.8 +*/ + +table.classindex { + margin-left: 0; + margin-right: 0; + width: 100%; +} + +table.classindex table div.ah { + background-image: none; + background-color: initial; + border-color: var(--separator-color); + color: var(--page-foreground-color); + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-large); + padding: var(--spacing-small); +} + +div.qindex { + background-color: var(--odd-color); + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + padding: var(--spacing-small) 0; +} + +/* + Footer and nav-path + */ + +#nav-path { + width: 100%; +} + +#nav-path ul { + background-image: none; + background: var(--page-background-color); + border: none; + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + border-bottom: 0; + box-shadow: 0 0.75px 0 var(--separator-color); + font-size: var(--navigation-font-size); +} + +img.footer { + width: 60px; +} + +.navpath li.footer { + color: var(--page-secondary-foreground-color); +} + +address.footer { + color: var(--page-secondary-foreground-color); + margin-bottom: var(--spacing-large); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--primary-color) !important; +} + +.navpath li.navelem b { + color: var(--primary-dark-color); + font-weight: 500; +} + +li.navelem { + padding: 0; + margin-left: -8px; +} + +li.navelem:first-child { + margin-left: var(--spacing-large); +} + +li.navelem:first-child:before { + display: none; +} + +#nav-path li.navelem:after { + content: ''; + border: 5px solid var(--page-background-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(4.2); + z-index: 10; + margin-left: 6px; +} + +#nav-path li.navelem:before { + content: ''; + border: 5px solid var(--separator-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(3.2); + margin-right: var(--spacing-small); +} + +.navpath li.navelem a:hover { + color: var(--primary-color); +} + +/* + Scrollbars for Webkit +*/ + +#nav-tree::-webkit-scrollbar, +div.fragment::-webkit-scrollbar, +pre.fragment::-webkit-scrollbar, +div.memproto::-webkit-scrollbar, +.contents center::-webkit-scrollbar, +.contents .center::-webkit-scrollbar, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar, +div.contents .toc::-webkit-scrollbar, +.contents .dotgraph::-webkit-scrollbar, +.contents .tabs-overview-container::-webkit-scrollbar { + background: transparent; + width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); +} + +#nav-tree::-webkit-scrollbar-thumb, +div.fragment::-webkit-scrollbar-thumb, +pre.fragment::-webkit-scrollbar-thumb, +div.memproto::-webkit-scrollbar-thumb, +.contents center::-webkit-scrollbar-thumb, +.contents .center::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-thumb, +div.contents .toc::-webkit-scrollbar-thumb, +.contents .dotgraph::-webkit-scrollbar-thumb, +.contents .tabs-overview-container::-webkit-scrollbar-thumb { + background-color: transparent; + border: var(--webkit-scrollbar-padding) solid transparent; + border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + background-clip: padding-box; +} + +#nav-tree:hover::-webkit-scrollbar-thumb, +div.fragment:hover::-webkit-scrollbar-thumb, +pre.fragment:hover::-webkit-scrollbar-thumb, +div.memproto:hover::-webkit-scrollbar-thumb, +.contents center:hover::-webkit-scrollbar-thumb, +.contents .center:hover::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody:hover::-webkit-scrollbar-thumb, +div.contents .toc:hover::-webkit-scrollbar-thumb, +.contents .dotgraph:hover::-webkit-scrollbar-thumb, +.contents .tabs-overview-container:hover::-webkit-scrollbar-thumb { + background-color: var(--webkit-scrollbar-color); +} + +#nav-tree::-webkit-scrollbar-track, +div.fragment::-webkit-scrollbar-track, +pre.fragment::-webkit-scrollbar-track, +div.memproto::-webkit-scrollbar-track, +.contents center::-webkit-scrollbar-track, +.contents .center::-webkit-scrollbar-track, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-track, +div.contents .toc::-webkit-scrollbar-track, +.contents .dotgraph::-webkit-scrollbar-track, +.contents .tabs-overview-container::-webkit-scrollbar-track { + background: transparent; +} + +#nav-tree::-webkit-scrollbar-corner { + background-color: var(--side-nav-background); +} + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc { + overflow-x: auto; + overflow-x: overlay; +} + +#nav-tree { + overflow-x: auto; + overflow-y: auto; + overflow-y: overlay; +} + +/* + Scrollbars for Firefox +*/ + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc, +.contents .dotgraph, +.contents .tabs-overview-container { + scrollbar-width: thin; +} + +/* + Optional Dark mode toggle button +*/ + +doxygen-awesome-dark-mode-toggle { + display: inline-block; + margin: 0 0 0 var(--spacing-small); + padding: 0; + width: var(--searchbar-height); + height: var(--searchbar-height); + background: none; + border: none; + border-radius: var(--searchbar-height); + vertical-align: middle; + text-align: center; + line-height: var(--searchbar-height); + font-size: 22px; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + cursor: pointer; +} + +doxygen-awesome-dark-mode-toggle > svg { + transition: transform var(--animation-duration) ease-in-out; +} + +doxygen-awesome-dark-mode-toggle:active > svg { + transform: scale(.5); +} + +doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.03); +} + +html.dark-mode doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.18); +} + +/* + Optional fragment copy button +*/ +.doxygen-awesome-fragment-wrapper { + position: relative; +} + +doxygen-awesome-fragment-copy-button { + opacity: 0; + background: var(--fragment-background); + width: 28px; + height: 28px; + position: absolute; + right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + border: 1px solid var(--fragment-foreground); + cursor: pointer; + border-radius: var(--border-radius-small); + display: flex; + justify-content: center; + align-items: center; +} + +.doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success { + opacity: .28; +} + +doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success { + opacity: 1 !important; +} + +doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg { + transform: scale(.91); +} + +doxygen-awesome-fragment-copy-button svg { + fill: var(--fragment-foreground); + width: 18px; + height: 18px; +} + +doxygen-awesome-fragment-copy-button.success svg { + fill: rgb(14, 168, 14); +} + +doxygen-awesome-fragment-copy-button.success { + border-color: rgb(14, 168, 14); +} + +@media screen and (max-width: 767px) { + .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button { + right: 0; + } +} + +/* + Optional paragraph link button +*/ + +a.anchorlink { + font-size: 90%; + margin-left: var(--spacing-small); + color: var(--page-foreground-color) !important; + text-decoration: none; + opacity: .15; + display: none; + transition: opacity var(--animation-duration) ease-in-out, color var(--animation-duration) ease-in-out; +} + +a.anchorlink svg { + fill: var(--page-foreground-color); +} + +h3 a.anchorlink svg, h4 a.anchorlink svg { + margin-bottom: -3px; + margin-top: -4px; +} + +a.anchorlink:hover { + opacity: .45; +} + +h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink { + display: inline-block; +} + +/* + Optional tab feature +*/ + +.tabbed ul { + padding-inline-start: 0px; + margin: 0; + padding: var(--spacing-small) 0; +} + +.tabbed li { + display: none; +} + +.tabbed li.selected { + display: block; +} + +.tabs-overview-container { + overflow-x: auto; + display: block; + overflow-y: visible; +} + +.tabs-overview { + border-bottom: 1px solid var(--separator-color); + display: flex; + flex-direction: row; +} + +@media screen and (max-width: 767px) { + .tabs-overview-container { + margin: 0 calc(0px - var(--spacing-large)); + } + .tabs-overview { + padding: 0 var(--spacing-large) + } +} + +.tabs-overview button.tab-button { + color: var(--page-foreground-color); + margin: 0; + border: none; + background: transparent; + padding: calc(var(--spacing-large) / 2) 0; + display: inline-block; + font-size: var(--page-font-size); + cursor: pointer; + box-shadow: 0 1px 0 0 var(--separator-color); + position: relative; + + -webkit-tap-highlight-color: transparent; +} + +.tabs-overview button.tab-button .tab-title::before { + display: block; + content: attr(title); + font-weight: 600; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.tabs-overview button.tab-button .tab-title { + float: left; + white-space: nowrap; + font-weight: normal; + padding: calc(var(--spacing-large) / 2) var(--spacing-large); + border-radius: var(--border-radius-medium); + transition: background-color var(--animation-duration) ease-in-out, font-weight var(--animation-duration) ease-in-out; +} + +.tabs-overview button.tab-button:not(:last-child) .tab-title { + box-shadow: 8px 0 0 -7px var(--separator-color); +} + +.tabs-overview button.tab-button:hover .tab-title { + background: var(--separator-color); + box-shadow: none; +} + +.tabs-overview button.tab-button.active .tab-title { + font-weight: 600; +} + +.tabs-overview button.tab-button::after { + content: ''; + display: block; + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 0; + width: 0%; + margin: 0 auto; + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + background-color: var(--primary-color); + transition: width var(--animation-duration) ease-in-out, height var(--animation-duration) ease-in-out; +} + +.tabs-overview button.tab-button.active::after { + width: 100%; + box-sizing: border-box; + height: 3px; +} + + +/* + Navigation Buttons +*/ + +.section_buttons:not(:empty) { + margin-top: calc(var(--spacing-large) * 3); +} + +.section_buttons table.markdownTable { + display: block; + width: 100%; +} + +.section_buttons table.markdownTable tbody { + display: table !important; + width: 100%; + box-shadow: none; + border-spacing: 10px; +} + +.section_buttons table.markdownTable td { + padding: 0; +} + +.section_buttons table.markdownTable th { + display: none; +} + +.section_buttons table.markdownTable tr.markdownTableHead { + border: none; +} + +.section_buttons tr th, .section_buttons tr td { + background: none; + border: none; + padding: var(--spacing-large) 0 var(--spacing-small); +} + +.section_buttons a { + display: inline-block; + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + color: var(--page-secondary-foreground-color) !important; + text-decoration: none; + transition: color var(--animation-duration) ease-in-out, background-color var(--animation-duration) ease-in-out; +} + +.section_buttons a:hover { + color: var(--page-foreground-color) !important; + background-color: var(--odd-color); +} + +.section_buttons tr td.markdownTableBodyLeft a { + padding: var(--spacing-medium) var(--spacing-large) var(--spacing-medium) calc(var(--spacing-large) / 2); +} + +.section_buttons tr td.markdownTableBodyRight a { + padding: var(--spacing-medium) calc(var(--spacing-large) / 2) var(--spacing-medium) var(--spacing-large); +} + +.section_buttons tr td.markdownTableBodyLeft a::before, +.section_buttons tr td.markdownTableBodyRight a::after { + color: var(--page-secondary-foreground-color) !important; + display: inline-block; + transition: color .08s ease-in-out, transform .09s ease-in-out; +} + +.section_buttons tr td.markdownTableBodyLeft a::before { + content: '〈'; + padding-right: var(--spacing-large); +} + + +.section_buttons tr td.markdownTableBodyRight a::after { + content: '〉'; + padding-left: var(--spacing-large); +} + + +.section_buttons tr td.markdownTableBodyLeft a:hover::before { + color: var(--page-foreground-color) !important; + transform: translateX(-3px); +} + +.section_buttons tr td.markdownTableBodyRight a:hover::after { + color: var(--page-foreground-color) !important; + transform: translateX(3px); +} + +@media screen and (max-width: 450px) { + .section_buttons a { + width: 100%; + box-sizing: border-box; + } + + .section_buttons tr td:nth-of-type(1).markdownTableBodyLeft a { + border-radius: var(--border-radius-medium) 0 0 var(--border-radius-medium); + border-right: none; + } + + .section_buttons tr td:nth-of-type(2).markdownTableBodyRight a { + border-radius: 0 var(--border-radius-medium) var(--border-radius-medium) 0; + } +} diff --git a/docs/logo.png b/docs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..94f9d53d4d59cb7bed2a986854f2b7159a4bb37d GIT binary patch literal 7586 zcmZ`;byQSev>p*$svcXp}PeX=@g{9VL${yKvJ3!B!*Ebsi8qigrOUTPN|{0 z-u&J_@2|J+y7#QR?>cv#wa-4^{`R+HUh1e46VMU>003fjH6?xQD2Ba7fse6I+vo?Y z*a7#QytX_5P?<=0WBmyG&Sa~muMGeMu>%0_BLRRbtm*wf0KgXv0BlhV$vXsQHdZRKFkD8W2%~*G{zLT#Uh1+InP z`^9{^Kfy!$rF)N=pQn7GD5@$>=n1_vSfwJB6{tnj?SFRQ@w4fuLU5r6k!fBIWqKwN zla|n5WI*O5{TJ}h)KMdAKAC89oy}{S2aDN5i-D(0rK=g9UHw}%NZ*5Pp|+k?zx&1a zaer)JVVA^f_U{h6k@T=%9_6;j2}h3}<{!XE9Cn|fst9=P3Pr@}N$C55NqHHlzc*%8 z)gJ;NZbhlAPbi_c4{QAWMrIe}gH@>>E`v2d)~w-NV@V=>h~rba-}g5gq=uNRrV~?_ zyQMrc&trPX?Z1fou=bXVE7Q3{)Z$A>W0LOT6<&3M?Cq!Umls!&c2HDRDUT@#;+DZ+ zY1TC-Atd27NmQ&wttxN97n(;E?f3$YE9V?v_N>zA^Fr$b5>e4gZ-2J`HsM_$+um1m z^>0z(j?|}ab;s~#*sg3w`s-a&;d{<2MP`f3W7}s5bcgpOm~uRZjaJ6R{u5<{zL_wW za~QO1QE*>8u&b0K_!kjNME$739xAF zg$K!8xv=bqTnJE1T>o-0&D6J%?2mmvbUxfHQEkChQ5x$O;!dF}eg3B0%yT)66f=v) z6f^N>Sjt?n9w%ms6xOz^wyO#I#oD1qcl>sqQVwiNQNcQstBY6t8stmHOP>rY*$O;X zu)e}mP%6+%)u)aMpW0(5J6Jsr^pu1-{*FL7y6#&|s5%GUO@!&cHXsCAQ>*mvpEiq^ z2b>J~y_p=Jay9Ld$S_CswcQ@d;`#U1%62V-FLxO4`{q^?B`T{+HV=&;p_%#`8CtYM zz8U5nKQt*3i0?uZgvJ%TCTtpT_mP)L?;k?fHG7=zrV) zJ-I*Aq=Q@tA>?|bBq$_E^1x(qy36wZQ1agBl0>=%+96B~aXUw}_kZ3$Cyn%*55CrR znb-SM5gK&eMvD1qicxYNFd$tVTJGVMDhab%stkbWxll*R+^(%Qtk0roEFq8KE=8$b ztDb(CA1m{uvKwRZIWv}vYQmJ-2D-rHke9Jhy?~$C1wXpDmC<0=UK(fX@!C$Y1u;l- zwNRpwm;b8cZ?0lws}YTl6=^$`!TuYY8)lXkdM%;Xs_sW8#}x-V!I+E1cIlIA#IVV6 zVa~qQSwW%h4rU9=Z%LJ#+ zHYfdX71c6MK+FkG(ie2=cNmm9ewCi*E6H+ntY4b+YOiE{lT>=JG2S#u0f^|Vlww(G zt0^oAHtifdEnTch`*@siWACvKtw}J*phJDyI;JrdcG7bW-mI<+2q|6MnW(b}d$edC zN>c2|6#1>LB5%|3nq#Q>f_9*+OwEymknSp{J!Fr%FQN}gt`83W-ho49tw`^BCc7JI$LX|2;%$yEK1%W46ybPNw}VY{W% zXXZ^mrYqM=mO?!?p^=^B1V_iszIe|W68_j|!c(udHThQ>QG7ZNr_GHAT+bnYXNhy7 z`}w21GEwVAZ$|?JA3g}WzBY)XQcv>&POiz$7|YX1=U(JsWSTd1}0wJ2X47Pa0nGV?J?eb@@)p zy*oMUyyd01SBWe74@i^JdvjoF`Lv!~;blWzy6Jx4`@JSV7C7tDxq!V7Gd9iv;`HpY z%^SgU*Z_z5&Z;$Zc+(LeiWGc<`rBF|2LS` zgacaXqRV!hPlknr__1ZCPDZP~F3B6lJ5hl>bw{pSRl`wUa!>fn^`X}L~Te-yD7 za`v{Bp;-!QWa#ob8X!Op_2$AEctZgnI23)wT+OOcFoM+Ddrl>z% z5Fla+>KHWu-P%Y;xuQ!=s?+T_=-orEy3_NN3o79{W8-yZ{*O5LEIv)fI`I6tO}q<# z?L28itr9Dq-P$U1_G(WV^igH?{7T$=>&b_#EWoRY@hYzgJfn1F2m_)KnV zyqBZRoXozNqboP6grWFl^3;U;?jlaRo>H1{V|@?e<68Tr{&d7d$a9YRY)@8geF6Fn zgbgjZmkEmv_3p#CE|y6KJV{x1&hc#ezrPSm4=T_L3k|_;oZ-8o09c zt};#I`s0|R4cgD-fROngBXDGPMBYtDGSP)kO40|KlH3l)`i`36=!HYUXp{d_{$!E%UtQzvWjfM zLceEF=~dX@;-hG*a9^4m^fWokESH^6{kpf3?oAadVvc^O`I-zjf+n(q9E+ni0%wyL zL{)KmyeZNa6#OqkVR&RBUO(10F*oknhnqRGZ4%L!NCW{h=P#b7f?~|?gw4=FzreHR{OGtM|&2+bEa;{*56J9dwzh-zg%;Q(mP-!nlUKJ1xB(!Rsy z3)kMtx41Z4>I*?(#GsZ)Kx6RL#o96dbZt{g?T(lr8Lb+>)!L^Juj=ZQOQ%oHoN(&o zyq;c;ub)sm&(l{#q8ypvYQ_PaS#j2r3>G^C%>Q;V%e8fjJ;*Pu;@&3s-u7CmAmxs# zjS2eic^1Ln7*3r>cu*X_RmOqD!wQN{LL zKb^6wc(LUV#3GPvl}l25I*@6 zJ1Z&ap2+qj@OYztEya7NOPIJ|ggR07)Zb~FgvmfcwU8WGGg;&BQ*@Lf2UPFS7@ix| z2vnw+mzMs)CI2NOrxPmMnl+|tpUq1WHN7uV2 zW})cs&Zs@W3rtS6d6-Ye_J!T!V*Cj}Ys_jQ8;cow%y1&}TANFanTfIBOgnU8Bw2s1 z0I@EY^^}-Mb(0hSC|E9HYIWoDmyDOfPH**H)K-VhC$o?GxXu_|)HX|+VJ?`KTRfQO z5q|WA_DEN6znKS-Tb)#c`RK*ZdYuRH98YR|eV!0}B*oXlN7;04xEdMalu_8KPzd_< zJEZCxA*BOXCr2SP@hY2~@Ebmafo_hVfVBK;ZFBu~!f^J6Vej;>{nlSNh>kO@N%&dy zX@Oa|>0i=%huoTyg);cm)qg4GC@Fu@5D#e=sGq|y$E0&br!Zt_J$I%53c2b*{PhrGQC&eHoVmc`Q&`xBAjCLO9MVfWwC*Qh zd#9je&ycUSn=~v7K@%sefDEz(_8sU*@QNM1PW|~-8u!bXk__IX^0GA8aMTP5qnO9A zsana=#Ytx14ak`1qX{Aqebo!NlqvRd9VSOD^~vKnEdYJXv(4 zFH9-LIz_ZmVx{uFDKtQuDi<1bB^|GlNfILQC_tz>Nx`by26B78dD-2mJ3J-p@fV^1 zq}@5I^xyQ`Rl*rdGV@!OmBobIJk!&oTJQ{6#j+_2@KHGsOH+O2?r&wl+ zIx5+@Krh1Df0&=ls%X|bV$#4QnFe_9C8xsfvM!xCaoVxZ7+KI*Kp^f=dw0dV;8K4UTZc;Xb#L9r>Yx)!u&xQ3xjPhloxk=iAzerlcpj zU@_&9J7F;MqtHCDTPz8JX`S^-G-`pA5o8})!^xJ_B1`*;v^tqsmULBR+lG30r_9^C zH=%?eyC8C2bLo)gLIUTP(hl0C6*<##{H@IjkeSQj84U>SM#X)=*8#h<@!b+O2w09u zC{Ch>E?Sl&uTB)xWv#ZM#gKERSoX{W)MXXJMm*PUb^<2Mj*|BSXFi^qAB(d?1DVsv z3JhqY^u&zHvDFBN=2H;p?~vlBBHgc5YeucXBZ1VN;l5`FiMq&NZDrgIXp^Tq`|Pue zUlJ5YeU^F$d$tZ!)L5rmTT<^9EN;Sy?D@@<+?F}z#uyWh{#?=T&b=X(hXi14-J{1wv(W_&wq!sn{=I3Ign*!3SBUgo(Egt0jR!)2pPf1@LZqO?_6Ow zm!CcS7a?P!h84Gvz40=0>E>oXZr`%6>g%LkicqEN#xbrpMLZyS9a!t@uvOPO#Muk^}BKWI9+M)ewLt#1gf2?JcjlodAN|S#Z@j;8je_Jy&@n}!n*?c3UfF*p_x+dkRBNFdNaPr zq}>YlH7i9HeGR%|+aZw*i)p^F`;y=sy5ffJqz`>9*A5O&^1y>22(13%pU;qzhB{VW zDOm_LJ+G-d6p`nB1SaiVR$^NLS$WPe@C#A#*o7_?L~| zoCSY0zmXC)>HS-d<**a5L%(ucR5&fC=Y(_8N##1K^8N`h30ttLQl`wLMLo!>Y*^5qC&mZxI-+v)(Wbak~REwnp?ipI}p;7#hTqM<$RNRPxj?;$P&CQ^5tVGzy0Xq;|7qJq_aj#>TlE%gu5g&ea_!KrL%DNC{5w6(u;%_aNs zH&~nO!$t(&_mVlG(o%JWYS*~F(Xv;V=>&bzkKMLezWts7I5g3pKCrq|%<5FBg1Sea zQhKlTZ#gF4Zv>ZYVfH$~L=*>?hId;t8688AGw!zrn$HP!Ez5;)?x?gncWHqiyRmrK zE5{i*nSE%h;(ggo#Y%yj^eHOlgthREyF35&`2-2C%Ff#rZ4f~;N*h91=rZSKfp#K{AxAU{ zz-6Dz;3KcosPXD>b~dwzPnV_Kjv%R-O_F7mX8 z!uwl(OzbvoQR;LI^(+!RpS$Mzar_hU$&;P^4xh$k9kJrEj~ZQSUA8_*(bcnnzd(CE z149kFEyGto8GqCkS2V@-m(qoV6RlKI4`^#oAL1tG`mH2C5MJ_Yx;%`3<9*X{=}`8m zd-dk5x9yiBngkn_ctS#9w=-yW=)n=;kVi*Bp#Veh8o5eBUdLt*@`shmH|A$CJaKouo)*o8n_*hU~Wge?-^9jD^2hU!D$tm88i16Q@qDeoTLhwRz8pf?&g!q8^IoKyJv2zZOg;ZdY&h?+|Kc3_T^wVLkKoY;tnhvq{2h z!zYsL8ReRgYaeSLcZmVLLkxXl@~5b_aWh;ywwH!HAFd*!Zl* zeEZ|^U&j%O!}u>_aQiftJj83q(+v+ZfAL;h!qnKMEYj_)(FARaJ!#y0OR8dK>V^bH z`@aEgA#0?~x9vS@ppT22rqJm%d|957@0c--!{J}mhl&g*SLl5qG6K)7kDG$-TQgL( zNPh^8F6)Pxb}i@>ub9UI4WgJ-sIf8l;+mTqt7nQiy18m15|&>*-)#{$bKCQ3@D-+` zOm~IW#zXp3G}uZKw%ESZFCS6xNQaUaXF*ahTYIbFJ@IY>i^5PxzX$}cF{-G-#kckz`yFSKHEe2GJG3fFz0F}+KB67E|7Pij* zBTPKUM}@7T-rglwSEd#GsExw{FcV`mu2;a1hp0oLG3B*w!_w^CZ09 zdHzYM;7143L=26SNAX15Wbf1Q&+qfF>WldLg)+=%P5_&K(^`S~wf3Ep`V2uUAS8xU z5u57W-uNzm`rtfSW^vt{Qz5GfH4qXryZc(faygawe7`>0L%7d?RF-KYH{>jK5R;2% za~P0sh|Dz<%yQ;$%Eb06I(80=xbfi6u!T_S>sQs#DL1aONi5aS(RF7WaUg?Mnuu<(8~^)Z zKkR6vQF}<{lzO0SZ!UCIWO1#15z^{?%bQu;E0lN}YpY|~THjK=+Ug-*HC^S}%upv| zJ%VEh3lmixgoXF4+FuOdmWfmbz&yki7Jmbl)sBKvJC}d&pFTObJ_wr2EY9+3&%aa0 zb}33^&4&oF&|fb7niG!I>DX~(7I%~jRTf$hL6!qjL$@*KvX`IHZuQ%i9}!{FtzkXV z&k`BBpX$o?lx{^+j5CzB<+run{|tDMT;ZZ@Zy#kLeh$=;-NH@ChKgSXN{DL-X}2&l z(lvT}I}oXdQpTwKka{`PlNZ+BR5GQnXRZiICM$Ma@{%m6`jC}4m?N~)z$@kVQMBd$ zaaiz{$bTgE-fQoEk~g!h<%D*z<$^#*a+63VQAz*bSy0_tZU1|N}m61SA!2#lOJOc+sKwj z%@uSZLxpnfemUZeMY%=jdfK>{$now|QUTAo>3iS#`!l;y57rKC{{_uZH@^FjeZ_Q! zw(09`*MJwUykUU# zWkjW#&#AOz1 zKJK`+MRy-3+H7J7L|s7Z>CXJ;E{m^a^6T2dba-;bJCLO*k#rb}ZR^l#P7eTKm{Z+Irbx2Y?`0P?#4i$SWZJ3M?ooBrFLQ@I{~1stfN$}VD;gD0DfTO!T Date: Sat, 17 Feb 2024 20:27:20 -0700 Subject: [PATCH 14/14] Add plantuml support to the documentation --- .gitignore | 2 ++ Dockerfile | 5 ++++- README.md | 5 +---- docs/Doxyfile.in | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 9ecf617..e433591 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ builddir/ subprojects/** !subprojects/*.wrap !subprojects/.clang-format + +.cache/ diff --git a/Dockerfile b/Dockerfile index ac6f343..73da839 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM gcc:13 # Install build tools -RUN apt-get update && apt-get install -y python3 python3-pip ninja-build clang-format clang-tidy gdb graphviz git curl zsh \ +RUN apt-get update && apt-get install -y python3 python3-pip ninja-build clang-format clang-tidy gdb openjdk-17-jdk-headless graphviz git curl zsh \ && rm -rf /var/lib/apt/lists/* RUN pip install --break-system-packages meson gcovr @@ -19,6 +19,9 @@ RUN wget -O mold.tar.gz https://github.com/rui314/mold/releases/download/v2.4.0/ ENV CC_LD=mold ENV CXX_LD=mold +# Install plantuml +RUN wget --progress=bar:force:noscroll https://github.com/plantuml/plantuml/releases/download/v1.2024.3/plantuml-mit-1.2024.3.jar -O /usr/local/bin/plantuml.jar + # Install node for actions RUN curl -fsSL https://deb.nodesource.com/setup_current.x | bash - && apt-get install -y nodejs diff --git a/README.md b/README.md index af835aa..f044700 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,7 @@ ${REPO_DESCRIPTION} ## Build Instructions -The provided Docker image includes all necessary dependencies to build and debug -C/C++ applications. While the main build system is Meson, a Justfile is provided -for convenience. With dependencies installed, or inside the Docker container, run -the following: +The provided Docker image includes all necessary dependencies to build and debug C/C++ applications. While the main build system is Meson, a Justfile is provided for convenience. With dependencies installed, or inside the Docker container, run the following: ``` Available recipes: diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in index a8d7bb7..eaf3528 100644 --- a/docs/Doxyfile.in +++ b/docs/Doxyfile.in @@ -2808,7 +2808,7 @@ DIAFILE_DIRS = # a preprocessing step. Doxygen will generate a warning when it encounters a # \startuml command in this case and will not generate output for the diagram. -PLANTUML_JAR_PATH = +PLANTUML_JAR_PATH = /usr/local/bin/plantuml.jar # When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a # configuration file for plantuml. -- 2.49.0