# Личные сообщения (messages-list) — дизайн v2

Экран ЛС — **списочная форма экрана «Связи»**: тип отношения читается через цвет
обода/ауры аватара и один правый статус. Тёмный космический фон + золотой header.

> Reference source: owner-approved chat visual reference; image asset is not yet stored in repository.

## Источник данных
- **Demo/lab:** мок `js/mock-data.js` → `directMessages` (семантические поля, цвет не хранится).
- **Прод:** те же поля придут из реальных relations (`relationFlagsForTarget` / `shineConfirmed` / `shine`).
- **Маршруты:**
  - `/messages-list` — защищённый (требует сессии).
  - `/messages-list/lab` — гость-демо (мок, без сети/WS, пригоден для скриншотов).

## Семантика → визуал
Решает **только** `js/pages/messages/dm-visual-resolver.js`. В данных цвет НЕ хранится.

Поля сообщения: `relationType` (contact|friend|family), `relationRole`, `isShining`,
`isConfirmed`, `hasActiveLink`, `unreadCount`, `preview`. (`toneOverride` — только для теста.)

### Цвета (значение)
| Цвет | Токен | Значение |
|------|-------|----------|
| violet | `--rel-contact` `#8C63FF` | обычный контакт (дефолт) |
| gold | `--rel-family` `#F0B82E` | семья / близкий круг / важная связь |
| celestial | `--rel-shining` `#68D8FF` | сияющий |
| emerald | `--rel-link` `#19E58A` | ТОЛЬКО активный статус «Связь» |

Обод аватара: `isShining → celestial; иначе family → gold; иначе → violet`.
**«Подтверждён» НЕ красит обод золотым** (золото = семья; подтверждение — правый статус).

### Приоритет правого статуса
`hasActiveLink → «Связь» (emerald)` > `isConfirmed → «Подтверждён» (gold shield)` > ничего.
На карточке максимум ОДИН главный статус.

### Unread
Отдельная **violet/cool сфера** (НЕ изумруд). Только при `>0`; `1–99`, далее `99+`.
Идёт после статуса, перед chevron.

## Матрица состояний (demo-мок покрывает все)
| # | relationType | shining | confirmed | link | unread | Обод | Правый статус | Бейдж |
|---|---|---|---|---|---|---|---|---|
| M01 | contact | – | ✓ | – | 0 | violet | 🛡 Подтверждён | – |
| M02 | contact | – | – | ✓ | 2 | violet | 🔗 Связь | 2 |
| M03 | contact | ✓ | – | ✓ | 5 | celestial | 🔗 Связь | 5 |
| M04 | contact | – | – | – | 0 | violet | — | – |
| M05 | family | – | ✓ | – | 0 | gold | 🛡 Подтверждён | – |
| M06 | family | – | ✓ | ✓ | 1 | gold | 🔗 Связь (приоритет link>confirmed) | 1 |

## Размеры
- Карточка: `min-height 92px`, `radius 26px`.
- Зазор списка: `8px` (flex-column).
- Аватар-обод `.dm-av`: `56px` (фото/инициалы — 50px внутри).
- Капсула «Связь»: высота `32px`, radius `16px`, изумрудный бордер, почти прозрачный fill.
- Header: grid `1fr auto 1fr` (бренд слева / title строго по центру / «+» справа), title `18px`.

## Сияющая сфера — связь с «Связями» (обязательно)
DM-сияние НЕ изобретает свой эффект, а **повторяет язык сияющего узла графа**:
- те же общие keyframes из `styles/network-graph.css`: `fg-shine-glow` (пульс box-shadow)
  + `fg-shine-halo` (дыхание ореола: scale/opacity);
- та же небесная палитра и тот же rim `rgba(150,240,255,0.62)`;
- тот же радиальный ореол (те же стопы градиента), `inset: -12px` — как у узла графа
  (узел 58px ↔ аватар 56px, scale ≈ 1, отдельный масштабный коэффициент не нужен);
- `filter: blur(3.4px)` ≡ `feGaussianBlur stdDeviation="3.4"` SVG-фильтра `#fg-shine-glow`
  графа. CSS-blur используется потому, что SVG-фильтр объявлен только на странице «Связи»;
- `prefers-reduced-motion` → анимации выключаются.

Разрешён только controlled scale factor; никаких отдельных hardcoded-параметров,
если они уже существуют в визуальном языке «Связей».

## Фон
Фон `.dm-screen` (`#05070A` + орбы `dm-orbs-drift`) — утверждённая база, **НЕ меняется**.
Все эффекты редизайна ограничены `.dm-*` (карточка, обод аватара, статус, бейдж, header, «+»).
Критерий: если скрыть карточки/аватары/header/nav/статусы — фон остаётся прежним.
