Дизайн-система Health Journal v0.1: правила, токены и компоненты, снятые с мока
Pulse App. Тема одна — тёмная. Токены для клиентов — design/tokens.json
в репозитории, имена совпадают.
Правила
Health Journal — приложение-проекция Hub: телефон показывает состояние Hub и передаёт действия человека. Язык интерфейса — русский. Вид взят из мока Pulse App v0.1 (палитра Tokyo Night, JetBrains Mono) и не придумывается заново: новое значение сначала появляется в tokens.json, потом в экранах.
Токены в репозитории — design/tokens.json (те же имена, формат W3C). Инвентарь состояний мока — раздел «Инвентарь мока».
Тема
- Только тёмная. Светлой темы в v0.1 нет и не планируется: приложение открывают в зале и ночью, мок сделан под тёмный фон. Имена токенов смысловые (
bg-base,text-muted), поэтому светлую тему можно добавить позже вторым набором значений, не трогая экраны. - Клиент не следует системной светлой теме: экран всегда на
bg-base.
Цвет
- Фон в четыре слоя:
bg-sunken(подложка таб-бара) <bg-base(экран, карточки) <bg-raised(выбранное, текущее) <bg-control(степперы, выключенный переключатель). Карточки не заливаются: их задаёт рамкаline-default. - Текст в четыре уровня:
text-primary— значения и главное;text-secondary— пояснения;text-muted— подписи карточек, неактивное;text-faint— сноски. На заливках —text-on-fill, не белый. accent— только действие и «текущее». Не красить им числа и заголовки.- Смысловые:
good— сделано, принято;warn— внимание без тревоги;attention— значение вне личной базы;critical— нет связи, завершение, сверх максимума отдыха. Цвет никогда не единственный носитель смысла: рядом слово или знак (✓, ›, ■). - Данные:
info— сон и весы,accent-ai— ассистент и RMSSD,pulse— пульс,set-*— тип подхода,chart-baseline— личная база.
Контраст (честно). text-primary, text-secondary, accent и смысловые цвета проходят 4,5:1 на всех фонах. Не проходят, значения мока сохранены:
| пара | контраст | предложение |
|---|---|---|
text-muted на bg-base | 4,10:1 | только подписи ≤ 3 слов; длинный текст — text-secondary |
text-faint на bg-base | 2,76:1 | тихую ссылку и сделанный шаг перевести на text-muted |
line-default на bg-base | 1,74:1 | рамка не должна быть единственным признаком контрола |
text-on-fill на set-warmup | 2,91:1 | светлее set-warmup или текст text-primary |
Типографика
Одно семейство — JetBrains Mono (mono), моноширинное: цифры не прыгают в таймерах и весах. Мелкий и плотный текст: базовый body 11px, подписи label 10px, сноски caption 9,5px, бейджи micro 9px. Значения — value-sm / value-md / value-lg, вес 800. Кнопки — button 13px 800. Заглавных букв для акцента нет: подписи строчными («сон — polar loop», «итог»), без КАПСА и разрядки.
Отступы, радиусы, размеры
- Шаг отступов:
space-2,space-4,space-6,space-8,space-10,space-12,space-16. Экран и зазор между карточками —space-8; карточка изнутри —space-10×space-12. - Радиусы по роли:
radius-smбейджи и чип вес × повторы,radius-mdконтролы,radius-cardкарточки и баннеры,radius-buttonбольшие кнопки. - Зона нажатия не меньше
size-target(44). Строки настроек —size-row(48), главная кнопка —size-button(56). Малые контролы 32–36 стоят в строке высотой 40–48. - Теней нет. Глубину дают слой фона и рамка.
Что выглядит нажимаемым
Нажимаемое несёт хотя бы один из признаков:
- заливка
accent/good/critical(кнопки); - текст
accent(ссылки, «+ подход», вторичные кнопки); - стрелка «›» в конце (карточки-переходы, «почему так ›», «настройки ›»);
- форма контрола: чип с рамкой, степпер на
bg-control, переключатель.
Ненажимаемое не носит ни одного из них. Значения, подписи и бейджи без «›» — только чтение. Hover-подсветка рамки есть только в веб-моке; на телефоне на неё не опираться.
Недоступное
- Недоступно = три признака сразу: пунктирная рамка,
opacity-unavailable(.38), нет реакции на тап (и курсора-руки в вебе). Пример — шаг «подходы» до принятого плана. - Сделанное — не недоступное: «✓» и
text-faint, но открывается. - Будущее — не недоступное: будущий подход
opacity-pending(.45) без пунктира, его можно убрать или поправить. - Пунктир без прозрачности и с текстом
accent— это действие («убрано: … ↺» возвращает подход). - Если главное действие экрана невозможно, кнопку не показывают, а говорят почему: «нет связи с Hub · без решений».
Текст
- Русский, коротко, строчными. Глагол на кнопке: «начать разминку», «✓ подход сделан», «закончить разминку».
- Без воды: никаких «Отлично!», «Давайте…», «Я проанализировал ваши данные». Объяснение ассистента свёрнуто в одну строку «почему так ›»; раскрытое — до трёх причин, по строке.
- Ночь — только наблюдаемое: «колебания пульса», «движение», «паузы дыхательных движений», «эпизоды ночи». Слова «апноэ» в интерфейсе нет, сводных индексов и толкований нет. Рядом с эпизодами — «Это наблюдения, не диагноз».
- Без медицинских выводов. Состав тела — «оценка по формуле, не медицинское заключение». Вес не входит в готовность к тренировке.
- Пульс, пока место ношения не проверено, — с бейджем «пульс не проверен».
- Без тоннажа: итог — рабочие подходы из назначенных, лучший рабочий против прошлого раза, запас повторов, отмены.
- Единицы через пробел: «40 кг», «72 уд/мин», «40 мс», «7 ч 30 мин», «6:00» для коротких длительностей и таймеров. Десятичная запятая: «22,5 кг». «×» между весом и повторами: «40 × 8». Знак минуса «−», не дефис.
- Пометки «PROPOSED», «демо», «×6» — только в моке, не в продукте.
Раскладка телефона
- Один столбец во всю ширину; отступ экрана
space-8. Мок рассчитан на ширину 360px и растягивается на весь экран телефона. - Сверху вниз: системная строка (своя не рисуется) → шапка (знак «hj», статус Loop, статус Hub, чип настроек) → таб-бар → прокручиваемое содержимое → липкая нижняя зона действий упражнения.
- Безопасные зоны: отступы
env(safe-area-inset-top)иenv(safe-area-inset-bottom)у корня; в Compose —WindowInsets.safeDrawing, в SwiftUI — фон за краями (ignoresSafeAreaтолько для фона), содержимое внутри безопасной зоны. - Главная кнопка — внизу, в зоне большого пальца, липкая, с фоном
bg-baseи мягким переходом сверху, чтобы прокрутка под ней не просвечивала. - Мало тапов: одно действие — один тап; правка числа — степпер, не клавиатура; необязательное («в запасе», «почему так») не мешает главному пути.
Иконки
Иконок-картинок нет. Знаки — символы шрифта: ✓ › ▴ ▾ × + − ■ ▶ ♥ ⚖ ● ○ ↺ ★ ☆. Логотипа-файла нет: знак «hj» набран 13px 800, «h» — accent, «j» — accent-ai.
Токены
Цвет
Контраст — к bg-base; полупрозрачные считаются поверх него; у фонов не считается. Цвет столбца: ≥ 4,5 — норма для текста,
3–4,5 ▴ — только крупный текст, рамки и знаки, < 3 × — не для текста и не для рамок контролов.
| токен | значение | на bg-base | где | |
|---|---|---|---|---|
bg-base | #1a1b26 | поверхность | Фон экрана и карточек. Единственная тема — тёмная. | |
bg-sunken | #16161e | поверхность | Утопленные поверхности: подложка таб-бара, раскрытый календарь. | |
bg-raised | #24283b | поверхность | Заливка выбранного и текущего: текущий шаг, текущий подход, выбранный чип. | |
bg-control | #292e42 | поверхность | Кнопки-степперы − / +, выключенный переключатель, дорожка прогресса. | |
line-default | #3b4261 | 1.74:1 | Рамка карточек и вторичных контролов. 1,74:1 на bg-base — ниже 3:1 для рамок контролов; значение мока сохранено, см. README. | |
line-subtle | #292e42 | 1.27:1 | Разделители строк внутри карточки, рамка таб-бара. | |
text-primary | #c0caf5 | 10.59:1 | Основной текст и значения на bg-base, bg-raised, bg-control (≥ 8,3:1). | |
text-secondary | #a9b1d6 | 8.10:1 | Пояснения и подписи на bg-base, bg-raised (≥ 6,9:1). | |
text-muted | #737aa2 | 4.10:1 | Заголовки карточек, неактивные чипы. 4,1:1 на bg-base — ниже 4,5:1 для 10px; только короткие подписи. | |
text-faint | #565f89 | 2.76:1 | Сноски и тихая ссылка «почему так ›». 2,76:1 на bg-base — не проходит 4,5:1; значение мока, см. README. | |
text-on-fill | #16161e | поверхность | Текст на заливках accent, good, critical, info и цветах подходов. | |
accent | #7aa2f7 | 6.79:1 | Главный цвет действия: основная кнопка, рамка текущего, ссылки «… ›», включённый переключатель. 6,8:1 на bg-base. | |
accent-ai | #bb9af7 | 7.39:1 | Голос ассистента и метки ассистента; RMSSD. Не для кнопок. | |
info | #7dcfff | 9.96:1 | Весы и сон: карточка взвешивания, длительность сна. | |
good | #9ece6a | 9.35:1 | Сделано и принято: ✓, кнопка «принять план», связь с Loop. | |
warn | #e0af68 | 8.55:1 | Внимание без тревоги: «Loop был перезапущен», пометка качества данных. | |
attention | #ff9e64 | 8.40:1 | Значение вне базы (ниже базы, у нижней границы), окно отдыха открыто. | |
critical | #f7768e | 6.46:1 | Нет связи с Hub, завершить тренировку, отдых сверх максимума. | |
critical-tint | rgba(247,118,142,.08) | поверхность | Фон баннера «нет связи с Hub». | |
critical-line | #6b3a4a | 1.90:1 | Рамка разрушительной малой кнопки («забыть» весы). | |
pulse = {critical} | #f7768e | 6.46:1 | Пульс: ♥ и кривая пульса. | |
quality-unverified = {warn} | #e0af68 | 8.55:1 | Текст пометки «пульс не проверен». | |
quality-unverified-line | #6b5a3a | 2.56:1 | Рамка пометки «пульс не проверен». | |
set-warmup | #565f89 | 2.76:1 | Подход-разминка в строке подхода. text-on-fill на нём — 2,91:1, ниже нормы; значение мока. | |
set-ramp | #7aa2f7 | 6.79:1 | Подход «ёлочка» (разгонный). | |
set-working | #ff9e64 | 8.40:1 | Рабочий подход. | |
set-drop | #bb9af7 | 7.39:1 | Дроп-подход. | |
chart-baseline | #3d59a1 | 2.56:1 | Полоса личной базы на графиках; лёгкий сон. | |
chart-baseline-tint | rgba(61,89,161,.18) | поверхность | Заливка полосы базы за столбиками. | |
sleep-light = {chart-baseline} | #3d59a1 | 2.56:1 | Фаза сна: лёгкий. | |
sleep-rem = {info} | #7dcfff | 9.96:1 | Фаза сна: REM. | |
sleep-deep = {accent-ai} | #bb9af7 | 7.39:1 | Фаза сна: глубокий. | |
sleep-awake = {critical} | #f7768e | 6.46:1 | Фаза сна: бодрствование. |
Отступы
space-2 | 2px | Зазор между строками подходов, внутри стопки подписей. | |
space-4 | 4px | Зазор между вкладками и шаг-чипами, внутренний отступ таб-бара. | |
space-6 | 6px | Зазор между кнопками в ряду, внутри карточки. | |
space-8 | 8px | Отступ экрана и зазор между карточками. | |
space-10 | 10px | Вертикальный внутренний отступ карточки, зазор строки. | |
space-12 | 12px | Горизонтальный внутренний отступ карточки и баннера. | |
space-16 | 16px | Левый отступ шапки. |
Радиусы
radius-xs | 2px | Столбики графиков, дорожки. | |
radius-sm | 4px | Бейджи и чип вес × повторы. | |
radius-md | 6px | Контролы: шаг-чипы, малые кнопки, степперы, строка подхода. | |
radius-tab | 7px | Вкладка таб-бара. | |
radius-card | 8px | Карточки и баннеры. | |
radius-button | 9px | Основная и вторичная кнопки. | |
radius-bar | 10px | Подложка таб-бара. | |
radius-toggle | 11px | Дорожка переключателя (половина высоты 22). |
Размеры
size-target | 44px | Минимальная зона нажатия. | |
size-row | 48px | Строка настройки с переключателем, строка плана. | |
size-button | 56px | Основная кнопка. | |
size-button-secondary | 48px | Вторичная кнопка. | |
size-action | 54px | Кнопка действия упражнения. | |
size-tab | 52px | Вкладка таб-бара. | |
size-step-chip | 34px | Шаг-чип тренировки. | |
size-control | 32px | Малая кнопка, степпер, чип «в запасе». | |
size-control-lg | 36px | Степпер плана, чип ночи, кнопки баннера. |
Прозрачность
opacity-unavailable | .38 | Недоступно: шаг, который нельзя открыть; месяц без данных. Вместе с пунктирной рамкой и без курсора-руки. | |
opacity-pending | .45 | Будущий подход в списке подходов. | |
opacity-inactive | .55 | Пропущенное упражнение, прошлые столбики графика. | |
opacity-done | .7 | Сделанное упражнение в плане. |
Шрифт
JetBrains Mono, одно семейство: "JetBrains Mono", ui-monospace, monospace
micro9px / 1.3 / 400Пометки и бейджи: «пульс не проверен».caption9.5px / 1.5 / 400Сноски, легенды, шаг-чипы, подписи осей.label10px / 1.4 / 400Заголовки карточек, вторичный текст, тихая ссылка.body11px / 1.5 / 400Базовый текст экрана.body-strong11px / 1.5 / 700Заголовок баннера, название в строке.action12px / 1.2 / 800Главная кнопка упражнения (подход сделан / начать подход).button13px / 1.2 / 800Основная и вторичная кнопки 56/48.nav-number16px / 1 / 800Цифра вкладки в таб-баре.value-sm20px / 1 / 800Значения в малых карточках.value-md28px / 1 / 800Главное значение карточки: вес, пульс.value-lg34px / 1 / 800Главное значение экрана: длительность сна.Компоненты
Banner · ButtonPrimary · ButtonSecondary · Card · QualityBadge · QuietLink · SetRow · StepChip · TabBar · Toggle · WeightRepsChip · WhyLine
Banner
Баннер состояния системы над содержимым вкладки: рамка 1px цвета состояния, radius-card, отступ space-8 × space-12.
- «нет связи с Hub» — рамка
critical, фонcritical-tint, заголовокcritical700, под ним одна строкаtext-secondary(что с буфером). Появляется через 5 с без подтверждений Hub; на экране упражнения дублируется строкой «нет связи с Hub · без решений». - «Loop был перезапущен из-за зависания» — рамка и заголовок
warn; текст: когда, почему, что данные не удалены; две кнопкиsize-control-lg: «настройки ›» (accent) и «понятно» (warn). - Баннер говорит факт и последствие, без извинений и восклицаний. Не больше одного баннера каждого вида.
ButtonPrimary
Одна главная кнопка экрана: залитая, во всю ширину, высота size-button (56), радиус radius-button, стиль button, текст text-on-fill.
- Заливка по смыслу:
accent— следующий шаг;good— принять, закончить успешно;critical— завершить тренировку. - На экране упражнения кнопка действия —
size-action(54) и стильaction; пока идёт отдых она контурная (рамкаaccent, текстtext-primary) и заливаетсяaccent, когда отдых дошёл до минимума. - Одна главная кнопка на экран, внизу, в зоне большого пальца. Текст — глагол: «начать разминку», «✓ подход сделан».
- Недоступной главной кнопки нет: если действие сейчас невозможно, кнопку не показывают, а объясняют почему (баннер или строка
text-muted).
ButtonSecondary
Контурная кнопка второго действия: высота size-button-secondary (48), рамка и текст accent, без заливки.
- Малая кнопка в строке (
size-control,radius-md, стильlabel): рамкаline-default, текстtext-secondary; ведущая наружу — текстaccentи «›»; разрушительная — рамкаcritical-line, текстcritical; главная в строке — заливкаaccent. - Степпер − / +: квадрат
size-control(32) илиsize-control-lg(36) наbg-control, без рамки. Значение между ними — жирное, единица —microвtext-muted. - Рамка
line-defaultслабая (1,74:1). Вторичную кнопку отличает от карточки текстaccentили «›», а не рамка.
Card
Карточка — рамка 1px line-default, radius-card, отступ space-10 × space-12, зазор space-6–space-8, без тени и заливки.
- Шапка: подпись слева и мета справа,
labelвtext-muted. Подпись — что это и откуда («сон — polar loop», «эпизоды ночи · Hub»). - Главное значение —
value-md/value-lg, цвет по теме данных (info— сон и весы,accent-ai— RMSSD,pulse— пульс). Единица рядом — 11pxtext-secondary. - Карточка-фокус экрана (подходы, ночь) — рамка 2px
accent. - Карточка-переход целиком нажимаемая: «›» в шапке справа. Hover-подсветка рамки
accentесть только в вебе; на телефоне признак — «›».
QualityBadge
Пометка качества данных: micro, текст quality-unverified, рамка quality-unverified-line, radius-sm, отступ 1 × 5. Не нажимается.
- «пульс не проверен» стоит у каждого пульсового значения, пока место ношения Loop не проверено (решение 18): пульс разминки, итог тренировки, причина плана. Справа в строке значения.
- Уровень ночи — тот же бейдж 9,5px с рамкой цвета уровня: «ночь: базовая» / «ночь: расширенная».
- Бейдж — пометка, не предупреждение: не красный, без «!».
QuietLink
Тихая ссылка для необязательного: «почему так ›», «пересобрать с учётом разминки ›». Стиль label, цвет text-faint, отступ space-4, всегда со стрелкой «›» (свёрнуто) или «▴» (раскрыто).
- Стрелка — единственный признак нажимаемости тихой ссылки, без неё строка читается как сноска. Не убирать.
- Ссылка навигации (
каталог упражнений ›) —accent, высота 40: это действие, не пояснение. - Недоступная тихая ссылка —
opacity-unavailable, без стрелки и без курсора-руки. text-faintдаёт 2,76:1 наbg-base— ниже нормы. Предложение: перевести тихую ссылку наtext-muted(4,1:1) и оставитьtext-faintтолько сноскам. Пока мок не менялся.
SetRow
Строка подхода внутри карточки упражнения (рамка 2px accent). Сетка: метка 16 · тип 64 · чип вес × повторы · мета 50 · «×» 28; высота 40, radius-md.
| состояние | метка | фон / контур | прочее |
|---|---|---|---|
| ожидает | номер, text-faint | нет | вся строка opacity-pending; «×» убирает |
| текущий | «›», accent | bg-raised, контур 1px accent | «×» убирает |
| сделан | «✓», good | нет | мета: «запас N» или время отдыха; «×» нет |
| убран | строки нет | чип «убрано: … ↺» с пунктиром и текстом accent возвращает подход |
- «+ подход» — строка
accentпод списком, над ней пунктирline-subtle; выбор типа — четыре чипа с рамкой цвета типа. - Убрать можно только несделанный подход. Любая правка числа подходов — новая ревизия плана, автор — человек.
- Чип «убрано» пунктирный, но не блёклый и с текстом
accent: это действие. Пунктир сам по себе не значит «недоступно».
StepChip
Шаги тренировки: самочувствие → разминка → план → подходы → итог. Пять чипов в ряд, зазор 3px, высота size-step-chip (34), radius-md, стиль caption.
| состояние | рамка | фон | текст | прочее |
|---|---|---|---|---|
| текущий | accent | bg-raised | text-primary | |
| сделан | line-default | нет | text-faint | префикс «✓ », открывается |
| доступен | line-default | нет | text-secondary | открывается |
| недоступен | line-default, пунктир | нет | text-muted | opacity-unavailable, тап ничего не делает |
- Недоступный шаг отличается тремя признаками сразу: пунктир, прозрачность, нет реакции. Одного цвета мало: так основатель и увидел, что шаги «выглядели одинаково».
- Сделанный шаг остаётся нажимаемым; блёклый текст
text-faintи «✓» говорят «пройдено», а не «закрыто». - Когда шаг станет доступен, решает Hub (подходы — только после принятого плана).
TabBar
Пять вкладок под шапкой: «сейчас», «трен», «сон», «тело», «ai». Подложка bg-sunken, рамка line-subtle, radius-bar, отступ и зазор space-4.
- Вкладка: высота
size-tab(52),radius-tab; цифраnav-number+ подписьlabel. - Активная — заливка
accent, цифра и подписьtext-on-fill. Неактивная — цифраtext-primary, подписьtext-muted. - Таб-бар вверху, под шапкой (мок), а не внизу: внизу экрана — главная кнопка. На первом запуске (ввод адреса Hub) таб-бара нет.
- Настройки — чип в шапке справа, не шестая вкладка.
Toggle
Переключатель в строке настройки: дорожка 38 × 22, radius-toggle; выкл — bg-control, вкл — accent; ручка 18 × 18 text-primary, сдвиг 2 → 18px.
- Нажимается вся строка (
size-row, 48), не только дорожка. Заголовокbody, под ним одна строкаlabelвtext-muted: что изменится, без рекламы. - Строки в группе разделяет
line-subtleсверху. - Необязательное помечается « · необязательно» в
text-faintпосле заголовка.
WeightRepsChip
Вес × повторы в строке подхода: заливка цветом типа подхода, высота 24, radius-sm, текст text-on-fill 11px 800.
- Цвет — тип подхода:
set-warmup,set-ramp(ёлочка),set-working,set-drop. Под списком всегда легенда «■ разминка ■ ёлочка ■ рабочий ■ дроп». - Ширина — доля от самого тяжёлого подхода упражнения, не меньше 18%: видно лесенку весов.
- Формат: «40 × 8», запятая в дробном весе («22,5 × 10»), без «кг» внутри чипа; без веса — «свой вес × 12».
- Тап по чипу раскрывает правку под строкой (степперы веса и повторов). Правка сделанного меняет факт, правка будущего — план (новая ревизия).
text-on-fillнаset-warmup— 2,91:1, ниже нормы: значение мока сохранено, кандидат на правку.
WhyLine
Свёрнутое объяснение ассистента: одна тихая строка «почему так ›» под планом. По умолчанию свёрнута.
- Раскрытая — до трёх причин, по строке на причину: ключ
text-faintшириной 72 + короткая причинаtext-secondary, обрезка многоточием. Пульсовая причина несёт «пульс не проверен». - Только то, чего не видно в самом плане. Без вступлений, без «я проанализировал», без советов.
- Нет причин — нет строки.
Инвентарь мока
Различимые визуальные состояния в Pulse App v0.1 (design/mock/pulse-app.dc.html) на 2026-11-12 — сырьё для токенов и компонентов. Значения — как в моке.
Каркас
| элемент | вид |
|---|---|
| экран | bg-base, текст 11px text-primary, JetBrains Mono |
| шапка | «hj» 13px 800 (accent + accent-ai); «● loop 69%» good 10px; статус Hub (нажимается, демо); чип настроек 28px, активный — заливка accent |
| таб-бар | подложка bg-sunken, рамка line-subtle, радиус 10; вкладка 52px, радиус 7; активная — заливка accent, текст text-on-fill; неактивная — цифра text-primary, подпись text-muted |
| область прокрутки | отступ 8, зазор 8; липкая нижняя зона действий с тенью цвета фона |
Кнопки и ссылки
| вид | размеры | цвета | где |
|---|---|---|---|
| главная | 56, радиус 9, 13px 800 | заливка accent | начать разминку, повторить запрос, собрать план без разминки (с подстрокой) |
| главная, принять | 56 | заливка good | принять план, к итогу |
| главная, завершить | 56 | заливка critical | завершить тренировку |
| первый запуск | 64, радиус 9, 14px | заливка accent | сканировать QR |
| действие упражнения | 54, 12px 800 | заливка accent («✓ подход сделан»); контур accent до минимума отдыха и заливка после («▶ начать подход · …»); контур good («✓ закончить упражнение»); заливка good («✓ готово · к плану») | экран подходов |
| вторичная | 48, рамка accent | текст accent | к плану, ещё раз, подключить |
| контурная главная | 56, рамка accent | текст accent | ■ закончить разминку |
| малая | 32, радиус 6, 10px | рамка line-default, текст text-secondary | изменить (адрес Hub), демо: вернуть |
| малая разрушительная | 32 | рамка critical-line, текст critical | забыть (весы) |
| малая главная | 32 | заливка accent, 700 | найти (весы) |
| кнопки баннера | 36 | рамка line-default + текст accent; рамка и текст warn | настройки ›, понятно |
| пара «моё / не моё» | 44, радиус 8 | контур line-default / заливка info | взвешивание |
| ссылка | 40 | текст accent, «›» | каталог упражнений ›, подробнее |
| тихая ссылка | отступ 4, 10px | text-faint, «›» / «▴» | почему так, пересобрать с учётом разминки |
| тихая ссылка недоступная | прозрачность из логики | собрать план без разминки без связи | |
| текстовая в шапке | critical | ■ завершить | |
| степпер | 32 или 36, радиус 6 | bg-control | вес, повторы |
Чипы
| вид | состояния |
|---|---|
| шаг тренировки | текущий (accent, bg-raised), сделан (✓, text-faint), доступен (text-secondary), недоступен (пунктир, .38, без реакции) |
| выбор (самочувствие 1–5, место ношения, ночи, «в запасе») | вкл: рамка accent, bg-raised, text-primary; выкл: рамка line-default, text-muted |
| зона боли | вкл: рамка critical |
| тип нового подхода | рамка цвета типа |
| «убрано: …» | пунктир, текст accent, возвращает |
| день календаря | будущий — без курсора; стрелка месяца без данных — .38 |
| звезда каталога | ★ warn / ☆ text-faint |
Тренировка
| элемент | состояния |
|---|---|
| строка подхода | ожидает (.45, номер), текущий (bg-raised, контур accent, «›»), сделан («✓» good, «запас N» или время отдыха), в правке (как текущий + степперы) |
| чип вес × повторы | set-warmup, set-ramp, set-working, set-drop; ширина — доля от максимального веса |
| карточка отдыха | до минимума — text-muted; в окне — attention; сверх максимума — critical и рамка critical; отметка минимума на дорожке |
| карточка упражнения в плане | идёт (рамка accent, bg-raised), сделано (рамка good, .7), пропущено (.55, «✕», «↺»), ожидает |
| предложение ассистента | живое (принять / отклонить), принято («✓ принято · ревизия плана»), отклонено, устарело («подход уже начат») |
| итог | без тоннажа: рабочие из назначенных, лучший к прошлому разу со стрелкой, запас, отмены |
Состояния системы
| элемент | вид |
|---|---|
| нет связи с Hub | баннер: рамка critical, фон critical-tint; в упражнении — строка «нет связи с Hub · без решений»; на плане — карточка с объяснением |
| Loop перезапущен | баннер: рамка и заголовок warn, две кнопки |
| весы просят подтвердить | карточка с рамкой 2px info, значение attention 28px, «моё / не моё» |
| «не моё» отмечено | строка-карточка, нажатие закрывает |
| пульс не проверен | бейдж micro, warn на рамке quality-unverified-line |
| уровень ночи | бейдж «ночь: базовая / расширенная» с рамкой цвета уровня |
| план готовится | шаги с номером круга «1 из 3», ожидание до 30 с |
| ассистент не ответил | текст причины + главная «повторить запрос» |
Данные
| элемент | вид |
|---|---|
| значение карточки | 28px 800 в цвете темы данных; единица 11px text-secondary |
| значение ночи | 34px 800 info |
| полоса базы | chart-baseline на bg-control, маркер — цвет статуса (good / attention) |
| столбики 7 ночей | accent, ниже базы — attention; прошлые .55 |
| фазы сна | sleep-light, sleep-rem, sleep-deep, sleep-awake |
| пульс | pulse, ♥ |
Нашлось при инвентаризации
- Тихая ссылка «почему так ›» и сделанный шаг используют
text-faint(2,76:1) — тот же цвет, что сноски. Нажимаемость держится только на «›» и «✓». - Пунктир означает и «недоступно» (шаг), и «вернуть» (убранный подход). Различает их прозрачность и цвет текста — правило записано в README.
- Hover-подсветка карточек (
style-hover) на телефоне не работает и не должна быть признаком нажимаемости. - В логике мока остался мёртвый код ранних вариантов (палитры gruvbox и catppuccin в
phone(k)): в токены не вошёл.