---
name: contrast-meter-occlusion-rule
description: "Измеритель контраста должен брать фон из elementsFromPoint НАЧИНАЯ С САМОГО ЭЛЕМЕНТА: всё, что выше него в списке, — перекрытие (модалка, всплывашка), а не фон; обход предков вообще не видит абсолютных соседей"
metadata: 
  node_type: memory
  type: reference
  originSessionId: b11e39bd-4f6f-47c9-ba7b-680ccf041a5b
  modified: 2026-08-06T17:45:11.854Z
---

Два разных дефекта одного измерителя (`~/Services/shared/tools/impeccable/verify_any.py`), оба
дают **ложные провалы контраста** и оба чинятся одной функцией `painted()`:

1. **Фон рисует не предок, а абсолютно позиционированный СОСЕД** — подсветка активной вкладки
   (`layoutId`-пилюля framer-motion), подложка строки, плашка под словом. Обход предков её не видит,
   уходит к фону страницы и выдаёт 1.08 при реальных ~8. Лечится `document.elementsFromPoint`.

2. **Но брать первый непрозрачный фон СВЕРХУ списка нельзя.** Список идёт сверху вниз, и всё, что
   выше самого элемента, — это перекрытие. Пока в кабинете ВакХантера был открыт онбординг, кнопка
   под ним получала фоном полотно модалки и снова давала 1.08. Правильно: найти в списке сам элемент
   (`indexOf(el)`, иначе первого предка через `c.contains(el)`) и искать фон **начиная с него**,
   пропуская только потомков — они лежат поверх текста.

3. **Элемент ВНЕ кадра нельзя мерить через точку.** Координаты зажимаются границами окна, точка
   уезжает в чужую секцию и возвращает её фон. Липкий заголовок светлой полосы получал фоном
   тёмную плиту первого экрана: 1.03 при реальных ~15. Вне кадра — только обход предков.

4. **`color(srgb r g b / a)` — каналы в ДОЛЯХ единицы, а не 0..255.** Chrome так сериализует
   результат `color-mix()`. Парсер брал 0.91 за «почти чёрный», и светлый текст на тёмном фоне
   давал 1.12 при реальных ~6. Ветка на `/^color\(/` обязательна, иначе инструмент врёт про
   любой `color-mix` — а его в семье много.

После всех четырёх правок (06.08.2026) контраст на codoceh.ru, vakhunter, avtero и в обоих
кабинетах — **0 нарушений в светлой и тёмной теме**, при том что измеритель стал строже, а не мягче.
Заодно он поймал настоящий дефект, который я сам и внёс: подписи станций рельса при 42 % давали 3.0,
при 62 % — 4.43; норма взята только на 70 %.

Родственно [[wcag_contrast_over_video]] и общему правилу: одинаковая находка сразу на всех объектах —
почти всегда дефект измерителя. Снимает «не чинить» из [[kodoceh_cabinet_session_probe]].
