Pierwsze kroki z Lily
Wybierz framework, sklonuj monorepozytorium i otwórz jego bezgłową bibliotekę lub aplikację przykładową, a potem zacznij składać własne strony. Wolisz ścieżkę z przewodnikiem? Zacznij od samouczków.
Instalacja
Lily mieszka w jednym monorepozytorium Git, z katalogiem dla bezgłowej biblioteki, pakietów pomocniczych i aplikacji przykładowej każdego frameworka. Najszybszy sposób na wypróbowanie to sklonowanie monorepozytorium i otwarcie bezgłowej biblioteki dla twojego stosu:
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-react-headless
pnpm install
Ten sam wzorzec działa dla pozostałych frameworków:
@lilydesignsystem/html-headless— instalacja niepotrzebna; skopiuj pliki.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
Biblioteki bezgłowe są zaprojektowane do klonowania lub włączania do projektu — traktuj kod źródłowy jako źródło prawdy i kopiuj to, czego potrzebujesz. pomocnicy preferencji są dodatkowo dostarczani jako instalowalne pakiety z potokiem budowania i publikacji (npm dla frameworków JS, NuGet dla Blazor).
Użycie komponentu bezgłowego
Komponenty bezgłowe dostarczają semantyczny HTML, ARIA i właściwości — ale nie CSS. Oto Button w każdym frameworku:
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" }) }}
Użycie ostylowanego przykładu
Aplikacje przykładowe zawierają CSS, trasy i pełne strony demonstracyjne. Najszybszy sposób na eksperymentowanie to uruchomienie aplikacji przykładowej SvelteKit, Next, Nuxt, Analog lub Eleventy i obejrzenie dema pod adresem /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
Następnie otwórz http://localhost:5173 i przeglądaj /components.
Stylizacja i tokeny projektowe
Każdy komponent renderuje się z jedną klasą w kebab-case na swoim elemencie głównym. Na przykład <Button> renderuje się jako <button class="button">. Ostyluj go, jak chcesz:
.button {
background: var(--my-primary);
color: #fff;
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
}
.button:hover { background: var(--my-primary-hover); }
Domyślna paleta kolorów Lily (używana w aplikacjach przykładowych) to:
- Główny:
#2563eb - Niebezpieczeństwo:
#dc2626 - Ostrzeżenie:
#f59e0b - Powodzenie:
#16a34a - Tło strony:
#f9fafb - Tło karty:
#ffffff
To sugestie, nie wymagania. Zastąp je paletą własnej marki, a Lily chętnie za nią podąży.
Gotowe motywy
Nie chcesz pisać CSS od zera? Lily dostarcza 57 samodzielnych motywów referencyjnych w katalogu themes/ . Każdy to jeden arkusz stylów celujący w haki klas Lily — podlinkuj go, a masz stylizację:
<link rel="stylesheet" href="/assets/themes/united-kingdom-government-digital-service.css" />
Zestaw obejmuje:
- Sektor publiczny — NHS England, NHS Scotland i NHS Wales (każdy w wariancie dla pacjentów i dla praktyków), GOV.UK GDS oraz U.S. Web Design System.
- Inspirowane dostawcami — Adobe Spectrum, Mozilla Protocol.
- Ogólnego przeznaczenia — light, dark, nord, dracula, wireframe i jeszcze około trzydziestu.
Selektory motywów używają :where(...), więc twój własny CSS zawsze wygrywa pod względem specyficzności. Połącz je z pomocnikiem theme-picker poniżej, aby przełączać w czasie działania, albo skorzystaj z
samouczka o motywach.
Pomocnicy preferencji
Każdy framework ma osiem małych selektorów, każdy to osobny pakiet
lily-design-system-{framework}-{package} (oraz picker-bar , który je składa). Każdy to bezgłowy przycisk z ikoną otwierający okienko — listę wyboru, listę linków, formularz wyszukiwania lub (w przypadku date-time-picker) okno wyboru daty — nie natywny
<select>; jest bezpieczny dla SSR; i nie zawiera CSS:
-
theme-picker — ładuje arkusze stylów motywów w czasie działania, podmieniając zarządzany
<link>, ustawiadata-themew dokumencie i opcjonalnie zapisuje wlocalStorage. -
locale-picker — ustawia
langidir(z automatycznym wykrywaniem RTL), aby twoja biblioteka i18n mogła za nimi podążać; sam niczego nie tłumaczy. -
text-size-picker — ustawia
data-text-sizew dokumencie; twój CSS mapuje każdą wartość na rozmiar czcionki. -
motion-picker — ustawia
data-motionw dokumencie, wychodząc od ustawienia ograniczonego ruchu odwiedzającego; twój CSS i skrypty decydują, co wyciszyć. - search-picker — przycisk z ikoną otwierający pole wyszukiwania; wysłanie przechodzi na stronę wyszukiwania. Odpowiada za akcję, nie za preferencję.
- link-picker — ikona domu otwierająca menu linków do stron definiowanych przez twoją aplikację (Strona główna, O nas, Kontakt, Polityka prywatności, …). Odpowiada za akcję, nie za preferencję.
- share-picker — otwiera natywny arkusz udostępniania lub listę miejsc docelowych dostarczoną przez konsumenta, plus kopiowanie adresu URL. Odpowiada za akcję, nie za preferencję: niczego nie stosuje, niczego nie zapisuje.
-
date-time-picker — pole tekstowe plus okno wyboru daty zgodne z APG dla daty, godziny lub obu. Odpowiada za wartość formularza, nie za preferencję: ciąg ISO jest konwertowany tam i z powrotem do
<input type="date">.
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-svelte-theme-picker
Katalog Svelte jest kanonicznym odniesieniem; porty dla React, Vue, Angular, HTML, Nunjucks, Web Components i Blazor odpowiadają mu kontrakt po kontrakcie. Zobacz samouczek o pomocnikach.
Dostępność
Komponenty celują w poziom WCAG 2.2 AAA. Stosują te wzorce:
- Semantyczne elementy HTML zamiast ogólnych
<div>s. <label for="id">łączące etykiety z polami.aria-labelledby/aria-describedbydla odwołań krzyżowych.aria-invalid+aria-errormessagedla stanów błędu.role="alert"iaria-livedla treści dynamicznych.aria-pressed,aria-expanded,aria-currentdla stanu.- Roving
tabindexdla siatek.
Wskaźniki fokusu są celowo dostarczane przez konsumenta — Lily nigdy nie rysuje domyślnego pierścienia fokusu, który kolidowałby z twoim projektem. Aplikacje przykładowe utrzymują czystą bazę axe-core na wszystkich swoich trasach.
Internacjonalizacja
Każda etykieta, symbol zastępczy, komunikat o błędzie i tekst przycisku to właściwość. Nie ma ciągów wpisanych na sztywno. Podłącz wybrany framework tłumaczeń — Paraglide, i18next, vue-i18n, react-intl, pliki .resx, cokolwiek.
Dla dat, liczb i walut komponenty przyjmują sformatowane wcześniej ciągi: formatujesz za pomocą Intl.DateTimeFormat /
Intl.NumberFormat / ulubionej biblioteki i przekazujesz wynik.
Pomocnik locale-picker sygnalizuje wybrane ustawienia regionalne twojej bibliotece i18n, ustawiając lang i dir w korzeniu dokumentu.
Testowanie
Każdy podprojekt frameworka dostarcza własne testy z użyciem jego typowego stosu:
- HTML: WebDriverIO uruchamiający prawdziwe przeglądarki.
- Svelte: Vitest +
@testing-library/svelte. - React: Vitest +
@testing-library/react. - Vue: Vitest +
@testing-library/vue. - Angular: Vitest + TestBed (przez wtyczkę Analog Vite).
- Nunjucks: Vitest z pomocnikiem renderowania.
- Blazor: bUnit.
Testy używają wyłącznie wbudowanych matcherów Vitest — nigdy matcherów
jest-dom . Dzięki temu zestawy testów są przenośne. Aplikacje przykładowe dodają zestawy end-to-end Playwright, bazy dostępności axe-core i przegląd responsywnych widoków.
Agenci AI
Ta witryna publikuje llms.txt i llms.json w swoim korzeniu — wyselekcjonowaną mapę najważniejszych stron, dla każdego narzędzia, które stosuje konwencję llms.txt.
Kanoniczne monorepozytorium dodatkowo dostarcza dwie
Claude Skills:
lily-design-system-skill: ogólnego przeznaczenia umiejętność obejmującą pojęcia, terminologię i wzorce kompozycji Lily dla każdego, kto buduje z użyciem systemu, oraz lily-design-system-maintainer-skill, techniczną umiejętność obejmującą układ wymaganych plików i narzędzia monorepozytorium dla każdego, kto przy nim pracuje. Obie leżą w korzeniu
kanonicznego monorepozytorium.
Rozwiązywanie problemów
Komponent się renderuje, ale wygląda na nieostylowany
To bezgłowość działająca zgodnie z założeniem — z komponentem nie jest dostarczany żaden CSS. Napisz CSS dla klasy komponentu w kebab-case (pokazanej na każdej stronie katalogu) albo podlinkuj jeden z 57 gotowych motywów.
Mój CSS nie wydaje się działać na motywie
Powinien — selektory motywów są owinięte w :where(...), co daje zerową specyficzność. Jeśli reguła nadal przegrywa, sprawdź, czy twój arkusz stylów ładuje się po <link> motywu i czy selektor rzeczywiście pasuje do haka klasy komponentu.
pnpm install kończy się błędem peer lub wersji
Użyj aktualnego pnpm (v10+) i Node 22+. Każdy podprojekt przypina wersje swojego frameworka w własnym package.json; jeśli twój globalny zestaw narzędzi jest starszy, pnpm env use --global lts to najszybsze rozwiązanie.
Czytnik ekranu ogłasza złą nazwę kontrolki
Sprawdź wymaganą właściwość label komponentu — komponenty bez widocznego tekstu jej wymagają, a przekazane przez konsumenta
aria-label / aria-labelledby przez rest-props celowo wygrywają z wbudowanym okablowaniem. Każda strona katalogu dokumentuje kontrakt ARIA komponentu.
Pomocnik theme-picker nie przełącza arkuszy stylów
Upewnij się, że themesUrl wskazuje katalog, który przeglądarka może pobrać (udostępnij pliki themes/ jako zasoby statyczne) i że slugi motywów w twojej właściwości themes odpowiadają nazwom plików. Pomocnik podmienia href jednego zarządzanego
<link data-lily-theme-picker> — sprawdź go w narzędziach deweloperskich, aby zobaczyć żądany adres URL.
Coś innego nie działa
Otwórz zgłoszenie z minimalnym przykładem odtworzenia na github.com/LilyDesignSystem/lily-design-system — albo zobacz społeczność i wsparcie.
Współtworzenie
Lily jest młody i wita współpracę. Najbardziej przydatne wkłady w tej chwili to:
- Nowe komponenty (zwłaszcza wzorce z ugruntowanych systemów projektowych).
- Nowe motywy — każdy to jeden samodzielny arkusz stylów, dobrze ograniczony pierwszy PR.
- Lepsza stylizacja przykładów — pokaż, co jest możliwe.
- Tłumaczenia ciągów aplikacji przykładowych.
- Zgłoszenia błędów z minimalnym przykładem odtworzenia.
- Audyty dostępności z czytnikami ekranu i technologiami wspomagającymi.
Otwieraj zgłoszenia i PR-y na github.com/LilyDesignSystem/lily-design-system.
Społeczność i wsparcie
- Pytania i zgłoszenia błędów — otwórz zgłoszenie na github.com/LilyDesignSystem/lily-design-system.
- E-mail — opiekun czyta joel@joelparkerhenderson.com i wita współpracę, wskazówki i opinie.
- Kopie lustrzane — Lily jest również wysyłany do Codeberg i GitLab, abyś mógł uczestniczyć z forge, który wolisz.
- Zasady postępowania — projekt stosuje standardowy kodeks postępowania; bądź uprzejmy, zakładaj dobrą wiarę.
FAQ
Dlaczego bezgłowe, a nie ostylowane?
Wstępnie ostylowane komponenty są wygodne — dopóki nie pasują do twojej marki. Komponenty bezgłowe wymagają na początku nieco więcej pracy, ale dają pełną kontrolę nad projektem wizualnym. Aplikacje przykładowe i 57 motywów pokazują sposoby ich stylizacji; możesz z nich skorzystać albo zastąpić je całkowicie. Dłuższy argument znajdziesz na stronie Dlaczego Lily.
Dlaczego tak wiele komponentów?
Lily ma pokrywać wzorce, których potrzebuje większość aplikacji, bez zmuszania cię do budowania ich od zera — w tym głębokie przypadki, takie jak pola krajowych identyfikatorów i redakcyjny scrollytelling. Katalog czerpie z tuzina ugruntowanych systemów projektowych oraz z własnej pracy — zobacz O projekcie.
Czy mogę używać Lily z Tailwind?
Tak. Każdy komponent udostępnia jedną klasę główną w kebab-case oraz przekazywaną przez konsumenta className / class. Nałóż narzędziowe klasy Tailwind, jak chcesz.
Czy mogę używać Lily z semantycznymi frameworkami CSS, takimi jak DaisyUI?
Tak. Nazwy klas w kebab-case na elemencie głównym działają jako semantyczne haki CSS. Połącz Lily z semantycznym frameworkiem, a otrzymasz wstępnie ostylowane komponenty, które nadal szanują ARIA i i18n.
Czy jest pakiet npm?
Pomocnicy preferencji są dostarczani jako pakiety z potokiem publikacji npm/NuGet. Biblioteki komponentów bezgłowych są zaprojektowane do klonowania lub włączania do projektu — produktem jest kod źródłowy, więc możesz czytać, przycinać i posiadać dokładnie to, co wdrażasz. Publikacja bibliotek bezgłowych w rejestrach pozostaje w planie rozwoju.
Dlaczego wiele licencji?
Różne projekty mają różne potrzeby licencyjne. BSD i MIT są liberalne, Apache-2.0 zawiera udzielenie patentu, a opcje GPL wspierają copyleft. Wybierz tę, która pasuje do twojej sytuacji.
Jak zgłosić błąd lub poprosić o funkcję?
Otwórz zgłoszenie w repozytorium GitHub lub napisz na joel@joelparkerhenderson.com.