Named button packs
Button chrome that is not the root buttons block: a file themes/<name>.json, and/or a same-named object inside themes/default.json. Same keys as buttons.
// themes/default.json (root objects)
"info_close_button": {
"min_width": 0,
"border_width": 0,
"corner_radius": 6,
"normal_bg": "#343a5280",
"hover_bg": "#5b6a82c0"
},
"locale_button": {
"min_width": 0,
"corner_radius": 6,
"padding_left": 10,
"padding_right": 10
},
"locale_button_active": {
"min_width": 0,
"normal_bg": "#c4693ad0",
"font_color": "#ffffff"
}
Usually you need
| Pack id | Role |
|---|---|
info_close_button | Default chrome close control when button_style is empty |
locale_button | Inactive locale chip |
locale_button_active | Active locale chip |
icon_close_button / hud_icon_button / hud_menu_button | Optional pack files for icon chrome / HUD glyph buttons |
How resolve works
- Start from root
buttons(unless the call skips it). - Load
themes/<prefix>.jsonif present. - Else merge root object
default.json[<prefix>]if present. - Merge inline
stylelast.
Locale switcher (screens)
{
"bind": "locale",
"label": "Language",
"label_key": "screen.settings.language",
"style": "locale_button",
"active_style": "locale_button_active"
}
Built from game.json → i18n.locales. Active locale uses active_style and is non-interactive.
Chrome close
Screen chrome with empty button_style uses info_close_button. Authored screens often set "button_style": "icon_close_button" (pack file) instead.
Keys
Identical to buttons. Styling model · Localization · Layer: chrome.