diff --git a/src/MiniPlayerApp.tsx b/src/MiniPlayerApp.tsx index 9d4dd9f..639fb59 100644 --- a/src/MiniPlayerApp.tsx +++ b/src/MiniPlayerApp.tsx @@ -9,6 +9,12 @@ import { MiniPlayer } from "./components/views/MiniPlayer"; * Library / Playlist contexts since the mini-player only displays * the current track + playback controls — no library browsing. * + * ProfileProvider sits OUTSIDE ThemeProvider because the per-profile + * theme work landed in #264 made `ThemeProvider` call `useProfile()` + * to scope theme choices per-profile. Without this nesting the + * mini boots into a white screen via the "must be used within + * ProfileProvider" throw — mirrors the main `App.tsx` nesting. + * * SpotifyProvider stays in because PlayerProvider calls useSpotify() * unconditionally (provider routing happens inside PlayerContext). * Without it the mini boots into a white screen via the "must be @@ -20,14 +26,14 @@ import { MiniPlayer } from "./components/views/MiniPlayer"; */ export function MiniPlayerApp() { return ( - - + + - - + + ); } diff --git a/src/components/views/AboutView.tsx b/src/components/views/AboutView.tsx index 2aad46d..2687f22 100644 --- a/src/components/views/AboutView.tsx +++ b/src/components/views/AboutView.tsx @@ -256,37 +256,45 @@ export function AboutView({ onNavigate }: AboutViewProps) { - {/* Hero Card */} -
-
+ {/* Hero Card — theme-aware so the light variant stays readable. + The original hero hardcoded a dark gradient + white text; + that worked on Studio Dark and on Studio Light (where the + dark surface deliberately contrasted with the page), but + Liquid Light's universal `rounded-3xl` glass override + (liquid.css:349) strips `background-image` and leaves the + dark text classes stranded on pale glass. Pairing every + colour with a `dark:` variant lets the hero render + correctly on every (theme × skin) combo. */} +
+
{version}

- WaveFlow + WaveFlow

-

{t("about.hero.subtitle")}

+

{t("about.hero.subtitle")}

v{version} - 2026 - · - GPL-3.0 License + 2026 + · + GPL-3.0 License
-

+

{t("about.hero.developedBy")}{" "} - WaveFlow Team + WaveFlow Team

diff --git a/src/components/views/settings/SkinPickerCard.tsx b/src/components/views/settings/SkinPickerCard.tsx index 4633229..b69c540 100644 --- a/src/components/views/settings/SkinPickerCard.tsx +++ b/src/components/views/settings/SkinPickerCard.tsx @@ -92,12 +92,20 @@ export function SkinPickerCard() { // skin's actual tokens, not the active skin's. Using inline // styles also sidesteps having to round-trip through // tailwind / data-skin attribute fiddling for the preview. + // + // `shadowCard` is intentionally NOT applied here: Pulse's + // neon halo (`0 0 24px -4px var(--accent-500)`) leaks + // visibly past the button's overflow-hidden clip, and at + // ~200×100 px the other skins' shadows are too subtle to + // read anyway. The skin's identity is already carried by + // the display font + heading weight + tracking + radius; + // chrome-scale shadows belong on real surfaces, not on + // thumbnail previews. const previewStyle: React.CSSProperties = { fontFamily: preset.typography.display, fontWeight: preset.typography.headingWeight, letterSpacing: preset.typography.displayTracking, borderRadius: preset.radius.card, - boxShadow: preset.surface.shadowCard, }; return (