Каждый собранный экран Android-приложения сверен вручную с нодой Figma «Podushe | Mobile-app»: 55 снимков состояний (Paparazzi, 390 dp) против 210 настоящих рендеров ×2 и полных деревьев нод, плюс код Compose против редлайнов. Ниже — сколько сходится пиксель в пиксель, что сделано по нодам, что расходится и чего нет вовсе.
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). Это единственное, что реально заблокировано выгрузкой: иконки — векторы, а обход квоты отдаёт только растровые заливки.
В приложении 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 (скриншот с устройства) не выполнялся, эмулятора нет.
welcome_collage.png (780×1216) — верхние 608 dp рендера ноды 158:9505 целиком, включая «9:41» и Dynamic Island. На устройстве под Android-статус-баром будет просвечивать нарисованный iOS-статус-бар. Фото коллажа (4 заливки ноды 158) тоже уже выгружены отдельными файлами — слои можно собрать заново.Статус по каждому снимку: ✓ — совпало с нодой в пределах ±2 dp (кроме шрифта и ассетов); ✗ — расхождение. Эталон: REAL — настоящий рендер Figma, TREE — только локальная отрисовка по дереву нод (иконки, стекло и шрифт в ней условные).
| Экран | Статус | Что сверено и что не сходится | Снимки / эталон |
|---|---|---|---|
| A1 велком158:9505 | по нодам |
| A1-welcome · REAL |
| A2 номер260:24430 261:25228 582:52876 579:52473 | по нодам |
| A2-phone-* ×4 · REAL |
| A3 политика261:26902 | по нодам |
| A3-policy · REAL |
| A4 код261:26987 261:27203 261:27297 592:5040 | расхождения |
| A4-otp-* ×4 · REAL |
| A5 локация597:55329 597:56595 730:75312 | расхождения |
| A5-location-* ×3 · REAL |
| A6 поиск города597:56057 | расхождения |
| A6-city-search · TREE |
| A7 поиск районов609:74123 | расхождения |
| A7-district-search · REAL |
| A8 о себе291:25219 292:25695 292:25797 | по нодам |
| A8-about-* ×3 · REAL, errors — TREE |
| A9 интересы284:25333 284:25738 | по нодам |
| A9-interests-* ×2 · REAL |
| A10 верификация284:26282 287:26637 | по нодам |
| A10-verify-* ×2 · TREE |
| A11 селфи287:26990 287:27198 732:79437 | по нодам |
| A11-selfie-* ×3 · REAL |
| A12 «Профиль подтверждён»287:27892 | по нодам |
| A12-verify-success · REAL |
| A13, A14736:98793 · логика | нечего сверять | Системный запрос уведомлений и ветвление после кода — экранов в макете нет, проверено только по коду и тестам. | — |
| Экран | Статус | Что сверено и что не сходится | Снимки / эталон |
|---|---|---|---|
| B1 карта180:8884 181:9778 693:70691 | расхождения |
| B1-map, B1-map-near, B1-sheet · TREE + REAL 306:47249 |
| B2 радиус180:9724 | по нодам |
| B2-radius · REAL |
| B3 фильтры194:24494 194:25492 | расхождения |
| B3-filters, B3-filters-selected · REAL |
| B4 город/районы из фильтра604:65659 605:67468 | расхождения | Те же экраны A6/A7 с возвратом в шторку — несут те же структурные расхождения (верхний белый блок, сторона чекбокса, высота строк). | без снимков |
| B5 календарь194:27047 | по нодам |
| B5-calendar · REAL |
| B6 поиск192:19379 192:20640 192:20840 | расхождения |
| B6-search-* ×3 · REAL |
| B7 афиша списком610:75563 | расхождения |
| B7-list · TREE |
| B9 категория194:36070 229:14429 | по нодам |
| B9-category-* ×2 · REAL |
| B10 событие230:19369 231:20559 232:27767 232:28174 232:28673 232:26224 232:27284 348:42416 | расхождения |
| B10-event-* ×8 · REAL ×4, TREE ×4; шторки — REAL 608:70144, 231:21452 |
| B11 чат события232:22272 232:25394 608:70819 232:25251 | расхождения |
| B11-chat-* ×5 · REAL ×3, TREE ×2 |
| B12 блок «Куда иду»693:70691…73689 | расхождения | Реализован внутри B1 (карточка на карте вместо «Смотреть списком»); материал и радиус не по ноде, см. B1. | B1-map |
| B13 «Куда иду»693:76501 693:74315 | по нодам |
| B13-going ×2 · REAL / нет эталона |
| B14 афиша города794:161851 | не сверено |
| B14-city · нет эталона |
Ни один экран этих разделов по нодам не собирался. То, что есть в коде, — вёрстка до спеки паритета: тексты под ключами legacy_* (184 ключа), свои размеры и структура. В графе навигации зарегистрировано 32 маршрута из 54 объявленных.
CrewScreen/EditEventScreenSwipesScreen старой раскладки| Блок | Статус | Факт |
|---|---|---|
| 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-ы страницы события из нод («Вы участвуете в событии», «Вам одобрили участие», «Организатор отклонил ваше участие») не реализованы; системные диалоги не проверялись (нет эмулятора). |
| Ассет | Выгружен | Заведён в приложение | Где лежит |
|---|---|---|---|
| 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) можно продолжить без квоты. |
Icon3d/welcome_collage.onOpenChat в навигации.FilterChip). Строки результатов с шагом 141, дата у бейджа, скрыть цену. Шапка списка: календарь слева, лупа справа, шеврон у города; лист на y=132.drawable-xhdpi/xxhdpi под img3d_*, собрать коллаж A1 из слоёв (без iOS-статус-бара), выгрузить SVG иконок.Источники: 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-состояния карты, поиск по категории) сверены только по коду, а не визуально.