feat(ui): per-app display-mode defaults (IndeeHub fullscreen) + gamepad plays media + node list scales

- Per-app default display mode: explicit user pick (remembered per app) ->
  app default -> last global -> panel; IndeeHub defaults to fullscreen.
- data-controller-primary: a media file card's gamepad-select clicks the
  card (audio -> bottom-bar player, video -> lightbox) instead of the
  card's download link.
- Discovered-nodes list scales with the viewport (max(14rem,45vh)) instead
  of cramming a long list into a fixed 224px box.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
archipelago
2026-07-23 15:31:02 -04:00
co-authored by Claude Fable 5
parent 960e41e164
commit 9f1daa0f8c
5 changed files with 37 additions and 7 deletions
@@ -364,6 +364,15 @@ export function useControllerNav(containerRef?: { value: HTMLElement | null }) {
e.preventDefault()
if (isContainer(activeEl)) {
// Container declares its own click as THE action (e.g. a media file
// card whose click plays it) — without this the a[href] fallback
// below hits the card's download link and gamepad-select downloads
// a song instead of playing it.
if (activeEl.hasAttribute('data-controller-primary')) {
playNavSound('action')
activeEl.click()
return
}
// Prioritised action: install button
if (activeEl.hasAttribute('data-controller-install')) {
const btn = activeEl.querySelector<HTMLButtonElement>('[data-controller-install-btn]:not([disabled])')