Configuration Reference
Supa Maven Skin is configured inside the <custom><supaSkin>...</supaSkin></custom> element of your src/site/site.xml descriptor (legacy <furoSkin> is also supported). All settings are optional and have sensible defaults matching Sphinx Furo.
[!TIP] Accessible Color Schemes & Custom Brand Colors Choose from 6 built-in WCAG 2.2 AA & AAA accessible color schemes via
<colorScheme>, and layer custom brand tokens on top of any scheme using<lightCssVariables>and<darkCssVariables>.
Interactive Accessible Color Scheme Preview
Click any color scheme card below (or use the palette selector in the top header bar) to live-preview this documentation site across all 6 built-in palettes and Light/Dark/Auto polarities:
Full site.xml Example
<custom>
<supaSkin>
<!-- Theme Polarity & Accessible Color Scheme -->
<defaultTheme>auto</defaultTheme>
<colorScheme>furo</colorScheme>
<colorSchemeSelector>true</colorSchemeSelector>
<sidebarHideName>false</sidebarHideName>
<sidebarBrandAlign>center</sidebarBrandAlign>
<lightLogo>images/logo-light.svg</lightLogo>
<darkLogo>images/logo-dark.svg</darkLogo>
<announcement>Version 1.0 is now available!</announcement>
<!-- Source Repository Links -->
<sourceRepository>https://github.com/mepcotterell/supa-maven-skin</sourceRepository>
<sourceBranch>main</sourceBranch>
<sourceDirectory>src/site</sourceDirectory>
<sourceViewButton>true</sourceViewButton>
<sourceEditButton>true</sourceEditButton>
<!-- Layout, Drawers & Navigation -->
<breadcrumb>true</breadcrumb>
<stickyContentHeader>false</stickyContentHeader>
<tocSidebar>true</tocSidebar>
<tocTitle>On this page</tocTitle>
<tocMaxDepth>4</tocMaxDepth>
<prevNextButtons>true</prevNextButtons>
<sidebarCollapseDepth>1</sidebarCollapseDepth>
<drawerScroll>false</drawerScroll>
<drawerBackdrop>true</drawerBackdrop>
<sidebarDrawerScroll>false</sidebarDrawerScroll>
<sidebarDrawerBackdrop>true</sidebarDrawerBackdrop>
<tocDrawerScroll>false</tocDrawerScroll>
<tocDrawerBackdrop>true</tocDrawerBackdrop>
<footerTimestamp>true</footerTimestamp>
<footerVersion>true</footerVersion>
<!-- Language & Labels (see "Labels" below; a label left out stays English) -->
<language>en</language>
<labels>
<searchPlaceholder>Search the guides...</searchPlaceholder>
</labels>
<!-- Footer Icon Links -->
<navIcons>
<icon>
<href>https://github.com/mepcotterell/supa-maven-skin</href>
<title>GitHub Repository</title>
<html><![CDATA[<i class="bi bi-github" aria-hidden="true"></i>]]></html>
</icon>
</navIcons>
<!-- Interactive Enhancements -->
<copyCodeButton>true</copyCodeButton>
<syntaxHighlighting>true</syntaxHighlighting>
<headingPermalinks>true</headingPermalinks>
<headingPermalinkSymbol>#</headingPermalinkSymbol>
<search>true</search>
<mermaid>auto</mermaid>
<katex>auto</katex>
<!-- Leave <mermaidCdnUrl>, <katexCssCdnUrl>, and <katexJsCdnUrl> unset to use the
pinned, SRI-verified jsDelivr defaults (see "Self-Hosting Mermaid & KaTeX"
in the Authoring Guide). -->
<!-- Custom Light/Dark CSS Tokens (layered on top of <colorScheme>) -->
<lightCssVariables>
<color-brand-primary>#1d50d8</color-brand-primary>
<color-brand-content>#1d50d8</color-brand-content>
</lightCssVariables>
<darkCssVariables>
<color-brand-primary>#589bf7</color-brand-primary>
<color-brand-content>#6ba6ff</color-brand-content>
</darkCssVariables>
</supaSkin>
</custom>
Configuration Options
All <supaSkin> options are grouped below by functional area.
Theme & Branding
Controls the initial Light/Dark polarity, accessible color scheme preset, and left-sidebar brand header (.supa-sidebar-brand).
| Option | Default | Description |
|---|---|---|
<defaultTheme> |
auto |
Initial light/dark polarity before user selection (auto, light, or dark). |
<colorScheme> |
furo |
Default accessible color scheme preset (furo, bootstrap, modus, modus-tinted, modus-deuteranopia, or modus-tritanopia). |
<colorSchemeSelector> |
true |
Render the accessible color scheme selector: a menu in the content header utility bar (lg+) and the mobile header (768px–1023px), and a native <select> in the sidebar drawer's Appearance footer (below lg). The menu trigger shows the active scheme's name, such as Furo (AA) (the configured <colorScheme> until a reader picks another), and its accessible name and tooltip are Color scheme: Furo (AA), so voice-control users can say what they see (WCAG 2.5.3 Label in Name). |
<sidebarBrandAlign> |
center |
Horizontal alignment of the sidebar brand logo, project title, and version badge (center, left / start, or right / end). |
<sidebarHideName> |
false |
Hide the project name text under the logo in the left sidebar. |
<lightLogo> |
(empty) | Relative path or URL to the logo shown when the resolved theme is light. |
<darkLogo> |
(empty) | Relative path or URL to the logo shown when the resolved theme is dark. |
Source Repository
Configures the “View page source” and “Edit this page” action buttons in the top content header bar.
| Option | Default | Description |
|---|---|---|
<sourceRepository> |
(empty) | GitHub, GitLab, or Gitea repository URL used to build page source links. |
<sourceBranch> |
main |
Git branch name used when constructing source view and edit URLs. |
<sourceDirectory> |
src/site |
Relative path to the Maven site directory inside the repository. |
<sourceViewButton> |
true |
Show the “View page source” icon button when <sourceRepository> is configured. |
<sourceEditButton> |
true |
Show the “Edit this page” icon button when <sourceRepository> is configured. |
Layout & Navigation
Configures the top announcement banner, breadcrumbs, left sidebar menu tree, right-hand ScrollSpy table of contents, and bottom page navigation cards.
| Option | Default | Description |
|---|---|---|
<announcement> |
(empty) | Top announcement banner HTML rendered above the page header. |
<breadcrumb> |
true |
Render the breadcrumb navigation trail in the top content utility bar. |
<stickyContentHeader> |
false |
Pin the top content utility bar (breadcrumbs, source links, palette picker, theme toggle) to the top of the viewport on lg+ (1024px) screens. Adds .supa-sticky-content-header to <body>; heading anchors and ScrollSpy offset by --supa-content-header-height. Below lg, the mobile header is already sticky. |
<sidebarCollapseDepth> |
1 |
Menu nesting depth expanded by default in the left sidebar (<details open>). |
<tocSidebar> |
true |
Enable the right-hand “On this page” table of contents column and right drawer (#supaTocDrawer). |
<tocTitle> |
On this page |
Heading label for the right-hand table of contents. Also names the TOC landmark (<aside>) and its <nav> for screen readers. A shorthand for the tocTitle label: when both are set, <labels><tocTitle> wins. The TOC drawer buttons are named by the separate tocToggle label, so a translated site sets that too. |
<tocMaxDepth> |
4 |
Maximum heading level (2–6) included in the right-hand TOC. |
<prevNextButtons> |
true |
Render Furo-styled Previous / Next page navigation cards at the bottom of articles. |
Language & Labels
Sets the page language and replaces the English text of the skin's own interface. Supa Maven Skin ships no translations: a site supplies its own text for any label it wants to change, and every other label stays English.
| Option | Default | Description |
|---|---|---|
<language> |
(empty) | Language of the site's pages as a BCP 47 tag (de, pt-BR; the Java form pt_BR is accepted and written as pt-BR), written to <html lang>. It applies only to pages Maven renders without a locale: when <locales> lists a language (<locales>default,fr</locales> renders French under /fr/), that locale names the language of its pages and <language> is ignored. With neither, lang is en. A value that is not shaped like a language tag (a 2- or 3-letter language, then --separated subtags of up to 8 letters or digits; de DE is not) is ignored, and lang is en. |
<labels> |
(empty) | One child element per label to override, named by its key: <labels><search>Suche</search></labels>. Values are plain text, always HTML-escaped: an escaped character such as < or text in a CDATA section shows as typed. An element inside a label, such as <b>, makes the skin ignore that label: it keeps the English text and the browser console names the key. An empty element keeps the English label too. A key the skin does not know, such as a misspelled <serchPlaceholder>, changes nothing and is reported in one browser-console warning. |
Labels
Each key below is a <labels> child element. {name} placeholders are filled in by the skin, and a translation can move them anywhere in its sentence: the links in the footer and the date stay the skin's own, so a site translates only the words around them. The color-scheme names never carry their WCAG level: the skin always appends (AA) or (AAA), which a site cannot change because the build audits it. Each control has one label, used for both its tooltip and its accessible name, so the name always contains the text a reader sees (WCAG 2.5.3 Label in Name).
The Set by column tells where a label is written: template labels are in the HTML Maven renders; script labels are added in the browser, where an overridden value reaches the scripts as a data-supa-label-<key> attribute on <body>, with the key in kebab case (searchNoResults becomes data-supa-label-search-no-results); both labels are rendered first and then rewritten by the scripts.
Page Chrome & Navigation
| Key | English default | Placeholders | Where it shows | Set by |
|---|---|---|---|---|
skipToContent |
Skip to content |
Skip link, the first stop of the keyboard tab order. | template | |
announcementRegion |
Announcement |
Accessible name of the <announcement> banner region. |
template | |
brandFallback |
Documentation |
Sidebar and mobile-header brand text when neither site.xml nor pom.xml names the site. |
template | |
logoAlt |
Logo |
Alternative text of a single <lightLogo>, and of a <bannerLeft> image without a name. |
template | |
logoLightAlt |
Light Logo |
Alternative text of <lightLogo> when <darkLogo> is also set. |
template | |
logoDarkAlt |
Dark Logo |
Alternative text of <darkLogo>. |
template | |
navSidebarToggle |
Toggle navigation sidebar |
Mobile-header button that opens the navigation drawer (tooltip and name). | template | |
navDrawerTitle |
Navigation |
Title of the navigation drawer below lg. |
template | |
navDrawerClose |
Close navigation |
Close button of the navigation drawer. | template | |
navPrimary |
Primary navigation |
Accessible name of the left sidebar landmark. | template | |
navSite |
Site navigation |
Accessible name of the sidebar menu tree. | template | |
navSectionToggle |
{name} section |
{name}: the menu item's name |
Expand/collapse toggle of a linked sidebar menu item with children. | template |
navAppearance |
Appearance |
Heading of the theme and color-scheme controls in the navigation drawer. | template | |
breadcrumb |
Breadcrumb |
Accessible name of the breadcrumb trail. | template | |
breadcrumbHome |
Home |
First breadcrumb when neither site.xml nor pom.xml names the site. |
template | |
pageNav |
Page navigation |
Accessible name of the Previous / Next cards. | template | |
pagePrevious |
Previous |
Previous page card. | template | |
pageNext |
Next |
Next page card. | template | |
sourceView |
View page source |
Source button in the content header (tooltip and name). | template | |
sourceEdit |
Edit this page |
Edit button in the content header (tooltip and name). | template | |
backToTop |
Back to top |
Floating back-to-top button (visible text, tooltip, and name). | script |
Table of Contents & Permalinks
| Key | English default | Placeholders | Where it shows | Set by |
|---|---|---|---|---|
tocTitle |
On this page |
TOC heading, drawer title, and the names of the TOC landmark and its <nav>. Also settable with <tocTitle>. |
template | |
tocToggle |
Toggle table of contents |
Buttons that open the TOC drawer below xl (tooltip and name). |
template | |
tocDrawerClose |
Close table of contents |
Close button of the TOC drawer. | template | |
permalink |
Permalink to {heading} |
{heading}: the heading's text |
Heading permalink anchors (tooltip and name). | script |
Search
| Key | English default | Placeholders | Where it shows | Set by |
|---|---|---|---|---|
search |
Search |
Sidebar search box (visible text, which is also its name). | template | |
searchButton |
Search documentation |
Mobile-header search button (tooltip and name) and the name of the search field. | template | |
searchPlaceholder |
Search documentation... |
Placeholder of the search field. | template | |
searchClose |
Close search |
Close button of the search dialog. | template | |
searchResults |
Search results |
Accessible name of the result list. | template | |
searchHint |
Type to search navigation, headings, and site pages. |
Search status before anything is typed. | both | |
searchResultCount |
Results: {count} |
{count}: the number of results |
Search status when results are found. | script |
searchNoResults |
No results for “{query}” |
{query}: the search text |
Search status when nothing matches. | script |
searchKeysNavigate |
{keys} to navigate |
{keys}: the arrow keys |
Keyboard hint in the search dialog footer. | template |
searchKeysSelect |
{keys} to select |
{keys}: the Enter key |
Keyboard hint in the search dialog footer. | template |
searchKeysClose |
{keys} to close |
{keys}: the Esc key |
Keyboard hint in the search dialog footer. | template |
searchBadgePage |
Page |
Badge of a result that is a whole page. | script | |
searchBadgeNav |
Nav |
Badge of a result from the sidebar menu. | script | |
searchBadgeSection |
Section |
Badge of a result that is a heading. | script | |
searchSectionPage |
Site Page |
Section name of a page result the site does not name. | script | |
searchSectionCurrent |
Current Page |
Section name of a heading on a page without a title. | script | |
searchSectionNav |
Navigation |
Section name of a menu result outside a named menu. | script |
Theme & Color Scheme
| Key | English default | Placeholders | Where it shows | Set by |
|---|---|---|---|---|
themeTrigger |
Color theme: {mode} |
{mode}: themeLight, themeDark, or themeAuto; in the browser, Auto is followed by the theme in effect, as in Auto (Dark) |
Theme menu button (tooltip and name). | both |
themeMenu |
Color theme |
Accessible name of the theme menu. | template | |
themeLight |
Light |
Theme menu item, and {mode} of themeTrigger. |
both | |
themeDark |
Dark |
Theme menu item, and {mode} of themeTrigger. |
both | |
themeAuto |
Auto |
Theme menu item, and {mode} of themeTrigger. |
both | |
colorScheme |
Color scheme |
Accessible name of the color-scheme menu and of the drawer's color-scheme <select>. |
template | |
colorSchemeTrigger |
Color scheme: {name} |
{name}: the active scheme's name with its WCAG level, such as Furo (AA) |
Color-scheme menu button (tooltip and name; the button shows {name}). |
both |
colorSchemeStandard |
WCAG 2.2 AA Standard |
Group heading of the AA schemes in the menu and the <select>. |
template | |
colorSchemeHighContrast |
WCAG 2.2 AAA High Contrast |
Group heading of the AAA schemes in the menu and the <select>. |
template | |
colorSchemeFuro |
Furo |
Name of the furo scheme ((AA) is appended). |
both | |
colorSchemeBootstrap |
Bootstrap 6 |
Name of the bootstrap scheme ((AA) is appended). |
both | |
colorSchemeModus |
Modus |
Name of the modus scheme ((AAA) is appended). |
both | |
colorSchemeModusTinted |
Modus Tinted |
Name of the modus-tinted scheme ((AAA) is appended). |
both | |
colorSchemeModusDeuteranopia |
Modus Deuteranopia |
Name of the modus-deuteranopia scheme ((AAA) is appended). |
both | |
colorSchemeModusTritanopia |
Modus Tritanopia |
Name of the modus-tritanopia scheme ((AAA) is appended). |
both |
Footer
| Key | English default | Placeholders | Where it shows | Set by |
|---|---|---|---|---|
footerCopyright |
Copyright © {years} {organization}. |
{years}: <inceptionYear>–build year, or one year when they match or <inceptionYear> is unset; {organization}: the pom.xml organization, linked when it has a URL |
Copyright line, unless site.xml has its own <footer>. An empty placeholder is removed with the space before it. |
template |
footerBuiltWith |
Built with {maven} and {skin} (Bootstrap 6). |
{maven}: a link to Maven Site; {skin}: a link to Supa Maven Skin |
Credit line. | template |
footerLastUpdated |
Last updated on {date}. |
{date}: the build date as yyyy-MM-dd |
Date line, shown with <footerTimestamp>. |
template |
Code, Copy & Content
These labels are the defaults authors see in their own content: they apply only where the content does not set its own text, such as an admonition without a custom title.
| Key | English default | Placeholders | Where it shows | Set by |
|---|---|---|---|---|
copyCode |
Copy code |
Copy button on code blocks (tooltip and name). | script | |
copyCopied |
Copied! |
Copy button and heading permalink after a successful copy. | script | |
copyFailed |
Copy failed |
Copy button after a failed copy. | script | |
codeShow |
Show code |
Code toggle of a .supa-component-preview example while its code is hidden. |
script | |
codeHide |
Hide code |
Code toggle of a .supa-component-preview example while its code is shown. |
script | |
alertDismiss |
Close |
Dismiss button of a > [!ALERT:theme dismissible] alert and of #bsAlert. |
both | |
tabFallback |
Tab {n} |
{n}: the tab's position, from 1 |
Tab of a .supa-tabs panel without data-tab, title, or a recognized code fence. |
script |
accordionFallback |
Section {n} |
{n}: the item's position, from 1 |
Header of a .supa-accordion item without data-accordion or title. |
script |
admonition |
Admonition |
Default title of > [!ADMONITION]. |
script | |
admonitionAttention |
Attention |
Default title of > [!ATTENTION]. |
script | |
admonitionCaution |
Caution |
Default title of > [!CAUTION]. |
script | |
admonitionDanger |
Danger |
Default title of > [!DANGER]. |
script | |
admonitionError |
Error |
Default title of > [!ERROR]. |
script | |
admonitionHint |
Hint |
Default title of > [!HINT]. |
script | |
admonitionImportant |
Important |
Default title of > [!IMPORTANT]. |
script | |
admonitionNote |
Note |
Default title of > [!NOTE]. |
script | |
admonitionSeeAlso |
See also |
Default title of > [!SEEALSO]. |
script | |
admonitionTip |
Tip |
Default title of > [!TIP]. |
script | |
admonitionTodo |
Todo |
Default title of > [!TODO]. |
script | |
admonitionWarning |
Warning |
Default title of > [!WARNING]. |
script |
Text that stays English: the text Bootstrap's own widgets write (a chip's “Remove” button, a Combobox's “{n} selected”, and the Datepicker's buttons; the Datepicker's month and day names follow <html lang> unless the widget sets its own data-bs-locale, and widgets with text options, such as a strength meter's messages or a nav overflow's moreText, take them in their own markup), the language names on code blocks, browser-console messages, and the menus and pages of Maven's own reports.
Responsive Drawers
Controls Bootstrap 6 off-canvas <dialog class="drawer"> behavior on tablet and mobile viewports (#supaSidebarDrawer below lg and #supaTocDrawer below xl).
| Option | Default | Description |
|---|---|---|
<drawerScroll> |
false |
Default data-bs-scroll (true or false) for both drawers, controlling whether <body> scrolling is enabled while a drawer is open (legacy alias: <drawerBodyScroll>). |
<drawerBackdrop> |
true |
Default data-bs-backdrop (true, false, or static) for both drawers, controlling whether a backdrop is rendered while a drawer is open. |
<sidebarDrawerScroll> |
$drawerScroll |
Override data-bs-scroll (true or false) specifically for the left navigation drawer (#supaSidebarDrawer; legacy alias: <sidebarDrawerBodyScroll>). |
<sidebarDrawerBackdrop> |
$drawerBackdrop |
Override data-bs-backdrop (true, false, or static) specifically for the left navigation drawer (#supaSidebarDrawer). |
<tocDrawerScroll> |
$drawerScroll |
Override data-bs-scroll (true or false) specifically for the right table of contents drawer (#supaTocDrawer; legacy alias: <tocDrawerBodyScroll>). |
<tocDrawerBackdrop> |
$drawerBackdrop |
Override data-bs-backdrop (true, false, or static) specifically for the right table of contents drawer (#supaTocDrawer). |
Footer & Links
Controls metadata and icon links in the page footer (.supa-footer) and version badge visibility.
| Option | Default | Description |
|---|---|---|
<footerTimestamp> |
true |
Display the build/publish date (Last updated on YYYY-MM-DD) in the page footer. |
<footerVersion> |
true |
Display the project version badge next to the project title in the sidebar. |
<navIcons> |
(empty) | List of <icon> elements (<href>, <title>, <html>) rendered as tooltip-enabled icon links on the right side of the page footer (.supa-footer-icons). Write a relative <href> from the site root (faq.html); the skin rewrites it for pages in subdirectories. URLs with a scheme and paths starting with / are used unchanged. |
Code, Search, Diagrams & Math
Configures client-side code block enhancements, heading permalinks, offline search, and lazy-loaded Mermaid / KaTeX rendering.
| Option | Default | Description |
|---|---|---|
<copyCodeButton> |
true |
Add a Copy-to-Clipboard button to all <pre> code blocks. |
<syntaxHighlighting> |
true |
Highlight <pre><code> blocks offline using bundled highlight.js. |
<headingPermalinks> |
true |
Append # permalink anchors to article headings (h2–h6). |
<headingPermalinkSymbol> |
# |
Symbol rendered inside heading permalink anchors. |
<search> |
true |
Enable the sidebar search box and / (⌘K / Ctrl+K) search dialog. |
<mermaid> |
auto |
Lazy-load Mermaid when .mermaid or code.language-mermaid is present (auto, true, or false). |
<mermaidCdnUrl> |
(pinned jsDelivr + SRI) | Custom or self-hosted Mermaid URL. Unset, the skin loads https://cdn.jsdelivr.net/npm/mermaid@11.17.2/dist/mermaid.min.js via <script integrity crossorigin="anonymous">. An ES module URL (ending in .mjs or /+esm, or on esm.sh) loads with import(); any other URL loads as a classic <script> that should define window.mermaid (see the note below for ES modules with other names). |
<katex> |
auto |
Lazy-load KaTeX when $...$ or $$...$$ math expressions are present (auto, true, or false). |
<katexCssCdnUrl> |
(pinned jsDelivr + SRI) | Custom or self-hosted KaTeX stylesheet URL. Unset, the skin loads https://cdn.jsdelivr.net/npm/katex@0.16.47/dist/katex.min.css with integrity and crossorigin="anonymous". |
<katexJsCdnUrl> |
(pinned jsDelivr + SRI) | Custom or self-hosted KaTeX auto-render URL. Unset, the skin loads katex.min.js then contrib/auto-render.min.js from https://cdn.jsdelivr.net/npm/katex@0.16.47/dist/, each with integrity. An ES module URL (such as auto-render.mjs) loads with import(); a classic auto-render(.min).js URL loads ../katex.min.js from its parent directory first (unless window.katex is already the KaTeX API). |
Integrity hashes apply only to the built-in defaults (or to an override that repeats a default URL exactly). Custom URLs load without integrity or crossorigin, so keeping them trustworthy is the consumer site's responsibility.
If a custom URL is an ES module under another name (for example a self-hosted mermaid.esm.js), the skin first runs it as a classic <script>, sees that no window.mermaid or window.renderMathInElement appeared, and then loads it again with import(). Rendering still works, but the browser logs a SyntaxError from the first attempt; rename the file to .mjs to load it as a module directly. The built-in defaults never take this fallback, so they only ever run with SRI.
Once the Mermaid and KaTeX loaders have settled, whether or not they succeeded, the skin sets data-supa-ready="true" on <html>. It also waits for the on-demand scripts of the Bootstrap 6 widgets on the page (such as a Datepicker or Combobox) to load and initialize. Scripts that post-process diagrams or math can wait for it; see Running Scripts After the Skin Initializes.
Self-Hosted URLs
To serve Mermaid and KaTeX from your own site, follow Self-Hosting Mermaid & KaTeX in the Authoring Guide. Give every override a root-relative path (such as /my-project/vendor/mermaid/mermaid.min.js) or an absolute https:// URL. Classic <script src> and <link href> URLs resolve against the current page, and .mjs URLs loaded with import() resolve against js/supa-maven-skin.min.js, so a document-relative value such as vendor/mermaid/mermaid.min.js breaks on pages in subdirectories. A self-hosted classic contrib/auto-render.min.js also loads ../katex.min.js, so keep KaTeX's dist/ layout.
Content Security Policy
Supa Maven Skin emits a static inline <script> in <head> to apply the reader's theme and color scheme before first paint. Allow it by adding this hash to your script-src directive alongside the site's own bundled scripts and widget chunks:
script-src 'self' 'sha256-bFi2dl1DG0ER3uQVQ+giyr3tAmby9eSQ/l78rYKMNRk=';
This is the script allowance, not a complete policy for every page's content. If your policy also declares script-src-elem, include the same allowances there because that directive takes precedence for <script> elements. The hash covers the exact script body, including leading and trailing whitespace, without the <script> tags. It is identical across pages and site configurations: <defaultTheme> and <colorScheme> are read from HTML attributes, not interpolated into the script. For unmodified generated HTML, the hash can change only when the skin version changes; check this reference when upgrading. HTML minification or other deployment processing that changes the script's whitespace also requires a new hash. If the script is blocked, the page can flash the wrong theme or palette before the bundled script initializes it.
The optional css/site.css stylesheet link also has an inline onerror="this.remove()" handler. It removes that link element if the stylesheet fails to load, for example when the consumer site supplies no site.css. The script hash above does not authorize this event handler. A strict policy that blocks inline handlers can leave it blocked: the failed link remains in the DOM and the browser may report a CSP violation, but the skin's main stylesheet still renders the page. Only the failed-link cleanup is lost.
With the default URLs, allow https://cdn.jsdelivr.net in script-src (Mermaid and KaTeX), style-src (katex.min.css), and font-src (KaTeX fonts, which katex.min.css loads relative to itself; fonts are not executable and are not covered by SRI). None of the pinned files fetch further code at runtime, so connect-src needs nothing extra. Self-hosting removes the jsDelivr origin entirely. Mermaid's rendered SVGs carry inline <style> and style attributes, so a style-src without 'unsafe-inline' will leave diagrams unstyled.
Built-In Accessible Color Schemes
Every built-in color scheme is verified at build time by scripts/lint-scss.ts against WCAG 2.2 relative luminance and contrast rules across both Light and Dark polarities: text and accent tokens on the primary (--color-background-primary) and secondary (--color-background-secondary) surfaces, the text, link, and icon colors on admonition title bars and bodies and on .alert.theme-* callouts, the sidebar, TOC, and search-result states, Bootstrap control boundaries (unchecked checkboxes and radios, switch edges, and form-control and chip-input borders) on page and secondary surfaces, unchecked switch knobs on their tracks, focus rings on page, secondary, item, and hover surfaces, and Bootstrap 6 components in every theme and without one, at rest, hovered, and toggled on (see Architecture for the full list):
| Scheme ID | Inspiration | Contrast | Notes |
|---|---|---|---|
furo |
Sphinx Furo | WCAG 2.2 AA ≥ 4.5:1 text / 3.0:1 UI |
Default crisp documentation palette; automatically escalates to modus when prefers-contrast: more is active. |
bootstrap |
Bootstrap 6 OKLCH | WCAG 2.2 AA ≥ 4.5:1 text / 3.0:1 UI |
Native Bootstrap 6 perceptually uniform OKLCH colors inside Furo's 3-column layout. |
modus |
Emacs Modus | WCAG 2.2 AAA ≥ 7.0:1 text / 4.5:1 UI |
Protesilaos Stavrou's strict AAA high-contrast themes (21:1 primary text, ≥ 7:1 muted text and semantic accents). |
modus-tinted |
Emacs Modus Tinted | WCAG 2.2 AAA ≥ 7.0:1 text / 4.5:1 UI |
Warm cream paper (#fbf7f0) in Light mode and deep night-sky (#0d0e1c) in Dark mode to prevent halation/glare. |
modus-deuteranopia |
Emacs Modus Deuteranopia |
WCAG 2.2 AAA ≥ 7.0:1 text / 4.5:1 UI |
Red-green colorblind-safe semantic palette using royal/sky blue, gold, and warm burnt amber. |
modus-tritanopia |
Emacs Modus Tritanopia |
WCAG 2.2 AAA ≥ 7.0:1 text / 4.5:1 UI |
Blue-yellow colorblind-safe semantic palette using deep teal/aqua, plum/magenta, and crimson. |
Extending Palettes via <lightCssVariables> & <darkCssVariables>
Just like Sphinx Furo's light_css_variables and dark_css_variables, any child element inside <lightCssVariables> or <darkCssVariables> is emitted as --<tag-name>: <value>; and automatically feeds into Bootstrap 6's component tokens (--primary-*, --success-*, --warning-*, --danger-*, --info-*, --accent-*) via color-mix(in oklch, ...). The four modus* schemes also override some of those tokens and some of the supa-* state tokens below, so that every state stays at 7:1 or better. See Modus Palette Overrides for what they change and why.
Defaults shown below are for the furo scheme; other schemes can override them. In light-dark(...), the first value is for light polarity and the second is for dark polarity. Variable names omit the leading -- because they are also the XML child element names.
| Variable Name | Purpose |
|---|---|
color-brand-primary |
Primary brand accent color (active sidebar links, active TOC border, skin-owned focus rings, .btn-primary). |
color-brand-content |
Content hyperlink color inside .prose articles and Bootstrap component focus rings (--primary-focus-ring). Text and links on solid themed card headers and footers use --theme-contrast on their theme fill; subtle and translucent caps retain their own text colors. |
color-background-primary |
Main article and page background surface (--bg-body). |
color-background-secondary |
Left sidebar, code block header, and card secondary surface (--bg-1). |
color-background-item |
Sidebar version badge, code language badge, and search-result badge background, and Bootstrap's --bg-2 (default light-dark(#f1f3f5, #212529)). |
color-background-hover |
Hover state surface for navigation items, icon buttons, search results, and channel links. It also fills the palette picker and palette select while hovered or open, and the theme button while its menu is open. Bootstrap's --bg-2 does not read it; that is color-background-item. |
color-background-border |
Subtle hairline border color across sidebars, tables, and headers (--border-color), and Bootstrap's --bg-3, which fills switch and range tracks and disabled controls. A hovered, pressed, or toggled-on button or chip without a theme takes supa-bg-active instead, which defaults to this color. |
color-code-background |
Background of code blocks (default light-dark(#f6f8fa, #1c1f24)). |
color-inline-code-background |
Background of inline code (default light-dark(rgba(175, 184, 193, 0.22), rgba(110, 118, 129, 0.35))). Translucent in furo and bootstrap, so it tints the surface beneath, such as an admonition or alert. On a solid fill (the .card-header or .card-footer of a themed card that is not .card-subtle or .card-translucent, an active .list-group-item) it is laid over color-background-primary instead. |
color-inline-code-text |
Inline code text color (default var(--color-foreground-primary)). |
color-foreground-primary |
Primary body text and heading color (--fg-body), and the knob of an enabled, unchecked Bootstrap switch, with or without a theme. Enabled range thumbs (including active thumbs) and progress fills use this color against the unfilled track, including themed ranges except .theme-inverse, which retains its theme fill. |
color-foreground-secondary |
Secondary metadata, caption, and inactive TOC link color (--fg-2). |
color-foreground-muted |
Muted text, permalink # indicators, subtle labels, and the Datepicker's weekday names and days outside the shown month (--fg-3). |
supa-control-border |
Bootstrap checkbox, radio, switch, enabled range track, form-control, chip-input, and OTP slot normal-state boundary color (default var(--color-foreground-muted)) to meet each palette's non-text target on page and secondary surfaces; Bootstrap validation states retain their semantic borders. Range tracks use an inset boundary and keep their --bg-3 interior; disabled ranges retain Bootstrap paint. |
color-foreground-border |
Border color of blockquotes, <kbd>, the sidebar search button, the palette swatches, the open or hovered palette select and picker, and a hovered playground pill (WCAG 1.4.11 non-text contrast ≥ 3:1 on the page). Form controls use supa-control-border. |
supa-admonition-note-accent |
note and seealso admonition and .theme-info accent color. |
supa-admonition-note-bg |
note and seealso admonition title background; also the Bootstrap .theme-info subtle background (default light-dark(#ddf4ff, rgba(56, 139, 253, 0.14))). |
supa-admonition-tip-accent |
tip and hint admonition and .theme-success accent color. |
supa-admonition-tip-bg |
tip and hint admonition title background; also the Bootstrap .theme-success subtle background and highlighted diff additions (default light-dark(#dafbe1, rgba(46, 160, 67, 0.14))). |
supa-admonition-important-accent |
important and admonition callout and .theme-accent accent color. |
supa-admonition-important-bg |
important and admonition callout title background; also the Bootstrap .theme-accent subtle background (default light-dark(#fbefff, rgba(163, 113, 247, 0.14))). |
supa-admonition-warning-accent |
warning and caution admonition and .theme-warning accent color. |
supa-admonition-warning-bg |
warning and caution admonition title background; also the Bootstrap .theme-warning subtle background (default light-dark(#fff8c5, rgba(187, 128, 9, 0.14))). |
supa-admonition-caution-accent |
danger, attention, and error admonition and .theme-danger accent color. |
supa-admonition-caution-bg |
danger, attention, and error admonition title background; also the Bootstrap .theme-danger subtle background and highlighted diff deletions (default light-dark(#ffebe9, rgba(248, 81, 73, 0.14))). |
supa-admonition-todo-accent |
todo admonition neutral accent color. |
supa-admonition-todo-bg |
todo admonition title background (default light-dark(#f1f3f5, rgba(139, 148, 158, 0.16))). |
supa-nav-hover-fg |
Text color of a hovered sidebar link and of the active search result's title, on color-background-hover (default var(--color-brand-primary)). |
supa-nav-active-fg |
Text color of the current page's sidebar link (default var(--color-brand-primary)). |
supa-nav-active-bg |
Background of the current page's sidebar link (default color-mix(in srgb, var(--color-brand-primary) 12%, transparent), laid over the sidebar). |
supa-search-mark-fg |
Text color of a highlighted search match, in result titles and snippets (default var(--color-foreground-primary)). |
supa-search-mark-bg |
Background of a highlighted search match (default color-mix(in srgb, var(--color-brand-primary) 22%, transparent), laid over the result). |
supa-bg-active |
Fill of a hovered, pressed, or toggled-on .btn or .chip without a Bootstrap theme; Bootstrap's --bg-3 on those components only, so switch and range tracks keep the border color (default var(--color-background-border)). |
supa-chip-selected-hover-opacity |
Opacity of a hovered selected chip, .chip.active:hover (default 0.9, Bootstrap's fade; 1 in the modus* schemes). |
supa-sidebar-brand-items-align |
Flex cross-axis alignment (center, flex-start, or flex-end) for .supa-sidebar-brand children. |
supa-sidebar-brand-justify |
Flex main-axis alignment (center, flex-start, or flex-end) for .supa-sidebar-brand-text title and version badge. |
supa-sidebar-brand-text-align |
Text alignment (center, left, or right) inside .supa-sidebar-brand. |
<darkCssVariables> apply on screen only: a printed page uses the light polarity, whose values come from the built-in scheme and <lightCssVariables> (see Adjusting the Printed Page).
Velocity Helper Macros Reference (site-macros.vm)
When authoring Velocity-preprocessed pages (.md.vm, .apt.vm, .xhtml.vm), Supa Maven Skin globally registers the following helper macros from META-INF/maven/site-macros.vm:
| Macro Signature | Parameters | Description |
|---|---|---|
#bi( $name $extraClasses $ariaLabel ) |
$name: Icon slug ("rocket-takeoff")$extraClasses: Optional utilities ("text-primary fs-5")$ariaLabel: Optional accessible label |
Renders <i class="bi bi-$name ..."></i> with aria-hidden="true" when $ariaLabel is omitted, or role="img" aria-label="..." when $ariaLabel is provided. |
#bsAlert( $theme $title $body $dismissible ) |
$theme: Semantic theme ("primary", "success", etc.)$title: Optional heading string$body: Alert HTML/text body$dismissible: true or false |
Renders an isolated .alert.theme-$theme.not-prose banner with an optional .btn-close dismiss button. |
#bsBadge( $theme $variant $text ) |
$theme: Semantic theme ("primary", "info", etc.)$variant: "" (solid), "subtle", or "outline"$text: Badge label text |
Renders an inline <span class="badge ... theme-$theme not-prose">. |
#bsCard( $title $subtitle $body $footer ) |
$title: Card heading$subtitle: Optional subtitle$body: Card body HTML/text$footer: Optional card footer HTML/text |
Renders a Bootstrap 6 .card.not-prose container. |
#bsCardGridStart( $extraClasses ) |
$extraClasses: Optional grid utility classes ("") |
Opens a <div class="row g-3 not-prose my-3 ..."> card grid container without trailing blank lines so Doxia's CommonMark parser keeps the HTML block contiguous. |
#bsCardGridEnd() |
(none) | Closes the </div> opened by #bsCardGridStart. |
#bsGuideCard( $colClass $icon $theme $href $title $badge $description ) |
$colClass: Column classes ("col-12 md:col-6" default)$icon: Bootstrap Icon slug ("rocket-takeoff")$theme: Semantic theme ("primary", "success", "info", "warning")$href: Link target ("getting-started.html")$title: Card link title$badge: Optional right-aligned subtle badge label$description: Card description HTML/text |
Renders a responsive navigation/guide card column inside a #bsCardGridStart / #bsCardGridEnd block. |
Documentation channel classes
| Class | Contract |
|---|---|
.supa-documentation-channels |
Named navigation container for consumer-provided links and a version disclosure. |
.documentation-channels |
Equivalent compatibility alias for existing markup. |
.documentation-version-picker |
Native details inside the container, containing a summary and a ul of version links. |
All palettes and polarities are supported. Use aria-current="page" for the
current destination. Labels and URLs belong to the consumer. No script or
configuration option is required. See the authoring recipe.