Skip to content

feat(discovery): show what changed after an update in a carousel panel - #1000

Merged
InstaZDLL merged 5 commits into
mainfrom
feat/whats-new-panel
Nov 1, 2026
Merged

InstaZDLL merged 5 commits into
mainfrom
feat/whats-new-panel

Conversation

@InstaZDLL

@InstaZDLL InstaZDLL commented Nov 1, 2026 •

Copy link
Copy Markdown
Owner

Summary

People miss what a new version brings, the way they miss what sits in Settings. The main window now opens a carousel once per update: an animated scene, a few lines of text and a "Try it" action per feature. The 2.0 content has 8 pages: the fluid interface and its materials, AutoMix, the lyrics editor, theater mode, the tag workshop, MusicBrainz enrichment, the native Release Radar and playlist import.

  • Content is written by hand per version in src/lib/whatsNew.ts, in the 17 locales. A correction release adds nothing and the panel stays closed. The full history stays in About.
  • Marker: app-wide app_setting['whats_new.seen_version'], compared as real versions and read through two new commands, get_whats_new_marker / set_whats_new_marker, since no generic command reads app_setting.
    • A fresh install shows nothing and sets the marker.
    • An update from 1.x, which has no marker, shows the pages.
    • A pre-release shows its stable's pages once; neither the next beta nor the stable shows them again.
    • The marker never holds a pre-release when nothing was shown, so pages landing in a later beta are not lost.
  • Timing: it waits for a clear way, meaning no modal, onboarding, tour or profile picker, and a focused window, which also covers a --minimized launch. useModalA11y now exposes useAnyModalOpen for this.
  • Access by hand: a megaphone button in the top bar of both layouts, and a link in About. Settings → General holds the per-profile choices, built on useProfileSetting and the settings registry, and keeps the panel reachable when the button is hidden.
  • "Try it" never lands on an empty screen: without a library or a playing track, the page says so and offers the way there. Theater mode opens for that visit only, without writing the setting.
  • Motion is transform and opacity only, paused while the page is hidden, frozen under reduced motion and at the reduced effects level. FeatureHero extends the shared FeatureArt with 5 new scenes.

main still carries version 1.9.1, so neither the button nor the panel shows until the 2.0 version bump.

How I tested

  • typecheck, prettier, cargo fmt --check, cargo check, clippy. lint reports 0 errors and 1 warning at ImmersiveView.tsx:355, in code this branch does not touch.
  • New test the_whats_new_marker_starts_absent_and_follows_the_version, on the migrated app.db schema. App crate tests do not start on Windows, so CI is its first run.
  • In a sandbox build at 2.0.0-beta.1, driven through the webview with the IPC mocked:
    • Version paths: 1.x to beta, beta to beta, beta to stable, a correction release, the same version, a next version with pages, a fresh install.
    • Waiting behind a modal, the onboarding, the tour and an unfocused window.
    • All 8 "Try it" actions, plus the empty library and nothing-playing cases.
    • Keyboard: Escape, tab order, focus returned, and neither arrows nor Space reach the player.
    • Arabic: mirrored layout and arrows.
    • All six skins, and an 800 × 540 window.
  • Cost in Chromium with the panel open: 41 layouts in 4 s (7 with it closed) and no paint. At the reduced effects level, none of either.
  • Tried in a sandbox build by the maintainer, then validated.

Not verified:

  • WebKitGTK and macOS were not run, so the repaint cost is only measured in Chromium.
  • The translations were checked by script (keys, placeholders), without a native review.
  • After the last rebuild, only the focus fix and the automatic opening were replayed; the rest ran on the builds before it.

Summary by CodeRabbit

  • Nouvelles fonctionnalités
    • Découvrez les nouveautés dans un panneau dédié, avec navigation entre les pages et raccourcis pour essayer certaines fonctionnalités.
    • Ouvrez le panneau depuis la barre supérieure ou l’historique des nouveautés. Réglez dans les paramètres son ouverture automatique et la visibilité de son bouton.
    • Profitez d’illustrations et d’animations adaptées aux différentes fonctionnalités, avec prise en charge des préférences de réduction des animations.
    • Les raccourcis peuvent ouvrir directement l’éditeur de paroles, l’import de playlists, les réglages concernés ou le mode théâtre.
  • Documentation
    • Les guides décrivent le panneau et précisent les consignes de préparation des pages de nouveautés pour les versions.

