From 2f802c1a6e3e7481c22c02435eb94fd828d3ec98 Mon Sep 17 00:00:00 2001 From: Matt Pewsey <23442063+mpewsey@users.noreply.github.com> Date: Tue, 11 Jun 2024 16:35:48 -0400 Subject: [PATCH] Update doxygen-awesome-css --- .../.github/workflows/publish.yaml | 11 +- Docs/doxygen-awesome-css/.gitignore | 5 +- Docs/doxygen-awesome-css/.npmignore | 3 + Docs/doxygen-awesome-css/Doxyfile | 484 ++++++---- Docs/doxygen-awesome-css/LICENSE | 2 +- Docs/doxygen-awesome-css/Makefile | 39 + Docs/doxygen-awesome-css/README.md | 165 +++- .../doxygen-awesome-css/docs/customization.md | 87 +- Docs/doxygen-awesome-css/docs/extensions.md | 235 ++++- .../docs/img/fragment_copy_button.png | Bin 45560 -> 32871 bytes .../docs/img/interactive_toc_mobile.png | Bin 0 -> 16425 bytes Docs/doxygen-awesome-css/docs/tricks.md | 94 +- .../doxygen-awesome-darkmode-toggle.js | 2 +- .../doxygen-awesome-fragment-copy-button.js | 2 +- .../doxygen-awesome-interactive-toc.js | 81 ++ .../doxygen-awesome-paragraph-link.js | 2 +- ...n-awesome-sidebar-only-darkmode-toggle.css | 2 +- .../doxygen-awesome-sidebar-only.css | 5 +- .../doxygen-awesome-tabs.js | 90 ++ Docs/doxygen-awesome-css/doxygen-awesome.css | 856 +++++++++++++++--- .../doxygen-custom/custom.css | 57 +- .../doxygen-custom/header.html | 6 +- Docs/doxygen-awesome-css/img/testimage.png | Bin 0 -> 4792 bytes .../img/theme-variants-base.drawio.svg | 117 +++ .../theme-variants-sidebar-only.drawio.svg | 102 +++ .../img/theme-variants.drawio.svg | 240 ----- .../include/MyLibrary/example.hpp | 71 +- .../include/MyLibrary/subclass-example.hpp | 16 +- Docs/doxygen-awesome-css/package.json | 34 + 29 files changed, 2036 insertions(+), 772 deletions(-) create mode 100644 Docs/doxygen-awesome-css/.npmignore create mode 100644 Docs/doxygen-awesome-css/Makefile create mode 100644 Docs/doxygen-awesome-css/docs/img/interactive_toc_mobile.png create mode 100644 Docs/doxygen-awesome-css/doxygen-awesome-interactive-toc.js create mode 100644 Docs/doxygen-awesome-css/doxygen-awesome-tabs.js create mode 100644 Docs/doxygen-awesome-css/img/testimage.png create mode 100644 Docs/doxygen-awesome-css/img/theme-variants-base.drawio.svg create mode 100644 Docs/doxygen-awesome-css/img/theme-variants-sidebar-only.drawio.svg delete mode 100644 Docs/doxygen-awesome-css/img/theme-variants.drawio.svg create mode 100644 Docs/doxygen-awesome-css/package.json diff --git a/Docs/doxygen-awesome-css/.github/workflows/publish.yaml b/Docs/doxygen-awesome-css/.github/workflows/publish.yaml index d415af3c..331822fd 100644 --- a/Docs/doxygen-awesome-css/.github/workflows/publish.yaml +++ b/Docs/doxygen-awesome-css/.github/workflows/publish.yaml @@ -10,19 +10,12 @@ jobs: uses: actions/checkout@v2 with: fetch-depth: 0 - - name: install Doxygen 1.9.2 - run: | - sudo apt-get update - sudo apt-get install -y graphviz libclang-cpp1-9 libclang1-9 - wget https://www.doxygen.nl/files/doxygen-1.9.2.linux.bin.tar.gz - tar -xvzf doxygen-1.9.2.linux.bin.tar.gz - ln -s doxygen-1.9.2/bin/doxygen doxygen - name: set version run: echo "PROJECT_NUMBER = `git describe --tags`" >> Doxyfile - name: Generate Documentation - run: ./doxygen Doxyfile + uses: mattnotmitt/doxygen-action@edge - name: Publish generated content to GitHub Pages - uses: tsunematsu21/actions-publish-gh-pages@v1.0.1 + uses: tsunematsu21/actions-publish-gh-pages@v1.0.2 with: dir: docs/html branch: gh-pages diff --git a/Docs/doxygen-awesome-css/.gitignore b/Docs/doxygen-awesome-css/.gitignore index 5c40af76..60db5bc3 100644 --- a/Docs/doxygen-awesome-css/.gitignore +++ b/Docs/doxygen-awesome-css/.gitignore @@ -1,3 +1,6 @@ docs/html .DS_Store -.idea \ No newline at end of file +.idea + +node_modules +*.tgz diff --git a/Docs/doxygen-awesome-css/.npmignore b/Docs/doxygen-awesome-css/.npmignore new file mode 100644 index 00000000..90eb4cae --- /dev/null +++ b/Docs/doxygen-awesome-css/.npmignore @@ -0,0 +1,3 @@ +* +!doxygen-awesome* + diff --git a/Docs/doxygen-awesome-css/Doxyfile b/Docs/doxygen-awesome-css/Doxyfile index be89cd50..860e32f6 100644 --- a/Docs/doxygen-awesome-css/Doxyfile +++ b/Docs/doxygen-awesome-css/Doxyfile @@ -1,4 +1,4 @@ -# Doxyfile 1.9.1 +# Doxyfile 1.9.6 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -12,6 +12,16 @@ # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options @@ -60,16 +70,28 @@ PROJECT_LOGO = ./logo.drawio.svg OUTPUT_DIRECTORY = docs -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes -# performance problems for the file system. +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. # The default value is: NO. CREATE_SUBDIRS = NO +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode @@ -81,26 +103,18 @@ ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English -# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all generated output in the proper direction. -# Possible values are: None, LTR, RTL and Context. -# The default value is: None. - -OUTPUT_TEXT_DIRECTION = None - # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. @@ -258,16 +272,16 @@ TAB_SIZE = 4 # the documentation. An alias has the form: # name=value # For example adding -# "sideeffect=@par Side Effects:\n" +# "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines (in the resulting output). You can put ^^ in the value part of an -# alias to insert a newline as if a physical newline was in the original file. -# When you need a literal { or } or , in the value part of an alias you have to -# escape them by means of a backslash (\), this can lead to conflicts with the -# commands \{ and \} for these it is advised to use the version @{ and @} or use -# a double escape (\\{ and \\}) +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) ALIASES = @@ -312,8 +326,8 @@ OPTIMIZE_OUTPUT_SLICE = NO # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, -# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, -# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the # default for Fortran type files). For instance to make doxygen treat .inc files @@ -460,13 +474,13 @@ TYPEDEF_HIDES_STRUCT = NO LOOKUP_CACHE_SIZE = 0 -# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use # during processing. When set to 0 doxygen will based this on the number of # cores available in the system. You can set it explicitly to a value larger # than 0 to get more control over the balance between CPU load and processing # speed. At this moment only the input processing can be done using multiple # threads. Since this is still an experimental feature the default is set to 1, -# which efficively disables parallel processing. Please report any issues you +# which effectively disables parallel processing. Please report any issues you # encounter. Generating dot graphs in parallel is controlled by the # DOT_NUM_THREADS setting. # Minimum value: 0, maximum value: 32, default value: 1. @@ -554,7 +568,8 @@ HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO @@ -585,14 +600,15 @@ INTERNAL_DOCS = NO # filesystem is case sensitive (i.e. it supports files in the same directory # whose names only differ in casing), the option must be set to YES to properly # deal with such files in case they appear in the input. For filesystems that -# are not case sensitive the option should be be set to NO to properly deal with +# are not case sensitive the option should be set to NO to properly deal with # output files written for symbols that only differ in casing, such as for two # classes, one named CLASS and the other named Class, and to also support # references to files without having to specify the exact matching casing. On # Windows (including Cygwin) and MacOS, users should typically set this option # to NO, whereas on Linux or other Unix flavors it should typically be set to # YES. -# The default value is: system dependent. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. CASE_SENSE_NAMES = NO @@ -610,6 +626,12 @@ HIDE_SCOPE_NAMES = NO HIDE_COMPOUND_REFERENCE= NO +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -767,7 +789,8 @@ FILE_VERSION_FILTER = # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE @@ -813,22 +836,38 @@ WARNINGS = YES WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. If -# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = NO +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS # then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but @@ -844,13 +883,27 @@ WARN_AS_ERROR = NO # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard -# error (stderr). +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). WARN_LOGFILE = @@ -869,17 +922,27 @@ INPUT = include \ docs/extensions.md \ docs/customization.md \ docs/tricks.md - # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: # https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. @@ -893,10 +956,10 @@ INPUT_ENCODING = UTF-8 # # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), -# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl, -# *.ucf, *.qsf and *.ice. +# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, +# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C +# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ @@ -979,7 +1042,7 @@ EXCLUDE_PATTERNS = # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test +# ANamespace::AClass, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* @@ -1010,7 +1073,8 @@ EXAMPLE_RECURSIVE = NO # that contain images that are to be included in the documentation (see the # \image command). -IMAGE_PATH = img docs/img +IMAGE_PATH = img \ + docs/img # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program @@ -1027,6 +1091,11 @@ IMAGE_PATH = img docs/img # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. @@ -1068,6 +1137,15 @@ FILTER_SOURCE_PATTERNS = USE_MDFILE_AS_MAINPAGE = README.md +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- @@ -1165,9 +1243,11 @@ VERBATIM_HEADERS = YES CLANG_ASSISTED_PARSING = NO -# If clang assisted parsing is enabled and the CLANG_ADD_INC_PATHS tag is set to -# YES then doxygen will add the directory of each input to the include path. +# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS +# tag is set to YES then doxygen will add the directory of each input to the +# include path. # The default value is: YES. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. CLANG_ADD_INC_PATHS = YES @@ -1203,10 +1283,11 @@ CLANG_DATABASE_PATH = ALPHABETICAL_INDEX = YES -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = @@ -1263,7 +1344,7 @@ HTML_HEADER = doxygen-custom/header.html # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_FOOTER = +HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of @@ -1285,15 +1366,19 @@ HTML_STYLESHEET = # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = doxygen-awesome.css \ doxygen-custom/custom.css \ doxygen-awesome-sidebar-only.css \ doxygen-awesome-sidebar-only-darkmode-toggle.css \ - doxygen-custom/custom-alternative.css \ - + doxygen-custom/custom-alternative.css # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1306,11 +1391,26 @@ HTML_EXTRA_STYLESHEET = doxygen-awesome.css \ HTML_EXTRA_FILES = doxygen-awesome-darkmode-toggle.js \ doxygen-awesome-fragment-copy-button.js \ doxygen-awesome-paragraph-link.js \ - doxygen-custom/toggle-alternative-theme.js + doxygen-custom/toggle-alternative-theme.js \ + doxygen-awesome-interactive-toc.js \ + doxygen-awesome-tabs.js + +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = LIGHT # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see +# this color. Hue is specified as an angle on a color-wheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. @@ -1320,7 +1420,7 @@ HTML_EXTRA_FILES = doxygen-awesome-darkmode-toggle.js \ HTML_COLORSTYLE_HUE = 209 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A +# in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1402,6 +1502,13 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. @@ -1427,8 +1534,12 @@ DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: -# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows. +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML @@ -1587,16 +1698,28 @@ DISABLE_INDEX = NO # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = YES +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # @@ -1621,6 +1744,13 @@ TREEVIEW_WIDTH = 335 EXT_LINKS_IN_WINDOW = NO +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + # If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see # https://inkscape.org) to generate formulas as SVG images instead of PNGs for @@ -1641,17 +1771,6 @@ HTML_FORMULA_FORMAT = png FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. @@ -1669,11 +1788,29 @@ FORMULA_MACROFILE = USE_MATHJAX = NO +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + # When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1686,15 +1823,21 @@ MATHJAX_FORMAT = HTML-CSS # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see https://docs.mathjax.org/en/v2.7-latest/tex.html +# #tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = @@ -1874,29 +2017,31 @@ PAPER_TYPE = a4 EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. +# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for +# the generated LaTeX document. The header should contain everything until the +# first chapter. If it is left blank doxygen will generate a standard header. It +# is highly recommended to start with a default header using +# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty +# and then modify the file new_header.tex. See also section "Doxygen usage" for +# information on how to generate the default header that doxygen normally uses. # -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. +# Note: Only use a user-defined header if you know what you are doing! +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. The following +# commands have a special meaning inside the header (and footer): For a +# description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See +# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for +# the generated LaTeX document. The footer should contain everything after the +# last chapter. If it is left blank doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! +# special commands can be used inside the footer. See also section "Doxygen +# usage" for information on how to generate the default footer that doxygen +# normally uses. Note: Only use a user-defined footer if you know what you are +# doing! # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = @@ -1941,8 +2086,7 @@ USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode # command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. +# if errors occur, instead of asking the user for help. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1955,16 +2099,6 @@ LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source -# code with syntax highlighting in the LaTeX output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_SOURCE_CODE = NO - # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See # https://en.wikipedia.org/wiki/BibTeX and \cite for more info. @@ -2045,16 +2179,6 @@ RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = -# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code -# with syntax highlighting in the RTF output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_SOURCE_CODE = NO - #--------------------------------------------------------------------------- # Configuration options related to the man page output #--------------------------------------------------------------------------- @@ -2151,15 +2275,6 @@ GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook -# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the -# program listings (including syntax highlighting and cross-referencing -# information) to the DOCBOOK output. Note that enabling this will significantly -# increase the size of the DOCBOOK output. -# The default value is: NO. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_PROGRAMLISTING = NO - #--------------------------------------------------------------------------- # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- @@ -2250,7 +2365,8 @@ SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the -# preprocessor. +# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of +# RECURSIVE has no effect here. # This tag requires that the tag SEARCH_INCLUDES is set to YES. INCLUDE_PATH = @@ -2342,15 +2458,6 @@ EXTERNAL_PAGES = YES # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = YES - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. @@ -2383,35 +2490,50 @@ HAVE_DOT = YES DOT_NUM_THREADS = 0 -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. +# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of +# subgraphs. When you want a differently looking font in the dot files that +# doxygen generates you can specify fontname, fontcolor and fontsize attributes. +# For details please see Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTNAME = Helvetica +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTSIZE = 10 +DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" -# By default doxygen will tell dot to use the default font as specified with -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set -# the path where dot can find it using this tag. +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" + +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. # This tag requires that the tag HAVE_DOT is set to YES. DOT_FONTPATH = -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a +# graph for each documented class showing the direct and indirect inheritance +# relations. In case HAVE_DOT is set as well dot will be used to draw the graph, +# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set +# to TEXT the direct and indirect inheritance relations will be shown as texts / +# links. +# Possible values are: NO, YES, TEXT and GRAPH. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. CLASS_GRAPH = YES @@ -2425,7 +2547,8 @@ CLASS_GRAPH = YES COLLABORATION_GRAPH = NO # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. +# groups, showing the direct groups dependencies. See also the chapter Grouping +# in the manual. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2540,6 +2663,13 @@ GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: @@ -2593,10 +2723,10 @@ MSCFILE_DIRS = DIAFILE_DIRS = # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. PLANTUML_JAR_PATH = @@ -2634,18 +2764,6 @@ DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 0 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = YES - # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support @@ -2658,6 +2776,8 @@ DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2666,8 +2786,8 @@ GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. # -# Note: This setting is not only used for dot files but also for msc and -# plantuml temporary files. +# Note: This setting is not only used for dot files but also for msc temporary +# files. # The default value is: YES. DOT_CLEANUP = YES diff --git a/Docs/doxygen-awesome-css/LICENSE b/Docs/doxygen-awesome-css/LICENSE index 1d8b99a9..8bf804a2 100644 --- a/Docs/doxygen-awesome-css/LICENSE +++ b/Docs/doxygen-awesome-css/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 jothepro +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 diff --git a/Docs/doxygen-awesome-css/Makefile b/Docs/doxygen-awesome-css/Makefile new file mode 100644 index 00000000..766f61a4 --- /dev/null +++ b/Docs/doxygen-awesome-css/Makefile @@ -0,0 +1,39 @@ +# SPDX-FileCopyrightText: 2022 Andrea Pappacoda +# SPDX-License-Identifier: MIT + +.POSIX: + +PROJECT = doxygen-awesome-css + +# Paths +PREFIX = /usr/local +DATADIR = share +INSTALLDIR = $(DESTDIR)$(PREFIX)/$(DATADIR)/$(PROJECT) + +# Utilities +INSTALL = install -m 644 +MKDIR = mkdir -p +RM = rm -f + +# Files to be installed +FILES = doxygen-awesome-darkmode-toggle.js \ + doxygen-awesome-fragment-copy-button.js \ + doxygen-awesome-interactive-toc.js \ + doxygen-awesome-paragraph-link.js \ + doxygen-awesome-sidebar-only-darkmode-toggle.css \ + doxygen-awesome-sidebar-only.css \ + doxygen-awesome-tabs.js \ + doxygen-awesome.css + +# Empty targets so that `make` and `make clean` do not cause errors +all: +clean: + +install: + $(MKDIR) $(INSTALLDIR) + $(INSTALL) $(FILES) $(INSTALLDIR)/ + +uninstall: + $(RM) -r $(INSTALLDIR)/ + +.PHONY: all clean install uninstall diff --git a/Docs/doxygen-awesome-css/README.md b/Docs/doxygen-awesome-css/README.md index 88516646..379a6f16 100644 --- a/Docs/doxygen-awesome-css/README.md +++ b/Docs/doxygen-awesome-css/README.md @@ -4,87 +4,170 @@ [![GitHub](https://img.shields.io/github/license/jothepro/doxygen-awesome-css)](https://github.com/jothepro/doxygen-awesome-css/blob/main/LICENSE) ![GitHub Repo stars](https://img.shields.io/github/stars/jothepro/doxygen-awesome-css) -
+
![Screenshot of Doxygen Awesome CSS](img/screenshot.png)
-**Doxygen Awesome** is a custom **CSS theme for Doxygen HTML-documentation** with lots of customization parameters. +**Doxygen Awesome** is a custom CSS theme for Doxygen HTML documentation with lots of customization parameters. ## Motivation -I really like how the Doxygen HTML-documentation is structured! But IMHO it looks a bit outdated. +I really like how the Doxygen HTML documentation is structured! But IMHO it looks a bit outdated. -This theme is an attemt to update the visuals of Doxygen without changing it's overall layout too much. +This theme is an attempt to update the visuals of Doxygen without changing its overall layout too much. ## Features - 🌈 Clean, modern design -- 🚀 Heavily customizable by adjusting CSS-variables -- 🧩 No changes to the HTML structure of Doxygen required +- 🚀 Heavily customizable by adjusting CSS variables +- 🧩 No changes to the HTML structure of Doxygen are required - 📱 Improved mobile usability - 🌘 Dark mode support! -- 🥇 Works best with **doxygen 1.9.1** - **1.9.3** +- 🥇 Works best with **doxygen 1.9.1** - **1.9.4** and **1.9.6** - **1.10.0** ## Examples -- Sidebar-Only theme: [Documentation of this repository](https://jothepro.github.io/doxygen-awesome-css/) -- Base theme: [libsl3](https://a4z.github.io/libsl3/) - +Some websites using this theme: + +- [Documentation of this repository](https://jothepro.github.io/doxygen-awesome-css/) +- [wxWidgets](https://docs.wxwidgets.org/3.2/) +- [OpenCV 5.x](https://docs.opencv.org/5.x/) +- [Zephyr](https://docs.zephyrproject.org/latest/doxygen/html/index.html) +- [FELTOR](https://mwiesenberger.github.io/feltor/dg/html/modules.html) +- [Spatial Audio Framework (SAF)](https://leomccormack.github.io/Spatial_Audio_Framework/index.html) +- [Randolf Richardson's C++ classes](https://www.randolf.ca/c++/docs/) +- [libCloudSync](https://jothepro.github.io/libCloudSync/) +- [libsl3](https://a4z.github.io/libsl3/) + ## Installation -Copy the file `doxygen-awesome.css` from this repository into your project or add this repository as submodule and check out the latest release: +To use the theme when generating your documentation, bring the required CSS and JS files from this repository into your project. + +This can be done in several ways: + +- manually copying the files +- adding the project as a Git submodule +- adding the project as a npm/xpm dependency +- installing the theme system-wide + +All theme files are located in the root of this repository and start with the prefix `doxygen-awesome-`. You may not need all of them. Follow the install instructions to figure out what files are required for your setup. -```bash +### Git submodule +For projects that use git, add the repository as a submodule and check out the desired release: + +```sh git submodule add https://github.com/jothepro/doxygen-awesome-css.git cd doxygen-awesome-css -git checkout v2.0.2 +git checkout v2.3.3 ``` -Choose one of the theme variants and configure Doxygen accordingly: - - +### npm/xpm dependency -![Available theme variants](img/theme-variants.drawio.svg) +In the npm ecosystem, this project can be added as a development dependency +to your project: - +```sh +cd your-project +npm install https://github.com/jothepro/doxygen-awesome-css#v2.3.3 --save-dev -1. **Base theme**: -``` -# Doxyfile -GENERATE_TREEVIEW = YES # optional. Also works without treeview -HTML_EXTRA_STYLESHEET = doxygen-awesome-css/doxygen-awesome.css +ls -l node_module/@jothepro/doxygen-awesome-css ``` -2. **Sidebar-only theme**: -``` -# Doxyfile -GENERATE_TREEVIEW = YES # required! -HTML_EXTRA_STYLESHEET = doxygen-awesome-css/doxygen-awesome.css \ - doxygen-awesome-css/doxygen-awesome-sidebar-only.css -``` +Similarly, in the [xPack](https://xpack.github.io) ecosystem, this project can be added +as a development dependency to an [`xpm`](https://xpack.github.io/xpm/) +managed project. + +### System-wide + +You can even install the theme system-wide by running `make install`. +The files will be installed to `/usr/local/share/` by default, +but you can customize the install location with `make PREFIX=/my/custom/path install`. + +### Choosing a layout + +There are two layout options. Choose one of them and configure Doxygen accordingly: + +
+ +- Base Theme
+ ![](img/theme-variants-base.drawio.svg) +
+ Comes with the typical Doxygen titlebar. Optionally the treeview in the sidebar can be enabled. + + Required files: `doxygen-awesome.css` -Further installation instructions: + Required `Doxyfile` configuration: + ``` + GENERATE_TREEVIEW = YES # optional. Also works without treeview + DISABLE_INDEX = NO + FULL_SIDEBAR = NO + HTML_EXTRA_STYLESHEET = doxygen-awesome-css/doxygen-awesome.css + HTML_COLORSTYLE = LIGHT # required with Doxygen >= 1.9.5 + ``` -- [How to install extensions](docs/extensions.md) -- [How to customize the theme (colors, spacing, border-radius, ...)](docs/customization.md) +- Sidebar-Only Theme
+ ![](img/theme-variants-sidebar-only.drawio.svg) +
+ Hides the top titlebar to give more space to the content. The treeview must be enabled in order for this theme to work. + + Required files: `doxygen-awesome.css`, `doxygen-awesome-sidebar-only.css` + + Required `Doxyfile` configuration: + ``` + + GENERATE_TREEVIEW = YES # required! + DISABLE_INDEX = NO + FULL_SIDEBAR = NO + HTML_EXTRA_STYLESHEET = doxygen-awesome-css/doxygen-awesome.css \ + doxygen-awesome-css/doxygen-awesome-sidebar-only.css + HTML_COLORSTYLE = LIGHT # required with Doxygen >= 1.9.5 + ``` + +
+ +
+ +@warning +- This theme is not compatible with the `FULL_SIDEBAR = YES` option provided by Doxygen! +- `HTML_COLORSTYLE` must be set to `LIGHT` since Doxygen 1.9.5! + +### Further installation instructions + +- [Installing extensions](docs/extensions.md) +- [Customizing the theme (colors, spacing, border-radius, ...)](docs/customization.md) - [Tips and Tricks for further configuration](docs/tricks.md) ## Browser support Tested with -- Chrome 98, Chrome 98 for Android, Chrome 87 for iOS -- Safari 15, Safari for iOS 15 -- Firefox 97, Firefox Daylight 97 for Android, Firefox Daylight 96 for iOS +- Chrome 119, Chrome 119 for Android, Chrome 119 for iOS +- Safari 17, Safari for iOS 16 +- Firefox 118, Firefox 120 for Android, Firefox 119 for iOS +- Edge 119 +- Opera 108 + + +The theme does not strive to be backward compatible with (significantly) older browser versions. + ## Credits -- This theme is inspired by the [vuepress](https://vuepress.vuejs.org/) static site generator default theme. -- Thank you for all the feedback on github! +Thanks for all the bug reports and inspiring feedback on GitHub! - +Special thanks to all the contributors: +

