android-events · ветка feature/figma-parity · сверка 08.09.2026

Аудит паритета «По Душе» с макетом Figma

Каждый собранный экран Android-приложения сверен вручную с нодой Figma «Podushe | Mobile-app»: 55 снимков состояний (Paparazzi, 390 dp) против 210 настоящих рендеров ×2 и полных деревьев нод, плюс код Compose против редлайнов. Ниже — сколько сходится пиксель в пиксель, что сделано по нодам, что расходится и чего нет вовсе.

0 из 73экранов совпадают с макетом пиксель в пиксель. Единственный пиксельно-идентичный фрагмент — верхние 608 dp велкома A1: это вырезка из рендера макета, и в неё попал iOS-статус-бар «9:41».
12
по нодам, ±2 dp; отличия только шрифт и ассеты
13
сверстаны по спеке, но расходятся с нодой
25
есть в коде, но старая вёрстка не по макету
23
экрана нет вовсе
55
состояний сверено по снимкам
62
иконки всё ещё Material: векторы из Figma не выгружены
12 13 25 23
по нодам, блокирует только шрифт/ассеты по спеке, есть расхождения с нодой старая вёрстка не существует · 73 экрана из screens.json без A13/A14 (логика без экрана) и K1–K5 (дизайн-система, ниже отдельно)

Почему пиксель в пиксель — ноль, и что это значит

Пять причин действуют на каждом экране сразу, поэтому буквальное схождение недостижимо ни у одного собранного экрана, даже у геометрически точных:

Шрифт

Макет набран SF Pro (заголовки — SF Pro Condensed 650/760). В приложении Inter с горизонтальным сжатием 0.72 для заголовков (решение владельца Р-1). Ширины строк сходятся до 1–2 dp, но форма каждой буквы другая, поэтому любой текст даёт разницу пикселей. Видно на всех diff-кадрах: контуры букв «звенят», а переносы длинных строк иногда другие (A3, A8 био, A12).

Иконки

Все 62 иконки макета заменены Material (AppIcons.kt, 77 пометок FIGMA-ASSET). Это единственное, что реально заблокировано выгрузкой: иконки — векторы, а обход квоты отдаёт только растровые заливки.

3D-иллюстрации

В приложении 21 3D-иллюстрация — пустые слоты с пунктиром (Icon3d). Но блокера уже нет: 07.09 все 21 PNG выгружены в docs/figma/export/assets/ (1024×1024 и 2048×512, карта имён в _3d_icons.json). В ресурсы приложения они не заведены — res/drawable* не содержит ни одного img3d_*.

Статус-бар и снимки

Кадр макета — iPhone со статус-баром 54 dp; шапки приложения считаются от statusBarsPadding. Совпадение по вертикали есть только на устройстве с инсетом 54; при 24–48 dp всё содержимое выше макета на 6–30 dp. Снимки Paparazzi сохранены в 462×1000 (1,185 px на dp) — это не источник для пиксельной сверки, а геометрический; критерий 8.1.2 (скриншот с устройства) не выполнялся, эмулятора нет.

Коллаж A1. welcome_collage.png (780×1216) — верхние 608 dp рендера ноды 158:9505 целиком, включая «9:41» и Dynamic Island. На устройстве под Android-статус-баром будет просвечивать нарисованный iOS-статус-бар. Фото коллажа (4 заливки ноды 158) тоже уже выгружены отдельными файлами — слои можно собрать заново.

Раздел A · вход и регистрация

Статус по каждому снимку: ✓ — совпало с нодой в пределах ±2 dp (кроме шрифта и ассетов); ✗ — расхождение. Эталон: REAL — настоящий рендер Figma, TREE — только локальная отрисовка по дереву нод (иконки, стекло и шрифт в ней условные).

