
Riverside & Partners
Office, 14 Mill Lane, opposite the station
- Your contact
- Brian Eno, Associate director
- Phone
- +44 20 7946 0000
- [email protected]
- Opening hours
- Monday to Friday9:00 to 18:00
- Saturday10:00 to 16:00
- SundayClosed
Partner agents
Both offices hold the full brochure, the price list and keys to the show apartment. Call whichever is nearer, or come straight to the sales suite on Mill Lane.

Office, 14 Mill Lane, opposite the station

Office, 2 Granary Square, by the park
Two estate agencies selling a development, set as two muted cards side by side: each opens with a 16:9 office photograph that unveils from the top once loaded and drifts with the scroll, then its name and office line, hairline rows for the named contact, a phone link and an email link, an opening-hours list, and a dark button pinned to the card's foot; cards and rows rise in sequence.
Two estate agencies selling a development, set as two muted cards side by side. Each card opens with a 16:9 office photograph, then the agency name and office line, hairline rows for the named contact, a phone link and an email link, an opening-hours list, and a dark button at the foot of the card; cards and rows rise in sequence.
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/realestate80?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/realestate80?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/realestate80.tsx plus the badge24 rule eyebrow, the button25 quiet pill used for each agency's button, and the shadcn/ui button primitive behind it.
The installed file exports realestate80Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Realestate80, realestate80Demo } from "@/components/beste/block/realestate80";
export default function Page() {
return <Realestate80 {...realestate80Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Realestate80 } from "@/components/beste/block/realestate80";
export default function Page() {
return (
<Realestate80
eyebrow="Partner agents"
heading="Two local agencies also sell Alder Row"
description="Both offices hold the full brochure, the price list and keys to the show apartment."
agents={[
{
name: "Riverside & Partners",
office: "14 Mill Lane, opposite the station",
contact: "Brian Eno",
role: "Associate director",
phone: "+44 20 7946 0000",
email: "[email protected]",
hours: [
{ days: "Monday to Friday", time: "9:00 to 18:00" },
{ days: "Saturday", time: "10:00 to 16:00" },
],
image: { src: "https://oud.pics/b/realestate/alder-river-walk.webp", alt: "The stone river walk beside the warehouse" },
button: { label: "Email Riverside & Partners", href: "/contact" },
},
{
name: "Granary Square Estates",
office: "2 Granary Square, by the park",
contact: "Max Richter",
role: "Senior negotiator",
phone: "+44 20 7946 0000",
email: "[email protected]",
hours: [
{ days: "Monday to Friday", time: "8:30 to 18:30" },
{ days: "Saturday", time: "9:00 to 17:00" },
],
image: { src: "https://oud.pics/b/realestate/alder-courtyard-exterior.webp", alt: "The warehouse and the concrete wing around the birch courtyard" },
button: { label: "Email Granary Square Estates", href: "/contact" },
},
]}
labels={{ office: "Office", contact: "Your contact", phone: "Phone", email: "Email", hours: "Opening hours" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Short line above the heading, rendered through badge24. |
heading | string | – | Section heading in the left seven columns of the header grid. |
description | string | – | Lead paragraph in the right four columns of the header grid. |
agents | Agent[] | [] | The agencies to show as cards; two fill a row on desktop, more wrap into further rows of two. |
labels | Labels | {} | Captions for the office line and the four detail rows. |
className | string | – | Extra classes merged onto the section. |
type Hours = { days: string; time: string };
type Agent = {
name: string;
office: string;
contact: string;
role: string;
phone: string;
email: string;
hours: Hours[];
image?: { src: string; alt: string };
button: { label: string; href: string };
};
type Labels = {
office?: string;
contact?: string;
phone?: string;
email?: string;
hours?: string;
};tel: href with its spaces stripped, the address a mailto: href, both with a quiet colour change on hover.rounded-md bg-muted card that rises into place on its own delay. The optional image fills a 16:9 frame at the top of the card: it stays clipped until the file has loaded and the frame is in view, then opens from the top over 1.6 s while settling from a 1.18 to a 1.12 scale, and drifts from -6% to 6% with the scroll.dark tone with an arrow icon, is pushed to the card's foot so both buttons line up, and rises last; with prefers-reduced-motion every initial state is skipped and the block renders complete.