Skip to content

Themes: Steam Deck themes look like their store screenshots; Shelf library layout - #2413

Merged
utkarshdalal merged 20 commits into
masterfrom
theme-screenshot-fidelity
Nov 13, 2026
Merged

utkarshdalal merged 20 commits into
masterfrom
theme-screenshot-fidelity

Conversation

@utkarshdalal

@utkarshdalal utkarshdalal commented Nov 13, 2026 •

Copy link
Copy Markdown
Owner

Description

Steam Deck (CSS Loader) themes did not look like their store screenshots in the app: a theme was reduced to a few app-wide values, theme fonts did not load, and the library did not resemble the Steam home the themes are drawn on. This PR closes most of that gap. Each theme was compared with its store screenshot on an AYN Odin 3.

Themes

  • Fonts: .woff and .woff2 theme fonts are converted to plain font files (adds the org.brotli:dec decoder). Fonts a theme names by https url are downloaded once when the theme is installed or switched on, https only and size-limited, never at app start. The upright regular face of a family is preferred.
  • Per-element styles: separate colors for row labels, descriptions, headings, subtitles, the selected tab, top bar text and footer text; top bar and footer styled separately with real transparency, border, glow, height and backdrop blur (adds the Haze library; blur needs API 32); switch track gradient, off track and handle colors; slider, button and focused-button styles; focus ring width and color, focused-row fill and underline, blink; menu and dialog corner radius, layered linear and radial fills, border, glow, opacity; icon corner radius; title and subtitle outlines; text size, weight, letter spacing and case; home artwork strength; sliding gradients; inverted footer glyphs.
  • Text on fills keeps the theme's color when it reads on the fill, else another theme color, else black or white. Off switches keep a minimum contrast with their row. Destructive buttons stay red.
  • Custom theme: the built-in Custom theme can set every value a Steam Deck theme can, in collapsible sections, with a font picker. Saved values from the earlier editor are migrated.
  • Spellings: theme text and code use American spellings.
  • Themes entry: the theme manager opens from a Themes item in the side menu and is removed from Settings.

Library

  • Shelf layout: a fourth library layout in the style of the Steam home shelf: the focused game's artwork behind the page, its title and playtime at the left, and a flat row of covers along the bottom. A recommended game, when present, is the first card; the most recently played game follows as a wide card and is selected when the library opens. The Shelf sorts by recently played unless a sort is picked while it is shown.
  • Themes and the Shelf: while a Steam Deck theme is on, the library uses the Shelf unless the user picks another layout; that pick is kept separately from the layout used without a theme.
  • Start-up: when the Steam sign-in completes, the home screen is updated in place instead of being replaced, so the library keeps its list, scroll position and focus. The first list is published once every local source has been read. The last recommendation is kept across starts and updated in place.

Cost without a theme

  • With no theme enabled, each themed draw site checks for a theme and runs the code it ran before. App start does one small file check; no theme is read or translated and no request is made.
  • The translated result of the enabled themes is saved and read back at start, so themes are not translated at every start. The class-name table is fetched only when an installed or updated theme uses names the saved table does not know; the daily refresh is removed.
  • gradle.properties gives the Kotlin compiler 4g: the app module needs about 2.5g of live heap to compile.

Known limits

  • Dropdown menus are not blurred. Settings row titles and button labels do not follow a theme's uppercase rule.
  • Steam screens with no counterpart in the app stay unthemed.
  • Not checked on a device: portrait rotation and touch fling on the Shelf, the newer Custom theme options, a game launch and exit on this build.

Recording

Not attached yet.

Type of Change

  • Bug fix
  • Performance / stability improvement
  • Compatibility improvements
  • Other (requires prior approval)

Checklist

  • If I have access to #code-changes, I have discussed this change there and it has been green-lighted. If I do not have access, I have still provided clear context in this PR. If I skip both, I accept that this change may face delays in review, may not be reviewed at all, or may be closed.
  • This change aligns with the current project scope (core functionality, stability, or performance). If not, it has been explicitly approved beforehand.
  • I have attached a recording of the change.
  • I have read and agree to the contribution guidelines in CONTRIBUTING.md.

Utkarsh Dalal added 2 commits November 13, 2026 16:25
… themes

Fonts shipped as .woff are converted to a plain font file when a theme is
resolved. The theme model gains separate top bar and footer styles, heading
and subtitle colours, switch, slider and button styles, a focus style, a menu
style and layered (linear and radial) fills, and the translator fills them
from the theme CSS.
… https

