• Shell-mode v2: full controller overhaul + Settings as a page
    release / Build Windows .zip (push) Canceled after 11m57s

    LastSkywalker released this 2026-05-31 22:20:26 +03:00 | 37 commits to main since this release

    The v0.9.x shell layout grew organically and parts of the UI were
    unreachable from a controller (text inputs aside). This is a complete
    pass: every surface on the home screen reachable from the gamepad,
    power menu gets Restart, devices collapsed into one chooser, settings
    becomes a real page on the animated blob background, modals share
    the PowerMenu translucent-tile look.

    Controller layout (ShellApp.tsx):

    • A launch active tile OR fire focused corner icon
    • Y open Settings (full-screen page)
    • X open Game Details drawer
    • Start open Power menu (lock / sleep / reboot / exit)
    • Back open Devices chooser (monitor / audio / Bluetooth)
    • B close overlay; or drop focus carousel <- icons
    • d-pad up/down rotates focus between carousel and corner icons;
      within the icons row left/right walks across them. Keyboard
      mirrors all of it (i/p/d/, shortcuts).

    Power menu (PowerMenu.tsx):

    • Drops "Сменить монитор" (lives in Devices chooser now).
    • Adds Reboot -> new power.Reboot() = shutdown.exe /r /t 0 (proper
      WM_QUERYENDSESSION cascade for apps). Wrapped in confirmModal
      because reboot is irreversible.
    • App.RebootWorkstation restores the multi-monitor layout BEFORE
      rebooting so login lands on the original desktop.

    Devices chooser (new shell/DevicesMenu.tsx):

    • PowerMenu-shaped modal: Monitor / Audio / Bluetooth. Delegates
      to existing pickers. Bluetooth tile is a stub with "v0.10.1"
      copy and an info toast.

    Corner icons (CornerIcons.tsx):

    • 🖥 + 🎧 collapsed into one 🎛 (devices). Standalone 🛑 Exit
      removed - Exit now only inside the power menu. Row: 🔊 / 🎛 / ⛁
      / ⚙ / ⏻. Each icon gets a focused-state ring driven by
      cornerFocus in ShellApp.

    Settings as a shell page (new shell/ShellSettingsPage.tsx):

    • Was wrapped in a in v0.9 (a small dark card the gamepad
      couldn't drive). Now a full-screen page on the animated blob
      background (ShellBackground game={null}). Header strip with
      Close button.
    • Roving focus via d-pad up/down: collect every focusable in DOM
      order, .focus() the next/prev, scroll into view. A presses
      .click() on the focused control (skipped for text/number/
      select - those want the touchpad / keyboard).
    • B / Esc / Y close back to the carousel.
    • SettingsPage now takes optional onOpenMonitorPicker /
      onOpenAudioPicker props - shell wires them to the real pickers;
      normal desktop leaves them undefined and the Monitor button
      greys out with a hint to use Windows display settings.

    Modal style unification (Modal.tsx):

    • Backdrop bg-black/80 + backdrop-blur-md (was /60 + blur-sm) to
      match PowerMenu / DevicesMenu. Body becomes a translucent
      rounded-2xl tile with border-white/10 bg-white/5. New size prop
      (md..6xl). Backups modal uses 6xl so Archive column fits.

    Ambient softer (sound.ts):

    • v0.9.3 psstyle pad had a C3 root that read as "давящий". Drops
      the root; voicing now E3-G3-B3-D4 (upper structure of Cmaj9 -
      bright, airy, no low-end weight). Master 0.014 -> 0.011.
      subtle voiced up to G3+D4; retro voiced up an octave to
      C4-E4-G4.

    Themed form controls (style.css):

    • input[type=checkbox].gs-check / input[type=radio].gs-radio
      zero out the native chrome, paint a card-coloured square /
      circle, fill with accent when checked. Applied across Settings.

    Drawer touch-ups (GameDrawer.tsx):

    • overflow-x: hidden on the scroll container so long file paths
      don't make the whole drawer scroll sideways (the horizontal
      scrollbar in v0.9 screenshots).
    • Sessions and snapshot rows get flex-wrap so chips wrap on
      narrow widths instead of pushing duration off the edge.
    • d-pad up/down scrolls by 180 px, B closes; per-row activation
      via gamepad is deferred (mouse / Tab still work).

    Backups modal wider (ShellApp.tsx + Modal.tsx):

    • size="6xl" so the Archive / Game / When columns don't get
      chopped on narrow drawers.

    Bluetooth picker deferred to v0.10.1 (item #28 in the brief).
    DevicesMenu tile + Settings tile are already placeholders; the
    picker drops in behind them.

    ADR: .claude/decisions/0025-shell-controller-overhaul-and-settings-page.md

    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com

    Downloads