Saltar al contenido principal

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.

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

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.

Qué paquete contiene cada parte de una página
PiezaClases o atributosPaqueteNotas
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-shell con .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.css contiene estas seis capas y luz.print. Tokens está en luz.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, en luz.catalog; luz.themes está vacía, reservada para un tema propio. Si una página solo necesita unos pocos componentes, carga dist/base.css (ajustes, restablecimiento y elementos) y luego dist/components/<name>.css para 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.

HTML
<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

HTML
<!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>