Footer Glass
Inset frosted footer panel with brand, tagline, pill newsletter form (success state), three link columns and a legal bar.
glass/section/footer-glassSource
"use client";
import { useId, useState, type FormEvent } from "react";
import { cn } from "@/lib/utils";
export interface FooterGlassColumn {
title: string;
links: { label: string; href: string }[];
}
export interface FooterGlassProps {
brand?: string;
tagline?: string;
columns?: FooterGlassColumn[];
newsletter?: { title: string; placeholder: string; button: string; onSubscribe?: (email: string) => void | Promise<void> };
copyright?: string;
legal?: { label: string; href: string }[];
className?: string;
}
const DEFAULT_COLUMNS: FooterGlassColumn[] = [
{ title: "Product", links: [{ label: "Notetaker", href: "#" }, { label: "Async video", href: "#" }, { label: "Integrations", href: "#" }, { label: "Pricing", href: "#" }] },
{ title: "Resources", links: [{ label: "Help center", href: "#" }, { label: "Meeting templates", href: "#" }, { label: "API", href: "#" }, { label: "Status", href: "#" }] },
{ title: "Company", links: [{ label: "About", href: "#" }, { label: "Careers", href: "#" }, { label: "Security", href: "#" }, { label: "Press kit", href: "#" }] },
];
export function FooterGlass({
brand = "Halo",
tagline = "Your meetings, summarized. Your updates, async.",
columns = DEFAULT_COLUMNS,
newsletter = { title: "Monthly product notes, no fluff.", placeholder: "you@company.com", button: "Subscribe" },
copyright = `© ${new Date().getFullYear()} Halo Labs Inc.`,
legal = [
{ label: "Privacy", href: "#" },
{ label: "Terms", href: "#" },
{ label: "Cookies", href: "#" },
],
className,
}: FooterGlassProps) {
const inputId = useId();
const [done, setDone] = useState(false);
async function subscribe(e: FormEvent<HTMLFormElement>) {
e.preventDefault();
const email = new FormData(e.currentTarget).get("email");
if (typeof email !== "string") return;
await newsletter.onSubscribe?.(email);
setDone(true);
}
return (
<footer className={cn("px-4 pb-4 text-da-fg", className)}>
<div className="da-stroke mx-auto max-w-(--da-container) rounded-da-lg bg-da-surface p-8 shadow-da-lg backdrop-blur-da backdrop-saturate-150 sm:p-12">
<div className="grid gap-10 lg:grid-cols-[1.4fr_repeat(3,1fr)]">
<div>
<p className="flex items-center gap-2 font-da-display text-xl font-semibold tracking-da-display">
<span aria-hidden className="grid size-7 place-items-center rounded-full bg-gradient-to-br from-da-primary to-da-accent">
<span className="size-3 rounded-full bg-da-bg/90" />
</span>
{brand}
</p>
<p className="mt-3 max-w-xs text-sm text-da-muted-fg">{tagline}</p>
<div className="mt-6">
{done ? (
<p role="status" className="text-sm font-semibold text-da-success">
Thanks — see you next month.
</p>
) : (
<form onSubmit={subscribe}>
<label htmlFor={inputId} className="text-sm font-semibold">
{newsletter.title}
</label>
<div className="da-stroke mt-2 flex max-w-sm rounded-da-pill bg-da-input p-1 focus-within:ring-2 focus-within:ring-da-ring">
<input
id={inputId}
name="email"
type="email"
required
autoComplete="email"
placeholder={newsletter.placeholder}
className="min-w-0 flex-1 bg-transparent px-3 text-sm outline-none placeholder:text-da-muted-fg"
/>
<button type="submit" className="da-focus da-transition rounded-da-pill bg-da-fg px-4 py-2 text-sm font-semibold text-da-bg hover:opacity-90">
{newsletter.button}
</button>
</div>
</form>
)}
</div>
</div>
{columns.map((col) => (
<nav key={col.title} aria-label={col.title}>
<h2 className="text-sm font-semibold">{col.title}</h2>
<ul className="mt-4 space-y-2.5">
{col.links.map((l) => (
<li key={l.label}>
<a href={l.href} className="da-focus da-transition rounded-da-sm text-sm text-da-muted-fg hover:text-da-fg">
{l.label}
</a>
</li>
))}
</ul>
</nav>
))}
</div>
<div className="mt-12 flex flex-col gap-4 border-t border-da-border-strong/60 pt-6 text-sm text-da-muted-fg sm:flex-row sm:items-center sm:justify-between">
<p>{copyright}</p>
<ul className="flex gap-5">
{legal.map((l) => (
<li key={l.label}>
<a href={l.href} className="da-focus da-transition rounded-da-sm hover:text-da-fg">
{l.label}
</a>
</li>
))}
</ul>
</div>
</div>
</footer>
);
}
export default FooterGlass;
modules/glass/section/footer-glass/index.tsx
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| brand | string | "Halo" | Brand name. |
| tagline | string | — | Line under the brand. |
| columns | FooterGlassColumn[] | — | { title, links: { label, href }[] }[]. |
| newsletter | { title, placeholder, button, onSubscribe? } | — | Newsletter form; onSubscribe receives the email. |
| copyright | string | — | Copyright line. |
| legal | { label: string; href: string }[] | — | Links in the bottom bar. |
| className | string | — | Classes on the <footer>. |
Other footer variants in Glass
Footer Cta
Glass footer panel that opens with a gradient CTA band (headline + white button), then brand, tagline, three link columns and a legal row.
Footer Pill
Compact floating glass pill footer: gradient dot brand with copyright, inline links and round social buttons; becomes a stacked rounded card on mobile.
Footer Wordmark
A giant gradient brand wordmark sits behind a frosted glass panel holding three link columns and the legal line, so the letters glow through the blur.
Footer in other art directions
Footer Bar
Single-row ruled footer for apps and docs: wordmark, link cells that flood yellow on hover, green status square and copyright, each separated by vertical strokes; stacks on mobile.
Footer CTA
Footer that opens with a full-bleed yellow call-to-action band (huge headline + ink button), then brand with social chips, three link columns and a copyright line on paper.
Footer Mega
Inverted ink footer with brand + status pill, three link columns, a viewport-wide wordmark and a legal bar. Link hover paints a yellow highlight.
Footer Sitemap
Dense sitemap footer: boxed newsletter strip with success state, five ruled link columns with pink badges (New, hiring count), then brand, legal links and a language select.
Footer Minimal
Single-row footer: small square mark, brand and copyright, a handful of links and a live ‘All systems normal’ status pill. Stacks on mobile.
Footer Newsletter
Tinted footer with brand, tagline and an inline newsletter form on the left, three link columns on the right and a legal row below.
Footer Simple
Quiet footer: brand, one-line description and a live status pill with pulsing dot, three link columns in muted text, and a hairline bottom bar with copyright and social links.
Footer Wordmark
Footer with a row of links, address and socials, ending on a giant edge-to-edge lowercase brand wordmark that fades into the page and is cropped by the bottom edge.
Footer Columns
Footer with a newsletter: underline-input “Studio notes” signup in the first half, link columns in the second, all on a hairline grid; mono copyright row.
Footer Giant
Signature footer: small link rows above, and the brand name set enormous across the full width at the bottom, clipped by the page edge; inverted (ink) background.
Footer Minimal
One-line footer: logo mark, copyright, and links separated by slashes — all in mono caps on a single hairline row; wraps gracefully on mobile.
Footer Mono
Grid footer: ink top rule, logo + one-line description in the first columns, three mono-headed link columns, and a bottom row of legal links and a live-status signal dot.
Footer Compact
Single-row compact footer: logo mark + copyright on the left, inline links on the right, hairline top border; stacks on mobile.
Footer Enterprise
Large enterprise footer on surface-2: brand + tagline + region selector on the left, five link columns, then a bottom bar with legal links, compliance chips and copyright.
Footer Newsletter
Footer led by a newsletter band (“The Finance Brief”) with an inline email form, then three link columns and a copyright line.
Footer Status
Developer-oriented dark footer (fg/bg inverted): brand, live system-status pill with pulsing dot, API version in mono, and three link columns.
Footer Garden
Large footer on deep sage (a dark sage tint in dark mode) with rolling-hill silhouettes along the top edge, logo + tagline, three link columns and a “we measure our own footprint” note in the bottom line.
Footer Letter
Footer written like the end of a letter: a huge italic serif sign-off, a handwritten-style signature line, contact email and a simple link row under a warm rule.
Footer Newsletter
Footer with an inline journal signup: logo + rounded email form in a sage-tinted card on the left, two link columns on the right, and a sand-colored bottom strip.
Footer Simple
Quiet centered footer: logo and serif wordmark, a single row of links separated by leaf dots, and a small copyright line on cream.
Footer Columns
Classic footer on a soft panel with big rounded top corners: shape logo and tagline, three link columns in rounded headings, and a legal row with a language pill.
Footer Cta
Footer opening with a lavender CTA card that overlaps the top of a soft bottom band holding the brand, inline links and legal line.
Footer Pastel
Playful footer where each link column is its own pastel tile (peach, mint, lavender) plus a butter brand tile with round emoji social buttons and the legal line.
Footer Simple
Centered minimal footer: rounded wordmark with a periwinkle dot, a row of soft pill links and a small “made with care” line.