Saltar al contenido principal

Catálogo · Navegación

Barra lateral

Contiene la navegación principal de un sitio o una aplicación y se convierte en un panel lateral en pantallas pequeñas.

Encaja mejor en: documentación, app — la navegación de un sitio con muchas páginas o secciones, junto al contenido, con un panel lateral en el móvil

Esta traducción la ha escrito una IA y todavía no la ha revisado ninguna persona. Leer esta página en inglés

Ejemplo

Barra lateral con el nombre del producto, una lista de enlaces y el control del modo de color.

.luz-nav-toggle

On small screens the sidebar becomes a drawer. This page's navigation uses it live.

Problemas conocidos

En un navegador sin la API de popover, la navegación no se convierte en un panel lateral: permanece visible sobre el contenido en pantallas pequeñas.

Código

Copiar el marcado

Bundler
import "@luz-ds/catalog/components/sidebar.css";
HTML
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@luz-ds/catalog@0.3.0/dist/components/sidebar.min.css" integrity="sha384-vt36+ffiZY/k7pMatnSg+vcsgcYLY2cJSuWh3NBijr6OCkoyR0URAZbP0j6jTpjY" crossorigin="anonymous">
HTML
<header>
  <button class="luz-nav-toggle" type="button" popovertarget="site-nav" aria-label="Menu">
    <span class="luz-nav-toggle__bar"></span>
    <span class="luz-nav-toggle__bar"></span>
    <span class="luz-nav-toggle__bar"></span>
  </button>
</header>

<nav class="luz-sidebar" id="site-nav" popover aria-label="Main">
  <div class="luz-sidebar__section">
    <div class="luz-sidebar__section-label">Account</div>
    <a class="luz-sidebar__link is-active" href="/profile/" aria-current="page">Profile</a>
    <a class="luz-sidebar__link" href="/billing/">Billing</a>
  </div>
</nav>
JS
import { initSidebar } from "@luz-ds/catalog/sidebar";
initSidebar();

Variantes y opciones

Clase o atributoQué hace
.luz-sidebar
Columna de navegación, con los colores de la barra lateral
popover en .luz-sidebar
La convierte en un panel lateral con 768 px o menos
.luz-sidebar__brand, __brand-name, __logo, __version
Bloque de marca opcional en la parte superior
.luz-sidebar__section, __section-label
Grupo de enlaces y su etiqueta
.luz-sidebar__link
Enlace
data-luz-spy en cualquier elemento
No forma parte de la barra lateral: el indicador de desplazamiento también marca los enlaces a secciones de la página dentro de ella, como una tabla de contenidos con tu propio diseño
.is-active en un enlace
Resalta el enlace actual con el grosor y el color; acompáñalo de aria-current="page"
.luz-sidebar__footer
Fijado en la parte inferior, por ejemplo, para el modo de color
.luz-nav-toggle
Botón de menú, visible con 768 px o menos; colócalo al principio de la fila de cabecera
.luz-nav-toggle--fixed
Fija el botón de menú en la esquina superior inicial, en páginas sin cabecera

Cómo funciona

Punto de referencia <nav>, con estilos de components/sidebar.css. En pantallas pequeñas es un panel lateral nativo de tipo popover.

  • El botón de menú lo abre mediante popovertarget, sin scripts. El navegador se encarga de Escape, de cerrarlo al hacer clic fuera, de la capa superior y del estado expandido.
  • initSidebar() de sidebar.js es opcional: marca el enlace de la sección visible en páginas largas (aria-current="true") y cierra el panel al seguir un enlace. catalog.js lo ejecuta en las páginas que tienen una barra lateral. Una página que solo carga core no tiene seguimiento del desplazamiento, y el cajón funciona sin él.
  • El indicador de desplazamiento localiza los enlaces mediante .luz-sidebar__link y data-luz-spy: en cualquier elemento (como un <nav> de contenidos), sigue todos los enlaces internos que apuntan a una sección de la página (href="#…"). El atributo es el punto de conexión; el diseño de esos enlaces es cosa tuya.

Sin JavaScript

La barra lateral y el panel funcionan. El enlace actual es el que marcas en el marcado; no sigue el desplazamiento.

Teclado y ARIA

