Appearance and announcements
Color modes, branding, footer links and announcements.
On this page
Color mode and brand
[extra.devlab.appearance]
default_mode = "system"
show_toggle = true
[extra.devlab.brand]
logo_text = "Acme"
footer_text = "Acme"
show_logo_mark = false
logo_mark_path = ""
default_mode accepts system, light or dark. An unrecognized value uses
system. The reader's saved choice takes precedence. Set show_toggle = false
to remove the control. Branding lists CSS
tokens and the stylesheet hook for palette changes.
Footer
[extra.devlab.footer]
show = true
note = "Maintained by Acme."
links_label = "Project links"
show_link_names = false
links = [{ name = "Source", path = "https://codeberg.org/acme/project", icon = "codeberg" }]
show = false removes the built-in footer, including its compact reading variant.
note is escaped plain text. Each link requires name and path. Supported
icon values are github, gitlab, codeberg, matrix, zulip, telegram,
discord, rss, email and link. A supported icon supplies the accessible
name from name. Unknown or omitted icons render visible text.
show_link_names = true adds visible names and a links_label heading on the
regular footer. Compact footers in the reading sidebar/mobile panel always use
icons only, below note and copyright. links_label also names the link group
for assistive technology. Empty settings leave the copyright-only footer.
These options apply to the built-in footer. A site override owns its own markup. See Template extensions.
Announcements
[extra.devlab.announcement] is global site configuration. See Release announcements for the publishing workflow.
show and dismissible are booleans. key, label, message and path are strings. The banner renders only when show = true and message is non-empty. An empty path renders text without a link, and an empty label omits the prefix. Both text fields are escaped plain text, without Markdown or HTML rendering. These fields are not read from page or section front matter.
The close button requires dismissible = true and a non-empty key. A matching saved key hides the banner when those conditions hold. Changing only message, label or path does not reset dismissal. A new key identifies a new announcement. show = false removes the banner without clearing the saved key. Setting dismissible = false shows the enabled message even if its key was previously dismissed.
DevLab stores the latest dismissed key in localStorage as devlab-announcement-dismissed. This value is shared across paths and languages on the same origin, is not synchronized between devices, and can be lost when site data is cleared. Without storage, dismissal lasts for the current page. Without JavaScript, the banner and link render but closing does not work. Already open tabs apply a saved dismissal on their next load.
path uses the active-language route resolver. Ensure that a local destination exists in each active language. The announcement has no missing-translation fallback. The label is hidden at widths of 420px or less, and long messages are truncated on desktop or limited to two lines on mobile. The optional close script is loaded only when the banner renders with a close button.