docs(design-system): add foundation specification

This commit is contained in:
Sergey Krylov 2026-06-21 08:56:32 +03:00
parent 1b6fd39be3
commit e8dcb27a03

View File

@ -0,0 +1,168 @@
# Design System Foundation
## Статус
Draft — ожидает ревью пользователя.
## Цель
Создать внутреннюю дизайн-систему MoexVibe поверх MUI, которая задаёт единый визуальный язык,
контролируемый набор UI-компонентов и правила их применения. Первая версия должна обслуживать web-
приложение MoexVibe и сохранять нейтральную к платформе модель токенов для будущих адаптеров,
включая Android.
## Принципы
- MUI является компонентным и accessibility-движком, но не определяет визуальную идентичность
MoexVibe.
- Визуальное направление: спокойный нейтральный финансовый интерфейс со сбалансированной плотностью.
- Текущие стили приложения не являются источником дизайн-решений. Их миграция выполняется после
foundation отдельными фичами.
- Дизайн-система не содержит бизнес-логику, API-клиенты, маршрутизацию и доменные компоненты.
- Docusaurus остаётся единственной опубликованной человекочитаемой документацией проекта.
## Артефакты
### Workspace-пакет
В monorepo должен появиться внутренний пакет `@moex-vibe/design-system` со следующими границами:
- platform-neutral токены без зависимостей от React и MUI;
- MUI-адаптер, создающий тему и CSS variables из токенов;
- Core UI и повторяемые product patterns;
- стабильные subpath exports для токенов, темы и компонентов.
Продуктовый frontend использует компоненты дизайн-системы. Прямые импорты MUI разрешены только для
компоновки (`Box`, `Stack`, `Grid` и системные layout utilities). Интерактивные и визуально значимые
компоненты должны поступать из `@moex-vibe/design-system`.
### Storybook
Storybook является локальным и CI-стендом дизайн-системы. Он показывает варианты, состояния,
адаптивное поведение и accessibility-контракты компонентов, но не считается опубликованной
документацией для пользователей проекта.
### Docusaurus
В `apps/docs` должен появиться раздел «Дизайн-система» со страницами:
- обзор и принципы;
- foundations: цвет, типографика, spacing, размеры, радиусы, elevation и motion;
- модель токенов и правила их изменения;
- каталог компонентов и product patterns;
- accessibility;
- contribution и governance.
Каждая карточка компонента описывает: назначение и запреты, anatomy, разрешённые варианты, состояния,
keyboard behavior, accessibility, content rules, responsive behavior, корректные примеры и
антипаттерны.
## Модель токенов
Source of truth первой версии — типизированные TypeScript-объекты. Их схема и имена не должны
зависеть от MUI, React или CSS. Формат должен оставаться JSON-совместимым, чтобы позднее добавить
экспорт в DTCG/Android resources без изменения семантических имён.
Токены состоят из трёх уровней с однонаправленными зависимостями:
1. **Primitive/reference** — сырые палитры, шкалы spacing и размеров, типографика, радиусы, тени и
motion. Только на этом уровне допустимы абсолютные визуальные значения.
2. **Semantic/system** — роли: canvas, surface, text, border, action, feedback и финансовая семантика
positive/negative/neutral. Будущая тёмная тема переопределяет этот уровень, не меняя компоненты.
3. **Component** — устойчивые решения конкретных компонентов и вариантов. Они ссылаются на semantic
tokens и создаются только для повторяемых или тематизируемых решений, а не для каждого CSS-
свойства MUI.
Приложение не должно использовать primitive tokens или произвольные визуальные значения напрямую.
Цвет не может быть единственным способом сообщить финансовое состояние.
## Тема и визуальные основы
- Первая версия включает только светлую тему. API темы должен допускать добавление новых color schemes
без изменения API компонентов.
- MUI theme использует CSS variables и получает palette, typography, spacing, shape, elevation, motion,
defaults, variants и style overrides из токенов.
- Основная плотность интерфейса — сбалансированная. Компактный вариант допускается как явный вариант
data-heavy компонентов, но не как глобальный режим v1.
- Все состояния focus-visible должны быть заметны; компоненты поддерживают keyboard navigation и
`prefers-reduced-motion` там, где используется анимация.
- Целевой уровень доступности — WCAG 2.2 AA для применимых web-компонентов.
## Компонентная модель
### Core UI v1
- Typography: `Text`, `Heading`, `Link`.
- Actions: `Button`, `IconButton`.
- Inputs: `TextField`, `Select`, `Checkbox`.
- Surfaces and labels: `Surface`, `Card`, `Chip`, `Badge`.
- Feedback: `Alert`, `Dialog`, `Skeleton`, `Progress`.
Core UI ограничивает разрешённые variants и состояния MUI, сохраняет доступность и не содержит
доменной логики.
### Product patterns v1
- Data display: `DataTable`, `Metric`, `Money`, `PriceChange`.
- Forms and filtering: `FormField`, `FilterBar`.
- Page states: `EmptyState`, `ErrorState`, `LoadingState`.
Product pattern попадает в пакет, если он не знает бизнес-домен и имеет минимум два подтверждённых
места использования. Исключение — базовые интерактивные Core UI primitives, необходимые для
целостного API.
Доменные компоненты, включая broker-, portfolio- и screener-specific композиции, остаются в
соответствующих FSD-слоях frontend.
## Governance
- Изменение значения primitive token не должно молча менять смысл semantic token.
- Новый token требует описания роли и проверки существующих эквивалентов.
- Новый variant или компонент требует documented use case; API «на всякий случай» не добавляется.
- Breaking changes внутреннего пакета фиксируются в changelog и миграционной заметке, даже пока пакет
не публикуется во внешний npm registry.
- Архитектура пакета и граница прямого использования MUI фиксируются отдельным ADR.
## Проверки качества
- Unit-тесты проверяют token contracts, уникальность имён, допустимые ссылки и отсутствие циклов.
- Type tests проверяют публичные exports и разрешённые component variants.
- Interaction tests проверяют keyboard и пользовательские состояния интерактивных компонентов.
- Storybook содержит stories для default, hover/focus reference, disabled, loading, error и responsive
состояний, когда они применимы.
- Автоматические accessibility-проверки выполняются для stories и не допускают серьёзных нарушений.
- Visual regression покрывает репрезентативные состояния Core UI и product patterns.
- CI собирает workspace-пакет, Storybook, frontend и Docusaurus; затронутые lint и tests проходят.
## Вне scope
- Тёмная тема и UI-переключатель темы.
- Android-адаптер, DTCG/JSON export и синхронизация с Figma.
- Публикация пакета во внешний npm registry.
- Backend-driven UI.
- Массовая миграция существующих страниц и удаление legacy CSS.
- Редизайн доменных экранов, графиков и визуализаций данных.
## Последовательность внедрения
1. Эта фича создаёт Design System Foundation и не переписывает продуктовые экраны.
2. Отдельная фича мигрирует один репрезентативный pilot-экран и возвращает подтверждённые изменения в
tokens/component API.
3. Остальные области мигрируются отдельными вертикальными срезами; legacy styles удаляются только
после миграции всех их потребителей.
## Acceptance Criteria
- [ ] `@moex-vibe/design-system` подключён как внутренний workspace-пакет с документированными public
exports.
- [ ] Реализованы три уровня platform-neutral TypeScript tokens и автоматические проверки их
контрактов.
- [ ] Light MUI theme полностью строится из токенов и предоставляет CSS variables.
- [ ] Реализован и задокументирован каталог Core UI v1 и product patterns v1.
- [ ] Прямое использование MUI ограничено documented allowlist для layout utilities.
- [ ] Storybook локально запускается, собирается в CI и содержит обязательные состояния компонентов.
- [ ] Accessibility и visual regression checks проходят для согласованного набора stories.
- [ ] В Docusaurus опубликован полный раздел дизайн-системы и правила выбора компонентов.
- [ ] Создан ADR о границах пакета, MUI-адаптере и будущих platform adapters.
- [ ] Frontend, docs и design-system package проходят build, lint и tests.
- [ ] Существующие продуктовые страницы визуально не мигрированы в рамках этой фичи.