Scroll Reveal
ScrollEntrance on scroll that plays once and stays, staggers its children, scrubs with the scroll position when asked, honours reduced motion, and keeps working after every ClientRouter navigation.
Who it is for, as stickers: a heading and a line beside a cloud of rounded labels in the palette's blocks, each tilted a little its own way, coming in one after another as the cloud enters the screen (Reveal). A clientele, the kinds of event a venue hosts, the cuisines a kitchen cooks. The labels are a list, read in order and named by the heading. Zero JavaScript of its own.
Sample clients
Businesses where the look of the place is part of what people pay for.
Live, from the library itself, at full size: scroll, hover, navigate away and back. The demo is never gated.
Variants · each row writes the attribute the prop writes; the section's own CSS answers
JavaScript of its own
0 B
Uses Reveal and the shared runtime (1.9 kB raw, once per site). With those included: 3.0 kB raw.
CSS 12.0 kB raw including the base tokens. Measured from a production build, and again in CI for every change that can move it.
Browser support
Chrome 105 · Firefox 110 · Safari 16; needs container-units.
The demo above is never gated; the source is. With a key in components.json (see account), the registry serves it like any other item:
npx shadcn@latest add @moonarc-pro/sticker-cloud---
import StickerCloud from '@/components/moonarc/pro/StickerCloud.astro';
---
<StickerCloud
eyebrow="Clients"
headline="Who we work with"
copy="Businesses where the look of the place is part of what people pay for."
items={['Restaurants', 'Cafés', 'Villas', 'Beach clubs', 'Spas', 'Boutiques']}
/>Without a key the registry answers 401 with an upgrade message. Everything this section composes is free: reveal.
| Prop | Type | Default | Description |
|---|---|---|---|
items | string[] | none | The labels, in order. |
eyebrow | string | none | A short line above the heading. |
headline | string | none | The heading; it names the list. Slot "headline" wins and may hold an <em>. |
copy | string | none | A line under the heading. Slot "copy" wins. |
blocks | (1 | 2 | 3 | 4 | 5)[] | [1, 2, 3, 4, 5] | The blocks the stickers take in turn. |
tilts | number[] | [-3, 2, -1.5, 3, -2.5, 1.5] | The tilts the stickers take in turn, in degrees. |
label | string | none | Accessible name of the list; unset, the heading names it. |
level | 2 | 3 | 2 | Heading level. |
tone | 'surface' | 'muted' | 'ink' | 'brand' | unset (paints nothing) | The section's ground; the stickers keep their blocks. |
density | 'compact' | 'cozy' | 'roomy' | 'cozy' | Block padding ×0.8 / ×1 / ×1.25 through --ma-density. |
The section reads the theme contract (shadcn's variable names with the base tokens as fallback), so a pasted theme or one --ma-brand recolours it. Its class names are the override surface and stay stable; a named slot replaces the matching prop with your own markup.
.ma-stickers.ma-stickers__copy.ma-stickers__eyebrow.ma-stickers__head.ma-stickers__headline.ma-stickers__inner.ma-stickers__list.ma-stickers__sticker
slot="eyebrow"slot="headline"slot="copy"
The stickers are in place, tilted, with no entrance.
ClientRouterInherits Reveal; nothing of its own to rebind.
Replaces: Tag clouds (Framer templates). See the migration table.
Entrance on scroll that plays once and stays, staggers its children, scrubs with the scroll position when asked, honours reduced motion, and keeps working after every ClientRouter navigation.
What is on offer, as colour blocks: each card paints one of the palette's blocks and carries a drawing in its corner (Motif), an index, a name, a line, chips for what it includes and a foot with a price and a round arrow.
A "trusted by" section: a heading, a strip of greyscale logos drifting past that colour up on hover, and optionally the same logos as a hairline grid revealed with a stagger.
Also: view transitions · how costs are measured · browser support · accessibility policy · five-minute setup · MCP for agents · this page as Markdown