What we believe
A pinned scroll feature section for a design studio built around one large statement. As the page scrolls, the words of the manifesto light up one after another in a soft reading wave, and three small rounded photographs open inside the sentence between words as the wave reaches them, pushing the text aside. Once the whole statement is lit, a signature row with a round portrait, name, role fades in below. A light or dark surface can be chosen with the tone prop. Screen readers get the statement as plain text. Reduced motion shows the fully lit statement with its photographs and signature.
A pinned scroll section where one large statement lights up word by word as the page scrolls, small rounded photos open inside the sentence as the wave reaches them, and a signature row fades in once the whole statement is lit.
Upgrade to Pro
Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
Radix flavor
npx shadcn add "https://ui.beste.co/r/feature323?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/feature323?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/feature323.tsx.
The installed file exports feature323Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Feature323, feature323Demo } from "@/components/beste/block/feature323";
export default function Page() {
return <Feature323 {...feature323Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Feature323 } from "@/components/beste/block/feature323";
export default function Page() {
return (
<Feature323
eyebrow="What we believe"
parts={[
"We make places, objects and",
{
image: {
src: "https://images.unsplash.com/photo-1718981464703-c167144381eb?w=600&q=80",
alt: "Drafting table covered with sketches",
},
},
"brands that ask for nothing but a second look.",
]}
signature={{
name: "Nick Drake",
role: "Founding partner",
avatar: {
src: "https://images.unsplash.com/photo-1506794778202-cad84cf45f1d?w=200&q=80",
alt: "Portrait of Nick Drake",
},
}}
tone="dark"
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small line above the statement |
parts | ManifestoPart[] | [] | The statement as text runs with image tokens placed between words |
signature | Signature | – | Portrait, name and role shown once the statement is lit |
tone | "light" | "dark" | "light" | Light surface or dark (bg-foreground) surface |
className | string | – | Extra classes for the outer <section> |
type ManifestoImage = {
src: string;
alt: string;
};
type ManifestoPart = string | { image: ManifestoImage };
type Signature = {
name: string;
role: string;
avatar?: ManifestoImage;
};300svh tall with a sticky stage of 100svh minus 78px. Reading progress maps page scroll from 6% to 78% of the section onto 0 to 1, clamped.0em to 2.2em wide with a 0.25em right margin and settles from a 1.35 scale to 1, so it pushes the text aside as it opens. The pill images use empty alt.h2. The animated words are aria-hidden, and an sr-only copy joins the text parts for screen readers, so image alts in parts are not announced.