82 KiB
UX audit: system surfaces (audit:system)
Scope: everything a Frame user touches to run the device rather than to browse games:
- Steam Settings: all 24
/settings/*pages plus Controller › Advanced, their dialogs and dropdown menus; - SteamVR Settings (the
system.settingspage drawn byvr:systemui), all 8 sections; - the dashboard bar (dock) and its system popups: Playspace Menu, Streaming Status, the Steam tab menu, tooltips;
- Quick Access (QAM), every tab: Notifications, Quick Settings, Performance, Battery Info, Help;
- the Power menu and its confirmations;
- the volume HUD;
- battery and status indicators wherever they appear;
- the notification list and toasts (Steam's and SteamVR's).
Overlap with docs/phase2/audit/shell-nav.md (window chrome, search, main menu, context menus, toasts, footer legend) is kept short and cross-referenced as SN §x. The "+ › Launch Program" list belongs to the launcher/library audit and appears here only as a bar function.
Audited live on 2026-10-07 (Steam client build 1791328779, SteamVR 2.18.2, web build of 2026-09-30) with the Phase 1 theme on. Stock looks come from the Phase 1 before-shots. Inputs: docs/inventory/settings.md, bar.md, hud.md, steamvr.md, shell.md, social.md §10, docs/coverage/settings.md and hud.md, the research in docs/phase2/research/ (cited as VR §x for visionos.md, REF for references.md, MO §x for liquid-glass-motion.md), and the visionOS references docs/refs/visionos/3.png (Control Center) and 8.webp (Settings).
Two capability studies landed while this was written: docs/phase2/capabilities/spatial.md (T4/T5, cited as SP) and steam-react.md (T3, cited as SR). Their answers are folded into §0.3 and §C. §C names the capability question each proposal still depends on (CS1–CS12, listed at the end, with what SP/SR already settle).
0. Evidence and units
0.1 Shots taken for this audit (shots/, 1.5x, transparent = room)
| file | what it shows |
|---|---|
p2_sys_bar_on.png |
the dashboard bar today: Steam tab, +, Playspace / Room View (on) / Streaming, clock and status, avatar |
p2_sys_qam_settings_on.png |
QAM › Quick Settings (opens here): 4 sliders visible, "Other" cut off at the fold |
p2_sys_qam_notifications_on.png |
QAM › Notifications, empty state |
p2_sys_qam_performance_on.png |
QAM › Performance, top of a 3-screen scroll |
p2_sys_qam_batteryinfo_on.png |
QAM › Battery Info: headset "Full", right controller 21 % with a yellow "!" |
p2_sys_qam_help_on.png |
QAM › Help: 4 full-width buttons |
p2_sys_set_system_on.png |
/settings/system, top |
p2_sys_set_audio_on.png |
/settings/audio: two full-width sliders |
p2_sys_set_notif_matrix_on.png |
/settings/notifications scrolled to the Email / Toast / Mobile / Feed checkbox matrix |
p2_sys_set_storage_on.png |
/settings/storage: drive tabs, usage bar, virtualized app list |
p2_sys_set_focusrow_on.png |
/settings/power (the focus call did not draw a focus state while the navigation source was the laser; used for layout only) |
Reused Phase 1 shots: every set_*.png (stock) and set_*_after.png, set_dropdown_open.png, set_dropdown_rich.png, set_dlg_*.png, set_focus_*.png; bar_*_before/after.png (QAM tabs, Playspace, Streaming, tab menus, frame menu, tooltip); hud_volume_*, hud_toast_*; vr_settings_before/after.png, vr_sys_*; p2_audit_power_off/on.png from SN.
0.2 Live measurements (re-runnable by any agent)
Three read-only sweeps were saved under docs/phase2/audit/system-measure/:
| script | what it returns | how to run |
|---|---|---|
settings_sweep.js |
for each settings route: section headers, every field row (label, control type, control size, row height, disabled/clickable), focusable count, scroll height, font sizes. Navigation only; returns to the starting route | python glass.py js "$(cat docs/phase2/audit/system-measure/settings_sweep.js)(['/settings/system', …])" (≈1.5 s per page) |
qam_sweep.js |
opens Quick Access, walks all five tabs, lists headers and field rows with sizes. Never operates a control; the locked step closes the popup | python glass.py js "$(cat docs/phase2/audit/system-measure/qam_sweep.js)" |
vrsettings_sweep.js |
switches the Steam frame to SteamVR's settings page (what frame menu › VR Settings does), clicks each sidebar section (navigation only), lists every setting with control type and size, returns to the first section and switches the frame back (safety revert at 14 s) | Hold the Steam lab lock first, exactly as inventory/steamvr.md §2.8 prescribes, then python glass.py js "$(cat …/vrsettings_sweep.js)" --in vr:systemui. It printed restored activePage=3 (prev 3) |
The bar inventory's OPEN snippet fakes a mouseenter on the bar button so the popup stays open. The locked step closes the popup but not the hover, so a "Quick Access Menu" tooltip stays up under the user's bar until a mouseleave is sent. qam_sweep.js now sends it; after any OPEN-based shot, run the bar inventory's CLEANUP snippet (bar.md §0.3) or a mouseleave on your own button. After this audit, two tooltips from other steps were still registered ("Steam", "Launch Program"); they were left for their owners.
Totals from the settings sweep: 232 field rows and 629 focusables on 25 pages (24 sidebar pages plus Controller › Advanced). Row heights: 112 rows of 64 px, 75 of 46 px, 28 of 47 px, 9 of 44 px, 8 others. Controls: 88 toggles, 45 buttons, 30 dropdowns, 27 read-only value rows, 20 checkbox rows (with 1–4 boxes each), 12 clickable list rows, 8 text inputs, 2 sliders, 2 segmented groups, 3 radio cards, 2 drive tabs.
Gamepad traversal was verified live in Steam Settings with L.pad (§A.1.2). It could not be exercised inside Quick Access or the bar: a QAM opened by a laser click holds no .gpfocus in any window, and giving the bar gamepad focus (View button) would take the user's input focus. Those paths come from the inventories and Steam's source.
0.3 Physical scale of each surface
Derived in SN §0.2 unless marked. "Body" is visionOS body text (17 pt ≈ 0.70°); "target" is the visionOS 60 pt minimum (≈ 2.5°).
| surface | ° per CSS px | 2.5° target in px | 0.70° body text in px | source |
|---|---|---|---|---|
| main window (Steam Settings, Power menu) | 0.031 | 81 | 23 | NATIVE.md |
| bar and its popups (QAM, Playspace, Streaming, tab menus) | 0.037 | 67 | 19 | 0.847 mm/px, 0.13 m nearer than the window. The QAM and other bar popups are child overlays of the bar; same distance assumed |
| other Steam popups (frame menu, tooltip, toasts) | 0.034 | 74 | 21 | SN §0.2. Toast placement is SteamVR's; same scale assumed |
| volume HUD | ≈ 0.059 [inferred] | ≈ 42 | ≈ 12 | head-locked popup: 1.53 mm per texture px × DPR 1.5 × popup scale 0.4 = 0.92 mm/px at 0.89 m (offset y −0.4, z −0.8 m) |
| SteamVR Settings page | ≈ 0.021 [inferred] | ≈ 118 | ≈ 33 | 1858 px panel shown in the same dashboard frame as Steam's 0.98 m window. Confirm with one hvgrab capture |
The window is user-resizable. SP §1.1 read a resize factor of r = 0.863 on the device today (window 0.850 m wide instead of 0.984 m). The numbers in this audit use the brief's default (r = 1). At today's size every main-window angle (Steam Settings, Power menu) is a further 14 % smaller: a settings toggle is 0.59° tall, not 0.68°. Bar and popup angles do not depend on r.
0.4 What could not be exercised
- Notification list with items, real toasts, the low-battery banner (
%{DashboardBar>LowBattery}): no safe trigger. Mapped from source (Steam module 96144 for the QAM list) and from the Phase 1 mock. - Volume HUD drag and mute glyph: needs a volume change.
- QAM and bar gamepad traversal: see §0.2.
- Settings values: never changed. Expanded states that need a value change (Downloads bandwidth limit, schedule times, Remote Play advanced options) are listed as conditional.
- SteamVR Settings modals (dropdown popovers, Per-Application Video Settings, Edit Chaperone Appearance, Choose Startup Overlay Apps, Manage Add-Ons, Thumbstick Settings, Test Controller): one click from a setting or a tool, so not opened.
A. Function list
"Laser" = controller laser (:hover, laser focus). "Gamepad" = Steam's FocusNavController (.gpfocus) or SteamVR's own focus where stated. — = no path today. Every row must stay reachable both ways after the redesign; a row that is "—" for gamepad today may gain a path but must not lose its laser path.
A.1 Steam Settings (surface main, /settings/*)
A.1.1 How settings are reached
| from | laser | gamepad |
|---|---|---|
VR main menu (frame.menu) › Steam Settings |
click (menu visible only with the laser, SN A.3) | D-pad Left at a page edge or B at the window root, then Up/Down + A |
| Bar › Steam tab hover menu › Steam Settings | hover the tab, click | bar focus (View), Steam tab (whether focus opens the menu is unverified, SN A.3 N4) |
| QAM rows that lead into settings (Wi-Fi network row, Bluetooth "Add Device"; targets not exercised) | click | inside the QAM: D-pad + A (unverified, §0.4) |
A.1.2 Skeleton interactions (every page)
| # | function | laser | gamepad (verified with L.pad unless noted) |
|---|---|---|---|
| S1 | Choose a page | click a sidebar row (256 × 42 px, 24 rows in a list that scrolls: 1115 px of content in 678 px) | D-pad Up/Down in the sidebar. Selection follows focus: each step loads that page at once (/settings/power → down → /settings/audio → down → /settings/controller/...), each with the 320 ms page transition |
| S2 | Enter the page | click any control | D-pad Right from the sidebar lands on the first row |
| S3 | Move between rows | point | D-pad Up/Down. Focus lands on the control inside a row (the dropdown button, the toggle), and the row highlights through .gpfocuswithin |
| S4 | Return to the sidebar | click it | D-pad Left from a row (verified), or B |
| S5 | Operate a toggle | click the toggle (38 × 22 px); the whole row also carries an onClick handler, so the row is probably a target too (not clicked: it would change a value) |
A on the focused toggle |
| S6 | Choose a dropdown value | click the button (250 × 40 px) → a centred gamepad context menu with a trailing Cancel (§A.1.4) | A, then Up/Down + A; B cancels |
| S7 | Adjust a slider | drag or click the 6 px track / 24 px knob | focus, then Left/Right steps the value; the footer shows "B Done" while a slider is focused |
| S8 | Press a button | click | A |
| S9 | Edit text | click → VR keyboard (keyboard surface) |
A → keyboard |
| S10 | Segmented choice | click a segment (309 × 32 px) | D-pad Left/Right + A (FocusRing shown) |
| S11 | Checkbox | click the 22 × 22 px box | D-pad across the four columns + A (FocusRing shown) |
| S12 | Explainer ("Press [Y] for more info", Display) | footer legend "Y" only (SN A.4: the legend is the laser's only route) | Y |
| S13 | Item actions on Storage app rows (Uninstall, Move Content) | footer legends only | X / Y |
| S14 | Scroll a long page | wheel/drag in the page scroller | focus moves scroll the page (scroll-padding 250/60 px) |
| S15 | Leave settings | Back, or any navigation | B from the sidebar |
A.1.3 Pages, controls and side-effect actions
Counts from settings_sweep.js. "Rows" = field rows; "foc" = focusables in the page. [x] = performs an action (never pressed during the audit). The full row-by-row list is in Appendix 1.
| page | rows / foc / height | content | dialogs and sub-pages | actions [x] |
|---|---|---|---|---|
| System | 46 / 68 / 3335 px (4.6 screens) | Language; Updates; Beta channels (OS, Steam client); 24-hour clock, Timezone (rich dropdown, 96 px row), Desktop Mode on startup, Developer Mode; Crash reports (1 toggle + 6 disabled); About (8 info rows + Hostname); SteamVR (3 info); Steam (4 info + Licences); Hardware (10 info); Advanced (4) | Hostname rename (Cancel / Change & Restart); Timezone menu (64 options) | Apply update, Run Diagnostics, Create Report, Run maintenance, Factory Reset, Change & Restart |
| Internet | 8 / 14 / 809 | Wi-Fi toggle; connected networks; networks found; Other network…; Offline Mode; HTTP Proxy; Delete Web Browser Data | network details (Disconnect), proxy, SSID/password form | Enter Offline Mode, Delete, Disconnect, connect |
| Storage | — / 55 / 720 | drive tabs (2, 238 × 50 px), usage bar + legend, sort dropdown, virtualized app list (58 px rows) | selection mode | Uninstall, Move Content (footer X/Y) |
| Bluetooth | 8 / 12 / 720 | Bluetooth toggle, Show all devices; paired devices (1 connected, 5 greyed); "Searching for devices…" | — | pair, connect, disconnect, forget |
| Display | 1 / 3 / 720 | Maximum Game Resolution (dropdown) | explainer (Y) | — |
| Power | 5 / 11 / 720 | Battery Percentage ("Show battery percentage on dashboard bar", off on this device); dim/sleep timeouts on battery and plugged in (4 dropdowns) | — | — |
| Audio | 7 / 17 / 802 | output slider, output device, Spatialization; Apps (empty); mic slider, input device; UI sounds | — | Reset audio settings |
| Controller | 3 / 8 / 720 | Steam Frame Controllers › Details; Add Controller; Show Advanced Settings | Controller › Advanced sub-page (own back button): idle shutdown dropdown, Desktop Layout Edit (configurator), firmware Start | Add Controller (pairing), firmware Start |
| Keyboard | 15 / 41 / 1299 | keyboard theme + preview button, Points Shop link, haptics, initial location ×2; active keyboards (Edit); 8 Quick Chat text inputs | layouts dialog (tall, scrolls) | — |
| Accessibility | 4 / 9 / 720 | High Contrast, Reduce Motion, Color Filter, Mono Audio | — | — |
| Security | 2 / 4 / 720 | lock-screen description, "On system wake and power up" | — | — |
| Notifications | 31 / 144 / 2512 | toast policy dropdown, toast sound; 4 client + 4 friend rows with two toggles each (Show Toast / Play Sound); "Flash window" segmented; 5 checkbox-matrix sections (Email / Toast / Mobile / Feed, sticky column headers); email opt-out | — | — |
| Friends & Chat | 16 / 38 / 1231 | 9 friends-list toggles (first embeds a preview friend), 7 chat toggles, Chat Filtering Manage (web), Chat Font Size segmented | — | — |
| Downloads | 8 / 20 / 887 | region, speed limit, bits/s, schedule auto-updates, during gameplay, while streaming, LAN transfers, transfer audience | conditional bandwidth and time pickers | — |
| Cloud, In Game, Compatibility | 2 each | Steam Cloud, screenshot management; screenshot UI, Steam Networking; default compatibility tool, show all tools | — | — |
| Family | 0 / 3 | text, Steam Families link, Try Steam Families (primary) | — | create/join family |
| Remote Play | 13 / 32 / 1372 | enable; host rows (Connect), Pair Steam Link; direct connection, PIN; advanced host/client; streaming adapter (enable, management, Unpair, connected host, advanced Wi-Fi); FAQ | Set PIN | Connect, Pair, Unpair |
| Game Recording | 8 + 3 cards / 24 / 1193 | recording mode radio cards (73–105 px tall); FAQ; controller shortcuts; quality (dialog), frame rate, max height; record mic; record audio from (disabled) | Recording Quality dialog | Set shortcut |
| Home | 5 / 10 / 720 | Big Art Mode, personalized store, What's New filter, hidden games (Manage → Library), instructions row | — | — |
| Library | 3 / 7 / 720 | Low Performance Mode, Deck compatibility info, Add game | Add game (product code) | Confirm |
| Store | 7 / 15 / 720 | 7 "Manage" buttons that open store web pages | web pages | — |
| Developer | 33 / 67 / 2569 | profiling, dev-kit pairing, Steam Play, Wi-Fi, 19 miscellaneous rows (composite, colour, Mura, SD format, console, browser composers, password, HDR, hardware updates), Steam Input (3) | — | Pair new host, Speaker Test, Re-arm Mura, Format SD, Clear All, Open console, Change User Password, Update all devices |
A.1.4 Shared primitives inside settings
| primitive | size today (CSS px) | laser | gamepad |
|---|---|---|---|
| sidebar row | 256 × 42 (scale 1.1 when active/focused) | click | Up/Down (selection follows focus) |
| field row | 952 wide; 46 (label only), 64 (with description or 40 px control), 47 (info), 80–96 (two-line or rich) | row click on toggle rows (probable) | highlight via gpfocuswithin |
| toggle | 38 × 22 | click | A |
| dropdown button | 250 × 40 (rich: 250 × 72) | click | A |
| dropdown menu | centred sheet, rows 48 px (rich 80 px), min 280 px wide, ends with Cancel | click | Up/Down, A, B |
| button | 160–331 × 40 | click | A |
| slider | 896 × 24 control, 6 px track, 24 px knob | drag | Left/Right |
| text input | 250 × 40 | click → keyboard | A → keyboard |
| segmented | 309 × 32 per segment | click | Left/Right + A |
| checkbox | 22 × 22, columns ≈ 60 px apart | click | D-pad + A |
| radio card | 952 × 73–105 | click | Up/Down + A |
| modal dialog | 660 px card, buttons ≈ 278 × 40 | click; click outside = cancel | Left/Right, A, B |
A.2 SteamVR Settings (vr:systemui, frame page system.settings)
Reached from VR main menu › VR Settings or the Steam tab menu › VR Settings. Both switch the Steam dashboard frame to SteamVR's page, so Steam's window disappears while it is shown. Laser only: SteamVR shows "USE LASER MOUSE TO INTERACT" under the window and draws no gamepad focus. Leaving it: pick a Steam item from the main menu or the Steam tab.
Layout: a 1858 × 1045 px panel; a 416 px sidebar with 8 section rows (416 × 74 px) and an Advanced Settings Hide | Show segmented control at its foot (currently Show); a 1442 px page.
| section | settings (control) — ADV = shown only with Advanced Settings: Show |
|---|---|
| General | Refresh Rate (7 circles, 72–144 Hz, 85 px), Display Brightness (slider, value on the knob), Motion Smoothing (Off/On), Notifications (Off/On); ADV: IPD HUD, Eye Tracking, Dominant Eye (dropdown), Track Dominant Eye Only |
| Play Area | Chaperone: Edit Chaperone Appearance (button → editor); Environment: Environment Style (picker, 919 px tall block), Content-Aware Aurora Color, Content-Aware Camera Tint; Reset Page to Default |
| Dashboard | Laser Pointer Length (slider), Grab Handle Acceleration (slider); ADV: Dim Game When Dashboard Visible, Allow App Quitting From Dashboard, Show VR Settings (hides the VR Settings menu entry when Off), Present Non-VR Applications on Theater Screen, Allow Undocked Dashboard Overlay Interaction, Theater Curvature, Theater Alignment, Keyboard Privacy |
| Controllers | Show Binding on Controllers, Manage Controller Bindings (→ vr:controllerbindingui), Edit Thumbstick Settings, Test Controller, Debug Legacy Input, Input Debugger; ADV: Show Binding UI |
| Video | Refresh Rate, Display Brightness, Motion Smoothing (the same three as General), Fade To Grid on App Hang, Per-Application Video Settings (app picker → resolution, FOV, refresh override, frame limit, throttling, prediction, world scale), Foveated Sharpening; ADV: Advanced Supersample Filtering, Overlay Render Quality, Pause VR When Headset Is Idle; Reset Page to Default |
| Camera | Room View (Off/On), Anti-Flicker (3-way), Dynamic Resolution (gaze-based), Room View Style (dropdown); Reset Page to Default |
| Startup / Shutdown | Choose Startup Overlay Apps (0), Manage Add-Ons (1 disabled), Turn Off Displays After, Turn Off Controllers After; Reset Page to Default |
| Developer | Performance assessment overlay and textures; reprojection depth and motion vectors; smooth spectator view, input-binding debugging, global input from overlays, Arcade Mode; Quick Calibrate, Chaperone bubble, Chaperone System, Record Tracking Data; version info (3 rows) |
Controls: radio circles, sliders with the value on the knob, Off/On segmented pills (.SegmentedControlGroup::after sliding thumb), dropdowns (popover inside the panel), full-width ALL-CAPS buttons, purple fills for Advanced controls. Every row: label 24 px, control 499 × 64 px.
A.3 Dashboard bar (surface bar, 1200 × 80 px window)
Live today: Steam tab; no app tabs; +; three small buttons; Quick Access; avatar (bar_focus_all_after.png shows two extra tabs that come and go with open windows).
| # | function | laser | gamepad | size (px → °, bar 0.037°/px) |
|---|---|---|---|---|
| B1 | Select the Steam frame | click the Steam tab | View ("Cycle View") to the bar, Left/Right, A | 80 × 80 → 2.96° |
| B2 | Steam tab menu: Home, Library, Store, Friends & Chat, Media, Downloads, (Console), Steam Settings, VR Settings, Power | hover the tab (200 ms) | unverified | rows 40 px → 1.48° |
| B3 | Switch to an app / desktop-window tab; its menu (Close) | click; hover | Left/Right + A | 80 × 80 |
| B4 | +: Launch Program / Add Desktop Window list (incl. Liquid Glass) | click | A (D-pad Up opens popups) | hit 54 × 48 → 2.0 × 1.8°, visible circle 34 px → 1.26° |
| B5 | Playspace Menu: Playspace Setup, Adjust Floor Height, Recenter | click → 212 × 141 card, rows 40 px | A, Up/Down, A | hit 54–63 × 80, visible 48 px → 1.78° |
| B6 | Toggle Room View (passthrough) | click (toggle, no popup) | A | same |
| B7 | Streaming Status: Select game to stream, host list, Advanced › Stream VR Without Game | click | A | same |
| B8 | Quick Access (§A.4) | click the clock/status cluster | A | 135 × 80 → 5.0 × 2.96° |
| B9 | Read time and status (§A.7) | look | look | clock 22 px → 0.81°; icons 18 px → 0.67° |
| B10 | Account page | click the avatar → /account |
A | 79 × 86 |
| B11 | Tooltips (names of every button) | hover | focus | 16 px text → 0.59° |
| B12 | Conditional buttons: download progress, Family View / Kiosk lock, unformatted SD, low disk, Steam connection warning, voice chat | click | A | same primitives |
Popups close 2 s after the pointer leaves (100 ms when gamepad focus leaves), on any outside click, on B, and when another popup opens.
A.4 Quick Access (surface barpopup, card 300 × 440 px, opens on Quick Settings)
Tabs sit at the bottom: 5 icon-only tabs, 60 × 48 px (2.2 × 1.8°). The content panel shows 343 px at a time.
| tab | content (live) | scroll | functions |
|---|---|---|---|
| Notifications | "No new notifications" today. With items: pinned cards first (Battery Low, Low Disk Space, unclaimed rewards, gifts, friend requests, comments, unread chat, inventory items, trade offers, turns, community messages, support replies, family invites), then unread notifications as rows with dividers | as needed | open a notification's target (click / A). No "view all" or history in VR: there is no notifications route (social.md §10) |
| Quick Settings | Brightness: Brightness, Environment Brightness sliders (237 × 28); Audio: Volume, Microphone Volume sliders (240 × 24, mute icons); Other: Wi-Fi toggle + current network row, Bluetooth toggle + 6 device rows (5 greyed) + Add Device, Airplane mode toggle | 870 px in 343 (2.5 screens; every toggle is below the fold) | drag sliders / Left-Right; click mute icons; toggles; network row and device rows open settings or connect |
| Performance | System Profile (2-notch slider), Basic View; Manual GPU Clock; Non-VR: Performance Overlay Level (5 notches), Disable Frame Limit, Scaling Mode (5), Scaling Filter (3); VR: Show Perf Overlay in VR, Record VR Performance, Record Tracking, Refresh Rate (72 | 144 notched slider), Motion Smoothing; Reset to Default | 1059 px (3.1 screens) | sliders, toggles, Basic View, Reset |
| Battery Info | headset ("Full", 36 px, 24 × 40 icon; no percentage); one row per connected controller ("Right Controller 21 %" with a 1-step icon and a yellow "!") | none | the headset row is clickable (target not exercised) |
| Help | Visit Help Site, Report a Bug, Replay Guided Tour, Show Frame Tutorial Videos (267 × 40) | none | each opens a web view or a tour |
Gamepad (from the inventory and source; not exercised, §0.2): A on the bar's Quick Access opens it with the Quick Settings tab focused; the tab row is a horizontal group; D-pad moves into the content; B closes. With an active battery alert, opening the QAM jumps to Battery Info and a yellow/red Low Battery banner shows.
A.5 Power menu (in main, context-menu sheet)
Reached from VR main menu › Power (laser-visible menu, or D-pad Left / B at root), the Steam tab menu › Power, nowhere else (not in the QAM). Items: Sleep, Shutdown, Restart Device, Restart Steam VR | Change Account, Sign Out, Restart Steam | Cancel. Every item except Cancel opens a confirmation dialog (OK / Cancel). Rows 48 px (1.47°), 16 px text (0.49°), title "Power" floating above the sheet (18 px). First focus is timing-dependent: Restart Steam VR in the stock capture, Sleep in the themed one (SN A.7).
Related system actions elsewhere: System › Advanced (Factory Reset and three maintenance tools), SteamVR Startup / Shutdown (turn off displays / controllers after), Steam Settings › Power (dim / sleep timeouts).
A.6 Volume HUD (volumelevel)
| function | laser | gamepad |
|---|---|---|
| See the volume level after a hardware volume press (1 s, re-armed per press) | display only (interactive:false; a drag is accepted while it shows, but the popup ignores focus) |
— |
Shape: 250 × 34 px capsule (≈ 14.7 × 2.0° [inferred]), 6 px track (≈ 0.35°), 20 px speaker glyph that changes with level, no handle, no number, no device name. Head-locked 0.4 m below and 0.8 m ahead of the eyes (≈ 27° below the horizon), pitched −20°.
A.7 Battery and status
| where | what | size | interaction |
|---|---|---|---|
| Bar status cluster (inside the Quick Access button) | headset battery glyph (green fill; a small yellow "!" was showing while the right controller was at 21 %), volume glyph, Wi-Fi glyph; conditional: controller batteries (not during a low-battery alert), Steam connection warning, unformatted SD, notifications bell with a blue dot when unread items exist | glyphs 18 px (0.67°), battery 26 × 18 (0.96 × 0.67°). No tooltips (status items have no vrTooltip) |
not separate targets: a click anywhere opens the QAM |
| Battery percentage on the bar | only when Settings › Power › Battery Percentage is on (off here) | — | the user's setting |
| QAM › Battery Info | headset level word ("Full"), controller rows with % | 36 px headline; rows 44 px | look |
| QAM low-battery banner | yellow or red strip; auto-jump to Battery Info | — | look |
| Low-battery toast | Notifications setting "When a controller's battery is low" (toast + sound) | toast (§A.8) | look |
| SteamVR controller status | 256 × 256 texture on the controller model's status area: hand or gamepad glyph, battery PNG in 5 levels + charging, 3 connection dots | on the controller | look |
| Clock | bar, 22 px Semibold, tabular | 0.81° | look |
A.8 Notifications
| # | function | laser | gamepad |
|---|---|---|---|
| NO1 | See that something is unread | bell glyph in the bar (18 px) | same |
| NO2 | Read the list | QAM › Notifications (first tab, but the QAM opens on Quick Settings) | View → bar → Quick Access → A → Left to the first tab (unverified) |
| NO3 | Act on a notification | click its row / pinned card | A |
| NO4 | Read a toast as it arrives | Steam toast: 300 × 40 card, 11 px title, 12 px body, 40 px logo (10.2 × 1.36°; text 0.37–0.41°); laser hover fill; click behaviour unverified | — |
| NO5 | SteamVR's own toasts (notificationtoast.html) |
100 px image + 2-line header + 3-line text in a blue gradient frame | — |
| NO6 | Configure | Steam Settings › Notifications (144 focusables) and SteamVR › General › Notifications (Off/On) | Steam: yes; SteamVR: — |
A.9 One function, many homes
The system functions are spread over seven surfaces in two apps (Steam Settings, SteamVR Settings, Quick Access, bar buttons, bar popups, the Power menu, SteamVR frame controls). Many appear more than once, each time with a different control:
| function | Quick Access | Steam Settings | SteamVR Settings | bar | elsewhere |
|---|---|---|---|---|---|
| Output volume | slider | Audio slider | — | glyph | volume HUD |
| Microphone volume | slider | Audio › Voice slider | — | — | — |
| Display brightness | Brightness slider | — | General and Video slider (125 %) | — | — |
| Refresh rate | Performance notched slider | — | General and Video, 7 circles | — | — |
| Motion smoothing | Performance toggle | — | General and Video, Off/On | — | — |
| Room View (passthrough) | — | — | Camera › Room View, Room View Style | Room View button | — |
| Recenter / floor | — | — | Developer › Quick Calibrate | Playspace Menu | — |
| Wi-Fi | toggle + network row | Internet page | — | glyph | — |
| Bluetooth | toggle + devices + Add Device | Bluetooth page | — | — | — |
| Performance overlay / tracking recording | Performance toggles | — | Developer (assessment overlay, Record Tracking Data) | — | — |
| Notifications | list | policy + matrices | Off/On | bell | toasts |
| Controller bindings | — | Controller › Desktop Layout | Controllers › Manage Bindings | — | Now Playing |
| Keyboard | — | Keyboard page | Dashboard › Keyboard Privacy | — | frame control Show Keyboard |
| Power / session | — | System › Advanced; Power timeouts | Startup / Shutdown | — | Power menu |
Redesigns must keep every home (they are all real paths) but can make one of them the obvious one.
B. VR UX critique
B.1 Target sizes
| control | size (px) | angle (limiting side) | vs 2.5° | visionOS equivalent (refs 3, 8) |
|---|---|---|---|---|
| Settings sidebar row | 256 × 42 | 1.29° | 52 % | sidebar row pitch 52–60 pt ≈ 2.2–2.5° |
| Settings field row (toggle rows are probably whole-row targets) | 952 × 46 / 64 | 1.41° / 1.96° | 56 % / 78 % | grouped row ≈ 52–60 pt |
| Settings toggle | 38 × 22 | 0.68° tall | 27 % | switch 51 × 31 pt ≈ 2.1 × 1.3° inside a ≥ 2.5° row |
| Settings dropdown / button | 250 × 40 | 1.23° | 49 % | pop-up button 44 pt ≈ 1.8° in a 2.5° row |
| Settings slider (knob / track) | 24 / 6 | 0.74° / 0.18° | 30 % | capsule slider ≈ 56 pt ≈ 2.3° |
| Settings checkbox (Notifications matrix) | 22 × 22, columns 60 px apart | 0.68°, pitch 1.84° | 27 % | none: visionOS uses toggles or menus |
| Settings segmented segment | 309 × 32 | 0.98° | 39 % | segmented ≈ 44 pt ≈ 1.8° |
| Dropdown menu row | 48 | 1.47° | 59 % | menu row ≈ 44–52 pt |
| QAM tab (icon only) | 60 × 48 | 1.78° | 71 % | — (CC has no tabs) |
| QAM slider row / knob / track | 44–48 / 24 / 6 | 1.6–1.8° / 0.89° / 0.22° | 36 % (knob) | CC slider 56 pt ≈ 2.3°, the whole capsule is the target |
| QAM toggle / toggle row | 38 × 22 / 42 | 0.81° / 1.55° | 32 % / 62 % | CC toggle circle 44 pt ≈ 1.8° at 61 pt (2.5°) pitch |
| QAM device / Help rows | 40 | 1.48° | 59 % | CC platter rows ≈ 52 pt ≈ 2.2° |
| Bar small button (visible / hit) | 48 / 54–63 × 80 | 1.78° / 2.0–2.3° | 71–92 % | — |
| Bar small-button centre spacing | 54–63 | 2.0–2.3° | below the 2.5° spacing rule | — |
| Bar + (visible / hit) | 34 / 54 × 48 | 1.26° / 1.78° | 50 % / 71 % | — |
| Bar Steam tab, QAM button, avatar | 80+ | ≥ 2.96° | OK | — |
| Playspace / tab-menu rows | 40 | 1.48° | 59 % | — |
| Power menu row | 48 | 1.47° | 59 % | menu row ≈ 2.2° |
| SteamVR Settings sidebar row | 416 × 74 | ≈ 1.56° | 62 % | — |
| SteamVR Settings radio circle / Off-On pill / button | 85 / 64 / 64 | ≈ 1.79° / 1.35° / 1.35° | 54–72 % | — |
Findings
- Every system control except the bar's large tabs is 0.7–2.0°, a quarter to three quarters of the visionOS minimum. The worst are the ones adjusted most often: slider knobs and tracks (0.18–0.89°), toggles (0.68–0.81°), the Notifications checkboxes (0.68°).
- The QAM uses the bar's slightly larger angle (0.037°/px) but packs Steam Deck's handheld layout into it: the sliders are thin lines meant for a thumb on a touch screen.
- Small-button centres on the bar are 2.0–2.3° apart: adjacent buttons (Playspace, Room View, Streaming) sit closer than the 60 pt spacing rule, and Room View is a one-click toggle of the user's view of the room.
- SteamVR's page is drawn bigger in pixels (64–85 px controls) but at ≈ 0.021°/px it lands at the same 1.3–1.8°.
B.2 Legibility
| text | size | angle | vs 0.70° body |
|---|---|---|---|
| Settings labels, values, dropdown text | 16 px | 0.49° | 70 % |
| Settings descriptions | 12 px | 0.37° | 53 % |
| Settings section headers / page title | 16 / 22 px | 0.49° / 0.68° | — |
| QAM section headers (stock: uppercase, tracked) | 16 px | 0.59° | 84 % |
| QAM notch labels ("PERFORMANCE", "PLAYTIME", "OFF 1 2 3 4") | 10 px bold uppercase | 0.37° | 53 % |
| QAM rows, Help buttons | 16 px | 0.59° | 84 % |
| Bar clock | 22 px | 0.81° | OK |
| Bar status glyphs | 18 px | 0.67° for a battery level read from a glyph | — |
| Toast title / body | 11 / 12 px | 0.37 / 0.41° | 53–58 % |
| Power menu | 16 px | 0.49° | 70 % |
| SteamVR Settings labels / descriptions | 24 px / ≈ 22 px | ≈ 0.51° / 0.46° | 73 % |
| SteamVR buttons | 24 px ALL CAPS | ≈ 0.51° | uppercase loses word shape |
Findings
- Every settings description, every notch label and every toast line is at 0.37–0.41°, about half of visionOS body text and below the visionOS 12 pt (0.49°) minimum.
- Status is read from glyphs: an 18 px battery glyph at 0.67° is the only always-visible battery indicator. visionOS Control Center prints "100" inside a green battery capsule (ref 3).
- Grey on glass compounds the size problem: info values (
LabelFieldValue), descriptions and disabled rows are all mid-grey 12–16 px text.
B.3 Information architecture
- Two settings apps in one place. "Steam Settings" and "VR Settings" sit next to each other in the main menu but are different apps: different type scale, ALL-CAPS buttons, Off/On pills instead of switches, purple "advanced" fills, a different selection look, and no gamepad support in SteamVR's (a "Use Laser Mouse to Interact" banner). visionOS has one Settings app.
- Duplicates with different controls (§A.9). Refresh rate is a notched slider in the QAM and seven circles in SteamVR (twice: General and Video). Brightness is a QAM slider and a SteamVR slider with a percentage. The user cannot tell they are the same setting.
- 24 sidebar pages, 3 hairline separators, no grouping labels, no icons in colour. The list scrolls (1115 px in 678 px) so Library, Store and Developer are below the fold. visionOS Settings groups rows with gaps and colours each icon circle (ref 8).
- Selection follows focus in the sidebar. Moving the D-pad from System to Developer loads every page in between (each with a 320 ms slide). This is Steam Deck's behaviour; it costs little on a handheld but makes the 38° window flash in a headset.
- Page length is uneven. System is 46 rows over 4.6 screens and mixes language, updates, clock, crash reports, 25 read-only info rows and the destructive Advanced tools. Notifications has 144 focusables. Ten pages have 1–3 rows each.
- Danger looks like everything else. Factory Reset, Format SD, Delete Web Browser Data, Unpair and Change & Restart are the same grey 160 × 40 buttons as "View FAQ". visionOS colours destructive buttons red.
- Desktop leftovers. Notifications › "Flash window when I receive a chat message" (Always / Only when minimized / Never) has no meaning in a headset; Keyboard › "Initial Location (Desktop)"; Developer rows about composite and browser composers. They must stay reachable but need not be prominent.
- Quick Access is one Control Center tile carrying three tiles' content. At the bar's scale the QAM card is 11.1 × 16.3°, the size of one visionOS Control Center tile (≈ 12.1 × 17.5°, ref 3). visionOS spreads status, controls and environment over three such tiles; Steam stacks brightness, audio, Wi-Fi, Bluetooth, airplane mode, performance, battery and help into one scrolling column behind five icon-only tabs.
- The daily toggles are below the fold. Quick Settings opens with four sliders visible; Wi-Fi, Bluetooth and Airplane mode need a scroll, and six mostly greyed Bluetooth device rows sit between Bluetooth and Airplane mode.
- Performance mixes VR and non-VR. Half of the Performance tab is labelled "Non-VR Settings" (overlay level, frame limit, scaling) and does not apply while in VR; the VR-relevant Refresh Rate and Motion Smoothing are at the bottom of a 3-screen scroll.
- Notifications are a tab, not a place. The first QAM tab, but the QAM opens on the second. There is no history beyond unread items and no route for it in VR (
social.md§10). The bell is an 18 px glyph with a dot. - Power is navigation, not a system control. It sits at the bottom of the main menu and the Steam tab menu; the QAM has none. Account actions (Change Account, Sign Out, Restart Steam) share the sheet with device power. visionOS keeps power off the navigation entirely.
- Recenter is two clicks deep in a small-button popup (Playspace › Recenter), and also a SteamVR Developer row (Quick Calibrate).
B.4 Ergonomics
- Label-to-control travel. In Steam Settings each row is 952 px wide; the label starts at x ≈ 304 and the control is right-aligned at x ≈ 1110–1230. Reading a label and then aiming at its toggle sweeps 25–28° for every row, beyond comfortable eye-only rotation (≈ ±15°). The sidebar adds another 8° to the left. visionOS Settings rows sit in a platter about 55 % of the window wide with the value next to a chevron (ref 8).
- Gaze stack for system tasks. Window (centre) → bar (0.44 m below the dashboard origin, 13 cm nearer) → QAM growing up from the bar (16° tall). Checking the battery means looking down at an 18 px glyph; adjusting volume means opening a popup and aiming at a 6 px track.
- Volume HUD at ≈ 27° below the horizon, head-locked. It follows the head, so it never leaves the view, but it sits at the bottom edge of the comfortable field and moves when the user looks for it. visionOS avoids head-locked content (VR §22) except for brief system indicators placed near the top of view.
- Laser arm posture. Thin targets in the QAM (0.22° tracks) need a steady wrist at the lowest point of the UI stack.
B.5 visionOS comparison (refs 3 and 8)
| trait | visionOS Control Center (ref 3) | Steam Quick Access today |
|---|---|---|
| Structure | three separate portrait glass tiles (status + Now Playing + notifications; controls; environment), close button below | one 300 × 440 card, 5 icon-only bottom tabs, vertical scroll |
| Toggles | 44 pt circles, blue fill when on, white glyph, 61 pt pitch | 38 × 22 px switches at row ends |
| Sliders | 56 pt capsules; the value is a white fill with the dark glyph inside it | 6 px track with a 24 px knob, glyph outside |
| Rows | recessed inner platter, glyph + label, no separators | full-width rows with 1 px dividers |
| Status | large clock, battery capsule with the number, network glyphs | none in the QAM (the bar shows a clock and 18 px glyphs) |
| Notifications | "35 Notifications ›" capsule row in the status tile; expands on look | a whole tab, first position, not the default |
| trait | visionOS Settings (ref 8) | Steam Settings today |
|---|---|---|
| Sidebar | ≈ 36 % of the window, darker tone, no line; rows with coloured circular icons; groups separated by space; search capsule at the top; selection = lighter pill (not white) | 256 px column; grey glyphs; 3 hairlines; no search; Phase 1 selection = white pill with a ring |
| Detail | circular back button top-left on sub-pages, centred bold title, grouped rows in a recessed platter, trailing value + chevron, status block centred | left-aligned 22 px title, full-width grey rows with 6 px gaps, controls at the far right |
| Sizes | row pitch ≈ 52–60 pt (2.2–2.5°), body 17 pt (0.70°) | 46–64 px rows (1.4–2.0°), 16 px labels (0.49°), 12 px descriptions |
| Destructive | red labels / red buttons | grey buttons |
B.6 Motion against the Liquid Glass spec (MO §3–5)
| element | today | spec | verdict |
|---|---|---|---|
| Settings page switch | new page slides translateY(±12 %) (86 px of a 720 px window) + fades in over 320 ms after an 80 ms delay; old page exits 80 ms. Runs on every D-pad step in the sidebar (B.3.4) |
sidebar selection = content cross-fade on page/fade, ≤ 16 px parallax (M1), no delay; retarget on auto-repeat (C5) |
fails M1 (a 38° surface slides) and C5 (repeated steps queue slides) |
| Toggle knob | transform .2s cubic-bezier(.1,.12,.53,1.72) (≈ 20 % overshoot) |
snappy, overshoot ≤ 0.6 %, optional lift on press (MO §4.15) |
too bouncy |
| Slider knob on focus | 200 ms pop from scale(1.4) |
grab lift ×1.25 on interactive, settle snappy; no pop on mere focus (MO §4.16) |
wrong trigger |
| Focus fills | ItemFocusAnim keyframes, 0.5 s forwards |
illumination in hover-in (294 ms), out fade |
slow, and blocks theme colours (needs !important) |
| Settings FocusRing (segmented, checkbox, radio cards, links) | grow + fade + Blinker 20 × 1.2 s |
static glow, no pulse (C7) | Phase 1 neutralised the pulse; keep |
| QAM tab content | translateY(±8–12 %) + fade, 320 / 80 ms |
page cross-fade, ≤ 16 px |
slide too large for a 16° card |
| QAM container | transition: opacity 2s |
materialize small glass 250 ms in / 350 ms out (MO §3.2) | too slow |
| Bar popups | appear instantly (popup window shown) | morph from the source button, morph-open 607 ms / morph-close 441 ms (MO §4.6) |
no materialize |
| Volume HUD | opacity .5 s cubic-bezier(0,.73,.48,1) on the popin; mount/unmount |
materialize in place 250 ms, out 350 ms | close; add the glass channel |
| Toasts (VR) | no motion (VR keyframes are opacity 1 → 1), then opacity exit | materialize in place, dematerialize (MO §4.10) | no entrance |
| Bar small button press | ClickPop keyframe scale 1.1 at 5 %, :active scale .9 |
press swell ≤ ×1.06, interactive (C4) |
slightly large |
| Sidebar active item | ScaledChildren scale 1.1 |
navigation selection = lighter pill, no scale on rows (VR §12) | scale on a high-use row |
| SteamVR segmented thumb | ::after slides with transform |
selection travel on snappy with brief lift (MO §4.5) |
timing only |
| Reduce Motion | Phase 1 sets every duration to 1 ms | keep fades, remove motion (MO C8) | Phase 1 rule must change |
B.7 Materials against the brief (Phase 1 state)
- Outlines. The QAM card, bar segments, settings sidebar pill and dropdown buttons show a 1 px light ring (
p2_sys_qam_settings_on.png,p2_sys_bar_on.png). The brief: glass slabs whose edge comes from the shader. The 1 px dividers between QAM rows and under settings rows are hairlines the Frame renders at 0.6 display px (VR §1.5) and they shimmer. - Selection vocabulary. Phase 1 paints the current settings page and the current QAM tab as a white pill with a dark label. visionOS reserves white for toggled buttons and the selected segment; navigation selection is a lighter translucent pill (VR §14, REF finding 5).
- No frost. The QAM and every bar popup are their own quads over the room, painted with tint + sheen. They are the easiest surfaces in the UI to give real glassd glass (T5), because nothing of Steam's is behind them.
- Fill polarity is inverted. Settings rows are lighter than the window (white fill); visionOS platters are recessed (darker) and buttons raised (REF D.4).
- No depth. Bar, QAM, dropdown menus and dialogs all lie on their own planes, but nothing inside the window pops.
B.8 Safety and functional risks found
- Power menu first focus can land on Restart Steam VR (SN A.7). Account and device actions share one sheet.
- One-click toggles beside navigation: Room View is a 48 px circle between Playspace and Streaming on the bar, at 2.0–2.3° pitch.
- Hidden laser paths: Storage Uninstall / Move Content and the Display explainer exist only as footer legends for the laser (SN C.4). A redesign that changes the footer must keep them.
- SteamVR "Show VR Settings" (Dashboard, ADV) can remove the VR Settings menu entry; the redesign must not rely on that entry being present.
- Disabled rows (6 crash-report toggles, greyed Bluetooth devices, "Record Audio from…") must stay visibly disabled after any restyle.
C. Redesign opportunities, ranked by impact
Impact = how often the user meets it × distance from visionOS × how much it fixes size, legibility or navigation. Tiers: T1 CSS incl. layout, T2 DOM augmentation, T3 new views from Steam's React/gamepad components, T4 spatial compositor, T5 glassd materials.
Rules that apply to every item (from the brief and SN §C):
- Steam's nodes keep their identity, focusability, handlers and order; T2 only adds. Nothing hides (
auditGONE/HIDDEN/SHRUNK/UNCLICKABLE stay 0; "moved > 24 px" is expected). - D-pad direction must match the visual layout. A CSS reflow that turns a column of focusables into a grid changes what Up/Down/Left/Right reach. Every layout change below is verified with
L.padtraversal (it works inmaintoday, §A.1.2). - New paths may be added (T3), existing paths are never removed. A new control that performs an existing action calls the same Steam or SteamVR handler.
- Phase 2 motion follows MO §3.2 tokens; reduced motion keeps fades (MO C8).
C.0 Prerequisites (do first)
- Scalable primitives (CS1–CS3). Toggles, sliders, checkboxes and segmented controls are the bottleneck of every system surface. Their geometry is encoded in Steam's transforms (toggle knob
translateX(16px), slider knobtranslateX(calc(…))from--normalized-slider-value), so width/height changes break them. Two candidate T1 routes:- Independent
scaleon the control (e.g.scale: 1.75on%{*GamepadDialogContent>Toggle}): scales the knob travel with the rail and, because transforms move hit-testing, also enlarges the target. Steam already usesscale: -1 1on toggles in RTL, so the RTL rule must becomescale: -1.75 1.75. Verify the hit box withelementFromPointsweeps. - Taller slider hit area without moving the track maths: grow
S>SliderControl's padding or a transparent::beforeinside the slider panel group so the pointer area is 56–64 px while the track geometry (SliderTrack,HandleContainer) keeps its width. Verify that Steam maps the pointer x to the value from the track's rect, not the control's.
- Independent
- A lab helper that gives the bar gamepad focus (Steam's
FocusDashboardBarpath) for a few seconds and hands it back, so QAM and bar traversal can be verified unattended (CS10). Today only the main window can be traversed. - Popup hosts and popup scale (CS4, mostly settled by SP §3). Steam's
vrPooledPopupStoreplaces every bar popup with a request that carries an offset (x, y, z), rotation and ascalethat enlarges a popup at the same CSS size. A popup of our own in an idle barpopup host rendered at ×1.5 and stayed a laser target [PROVEN, SP E2]. Applyingz/scaleto Steam's own popups by wrappingSendPendingInstanceParamsToSteamVRis [PLAUSIBLE], not yet run. Limits that shape C.1:- host windows have fixed widths: barpopup 300 × 1024 (pool of up to 2), frame.menu 300 × 800 (up to 4), vrcontrollers 1200 × 800 (pool of 1, Steam uses it for the guided tour);
- a newly opened popup was not visible until ≈ 2.5 s after it reported "shown": anything that must appear with the QAM has to be opened early and revealed with CSS;
- gamepad focus across several popup windows is still open (CS5).
- Two global size levers (both trade field of view for size, so neither replaces C.3):
- popup
scalefor the bar's popups (QAM, Playspace, Streaming, tab menus): ×1.25 makes every QAM row and knob 25 % larger in angle with no CSS layout change, and the QAM card 13.9 × 20.4° (bigger than one visionOS tile); - window scale (SP E5b, [PROVEN]: the frame's pre-resize height 1.5 → 1.8 made the window ×1.2 with the laser target following). That grows the whole Steam window to ≈ 45° wide; it helps settings less than a layout change does and must stay a user-facing choice.
- popup
C.1 Quick Access becomes Control Center (rank 1)
- Problem: B.1 (sliders 0.18–0.89°, toggles 0.81°), B.3.8–B.3.10 (one tile, 2.5–3 screens of scroll, essentials below the fold), B.2 (10 px notch labels), B.7 (outlined card, white tab pill).
- visionOS pattern: Control Center, ref 3 / VR §20: separate portrait glass tiles, circular toggles with whole-fill colour, thick capsule sliders with the glyph in the fill, recessed inner platter, one close circle below.
- Proposal A (preferred): three tiles as three popup quads. A bar-popup host is 300 px wide, exactly one visionOS Control Center tile at the bar's scale. So each tile is its own popup: the centre tile is Steam's real Quick Access in its barpopup host (restyled), and the two side tiles are T3 views in the second barpopup host and a frame.menu host, placed left and right of it by the popup request's offsets (SP §3.1–3.2). Three separate glass slabs with real room between them is what ref 3 shows. Side tiles are opened hidden while the theme is on and revealed with the QAM (first-paint latency, C.0.3). Each tile is 300 × 440 px (11 × 16°), gaps ≈ 24 px:
- Status tile: clock (48–56 px, tabular), date; battery capsules for the headset and each controller with the number inside (T2 reads the same store the Battery tab reads); Wi-Fi and Bluetooth state glyphs; a "N Notifications ›" capsule (72 px) that opens the Notifications view; low-battery state as an orange/red capsule fill.
- Controls tile: a row of four 56–60 px circular toggles at 70–72 px pitch (Wi-Fi, Bluetooth, Airplane mode, and Room View as a second path to the bar's action); four 64 px capsule sliders (Volume, Microphone, Brightness, Environment Brightness), white fill from the leading edge with the dark glyph inside, knob only on hover or focus; mute stays on the glyph (the existing
%{ClickableSliderIcon}). This is the centre tile, i.e. Steam's own Quick Access popup. Restyled in place (T1) it keeps Steam's switches; the circular toggles need its Quick Settings panel re-rendered by a T3 type-swap of the panel component (SR §8 located the bar popup's observer component but has not patched it yet). Either way the five stock tabs stay reachable from this tile. - Device tile: Refresh Rate as a segmented capsule (72 | … | 144, the same notches), Motion Smoothing toggle, Recenter and Playspace circles (second paths to the Playspace actions), Power circle (second path to the same Power menu, C.6), and platter rows "Performance ›", "Battery ›", "Help ›" that open the remaining tab content as a pushed view inside the tile.
- A 48 px close circle centred below (B closes as today).
- Proposal B (if cross-popup gamepad focus fails, CS5). One tile in Steam's own popup, no scroll for the essentials: status strip (battery capsules + notifications capsule, 64 px), four toggle circles, two capsule sliders (Volume, Brightness); Microphone and Environment Brightness one level down ("Audio ›", "Display ›" platter rows); the five tabs become a vertical capsule tab ornament on the tile's leading edge, like visionOS tab bars (60 px circles at 72 px pitch, 5 × 72 = 360 px) instead of a 48 px icon row at the bottom.
- Never lose: every QAM row (Appendix 2) stays reachable: Performance's non-VR rows, Basic View, Reset to Default, every Bluetooth device row, the network row, Help buttons. In Proposal A they live in the pushed views; in T1-only form they stay in Steam's own tab panels, restyled.
- Tiers:
- T1: restyle Steam's own tabs and rows in place. This gives capsule sliders (C.0.1), larger switches and 64 px platter rows, but not circular toggle buttons: Steam renders switches, and turning them into circles needs the T3 tile views;
- T3: the tile views, built from Steam's own
ToggleField/SliderField/Focusablecomponents and bound to the same stores and handlers (SteamClient.System.Audio, Bluetooth and Wi-Fi stores, the Room View SteamVR action,SteamUIStore.OpenPowerMenu). SR proves such views in the main window; popups are portals of the same React root (SR §3.3), so the same components should render in a popup host; - popup request:
scale≈ ×1.1–1.25 and a smallzfor the tiles (C.0.3); - T4: tiles at +1 cm from the bar plane with a 2 cm gap in z between status and controls tiles optional; T5: each tile a glassd slab (the popup quad has nothing behind it).
- Retention: the stock QAM stays one press away (e.g. a "More…" row or long-press, or the T3 tiles are an alternate first page of the same popup). Gamepad: the tiles are one focus tree, left-to-right tiles, Up/Down inside; B closes; the bar's Quick Access button still opens it.
- Verify:
shot barpopup p2_cc_*for each tile state (Wi-Fi on/off is read, not changed: shoot the current state);audit barpopup;- the new C.0.2 helper +
L.padthrough all tiles and back to the bar; refusal on Left/Right over sliders is already built intoL.pad; perf barpopupon the pushed Performance view;- an
hvgrabcapture to confirm tile size and gaps against 12 × 17°.
- Open: CS5 (gamepad focus moving between the three tile popups, and B closing all three), CS4 (the scale wrapper on Steam's own popups), CS1–CS3.
C.2 Steam Settings becomes visionOS Settings (rank 2)
- Problem: B.1 (rows 1.3–2.0°, controls 0.7–1.2°), B.2 (12 px descriptions), B.3.3–B.3.7, B.4 (25–28° label-to-control sweep), B.7.
- visionOS pattern: Settings, ref 8 / VR §7, §10, §21.
- Proposal:
- Sidebar (T1 + T2): rows 64–72 px, label 22–24 px Medium; a 40 px coloured icon circle behind each page's existing glyph (T2 adds
data-lgs-pagefrom the route each row activates; CSS colours by it: blue for Internet/Bluetooth/Display/Accessibility, grey for System/Storage/Developer, green for Friends, red for Notifications, orange for Power/Audio, purple for Game Recording/Remote Play); groups separated by 16–24 px of space instead of hairlines (Steam's three separators stay as transparent spacers); selection = lighter pill (white 0.16–0.20), focus = brighter pill + light spot (VR §12). Drop theScaledChildren1.1 scale look by not reinforcing it (the transform is Steam's and stays). - Detail pane (T1): page title centred (Title 3, 28 px Bold) as in ref 8; section headers 20–22 px title case; rows grouped in recessed platters (black 0.14 on the glass, radius 30 px) with 64–72 px rows; labels 22 px, descriptions 18 px; platter max-width ≈ 760 px, centred, which cuts the label-to-control sweep from 25–28° to about 18–20° while keeping controls right-aligned as visionOS does.
- Controls (C.0.1): toggles at visionOS switch proportions (≈ 66 × 40 px via
scale); dropdowns as capsule "value ⌄" buttons 56 px tall; sliders as 56 px capsules with the glyph inside the fill (Audio); checkboxes 40 px with 80 px column pitch (C.7); segmented capsules 56 px. - Danger (T1 + T2): buttons whose action is destructive get a red label at rest and a red whole fill on focus (T2 tags them by their localization token, e.g. Factory Reset, Format, Delete, Unpair, Change & Restart, Reset). Primary actions (Apply update, Try Steam Families) stay the one tinted capsule per page.
- Read-only info rows (About, SteamVR, Steam, Hardware: 25 rows of 47 px): render as compact "label · value" rows at 56 px inside one platter each; keep them focusable and in one column (no grid: a grid would change D-pad meaning).
- Sub-pages (Controller › Advanced): circular 60 px back button top-left of the detail pane, centred title (ref 8). Steam's
%{BackButtonContent>BackButton}is the node; restyle, don't replace. - Sidebar page switching: keep selection-follows-focus (changing it is a behaviour change) but make it cheap: content cross-fade on
fadewith ≤ 12 px parallax and no delay (C.9), so holding the D-pad reads as one moving highlight.
- Sidebar (T1 + T2): rows 64–72 px, label 22–24 px Medium; a 40 px coloured icon circle behind each page's existing glyph (T2 adds
- Tiers: T1 (all layout and look), T2 (icon colour keys, destructive tags,
aria-labels), T4 (dropdown menus and dialogs at +3.5 / +3 cm, SN C.5–C.6), T5 (window glass; platters stay fills: no glass on glass). - Retention: no row hides; the virtualized Storage list keeps its inline geometry (style only its rows); the Notifications sticky headers keep
position: sticky(restyle only);scroll-paddingstays so focused rows clear the header and footer. - Verify:
settings_sweep.jsbefore and after: every page's row and focusable counts must be identical; minimum row height ≥ 64 px, minimum control height ≥ 56 px, no text below 18 px;audit main --route /settings/<page>for all 25 routes;L.padtraversal script: sidebar Up/Down across all 24 pages, Right into each page, Down through every row to the end, Left back (navigation only; Left/Right on sliders refused by the helper);perf main --route /settings/systemand/settings/notifications(the two long pages).
- Open: CS1–CS3; whether
max-widthonG>GamepadDialogContent_InnerWidthkeeps Steam's scroll-into-view correct (CS6).
C.3 System control primitives at visionOS size (rank 3, cross-cutting)
This is the shared work behind C.1, C.2 and C.4, kept in 10-primitives.css (Foundation).
| primitive | today | Phase 2 target | how |
|---|---|---|---|
| Toggle | 38 × 22 rail, overshoot 20 % | ≈ 66 × 40 visual; whole row as target where Steam's row already handles the click; green whole-fill on; knob lift on press; snappy travel |
scale (CS1); MO §4.15 lift via T2 class |
| Slider | 6 px track, 24 px knob | 56–64 px capsule, value = white fill with glyph inside, knob on hover/focus only, notch labels 16 px title case | hit-area padding (CS2); restyle SliderTrack::before colour and radius only |
| Checkbox | 22 × 22 | 40 × 40 rounded square, 80 px column pitch | scale or padding (CS3) |
| Segmented | 32 px segments | 56 px capsule, white selected segment (this is where white is correct) | padding inside %{Group} |
| Dropdown button | 250 × 40 square-ish | 56 px capsule "value ⌄", 22 px text | padding |
| Dropdown menu | centred sheet, 48 px rows, title floating above, Cancel row | thick-glass menu, 64–72 px rows, title inside the slab, Cancel kept | SN C.6 |
| Focus | white fill (ItemFocusAnim) or 2 px ring |
illumination + light spot; ring only on text fields | DESIGN §3, VR §12 |
C.4 The dashboard bar becomes a system ornament with legible status (rank 4)
- Problem: B.1 (small buttons 1.78° at 2.0–2.3° pitch, + 1.26°), B.2 (18 px status glyphs, 0.67°), B.3.11 (bell), B.7 (outlined segments).
- visionOS pattern: ornaments are glass capsules with borderless circular buttons; status in Control Center prints the battery number (ref 3).
- Proposal:
- Each
%{BarSurface}becomes one glass capsule (radius 40 px, the bar's own height); no rim line (T5 slab, T1 sheen only). - Small buttons and +: 60–64 px visible circles at ≥ 72 px pitch (2.7°), using the existing 80 px-tall hit areas; borderless at rest, lighter on hover, white only when toggled (Room View on) or when their popup is open (visionOS: the invoking button turns white).
- Status cluster: clock 26–28 px; battery as a capsule with level fill and the number when Steam's Battery Percentage setting is on (style Steam's own percentage); when it is off, a larger 28 px level glyph with whole-fill colour (green / orange < 30 % / red < 15 %). Controller batteries appear beside it as small capsules. Notification badge: a red capsule with the unread count on the cluster (T2 reads the count Steam already uses for the bell), not an 18 px bell with a dot.
- Tooltips: 0.8 s in / 0.2 s out (VR §12), capsule text 20 px.
- Depth: the bar is already its own plane 13 cm nearer; T4 can add +1 cm per toggled button only if paired with a shadow (VR §16.2: small objects don't need depth; prefer none).
- Each
- Tiers: T1 (sizes inside the 80 px window, which already reserves the hit area), T2 (the unread badge count), T5. T2 must not add a battery percentage while Steam's Battery Percentage setting is off: that would override the user's choice.
- Retention: every bar item keeps its node, tooltip, popup and gamepad order. Don't change
--bar-item-padding-pctor the + button'sscale(.7)transform: size through the variables or padding the inventory lists (bar.md §1.5). - Verify:
shot bar p2_bar_*(rest, popup-open states via the OPEN snippet),audit bar, anhvgrabcapture for the 2.5° pitch, the C.0.2 helper for Left/Right traversal.
C.5 One settings language, and a gamepad path into SteamVR settings (rank 5)
- Problem: B.3.1–B.3.2, A.2 (laser only), B.2 (ALL CAPS).
- Proposal:
- T1 (
theme/vr/): restyle SteamVR's page to the C.2 look: sidebar pill rows with coloured icon circles (CSS::beforeon.SettingsSidebarButtonis Steam-owned, so use an inner span or the label's::before), grouped recessed platters, title case (text-transform: noneon the ALL-CAPS buttons), Off/On segmented pills styled as visionOS segmented capsules (SteamVR's::afterthumb restyled, never moved), Advanced controls marked by a small purple dot instead of a purple fill, refresh-rate circles kept (they are already visionOS-like). - T3 (Steam side), new path: a "SteamVR" group at the foot of Steam Settings' sidebar whose rows open SteamVR settings at that section (the same
SwitchToPage+ section the VR Settings entry uses), so gamepad users can at least reach the page, and a gamepad-operable "VR Display" mirror page for the settings Steam already exposes to the gamepad (Refresh Rate, Motion Smoothing, brightness) using the same handlers the QAM uses. No SteamVR value is written by any code path that a user didn't trigger. - Gamepad inside SteamVR's page would need T3 work in SteamVR's own React (not Steam's). Treat as research (CS7).
- T1 (
- Verify:
vrsettings_sweep.jsbefore/after (identical setting counts and control sizes per section; it reports sizes);shot vr:systemui p2_vrset_*with the lock procedure;audit vr:systemuiwhile shown; panel-size check fromsteamvr.md§7 (the panel root must not change size). - Open: CS7, CS8 (deep link to a section).
C.6 Power and session (rank 6)
- Problem: B.3.12, B.8 (destructive first focus, mixed account/device actions), B.1 (1.47° rows).
- Proposal:
- Second path: a 60 px Power circle in Control Center (C.1, T3) that calls the same
SteamUIStore.OpenPowerMenu. - The sheet (T1): a thick-glass menu (SN C.6): Device group (Sleep, Shutdown, Restart Device, Restart SteamVR) and Account group (Change Account, Sign Out, Restart Steam) as two recessed platters using Steam's own separators; 64–72 px rows with leading glyphs; Shutdown and Restart rows red-labelled; title inside the slab.
- Confirmations: visionOS alerts (SN C.5): 640 px card, left-aligned 28 px title, 60 px capsule buttons, the destructive confirm red.
- Default focus: opening on Sleep (or Cancel) instead of Restart Steam VR is a behaviour change; offer it to the user as an option, do not ship it by default.
- Second path: a 60 px Power circle in Control Center (C.1, T3) that calls the same
- Verify: the POWER snippet (
inventory/shell.md§0.2, look only),audit mainwith it,L.padUp/Down inside the sheet.
C.7 Notifications: list, toasts and settings (rank 7)
- Problem: B.2 (toasts 0.37–0.41°), B.3.11, B.1 (Notifications page checkboxes 0.68°, 144 focusables).
- Proposal:
- List (T1 now, T3 with C.1): the QAM Notifications panel as visionOS notification cards: 80 px rows, 48 px circular app/avatar icons, 22 px title, 18 px body, pinned items as a separate platter at the top. In C.1 a "N Notifications ›" capsule in the status tile opens it.
- Toasts: SN C.9 (use the whole 340 × 80 quad, 48 px circular icon, 16–18 px title, 14–15 px body; materialize in place). System toasts (low battery, controller connected) get whole-fill semantic colour on the icon circle (orange/red), not on text.
- SteamVR toasts (
notificationtoast.html): same card, replacing the blue gradient frame. - Notifications settings page: keep the matrix (it is Steam's nav structure) but at visionOS size: 40 px boxes at 80 px column pitch with the column headers in 18 px title case, sticky behaviour unchanged; each two-toggle row (Show Toast / Play Sound) gets two labelled switches. Flash-window segmented control moves visually into a "Desktop" platter at the end of the page (order unchanged: style only).
- Verify: toast mock recipe (
hud.md§4.3, CS9 for an 80 px host),audit notificationswith the mock,settings_sweep.json/settings/notifications,L.padacross the matrix (Left/Right between columns is safe: checkboxes are not sliders).
C.8 Volume HUD becomes a visionOS volume capsule (rank 8)
- Problem: A.6 (6 px track, no number, head-locked ≈ 27° below the horizon), B.6.
- Proposal:
- Look (T1): a 64 px capsule (≈ 3.8° at the HUD's scale [inferred]) whose value is the white fill from the leading edge with the speaker glyph inside it, Control Center style; the track recessed. The clip rect follows
%{PopupContent}, so the capsule must grow by padding on that box (allowed, audited in Phase 1). - Number (T2): a decorative "45 %" label driven by the slider's
--normalized-slider-value(T2 observer), 20 px tabular. - Placement: move it higher (≈ 10–15° below the horizon) and keep it brief. Its placement is the popup request's
offset/rotation(SP §3.1), so the same wrapper as C.0.3 can change it (CS11), or T4 can re-place a crop of the HUD (it is non-interactive, so a moved crop loses nothing). - Motion: materialize in 250 ms, out 350 ms (MO §4.10).
- Look (T1): a 64 px capsule (≈ 3.8° at the HUD's scale [inferred]) whose value is the white fill from the leading edge with the speaker glyph inside it, Control Center style; the track recessed. The clip rect follows
- Verify: the
hud.md§2.2 trigger (never changes the volume),audit volumelevel,hvgrabfor placement.
C.9 Motion compliance for system surfaces (rank 9)
| element | change | tier |
|---|---|---|
| Settings page switch | override %{PagedSettingsDialog>Enter*}/Exit* timing: cross-fade on fade, ≤ 12 px parallax, no 80 ms delay; never touch the end states |
T1 (CS12: the transition group's timers) |
| QAM tab content | same, ≤ 8 px | T1 |
| QAM / bar popups | materialize small glass (250 / 350 ms), swell 1 + 12/maxSide |
T1, T5 |
| Toggle | snappy instead of the 20 % overshoot; lift on press |
T1, T2 |
| Slider | no pop on focus; grab lift on press; value follows the pointer directly | T1, T2 |
| Focus fills | hover-in / fade illumination layer |
T1 |
| Reduce Motion | keep fades ≤ 200 ms, remove motion (replace Phase 1's 1 ms rule) | T1 (Foundation) |
Verify with the filmstrip method of MO §10 (several shots during a L.pad move).
C.10 Materials: glass slabs without outlines (rank 10)
- QAM, bar segments, Playspace / Streaming / tab-menu popups, the volume HUD and toasts are standalone quads with nothing of Steam's behind them: each gets a glassd slab (frost, lensing, specular rim, adaptive tint) sized to its
%{PopupContent}box (T5). In CSS: remove the uniform 1 px rims; keep a top-lit rim gradient ≥ 2 px and a darkened inner edge (VR §15). - Inside the window: settings platters recessed fills (no glass on glass); hairlines replaced by spacing or ≥ 2 px soft separators.
- Selection vocabulary fixed across all system surfaces: navigation = lighter pill; toggled button, selected segment, open-popup source = white; focus = illumination.
- Verify: pixel profiles across each edge in shots (top peak, flat sides, REF E.2); glassd debug dumps;
hvgrab(look, then delete).
C.11 Stereo plan for system surfaces (rank 11)
| element | dz | note |
|---|---|---|
| Settings sidebar, platters, rows, controls | 0 | visionOS keeps rows flat |
| Settings dropdown menus, Power sheet | +3.5 cm | crop at the same x/y (input lands underneath) |
| Settings dialogs | +3 cm; window base dimmed | SN C.5 |
| Control Center tiles | 0 relative to their own quad; optional +1 cm for the controls tile | the popup is already a separate plane |
| Bar | already 13 cm nearer; no extra | — |
| Toasts, volume HUD | none | head-locked or SteamVR-placed |
Shadows sized by depth (VR §16.3). Text never gets its own depth.
C.12 Settings search (rank 12, new function, optional)
visionOS Settings has a search capsule at the top of the sidebar (ref 8). Steam has none; in VR, typing is expensive but jumping beats scrolling 24 pages. A T3 capsule at the top of the sidebar could open a sheet listing matching page and row labels (the labels the sweep collects) and navigate to the page with the row scrolled into view. It must build its index from what is on screen or from static data shipped with the theme, never by navigating behind the user's back. Lowest priority: it adds a function rather than fixing one.
Summary ranking
| rank | opportunity | main fix | tiers | blocking question |
|---|---|---|---|---|
| 1 | C.1 Quick Access → Control Center | size, essentials without scroll, status, notifications entry | T1 T3 T4 T5 | CS1–CS5, CS10 |
| 2 | C.2 Steam Settings → visionOS Settings | row and control size, gaze travel, grouping, danger | T1 T2 T4 T5 | CS1–CS3, CS6 |
| 3 | C.3 primitives at visionOS size | toggles, sliders, checkboxes, segmented, menus | T1 T2 | CS1–CS3 |
| 4 | C.4 bar as system ornament | button size and pitch, battery number, badge | T1 T2 T5 | CS10 |
| 5 | C.5 one settings language + gamepad path to SteamVR settings | app seam, gamepad dead end | T1 (vr) T3 | CS7, CS8 |
| 6 | C.6 power and session | second path, grouping, destructive safety | T1 T3 | user approval for default focus |
| 7 | C.7 notifications | legibility, place, matrix size | T1 T3 | CS9 |
| 8 | C.8 volume HUD | capsule, number, placement | T1 T2 T3/T4 | CS11 |
| 9 | C.9 motion | LG spec, no slides on repeat | T1 T2 | CS12 |
| 10 | C.10 materials | frost, no outlines, selection vocabulary | T1 T5 | — |
| 11 | C.11 stereo | hierarchy | T4 | SN CQ7 |
| 12 | C.12 settings search | findability | T3 | CS5 |
Capability questions for docs/phase2/capabilities/
| id | question |
|---|---|
| CS1 | Does an independent scale on Steam's toggle (and the RTL scale: -s s variant) enlarge both the visual and the hit-test area without breaking the knob's translateX state or Steam's focus halo ::after? |
| CS2 | Steam slider: does the value follow the pointer relative to the track rect when the slider's hit area is enlarged by padding or a transparent pseudo-element, and does a taller capsule track keep SliderTrack::before width correct? |
| CS3 | Can checkboxes (.DialogCheckbox) and segmented buttons grow (padding / scale) inside the Notifications matrix without breaking the sticky %{CheckboxHeaders} alignment? |
| CS4 | Mostly settled by SP §3: hosts are fixed-width (barpopup 300 px, so three tiles = three popups), our own popups take offset/scale and stay laser targets [PROVEN]. Still open: run the SendPendingInstanceParamsToSteamVR wrapper on Steam's own QAM and bar popups (×1.1–1.25, small z) and confirm the clip rect and laser mapping follow |
| CS5 | Can T3 views in popup hosts (the side tiles) be first-class gamepad targets: D-pad Left/Right moving focus between three popup windows, B closing all three, focus returning to the bar? (SR proves T3 nav trees in the main window; SP §3.3 leaves cross-popup focus open) |
| CS6 | With the settings content width limited (max-width on the inner width wrapper) and rows at 64–72 px, does Steam's scroll-padding / scroll-into-view still keep the focused row clear of the header and footer? |
| CS7 | Can SteamVR's settings page be given gamepad focus (its React has a gamepad model for Now Playing), or is a Steam-side mirror the only route? |
| CS8 | Can a Steam-side control open SteamVR settings directly at a given section (frame SwitchToPage + the settings route page) without a visible flash of the General page? |
| CS9 | A lab host for 340 × 80 toast mocks (SN CQ9). |
| CS10 | A lab helper that gives the dashboard bar gamepad focus for a bounded time and returns it, so bar and QAM traversal can be verified without a user. |
| CS11 | The volume HUD's placement (head-locked offset −0.4 / −0.8 m, pitch −20°) is a popup request (SP §3.1); confirm the CS4 wrapper can change it for this host type (5) without affecting other popups |
| CS12 | Do the settings page transitions (%{PagedSettingsDialog} Enter/Exit) finish on transitionend or fixed timers (SN CQ6 for routes)? |
Appendix 1. Steam Settings, row by row
From settings_sweep.js on 2026-10-07. "t" toggle, "dd" dropdown, "b" button, "v" read-only value, "in" text input, "cb×n" n checkboxes, "row" clickable list row, "sl" slider; "(desc)" = has a description line; "dis" = disabled at the time. Personal values (network names, device names, serial number, versions) are omitted.
- System: Select preferred language (dd) · Updates: Software Updates (b Apply), Update available (v) · Beta Participation: OS Update Channel (dd), Steam Client Update Channel (dd) · System Settings: 24-hour clock (t, desc), Timezone (dd rich, 96 px row), Default to Desktop Mode on startup (t), Enable Developer Mode (t) · SteamOS Crash Report: Enable SteamOS Crash Reports (t, desc), Application / Kernel / GPU crash collection, Service Log, System Info, Driver crash collection (6 t, dis) · About: Hostname (b), OS Name, Codename, Variant, Version, Build, Kernel Version, Device Serial Number (7 v) · SteamVR: Version, Web Build Date, HMD Tracking Info (3 v) · Steam: Version, Client Build Date, Web Build Date, API Version (4 v), Third-Party Licenses and Source Code (b) · Hardware: CPU Vendor, Name, Frequency, Physical Cores, Logical Cores, Available Logical Cores, RAM, Video Card, Video Driver, VRAM (10 v) · Advanced: Steam Runtime System Information (b Run Diagnostics), System Report (b Create Report), Run storage device maintenance tasks (b Run, desc), Reset to factory state (b Factory Reset).
- Internet: Enable Wi-Fi (t) · Connected Networks: wired connection (row), current Wi-Fi (row, desc "Preferred connection") · Networks Found: one network (row), Other network… (row) · Advanced Settings: Offline Mode (b Enter Offline Mode), HTTP Proxy (b Configure), Delete Web Browser Data (b Delete).
- Storage: 2 drive tabs; usage bar and legend; Items header with sort dropdown; virtualized app rows (58 px).
- Bluetooth: Bluetooth (t), Show all devices (t) · Paired: 6 device rows (1 connected, 5 dis) · Searching for devices…
- Display: Virtual Display Scaling: Maximum Game Resolution (dd, desc with a Y glyph).
- Power: Battery: Battery Percentage (t, desc "Show battery percentage on dashboard bar") · When On Battery and Idle: Dim display after (dd), Sleep after (dd) · When Plugged In and Idle: Dim display after (dd), Sleep after (dd).
- Audio: Output: volume (sl), Output Device (dd), Spatialization (t, desc) · Apps: (empty) · Voice: mic volume (sl), Input Device (dd) · General: Enable UI sounds (t), Reset audio settings (b Reset).
- Controller: Connected Controllers: Steam Frame Controllers (b Details), Add a new controller (b Add Controller) · Advanced Settings (b Show Advanced Settings).
- Controller › Advanced: External Gamepad Settings: Idle Gamepad Shutdown Timeout (dd) · Non-Game Controller Layouts: Desktop Layout (b Edit + icon b) · Controller Firmware: Force update all connected Steam Controllers (b Start).
- Keyboard: Current Keyboard Theme (dd + preview b), Find More Keyboard Themes (b Visit the Points Shop, desc), Haptics (dd), Initial Location (Desktop) (dd), Initial Location (Overlay) (dd) · Active Keyboards: Select Available Keyboards (b Edit), current layout (radio row) · Quick Chat Options: Option 1–8 (8 in).
- Accessibility: High Contrast Mode (t, desc), Reduce Motion (t, desc), Color Filter (dd, desc), Mono Audio (t, desc).
- Security: Lock Screen: description row, On system wake and power up (t).
- Notifications: Show Notification Toasts… (dd, desc), Play a sound when a notification toast is displayed (t) · Client Notifications: achievement, controller connect/disconnect, controller battery low, wake with multiple users (4 rows × 2 t) · Friend Notifications: friend joins a game, comes online, direct chat message, chat room notification (4 rows × 2 t), Flash window (segmented: Always / Only when minimized / Never) · Store News: major sale (cb×4) · Personal Activity: friend invitation, discussion reply, inventory item, gift, trade offer, Support reply, Steam Turn, Playtest invite (cb×3–4 each), review copy for a curator group, Community Awards, Steam Replay (cb×1 each) · Wishlist Activity: on sale (cb×4), released, demo released (cb×1) · Steam Family Activity: (rows appear with a family) · Developer / Game News: followed developer released, released a demo, game events, season pass content, roadmap content (cb×1 each) · Email Opt-out: Opt out from all email marketing (t, desc).
- Friends & Chat: Append nicknames (t, with a preview friend), Group friends by game, Hide offline friends in custom categories, Hide categorized friends in Online/Offline, Ignore 'Away' when sorting, Sign in to friends when Steam Frame starts, Animated avatars and frames, Compact friends list & chat view, Compact favorite friends area (9 t) · Chat: Dock chats to the friends list, Open a new window for new chats, Don't embed media in-line, Remember my open chats (desc), Disable spellcheck, Disable animated room effects (6 t), Chat Filtering (b Manage, desc) · Chat Font Size (segmented: Small / Default / Large).
- Downloads: Download region (dd), Limit download speed (t), Display download rates in bits per second (t) · Game Updates: Schedule auto-updates (t), Allow downloads during gameplay (t, desc), Throttle downloads while streaming (t, desc), Game File Transfer over Local Network (t, desc), Allow transfers from this device to (dd).
- Cloud: Enable Steam Cloud (t, desc), Screenshot Management (t, desc).
- In Game: Screenshots: Include Steam UI elements in screenshots (t) · More: Steam Networking (dd, desc with link).
- Compatibility: Steam Play: Default compatibility tool (dd, desc), Show all compatibility tools (t).
- Family: text, Steam Families link, Try Steam Families (primary b).
- Remote Play: Enable Remote Play (t, desc) · Computers & Devices: host (b Connect), Pair Steam Link (b) · Connection Options: Allow Direct Connection (dd), Connection PIN (b Set PIN) · Advanced Host Options (t, desc) · Advanced Client Options (t, desc) · Wireless Streaming Adapter (Steam Frame): Enable Streaming Adapter (t), Connection Management (dd), paired adapter (b Unpair), connected host (b Connected, dis), Show Advanced Wi-Fi Settings (t) · Learn More (b View FAQ).
- Game Recording: 3 mode cards (Recording Off / Record in Background / Record Manually), Learn More (b View FAQ) · Shortcut Keys: start/stop shortcut (row), timeline marker shortcut (b Set shortcut) · Video Recording: Recording Quality (b), Maximum frame rate (dd), Maximum video height (dd, desc) · Audio Recording: Record Microphone (t, desc), Record Audio from… (dd, desc, dis).
- Home: Big Art Mode (t, desc), Show personalized store content on my Home (t) · What's New Settings: Only show product updates (t), hidden games (b Manage), instructions (row).
- Library: Low Performance Mode (t, desc), Show Steam Deck compatibility information (t) · Activate a product on Steam: Add to Library (b Add game, desc).
- Store: Mature Content, Exclude from My Store, Discovery Queue Content, New On Steam Queue Content, Platform Preference, Steam Deck Feedback, Live Broadcasts (7 × b Manage, desc).
- Developer: Profiling: System Tracing (t, desc), Graphics Profiling (t, desc) · Development Kit: host pairing (b Pair new host) · Steam Play: default compatibility tool (dd, desc) · Wi-Fi: Wi-Fi Power Management (t, desc), Force WPA Supplicant backend (t) · Miscellaneous: Show Steam Controller Tour, external display refresh control, Force Composite, Composite Debug, Disable Color Management (5 t), Session for Desktop Mode (dd), Speaker Test (b Start), Show Advanced Update Channels (t), HDR Debug Visualization (dd), Disable Mura Compensation (t), Re-arm Mura Calibration (b Start), Force Format SD Card (b Format), advanced display scaling for internal display (t), Game Launch Interstitials Seen (b Clear All), Steam Console (b Open), timestamps in console, gamescope browser composer, gamescope VR browser composer, force system browser composer (4 t), browserview underlays (t, desc), CEF Remote Debugging (t, desc), User Password (b Change User Password), HDR Compatibility Testing (t, desc), Hardware Updates (b Update all devices now) · Steam Input: Layout Dev Mode, API Config Author Mode, Keyboard Glyphs (3 t, desc).
Appendix 2. Quick Access, row by row
From qam_sweep.js on 2026-10-07 (theme on; sizes are Steam's, unchanged by Phase 1).
| tab | rows (control, size in px) |
|---|---|
| Notifications | empty state "No new notifications" (16 px) |
| Quick Settings | Brightness: Brightness (slider 237 × 28, row 48), Environment Brightness (slider 237 × 28, row 48) · Audio: Volume (slider 240 × 24, row 44), Microphone Volume (slider, row 44) · Other: Wi-Fi (toggle 38 × 22, row 42), current network (clickable row 40), Bluetooth (toggle, row 42), 6 device rows (40 each; 5 disabled), Add Device (row 40), Airplane mode (toggle, row 42) |
| Performance | System Profile (2-notch slider 270 × 39, row 85), Basic View (button 267 × 40) · Common Settings: Manual GPU Clock (toggle) · Non-VR Settings: Performance Overlay Level (5 notches), Disable Frame Limit (toggle), Scaling Mode (5 notches), Scaling Filter (3 notches) · VR Settings: Show Perf Overlay in VR, Record VR Performance, Record Tracking (toggles), Refresh Rate (2-notch slider, current value shown as text), Motion Smoothing (toggle), Reset to Default (button 299 × 40) |
| Battery Info | headset summary (clickable row 60), Right Controller (row 44) |
| Help | Visit Help Site, Report a Bug, Replay Guided Tour, Show Frame Tutorial Videos (buttons 267 × 40, rows 60) |