Saltar al contenido principal

LUZ Sistema de diseño para el humano, listo para la IA

Tokens, CSS y un poco de JavaScript, sobre lo que el navegador ya hace: empieza un proyecto con LUZ, el sistema de diseño Light, Usable and Zero-dependency, o mígralo página a página. Cada componente funciona antes de que cargue JavaScript y cada cambio empieza con una prueba que falla.

La luz donde estás

Con JavaScript activado, aquí se dibuja la luz de tu hora.

Base

Tu marca, en tokens

Colores, escalas y los tres modos como propiedades personalizadas de CSS. Sin componentes: tu marcado, tus clases. En un proyecto que ya existe, empieza aquí: no tocan nada.

  • Colores. 53 primitivos y 63 tokens semánticos, en claro, oscuro y alto contraste.
  • Escalas. Espacio, texto, radios y sombras, desde tres mandos.
  • Peso. 3,0 KB en gzip, con todo lo anterior.
npm
npm install @luz-ds/tokens
CDN
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@luz-ds/tokens@0.3.0/dist/luz-tokens.min.css">
.cta {
  background: var(--luz-brand-fill);
  color: var(--luz-text-on-fill);
}

.cta:hover {
  background: var(--luz-brand-fill-hover);
}

a {
  color: var(--luz-brand-primary);
}

Base + Core

Componentes con core

Los componentes y la maquetación encima de los tokens, en una capa de cascada que tu CSS siempre gana. Para empezar un proyecto, o para migrar uno por partes con luz.conditional.css.

  • Componentes. 29, de botones y formularios a pestañas y un reproductor.
  • Maquetación. 10 objetos para filas, rejillas, pilas y contenedores.
  • Peso. 26,5 KB en gzip, con todo lo anterior.
npm
npm install @luz-ds/tokens @luz-ds/core
CDN
<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">
<script type="module" src="https://cdn.jsdelivr.net/npm/@luz-ds/core@0.3.0/dist/luz.min.js"></script>
<div class="luz-field">
  <label class="luz-field__label" for="f-name">Project name</label>
  <input class="luz-input" id="f-name" type="text" aria-describedby="f-name-help">
  <div class="luz-field__helper" id="f-name-help">Shown on the dashboard.</div>
</div>
<div class="luz-field">
  <label class="luz-field__label" for="f-slug">Slug</label>
  <input class="luz-input luz-input--error" id="f-slug" type="text"
         aria-invalid="true" aria-describedby="f-slug-error">
  <div class="luz-field__error" id="f-slug-error">Use letters, numbers and dashes only.</div>
</div>

Base + Core + Catálogo

Un sitio entero con el catálogo

Lo que necesita un sitio entero: buscar en él, preguntar por las cookies, cambiar de idioma.

  • Búsqueda. Un diálogo con Ctrl K que, sin JavaScript, es un enlace al índice.
  • Idioma y avisos. Un selector de idioma, submenús y un aviso de cookies que no tapa nada.
  • Peso. 58,6 KB en gzip, con todo lo anterior.
npm
npm install @luz-ds/tokens @luz-ds/core @luz-ds/catalog
CDN
<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">
<!-- One link per catalog component the page uses: here the search -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@luz-ds/catalog@0.3.0/dist/components/search.min.css">
<script type="module" src="https://cdn.jsdelivr.net/npm/@luz-ds/core@0.3.0/dist/luz.min.js"></script>
<script type="module" src="https://cdn.jsdelivr.net/npm/@luz-ds/catalog@0.3.0/dist/catalog.min.js"></script>
<luz-search>
  <a class="luz-search__fallback" href="../docs/a-z/" data-luz-search-fallback>A–Z</a>
  <button class="luz-search__trigger" type="button" data-luz-search-open hidden>Search</button>
  <dialog class="luz-modal luz-search" id="luz-search"
          data-luz-search-src="/search-index.json">
    <search class="luz-search__body">
      <input class="luz-input" id="luz-search-q" type="text">
      <p class="luz-search__status" role="status"></p>
      <div class="luz-search__results" data-luz-search-results>…</div>
    </search>
  </dialog>
</luz-search>

Base + Core + Catálogo + tu prompt

Tu sitio entero desde un prompt

Elige el de tu tipo de sitio y pégalo en la IA que uses. Te pregunta lo que necesitas y después construye tu sitio, o pasa a LUZ el que ya tienes.

  • Primero pregunta. Rondas de preguntas numeradas, con la respuesta que recomienda en primer lugar, y no escribe nada hasta que le das el visto bueno.
  • Tu stack, tu marca. HTML sin más, Astro, React, Vue o Angular, con tus colores o con los de serie.
  • Comprobado a cada paso. Cada paso acaba con la comprobación de LUZ y una nota breve de lo que no pudo verificar.

