Floor by floor
The warehouse rises four floors to the penthouse under the old trusses; the courtyard wing steps back at the top for a terrace. Hover or tap a level to list its homes.
The first of the river-facing floors in the warehouse, with the tall arched windows at their full height.
A floor selector for a development: a line-drawn building section (ground to roof across five levels, a pitched warehouse roof beside the wing's set-back flat roof) draws itself wall by wall when it scrolls into view, with a round marker per level; hovering or clicking a marker tints that level and swaps the panel on the right to its name, a note and the homes on it (unit, type, status, price) with a cross-fade.
A floor selector for a development's sales page. On the left a line-drawn building section (ground to roof across five levels, the pitched warehouse roof beside the wing's set-back flat roof and terrace) draws itself wall by wall once it scrolls into view, with a round marker beside each level. Hovering, focusing or clicking a marker tints that level and swaps the panel on the right to the level's name, a short note and the homes on it, listed as unit, type, status and price under hairlines.
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/realestate34?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/realestate34?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/realestate34.tsx plus the badge24 eyebrow; it uses no shadcn/ui primitives.
The installed file exports realestate34Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Realestate34, realestate34Demo } from "@/components/beste/block/realestate34";
export default function Page() {
return <Realestate34 {...realestate34Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Realestate34 } from "@/components/beste/block/realestate34";
export default function Page() {
return (
<Realestate34
eyebrow="Floor by floor"
heading="Choose a level, see what is on it"
description="Hover or tap a level to list its homes."
levels={[
{
name: "Ground floor",
short: "G",
note: "Courtyard-facing homes with their own front doors off the birch walk.",
homes: [
{ unit: "W.02", type: "Type B", status: "available", price: "$695,000" },
{ unit: "C.01", type: "Type A", status: "available", price: "$640,000" },
],
},
{
name: "First floor",
short: "1",
note: "The first of the river-facing floors, with the arched windows at their full height.",
homes: [
{ unit: "W.03", type: "Type A", status: "available", price: "$655,000" },
{ unit: "W.04", type: "Type C", status: "reserved", price: "$895,000" },
{ unit: "C.04", type: "Type A", status: "sold", price: "$660,000" },
],
},
]}
level={1}
labels={{ drawing: "Section drawing of the warehouse and the courtyard wing", homes: "homes", available: "Available", reserved: "Reserved", sold: "Sold", empty: "No homes on this level." }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Short line above the heading, drawn with a rule in front of it. |
heading | string | – | Section heading. |
description | string | – | Intro paragraph beside the heading. |
levels | Level[] | [] | The levels from the ground up; the drawing has five bands, so the first five levels get a marker. |
level | number | – | Index of the level selected on load; the ground floor when omitted. |
labels | Labels | {} | The drawing's accessible name, the word after the home count, the three status words and the empty state. |
className | string | – | Extra classes merged onto the section. |
type Status = "available" | "reserved" | "sold";
type Home = {
unit: string;
type: string;
status: Status;
price: string;
};
type Level = {
name: string;
short: string;
note: string;
homes: Home[];
};
type Labels = {
drawing?: string;
homes?: string;
available?: string;
reserved?: string;
sold?: string;
empty?: string;
};pathLength from zero once the drawing scrolls into view, heavy lines first and details about a second later.prefers-reduced-motion the drawing renders complete, markers appear at once and the panel swaps without the rise.