All Taste components
Footer
Footer — four link columns
A brand row with a language picker and system status on top, four even link columns below and the legal line at the bottom.
brand row · language select · status badge · 4 columns → 2 on mobile
import { Globe, Instagram, Linkedin, Twitter, Youtube } from "lucide-react";
const columns = [
{ title: "Product", links: [["Invoices", "/invoices"], ["Payments", "/payments"], ["Reminders", "/reminders"], ["Recurring billing", "/recurring"], ["Pricing", "/pricing"]] },
{ title: "Resources", links: [["Help centre", "/help"], ["Invoice templates", "/templates"], ["Guides", "/guides"], ["Blog", "/blog"], ["Status", "/status"]] },
{ title: "Company", links: [["About", "/about"], ["Careers", "/careers"], ["Customers", "/customers"], ["Press", "/press"], ["Contact", "/contact"]] },
{ title: "Legal", links: [["Terms", "/terms"], ["Privacy", "/privacy"], ["Cookies", "/cookies"], ["Security", "/security"], ["Accessibility", "/accessibility"]] },
];
const socials = [
{ label: "X", href: "#", icon: Twitter },
{ label: "LinkedIn", href: "#", icon: Linkedin },
{ label: "Instagram", href: "#", icon: Instagram },
{ label: "YouTube", href: "#", icon: Youtube },
];
export function FooterFourColumn() {
return (
<footer className="border-t border-border bg-bg px-5 pb-7 pt-12 font-sans sm:px-10 sm:pt-16">
<div className="mx-auto max-w-6xl">
<div className="flex flex-wrap items-start justify-between gap-x-10 gap-y-5 border-b border-border pb-10">
<div className="max-w-[340px]">
<a href="/" className="inline-flex items-center gap-2 text-base font-semibold tracking-tight text-fg">
<span className="size-6 rounded-sm bg-primary" aria-hidden />Tallybook
</a>
<p className="mt-2.5 text-sm leading-relaxed text-fg-muted">Invoicing and payments for small businesses that would rather be doing the work.</p>
</div>
<div className="flex flex-wrap items-center gap-2.5">
<a href="/status" className="inline-flex items-center gap-2 rounded-full border border-border px-3 py-1 text-[12.5px] text-fg-muted">
<span className="size-[7px] rounded-full bg-success" aria-hidden />All systems normal
</a>
<label className="inline-flex items-center gap-2 text-fg-muted">
<Globe className="size-4" aria-hidden />
<span className="sr-only">Language</span>
<select defaultValue="en" className="h-[34px] rounded border border-border-strong bg-bg px-2.5 text-[13px] text-fg">
<option value="en">English</option><option value="es">Español</option><option value="fr">Français</option>
</select>
</label>
</div>
</div>
<nav aria-label="Footer" className="mt-10 grid grid-cols-2 gap-x-5 gap-y-8 sm:grid-cols-4">
{columns.map((col) => (
<div key={col.title}>
<h2 className="mb-3.5 text-[13px] font-semibold text-fg">{col.title}</h2>
<ul className="grid gap-2.5">
{col.links.map(([label, href]) => (
<li key={label}><a href={href} className="text-[13.5px] text-fg-muted transition hover:text-fg">{label}</a></li>
))}
</ul>
</div>
))}
</nav>
<div className="mt-12 flex flex-wrap items-center justify-between gap-3 border-t border-border pt-6 text-[13px] text-fg-subtle">
<p>© {new Date().getFullYear()} Tallybook Ltd. All rights reserved.</p>
<div className="flex gap-1">
{socials.map(({ label, href, icon: Icon }) => (
<a key={label} href={href} aria-label={"Tallybook on " + label} className="grid size-8 place-items-center rounded transition hover:bg-surface-2 hover:text-fg">
<Icon className="size-4" aria-hidden />
</a>
))}
</div>
</div>
</div>
</footer>
);
}
The code uses the Taste Tailwind preset. Make yours on the Taste page with Export my system.