Семейство действий намеренно небольшое: Button для нажатия, IconButton для кнопки с одной иконкой, Link для встроенного текстового действия. Рядом — компоненты раскладки: обычные функции, в которых свойства отступов и радиусов называют ступени шкал токенов.
Button
| Свойство | Значения | По умолчанию |
|---|---|---|
variant |
primary, secondary, outline, ghost, destructive, inverse |
primary |
size |
sm, md, lg |
md |
loading |
boolean |
false |
fullWidth |
boolean |
false |
leading, trailing |
содержимое перед подписью и после неё | нет |
type |
button, submit, reset |
button |
Button отображает нативный <button> и передаёт остальные атрибуты кнопки без изменений. type по умолчанию равен button, поэтому внутри формы отправка происходит только при явном type="submit".
При loading кнопка отключается и получает aria-busy; индикатор загрузки заменяет ведущую иконку, а завершающая скрывается. Подпись остаётся, сохраняя имя кнопки.
IconButton
IconButton содержит только иконку, поэтому имя обязательно:
| Свойство | Значения | По умолчанию |
|---|---|---|
icon |
имя символа из набора Icon |
обязательно |
label |
string |
обязательно |
variant |
primary, secondary, outline, ghost, destructive |
secondary |
size |
sm, md, lg — символ 16, 18 или 20 px |
md |
shape |
circle, square |
circle |
label становится aria-label и title кнопки, поэтому элемент с одной иконкой всегда имеет доступное имя. Сам символ скрыт от вспомогательных технологий. Набор Icon содержит 38 символов, включая check, close, plus, minus, search, chevron-right, chevron-down, copy, trash, download и upload. Тип IconName принимает любую строку, поэтому сверяйте имя с набором: неизвестное имя даёт пустое изображение.
Link
Link — встроенное текстовое действие в формах и сценариях, например «Забыли пароль?» или «Вернуться ко входу». Он отображает <a> при заданном href, иначе <button>: один компонент покрывает навигацию и действия внутри приложения. Отключённый Link всегда является <button>, поэтому переход по нему невозможен.
Свойства: href, onClick, disabled, size (sm или md), muted — третичный цвет вместо фирменного, leading, trailing, type, target, rel, class, aria-label. Компонент отвечает за представление; навигацией или щелчком управляет вызывающий код.
Раскладка по шкалам токенов
Компоненты раскладки берут размеры из таблицы токенов по имени:
SpaceScale: от"2"до"128", ступени--space-*.gap="12"означаетvar(--space-12).RadiusScale: от"2"до"32"и"full", ступени--radius-*.Align:start,center,end,stretch,baseline, дляalign-items.Justify:start,center,end,between,around,evenly.
Четыре типа экспортируются из @fiberfx/ui, чтобы ваши компоненты принимали те же шкалы. Каждый из одиннадцати компонентов ниже — обычная функция, принимающая as для выбора другого элемента и передающая остальные атрибуты. Ещё четыре компонента семейства — AspectRatio, AuthLayout, Collapsible, ScrollArea — в этот уровень композиции не входят.
Box, Stack, Flex и Grid
Box: поверхность с внутренними отступами.p,px,py,pt,pr,pb,plпринимают ступень отступа;bg— поверхность (primary,secondary,tertiary,brand,brand-subtle,elevated);radius— ступень радиуса;borderрисует вторичную тонкую границу;shadowпринимает от100до600.Stack: вертикальный поток сверху вниз сgap,alignиjustify.Flex: линия в любомdirection(row,column,row-reverse,column-reverse), сgap,align,justify,wrap.Grid: два измерения.colsиrowsпринимают число равных треков либо строку шаблона без изменений;flowпринимаетrow,column,dense,row dense,column dense; также естьgap,align,justify.
Составные компоненты
Ещё семь завершают этот уровень:
Container: колонка для чтения с максимальной шириной, по умолчанию центрированная.Spacer: гибкое пустое пространство во flex-строке или колонке.GridItem: дочерний элементGridдля размещения на нескольких столбцах или строках.Center: центрирование потомка по обеим осям.Sidebar: боковая колонка фиксированной ширины рядом с расширяющейся основной.Cluster: горизонтальная группа с переносом.Section: семантический блок страницы с отступами, вертикальныйStack.
Совместное использование
import { Box, Button, Flex, IconButton, Link, Stack, Text } from "@fiberfx/ui";
export function SaveBar({ saving }: { saving: boolean }) {
return (
<Box p="16" bg="secondary" radius="8" border>
<Stack gap="12">
<Text>Your draft has unsaved changes.</Text>
<Flex gap="8" align="center" justify="between">
<Link href="/drafts" muted>All drafts</Link>
<Flex gap="8" align="center">
<IconButton icon="trash" label="Discard draft" variant="ghost" />
<Button variant="primary" loading={saving}>Save</Button>
</Flex>
</Flex>
</Stack>
</Box>
);
}
Здесь нет буквальных значений оформления: каждый отступ, радиус, поверхность и граница заданы ступенью таблицы токенов. Поэтому панель следует теме вместе со страницей.