Primii pași cu Lily
Alege un framework, clonează monorepo-ul și deschide biblioteca sa headless sau aplicația-exemplu, apoi începe să-ți compui propriile pagini. Preferi un traseu ghidat? Începe cu tutorialele.
Instalare
Lily trăiește într-un singur monorepo Git, cu un director pentru biblioteca headless, pachetele de ajutor și aplicația-exemplu ale fiecărui framework. Cea mai rapidă cale de a-l încerca este să clonezi monorepo-ul și să deschizi biblioteca headless pentru stack-ul tău:
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-react-headless
pnpm install
Același tipar funcționează și pentru celelalte framework-uri:
@lilydesignsystem/html-headless— nu e nevoie de instalare; copiază fișierele.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
Bibliotecile headless sunt concepute pentru a fi clonate sau incluse în proiect — tratează sursa ca sursă a adevărului și copiază ce îți trebuie. ajutoarele pentru preferințe sunt livrate suplimentar ca pachete instalabile, cu un flux de build și publicare (npm pentru framework-urile JS, NuGet pentru Blazor).
Folosește o componentă headless
Componentele headless oferă HTML semantic, ARIA și proprietăți — dar niciun CSS. Iată un Button în fiecare 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" }) }}
Folosește un exemplu stilizat
Aplicațiile-exemplu includ CSS, rute și pagini demo complete. Cea mai rapidă cale de a experimenta este să pornești aplicația-exemplu SvelteKit, Next, Nuxt, Analog sau Eleventy și să vezi demo-ul la /components.
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-svelte-sveltekit-examples
pnpm install
pnpm run dev
Apoi deschide http://localhost:5173 și răsfoiește /components.
Stilizare și tokenuri de design
Fiecare componentă se randează cu o singură clasă în kebab-case pe elementul rădăcină. De exemplu, <Button> se randează ca <button class="button">. Stilizează-o cum dorești:
.button {
background: var(--my-primary);
color: #fff;
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
}
.button:hover { background: var(--my-primary-hover); }
Paleta de culori implicită Lily (folosită în aplicațiile-exemplu) este:
- Primar:
#2563eb - Pericol:
#dc2626 - Avertisment:
#f59e0b - Succes:
#16a34a - Fundalul paginii:
#f9fafb - Fundalul cardului:
#ffffff
Acestea sunt sugestii, nu cerințe. Înlocuiește-le cu paleta propriului brand și Lily te urmează bucuros.
Teme gata făcute
Nu vrei să scrii CSS de la zero? Lily include 57 de teme de referință independente în directorul themes/ . Fiecare este o foaie de stil care țintește cârligele de clasă Lily — leag-o și ești stilizat:
<link rel="stylesheet" href="/assets/themes/united-kingdom-government-digital-service.css" />
Setul cuprinde:
- Sector public — NHS England, NHS Scotland și NHS Wales (fiecare în variante pentru pacienți și pentru practicieni), GOV.UK GDS și U.S. Web Design System.
- Inspirate de furnizori — Adobe Spectrum, Mozilla Protocol.
- Uz general — light, dark, nord, dracula, wireframe și încă vreo treizeci.
Selectorii temelor folosesc :where(...), deci propriul tău CSS câștigă mereu la specificitate. Asociază-le cu ajutorul theme-picker de mai jos pentru schimbare la rulare sau urmează
tutorialul despre teme.
Ajutoare pentru preferințe
Fiecare framework are opt selectoare mici, fiecare un pachet
lily-design-system-{framework}-{package} propriu (și un picker-bar care le asamblează). Fiecare este un buton-pictogramă headless care deschide o fereastră pop-up — o casetă de listă, o listă de linkuri, un formular de căutare sau (pentru date-time-picker) un dialog de selectare a datei — nu un
<select>nativ; este sigur pentru SSR; și nu include CSS:
-
theme-picker — încarcă foile de stil ale temelor la rulare schimbând un
<link>gestionat, seteazădata-themepe document și, opțional, salvează persistent înlocalStorage. -
locale-picker — setează
langșidir(cu detectare automată RTL) pentru ca biblioteca ta i18n să poată urma; nu traduce nimic singur. -
text-size-picker — setează
data-text-sizepe document; CSS-ul tău asociază fiecare valoare cu o dimensiune a fontului. -
motion-picker — setează
data-motionpe document, pornind de la setarea de mișcare redusă a vizitatorului; CSS-ul și scripturile tale decid ce se suprimă. - search-picker — un buton-pictogramă care deschide un câmp de căutare; trimiterea navighează la o pagină de căutare. Deține o acțiune, nu o preferință.
- link-picker — o pictogramă de casă care deschide un meniu cu linkurile de pagină definite de aplicația ta (Acasă, Despre noi, Contact, Politica de confidențialitate, …). Deține o acțiune, nu o preferință.
- share-picker — deschide foaia nativă de partajare sau o listă de destinații furnizată de consumator, plus copierea URL-ului. Deține o acțiune, nu o preferință: nu aplică nimic, nu salvează nimic.
-
date-time-picker — un câmp de text plus un dialog APG de selectare a datei pentru o dată, o oră sau ambele. Deține o valoare de formular, nu o preferință: șirul ISO se convertește dus-întors în
<input type="date">.
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-svelte-theme-picker
Catalogul Svelte este referința canonică; porturile React, Vue, Angular, HTML, Nunjucks, Web Components și Blazor îl respectă contract cu contract. Vezi tutorialul despre ajutoare.
Accesibilitate
Componentele țintesc WCAG 2.2 AAA. Urmează aceste modele:
- Elemente HTML semantice în loc de
<div>s. <label for="id">generice, care leagă etichetele de câmpuri.aria-labelledby/aria-describedbypentru trimiteri încrucișate.aria-invalid+aria-errormessagepentru stări de eroare.role="alert"șiaria-livepentru conținut dinamic.aria-pressed,aria-expanded,aria-currentpentru stare.- Roving
tabindexpentru grile.
Indicatorii de focalizare sunt furnizați intenționat de consumator — Lily nu desenează niciodată un inel de focalizare implicit care să intre în conflict cu designul tău. Aplicațiile-exemplu mențin o linie de bază axe-core curată pe toate rutele lor.
Internaționalizare
Fiecare etichetă, substituent, mesaj de eroare și text de buton este o proprietate. Nu există șiruri scrise direct în cod. Conectează framework-ul de traducere preferit — Paraglide, i18next, vue-i18n, react-intl, fișiere .resx, orice.
Pentru date, numere și valute, componentele acceptă șiruri preformatate: tu formatezi cu Intl.DateTimeFormat /
Intl.NumberFormat / biblioteca ta preferată și transmiți rezultatul.
Ajutorul locale-picker semnalează localizarea aleasă bibliotecii tale i18n setând lang și dir pe rădăcina documentului.
Testare
Fiecare subproiect de framework livrează propriile teste, folosind stack-ul său idiomatic:
- HTML: WebDriverIO care rulează browsere reale.
- Svelte: Vitest +
@testing-library/svelte. - React: Vitest +
@testing-library/react. - Vue: Vitest +
@testing-library/vue. - Angular: Vitest + TestBed (prin pluginul Vite Analog).
- Nunjucks: Vitest cu un ajutor de randare.
- Blazor: bUnit.
Testele folosesc doar potrivitorii încorporați ai Vitest — niciodată potrivitorii
jest-dom . Aceasta păstrează suitele de teste portabile. Aplicațiile-exemplu adaugă suite end-to-end Playwright, linii de bază de accesibilitate axe-core și o parcurgere a viewport-urilor responsive.
Agenți AI
Acest site publică llms.txt și llms.json la rădăcina sa — o hartă selectată a celor mai importante pagini, pentru orice instrument care urmează convenția llms.txt.
Monorepo-ul canonic livrează în plus două
Claude Skills:
lily-design-system-skill: o competență de uz general care acoperă conceptele, terminologia și modelele de compoziție ale Lily pentru oricine construiește cu sistemul, și lily-design-system-maintainer-skill, o competență tehnică care acoperă structura fișierelor obligatorii și instrumentele monorepo-ului pentru oricine lucrează la el. Ambele se află la rădăcina
monorepo-ului canonic.
Depanare
O componentă se randează, dar arată nestilizată
Asta e headless funcționând conform intenției — niciun CSS nu vine cu componenta. Fie scrii CSS pentru clasa în kebab-case a componentei (afișată pe fiecare pagină de catalog) fie legi una dintre cele 57 de teme gata făcute.
CSS-ul meu nu pare să se aplice peste o temă
Ar trebui — selectorii temelor sunt înfășurați în :where(...), care are specificitate zero. Dacă o regulă tot pierde, verifică dacă foaia ta de stil se încarcă după <link> temei și dacă selectorul se potrivește cu adevărat cu cârligul de clasă al componentei.
pnpm install eșuează cu o eroare de peer sau de versiune
Folosește un pnpm actual (v10+) și Node 22+. Fiecare subproiect își fixează versiunile framework-ului în propriul package.json; dacă lanțul tău global de instrumente este mai vechi, pnpm env use --global lts este remedierea cea mai rapidă.
Cititorul de ecran anunță un nume greșit pentru un control
Verifică proprietatea obligatorie label a componentei — componentele fără text vizibil au nevoie de una, iar
aria-label / aria-labelledby furnizate de consumator și transmise prin rest-props câștigă intenționat în fața legăturii încorporate. Fiecare pagină de catalog documentează contractul ARIA al componentei.
Ajutorul theme-picker nu schimbă foile de stil
Confirmă că themesUrl indică un director pe care browserul îl poate prelua (servește fișierele themes/ ca resurse statice) și că slug-urile temelor din proprietatea themes se potrivesc cu numele fișierelor. Ajutorul schimbă href unui singur
<link data-lily-theme-picker> gestionat — inspectează-l în instrumentele pentru dezvoltatori ca să vezi URL-ul solicitat.
Altceva este defect
Deschide un issue cu o reproducere minimă la github.com/LilyDesignSystem/lily-design-system — sau vezi comunitate și asistență.
Contribuie
Lily este tânăr și primește cu drag colaborarea. Cele mai utile contribuții acum sunt:
- Componente noi (mai ales modele din sisteme de design consacrate).
- Teme noi — fiecare este o foaie de stil autonomă, un prim PR bine delimitat.
- Stilizare mai bună a exemplelor — arată ce este posibil.
- Traduceri ale șirurilor aplicațiilor-exemplu.
- Rapoarte de erori cu o reproducere minimă.
- Audituri de accesibilitate cu cititoare de ecran și tehnologii de asistență.
Deschide issue-uri și PR-uri la github.com/LilyDesignSystem/lily-design-system.
Comunitate și asistență
- Întrebări și rapoarte de erori — deschide un issue la github.com/LilyDesignSystem/lily-design-system.
- E-mail — responsabilul citește joel@joelparkerhenderson.com și primește cu drag colaborare, îndrumare și feedback.
- Oglinzi — Lily este trimis și către Codeberg și GitLab, ca să poți participa din forja preferată.
- Conduită — proiectul urmează un cod de conduită standard; fii amabil, presupune bună-credință.
FAQ
De ce headless în loc de stilizat?
Componentele pre-stilizate sunt comode — până când nu se potrivesc brandului tău. Componentele headless cer puțin mai multă muncă la început, dar îți dau control total asupra designului vizual. Aplicațiile-exemplu și cele 57 de teme arată moduri de a le stiliza; le poți prelua sau le poți înlocui complet. Argumentul mai lung este la De ce Lily.
De ce atât de multe componente?
Lily își propune să acopere modelele de care au nevoie majoritatea aplicațiilor, fără să te oblige să le construiești de la zero — inclusiv lucruri aprofundate precum câmpurile pentru identificatori naționali și scrollytelling editorial. Catalogul se inspiră dintr-o duzină de sisteme de design consacrate plus muncă originală — vezi Despre.
Pot folosi Lily cu Tailwind?
Da. Fiecare componentă expune o singură clasă rădăcină în kebab-case plus un className / classfurnizat de consumator. Suprapune utilitarele Tailwind cum dorești.
Pot folosi Lily cu framework-uri CSS semantice precum DaisyUI?
Da. Numele de clasă în kebab-case de pe elementul rădăcină funcționează ca cârlige CSS semantice. Asociază Lily cu un framework semantic și obții componente pre-stilizate care respectă totuși ARIA și i18n.
Există un pachet npm?
Ajutoarele pentru preferințe sunt livrate ca pachete cu un flux de publicare npm/NuGet. Bibliotecile de componente headless sunt concepute pentru a fi clonate sau incluse în proiect — sursa este livrabilul, așa că poți citi, tăia și deține exact ce livrezi. Publicarea în registre a bibliotecilor headless rămâne pe foaia de parcurs.
De ce mai multe licențe?
Proiectele diferite au nevoi diferite de licențiere. BSD și MIT sunt permisive, Apache-2.0 are o acordare de brevet, iar opțiunile GPL susțin copyleft. Alege ce se potrivește situației tale.
Cum raportez o eroare sau cer o funcționalitate?
Deschide un issue în depozitul GitHub sau trimite un e-mail la joel@joelparkerhenderson.com.