# UX/UI Analysis: Header vs Rail Navigation Date: 2026-03-22 ## Overview Evaluation of IPTVnator's navigation architecture — specifically the separation between **global actions in the top header** and **playlist-local actions in the left rail sidebar**, assessed from a user understanding perspective. ## Current Architecture | Region | Intended Scope | Actual Contents | |--------|---------------|-----------------| | **Header** (top) | Global / app-wide | Playlist switcher, search, add playlist, global favorites, downloads, **context menu with local actions** | | **Rail** (left) | Local / playlist-specific | Dashboard (global), Sources (global), **dynamic provider links** (local), Settings (global) | Neither region is purely global or purely local. Both mix scopes, which muddies the mental model. ## Strengths - **Playlist switcher in the header** is excellent placement. Acts like a "workspace context selector" — similar to Slack's workspace switcher or VS Code's project selector. - **Command palette** nails the global-vs-local distinction with explicit "GLOBAL ACTIONS" and "THIS PLAYLIST" section headers. Clearest articulation of scope in the entire UI. - **Rail dividers** between static workspace links (Dashboard, Sources) and dynamic provider links provide a subtle visual boundary hinting at the scope change. - **Search bar adapting its placeholder text** per route is good contextual affordance. - **Settings at the rail bottom** follows a well-established pattern (Slack, Discord, VS Code). ## Confusion Points ### A. Rail Mixes Global and Local Without Explaining Why When a user selects an Xtream playlist, the rail shows: ``` Dashboard <- global Sources <- global ----------------- Movies <- local (Xtream) Live TV <- local (Xtream) Series <- local (Xtream) ----------------- Search <- local (Xtream) Recently viewed <- local (Xtream) Favorites <- local (Xtream) ----------------- Settings <- global ``` When switching to M3U: ``` Dashboard <- global Sources <- global ----------------- All channels <- local (M3U) Groups <- local (M3U) Recently viewed <- local (M3U) Favorites <- local (M3U) ----------------- Settings <- global ``` **Issue:** The dynamic links change silently. There's no label like "rucolor.tv" or "clean.m3u" above the provider links to indicate *which* playlist these links belong to. Users who switch playlists via the header dropdown may not immediately notice the rail updated. **Severity:** Medium. ### B. Header's Three-Dot Menu Breaks the "Global Header" Mental Model The context actions menu in the header contains: - **Playlist Info** — local to the current playlist - **Account Info** — local to the current Xtream portal - **Clear Recently Viewed** — local bulk action These are playlist-scoped actions living in what should be the "global" header area. **Severity:** Low-Medium. ### C. "Favorites" Appears in Both Global and Local Contexts - **Header:** Global Favorites star icon (cross-playlist) - **Rail:** Favorites link (playlist-specific) A user clicking the star in the header vs the heart in the rail gets *different* favorites views with *no* clear labeling of "global" vs "this playlist." **Severity:** Medium-High. Most likely source of user confusion. ### D. Search Bar Scope Is Invisible The search bar disables itself on some routes and changes behavior on others. The placeholder text changes, but "Search in this section..." doesn't clarify *which* section. **Severity:** Low. ## Recommendations ### Quick Wins (Low Effort, High Impact) 1. **Add a playlist name label above the dynamic rail links.** Small, muted text showing "clean.m3u" or "rucolor.tv" above the provider-specific navigation. 2. **Keep Global Favorites as a single left-rail destination.** Avoid reintroducing a second header shortcut for the same global destination; reserve header actions for contextual controls. 3. **Add a scope label to the search bar** when active: "Searching in Live TV" or "Searching in clean.m3u" instead of generic "Search in this section..." ### Medium Effort 4. **Consider moving the three-dot context menu into the context panel** rather than the header, keeping the header purely global. 5. **Animate the rail transition** when switching playlists — a subtle slide or fade to signal that links changed. ## Overall Assessment **Score: 7/10 — Good, with clear improvement opportunities.** The architecture follows patterns users will recognize from Slack, VS Code, and Spotify. The main risks are the **silent dynamic rail** and the **favorites scope ambiguity**. Fixing those two issues would bring this to a 9/10 for navigational clarity. ### Design Principle The command palette already has the right model: **explicit scope labels**. Apply this same principle to the rail and header. Anywhere an action's scope isn't obvious from its placement, label it. ## Key Files - `libs/workspace/shell/feature/src/lib/workspace-shell/workspace-shell.component.html` - `libs/workspace/shell/feature/src/lib/workspace-shell/workspace-shell.component.ts` - `libs/portal/shared/ui/src/lib/navigation/portal-rail-links.component.ts` - `libs/portal/shared/util/src/lib/navigation/portal-rail-links.ts` - `libs/playlist/shared/ui/src/lib/playlist-switcher/playlist-switcher.component.ts` - `libs/workspace/shell/feature/src/lib/workspace-command-palette/workspace-command-palette.component.ts`