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.
Apple-style cards that pin to the top of the viewport and stack on top of each other as the reader scrolls.
A series of cards each position: sticky to the top, offset by an increasing distance so they stack visibly. Reading the page feels like flipping through a deck — each card stays put long enough to be read, then the next one slides over it.
Anatomy:
position: sticky with an inset-block-start that grows by a per-card increment (via a --i custom property)margin-block-end on each card creates the scroll distance before the next one arrives<section class="stack"> <article style="--i: 0;"> <h2>First card</h2> <p>Pins first.</p> </article> <article style="--i: 1;"> <h2>Second card</h2> <p>Pins one offset below.</p> </article> <article style="--i: 2;"> <h2>Third card</h2> <p>Two offsets.</p> </article> <article style="--i: 3;"> <h2>Fourth card</h2> <p>Bottom of the stack.</p> </article></section>
.stack > article { position: sticky; inset-block-start: calc(var(--size-l) + var(--i, 0) * var(--size-m)); margin-block-end: 50vh; /* scroll distance between cards */ margin-inline: auto; max-inline-size: 40rem; padding: var(--size-xl); border-radius: var(--radius-l); box-shadow: 0 12px 40px oklch(0% 0 0 / 0.4);} @media (prefers-reduced-motion: reduce) { .stack > article { position: static; margin-block-end: var(--size-l); }}
--i trick lets you add cards without writing per-card CSS. Use inline style or a small nth-child rule for the index.margin-block-end to control how long each card has on screen before being covered. 50vh is a comfortable default.overflow: hidden on the stack — same caveat as any sticky pattern.position: sticky has been broadly supported since 2017.