# 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`
