1 Commits
Author SHA1 Message Date
MichaelScottsmanandClaude Opus 5.5 75a6e6c246 Fix Steam renderer crash when LiquidAss is launched from +
A top-level @starting-style on the light layer's ::after (registered
custom properties under the @container style() gate) SEGVs Steam's
Chromium 126 renderer when the theme is injected while the pointer rests
on a hovered element. Launching LiquidAss from + > Launch Program does
exactly that: the laser is still on the row when the stylesheet lands,
so every launch crashed the whole gamepad UI (reproduced 3/3 with real
clicks; CSS-only reproduces too; gone without the rule).

The ramp in from dark is now a keyframe animation (lgs-ill-in) scoped to
the illumination hosts' in-rule, so it no longer reaches Steam's own
::after either.

Home's gamepad focus and blur handlers return when the module is torn
down, so turning the theme off no longer throws in 41-home.js.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:21:16 -04:00
3 changed files with 16 additions and 15 deletions

No files matched your search

+3 -1
View File
@@ -639,6 +639,7 @@ function homeComponents(R, rt) {
onMenuButton: isGame && HS.appMenu ? (e) => homeTileMenu(R, item, e && e.currentTarget) : undefined,
onMenuActionDescription: isGame && HS.appMenu ? (homeStr(R, 'options') || undefined) : undefined,
onGamepadFocus: (e) => {
if (!HS) return; // module torn down (lgs off) while Steam still moves focus on the leaving page
const sk = HS.sectionKey || 'x';
HS.focusKey[sk] = item.key;
// focus that Steam moved into row 1 from outside our page (C1a's search capsule above a folder's
@@ -651,7 +652,8 @@ function homeComponents(R, rt) {
if (d && HS.P.attention && homePad()) HS.P.attention.feed(d, 'enter', 'pad');
},
onGamepadBlur: (e) => {
const d = e && e.currentTarget && e.currentTarget.querySelector ? e.currentTarget.querySelector('.lgs-home-disc') : null;
if (!HS) return;
const d =e && e.currentTarget && e.currentTarget.querySelector ? e.currentTarget.querySelector('.lgs-home-disc') : null;
if (d && HS.P.attention) HS.P.attention.feed(d, 'leave', 'pad');
// gamepad: the card starts closing at the move, not after the 0.3 s grace (HA-17); a bounce back
// within the grace restores it through onReenter
+8 -11
View File
@@ -231,15 +231,12 @@ html.lgs-on .lgs-arrive { animation: lgs-arrive var(--lgs-motion-page) backwards
/* ------------------------------------------------- the light layer's ramp in
An illumination host's ::after exists only while the host is lit (04-states.css, the hook blocks' gate),
so it is created already lit: it starts from dark, and the in-transitions (04-states.css §2) ramp hover,
within and press up as they did when the layer was always there. Top level: Chromium 126 ignores
@starting-style nested in a style rule (the wrapped files). Focus jumps in (0s) through lgs-focus-in. */
@starting-style {
html.lgs-on:not(.lgs-input-pad) :hover::after,
html.lgs-on:not(.lgs-input-laser) :is(.gpfocus, .gpfocuswithin)::after,
html.lgs-on :is(:active, .lgs-pressed)::after {
--lgs-hover: 0;
--lgs-within: 0;
--lgs-press: 0;
}
so it is created already lit: lgs-ill-in starts it from dark (04-states.css §2, the in-rule), and the
in-transitions take over after. Focus jumps in (0s) through lgs-focus-in.
Never @starting-style here: on Steam's Chromium 126, a top-level @starting-style on these ::after
(registered properties, under the @container style() gate) SEGVs the whole renderer when the theme is
injected while the pointer rests on a lit host, e.g. the LiquidAss row of "+" > Launch Program
(2026-10-09, reproduced 3/3; gone without the rule). */
@keyframes lgs-ill-in {
from { --lgs-hover: 0; --lgs-within: 0; --lgs-press: 0; }
}
+5 -3
View File
@@ -243,11 +243,13 @@
--lgs-focus 0s,
--lgs-within var(--lgs-ill-d-in) var(--lgs-ill-ease),
--lgs-press var(--lgs-ill-d-press) var(--lgs-ill-ease-press);
/* created lit (the hook blocks' gate): its ramp in starts from dark, @starting-style in
02-motion.nowrap.css (Chromium 126 ignores it nested in this wrapped file) */
/* created lit (the hook blocks' gate): its ramp in starts from dark (lgs-ill-in,
02-motion.nowrap.css; never @starting-style, which crashes Steam's renderer) */
animation: lgs-ill-in var(--lgs-ill-d-in) var(--lgs-ill-ease) backwards;
}
&:not(.lgs-input-laser) .gpfocus::after {
animation: lgs-focus-in var(--lgs-ill-d-in) var(--lgs-ill-ease) backwards;
animation: lgs-ill-in var(--lgs-ill-d-in) var(--lgs-ill-ease) backwards,
lgs-focus-in var(--lgs-ill-d-in) var(--lgs-ill-ease) backwards;
}
}