По душе · Android × Figma · 12.09.2026 · проверка всего собранного
Проверка пошла не по последнему десятку, а по всему, что собрано: 390
зарегистрированных кадров пересняты на свежей сборке и сверены с рендерами Figma не только
метрикой, но и по нодам — цвет каждой заливки, полоса под каждой тенью, чернила каждого текста.
Главное, что нашлось: режим наложения LINEAR_BURN считался неверно — и потому у
полей ввода отличался цвет плашки, у половины экранов текст был светлее макета, а у другой
половины, наоборот, темнее.
Метрика ΔE > 6 слепа к светлому на белом и к цвету текста: кадр с полностью
пропавшей серой плашкой поля шёл 0,016 % по геометрии. Поэтому к четырём числам добавлены два
измерителя по нодам. tools/inkcheck.py сравнивает рендер и снимок там, где нода
что-то рисует: средний цвет по её площади, полосу снаружи габарита по направлению тени и чернила
внутри absoluteRenderBounds. tools/burnmap.py — новый: он по дереву
считает, какие узлы идут с прожигом, сколько раз прожиг применяется и какой цвет должен выйти,
и делает это без картинок, из одного исходника.
Прогон по всем кадрам дал 1050 расхождений по тексту, 1451 по заливкам и 1323 по теням. Ниже — классы, а не отдельные кадры: каждая находка правится один раз в ките и расходится по десяткам экранов.
688:50317 · лист «Место проведения», PlaceSheetNodeScreen
Узел Search Field идёт с blendMode: LINEAR_BURN, поэтому темнеет не только текст, но и его собственная заливка: #F5F5F5 в рендере — (235,235,235). Текст при этом жжётся дважды — сначала над плашкой внутри слоя, потом вместе с ней над страницей: значение #1A1A1A даёт (6,6,6), плейсхолдер 40 % — (149,150,153). Это и есть «другой цвет поля ввода».
642:65266 · правка события, CreateEventNodeScreen
У всех строк, кроме выбранной, в ноде стоит opacity 0,35 — в рендере они (163,163,163). В фикстуре стояла единица, и барабан выходил сплошь чёрным.
665:79854 · профиль участника, UserProfileNodeScreen
Заголовок над серой страницей — (30,32,39), а не объявленные (40,42,49). Так набраны шапки всех экранов: «Вход», «Политика», «Чат события», «Уведомления», «Профиль». Подложку объявляет экран (PdBurnOver), кит берёт её из LocalPdBurnBase.
690:66479 · отправить приглашение, SendInviteNodeScreen
Заголовок шапки и текст письма прожигаются над серым: (30,32,39) вместо объявленных (40,42,49).
693:76501 · город, CityListNodeScreen
Тексты карточки события жглись всегда, хотя в 272 экземплярах из 291 они лежат на белой странице — над белым прожиг тождественен. Подложка стала параметром surface: белая у списков, серая у рельса и «Страницы Поиска». Заодно у обложки появилась своя тень (0,2) r8 16 %.
643:70579 · вопросы при регистрации
У строки в ноде прожига нет: в рендере подпись (40,42,49), а не (30,32,39). Прожиг снят — обратный случай к остальным находкам.
644:71239 · вопросы при регистрации, QuestionsNodeScreen
Замечание владельца. В первой группе четыре строки Cell, а узлов Divider только два: третья и четвёртая стоят встык и читаются как один блок. Заведён флаг PdQRow.divider.
284:25333 · интересы, InterestsNodeScreen
Неактивный чип категории — заливка #F7F7F7, и его подпись жжётся над ней: в рендере (31,33,40). Таких чипов в файле 478, и они не жглись ни на одном экране. Снимка «до» нет — он пересобран той же правкой кита.
608:71782 · чат события, ChatNodeScreen
В ноде это эллипс с arcData: дуга от 3π/2 на 252° при внутреннем радиусе 0,75 — разомкнутое кольцо толщиной 1,25. Рисовался залитый круг.
Узел с blendMode: LINEAR_BURN рисуется в свой изолированный слой, и на подложку
ложится уже слой: max(0, c + base − 255). Внутри слоя подложкой считается только то,
что лежит ниже в той же изоляции. Значит прожиг применяется по разу на каждую изоляцию, под
которой есть непрозрачная заливка, — а не по разу на каждый LINEAR_BURN в цепочке.
Три независимых замера сошлись:
| место | объявлено | рендер | прожигов |
|---|---|---|---|
плашка поля I688:50419;192:19903 | 245 | 235 | 1 |
| значение «Парк» #1A1A1A в поле | (26,26,26) | (6,6,6) | 2 |
| плейсхолдер «Поиск...» 40 % | (163,164,167) | (149,150,153) | 2 |
| строка «ФИО» в ячейке без заливки | (40,42,49) | (30,32,39) | 1 |
| подпись чипа над #F7F7F7 | (40,42,49) | (31,33,40) | 1 |
Над белым прожиг тождественен, поэтому один и тот же компонент на белой странице рисуется
объявленным цветом, а на серой — прожжённым. Подложку теперь объявляет экран
(PdBurnOver — 36 объявлений в 31 экране и листе, LocalPdBurnBase в ките), а
у карточек событий и полей ввода она — параметр surface.
Замечание владельца «где-то не хватает теней, а где-то они лишние» подтвердилось по полосам под узлами:
| узел | тень в ноде | было | экземпляров |
|---|---|---|---|
обложка карточки события 175:3833, 175:3909 | (0,2) r8 16 % | нет | 76 |
обложка карточки уведомления 288:29956 | (0,2) r8 16 % | нет | 13 |
белый блок афиши 194:34823 | (0,2) r2 4 % | нет | 8 |
чип карты 178:5621 + стекло 5914:23552 | 12 % + 20 % | только 12 % | 95 |
кнопка бренда в листах афиши 177:5451 | (0,8) r40 12 % | (0,2) r4 6 % | 45 |
стеклянная кнопка шапки 229:18999 | (0,8) r40 20 % | нет | 30 |
Структурная сверка после правок находит по тексту 456 расхождений против 1050 до неё, а в классе прожига — 225 против 677. Остаток честно делится на четыре кучки, и ни одна не про вёрстку:
Отдельно стоит редкая неустойчивость эмулятора: один кадр из 390 снялся недорисованным (лист вышел полупрозрачным, нижняя панель не нарисовалась) и дал 19,885 % — пересъёмка того же кадра дала 0,155 %. Правило: кадр с расхождением в разы сначала переснимается, а потом разбирается.
Спека — docs/FIG_PARITY_SPEC.md 3.9, раздел
6.3-б; реестр находок — docs/figma/fig/ledger.md E3-1…E3-9; измерители —
tools/burnmap.py и tools/inkcheck.py.