
What it costs each month
Move the deposit and the rate to see how the monthly payment changes. The figures are a guide, and the sales team will walk you through the exact numbers with a lender.
Estimated monthly payment
$2,875a month
Estimate only. Excludes service charge, insurance and taxes, and assumes a fixed rate for the whole term.
A mortgage estimator for a development's sales page: a tall photograph beside a price field, term pills and two sliders for deposit and interest rate; the estimated monthly payment is a large figure that springs to each new value, with a two-colour bar splitting principal from interest, three breakdown figures under hairlines, a sales button and a disclaimer.
A mortgage estimator for a development's sales page: a tall photograph beside a price field, term pills and two sliders for deposit and interest rate. The estimated monthly payment is a large figure that springs to each new value, with a two-colour bar splitting principal from interest, three breakdown figures under hairlines, a sales button and a disclaimer.
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/realestate12?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/realestate12?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/realestate12.tsx plus the badge24 rule eyebrow, the button25 quiet pill used for the sales button, and the shadcn/ui button, input and slider primitives behind them, the price field and the two sliders.
The installed file exports realestate12Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Realestate12, realestate12Demo } from "@/components/beste/block/realestate12";
export default function Page() {
return <Realestate12 {...realestate12Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Realestate12 } from "@/components/beste/block/realestate12";
export default function Page() {
return (
<Realestate12
eyebrow="What it costs each month"
heading="A two bedroom at Alder Row, worked out"
description="Move the deposit and the rate to see how the monthly payment changes."
image={{
src: "https://oud.pics/b/realestate/alder-courtyard-kitchen.webp",
alt: "An open kitchen with oak cabinets and a pale stone island",
}}
price={640000}
deposit={{ value: 20, min: 5, max: 60, step: 5 }}
rate={{ value: 5.4, min: 1, max: 12, step: 0.1 }}
terms={[15, 20, 25]}
term={30}
currency="USD"
locale="en-US"
labels={{
price: "Home price",
deposit: "Deposit",
rate: "Interest rate",
term: "Term",
years: "years",
monthly: "Estimated monthly payment",
perMonth: "a month",
loan: "Loan amount",
depositAmount: "Deposit",
interest: "Total interest",
principal: "Principal",
}}
note="Estimate only. Excludes service charge, insurance and taxes."
button={{ label: "Talk to the sales team", href: "/contact" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Short line above the heading, rendered through badge24. |
heading | string | – | Section heading. |
description | string | – | Intro paragraph under the heading. |
image | { src: string; alt: string } | – | Tall 4:5 photograph beside the estimator; without it the estimator spans the full width. |
price | number | – | Starting home price, editable in the price field. |
deposit | Range | – | Starting deposit percentage and the slider's bounds and step. |
rate | Range | – | Starting annual interest rate in percent and the slider's bounds and step. |
terms | number[] | [] | Term options in years, shown as pills; three fit on one row beside the price field. |
term | number | – | The term selected on load; falls back to the first option. |
currency | string | – | ISO currency code for the formatted figures, USD when omitted. |
locale | string | – | Locale for number formatting, en-US when omitted. |
labels | Labels | {} | Captions for every control and figure. |
note | string | – | Disclaimer beside the button. |
button | { label: string; href: string } | – | Sales button under the breakdown. |
className | string | – | Extra classes merged onto the section. |
type Range = { value: number; min: number; max: number; step: number };
type Labels = {
price?: string;
deposit?: string;
rate?: string;
term?: string;
years?: string;
monthly?: string;
perMonth?: string;
loan?: string;
depositAmount?: string;
interest?: string;
principal?: string;
};stiffness 90, damping 22) so it counts towards each new value instead of jumping; with prefers-reduced-motion it shows the exact value at once.Intl.NumberFormat and no decimals.load event and on the frame being in view, opens from the top once loaded and drifts from -6% to 6% against the scroll; on small screens it moves below the estimator.