Документирование компонентов — ключевая часть разработки интерфейсных библиотек. В контексте Radix UI документирование выполняет несколько функций:
Radix UI предоставляет примитивы интерфейса (UI primitives), которые обычно используются как фундамент для создания собственных компонентов дизайн-системы. Поэтому документация должна описывать не только свойства компонентов, но и их архитектурную роль, способы композиции и ограничения.
Грамотно оформленная документация превращает библиотеку компонентов в инженерный инструмент, а не просто набор UI-элементов.
Документация каждого компонента должна иметь стандартную структуру. Это позволяет быстро находить нужную информацию и облегчает сопровождение библиотеки.
Обычно документация включает следующие разделы:
Краткое описание задачи, которую решает компонент.
Пример:
Dialog — компонент модального окна, реализующий паттерн
accessible modal dialog с поддержкой фокуса, клавиатурной
навигации и управления состоянием.
Важно описывать:
Многие компоненты Radix UI построены по compound component pattern. Один компонент состоит из нескольких элементов.
Например:
Dialog
├── Dialog.Root
├── Dialog.Trigger
├── Dialog.Portal
├── Dialog.Overlay
├── Dialog.Content
├── Dialog.Title
└── Dialog.Description
Документация должна объяснять роль каждой части.
Пример:
| Элемент | Назначение |
|---|---|
Dialog.Root |
управляет состоянием диалога |
Dialog.Trigger |
открывает диалог |
Dialog.Content |
основное содержимое |
Dialog.Overlay |
затемнённый фон |
Это важно, поскольку разработчик может использовать не все части, а только необходимые.
Каждый компонент Radix UI предоставляет набор props, событий и специальных возможностей.
Документация API должна включать:
Пример для Dialog.Root:
| Prop | Тип | По умолчанию | Описание |
|---|---|---|---|
open |
boolean | — | управляет состоянием диалога |
defaultOpen |
boolean | false | начальное состояние |
onOpenChange |
(open: boolean) => void |
— | вызывается при изменении состояния |
Компоненты могут генерировать события.
Пример:
onOpenChange(open: boolean)
Описание должно содержать:
Пример:
Срабатывает при открытии или закрытии диалога.
Используется для синхронизации состояния приложения.
Многие примитивы Radix UI поддерживают forwardRef.
Это важно указывать в документации:
Компонент поддерживает React ref.
Ref указывает на DOM-элемент dialog content.
Это необходимо для:
Radix UI известен тем, что реализует accessibility-поведение по стандартам WAI-ARIA. Поэтому документация должна описывать не только API, но и поведение компонента.
Например, для Dialog:
Это критически важная информация для разработчиков.
Пример описания:
| Клавиша | Действие |
|---|---|
Esc |
закрывает диалог |
Tab |
перемещает фокус |
Shift + Tab |
обратная навигация |
Такая информация необходима для обеспечения доступности интерфейса.
Radix UI активно использует React Portal.
Документация должна объяснять:
Пример:
Dialog.Portal рендерится в document.body по умолчанию.
Контейнер можно изменить через prop container.
Каждый компонент должен сопровождаться несколькими примерами.
import * as Dialog from "@radix-ui/react-dialog";
export function Example() {
return (
<Dialog.Root>
<Dialog.Trigger>
Open dialog
</Dialog.Trigger>
<Dialog.Portal>
<Dialog.Overlay />
<Dialog.Content>
<Dialog.Title>
Settings
</Dialog.Title>
<Dialog.Description>
Manage application preferences
</Dialog.Description>
<button>Save</button>
</Dialog.Content>
</Dialog.Portal>
</Dialog.Root>
);
}
Пример должен быть минимальным, но полностью рабочим.
Radix UI поддерживает controlled и uncontrolled режимы.
Пример controlled-режима:
const [open, setOpen] = useState(false);
<Dialog.Root open={open} onOpenCha nge={setOpen}>
<Dialog.Trigger>Open</Dialog.Trigger>
<Dialog.Content>
Controlled dialog
</Dialog.Content>
</Dialog.Root>
Документация должна объяснять:
Radix UI не предоставляет готовые стили. Компоненты предназначены для стилизации через CSS или CSS-in-JS.
Пример:
.DialogOverlay {
background: rgba(0,0,0,0.5);
position: fixed;
inset: 0;
}
.DialogContent {
background: white;
padding: 24px;
border-radius: 8px;
}
<Dialog.Overlay className="DialogOverlay" />
<Dialog.Content className="DialogContent" />
Документация должна показывать где именно применяются стили.
Radix UI построен на композиционной архитектуре. Компоненты можно комбинировать.
Пример:
DropdownMenu внутри Dialog
Popover внутри Tooltip
Документация должна показывать допустимые комбинации.
Пример:
<Dialog.Content>
<DropdownMenu.Root>
<DropdownMenu.Trigger>
Options
</DropdownMenu.Trigger>
</DropdownMenu.Root>
</Dialog.Content>
Важно указать возможные проблемы:
Radix UI реализует ARIA-паттерны. Документация должна фиксировать:
role)Пример:
Dialog.Content имеет role="dialog".
Dialog.Title связывается с aria-labelledby.
Dialog.Description связывается с aria-describedby.
Таблица:
| Элемент | ARIA |
|---|---|
Dialog.Content |
role=“dialog” |
Dialog.Title |
aria-labelledby |
Dialog.Description |
aria-describedby |
Это позволяет разработчикам понимать внутреннюю структуру компонента.
Radix UI активно использует data-атрибуты состояния.
Пример:
[data-state="open"]
[data-state="closed"]
Они используются для стилизации.
Пример:
.DialogContent[data-state="open"] {
animation: fadeIn 200ms;
}
.DialogContent[data-state="closed"] {
animation: fadeOut 200ms;
}
Документация должна перечислять доступные состояния.
Некоторые компоненты предоставляют CSS variables.
Пример:
--radix-popover-content-transform-origin
--radix-tooltip-content-transform-origin
Они используются для анимаций.
Пример:
.PopoverContent {
transform-origin: var(--radix-popover-content-transform-origin);
}
Документация должна описывать:
Каждый компонент имеет ограничения.
Примеры:
Dialog не должен вкладываться в другой
DialogDropdownMenu может конфликтовать с
TooltipPopover требует правильного позиционированияРаздел ограничений помогает избежать распространённых ошибок.
Некоторые компоненты используют:
Это может влиять на производительность.
Пример документации:
DropdownMenu использует pointer events
и подписку на document events.
Также полезно указать:
Radix UI предполагает использование определённых архитектурных паттернов.
Например:
Компоненты управляются через родительский Root.
Tabs.Root
Tabs.List
Tabs.Trigger
Tabs.Content
Документация должна объяснять, что:
Radix UI использует asChild prop.
Пример:
<Button asChild>
<Dialog.Trigger>
Open
</Dialog.Trigger>
</Button>
Документация должна описывать:
asChildМногие компоненты имеют внутренние состояния:
Пример:
Toggle
[data-state="on"]
[data-state="off"]
Таблица состояний:
| Состояние | Значение |
|---|---|
on |
включено |
off |
выключено |
Это помогает писать стили и анимации.
Каждая версия библиотеки должна сопровождаться changelog.
Пример:
v1.0.3
- добавлен prop modal в Dialog
- исправлена ошибка фокуса
Документация должна содержать:
Это критично для поддержки крупных проектов.
Документацию можно частично генерировать автоматически.
Инструменты:
Пример JSDoc:
/**
* Dialog component for modal interactions
*
* @prop open Controlled state
* @prop defaultOpen Initial state
*/
Storybook позволяет:
Поскольку Radix UI используется внутри дизайн-систем, документация должна фиксировать дизайн-правила.
Примеры:
Dialog ширина не должна превышать 600px
Tooltip используется только для коротких подсказок
DropdownMenu не должен содержать сложные формы
Это предотвращает неправильное использование компонентов.
Документация может включать описание тестируемого поведения.
Пример:
При открытии Dialog:
- фокус внутри
- aria-hidden у background
- esc закрывает окно
Такие сценарии помогают писать:
Типичная структура проекта:
components/
dialog/
dialog.mdx
dialog.examples.tsx
dialog.api.md
Либо:
docs/
components/
dialog.md
dropdown-menu.md
tooltip.md
Каждый файл должен описывать один компонент.
Качественная документация компонентов Radix UI должна: