28 Commits
Author SHA1 Message Date
MichaelScottsman 072461cf13 Stereo on the bar, frame menu and footer; VR Settings no longer makes the bar and frame menu glass jump
- glassd took the window's scale from any surface placed by Steam's main overlay; SteamVR's panels
  (vr.settings 1858 px, vr.ctl 488 px) are placed by it too, so while VR Settings showed, the bar's and the
  frame menu's glass were rescaled x2.58 / x9.86 by turns every geometry fetch (the flicker). The scale now
  comes from the main surface only.
- Cropped surfaces are stereo: lgs_sg.js reports each panel's u range (beat crops), the daemon passes it
  as surfaces[].crop, glassd builds the eye pair around the crop (right copy shifted by the crop width,
  each eye clipped to its crop) and the cover panel spans the pair.
2026-10-09 15:04:37 -04:00
MichaelScottsman af4e73c1d3 Stereo glass: each eye sees the room behind the window glass from where it is; tuner fits its popup; the sidebar keeps native glass without the laser; Home leaves on the route exit
Stereo (glassd cap stereo, flag glassStereo, on)
- The window glass was one image both eyes saw on the glass plane, so the room behind it read as a picture
  pasted on the glass. glassd now renders each eye's view (SteamVR's eye-to-head offsets, refreshed every
  5 s): every region of a stereo surface's texture is a pair, left eye's copy then right eye's, and the
  scene graph's panel spans the pair with stereoscopy Parallel.
- Measured on the device with a lab probe (lgs_sg test.stereoProbe): SteamVR splits a Parallel panel at
  the middle of the panel's own uv rect, not at the texture's halves; hence the pair layout, and stereo only
  where the scene graph shows a surface whole (main, SteamVR's panels). The bar, the frame menu and popups
  show crops and stay mono. A slab clipped sideways is left out while it is.
- GPU about 2.9 -> 3.5 ms a frame.

Sidebar without the laser
- frame.menu is no longer laser-only: SteamVR shows it in gamepad mode (laser mouse off) and beside its own
  pages; keyed on the gamepad flag its native glass went off and the CSS glass showed. Verified with the
  flag forced to gamepad on Home and in VR Settings: the cover stays.

Home -> Library
- The shell stamps the leaving Home view with the moment it starts leaving (only on a way out of Home, kept
  across Steam's /library redirect); Home fades on the route exit and the reporter lets its plates go on
  that clock. Measured: all Home discs reported leaving in the first report, gone with the page.
- Plates whose element leaves the DOM are reported leaving from the mutation itself (no measuring), not
  after a frame-driven tick the new route's render starves.

Glass tuner
- The popup fits Steam's 600 px bar popup cap (rows 76 px: label and value on one line over a 40 px slider);
  open()/close() for tests.
2026-10-09 14:51:41 -04:00
MichaelScottsman 5af91fc1bd Glass leaves with its page; the sidebar keeps native glass in VR Settings; Friends clears the search row; a paintbrush on the bar tunes the glass
Route changes
- Plates fade with their content: the reporter reads a running opacity fade on a plate or its ancestors
  (Home -> Friends: the route's 150 ms exit) and reports exitAt/exitMs; glassd fades the plate's coverage
  linearly on that clock, optics unchanged (cap exitAt); the daemon keeps a leaving plate for exactly
  that fade. A plate whose element left the DOM (Home -> Library stays in one /library route: no fade,
  Home unmounts when Library has rendered) goes in 90 ms instead of the 350 ms dematerialize ramp that
  left Home's discs over the Library grid.
- The window cover arrives with the route: the shell sets the new route's glass mode in the history
  change itself, the reporter reports the mode flip at once (tickNow) with the time it happened, and
  glassd springs a kept surface's new cover from then (appearAt now also for main gaining its cover).
- A disc popped at the switch belongs to the page that leaves: it never flips the new page to the crops
  layout and goes with the page's fade (lgs_sg.js routeOut).

Sidebar in VR Settings
- The frame menu is a laser-only surface keyed on Steam's gamepad-nav flag, which goes stale on
  SteamVR's own pages (the laser works SteamVR's page): the native glass went on and off with every
  input Steam saw, its CSS glass in between. On a SteamVR page (the frame's VR Settings action active)
  the rule does not apply.

Friends
- The page starts at y 108 (C1a's pad + 40, as Settings' list): the sidebar platter no longer sits
  under the search capsule.

Glass tuner (flag glassTune, on)
- A paintbrush circle after the system capsule (its own glass piece and native cover) opens a bar popup
  through Steam's own bar popup button: colour (8 swatches) and tint strength, Glass intensity (the
  dial), Refraction, Frost, Highlights, Reset to default.
- Daemon action glass.tune (kind ui, its own 40 ms rate, outside the global window): glassd.json at once,
  ~/.config/glass-shell/tune.json 400 ms after the last change (kept across reboots by request; the
  defaults delete it; RT-6 allows exactly this file), the dial file mirrored for the SteamVR pages.
- glassd: tune {refract, frost, light, hue, hueK} applied in drawGlass, eased (40 ms) like the dial now
  is; the glass body's neutral moves toward the hue (uHue), per-piece tints stay on top (cap tune).
- The CSS glass follows live: a style per Steam window sets --lgs-dial / --lgs-tune-hue; the material
  tints mix the colour in.
2026-10-09 14:06:10 -04:00
MichaelScottsman e1d7318559 Light layer only while lit: a third less style work per route change
The illumination ::after (04-states.css) painted nothing at rest but was computed for every host (46-93 per route,
~25 custom properties and six gradients each) at every style recalc. The generated host entries (fontkit.py --hooks)
now carry a :where() gate (hover, active, focus, focus-within, pressed, focus-in, .lgs-lit): the layer exists only
while lit. rt/06-states.js holds .lgs-lit for 600 ms after hover, focus or press ends, so the 441 ms fade-out still
plays; a top-level @starting-style (02-motion.nowrap.css) ramps the light in from dark. Verified: ramps unchanged
(press in 0/.66/.98/1, out .86/.45/.03), no layer at rest; route changes ~48 -> ~55 fps.
2026-10-09 01:52:07 -04:00
MichaelScottsman 12722f00e8 glassd: lazy room fill, 8x feed; contract docs for native-only glass
- The room map's fill (push-pull, row fill, mips) runs before a render that
  samples it, at most ~15 Hz, instead of after every feed frame (room GPU per
  feed frame 0.7 -> 0.19 ms); the feed is decimated 8x (240x135, the room map
  sampled it about that coarse already).
- reporter.md, glassd.md, daemon.md: armed/pooled/appearAt, optimistic marks,
  standby surfaces and the panel watch, lgs-native per session.
2026-10-08 23:56:55 -04:00
MichaelScottsman dc3071aac0 Smooth transitions: sidebar width morph, window glass materialize, launcher plate exit
- Frame menu: measured expanded width so Steam's width transition animates;
  reporter sends cover.morph end shape + start time, glassd morphs the glass
  on the same spring (70 ms native lead).
- Main window: glass-mode change reported from the mutation callback and the
  cover marked data-lgs-cover="pending" (no opaque CSS window); glassd springs
  covers in/out; daemon keeps lgs-native 1.5 s between modes.
- Launcher: the name plate dissolves in place, then the label fades back.
2026-10-08 23:04:35 -04:00
MichaelScottsman 894c891980 Fixes from user headset feedback: library bottom capsule, tab bar radius, Settings pop removed (split window), perf: scope launcher CSS to barpopup, reporter 15 Hz, cheaper sweep 2026-10-07 22:54:50 -04:00
MichaelScottsman 503017b154 Ship: native glass on by default, all phase 2 areas and real launches enabled (device/defaults.json) 2026-10-07 21:30:57 -04:00
MichaelScottsman 49286acda1 Checkpoint: R2 reviews of all 14 context packages, coordinator decisions, P10 and platform request handling 2026-10-07 17:43:20 -04:00
MichaelScottsman 769b4b2470 Checkpoint: R2 coordinator decisions (PLAN 1.19) and partial R2 reviews before usage-limit interruption 2026-10-07 15:15:00 -04:00
MichaelScottsman c01df80df4 Context round complete: all 14 context packages built to M3 (some M4) and report READY 2026-10-07 12:51:17 -04:00
MichaelScottsman ca69915d8f Platform packages P1-P10 built, reviewed and fixed (R1); P7 anchor fix (texture uv) and popup curvature; context round in progress 2026-10-07 12:42:46 -04:00
MichaelScottsman dd4f775645 WIP checkpoint: platform packages built (M3), core contexts C1a/C1c/C2a at M2, C4a at M3 2026-10-07 08:21:40 -04:00
MichaelScottsman 65ab8fc09b WIP checkpoint: phase 2 build round R1 interrupted by usage limit (contracts M1 for P1-P10, partial platform code, context M0 work) 2026-10-07 05:03:08 -04:00
MichaelScottsman 2423221106 Phase 2 design: 7 reviewed concepts with mockups, cross-concept agreement, build plan (27 work packages) 2026-10-07 03:58:50 -04:00
MichaelScottsman 2f6deadb1a Phase 2 capability: input mode (laser vs gamepad), gpfocus behaviour, overlay haptics, nav sounds, CSS scroll guard 2026-10-07 03:18:11 -04:00
MichaelScottsman 24dd796135 glassd material v2: edges from shape and light, not outlines; prism lensing, glass-over-glass, unknown-room fill, materialize phase, test backdrop 2026-10-07 02:46:19 -04:00
MichaelScottsman 657549eb8f Phase 2 research: visionOS principles, laser/gamepad input model, 89-item conformance checklist 2026-10-07 02:26:51 -04:00
MichaelScottsman e6f3a869d8 Native layer first live end-to-end run: findings (ghosts outside covers, rim outlines, flat fallback); feed use for real glass documented 2026-10-07 01:31:46 -04:00
MichaelScottsman dfd77ec82d Native layer: glassd renderer, SteamVR scene-graph compositor + lgs-shell daemon, layer reporter + native CSS (built, reviewed, fixed; native mode opt-in) 2026-10-07 01:28:45 -04:00
MichaelScottsman 6dd9c9f052 SteamVR pages: mapped, themed, reviewed and fixed (frame controls, grab bar, Now Playing, settings, bindings, keyboard, overlays) 2026-10-07 00:31:50 -04:00
MichaelScottsman 5e924d3458 Phase 1 checkpoint: Steam UI theme areas, SteamVR page themes, native layer in progress 2026-10-06 23:49:43 -04:00
MichaelScottsman 7ee1310d18 native spikes: scene-graph layering + dmabuf overlays proven
- IVROverlayView reads system overlays (systemui, HeadsetView) but not
  Steam's dmabuf-backed panels
- SteamVR systemui scene graph accepts injected nodes (DOM elements with
  buildNode; submit via module 5723's scheduler): reparent-to-panel +
  panel-anchor + transform + panel shows live crops of Steam's window at
  any 3D offset, and our own dmabuf overlays (needs SetOverlayMouseScale)
- hvgrab: headset-view capture for verification
2026-10-06 22:53:36 -04:00
MichaelScottsman 24f608ce96 docs: SteamVR pages (vr: surfaces) in LAB and DESIGN 2026-10-06 22:04:27 -04:00
MichaelScottsman 6f238edf4a Mapping: 7 area inventories (200 screens); lab fixes from mapping
- docs/inventory/*.md: every surface, route, sub-menu and state with
  reproducible --pre snippets, tokens, Steam-owned pseudo/transforms, risks
- lab: exact surface targeting (bar vs barpopup), locked js, mark/restore
  closes menus/dialogs/popups a step opened, MSYS route unmangling, UTF-8
- tokens: high-contrast mode goes opaque
- docs/LAB.md: gotchas (animated focus fills need !important, keyboard
  focus class, clipped popups, multiple page backgrounds)
2026-10-06 21:48:27 -04:00
MichaelScottsman f168595d6d lab: perf command (theme off vs on frame pacing); measured perf budget 2026-10-06 20:47:33 -04:00
MichaelScottsman 9ff446551a Design spec, tokens, transparency dial, lens engine, focus helpers
- docs/DESIGN.md: materials (window/panel/liquid/thick glass), states,
  components, guardrails, file ownership
- theme/00-tokens.nowrap.css: all colours, materials, radii, motion
- lgs dial: transparency dial remembered for the next 'on'
- device/lgs_lens.js: per-element SVG refraction (bible engine port),
  opt-in through theme/lens.json
- bundler quarantines stylesheets with unbalanced braces; unresolved
  tokens are attributed to files
- lab: clickText, pad (virtual D-pad focus), focused
2026-10-06 20:44:10 -04:00
MichaelScottsman a78eb9c3ea Glass Shell infrastructure: in-memory theme injector, toggle CLI, launcher, lab driver
- device/lgs_core.js + lgs_index.js: inject theme CSS into every Steam gamepadui
  popup from SharedJSContext; readable %{Token} classes resolved from Steam's
  webpack CSS modules; never persisted (Steam restart/reboot = stock UI)
- device/lgs(.py): on/off/toggle/status CLI; glass-shell.desktop puts
  'Liquid Glass' in the dashboard bar's + > Launch Program list
- lab/: locked navigate/click/screenshot/outline/audit tools for the live UI
- glass.py: PC-side driver over the steam-frame-ssh helper
2026-10-06 20:34:33 -04:00