Решили: PlateButton заливается градиентом, когда задан второй цвет; рисуется ВЕЕРОМ из центра (центральная вершина плюс углы восьмиугольника). Одна раскладка вершин обслуживает оба типа: линейному градиенту цвет вершины даёт проекция на ось, радиальному — расстояние до центра. Заготовки (.gm-fill--down/up/left/right/radial) меняют только режим: цвета приходят ролями и у всех заготовок одни и те же.

Почему: Painter2D градиента не умеет вовсе — один fillColor на фигуру; USS градиентных функций не знает. Отвергнута альтернатива «пять наборов цветов под пять заготовок»: набор, размноженный по вариантам, расходится за месяц, а спрошено было ровно обратное — «цвета градиента одни и те же, различается лишь то, откуда он идёт и его тип».

Заодно пересмотрен бесплашечный вариант меню, проживший полдня. Числа рефов предупреждали: без плашки строку держит только кегль, поэтому он и уехал в потолок коридора. У плашечных рефов наоборот — строку держит плашка, а текст внутри мелкий (Guildrun 1.53% высоты экрана, AoW4 1.25% против наших 2.8%).

Сказано: «И я бы хотел все-таки под кнопками какие-то бэкграунды. Глянь в особенности стиль Guildrun. […] То что есть разные заготовленные градиенты - нам тоже такое надо. Т.е. цвета градиента одни и те же. различается лишь то, откуда он и идет и его тип (радиальынй и тп)» и «UI СЛИШКОМ гигантский» (04.08.2026, сессия ca460396).

Грабли:

  • Ключи интерфейса живут в коллекции UI, а ContentLocalization пишет в Content. Наш редакторный помощник существует для контента, и его SetValue завёл семь ключей ui.mainmenu.* не в ту таблицу. Признак — GetValue вернул «нет ключа» там, где греп по диску ключ показывал. Откат: RemoveEntry по всем таблицам плюс SharedData.RemoveKey, и только потом запись в UI.
  • ui.mainmenu.settings существует в ОБЕИХ коллекциях — и до моей правки тоже. Один ключ с двумя владельцами; какая таблица играет в рантайме, из этого не выводится. Разбор отложен, но факт зафиксирован.
  • Пустое EN-значение нельзя заполнять русским. Первый заход подставил в en русские подписи — логика «нет перевода, возьму что есть» тихо портит вторую локаль. Регистр чужого перевода поднимать можно, содержимое — нет.
  • Значения custom-свойств переживают смену псевдокласса: второй цвет сбрасывается ЯВНО, когда правило его не задаёт, иначе пластина тащит градиент из состояния, где он был, в состояние со сплошной заливкой.

Владелец правды: Assets/_Project/Scripts/UI/Components/PlateButton.cs (веер и режимы), блок «ЗАГОТОВКИ ЗАЛИВКИ» в components.uss, роли --gm-color-surface-*-far в tokens.semantic.uss.