[Feat] Add a new Fullscreen "Console-like" Mode for Joystick navigation - #5490
Merged
Conversation
flavioislima
marked this pull request as ready for review
April 18, 2026 21:13
flavioislima
requested review from
a team,
BananaWorks07,
CommandMC,
arielj and
biliesilva
and removed request for
a team
April 18, 2026 21:13
Cancel hints and launching label were added to gamepage.json but the LaunchOverlay reads them via the default namespace, so they were dead keys. Move them to translation.json to match the namespace used.
The map was an identity function over Runner values, so every usage collapses to a direct g.runner comparison. Tighten StoreKey to `Runner | 'all'` and use g.runner directly.
Button indices were duplicated across index.tsx (BTN_BACK, BTN_L1, etc.) and UpdateNotice (DISMISS_BUTTON_INDEX === 1). Move them to controller.ts so both read from the same source.
LaunchOverlay and UpdateNotice both rendered the same prefix/kbd/suffix hint with identical gamepadConnected-to-Esc fallback. Move it into a tiny BackHint component so the shape is declared once.
consoleChip and consoleQuitButton both had the same :disabled rule (cursor + opacity). Extract it into a %consoleButtonDisabled placeholder.
The footer wraps a single child (ControllerHints), so flex-direction, align-items, gap and text-align were all no-ops. Keep only the centering it actually needs.
justify-content: center on the flex container already centers the single title child; text-align was a no-op.
The background's blur(3px)/saturate(0.6) stacked with the overlay's backdrop-filter: blur(10px) over a 70% opaque fill. Keep just the opacity fade on the background and let the overlay blur the rest.
The toggle has nothing to do with the system tray. Extract it into its own StartInConsoleMode component and mount it directly in the General settings section.
L1/R1 already cycle the store filter; clicking the analog sticks to do the same thing is easy to trigger by accident while navigating.
The i18next parser only scans calls on a plain \`t\` identifier and doesn't follow the renamed \`tGame\` from a second useTranslation hook, so every run was moving console.cancel.* and console.launching back into gamepage.json. Use a single \`t\` with explicit \`gamepage:\` namespace prefixes for status keys, matching the getStatusLabel convention used elsewhere in the codebase.
…uncher into feat/console_mode
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
github_upload.mp4
Summary
Adds a new Console Mode — a fullscreen, controller-friendly UI for launching games with a gamepad, inspired by console/big-picture interfaces.
ConsoleModescreen (src/frontend/screens/ConsoleMode/) with game grid, filtering, and launch flowsrc/backend/constants/environment.ts,src/backend/main.ts)Test plan