Tab recorre los enlaces en orden. En pantallas pequeñas, el botón de menú abre el panel; Escape o un clic fuera lo cierra y el foco vuelve al botón.

  • Si la página tiene más de un <nav>, asígnale un nombre con aria-label.
  • Marca la página actual con aria-current="page" y .is-active: la clase solo aporta el aspecto visual.
  • El botón de menú conserva el nombre «Menú» tanto si el panel está abierto como cerrado; popover expone el estado.

El contraste y el foco se explican en la pestaña Diseño.

Diseño

Cuándo usarlo

Usa una barra lateral para la navegación principal de una aplicación o de un sitio de documentación con muchas secciones.

Cuándo no usarlo

No uses una barra lateral en un sitio con pocas páginas: la navegación en la cabecera es más sencilla.

  • Para mostrar la ruta hasta la página actual, usa migas de pan.
  • Para los paneles de una misma página, usa pestañas.

Qué hacer y qué no

Hazlo Sustantivos breves, agrupados bajo una etiqueta y en el orden en que se necesitan.
Evítalo No uses frases ni enlaces genéricos: «Gestiona los datos de facturación» cuesta recorrerlo con la vista y «Otras cosas» no dice nada.

Cómo escribir el contenido

Pon a cada enlace el nombre de la página que abre, con una o dos palabras.

  • Las etiquetas de sección son sustantivos: «Cuenta», «Facturación».
  • Ordena los enlaces según la frecuencia con que se necesitan.

Contraste y foco

La barra lateral tiene sus propios tokens: texto claro sobre un panel oscuro en todos los modos y un enlace actual con fondo.

ParteColor sobre fondoClaroOscuroAlto contrasteMínimo necesario
Enlace
--luz-sidebar-text on --luz-sidebar-bg
10.9:1
10.0:1
14.1:1
4.5:1
Enlace al pasar el puntero
--luz-sidebar-text-hover on --luz-sidebar-hover
13.0:1
16.4:1
17.6:1
4.5:1
Enlace actual
--luz-sidebar-active-text on --luz-sidebar-active-bg
10.3:1
10.2:1
21.0:1
4.5:1
Fondo del enlace actual
--luz-sidebar-active-bg on --luz-sidebar-bg
8.9:1
10.2:1
21.0:1
3:1
Etiqueta de sección y versión
--luz-sidebar-label on --luz-sidebar-bg
6.7:1
6.6:1
6.4:1
4.5:1
Botón de menú
--luz-text-primary on --luz-surface-page
15.8:1
15.1:1
21.0:1
4.5:1
Borde del botón de menú
--luz-outline on --luz-surface-page
4.3:1
3.6:1
21.0:1
3:1
Anillo de foco del botón de menú
--luz-focus-ring on --luz-surface-page
5.6:1
7.7:1
21.0:1
3:1

Calculado a partir de los valores de los tokens de cada modo y redondeado hacia abajo. El mínimo necesario corresponde al nivel AA de WCAG 2.2: 4,5:1 para el texto y 3:1 para los anillos de foco, los bordes y los iconos.

  • Foco: el enlace recibe un contorno de 2 px dentro de su borde, del mismo color que su texto, para que el anillo tenga el contraste del propio enlace; los demás controles de la barra lateral usan --luz-sidebar-text-hover. El botón de menú tiene un contorno de 2 px --luz-focus-ring.
  • No solo el color: el enlace actual tiene un fondo y lleva aria-current.
  • Tamaño del objetivo: el botón de menú mide 44 px por lado.

Tokens que usa

Los 36 tokens que lee components/sidebar.css, agrupados por familia. Cada familia enlaza a su página, donde aparecen los valores de cada modo. En Figma son variables con los mismos nombres: consulta Tokens en Figma.

Spacing and sizing
--luz-control-lg, --luz-space-2xs, --luz-space-md, --luz-space-sm, --luz-space-xl, --luz-space-xs
Typography
--luz-font-mono, --luz-font-sans, --luz-text-md, --luz-text-sm, --luz-text-xl, --luz-text-xs
Radius
--luz-radius-md
Shadows
--luz-shadow-lg
Motion
--luz-duration-base, --luz-duration-fast, --luz-duration-slow, --luz-easing-standard
Layers
--luz-z-modal, --luz-z-sidebar
Layout and breakpoints
--luz-sidebar-width

El teclado y ARIA se explican en la pestaña Código.