Build web designs better.
Lily™ is a free open-source design system with hundreds of components. Lily provides versions for HTML, Svelte, React, Vue, Angular, Blazor, and more, with headless versions where you can bring your own CSS, and styled examples with customizable themes.
The idea
Your design, from day one
Your team has ideas about how your product should look. Lily provides semantic elements, ARIA states, keyboard contracts, focus management, and more - and you can style all the components as you wish.
<!-- What Lily renders: semantic HTML, correct ARIA, one class hook -->
<button class="button" type="button">Save</button> /* What you write: any CSS you like — it applies directly, first try */
.button {
background: rebeccapurple;
color: #fff;
border-radius: 9999px;
} One stable class hook per component. Zero CSS shipped. Your styles apply cleanly and stay cleanly yours.
Quick start
Try Lily in 30 seconds
1. Copy a component. Lily's HTML flavour is plain markup — paste it straight into any page, zero install, zero build step:
<form class="form">
<div class="field">
<label class="label" for="name">Full name</label>
<input class="text-input" type="text" id="name" name="name" required />
</div>
<button class="button" type="submit">Save</button>
</form> 2. Style the class hooks. Each component carries one kebab-case class — that's the whole contract:
.button { background: #2563eb; color: #fff; padding: 0.75rem 1.5rem; }
.text-input { border: 2px solid #6b7280; padding: 0.5rem 0.75rem; }
.label { font-weight: 600; } 3. In a hurry? Link a ready-made theme instead. One stylesheet and the same markup lights up — NHS, GOV.UK, USWDS, dark, nord, and 40 more:
<link rel="stylesheet" href="/themes/dark.css" /> Prefer Svelte, React, Vue, Angular, Blazor, or Nunjucks? The same components exist in each, with the same class hooks and prop names.
See it in action
Seven styled example apps, yours to explore and adjust
Curious what Lily looks like fully dressed? Seven complete example apps show the} components live and styled — one app per framework: plain HTML+CSS+JS, SvelteKit, Next.js, Nuxt, Angular + Analog, Blazor Web, and Nunjucks + Eleventy.
Each app is a warm, working reference: a searchable catalog at /components, a live demo page for every component, and
composed pages — dashboards, contact forms, settings, task boards —
showing the pieces working together. Best of all, the stylesheets
target the same class hooks you'll use, so you can copy any of the CSS
straight into your own project and adjust it as you wish. It's all
free, open source, and made to be remixed.
git clone https://github.com/LilyDesignSystem/lily-design-system-svelte-sveltekit-examples
cd lily-design-system-svelte-sveltekit-examples
pnpm install && pnpm run dev Learn
Find your path
Tutorials
Learn Lily step by step: render your first component, style it, theme it, and add language and text-size preferences — in whichever of the seven frameworks you use.
Component catalog
Save time with 491 reusable, accessible components — each documented with props, ARIA contract, keyboard interactions, and a live demo.
Example apps
See the whole system working end to end: seven complete, styled reference applications — SvelteKit, Next.js, Nuxt, Angular + Analog, Blazor Web, Eleventy, and plain HTML+CSS+JS — with CSS you're welcome to copy and adjust.
Help
Find answers fast: setup guides, styling and theming reference, troubleshooting, FAQ, and how to reach a friendly human who reads every message.
Why headless?
Your design. Our groundwork.
Own every pixel
Every font, color, spacing, and breakpoint decision belongs to you — your CSS is the design system's look from day one. Hand-written styles, Tailwind utilities, or one of Lily's 45 reference themes all work beautifully.
Accessibility, ready-made
WCAG 2.2 AAA is the target. Semantic elements, ARIA states, keyboard contracts, and focus behaviour ship inside every component and are verified by per-framework test suites and axe-core baselines.
Freedom to move
The same catalog in seven frameworks with the same class names and prop conventions. Switch stacks, mix stacks, or migrate gradually — your CSS and your knowledge carry over.
A quick fit check
Lily shines when…
- You have a design of your own — or want one — and want a library that honours it everywhere.
- Accessibility is a day-one requirement for your product.
- Your product ships in more than one language.
- Your organisation uses more than one framework — or might someday.
- You build public-sector or healthcare services and want NHS / GOV.UK / USWDS patterns and themes out of the box.
Weighing your options? We keep an honest, component-by-component comparison against 17 design systems — styled and headless, commercial and public-sector — so you can choose with confidence.
Questions?
Good questions, quick answers
Headless… so my components arrive unstyled?
Yes — and that's the gift: everything you write applies directly, and
every visual decision is yours. Style the class hooks yourself, or link
one of the 45 ready-made themes and be fully styled in one line. (This
accordion is a native <details>, styled exactly that
way.)
Is Lily really free?
Yes! Free and open source under your choice of BSD, MIT, Apache-2.0, GPL-2.0, or GPL-3.0. Every component, every theme, and every helper is included — yours, forever.
Which frameworks can I use Lily with?
Plain HTML, Svelte, React, Vue, Angular, Blazor, and Nunjucks — the same 491 components in each. And because the contract is simply class hooks on semantic HTML, your CSS carries over to every one of them.
How mature is Lily?
Lily is young and growing fast — expect a steady stream of additions, and pin versions for a calm upgrade cadence. Everything is developed in the open: the specification, tests, roadmap, and audits all live in the repos. Your feedback shapes the roadmap more than anything else.
What's new
Version 0.6.0 — July 2026. Tooling hardening and
release hygiene: catalog cross-checks in bin/test,
regenerated example-app registries, link checking, and CI. The
theme-select and locale-select helpers reach 0.2.0. Read the changelog →