ЭкранСтатусЧто сверено и что не сходитсяСнимки / эталон
A1 велком158:9505по нодам
  • Заголовок 760/42 в две строки, подзаголовок, кнопка «Войти» 342×48 на y=772 — совпали (первая строка 282 dp против 280).
  • Верхние 608 dp — вырезка рендера (пиксельно идентична, но с iOS-статус-баром внутри картинки).
  • Слои коллажа, 3D-гантеля, пилюля «Питомцы» и искры не собраны отдельно; «Питомцы» запечено в картинку.
A1-welcome · REAL
A2 номер260:24430 261:25228 582:52876 579:52473по нодам
  • Все четыре состояния по редлайну: шапка 124, «Авторизация» 650/28 на y=148, поле на y=242, кнопка, юридический текст, «Некорректный номер» и «Аккаунт заблокирован» под полем на паддинге 12.
  • ✗ В приложении есть кнопка «назад» — во всех четырёх нодах слот Frame 2147225616 пустой, кнопки нет.
  • ✗ Поле 46 везде; в нодах 46 только у пустого, у трёх остальных 44.
  • Юридический текст: нода заполненного состояния короче (без «и Соглашение…»), приложение везде показывает полный — сам макет непоследователен.
A2-phone-* ×4 · REAL
A3 политика261:26902по нодам
  • Шапка «Политика» с стеклянной «назад», лист 16/24/16, текст 510/16 — по редлайну.
  • Текст — рыба (CONTENT-GAP); из-за Inter другие межабзацные отступы и переносы, к «1. Общие положения» набегает ~15 dp.
A3-policy · REAL
A4 код261:26987 261:27203 261:27297 592:5040расхождения
  • ✗ Шесть ячеек вместо четырёх 84×96 (живой код шестизначный — осознанно, но с нодой не сходится).
  • ✗ Подзаголовок «Код отправлен на номер +7 (912) 888-92-62» в одну строку; в ноде две («+7 ( 912 ) 888-92-62» второй строкой). Ячейки, кнопка и таймер во всех четырёх состояниях выше макета на 20 dp.
  • ✗ Лимит: в ноде 592:5040 введённые цифры остаются в ячейках, машина состояний их стирает (code = "").
  • Пустое: в ноде нет курсора в первой ячейке, в приложении есть.
  • Ошибка и лимит: тексты, красная обводка, «Получить код заново», «Повторить попытку через 14:59» + «Изменить номер» — совпали.
A4-otp-* ×4 · REAL
A5 локация597:55329 597:56595 730:75312расхождения
  • ✗ Карточка города перевёрнута: в ноде сверху строка 358×64 (белая плитка 40 r8 с icon-map-pin-fill, «Москва», «Определили по геопозиции», «Изменить»), под ней карта 358×140 r20. В приложении карта сверху, строка снизу, плитки с пином нет.
  • ✗ У выбранного чипа района в ноде галочка после текста («Китай-город ✓»); FilterChip её не рисует.
  • ✗ У чипа «Весь город» в ноде иконка icon-Buildings; в приложении только текст.
  • Полоса шагов, «Шаг 1 из 4», заголовок, раскладка чипов 2/2/2, «Другие районы ›», кнопка — по редлайну. Пермь без районов — совпало.
A5-location-* ×3 · REAL
A6 поиск города597:56057расхождения
  • ✗ В ноде белый верхний блок 390×184 с нижними углами r32 и тенью 8 (шапка + поле 358×48), список на сером #F5F5F5. В приложении обычный ScreenScaffold: серая шапка, белый лист с верхними углами, поле 46 внутри листа.
  • ✗ Строки 60 (паддинг 20/20) с разделителями; в приложении 44.
  • «Определить по геолокации» 342×48 внизу, галочка у выбранного — есть. Состояния ввода, «не найдено» и action sheet отказа гео сняты не были.
