По душе · Android × Figma · 12.09.2026 · проверка всего собранного

Перепроверка: 390 кадров, модель прожига и тени

Проверка пошла не по последнему десятку, а по всему, что собрано: 390 зарегистрированных кадров пересняты на свежей сборке и сверены с рендерами Figma не только метрикой, но и по нодам — цвет каждой заливки, полоса под каждой тенью, чернила каждого текста. Главное, что нашлось: режим наложения LINEAR_BURN считался неверно — и потому у полей ввода отличался цвет плашки, у половины экранов текст был светлее макета, а у другой половины, наоборот, темнее.

346 / 390кадров с зелёной геометрией при пороге 0,3 %
1050текстовых расхождений было до правки
456осталось после
9классов расхождений в реестре E3

Как проверял

Метрика Δ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). Это и есть «другой цвет поля ввода».

Figma
Figma
было
было
стало
стало

Барабан даты: невыбранные строки прозрачны на 35 %

642:65266 · правка события, CreateEventNodeScreen

У всех строк, кроме выбранной, в ноде стоит opacity 0,35 — в рендере они (163,163,163). В фикстуре стояла единица, и барабан выходил сплошь чёрным.

Figma
Figma
было
было
стало
стало

Заголовок шапки тоже прожигается

665:79854 · профиль участника, UserProfileNodeScreen

Заголовок над серой страницей — (30,32,39), а не объявленные (40,42,49). Так набраны шапки всех экранов: «Вход», «Политика», «Чат события», «Уведомления», «Профиль». Подложку объявляет экран (PdBurnOver), кит берёт её из LocalPdBurnBase.

Figma
Figma
было
было
стало
стало

Текст приглашения над серой плашкой

690:66479 · отправить приглашение, SendInviteNodeScreen

Заголовок шапки и текст письма прожигаются над серым: (30,32,39) вместо объявленных (40,42,49).

Figma
Figma
было
было
стало
стало

Карточки списка, наоборот, прожигать не надо

693:76501 · город, CityListNodeScreen

Тексты карточки события жглись всегда, хотя в 272 экземплярах из 291 они лежат на белой странице — над белым прожиг тождественен. Подложка стала параметром surface: белая у списков, серая у рельса и «Страницы Поиска». Заодно у обложки появилась своя тень (0,2) r8 16 %.

Figma
Figma
было
было
стало
стало

Кнопка-строка «Добавить вопрос» прожигалась зря

643:70579 · вопросы при регистрации

У строки в ноде прожига нет: в рендере подпись (40,42,49), а не (30,32,39). Прожиг снят — обратный случай к остальным находкам.

Figma
Figma
было
было
стало
стало

Разделителя между третьей и четвёртой строкой нет

644:71239 · вопросы при регистрации, QuestionsNodeScreen

Замечание владельца. В первой группе четыре строки Cell, а узлов Divider только два: третья и четвёртая стоят встык и читаются как один блок. Заведён флаг PdQRow.divider.

Figma
Figma
было
было
стало
стало

Подписи чипов категорий над собственной заливкой

284:25333 · интересы, InterestsNodeScreen

Неактивный чип категории — заливка #F7F7F7, и его подпись жжётся над ней: в рендере (31,33,40). Таких чипов в файле 478, и они не жглись ни на одном экране. Снимка «до» нет — он пересобран той же правкой кита.

Figma
Figma
стало
стало

Индикатор отправки — дуга кольца, а не круг

608:71782 · чат события, ChatNodeScreen

В ноде это эллипс с arcData: дуга от 3π/2 на 252° при внутреннем радиусе 0,75 — разомкнутое кольцо толщиной 1,25. Рисовался залитый круг.

Figma
Figma
стало
стало

Модель прожига

Узел с blendMode: LINEAR_BURN рисуется в свой изолированный слой, и на подложку ложится уже слой: max(0, c + base − 255). Внутри слоя подложкой считается только то, что лежит ниже в той же изоляции. Значит прожиг применяется по разу на каждую изоляцию, под которой есть непрозрачная заливка, — а не по разу на каждый LINEAR_BURN в цепочке. Три независимых замера сошлись:

местообъявленорендерпрожигов
плашка поля I688:50419;192:199032452351
значение «Парк» #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
Плашка #F5F5F5, текст #1A1A1A — как объявлено Плашка #EBEBEB, текст #060606 — как в рендере

Над белым прожиг тождественен, поэтому один и тот же компонент на белой странице рисуется объявленным цветом, а на серой — прожжённым. Подложку теперь объявляет экран (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:2355212 % + 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.