The rooms
A studio tour: a serif heading that settles in word by word beside the intro and a pill action, four photographs of the rooms in an uneven, offset grid that each drift at their own pace as the page scrolls, and a ruled row of visiting details.
A section about the space itself: a wide heading and a short intro over four photographs in a deliberately uneven grid, each drifting inside its own frame, closed by a ruled row of practical details like address, transport and access.
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/about77?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/about77?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/about77.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.
The installed file exports about77Demo alongside the block: the exact props behind the preview above. Spread it to get a working rooms section in one line.
import { About77, about77Demo } from "@/components/beste/block/about77";
export default function Page() {
return <About77 {...about77Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { About77 } from "@/components/beste/block/about77";
export default function Page() {
return (
<About77
eyebrow="The rooms"
heading="Plaster walls, a low bench, and a window that gets the afternoon."
description="We chose the rooms before we chose the furniture."
button={{ label: "Visit before you book", href: "/visit", tone: "outline" }}
photos={[
{ src: "/rooms/bench.jpg", alt: "A sunlit room with plaster walls and a low timber bench" },
{ src: "/rooms/ledge.jpg", alt: "A ceramic vessel and a folded cloth on a plaster ledge" },
{ src: "/rooms/table.jpg", alt: "A calm room with a long stone table and linen chairs" },
{ src: "/rooms/kitchen.jpg", alt: "A kitchen with oak cabinets and a window onto a garden" },
]}
details={[
{ label: "Address", value: "Rua da Prata 12, second floor, Lisbon" },
{ label: "Access", value: "Step-free, with a quiet room to wait in" },
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small-caps line above the heading |
heading | string | – | Section heading, rendered as an h2 through Text1 |
description | string | – | Short intro in the narrow right column |
button | ActionButton | – | Pill action under the intro |
photos | Photo[] | [] | Room photographs; only the first four are rendered |
details | Detail[] | [] | Practical facts in the ruled row at the foot |
className | string | – | Extra classes for the outer <section> |
type Photo = {
src: string;
alt: string;
};
type Detail = {
label: string;
value: string;
};
type ActionButton = {
label: string;
href: string;
tone?: "primary" | "light" | "dark" | "outline";
};photos.slice(0, 4) caps the section at four. A fifth entry is dropped rather than falling into an undefined slot, and a slot beyond the list falls back to the first, so a shorter array never crashes the layout.8% and the two landscape slots 12%, against a 1.25 scale. Taller frames need less travel to read as moving, and matching them would make the wide ones look static.md:mt-24 on the second, md:-mt-24 on the fourth) apply from md only, so the uneven rhythm collapses to a plain stack on a phone where it would just read as broken spacing.index % 2, so the two photographs in a row arrive a beat apart rather than the stagger growing longer down the section.blur(24px) and clear on decode, with a complete check on mount so a cached image is never left blurred waiting for an onLoad that already fired.dl with dt/dd pairs, so an address and its label stay associated for a screen reader rather than being two adjacent strings.about75
A team section: a serif heading that settles in word by word beside the intro and a pill action, then three portrait photographs that drift inside their frames as the page scrolls, each with a serif name, a small-caps role and a short bio.
about82
An about section built around a wide photograph that drifts inside its frame: a serif heading that settles in word by word above it, then an intro with a sliding-marker pill beside four ruled serif figures that count up as they arrive.
about68
A team section with an eyebrow over a hairline rule, a two-column heading, and a grid of portrait cards each with a name and role.
about66
Two-column about with a tall image on one side and an eyebrow, heading, description, and 2x2 stats grid on the other.