A6-city-search · TREE
A7 поиск районов609:74123расхождения
  • ✗ Та же структура, что у A6 (белый блок с нижними r32, список на сером) — в приложении лист с верхними углами.
  • ✗ Чекбокс 24 в ноде слева (x=16), название после него (x=48); в приложении название слева, чекбокс справа.
  • Строки 64 против 65; низ в базовой ноде — одна «Сбросить» 358, в приложении сразу две кнопки (снимок снят с выбранным районом, состояние ноды не воспроизведено).
A7-district-search · REAL
A8 о себе291:25219 292:25695 292:25797по нодам
  • Аватар 100 на y=326, поля 358×44 с лейблами, «о себе» 120 со счётчиком слева, кнопка поверх листа, ошибки под полями, полоса шагов — совпали в пределах 2 dp.
  • Иконка аватара Material; переносы био и хвост «фильтр-кофе» другие (шрифт); снимок «заполнено» снят без фото и с «Добавить фото», в ноде — фото и «Изменить фото».
  • Меню фото, барабан даты, дропдаун пола и две шторки отказа снимками не покрыты.
A8-about-* ×3 · REAL, errors — TREE
A9 интересы284:25333 284:25738по нодам
  • Десять чипов по два в ряд, ряды 44 с шагом 52, ширины в пределах 2,4 dp, выбранный — тёмный с галочкой — совпали.
  • 3D-иконки — пустые круги 36 (файлы выгружены, не заведены).
A9-interests-* ×2 · REAL
A10 верификация284:26282 287:26637по нодам
  • Три карточки 358×84 r20 с иконкой 44 по верху, шаг 8; отказ в камере — зона 132 с подписью и «Перейти в настройки» — совпали.
  • 3D-иконки — пустые слоты.
A10-verify-* ×2 · TREE
A11 селфи287:26990 287:27198 732:79437по нодам
  • Овал 242×298 на (74, 273) с пунктиром, шапка, спуск 72 и круги 48, шторки результата (655) и ошибки (609) — совпали пиксельно по положению.
  • Нет размытия фона вне овала (blur 24, отклонение О-6); фаза штриха пунктира другая; иконки Material.
A11-selfie-* ×3 · REAL
A12 «Профиль подтверждён»287:27892по нодам
  • Лист 390×395 от y=449, граббер, заголовок, кнопка «Отлично!» — совпали (448,2 против 449).
  • 3D-галочка с зелёным свечением — пустой слот; текст переносится на три строки иначе.
A12-verify-success · REAL
A13, A14736:98793 · логиканечего сверятьСистемный запрос уведомлений и ветвление после кода — экранов в макете нет, проверено только по коду и тестам.—

Раздел B · афиша, событие, чат

ЭкранСтатусЧто сверено и что не сходитсяСнимки / эталон
B1 карта180:8884 181:9778 693:70691расхождения
  • Шапка: стеклянные пары на (16, 62) и (272, 62), пять чипов NEW-блока с «Рядом ▾» и «Рядом · до 10 км», зум 40×82 на (334, 289), локация на (334, 383), шторка от y=628 (peek 216), «Афиша города ›» — сверено с настоящими рендерами 306:47249 и 180:9300, совпало.
  • ✗ Карточка «Куда иду» в ноде 693:70691 — Liquid Glass (слой Liquid Glass Material, r24/34), то есть полупрозрачное стекло над картой; в приложении непрозрачная белая r20.
  • Состояния карточки на 0, 1, 2 и 3 события (693:71370…72751) снимками не покрыты; кластер маркеров показывает первые обложки выборки, а не состав кластера (T-10).
  • Сама карта (MapLibre против картинки макета) сравнению не подлежит; таббар в снимке не рендерится — он на уровне AppScaffold.
B1-map, B1-map-near, B1-sheet · TREE + REAL 306:47249
B2 радиус180:9724по нодам
  • Лист 277, заголовок «Расстояния от меня» + «км», ползунок 358×44 со стеклянной ручкой «10», метки, «Сбросить»/«Применить» по 175 — совпали.
