Welcome to Vanilla Breeze
This bell pulls live notifications from /go/notify/messages — the same contract documented at /docs/concepts/service-contracts/. Static articles like this one are the no-JS / no-backend fallback.
This bell pulls live notifications from /go/notify/messages — the same contract documented at /docs/concepts/service-contracts/. Static articles like this one are the no-JS / no-backend fallback.
Activate viewport-aware sticky-positioning coordination. Set on to enable the system; the StickyManager keeps a --sticky-offset custom property in sync with the actual sticky-header height so all sticky elements (sidebar, TOC, headings) line up correctly.
The data-sticky attribute on <html> turns on VB's sticky coordination system. Behind it, StickyManager measures the live sticky-header height and writes it to --sticky-offset on :root. Every sticky sidebar, TOC, scroll-padding setting, and "scroll into view" behavior reads that variable, so they all line up correctly without you hardcoding a header offset anywhere.
On other elements, data-sticky marks the element as a sticky participant. The first <header> in the document picks it up automatically when the system is active; other elements opt in explicitly.
<html lang="en" data-sticky> <body> <header> <!-- Auto-marked data-sticky by StickyManager --> </header> <main>...</main> </body></html>
<body> <header data-sticky>...</header> <aside data-sticky class="page-toc"> <!-- Constrained by max-block-size: calc(100dvh - var(--sticky-offset) - var(--sticky-gap)) --> </aside></body>
| On | Effect |
|---|---|
<html data-sticky> |
Enables the system. StickyManager.init() runs; auto-applies data-sticky to the first <header> if not already present; sets up resize + fonts.ready + toggle listeners to keep --sticky-offset current. |
<header data-sticky> |
Header opts in (or is auto-applied). Becomes position: sticky at top: 0; its height is what StickyManager measures. |
<aside data-sticky> / <nav data-sticky> |
Marked as a sticky region. CSS in src/utils/sticky.css applies position: sticky with top: var(--sticky-offset) and a height constraint so the region can scroll independently if its content exceeds the viewport. |
<footer data-sticky> |
Sticky-to-bottom variant; styles in src/native-elements/footer/styles.css. |
| Variable | Set by | Use for |
|---|---|---|
--sticky-offset | StickyManager (px) | Top offset for any other sticky element so it stays below the header. |
--sticky-gap | theme / authors | Gap to leave above the bottom of the viewport when constraining sticky region height. |
aside[data-sticky] { position: sticky; inset-block-start: var(--sticky-offset, 0); max-block-size: calc(100dvh - var(--sticky-offset) - var(--sticky-gap, 1rem)); overflow-y: auto;}
resize listener on window (passive).document.fonts.ready resolves and triggers a re-measure (header height often changes once webfonts arrive).<details> opening / closing inside the header.requestAnimationFrame after layout settles.<page-toc> — the TOC sidebar reads --sticky-offset for its own positioning.data-page-layout — the app-shell and dashboard templates assume a sticky header.scroll-padding-block-start on :root — set to var(--sticky-offset) so anchor-link jumps land below the sticky header.src/utils/print.css disables sticky behavior automatically.data-sticky on a child of an overflowing container won't measure correctly; coordinate with the parent's scroll state instead.