Решили: дизайн-система получает ВТОРОЙ голос (сериф на всём, что интерфейс произносит) и ВТОРУЮ форму (кнопка-пластина со срезанными углами вместо единственного прямоугольника с рамкой 2px).
Почему: до этого у системы был ровно один силуэт и ровно одна гарнитура на весь текст, кроме
.gm-panel__title. Следствие видно на рендере главного меню: заголовок говорит нашей антиквой, а
шесть пунктов под ним — гротеском Fira Sans, выбранным как раз за нейтральность, и различаются они
между собой только цветом заливки. Экран читался веб-формой, а не игрой. Отвергнуто: (1) вернуть
пиксельный набор Honeti — его вывели 25.07 осознанно, проблема не в его отсутствии; (2) оставить одну
гарнитуру и добить вид фактурой (тени/градиенты) — UITK не умеет ни box-shadow, ни inset, а
растровые подложки — это возврат к тому же 9-slice; (3) третья гарнитура под «акцент» — два голоса
читаются как замысел, три как солянка.
Сказано: «А вот наши реальные кнопки, шрифт и прочее - мб и не особо. Будто мы держались за старый стиль когда все делали еще под UI pixel art набор, а по итогу… а по итогу что-то странное у нас щас» (2026-08-02, сессия d2239d53). Порядок работ («шрифты → форма → зачистка хвостов → панели») предложен агентом и утверждён им же дословно: «Да, давай твой порядок».
Грабли:
PlateButtonнаследуетButton, а НЕVisualElementсClickable: полсотни мест ищут кнопки черезQ<Button>(...). Ценой этого стала возня с текстом — базовыйTextElementподписывается наgenerateVisualContentв СВОЁМ конструкторе, то есть раньше наследника, и заливка пластины легла бы поверх надписи. Поэтому подпись переехала в дочернийLabel, аtextпереопределён (свойство виртуальное, UXML-атрибут продолжает работать). Геттер обязан переживать вызов до конструктора наследника.- Из-за этого же переезда гарнитура до подписи не доходит НАСЛЕДОВАНИЕМ: правило
.unity-text-elementбьёт поLabelпрямо, а прямое сильнее унаследованного. Дочерний класс обязан стоять в списке голосовых селекторов отдельной строкой. CustomStyleProperty<float>читает<number>, а не<length>:--gm-plate-chamfer: 10pxмолча не резолвится, нужно10(та же конвенция, что у--gm-slant-width).- Каждое состояние пластины требует ДВУХклассового селектора (
.unity-button.gm-plate-button:hover): одноклассовый проигрывает правилам темы Unity, и она дорисовывает прямоугольник под фигурой. - Скроллбар был темизирован тремя копиями правил по контейнерам (тело панели, грид инвентаря, консоль) — и список продажи в лавке, не попавший ни в один, рисовал светло-серый скроллбар темы. Свели к одному правилу на контрол; консоль перебивает его своими двухклассовыми.
- Правка не тронула единый размер диалога (
--gm-dialog-width/height): пустота в настройках — цена решения от 27.07 «меню, ESC и настройки — одно окно», а не дефект вёрстки.
Владелец правды: Assets/_Project/UI/Theme/tokens.primitives.uss (гарнитуры),
tokens.semantic.uss (роли голосов), components.uss (раздача ролей + секция пластины),
Assets/_Project/Scripts/UI/Components/PlateButton.cs.