4.3 KiB
4.3 KiB
Frontend Guide: Foundation
Источники истины
Foundation layer уже существует и задаётся в этих файлах:
frontend/src/app/globals.cssfrontend/src/components/ui/Modal.tsxfrontend/src/components/shared/SearchableSelect.tsxfrontend/src/components/AppShell.tsx
Новый UI должен опираться на них. Локальные utility-классы допустимы только как расширение, а не как новая параллельная система.
Цветовые и surface-токены
Базовые переменные определены в frontend/src/app/globals.css.
Ключевые токены:
--background--foreground--muted-foreground--surface-primary--surface-elevated--surface-secondary--surface-tertiary--surface-overlay--border-subtle--border-strong--accent-primary--accent-primary-strong--accent-soft--accent-soft-strong--success-soft--danger-soft--warning-soft--shadow-card--shadow-elevated
Правила:
- не вводить в новые экраны собственную “серую тему” через
bg-white,bg-gray-*,border-gray-* - не использовать локальный
focus:ring-sky-*, если поведение уже покрываетсяapp-* - новый базовый цветовой токен сначала добавляется в
globals.css, потом используется в компонентах
Surface primitives
app-surface
Использование:
- внешний самостоятельный блок
- основная карточка страницы
- primary content container
app-surface-elevated
Использование:
- модалки
- overlay-панели
- визуально поднятые контейнеры
app-surface-muted
Использование:
- вложенные секции
- grouped blocks
- вторичный внутренний слой
Правило вложенности:
- не строить цепочку
card inside card inside card - нормальный паттерн для большинства страниц: один внешний
app-surfaceи один внутреннийapp-surface-muted
Form primitives
app-input
Использование:
- text inputs
- textareas
- date/time inputs
- field shells для compose-like строк, если это оправдано паттерном
app-select
Использование:
- native
select - select-like triggers
Правило:
- если полю нужен поиск, мультивыбор, chips или сложный dropdown affordance, использовать shared select-компонент, а не локально стилизованный native
select
Action primitives
app-action-primary
Использование:
- главное действие формы
- основной CTA секции
app-action-secondary
Использование:
- вторичное действие
- отмена
- нейтральный CTA
app-action-ghost
Использование:
- item actions внутри меню
- лёгкие встроенные действия
app-action-danger
Использование:
- destructive actions
Правило:
- danger action использует ту же базовую оболочку, что и
app-action-secondary - destructive state отличать тоном, текстом и hover-состоянием, а не исчезающим контейнером
- icon-only danger action не должен выглядеть "голой" иконкой рядом с secondary control
Badge, menu, feedback, selected
Использовать существующие primitives:
app-badgeapp-badge-accentapp-menuapp-selectedapp-selected-softapp-feedback-successapp-feedback-warningapp-feedback-danger
Правила:
- статус должен быть семантическим
- selected state не подменяется произвольным акцентным фоном
- helper и feedback-блоки должны опираться на существующие feedback classes