Aan de slag met Lily
Kies een framework, kloon de monorepo en open de headless bibliotheek of voorbeeldapp, en begin je eigen pagina's samen te stellen. Liever een begeleid pad? Begin met de handleidingen.
Installeren
Lily woont in één Git-monorepo, met een map voor de headless bibliotheek, de helperpakketten en de voorbeeldapp van elk framework. De snelste manier om het te proberen is de monorepo klonen en de headless bibliotheek voor jouw stack openen:
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-react-headless
pnpm install
Hetzelfde patroon werkt voor de andere frameworks:
@lilydesignsystem/html-headless– geen installatie nodig; kopieer.html-bestanden@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
De headless bibliotheken zijn bedoeld om te worden gekloond of gevendord – beschouw de broncode als de bron van waarheid en kopieer wat je nodig hebt. voorkeurshelpers worden bovendien geleverd als installeerbare pakketten met een build- en publicatiepijplijn (npm voor de JS-frameworks, NuGet voor Blazor).
Een headless component gebruiken
Headless componenten bevatten semantische HTML, ARIA en props – maar geen CSS. Hier is een Button in elk 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" }) }}
Een opgemaakt voorbeeld gebruiken
De voorbeeldapps bevatten CSS, routes en volledige demopagina's. De snelste manier om te experimenteren is de voorbeeldapp voor SvelteKit, Next, Nuxt, Analog of Eleventy te starten en de demo te bekijken op /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
Open dan http://localhost:5173 en blader naar /components.
Opmaak en designtokens
Elke component wordt gerenderd met één kebab-case klasse op het rootelement. Bijvoorbeeld rendert <Button> als <button class="button">. Maak het op zoals je wilt:
.button {
background: var(--my-primary);
color: #fff;
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
}
.button:hover { background: var(--my-primary-hover); }
Het standaard kleurenpalet van Lily (gebruikt in de voorbeeldapps) is:
- Primair:
#2563eb - Gevaar:
#dc2626 - Waarschuwing:
#f59e0b - Succes:
#16a34a - Paginaachtergrond:
#f9fafb - Kaartachtergrond:
#ffffff
Dit zijn suggesties, geen vereisten. Vervang ze door je eigen merkpalet en Lily past zich vrolijk aan.
Kant-en-klare thema's
Wil je CSS niet vanaf nul schrijven? Lily levert 57 zelfstandige referentiethema's in de map themes/ . Elk is één stylesheet die de klassenhaken van Lily target – koppel het en je bent opgemaakt:
<link rel="stylesheet" href="/assets/themes/united-kingdom-government-digital-service.css" />
De set omvat:
- Publieke sector – NHS England, NHS Scotland en NHS Wales (elk met varianten voor patiënten en voor professionals), GOV.UK GDS en het U.S. Web Design System.
- Door leveranciers geïnspireerd – Adobe Spectrum, Mozilla Protocol.
- Algemeen gebruik – light, dark, nord, dracula, wireframe en nog zo'n dertig andere.
Themaselectors gebruiken :where(...), dus je eigen CSS wint altijd op specificiteit. Combineer ze met de theme-picker -helper hieronder om tijdens runtime te wisselen, of volg de
themahandleiding.
Voorkeurshelpers
Elk framework heeft acht kleine kiezers, elk een eigen
lily-design-system-{framework}-{package} -pakket (en een picker-bar die ze samenvoegt). Elk is een headless pictogramknop die een pop-up opent – een keuzelijst, een lijst met links, een zoekformulier of (voor date-time-picker) een datumkiezerdialoog – geen native
<select>; is SSR-veilig; en bevat geen CSS:
-
theme-picker – laadt themastylesheets tijdens runtime door een beheerde
<link>te verwisselen, zetdata-themeop het document en slaat optioneel op inlocalStorage. -
locale-picker – zet
langendir(met automatische RTL-detectie) zodat je i18n-bibliotheek kan volgen; vertaalt zelf niets. -
text-size-picker – zet
data-text-sizeop het document; jouw CSS koppelt elke waarde aan een lettergrootte. -
motion-picker – zet
data-motionop het document, uitgaand van de instelling voor verminderde beweging van de bezoeker; jouw CSS en scripts bepalen wat er wordt onderdrukt. - search-picker – een pictogramknop die een zoekveld opent; verzenden navigeert naar een zoekpagina. Beheert een actie, geen voorkeur.
- link-picker – een huispictogram dat een menu opent met de paginalinks die je app definieert (Home, Over ons, Contact, Privacybeleid, …). Beheert een actie, geen voorkeur.
- share-picker – opent het native deelvenster of een door de gebruiker aangeleverde lijst met bestemmingen, plus de URL kopiëren. Beheert een actie, geen voorkeur: past niets toe, slaat niets op.
-
date-time-picker – een tekstveld plus een APG-datumkiezerdialoog voor een datum, een tijd of beide. Beheert een formulierwaarde, geen voorkeur: de ISO-tekenreeks wordt heen en weer omgezet naar
<input type="date">.
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-svelte-theme-picker
De Svelte-catalogus is de canonieke referentie; de React-, Vue-, Angular-, HTML-, Nunjucks-, Web Components- en Blazor-poorten komen contract voor contract met hem overeen. Zie de helperhandleiding.
Toegankelijkheid
Componenten streven naar WCAG 2.2 AAA. Ze volgen deze patronen:
- Semantische HTML-elementen boven generieke
<div>s. <label for="id">die labels aan invoer koppelt.aria-labelledby/aria-describedbyvoor kruisverwijzingen.aria-invalid+aria-errormessagevoor foutstatussen.role="alert"enaria-livevoor dynamische inhoud.aria-pressed,aria-expanded,aria-currentvoor status.- Roving
tabindexvoor rasters.
Focusindicatoren worden bewust door de gebruiker aangeleverd – Lily tekent nooit een standaard focusring die botst met je ontwerp. De voorbeeldapps houden een schone axe-core-basislijn aan op al hun routes.
Internationalisering
Elk label, elke plaatsaanduiding, foutmelding en knoptekst is een prop. Er zijn geen hardgecodeerde tekenreeksen. Koppel het vertaalframework van je keuze – Paraglide, i18next, vue-i18n, react-intl, .resx-bestanden, alles.
Voor datums, getallen en valuta nemen de componenten vooraf opgemaakte tekenreeksen aan: jij maakt op met Intl.DateTimeFormat /
Intl.NumberFormat / je voorkeursbibliotheek en geeft het resultaat door.
De locale-picker -helper geeft de gekozen taal door aan je i18n-bibliotheek door lang en dir op de documentroot te zetten.
Testen
Elk frameworksubproject levert eigen tests met zijn idiomatische stack:
- HTML: WebDriverIO met echte browsers.
- Svelte: Vitest +
@testing-library/svelte. - React: Vitest +
@testing-library/react. - Vue: Vitest +
@testing-library/vue. - Angular: Vitest + TestBed (via de Analog Vite-plug-in).
- Nunjucks: Vitest met een renderhelper.
- Blazor: bUnit.
Tests gebruiken alleen de ingebouwde matchers van Vitest – nooit
jest-dom -matchers. Dat houdt de testsuites draagbaar. De voorbeeldapps voegen end-to-end-suites met Playwright, toegankelijkheidsbasislijnen met axe-core en een sweep over responsieve viewports toe.
AI-agenten
Deze site publiceert llms.txt en llms.json in zijn root – een samengestelde kaart van de belangrijkste pagina's, voor elke tool die de llms.txt-conventie.
De canonieke monorepo levert daarnaast twee
Claude Skills:
lily-design-system-skill: een algemene skill die de concepten, terminologie en samenstellingspatronen van Lily behandelt voor iedereen die met het systeem bouwt, en lily-design-system-maintainer-skill, een technische skill die de indeling met verplichte bestanden en de tooling van de monorepo behandelt voor iedereen die eraan werkt. Beide staan in de root van de
canonieke monorepo.
Probleemoplossing
Een component rendert maar ziet er niet opgemaakt uit
Dat is headless zoals bedoeld – er wordt geen CSS met de component meegeleverd. Schrijf CSS voor de kebab-case klasse van de component (te zien op elke cataloguspagina) of koppel een van de 57 kant-en-klare thema's.
Mijn CSS lijkt niet te gelden boven een thema
Dat zou wel moeten – themaselectors zijn verpakt in :where(...), dat nul specificiteit heeft. Als een regel toch verliest, controleer dan of je stylesheet na de <link> van het thema wordt geladen en of de selector echt overeenkomt met de klassenhaak van de component.
pnpm install mislukt met een peer- of versiefout
Gebruik een actuele pnpm (v10+) en Node 22+. Elk subproject pint zijn frameworkversies vast in zijn eigen package.json; als je globale toolchain ouder is, is pnpm env use --global lts de snelste oplossing.
Een schermlezer kondigt de verkeerde naam aan voor een besturingselement
Controleer de verplichte label -prop van de component – componenten zonder zichtbare tekst vereisen er een, en door de gebruiker aangeleverde
aria-label / aria-labelledby die via rest-props worden doorgegeven winnen bewust van de ingebouwde koppeling. Elke cataloguspagina documenteert het ARIA-contract van de component.
De theme-picker-helper wisselt geen stylesheets
Controleer of themesUrl verwijst naar een map die de browser kan ophalen (serveer de themes/ -bestanden als statische assets) en of de themaslugs in je themes -prop overeenkomen met de bestandsnamen. De helper verwisselt de href van één beheerde
<link data-lily-theme-picker> – inspecteer hem in de devtools om te zien welke URL wordt opgevraagd.
Iets anders is kapot
Open een issue met een minimale reproductie op github.com/LilyDesignSystem/lily-design-system – of zie community en ondersteuning.
Bijdragen
Lily is jong en verwelkomt samenwerking. De nuttigste bijdragen op dit moment zijn:
- Nieuwe componenten (vooral patronen uit gevestigde designsystemen).
- Nieuwe thema's – elk is één op zichzelf staande stylesheet, een goed afgebakende eerste PR.
- Betere opmaak van voorbeelden – laat zien wat mogelijk is.
- Vertalingen van de tekenreeksen van de voorbeeldapps.
- Bugmeldingen met een minimale reproductie.
- Toegankelijkheidsaudits met schermlezers en hulptechnologie.
Open issues en PR's op github.com/LilyDesignSystem/lily-design-system.
Community en ondersteuning
- Vragen en bugmeldingen – open een issue op github.com/LilyDesignSystem/lily-design-system.
- E-mail – de beheerder leest joel@joelparkerhenderson.com en verwelkomt samenwerking, begeleiding en feedback.
- Spiegels – Lily wordt ook gepusht naar Codeberg en GitLab, zodat je kunt meedoen vanaf de forge die je prefereert.
- Gedrag – het project volgt een standaard gedragscode; wees vriendelijk en ga uit van goede trouw.
FAQ
Waarom headless in plaats van opgemaakt?
Vooraf opgemaakte componenten zijn handig – totdat ze niet bij je merk passen. Headless componenten vragen vooraf iets meer werk, maar geven je totale controle over het visuele ontwerp. De voorbeeldapps en de 57 thema's laten manieren zien om ze op te maken; je kunt die overnemen of helemaal vervangen. Het langere betoog staat op Waarom Lily.
Waarom zoveel componenten?
Lily wil de patronen dekken die de meeste apps nodig hebben, zonder je te dwingen ze vanaf nul te bouwen – inclusief diepgaande dingen zoals invoer van nationale identificatiemiddelen en redactionele scrollytelling. De catalogus put uit een dozijn gevestigde designsystemen plus eigen werk – zie Over.
Kan ik Lily met Tailwind gebruiken?
Ja. Elke component toont één kebab-case rootklasse plus een door de gebruiker opgegeven className / class. Leg Tailwind-utilities er zo overheen als je wilt.
Kan ik Lily gebruiken met semantische CSS-frameworks zoals DaisyUI?
Ja. De kebab-case klassenamen op het rootelement werken als semantische CSS-haken. Combineer Lily met een semantisch framework en je krijgt vooraf opgemaakte componenten die ARIA en i18n toch respecteren.
Is er een npm-pakket?
voorkeurshelpers worden geleverd als pakketten met een npm/NuGet-publicatiepijplijn. De headless componentbibliotheken zijn bedoeld om te worden gekloond of gevendord – de broncode is het product, zodat je precies wat je uitlevert kunt lezen, inkorten en bezitten. Publicatie in registries voor de headless bibliotheken staat nog op de roadmap.
Waarom meerdere licenties?
Verschillende projecten hebben verschillende licentiebehoeften. BSD en MIT zijn permissief, Apache-2.0 heeft een patentverlening en de GPL-opties ondersteunen copyleft. Kies wat bij je situatie past.
Hoe meld ik een bug of vraag ik een functie aan?
Open een issue in de GitHub-repository, of mail naar joel@joelparkerhenderson.com.