Начало работы с Lily
Выберите фреймворк, клонируйте headless-репозиторий или пример приложения и начните собирать собственные страницы. Предпочитаете путь с подсказками? Начните с учебников.
Установка
Lily публикуется в виде отдельных Git-репозиториев для каждого фреймворка. Быстрее всего попробовать её, клонировав headless-репозиторий вашего стека:
git clone https://github.com/LilyDesignSystem/lily-design-system-react-headless
cd 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
Headless-библиотеки рассчитаны на клонирование или включение в проект: считайте исходный код источником истины и копируйте нужное. Помощники настроек дополнительно поставляются как устанавливаемые пакеты с конвейером сборки и публикации (npm для JS-фреймворков, NuGet для Blazor).
Использование headless-компонента
Headless-компоненты поставляются с семантическим HTML, ARIA и свойствами, но без CSS. Вот кнопка в каждом фреймворке:
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-svelte-sveltekit-examples
cd 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 поставляется с 45 самостоятельными эталонными темами в каталоге themes/. Каждая — одна таблица стилей, нацеленная на классы-зацепки Lily: подключите её — и оформление готово:
<link rel="stylesheet" href="/assets/themes/united-kingdom-government-digital-service.css" />
В набор входят:
- Государственный сектор — NHS England, NHS Scotland и NHS Wales (варианты для пациентов и для специалистов), GOV.UK GDS и Веб-дизайн-система США.
- По мотивам продуктов компаний — Adobe Spectrum, Mozilla Protocol.
- Универсальные — светлая, тёмная, nord, dracula, wireframe и ещё три десятка.
Селекторы тем используют :where(...), поэтому ваш собственный CSS всегда побеждает по специфичности. Сочетайте их с помощником theme-picker ниже для переключения во время выполнения или следуйте учебнику по темам.
Помощники настроек
У каждого фреймворка есть сопутствующий каталог *-helpers с восемью небольшими «пикерами» (и picker-bar, который их объединяет). Каждый — это headless-кнопка с иконкой, открывающая всплывающее окно — список вариантов, список ссылок, форму поиска или (для date-time-picker) диалог выбора даты, — а не нативный <select>; безопасен для SSR и поставляется без CSS:
- theme-picker — загружает таблицы стилей тем во время выполнения, подменяя управляемый
<link>, задаётdata-themeу документа и при желании сохраняет выбор вlocalStorage. - locale-picker — задаёт
langиdir(с автоматическим определением письма справа налево), чтобы ваша библиотека 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-svelte-helpers
Каталог Svelte — каноническая основа; порты для React, Vue, Angular, HTML, Nunjucks, Web Components и Blazor соответствуют ему контракт в контракт. См. учебник по помощникам.
Доступность
Компоненты нацелены на WCAG 2.2 AAA. Они следуют таким паттернам:
- Семантические HTML-элементы вместо универсальных
<div>. <label for="id">, связывающий подписи с полями ввода.aria-labelledby/aria-describedbyдля перекрёстных ссылок.aria-invalid+aria-errormessageдля состояний ошибки.role="alert"иaria-liveдля динамического содержимого.aria-pressed,aria-expanded,aria-currentдля состояния.- Перемещаемый
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 (через плагин Vite от Analog).
- Nunjucks: Vitest с вспомогательной функцией отрисовки.
- Blazor: bUnit.
Тесты используют только встроенные матчеры Vitest — никогда матчеры jest-dom. Это делает наборы тестов переносимыми. Примеры приложений добавляют сквозные наборы Playwright, базовые уровни доступности axe-core и обход адаптивных размеров окна.
ИИ-агенты
Этот сайт публикует llms.txt и llms.json в корне — тщательно составленную карту самых важных страниц для любого инструмента, следующего соглашению llms.txt.
Канонический монорепозиторий дополнительно поставляет два навыка Claude: lily-design-system-skill — универсальный навык, охватывающий понятия, терминологию и паттерны композиции Lily для тех, кто строит с помощью системы, и lily-design-system-maintainer-skill — технический навык, охватывающий обязательную структуру файлов и инструменты монорепозитория для тех, кто работает над ним. Оба лежат в корне канонического монорепозитория.
Устранение неполадок
Компонент отображается, но выглядит без оформления
Это headless работает как задумано: вместе с компонентом не поставляется никакого CSS. Либо напишите CSS для класса компонента в kebab-case (он указан на каждой странице каталога), либо подключите одну из 45 готовых тем.
Мой CSS, похоже, не применяется поверх темы
Должен: селекторы тем обёрнуты в :where(...), у которого нулевая специфичность. Если правило всё равно проигрывает, проверьте, что ваша таблица стилей загружается после <link> темы и что селектор действительно совпадает с классом-зацепкой компонента.
pnpm install завершается ошибкой peer-зависимости или версии
Используйте актуальный pnpm (v10+) и Node 22+. Каждый репозиторий фиксирует версии своего фреймворка в package.json; если ваш глобальный набор инструментов старше, быстрее всего поможет pnpm env use --global lts.
Скринридер озвучивает неверное имя элемента управления
Проверьте обязательное свойство label компонента: компоненты без видимого текста требуют его, а переданные потребителем aria-label / aria-labelledby, проброшенные через остальные свойства, намеренно имеют приоритет над встроенной разводкой. Каждая страница каталога документирует контракт ARIA компонента.
Помощник theme-picker не переключает таблицы стилей
Убедитесь, что themesUrl указывает на каталог, который браузер может загрузить (отдавайте файлы themes/ как статические ресурсы), и что слаги тем в вашем свойстве themes совпадают с именами файлов. Помощник подменяет href одного управляемого <link data-lily-theme-picker> — проверьте его в инструментах разработчика, чтобы увидеть запрашиваемый URL.
Сломалось что-то другое
Откройте обращение с минимальным воспроизведением в нужном репозитории на github.com/LilyDesignSystem или загляните в раздел «Сообщество и поддержка».
Как внести вклад
Lily молода и рада сотрудничеству. Сейчас наиболее полезны такие вклады:
- Новые компоненты (особенно паттерны из зарекомендовавших себя дизайн-систем).
- Новые темы — каждая представляет собой отдельную таблицу стилей, отлично очерченный первый запрос на слияние.
- Более удачное оформление примеров — покажите, что возможно.
- Переводы строк примеров приложений.
- Отчёты об ошибках с минимальным воспроизведением.
- Аудиты доступности со скринридерами и вспомогательными технологиями.
Открывайте обращения и запросы на слияние в нужном репозитории на github.com/LilyDesignSystem.
Сообщество и поддержка
- Вопросы и отчёты об ошибках — откройте обращение в нужном репозитории на github.com/LilyDesignSystem.
- Электронная почта — сопровождающий читает joel@joelparkerhenderson.com и рад сотрудничеству, советам и отзывам.
- Зеркала — Lily также публикуется на Codeberg и GitLab, так что вы можете участвовать с той платформы, которая вам удобнее.
- Поведение — проект следует стандартному кодексу поведения; будьте добры и исходите из добросовестности.
Частые вопросы
Почему headless, а не готовое оформление?
Заранее оформленные компоненты удобны — пока не перестают подходить вашему бренду. Headless-компоненты требуют чуть больше работы в начале, но дают полный контроль над визуальным дизайном. Примеры приложений и 45 тем показывают способы оформления; можно взять их или полностью заменить. Более подробный довод — в разделе «Почему Lily».
Почему так много компонентов?
Lily стремится охватить паттерны, нужные большинству приложений, не заставляя вас строить их с нуля, — включая более редкие случаи вроде полей национальных идентификаторов и редакционного скроллителлинга. Каталог опирается на десяток зарекомендовавших себя дизайн-систем и оригинальную работу — см. «О проекте».
Можно ли использовать Lily с Tailwind?
Да. Каждый компонент предоставляет один корневой класс в kebab-case и передаваемый потребителем className / class. Накладывайте утилиты Tailwind поверх как угодно.
Можно ли использовать Lily с семантическими CSS-фреймворками вроде DaisyUI?
Да. Имена классов в kebab-case на корневом элементе работают как семантические CSS-зацепки. Сочетайте Lily с семантическим фреймворком — и получите заранее оформленные компоненты, по-прежнему соблюдающие ARIA и i18n.
Есть ли пакет npm?
Помощники настроек поставляются как пакеты с конвейером публикации в npm/NuGet. Библиотеки headless-компонентов рассчитаны на клонирование или включение в проект: исходный код и есть поставляемый результат, поэтому вы можете читать, урезать и полностью контролировать то, что выпускаете. Публикация headless-библиотек в реестрах остаётся в дорожной карте.
Почему несколько лицензий?
У разных проектов разные потребности в лицензиях. BSD и MIT — разрешительные, у Apache-2.0 есть патентная лицензия, а варианты GPL поддерживают копилефт. Выберите подходящую для вашей ситуации.
Как сообщить об ошибке или предложить функцию?
Откройте обращение в нужном репозитории GitHub или напишите на joel@joelparkerhenderson.com.