Phase 2, the courtyard wing
14 March 2027
Twelve homes in the new wing, every one of them opening onto the birch courtyard. Register now and you will see the plans and prices a week before the launch.

A launch announcement for the next phase of a development: an eyebrow, a short heading and the launch date set as a large light figure, a paragraph, three facts about the phase (homes, prices from, bedrooms) under hairlines that draw in, and a register button, beside a tall 4:5 photograph that is unveiled from the top once loaded and drifts slowly against the scroll.
A launch announcement for the next phase of a development: an eyebrow, a short heading and the launch date set as a large light figure, a paragraph, three facts about the phase (homes, prices from, bedrooms) under hairlines that draw in, and a register button. Beside the text a tall 4:5 photograph is unveiled from the top once it has loaded and drifts slowly against the scroll; on small screens it moves below the button.
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/realestate58?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/realestate58?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/realestate58.tsx together with the badge24 eyebrow and button25 pill components and the shadcn/ui button primitive behind the register button.
The installed file exports realestate58Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Realestate58, realestate58Demo } from "@/components/beste/block/realestate58";
export default function Page() {
return <Realestate58 {...realestate58Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Realestate58 } from "@/components/beste/block/realestate58";
import { ArrowRight } from "lucide-react";
export default function Page() {
return (
<Realestate58
eyebrow="Phase 2, the courtyard wing"
heading="Phase 2 launches"
date="14 March 2027"
description="Twelve homes in the new wing, every one of them opening onto the birch courtyard."
facts={[
{ value: "12", label: "Homes in the wing" },
{ value: "$695,000", label: "Prices from" },
{ value: "2 to 4", label: "Bedrooms" },
]}
button={{ label: "Register for Phase 2", href: "/register", icon: ArrowRight }}
image={{
src: "https://oud.pics/b/realestate/alder-balcony.webp",
alt: "An oak-framed balcony on the concrete wing, looking onto birch trees",
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Short line above the heading, drawn with a rule in front of it. |
heading | string | – | Short heading above the date. |
date | string | – | The launch date, set as a large light figure under the heading. |
description | string | – | Paragraph under the date. |
facts | Fact[] | [] | Three facts about the phase in a row, each under its own hairline. |
button | { label: string; href: string; icon?: LucideIcon } | – | Register button under the facts. |
image | { src: string; alt: string } | – | Tall 4:5 photograph beside the text. |
className | string | – | Extra classes merged onto the section. |
type Fact = {
value: string;
label: string;
};text-5xl to text-7xl, light weight, tabular figures), so any wording works: a day, a month or a season.load event and the frame being 10% inside the viewport, then unclips from the top over 1.6 seconds while the image settles from a 1.18 to a 1.12 scale.useScroll on the frame drifts the image from -6% to 6% of its height as the section crosses the viewport.prefers-reduced-motion the frame, image and text render in their final state and the parallax is switched off.