Navbar
BetaLa barra superior de un sitio o una app — marca, navegación y acciones, que se pliega a un menú cuando no entra.
registry/ds/navbar.tsximport { Button } from "@/registry/ds/button";
import { BookOpen, Calendar, FileText, Search, Users } from "@/registry/ds/icons";
import { Navbar, NavbarActions, NavbarBrand, NavbarLink, NavbarMenu, NavbarMenuLink, NavbarMobile, NavbarMobileGroup, NavbarMobileLink, NavbarNav } from "@/registry/ds/navbar";
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 NavbarBasic() {
return (
<div className="w-full overflow-hidden rounded-lg">
<Navbar position="static" collapse="sm">
<NavbarBrand href="#">
<Logo />
Campus
</NavbarBrand>
<NavbarNav>
<NavbarLink href="#" active>
Inicio
</NavbarLink>
<NavbarMenu label="Académico" columns={2}>
<NavbarMenuLink href="#" icon={<BookOpen />} label="Materias" description="Plan de estudios y correlativas" />
<NavbarMenuLink href="#" icon={<Calendar />} label="Calendario" description="Cursada, finales y feriados" />
<NavbarMenuLink href="#" icon={<Users />} label="Docentes" description="Cátedras y horarios de consulta" />
<NavbarMenuLink href="#" icon={<FileText />} label="Certificados" description="Regular, analítico y título" />
</NavbarMenu>
<NavbarLink href="#">Biblioteca</NavbarLink>
<NavbarLink href="#">Ayuda</NavbarLink>
</NavbarNav>
<NavbarActions>
<Button variant="stroke" size="sm" iconOnly={<Search />} aria-label="Buscar" />
<Button size="sm">Ingresar</Button>
<NavbarMobile>
<NavbarMobileLink href="#" active>
Inicio
</NavbarMobileLink>
<NavbarMobileGroup label="Académico">
<NavbarMobileLink href="#" icon={<BookOpen />}>
Materias
</NavbarMobileLink>
<NavbarMobileLink href="#" icon={<Calendar />}>
Calendario
</NavbarMobileLink>
<NavbarMobileLink href="#" icon={<Users />}>
Docentes
</NavbarMobileLink>
<NavbarMobileLink href="#" icon={<FileText />}>
Certificados
</NavbarMobileLink>
</NavbarMobileGroup>
<NavbarMobileGroup label="Más">
<NavbarMobileLink href="#">Biblioteca</NavbarMobileLink>
<NavbarMobileLink href="#">Ayuda</NavbarMobileLink>
</NavbarMobileGroup>
</NavbarMobile>
</NavbarActions>
</Navbar>
</div>
);
}Cuándo usarlo
Es la primera fila de cualquier pantalla: dice dónde estás (marca), a dónde podés ir (navegación) y qué podés hacer ahora (acciones). Un sitio público y una app interna usan el mismo Navbar; cambia lo que ponés en cada zona.
| Zona | Qué va | Qué no |
|---|---|---|
| Marca | Logo + nombre, lleva al inicio | Un eslogan, dos logos |
| Navegación | 3 a 6 destinos de primer nivel; desplegables para agrupar hasta 8 | Todo el sitemap; acciones ("Cerrar sesión") |
| Acciones | Búsqueda, un botón principal, avatar con menú | Más de un botón fill |
- Un solo link activo: la sección donde está la persona. El marcador de
abajo y
aria-currentlo dicen. - Desplegables para agrupar, no para esconder: si una sección tiene 2 subpáginas, mejor dos links. Cada item del desplegable lleva título y una descripción de una línea.
- Las acciones de cuenta (perfil, salir) van en un Menu detrás del avatar, no en la navegación.
stickypor defecto: la barra queda arriba al hacer scroll. Usástaticsolo en páginas de flujo (checkout, formularios largos) donde el espacio vertical importa.translucentdeja ver lo que pasa por debajo con blur: funciona sobre un hero o imágenes; en apps con tablas,solid.
Plegada
Cuando la barra mide menos que collapse (640, 768 o 1024 px), la navegación
se esconde y aparece ☰, que abre un Drawer desde
la izquierda con los mismos destinos. Las acciones siguen visibles: no
escondas el botón principal.
import { Button } from "@/registry/ds/button";
import { Navbar, NavbarActions, NavbarBrand, NavbarLink, NavbarMobile, NavbarMobileLink, NavbarNav } from "@/registry/ds/navbar";
/** Con collapse="lg" la barra se pliega por debajo de 1024 px: acá ya está plegada */
export default function NavbarCollapsed() {
return (
<div className="w-full overflow-hidden rounded-lg bg-bg-subtle">
<Navbar position="static" size="lg" variant="translucent" collapse="lg">
<NavbarBrand href="#">Campus</NavbarBrand>
<NavbarNav>
<NavbarLink href="#" active>
Inicio
</NavbarLink>
<NavbarLink href="#">Materias</NavbarLink>
<NavbarLink href="#">Biblioteca</NavbarLink>
</NavbarNav>
<NavbarActions>
<Button size="sm" variant="tonal">
Ingresar
</Button>
<NavbarMobile>
<NavbarMobileLink href="#" active>
Inicio
</NavbarMobileLink>
<NavbarMobileLink href="#">Materias</NavbarMobileLink>
<NavbarMobileLink href="#">Biblioteca</NavbarMobileLink>
</NavbarMobile>
</NavbarActions>
</Navbar>
<div className="h-24 bg-[radial-gradient(var(--primary-border)_1px,transparent_0)] [background-size:16px_16px]" aria-hidden />
</div>
);
}Se mide el ancho de la barra, no de la ventana (container query): la misma barra funciona al lado de un sidebar o adentro de un panel.
Combinaciones
- Navbar + Sidebar = estructura de app. La navegación va en el Sidebar; el Navbar queda con marca y acciones.
- Navbar + Footer = sitio público.
- Breadcrumb debajo del Navbar, nunca adentro.
| Size | Alto | Padding lateral | Gap marca–nav | Link |
|---|---|---|---|---|
md | 56 | 16 (24 desde 768) | 24 | 36 de alto · padding 12 · Text sm/Medium |
lg | 64 | 16 (24 desde 768) | 24 | igual |
- Marca: logo 24 + nombre Text md/Semibold, gap 8.
- Links: gap 4 entre sí, radius-md. Activo: marcador 2 × ancho del texto, radius-full, pegado al borde inferior de la barra.
- Desplegable: 8 px debajo del disparador; popover radius-lg, padding 8,
Elevation/lg. Item: padding 10, radius-md, icono en caja 32 radius-md
primary/faint, título Text sm/Medium, descripción Text xs. Hasta 480 de
ancho; 2 columnas con
columns={2}. - ☰: botón 36 radius-md, icono 20. Drawer
sm(320) desde la izquierda, items de 40 de alto; grupos con título Text xs/Medium mayúsculas. - Ancho del contenido:
contained= 1280 centrado;full= todo.
| Parte | Propiedad | Token |
|---|---|---|
| Barra | Fondo | bg/elevated |
| Barra translucent | Fondo | bg/elevated al 80 % + blur |
| Barra | Borde inferior | border/default |
| Marca | Texto | text/default |
| Link | Texto | text/muted |
| Link hover / abierto | Fondo + texto | bg/subtle + text/default |
| Link activo | Texto + marcador | text/default + primary/solid |
| Chevron | Icono | icon/subtle |
| Desplegable | Fondo + borde + sombra | bg/elevated + border/default + Elevation/lg |
| Item del desplegable | Caja del icono | primary/faint + primary/accent |
| Item hover | Fondo | bg/subtle |
| ☰ | Icono | icon/muted → icon/default |
| Link del Drawer activo | Fondo + texto | primary/faint + primary/text |
| Foco | Anillo 2 px | focus/ring |
Instalación
npx shadcn@latest add https://polen.cdc.cool/r/navbar.jsonTrae el Drawer para la versión plegada. Se arma por composición:
<Navbar>
<NavbarBrand href="/"><Logo />Campus</NavbarBrand>
<NavbarNav>
<NavbarLink href="/" active>Inicio</NavbarLink>
<NavbarMenu label="Académico" columns={2}>
<NavbarMenuLink href="/materias" icon={<BookOpen />} label="Materias" description="Plan y correlativas" />
</NavbarMenu>
</NavbarNav>
<NavbarActions>
<Button size="sm">Ingresar</Button>
<NavbarMobile>
<NavbarMobileLink href="/" active>Inicio</NavbarMobileLink>
</NavbarMobile>
</NavbarActions>
</Navbar>Playground
Configurá el componente y copiá el snippet: se genera del mismo estado que renderiza el preview.
<Navbar collapse="never">
<NavbarBrand href="/">
<Logo />
Campus
</NavbarBrand>
<NavbarNav>
<NavbarLink href="/" active>Inicio</NavbarLink>
<NavbarMenu label="Académico">
<NavbarMenuLink href="/materias" icon={<BookOpen />} label="Materias" description="Plan de estudios y correlativas" />
<NavbarMenuLink href="/calendario" icon={<Calendar />} label="Calendario" description="Cursada, finales y feriados" />
</NavbarMenu>
<NavbarLink href="/biblioteca">Biblioteca</NavbarLink>
</NavbarNav>
<NavbarActions>
<Button size="sm">Ingresar</Button>
<NavbarMobile>
<NavbarMobileLink href="/" active>Inicio</NavbarMobileLink>
<NavbarMobileLink href="/biblioteca">Biblioteca</NavbarMobileLink>
</NavbarMobile>
</NavbarActions>
</Navbar>| Prop | Tipo | Default | Descripción |
|---|---|---|---|
size | "md" | "lg" | "md" | 56 / 64 de alto. |
variant | "solid" | "translucent" | "solid" | Fondo opaco o al 80 % con blur. |
position | "sticky" | "static" | "sticky" | Pegada arriba al hacer scroll, o en el flujo. |
width | "contained" | "full" | "contained" | Contenido centrado a 1280 o a todo el ancho. |
collapse | "sm" | "md" | "lg" | "never" | "md" | Ancho de barra (640 / 768 / 1024) debajo del cual la navegación se pliega a ☰. never: no se pliega (solo con 2 o 3 links cortos). |
Partes
| Componente | Props | Qué es |
|---|---|---|
NavbarBrand | href + props de <a> | Logo y nombre; lleva al inicio. |
NavbarNav | label (default "Principal") | El <nav> con los links de escritorio. Se esconde al plegar. |
NavbarLink | href, active, icon, render | Un destino. render={<Link href="…" />} para el router. |
NavbarMenu | label, icon, columns 1 | 2 | Disparador de un desplegable; adentro van NavbarMenuLink. |
NavbarMenuLink | href, label, description, icon | Item del desplegable; cierra al hacer clic. |
NavbarActions | — | Lo de la derecha; se alinea solo al final. |
NavbarMobile | label (default "Menú") | ☰ + Drawer; aparece al plegar. Adentro: NavbarMobileLink y NavbarMobileGroup. |
NavbarMobileLink | href, active, icon | Link de 40 de alto dentro del Drawer. |
NavbarMobileGroup | label | Bloque con título dentro del Drawer (lo que arriba era un desplegable). |
Con Next.js, pasá el Link del router por render:
<NavbarLink render={<Link href="/materias" />} active={pathname === "/materias"}>Materias</NavbarLink><header>(landmark banner) con un<nav aria-label="Principal">adentro: el lector salta directo a la navegación.- El link de la página actual lleva
aria-current="page"además del marcador. - Los desplegables son botones con
aria-expanded; abren con hover (con demora, no se disparan al pasar) y con teclado. El panel es una lista de links reales. - ☰ se llama "Abrir menú" y abre un diálogo con foco atrapado; Esc cierra y devuelve el foco al botón.
- Los iconos son decorativos: el nombre lo da el texto.
| Tecla | Qué hace |
|---|---|
| Tab | Recorre marca, links, desplegables y acciones. |
| EnterEspacio↓ | Sobre un desplegable: lo abre y enfoca el primer item. |
| ←→ | Con un desplegable abierto: pasa al vecino sin cerrar. |
| ↑↓ | Dentro del desplegable: mueve entre items. |
| Esc | Cierra el desplegable o el Drawer. |