From fae19c2041ee419e62d1fed62e6e2c83b802701b Mon Sep 17 00:00:00 2001 From: 4gray Date: Fri, 31 Jul 2026 09:49:04 +0200 Subject: [PATCH] docs(ui): document live panel ownership --- .changes/ui-live-panel-toggles.md | 10 ++ CLAUDE.md | 17 +++ docs/architecture/iptvnator-ui-guidelines.md | 102 +++++++++++------- ...026-07-31-live-panel-toggle-consistency.md | 20 ++-- 4 files changed, 98 insertions(+), 51 deletions(-) create mode 100644 .changes/ui-live-panel-toggles.md diff --git a/.changes/ui-live-panel-toggles.md b/.changes/ui-live-panel-toggles.md new file mode 100644 index 000000000..d530d9a52 --- /dev/null +++ b/.changes/ui-live-panel-toggles.md @@ -0,0 +1,10 @@ +--- +type: feature +area: ui +issues: [1118] +--- + +Live TV now remembers Groups and Channels visibility independently across M3U, +Xtream, Stalker, Favorites, and Recently Viewed. Consistent accessible controls +restore each panel, while Cmd/Ctrl+B temporarily clears the viewing area +without overwriting those choices. Guide toggles now appear only when usable. diff --git a/CLAUDE.md b/CLAUDE.md index 534b5bac8..9a3b42114 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -929,6 +929,23 @@ engine` (restart required) or - Keyboard shortcuts: ArrowUp/ArrowDown (volume), M (mute) - Component: `libs/ui/playback/src/lib/audio-player/audio-player.component.ts` +**Live Panel Controls**: + +- Groups and Channels keep independent persisted intent through + `LiveLayoutPanelStateService` in `@iptvnator/portal/shared/data-access`; + missing new values migrate per panel from the legacy + `live-sidebar-state`. +- M3U, Xtream, Stalker, Favorites, and Recently Viewed use the same + header-hide/boundary-restore pattern with retained `inert` panels, ARIA + relationships, focus transfer, and 40px minimum targets. +- `Cmd/Ctrl+B` temporarily suppresses applicable left panels without changing + their saved combination. Responsive suppression also preserves intent and + omits unfulfillable restore controls. +- Guide disclosure appears only beside a working inline player. External + MPV/VLC keeps a static EPG heading, and radio has no Guide panel. +- Canonical UX and ownership contract: + `docs/architecture/iptvnator-ui-guidelines.md` ("Live Panel Disclosures"). + **EPG (Electronic Program Guide)**: - XMLTV format support diff --git a/docs/architecture/iptvnator-ui-guidelines.md b/docs/architecture/iptvnator-ui-guidelines.md index e0082a268..6d84645f7 100644 --- a/docs/architecture/iptvnator-ui-guidelines.md +++ b/docs/architecture/iptvnator-ui-guidelines.md @@ -214,48 +214,68 @@ remain local when the meaning is explicit. - Keep the EPG content mounted while collapsed so current-program state can continue updating. -### Collapsible Live Sidebar +### Live Panel Disclosures -- M3U, Xtream, and Stalker live layouts share a single sidebar collapse toggle - that hides the channels rail to give the player and EPG full width. -- Xtream Live TV's root view (`/live` with no selected category) follows the - same paginated `All Items` shell as VOD and Series: a widget header with the - total channel count, page-size controls, and page navigation above the shared - `app-grid-list`. Use the grid list's logo-oriented live variant so channel - logos stay contained in 16:9 thumbnails instead of being cropped like - VOD/series posters. Selecting a channel from that root grid starts playback, - selects the channel's category, highlights the active category and channel, - and scrolls the category rail plus virtual channels list to the selected rows - when those rails are visible. -- In Xtream and Stalker live TV, the same toggle also collapses the workspace - shell context sidebar (the "Live Categories" rail rendered by - `WorkspaceShellContextSidebarComponent`), matching M3U's "everything quiets" - behaviour. The shell categories rail only collapses when the active section - is `live` (Xtream) or `itv`/`radio` (Stalker); movies, series, favorites, - and recent routes leave it untouched. -- Collapsed state is owned by `LiveLayoutSidebarStateService` - (`providedIn: 'root'`) in `@iptvnator/portal/shared/util`. Every surface that - participates injects the service and reads `isCollapsed`; any toggle calls - `service.toggle()`. Persistence delegates to the existing - `live-sidebar-state` helpers, so the localStorage key stays unchanged and - missing/invalid values restore to expanded. -- A `mat-icon-button` with `chevron_left` lives in the sidebar header and - toggles state. While collapsed, a floating `chevron_right` mini-fab appears - at the left edge of `.content-container` to restore the rail (and the - categories rail, in Xtream/Stalker live). -- Keyboard shortcut: `Cmd/Ctrl+B`. The handler ignores events that originate - inside ``, `