Files
shturman/docs/contracts/design-system.md

150 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Контракт: дизайн-система (визуальный язык)
> Единый **визуальный язык** ОС: токены, компоненты, правила. Делает измеримыми
> визуальные стороны принципов #11 (отзывчивость), #6 (driver-distraction), #10 (RU-first).
> Все UI-вкладчики (Shell, now-playing, навигация, камера, плагины) говорят на нём.
Статус: **v1 (черновик на ревью).**
Связано с: [principles.md](../principles.md) (#6/#10/#11) · домен [C](../domains/c-shell-ux.md) (владелец рендера/слот-модель/тема) · [safety.md](safety.md) (§4 distraction) · [performance.md](performance.md) (§3 motion/кадр) · [plugin-sdk.md](plugin-sdk.md) (`ui_*`) · [tech-stack.md](../tech-stack.md) (Slint)
---
## 1. Назначение и рамки
- **Язык-контракт:** все, кто вкладывает UI (Shell C, now-playing H, нав I, камера J,
плагины через `ui_tiles`/`ui_screens`), рендерятся в **едином стиле** — система задаёт язык,
они дают контент.
- **НЕ финальный скин.** Конкретные ЗНАЧЕНИЯ токенов (точные цвета/размеры/шрифт) — **🟡**,
финализируются на **реальном экране** (контраст на солнце, glance-тест за рулём). Здесь —
**структура языка + рекомендованные дефолты** (как distraction-числа в safety, латентность в performance).
- **Владелец рендера — Shell (C):** тайлы рисует сам shell единым стилем ([C §5](../domains/c-shell-ux.md) —
рендер shell / единый стиль), через декларативный Slint-UI-DSL (C §5); поверхности встают в слоты (C §4).
## 2. Дизайн-направление: «тихая премиальность, водитель в фокусе»
Вдохновение **Mercedes-AMG GT** (мультимедиа) + **Tesla****наш** язык (MIT, не клон).
- **Характер — AMG-leaning:** глубокий чёрный, драматичный контраст, **хром-хайрлайны**,
выраженный **приборный мотив** (круговые шкалы), технический premium, монохромный кластер.
- **Каркас — ясность:** плоско, воздух, крупные цели, контент-первый (спокойствие как у Tesla).
- **Три столпа:** (1) **читаемость за рулём** прежде красоты; (2) **премиальная сдержанность**
один акцент, не радуга; (3) **машина как герой** — vehicle-data first-class, приборные мотивы.
## 3. Токены
### 3.1 Цвет
- **Две темы: Ночь (дефолт, AMG-чёрный) и День (полноценная).** Авто-переключение
(C02: по времени v0 → GPS-восход v1); ручной оверрайд в Settings.
- **Слои глубины** (не тени — плоско): `bg` (фон-экран) → `surface` (тайл) → `surface-2`
(под-тайл/трек); разделение — **хром-хайрлайн** `line` 0.5px + яркость, не shadow.
- **Бренд-акцент — ТОКЕН, выбираемый пользователем** (Settings). Дефолт — **«Платина»**
(high-key нейтраль; AMG-кластер: серебристая энергия на чёрном — не навязывает цвет, эмфаза
яркостью/заливкой). Курируемый набор (🟡): Платина (дефолт) · Cyan-teal · Электрик-блю · Индиго ·
Маджента — все **держат дистанцию от hue-секторов семантики** (`danger`/`warn`/`ok`), чтобы на
фокус-ринге/прогрессе не путаться с алертом/distraction-lock (возможен пользовательский hex с тем же
ограничением). Акцент — **только на активном/живом** (now-playing, PTT, прогресс, фокус-ринг).
- **Семантика — ФИКСИРОВАНА, не бренд-акцент:** `danger` (красный — критич./DTC),
`warn` (янтарь — предупреждение / distraction-lock), `ok` (зелёный — online / двигатель OK).
**Red/amber зарезервированы под алерты** → бренд-акцент их не использует (иначе предупреждение теряется).
| Токен | Ночь (дефолт) 🟡 | День 🟡 | Роль |
|-------|------------------|---------|------|
| `bg` | `#0a0c0e` | `#e7ebee` | фон-экран |
| `surface` | `#14181b` | `#ffffff` | тайл/карточка |
| `surface-2` | `#1b2125` | `#f1f5f7` | под-тайл/трек |
| `text` | `#eef2f4` | `#131a1e` | основной текст |
| `muted` | `#7e888f` | `#5c6772` | вторичный |
| `line` | `rgba(255,255,255,.08)` | `rgba(0,0,0,.08)` | хром-хайрлайн |
| `accent` (Платина) | `#d8dee2` | `#2a3138` | активное / now / фокус |
| `danger` | `#e2554e` | `#cf3d36` | критич. / DTC |
| `warn` | `#e3a948` | `#bf7a0c` | предупреждение / distraction-lock |
| `ok` | `#54b06b` | `#3d9657` | online / двигатель OK |
### 3.2 Типографика
- **RU-first / Cyrillic** (#10): шрифт с полным кир. набором и хорошей читаемостью мелкого —
🟡 кандидаты (open/MIT-совместимые): Inter / Manrope / собственный. На ходу — крупно, средний вес.
- **Два веса (400/500)** — тяжёлые начертания выглядят дёшево (premium-сдержанность, как perf-эстетика).
- **Tabular цифры** (`tnum`) для времени / скорости / значений — приборный мотив.
- **Шкала** (🟡): display 3056 (скорость/часы), h 1922, body 15, label 1213, micro 11.
**Sentence case** везде (не Title Case, не CAPS — кроме осознанного брендового вордмарка).
### 3.3 Пространство и сетка
- База **4px**; отступ тайла 14–16; гэп 12; **крупные touch-цели ≥ 4648px** (🟡 собственный дефолт; крупные цели в движении — [safety §4.4](safety.md)).
- Поверхности/тайлы встают в **слот-модель** [C §4](../domains/c-shell-ux.md).
### 3.4 Радиусы и материальность
- Радиусы: `md` 12 · `lg` 16 · `pill` 23+. **Плоско:** без градиентов / тяжёлых теней
(дёшево для Panfrost, держит 60 fps — performance §3). Глубина — слоями + хром-хайрлайн.
### 3.5 Motion
- В рамках [performance §3](performance.md) (60 fps, ввод ≤100 ms). Сдержанно: **150250 ms**,
ease; типы — fade / slide / малый scale. **Декоративной анимации на ходу нет** (distraction);
в `driving` — редукция движения.
## 4. Компонент-таксономия
Каждый компонент — в слот-модели [C §4](../domains/c-shell-ux.md):
- **Тайл** (home, крупный, тап → апп/действие) · **Карточка** · **Статус-бар** (время/сеть/темп/вордмарк) ·
**Now-playing** (арт / тайтл / прогресс / транспорт / источник) · **Ассистент-оверлей** (PTT-пилюля
всегда доступна + лог-диалог в слоте, C §8) · **Нав-поверхность** (карта + turn-by-turn) ·
**Камера-вид** · **Экраны настроек** · **Диалоги разрешений** (capability-review, C14).
- **Приборные компоненты** (фирменный AMG-мотив): **круговая шкала** (speed / RPM / temp),
vehicle-data — first-class гражданин UI.
## 5. Driver-distraction визуал *(операционализация [safety §4](safety.md))*
- На ходу (`driving`): **крупнее цели, меньше элементов**; **прячем** клавиатуру, длинные списки,
мелкое, видео на экране водителя; **голос-первый** (PTT крупно). Компонент, требующий долгого
взгляда (glance > 2 c), на ходу недоступен.
- Растут контраст и размер; **анимации редуцируются**.
- **Состояния компонента** (🟡): default → active (`accent`) → focus (фокус-ринг) → **disabled/blocked**.
Различаем **«прячем»** (убираем из UI на ходу) и **«показываем заблокированным»** (distraction-lock):
недоступный-но-видимый аффорданс = приглушение к `muted` + индикатор-замок через `warn`.
- `DistractionModeChanged(level)` (ipc §4) → UI адаптируется **централизованно** в Shell;
плагины получают `level` для адаптации (safety §4.6 — ◻️ точка доставки открыта).
## 6. Типографика RU-first (детали)
- Кириллица — **первый класс**, не латиница с «костылём» (#10). Шрифт с полным кир. набором,
`tnum`, читаемостью мелкого на солнце.
- Единицы/локаль (км/ч, °C, В) — формат RU; источник величин — data-model / Settings.
## 7. Motion-язык (детали)
- Роли: вход/выход поверхности; **фокус** (руль-навигация — видимый фокус-ринг, C §9); смена
темы (кросс-фейд день↔ночь); смена now-playing. Все ≤ перф-бюджета (§3.5).
## 8. Наследование плагинами
- **Декларативный путь** (`ui_tiles` / декларативный `ui_screens`, [plugin-sdk §4.1](plugin-sdk.md)):
плагин даёт **декларацию/данные, не свой рисунок****рендерит Shell** в Slint ([C §5](../domains/c-shell-ux.md):
чужой код в UI не исполняем) → визуальный язык гарантирован **структурно**.
- **Богатая Wayland-поверхность** (карта/видео/камера — `ui_screens`, C §4/§5; plugin-sdk §4.1): плагин
**рисует пиксели сам**; единство держится не структурно, а через **токены/гайдлайны** этой системы.
- В **обоих** случаях тема, акцент, distraction-режим и слот-рамка — **от системы**; плагин их **не переопределяет**.
## 9. Зависимости / связи
- **C** — владелец рендера, слот-модель (§4), тема (C §6), Slint-UI-DSL (C §5).
- **safety §4** — distraction-визуал · **performance §3** — motion/кадр-бюджет · **plugin-sdk**`ui_*` ·
**tech-stack** — Slint · **data-model/Settings** — единицы/тема-оверрайд · **principles** #6/#10/#11.
## 10. Открытые вопросы
- 🟡 **Значения токенов** (палитры день/ночь, шкала типографики) — финал на реальном экране (солнце/glance).
- 🟡 **Дефолт-акцент + курируемый набор** пользовательских акцентов — подтвердить (дефолт «Платина»).
- 🟡 **Выбор шрифта** с кириллицей (Inter / Manrope / собственный) — по читаемости на железе.
- ◻️ **Глубина пользовательской темизации** — только акцент vs полные пользовательские темы.
- ◻️ **Доставка `distraction-level` плагину** (общая с safety §4.6 / §8).
- 🟡 **Иконо-система** — line-icon стиль, сетка из space-базы 4px, размеры в шкале, толщина штриха под
два-веса-эстетику — финал на экране (читаемость за рулём). Иконка — структурный слот тайла (C §5).
## Журнал решений (design-system)
| Решение | Выбор | Дата |
|---------|-------|------|
| Направление | «тихая премиальность, водитель в фокусе» — **AMG-leaning** премиум + ясность; наш язык (MIT) | 2026-06-23 |
| Бренд-акцент | **пользовательский токен** (Settings), дефолт **«Платина»** (нейтраль); набор **вне hue-секторов семантики**; red/amber — **только алерт** | 2026-06-23 |
| Темы | две, **dark-first** (Ночь дефолт, День полноценная), авто-переключение | 2026-06-23 |
| Материальность | плоско (без градиентов/теней) — глубина слоями + хром-хайрлайн (perf/Panfrost) | 2026-06-23 |
| Единый стиль | плагины рендерятся **Shell**, дают декларацию — язык гарантирован структурно | 2026-06-23 |