# Editing the mission menu The menu has main sections across the top and a sidebar for each section's pages. Design sources live here; the game loads the generated native layouts in `addons/core/UI/layouts/ERR`. Their existing resource GUIDs stay unchanged. | Change | Edit | | --- | --- | | Colors, font, text sizes, button state colors | `theme.json` | | Main sections, sidebar grouping, order and labels | `navigation.json` | | A page's controls, wording and spacing | `pages/.layout.in` | | Window, title, connection line and feedback area | `shell.layout.in` | | Repeated item/mod rows and value controls | `components/*.layout.in` | | Which layout resources are built | `layouts.json` | After editing, run from the repository root: ```sh python3 tools/build_admin_menu.py python3 tools/build_admin_menu.py --check python3 -m unittest discover -s tests -p test_admin_menu_sources.py python3 tests/test_admin_menu.py ``` Commit both the design sources and generated files. Workbench can open the generated `.layout` resources for inspection. Make lasting edits in these sources: the builder replaces generated output. `tools/check.py` and Drone reject stale output, missing includes, invalid colors and broken navigation membership. The generated layout initially shows only Mission / General, its sidebar and its selection indicators, so opening it in Workbench does not stack every page. The builder supplies each page's `{{VISIBLE_}}` token from its stable navigation key. Runtime navigation overrides these initial visibility values. To inspect another page in the layout editor, hide `SettingsPage` and `Sidebar_Mission`, then enable **Is Visible** on the desired page and sidebar. Do not save these temporary preview changes over the generated layout. Theme tokens use `{{COLOR_TEXT}}`, `{{SIZE_BODY}}`, and `{{FONT}}`. Colors in native layouts are four RGBA numbers from 0 to 1. Runtime button colors use eight-digit ARGB hex values. Includes use `{{include:pages/SettingsPage.layout.in}}` and resolve relative to this directory. Includes cannot escape this directory or form cycles. Keep page IDs stable in `navigation.json`: existing scripts and native tests use them. Reorder a group's `pages` list to reorder its sidebar; reorder `groups` to reorder main tabs. Each page belongs to exactly one group, whose first page opens when its main tab is clicked. The shell currently accommodates up to eight main sections and eight sidebar entries per section. Navigation button geometry lives in the presentation builder's `navigation()` function; page geometry stays in its layout fragment. Main tabs occupy the top strip; sidebar controls stay left of the full-width content area. To add a page, append a stable ID/key/widget/button/label entry, add its key to a group, create its page fragment, and include it in the shell. Give controls unique widget names. Changing a widget name also requires updating its code bindings. ## Where behavior lives All script paths below are under `addons/core/Scripts/Game/ERR/00_Core/`. | Responsibility | File | | --- | --- | | Field keys, display formatting, capability gates, command mapping | `ERR_AdminMenuFields.c` | | Page IDs and navigation data (generated) | `ERR_AdminMenuPages.c` | | Page/sidebar visibility and selected navigation | `ERR_AdminMenuView.c` | | Runtime palette (generated) | `ERR_MenuTheme.c` | | Selected/action/status button styling | `ERR_SelectionStyle.c` | | Dialog lifetime, polling, drafts, snapshots and command submission | `ERR_AdminMenu.c` | | Item, terrain, faction, speech and backpack behavior | Their existing `*Menu.c` modules | | Authorization, validation and persistence | `ERR_AdminSession.c`, `ERR_AdminService.c`, `ERR_Settings.c` | Use `ERR_AdminPage.SARKA` or another named page when linking from code. Visual changes do not belong in settings persistence or mission gameplay services. An editable field still needs an authorized command and validated setting; a new layout control alone does not grant permission or create a setting.