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.
Horizontal scrolling container with snap points. Perfect for carousels, image galleries, and card sliders.
| Attribute | Values | Default | Description |
|---|---|---|---|
data-layout-scrollbar |
(boolean) | — | Show a thin scrollbar (hidden by default). |
data-layout-gap |
none, 3xs, 2xs, xs, s, m, l, xl, 2xl, 3xl |
m |
Gap between items, on the shared size scale. |
data-layout-padding |
none, s, m, l |
s |
Inline padding and scroll padding. |
data-layout-item-width |
auto, s, m, l, xl, full |
auto |
Item width: auto (content), s / m / l / xl tokens, or full (100%). |
data-layout-align |
start, center, end, stretch |
stretch |
Cross-axis alignment of items. |
data-scroll-hint |
(bare), start |
— | Fade both edges to hint at overflow; start fades only the end edge. |
data-container (on main, article, section, aside) |
(boolean) | — | Opt a semantic child back into container queries (the reel removes container-type from such children so they size to content). |
Items scroll horizontally with scroll snap for smooth navigation.
<layout-reel data-layout-gap="m" data-layout-item-width="m"> <layout-card>Item 1</layout-card> <layout-card>Item 2</layout-card> <layout-card>Item 3</layout-card> <layout-card>Item 4</layout-card> <layout-card>Item 5</layout-card></layout-reel>
The data-layout-item-width attribute sets consistent widths for all items.
<!-- Small items (15rem) --><layout-reel data-layout-gap="s" data-layout-item-width="s">...</layout-reel> <!-- Medium items (20rem) --><layout-reel data-layout-gap="m" data-layout-item-width="m">...</layout-reel> <!-- Large items (25rem) --><layout-reel data-layout-gap="m" data-layout-item-width="l">...</layout-reel> <!-- Full-width (one at a time carousel) --><layout-reel data-layout-gap="m" data-layout-item-width="full">...</layout-reel>
Add data-scroll-hint to fade the edges of the reel, signaling there is more content to scroll. Use data-scroll-hint="start" to only fade the end edge (useful when content starts fully visible). The fade size can be customized with --scroll-hint-size.
<!-- Both edges fade --><layout-reel data-scroll-hint>...</layout-reel> <!-- End edge only (content starts visible) --><layout-reel data-scroll-hint="start">...</layout-reel> <!-- Custom fade size --><layout-reel data-scroll-hint style="--scroll-hint-size: 3rem;">...</layout-reel>
By default the scrollbar is hidden. Add data-layout-scrollbar to show it.
<layout-reel data-layout-gap="m" data-layout-item-width="m" data-layout-scrollbar> <!-- Items --></layout-reel>
The data-layout-gap attribute controls spacing between items.
<layout-reel data-layout-gap="m" data-layout-item-width="m" data-layout-scrollbar> <div data-media data-ratio="4:3" data-radius="m" style="inline-size: 20rem;"> <img src="image1.jpg" alt="Gallery 1" loading="lazy" /> </div> <div data-media data-ratio="4:3" data-radius="m" style="inline-size: 20rem;"> <img src="image2.jpg" alt="Gallery 2" loading="lazy" /> </div> <!-- More images... --></layout-reel>
<layout-reel data-layout-gap="m" data-layout-item-width="m"> <layout-card data-variant="outlined"> <layout-stack data-layout-gap="s"> <div data-media data-ratio="1:1" data-radius="s"> <img src="product.jpg" alt="Product" loading="lazy" /> </div> <strong>Product Name</strong> <span>$29.99</span> </layout-stack> </layout-card> <!-- More products... --></layout-reel>
<layout-reel data-layout-gap="l" data-layout-item-width="l"> <layout-card data-variant="elevated" data-padding="l"> <layout-stack data-layout-gap="m"> <p style="font-style: italic;">"Great product!"</p> <layout-cluster data-layout-gap="s"> <user-avatar> <img src="avatar.jpg" alt="Avatar" /> </user-avatar> <layout-stack data-layout-gap="xs"> <strong>Jane Smith</strong> <small>CEO, TechCorp</small> </layout-stack> </layout-cluster> </layout-stack> </layout-card> <!-- More testimonials... --></layout-reel>
The reel component respects prefers-reduced-motion by disabling scroll snap for users who prefer reduced motion.
@media (prefers-reduced-motion: reduce) { layout-reel { scroll-snap-type: none; }}
<layout-grid> — Auto-fit grid layout<layout-cluster> — Horizontal grouping with wrapping<layout-card> — Card container