@InstaZDLL InstaZDLL added scope: frontend React/Vite frontend (src/) scope: backend Rust/Tauri backend (src-tauri/) scope: i18n Translations (src/i18n/) scope: docs Docs, README, assets type: feat New feature size: xl > 500 lines labels Nov 1, 2026
@coderabbitai

coderabbitai Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review.

Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 08ee3ac and 8ef7767.

Files ignored due to path filters: 17
  • src/i18n/locales/ar.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/de.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/en.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/es.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/fr.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/hi.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/id.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/it.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/ja.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/ko.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/nl.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/pt-BR.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/pt.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/ru.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/tr.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/zh-CN.json is excluded by !src/i18n/locales/**
  • src/i18n/locales/zh-TW.json is excluded by !src/i18n/locales/**
Files selected for processing: 35
  • CLAUDE.md
  • docs/README.md
  • docs/RELEASING.md
  • docs/architecture/storage.md
  • docs/features/ui.md
  • src-tauri/crates/app/src/commands/preferences.rs
  • src-tauri/crates/app/src/commands/preferences/tests.rs
  • src-tauri/crates/app/src/lib.rs
  • src/components/discovery/FeatureArt.tsx
  • src/components/discovery/FeatureCard.tsx
  • src/components/discovery/FeatureHero.tsx
  • src/components/discovery/WhatsNewPanel.tsx
  • src/components/discovery/discovery.css
  • src/components/layout/AppLayout.tsx
  • src/components/layout/LyricsPanel.tsx
  • src/components/layout/Sidebar.tsx
  • src/components/layout/TopBar.tsx
  • src/components/player/ImmersiveView.tsx
  • src/components/player/PlayerBar.tsx
  • src/components/views/AboutView.tsx
  • src/components/views/SettingsView.tsx
  • src/components/views/settings/sections/GeneralSection.tsx
  • src/components/views/settings/settingsCatalog.ts
  • src/components/views/settings/settingsReset.ts
  • src/contexts/PlayerContext.tsx
  • src/hooks/useModalA11y.ts
  • src/hooks/usePlayer.ts
  • src/hooks/useWhatsNew.ts
  • src/lib/discovery.ts
  • src/lib/settingsRegistry.ts
  • src/lib/tauri/preferences.ts
  • src/lib/whatsNew.ts
  • src/styles/skins/fluid.css
  • src/styles/skins/liquid.css
  • src/styles/skins/lounge.css

Included review availability: This review used your included allowance. 0 included reviews remain after this review. Your included PR review attempts over the past 7 days set your current allowance at 1 review per hour.

Walkthrough

Le changement ajoute un panneau « What’s new » pour la version 2.0.0. Il suit les versions affichées, propose une ouverture automatique ou manuelle et relie chaque page à une action. Des réglages de profil contrôlent l’ouverture automatique et la visibilité du bouton.

Changes: Nouveautés

Layer / File(s) Summary
Catalogue des versions et persistance
src/lib/whatsNew.ts, src/lib/tauri/preferences.ts, src-tauri/crates/app/src/commands/preferences.rs, src-tauri/crates/app/src/lib.rs, src-tauri/crates/app/src/commands/preferences/tests.rs, docs/architecture/storage.md, docs/RELEASING.md
Le catalogue décrit les pages de la version 2.0.0 et compare les versions. Les commandes Tauri lisent et enregistrent le marqueur dans app_setting. Un test vérifie sa lecture initiale et deux écritures successives.
Évaluation et accès au panneau
src/hooks/useWhatsNew.ts, src/hooks/useModalA11y.ts, src/components/layout/AppLayout.tsx, src/components/layout/TopBar.tsx, src/lib/discovery.ts, src/styles/skins/fluid.css
useWhatsNew évalue la nouveauté, les préférences et les conditions d’ouverture. AppLayout transmet l’état au panneau et à la barre supérieure. La barre affiche un bouton et un indicateur quand une nouveauté reste à consulter.
Panneau, illustrations et actions
src/components/discovery/*, src/components/layout/LyricsPanel.tsx, src/components/layout/Sidebar.tsx, src/contexts/PlayerContext.tsx, src/hooks/usePlayer.ts, src/components/player/*, src/styles/skins/liquid.css, src/styles/skins/lounge.css
Le panneau présente les pages avec navigation clavier, illustrations et actions. Il gère les prérequis de bibliothèque et de piste. Les actions peuvent ouvrir des vues, l’éditeur de paroles, le théâtre ou l’import de playlists. Les styles incluent des règles de réduction des animations.
Réglages et accès manuels
src/lib/settingsRegistry.ts, src/components/views/SettingsView.tsx, src/components/views/settings/*, src/components/views/AboutView.tsx, src/components/layout/AppLayout.tsx, docs/features/ui.md, docs/README.md, CLAUDE.md
Les réglages de profil contrôlent l’ouverture automatique et la visibilité du bouton. Settings peut révéler un groupe ciblé. About peut défiler jusqu’au changelog et ouvrir les nouveautés. La documentation décrit le panneau et les règles de publication.

Estimated code review effort: 4 (Complex) | ~45 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant AppLayout
  participant useWhatsNew
  participant PreferencesTauri
  participant TauriCommands
  participant app_setting
  participant WhatsNewPanel
  AppLayout->>useWhatsNew: évaluer les nouveautés disponibles
  useWhatsNew->>PreferencesTauri: lire le marqueur
  PreferencesTauri->>TauriCommands: invoquer get_whats_new_marker
  TauriCommands->>app_setting: lire whats_new.seen_version
  app_setting-->>TauriCommands: renvoyer le marqueur
  TauriCommands-->>PreferencesTauri: renvoyer le marqueur
  PreferencesTauri-->>useWhatsNew: fournir le marqueur
  AppLayout->>WhatsNewPanel: afficher la version choisie
Loading

Suggested labels: type: feat, size: xl, scope: frontend, scope: backend, scope: i18n, scope: docs

Merge Risk: Minimal · up to 8ef77

No identified issue blocks merging the What’s New panel after normal checks.

Security architecture risk: Low · up to 8ef77

The change is narrowly scoped to presenting updates, recording which version was seen, and opening existing features. No increased access to protected data was demonstrated. Runtime access restrictions were not independently verified.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — A caller able to invoke the new marker setter can affect announcement eligibility across profiles in the same installation. The inspected command path limits that authority to one application-setting value; it does not provide caller-selected access to profile records, files, credentials, or remote resources.

Security Findings and Attack Paths

  • inferred — No security attack path was established for the supplied page-action candidate. In the inspected flow, marker input cannot choose an action definition, and the finite dispatcher opens feature interfaces or starts library playback rather than interpreting supplied code, commands, paths, or URLs.

Trust Boundaries and Controls

  • observed — The new IPC boundary accepts an arbitrary string but uses fixed SQL with bound key and value parameters. Malformed version markers are treated as unseen by the frontend. Semver interpretation belongs to presentation logic rather than acting as a backend authorization control.

Resilience and Maintainability Implications

  • inferred — The inspected marker failures change whether announcements repeat or are omitted, rather than changing access authority. The theater shortcut also keeps its initial theater override in transient player state, leaving the stored preference unchanged on entry.
Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documenta… Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Title check Passed Le titre décrit clairement l’ajout principal : un panneau carrousel affichant les nouveautés après une mise à jour. Il suit aussi le format Conventional Commits avec le scope discovery.
Description check Passed La description est complète et couvre l’objectif, le comportement du marqueur, les conditions d’ouverture, les actions, l’accessibilité, les tests exécutés et les limites de validation. Les sections C…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Description check

Explanation

La description est complète et couvre l’objectif, le comportement du marqueur, les conditions d’ouverture, les actions, l’accessibilité, les tests exécutés et les limites de validation. Les sections Checklist, Screenshots / clips et Linked issues ne sont pas renseignées, mais leur absence ne rend pas la description incomplète au regard du contenu fourni.

Full details: Docstring Coverage

Explanation

Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 26 functions across 26 files. (9 skipped: 9 unsupported.)

Resolution

Write docstrings for the functions missing them to satisfy the coverage threshold.

Finishing Touches
Generate docstrings
  • Commit to this branch
  • Create a new PR
Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

@InstaZDLL
InstaZDLL merged commit d7e4dbf into main Nov 1, 2026
17 checks passed
@InstaZDLL
InstaZDLL deleted the feat/whats-new-panel branch November 1, 2026 19:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

scope: backend Rust/Tauri backend (src-tauri/) scope: docs Docs, README, assets scope: frontend React/Vite frontend (src/) scope: i18n Translations (src/i18n/) size: xl > 500 lines type: feat New feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant