Footer
BetaEl pie de un sitio — marca y redes, columnas de links y la fila legal.
registry/ds/footer.tsximport { Footer, FooterBottom, FooterBrand, FooterColumn, FooterColumns, FooterLegal, FooterLink, FooterSocial, FooterSocialLink } from "@/registry/ds/footer";
import { Globe, Mail } from "@/registry/ds/icons";
const Logo = () => (
<svg viewBox="0 0 24 24" aria-hidden>
<rect width="24" height="24" rx="6" fill="var(--primary)" />
<path d="M7 12.5l3.5 3.5L17 9" stroke="var(--primary-fg)" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" fill="none" />
</svg>
);
export default function FooterBasic() {
return (
<div className="w-full overflow-hidden rounded-lg">
<Footer>
<FooterColumns>
<FooterBrand logo={<Logo />} name="Campus" description="Materias, inscripciones y certificados de la universidad en un solo lugar.">
<FooterSocial>
<FooterSocialLink href="https://example.edu" label="Sitio institucional">
<Globe />
</FooterSocialLink>
<FooterSocialLink href="mailto:hola@campus.edu" label="Escribinos">
<Mail />
</FooterSocialLink>
</FooterSocial>
</FooterBrand>
<FooterColumn title="Académico">
<FooterLink href="#">Materias</FooterLink>
<FooterLink href="#">Calendario</FooterLink>
<FooterLink href="#">Docentes</FooterLink>
<FooterLink href="#">Biblioteca</FooterLink>
</FooterColumn>
<FooterColumn title="Trámites">
<FooterLink href="#">Inscripción</FooterLink>
<FooterLink href="#">Certificados</FooterLink>
<FooterLink href="#">Becas</FooterLink>
</FooterColumn>
<FooterColumn title="Ayuda">
<FooterLink href="#">Centro de ayuda</FooterLink>
<FooterLink href="#">Contacto</FooterLink>
<FooterLink href="https://status.example.edu" external>
Estado del sistema
</FooterLink>
</FooterColumn>
<FooterColumn title="Institucional">
<FooterLink href="#">La universidad</FooterLink>
<FooterLink href="#">Sedes</FooterLink>
<FooterLink href="#">Trabajá con nosotros</FooterLink>
</FooterColumn>
</FooterColumns>
<FooterBottom>
<p>© 2026 Universidad. Todos los derechos reservados.</p>
<FooterLegal>
<FooterLink href="#">Privacidad</FooterLink>
<FooterLink href="#">Términos</FooterLink>
<FooterLink href="#">Accesibilidad</FooterLink>
</FooterLegal>
</FooterBottom>
</Footer>
</div>
);
}Cuándo usarlo
Al final de toda página de un sitio público: es donde la gente busca lo que no encontró arriba (contacto, legales, sedes) y donde el sitio cuenta quién es. Una app interna no necesita columnas: con la fila final alcanza.
- 3 a 5 columnas de 3 a 6 links. Más que eso es un sitemap; menos, no justifica las columnas.
- Títulos como categorías, no como verbos: "Académico", "Trámites", "Ayuda". Los links repiten los nombres de las páginas, no los reinventan.
- La marca ocupa dos columnas: logo, una descripción de una o dos líneas y las redes. Es la única zona con íconos.
- La fila final lleva el © y los links legales (privacidad, términos, accesibilidad). Nada más: no es un segundo menú.
- Mismo orden de columnas en todo el sitio. El footer es un mapa; si cambia por página, deja de servir.
Simple
Sin columnas, solo la fila final: <Footer compact>. Para apps, páginas de
flujo (login, checkout) y sitios chicos.
import { Footer, FooterBottom, FooterLegal, FooterLink } from "@/registry/ds/footer";
/** Sin columnas: solo la fila final. Para apps internas o páginas de flujo (login, checkout) */
export default function FooterSimple() {
return (
<div className="w-full overflow-hidden rounded-lg">
<Footer variant="default" compact>
<FooterBottom>
<p>© 2026 Campus · Universidad</p>
<FooterLegal>
<FooterLink href="#">Privacidad</FooterLink>
<FooterLink href="#">Términos</FooterLink>
<FooterLink href="mailto:ayuda@campus.edu">Ayuda</FooterLink>
</FooterLegal>
</FooterBottom>
</Footer>
</div>
);
}| Valor | |
|---|---|
| Padding vertical | 48 (64 desde 1024) |
| Padding lateral | 16 (24 desde 640) |
| Grilla | 2 columnas · 4 desde 768 · 6 desde 1024; la marca ocupa 2 |
| Gap | 32 horizontal · 40 vertical |
| Marca | logo 24 + nombre Text md/Semibold · descripción Text sm, 320 máx. · redes 36 × 36 con icono 20 |
| Columna | título Text sm/Medium · links Text sm, gap 8, título–links 12 |
| Fila final | 48 arriba (64 desde 1024), línea arriba, 24 de padding, Text xs |
| Ancho del contenido | contained 1280 centrado · full |
| Parte | Propiedad | Token |
|---|---|---|
| Pie subtle | Fondo + borde superior | bg/subtle + border/default |
| Pie default | Fondo | bg/default |
| Marca | Nombre · descripción | text/default · text/muted |
| Título de columna | Texto | text/default |
| Link | Texto | text/muted |
| Link hover | Texto | text/default |
| Red social | Icono | icon/muted |
| Red social hover | Fondo + icono | bg/surface + icon/default |
| Fila final | Texto · línea | text/subtle · border/default |
| Foco | Anillo 2 px | focus/ring |
Instalación
npx shadcn@latest add https://polen.cdc.cool/r/footer.jsonPlayground
Configurá el componente y copiá el snippet: se genera del mismo estado que renderiza el preview.
variant
<Footer>
<FooterColumns>
<FooterBrand logo={<Logo />} name="Campus" description="Materias, inscripciones y certificados en un solo lugar.">
<FooterSocial>
<FooterSocialLink href="https://example.edu" label="Sitio institucional">
<Globe />
</FooterSocialLink>
</FooterSocial>
</FooterBrand>
<FooterColumn title="Académico">
<FooterLink href="#">Carreras</FooterLink>
<FooterLink href="#">Calendario</FooterLink>
<FooterLink href="#">Biblioteca</FooterLink>
</FooterColumn>
<FooterColumn title="Ayuda">
<FooterLink href="#">Preguntas frecuentes</FooterLink>
<FooterLink href="#">Contacto</FooterLink>
<FooterLink href="#">Estado del sistema</FooterLink>
</FooterColumn>
</FooterColumns>
<FooterBottom>
<p>© 2026 Campus · Universidad</p>
<FooterLegal>
<FooterLink href="/privacidad">Privacidad</FooterLink>
<FooterLink href="/terminos">Términos</FooterLink>
</FooterLegal>
</FooterBottom>
</Footer><Footer>
<FooterColumns>
<FooterBrand logo={<Logo />} name="Campus" description="…">
<FooterSocial>
<FooterSocialLink href="https://…" label="Instagram"><Instagram /></FooterSocialLink>
</FooterSocial>
</FooterBrand>
<FooterColumn title="Académico">
<FooterLink href="/materias">Materias</FooterLink>
</FooterColumn>
</FooterColumns>
<FooterBottom>
<p>© 2026 Universidad</p>
<FooterLegal>
<FooterLink href="/privacidad">Privacidad</FooterLink>
</FooterLegal>
</FooterBottom>
</Footer>| Prop | Tipo | Default | Descripción |
|---|---|---|---|
variant | "subtle" | "default" | "subtle" | bg/subtle o bg/default. |
width | "contained" | "full" | "contained" | Contenido centrado a 1280 o a todo el ancho. |
compact | boolean | false | Solo la fila final: menos padding y FooterBottom sin línea arriba. Para apps internas y páginas de flujo. |
Partes
| Componente | Props | Qué es |
|---|---|---|
FooterColumns | — | La grilla responsive. |
FooterBrand | href, logo, name, description | Marca, ocupa 2 columnas; adentro, las redes. |
FooterSocial | label (default "Redes") | Fila de iconos. |
FooterSocialLink | href, label | Un icono-link con nombre; abre en pestaña nueva. |
FooterColumn | title | Columna de links; es un <nav> nombrado por el título. |
FooterLink | href, external | Un link; hereda el tamaño de texto de donde está. |
FooterBottom | — | Fila final con línea arriba (sin línea si el Footer es compact). |
FooterLegal | label (default "Legal") | Links legales en fila; FooterLink adentro. |
<footer>(landmark contentinfo). Cada columna es un<nav>con nombre: el lector lista "Académico, navegación", "Ayuda, navegación"… y los links legales son otro<nav>"Legal".- Los iconos de redes son links con
aria-label("Instagram"), no imágenes sueltas; abren en pestaña nueva conrel="noreferrer". externalagrega el icono y el aviso "(se abre en una pestaña nueva)" para lectores.- Los títulos de columna no son headings: el footer no compite con la estructura de la página.
- Contraste: text/muted sobre bg/subtle cumple 4.5:1 en los dos temas.