Primeros pasos
Cómo se organiza LUZ
Paquetes con dependencias en una sola dirección, CSS en capas de cascada dentro de una llamada luz y un script opcional.
Límites entre paquetes
Cada paquete depende de los que aparecen por encima en esta lista, nunca de los que aparecen por debajo.
El nombre significa Light, Usable & Zero-dependency: ligero (CSS sin procesar y módulos ES, sin nada que compilar para quienes lo usan), usable por todo el mundo (HTML nativo, tres modos de color y pruebas de accesibilidad) y sin dependencias en tiempo de ejecución.
@luz-ds/tokens -> primitive and semantic tokens (standalone)
↓ required by
@luz-ds/core -> components, objects, bare-element styles, optional JS
↓ required by
@luz-ds/catalog -> search, cookie-consent, theme-time, lang-switch, submenu, announcement, and the patterns of a landing page, a blog or newspaper, a web application and a documentation site
- El catálogo necesita core y tokens; core necesita tokens; tokens no necesita nada.
- Tokens, core y catalog comparten versión. No hay paquetes para un tipo de sitio: los patrones de una landing page, un blog, una aplicación o un sitio de documentación son componentes del catálogo, un archivo cada uno.
- Los paquetes lo declaran como dependencias peer. Los scripts de core y catalog avisan en la consola si falta una capa.
La documentación sigue a los paquetes, con un área más: Tipos de sitio reúne, para cada tipo, el prompt para un LLM y las recetas de sus partes, hechas con los paquetes de arriba y con los patrones de ese tipo en el catálogo.
Qué necesita cada paquete
Busca la pieza que quieres y instala el paquete de su fila y los que aparecen debajo.
| Pieza | Clases o atributos | Paquete | Notas |
|---|---|---|---|
Modos de color, tokens semánticos, ET Book | --luz-*, data-theme | tokens | No hace falta nada más |
Restablecimiento y estilos de elementos HTML sin clases | h1, p, a, ul… | core | En base.css y luz.css |
Componentes | .luz-btn, .luz-field, .luz-card, .luz-table, .luz-tabs… | core | También hay un archivo por componente en components/ |
Diálogo modal | .luz-modal en un <dialog> | core | El script es una alternativa para navegadores sin command y commandfor |
Objetos de maquetación | .o-container, .o-grid, .o-stack, .o-media | core | El espaciado procede de los tokens de espacio |
Maquetación de una aplicación con una columna lateral | .o-shell, .o-main | core | Un <footer> sencillo, como hijo directo de .o-shell, ocupa la parte inferior; su aspecto lo decides tú o lo define un tipo de sitio |
Una página sin barra lateral, una barra fija, un grupo de acciones | .o-page, .o-sticky, .o-actions | core | En lugar de .o-shell, para una página sin barra lateral: la página y sus barras |
Modo de color: Automático, claro, oscuro y alto contraste | <luz-theme-mode> | core | luz.js carga su script, theme-mode.js, cuando la página contiene el elemento; sin él, los botones de opción siguen funcionando y Automático sigue al sistema: Modo de color |
Enlace para saltar, banda y marco de imagen | .luz-skip-link, .luz-band, .luz-image | core | El marco de imagen mantiene una proporción y recorta la imagen; si no hay imagen, muestra una superficie lisa |
La cabecera, el hero, las secciones y el pie de una landing page | .luz-site-header, .luz-hero, .luz-main, .luz-section, .luz-stat, .luz-site-footer, .luz-glow | catalog | Un archivo cada uno, components/<block>.css. Se basa en los objetos de core (.o-page, .o-sticky, .o-container, .o-grid--split) y la navbar de catalog. Una cuadrícula de características usa ul.o-grid.o-grid--split, de core |
La cabecera, la cabecera de página y de artículo, el índice y el pie de un blog o periódico | .luz-site-header (--publication), .luz-masthead, .luz-page-header, .luz-article-header, .luz-article, .luz-toc, .luz-site-footer | catalog | Un archivo cada uno, components/<block>.css; el índice está en article.css. Se basa en los objetos de core y la navbar de catalog. Las tarjetas, los listados y la ficha del autor usan la tarjeta de core: consulta Blog o periódico |
La cabecera y el panel de control de una aplicación web | .luz-app-bar (__product, __actions, __account), .luz-dashboard (__head, __title, __panel) | catalog | Un archivo cada uno, components/app-bar.css y components/dashboard.css. Se basa en la estructura, la barra fija, la cuadrícula y la tarjeta de core, y en la barra lateral de catalog. Sin script. Consulta App header y Dashboard |
La estructura, la cabecera de página, la barra lateral, el ejemplo, Qué hacer y qué no, la paginación y el pie de una web de documentación | .luz-docs-layout, .luz-doc-header, .luz-page-rail, .luz-example, .luz-do-dont, .luz-pager, .luz-page-footer | catalog | Un archivo cada uno, components/<block>.css. Se basa en la estructura, el bloque de código y las tablas de core, y en la barra lateral de catalog. Sin script. Consulta Shell |
Los enlaces de una cabecera | .luz-navbar | catalog | Un archivo, components/navbar.css. Panel popover a 768 px o menos, que abre un .luz-nav-toggle, sin script. luz.css no lo incluye |
Una barra lateral, su marca y su botón de menú | .luz-sidebar (__brand, __logo, __brand-name, __version), .luz-nav-toggle | catalog | Un archivo, components/sidebar.css. El cajón es un popover nativo y no necesita script. catalog.js carga sidebar.js, el seguimiento del desplazamiento, cuando la página tiene una barra lateral; una página que solo carga core no lo tiene |
Un comando en un bloque enmarcado | .luz-terminal | catalog | Un archivo, components/terminal.css. Sin script propio: el botón de copia es de core |
Una línea de tiempo de eventos con fecha | <luz-timeline>, .luz-timeline | catalog | catalog.js carga su script, timeline.js, cuando la página contiene el elemento; sin él, la línea de tiempo es una lista |
Submenú y anuncio | <luz-submenu>, <luz-announcement> | catalog | Etiquetas sin script ni clase: el submenú es un <details> nativo entre los enlaces de una cabecera; el anuncio, una <section> |
Consentimiento de cookies | <luz-cookie-consent>, .luz-cookie-consent | catalog | catalog.js carga el script cookie-consent.js cuando la página contiene el elemento; muestra una banda fija en la parte inferior de la ventana; sin el script permanece oculta |
Modo de color con la hora del día y deslizador del día | <luz-theme-time> | catalog | catalog.js carga el script theme-time.js cuando la página contiene el elemento, y theme-time-bar.js si tiene un variant="bar"; sin ellos, los botones de opción de core siguen funcionando y el modo automático sigue al sistema |
Selector de idioma | <luz-lang-switch> | catalog | Sin script |
Búsqueda del sitio | <luz-search>, .luz-search | catalog | Necesita el script ( catalog.js, que carga search.js cuando la página contiene el elemento) y un archivo de índice; sin ellos, es un enlace |
Estilos de impresión | No hay que añadir nada | core | En luz.css; el catálogo añade sus propias reglas de impresión |
Una zona en una página que ya tiene diseño | data-luz | core | luz.conditional.css, en lugar de luz.css |
Comprobación de lo que has escrito tú o un agente de IA | npx @luz-ds/check@0.3.0, el comando luz-check | check | Una herramienta sin CSS ni capa, que no necesita ningún otro paquete: analiza tu HTML y CSS sin conexión. Consulta Trabajar con IA |
- Dos formas de maquetar una página, ambas de core.
.o-shellcon.o-main: una columna lateral junto al área principal..o-page: cabecera, contenido y pie en una columna. Elige una para la estructura de la página: la primera si tiene barra lateral y la segunda si no. Las cabeceras y los pies de landing o CMS funcionan con ambas; esta documentación usa.o-shell. - El catálogo necesita core, y core necesita tokens, así que cada paquete necesita también todos los paquetes de debajo. Los patrones de una landing page, un blog, una app y una web de documentación son componentes de catalog, así que también necesitan core y tokens.
Capas CSS
El CSS de core usa capas de cascada nativas (@layer), en el orden ITCSS y dentro de una capa contenedora llamada luz. Las seis de abajo contienen sus reglas; la página sobre capas las enumera todas, junto con tokens, catálogo e impresión.
Una capa posterior prevalece sobre una anterior, y cualquier CSS tuyo que no esté en una capa prevalece sobre todo LUZ, sin !important. Cómo ordenarlas y sobrescribirlas.
packages/core/src/
settings/_settings.css luz.settings z-index, layout widths, field text
generic/_reset.css luz.generic the reset
elements/*.css luz.elements bare HTML elements, zero specificity
objects/_objects.css luz.objects layout: .o-*
components/*.css luz.components the components: .luz-*
utilities/_utilities.css luz.utilities single-purpose helpers: .u-*
- La capa de componentes contiene 29 componentes.
dist/luz.csscontiene estas seis capas yluz.print. Tokens está enluz.tokens, catalog, con la barra de navegación, la barra lateral, el terminal, la línea de tiempo y los patrones de un tipo de sitio, enluz.catalog;luz.themesestá vacía, reservada para un tema propio. Si una página solo necesita unos pocos componentes, cargadist/base.css(ajustes, restablecimiento y elementos) y luegodist/components/<name>.csspara cada uno.- Las reglas de los elementos sin clase están dentro de
:where(), así que cualquier clase prevalece sobre ellas.
El script
Un único punto de entrada opcional, luz.js, inicia todos los comportamientos de la página: modo de color, botones para copiar, diálogos, resaltado, reproductores y pestañas.
<script type="module" src="https://cdn.jsdelivr.net/npm/@luz-ds/core@0.3.0/dist/luz.min.js"></script>
Para cargar menos código, importa un módulo y llama a su función init. Consulta Módulos de JavaScript.
Página mínima
<!doctype html>
<html lang="en" data-theme="light">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Sign up – Acme</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@luz-ds/tokens@0.3.0/dist/luz-tokens.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@luz-ds/core@0.3.0/dist/luz.min.css">
</head>
<body>
<main class="o-container">
<h1>Sign up</h1>
<form action="/signup/" method="post">
<div class="luz-field">
<label class="luz-field__label" for="email">Email</label>
<input class="luz-input" id="email" name="email" type="email" autocomplete="email" required>
</div>
<button class="luz-btn luz-btn--primary" type="submit">Create account</button>
</form>
</main>
</body>
</html>