B2-radius · REAL
B3 фильтры194:24494 194:25492расхождения
  • Блоки r24 с gap 4, карточка «Город» 216 с плиткой-пином и превью 358×120, чипы дат 3+2, цена, интересы 2 в ряд, switch, низ «Сбросить» 358 / «Сбросить» 115 + «Показать 24 события» 235 — по редлайну.
  • ✗ Чипы районов в ноде укладываются по ширине: «Весь город, Хамовники ✓» / «Тверской, Китай-город, Арбат» / «Замоскворечье»; в приложении жёстко по два (chunked(2)) — три ряда по два.
  • ✗ У выбранного района в ноде галочка; в приложении нет (тот же дефект FilterChip, что на A5).
  • ✗ Превью карты — белая плашка с пином (О-7), в ноде фрагмент карты Москвы.
  • В базовой ноде 194:24494 район уже выбран, а внизу одна «Сбросить»; правило «две кнопки при непустом фильтре» из кода с этим не сходится — вероятно, «Показать N» появляется после изменения, а не при любом непустом состоянии.
B3-filters, B3-filters-selected · REAL
B4 город/районы из фильтра604:65659 605:67468расхожденияТе же экраны A6/A7 с возвратом в шторку — несут те же структурные расхождения (верхний белый блок, сторона чекбокса, высота строк).без снимков
B5 календарь194:27047по нодам
  • Лист 571 от y=273, «Календарь», навигация месяца 358×24, ячейки 48 r16 с шагом 52, 1 августа в шестой колонке, «Сбросить» 115 / «Применить» 235 — совпали.
  • Подписи дней «Пн…Вс» вместо сдвинутых «Сб Вс Пн…» из ноды — осознанное отклонение (в ноде съехали подписи, не сетка).
  • Диапазон 12–18 и счётчики событий в снимке — из других нод; базовая нода без выбора и с выключенной «Применить».
B5-calendar · REAL
B6 поиск192:19379 192:20640 192:20840расхождения
  • Белый блок 134 с нижними r32, поле 290×46 + «Отмена», «Недавние запросы» на y=158, строки 44 с лупой и chevron, разделители с отступом 48, пустое состояние с иконкой 80 — совпали.
  • ✗ Строки результатов: в ноде шаг 141 (108 + 16 + разделитель + 16), в приложении 109 — между строками нет отступов 16, четвёртая строка выше макета на 96 dp.
  • ✗ Справа от бейджа в ноде дата «29 июля · 11:00» (590/14@40 %) — в строке приложения её нет.
  • ✗ В нижней строке карточки приложение рисует цену с билетом — в ноде этот слой скрыт (Frame 2147225420 [HIDDEN]).
  • ✗ «Популярные категории» в ноде 3 + 2 чипа; у Inter три не влезают в 358 и FlowRow даёт 2 + 2 + 1.
B6-search-* ×3 · REAL
B7 афиша списком610:75563расхождения
  • ✗ Шапка в ноде: слева кнопка календаря, справа лупа, по центру «Москва ˅» (шеврон у города) и «Алтуфьевский» под ним. В приложении: слева «назад», справа календарь, шеврон у района.
  • ✗ «Афиша города» в ноде на y=132, в приложении на 156 (отступ 132 + паддинг 24) — весь лист ниже на 24 dp.
  • Карточка рельса 300×262 (из NEW-ноды) против 300×228 в этой ноде — макет расходится сам с собой, блок интересов уезжает ещё на 34 dp.
B7-list · TREE
B9 категория194:36070 229:14429по нодам
  • Белый блок 335 с иконкой 64, «Категория “Спорт”», счётчики, разделитель, описание, «Подписаться» 358×48 на y=395, группы по дням с шагом строк 141 — совпали.
  • «Вы подписаны» в ноде с галочкой перед текстом — в приложении без; цена в строках событий (в нодах скрыта); 3D-иконка — слот.
