Retour au catalogue

Footer Brutalist

Footer brutaliste avec bordures epaisses, typographie brute sans arrondis. Contraste fort, grille rigide et liens en majuscules.

footermedium Both Responsive a11y
boldeditorialagencyportfolioeducationgrid
Theme
"use client";

import { motion } from "framer-motion";
import { ArrowUpRight } from "lucide-react";

interface FooterLink {
  label: string;
  href: string;
}

interface FooterColumn {
  title: string;
  links: FooterLink[];
}

interface SocialLink {
  platform: string;
  href: string;
}

interface FooterBrutalistProps {
  brandName?: string;
  brandTagline?: string;
  columns?: FooterColumn[];
  socialLinks?: SocialLink[];
  copyright?: string;
}

export default function FooterBrutalist({
  brandName = "Brand",
  brandTagline = "",
  columns = [],
  socialLinks = [],
  copyright = "",
}: FooterBrutalistProps) {
  return (
    <footer
      style={{
        background: "var(--color-background-dark)",
        color: "var(--color-foreground-on-dark)",
        borderTop: "4px solid var(--color-foreground)",
      }}
    >
      {/* Brand banner */}
      <div
        style={{
          borderBottom: "3px solid var(--color-border-dark)",
          padding: "2rem var(--container-padding-x)",
          maxWidth: "var(--container-max-width)",
          margin: "0 auto",
        }}
      >
        <motion.h2
          initial={{ opacity: 0, y: 20 }}
          whileInView={{ opacity: 1, y: 0 }}
          viewport={{ once: true }}
          transition={{ duration: 0.5 }}
          style={{
            fontSize: "clamp(2.5rem, 6vw, 5rem)",
            fontWeight: 900,
            textTransform: "uppercase",
            letterSpacing: "-0.03em",
            lineHeight: 1,
            color: "var(--color-foreground-on-dark)",
          }}
        >
          {brandName}
        </motion.h2>
        {brandTagline && (
          <p
            style={{
              marginTop: "0.75rem",
              fontSize: "0.875rem",
              textTransform: "uppercase",
              letterSpacing: "0.15em",
              color: "var(--color-foreground-muted)",
            }}
          >
            {brandTagline}
          </p>
        )}
      </div>

      {/* Columns */}
      <div
        style={{
          maxWidth: "var(--container-max-width)",
          margin: "0 auto",
          padding: "2.5rem var(--container-padding-x)",
          display: "grid",
          gridTemplateColumns: "1fr",
          gap: "2rem",
          borderBottom: "3px solid var(--color-border-dark)",
        }}
        className="md:!grid-cols-2 lg:!grid-cols-4"
      >
        {columns.map((col) => (
          <div key={col.title}>
            <h4
              style={{
                fontSize: "0.6875rem",
                fontWeight: 800,
                textTransform: "uppercase",
                letterSpacing: "0.2em",
                color: "var(--color-accent)",
                marginBottom: "1.25rem",
                borderBottom: "2px solid var(--color-accent)",
                paddingBottom: "0.5rem",
                display: "inline-block",
              }}
            >
              {col.title}
            </h4>
            <div style={{ display: "flex", flexDirection: "column", gap: "0.625rem" }}>
              {col.links.map((link) => (
                <a
                  key={link.href + link.label}
                  href={link.href}
                  style={{
                    fontSize: "0.8125rem",
                    fontWeight: 600,
                    textTransform: "uppercase",
                    letterSpacing: "0.05em",
                    color: "var(--color-foreground-on-dark)",
                    textDecoration: "none",
                    display: "inline-flex",
                    alignItems: "center",
                    gap: "0.25rem",
                  }}
                >
                  {link.label}
                  <ArrowUpRight style={{ width: 12, height: 12, opacity: 0.5 }} />
                </a>
              ))}
            </div>
          </div>
        ))}
      </div>

      {/* Bottom */}
      <div
        style={{
          maxWidth: "var(--container-max-width)",
          margin: "0 auto",
          padding: "1.5rem var(--container-padding-x)",
          display: "flex",
          flexWrap: "wrap",
          justifyContent: "space-between",
          alignItems: "center",
          gap: "1rem",
        }}
      >
        <p
          style={{
            fontSize: "0.6875rem",
            fontWeight: 700,
            textTransform: "uppercase",
            letterSpacing: "0.1em",
            color: "var(--color-foreground-muted)",
          }}
        >
          {copyright}
        </p>
        {socialLinks.length > 0 && (
          <div style={{ display: "flex", gap: "1.5rem" }}>
            {socialLinks.map((s) => (
              <a
                key={s.platform}
                href={s.href}
                style={{
                  fontSize: "0.75rem",
                  fontWeight: 800,
                  textTransform: "uppercase",
                  letterSpacing: "0.1em",
                  color: "var(--color-foreground-on-dark)",
                  textDecoration: "none",
                  borderBottom: "2px solid var(--color-accent)",
                  paddingBottom: "2px",
                }}
              >
                {s.platform}
              </a>
            ))}
          </div>
        )}
      </div>
    </footer>
  );
}

Avis

Footer Brutalist — React Footer Section — Incubator