Fixes
Navigation
- Series grid vertical nav: Fixed bug where pressing Up from row 3 jumped to the top-left card instead of the row above — Series page was hitting the wrong code path (item page handler) which lacked virtualizer recovery
- Detail page ghost focus: Fixed invisible Disconnect button in the off-screen side drawer stealing focus when pressing Down from Play/Stream button, causing accidental logout on Enter — hardcoded
tabindex="0"changed to conditional, plusisVisible()now rejects off-screen elements - Side drawer/modal focus indicator: Focused item now shows a green left accent border, clearly distinct from the gray "current page" highlight
- Switch Server/User auto-focus: Screen now auto-focuses the first server in the list
Performance
- 3x faster startup: Release build (~9s vs ~27s debug) — disabling
debuggableenables ART ahead-of-time compilation on low-power ATV hardware
Code Audit Fixes (from external review of 53 changed files)
- C1 — Background audio protection:
onStopnow checks if audio is playing before killing process — prevents killing background playback when pressing Home - C2 — Store reference crash: Fixed ReferenceError when pressing Escape with overlay open (promoted store to module-level variable)
- I1 — Duplicate download prevention: Download handler now checks
!isLocal && !localEpisodebefore allowing download - I6 — Double navigation: Removed conflicting
@keydown.enter.nativefrom nuxt-link in SideDrawer - I9 — Double focus ring: Generic focus rule now excludes playlist cards to prevent double outline
- M1 — Dead code removal: Removed tautological ternary in tv-navigation.js
- Nav — Scroll-to-top race: Main→Main navigation now fires scroll-to-top twice (200ms + 800ms) to beat LazyBookshelf scroll restore