+ + + -Read Next: [Extensions](docs/extensions.md) -
\ No newline at end of file + +
+ +| Read Next | +|---------------------------------:| +| [Extensions](docs/extensions.md) | + +
diff --git a/Docs/doxygen-awesome-css/docs/customization.md b/Docs/doxygen-awesome-css/docs/customization.md index 0e89511b..7c26d338 100644 --- a/Docs/doxygen-awesome-css/docs/customization.md +++ b/Docs/doxygen-awesome-css/docs/customization.md @@ -7,10 +7,12 @@ This theme is highly customizable because a lot of things are parameterized with CSS variables. -Just to give you an idea on how flexible the styling is, click this button: +Just to give you an idea of how flexible the styling is, click this button:
Alter theme
+

+ ### Setup It is recommended to add your own `custom.css` and overwrite the variables there: @@ -26,15 +28,18 @@ html { } ``` -For dark-mode overrides you have to choose where to put them, depending on wether the dark-mode toggle extension is installed or not: +For dark-mode overrides, you have to choose where to put them, depending on whether the dark-mode toggle extension is installed or not: + +
-- dark-mode toggle is installed: +- dark-mode toggle is installed ```css html.dark-mode { /* define dark-mode variable overrides here if you DO use doxygen-awesome-darkmode-toggle.js */ } ``` -- dark-mode toggle is **NOT** installed. The dark-mode is enabled automatically depending on the system preference: +- dark-mode toggle is **NOT** installed + The dark-mode is enabled automatically depending on the system preference: ```css @media (prefers-color-scheme: dark) { html:not(.light-mode) { @@ -43,6 +48,8 @@ For dark-mode overrides you have to choose where to put them, depending on wethe } ``` +
+ ### Available variables The following list gives an overview of the variables defined in [`doxygen-awesome.css`](https://github.com/jothepro/doxygen-awesome-css/blob/main/doxygen-awesome.css). @@ -50,33 +57,33 @@ The following list gives an overview of the variables defined in [`doxygen-aweso The list is not complete. To explore all available variables, have a look at the CSS starting from [here](https://github.com/jothepro/doxygen-awesome-css/blob/main/doxygen-awesome.css#L30). All variables are defined at the beginning of the stylesheet. -| Parameter | Default (Light) | Default (Dark) | -| :-------------------------------- | :---------------------------------------------------------- | ----------------------------------------------------------- | -| **Color Scheme**:
primary theme colors. This will affect the entire websites color scheme: links, arrows, labels, ... ||| -| `--primary-color` | #1779c4 | #1982d2 | -| `--primary-dark-color` | #335c80 | #5ca8e2 | -| `--primary-light-color` | #70b1e9 | #4779ac | -| **Page Colors**:
background and foreground (text-color) of the documentation. ||| -| `--page-background-color` | white | #1C1D1F | -| `--page-foreground-color` | #2f4153 | #d2dbde | -| `--page-secondary-foreground-color`| #637485| #859399 | -| **Spacing:**
default spacings. Most ui components reference these values for spacing, to provide uniform spacing on the page. ||| -| `--spacing-small` | `5px` | | -| `--spacing-medium` | `10px` | | -| `--spacing-large` | `16px` | | -| **Border Radius**:
border radius for all rounded ui components. Will affect many components, like dropdowns, memitems, codeblocks, ... ||| -| `--border-radius-small` | `4px` | | -| `--border-radius-medium` | `6px` | | -| `--border-radius-large` | `8px` | | -| **Content Width**:
The content is centered and constrained in its width. To make the content fill the whole page, set the following variable to `auto`. ||| -| `--content-maxwidth` | `1000px` | | -| **Code Fragment Colors**:
Color-Scheme of multiline codeblocks ||| -| `--fragment-background` | #F8F9FA | #282c34 | -| `--fragment-foreground` | #37474F | #dbe4eb | -| **Arrow Opacity**:
By default the arrows in the sidebar are only visible on hover. You can override this behaviour so they are visible all the time. ||| -| `--side-nav-arrow-opacity` | `0` | | -| `--side-nav-arrow-hover-opacity` | `0.9` | | -| ...and many more ||| +| Parameter | Default (Light) | Default (Dark) | +| :---------------------------------- | :---------------------------------------------------------- | :---------------------------------------------------------- | +| **Color Scheme**:
primary theme colors. This will affect the entire websites color scheme: links, arrows, labels, ... ||| +| `--primary-color` | #1779c4 | #1982d2 | +| `--primary-dark-color` | #335c80 | #5ca8e2 | +| `--primary-light-color` | #70b1e9 | #4779ac | +| **Page Colors**:
background and foreground (text-color) of the documentation. ||| +| `--page-background-color` | #ffffff | #1C1D1F | +| `--page-foreground-color` | #2f4153 | #d2dbde | +| `--page-secondary-foreground-color` | #6f7e8e | #859399 | +| **Spacing:**
default spacings. Most ui components reference these values for spacing, to provide uniform spacing on the page. ||| +| `--spacing-small` | `5px` | | +| `--spacing-medium` | `10px` | | +| `--spacing-large` | `16px` | | +| **Border Radius**:
border radius for all rounded ui components. Will affect many components, like dropdowns, memitems, codeblocks, ... ||| +| `--border-radius-small` | `4px` | | +| `--border-radius-medium` | `6px` | | +| `--border-radius-large` | `8px` | | +| **Content Width**:
The content is centered and constrained in its width. To make the content fill the whole page, set the following variable to `auto`. ||| +| `--content-maxwidth` | `1000px` | | +| **Code Fragment Colors**:
Color-Scheme of multiline codeblocks ||| +| `--fragment-background` | #F8F9FA | #282c34 | +| `--fragment-foreground` | #37474F | #dbe4eb | +| **Arrow Opacity**:
By default the arrows in the sidebar are only visible on hover. You can override this behavior so they are visible all the time. ||| +| `--side-nav-arrow-opacity` | `0` | | +| `--side-nav-arrow-hover-opacity` | `0.9` | | +| ...and many more ||| If you miss a configuration option or find a bug, please consider [opening an issue](https://github.com/jothepro/doxygen-awesome-css/issues)! @@ -85,11 +92,11 @@ If you miss a configuration option or find a bug, please consider [opening an is The theme overrides most colors with the `--primary-color-*` variables. -But there is a few small images and graphics that the theme cannot adjust or replace. To make these blend in better with +But there are a few small images and graphics that the theme cannot adjust or replace. To make these blend in better with the rest, it is recommended to adjust the [doxygen color settings](https://www.doxygen.nl/manual/customize.html#minor_tweaks_colors) -to something that matches the chosen color-scheme. +to something that matches the chosen color scheme. -For the default color-scheme, these values work out quite well: +For the default color scheme, these values work out quite well: ``` # Doxyfile @@ -100,11 +107,15 @@ HTML_COLORSTYLE_GAMMA = 113 ## Share your customizations -If you customized the theme with custom colors, spacings, font-sizes, etc. and you want to share your creation with others, you can to this [here](https://github.com/jothepro/doxygen-awesome-css/discussions/13). +If you have customized the theme with custom colors, spacings, font-sizes, etc. and you want to share your creation with others, you can do this [here](https://github.com/jothepro/doxygen-awesome-css/discussions/13). I am always curious to learn about how you made the theme look even better! - -Read Next: [Tips & Tricks](tricks.md) - \ No newline at end of file +
+ +| Previous | Next | +|:----------------------------|---------------------------:| +| [Extensions](extensions.md) | [Tips & Tricks](tricks.md) | + +
\ No newline at end of file diff --git a/Docs/doxygen-awesome-css/docs/extensions.md b/Docs/doxygen-awesome-css/docs/extensions.md index 8eb82d93..ea1ce00d 100644 --- a/Docs/doxygen-awesome-css/docs/extensions.md +++ b/Docs/doxygen-awesome-css/docs/extensions.md @@ -4,7 +4,7 @@ On top of the base theme provided by `doxygen-awesome.css`, this repository comes with Javascript extensions that require additional setup steps to get them running. -The extensions require customizations in the header HTML-template. +The extensions require customizations in the header HTML template. This is how you can create the default template with Doxygen: 1. Create default header template: @@ -19,11 +19,14 @@ This is how you can create the default template with Doxygen: [More details on header customization](https://www.doxygen.nl/manual/customize.html#minor_tweaks_header_css) -## Dark Mode Toggle +## Dark Mode Toggle {#extension-dark-mode-toggle} -Adds a button next to the search bar to enable and disable the dark theme variant manually. +Adds a button next to the search bar to enable and disable the dark theme variant manually: - +
+ +![](img/darkmode_toggle.png){width=250px} +
### Installation @@ -43,28 +46,32 @@ Adds a button next to the search bar to enable and disable the dark theme varian ``` -3. The button can be customized to some extend: - - Change the tooltip of the button: - ```js - DoxygenAwesomeDarkModeToggle.title = "Zwischen hellem/dunklem Modus wechseln" - ``` - - Change Icons. Both Emoji or SVG icons are supported: - ```js - DoxygenAwesomeDarkModeToggle.lightModeIcon = '🌞' - // icon from https://fonts.google.com/icons - DoxygenAwesomeDarkModeToggle.darkModeIcon = `` - ``` - All customizations must be applied before calling `DoxygenAwesomeDarkModeToggle.init()`! +### Customizing + +Changing the tooltip of the button: +```js +DoxygenAwesomeDarkModeToggle.title = "Zwischen hellem/dunklem Modus wechseln" +``` + +Changing Icons. Both Emoji or SVG icons are supported: +```js +DoxygenAwesomeDarkModeToggle.lightModeIcon = '🌞' +// icon from https://fonts.google.com/icons +DoxygenAwesomeDarkModeToggle.darkModeIcon = `` +``` +All customizations must be applied before calling `DoxygenAwesomeDarkModeToggle.init()`! -## Fragment Copy Button -***This feature is experimental!*** +## Fragment Copy Button {#extension-copy-button} Shows a copy button when the user hovers over a code fragment: - +
+ +![](img/fragment_copy_button.png){width=490} +
### Installation @@ -82,26 +89,30 @@ Shows a copy button when the user hovers over a code fragment: ``` -3. The button can be customized to some extend: - - Change the tooltip of the button: - ```js - DoxygenAwesomeFragmentCopyButton.title = "In die Zwischenablage kopieren" - ``` - - Change Icons: - ```js - DoxygenAwesomeFragmentCopyButton.copyIcon = `` - DoxygenAwesomeFragmentCopyButton.successIcon = `` - ``` - All customizations must be applied before calling `DoxygenAwesomeDarkModeToggle.init()`! +### Customizing + +The tooltip of the button can be changed: +```js +DoxygenAwesomeFragmentCopyButton.title = "In die Zwischenablage kopieren" +``` -## Paragraph Linking +The icon can be changed. It must be an SVG: +```js +DoxygenAwesomeFragmentCopyButton.copyIcon = `` +DoxygenAwesomeFragmentCopyButton.successIcon = `` +``` -***This feature is experimental!*** +All customizations must be applied before calling `DoxygenAwesomeDarkModeToggle.init()`! + +## Paragraph Linking {#extension-para} Provides a button on hover behind every headline to allow easy creation of a permanent link to the headline: - +
+ +![](img/paragraph_link.png){width=220} +
Works for all headlines and for many documentation section titles. @@ -121,20 +132,152 @@ Works for all headlines and for many documentation section titles. ``` -3. The button can be customized to some extend: - - Change the tooltip of the button: - ```js - DoxygenAwesomeParagraphLink.title = "Abschnitt verknüpfen" - ``` - - Change Icon. Both plain characters or SVG icons are supported: - ```js - DoxygenAwesomeParagraphLink.icon = "¶" - ``` - All customizations must be applied before calling `DoxygenAwesomeParagraphLink.init()`! +### Customizing + +The button tooltip can be changed: +```js +DoxygenAwesomeParagraphLink.title = "Abschnitt verknüpfen" +``` + +The icon of the button can be changed. Both plain characters or SVG icons are supported: +```js +DoxygenAwesomeParagraphLink.icon = "¶" +``` + +All customizations must be applied before calling `DoxygenAwesomeParagraphLink.init()`! + +## Interactive TOC {#extension-toc} + +On large screens, the Table of Contents (TOC) is anchored on the top right of the page. This extension visualizes the reading progress by dynamically highlighting the currently active section. + +On small screens, the extension hides the TOC by default. The user can open it manually when needed: + + +
+ +![](img/interactive_toc_mobile.png){width=380} +
+ +### Installation + +1. Add the required resources in your `Doxyfile`: + - **HTML_EXTRA_FILES:** `doxygen-awesome-interactive-toc.js` +2. In the `header.html` template, include `doxygen-awesome-interactive-toc.js` at the end of the `` and then initialize it: + ```html + + + + + + + + ``` + +### Customizing + +The offset for when a headline is considered active can be changed. A smaller value means that the headline of the section must be closer to the top of the viewport before it is highlighted in the TOC: +```js +DoxygenAwesomeInteractiveToc.topOffset = 45 +``` + +Hiding the TOC on small screens can be disabled. It is still interactive and can be hidden by the user but will now be open by default: +```js +DoxygenAwesomeInteractiveToc.hideMobileMenu = false +``` + +## Tabs {#extension-tabs} + +@warning Experimental feature! Please report bugs [here](https://github.com/jothepro/doxygen-awesome-css/issues). + +This extension allows to arrange list content in tabs: + +
+ +- Tab 1 + This is the content of tab 1 +- Tab 2 + This is the content of tab 2 + 1. it has a list + 2. with multiple items + +
+ + +### Installation + +1. Add the required resources in your `Doxyfile`: + - **HTML_EXTRA_FILES:** `doxygen-awesome-tabs.js` +2. In the `header.html` template, include `doxygen-awesome-tabs.js` at the end of the `` and then initialize it: + ```html + + + + + + + + ``` + +### Usage + +Each list that is supposed to be displayed as tabs has to be wrapped with the `tabbed` CSS class. +Each item in the list must start with an element that has the class `tab-title`. It will then be used as tab title. + +```md +
+ +- Tab 1 This is the content of tab 1 +- Tab 2 This is the content of tab 2 + +
+``` + +## Page Navigation {#extension-page-navigation} + +@warning Experimental feature! Please report bugs [here](https://github.com/jothepro/doxygen-awesome-css/issues). + +To allow the user to easily navigate from one document to another, "Next" and "Previous" buttons can be added at the end of a Markdown document. + +### Installation + +The feature is shipped inside the default `doxygen-awesome.css`. No additional stylesheets or scripts need to be added. + +### Usage + +The following conditions must be met for the feature to work properly: +- The navigation must be inside a Markdown table with 1-2 columns. +- The alignment of the column defines the alignment of the arrow on the navigation button. +- the table must be wrapped inside a `
` with the class `section_buttons`. + +
+ +- Code + ```md +
+ + | Previous | Next | + |:------------------|----------------------------------:| + | [Home](README.md) | [Customization](customization.md) | + +
+ ``` +- Result +
+ | Previous | Next | + |:------------------|----------------------------------:| + | [Home](README.md) | [Customization](customization.md) | +
+
- +
-Read Next: [Customization](customization.md) - \ No newline at end of file +| Previous | Next | +|:------------------|----------------------------------:| +| [Home](README.md) | [Customization](customization.md) | +
\ No newline at end of file diff --git a/Docs/doxygen-awesome-css/docs/img/fragment_copy_button.png b/Docs/doxygen-awesome-css/docs/img/fragment_copy_button.png index 8e41b4634c8421ad2a8c50360d68016673bae606..6d94f971fef9c8b2fba44b7cc41d2ec91e57d321 100644 GIT binary patch literal 32871 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 F{5LSstD^t_ literal 45560 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�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 diff --git a/Docs/doxygen-awesome-css/docs/img/interactive_toc_mobile.png b/Docs/doxygen-awesome-css/docs/img/interactive_toc_mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..b42af5d6c131ebcf08b9b181738f2d225aab0ee5 GIT binary patch literal 16425 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 + +\dotfile graph.dot + +
+``` + +@note Both the default overflow scrolling behavior in this theme and the interactive editor enabled by `INTERACTIVE_SVG` are unsatisfying workarounds IMHO. Consider designing your graphs to be narrow enough to fit the page to avoid scrolling. + +## Disable Dark Mode {#tricks-darkmode} + +If you don't want the theme to automatically switch to dark mode depending on the browser preference, +you can disable dark mode by adding the `light-mode` class to the HTML tag in the header template: ```html ``` -The same can be done to always enable dark-mode: +The same can be done to always enable dark mode: ```html ``` -**This only works if you don't use the dark-mode toggle extension.** +@warning This only works if you don't use the dark-mode toggle extension. -## Choosing Sidebar Width +## Choosing Sidebar Width {#tricks-sidebar} If you have enabled the sidebar-only theme variant, make sure to carefully choose a proper width for your sidebar. It should be wide enough to hold the icon, project title and version number. If the content is too wide, it will be @@ -44,14 +56,72 @@ html { } ``` -The choosen width should also be set in the Doxyfile: +The chosen width should also be set in the Doxyfile: ``` # Doxyfile TREEVIEW_WIDTH = 335 ``` - +## Formatting Tables {#tricks-tables} + +By default tables in this theme are left-aligned and as wide as required to fit their content. +Those properties can be changed for individual tables. + +### Centering + +Tables can be centered by wrapping them in the `
` HTML tag. + +
+ +- Code + ```md +
+ | This table | is centered | + |------------|----------------------| + | test 1 | test 2 | +
+ ``` +- Result +
+ | This table | is centered | + |------------|----------------------| + | test 1 | test 2 | +
+ +
+ + + +### Full Width + +To make tables span the full width of the page, no matter how wide the content is, wrap the table in the `full_width_table` CSS class. + +@warning Apply with caution! This breaks the overflow scrolling of the table. Content might be cut off on small screens! + +
+ +- Code + ```md +
+ | This table | spans the full width | + |------------|----------------------| + | test 1 | test 2 | +
+ ``` +- Result +
+ | This table | spans the full width | + |------------|----------------------| + | test 1 | test 2 | +
+ +
+ +
+ +| Previous | Next | +|:----------------------------------|---------------------------------------:| +| [Customization](customization.md) | [Example](https://jothepro.github.io/doxygen-awesome-css/class_my_library_1_1_example.html) | -Read Next: [Example](https://jothepro.github.io/doxygen-awesome-css/class_my_library_1_1_example.html) - \ No newline at end of file +
\ No newline at end of file diff --git a/Docs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js b/Docs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js index f2c5853f..40fe2d38 100644 --- a/Docs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js +++ b/Docs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js @@ -5,7 +5,7 @@ https://github.com/jothepro/doxygen-awesome-css MIT License -Copyright (c) 2021 - 2022 jothepro +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 diff --git a/Docs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js b/Docs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js index 7d06b348..86c16fd9 100644 --- a/Docs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js +++ b/Docs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js @@ -5,7 +5,7 @@ https://github.com/jothepro/doxygen-awesome-css MIT License -Copyright (c) 2022 jothepro +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 diff --git a/Docs/doxygen-awesome-css/doxygen-awesome-interactive-toc.js b/Docs/doxygen-awesome-css/doxygen-awesome-interactive-toc.js new file mode 100644 index 00000000..20a9669d --- /dev/null +++ b/Docs/doxygen-awesome-css/doxygen-awesome-interactive-toc.js @@ -0,0 +1,81 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeInteractiveToc { + static topOffset = 38 + static hideMobileMenu = true + static headers = [] + + static init() { + window.addEventListener("load", () => { + let toc = document.querySelector(".contents > .toc") + if(toc) { + toc.classList.add("interactive") + if(!DoxygenAwesomeInteractiveToc.hideMobileMenu) { + toc.classList.add("open") + } + document.querySelector(".contents > .toc > h3")?.addEventListener("click", () => { + if(toc.classList.contains("open")) { + toc.classList.remove("open") + } else { + toc.classList.add("open") + } + }) + + document.querySelectorAll(".contents > .toc > ul a").forEach((node) => { + let id = node.getAttribute("href").substring(1) + DoxygenAwesomeInteractiveToc.headers.push({ + node: node, + headerNode: document.getElementById(id) + }) + + document.getElementById("doc-content")?.addEventListener("scroll", () => { + DoxygenAwesomeInteractiveToc.update() + }) + }) + DoxygenAwesomeInteractiveToc.update() + } + }) + } + + static update() { + let active = DoxygenAwesomeInteractiveToc.headers[0]?.node + DoxygenAwesomeInteractiveToc.headers.forEach((header) => { + let position = header.headerNode.getBoundingClientRect().top + header.node.classList.remove("active") + header.node.classList.remove("aboveActive") + if(position < DoxygenAwesomeInteractiveToc.topOffset) { + active = header.node + active?.classList.add("aboveActive") + } + }) + active?.classList.add("active") + active?.classList.remove("aboveActive") + } +} \ No newline at end of file diff --git a/Docs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js b/Docs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js index 6424dbd4..e53d132c 100644 --- a/Docs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js +++ b/Docs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js @@ -5,7 +5,7 @@ https://github.com/jothepro/doxygen-awesome-css MIT License -Copyright (c) 2022 jothepro +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 diff --git a/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css b/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css index b988b6f0..d207446e 100644 --- a/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css +++ b/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css @@ -6,7 +6,7 @@ https://github.com/jothepro/doxygen-awesome-css MIT License -Copyright (c) 2021 jothepro +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 diff --git a/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css b/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css index b5c4e7cb..853f6d69 100644 --- a/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css +++ b/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css @@ -5,7 +5,7 @@ https://github.com/jothepro/doxygen-awesome-css MIT License -Copyright (c) 2021 jothepro +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 @@ -35,6 +35,8 @@ html { --menu-display: none; --top-height: 120px; + --toc-sticky-top: -25px; + --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 25px); } #projectname { @@ -79,6 +81,7 @@ html { .ui-resizable-handle { cursor: default; width: 1px !important; + background: var(--separator-color); box-shadow: 0 calc(-2 * var(--top-height)) 0 0 var(--separator-color); } diff --git a/Docs/doxygen-awesome-css/doxygen-awesome-tabs.js b/Docs/doxygen-awesome-css/doxygen-awesome-tabs.js new file mode 100644 index 00000000..06dfd3d6 --- /dev/null +++ b/Docs/doxygen-awesome-css/doxygen-awesome-tabs.js @@ -0,0 +1,90 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeTabs { + + static init() { + window.addEventListener("load", () => { + document.querySelectorAll(".tabbed:not(:empty)").forEach((tabbed, tabbedIndex) => { + let tabLinkList = [] + tabbed.querySelectorAll(":scope > ul > 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(":scope > ul > 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(":scope > ul > li").forEach((tab, tabIndex) => { + let visibility = tab.style.display + tab.style.display = "block" + maxTabHeight = Math.max(tab.offsetHeight, maxTabHeight) + tab.style.display = visibility + }) + tabbed.style.height = `${maxTabHeight + 10}px` + } + + resize() + new ResizeObserver(resize).observe(tabbed) + }) + }) + + } + + static resize(tabbed) { + + } +} \ No newline at end of file diff --git a/Docs/doxygen-awesome-css/doxygen-awesome.css b/Docs/doxygen-awesome-css/doxygen-awesome.css index b22d46ea..a2715e26 100644 --- a/Docs/doxygen-awesome-css/doxygen-awesome.css +++ b/Docs/doxygen-awesome-css/doxygen-awesome.css @@ -5,7 +5,7 @@ https://github.com/jothepro/doxygen-awesome-css MIT License -Copyright (c) 2021 - 2022 jothepro +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 @@ -34,9 +34,9 @@ html { --primary-light-color: #70b1e9; /* page base colors */ - --page-background-color: white; + --page-background-color: #ffffff; --page-foreground-color: #2f4153; - --page-secondary-foreground-color: #637485; + --page-secondary-foreground-color: #6f7e8e; /* color for all separators on the website: hr, borders, ... */ --separator-color: #dedede; @@ -46,12 +46,12 @@ html { --border-radius-small: 4px; --border-radius-medium: 6px; - /* default spacings. Most compontest reference these values for spacing, to provide uniform spacing on the page. */ + /* 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, Searchresult, ... */ + /* 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); @@ -66,30 +66,35 @@ html { /* 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: 1000px; + --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: #f8d1cc; - --warning-color-dark: #b61825; - --warning-color-darker: #75070f; - --note-color: #faf3d8; - --note-color-dark: #f3a600; - --note-color-darker: #5f4204; - --todo-color: #e4f3ff; - --todo-color-dark: #1879C4; - --todo-color-darker: #274a5c; + --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: #e4dafd; - --bug-color-dark: #5b2bdd; - --bug-color-darker: #2a0d72; + --bug-color: #f8d1cc; + --bug-color-dark: #b61825; + --bug-color-darker: #75070f; --invariant-color: #d8f1e3; --invariant-color-dark: #44b86f; --invariant-color-darker: #265532; @@ -155,7 +160,7 @@ html { --toc-background: var(--side-nav-background); --toc-foreground: var(--side-nav-foreground); - /* height of an item in any tree / collapsable table */ + /* height of an item in any tree / collapsible table */ --tree-item-height: 30px; --memname-font-size: var(--code-font-size); @@ -164,12 +169,15 @@ html { --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; } @@ -202,21 +210,21 @@ html { --blockquote-background: #222325; --blockquote-foreground: #7e8c92; - --warning-color: #2e1917; - --warning-color-dark: #ad2617; - --warning-color-darker: #f5b1aa; - --note-color: #3b2e04; - --note-color-dark: #f1b602; - --note-color-darker: #ceb670; - --todo-color: #163750; - --todo-color-dark: #1982D2; - --todo-color-darker: #dcf0fa; + --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: #2a2536; - --bug-color-dark: #7661b3; - --bug-color-darker: #ae9ed6; + --bug-color: #2e1917; + --bug-color-dark: #ad2617; + --bug-color-darker: #f5b1aa; --invariant-color: #303a35; --invariant-color-dark: #76ce96; --invariant-color-darker: #cceed5; @@ -263,21 +271,21 @@ html.dark-mode { --blockquote-background: #222325; --blockquote-foreground: #7e8c92; - --warning-color: #2e1917; - --warning-color-dark: #ad2617; - --warning-color-darker: #f5b1aa; - --note-color: #3b2e04; - --note-color-dark: #f1b602; - --note-color-darker: #ceb670; - --todo-color: #163750; - --todo-color-dark: #1982D2; - --todo-color-darker: #dcf0fa; + --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: #2a2536; - --bug-color-dark: #7661b3; - --bug-color-darker: #ae9ed6; + --bug-color: #2e1917; + --bug-color-dark: #ad2617; + --bug-color-darker: #f5b1aa; --invariant-color: #303a35; --invariant-color-dark: #76ce96; --invariant-color-darker: #cceed5; @@ -302,27 +310,36 @@ body { 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 { +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, div.toc li, div.toc h3 { font-family: var(--font-family); } h1, h2, h3, h4, h5 { - margin-top: .9em; + margin-top: 1em; font-weight: 600; line-height: initial; } -p, div, table, dl { +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; + background: none; } a.anchor { scroll-margin-top: var(--spacing-large); + display: block; } /* @@ -400,6 +417,10 @@ a.anchor { 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); @@ -534,9 +555,23 @@ a.anchor { margin-top: 0; } -.left #MSearchSelect { +/* 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 { @@ -595,12 +630,9 @@ a.anchor { top: calc(calc(var(--searchbar-height) / 2) - 11px); } -.left #MSearchSelect { - padding-left: 8px; -} - #MSearchBox span.left, #MSearchBox span.right { background: none; + background-image: none; } #MSearchBox span.right { @@ -654,6 +686,15 @@ 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); @@ -710,6 +751,7 @@ html.dark-mode iframe#MSearchResults { overflow: auto; transform: translate(0, 20px); animation: ease-out 280ms slideInSearchResultsMobile; + width: auto !important; } /* @@ -737,6 +779,8 @@ html.dark-mode iframe#MSearchResults { #side-nav { padding: 0 !important; background: var(--side-nav-background); + min-width: 8px; + max-width: 50vw; } @media screen and (max-width: 767px) { @@ -751,6 +795,7 @@ html.dark-mode iframe#MSearchResults { #nav-tree { background: transparent; + margin-right: 1px; } #nav-tree .label { @@ -762,6 +807,10 @@ html.dark-mode iframe#MSearchResults { line-height: var(--tree-item-height); } +#nav-tree .item > a:focus { + outline: none; +} + #nav-sync { bottom: 12px; right: 12px; @@ -773,9 +822,21 @@ html.dark-mode iframe#MSearchResults { text-shadow: none; background-image: none; background-color: transparent; - box-shadow: inset 4px 0 0 0 var(--primary-color); + 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; @@ -787,6 +848,7 @@ html.dark-mode iframe#MSearchResults { #nav-tree .arrow { opacity: var(--side-nav-arrow-opacity); + background: none; } .arrow { @@ -811,8 +873,9 @@ html.dark-mode iframe#MSearchResults { } .ui-resizable-e { - background: var(--separator-color); - width: 1px; + width: 4px; + background: transparent; + box-shadow: inset -1px 0 0 0 var(--separator-color); } /* @@ -825,6 +888,21 @@ div.header { 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); } @@ -844,7 +922,7 @@ div.headertitle { div.header .title { font-weight: 600; - font-size: 210%; + font-size: 225%; padding: var(--spacing-medium) var(--spacing-large); word-break: break-word; } @@ -887,21 +965,24 @@ div.contents div.dyncontent { @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 > table img, html:not(.light-mode) div.contents div.dyncontent iframe, html:not(.light-mode) div.contents center iframe, - html:not(.light-mode) div.contents table iframe { - filter: hue-rotate(180deg) invert(); + html: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 > table img, html.dark-mode div.contents div.dyncontent iframe, html.dark-mode div.contents center iframe, -html.dark-mode div.contents table iframe { - filter: hue-rotate(180deg) invert(); +html.dark-mode div.contents table iframe, +html.dark-mode div.contents .dotgraph iframe + { + filter: brightness(89%) hue-rotate(180deg) invert(); } h2.groupheader { @@ -916,14 +997,18 @@ h2.groupheader { -500px 0 var(--page-background-color), 500px 0.75px var(--separator-color), -500px 0.75px var(--separator-color), - 1500px 0 var(--page-background-color), - -1500px 0 var(--page-background-color), - 1500px 0.75px var(--separator-color), - -1500px 0.75px var(--separator-color), - 2000px 0 var(--page-background-color), - -2000px 0 var(--page-background-color), - 2000px 0.75px var(--separator-color), - -2000px 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 { @@ -961,7 +1046,7 @@ blockquote::after { blockquote p { margin: var(--spacing-small) 0 var(--spacing-medium) 0; } -.paramname { +.paramname, .paramname em { font-weight: 600; color: var(--primary-dark-color); } @@ -975,66 +1060,147 @@ table.params .paramname { font-family: var(--font-family-monospace); font-size: var(--code-font-size); padding-right: var(--spacing-small); + line-height: var(--table-line-height); } -.glow { - text-shadow: 0 0 15px var(--primary-light-color) !important; +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.toc { - z-index: 10; - position: relative; - background-color: var(--toc-background); - border: 1px solid var(--separator-color); - border-radius: var(--border-radius-medium); - box-shadow: var(--box-shadow); +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: var(--page-background-color); + box-shadow: none; + position: sticky; + top: var(--toc-sticky-top); padding: 0 var(--spacing-large); - margin: 0 0 var(--spacing-medium) var(--spacing-medium); + 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; + margin: var(--spacing-large) 0 var(--spacing-medium) 0; } div.toc li { - font-size: var(--navigation-font-size); padding: 0; background: none; + line-height: var(--toc-font-size); + margin: var(--toc-font-size) 0 0 0; } -div.toc li:before { - content: '↓'; - font-weight: 800; - font-family: var(--font-family); - margin-right: var(--spacing-small); - color: var(--toc-foreground); - opacity: .4; +div.toc li::before { + display: none; } -div.toc ul li.level1 { - margin: 0; +div.toc ul { + margin-top: 0 } -div.toc ul li.level2, div.toc ul li.level3 { - 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; +} -@media screen and (max-width: 767px) { - div.toc { +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; } } @@ -1053,7 +1219,6 @@ code { background: var(--code-background); color: var(--code-foreground); padding: 2px 6px; - word-break: break-word; } div.fragment, pre.fragment { @@ -1074,9 +1239,13 @@ div.fragment, pre.fragment { .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 > .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; @@ -1166,8 +1335,18 @@ div.fragment span.lineno a { color: var(--fragment-link) !important; } -div.fragment .line:first-child .lineno { +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; } /* @@ -1178,7 +1357,7 @@ 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.todo, dl.remark { +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); @@ -1217,8 +1396,8 @@ dl.todo { color: var(--todo-color-darker); } -dl.todo dt { - color: var(--todo-color-dark); +dl.todo dt a { + color: var(--todo-color-dark) !important; } dl.bug dt a { @@ -1249,13 +1428,13 @@ dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd { margin-inline-start: 0px; } -dl.invariant, dl.pre { +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.invariant dt, dl.pre dt, dl.post dt { color: var(--invariant-color-dark); } @@ -1289,7 +1468,6 @@ div.memitem { div.memproto, h2.memtitle { background: var(--fragment-background); - text-shadow: none; } h2.memtitle { @@ -1365,6 +1543,7 @@ 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 { @@ -1372,6 +1551,7 @@ div.memproto div.memtemplate { color: var(--primary-dark-color); font-size: var(--memname-font-size); margin-left: 2px; + text-shadow: none; } table.mlabels, table.mlabels > tbody { @@ -1437,10 +1617,11 @@ dl.reflist dd { Table */ -.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { - display: inline-block; - max-width: 100%; - } +.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)); @@ -1448,75 +1629,147 @@ dl.reflist dd { max-width: calc(100% + 2 * var(--spacing-large)); } -table.markdownTable, table.fieldtable { +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 { +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 { +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 { +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 dt { - border: none; - border-right: 1px solid var(--separator-color); +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 dt:last-child { - border: none; +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, table.markdownTable tr { +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.markdownTable tr:last-child { +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); - border-bottom: 1px solid var(--separator-color); } -.fieldtable td.fieldtype, .fieldtable td.fieldname { +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); } -.fieldtable td.fielddoc { - border-bottom: 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: 0 0 15px var(--primary-light-color); + box-shadow: none; } table.memberdecls { display: block; + -webkit-tap-highlight-color: transparent; } table.memberdecls tr[class^='memitem'] { @@ -1528,6 +1781,7 @@ 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, @@ -1553,7 +1807,7 @@ table.memberdecls .memTemplParams { 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: 0; + padding-bottom: var(--spacing-small); } table.memberdecls .memTemplItemLeft { @@ -1565,6 +1819,7 @@ table.memberdecls .memTemplItemLeft { 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; } @@ -1589,6 +1844,11 @@ table.memberdecls .mdescLeft, table.memberdecls .mdescRight { 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); @@ -1603,10 +1863,41 @@ table.memberdecls .groupheader { table.memberdecls .inherit_header td { padding: 0 0 var(--spacing-medium) 0; text-indent: -12px; - line-height: 1.5em; 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, @@ -1623,6 +1914,7 @@ table.memberdecls .inherit_header td { border-right: none; border-left: none; border-radius: 0; + white-space: normal; } table.memberdecls .memItemLeft, @@ -1637,7 +1929,7 @@ table.memberdecls .inherit_header td { } table.memberdecls .mdescLeft { - margin-top: calc(0px - var(--page-font-size)); + margin-bottom: calc(0px - var(--page-font-size)); } table.memberdecls .memItemRight, @@ -1696,14 +1988,16 @@ hr { } .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); + box-shadow: 100px 0 var(--separator-color), + -100px 0 var(--separator-color), + 500px 0 var(--separator-color), + -500px 0 var(--separator-color), + 900px 0 var(--separator-color), + -900px 0 var(--separator-color), + 1400px 0 var(--separator-color), + -1400px 0 var(--separator-color), + 1900px 0 var(--separator-color), + -1900px 0 var(--separator-color); } .contents img, .contents .center, .contents center, .contents div.image object { @@ -1735,8 +2029,25 @@ table.directory { width: 100%; } -table.directory td.entry { - padding: var(--spacing-small); +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 { @@ -1747,6 +2058,10 @@ table.directory tr.even { background-color: var(--odd-color); } +table.directory tr.odd { + background-color: transparent; +} + .icona { width: auto; height: auto; @@ -1755,14 +2070,20 @@ table.directory tr.even { .icon { background: var(--primary-color); - width: 18px; - height: 18px; - line-height: 18px; + 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 { @@ -1795,6 +2116,10 @@ html.dark-mode .iconfopen, html.dark-mode .iconfclosed { border-radius: var(--border-radius-small); } +.classindex dl.even { + background-color: transparent; +} + /* Class Index Doxygen 1.8 */ @@ -1919,7 +2244,11 @@ 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)::-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)); } @@ -1930,7 +2259,10 @@ 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)::-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)); @@ -1943,7 +2275,10 @@ 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):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); } @@ -1953,7 +2288,10 @@ 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)::-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; } @@ -1967,11 +2305,18 @@ pre.fragment, div.memproto, .contents center, .contents .center, -.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { +.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 */ @@ -1982,7 +2327,10 @@ pre.fragment, div.memproto, .contents center, .contents .center, -.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc, +.contents .dotgraph, +.contents .tabs-overview-container { scrollbar-width: thin; } @@ -2011,7 +2359,7 @@ doxygen-awesome-dark-mode-toggle { } doxygen-awesome-dark-mode-toggle > svg { - transition: transform .1s ease-in-out; + transition: transform var(--animation-duration) ease-in-out; } doxygen-awesome-dark-mode-toggle:active > svg { @@ -2096,7 +2444,7 @@ a.anchorlink { text-decoration: none; opacity: .15; display: none; - transition: opacity .1s ease-in-out, color .1s ease-in-out; + transition: opacity var(--animation-duration) ease-in-out, color var(--animation-duration) ease-in-out; } a.anchorlink svg { @@ -2115,3 +2463,215 @@ a.anchorlink:hover { 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 > ul > li { + display: none; +} + +.tabbed > ul > li.selected { + display: block; +} + +.tabs-overview-container { + overflow-x: auto; + display: block; + overflow-y: visible; +} + +.tabs-overview { + border-bottom: 1px solid var(--separator-color); + display: flex; + flex-direction: row; +} + +@media screen and (max-width: 767px) { + .tabs-overview-container { + margin: 0 calc(0px - var(--spacing-large)); + } + .tabs-overview { + padding: 0 var(--spacing-large) + } +} + +.tabs-overview button.tab-button { + color: var(--page-foreground-color); + margin: 0; + border: none; + background: transparent; + padding: calc(var(--spacing-large) / 2) 0; + display: inline-block; + font-size: var(--page-font-size); + cursor: pointer; + box-shadow: 0 1px 0 0 var(--separator-color); + position: relative; + + -webkit-tap-highlight-color: transparent; +} + +.tabs-overview button.tab-button .tab-title::before { + display: block; + content: attr(title); + font-weight: 600; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.tabs-overview button.tab-button .tab-title { + float: left; + white-space: nowrap; + font-weight: normal; + padding: calc(var(--spacing-large) / 2) var(--spacing-large); + border-radius: var(--border-radius-medium); + transition: background-color var(--animation-duration) ease-in-out, font-weight var(--animation-duration) ease-in-out; +} + +.tabs-overview button.tab-button:not(:last-child) .tab-title { + box-shadow: 8px 0 0 -7px var(--separator-color); +} + +.tabs-overview button.tab-button:hover .tab-title { + background: var(--separator-color); + box-shadow: none; +} + +.tabs-overview button.tab-button.active .tab-title { + font-weight: 600; +} + +.tabs-overview button.tab-button::after { + content: ''; + display: block; + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 0; + width: 0%; + margin: 0 auto; + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + background-color: var(--primary-color); + transition: width var(--animation-duration) ease-in-out, height var(--animation-duration) ease-in-out; +} + +.tabs-overview button.tab-button.active::after { + width: 100%; + box-sizing: border-box; + height: 3px; +} + + +/* + Navigation Buttons +*/ + +.section_buttons:not(:empty) { + margin-top: calc(var(--spacing-large) * 3); +} + +.section_buttons table.markdownTable { + display: block; + width: 100%; +} + +.section_buttons table.markdownTable tbody { + display: table !important; + width: 100%; + box-shadow: none; + border-spacing: 10px; +} + +.section_buttons table.markdownTable td { + padding: 0; +} + +.section_buttons table.markdownTable th { + display: none; +} + +.section_buttons table.markdownTable tr.markdownTableHead { + border: none; +} + +.section_buttons tr th, .section_buttons tr td { + background: none; + border: none; + padding: var(--spacing-large) 0 var(--spacing-small); +} + +.section_buttons a { + display: inline-block; + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + color: var(--page-secondary-foreground-color) !important; + text-decoration: none; + transition: color var(--animation-duration) ease-in-out, background-color var(--animation-duration) ease-in-out; +} + +.section_buttons a:hover { + color: var(--page-foreground-color) !important; + background-color: var(--odd-color); +} + +.section_buttons tr td.markdownTableBodyLeft a { + padding: var(--spacing-medium) var(--spacing-large) var(--spacing-medium) calc(var(--spacing-large) / 2); +} + +.section_buttons tr td.markdownTableBodyRight a { + padding: var(--spacing-medium) calc(var(--spacing-large) / 2) var(--spacing-medium) var(--spacing-large); +} + +.section_buttons tr td.markdownTableBodyLeft a::before, +.section_buttons tr td.markdownTableBodyRight a::after { + color: var(--page-secondary-foreground-color) !important; + display: inline-block; + transition: color .08s ease-in-out, transform .09s ease-in-out; +} + +.section_buttons tr td.markdownTableBodyLeft a::before { + content: '〈'; + padding-right: var(--spacing-large); +} + + +.section_buttons tr td.markdownTableBodyRight a::after { + content: '〉'; + padding-left: var(--spacing-large); +} + + +.section_buttons tr td.markdownTableBodyLeft a:hover::before { + color: var(--page-foreground-color) !important; + transform: translateX(-3px); +} + +.section_buttons tr td.markdownTableBodyRight a:hover::after { + color: var(--page-foreground-color) !important; + transform: translateX(3px); +} + +@media screen and (max-width: 450px) { + .section_buttons a { + width: 100%; + box-sizing: border-box; + } + + .section_buttons tr td:nth-of-type(1).markdownTableBodyLeft a { + border-radius: var(--border-radius-medium) 0 0 var(--border-radius-medium); + border-right: none; + } + + .section_buttons tr td:nth-of-type(2).markdownTableBodyRight a { + border-radius: 0 var(--border-radius-medium) var(--border-radius-medium) 0; + } +} diff --git a/Docs/doxygen-awesome-css/doxygen-custom/custom.css b/Docs/doxygen-awesome-css/doxygen-custom/custom.css index afec9743..ad6f35a5 100644 --- a/Docs/doxygen-awesome-css/doxygen-custom/custom.css +++ b/Docs/doxygen-awesome-css/doxygen-custom/custom.css @@ -25,54 +25,33 @@ text-decoration: none; } -.next_section_button { - display: block; - padding: var(--spacing-large) 0 var(--spacing-small) 0; - color: var(--page-background-color); - user-select: none; +.alter-theme-button:hover { + background: var(--primary-dark-color); } -.next_section_button::after { - /* clearfix */ - content: ""; - clear: both; - display: table; +html.dark-mode .darkmode_inverted_image img, /* < doxygen 1.9.3 */ +html.dark-mode .darkmode_inverted_image object[type="image/svg+xml"] /* doxygen 1.9.3 */ { + filter: brightness(89%) hue-rotate(180deg) invert(); } -.next_section_button a { - overflow: hidden; - float: right; +.bordered_image { + border-radius: var(--border-radius-small); border: 1px solid var(--separator-color); - padding: var(--spacing-medium) calc(var(--spacing-large) / 2) var(--spacing-medium) var(--spacing-large); - border-radius: var(--border-radius-medium); - color: var(--page-secondary-foreground-color) !important; - text-decoration: none; - background-color: var(--page-background-color); - transition: color .08s ease-in-out, background-color .1s ease-in-out; -} - -.next_section_button a:hover { - color: var(--page-foreground-color) !important; - background-color: var(--odd-color); -} - -.next_section_button a::after { - content: '〉'; - color: var(--page-secondary-foreground-color) !important; - padding-left: var(--spacing-large); display: inline-block; - transition: color .08s ease-in-out, transform .09s ease-in-out; + overflow: hidden; } -.next_section_button a:hover::after { - color: var(--page-foreground-color) !important; - transform: translateX(3px); +html.dark-mode .bordered_image img, /* < doxygen 1.9.3 */ +html.dark-mode .bordered_image object[type="image/svg+xml"] /* doxygen 1.9.3 */ { + border-radius: var(--border-radius-small); } -.alter-theme-button:hover { - background: var(--primary-dark-color); +.title_screenshot { + filter: drop-shadow(0px 3px 10px rgba(0,0,0,0.22)); + max-width: 500px; + margin: var(--spacing-large) 0; } -html.dark-mode #variants_image img { - filter: brightness(87%) hue-rotate(180deg) invert(); -} \ No newline at end of file +.title_screenshot .caption { + display: none; +} diff --git a/Docs/doxygen-awesome-css/doxygen-custom/header.html b/Docs/doxygen-awesome-css/doxygen-custom/header.html index 086715d0..5e6124c0 100644 --- a/Docs/doxygen-awesome-css/doxygen-custom/header.html +++ b/Docs/doxygen-awesome-css/doxygen-custom/header.html @@ -28,11 +28,15 @@ + + $treeview $search @@ -43,7 +47,7 @@ -
+ diff --git a/Docs/doxygen-awesome-css/img/testimage.png b/Docs/doxygen-awesome-css/img/testimage.png new file mode 100644 index 0000000000000000000000000000000000000000..3f495a5033a1600a7874dbb73d12d488bd7af184 GIT binary patch literal 4792 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 literal 0 HcmV?d00001 diff --git a/Docs/doxygen-awesome-css/img/theme-variants-base.drawio.svg b/Docs/doxygen-awesome-css/img/theme-variants-base.drawio.svg new file mode 100644 index 00000000..f6dda1d2 --- /dev/null +++ b/Docs/doxygen-awesome-css/img/theme-variants-base.drawio.svg @@ -0,0 +1,117 @@ + + + + + + + + +
+
+
+ Content +
+
+
+
+ + Content + +
+
+ + + + +
+
+
+ Titlebar (Navigation + Search) +
+
+
+
+ + Titlebar (Navigation + Search) + +
+
+ + + + +
+
+
+ Sidebar (Navigation) +
+
+
+
+ + Sidebar (Navigation) + +
+
+ + + + +
+
+
+ Footer (Breadcrumbs) +
+
+
+
+ + Footer (Breadcrumbs) + +
+
+ + + + +
+
+
+ Search +
+
+
+
+ + Search + +
+
+ + + +
+
+
+ + Title + +
+
+
+
+ + Tit... + +
+
+
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/Docs/doxygen-awesome-css/img/theme-variants-sidebar-only.drawio.svg b/Docs/doxygen-awesome-css/img/theme-variants-sidebar-only.drawio.svg new file mode 100644 index 00000000..b1a9fe27 --- /dev/null +++ b/Docs/doxygen-awesome-css/img/theme-variants-sidebar-only.drawio.svg @@ -0,0 +1,102 @@ + + + + + + + + +
+
+
+ Content +
+
+
+
+ + Content + +
+
+ + + + +
+
+
+ Sidebar +
+ (Title + Navigation) +
+
+
+
+ + Sidebar... + +
+
+ + + + +
+
+
+ Footer (Breadcrumbs) +
+
+
+
+ + Footer (Breadcrumbs) + +
+
+ + + + +
+
+
+ Search +
+
+
+
+ + Search + +
+
+ + + +
+
+
+ + Title + +
+
+
+
+ + Tit... + +
+
+
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/Docs/doxygen-awesome-css/img/theme-variants.drawio.svg b/Docs/doxygen-awesome-css/img/theme-variants.drawio.svg deleted file mode 100644 index a8682ddb..00000000 --- a/Docs/doxygen-awesome-css/img/theme-variants.drawio.svg +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - -
-
-
- 1. Base Theme -
-
-
-
- - 1. Base Theme - -
-
- - - - -
-
-
- 2. Sidebar-Only Theme -
-
-
-
- - 2. Sidebar-Only Theme - -
-
- - - - - -
-
-
- Content -
-
-
-
- - Content - -
-
- - - - -
-
-
- Sidebar -
- (Title + Navigation) -
-
-
-
- - Sidebar... - -
-
- - - - -
-
-
- Footer (Breadcrumps) -
-
-
-
- - Footer (Breadcrumps) - -
-
- - - - -
-
-
- Search -
-
-
-
- - Search - -
-
- - - -
-
-
- - Title - -
-
-
-
- - Tit... - -
-
- - - - - -
-
-
- Content -
-
-
-
- - Content - -
-
- - - - -
-
-
- Titlebar (Navigation + Search) -
-
-
-
- - Titlebar (Navigation + Search) - -
-
- - - - -
-
-
- Sidebar (Navigation) -
-
-
-
- - Sidebar (Navigation) - -
-
- - - - -
-
-
- Footer (Breadcrumps) -
-
-
-
- - Footer (Breadcrumps) - -
-
- - - - -
-
-
- Search -
-
-
-
- - Search - -
-
- - - -
-
-
- - Title - -
-
-
-
- - Tit... - -
-
-
- - - - - Viewer does not support full SVG 1.1 - - - -
\ No newline at end of file diff --git a/Docs/doxygen-awesome-css/include/MyLibrary/example.hpp b/Docs/doxygen-awesome-css/include/MyLibrary/example.hpp index 78241bf6..4662d80d 100644 --- a/Docs/doxygen-awesome-css/include/MyLibrary/example.hpp +++ b/Docs/doxygen-awesome-css/include/MyLibrary/example.hpp @@ -26,12 +26,66 @@ class Example { * * ## Tables * - * The table content is scrollable if the table gets too wide. + *
+ * + * - Basic + * This theme supports normal markdown tables:
+ * | Item | Title | Description | More | + * |-----:|-------|-----------------------|--------------------------------------------| + * | 1 | Foo | A placeholder | Some lorem ipsum to make this table wider. | + * | 2 | Bar | Also a placeholder | More lorem ipsum. | + * | 3 | Baz | The third placeholder | More lorem ipsum. | + * - Centered + *
+ * A table can be centered with the `
` html tag:
+ * | Item | Title | Description | More | + * |-----:|-------|-----------------------|--------------------------------------------| + * | 1 | Foo | A placeholder | Some lorem ipsum to make this table wider. | + * | 2 | Bar | Also a placeholder | More lorem ipsum. | + * | 3 | Baz | The third placeholder | More lorem ipsum. | + *
+ * - Stretched + * A table wrapped in `
` fills the full page width. + *
+ * | Item | Title | Description | More | + * |-----:|-------|-----------------------|--------------------------------------------| + * | 1 | Foo | A placeholder | Some lorem ipsum to make this table wider. | + * | 2 | Bar | Also a placeholder | More lorem ipsum. | + * | 3 | Baz | The third placeholder | More lorem ipsum. | + *
+ * **Caution**: This will break the overflow scrolling support! + * - Complex + * Complex [Doxygen tables](https://www.doxygen.nl/manual/tables.html) are also supported as seen in @ref multi_row "this example":
+ * + * + *
Complex table
Column 1 Column 2 Column 3 + *
cell row=1+2,col=1cell row=1,col=2cell row=1,col=3 + *
cell row=2+3,col=2 cell row=2,col=3 + *
cell row=3,col=1 cell row=3,col=3 + *
+ * - Overflow Scrolling The table content is scrollable if the table gets too wide.
+ * | first_column | second_column | third_column | fourth_column | fifth_column | sixth_column | seventh_column | eighth_column | ninth_column | + * |--------------|---------------|--------------|---------------|--------------|--------------|----------------|---------------|--------------| + * | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | + * - ImagesA table can contain images:
+ * | Column 1 | Column 2 | + * |---------------------------|-------------------------------------------------| + * | ![doxygen](testimage.png) | ← the image should not be inverted in dark-mode | * - * | first_column | second_column | third_column | fourth_column | fifth_column | sixth_column | seventh_column | eighth_column | ninth_column | - * |--------------|---------------|--------------|---------------|--------------|--------------|----------------|---------------|--------------| - * | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | * + *
+ * + * ## Diagrams + * + * Graphviz diagrams support dark mode and can be scrolled once they get too wide: + * + * \dot Graphviz with a caption + * digraph example { + * node [fontsize="12"]; + * rankdir="LR" + * a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k; + * } + * \enddot * * ## Lists * @@ -56,7 +110,7 @@ class Example { * ## Code block * * ```cpp - * auto x = "code within md fences (```)"; + * auto x = "code within md fences"; * ``` * * @code{.cpp} @@ -65,7 +119,6 @@ class Example { * auto example = std::make_shared(5); * example->test("test"); * } - * * @endcode * * // code within indented code block @@ -92,6 +145,8 @@ class Example { * * @pre This is a precondition * + * @post This is a postcondition + * * @todo This theme is never finished! * * @remark This is awesome! @@ -106,5 +161,9 @@ class Example { }; +class SecondExample { + std::string foo(); +} + } diff --git a/Docs/doxygen-awesome-css/include/MyLibrary/subclass-example.hpp b/Docs/doxygen-awesome-css/include/MyLibrary/subclass-example.hpp index f1438a4f..1e6ae36e 100644 --- a/Docs/doxygen-awesome-css/include/MyLibrary/subclass-example.hpp +++ b/Docs/doxygen-awesome-css/include/MyLibrary/subclass-example.hpp @@ -8,6 +8,7 @@ namespace MyLibrary { /** * @brief some subclass */ + template class SubclassExample : public Example { public: @@ -18,13 +19,22 @@ namespace MyLibrary { int virtualfunc() override; /** - * @brief Extra long function with lots of parameters + * @brief Template function function + */ + template + std::shared_ptr function_template_test(std::shared_ptr& param); + + /** + * @brief Extra long function with lots of parameters and many template types. + * + * Also has a long return type. + * * @param param1 first parameter * @param param2 second parameter * @param parameter3 third parameter */ - template - std::shared_ptr long_function_with_many_parameters(std::shared_ptr& param1, std::shared_ptr& param2, bool parameter3) { + template + std::pair long_function_with_many_parameters(std::shared_ptr& param1, std::shared_ptr& param2, bool parameter3, Alice paramater4 Bob parameter 5) { if(true) { std::cout << "this even has some code." << std::endl; } diff --git a/Docs/doxygen-awesome-css/package.json b/Docs/doxygen-awesome-css/package.json new file mode 100644 index 00000000..a2532f7d --- /dev/null +++ b/Docs/doxygen-awesome-css/package.json @@ -0,0 +1,34 @@ +{ + "name": "@jothepro/doxygen-awesome-css", + "version": "2.3.3", + "description": "Custom CSS theme for doxygen html-documentation with lots of customization parameters.", + "main": "", + "scripts": { + "npm-pack": "npm pack", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/jothepro/doxygen-awesome-css.git" + }, + "homepage": "https://jothepro.github.io/doxygen-awesome-css/", + "bugs": { + "url": "https://github.com/jothepro/doxygen-awesome-css/issues" + }, + "keywords": [ + "doxygen", + "css", + "theme", + "awesome" + ], + "author": { + "name": "jothepro", + "url": "https://github.com/jothepro", + "git": "https://github.com/jothepro/doxygen-awesome-css" + }, + "license": "MIT", + "config": {}, + "dependencies": {}, + "devDependencies": {}, + "xpack": {} +}