Решили: гейт состояний засчитывает покрытие по селектору, который СОДЕРЖИТ класс блока и
псевдокласс, а не по точному виду селектора; выключенность признаётся и по :disabled, и по классу
.unity-disabled.
Почему: строгий критерий («у блока обязано быть правило .gm-button:hover») объявил бы дефектом
работающий код. Половина наших правил двухклассовые (.unity-button.gm-button:hover) — не по вкусу,
а потому что одноклассовый селектор проигрывает теме Unity по специфичности; :checked вообще
садится на потомка (.gm-toggle-row .unity-toggle:checked), так как псевдокласс держит сам Toggle.
Гейт обязан проверять результат — отвечает ли элемент на состояние, — а не приём, которым этого
добились. Обе приметы выключенности признаны по той же причине: SetEnabled(false) поднимает и
псевдокласс, и класс, и у нас в ходу оба.
Грабли: первый прогон дал 50 нарушений — это не поломка, а перепись долга, которого никто не
видел: строки настроек не отвечают ни на что, у карточек нет нажатия и фокуса, у переключателя нет
:checked. Заодно закреплён порядок ярусов темы отдельным тестом: при равной специфичности USS
выигрывает импортированный ПОЗЖЕ, поэтому перестановка @import молча меняет вид там, где никто
ничего не правил, — а после разнесения components.uss по файлам таких мест станет на порядок
больше.
Владелец правды: Assets/_Project/Tests/EditMode/UI/UiStateGateTests.cs.