# Форматы данных: даты, время, числа, деньги

Один форматтер на все продукты: `templates/format.snippet.js` (Intl, `ru-RU`).
Продукт либо вызывает его функции, либо зеркалит ровно эти правила в своём
стеке. Ручное форматирование (свои разделители, свои суффиксы, свой падеж
времени) — нарушение бренда. Значения-данные всегда set в IBM Plex Mono
(`.bark-data`, `tnum`).

## Часовой пояс

- Все времена во всех продуктах отображаются в **МСК** (`Europe/Moscow`,
  UTC+3 без перехода). Локальная таймзона браузера не используется никогда —
  два сотрудника всегда видят одно и то же время.
- Там, где происхождение времени неочевидно (внешние события, интеграции),
  добавляется суффикс «МСК»: `14:05 МСК`.
- В API, экспортах и атрибуте `<time datetime="…">` — только ISO 8601 с
  таймзоной. ISO-вид (`2026-07-23`) в интерфейсе не показывается.

## Даты и время

| Контекст | Формат | Пример |
| --- | --- | --- |
| Таблицы, мета, данные | `ДД.ММ.ГГГГ` | `23.07.2026` |
| С временем | `ДД.ММ.ГГГГ, ЧЧ:ММ` | `23.07.2026, 14:05` |
| Заголовки и текст страниц | длинная форма Intl | `23 июля 2026 г.` |
| Расписания (`barkhr`) | `дд, ДД.ММ` | `ср, 23.07` |
| Время | 24 часа, `ЧЧ:ММ` | `14:05` |
| Секунды | только мониторинг/логи | `14:05:37` |

12-часовой формат, AM/PM и даты вида `07/23/2026` запрещены.

## Относительное время

Лестница фиксированная (`formatRelative`), обновление на экране — раз в
минуту:

| Возраст | Вид |
| --- | --- |
| < 1 мин | `только что` |
| < 60 мин | `5 мин назад` |
| сегодня (по МСК) | `сегодня, 14:05` |
| вчера | `вчера, 14:05` |
| этот год | `23.07, 14:05` |
| раньше | `23.07.2025, 14:05` |

Будущее время относительной формой не пишется — только абсолютной.
Форм вроде «только что назад» не существует.

## Диапазоны дат

Общие части схлопываются, разделитель — en dash `–` без пробелов; если не
схлопнулось — с пробелами (`formatDateRange`):

- один месяц → `01–23.07.2026`
- один год → `01.07–23.08.2026`
- разные годы → `23.12.2025 – 05.01.2026`

## Числа

- Разряды и десятичная запятая — как даёт Intl `ru-RU`: `4 568`, `1 234,56`.
  Свои пробелы/точки не расставлять.
- **Деньги**: рубли со знаком `₽` после числа, **всегда 2 знака копеек** —
  `1 234,56 ₽`. «руб.», «RUB» и `₽` перед числом запрещены. Исключение — KPI-
  агрегаты: `formatMoneyCompact` → `3,6 млн ₽`; таблицы и детали всегда точные.
- **Проценты**: `formatPercent(0.125)` → `12,5 %` (до 1 знака; аргумент —
  доля, не «12.5»).
- **Компактные числа**: только русские единицы `тыс. / млн / млрд`, до 1
  знака — `3,6 млн`. Латинские `K/M/B` (`3.55M`) запрещены.
- **Байты**: base 1024, единицы `Б/КБ/МБ/ГБ/ТБ`, до 1 знака — `3,4 МБ`.
  Скорость сети — `Мбит/с`.
- **Длительности** (`formatDuration`): `846 мс` → `2,4 с` → `42 с` →
  `3 мин 20 с` → `25 мин` → `1 ч 05 мин` → `1 д 4 ч`. Единицы русские,
  сокращённые, через пробел.
- **Телефоны РФ**: `+7 999 123-45-67` (`formatPhone`).
- ID, хэши, версии не группируются и не сокращаются — mono как есть.

## Запрещено

- локальная таймзона браузера без метки; смешение поясов на одном экране;
- 12-часовое время, AM/PM, `MM/DD`, ISO-даты в UI;
- `3.55M`, `1,5K`, десятичная точка, ручные разделители разрядов;
- «руб.», `RUB`, `₽` перед суммой, деньги без копеек в таблицах;
- «только что назад», относительное время старше часа без даты;
- разные форматы одного и того же поля в разных продуктах.

## Проверка

Обязательные сценарии (см. `tests/data-formats.test.mjs`): лестница
относительного времени на фиксированном «сейчас», границы суток по МСК
(«вчера» через полночь), диапазоны в одном месяце/году/через год, деньги с
копейками, компактные `млн`, байты 1024, лестница длительностей, телефон РФ.
