Skip to content

fix(1.5.1): mini-player white screen + Pulse halo leak in skin picker#282

Merged
InstaZDLL merged 3 commits into
mainfrom
fix/1.5.1-mini-player-pulse-leak
Jun 20, 2026
Merged

fix(1.5.1): mini-player white screen + Pulse halo leak in skin picker#282
InstaZDLL merged 3 commits into
mainfrom
fix/1.5.1-mini-player-pulse-leak

Conversation

@InstaZDLL

@InstaZDLL InstaZDLL commented Jun 20, 2026

Copy link
Copy Markdown
Owner

WIP — patch bundle pour la 1.5.1. Encore la race condition Liquid light (Mood Radio) à investiguer avant merge.

Closes #279
Closes #281

L'issue #280 (deux dossiers plugins/web-radio/) n'est PAS dans cette PR : c'est l'architecture standard Tauri NSIS où le bundle plugin vit sous %LocalAppData%\WaveFlow\plugins\ (resource dir, read-only) et est copié au boot vers %AppData%\Roaming\app.waveflow\waveflow\plugins\ (runtime). Le runtime charge toujours depuis Roaming. Pour l'éliminer il faudrait loader les plugins bundled directement depuis BaseDirectory::Resource — refactor du loader, mieux scopé pour 1.6.0.

Bugs corrigés

