Початок роботи з Lily
Оберіть фреймворк, клонуйте монорепозиторій і відкрийте його «безголову» бібліотеку чи приклад застосунку та починайте складати власні сторінки. Віддаєте перевагу керованому шляху? Почніть з посібників.
Встановлення
Lily живе в одному монорепозиторії Git з каталогом для «безголової» бібліотеки, пакетів допоміжних засобів і прикладу застосунку кожного фреймворку. Найшвидший спосіб спробувати — клонувати монорепозиторій і відкрити «безголову» бібліотеку для вашого стеку:
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-react-headless
pnpm install
Той самий шаблон працює для інших фреймворків:
@lilydesignsystem/html-headless— встановлення не потрібне; скопіюйте.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
«Безголові» бібліотеки створено для клонування чи вендорингу — вважайте вихідний код джерелом істини й копіюйте те, що потрібно. допоміжні засоби налаштувань додатково постачаються як встановлювані пакети з конвеєром збирання й публікації (npm для JS-фреймворків, NuGet для Blazor).
Використання «безголового» компонента
«Безголові» компоненти постачаються із семантичним HTML, ARIA та властивостями — але без CSS. Ось Button у кожному фреймворку:
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" }) }}
Використання стилізованого прикладу
Приклади застосунків містять CSS, маршрути й повні демосторінки. Найшвидший спосіб поекспериментувати — запустити приклад застосунку SvelteKit, Next, Nuxt, Analog або Eleventy і переглянути демо за адресою /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
Потім відкрийте http://localhost:5173 і перегляньте /components.
Стилізація та дизайн-токени
Кожен компонент рендериться з одним класом kebab-case на кореневому елементі. Наприклад, <Button> рендерить <button class="button">. Стилізуйте його як завгодно:
.button {
background: var(--my-primary);
color: #fff;
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
}
.button:hover { background: var(--my-primary-hover); }
Типова палітра кольорів Lily (використовується в прикладах застосунків):
- Основний:
#2563eb - Небезпека:
#dc2626 - Попередження:
#f59e0b - Успіх:
#16a34a - Тло сторінки:
#f9fafb - Тло картки:
#ffffff
Це пропозиції, а не вимоги. Замініть їх власною брендовою палітрою — і Lily охоче підлаштується.
Готові теми
Не хочете писати CSS з нуля? Lily постачається з 57 автономними еталонними темами в каталозі themes/ . Кожна — одна таблиця стилів, що націлена на клас-гачки Lily: підключіть її — і стилізація готова:
<link rel="stylesheet" href="/assets/themes/united-kingdom-government-digital-service.css" />
Набір охоплює:
- Публічний сектор — NHS England, NHS Scotland і NHS Wales (варіанти для пацієнтів і для практиків), GOV.UK GDS та U.S. Web Design System.
- За мотивами вендорів — Adobe Spectrum, Mozilla Protocol.
- Універсальні — light, dark, nord, dracula, wireframe та ще три десятки.
Селектори тем використовують :where(...), тож ваш власний CSS завжди виграє за специфічністю. Поєднайте їх із допоміжним засобом theme-picker нижче для перемикання під час виконання або дотримуйтеся
посібник із тем.
Допоміжні засоби налаштувань
Кожен фреймворк має вісім невеликих засобів вибору, кожен у власному
lily-design-system-{framework}-{package} пакеті (і picker-bar що їх збирає). Кожен — «безголова» кнопка-значок, що відкриває спливне вікно — список вибору, список посилань, форму пошуку або (для date-time-picker) діалог вибору дати — а не нативний
<select>; безпечний для SSR; і постачається без CSS:
-
theme-picker — завантажує таблиці стилів тем під час виконання, змінюючи кероване
<link>, встановлюєdata-themeна документі та за потреби зберігає вlocalStorage. -
locale-picker — встановлює
langіdir(з автоматичним визначенням RTL), щоб ваша i18n-бібліотека могла за ним слідувати; сам нічого не перекладає. -
text-size-picker — встановлює
data-text-sizeна документі; ваш CSS зіставляє кожне значення з розміром шрифту. -
motion-picker — встановлює
data-motionна документі, починаючи з налаштування відвідувача щодо зменшеного руху; ваш CSS і скрипти вирішують, що вимкнути. - search-picker — кнопка-значок, що відкриває поле пошуку; надсилання переходить на сторінку пошуку. Володіє дією, а не налаштуванням.
- link-picker — значок «додому», що відкриває меню посилань на сторінки, які визначає ваш застосунок (Головна, Про нас, Контакти, Політика конфіденційності, …). Володіє дією, а не налаштуванням.
- share-picker — відкриває нативне вікно поширення або список призначень від споживача, а також копіювання URL. Володіє дією, а не налаштуванням: нічого не застосовує, нічого не зберігає.
-
date-time-picker — текстове поле плюс діалог вибору дати APG для дати, часу або обох. Володіє значенням форми, а не налаштуванням: рядок ISO проходить туди й назад до
<input type="date">.
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-svelte-theme-picker
Каталог Svelte — канонічний еталон; порти React, Vue, Angular, HTML, Nunjucks, Web Components і Blazor відповідають йому контракт за контрактом. Див. посібник із допоміжних засобів.
Доступність
Компоненти орієнтовані на WCAG 2.2 AAA. Вони дотримуються таких шаблонів:
- Семантичні елементи HTML замість загальних
<div>s. <label for="id">що пов’язує мітки зі полями введення.aria-labelledby/aria-describedbyдля перехресних посилань.aria-invalid+aria-errormessageдля станів помилок.role="alert"іaria-liveдля динамічного вмісту.aria-pressed,aria-expanded,aria-currentдля стану.- Roving
tabindexдля сіток.
Індикатори фокуса навмисно надаються споживачем — Lily ніколи не малює типове кільце фокуса, що конфліктує з вашим дизайном. Приклади застосунків підтримують чисту базову лінію axe-core на всіх маршрутах.
Інтернаціоналізація
Кожна мітка, підказка в полі, повідомлення про помилку й текст кнопки — це властивість. Жорстко прописаних рядків немає. Підключіть обраний фреймворк перекладу — Paraglide, i18next, vue-i18n, react-intl, файли .resx, будь-що.
Для дат, чисел і валют компоненти приймають попередньо відформатовані рядки: ви форматуєте за допомогою Intl.DateTimeFormat /
Intl.NumberFormat / улюбленої бібліотеки й передаєте результат.
Допоміжний засіб locale-picker повідомляє вашій i18n-бібліотеці про вибрану локаль, встановлюючи lang і dir на корені документа.
Тестування
Кожен підпроєкт фреймворку постачає власні тести з ідіоматичним стеком:
- HTML: WebDriverIO, що запускає справжні браузери.
- Svelte: Vitest +
@testing-library/svelte. - React: Vitest +
@testing-library/react. - Vue: Vitest +
@testing-library/vue. - Angular: Vitest + TestBed (через плагін Analog Vite).
- Nunjucks: Vitest із допоміжним засобом рендерингу.
- Blazor: bUnit.
Тести використовують лише вбудовані матчери Vitest — ніколи
jest-dom матчерів. Це зберігає набори тестів портативними. Приклади застосунків додають наскрізні набори Playwright, базові лінії доступності axe-core і перевірку в’юпортів.
ШІ-агенти
Цей сайт публікує llms.txt і llms.json у своєму корені — добірну карту найважливіших сторінок для будь-якого інструмента, що дотримується конвенції llms.txt.
Канонічний монорепозиторій також постачає два
Claude Skills:
lily-design-system-skill, універсальну навичку, що охоплює поняття, термінологію й шаблони композиції Lily для всіх, хто будує з її допомогою, та lily-design-system-maintainer-skill, технічну навичку, що охоплює обов’язкову структуру файлів і інструменти монорепозиторію для всіх, хто працює над ним. Обидві розташовані в корені
канонічного монорепозиторію.
Усунення несправностей
Компонент рендериться, але виглядає нестилізованим
Це «безголовість» працює як задумано — разом із компонентом CSS не постачається. Або напишіть CSS для класу kebab-case компонента (показаного на кожній сторінці каталогу), або підключіть одну з 57 готових тем.
Мій CSS, здається, не застосовується поверх теми
Він має застосовуватися — селектори тем обгорнуті в :where(...), що має нульову специфічність. Якщо правило все одно програє, перевірте, що ваша таблиця стилів завантажується після таблиці теми <link> і що селектор справді збігається з клас-гачком компонента.
pnpm install завершується помилкою залежностей або версій
Використовуйте актуальний pnpm (v10+) і Node 22+. Кожен підпроєкт фіксує версії своїх фреймворків у власному package.json; якщо ваш глобальний набір інструментів старіший, pnpm env use --global lts — найшвидше рішення.
Зчитувач екрана озвучує неправильну назву елемента керування
Перевірте обов’язкову властивість компонента label — компоненти без видимого тексту вимагають її, а передані споживачем
aria-label / aria-labelledby через rest-props навмисно мають пріоритет над вбудованою обв’язкою. Кожна сторінка каталогу документує контракт ARIA компонента.
Допоміжний засіб theme-picker не перемикає таблиці стилів
Переконайтеся, що themesUrl вказує на каталог, який браузер може отримати (віддавайте файли themes/ як статичні ресурси) і що слаги тем у властивості themes збігаються з іменами файлів. Допоміжний засіб замінює href одного керованого
<link data-lily-theme-picker> — перевірте це в devtools, щоб побачити URL, який запитується.
Зламалося щось інше
Відкрийте issue з мінімальним відтворенням на github.com/LilyDesignSystem/lily-design-system — або див. спільнота та підтримка.
Внесок
Lily молода й вітає співпрацю. Найкорисніші внески зараз:
- Нові компоненти (особливо шаблони з усталених дизайн-систем).
- Нові теми — кожна є однією автономною таблицею стилів, добре окреслений перший PR.
- Краща стилізація прикладів — покажіть, що можливо.
- Переклади рядків прикладів застосунків.
- Звіти про помилки з мінімальним відтворенням.
- Аудити доступності зі зчитувачами екрана та допоміжними технологіями.
Відкривайте issue та PR на github.com/LilyDesignSystem/lily-design-system.
Спільнота та підтримка
- Питання та звіти про помилки — відкрийте issue на github.com/LilyDesignSystem/lily-design-system.
- Ел. пошта — супровідник читає joel@joelparkerhenderson.com і вітає співпрацю, поради та відгуки.
- Дзеркала — Lily також публікується на Codeberg і GitLab, тож ви можете долучатися з улюбленої платформи.
- Поведінка — проєкт дотримується стандартного кодексу поведінки; будьте доброзичливими, припускайте добрі наміри.
Поширені запитання
Чому «безголові», а не стилізовані?
Попередньо стилізовані компоненти зручні — доки не перестають відповідати вашому бренду. «Безголові» компоненти потребують трохи більше роботи спочатку, але дають повний контроль над візуальним дизайном. Приклади застосунків і 57 тем показують способи стилізації; ви можете взяти їх або повністю замінити. Довший аргумент — на сторінці Чому Lily.
Чому так багато компонентів?
Lily прагне охопити шаблони, потрібні більшості застосунків, не змушуючи будувати їх з нуля, — включно з глибокими прикладами, як-от введення національних ідентифікаторів і редакційний скролітелінг. Каталог черпає з десятка усталених дизайн-систем плюс оригінальна робота — див. Про проєкт.
Чи можна використовувати Lily з Tailwind?
Так. Кожен компонент відкриває один кореневий клас kebab-case плюс наданий споживачем className / class. Накладайте утиліти Tailwind зверху як завгодно.
Чи можна використовувати Lily із семантичними CSS-фреймворками, як-от DaisyUI?
Так. Імена класів kebab-case на кореневому елементі працюють як семантичні CSS-гачки. Поєднайте Lily із семантичним фреймворком — і отримаєте попередньо стилізовані компоненти, що все одно поважають ARIA та i18n.
Чи є пакет npm?
Допоміжний засіб допоміжні засоби налаштувань постачаються як пакети з конвеєром публікації npm/NuGet. «Безголові» бібліотеки компонентів створено для клонування чи вендорингу — джерело і є результатом, тож ви можете читати, обрізати й володіти саме тим, що випускаєте. Публікація «безголових» бібліотек у реєстрах залишається в дорожній карті.
Чому кілька ліцензій?
Різні проєкти мають різні ліцензійні потреби. BSD і MIT — дозвільні, Apache-2.0 має патентний дозвіл, а варіанти GPL підтримують копілефт. Оберіть те, що відповідає вашій ситуації.
Як повідомити про помилку або запросити функцію?
Відкрийте issue в репозиторії GitHub або напишіть на joel@joelparkerhenderson.com.