¿Otro tipo de sitio, o aún no lo sabes? El prompt general pregunta primero.

Empezar desde cero

Por qué LUZ

Tres palabras, una promesa.

Un sistema de diseño para la web que parte del CSS y no necesita compilación. Tu CSS siempre gana, JavaScript solo mejora la experiencia y cada página funciona antes de que cargue.

Light

Poco código y ningún paso de compilación.

  • tokens 3,0 KB
  • core 23,5 KB
  • catalog 32,1 KB
Los tres paquetes base: 58,6 KB. El peso gzip de lo que publica cada paquete, medido en dist al construir esta página.

CSS sin más y módulos ES pequeños, desde un CDN o desde npm. Sin preprocesador, sin compilador y sin paso de build: lo que lees en los archivos es justo lo que ejecuta el navegador. Tokens y core se mantienen tan pequeños como se puede, y su techo de peso nunca sube. Catalog es ligero porque viene en piezas: cada componente es su propio archivo y una página carga solo los que usa.

Usable

La accesibilidad es el punto de partida, no un añadido.

  • Contraste de color 100 %
  • Probado en RTL 97 %
  • Sin JavaScript 72 %
  • Foco propio 41 %
  • Colores forzados 41 %
  • Sin problemas conocidos 45 %
  • Tests sin JavaScript 29 %
29 componentes, 362 archivos de test. Contado al construir. Lo que no llega al 100 %, en la declaración.

Apunta a WCAG 2.2 AA, el nivel de la versión 4.1.1 de EN 301 549, la norma europea de accesibilidad digital. Parte de lo que el navegador ya hace bien, añade foco visible, contraste y movimiento reducido, y lo comprueba con axe en cada cambio. Todavía no cumple todos los criterios: la declaración enumera lo que se comprueba, lo que no se ha probado y lo que falla.

Zero-dependency

Tu código, no un árbol del código de otros.

  • Frameworks de CSS 0
  • Preprocesadores de CSS 0
  • Frameworks de JavaScript 0
  • Resaltadores de código 0
  • Librerías de iconos 0
  • Librerías de utilidades 0
  • Búsqueda y animación 0
Dependencias en tiempo de ejecución: 0. Contado en el package.json de cada paquete al construir esta página.

Los paquetes de LUZ se publican sin dependencias: solo CSS y módulos ES sobre lo que el navegador ya ofrece. Nada que instalar para probarlo, ningún framework que seguir y nada que se rompa cuando otra librería publica una versión mayor.

Encaja bien

  • Sitios de contenido, documentación y servicios públicos que deben cumplir WCAG 2.1 o 2.2 AA: LUZ ayuda, y el resultado lo compruebas tú.
  • Páginas generadas en el servidor y sitios estáticos, con cualquier lenguaje de servidor.
  • Equipos que quieren entender su CSS y controlarlo.

No encaja

  • Necesitas componentes de React o Vue ya hechos.
  • Necesitas una tabla de datos avanzada, gráficos o un selector de rango de fechas: LUZ no los incluye.
  • Necesitas una API estable hoy: LUZ está en beta y los nombres aún pueden cambiar.

HTML semántico, con estilo

Tu HTML ya tiene estilo

Escribe el elemento que quieres decir y LUZ le da estilo, sin clase. Empieza un proyecto con LUZ, o mígralo página a página: tu CSS siempre gana.

  • Sin clase. 68 etiquetas salen con estilo tal cual, formularios y tablas incluidos.
  • Una clase. El papel y el componente completo: un enlace con aspecto de botón, un botón de peligro, una tarjeta.
  • En tu proyecto. luz.conditional.css da estilo solo a lo que está dentro de [data-luz]; el resto de tu página queda como está.

21 de 29 componentes son solo CSS; el resto mejora con un script y funciona sin él.

Ver todas las etiquetas HTML
<details open>
  <summary>¿Necesito clases?</summary>
  <p>No. El HTML ya tiene estilo.</p>
</details>
¿Necesito clases?

No. El HTML ya tiene estilo.

Sin LUZ

¿Necesito clases?

No. El HTML ya tiene estilo.

El mismo HTML, con LUZ

¿Necesito clases?
Claro
¿Necesito clases?
Oscuro
¿Necesito clases?
Alto contraste
<label for="email">Correo</label>
<input id="email" type="email"
  value="ana@example.com">
<button>Guardar cambios</button>

Sin LUZ

El mismo HTML, con LUZ

Claro
Oscuro
Alto contraste
<a class="luz-btn luz-btn--primary"
  href="/docs/">Leer la documentación</a>
<button class="luz-btn luz-btn--danger"
  type="button">Borrar proyecto</button>
Leer la documentación

Sin la clase

Leer la documentación

Con la clase

