Development Footer with Register Row

About this block

Development Footer with Register RowPRO

A light footer for a property development: the wordmark and a tagline beside four link columns (residences, the place, buying, the developer) that rise in one after another, a ruled register row with a heading, a line, an email field and a pill submit button as a plain GET form, and a legal row with the copyright, policy links and two notices about the consumer code and computer-generated images.

A light footer for a property development's sales site: the text wordmark and a tagline on the left beside four link columns (Residences, The place, Buying and the developer) that rise in one after another, then a ruled register row with a heading, a line, an email field and a pill submit button as a plain GET form, and finally a legal row with the copyright, policy links and two notices covering the consumer code and the computer-generated images. Every row sits under a hairline that draws from the left as it enters the viewport.

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.

Upgrade Now

Installation

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

bash
npx shadcn add "https://beste.dev/r/realestate76?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://beste.dev/r-base/realestate76?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/realestate76.tsx plus the Button25 pill used for the submit button and the shadcn/ui button and input primitives behind the pill and the email field.

Quick start

The installed file exports realestate76Demo alongside the block: the exact props behind the preview above. Spread it to get a working footer in one line.

tsx
import { Realestate76, realestate76Demo } from "@/components/beste/block/realestate76";

export default function Page() {
  return <Realestate76 {...realestate76Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Realestate76 } from "@/components/beste/block/realestate76";

export default function Page() {
  return (
    <Realestate76
      brand="Alder Row"
      tagline="Twenty-four homes between a restored brick warehouse and a birch courtyard, on the river."
      groups={[
        {
          title: "Residences",
          links: [
            { label: "Type A, two bedroom", href: "/residences/type-a" },
            { label: "Type C, three bedroom", href: "/residences/type-c" },
            { label: "Type E, penthouse", href: "/residences/type-e" },
          ],
        },
        {
          title: "Buying",
          links: [
            { label: "Availability", href: "/availability" },
            { label: "Book a viewing", href: "/viewing" },
          ],
        },
      ]}
      form={{
        action: "/register",
        heading: "Register for updates",
        description: "Phase 2 pricing, viewing days and construction news, about once a month.",
        params: { email: "email" },
        placeholder: "Your email address",
        button: "Register",
      }}
      copyright="2026 Hartwell & Lowe. All rights reserved."
      legalLinks={[
        { label: "Privacy", href: "/privacy" },
        { label: "Terms", href: "/terms" },
      ]}
      notices={[
        "Prices are correct at the time of publication and may change without notice.",
        "Images are computer-generated and indicative only.",
      ]}
      labels={{ email: "Email address" }}
    />
  );
}

Props

PropTypeDefaultDescription
brandstring–Text wordmark at the top left.
taglinestring–Short paragraph under the wordmark.
groupsLinkGroup[][]Link columns to the right of the wordmark; four fit in one row on desktop, two per row on small screens.
formRegisterForm–The register row: the GET action, its heading and line, the email parameter name, placeholder and submit label. Without it the row is left out.
copyrightstring–Copyright line at the left of the legal row.
legalLinksFooterLink[][]Policy links at the right of the legal row.
noticesstring[][]Legal notices under the legal row, two per row on desktop.
labels{ email?: string }{}Visually hidden label for the email field.
classNamestring–Extra classes merged onto the footer.
ts
type FooterLink = { label: string; href: string };

type LinkGroup = { title: string; links: FooterLink[] };

type RegisterForm = {
  action: string;
  heading?: string;
  description?: string;
  params?: { email?: string };
  placeholder?: string;
  button?: string;
};

Behavior notes

  • The register row is a plain form with method="get" posting to form.action; the email field is type="email" with native required, is named by form.params.email (falling back to email) and carries a visually hidden label from labels.email.
  • Wordmark, tagline and the four columns rise in once as they enter the viewport, each column 100 ms after the previous; the register text and the form follow, and the legal row and notices come last.
  • The hairlines above the register row and the legal row are motion.span rules that scale from the left over 1.2 seconds with the row they belong to.
  • The columns use a two-column grid on small screens and a four-column grid from the md breakpoint; the form stacks its field and button vertically below the sm breakpoint and puts them side by side above it.
  • With prefers-reduced-motion every entrance and hairline draw is skipped and the footer renders in its final state.

Wiring the form up

This block ships the form markup only; state, validation, and submit are yours to add. Our guide wires the shadcn Field primitives to React Hook Form, TanStack Form, and Formisch on one field system.

More Real Estate blocks

View all Real Estate
PRO

realestate78

Minimal Development Footer

PRO

realestate37

Four Buying Steps Row

PRO

realestate77

Footer with Giant Wordmark

Get Pro