# Legacy UI restoration The initial redesign was rejected. The implemented panel now uses the original `templates/base.html` CSS rules (only trailing whitespace normalized), the original Bootstrap 5.1.3 and Font Awesome Free 6.0.0 dependencies, and the original page structure. All assets, including the icon font and their licenses, are embedded in the executable. The reference templates and legacy directories are not modified. Preserved interactions: - Original login card and password input. - Horizontal 360px service columns, header controls, selected-team line and scrollable team list. - Primary circle selects upstream; clicking the rest of a team row toggles its replica state. Promoting B from primary A/replica B yields primary B/replica A. - Robot toggles automatic switching; open icon/header opens the service port; original switch starts/stops forwarding. - Four original connection counters; original checker colors and negative lost-flag chips; status/lost/name sorting. - Top strip represents the configured own-team `main_team_ip`, independently of primary selection. - Plus opens name/port/optional-IP dialog. Custom columns retain editable direct-IP input and delete control. The backend atomically resolves the IP, with no manual team-creation step. Small additions: keyboard-operable selectors, readable control labels, focus indicators, reduced-motion support, narrower-screen sizing, stale-data indication and a five-second stream watchdog. Clicking the service name opens advanced settings without replacing the main layout. Forms retain drafts during snapshot updates. Mutations use the latest route selection, wait for a server result, and refresh the snapshot. Snapshot/CSRF/session contracts remain in `docs/api.md`. The rejected diagnostic journal is removed from the panel, so initial review R4's incorrect journal slicing is no longer present. Backend events remain available through the snapshot API. R5 is addressed by the restored primary-promotion interaction. ## Verification pointers `scripts/legacy_ui_reference.py` renders the unmodified old templates with public loopback data and checks that their normalized CSS rules are still present. It never imports old `config.py`. Browser comparison uses the same viewport and bundled dependency versions. Computed styles matched for column width, typography, backgrounds, radii, header/stat padding and gaps. The intentional height change removes the old 8px overflow; a small mobile rule allows a column to fit a narrow viewport. Fresh browser/byte checks and final screenshots are recorded in `docs/verification.md`; `test-results/` holds local disposable artifacts and is git-ignored. UI controls were exercised against the real Rust server with isolated temporary state and loopback upstreams. No legacy game hosts were contacted.