1. Mini-player blanche depuis 1.5.0 (#279)

ThemeProvider appelle useProfile() depuis #264 (per-profile theme + skin storage), mais MiniPlayerApp.tsx était resté avec l'ancien ordre où ThemeProvider wrap ProfileProvider. React StrictMode catch le "must be used within ProfileProvider" throw → fenêtre blanche.

Fix (985e4e5) : remettre ProfileProvider en outer comme dans App.tsx.

2. Glow neon Pulse leak dans le skin picker (#281)

SkinPickerCard applique preset.surface.shadowCard en boxShadow inline sur la div interne. Pulse seul utilise une halo neon saturée (0 0 24px -4px var(--accent-500)) qui escape le clip overflow-hidden du bouton parent et bleed en bas de la card preview.

Les autres skins ont des shadows soit trop subtiles pour être visibles à ~200×100 px (Studio, Lounge), soit none (Editorial, Liquid). Le canal porte zéro signal utile pour 4 skins et un vrai bug pour le 5e.

Fix (a066a17) : drop boxShadow du previewStyle. L'identité du skin reste portée par la typographie + le radius — les shadows se révèlent au clic sur le vrai chrome.

3. About hero illisible en Liquid light

Le Hero hardcodait bg-linear-to-br from-zinc-900 to-zinc-800 text-white + classes text-zinc-{300,400,500,600} dark-only. Marchait sur Studio Light (gradient dark contraste avec la page), mais liquid.css:349 strip background-image sur tout rounded-3xl sous main pour appliquer son glass universel → texte dark stranded sur glass pâle, version watermark / subtitle / year / license / bouton tous invisibles.

Fix (a802da9) : paire chaque couleur avec un variant dark: pour que le hero rende correctement sur chaque combo (theme × skin).

Bug à investiguer avant merge (blocker)

Race condition Liquid light → Mood Radio tiles blanchissent

Pré-investigation : liquid.css:443-486.liquid-mood-tile::before a opacity 0.55 par défaut + transition opacity 240ms, override à 0.95 quand :not(.dark) matche. Le double-effect pattern de ThemeContext (cache→DB) peut toggle .dark brièvement pendant un profile load, déclencher la transition opacity, et un second reapply pendant l'animation persiste l'état intermédiaire.

Trois itérations précédentes ont échoué (debc42f reverted, a2c0cb4 WIP deleted) parce qu'elles patchaient le symptôme CSS, pas la race. À adresser à la source : court-circuiter applyTheme + applySkin quand cache et DB matchent.

Test plan

  • bun run typecheck passe
  • Test manuel mini-player (clic immersive → fenêtre s'ouvre avec UI, pas white)
  • Test manuel Settings → Appearance, skin Pulse non-actif (pas de leak vert sous la card)
  • Test manuel About en Liquid light (texte lisible : subtitle, dates, bouton)
  • Test manuel About en Studio dark / Studio light / Editorial / Lounge / Pulse / Liquid dark (regression check)
  • Race condition Liquid light Mood Radio investigation + fix
  • Test manuel : Liquid light, switch profile plusieurs fois, vérifier Mood Radio reste coloré

Summary by CodeRabbit

  • Bug Fixes

    • Correction de la cohérence du thème clair/sombre dans la vue About pour une meilleure lisibilité
  • Style

    • Optimisation du rendu visuel des aperçus de skins
    • Amélioration de la palette de couleurs pour une meilleure adaptation au thème sélectionné

ThemeProvider grew a `useProfile()` call in #264 (per-profile theme +
skin storage), but MiniPlayerApp.tsx was left with the legacy nesting
where ThemeProvider wraps ProfileProvider. React StrictMode catches
the "must be used within ProfileProvider" throw and surfaces it as a
white window — mini-player has been blanked since 1.5.0.

Mirror the main App.tsx nesting (ProfileProvider outer) so the mini
boots into the same provider chain.
Pulse's shadowCard is a neon halo `0 0 24px -4px var(--accent-500)`
that leaks visibly past the picker button's overflow-hidden clip
in the Settings → Appearance grid. The other skins' shadows are
either too subtle (Studio's 1px black, Lounge's soft drop) or
absent (Editorial, Liquid) to read at ~200×100 px anyway, so the
shadow channel was carrying zero signal for four skins and one
clear bug for the fifth.

Drop `boxShadow` from the inline preview style. Each card still
sells its skin via the display font + heading weight + tracking +
border-radius — the surface treatment shows up on the real chrome
the moment the user clicks.
@coderabbitai

coderabbitai Bot commented Jun 20, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

ProfileProvider est repositionné en dehors de ThemeProvider dans MiniPlayerApp. Le hero card de AboutView passe à des classes Tailwind thème-aware avec variantes dark:. Dans SkinPickerCard, le boxShadow est retiré du previewStyle des thumbnails.

Changes

Corrections de nesting providers et styles thème-aware

Layer / File(s) Summary
Fix nesting ProfileProvider en dehors de ThemeProvider
src/MiniPlayerApp.tsx
ProfileProvider passe de l'intérieur à l'extérieur de ThemeProvider, corrigeant l'erreur "must be used within ProfileProvider". Un commentaire documente la contrainte de nesting.
Hero AboutView : styles thème-aware light/dark
src/components/views/AboutView.tsx
Le hero card entier (fond, titre "WaveFlow", sous-titre, ligne version/année/licence, bouton checkUpdates, mention "WaveFlow Team") remplace les couleurs sombres fixes par des classes Tailwind avec variantes dark:.
SkinPickerCard : suppression du shadow thumbnail
src/components/views/settings/SkinPickerCard.tsx
boxShadow (issu de preset.surface.shadowCard) est retiré de previewStyle du thumbnail ; des commentaires inline documentent l'omission intentionnelle.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • InstaZDLL/WaveFlow#264 : Même pattern de correction — ProfileProvider déplacé à l'extérieur de ThemeProvider/SkinProvider, mais appliqué dans App.tsx au lieu de MiniPlayerApp.tsx.

Poem

🎨 Le provider sort enfin de sa cage,
ThemeProvider respire, lit le profil en sage.
Le hero s'habille en clair et en sombre,
Plus de shadow fantôme dans le thumbnail sobre.
WaveFlow en thème, lumière ou ombre ! 🌗

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (3 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Linked Issues check ⚠️ Warning La section 'Linked issues' contient 'Closes #' vide. Le PR corrige des bugs identifiés mais ne référence aucun numéro d'issue GitHub. Ajouter les numéros des issues GitHub liées (ex: 'Closes #XXX') pour chaque bug corrigé ou investigué.
Description check ⚠️ Warning La description manque les sections requises du template : title avec Conventional Commits, checklist incomplète, et pas de détails de test reproductibles. Reformater selon le template : ajouter title en type(scope): subject, remplir 'Summary' avec bullets concis, documenter 'How I tested' avec étapes reproductibles, cocher la checklist complètement.
✅ Passed checks (2 passed)
Check name Status Explanation
Out of Scope Changes check ✅ Passed Les trois fichiers modifiés adressent directement les bugs annoncés : provider nesting, skin picker shadow, hero card theme-awareness. Pas de changements hors-scope détectés.
Title check ✅ Passed Le titre décrit précisément les deux bugs corrigés : l'écran blanc du mini-player et la fuite de halo dans le skin picker, correspondant aux changements dans MiniPlayerApp.tsx et SkinPickerCard.tsx.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/1.5.1-mini-player-pulse-leak

Comment @coderabbitai help to get the list of available commands and usage tips.

@InstaZDLL InstaZDLL added scope: frontend React/Vite frontend (src/) type: fix Bug fix size: s 10-50 lines labels Jun 20, 2026
@InstaZDLL InstaZDLL self-assigned this Jun 20, 2026
The Hero card hardcoded `bg-linear-to-br from-zinc-900 to-zinc-800
text-white` + a stack of `text-zinc-{300,400,500,600}` and
`text-white/5` classes designed for a guaranteed-dark surface.
That worked on Studio's light variant (where the dark gradient
deliberately contrasted with the page) but breaks on Liquid Light:
liquid.css:349 strips `background-image` on every `rounded-3xl`
under `main` to apply its universal glass treatment, leaving the
dark text classes stranded on pale glass — the version watermark,
subtitle, year, license and "Check for updates" button were all
invisible.

Pair every colour with a `dark:` variant so the hero renders
correctly on every (theme × skin) combo: light page surfaces get
dark text against a soft light gradient (or the skin's glass
override), dark surfaces keep the original white-on-zinc look.
@InstaZDLL InstaZDLL marked this pull request as ready for review June 20, 2026 18:44
@InstaZDLL InstaZDLL changed the title fix(1.5.1): mini-player white screen + Pulse halo leak in skin picker [WIP] fix(1.5.1): mini-player white screen + Pulse halo leak in skin picker Jun 20, 2026
@InstaZDLL InstaZDLL merged commit 3d1c405 into main Jun 20, 2026
2 checks passed
@InstaZDLL InstaZDLL deleted the fix/1.5.1-mini-player-pulse-leak branch June 20, 2026 18:47
@InstaZDLL InstaZDLL added size: m 50-200 lines and removed size: s 10-50 lines labels Jun 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

scope: frontend React/Vite frontend (src/) size: m 50-200 lines type: fix Bug fix

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug: new button of new skin -small UI issue. bug: Miniplayer do not work.

1 participant