Скилл переносится из ~/.claude/skills/aura-design в репозиторий обвязки: SKILL.md, справочники reference/ и набор kit/ (токены, base.css, компоненты React, оболочка AppShell, тест токенов, test-setup, примеры входа). install.sh ставит его в ~/.claude/skills/aura-design, --check его видит. tests/test-aura-design.sh проверяет структуру и инварианты набора. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7.4 KiB
7.4 KiB
AURA — компоненты
Что есть в kit/ui (импорт из ./ui/index.ts)
| Компонент | API | Правило |
|---|---|---|
Button |
variant primary/secondary/danger/ghost (по умолч. secondary), size md 32/lg 40, icon, loading |
одна primary на экран/форму; loading — крутилка вместо иконки, вид варианта сохраняется, disabled + aria-busy; переключатель — secondary с aria-pressed |
IconButton |
label (обязателен → aria-label и title), icon |
32×32, радиус 10; для действий без подписи |
Segmented |
label, value, options[{value,label,href?}], onChange / link |
2–4 взаимоисключающих варианта на сером треке; с href — ссылки (aria-current), иначе radiogroup |
ThemeSwitch |
— | солнце/луна, role=switch; пока не трогали — системная тема |
Field |
label, hint, error, один дочерний контрол |
подпись 14/20 600 над полем; ошибка 12/16 цвета ошибки, role=alert, ставит aria-invalid |
TextInput, Textarea, Select, SearchInput, Checkbox |
как у родных элементов + size |
Select — родной <select> со своей стрелкой; SearchInput с иконкой и «Очистить» |
Badge |
tone neutral/success/error/warning/info |
статус, счётчик; текст обязателен (не только цвет) |
Chip |
onRemove, removeLabel |
снимаемая плашка выбранного фильтра: «Категория: Видео ✕» |
Notice |
tone success/error/warning/info, title, action |
иконка в круге, заголовок 14/20 600, текст 12/16; error/warning — role=alert |
Panel |
as, padding none/md/lg |
поверхность, граница, радиус 16 — контейнер любого блока |
PageHeader |
title, subtitle, actions, children |
h1 20/28 + подзаголовок вторичным; действия справа, переносятся |
Dialog |
label, onClose, size sm 480/md 640/lg 1000 |
родной <dialog> (showModal): фокус и Esc бесплатно; ≤700 px — во весь экран. Внутри: h2.ui-dialog__title, form.ui-form, внизу div.ui-actions |
Confirm |
title, text, confirmLabel, danger, onConfirm, onCancel |
подтверждение вместо window.confirm/alert (удаление, потеря ввода) |
Dropdown |
button({open,toggle}), children(close) |
выпадающая панель (мультиселект фильтра) |
Menu, MenuItem, MenuSeparator |
label, align, up; onSelect, pressed, danger |
меню «⋯» для редких действий; переключатели — pressed (галочка) |
иконки Icon* |
size 16/20 |
линейные SVG, currentColor; новые рисуй тем же make(). Есть: Plus, Edit, Trash, Download, Upload, Refresh, Search, Filter, More, Close, ChevronDown/Up, Check, Error, Warning, Info, Calendar, Link, External, Open, Board, List, Menu, Sidebar, Home, Settings, User, Sun, Moon |
AppShell (kit/shell) |
brand, nav, current, link, top, bottom, topbarEnd, menu, storageKey, wide |
см. layout-ux.md |
CSS-классы без компонента:
.ui-toolbar— строка фильтров (в нейSearchInputрастягивается до 480);.ui-chips— рядChipпод ней;.ui-table+.ui-table-wrap(наPanel padding="none"),--table-min,td.num— числа вправо,td.actions— кнопки строки;.ui-late— просрочка;.ui-form,.ui-actions,.ui-dialog__title,.ui-dialog__text— форма и окно;.ui-empty,.ui-empty__title— пустое состояние;.ui-dot+style={{"--dot": "var(--color-cat-3)"}}— точка категории;.ui-spinner,.visually-hidden,.mono.
Мультиселект фильтра (список с флажками) — Dropdown с кнопкой secondary («Категория (2)» с IconFilter) и
разметкой:
<Dropdown button={({ open, toggle }) => <Button icon={<IconFilter />} aria-expanded={open} onClick={toggle}>Категория{n ? ` (${n})` : ""}</Button>}>
{() => <div className="dd-list">{options.map((o) => (
<label key={o} className="dd-item"><input type="checkbox" checked={sel.has(o)} onChange={() => flip(o)} />{o}<span className="n">{count[o]}</span></label>
))}</div>}
</Dropdown>
Контракты AURA, которых нет в наборе (строить по ним, когда понадобятся)
Геометрия и состояния — из tokens.json; литералы ниже переводить в токены (#fafaf8 → --color-bg-subtle,
#7cac58/#83b766 → color-mix(in srgb, var(--color-action-primary) 80%, var(--color-bg-surface))).
| Компонент | Геометрия | Состояния |
|---|---|---|
| Плитка выбора (radio/checkbox-карточка) | высота 84, контрол 16 по центру по вертикали, текст с отступа 45, заголовок 14/20 600, описание 12/16 через 2, padding 14/12, радиус 12, gap между плитками 8 | default: subtle + граница default; hover: зеленоватая граница + тень 0 4px 12px 7%; selected: surface + граница action-primary |
| Компактная опция с иконкой | высота 54, контрол с 13, иконка 32 с 45, текст с 85 | как плитка |
| Загрузка файла (dragger) | пусто 84 / с файлом 86, padding 12/16, gap 12, иконка 40, радиус 20, граница 1.5 пунктир | empty: subtle + зеленоватый пунктир; hover/drag: selected-фон + action-primary пунктир; added: сплошная граница |
| Плашка файла | высота ≥28, радиус 8, gap 4 | фон selected, зелёная граница и текст; «удалить» на hover — цвет ошибки |
| Шаги процесса | высота ≥60, иконка 28, радиус 20, gap 12 | pending: иконка тёмная; active: зелёная; complete: зелёная с галочкой |
| Панель действия (низ формы) | высота ≥64, кнопка ≥176 шириной, gap 16 | пусто: кнопка недоступна; выбрано: доступна; обработка: loading; готово: статус успеха + «Ещё раз»; ошибка: статус ошибки |
| Переключатель (switch) | 44×22, «таблетка» | выкл: серый трек; вкл: action-primary; ручка белая |
Правило AURA: не вводить состояний, которых интерфейс не рисует; не придумывать новых цветов, радиусов, отступов и иконок вне системы — сначала токен, потом использование.