Primeros pasos con Lily
Elige un framework, clona el repositorio headless o la aplicación de ejemplo y empieza a componer tus propias páginas. ¿Prefieres un camino guiado? Empieza por los tutoriales.
Instalación
Lily se publica como repositorios Git independientes para cada framework. La forma más rápida de probarla es clonar el repositorio headless de tu tecnología:
git clone https://github.com/LilyDesignSystem/lily-design-system-react-headless
cd lily-design-system-react-headless
pnpm install
El mismo patrón sirve para los demás frameworks:
@lilydesignsystem/html-headless— no hace falta instalar nada; copia los archivos.html@lilydesignsystem/svelte-headless—pnpm install@lilydesignsystem/react-headless—pnpm install@lilydesignsystem/vue-headless—pnpm install@lilydesignsystem/angular-headless—pnpm install@lilydesignsystem/nunjucks-headless—pnpm installlily-design-system-blazor-headless—dotnet build
Las bibliotecas headless están pensadas para clonarse o incorporarse al proyecto: trata el código fuente como la fuente de verdad y copia lo que necesites. Los asistentes de preferencias se distribuyen además como paquetes instalables con una canalización de compilación y publicación (npm para los frameworks de JS, NuGet para Blazor).
Usar un componente headless
Los componentes headless incluyen HTML semántico, ARIA y propiedades, pero nada de CSS. Aquí tienes un botón en cada framework:
HTML
<button class="button" type="button" aria-label="Save">
Save
</button>
Svelte
<script>
import Button from "lily-design-system-svelte-headless/components/Button/Button.svelte";
</script>
<Button onclick={save}>Save</Button>
React
import Button from "lily-design-system-react-headless/components/Button";
<Button onClick={save}>Save</Button>
Vue
<script setup>
import Button from "lily-design-system-vue-headless/components/Button.vue";
</script>
<Button @click="save">Save</Button>
Angular
import { Button } from "@lilydesignsystem/angular-headless";
@Component({
imports: [Button],
template: `<lily-button (click)="save()">Save</lily-button>`,
})
Blazor
<Button OnClick="Save">Save</Button>
Nunjucks
{% from "components/button/macro.njk" import button %}
{{ button({ text: "Save", type: "button" }) }}
Usar un ejemplo con estilo
Las aplicaciones de ejemplo incluyen CSS, rutas y páginas de demostración completas. La forma más rápida de experimentar es iniciar la aplicación de ejemplo de SvelteKit, Next, Nuxt, Analog o Eleventy y ver la demostración en /components.
git clone https://github.com/LilyDesignSystem/lily-design-system-svelte-sveltekit-examples
cd lily-design-system-svelte-sveltekit-examples
pnpm install
pnpm run dev
Después abre http://localhost:5173 y explora /components.
Estilos y tokens de diseño
Cada componente se renderiza con una única clase en kebab-case en su elemento raíz. Por ejemplo, <Button> renderiza <button class="button">. Dale el estilo que quieras:
.button {
background: var(--my-primary);
color: #fff;
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
}
.button:hover { background: var(--my-primary-hover); }
La paleta de colores predeterminada de Lily (usada en las aplicaciones de ejemplo) es:
- Primario:
#2563eb - Peligro:
#dc2626 - Advertencia:
#f59e0b - Éxito:
#16a34a - Fondo de página:
#f9fafb - Fondo de tarjeta:
#ffffff
Son sugerencias, no requisitos. Sustitúyelas por la paleta de tu propia marca y Lily se adaptará encantada.
Temas listos para usar
¿No quieres escribir CSS desde cero? Lily incluye 45 temas de referencia independientes en el directorio themes/. Cada uno es una hoja de estilo que apunta a las clases de enlace de Lily: enlázala y ya tienes estilo:
<link rel="stylesheet" href="/assets/themes/united-kingdom-government-digital-service.css" />
El conjunto abarca:
- Sector público — NHS England, NHS Scotland y NHS Wales (con variantes para pacientes y para profesionales), GOV.UK GDS y el Sistema de diseño web de EE. UU.
- Inspirados en proveedores — Adobe Spectrum, Mozilla Protocol.
- Uso general — claro, oscuro, nord, dracula, wireframe y una treintena más.
Los selectores de los temas usan :where(...), de modo que tu propio CSS siempre gana en especificidad. Combínalos con el asistente theme-picker que verás más abajo para cambiar de tema en tiempo de ejecución, o sigue el tutorial de temas.
Asistentes de preferencias
Cada framework tiene un catálogo complementario *-helpers con ocho selectores pequeños (y un picker-bar que los reúne). Cada uno es un botón de icono headless que abre una ventana emergente —una lista de opciones, una lista de enlaces, un formulario de búsqueda o (en el caso de date-time-picker) un diálogo de selección de fecha—, no un <select> nativo; es compatible con SSR y no incluye CSS:
- theme-picker — carga hojas de estilo de temas en tiempo de ejecución intercambiando un
<link>gestionado, establecedata-themeen el documento y, opcionalmente, lo guarda enlocalStorage. - locale-picker — establece
langydir(con detección automática de escritura de derecha a izquierda) para que tu biblioteca de i18n pueda seguirlos; no traduce nada por sí mismo. - text-size-picker — establece
data-text-sizeen el documento; tu CSS asigna cada valor a un tamaño de fuente. - motion-picker — establece
data-motionen el documento, partiendo de la preferencia de movimiento reducido del visitante; tu CSS y tus scripts deciden qué suprimir. - search-picker — un botón de icono que abre un campo de búsqueda; al enviarlo se navega a una página de búsqueda. Se encarga de una acción, no de una preferencia.
- link-picker — un icono de inicio que abre un menú con los enlaces de página que define tu aplicación (Inicio, Quiénes somos, Contacto, Política de privacidad, …). Se encarga de una acción, no de una preferencia.
- share-picker — abre la hoja de compartir nativa o una lista de destinos proporcionada por el consumidor, además de copiar la URL. Se encarga de una acción, no de una preferencia: no aplica nada y no guarda nada.
- date-time-picker — un campo de texto más un diálogo de selección de fecha APG para una fecha, una hora o ambas. Se encarga de un valor de formulario, no de una preferencia: la cadena ISO se convierte de ida y vuelta con
<input type="date">.
git clone https://github.com/LilyDesignSystem/lily-design-system-svelte-helpers
El catálogo de Svelte es la referencia canónica; las versiones para React, Vue, Angular, HTML, Nunjucks, Web Components y Blazor coinciden con él contrato por contrato. Consulta el tutorial de asistentes.
Accesibilidad
Los componentes apuntan a WCAG 2.2 AAA. Siguen estos patrones:
- Elementos HTML semánticos en lugar de
<div>genéricos. <label for="id">para vincular etiquetas con campos.aria-labelledby/aria-describedbypara referencias cruzadas.aria-invalid+aria-errormessagepara estados de error.role="alert"yaria-livepara contenido dinámico.aria-pressed,aria-expanded,aria-currentpara el estado.tabindexitinerante para las cuadrículas.
Los indicadores de foco los aporta el consumidor de forma intencionada: Lily nunca dibuja un anillo de foco predeterminado que choque con tu diseño. Las aplicaciones de ejemplo mantienen una base limpia de axe-core en todas sus rutas.
Internacionalización
Toda etiqueta, marcador de posición, mensaje de error y texto de botón es una propiedad. No hay cadenas escritas en el código. Incorpora el framework de traducción que prefieras: Paraglide, i18next, vue-i18n, react-intl, archivos .resx, lo que sea.
Para fechas, números y monedas, los componentes aceptan cadenas ya formateadas: tú las formateas con Intl.DateTimeFormat / Intl.NumberFormat / tu biblioteca preferida y pasas el resultado.
El asistente locale-picker comunica a tu biblioteca de i18n la configuración regional elegida estableciendo lang y dir en la raíz del documento.
Pruebas
Cada subproyecto de framework incluye sus propias pruebas con su pila idiomática:
- HTML: WebDriverIO con navegadores reales.
- Svelte: Vitest +
@testing-library/svelte. - React: Vitest +
@testing-library/react. - Vue: Vitest +
@testing-library/vue. - Angular: Vitest + TestBed (mediante el complemento Analog de Vite).
- Nunjucks: Vitest con un asistente de renderizado.
- Blazor: bUnit.
Las pruebas usan únicamente los comparadores integrados de Vitest, nunca los comparadores de jest-dom. Así los conjuntos de pruebas siguen siendo portables. Las aplicaciones de ejemplo añaden conjuntos de Playwright de extremo a extremo, bases de accesibilidad con axe-core y un barrido de tamaños de ventana adaptables.
Agentes de IA
Este sitio publica llms.txt y llms.json en su raíz: un mapa cuidado de sus páginas más importantes, para cualquier herramienta que siga la convención llms.txt.
El monorrepositorio canónico incluye además dos habilidades de Claude: lily-design-system-skill, una habilidad de uso general que cubre los conceptos, la terminología y los patrones de composición de Lily para quien construye con el sistema, y lily-design-system-maintainer-skill, una habilidad técnica que cubre la estructura de archivos obligatorios y las herramientas del monorrepositorio para quien trabaja en él. Ambas están en la raíz del monorrepositorio canónico.
Solución de problemas
Un componente se renderiza pero se ve sin estilo
Es headless funcionando como debe: con el componente no se distribuye ningún CSS. Escribe CSS para la clase en kebab-case del componente (se muestra en cada página del catálogo) o enlaza uno de los 45 temas listos para usar.
Mi CSS no parece aplicarse sobre un tema
Debería: los selectores de los temas están envueltos en :where(...), que tiene especificidad cero. Si una regla sigue perdiendo, comprueba que tu hoja de estilo se carga después del <link> del tema y que el selector coincide realmente con la clase de enlace del componente.
pnpm install falla con un error de dependencia entre pares o de versión
Usa un pnpm actual (v10 o posterior) y Node 22 o posterior. Cada repositorio fija las versiones de su framework en package.json; si tu cadena de herramientas global es más antigua, pnpm env use --global lts es la solución más rápida.
El lector de pantalla anuncia un nombre incorrecto para un control
Revisa la propiedad obligatoria label del componente: los componentes sin texto visible la exigen, y los aria-label / aria-labelledby aportados por el consumidor y transmitidos mediante las propiedades restantes prevalecen deliberadamente sobre el cableado integrado. Cada página del catálogo documenta el contrato ARIA del componente.
El asistente theme-picker no cambia las hojas de estilo
Confirma que themesUrl apunta a un directorio que el navegador pueda recuperar (sirve los archivos de themes/ como recursos estáticos) y que los identificadores de los temas de tu propiedad themes coinciden con los nombres de archivo. El asistente intercambia el href de un único <link data-lily-theme-picker> gestionado: inspecciónalo en las herramientas de desarrollo para ver qué URL se solicita.
Algo más no funciona
Abre una incidencia con un caso reproducible mínimo en el repositorio correspondiente de github.com/LilyDesignSystem o consulta comunidad y asistencia.
Cómo contribuir
Lily es joven y agradece la colaboración. Las contribuciones más útiles ahora mismo son:
- Componentes nuevos (sobre todo patrones de sistemas de diseño consolidados).
- Temas nuevos: cada uno es una hoja de estilo independiente, una primera solicitud de cambios bien acotada.
- Mejores estilos de ejemplo: muestra lo que es posible.
- Traducciones de las cadenas de las aplicaciones de ejemplo.
- Informes de errores con un caso reproducible mínimo.
- Auditorías de accesibilidad con lectores de pantalla y tecnologías de apoyo.
Abre incidencias y solicitudes de cambios en el repositorio correspondiente de github.com/LilyDesignSystem.
Comunidad y asistencia
- Preguntas e informes de errores — abre una incidencia en el repositorio correspondiente de github.com/LilyDesignSystem.
- Correo electrónico — el responsable lee joel@joelparkerhenderson.com y agradece la colaboración, la orientación y los comentarios.
- Réplicas — Lily también se publica en Codeberg y GitLab, para que puedas participar desde la plataforma que prefieras.
- Conducta — el proyecto sigue un código de conducta estándar; sé amable y presupón buena fe.
Preguntas frecuentes
¿Por qué headless en lugar de con estilo?
Los componentes con estilo predefinido son cómodos, hasta que no encajan con tu marca. Los componentes headless dan algo más de trabajo al principio, pero te dan control total sobre el diseño visual. Las aplicaciones de ejemplo y los 45 temas muestran formas de darles estilo; puedes tomarlas o sustituirlas por completo. El argumento completo está en Por qué Lily.
¿Por qué tantos componentes?
Lily pretende cubrir los patrones que necesitan la mayoría de las aplicaciones sin obligarte a construirlos desde cero, incluidos casos más especializados como los campos de identificadores nacionales y el scrollytelling editorial. El catálogo se nutre de una docena de sistemas de diseño consolidados además de trabajo original; consulta Acerca de.
¿Puedo usar Lily con Tailwind?
Sí. Cada componente expone una única clase raíz en kebab-case más un className / class aportado por el consumidor. Añade utilidades de Tailwind por encima como prefieras.
¿Puedo usar Lily con frameworks de CSS semánticos como DaisyUI?
Sí. Los nombres de clase en kebab-case del elemento raíz funcionan como enlaces de CSS semántico. Combina Lily con un framework semántico y tendrás componentes con estilo predefinido que siguen respetando ARIA y i18n.
¿Hay un paquete de npm?
Los asistentes de preferencias se distribuyen como paquetes con una canalización de publicación en npm/NuGet. Las bibliotecas de componentes headless están pensadas para clonarse o incorporarse al proyecto: el código fuente es el entregable, de modo que puedes leer, recortar y poseer exactamente lo que distribuyes. La publicación en registros de las bibliotecas headless sigue en la hoja de ruta.
¿Por qué tiene licencia múltiple?
Cada proyecto tiene necesidades de licencia distintas. BSD y MIT son permisivas, Apache-2.0 incluye una concesión de patentes y las opciones de GPL admiten copyleft. Elige la que se adapte a tu situación.
¿Cómo informo de un error o solicito una función?
Abre una incidencia en el repositorio de GitHub correspondiente o escribe a joel@joelparkerhenderson.com.