Files

394 lines
18 KiB
CSS

/* Glass Shell, area "steamvr": Now Playing (package C5b, GP §4.13, §9.7).
#nowplayingpanel in vr:systemui: the main panel of a running scene app's
frame, 1858 x 1045 NP px (NP px = main px x 1.44), the same window as
Steam main. A visionOS now-playing window: window glass, the game art as
content, the title in Extra Large Title 1, Resume as the one green
Liquid Glass capsule, the sheets' rows (VR Controller Bindings, VR Video
Settings, Clear Performance Assessment Status) in one recessed platter,
Exit as a capsule below it.
- Never the panel's box, padding or size (the panel root is the quad).
- Global SteamVR classes only (GamepadUIButton, ResumeButton, gpfocus,
Disabled, ...): a hashed token that resolves only in systemui would be
unresolved on the binding and keyboard pages (every theme/vr file is
bundled into every SteamVR page).
- Buttons are found by structure and T2 keys, never by position:
Resume = .ResumeButton; sheet rows = buttons whose label is wrapped in
a <span> (SteamVR's own markup for bindings, video, perf); Exit has a
plain text label. Red only with data-lgs-np="exit" (T2,
device/vr/systemui.nowplaying.js, flag wp.c5b); neutral otherwise.
- Gamepad focus is SteamVR's own .gpfocus (D-pad Up/Down, A, B =
Resume): the focus add as light, no ring; the Steam-owned
.gpfocus::after ring is cleared and its 20x blinker stopped.
- Laser hover (laser-mouse mode has no gamepad focus) is the strong
SteamVR hover (00-vr-tokens.css).
Wrapped as html.lgs-on { ... }. */
/* ------------------------------------------------------------------ */
/* 1. The panel: window glass (the panel clips: everything inset) */
/* ------------------------------------------------------------------ */
.DashboardMain .DashboardPanel.NowPlaying {
/* glyphs (white, for chips; black, for masks) */
--c5b-g-play: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.5 4.8c0-.9 1-1.5 1.8-1l10.6 6.4c.8.5.8 1.6 0 2.1L9.3 18.7c-.8.5-1.8-.1-1.8-1z'/%3E%3C/svg%3E");
--c5b-g-exit: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 4H6.5A1.5 1.5 0 0 0 5 5.5v13A1.5 1.5 0 0 0 6.5 20H10M15 8l4 4-4 4M19 12H9.5'/%3E%3C/svg%3E");
--c5b-g-bind: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' fill-rule='evenodd' d='M7.2 7h9.6a4.6 4.6 0 0 1 4.5 5.6l-.9 4.1a2.3 2.3 0 0 1-4 .9L14.6 16H9.4l-1.8 1.6a2.3 2.3 0 0 1-4-.9l-.9-4.1A4.6 4.6 0 0 1 7.2 7zm.3 2.6v1.3H6.2v1.4h1.3v1.3h1.4v-1.3h1.3v-1.4H8.9V9.6zm8.3.2a.9.9 0 1 0 0 1.8.9.9 0 0 0 0-1.8zm-1.6 1.8a.9.9 0 1 0 0 1.8.9.9 0 0 0 0-1.8z'/%3E%3C/svg%3E");
--c5b-g-video: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' fill-rule='evenodd' d='M12 5.5c5 0 8.6 3.9 9.8 6.5-1.2 2.6-4.8 6.5-9.8 6.5S3.4 14.6 2.2 12C3.4 9.4 7 5.5 12 5.5zm0 3a3.5 3.5 0 1 0 0 7 3.5 3.5 0 0 0 0-7z'/%3E%3C/svg%3E");
--c5b-g-perf: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.2' stroke-linecap='round'%3E%3Cpath d='M4 16a8 8 0 1 1 16 0'/%3E%3Cpath d='M12 16l4-5'/%3E%3C/svg%3E");
--c5b-g-chev: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='rgba(255,255,255,0.70)' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9.5 5.5 16 12l-6.5 6.5'/%3E%3C/svg%3E");
--c5b-play-lit: color-mix(in srgb, var(--lgs-green), white 12%);
/* the specular light: a lobe at 26 % of the width from the key light,
never a full-width top line (PLAN 1.6 E3; G-OUTLINE edge profile) */
--c5b-lobe: radial-gradient(30% 55% at 26% 0, rgb(255 255 255 / .16), rgb(255 255 255 / 0));
--c5b-raised: var(--c5b-lobe), var(--lgs-fill-thin);
--c5b-glow: 0 0 calc(var(--lgs-white-glow-blur) * 1.44) calc(var(--lgs-white-glow-spread) * 1.44) rgb(255 255 255 / var(--lgs-white-glow-a));
background:
radial-gradient(20% 14px at 26% 0, rgb(255 255 255 / .18), rgb(255 255 255 / 0)),
var(--lgs-mat-window-bg);
/* light from above is the E3 lobe only (no full-width top line) */
/* no E4/E5 dark edge: on a transparent SteamVR overlay the inset black
shadow comes out as a bright band in the page's pixels (C5b log) */
box-shadow: none;
border-radius: var(--lgs-vr-r-window);
color: var(--lgs-text-1);
font-family: var(--lgs-font);
}
.DashboardMain .NowPlaying .HeroBackground {
border-radius: inherit;
}
/* ------------------------------------------------------------------ */
/* 2. Art: content. 540 x 810 (Steam's own --width), radius 29 */
/* ------------------------------------------------------------------ */
.DashboardMain .NowPlaying .ArtworkColumn {
--width: 540px;
flex: none;
margin-left: 26px;
border-radius: var(--lgs-vr-r-card);
box-shadow: 0 14px 50px rgb(0 0 0 / .45);
}
/* no 600 x 900 art: SteamVR's placeholder portrait (opaque #282828, an
inline background-image) is decoration and goes; the card becomes a
fill on the glass that keeps .IconBackgroundBlur and shows the title.
Real art and app icons have another URL and are never matched. */
.DashboardMain .NowPlaying .PortraitAppImageContainer.Fallback > .Icon[style*="appimage_default_portrait"] {
background-image: none !important;
}
.DashboardMain .NowPlaying .PortraitAppImageContainer.Fallback {
background: rgb(255 255 255 / .06);
border-radius: inherit;
}
.DashboardMain .NowPlaying .ArtworkColumn:has(> .PortraitAppImageContainer.Fallback) {
box-shadow: none;
}
.DashboardMain .NowPlaying .PortraitAppImageContainer.Fallback .Title {
font: 700 46px/1.15 var(--lgs-font);
letter-spacing: -.01em;
color: var(--lgs-text-1);
}
/* ------------------------------------------------------------------ */
/* 3. The info column: 760 wide, 122 after the art (centred in the */
/* panel: art at x 218 (26 into the padding box), column at x 880) */
/* ------------------------------------------------------------------ */
.DashboardMain .NowPlaying .InfoColumn {
flex: 0 0 760px;
width: 760px;
margin-left: 122px;
margin-right: 0;
}
.DashboardMain .NowPlaying .NowPlayingAppTitle {
margin: 0 0 36px;
font: 700 92px/1.08 var(--lgs-font);
letter-spacing: -.02em;
color: var(--lgs-text-1);
text-shadow: none;
white-space: normal;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
/* the caption: SteamVR's own "#Now_Playing" string, written by T2 on the
column (not on the title: inside the title's two-line clamp it would
take one of the title's lines) */
.DashboardMain .NowPlaying .InfoColumn[data-lgs-np-cap]::before {
content: attr(data-lgs-np-cap);
display: block;
margin-bottom: 8px;
font: 600 29px/1.3 var(--lgs-font);
letter-spacing: 0;
color: var(--lgs-text-2);
}
/* every action: our geometry, Steam's handlers and order */
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton {
position: relative;
box-sizing: border-box;
display: flex;
align-items: center;
width: 100%;
min-height: 0;
margin: 0;
padding: 0 40px;
font: 600 36px/1.15 var(--lgs-font);
letter-spacing: 0;
text-transform: none;
color: var(--lgs-text-1);
background: var(--c5b-raised);
background-size: auto;
background-position: 0 0;
box-shadow: none;
transition-property: background-color, box-shadow, color;
transition-duration: var(--lgs-d-hover-in);
transition-timing-function: var(--lgs-ease-b0);
}
/* Steam's hover shadow layer (::before) becomes our light layer or glyph
below; its fade-in transition goes */
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton::before {
transition: none;
box-shadow: none;
opacity: 1;
}
/* the Steam-owned focus ring element: no outline, no flash, no blinker */
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton::after,
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton.gpfocus::after {
outline: none;
outline-color: transparent;
animation: none;
border-radius: inherit;
opacity: 0;
}
/* ------------------------------------------------------------------ */
/* 4. Resume Game / Return to Home: 760 x 128 green Liquid Glass */
/* capsule, 44 px play glyph, dark label (CTL C-D21, REQ C4a) */
/* ------------------------------------------------------------------ */
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton.ResumeButton {
height: 128px;
margin-bottom: 36px;
justify-content: center;
gap: 18px;
border-radius: 64px;
font: 600 40px/1 var(--lgs-font);
background: var(--c5b-lobe), var(--lgs-tint-play);
background-size: auto;
background-position: 0 0;
color: var(--lgs-text-on-color);
box-shadow: 0 6px 18px rgb(0 0 0 / .30);
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton.ResumeButton::before {
content: "";
position: static;
inset: auto;
flex: none;
width: 44px;
height: 44px;
border-radius: 0;
background: currentColor;
-webkit-mask: var(--c5b-g-play) center / contain no-repeat;
mask: var(--c5b-g-play) center / contain no-repeat;
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton.ResumeButton:hover {
background: var(--lgs-tint-lift), var(--c5b-lobe), var(--c5b-play-lit);
color: var(--lgs-text-on-color);
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton.ResumeButton.gpfocus {
background: var(--lgs-tint-lift), var(--c5b-lobe), var(--c5b-play-lit);
color: var(--lgs-text-on-color);
box-shadow: var(--c5b-glow);
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton.ResumeButton:active {
background: linear-gradient(rgb(255 255 255 / .28), rgb(255 255 255 / .28)), var(--c5b-play-lit);
}
/* ------------------------------------------------------------------ */
/* 5. The sheet rows: one recessed platter (black .14, radius 52, */
/* padding 8), rows 116, a 64 px chip, 36 px Medium label, chevron. */
/* The rows are siblings, so the platter is drawn row by row; the */
/* light is a 44-radius pill on the row's ::before, inset 8. */
/* ------------------------------------------------------------------ */
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton):has(> span) {
height: 116px;
padding: 0 30px;
border-radius: 0;
font-weight: 500;
background: var(--lgs-fill-regular);
box-shadow: none;
}
/* first row (right after Resume): the platter's top; last row (no row
after it): its bottom */
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton.ResumeButton + .GamepadUIButton:has(> span) {
height: 124px;
padding-top: 8px;
border-top-left-radius: 52px;
border-top-right-radius: 52px;
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton):has(> span):not(:has(+ .GamepadUIButton > span)) {
height: 124px;
padding-bottom: 8px;
margin-bottom: 36px;
border-bottom-left-radius: 52px;
border-bottom-right-radius: 52px;
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton.ResumeButton + .GamepadUIButton:has(> span):not(:has(+ .GamepadUIButton > span)) {
height: 132px;
}
/* the light pill */
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton):has(> span)::before {
content: "";
position: absolute;
inset: 0 8px;
z-index: 0;
border-radius: 44px;
background: transparent;
pointer-events: none;
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton.ResumeButton + .GamepadUIButton:has(> span)::before {
top: 8px;
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton):has(> span):not(:has(+ .GamepadUIButton > span))::before {
bottom: 8px;
}
/* separators between rows (2 px white .08, inset past the chip) */
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:has(> span) + .GamepadUIButton:has(> span) {
background:
linear-gradient(rgb(255 255 255 / .08), rgb(255 255 255 / .08)) 120px 0 / calc(100% - 150px) 2px no-repeat,
var(--lgs-fill-regular);
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:has(> span):is(:hover, .gpfocus) + .GamepadUIButton:has(> span),
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:has(> span) + .GamepadUIButton:has(> span):is(:hover, .gpfocus) {
background: var(--lgs-fill-regular);
}
/* label: the span grows, the chevron trails */
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton) > span {
position: relative;
z-index: 1;
flex: 1;
min-width: 0;
display: flex;
align-items: center;
gap: 26px;
/* a long label (Clear Performance Assessment Status) wraps to two lines
inside the 116 row instead of pushing the chevron out */
white-space: normal;
line-height: 1.15;
text-align: left;
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton) > span::after {
content: "";
flex: none;
width: 30px;
height: 30px;
margin-left: auto;
background: var(--c5b-g-chev) center / contain no-repeat;
}
/* the coloured chip, only where T2 named the row (GQ7) */
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:is([data-lgs-np="bindings"], [data-lgs-np="video"], [data-lgs-np="perf"]) > span::before {
content: "";
flex: none;
width: 64px;
height: 64px;
border-radius: 50%;
background: var(--c5b-chip-g) center / 36px no-repeat, var(--c5b-chip);
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton[data-lgs-np="bindings"] { --c5b-chip: var(--lgs-indigo); --c5b-chip-g: var(--c5b-g-bind); }
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton[data-lgs-np="video"] { --c5b-chip: var(--lgs-blue); --c5b-chip-g: var(--c5b-g-video); }
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton[data-lgs-np="perf"] { --c5b-chip: var(--lgs-gray); --c5b-chip-g: var(--c5b-g-perf); }
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:has(> span):is([data-lgs-np="bindings"], [data-lgs-np="video"], [data-lgs-np="perf"]) {
padding-left: 22px;
}
/* row states: laser hover = the strong SteamVR hover; gamepad focus =
the focus add as light (no ring) */
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton):has(> span):hover::before {
background: var(--lgs-vr-hover-fill);
box-shadow: var(--lgs-vr-hover-rim);
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton):has(> span).gpfocus::before {
background: radial-gradient(60% 90% at 50% 25%, rgb(255 255 255 / var(--lgs-focus-spot)), rgb(255 255 255 / 0) 75%);
box-shadow: var(--lgs-vr-focus-ring);
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton):has(> span):active::before {
background: rgb(255 255 255 / .30);
}
/* ------------------------------------------------------------------ */
/* 6. Exit Game / Exit Home: 760 x 116 capsule below the platter. */
/* Red label at rest and the red fill on focus or hover ONLY with */
/* the T2 key; neutral (white label) otherwise. */
/* ------------------------------------------------------------------ */
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton):not(:has(> span)) {
height: 116px;
justify-content: center;
gap: 16px;
border-radius: 58px;
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton):not(:has(> span))::before {
content: "";
position: static;
inset: auto;
flex: none;
width: 36px;
height: 36px;
border-radius: 0;
background: currentColor;
-webkit-mask: var(--c5b-g-exit) center / contain no-repeat;
mask: var(--c5b-g-exit) center / contain no-repeat;
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton):not(:has(> span)):hover {
background: var(--c5b-lobe), rgb(255 255 255 / .30); /* one colour layer: stacked translucent layers drew a bright rim */
box-shadow: none;
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton):not(:has(> span)).gpfocus {
background: radial-gradient(60% 90% at 50% 25%, rgb(255 255 255 / var(--lgs-focus-spot)), rgb(255 255 255 / 0) 75%), var(--c5b-raised);
box-shadow: var(--lgs-vr-focus-ring);
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton[data-lgs-np="exit"] {
color: var(--lgs-red);
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton[data-lgs-np="exit"]:not(.Disabled):is(:hover, .gpfocus) {
background: var(--c5b-lobe), var(--lgs-fill-danger);
color: var(--lgs-text-on-color);
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton[data-lgs-np="exit"]:not(.Disabled):hover {
box-shadow: none; /* the red fill is the cue; a lit top arc read as a line on red (G-OUTLINE) */
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton[data-lgs-np="exit"]:not(.Disabled).gpfocus {
box-shadow: var(--c5b-glow);
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton):not(:has(> span)):active {
background: linear-gradient(rgb(255 255 255 / .30), rgb(255 255 255 / .30)), var(--c5b-raised);
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton[data-lgs-np="exit"]:active {
background: linear-gradient(rgb(255 255 255 / .22), rgb(255 255 255 / .22)), var(--lgs-fill-danger);
}
/* ------------------------------------------------------------------ */
/* 7. Disabled (while the app starts or quits): content at .40, no */
/* light, no red */
/* ------------------------------------------------------------------ */
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton.Disabled,
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton.Disabled:is(:hover, .gpfocus) {
color: rgb(255 255 255 / .40);
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton.ResumeButton.Disabled {
background: linear-gradient(rgb(0 0 0 / .45), rgb(0 0 0 / .45)), var(--lgs-tint-play);
box-shadow: none;
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:not(.ResumeButton):not(:has(> span)).Disabled {
background: rgb(255 255 255 / .06);
box-shadow: none;
}
.DashboardMain .NowPlaying .InfoColumn > .GamepadUIButton:has(> span).Disabled::before {
background: transparent;
box-shadow: none;
}