Files
MichaelScottsman a956d19b7f SteamVR panels: the native-glass overrides match (VR Settings showed its opaque CSS fill over glassd's glass)
The SteamVR theme is wrapped in html.lgs-on { }, so 'html.lgs-native-vr-settings ...' became
'html.lgs-on html.lgs-native-vr-settings ...' and never matched: the window fill (rgb(20 22 30 / .72)) stayed
on top of the native glass. Now '&.lgs-native-vr-*' (settings, frame-control row, More Options). Verified live:
the container's fill is transparent with the class set; the sidebar's .14 stays.
2026-10-09 07:21:30 -04:00

954 lines
37 KiB
CSS

/* Glass Shell C6b (phase 2): SteamVR's own settings page (#vrsettingspanel in
vr:systemui; tab bar > VR Settings, or Steam > VR Settings > SteamVR) and the
SettingsMain controls SteamVR reuses elsewhere (Now Playing's modals, dropdown
popovers). SET §4.10, CTL §13 / §19.2, PLAN §1.3-§1.6.
Sizes are SteamVR page px: the panel is 1858 px wide for Steam's 1280, so
m = 1.4516 (--lgs-vr-scale 1.45). The panel root keeps its 1858 x 1045 box
(its quad); everything else is layout inside it:
- the glass is 1858 x 952, radius 78, top-aligned = Steam's 1280 x 656 window
exactly (SET T-VR-FOOT), drawn by the free .SettingsMainPanel::before;
- the bottom margin (952-1045) holds the Advanced Settings ornament;
- a 576 px sidebar (black .14 region) whose 104 px rows at a 115 pitch scroll
in their own column from y 156; the "SteamVR" title at Steam's "Settings"
place; T2 adds the Back circle, icon circles and the section hero;
- the detail pane: a 1180 px column of rows in platters (115 rows, 35 px
labels, 32 px descriptions), Off/On pairs as switches (T2 tag), refresh
circles 86 at a 121 pitch, 92 px sliders, 86 px capsules in title case.
Light: SteamVR pages get no --lgs-ill hook, so hover is drawn here (white +.08
and a soft spot; navigation rows: the spot only). No borders, outlines, rings
or 1 px lines; no E4/E5 inset dark edge on the window (on a transparent
SteamVR overlay it reads as a bright band, C5b's log).
SteamVR-owned and never touched: the segmented ::after pill's transform (the
switch knob rides on it), slider HandleContainer transforms, the dropdown
chevron's rotate, the sidebar ::before press effect's timing.
Wrapped as html.lgs-on { ... }. */
/* ================================================================== */
/* 0. Shared looks for every SettingsMain (also Now Playing's modals) */
/* ================================================================== */
.SettingsMain {
--text-color: var(--lgs-text-1);
/* raised capsule / circle at rest, hovered, pressed (PLAN §1.4 recipe) */
--c6b-lobe: radial-gradient(30% 55% at 26% 0, rgb(255 255 255 / .16), rgb(255 255 255 / 0));
--c6b-spot: radial-gradient(60% 90% at 50% 25%, rgb(255 255 255 / var(--lgs-hover-spot, .12)), rgb(255 255 255 / 0) 75%);
--c6b-raised: var(--c6b-lobe), var(--lgs-raised-bg);
--c6b-raised-hover: var(--c6b-spot), var(--c6b-lobe), linear-gradient(rgb(255 255 255 / var(--lgs-hover-add, .08)), rgb(255 255 255 / var(--lgs-hover-add, .08))), var(--lgs-raised-bg);
--c6b-raised-press: var(--c6b-lobe), linear-gradient(rgb(255 255 255 / .16), rgb(255 255 255 / .16)), var(--lgs-raised-bg);
/* SteamVR tints advanced controls purple through these; neutral here (the
advanced marker is a dot before the label, §5) */
--settings-advanced-control-background-color: rgb(255 255 255 / .10);
--settings-advanced-control-hover-background-color: rgb(255 255 255 / .18);
--settings-advanced-control-active-background-color: rgb(255 255 255 / .24);
--settings-advanced-sidenav-control-background-color: rgb(255 255 255 / .10);
}
.SettingsMain .SettingsItem.Advanced,
.SettingsMain .SettingsSidebar .AdvancedSettingsToggle.Active {
--settings-control-activated-background: var(--lgs-selected-fill);
--settings-control-hover-background: rgb(255 255 255 / .18);
}
.SettingsMain.Loading {
background: var(--lgs-mat-window-bg);
border-radius: var(--lgs-vr-r-window);
}
/* labels and text */
.SettingsItem .Label,
.SettingsItem.Label {
color: var(--lgs-text-1);
font-family: var(--lgs-font);
}
.SettingsMain .SettingsItem > .SettingsExplainer {
color: var(--lgs-text-2);
opacity: 1;
}
.SettingsItemValueLabel,
.SettingsItemValueInfo {
color: var(--lgs-text-1);
}
.SettingsSubTitle,
.SettingsMain h1 {
color: var(--lgs-text-2);
}
.SettingsMain .SettingsPageContainer hr,
.SettingsMain .Modal hr {
border: 0;
height: 3px;
background: var(--lgs-separator);
opacity: 1;
}
/* grouped sections and their stems: a recessed fill on the platter */
.SettingsMain .Subsection {
background: rgb(0 0 0 / .16);
border-radius: calc(var(--lgs-r-row) * var(--lgs-vr-scale));
}
.SettingsMain .Subsection.WithStem {
border-top-right-radius: 0;
}
.SettingsMain .SubsectionStem:not(.Hidden) {
background: rgb(0 0 0 / .16);
border-top-left-radius: calc(var(--lgs-r-row) * var(--lgs-vr-scale));
border-top-right-radius: calc(var(--lgs-r-row) * var(--lgs-vr-scale));
}
.SettingsMain .SubsectionStem:not(.Hidden)::before {
--size: calc(var(--lgs-r-row) * var(--lgs-vr-scale));
--background: rgb(0 0 0 / .16);
}
.SettingsMain .SettingsPageContainer > .Subsection.Top {
background: var(--lgs-fill-regular);
border-radius: 0;
}
/* buttons and dropdown buttons: raised capsules, title case */
.SettingsMain .ButtonControl {
background: var(--c6b-raised);
box-shadow: var(--lgs-raised-shadow);
border-radius: var(--lgs-r-capsule);
color: var(--lgs-text-1);
font-family: var(--lgs-font);
font-weight: 600;
text-transform: none;
letter-spacing: 0;
transition: background-color var(--lgs-t-fast) var(--lgs-ease), box-shadow var(--lgs-t-fast) var(--lgs-ease);
}
.SettingsMain .ButtonControl:not(.Disabled):hover {
background: var(--c6b-raised-hover);
box-shadow: var(--lgs-raised-shadow);
}
.SettingsMain .ButtonControl:not(.Disabled):active {
background: var(--c6b-raised-press);
box-shadow: var(--lgs-raised-shadow);
}
.SettingsMain .ButtonControl.Disabled,
.SettingsMain .ButtonControl.Disabled:hover {
background: rgb(255 255 255 / .04);
box-shadow: none;
color: rgb(255 255 255 / calc(.96 * var(--lgs-dis-content, .40)));
}
.SettingsMain .ButtonControl > .Badge {
background: rgb(255 255 255 / .16);
border-radius: var(--lgs-r-capsule);
}
.SettingsMain .ButtonControl.WithIcon > .Icon path,
.SettingsMain .ButtonControl.WithIcon > .SVGIcon_Button path {
fill: var(--lgs-text-1);
}
.SettingsMain .ButtonControl.Dropdown::after {
border-color: var(--lgs-text-2);
}
/* colourful (blue) action buttons: the tinted primary */
.SettingsMain .ButtonControl.Colorful,
.SettingsMain .ButtonControl.Colorful:not(.Disabled):hover {
background: none;
color: var(--lgs-text-on-tint);
}
.SettingsMain .ButtonControl.Colorful::before {
background: var(--lgs-tint-primary);
border-radius: inherit;
}
.SettingsMain .ButtonControl.Colorful::after {
background: linear-gradient(rgb(255 255 255 / .10), rgb(255 255 255 / .10));
border-radius: inherit;
}
/* refresh-rate circles: raised circles, the current one white */
.SettingsItem.RadioButtons .RadioButton {
background: var(--c6b-raised);
box-shadow: var(--lgs-raised-shadow);
color: var(--lgs-text-1);
transition: background-color var(--lgs-t-fast) var(--lgs-ease);
}
.SettingsItem.RadioButtons .RadioButton:not(.Selected):hover {
background: var(--c6b-raised-hover);
}
.SettingsItem.RadioButtons .RadioButton:not(.Selected):active {
background: var(--c6b-raised-press);
}
.SettingsItem.RadioButtons .RadioButton.Selected,
.SettingsItem.RadioButtons .RadioButton.Selected:hover {
background: var(--lgs-selected-fill);
box-shadow: 0 2px 6px rgb(0 0 0 / .22);
}
.SettingsItem.RadioButtons .RadioButton .Label {
color: var(--lgs-text-1);
font-weight: 600;
}
.SettingsItem.RadioButtons .RadioButton.Selected .Label {
color: var(--lgs-text-on-selected);
}
.SettingsItem.RadioButtons .RadioButton.Disabled:not(.Selected) {
opacity: var(--lgs-dis-content, .40);
}
/* segmented controls: a recessed capsule track; the selected segment is the
white pill (SteamVR's own sliding ::after, recoloured, never moved) */
.SettingsItem.SegmentedControl .SegmentedControlGroup {
filter: none;
border-radius: var(--lgs-r-capsule);
}
.SettingsItem.SegmentedControl .SegmentedControlGroup::before {
background-color: var(--lgs-fill-thick);
box-shadow: var(--lgs-recessed-shadow);
border-radius: var(--lgs-r-capsule);
opacity: 1;
transition: background-color var(--lgs-t-fast) var(--lgs-ease);
}
.SettingsItem.SegmentedControl .SegmentedControlGroup:hover::before {
background-color: rgb(255 255 255 / .06);
}
.SettingsItem.SegmentedControl .SegmentedControlGroup::after,
.SettingsItem.SegmentedControl .SegmentedControlGroup:hover::after {
background: var(--lgs-selected-fill);
box-shadow: 0 2px 6px rgb(0 0 0 / .22);
border-radius: var(--lgs-r-capsule);
}
.SettingsItem.SegmentedControl .SegmentedControlGroupOption,
.SettingsItem.SegmentedControl .SegmentedControlGroupOption:first-child,
.SettingsItem.SegmentedControl .SegmentedControlGroupOption:last-child {
border-radius: var(--lgs-r-capsule);
background-color: transparent;
transition: background-color 0s linear 0s;
}
.SettingsItem.SegmentedControl .SegmentedControlGroup:not([data-lgs-switch]) > .SegmentedControlGroupOption.Active {
/* the white also on the selected segment itself, so its dark label sits on
its own background; it appears when SteamVR's sliding pill has arrived */
background-color: var(--lgs-selected-fill);
transition: background-color 0s linear var(--control-switch-animation-time, 200ms);
}
.SettingsItem.SegmentedControl .SegmentedControlGroupOption > span {
color: var(--lgs-text-1);
font-family: var(--lgs-font);
font-weight: 500;
}
.SettingsItem.SegmentedControl .SegmentedControlGroupOption.Active > span {
color: var(--lgs-text-on-selected);
font-weight: 600;
}
/* SteamVR fades unselected labels to .4 / .75: too faint on glass */
.SettingsItem.SegmentedControl .SegmentedControlGroup .SegmentedControlGroupOption:not(.Active),
.SettingsItem.SegmentedControl .SegmentedControlGroupOption:not(.Active) + .SegmentedControlGroupOption:not(.Active) {
opacity: 1;
}
.SettingsMain .SettingsItem.SegmentedControl .SegmentedControlGroup.SegmentedControlGroup .SegmentedControlGroupOption:not(.Active) > span {
opacity: .80;
}
/* no 1 px dividers between segments (P-43) */
.SettingsItem.SegmentedControl .SegmentedControlGroupOption:not(:first-child)::before,
.SettingsItem.SegmentedControl:hover .SegmentedControlGroupOption:not(:first-child)::before {
background: transparent;
opacity: 0;
}
/* sliders: a recessed capsule track, white fill from the origin to the knob
(SteamVR's own --slider-value), white knob carrying the value */
.SettingsMain .SliderControl:not(.Color):not(.Vertical) .Track {
background: linear-gradient(to right,
var(--lgs-slider-fill) 0,
var(--lgs-slider-fill) calc(var(--slider-value, 0) * (100% - var(--handle-length)) + var(--handle-length) / 2),
var(--lgs-fill-thick) calc(var(--slider-value, 0) * (100% - var(--handle-length)) + var(--handle-length) / 2));
box-shadow: var(--lgs-recessed-shadow);
opacity: 1;
}
.SettingsMain .SliderControl.Vertical:not(.Color) .Track {
background: var(--lgs-fill-thick);
opacity: 1;
}
.SettingsMain .SliderControl:not(.Color):hover .Track,
.SettingsMain .SliderControl:not(.Color).Sliding .Track {
opacity: 1;
}
/* detent ticks read on the white fill and on the track */
.SettingsMain .SliderControl:not(.Color) .Track .Detent {
background: var(--lgs-text-2);
mix-blend-mode: difference;
}
.SettingsMain .SliderControl:not(.Color) .Handle {
background: var(--lgs-knob);
box-shadow: 0 2px 6px rgb(0 0 0 / .30);
border-color: transparent;
}
.SettingsMain .SliderControl:not(.Color):hover .Handle,
.SettingsMain .SliderControl:not(.Color).Sliding .Handle {
background-color: var(--lgs-knob);
box-shadow: 0 2px 6px rgb(0 0 0 / .30), 0 0 calc(22px * var(--lgs-vr-scale)) rgb(255 255 255 / .35);
}
.SettingsMain .SliderControl:not(.Color) .Handle > .RangeLabel {
color: var(--lgs-text-on-selected);
font-weight: 600;
}
.SettingsMain .SliderControl:not(.Color) .HandleCircle {
border-color: var(--lgs-text-on-selected);
}
.SettingsMain .SliderControl > .RangeLabel {
color: var(--lgs-text-2);
font-weight: 500;
}
/* dropdown popovers: thick glass, rows with a leading check slot (CTL §19.2
V4, C4a-D1): the current value is checked, never filled */
.SettingsMain .Dropdown.Popover,
.SettingsMain .Dropdown.Popover > .ScrollPanel {
border-radius: calc(var(--lgs-r-menu) * var(--lgs-vr-scale));
}
.SettingsMain .Dropdown.Popover {
background: var(--c6b-lobe), var(--lgs-mat-thick-bg);
backdrop-filter: var(--lgs-mat-thick-blur);
box-shadow: var(--lgs-shadow-15mm);
padding: 9px 0;
}
.SettingsMain .Dropdown.Popover > .ScrollPanel {
max-height: 856px;
overflow-y: auto;
}
.SettingsMain .Dropdown.Popover .Separator {
border-top: 0;
height: 3px;
margin: 6px 38px;
background: var(--lgs-separator);
}
.SettingsMain .DropdownPopoverButton {
position: relative;
min-height: calc(var(--lgs-menu-row, 72px) * var(--lgs-vr-scale));
margin: 0 9px;
padding: 0 38px 0 calc(38px + 46px);
display: flex;
align-items: center;
border-radius: calc((var(--lgs-r-menu) - 6px) * var(--lgs-vr-scale));
background-color: transparent;
color: var(--lgs-text-1);
font-family: var(--lgs-font);
font-weight: 500;
transition: background-color var(--lgs-t-fast) var(--lgs-ease);
}
.SettingsMain .DropdownPopoverButton:hover {
background-color: rgb(255 255 255 / var(--lgs-hover-add, .08));
}
.SettingsMain .DropdownPopoverButton:active {
background-color: rgb(255 255 255 / .16);
}
.SettingsMain .DropdownPopoverButton.Selected,
.SettingsMain .DropdownPopoverButton.Selected:hover {
background-color: transparent;
color: var(--lgs-text-1);
font-weight: 600;
}
.SettingsMain .DropdownPopoverButton.Selected:hover {
background-color: rgb(255 255 255 / var(--lgs-hover-add, .08));
}
.SettingsMain .DropdownPopoverButton.Selected::after {
content: "";
position: absolute;
left: 38px;
top: 50%;
width: 34px;
height: 34px;
margin-top: -17px;
background: 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.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E") center / contain no-repeat;
pointer-events: none;
}
/* modals inside SettingsMain: thick glass */
.SettingsMain .Modal {
background: var(--c6b-lobe), var(--lgs-mat-thick-bg);
backdrop-filter: var(--lgs-mat-thick-blur);
box-shadow: var(--lgs-shadow-15mm);
border-radius: calc(var(--lgs-r-sheet) * var(--lgs-vr-scale));
color: var(--lgs-text-1);
}
.SettingsMain .Modal > .Subsection.Top,
.SettingsMain .Modal > .Subsection.Bottom,
.SettingsMain .Modal > .Subsection.Body {
background: transparent;
}
.SettingsMain .Modal > .Subsection.Top {
box-shadow: inset 0 -3px 0 var(--lgs-separator);
}
.SettingsMain .Modal > .Subsection.Bottom {
box-shadow: inset 0 3px 0 var(--lgs-separator);
}
.SettingsMain .Modal > .Subsection.Top.Subheader {
background: var(--lgs-fill-regular);
}
.SettingsMain .Modal > .Subsection.Top .SettingsItem,
.SettingsMain .Modal > .Subsection.Bottom .SettingsItem {
filter: none;
}
.SettingsMain .Modal .ModalPlaceholder {
color: var(--lgs-text-2);
opacity: 1;
}
/* restart-required banner: a glass strip, Restart is the tinted action */
.SettingsRestartRequiredBanner {
background: var(--c6b-lobe), var(--lgs-mat-thick-bg);
box-shadow: none;
color: var(--lgs-text-1);
}
.SettingsRestartRequiredBanner .ButtonControl,
.SettingsRestartRequiredBanner .ButtonControl:not(.Disabled):hover {
background: var(--lgs-tint-primary);
color: var(--lgs-text-on-tint);
}
/* scrollbars: no track, a quiet capsule thumb */
.SettingsMain ::-webkit-scrollbar {
background-color: transparent;
}
.SettingsMain ::-webkit-scrollbar-thumb {
background-color: rgb(255 255 255 / .22);
border-radius: 999px;
}
/* text fields: recessed capsules */
.SettingsMain :is(.PasswordInput, .PasswordInputDisabled) {
background: var(--lgs-fill-thick);
box-shadow: var(--lgs-recessed-shadow);
border-radius: var(--lgs-r-capsule);
}
/* ================================================================== */
/* 1. The SteamVR settings page: footprint, window glass, sizes */
/* ================================================================== */
.DashboardPanel.Settings {
--c6b-glass-h: 952px;
--c6b-side-w: 576px;
--c6b-r: var(--lgs-vr-r-window);
/* SteamVR sizes its controls from these: 60 / 24 / 28 main px x m */
--settings-control-default-height: 86px;
--settings-font-size: 35px;
--settings-font-size-title: 41px;
--settings-font-weight: 500;
--settings-font-weight-title: 700;
--settings-control-inner-border-radius: 43px;
--settings-sidebar-button-max-height: 115px;
--settings-sidebar-min-width: var(--c6b-side-w);
--settings-sidebar-max-width: var(--c6b-side-w);
--settings-content-padding: 51px;
--settings-right-column-width: 500px;
--settings-control-spacing: 23px;
--dropdown-popover-background-color: transparent;
--dropdown-popover-selected-background-color: transparent;
/* the panel's own fill goes: the glass is the backing below */
background: transparent;
box-shadow: none;
border-radius: 0;
font-family: var(--lgs-font);
color: var(--lgs-text-1);
}
/* the window glass: 1858 x 952, r 78, top-aligned = Steam's footprint, on the
page container (an element, so audits see it under the text); the sidebar
region is a black .14 fill on it; the light is the E3 lobe (no top line,
no rim) */
.DashboardPanel.Settings .SettingsSidebarPageContainer {
height: var(--c6b-glass-h);
border-radius: var(--c6b-r);
background:
linear-gradient(90deg, var(--lgs-fill-regular) 0 var(--c6b-side-w), rgb(0 0 0 / 0) var(--c6b-side-w)),
radial-gradient(20% 20px at 26% 0, rgb(255 255 255 / .18), rgb(255 255 255 / 0)),
var(--lgs-mat-window-bg);
}
/* native: glassd's window glass is right behind the panel (html.lgs-native-vr,
set by lgs_sg.js with the cover node, device/lgs_sg.js "SteamVR Settings
glass"): the CSS window fill and its lobe go, the sidebar's black .14 stays */
&.lgs-native-vr-settings .DashboardPanel.Settings .SettingsSidebarPageContainer {
background: linear-gradient(90deg, var(--lgs-fill-regular) 0 var(--c6b-side-w), rgb(0 0 0 / 0) var(--c6b-side-w));
}
/* ------------------------------------------------------------------ */
/* 2. Sidebar: the "SteamVR" title, a scrolling column of 104 px rows */
/* ------------------------------------------------------------------ */
/* the title sits where Steam's "Settings" sits: Large Title, centred on the
Back circle's row (y 35-121), x 144 (a brand name, the same in every
language) */
.DashboardPanel.Settings .SettingsSidebarPageContainer::before {
content: "SteamVR";
position: absolute;
left: 46px;
top: 35px;
height: 86px;
line-height: 86px;
z-index: 2;
font: 700 66px var(--lgs-font);
letter-spacing: -.015em;
color: var(--lgs-text-1);
white-space: nowrap;
pointer-events: none;
}
/* with T2's Back circle the title moves beside it */
.DashboardPanel.Settings .SettingsSidebarPageContainer:has(> .lgs-c6b-back)::before {
left: 144px;
}
/* the column scrolls (8 x 115 > 796) from y 140; static, so the ornament
(positioned against the page container) is not clipped by its scroll */
.DashboardPanel.Settings .SettingsSidebar {
position: static;
flex: none;
width: var(--c6b-side-w);
min-width: var(--c6b-side-w);
max-width: var(--c6b-side-w);
height: calc(var(--c6b-glass-h) - 140px);
margin-top: 140px;
padding: 16px 0 48px;
box-sizing: border-box;
overflow-x: hidden;
overflow-y: auto;
background: transparent;
box-shadow: none;
border-radius: 0 0 0 var(--c6b-r);
}
.DashboardPanel.Settings .SettingsSidebar::-webkit-scrollbar {
width: 0;
}
.DashboardPanel.Settings .SettingsSidebar .Spacer {
display: none;
}
.DashboardPanel.Settings .SettingsSidebar .Header {
color: var(--lgs-text-2);
font: 600 29px var(--lgs-font);
margin-left: 46px;
}
/* rows: the button is the 115 px hit; the visible pill is 104 tall, x 23-553 */
.DashboardPanel.Settings .SettingsSidebarButton {
flex: none;
height: 115px;
min-height: 115px;
padding: 0 46px;
background: transparent;
}
.DashboardPanel.Settings .SettingsSidebarButton.Active,
.DashboardPanel.Settings .SettingsSidebarButton:hover {
background: transparent;
}
/* SteamVR's press flash (its ::before), kept, recoloured to the pressed add
and inset to the pill */
.DashboardPanel.Settings .SettingsSidebarButton::before {
inset: 5.5px 23px;
border-radius: 52px;
background: rgb(255 255 255 / .16);
}
/* our pill: navigation selected = white .18 + the lit lobe; hover = the spot */
.DashboardPanel.Settings .SettingsSidebarButton::after {
content: "";
position: absolute;
inset: 5.5px 23px;
z-index: 1;
border-radius: 52px;
background: transparent;
pointer-events: none;
transition: background-color var(--lgs-t-fast) var(--lgs-ease);
}
.DashboardPanel.Settings .SettingsSidebarButton:not(.Active):hover::after {
background: radial-gradient(40% 90% at 30% 40%, rgb(255 255 255 / var(--lgs-nav-hover-spot, .16)), rgb(255 255 255 / 0) 80%);
}
.DashboardPanel.Settings .SettingsSidebarButton.Active::after {
background:
radial-gradient(42% 4px at 30% 2px, rgb(255 255 255 / .45), rgb(255 255 255 / 0)),
var(--lgs-fill-nav);
}
.DashboardPanel.Settings .SettingsSidebarButton .Label,
.DashboardPanel.Settings .SettingsSidebarButton:hover .Label {
font: 500 35px/1.3 var(--lgs-font);
color: var(--lgs-text-1);
}
.DashboardPanel.Settings .SettingsSidebarButton.Active .Label {
font-weight: var(--lgs-nav-weight, 600);
color: var(--lgs-text-1);
}
/* icon circles (T2 keys each row with data-lgs-sec): 58 px colour circle,
white glyph 32 px, before the label */
.DashboardPanel.Settings .SettingsSidebarButton[data-lgs-sec] {
padding-left: calc(46px + 58px + 23px);
}
.DashboardPanel.Settings .SettingsSidebarButton[data-lgs-sec] .Label::before {
content: "";
position: absolute;
left: calc(-58px - 23px);
top: 50%;
width: 58px;
height: 58px;
margin-top: -29px;
border-radius: 50%;
background:
var(--c6b-glyph, none) center / 32px 32px no-repeat,
linear-gradient(180deg, rgb(255 255 255 / .24), rgb(255 255 255 / 0) 60%),
var(--c6b-tint, var(--lgs-gray));
pointer-events: none;
}
.DashboardPanel.Settings .SettingsSidebarButton[data-lgs-sec] .Label {
overflow: visible;
}
/* section glyphs and colours (data-lgs-sec on the row and on the page) */
.DashboardPanel.Settings [data-lgs-sec="general"] {
--c6b-tint: var(--lgs-gray);
--c6b-glyph: 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%3Ccircle cx='12' cy='12' r='3'/%3E%3Ccircle cx='12' cy='12' r='6.6'/%3E%3Cpath d='M12 2.6v2.8M12 18.6v2.8M2.6 12h2.8M18.6 12h2.8M5.4 5.4l2 2M16.6 16.6l2 2M5.4 18.6l2-2M16.6 7.4l2-2'/%3E%3C/svg%3E");
}
.DashboardPanel.Settings [data-lgs-sec="playarea"] {
--c6b-tint: var(--lgs-teal);
--c6b-glyph: 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%3Crect x='3.5' y='3.5' width='17' height='17' rx='3.5' stroke-dasharray='3.2 2.6'/%3E%3Ccircle cx='12' cy='12' r='2.8' fill='%23fff' stroke='none'/%3E%3C/svg%3E");
}
.DashboardPanel.Settings [data-lgs-sec="dashboard"] {
--c6b-tint: var(--lgs-blue);
--c6b-glyph: 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%3Crect x='3' y='4.5' width='18' height='12.5' rx='2.6'/%3E%3Cpath d='M9 20.5h6'/%3E%3C/svg%3E");
}
.DashboardPanel.Settings [data-lgs-sec="controller"] {
--c6b-tint: var(--lgs-indigo);
--c6b-glyph: 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");
}
.DashboardPanel.Settings [data-lgs-sec="video"] {
--c6b-tint: var(--lgs-orange);
--c6b-glyph: 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-linejoin='round'%3E%3Crect x='2.6' y='5' width='18.8' height='12.6' rx='2.4'/%3E%3Cpath d='M10 8.8l5 2.5-5 2.5z' fill='%23fff'/%3E%3C/svg%3E");
}
.DashboardPanel.Settings [data-lgs-sec="camera"] {
--c6b-tint: var(--lgs-green);
--c6b-glyph: 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-linejoin='round'%3E%3Cpath d='M4 8.6A1.6 1.6 0 0 1 5.6 7h2.2l1.6-2h5.2l1.6 2h2.2A1.6 1.6 0 0 1 20 8.6v8.8a1.6 1.6 0 0 1-1.6 1.6H5.6A1.6 1.6 0 0 1 4 17.4z'/%3E%3Ccircle cx='12' cy='12.6' r='3.3'/%3E%3C/svg%3E");
}
.DashboardPanel.Settings [data-lgs-sec="startupshutdown"] {
--c6b-tint: var(--lgs-red);
--c6b-glyph: 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.4' stroke-linecap='round'%3E%3Cpath d='M12 3.5v8'/%3E%3Cpath d='M7.1 6.7a7 7 0 1 0 9.8 0'/%3E%3C/svg%3E");
}
.DashboardPanel.Settings [data-lgs-sec="developer"] {
--c6b-tint: var(--lgs-gray);
--c6b-glyph: 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' stroke-linejoin='round'%3E%3Cpath d='M8.5 7 4 12l4.5 5M15.5 7 20 12l-4.5 5M13.6 5l-3.2 14'/%3E%3C/svg%3E");
}
/* ------------------------------------------------------------------ */
/* 3. Back circle (T2 node .lgs-c6b-back): 86 px at (35, 35), hit 115 */
/* ------------------------------------------------------------------ */
.DashboardPanel.Settings .lgs-c6b-back {
position: absolute;
left: 20px;
top: 20px;
width: 116px;
height: 116px;
z-index: 3;
border-radius: 50%;
cursor: pointer;
background: transparent;
}
.DashboardPanel.Settings .lgs-c6b-back::before {
content: "";
position: absolute;
inset: 15px;
border-radius: 50%;
background:
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.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14.5 5.5 8 12l6.5 6.5'/%3E%3C/svg%3E") center / 38px 38px no-repeat,
var(--c6b-raised);
box-shadow: var(--lgs-raised-shadow);
transition: background-color var(--lgs-t-fast) var(--lgs-ease);
}
.DashboardPanel.Settings .lgs-c6b-back:hover::before {
background:
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.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14.5 5.5 8 12l6.5 6.5'/%3E%3C/svg%3E") center / 38px 38px no-repeat,
var(--c6b-raised-hover);
}
.DashboardPanel.Settings .lgs-c6b-back:active::before {
background:
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.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14.5 5.5 8 12l6.5 6.5'/%3E%3C/svg%3E") center / 38px 38px no-repeat,
var(--c6b-raised-press);
}
/* ------------------------------------------------------------------ */
/* 4. Detail pane: a 1180 px column (813 main px, C6a's 816: SET's 760 */
/* shrank nested labels, G-AUD SHRUNK), rows in platters */
/* ------------------------------------------------------------------ */
.DashboardPanel.Settings .SettingsPageContainer {
background: transparent;
height: var(--c6b-glass-h);
padding: 156px 51px 140px;
border-radius: 0 var(--c6b-r) var(--c6b-r) 0;
scroll-padding: 156px 0 140px;
}
.DashboardPanel.Settings .SettingsPageContainer::-webkit-scrollbar {
width: 0;
}
/* the section hero (T2 copies the active section's label and key): an 87 px
colour circle and Title 1, centred, one line */
.DashboardPanel.Settings .SettingsPageContainer[data-lgs-title]::before {
content: attr(data-lgs-title);
flex: none;
align-self: center;
display: flex;
align-items: center;
width: max-content;
height: 87px;
margin: -12px auto 35px;
padding-left: calc(87px + 23px);
font: 700 55px/1.2 var(--lgs-font);
letter-spacing: -.01em;
color: var(--lgs-text-1);
white-space: nowrap;
background:
var(--c6b-glyph, none) 20px center / 47px 47px no-repeat,
radial-gradient(circle 43.5px at 43.5px 50%, rgb(255 255 255 / .20), rgb(255 255 255 / 0) 60%, transparent 43px),
radial-gradient(circle 43.5px at 43.5px 50%, var(--c6b-tint, var(--lgs-gray)) 42.5px, transparent 43.5px);
pointer-events: none;
}
/* rows: contiguous 115 px rows in a black .14 platter, radius 43, a 3 px
white .08 separator inset 35 between rows */
.DashboardPanel.Settings .SettingsPageContainer > .SettingsItem {
min-height: 115px;
margin: 0;
padding: 14px 35px;
box-sizing: border-box;
align-items: center;
column-gap: 35px;
background: var(--lgs-fill-regular);
}
.DashboardPanel.Settings .SettingsPageContainer > .SettingsItem + .SettingsItem {
background:
linear-gradient(var(--lgs-separator), var(--lgs-separator)) 35px 0 / calc(100% - 70px) 3px no-repeat,
var(--lgs-fill-regular);
}
.DashboardPanel.Settings .SettingsPageContainer > .SettingsItem:not(.SettingsItem + .SettingsItem) {
border-top-left-radius: 43px;
border-top-right-radius: 43px;
}
.DashboardPanel.Settings .SettingsPageContainer > .SettingsItem:not(:has(+ .SettingsItem)) {
border-bottom-left-radius: 43px;
border-bottom-right-radius: 43px;
margin-bottom: 46px;
}
.DashboardPanel.Settings .SettingsItem .Label,
.DashboardPanel.Settings .SettingsItem.Label {
font-size: 35px;
font-weight: 500;
line-height: 1.3;
}
.DashboardPanel.Settings .SettingsItem .Label.Title,
.DashboardPanel.Settings .SettingsItem.Label.Title {
font-size: 41px;
font-weight: 700;
}
.DashboardPanel.Settings .SettingsItem > .SettingsExplainer {
font: 500 32px/1.3 var(--lgs-font);
margin-top: 6px;
}
.DashboardPanel.Settings :is(.SettingsSubTitle, h1) {
font: 600 32px/1.3 var(--lgs-font);
letter-spacing: 0;
text-transform: none;
margin: 0 35px 17px;
}
/* advanced settings: a 16 px purple dot before the label */
.DashboardPanel.Settings .SettingsPageContainer > .SettingsItem.Advanced > .Label::before {
content: "";
display: inline-block;
width: 16px;
height: 16px;
margin: 0 17px 0 0;
vertical-align: middle;
position: relative;
top: -3px;
border-radius: 50%;
background: var(--lgs-purple);
}
/* controls at the page scale (CTL §13: 1.44) */
.DashboardPanel.Settings .SettingsPageContainer .ButtonControl {
min-height: 86px;
font-size: 35px;
}
.DashboardPanel.Settings .SettingsPageContainer .ButtonControl:not(.Label):not(.WithIcon):not(.AuroraPalette) {
padding: 0 35px;
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
}
.DashboardPanel.Settings .SettingsPageContainer .ButtonControl.Dropdown {
justify-content: flex-start;
padding-right: 70px;
}
/* refresh-rate circles: 86 at a 121 pitch, under the label (CTL §7.4, R10) */
.DashboardPanel.Settings .SettingsItem.RadioButtons {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 17px;
}
.DashboardPanel.Settings .SettingsItem.RadioButtons > .Label {
align-self: stretch;
margin: 0;
text-align: left;
}
.DashboardPanel.Settings .SettingsItem.RadioButtons .RadioButtonsSet {
display: flex;
flex-wrap: wrap;
gap: 23px 35px;
}
.DashboardPanel.Settings .SettingsItem.RadioButtons .RadioButton {
--size: 86px;
width: 86px;
height: 86px;
margin: 0;
flex: none;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.DashboardPanel.Settings .SettingsItem.RadioButtons .RadioButton .Label {
font-size: 30px;
margin: 0;
}
/* sliders: the capsule is 92 tall, the knob 92 and carries the value */
.DashboardPanel.Settings .SliderControl.ValueOnHandle {
--slider-thickness: 92px;
}
.DashboardPanel.Settings .SliderControl:not(.Color):not(.Vertical) {
--track-thickness: var(--slider-thickness);
}
.DashboardPanel.Settings .SliderControl:not(.Color) .Handle {
font: 600 27px var(--lgs-font);
}
.DashboardPanel.Settings .SliderControl:not(.Color) .Handle > .RangeLabel {
font-size: 27px;
}
.DashboardPanel.Settings .SliderControl > .RangeLabel {
font-size: 27px;
}
/* segmented controls (3-way, Hide/Show): 86 tall, segments >= 203 wide */
.DashboardPanel.Settings .SettingsItem.SegmentedControl .SegmentedControlGroup {
min-height: 86px;
}
.DashboardPanel.Settings .SettingsItem.SegmentedControl .SegmentedControlGroupOption {
min-width: 203px;
padding: 0 23px;
}
/* ------------------------------------------------------------------ */
/* 5. Off / On -> switch (T2 tags data-lgs-switch on two-option groups */
/* whose texts are SteamVR's own "Off" then "On"). 96 x 58 track, */
/* 50 px knob = SteamVR's own sliding pill (its transform untouched, */
/* so it slides on SteamVR's spring); a click anywhere on the track */
/* (hit 128 x 114) lands on the unselected option and toggles. */
/* ------------------------------------------------------------------ */
.DashboardPanel.Settings .SettingsItem.SegmentedControl > .SubsectionStem.Hidden:has(> .SegmentedControlGroup[data-lgs-switch]) {
display: flex;
justify-content: flex-end;
}
.DashboardPanel.Settings .SettingsItem.SegmentedControl .SegmentedControlGroup[data-lgs-switch] {
flex: none;
width: 96px;
min-width: 96px;
height: 58px;
min-height: 58px;
border-radius: 29px;
margin-right: 0;
}
.DashboardPanel.Settings .SegmentedControlGroup[data-lgs-switch]::before {
background-color: rgb(120 120 128 / .32);
box-shadow: var(--lgs-recessed-shadow);
border-radius: 29px;
transition: background-color var(--lgs-t-fast) var(--lgs-ease);
}
.DashboardPanel.Settings .SegmentedControlGroup[data-lgs-switch]:hover::before {
background-color: rgb(150 150 158 / .40);
}
.DashboardPanel.Settings .SegmentedControlGroup[data-lgs-switch]:has(> .SegmentedControlGroupOption:last-child.Active)::before {
background-color: var(--lgs-toggle-on, var(--lgs-green));
}
.DashboardPanel.Settings .SegmentedControlGroup[data-lgs-switch]:has(> .SegmentedControlGroupOption:last-child.Active):hover::before {
background-color: color-mix(in srgb, var(--lgs-green), white 12%);
}
/* the knob: SteamVR's pill, 38 px wide so its translateX(100% x index) moves it
38 px; drawn 50 px round by a same-colour spread */
.DashboardPanel.Settings .SegmentedControlGroup[data-lgs-switch]::after,
.DashboardPanel.Settings .SegmentedControlGroup[data-lgs-switch]:hover::after {
width: 38px;
height: 38px;
top: 10px;
bottom: auto;
left: 10px;
border-radius: 50%;
background: var(--lgs-knob);
box-shadow: 0 0 0 6px var(--lgs-knob), 0 3px 8px 6px rgb(0 0 0 / .22);
}
.DashboardPanel.Settings .SegmentedControlGroup[data-lgs-switch] > .SegmentedControlGroupOption {
min-width: 0;
padding: 0;
background: transparent;
}
.DashboardPanel.Settings .SettingsItem.SegmentedControl .SegmentedControlGroup.DualValue[data-lgs-switch] > .SegmentedControlGroupOption > span {
opacity: 0;
}
.DashboardPanel.Settings .SegmentedControlGroup[data-lgs-switch] > .SegmentedControlGroupOption.Active {
opacity: 0;
pointer-events: none;
}
.DashboardPanel.Settings .SegmentedControlGroup[data-lgs-switch] > .SegmentedControlGroupOption:not(.Active) {
position: absolute;
inset: -28px -16px;
width: auto;
z-index: 4;
border-radius: 57px;
}
/* ------------------------------------------------------------------ */
/* 6. Advanced Settings: a liquid capsule ornament straddling the glass */
/* bottom (y 911-1032), centred; the same node, re-placed */
/* ------------------------------------------------------------------ */
.DashboardPanel.Settings .SettingsSidebar .Bottom.AdvancedSettingsToggle {
position: absolute;
z-index: 30;
top: calc(var(--c6b-glass-h) - 41px);
left: 0;
right: 0;
width: max-content;
height: 121px;
margin: 0 auto;
padding: 0 17px 0 46px;
box-sizing: border-box;
display: flex;
align-items: center;
border-radius: 61px;
background:
radial-gradient(30% 20px at 26% 0, rgb(255 255 255 / .16), rgb(255 255 255 / 0)),
linear-gradient(180deg, rgb(255 255 255 / .03) 0, rgb(255 255 255 / .02) 60%),
linear-gradient(180deg, rgb(20 22 30 / 0) 0 39px, var(--lgs-mat-window-tint) 43px);
box-shadow: none;
opacity: 1;
}
.DashboardPanel.Settings .AdvancedSettingsToggle > .SettingsItem.SegmentedControl {
display: flex;
align-items: center;
gap: 29px;
margin: 0;
padding: 0;
background: none;
}
.DashboardPanel.Settings .SettingsSidebar .AdvancedSettingsToggle .SettingsItem .Label {
display: flex;
align-items: center;
min-width: 340px;
height: 50px;
justify-content: flex-end;
padding: 0;
font: 600 32px/1.2 var(--lgs-font);
color: var(--lgs-text-2);
white-space: nowrap;
}
.DashboardPanel.Settings .SettingsSidebar .AdvancedSettingsToggle .SegmentedControlGroup {
width: auto;
height: 86px;
min-height: 86px;
}
/* ------------------------------------------------------------------ */
/* 7. Modals and popovers in the page: the fit rule */
/* ------------------------------------------------------------------ */
.DashboardPanel.Settings .Modal {
max-height: 856px;
overflow-y: auto;
}