Table
Rows of records that share the same attributes.
Core · Mostrar contenido
Agrupa unos pocos datos sobre un elemento en una superficie con borde.
Dos tarjetas, cada una con un título y un dato sobre un servicio.
1,204 requests per minute.
48 active connections.
En una tarjeta con enlace, no se puede seleccionar con el ratón el texto del cuerpo, incluido el precio: el enlace del título cubre toda la tarjeta, así que al arrastrar se sigue o se mueve el enlace. La búsqueda en la página, la selección con el teclado y los lectores de pantalla permiten acceder al texto con normalidad.
<article class="luz-card">
<h3 class="luz-card__title">Database</h3>
<p class="luz-card__body">48 active connections.</p>
</article>
Una tarjeta, seis clases y dos modificadores. Un enlace en el título convierte toda la tarjeta en un enlace; cualquier otro enlace o botón queda por encima de él.
| Clase o marcado | Qué hace |
|---|---|
.luz-card | La superficie: borde, esquinas redondeadas y relleno |
.luz-card | Tamaño base, seminegrita y color de texto principal |
.luz-card | Tamaño mediano y color de texto secundario |
.luz-card | El precio: tamaño base, seminegrita, color de texto principal y cifras del mismo ancho. El precio anterior va dentro de <s> |
.luz-card | La tarjeta que destaca en el grupo: tiene un borde de 2 px del color de marca y la misma altura que las demás. Indica también el motivo con palabras, por ejemplo, con una etiqueta como «La más elegida» |
.luz-card | Una imagen arriba, un cuerpo y las acciones al pie: una columna flex sin relleno propio, de modo que la imagen llega hasta el borde |
.luz-card | El <img>, a todo el ancho, recortado a --luz-card-ratio (16 / 9 si no lo defines) y redondeado solo arriba |
.luz-card | Los enlaces o botones, empujados al pie, de modo que los de tarjetas contiguas queden alineados |
<a> dentro de .luz-card | Tarjeta con enlace: el enlace cubre la tarjeta, el título pasa a sans, el borde se oscurece y aparece una sombra al pasar el puntero; un anillo de foco rodea la tarjeta |
Combina una tarjeta con los objetos de maquetación y otros componentes sin añadir clases: crea una tarjeta con enlace, coloca un avatar o un icono junto al texto con .o-media, añade una imagen encima y una fila de acciones con .o-row.
Rows of records that share the same attributes.
Looks after billing and invoices.
A two-hour walk from the car park.
48 active connections.
<a> dentro del encabezado, rodeando su texto. Se permite añadir un segundo enlace o un botón, que quedará por encima del enlace del título: consulta la tarjeta de producto más abajo..o-media lo coloca junto a .o-media__body, que contiene el título y el cuerpo. Junto a un nombre, oculta el avatar con aria-hidden="true": repite el nombre..luz-image) dentro del relleno, con .u-mb-sm debajo. El texto alt describe la imagen; si solo repite el título, déjalo vacío (alt="")..o-row con botones pequeños (.luz-btn--sm) o etiquetas (.luz-tag) al final de la tarjeta. En una tarjeta con enlace, pon como máximo una acción en forma de botón después del título.Una tarjeta de tienda incluye una imagen, un título con enlace, un precio y una acción. La acción es un botón dentro de un formulario, así que funciona sin JavaScript; está por encima del enlace del título y recibe sus propios clics.
Bodega Albar · 75 cl
12,50 €
Bodega Albar · 75 cl
Now 9,90 € Was 12,50 €
<article>
<h4 id="red-wines">Red wines</h4>
<ul class="o-grid o-grid--auto" aria-labelledby="red-wines">
<li class="luz-card">
<div class="luz-image luz-image--4x3 u-mb-sm">
<picture>…<img src="malbec.jpg" alt="" width="640" height="480" loading="lazy" decoding="async"></picture>
</div>
<h5 class="luz-card__title"><a href="/wines/malbec-2021/">Malbec 2021</a></h5>
<p class="luz-card__body">Bodega Albar · 75 cl</p>
<p class="luz-card__price"><data value="12.50">12,50 €</data></p>
<form action="/cart/add" method="post">
<input type="hidden" name="product" value="malbec-2021">
<button class="luz-btn luz-btn--primary luz-btn--block" type="submit">Add to cart<span class="u-sr-only"> Malbec 2021</span></button>
</form>
</li>
</ul>
<output class="u-sr-only" id="cart-status"></output>
</article>
.luz-btn--block: es fácil pulsarlo con el pulgar y su etiqueta ocupa varias líneas sin salir de la tarjeta, sea cual sea el tamaño del texto..u-sr-only, que repite exactamente el texto del enlace (mantén el espacio delante). Una lista de doce botones llamados «Añadir a la cesta» no dice nada a quien consulta los botones de la página o los dicta por voz.aria-labelledby apunta al <h4> que hay encima y las tarjetas usan el siguiente nivel. Core no da estilo a las listas: elimina las viñetas y la sangría con una regla propia (list-style: none; margin: 0; padding: 0).<s>; oculta visualmente las palabras «Ahora» y «Antes» para que el orden quede claro en el lector de pantalla; la línea que lo tacha no depende del color.<output> vacío (tiene el role status) en la página y escribe «Malbec 2021 añadido a la cesta» en él; el foco se mantiene en el botón. A menudo no se anuncia una región de estado que se crea a la vez que su texto. Sin scripts, se envía el formulario y la página de la cesta confirma la acción.<span class="luz-tag">Sold out</span>; no desactives el botón.<img> y define tus propias reglas de tamaño.En un grupo de planes u ofertas, .luz-card--featured destaca la opción que conviene mirar primero. La clase no comunica nada al lector de pantalla, así que la tarjeta incluye una etiqueta de texto que explica el motivo.
79 €
The talks and the workshops of one day.
Choose One dayNow 149 € Was 180 €
Both days, lunch and the recordings. Most chosen
Choose Two days590 €
Two days for five people, with a shared table.
Choose Team<article class="luz-card luz-card--featured">
<h4 class="luz-card__title">Two days</h4>
<p class="luz-card__price"><data value="149">149 €</data></p>
<p class="luz-card__body">Both days, lunch and the recordings.
<span class="luz-tag luz-tag--blue">Most chosen</span></p>
<a class="luz-btn luz-btn--primary luz-btn--block" href="/register/?ticket=two-days">Choose Two days</a>
</article>
Para un proyecto, un artículo o un lugar: una imagen, unas pocas palabras y una o más acciones. .luz-card--media convierte la tarjeta en una columna, la imagen llega hasta su borde y las acciones quedan al pie, de modo que en una cuadrícula los botones se alinean sea cual sea la longitud del texto.
Tides for any harbour on the coast, read from a public data set and kept up to date every night, with a chart of the week.
A small parser.
<article class="luz-card luz-card--media">
<img class="luz-card__media" src="tides.webp" alt="" width="1200" height="675">
<div class="luz-card__body o-stack">
<h3 class="luz-card__title">Tide table</h3>
<p>Tides for any harbour on the coast.</p>
</div>
<div class="luz-card__actions o-actions">
<a class="luz-btn luz-btn--primary" href="/tides/demo/">Open the demo<span class="u-sr-only"> of Tide table</span></a>
<a class="luz-btn luz-btn--secondary" href="/tides/code/">View the code<span class="u-sr-only"> of Tide table</span></a>
</div>
</article>
__actions no necesita más. Varios destinos: ningún enlace en el título. Pon cada uno en __actions: un enlace alrededor del título cubriría la tarjeta y competiría con los botones..u-sr-only, para que una lista de enlaces diga qué proyecto abre cada uno.alt=""; si no, di qué muestra la imagen. Da siempre width y height, para que la tarjeta no salte al cargar la imagen.--luz-card-ratio: 4 / 3 en la tarjeta, o en un contenedor, cambia la forma de todas sus tarjetas; la imagen se recorta, nunca se deforma..o-actions).Un contenedor al que da estilo components/card.css. No necesita JavaScript.
<article> para un elemento autónomo, <div> para un grupo de datos y <li> dentro de una lista de tarjetas.--luz-radius-md, como en una figura o un desplegable..luz-card--media es display: flex en columna con padding: 0: la imagen no tiene relleno; el cuerpo y las acciones llevan --luz-space-md. Las acciones tienen margin-block-start: auto, que las empuja al pie de una tarjeta estirada a la altura de su fila. La imagen mantiene aspect-ratio: var(--luz-card-ratio, 16 / 9) con object-fit: cover, y sus esquinas superiores son el radio de la tarjeta menos el borde de 1 px; la tarjeta no recorta nada, de modo que el anillo de foco se ve entero.::after del enlace se extiende por toda la tarjeta (position: absolute; inset: 0), de modo que al hacer clic en cualquier punto se abre el enlace. La tarjeta usa position: relative para contenerlo. Cualquier otro enlace o control dentro de ella (a, button, input, select, textarea, summary) usa position: relative con z-index: 1 para quedar por encima de esa capa y recibir sus propios clics; el enlace del título es el único que nunca se eleva. La etiqueta de un botón ocupa varias líneas dentro de una tarjeta (white-space: normal), así que una etiqueta larga o un texto ampliado no se sale. Al pasar el puntero, el borde cambia a --luz-input-border y aparece una pequeña sombra; al recibir el foco del teclado, un anillo rodea la tarjeta. El título de una tarjeta con enlace usa una fuente sans, como la navegación o una lista de enlaces; una tarjeta sin enlace conserva la tipografía de los encabezados. Ambos casos se detectan con :has(); una tarjeta sin enlace no cambia al pasar el puntero..luz-card--featured establece border-width: 2px con --luz-brand-primary y resta el píxel adicional del relleno, por lo que la tarjeta conserva la altura de las demás. En una tarjeta con enlace, el borde cambia a --luz-brand-hover al pasar el puntero y el anillo de foco del teclado queda a 4 px del borde, para que no parezca más grueso.No cambia nada: una tarjeta, tenga enlace o no, incluida la tarjeta con imagen, usa HTML y CSS.
Una tarjeta no es interactiva ni recibe el foco.
role, tabindex ni aria-label a la tarjeta.El contraste y el foco están en la pestaña Diseño.
Usa una tarjeta para agrupar unos pocos datos que se entienden como una unidad, a menudo en una cuadrícula de elementos similares.
.luz-card--featured) para la opción recomendada de un grupo de planes u ofertas..luz-card--media) para un proyecto, un artículo o un lugar con imagen, con un destino o dos acciones.No uses una tarjeta para encerrar contenido que no sea un elemento independiente.
<ul>): una tarjeta por enlace solo añade bordes.Usa un sustantivo breve como título y añade después una o dos líneas.
El título usa texto principal y el cuerpo texto secundario sobre la superficie de la tarjeta. En una tarjeta con enlace, el título es un enlace y el borde al pasar el puntero y el anillo de foco se sitúan entre la tarjeta y la página.
Una tarjeta destacada tiene un borde de marca respecto a ambos.
| Parte | Color sobre el fondo | Claro | Oscuro | Alto contraste | Mínimo |
|---|---|---|---|---|---|
Título | --luz-text-primary on --luz-surface | 16.5:1 | 14.0:1 | 21.0:1 | 4.5:1 |
Precio | --luz-text-primary on --luz-surface | 16.5:1 | 14.0:1 | 21.0:1 | 4.5:1 |
Cuerpo | --luz-text-secondary on --luz-surface | 6.4:1 | 6.9:1 | 19.3:1 | 4.5:1 |
Enlace del título | --luz-brand-primary on --luz-surface | 5.9:1 | 7.2:1 | 14.1:1 | 4.5:1 |
Borde de la tarjeta con enlace al pasar el puntero | --luz-input-border on --luz-surface | 3.9:1 | 3.9:1 | 21.0:1 | 3:1 |
Borde de la tarjeta con enlace al pasar el puntero, respecto a la página | --luz-input-border on --luz-surface-page | 3.7:1 | 4.2:1 | 21.0:1 | 3:1 |
Borde de la tarjeta destacada | --luz-brand-primary on --luz-surface | 5.9:1 | 7.2:1 | 14.1:1 | 3:1 |
Borde de la tarjeta destacada respecto a la página | --luz-brand-primary on --luz-surface-page | 5.6:1 | 7.7:1 | 14.1:1 | 3:1 |
Borde de la tarjeta destacada con enlace al pasar el puntero | --luz-brand-hover on --luz-surface-page | 7.7:1 | 10.2:1 | 17.9:1 | 3:1 |
Anillo de foco alrededor de una tarjeta con enlace | --luz-focus-ring on --luz-surface-page | 5.6:1 | 7.7:1 | 21.0:1 | 3:1 |
Medido a partir de los valores de los tokens de cada modo y redondeado hacia abajo. El mínimo requerido es el de WCAG 2.2 AA: 4,5:1 para texto y 3:1 para anillos de foco, bordes e iconos.
--luz-focus-ring rodea la tarjeta, a 2 px de su borde (a 4 px en una tarjeta destacada, cuyo borde tiene 2 px de grosor). Ambos son contornos y se mantienen en el modo de colores forzados.--luz-divider) es decorativo y no tiene un mínimo: el contenido y el espacio que lo rodea agrupan la tarjeta. En una tarjeta con enlace, el borde al pasar el puntero usa --luz-input-border, alcanza al menos 3:1 y va acompañado de una sombra.Los 19 tokens que lee components/card.css, agrupados por familia. Cada familia enlaza a su página, donde aparecen los valores de todos los modos. En Figma son variables con los mismos nombres: consulta Tokens en Figma.
--luz-brand-hover, --luz-brand-primary, --luz-divider, --luz-focus-ring, --luz-input-border, --luz-surface, --luz-text-primary, --luz-text-secondary--luz-space-2xs, --luz-space-md, --luz-space-sm--luz-radius-md--luz-font-sans, --luz-text-base, --luz-text-md--luz-shadow-sm--luz-duration-base, --luz-duration-fast, --luz-easing-enterEl teclado y ARIA están en la pestaña Código.