diff --git a/.github/workflows/ci_cpm.yml b/.github/workflows/ci_cpm.yml
new file mode 100644
index 00000000..bed471bc
--- /dev/null
+++ b/.github/workflows/ci_cpm.yml
@@ -0,0 +1,32 @@
+# SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin
+# SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
+# SPDX-License-Identifier: CC0-1.0
+
+name: Update CPM
+
+on:
+ schedule:
+ - cron: "0 12 * * SAT"
+ workflow_dispatch:
+
+env:
+ TZ: Europe/Berlin
+
+concurrency:
+ group: update-cpm-actions
+ cancel-in-progress: true
+
+jobs:
+ update_cpm:
+ name: Update CPM
+ runs-on: ubuntu-latest
+ timeout-minutes: 15
+ if: github.repository_owner == 'seqan' || github.event_name == 'workflow_dispatch'
+ steps:
+ - name: Run update CPM
+ uses: seqan/actions/update_cpm_package_lock@main
+ with:
+ token: ${{ secrets.SEQAN_ACTIONS_PAT }}
+ gpg_key: ${{ secrets.SEQAN_ACTIONS_GPG_KEY }}
+ gpg_passphrase: ${{ secrets.SEQAN_ACTIONS_GPG_PASSPHRASE }}
+ package_lock_file: cmake/package-lock.cmake
diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake
new file mode 100644
index 00000000..8f72e924
--- /dev/null
+++ b/cmake/CPM.cmake
@@ -0,0 +1,22 @@
+# SPDX-License-Identifier: MIT
+#
+# SPDX-FileCopyrightText: Copyright (c) 2019-2023 Lars Melchior and contributors
+
+set (CPM_DOWNLOAD_VERSION 0.40.2)
+set (CPM_HASH_SUM "c8cdc32c03816538ce22781ed72964dc864b2a34a310d3b7104812a5ca2d835d")
+
+if (CPM_SOURCE_CACHE)
+ set (CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
+elseif (DEFINED ENV{CPM_SOURCE_CACHE})
+ set (CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
+else ()
+ set (CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
+endif ()
+
+# Expand relative path. This is important if the provided path contains a tilde (~)
+get_filename_component (CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE)
+
+file (DOWNLOAD https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
+ ${CPM_DOWNLOAD_LOCATION} EXPECTED_HASH SHA256=${CPM_HASH_SUM})
+
+include (${CPM_DOWNLOAD_LOCATION})
diff --git a/cmake/cpack_install.cmake.in b/cmake/cpack_install.cmake.in
new file mode 100644
index 00000000..c844b0af
--- /dev/null
+++ b/cmake/cpack_install.cmake.in
@@ -0,0 +1,13 @@
+# SPDX-FileCopyrightText: 2006-2024, Knut Reinert & Freie Universität Berlin
+# SPDX-FileCopyrightText: 2016-2024, Knut Reinert & MPI für molekulare Genetik
+# SPDX-License-Identifier: BSD-3-Clause
+
+# Only if creating the source package (`make package_source`):
+# Copy dependency include directories into package's staging folder
+if (CPACK_SOURCE_INSTALLED_DIRECTORIES)
+ configure_file ("@CPM_DOWNLOAD_LOCATION@" "${CMAKE_CURRENT_BINARY_DIR}/cmake/CPM.cmake" COPYONLY)
+ if ("@use_ccache_ADDED@" STREQUAL "YES")
+ configure_file ("@use_ccache_SOURCE_DIR@/ccache/CMakeLists.txt"
+ "${CMAKE_CURRENT_BINARY_DIR}/test/cmake/sharg_require_ccache.cmake" COPYONLY)
+ endif ()
+endif ()
diff --git a/cmake/package-lock.cmake b/cmake/package-lock.cmake
new file mode 100644
index 00000000..af7d6496
--- /dev/null
+++ b/cmake/package-lock.cmake
@@ -0,0 +1,48 @@
+# SPDX-FileCopyrightText: 2006-2024, Knut Reinert & Freie Universität Berlin
+# SPDX-FileCopyrightText: 2016-2024, Knut Reinert & MPI für molekulare Genetik
+# SPDX-License-Identifier: CC0-1.0
+
+# CPM Package Lock
+# This file should be committed to version control
+
+# URL/GIT_TAG may be annotated with a branch name
+# This is needed for https://github.com/seqan/actions/tree/main/update_cpm_package_lock
+
+# The first argument of CPMDeclarePackage can be freely chosen and is used as argument in CPMGetPackage.
+# The NAME argument should be package name that would also be used in a find_package call.
+# Ideally, both are the same, which might not always be possible: https://github.com/cpm-cmake/CPM.cmake/issues/603
+# This is needed to support CPM_USE_LOCAL_PACKAGES
+
+# TDL
+set (SHARG_TDL_VERSION 1.0.1)
+CPMDeclarePackage (tdl
+ NAME tdl
+ VERSION ${SHARG_TDL_VERSION}
+ GITHUB_REPOSITORY deNBI-cibi/tool_description_lib
+ SYSTEM TRUE
+ OPTIONS "INSTALL_TDL OFF" "CMAKE_MESSAGE_LOG_LEVEL WARNING")
+# googletest
+set (SHARG_GOOGLETEST_VERSION 1.15.2)
+CPMDeclarePackage (googletest
+ NAME GTest
+ VERSION ${SHARG_GOOGLETEST_VERSION}
+ GITHUB_REPOSITORY google/googletest
+ SYSTEM TRUE
+ OPTIONS "BUILD_GMOCK OFF" "INSTALL_GTEST OFF" "CMAKE_MESSAGE_LOG_LEVEL WARNING")
+# doxygen-awesome
+set (SHARG_DOXYGEN_AWESOME_VERSION 2.3.4)
+CPMDeclarePackage (doxygen_awesome
+ NAME doxygen_awesome
+ VERSION ${SHARG_DOXYGEN_AWESOME_VERSION}
+ GITHUB_REPOSITORY jothepro/doxygen-awesome-css
+ DOWNLOAD_ONLY TRUE
+ QUIET YES)
+# use_ccache
+set (SHARG_USE_CCACHE_VERSION d2a54ef555b6fc2d496a4c9506dbeb7cf899ce37)
+CPMDeclarePackage (use_ccache
+ NAME use_ccache
+ GIT_TAG ${SHARG_USE_CCACHE_VERSION} # main
+ GITHUB_REPOSITORY seqan/cmake-scripts
+ SOURCE_SUBDIR ccache
+ SYSTEM TRUE
+ EXCLUDE_FROM_ALL TRUE)
diff --git a/cmake/sharg-config.cmake b/cmake/sharg-config.cmake
index 55c999b8..3bde33c2 100644
--- a/cmake/sharg-config.cmake
+++ b/cmake/sharg-config.cmake
@@ -108,31 +108,35 @@ macro (sharg_config_error text)
endif ()
endmacro ()
+# ----------------------------------------------------------------------------
+# CPM
+# ----------------------------------------------------------------------------
+
+# This will be true for git clones and source packages, but not for installed packages.
+if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/CPM.cmake")
+ set (SHARG_HAS_CPM TRUE)
+else ()
+ set (SHARG_HAS_CPM FALSE)
+endif ()
+
+if (SHARG_HAS_CPM)
+ set (CPM_INDENT " CMake Package Manager CPM: ")
+ include ("${CMAKE_CURRENT_LIST_DIR}/CPM.cmake")
+ CPMUsePackageLock ("${CMAKE_CURRENT_LIST_DIR}/package-lock.cmake")
+endif ()
+
# ----------------------------------------------------------------------------
# Find SHARG include path
# ----------------------------------------------------------------------------
# Note that sharg-config.cmake can be standalone and thus SHARG_CLONE_DIR might be empty.
-# * `SHARG_CLONE_DIR` was already found in sharg-config-version.cmake
# * `SHARG_INCLUDE_DIR` was already found in sharg-config-version.cmake
-find_path (SHARG_SUBMODULES_DIR
- NAMES submodules/tool_description_lib
- HINTS "${SHARG_CLONE_DIR}" "${SHARG_INCLUDE_DIR}/sharg")
-
if (SHARG_INCLUDE_DIR)
sharg_config_print ("SHARG include dir found: ${SHARG_INCLUDE_DIR}")
else ()
sharg_config_error ("SHARG include directory could not be found (SHARG_INCLUDE_DIR: '${SHARG_INCLUDE_DIR}')")
endif ()
-# ----------------------------------------------------------------------------
-# Detect if we are a clone of repository and if yes auto-add submodules
-# ----------------------------------------------------------------------------
-
-if (SHARG_CLONE_DIR)
- sharg_config_print ("Detected as running from a repository checkout…")
-endif ()
-
# ----------------------------------------------------------------------------
# Options for CheckCXXSourceCompiles
# ----------------------------------------------------------------------------
@@ -206,22 +210,13 @@ endif ()
set (SHARG_USE_TDL FALSE)
if (NOT SHARG_NO_TDL)
- find_package (TDL QUIET HINTS ${SHARG_HINT_TDL})
-
- if (NOT TDL_FOUND)
- if (EXISTS ${SHARG_SUBMODULES_DIR}/submodules/tool_description_lib)
- include (FetchContent)
- FetchContent_Declare (tdl SOURCE_DIR ${SHARG_SUBMODULES_DIR}/submodules/tool_description_lib)
- set (SHARG_LOG_LEVEL ${CMAKE_MESSAGE_LOG_LEVEL})
- set (CMAKE_MESSAGE_LOG_LEVEL "ERROR")
- option (INSTALL_TDL "Enable installation of TDL." ${INSTALL_SHARG})
- FetchContent_MakeAvailable (tdl)
- set (CMAKE_MESSAGE_LOG_LEVEL ${SHARG_LOG_LEVEL})
- set (TDL_FOUND TRUE)
- endif ()
+ if (NOT SHARG_HAS_CPM)
+ find_package (tdl QUIET)
+ else ()
+ CPMGetPackage (tdl)
endif ()
- if (TDL_FOUND)
+ if (TDL_FOUND OR tdl_ADDED)
sharg_config_print ("Optional dependency: TDL found.")
set (SHARG_USE_TDL TRUE)
list (APPEND SHARG_LIBRARIES tdl::tdl)
@@ -323,12 +318,6 @@ if (SHARG_FOUND AND NOT TARGET sharg::sharg)
target_link_libraries (sharg_sharg INTERFACE ${SHARG_LIBRARIES})
target_include_directories (sharg_sharg INTERFACE "${SHARG_INCLUDE_DIR}")
add_library (sharg::sharg ALIAS sharg_sharg)
-
- if (SHARG_USE_TDL)
- # Include TDL as system header to suppress warnings.
- get_target_property (tdl_include_dir tdl::tdl INTERFACE_INCLUDE_DIRECTORIES)
- target_include_directories (sharg_sharg SYSTEM INTERFACE ${tdl_include_dir})
- endif ()
endif ()
set (CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE})
diff --git a/cmake/sharg-package.cmake b/cmake/sharg-package.cmake
index 6281ad5f..0d0a2e27 100644
--- a/cmake/sharg-package.cmake
+++ b/cmake/sharg-package.cmake
@@ -13,12 +13,30 @@ set (CPACK_PACKAGE_VENDOR "seqan")
# A description of the project, used in places such as the introduction screen of CPack-generated Windows installers.
# set (CPACK_PACKAGE_DESCRIPTION_FILE "") # TODO
set (CPACK_PACKAGE_CHECKSUM "SHA256")
-set (CPACK_PACKAGE_ICON "${SHARG_CLONE_DIR}/test/documentation/sharg_logo.png")
+set (CPACK_PACKAGE_ICON "${SHARG_CLONE_DIR}/test/documentation/sharg_logo.svg")
set (CPACK_RESOURCE_FILE_LICENSE "${SHARG_CLONE_DIR}/LICENSE.md")
set (CPACK_RESOURCE_FILE_README "${SHARG_CLONE_DIR}/README.md")
+# Already being called on source package, i.e. CPM is already downloaded.
+if (NOT CPM_DOWNLOAD_LOCATION)
+ set (CPM_DOWNLOAD_LOCATION "${SHARG_CLONE_DIR}/cmake/CPM.cmake")
+else ()
+ CPMGetPackage (use_ccache)
+endif ()
+
+configure_file ("${SHARG_CLONE_DIR}/cmake/cpack_install.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cpack_install.cmake"
+ @ONLY)
+set (CPACK_INSTALL_SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/cpack_install.cmake")
+
# Source Package
set (CPACK_SOURCE_GENERATOR "TXZ")
-set (CPACK_SOURCE_IGNORE_FILES "\\\\.git($|/)")
+# Next 2 lines would overwrite copy in cpack_install.cmake
+list (APPEND CPACK_SOURCE_IGNORE_FILES "/cmake/CPM.cmake")
+list (APPEND CPACK_SOURCE_IGNORE_FILES "/test/cmake/sharg_require_ccache.cmake")
+list (APPEND CPACK_SOURCE_IGNORE_FILES "/\.git($|/)")
+list (APPEND CPACK_SOURCE_IGNORE_FILES "/\.github/")
+list (APPEND CPACK_SOURCE_IGNORE_FILES "/\.vscode/")
+list (APPEND CPACK_SOURCE_IGNORE_FILES "/build/")
+list (APPEND CPACK_SOURCE_IGNORE_FILES "/submodules/")
include (CPack)
diff --git a/test/cmake/sharg_require_ccache.cmake b/test/cmake/sharg_require_ccache.cmake
index 234c038d..8f7df934 100644
--- a/test/cmake/sharg_require_ccache.cmake
+++ b/test/cmake/sharg_require_ccache.cmake
@@ -1,25 +1,7 @@
-# SPDX-FileCopyrightText: 2006-2024, Knut Reinert & Freie Universität Berlin
-# SPDX-FileCopyrightText: 2016-2024, Knut Reinert & MPI für molekulare Genetik
+# SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin
+# SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
# SPDX-License-Identifier: BSD-3-Clause
-cmake_minimum_required (VERSION 3.15)
-
-# Uses `ccache` to cache build results.
-#
-# See also
-# * https://ccache.dev/
-# * https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_LAUNCHER.html
-macro (sharg_require_ccache)
- find_program (CCACHE_PROGRAM ccache)
- find_package_message (CCACHE_PROGRAM_PRE "Finding program ccache" "[${CCACHE_PROGRAM}]")
-
- if (NOT CCACHE_PROGRAM)
- find_package_message (CCACHE_PROGRAM "Finding program ccache - Failed" "[${CCACHE_PROGRAM}]")
- else ()
- find_package_message (CCACHE_PROGRAM "Finding program ccache - Success" "[${CCACHE_PROGRAM}]")
- list (PREPEND CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
- # use ccache in external cmake projects
- list (APPEND SHARG_EXTERNAL_PROJECT_CMAKE_ARGS "-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}")
- endif ()
- unset (CCACHE_PROGRAM)
-endmacro ()
+# This file's only purpose is to be replaced with the content of the use_ccache CMakeLists.txt file
+# when creating the source package.
+CPMGetPackage (use_ccache)
diff --git a/test/cmake/sharg_require_test.cmake b/test/cmake/sharg_require_test.cmake
deleted file mode 100644
index 2b0463fd..00000000
--- a/test/cmake/sharg_require_test.cmake
+++ /dev/null
@@ -1,36 +0,0 @@
-# SPDX-FileCopyrightText: 2006-2024, Knut Reinert & Freie Universität Berlin
-# SPDX-FileCopyrightText: 2016-2024, Knut Reinert & MPI für molekulare Genetik
-# SPDX-License-Identifier: BSD-3-Clause
-
-cmake_minimum_required (VERSION 3.16)
-
-# Exposes the google-test targets `gtest` and `gtest_main`.
-# CMake 3.24: https://cmake.org/cmake/help/latest/module/FetchContent.html#variable:FETCHCONTENT_TRY_FIND_PACKAGE_MODE
-macro (sharg_require_test)
- enable_testing ()
-
- set (gtest_version "1.15.2")
- set (gtest_git_tag "v${gtest_version}")
-
- find_package (GTest ${gtest_version} EXACT QUIET)
-
- if (NOT GTest_FOUND)
- message (STATUS "Fetching Google Test ${gtest_version}")
-
- include (FetchContent)
- FetchContent_Declare (
- gtest_fetch_content
- GIT_REPOSITORY "https://github.com/google/googletest.git"
- GIT_TAG "${gtest_git_tag}")
- option (BUILD_GMOCK "" OFF)
- option (INSTALL_GTEST "" OFF)
- FetchContent_MakeAvailable (gtest_fetch_content)
- else ()
- message (STATUS "Found Google Test ${gtest_version}")
- endif ()
-
- if (NOT TARGET gtest_build)
- add_custom_target (gtest_build DEPENDS gtest_main gtest)
- endif ()
-
-endmacro ()
diff --git a/test/documentation/CMakeLists.txt b/test/documentation/CMakeLists.txt
index e7aaf7ce..b696e9fc 100644
--- a/test/documentation/CMakeLists.txt
+++ b/test/documentation/CMakeLists.txt
@@ -9,6 +9,23 @@ cmake_minimum_required (VERSION 3.7)
include (../../cmake/sharg-config-version.cmake)
set (SHARG_VERSION "${PACKAGE_VERSION}")
+# ----------------------------------------------------------------------------
+# CPM
+# ----------------------------------------------------------------------------
+
+# This will be true for git clones and source packages.
+if (EXISTS "${SHARG_INCLUDE_DIR}/../cmake/CPM.cmake")
+ set (SHARG_HAS_CPM TRUE)
+else ()
+ set (SHARG_HAS_CPM FALSE)
+endif ()
+
+if (SHARG_HAS_CPM)
+ set (CPM_INDENT " CMake Package Manager CPM: ")
+ include ("${SHARG_INCLUDE_DIR}/../cmake/CPM.cmake")
+ CPMUsePackageLock ("${SHARG_INCLUDE_DIR}/../cmake/package-lock.cmake")
+endif ()
+
project (sharg
LANGUAGES NONE
VERSION "${SHARG_PROJECT_VERSION}")
@@ -18,6 +35,13 @@ if (NOT EXISTS "${SHARG_INCLUDE_DIR}/sharg/version.hpp")
endif ()
message (STATUS "Found: ${SHARG_INCLUDE_DIR} (${SHARG_VERSION})")
+if (SHARG_HAS_CPM)
+ CPMGetPackage (doxygen_awesome)
+else ()
+ message (FATAL_ERROR "Could not find doxygen-awesome. Not building documentation.")
+endif ()
+message (STATUS "Found: ${doxygen_awesome_SOURCE_DIR}")
+
set (SHARG_DOXYGEN_INPUT_DIR "${CMAKE_SOURCE_DIR}")
include (sharg-doxygen.cmake)
diff --git a/test/documentation/doxygen-awesome/doxygen-awesome-darkmode-toggle.js b/test/documentation/doxygen-awesome/doxygen-awesome-darkmode-toggle.js
deleted file mode 100644
index 2f5568a3..00000000
--- a/test/documentation/doxygen-awesome/doxygen-awesome-darkmode-toggle.js
+++ /dev/null
@@ -1,160 +0,0 @@
-/* SPDX-FileCopyrightText: 2021 - 2023 jothepro
- SPDX-License-Identifier: MIT
-*/
-/**
-
-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/test/documentation/doxygen-awesome/doxygen-awesome-fragment-copy-button.js b/test/documentation/doxygen-awesome/doxygen-awesome-fragment-copy-button.js
deleted file mode 100644
index 08da4880..00000000
--- a/test/documentation/doxygen-awesome/doxygen-awesome-fragment-copy-button.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/* SPDX-FileCopyrightText: 2021 - 2023 jothepro
- SPDX-License-Identifier: MIT
-*/
-/**
-
-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/test/documentation/doxygen-awesome/doxygen-awesome-interactive-toc.js b/test/documentation/doxygen-awesome/doxygen-awesome-interactive-toc.js
deleted file mode 100644
index 4df76913..00000000
--- a/test/documentation/doxygen-awesome/doxygen-awesome-interactive-toc.js
+++ /dev/null
@@ -1,84 +0,0 @@
-/* SPDX-FileCopyrightText: 2021 - 2023 jothepro
- SPDX-License-Identifier: MIT
-*/
-/**
-
-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")
- }
-}
diff --git a/test/documentation/doxygen-awesome/doxygen-awesome-paragraph-link.js b/test/documentation/doxygen-awesome/doxygen-awesome-paragraph-link.js
deleted file mode 100644
index f5588cdb..00000000
--- a/test/documentation/doxygen-awesome/doxygen-awesome-paragraph-link.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/* SPDX-FileCopyrightText: 2021 - 2023 jothepro
- SPDX-License-Identifier: MIT
-*/
-/**
-
-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/test/documentation/doxygen-awesome/doxygen-awesome-tabs.js b/test/documentation/doxygen-awesome/doxygen-awesome-tabs.js
deleted file mode 100644
index d8726ebb..00000000
--- a/test/documentation/doxygen-awesome/doxygen-awesome-tabs.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/* SPDX-FileCopyrightText: 2021 - 2023 jothepro
- SPDX-License-Identifier: MIT
-*/
-/**
-
-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) {
-
- }
-}
diff --git a/test/documentation/doxygen-awesome/doxygen-awesome.css b/test/documentation/doxygen-awesome/doxygen-awesome.css
deleted file mode 100644
index 675df996..00000000
--- a/test/documentation/doxygen-awesome/doxygen-awesome.css
+++ /dev/null
@@ -1,2672 +0,0 @@
-/* SPDX-FileCopyrightText: 2021 - 2023 jothepro
- SPDX-License-Identifier: MIT
-*/
-/**
-
-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/test/documentation/sharg-doxygen.cmake b/test/documentation/sharg-doxygen.cmake
index 280dc20b..58cf007c 100644
--- a/test/documentation/sharg-doxygen.cmake
+++ b/test/documentation/sharg-doxygen.cmake
@@ -37,8 +37,8 @@ set (SHARG_DOXYGEN_STD_TAGFILE "${PROJECT_BINARY_DIR}/cppreference-doxygen-web.t
include (ExternalProject)
ExternalProject_Add (
download-cppreference-doxygen-web-tag
- URL "https://github.com/PeterFeicht/cppreference-doc/releases/download/v20220730/html-book-20220730.tar.xz"
- URL_HASH SHA256=71f15003c168b8dc5a00cbaf19b6480a9b3e87ab7e462aa39edb63d7511c028b
+ URL "https://github.com/PeterFeicht/cppreference-doc/releases/download/v20241110/html-book-20241110.tar.xz"
+ URL_HASH SHA256=431e80862eb70fd4793a60d7d3b6c13c8605284978f9ea0529572e8fd1562cc6
TLS_VERIFY ON
DOWNLOAD_DIR "${PROJECT_BINARY_DIR}"
DOWNLOAD_NAME "html-book.tar.xz"
diff --git a/test/documentation/sharg_doxygen_cfg.in b/test/documentation/sharg_doxygen_cfg.in
index 9f21d1f9..513c867e 100644
--- a/test/documentation/sharg_doxygen_cfg.in
+++ b/test/documentation/sharg_doxygen_cfg.in
@@ -200,14 +200,14 @@ HTML_FILE_EXTENSION = .html
HTML_HEADER = ${SHARG_DOXYGEN_SOURCE_DIR}/test/documentation/sharg_header.html
HTML_FOOTER = ${SHARG_DOXYGEN_OUTPUT_DIR}/sharg_footer.html
HTML_STYLESHEET =
-HTML_EXTRA_STYLESHEET = ${SHARG_DOXYGEN_SOURCE_DIR}/test/documentation/doxygen-awesome/doxygen-awesome.css \
+HTML_EXTRA_STYLESHEET = ${doxygen_awesome_SOURCE_DIR}/doxygen-awesome.css \
${SHARG_DOXYGEN_SOURCE_DIR}/test/documentation/sharg.css
### Extra files that we can link to
-HTML_EXTRA_FILES = ${SHARG_DOXYGEN_SOURCE_DIR}/test/documentation/doxygen-awesome/doxygen-awesome-darkmode-toggle.js \
- ${SHARG_DOXYGEN_SOURCE_DIR}/test/documentation/doxygen-awesome/doxygen-awesome-fragment-copy-button.js \
- ${SHARG_DOXYGEN_SOURCE_DIR}/test/documentation/doxygen-awesome/doxygen-awesome-paragraph-link.js \
- ${SHARG_DOXYGEN_SOURCE_DIR}/test/documentation/doxygen-awesome/doxygen-awesome-interactive-toc.js \
- ${SHARG_DOXYGEN_SOURCE_DIR}/test/documentation/doxygen-awesome/doxygen-awesome-tabs.js \
+HTML_EXTRA_FILES = ${doxygen_awesome_SOURCE_DIR}/doxygen-awesome-darkmode-toggle.js \
+ ${doxygen_awesome_SOURCE_DIR}/doxygen-awesome-fragment-copy-button.js \
+ ${doxygen_awesome_SOURCE_DIR}/doxygen-awesome-paragraph-link.js \
+ ${doxygen_awesome_SOURCE_DIR}/doxygen-awesome-interactive-toc.js \
+ ${doxygen_awesome_SOURCE_DIR}/doxygen-awesome-tabs.js \
${SHARG_DOXYGEN_SOURCE_DIR}/test/documentation/version.js \
${SHARG_DOXYGEN_SOURCE_DIR}/test/documentation/version.php \
${SHARG_DOXYGEN_SOURCE_DIR}/test/documentation/api-stability.js
diff --git a/test/header/CMakeLists.txt b/test/header/CMakeLists.txt
index ef55d5b6..d37b960f 100644
--- a/test/header/CMakeLists.txt
+++ b/test/header/CMakeLists.txt
@@ -7,6 +7,8 @@ project (sharg_header_test CXX)
include (../sharg-test.cmake)
+CPMGetPackage (googletest)
+
macro (sharg_header_test component header_base_path exclude_regex)
set (target "${component}_header_test")
@@ -63,7 +65,4 @@ macro (sharg_header_test component header_base_path exclude_regex)
unset (header_target)
endmacro ()
-sharg_require_ccache ()
-sharg_require_test ()
-
sharg_header_test (sharg "${SHARG_INCLUDE_DIR}" "")
diff --git a/test/sharg-test.cmake b/test/sharg-test.cmake
index 47cd3006..fb8b38c0 100644
--- a/test/sharg-test.cmake
+++ b/test/sharg-test.cmake
@@ -11,6 +11,11 @@ cmake_minimum_required (VERSION 3.10)
# require Sharg package
find_package (Sharg REQUIRED HINTS ${CMAKE_CURRENT_LIST_DIR}/../cmake)
+enable_testing ()
+
+set (CPM_INDENT "CMake Package Manager CPM: ")
+CPMUsePackageLock ("${CMAKE_CURRENT_LIST_DIR}/../cmake/package-lock.cmake")
+
include (CheckCXXSourceCompiles)
include (FindPackageHandleStandardArgs)
include (FindPackageMessage)
@@ -105,5 +110,4 @@ list (APPEND SHARG_EXTERNAL_PROJECT_CMAKE_ARGS "-DCMAKE_VERBOSE_MAKEFILE=${CMAKE
include (sharg_test_component)
include (sharg_test_files)
include (sharg_require_ccache)
-include (sharg_require_test)
include (add_subdirectories)
diff --git a/test/snippet/CMakeLists.txt b/test/snippet/CMakeLists.txt
index af71509c..48a59c55 100644
--- a/test/snippet/CMakeLists.txt
+++ b/test/snippet/CMakeLists.txt
@@ -8,6 +8,8 @@ project (sharg_test_snippet CXX)
include (../sharg-test.cmake)
include (../cmake/diagnostics/list_unused_snippets.cmake)
+CPMGetPackage (googletest)
+
add_library (snippet_main snippet_main.cpp)
target_link_libraries (snippet_main PUBLIC sharg::test gtest)
@@ -54,9 +56,6 @@ macro (sharg_snippets test_name_prefix snippet_base_path_)
endforeach ()
endmacro ()
-sharg_require_ccache ()
-sharg_require_test ()
-
sharg_snippets ("snippet" "${CMAKE_CURRENT_SOURCE_DIR}")
sharg_snippets ("doc/snippet" "${CMAKE_CURRENT_SOURCE_DIR}/../../doc")
diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt
index 7b8ad885..498bb251 100644
--- a/test/unit/CMakeLists.txt
+++ b/test/unit/CMakeLists.txt
@@ -8,6 +8,9 @@ project (sharg_test_unit CXX)
include (../sharg-test.cmake)
include (GoogleTest OPTIONAL)
+CPMGetPackage (googletest)
+
+
include (diagnostics/list_missing_unit_tests)
include (diagnostics/list_unused_unit_tests)
include (include_dependencies/add_include_dependencies)
@@ -43,9 +46,6 @@ macro (sharg_test unit_test_cpp)
unset (test_name)
endmacro ()
-sharg_require_ccache ()
-sharg_require_test ()
-
add_subdirectories ()
list_missing_unit_tests ()