feat(glass): per-scheme background images + glass-over-image mode
Land the UAT-approved backdrop direction as a real feature (replacing the dev thumbnail prototype): - 6 generated abstract SVG backdrops in public/backdrops/, one tuned to each accent scheme (dark, mixed-colour, few light areas). Non-figurative + generated = repo-safe, tiny, accent-matched. - New data-backdrop="on" state (dark theme + the setting + not perf) paints the per-scheme image on <body> (app root now transparent so it shows app-wide and the glass refracts it) AND switches the glass to its translucent tier (the user's tuned values: surface 50 / card 60 / scrim 30 / blur 10 / edge 25). Off / light / perf -> flat colour + solid glass (the readable fallback). - Settings > Appearance 'Background image' toggle (bgImage pref, dark-only), trilingual. Flat is the fallback + opt-out. - Remove the FeedBackdrop prototype + its tuner controls; tuner baseline resynced to the glass-over-image tier, add a Backdrop-fade slider. GOTCHA fixed: the dark-mode ambient 'background' shorthand reset background-size to auto (image rendered un-covered); out-specified it with [data-theme="dark"].
This commit is contained in:
parent
036e2fe7ea
commit
f9f90cf609
15 changed files with 191 additions and 162 deletions
|
|
@ -22,15 +22,17 @@
|
|||
--glass-scrim: 14%; /* under-content scrim: darkens surfaces toward --bg for text contrast — 0 = off */
|
||||
--ambient: 1.1; /* multiplier on the ambient accent backdrop pools */
|
||||
|
||||
/* Dev-prototype feed backdrop (see <FeedBackdrop/>): how strongly the faded --bg overlay hides the
|
||||
blurred thumbnail — higher = fainter image. Only in effect while the backdrop is toggled on. */
|
||||
--feedbg-fade: 86%;
|
||||
/* Per-scheme background image dim (see frontend/public/backdrops/): how strongly the faded --bg
|
||||
overlay hides the image — higher = fainter. Only in effect while data-backdrop="on". */
|
||||
--bg-fade: 60%;
|
||||
}
|
||||
|
||||
/* ===== Rich-backdrop scope: surfaces that float over real imagery (Plex art hero/detail, and
|
||||
later channel-page banners) want MORE translucency so the picture shows through — the "glass
|
||||
over content" look. Put `.glass-media` on such a page root; every .glass* inside inherits these
|
||||
(UAT-tuned 2026-07-12). Global chrome stays solid via the :root defaults above. ===== */
|
||||
/* ===== "Glass over image" — the translucent tier (UAT-tuned 2026-07-12). Applies whenever a
|
||||
real image sits behind the surfaces: app-wide when the per-scheme background image is on
|
||||
(`html[data-backdrop="on"]`), and on the Plex art-backed detail views (`.glass-media`, which
|
||||
have their own art backdrop even when the global image is off). When there's nothing behind the
|
||||
glass (image off / light theme / perf), the :root defaults keep it solid & readable. ===== */
|
||||
html[data-backdrop="on"],
|
||||
.glass-media {
|
||||
--glass-blur: 10px;
|
||||
--glass-saturate: 1.6;
|
||||
|
|
@ -44,6 +46,24 @@
|
|||
--glass-scrim: 30%;
|
||||
}
|
||||
|
||||
/* Per-scheme background image, painted on <body> (the app root is transparent so it shows through
|
||||
the whole app and the glass refracts it). A faded --bg overlay keeps it subtle; `fixed` so it
|
||||
doesn't scroll. Only when the backdrop is on (dark theme + the "Background image" setting). */
|
||||
html[data-backdrop="on"][data-scheme="midnight"] body { background-image: linear-gradient(color-mix(in srgb, var(--bg) var(--bg-fade), transparent), color-mix(in srgb, var(--bg) var(--bg-fade), transparent)), url("/backdrops/midnight.svg"); }
|
||||
html[data-backdrop="on"][data-scheme="forest"] body { background-image: linear-gradient(color-mix(in srgb, var(--bg) var(--bg-fade), transparent), color-mix(in srgb, var(--bg) var(--bg-fade), transparent)), url("/backdrops/forest.svg"); }
|
||||
html[data-backdrop="on"][data-scheme="slate"] body { background-image: linear-gradient(color-mix(in srgb, var(--bg) var(--bg-fade), transparent), color-mix(in srgb, var(--bg) var(--bg-fade), transparent)), url("/backdrops/slate.svg"); }
|
||||
html[data-backdrop="on"][data-scheme="youtube"] body { background-image: linear-gradient(color-mix(in srgb, var(--bg) var(--bg-fade), transparent), color-mix(in srgb, var(--bg) var(--bg-fade), transparent)), url("/backdrops/youtube.svg"); }
|
||||
html[data-backdrop="on"][data-scheme="starship"] body { background-image: linear-gradient(color-mix(in srgb, var(--bg) var(--bg-fade), transparent), color-mix(in srgb, var(--bg) var(--bg-fade), transparent)), url("/backdrops/starship.svg"); }
|
||||
html[data-backdrop="on"][data-scheme="matrix"] body { background-image: linear-gradient(color-mix(in srgb, var(--bg) var(--bg-fade), transparent), color-mix(in srgb, var(--bg) var(--bg-fade), transparent)), url("/backdrops/matrix.svg"); }
|
||||
/* [data-theme="dark"] added purely to out-specify the `html[data-theme="dark"] body` ambient rule
|
||||
below, whose `background` shorthand would otherwise reset background-size back to auto. */
|
||||
html[data-backdrop="on"][data-theme="dark"] body {
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-attachment: fixed;
|
||||
}
|
||||
|
||||
/* Make native controls (date picker, scrollbars) follow the theme. */
|
||||
html[data-theme="dark"] {
|
||||
color-scheme: dark;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue