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.
Spinner, skeleton, shimmer, and overlay patterns for indicating loading states.
Vanilla Breeze provides multiple loading state patterns for different contexts:
Use <loading-spinner> inline with text or inside buttons to indicate an ongoing operation.
<!-- Inline spinner --><loading-spinner data-size="s" aria-label="Loading"></loading-spinner>Loading... <!-- Button with spinner --><button disabled> <loading-spinner data-size="s" aria-label="Loading"></loading-spinner> Saving...</button>
Add data-loading="skeleton" to show children as gray placeholder shapes that preserve the layout structure.
Placeholder paragraph text that shows as a gray bar.
Another paragraph of placeholder text.
<!-- Skeleton loading state --><div data-loading="skeleton"> <h2>Placeholder heading</h2> <p>Placeholder paragraph text that shows as a gray bar.</p> <p>Another paragraph of placeholder text.</p></div>
The data-loading attribute (without a value, or with "minimal" or "hide") adds an animated overlay on top of existing content.
<!-- Shimmer overlay on existing content --><div data-loading> <h2>Real content here</h2> <p>Content is dimmed with a shimmer animation overlay.</p></div> <!-- Minimal pulse variant --><div data-loading="minimal"> <p>Subtle pulse effect instead of sweeping shimmer.</p></div> <!-- Hidden content variant --><div data-loading="hide"> <p>Content is completely hidden (not just dimmed).</p></div>
Add data-overlay to a spinner to center it over a parent container with a translucent backdrop.
<!-- Spinner overlay on a section --><div style="position: relative; min-height: 200px;"> <p>Content behind the overlay.</p> <loading-spinner data-overlay data-size="l" aria-label="Loading section"></loading-spinner></div>
For determinate progress, use the native <progress> element. Add data-type="ring" for a circular variant.
<!-- Determinate progress ring --><progress data-type="ring" data-size="l" value="67" max="100">67%</progress> <!-- Indeterminate progress ring --><progress data-type="ring" data-size="l" aria-label="Loading">Loading...</progress> <!-- Native progress bar --><progress value="67" max="100">67%</progress>
prefers-reduced-motion: reduceCSS-only spinner element
Native progress bar and ring mode
Full skeleton loading pattern