Top bar, footer, switches, sliders, buttons, focus, menus, dialogs and side
panels draw the theme's own style when one is set and the original code
otherwise. The built-in Custom theme can set every theme value, grouped in
sections, with a font picker. Fonts a theme names by https url are downloaded
once at install. At app start the theme folder is only loaded when a theme is
enabled.
@coderabbitai

coderabbitai Bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Explain Change →

Caution

Review failed

The pull request is closed.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

Utkarsh Dalal added 18 commits November 13, 2026 17:04
…all only

The translated result of the enabled themes is saved and read back at app
start, so no theme CSS is read or translated then. Disabled themes are
translated only for the theme manager. The class-name table is fetched when
an installed or updated theme uses names the saved table does not know; the
daily refresh is removed. Idle sound threads are stopped.
…ng gradients, wider UI coverage

WOFF2 theme fonts are decoded (adds the org.brotli decoder). Themes can set
text scale, weights, letter spacing and uppercase labels, the strength of the
home hero artwork, and sliding gradient fills. Pop-up dialogs, outlined
buttons, sliders, progress tracks and rows that draw their own focus take the
theme's style.
…nd themed bars

Text on a theme fill keeps the theme's color when it reads on the fill and
falls back to another theme color, then black or white. Off switches keep a
minimum contrast with their row, destructive buttons stay red, focused rows
in the system menu span the row. Themed top bars and footers blur what is
behind them when the theme asks for it (adds the Haze library). Sliding
gradients are drawn on switches, sliders, progress bars, panels and focus
underlines. A font download no longer changes the theme while a game runs.
… frame, hero art shows at start

The sliding fill is drawn at its stretched size so it pans, and its frame
loop starts when animations are enabled. The theme font is loaded before the
saved theme is published. With a themed hero, the carousel backdrop follows
the centered item once the list has loaded.
A fourth library layout: the focused game's artwork above, its title and
playtime at the left, and a flat row of covers along the bottom with a wide
first tile. It shares the carousel's pane. Themes that restyle the Steam home
shelf select it.
While a Steam Deck theme is on and no theme picks a layout, the library uses
the Shelf layout. A layout the user picks while themed is kept separately and
does not replace the layout they use without a theme.
The Shelf layout uses the recently played sort unless a sort is picked while
it is shown; that pick is kept for Shelf only. The wide tile is the first
library game, not a recommendation placed ahead of it.
…nts; Themes moves to the side menu

The translator reads the selected tab's fill and text, picks the upright
regular face of a font family, reads the settings page background, and
flattens a translucent accent over its base color. The theme manager opens
from a Themes item in the side menu and leaves Settings.
… is in place from the first list

Sign-in completion updates the Home screen in place instead of navigating to
a new one, so the library keeps its list, scroll and focus. The first list is
published once every local source has been read. The last recommendation is
kept across starts and replaced in place.
@utkarshdalal
utkarshdalal marked this pull request as ready for review November 13, 2026 17:09
@cubic-dev-ai

cubic-dev-ai Bot commented Nov 13, 2026

Copy link
Copy Markdown
Contributor

This PR has 11,137 reviewable changed lines after ignored/generated files are excluded, above this repository's 5,000-changed-line automatic review limit. The raw diff is 19,284 lines before ignored/generated files are excluded.

Most of the diff comes from:

  • app/src/main/java/app/gamenative/theme/ThemeTranslator.kt (~903 changed lines)
  • app/src/main/java/app/gamenative/ui/theme/Theme.kt (~612 changed lines)
  • app/src/main/java/app/gamenative/ui/theme/ThemedMenus.kt (~521 changed lines)
  • app/src/main/java/app/gamenative/theme/Woff2Decoder.kt (~476 changed lines)
  • app/src/main/java/app/gamenative/ui/screen/library/components/LibraryCarouselPane.kt (~435 changed lines)

Comment @cubic-dev-ai review this to review it anyway. If the largest files are generated or fixture data, add them to your ignored files in review settings or reviews.ignore.files in cubic.yaml. Later automatic reviews cover only subsequent changes. Request a full review to revisit earlier changes. You can also raise this limit in review settings.

@utkarshdalal utkarshdalal changed the title Themes: make Steam Deck themes look closer to their store screenshots Themes: Steam Deck themes look like their store screenshots; Shelf library layout Nov 13, 2026
@utkarshdalal
utkarshdalal merged commit 4f75807 into master Nov 13, 2026
3 checks passed
@utkarshdalal
utkarshdalal deleted the theme-screenshot-fidelity branch November 13, 2026 17:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant