Gestaffelte Enter-Animation für Songlisten (EinblendItem)

Items in song_list.dart und artist_list.dart faden/rutschen beim ersten
Erscheinen gestaffelt statt abrupt ein — angelehnt an HyperOS' fließende
Motion-Sprache. Läuft einmal pro Element, respektiert Reduce-Motion und
deckelt die Verzögerung ab Index 12.
This commit is contained in:
Hermes (Server)
2026-08-29 12:51:04 +02:00
parent 196303145a
commit e2304b66cd
5 changed files with 235 additions and 26 deletions
+28
View File
@@ -5,6 +5,34 @@ Format angelehnt an [Keep a Changelog](https://keepachangelog.com/de/1.0.0/).
## [Unreleased]
### ✨ Staggered List-Enter-Animation: Listen faden beim ersten Erscheinen gestaffelt ein (2026-08-29)
-**Teil 1 einer Animations-Serie** (inspiriert von Xiaomis HyperOS-
Design-Sprache — fließende statt abrupte Bewegung): neues Widget
`EinblendItem` (`lib/shared/einblend_item.dart`) blendet ein Listenelement
beim ersten Erscheinen mit Opacity 0→1 und leichtem Versatz (`MeloSpace.sm`
→ 0) ein, Dauer `MeloMotion.normal` (220ms), Kurve `MeloMotion.curve`.
Jedes Element startet um `min(index, 12) × 25ms` versetzt — ab Index 12
ohne zusätzliche Verzögerung, damit lange Listen nicht träge wirken. Läuft
genau einmal je Element-Lebenszeit (nicht bei jedem Rebuild) und
respektiert Reduce-Motion (`MeloMotion.ruhig`): dann erscheint das Element
sofort im Endzustand, ohne Verzögerung oder Bewegung.
- 🔧 Eingebunden in `SongList` (`lib/library/song_list.dart`) und in beide
Listen von `artist_list.dart` (Künstler-Übersicht sowie die Zeilen der
Künstler-Detailseite — Alben, Titel und Zwischenüberschriften). Die
wiederverwendete `SongZeile` selbst bleibt unverändert, damit Suche und
Playlist-Detail (die den Wrapper nicht bekommen sollen) unangetastet
bleiben. `my_music_screen.dart` rendert keine eigene Liste (nur
eingebettete `SortableSongList`/`ArtistListScreen`/`CategoryListScreen`)
— dort war nichts einzubinden.
-**Getestet (RED→GREEN):** neuer Widget-Test
`test/shared/einblend_item_test.dart` prüft Start bei Opacity 0, Ziel bei
1,0 nach `pumpAndSettle()`, sofortigen Endzustand bei
`disableAnimations: true` sowie den Deckel bei Index 12 (Index 50 startet
nicht später als Index 12). Bestehende Tests zu `song_list.dart` liefen
bereits mit `pumpAndSettle()` und blieben unverändert grün. Volle Suite
(604 Tests) grün, `flutter analyze` ohne Befund.
### 🔑 Manuelle Baka-Anmeldung übernahm das neue Passwort nie dauerhaft; Auto-Login-Fehler wurde verworfen (2026-08-29)
- 🐛 **Wer sich nach einer fehlgeschlagenen Auto-Anmeldung manuell im