The residences

$640,000
A corner home in the warehouse, with the tall arched windows and a long living room along the river wall.
A residence spotlight: one large 4:3 photograph with a row of five thumbnails under it, one per home type; choosing a thumbnail cross-fades the photograph and swaps the details beside it (type, title, starting price, a short line and fact pills), with an enquiry button at the foot of the column.
A residence spotlight: one large 4:3 photograph with a row of five thumbnails under it, one per home type; choosing a thumbnail cross-fades the photograph and swaps the details beside it (type, title, starting price, a short line and fact pills), with an enquiry button at the foot of the column.
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://beste.dev/r/realestate36?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/realestate36?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/realestate36.tsx plus the badge24 rule eyebrow, the button25 quiet pill used for the enquiry button, and the shadcn/ui button primitive it builds on.
The installed file exports realestate36Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Realestate36, realestate36Demo } from "@/components/beste/block/realestate36";
export default function Page() {
return <Realestate36 {...realestate36Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Realestate36 } from "@/components/beste/block/realestate36";
export default function Page() {
return (
<Realestate36
eyebrow="The residences"
heading="Five homes, one way of living"
residences={[
{
name: "Type A",
title: "Two bedroom",
price: "$640,000",
description: "A corner home in the warehouse with tall arched windows.",
facts: ["2 bedrooms", "1 bathroom", "78 m²"],
image: { src: "/homes/type-a.webp", alt: "The Type A living room" },
},
{
name: "Type E",
title: "Penthouse",
price: "$1,650,000",
description: "The top of the warehouse, with a roof terrace on the river side.",
facts: ["2 bedrooms", "62 m² terrace", "146 m²"],
image: { src: "/homes/type-e.webp", alt: "The penthouse roof terrace" },
},
]}
button={{ label: "Enquire about this home", href: "/enquire" }}
labels={{ choose: "Choose a home type" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Short line above the heading, rendered through badge24. |
heading | string | – | Section heading. |
description | string | – | Intro paragraph beside the heading. |
residences | Residence[] | [] | The home types; the first is shown on load and each gets a thumbnail. |
button | { label: string; href: string } | – | Enquiry button at the foot of the details column. |
labels | { choose?: string } | {} | The accessible name of the thumbnail row. |
className | string | – | Extra classes merged onto the section. |
type Residence = {
name: string;
title: string;
price: string;
description: string;
facts: string[];
image: { src: string; alt: string };
};button with aria-pressed and the type's name and title as its label.AnimatePresence when the selection changes; the price is set in the figure style on one line.prefers-reduced-motion the frame and text render in place and selection changes swap without movement.