Progress
Hartwell & Lowe publish a dated photograph from the site every month. These are the five stages between consent and the keys.
Full consent for 24 homes, the courtyard and the river wall repairs, with the warehouse facade kept and listed.
Piling for the new wing, the parking box under the courtyard and a new river wall, with the warehouse shored and cleaned.
The concrete frame of the courtyard wing topped out in May, and the warehouse roof is back on with its original slates.
Kitchens, bathrooms and oak floors go in from the top of the warehouse down. The show home opens in the autumn.
Homes are handed over building by building, warehouse first, with the courtyard planted in the same month.
A construction timeline for a development: eyebrow, heading and lead, then a vertical list of milestones along a hairline spine that draws downwards as you scroll, each with a dot that fills in turn, a date figure, a title and a line; the current stage carries a primary dot, a primary date and a short tag, and a register button closes the block.
A construction timeline for a development's sales page: eyebrow, heading and lead, then a vertical list of milestones along a hairline spine that draws downwards as it scrolls into view. Each milestone has a dot that fills in turn, a date set as a light figure, a title and a line. Completed stages have a filled dot, upcoming ones a hollow dot, and the current stage carries a primary dot, a primary date and a short tag. A register button closes the block.
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/realestate23?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/realestate23?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/realestate23.tsx plus the badge24 rule eyebrow, the button25 quiet pill used for the register button, and the shadcn/ui button primitive behind it.
The installed file exports realestate23Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Realestate23, realestate23Demo } from "@/components/beste/block/realestate23";
export default function Page() {
return <Realestate23 {...realestate23Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Realestate23 } from "@/components/beste/block/realestate23";
export default function Page() {
return (
<Realestate23
eyebrow="Progress"
heading="Where the build is now"
description="These are the stages between consent and the keys."
milestones={[
{ date: "2024", title: "Planning approved", description: "Full consent for 24 homes, the courtyard and the river wall repairs.", status: "complete" },
{ date: "2026", title: "Structure complete", description: "The concrete frame topped out in May and the warehouse roof is back on.", status: "current" },
{ date: "Spring 2027", title: "Completion", description: "Homes are handed over building by building, warehouse first.", status: "upcoming" },
]}
labels={{ current: "Now" }}
button={{ label: "Register for construction updates", href: "/register" }}
/>
);
}| 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 | – | Lead paragraph beside the heading. |
milestones | Milestone[] | [] | The stages in order, top to bottom. |
labels | { current?: string } | {} | The short tag shown after the date of the current stage. |
button | { label: string; href: string } | – | Register button under the list, aligned with the milestone text. |
className | string | – | Extra classes merged onto the section. |
type Status = "complete" | "current" | "upcoming";
type Milestone = {
date: string;
title: string;
description: string;
status: Status;
};status sets the dot: complete is a filled foreground dot, current a primary dot, upcoming a hollow dot with a border; the current stage also sets its date in the primary colour and shows labels.current beside it. Upcoming notes are slightly muted.prefers-reduced-motion the spine, dots and rows render in their final state.