Перейти к основному содержимому

Правила Frontend Design System

Назначение

Документ задаёт стандарты дизайн-системы frontend-приложений Pin на стеке HeroUI v3.0.5 + Tailwind CSS 4.3. Применяется ко всем SPA, включая pin-admin. Цель — единообразный визуальный язык, переиспользуемые токены, корректная инициализация тем и стилей, поддержка светлой/тёмной тем и адаптивности.

Базовый стек

СлойТехнологияВерсияНазначение
Component libraryHeroUI3.0.5Базовые UI-примитивы (Button, Input, Modal, Table, Tabs, Tooltip и т.д.)
CSS frameworkTailwind CSS4.3Utility-классы для layout и композиции
Theme providerHeroUI <HeroUIProvider>Корневой провайдер темы, dark/light режим
Tailwind presetHeroUI Tailwind pluginИнтеграция HeroUI токенов в Tailwind config
CSS variablesNative CSS Custom PropertiesФинальные значения токенов
ИконкиLucide / iconify-reactактуальнаяВекторные иконки, tree-shake friendly
ШрифтыInter (UI), JetBrains Mono (code)Системный fallback допустим

Установка и инициализация

Подключение HeroUI и Tailwind preset

src/app/main.tsx
import { HeroUIProvider } from "@heroui/react";
import { ThemeProvider } from "./theme/ThemeProvider";
// ...
<HeroUIProvider locale="ru-RU">
<ThemeProvider>
<RouterProvider router={router} />
</ThemeProvider>
</HeroUIProvider>

src/shared/theme/tailwind-preset.ts
import { heroui } from "@heroui/react";
export const heroPreset = heroui({
themes: {
light: { ... },
dark: { ... },
},
});

tailwind.config.ts
import { heroPreset } from "@/shared/theme/tailwind-preset";
export default {
content: ["./src/**/*.{ts,tsx,html}", "./node_modules/@heroui/react/dist/**/*.{ts,tsx,js,jsx}"],
presets: [heroPreset],
darkMode: "class",
};

Контентом сканирования обязательно покрывается node_modules/@heroui/react/dist/** — иначе production-build сбрасывает классы HeroUI.

Подключение глобальных стилей

src/app/index.css
@import "tailwindcss";
@plugin "@heroui/react/tailwind";

@layer base {
:root { color-scheme: light; }
.dark { color-scheme: dark; }
html, body, #root { @apply h-full bg-background text-foreground; }
body { @apply antialiased font-sans; }
}

@plugin директива Tailwind 4.3 заменяет старую регистрацию через preset; компоненты HeroUI автоматически получают свою тему.

Дизайн-токены

Все токены хранятся в src/shared/theme/tokens/:

shared/theme/tokens/
colors.ts // primary, secondary, success, warning, danger, neutral, AlertLevel (Green/Yellow/Red/Black)
typography.ts // text-xs..text-3xl, headings, leading, tracking
spacing.ts // 0/0.5/1/1.5/2/3/4/6/8/12/16/24/32/48
radius.ts // none/sm/md/lg/xl/full
shadows.ts // sm/md/lg/xl, inset
elevations.ts // z-index уровни: base/dropdown/sticky/overlay/modal/toast/tooltip
motion.ts // duration-fast/normal/slow, ease-out, ease-in

Все токены экспортируются как TypeScript константы и одновременно записываются в Tailwind preset через HeroUI themes секцию. UI-компоненты используют только токенные значения, не сырые hex/px.

Темы и ThemeProvider

Целевые темы

  • light — основной режим для рабочих часов.
  • dark — для длительной работы в вечернее/ночное время.
  • system — следует системной настройке (default).

Контракт ThemeProvider

src/shared/theme/ThemeProvider.tsx
- читает theme из useThemeStore (Zustand persisted)
- синхронизирует с document.documentElement (className "dark" | "light")
- слушает window.matchMedia("(prefers-color-scheme: dark)") если theme === "system"
- предоставляет хук useTheme() с { theme, setTheme }

Правила

  • Все цвета компонентов задаются семантическими токенами (background, foreground, primary, default, success, warning, danger), а не сырыми hex.
  • Тёмная тема обязательна для всех экранов и виджетов; контрастность WCAG AA минимум.
  • Анимация переключения темы 150ms ease-out через CSS-переменные.

Сетка и breakpoints

BreakpointШиринаНазначение
xs< 480pxМобильный портрет, основной адаптив сворачивает таблицы в карточки
sm≥ 480pxМобильный landscape
md≥ 768pxПланшет
lg≥ 900pxЦелевой минимум для рабочих экранов
xl≥ 1280pxСтандартный ноутбук
2xl≥ 1440pxСтандартный десктоп
3xl≥ 1920pxШирокоэкранный

Целевой диапазон для разработки каталогов: 900–1400px. При этом сервис обязан работать корректно от 320px до 2560px.

Подробнее в ui-responsive-design-rules.md.

Композиция компонентов

СлойИспользование
HeroUI компонентБазовый примитив (Button, Input, Modal, Autocomplete, …). Используется напрямую из @heroui/react; не патчится глобально через :where; кастомизация через className/classNames.
MoleculeКомпозиция примитивов + логика отображения (FormField, ConfirmDialog, async-селекты). Тонкие atom-обёртки над HeroUI не создаём («ui kit в нашем ui kit»).
OrganismКомпозиция molecules + хуки данных, но без бизнес-flow (тот живёт в widgets/features).

Цвета по бизнес-смыслу

СемантикаСветлаяТёмнаяИспользование
primarybrand colorbrand colorCTA, активные элементы, ссылки
successgreengreenПодтверждения, validated/published статусы, AlertLevel Green
warningamberamberПодсказки, validation warnings, AlertLevel Yellow
dangerredredДеструктивные действия, validation errors, AlertLevel Red
criticaldark red / blackdark redAlertLevel Black, критические события
defaultneutralneutralНейтральные badge, secondary buttons
backgroundwhitedark grayОсновной фон
foregrounddark textlight textОсновной текст
dividerlight graydark grayРазделители

Использование Tailwind 4.3

  • Использовать новый @theme блок для конфигурации тем напрямую в CSS.
  • Использовать новый @plugin для HeroUI интеграции.
  • Не использовать deprecated @apply в production-критичных компонентах (только в lego-обёртках).
  • Tailwind directives @layer base/components/utilities сохраняют силу.
  • Container queries (@container) разрешены для адаптивных карточек.
  • Logical properties (ms-, me-, ps-, pe-) обязательны для будущей RTL-поддержки.

Запрещено

  • Произвольные hex-цвета в JSX (bg-[#abcdef]) — только токены.
  • Произвольные размеры (w-[173px]) — только токены или контентные размеры.
  • Inline стили (style={{ color: ... }}) кроме случаев анимаций.
  • Глобальные :root переопределения CSS-переменных HeroUI вне theme preset.
  • Подключение нескольких UI-библиотек одновременно (Mantine, MUI, Chakra) — только HeroUI.

Версионирование

  • HeroUI закреплён на минорной версии (^3.0.5). Major-обновление — через ADR.
  • Tailwind CSS закреплён на минорной версии (^4.3.0). Major-обновление — через ADR.
  • Lock-файл pnpm-lock.yaml коммитится.

Дополнительные ресурсы

  • Полная документация HeroUI.claude/docs/heroui/llms-full.txt (LLM-формат, разделы <page url="…">). Основной справочник по компонентам, props, slots, accessibility и паттернам; используйте при добавлении/изменении UI.

Обратные ссылки

Автоссылки: где используется этот документ.

Связанные документы