Samouczek React
Typowane komponenty funkcyjne, po jednym pliku, kontrolowane standardowym wzorcem
value + onChange — wszystko działa tak, jak React już działa.
Co zbudujesz
Mały formularz kontaktowy — pole z etykietą, przycisk wysyłania, stan kontrolowany, prawdziwe działanie klawiatury i czytnika ekranu — najpierw surowy, potem ostylowany, w około 10 minut.
Zanim zaczniesz
Potrzebujesz gita, Node 22 lub nowszego i pnpm 10 lub nowszego. Dowolny projekt React 18+ się nadaje — Next.js, Vite lub czysty React.
Krok 1 — Pobierz kod
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-react-headless
pnpm install
pnpm test # vitest + @testing-library/react
pnpm run storybook # browse all 571 components
Komponenty to płaskie pliki w components/ —
Button.tsx, TextInput.tsx — każdy z własnym testem, story i dokumentacją obok. Skopiuj potrzebne pliki do aplikacji albo wciągnij repozytorium i importuj z niego.
Krok 2 — Twój pierwszy komponent
import Button from "lily-design-system-react-headless/components/Button";
export function SaveBar() {
return <Button onClick={save}>Save</Button>;
}
Renderuje <button class="button" type="button">. Propsy:
type, disabled, pressed (renderuje
aria-pressed), label (
aria-label do nadpisywania), className, a każdy dodatkowy atrybut jest rozsmarowywany na element główny.
Krok 3 — Złóż mały formularz
import { useState } from "react";
import Form from ".../components/Form";
import Field from ".../components/Field";
import TextInput from ".../components/TextInput";
import Button from ".../components/Button";
export function ContactForm() {
const [name, setName] = useState("");
return (
<Form label="Contact form" onSubmit={handleSubmit}>
<Field label="Full name" required>
<TextInput id="name" label="Full name" value={name} onChange={setName} required />
</Field>
<Button type="submit">Save</Button>
</Form>
);
}
Field przyjmuje widoczną label jako własny props zamiast zagnieżdżonego komponentu etykiety — przekaż ją raz, na
Fieldoraz TextInputz
label dostarcza dostępną nazwę.
Zweryfikowano 2026-08-29: wcześniejszy szkic zagnieżdżał osobny komponent Label wewnątrz Field, co renderowało
dwie etykiety (jedną pustą), ponieważ Field już renderuje własną z wejścia label props — wykryto, kompilując dokładny fragment. Trasa
Złożona trasa formularza kontaktowego
to ten sam wzorzec, sprawdzony prawdziwymi testami e2e i axe.
Krok 4 — Ostyluj go
Wszystko powyżej renderuje się jako czysta struktura, gotowa na twoje style. Ostyluj haczyki — .button,
.text-input, .label, .field — w swoim arkuszu stylów, nałóż narzędzia Tailwind przez classNamelub podlinkuj gotowy motyw:
<link rel="stylesheet" href="/themes/united-states-web-design-system.css" />
Krok 5 — Zobacz, jak to wszystko działa
Aplikacja przykładowa Next.js to cały katalog ostylowany i zademonstrowany, z Playwright e2e i punktem odniesienia axe-core:
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-react-next-examples
pnpm install && pnpm run dev
Następne kroki
- Motywy — przełączanie w czasie działania pomocnikiem theme-picker dla Reacta.
- Pomocniki preferencji — język i rozmiar tekstu.
- Katalog komponentów — właściwości, ARIA i klawiatura dla każdego komponentu.
Pytania po drodze? Strona pomocy jest pełna odpowiedzi — a jeśli jakiś krok mógłby być jaśniejszy, daj nam znać a chętnie ulepszymy samouczek.