Mega Footer

Full sitemap: 4 link columns + brand blurb + socials + newsletter + bottom legal row.

Preview

Source

tsx
"use client";

import { useState, FormEvent } from "react";
import { Button } from "@/components/ui/button";
import { Sparkles, Twitter, Github, Linkedin, Youtube } from "lucide-react";

const columns = [
  { heading: "Product", links: ["Features", "Pricing", "Integrations", "Changelog", "Roadmap"] },
  { heading: "Solutions", links: ["Startups", "Enterprise", "Agencies", "Education", "Nonprofits"] },
  { heading: "Resources", links: ["Docs", "Guides", "API", "Community", "Status"] },
  { heading: "Company", links: ["About", "Blog", "Careers", "Press", "Contact"] },
];

export default function FooterMega() {
  const [email, setEmail] = useState("");
  const [submitted, setSubmitted] = useState(false);

  const onSubmit = (e: FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    // eslint-disable-next-line no-console
    console.log("Mega footer signup:", email);
    setSubmitted(true);
    setEmail("");
  };

  return (
    <footer className="w-full border-t border-border bg-background">
      <div className="container mx-auto px-6 py-16">
        <div className="grid grid-cols-2 md:grid-cols-6 gap-8">
          <div className="col-span-2">
            <a href="#" className="flex items-center gap-2 text-foreground font-bold">
              <Sparkles className="w-6 h-6 text-primary" />
              <span className="text-base">Acme</span>
            </a>
            <p className="mt-4 text-sm text-muted-foreground max-w-xs leading-relaxed">
              The modern platform for building, launching, and scaling products that people love.
            </p>
            <div className="mt-5 flex items-center gap-3 text-muted-foreground">
              <a href="#" aria-label="Twitter" className="hover:text-foreground transition-colors">
                <Twitter className="w-4 h-4" />
              </a>
              <a href="#" aria-label="GitHub" className="hover:text-foreground transition-colors">
                <Github className="w-4 h-4" />
              </a>
              <a href="#" aria-label="LinkedIn" className="hover:text-foreground transition-colors">
                <Linkedin className="w-4 h-4" />
              </a>
              <a href="#" aria-label="YouTube" className="hover:text-foreground transition-colors">
                <Youtube className="w-4 h-4" />
              </a>
            </div>
          </div>
          {columns.map((col) => (
            <div key={col.heading}>
              <h3 className="text-sm font-semibold text-foreground mb-4">{col.heading}</h3>
              <ul className="space-y-2">
                {col.links.map((l) => (
                  <li key={l}>
                    <a href="#" className="text-sm text-muted-foreground hover:text-foreground transition-colors">
                      {l}
                    </a>
                  </li>
                ))}
              </ul>
            </div>
          ))}
        </div>

        <div className="mt-12 rounded-2xl border border-border bg-muted/30 p-6 md:p-8 flex flex-col md:flex-row md:items-center md:justify-between gap-5">
          <div>
            <h3 className="text-lg font-semibold text-foreground">Stay in the loop</h3>
            <p className="text-sm text-muted-foreground mt-1">
              Monthly product updates and essays. Unsubscribe anytime.
            </p>
          </div>
          <form onSubmit={onSubmit} className="flex gap-2 md:min-w-[360px]">
            <input
              type="email"
              required
              value={email}
              onChange={(e) => setEmail(e.target.value)}
              placeholder="you@company.com"
              className="flex-1 min-w-0 rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary/50"
            />
            <Button type="submit">Subscribe</Button>
          </form>
        </div>
        {submitted && (
          <p className="text-xs text-primary mt-3">Thanks — check your inbox.</p>
        )}

        <div className="mt-10 pt-6 border-t border-border flex flex-col sm:flex-row items-center justify-between gap-4">
          <p className="text-xs text-muted-foreground">
            © {new Date().getFullYear()} Acme, Inc. All rights reserved.
          </p>
          <div className="flex items-center gap-5 text-xs text-muted-foreground">
            <a href="#" className="hover:text-foreground">Privacy</a>
            <a href="#" className="hover:text-foreground">Terms</a>
            <a href="#" className="hover:text-foreground">Security</a>
            <a href="#" className="hover:text-foreground">Cookies</a>
          </div>
        </div>
      </div>
    </footer>
  );
}
Claude Code Instructions

CLI Install

npx innovations add mega

Where to use it

Use for marketing sites with many destinations, where the footer acts as a secondary sitemap. In Astro (src/layouts/Layout.astro): import FooterMega from '../components/innovations/footers/mega'; IMPORTANT: the onSubmit handler currently console.logs the email. Replace with a real API call before launch. Customize: edit the columns array (4 items recommended — the grid is 2 + 4 = 6 cols on md+). Swap social icons as needed.