Руководство по React

Типизированные функциональные компоненты, по одному файлу, управляемые стандартным шаблоном value + onChange — всё работает так, как React уже работает.

Что вы построите

Небольшая контактная форма — поле с меткой, кнопка отправки, управляемое состояние, реальное поведение клавиатуры и программы чтения с экрана — сначала голая, затем оформленная, примерно за 10 минут.

Прежде чем начать

Вам понадобятся git, Node 22 или новее и pnpm 10 или новее. Подойдёт любой проект React 18+ — Next.js, Vite или обычный React.

Шаг 1 — Получите код

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

Компоненты — это плоские файлы в components/ — Button.tsx, TextInput.tsx — у каждого рядом его тест, story и документация. Скопируйте нужные файлы в своё приложение или подтяните репозиторий и импортируйте из него.

Шаг 2 — Ваш первый компонент

import Button from "lily-design-system-react-headless/components/Button";

export function SaveBar() {
  return <Button onClick={save}>Save</Button>;
}

Отображает <button class="button" type="button">. Props: type, disabled, pressed (отображает aria-pressed), label ( aria-label для переопределения), className, а любой дополнительный атрибут разворачивается на корневом элементе.

Шаг 3 — Составьте небольшую форму

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 принимает видимую label как собственный prop, а не как вложенный компонент метки — передайте её один раз, на Fieldи TextInputиз label обеспечивает доступное имя.

Проверено 2026-08-29: в более раннем черновике отдельный компонент Label внутри Field, что отображало две метки (одну пустую), потому что Field уже отображает свою собственную из входа label prop — обнаружено компиляцией точного фрагмента. Маршрут Составной маршрут контактной формы — тот же шаблон, проверенный настоящими тестами e2e и axe.

Шаг 4 — Оформите её

Всё вышеперечисленное отображается как чистая структура, готовая для ваших стилей. Оформите крючки — .button, .text-input, .label, .field — в вашей таблице стилей, наложите утилиты Tailwind через className, или подключите готовую тему:

<link rel="stylesheet" href="/themes/united-states-web-design-system.css" />

Шаг 5 — Посмотрите, как всё работает

Пример приложения Next.js — это полный каталог в оформленном виде и с демонстрацией, с Playwright e2e и базовой линией 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

Дальнейшие шаги

Есть вопросы по ходу дела? Страница справки полна ответов — а если какой-то шаг можно сделать яснее, сообщите нам и мы с радостью улучшим руководство.