Added
Hide "new" badgetoggle (per-shelf + global) suppresses the green "NEW" badge rendered on cards for recently added games (within the last 14 days, derived from the app'suser_added_ts).Hide compatibility iconstoggle (per-shelf + global) suppresses the Deck-compat overlay (verified / playable / unsupported) on cards.- Toggle
Hide non-Steam launcher badge(only shown when Hide compatibility icons is on and the NonSteamBadges plugin is installed) extends suppression to non-Steam apps. - "New game" detection: cards display a
NEWbadge for games added to the library within the last 14 days. Honors the per-shelf and global Hide "new" badge toggles. - New
isNewfilter item type — matches games added within the last 14 days (same window as the badge). Available as a standalone filter entry in shelf builders, independent from UI toggles. Docs page updated; i18n keys added across all 16 locales. [QA]Dev-only QA harness with threepnpmscripts (qa:first-run,qa:qam-error,qa:shelf-error) that build the plugin with a single dev-gated flag each (DS_QA_FORCE_FIRST_RUN/DS_QA_FORCE_QAM_ERROR/DS_QA_FORCE_SHELF_ERROR). Flags are compiled tofalsein release builds, so the hooks can never leak to users. Used to validate the FirstRunBanner, the QAMErrorBoundary, and the homePatch shelf-render fallback.[QA]Two additional QA scripts that inject a fixed 6-shelf fixture covering every shelf source type —filter updatePending,filter sort: recent,tab: installed,collection: favorite,filter installed + sort: metacritic, andfilter group (developer: FromSoftware) + sort: release_date:qa:all-shelves-hide-recents(forceshideRecents = true) andqa:all-shelves-show-recents(forceshideRecents = false). Implemented viaapplyQASettingsOverridein the settings store;saveSettingsis a no-op while the flag is active, so edits during QA cannot contaminate persisted state. Same dev-only gating as the other QA flags.[PERF]and[QA]PR title tags now trigger an automatic patch version bump in the release workflow (same behaviour as[FIX]/[ENHANCEMENT]). Surfaced in the PR template,CONTRIBUTING.mdtag table, and.github/workflows/bump.yml.- PR template reorganized: label checkboxes grouped so each group contains tags with the same bump effect (without naming the scope in the UI).
- Shelf-render crash protection in
homePatch: a ReactErrorBoundarywrapsHomeShelvesacross all mount paths (DOM bridge,createRoot, legacyReactDOM.render). If any shelf throws during render, the home mount is cleared and hidden instead of bubbling up and breaking the SteamOS home. Crash state is broadcast via a pub/sub so the QAM reacts in real time. - QAM
MountCrashBannerbelow the master toggle explaining why shelves are hidden, with a "reset crash state" button; banner appears only while a shelf-render crash is active. - Full-width "Reset all" button at the bottom of the QAM that opens a destructive
ConfirmModal. On confirm, wipes all shelves + settings and clears plugin-ownedlocalStoragekeys (ds-,ds_,deck-shelves-prefixes), leaving the plugin in first-run state. Full i18n coverage across all 16 locales.
Changed
- When a shelf-render crash is active, QAM toggles stay visible but become
disabled(grayed, non-interactive) instead of being hidden — keeps the UI layout stable and signals the inactive state. [PERF]Home mount-detection fallback intervals reduced from 10s → 2s in HomeInject.tsx and homePatch.tsx. Covers SteamOS SPA navigation (e.g. library → home) that does not firepopstate/hashchange— shelves now appear within ~2s instead of up to ~10s when the MutationObserver misses the route change.- When "Hide recents" is active, the first visible shelf is forced expanded (localStorage state is preserved) and its title-click collapse is disabled — ensures a focusable first row is always present since recents is hidden.
Fixed
sort: addedno longer mirrors native recents — reverted tort_purchased_time/user_added_ts/rt_store_asset_mtimeprecedence so "adicionados recentemente" reflects acquisition order, not play activity.- Shelf focus lost after collapse/expand —
toggleCollapsenow uses the Steam nav tree viafocusElement(with rAF retry) so the gamepad focus node is updated, surviving route transitions to recents/novidades and back. - D-pad UP/DOWN skipping shelves (landing on recents/novidades instead) — root cause was a
deck-shelves-layout-changeddispatch storm on every collapse/expand retry causing repeatedreparentNavTreeNodeschurn. Removed the dispatch; the existing MutationObserver on the mount already covers layout changes. - Focus hijacked on unrelated shelves when collapsing —
toggleCollapsenow only restores focus if.gpfocus/:focusis inside the shelf being toggled. Clicking a distant title no longer steals focus from the currently-focused shelf. - Featured card not picking native size on cold boot —
loadPersistedDimsnow ignores viewport fingerprint (card dims are intrinsic to Steam's design, viewport-invariant). CDP showed the cache was written withvw:1,vh:1during an early pre-layout tick and rejected every boot. Also guardpersistDimsso it no longer writes when vw/vh < 100. - Focus completely lost from shelves after multiple collapses —
reparentNavTreeNodeswas re-running on every MutationObserver callback and repeatedly splicing nav nodes across parents, which could orphan the currently-focused node during concurrent Steam remounts. Added a stability guard (lastReparentTarget): when our nodes are already parented under the last known-good vertical container and the container still has ≥2 children, the splice is skipped. Also skip when focus is currently inside our subtree, to avoid perturbing the tree mid-navigation.