Claro
Oscuro
Alto contraste

Modos de color

Tres modos para todos. El día entero, si lo quieres.

Cada color semántico está definido para claro, oscuro y alto contraste, y un atributo, data-theme, los cambia: en toda la página o en una caja, como en estas. Eso viene con core. El resto del día lo decides tú.

Core · incluido

Modo de color por hora del día · Catalog, opcional

Seis momentos, no un interruptor

Declara en HTML los momentos de tu día, del amanecer a la noche, y deja que quien lee elija uno o recorra el día. Auto sigue siendo el del sistema, y el alto contraste nunca se repinta.

  • Medido, no supuesto. Cada momento se mide en contraste sobre su modo base, igual que los tres modos.
  • Opcional, cero bytes. Vive en catalog: una hoja de estilos y un chunk perezoso. Si no lo enlazas, tu página no carga nada de él.
Lee la documentación de luz-theme-time

Preguntas

Preguntas frecuentes

Respuestas cortas a lo que se pregunta sobre LUZ: qué es y cómo se usa.

Sobre LUZ

¿Qué es LUZ?

LUZ es un sistema de diseño para la web en tres partes: tokens, core y catálogo, con prompts para que una IA construya el sitio contigo. Deja trabajar al navegador, se comprueba en vez de prometer y una IA puede escribirlo sin inventarse nada.

¿Qué hace cada parte de LUZ?

Los tokens guardan el aspecto, core da estilo a tu HTML y te da componentes, y el catálogo añade lo que necesita un sitio entero. Los tokens son los colores, las escalas, la tipografía y los tres modos de color como propiedades personalizadas de CSS, y se usan solos. Core es el reset, el estilo de cada etiqueta HTML, los objetos de maquetación (o-container, o-stack, o-grid), los componentes (.luz-btn, .luz-card, .luz-tabs) y un poco de JavaScript opcional. El catálogo son piezas para el sitio entero, como el buscador y el banner de cookies.

¿Qué hace distinto a LUZ de los sistemas que más se usan?

LUZ parte del navegador y no de un framework: HTML nativo, sin compilación, en cualquier stack, y funciona sin JavaScript. La accesibilidad se comprueba, no se promete: tests con axe, cada contraste calculado en cada modo, colores forzados y movimiento reducido. Pide menos marcado, porque el HTML sale completo sin clases, y se personaliza sin pelearse, con capas, :where() y tokens, nunca !important. Está lista para la IA de forma comprobable: los prompts se generan desde los paquetes, así que nunca llevan una clase inventada.

¿Dónde se queda corto LUZ?

LUZ se queda corto en comunidad, en widgets complejos (selector de fecha, combobox, tabla de datos), en componentes para React o Vue y en madurez: sigue en 0.x.

Cómo se usa

¿Cuál es la mejor forma de usar LUZ?

La mejor forma son seis pasos, sin nada que compilar:

  1. Carga luz-tokens.css, luz.css y luz.js por CDN o npm.
  2. Escribe HTML semántico.
  3. Pon una clase solo para lo que el HTML no puede decir, y maqueta con los objetos de core.
  4. Pon tu marca con tokens: copia _template.css y cambia los valores.
  5. Del catálogo, enlaza solo lo que uses.
  6. JavaScript es opcional: todo funciona sin él.

La vía rápida: pega en una IA el prompt de tu tipo de sitio y revisa el resultado con luz-check.

¿Necesito JavaScript para usar LUZ?

No. La mayoría de los componentes de LUZ son solo CSS, y los que tienen script también funcionan sin él. La página de cada componente explica qué obtienes sin JavaScript.

¿Puedo cambiar después los estilos por defecto?

Sí, sin pelearte con ellos. Los tokens son la forma prevista de cambiar el aspecto entero, y tu CSS gana: LUZ va en capas de cascada, así que el CSS sin capa lo vence sin !important. Lo que no sobrescribes se queda: si a un h1 solo le cambias el color, mantiene el tamaño de LUZ.

¿Para qué vale LUZ?

LUZ vale para sitios escritos en HTML, nuevos o ya hechos: landing, blog, documentación, web de empresa. Encaja con cualquier generador o CMS que produzca HTML, Markdown incluido (Hugo, Astro, Eleventy), con proyectos sin paso de compilación y con sitios que deben ser accesibles y funcionar sin JavaScript. Un sitio que ya existe puede pasar a LUZ por partes.

¿Para qué no vale LUZ?

LUZ no vale para utilidades al estilo de Tailwind ni para apps de React o Vue que esperan los componentes de su framework: LUZ da HTML y clases. Tampoco da la estructura de página ya hecha (cabecera, hero, pie): la escribes tú o la IA.

¿No está aquí? Más preguntas, sobre HTML y clases y sobre proyectos que ya existen