A typographic footer led by a huge wordmark that rises out of a clipped line as it enters the viewport, followed by three ruled rows: the site links in one wrapping row, the sales suite address with the phone and email, and the copyright line with policy links. Each hairline draws from the left with its row.
A typographic footer for a property development led by a huge wordmark (text-7xl on small screens, text-9xl from the md breakpoint) that rises out of a clipped line as it enters the viewport. Under it sit three ruled rows: the site links in one wrapping row, the sales suite address with the phone number and email on the right, and the copyright line with policy links. Each hairline draws from the left together with the row it rules.
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/realestate77?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/realestate77?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/realestate77.tsx; it uses no shadcn/ui primitives and no shared components, only framer-motion and the cn helper.
The installed file exports realestate77Demo alongside the block: the exact props behind the preview above. Spread it to get a working footer in one line.
import { Realestate77, realestate77Demo } from "@/components/beste/block/realestate77";
export default function Page() {
return <Realestate77 {...realestate77Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Realestate77 } from "@/components/beste/block/realestate77";
export default function Page() {
return (
<Realestate77
brand="Alder Row"
items={[
{ label: "Residences", href: "/residences" },
{ label: "Location", href: "/location" },
{ label: "Register", href: "/register" },
]}
address="Sales suite, 2 Mill Lane, Riverside. Open daily, 10 to 6."
phone={{ label: "+44 20 7946 0000", href: "tel:+442079460000" }}
email={{ label: "[email protected]", href: "mailto:[email protected]" }}
copyright="2026 Hartwell & Lowe. Computer-generated images are indicative only."
legalLinks={[
{ label: "Privacy", href: "/privacy" },
{ label: "Terms", href: "/terms" },
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
brand | string | – | The giant wordmark at the top of the footer. |
items | FooterLink[] | [] | Site links in one wrapping row under the wordmark. |
address | string | – | Address or opening line at the left of the contact row. |
phone | FooterLink | – | Phone link at the right of the contact row. |
email | FooterLink | – | Email link under the phone. |
copyright | string | – | Copyright or legal line at the left of the bottom row. |
legalLinks | FooterLink[] | [] | Policy links at the right of the bottom row. |
className | string | – | Extra classes merged onto the footer. |
type FooterLink = { label: string; href: string };overflow-hidden wrapper and travels from 100% of its own height to zero while fading in, so it appears to rise out of the first hairline; the move takes 1.2 seconds on the set's ease.relative block with a hairline motion.span that scales from the left as the row enters the viewport, once, with a -10% margin.md breakpoint with the address across seven columns and the phone and email right-aligned in the last four; on small screens the two stack.prefers-reduced-motion the wordmark rise, every entrance and the hairline draws are skipped and the footer renders in its final state.