# JellyTau UX Flows & Screen Transitions This document describes the expected user experience flows, screen transitions, and navigation patterns in JellyTau. --- ## 1. Core Navigation Structure ### 1.1 Navigation System JellyTau uses a unified navigation system with a bottom navigation bar visible on all platforms (mobile and desktop) and additional header navigation for desktop. **Bottom Navigation Bar (All Platforms - DR-045, UR-039):** The bottom navigation bar is the primary navigation and is **always visible** on all platforms (mobile and desktop) except when: - Full-screen video player is active - User is on the login screen **Bottom Nav Structure:** ``` ┌─────────────────────────────────────────┐ │ [Home] [Library] [Search] │ └─────────────────────────────────────────┘ ``` **Routes:** - **Home** → `/` (home page with carousels and featured content) - **Library** → `/library` (library selector showing all libraries) - **Search** → `/search` (dedicated search page) **Note:** Available on both mobile and desktop for consistent navigation access. **Header Navigation (Desktop):** On desktop (md breakpoint and above), the header contains: - Logo (links to `/library`) - Navigation links: Home, Library, Downloads, Settings - Search bar (inline) - User menu: Username, Downloads icon, Logout button **Mobile Navigation:** On mobile, the header contains: - Logo - Three-dot overflow menu button (Android-style) - Overflow menu includes: - Downloads - Settings - Sign out **Access Points Summary:** - **Downloads** → Desktop: nav link + icon; Mobile: overflow menu - **Settings** → Desktop: nav link; Mobile: overflow menu --- ## 2. Initial App Launch Flow ### 2.1 First-Time Launch ```mermaid flowchart TB Launch[App Launch] --> CheckAuth{Stored
Credentials?} CheckAuth -->|No| LoginScreen[Login Screen
/login] CheckAuth -->|Yes| AutoLogin[Auto-login] LoginScreen --> EnterURL[Enter Server URL] EnterURL --> EnterCreds[Enter Username/Password] EnterCreds --> LoginSuccess{Success?} LoginSuccess -->|No| LoginError[Show Error] LoginError --> EnterCreds LoginSuccess -->|Yes| StoreToken[Store Token in Keyring] AutoLogin --> TokenValid{Token Valid?} TokenValid -->|No| LoginScreen TokenValid -->|Yes| HomePage StoreToken --> HomePage[Home Page
/] ``` **Screens:** 1. **Login Screen** (`/login`) - Server URL input - Username input - Password input - "Remember me" checkbox (default: on) - Login button - No header, no bottom nav 2. **Home Page** (`/`) - Default landing page after successful login - Shows featured content, carousels, continue watching - No MiniPlayer visible (nothing playing yet) - Bottom nav: Home tab active - Header with navigation links ### 2.2 Subsequent Launches ```mermaid flowchart TB Launch[App Launch] --> LoadAuth[Load Stored Token] LoadAuth --> Validate{Token Valid?} Validate -->|Yes| RestoreState[Restore Last Screen] Validate -->|No| LoginScreen[Login Screen
/login] RestoreState --> CheckPlayer{Was Player
Active?} CheckPlayer -->|Yes| ShowMiniPlayer[Show MiniPlayer
at bottom] CheckPlayer -->|No| HideMiniPlayer[No MiniPlayer] ShowMiniPlayer --> LastScreen[Last Active Screen
with MiniPlayer] HideMiniPlayer --> HomePage[Home Page
/] ``` **State Restoration:** - Last viewed screen (route) is restored (defaults to `/` if none) - If audio was playing, MiniPlayer appears at bottom - Playback state is NOT automatically resumed (user must press play) - Queue is restored if it existed --- ## 3. Audio Playback Flows ### 3.1 Starting Audio Playback ```mermaid flowchart TB Start[User Action] --> Action{Action Type?} Action -->|Click Track| TrackList[TrackList Component] Action -->|Click Album| AlbumDetail[Album Detail Page] Action -->|Click Play on Album| AlbumPlay[Play Album Button] TrackList --> PlayTrack[Play Single Track] PlayTrack --> QueueAll[Queue All Filtered Tracks] AlbumPlay --> PlayAlbum[Play All Album Tracks] PlayAlbum --> QueueAlbum[Queue Album Tracks] QueueAll --> InvokePlay[invoke player_play_queue] QueueAlbum --> InvokePlay InvokePlay --> PlayerStarts[Player State: Playing] PlayerStarts --> MiniAppears[MiniPlayer Slides Up
from Bottom] MiniAppears --> StayOnPage[User Stays on
Current Screen] ``` **Entry Points for Audio Playback:** 1. **TrackList** (`/library/music/tracks`, `/library/music/albums/[id]`) - Click track number → Play track + queue all visible tracks - Clicking track #3 in an album → Play track 3, queue tracks 1-10 2. **Album Card** (grid views) - Click album → Navigate to album detail - Play button on card → Play album immediately 3. **Search Results** - Click track → Play track + queue search results - Click album → Navigate to album detail **MiniPlayer Behavior:** - Slides up from bottom with animation (300ms) - Height: 64px on mobile, 80px on desktop - Shows: artwork, title, artist, play/pause, next, favorite - Stays visible on ALL screens (except video player) - Click anywhere on MiniPlayer → Navigate to full player **Track Highlighting:** When audio is playing, the currently playing track is visually highlighted in track lists and album pages: - Subtle blue background tint - Left border accent in Jellyfin blue - Title text colored in Jellyfin blue - Desktop: Animated pulsing dots indicator next to title - Mobile: Play arrow (▶) inline with title - Highlight updates automatically when skipping to next/previous track ### 3.2 MiniPlayer → Full Player Transition ```mermaid flowchart TB Mini[MiniPlayer Visible] --> UserClick{User Action} UserClick -->|Click MiniPlayer| NavFullPlayer[Navigate to
/player/[id]] UserClick -->|Swipe Up| SwipeGesture[Swipe Gesture
Planned] NavFullPlayer --> FullPlayer[Full Audio Player Screen] SwipeGesture --> FullPlayer FullPlayer --> ShowControls[Show Full Controls:
- Large artwork
- Progress bar
- Volume slider
- Queue button
- Shuffle/Repeat
- Favorite button] ShowControls --> MiniHidden[MiniPlayer Hidden] ``` **Full Player Screen** (`/player/[id]`) - **Header:** Song title, artist (clickable links to artist/album pages) - **Artwork:** Large album art (centered, dominant) - **Progress:** Seek bar with current time / total duration - **Controls:** Previous, Play/Pause, Next (large touch targets) - **Secondary Controls:** Shuffle, Repeat mode, Queue, Favorite - **Volume:** Volume slider - **Bottom Nav:** Still visible (can navigate away while playing) - **Back button:** Returns to previous screen, MiniPlayer reappears ### 3.3 Full Player → Back to Browsing ```mermaid flowchart TB FullPlayer[Full Player Screen] --> UserAction{User Action} UserAction -->|Back Button / Close| HistoryBack[window.history.back] UserAction -->|Bottom Nav Click| NavOther[Navigate to
Other Screen] HistoryBack --> PrevScreen[Return to Previous Screen
in Browser History] NavOther --> NewScreen[Navigate to New Screen] PrevScreen --> MiniReappears[MiniPlayer Slides Up
from Bottom] NewScreen --> MiniReappears MiniReappears --> PlaybackContinues[Playback Continues
in Background] ``` **Navigation Behavior:** - **Back Button:** Uses browser history (`window.history.back()`) to return to the previous page - **Expected behavior:** Returns user to the screen they were on before opening full player - **Example:** User browsing album → clicks track → full player opens → clicks back → returns to album **Key UX Principles:** - **Playback Never Stops:** Navigating away from player does NOT stop playback - **MiniPlayer Persistence:** MiniPlayer visible on ALL screens (except video/login) - **Queue Preserved:** Current queue remains intact - **State Restoration:** Returning to full player shows same state (position, volume, etc.) - **Natural Navigation:** Back button behaves as expected (returns to previous page, not just closes modal) --- ## 4. Video Playback Flows ### 4.1 Starting Video Playback ```mermaid flowchart TB Start[User Action] --> Action{Action Type?} Action -->|Click Movie| MovieDetail[Movie Detail Page] Action -->|Click Episode| EpisodeClick[Episode Click] Action -->|Click Play Button| PlayButton[Play Button] MovieDetail --> PlayMovie[Play Movie Button] EpisodeClick --> PlayEpisode[Play Episode] PlayMovie --> CheckResume{Resume
Position?} PlayEpisode --> CheckResume CheckResume -->|Yes, >30s| ShowDialog[Resume Dialog] CheckResume -->|No| DirectPlay[Start from Beginning] ShowDialog --> UserChoice{User Choice} UserChoice -->|Resume| ResumePlay[Start at Saved Position] UserChoice -->|Start Over| DirectPlay ResumePlay --> FullscreenVideo[Fullscreen Video Player
/player/[id]] DirectPlay --> FullscreenVideo FullscreenVideo --> HideUI[Hide All UI:
- No Bottom Nav
- No MiniPlayer
- Fullscreen only] ``` **Resume Dialog:** ``` ┌─────────────────────────────────────────┐ │ Continue Watching? │ │ │ │ [Movie Title] │ │ Resume from 12:34 / 1:45:00 │ │ │ │ [Start from Beginning] [Resume] │ └─────────────────────────────────────────┘ ``` ### 4.2 Video Player Screen (IR-003, IR-004, UR-003) **Initial State (First 3 seconds):** - Controls visible overlay - Top bar: Back button, title - Bottom bar: Play/Pause, seek bar, time, settings (subtitles, audio track) - Center: Large play/pause button **After 3 Seconds (Idle):** - All controls fade out (500ms animation) - Fullscreen video only - System UI hidden (status bar, nav bar) **User Interaction:** - **Tap screen:** Controls reappear for 3 seconds - **Double tap left side:** Rewind 10 seconds (shows animated feedback with "-10" indicator) - **Double tap right side:** Forward 10 seconds (shows animated feedback with "+10" indicator) - **Swipe up/down on left side:** Adjust brightness (0.3-1.7x, shows brightness indicator with progress bar) - **Swipe up/down on right side:** Adjust volume (0-100%, shows volume indicator with progress bar) - **Keyboard arrows:** ← rewind 10s, → forward 10s (desktop/external keyboard) - **Keyboard space/K:** Toggle play/pause - **Keyboard F:** Toggle fullscreen - **Pinch:** Zoom (planned) ### 4.3 Exiting Video Player ```mermaid flowchart TB VideoPlaying[Video Playing] --> UserAction{User Action} UserAction -->|Back Button| StopVideo[Stop Playback] UserAction -->|Home Button| Background[App to Background] UserAction -->|Video Ends| VideoEnd[Playback Ended] StopVideo --> SaveProgress[Save Progress
to Local DB + Server] VideoEnd --> SaveComplete[Mark as Watched
Save Progress] Background --> PauseVideo[Pause Video] SaveProgress --> ExitFullscreen[Exit Fullscreen] SaveComplete --> AutoNext{Next Episode
Available?} AutoNext -->|Yes| ShowCountdown[Show Countdown
Next in 5s...] AutoNext -->|No| ExitFullscreen ShowCountdown --> UserCancel{User Cancels?} UserCancel -->|Yes| ExitFullscreen UserCancel -->|No, timeout| PlayNext[Play Next Episode] ExitFullscreen --> RestoreUI[Restore UI:
- Bottom Nav
- Previous Screen] PlayNext --> VideoPlaying PauseVideo --> ShowNotification[Show Notification:
Tap to Resume] ``` **Auto-Next Overlay:** ``` ┌─────────────────────────────────────────┐ │ │ │ [Episode Thumbnail] │ │ │ │ Next: S01E02 - Episode Title │ │ Starting in 5 seconds... │ │ │ │ [Cancel] [Play Now] │ └─────────────────────────────────────────┘ ``` --- ## 5. Music Library Navigation Flows ### 5.1 Music Category Landing Page ```mermaid flowchart TB LibraryHome[Library Home
/library] --> ClickMusic[Click Music Library] ClickMusic --> MusicLanding[Music Landing Page
/library/music] MusicLanding --> ShowCategories[Show Category Cards:
- Tracks
- Artists
- Albums
- Playlists
- Genres] ShowCategories --> UserClick{User Clicks Category} UserClick -->|Tracks| TracksPage[All Tracks Page
/library/music/tracks] UserClick -->|Artists| ArtistsPage[Artists Grid
/library/music/artists] UserClick -->|Albums| AlbumsPage[Albums Grid
/library/music/albums] UserClick -->|Playlists| PlaylistsPage[Playlists Grid
/library/music/playlists] UserClick -->|Genres| GenresPage[Genres Browser
/library/music/genres] ``` **Category Cards:** ``` ┌─────────────────────────────────────────┐ │ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ 🎵 │ │ 👤 │ │ 💿 │ │ │ │Track│ │Artist│ │Album│ │ │ └──────┘ └──────┘ └──────┘ │ │ ┌──────┐ ┌──────┐ │ │ │ 📝 │ │ 🎭 │ │ │ │List │ │Genre│ │ │ └──────┘ └──────┘ │ └─────────────────────────────────────────┘ ``` ### 5.2 Albums View Flow ```mermaid flowchart TB AlbumsGrid[Albums Grid
FORCED Grid View] --> UserAction{User Action} UserAction -->|Click Album| AlbumDetail[Album Detail Page
/library/[albumId]] UserAction -->|Click Play on Card| PlayAlbum[Play Album Immediately] AlbumDetail --> ShowAlbum[Show Album:
- Album Art
- Title, Artist
- Track List
- Download Button
- Favorite Button] ShowAlbum --> TrackAction{User Action} TrackAction -->|Click Track| PlayTrack[Play Track + Queue Album] TrackAction -->|Click Artist| NavArtist[Navigate to Artist Page] TrackAction -->|Download Album| DownloadFlow[Download Flow] TrackAction -->|Back Button| BackToGrid[Return to Albums Grid] ``` **Album Detail Layout:** ``` ┌─────────────────────────────────────────┐ │ [←] [♡] [⬇] │ │ │ │ ┌────────────────────┐ │ │ │ │ │ │ │ Album Artwork │ │ │ │ │ │ │ └────────────────────┘ │ │ │ │ Album Title │ │ Artist Name (clickable) │ │ 2024 • 12 tracks • 45:23 │ │ │ │ [▶ Play] [🔀 Shuffle] │ │ │ │ ───────────────────────────────────── │ │ 1 Track Title 3:45 │ │ 2 Track Title 4:12 │ │ 3 Track Title 3:28 │ │ ... │ └─────────────────────────────────────────┘ ``` ### 5.3 Artist Navigation ```mermaid flowchart TB ArtistsGrid[Artists Grid] --> ClickArtist[Click Artist] ClickArtist --> ArtistPage[Artist Detail Page
/library/artist/[id]] ArtistPage --> ShowContent[Show Artist Content:
- Artist Photo
- Biography
- Albums Grid
- Top Tracks
- Similar Artists] ShowContent --> UserAction{User Action} UserAction -->|Click Album| AlbumDetail[Album Detail Page] UserAction -->|Play Top Tracks| PlayArtist[Play Artist Radio] UserAction -->|Click Similar Artist| OtherArtist[Other Artist Page] ``` --- ## 6. Search Flow ### 6.1 Search Page Navigation ```mermaid flowchart TB BottomNav[Bottom Nav] --> ClickSearch[Click Search Tab] ClickSearch --> SearchPage[Search Page
/search] SearchPage --> EmptyState{Has Query?} EmptyState -->|No| ShowPrompt[Show Empty State:
Search for music,
movies, shows...] EmptyState -->|Yes| ShowResults[Show Results Grouped:
- Songs
- Albums
- Artists
- Movies
- Episodes] ShowPrompt --> UserTypes[User Types in Search] UserTypes --> LiveSearch[Live Search
Debounced 300ms] LiveSearch --> ShowResults ShowResults --> UserClick{User Clicks Result} UserClick -->|Song| PlaySong[Play Song + Queue Results] UserClick -->|Album| NavAlbum[Navigate to Album Detail] UserClick -->|Artist| NavArtist[Navigate to Artist Page] UserClick -->|Movie| NavMovie[Navigate to Movie Detail] ``` **Search Page Layout:** ``` ┌─────────────────────────────────────────┐ │ [🔍 Search...] [✕] │ │ │ │ Songs ──────────────────────────── │ │ ♪ Song Title - Artist 3:45 │ │ ♪ Song Title - Artist 4:12 │ │ See all (23) │ │ │ │ Albums ─────────────────────────── │ │ [Album Cover] Album Title │ │ [Album Cover] Album Title │ │ See all (8) │ │ │ │ Artists ────────────────────────── │ │ [Photo] Artist Name │ │ See all (5) │ └─────────────────────────────────────────┘ ``` --- ## 7. Download Flows ### 7.1 Initiating Downloads ```mermaid flowchart TB User[User on Album/Track Page] --> ClickDownload[Click Download Button] ClickDownload --> CheckType{Download Type?} CheckType -->|Single Track| DownloadTrack[Download Single File] CheckType -->|Album| DownloadAlbum[Download All Tracks] CheckType -->|Artist| ShowOptions[Show Options Dialog] ShowOptions --> UserChoice{User Choice} UserChoice -->|Discography| DownloadAll[Download All Albums] UserChoice -->|Select Albums| AlbumPicker[Album Selection UI] DownloadTrack --> QueueDownload[Queue in Download Manager] DownloadAlbum --> QueueMultiple[Queue Multiple Files] QueueDownload --> ShowProgress[Show Progress Ring
on Download Button] QueueMultiple --> ShowProgress ShowProgress --> DownloadActive[Download Active:
Button shows % complete] ``` **Download Button States:** ``` States: 1. [⬇] Available - Gray outline 2. [○ 45%] Downloading - Blue ring progress 3. [✓] Downloaded - Green checkmark 4. [!] Failed - Red with retry option 5. [⏸] Paused - Yellow pause icon ``` ### 7.2 Managing Downloads Page ```mermaid flowchart TB User[User] --> NavChoice{Navigation Path} NavChoice -->|Desktop| HeaderNav[Header: Click Downloads Link] NavChoice -->|Mobile| HeaderIcon[Header: Click Downloads Icon] NavChoice -->|Direct| TypeURL[Type /downloads] HeaderNav --> DownloadsPage[Downloads Page
/downloads] HeaderIcon --> DownloadsPage TypeURL --> DownloadsPage DownloadsPage --> ShowTabs[Show Tabs:
Active | Completed] ShowTabs --> ActiveTab{Active Tab} ActiveTab -->|Active| ShowActive[Show Active Downloads:
- Download progress bars
- Pause/Resume buttons
- Cancel buttons] ActiveTab -->|Completed| ShowCompleted[Show Completed:
- Downloaded items list
- Delete buttons
- Play buttons] ShowActive --> UserAction1{User Action} UserAction1 -->|Pause| PauseDownload[Pause Download] UserAction1 -->|Cancel| CancelDialog[Show Confirm Dialog] ShowCompleted --> UserAction2{User Action} UserAction2 -->|Play| PlayOffline[Play from Local File] UserAction2 -->|Delete| DeleteDialog[Show Confirm Dialog] ``` **Navigation to Downloads:** - **Desktop:** Click "Downloads" link in header navigation - **All screen sizes:** Click download icon (⬇) button in header user menu - **Direct:** Navigate to `/downloads` route **Downloads Page Layout:** ``` ┌─────────────────────────────────────────┐ │ [←] Downloads │ │ │ │ [Active (3)] [Completed (12)] │ │ │ │ ─ Downloading ──────────────────── │ │ │ │ Album Cover Album Title │ │ Artist Name │ │ [████████░░] 80% │ │ [⏸ Pause] [✕ Cancel] │ │ │ │ Album Cover Album Title │ │ Artist Name │ │ [██░░░░░░░░] 20% │ │ [⏸ Pause] [✕ Cancel] │ │ │ │ ─ Queued ───────────────────────── │ │ │ │ Album Cover Album Title │ │ Artist Name │ │ Waiting... │ └─────────────────────────────────────────┘ ``` --- ## 8. Settings & Account Flows ### 8.1 Settings Navigation ```mermaid flowchart TB User[User] --> NavChoice{Navigation Path} NavChoice -->|Desktop| HeaderSettings[Header: Click Settings Link] NavChoice -->|Mobile| OverflowMenu[Click Overflow Menu
→ Settings] NavChoice -->|Direct| TypeURL[Navigate to /settings] HeaderSettings --> SettingsPage[Settings Page
/settings] OverflowMenu --> SettingsPage TypeURL --> SettingsPage SettingsPage --> ShowSections[Show Sections:
- Account
- Playback
- Downloads
- Appearance
- About] ShowSections --> UserClick{User Clicks Section} UserClick -->|Account| AccountSettings[Account Settings:
- Server URL
- Username
- Logout button] UserClick -->|Playback| PlaybackSettings[Playback Settings:
- Gapless playback
- Volume normalization
- Crossfade duration] UserClick -->|Downloads| DownloadSettings[Download Settings:
- Max concurrent
- WiFi only
- Storage location
- Auto-cache next tracks] UserClick -->|Appearance| AppearanceSettings[Appearance Settings:
- Dark mode
- Accent color] ``` **Navigation to Settings:** - **Desktop:** Click "Settings" link in header navigation - **Mobile:** Click three-dot overflow menu → Select "Settings" - **Direct:** Navigate to `/settings` route ### 8.2 Logout Flow ```mermaid flowchart TB AnyScreen[Any Screen] --> ClickLogout[Click Logout Button
in Header] ClickLogout --> ConfirmDialog[Show Confirmation:
"Log out of [Server]?"] ConfirmDialog --> UserConfirm{User Confirms?} UserConfirm -->|No| CancelLogout[Cancel - Stay on Current Screen] UserConfirm -->|Yes| StopPlayer[Stop Playback] StopPlayer --> ClearToken[Delete Token from Keyring] ClearToken --> ClearState[Clear App State:
- Player state
- Queue
- Current screen] ClearState --> NavLogin[Navigate to Login Screen
/login] NavLogin --> ShowLogin[Show Login Screen:
- No Header
- No Bottom Nav
- No MiniPlayer] ``` **Logout Button Location:** - Always visible in header user menu (logout icon) - Accessible from any authenticated screen --- ## 9. Background & Lock Screen Behavior ### 9.1 Audio Playback in Background (Android) ```mermaid flowchart TB Playing[Audio Playing] --> Background{User Action} Background -->|Home Button| AppBackground[App to Background] Background -->|Screen Lock| ScreenLock[Screen Locked] AppBackground --> ContinuePlay[Playback Continues] ScreenLock --> ContinuePlay ContinuePlay --> ShowNotification[Show Media Notification:
- Artwork
- Title/Artist
- Play/Pause
- Next/Previous] ShowNotification --> LockScreen[Lock Screen Controls:
Media Session Integration] LockScreen --> UserInteract{User Interaction} UserInteract -->|Tap Notification| OpenApp[Open App to Last Screen
with MiniPlayer] UserInteract -->|Lock Screen Controls| SendCommand[Send Command to Player] UserInteract -->|BLE Headset Button| HeadsetControl[AVRCP Command] ``` **Notification Layout (Android):** ``` ┌─────────────────────────────────────────┐ │ [Artwork] Song Title │ │ Artist Name │ │ Album Name │ │ │ │ [⏮] [⏸] [⏭] [✕] │ └─────────────────────────────────────────┘ ``` ### 9.2 Video Playback in Background ```mermaid flowchart TB VideoPlaying[Video Playing] --> Background{User Action} Background -->|Home Button| AutoPause[Automatically Pause] Background -->|Screen Lock| AutoPause AutoPause --> SaveProgress[Save Progress] SaveProgress --> ShowNotification[Show Paused Notification:
"Tap to Resume"] ShowNotification --> UserReturn{User Returns?} UserReturn -->|Tap Notification| ResumeVideo[Open App to Video Player] UserReturn -->|Later| KeepPaused[Video Remains Paused] ResumeVideo --> AskResume[Resume from Saved Position] ``` --- ## 10. Error States & Edge Cases ### 10.1 Network Loss During Streaming ```mermaid flowchart TB Streaming[Streaming Audio/Video] --> LoseNetwork[Network Connection Lost] LoseNetwork --> CheckLocal{Local Copy
Available?} CheckLocal -->|Yes| SwitchLocal[Switch to Local Playback
Seamlessly] CheckLocal -->|No| ShowBuffer[Show Buffering Spinner] ShowBuffer --> WaitReconnect[Wait for Reconnection
30 second timeout] WaitReconnect --> Reconnect{Reconnected?} Reconnect -->|Yes| Resume[Resume Streaming] Reconnect -->|No| ShowError[Show Error Toast:
"Unable to stream.
Check connection."] ShowError --> OfferRetry[Offer Retry Button] ShowError --> OfferDownload[Offer "Download for Offline"] ``` ### 10.2 Server Unreachable ```mermaid flowchart TB Action[User Action Requires Server] --> TryConnect[Attempt Connection] TryConnect --> Timeout{Connection
Timeout?} Timeout -->|Yes| ShowError[Show Error:
"Server unreachable"] Timeout -->|No| Success[Action Succeeds] ShowError --> OfferOptions[Offer Options:
- Retry
- Switch to Offline Mode
- Change Server] ``` ### 10.3 Download Failed ```mermaid flowchart TB Downloading[Download in Progress] --> Failure{Failure Type?} Failure -->|Network Error| Retry[Auto-retry
with Backoff] Failure -->|Disk Full| ShowDiskError[Show Error:
"Not enough storage"] Failure -->|Server Error| ShowServerError[Show Error:
"Server error"] Retry --> RetryCount{Retry Count
< 3?} RetryCount -->|Yes| Downloading RetryCount -->|No| Failed[Mark as Failed] ShowDiskError --> Failed ShowServerError --> Failed Failed --> UserAction[Show in Downloads:
with Retry Button] ``` --- ## 11. Platform-Specific UX Patterns ### 11.1 Android-Specific **Hardware Back Button:** - **In Full Player:** Return to previous screen, show MiniPlayer - **In Video Player:** Stop playback, exit fullscreen - **In Album Detail:** Return to library grid - **At Library Home:** Exit app (show confirmation) **System Volume Buttons:** - **While playing audio:** Adjust playback volume - **While controlling remote session:** Adjust remote session volume (shows session name in volume panel) - **In menus:** Adjust system volume (default behavior) **Share Integration:** - Long-press album/song → Share menu - Options: Share with other apps, Copy link ### 11.2 Linux Desktop-Specific **Keyboard Shortcuts:** - `Space`: Play/Pause - `→`: Next track - `←`: Previous track - `/`: Focus search - `Ctrl+Q`: Quit **Window Behavior:** - Minimize to tray (playback continues) - Close window (show confirmation if playing) - MPRIS integration for desktop media controls **Mouse Interactions:** - Hover over MiniPlayer: Show additional controls (volume, queue peek) - Right-click: Context menu (Add to playlist, Go to artist, Download) --- ## 12. UX Principles Summary ### 12.1 Core Principles 1. **Playback Persistence:** - Audio playback never stops unless user explicitly stops it - MiniPlayer visible on all screens (except video/login) - Queue and position preserved across navigation 2. **Non-Blocking UI:** - Downloads happen in background - Sync operations never block user interaction - Optimistic updates (favorite, progress) with background sync 3. **Offline-First:** - Downloaded content works offline - Seamless switch between online/offline - Progress and preferences saved locally 4. **Progressive Disclosure:** - Simple defaults, advanced options hidden - Context menus for secondary actions - Settings organized by category 5. **Responsive Design:** - Mobile-first UI - Desktop enhancements (hover states, keyboard shortcuts) - Tablet: Grid layouts with more columns ### 12.2 Animation & Transitions | Transition | Duration | Easing | |------------|----------|--------| | MiniPlayer slide up/down | 300ms | ease-out | | Screen navigation | 200ms | ease-in-out | | Video controls fade | 500ms | ease-out | | Download button state change | 150ms | ease-in-out | | Modal appear | 200ms | ease-out | | Toast notification | 250ms | ease-in-out | ### 12.3 Touch Targets (Mobile) | Element | Minimum Size | |---------|--------------| | Bottom nav buttons | 48x48 dp | | List item (track, album) | Full width x 56 dp | | Player controls | 56x56 dp | | MiniPlayer | Full width x 64 dp | | Download button | 40x40 dp | | Favorite button | 40x40 dp | --- ## 13. Future UX Enhancements ### 13.1 Planned Features 1. **Gesture Navigation:** - Swipe up on MiniPlayer → Full player - Swipe down on full player → Back to previous screen - Swipe between tracks in full player 2. **Queue Management UI (DR-020):** - Drag to reorder - Swipe to remove - Add to queue vs. Play next 3. **Sleep Timer (UR-026):** - Accessible from full player menu - Presets: 15min, 30min, 1hr, End of track, End of album - Countdown visible in MiniPlayer 4. **Home Screen (UR-034):** - Hero banner carousel - Continue watching/listening - Recently added - Personalized recommendations 5. **Cast/Remote Control Enhancements:** - Picture-in-picture for remote sessions - Multi-room audio (play on multiple devices) - Handoff (transfer playback to phone from TV) ### 13.2 Accessibility Enhancements - Screen reader optimization - High contrast mode - Larger text option - Voice control integration - Haptic feedback for controls --- This UX flow documentation should be updated as new features are implemented and user feedback is incorporated.