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.
Vertical share rail beside an article that follows the reader. Pure position: sticky composition, no JS, no scroll listeners.
A vertical rail of share buttons that sticks to the side of an article as the reader scrolls. The rail releases naturally when the article ends because position: sticky respects its containing block.
Anatomy:
position: sticky with align-self: startinset-block-start sets the offset from the viewport edge<article class="post"> <nav class="share-rail" aria-label="Share"> <a href="#" data-platform="x" aria-label="Share on X">𝕏</a> <a href="#" data-platform="linkedin" aria-label="Share on LinkedIn">in</a> <a href="#" data-copy="https://example.com/post" aria-label="Copy link">🔗</a> </nav> <div class="post-body"> <h1>Post title</h1> <p>...long-form content...</p> </div> <aside></aside></article>
article.post { display: grid; grid-template-columns: auto minmax(0, 60ch) 1fr; gap: var(--size-l); padding: var(--size-l); max-inline-size: 80rem; margin-inline: auto;} .share-rail { position: sticky; inset-block-start: var(--size-l); align-self: start; display: flex; flex-direction: column; gap: var(--size-s);} @media (max-width: 50rem) { article.post { grid-template-columns: 1fr; } .share-rail { flex-direction: row; inset-block-start: 0; }}
The copy-link button in the demo uses data-copy from VB's clipboard system — no per-page JS, automatic data-state="copied" feedback, screen-reader announce. See data-copy.
For a full share component with platform-specific share URLs and the Web Share API, use <share-wc> instead of rolling your own anchors.
align-self: start is what keeps the rail pinned at the top. Without it the rail stretches to the article's height and never sticks.aside) is intentionally empty in the demo — it gives the article a centred feel by claiming the right gutter. Drop it if you don't need symmetry.overflow: hidden on any ancestor — same sticky caveat as everywhere.