B9-category-* ×2 · REAL
B10 событие230:19369 231:20559 232:27767 232:28174 232:28673 232:26224 232:27284 348:42416расхождения
  • База: шапка на y=64 со стеклянной парой, обложка 358×358 на y=130, бейджи 30, заголовок, дата, разделители, место, мини-карта 358×140, «66 Идёт» со стопкой 32/−6, организаторы, описание, действия, «Похожие» страницами 331,5 — по редлайну.
  • ✗ Кнопка «открыть в картах» 40 r12 в ноде в правом нижнем углу мини-карты (326, 809); в приложении в правом верхнем.
  • ✗ Пейджер фото обложки с точками (66×19 на y=457) не сделан.
  • ✗ «Вы идёте» (231:20559): в ноде внизу button-delete «Отменить» 116 + стеклянная «Перейти в чат» 218 с иконкой чата и snackbar «✓ Вы участвуете в событии» 342×50; в приложении «Перейти в чат» + тёмная «✓ Вы идёте». В живой навигации onOpenChat = null — «Перейти в чат» вообще не показывается.
  • ✗ «Заявка одобрена» (232:28174): в ноде та же пара «Отменить» + «Перейти в чат» и snackbar «Вам одобрили участие»; в приложении подпись «Чат откроется за 2 дня» + «✓ Заявка одобрена».
  • ✗ «Отклонена» (232:28673): в ноде красная «Участие отклонено» и snackbar «Организатор отклонил ваше участие»; в приложении тёмная «Заявка отклонена».
  • ✗ «Вы подали заявку» и «Достигнут лимит участников» в нодах с иконками (галочка, icon-user-group) — в приложении без.
  • ✗ Режим с одобрением (232:26455): в ноде кнопка «Подать заявку на участие» — такого текста в strings.xml нет, всегда «Участвовать».
  • ✗ «Событие завершено» (348:42416): в ноде стеклянная пилюля «✓ Событие завершено» на месте кнопки; в приложении «Оставить отзыв».
  • ✗ Шторка жалобы (608:70144–70529): в ноде девять причин и второй шаг «Расскажите, что произошло» с подписью и полем «Ваша жалоба…» для любой причины; в приложении один шаг, причины от бэка, поле только у «Другое».
  • ✗ Отмена участия (231:21452): в ноде iOS-алерт 300 «Вы действительно хотите отменить участие?» с описанием; в приложении диалог 250 с пунктом «Отменить участие?» без описания.
  • «Событие отменено» — совпало (Delete 50 % с крестом).
