TetraKits UI Sticky Radial Footer ← Library

Sticky Radial Footer

21st.dev sticky-footer radial mesh: staggered link columns, indigo glow on deep violet-black. TetraKits brand + social icons.

sticky footer styleindigo radial footer21st dev footermesh gradient footerpremium dark footer
Live preview

Dependencies

react framer-motion lucide-react
npm install framer-motion lucide-react
"use client";

import { motion } from "framer-motion";
import { Boxes, Facebook, Github, Instagram, Linkedin, Youtube } from "lucide-react";

const groups = [
  {
    label: "Product",
    links: ["UI Library", "Free Tools", "Templates", "Pricing", "Mobile kit", "API access"],
  },
  {
    label: "Resources",
    links: ["Documentation", "Blog", "Case studies", "Changelog", "Community", "Status"],
  },
  {
    label: "Company",
    links: ["About", "Careers", "Press", "Partners", "Contact", "Legal"],
  },
];

const socials = [
  { Icon: Github, href: "https://github.com/tetrakits" },
  { Icon: Linkedin, href: "https://linkedin.com/company/tetrakits" },
  { Icon: Youtube, href: "#" },
  { Icon: Instagram, href: "#" },
  { Icon: Facebook, href: "#" },
];

export function StickyStyleFooter() {
  return (
    <footer className="relative w-full bg-[#0c0a18] border-t border-white/10">
      <div aria-hidden className="pointer-events-none absolute inset-0 overflow-hidden">
        <div className="bg-[radial-gradient(circle,rgba(99,102,241,0.12)_0,transparent_70%)] absolute -top-40 left-0 h-80 w-80 -rotate-45 rounded-full opacity-60" />
        <div className="bg-[radial-gradient(circle,rgba(99,102,241,0.12)_0,transparent_70%)] absolute -top-20 right-0 h-64 w-64 rotate-12 rounded-full opacity-40" />
      </div>
      <div className="relative mx-auto flex max-w-6xl flex-col justify-between gap-10 px-6 py-14 md:px-12">
        <div className="flex flex-col gap-10 xl:flex-row">
          <motion.div initial={{ opacity: 0, y: 12 }} whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} className="max-w-sm space-y-4">
            <Boxes className="h-8 w-8 text-indigo-400" />
            <p className="text-sm leading-relaxed text-zinc-400">Free React UI components & browser tools for builders. Trusted by 12,400+ developers shipping faster with copy-paste React UI.</p>
            <div className="flex gap-2 pt-2">
              {socials.map(({ Icon, href }, i) => (
                <motion.a key={i} href={href} whileHover={{ y: -2 }} className="flex h-9 w-9 items-center justify-center rounded-lg border border-white/10 text-zinc-400 transition hover:border-white/20 hover:text-white">
                  <Icon className="h-4 w-4" />
                </motion.a>
              ))}
            </div>
          </motion.div>
          {groups.map((group, index) => (
            <motion.div key={group.label} initial={{ opacity: 0, y: 12 }} whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ delay: index * 0.08 }} className="min-w-[140px]">
              <h3 className="text-xs font-semibold uppercase tracking-wider text-zinc-300">{group.label}</h3>
              <ul className="mt-4 space-y-2 text-sm text-zinc-500">
                {group.links.map((link) => (
                  <li key={link}><a href="#" className="transition hover:text-white">{link}</a></li>
                ))}
              </ul>
            </motion.div>
          ))}
        </div>
        <div className="flex flex-col items-center justify-between gap-3 border-t border-white/10 pt-6 text-sm text-zinc-600 md:flex-row">
          <p>© 2026 TetraKits Inc. All rights reserved.</p>
          <p className="text-indigo-400">hello@tetrakits.com</p>
        </div>
      </div>
    </footer>
  );
}