B10-event-* ×8 · REAL ×4, TREE ×4; шторки — REAL 608:70144, 231:21452
B11 чат события232:22272 232:25394 608:70819 232:25251расхождения
  • Карточка события в белом блоке 84 r32, лента на белом с паддингом 24/16/112, плашки дней r20, пузыри 270 r20 с хвостом 2 и именем автора внутри, время 590/10, статусы своих сообщений, «Не отправлено · Повторить» — совпали.
  • ✗ В ноде справа в шапке кнопка «•••» 48 — в приложении её нет и в навигации onMenu не передаётся.
  • ✗ Обложка в карточке 52 r12, в приложении r8; перед «Уже завтра в 10:00» в ноде иконка часов — её нет.
  • ✗ Пустое состояние (232:25394): в ноде 3D-иконка на y=421 — по центру ленты; в приложении сразу под карточкой, выше макета на ~190 dp.
  • ✗ Кнопка отправки в ноде — голубой круг (тинт #007AFF), в приложении стеклянный со серой стрелкой.
  • Меню прикрепления в ноде 608:70819 — компактное контекстное меню у скрепки; в приложении шторка PhotoPickerSheets; просмотрщик (232:25251) — счётчик и крест на месте, миниатюры 80/60 не сверены (мок-фото не грузятся).
B11-chat-* ×5 · REAL ×3, TREE ×2
B12 блок «Куда иду»693:70691…73689расхожденияРеализован внутри B1 (карточка на карте вместо «Смотреть списком»); материал и радиус не по ноде, см. B1.B1-map
B13 «Куда иду»693:76501 693:74315по нодам
  • Сегмент 358×40 на y=140, «Сегодня / четверг», строки 108 с шагом 141 и разделителем 96 — совпали.
  • Пустое состояние: рендера ноды 693:74315 нет, тексты взяты из спеки (FIGMA-CHECK) — не сверено.
B13-going ×2 · REAL / нет эталона
B14 афиша города794:161851не сверено
  • Рендера нет. По редлайну: герой 320×360 на y=144 — совпадает по коду; «Популярное» и «Рекомендуем» в ноде с карточками 228 и иконкой 24×32 справа от заголовка — в приложении карточки 262 и заголовки без иконки; подборки 200×200 r16 — совпадают.
B14-city · нет эталона

Разделы C–J · создание, кабинет, свайпы, профиль, чаты, настройки

Ни один экран этих разделов по нодам не собирался. То, что есть в коде, — вёрстка до спеки паритета: тексты под ключами legacy_* (184 ключа), свои размеры и структура. В графе навигации зарегистрировано 32 маршрута из 54 объявленных.

старая вёрстка 25 экранов

C0, C1
создание — мастер из шагов вместо формы NEW-ноды (48 legacy-строк)
C3, C5, C7, C10, C13
вид организатора, кабинет, редактирование, участники, отмена — CrewScreen/EditEventScreen
D1, D2
стандартные кейсы записи и переход в чат — логика есть, экраны NEW не сверялись
E1, E2, E4, E5
свайпы — SwipesScreen старой раскладки
F1, F2
уведомления и переход по ним
G1
избранные события
H1, H2, H8
профиль, мои события, скидки — при 48 готовых эталонных рендерах раздела
I1, I5
список чатов, чат события из списка
J1–J4
настройки подстраницами вместо одного экрана (42 legacy-строки)

экрана нет 23 экрана

C2, C4, C6, C8, C9, C11, C12
место проведения, QR события, онбординг кабинета, организаторы, вопросы, приглашения, чат из кабинета
D3, D4, D5
регистрация с вопросами, приглашение в организаторы, приглашение участвовать
E3, E6
фильтры на свайпах, гайд-тур
G2
избранные люди
H3–H7, H9
история, QR профиля, редактирование, довершение профиля, статус/локация, «Куда иду» из профиля
I2, I3, I4
чужой профиль, подписки, личный чат
J5
заблокированные

Дизайн-система K1–K5

БлокСтатусФакт
K1 цветасовпадаетТокены PodusheColors сняты с дерева нод, выключенные состояния кнопок пересчитаны по слоям (brand 50 %, delete 80 %/50 %).
K2 типографикаотклонениеКегли, веса и интерлиньяж по 4.2; гарнитура Inter вместо SF Pro, узкие заголовки — сжатие 0,72. Формы букв не совпадают нигде.
K3 компонентычастичноКнопки 48/32/44, поля 44/120, шапка 124, лист r32, зона 96, ячейки OTP, сегмент, календарь — по нодам. Дефекты: FilterChip без галочки в активном состоянии; EventRow без даты у бейджа и с ценой из скрытого слоя; обложка компактной строки r8 вместо r12; стекло (liquidGlass) в снимках не рендерится, на устройстве не проверено.
K4 иконки и 3Dне сделано62 иконки — Material; 21 3D — пустые слоты (PNG уже на диске); коллаж A1 — растр из рендера.
K5 сквозные паттернычастичноПустые состояния, snackbar и шторки есть; snackbar-ы страницы события из нод («Вы участвуете в событии», «Вам одобрили участие», «Организатор отклонил ваше участие») не реализованы; системные диалоги не проверялись (нет эмулятора).

Что упирается в выгрузку из Figma — на самом деле

АссетВыгруженЗаведён в приложениеГде лежит
21 3D-иллюстрацияда, 07.09нетdocs/figma/export/assets/<sha>.png · имена в _3d_icons.json
Фото и слои коллажа A1да, 4 заливки ноды 158нет (вырезка рендера)docs/figma/export/assets/ · _index.json
62 векторные иконкинетнет (Material)Обход квоты отдаёт только растровые заливки; нужен экспорт SVG из интерфейса Figma или токен другого аккаунта после ~12.09
Рендеры кадров210 из 2127—Для 12 из 55 снятых состояний эталон — только локальная отрисовка по дереву (A6, A8-errors, A10 ×2, B1 ×3, B7, B10 ×4, B11 ×2); для B13-empty и B14 эталона нет. Съёмку через браузер (tools/figma_shots.py) можно продолжить без квоты.
Вывод по блокеру. Из-за выгрузки не доведены только иконки. 3D-иллюстрации и фото коллажа можно завести хоть сегодня: это меняет A1, A9, A10, A12, B1, B3, B6, B9, B11, B13 без правок раскладки — только тела Icon3d/welcome_collage.

Правки по убыванию веса

  1. B10 — нижняя панель состояний. «Вы идёте» и «Заявка одобрена»: «Отменить» (delete, 116) + «Перейти в чат» (стекло, 218, с иконкой) и snackbar-ы из нод; «Участие отклонено» красной; иконки в «Вы подали заявку» и «Достигнут лимит»; «Подать заявку на участие» для режима с одобрением; пилюля «✓ Событие завершено»; передать onOpenChat в навигации.
  2. A5 / B3 / B6 / B7 — структура. Карточка города: строка сверху, карта снизу, плитка с пином. Чипы районов по ширине и галочка у выбранного (FilterChip). Строки результатов с шагом 141, дата у бейджа, скрыть цену. Шапка списка: календарь слева, лупа справа, шеврон у города; лист на y=132.
  3. A6 / A7 — верхний белый блок с нижними r32, список на сером, строки 60/64, чекбокс слева.
  4. Ассеты. Завести 21 PNG в drawable-xhdpi/xxhdpi под img3d_*, собрать коллаж A1 из слоёв (без iOS-статус-бара), выгрузить SVG иконок.
  5. B11. Кнопка «•••», часы в карточке, r12, центрирование пустого состояния, голубая кнопка отправки.
  6. B10 шторки. Девять причин и второй шаг жалобы; алерт отмены с текстами ноды. B1 — стеклянная карточка «Куда иду» r24. A4 — подзаголовок в две строки (или принять сдвиг 20 dp), не стирать цифры при лимите.
  7. Проверка на устройстве. Снять скриншоты 1:1 на телефоне с инсетом 54 dp (или пересчитать шапки на фиксированные 124) — иначе пиксельная сверка невозможна в принципе.

Как проверялось

Источники: android-events/docs/FIGMA_PARITY_SPEC.md v2.5, docs/figma/PROGRESS.md, docs/figma/redlines.md, полные деревья шести страниц в docs/figma/export/pages/, 210 рендеров ×2 в docs/figma/export/screens/ и 49 в docs/figma/reference/, 58 локальных отрисовок в docs/figma/local/, 55 снимков app/src/test/snapshots/images/ (коммит b004714). Каждый снимок положен рядом с рендером ноды в одном масштабе (780 px на 390 dp) и просмотрен; для сдвига iOS-статус-бара считался второй diff со смещением снимка на 54 dp. Числа проверялись по редлайну и коду экрана; там, где редлайн и рендер расходились (A5, B7, B10, B6), решало дерево нод из выгрузки. Состояния без снимков (меню, пикеры, отказы разрешений, NEW-состояния карты, поиск по категории) сверены только по коду, а не визуально.