From 15b6ba985aec6f67e1676b9b7a4dfa47d80b3f22 Mon Sep 17 00:00:00 2001 From: 4gray Date: Sat, 2 May 2026 23:53:05 +0200 Subject: [PATCH] feat(live-tv): collapsible sidebar in live tv views Entire-Checkpoint: f957cd9849e0 --- apps/web/src/assets/i18n/ar.json | 5 ++ apps/web/src/assets/i18n/ary.json | 5 ++ apps/web/src/assets/i18n/by.json | 5 ++ apps/web/src/assets/i18n/de.json | 5 ++ apps/web/src/assets/i18n/el.json | 5 ++ apps/web/src/assets/i18n/en.json | 5 ++ apps/web/src/assets/i18n/es.json | 5 ++ apps/web/src/assets/i18n/fr.json | 5 ++ apps/web/src/assets/i18n/it.json | 5 ++ apps/web/src/assets/i18n/ja.json | 5 ++ apps/web/src/assets/i18n/ko.json | 5 ++ apps/web/src/assets/i18n/nl.json | 5 ++ apps/web/src/assets/i18n/pl.json | 5 ++ apps/web/src/assets/i18n/pt.json | 5 ++ apps/web/src/assets/i18n/ru.json | 5 ++ apps/web/src/assets/i18n/tr.json | 5 ++ apps/web/src/assets/i18n/zh.json | 5 ++ apps/web/src/assets/i18n/zhtw.json | 5 ++ docs/architecture/iptvnator-ui-guidelines.md | 22 +++++++ .../video-player/video-player.component.html | 28 +++++++++ .../video-player/video-player.component.scss | 29 ++++++++++ .../video-player/video-player.component.ts | 57 +++++++++++++------ .../unified-collection-page.component.html | 22 +++++++ .../unified-collection-page.component.ts | 20 +++++++ .../unified-live-tab.component.html | 1 + .../unified-live-tab.component.ts | 1 + libs/portal/shared/util/src/index.ts | 2 + libs/portal/shared/util/src/lib/keyboard.ts | 15 +++++ .../util/src/lib/live-sidebar-state.spec.ts | 50 ++++++++++++++++ .../shared/util/src/lib/live-sidebar-state.ts | 23 ++++++++ .../stalker-live-stream-layout.component.html | 24 ++++++++ .../stalker-live-stream-layout.component.ts | 39 ++++++++++++- .../live-stream-layout.component.html | 24 ++++++++ .../live-stream-layout.component.ts | 35 +++++++++++- .../channel-list-container.component.html | 1 + .../channel-list-container.component.ts | 1 + .../groups-view/groups-view.component.html | 16 +++++- .../groups-view/groups-view.component.scss | 6 ++ .../groups-view/groups-view.component.ts | 3 + .../sidebar/sidebar.component.html | 1 + .../video-player/sidebar/sidebar.component.ts | 1 + libs/ui/styles/_portal-layout.scss | 52 +++++++++++++++++ 42 files changed, 541 insertions(+), 22 deletions(-) create mode 100644 libs/portal/shared/util/src/lib/keyboard.ts create mode 100644 libs/portal/shared/util/src/lib/live-sidebar-state.spec.ts create mode 100644 libs/portal/shared/util/src/lib/live-sidebar-state.ts diff --git a/apps/web/src/assets/i18n/ar.json b/apps/web/src/assets/i18n/ar.json index 1cd19ee62..4b5acf96b 100644 --- a/apps/web/src/assets/i18n/ar.json +++ b/apps/web/src/assets/i18n/ar.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "السمة الفاتحة", "SYSTEM_THEME": "سمة النظام" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "إخفاء قائمة القنوات", + "SHOW_CHANNELS_LIST": "إظهار قائمة القنوات", + "TOGGLE_SIDEBAR_TOOLTIP": "تبديل قائمة القنوات (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "البحث عن قناة", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "تحميل أو اختيار قائمة أخرى", diff --git a/apps/web/src/assets/i18n/ary.json b/apps/web/src/assets/i18n/ary.json index a73426a62..4622cb321 100644 --- a/apps/web/src/assets/i18n/ary.json +++ b/apps/web/src/assets/i18n/ary.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "المظهر الفاتح", "SYSTEM_THEME": "مظهر النظام" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "إخفاء قائمة القنوات", + "SHOW_CHANNELS_LIST": "إظهار قائمة القنوات", + "TOGGLE_SIDEBAR_TOOLTIP": "تبديل قائمة القنوات (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "قلب على قناة", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "رفع ولا اختار قائمة تشغيل أخرى", diff --git a/apps/web/src/assets/i18n/by.json b/apps/web/src/assets/i18n/by.json index dad2474fc..e28d7034b 100644 --- a/apps/web/src/assets/i18n/by.json +++ b/apps/web/src/assets/i18n/by.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "Светлая тэма", "SYSTEM_THEME": "Сістэмная тэма" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "Схаваць спіс каналаў", + "SHOW_CHANNELS_LIST": "Паказаць спіс каналаў", + "TOGGLE_SIDEBAR_TOOLTIP": "Пераключыць спіс каналаў (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "Пошук каналаў", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "Загрузіць або выбраць іншы плэйліст", diff --git a/apps/web/src/assets/i18n/de.json b/apps/web/src/assets/i18n/de.json index bca22b425..f0ffeab6a 100644 --- a/apps/web/src/assets/i18n/de.json +++ b/apps/web/src/assets/i18n/de.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "Hell", "SYSTEM_THEME": "System" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "Senderliste ausblenden", + "SHOW_CHANNELS_LIST": "Senderliste einblenden", + "TOGGLE_SIDEBAR_TOOLTIP": "Senderliste umschalten (⌘/Strg+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "Nach Sender suchen", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "Neue Playlist hochladen oder eine andere aussuchen", diff --git a/apps/web/src/assets/i18n/el.json b/apps/web/src/assets/i18n/el.json index 10785962d..070208e9b 100644 --- a/apps/web/src/assets/i18n/el.json +++ b/apps/web/src/assets/i18n/el.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "Ανοιχτόχρωμο θέμα", "SYSTEM_THEME": "Θέμα συστήματος" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "Απόκρυψη λίστας καναλιών", + "SHOW_CHANNELS_LIST": "Εμφάνιση λίστας καναλιών", + "TOGGLE_SIDEBAR_TOOLTIP": "Εναλλαγή λίστας καναλιών (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "Αναζήτηση καναλιού", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "Μεταφορτώστε ή επιλέξτε άλλη λίστα αναπαραγωγής", diff --git a/apps/web/src/assets/i18n/en.json b/apps/web/src/assets/i18n/en.json index 6184bbda3..0e75ff242 100644 --- a/apps/web/src/assets/i18n/en.json +++ b/apps/web/src/assets/i18n/en.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "Light theme", "SYSTEM_THEME": "System theme" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "Hide channels list", + "SHOW_CHANNELS_LIST": "Show channels list", + "TOGGLE_SIDEBAR_TOOLTIP": "Toggle channels list (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "Search channel", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "Upload or select other playlist", diff --git a/apps/web/src/assets/i18n/es.json b/apps/web/src/assets/i18n/es.json index dd3fa3cab..d1a82b5d1 100644 --- a/apps/web/src/assets/i18n/es.json +++ b/apps/web/src/assets/i18n/es.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "Tema claro", "SYSTEM_THEME": "Tema del sistema" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "Ocultar lista de canales", + "SHOW_CHANNELS_LIST": "Mostrar lista de canales", + "TOGGLE_SIDEBAR_TOOLTIP": "Alternar lista de canales (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "Buscar canal", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "Carga o selecciona una lista de reproducción", diff --git a/apps/web/src/assets/i18n/fr.json b/apps/web/src/assets/i18n/fr.json index 130c9505a..dd2580eed 100644 --- a/apps/web/src/assets/i18n/fr.json +++ b/apps/web/src/assets/i18n/fr.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "Thème clair", "SYSTEM_THEME": "Thème du système" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "Masquer la liste des chaînes", + "SHOW_CHANNELS_LIST": "Afficher la liste des chaînes", + "TOGGLE_SIDEBAR_TOOLTIP": "Basculer la liste des chaînes (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "Rechercher une chaîne", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "Transférer ou choisir une autre liste de lecture", diff --git a/apps/web/src/assets/i18n/it.json b/apps/web/src/assets/i18n/it.json index c689b4007..be9632c17 100644 --- a/apps/web/src/assets/i18n/it.json +++ b/apps/web/src/assets/i18n/it.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "Tema chiaro", "SYSTEM_THEME": "Tema di sistema" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "Nascondi elenco canali", + "SHOW_CHANNELS_LIST": "Mostra elenco canali", + "TOGGLE_SIDEBAR_TOOLTIP": "Attiva/disattiva elenco canali (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "Cerca canale", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "Carica o seleziona un'altra playlist", diff --git a/apps/web/src/assets/i18n/ja.json b/apps/web/src/assets/i18n/ja.json index cb32783f0..9d4305812 100644 --- a/apps/web/src/assets/i18n/ja.json +++ b/apps/web/src/assets/i18n/ja.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "ライトテーマ", "SYSTEM_THEME": "システムテーマ" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "チャンネル一覧を非表示", + "SHOW_CHANNELS_LIST": "チャンネル一覧を表示", + "TOGGLE_SIDEBAR_TOOLTIP": "チャンネル一覧の切り替え (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "チャンネルを検索", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "アップロードまたは他のプレイリストを選択", diff --git a/apps/web/src/assets/i18n/ko.json b/apps/web/src/assets/i18n/ko.json index 657681b24..4b7c837f1 100644 --- a/apps/web/src/assets/i18n/ko.json +++ b/apps/web/src/assets/i18n/ko.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "밝은 테마", "SYSTEM_THEME": "시스템 테마" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "채널 목록 숨기기", + "SHOW_CHANNELS_LIST": "채널 목록 표시", + "TOGGLE_SIDEBAR_TOOLTIP": "채널 목록 전환 (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "검색 채널", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "다른 재생 목록을 업로드하거나 선택하십시오", diff --git a/apps/web/src/assets/i18n/nl.json b/apps/web/src/assets/i18n/nl.json index a8c6f77b4..0d30e684e 100644 --- a/apps/web/src/assets/i18n/nl.json +++ b/apps/web/src/assets/i18n/nl.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "Licht thema", "SYSTEM_THEME": "Systeemthema" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "Zenderlijst verbergen", + "SHOW_CHANNELS_LIST": "Zenderlijst tonen", + "TOGGLE_SIDEBAR_TOOLTIP": "Zenderlijst aan-/uitzetten (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "Zoek een kanaal", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "Upload of selecteer een andere afspeellijst", diff --git a/apps/web/src/assets/i18n/pl.json b/apps/web/src/assets/i18n/pl.json index d7155953e..a730f627a 100644 --- a/apps/web/src/assets/i18n/pl.json +++ b/apps/web/src/assets/i18n/pl.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "Jasny motyw", "SYSTEM_THEME": "Motyw systemowy" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "Ukryj listę kanałów", + "SHOW_CHANNELS_LIST": "Pokaż listę kanałów", + "TOGGLE_SIDEBAR_TOOLTIP": "Przełącz listę kanałów (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "Szukaj kanału", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "Prześlij lub wybierz inną listę odtwarzania", diff --git a/apps/web/src/assets/i18n/pt.json b/apps/web/src/assets/i18n/pt.json index 3f54d12f2..2d1d92be6 100644 --- a/apps/web/src/assets/i18n/pt.json +++ b/apps/web/src/assets/i18n/pt.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "Tema claro", "SYSTEM_THEME": "Tema do sistema" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "Ocultar lista de canais", + "SHOW_CHANNELS_LIST": "Mostrar lista de canais", + "TOGGLE_SIDEBAR_TOOLTIP": "Alternar lista de canais (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "Pesquisar canal", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "Enviar ou selecionar outra playlist", diff --git a/apps/web/src/assets/i18n/ru.json b/apps/web/src/assets/i18n/ru.json index 8fca59409..72af1c2f5 100644 --- a/apps/web/src/assets/i18n/ru.json +++ b/apps/web/src/assets/i18n/ru.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "Светлая тема", "SYSTEM_THEME": "Системная тема" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "Скрыть список каналов", + "SHOW_CHANNELS_LIST": "Показать список каналов", + "TOGGLE_SIDEBAR_TOOLTIP": "Переключить список каналов (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "Поиск каналов", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "Загрузить или выбрать другой плейлист", diff --git a/apps/web/src/assets/i18n/tr.json b/apps/web/src/assets/i18n/tr.json index 84f454682..d0460a941 100644 --- a/apps/web/src/assets/i18n/tr.json +++ b/apps/web/src/assets/i18n/tr.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "Açık tema", "SYSTEM_THEME": "Sistem teması" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "Kanal listesini gizle", + "SHOW_CHANNELS_LIST": "Kanal listesini göster", + "TOGGLE_SIDEBAR_TOOLTIP": "Kanal listesini aç/kapat (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "Kanal ara", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "Dosya yükle veya başka bir oynatma listesi seçin", diff --git a/apps/web/src/assets/i18n/zh.json b/apps/web/src/assets/i18n/zh.json index 04ea45051..535e01ad9 100644 --- a/apps/web/src/assets/i18n/zh.json +++ b/apps/web/src/assets/i18n/zh.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "明亮模式", "SYSTEM_THEME": "跟随系统" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "隐藏频道列表", + "SHOW_CHANNELS_LIST": "显示频道列表", + "TOGGLE_SIDEBAR_TOOLTIP": "切换频道列表 (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "搜索频道", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "上传或选择其他播放列表", diff --git a/apps/web/src/assets/i18n/zhtw.json b/apps/web/src/assets/i18n/zhtw.json index 6fe9094cb..75b51143e 100644 --- a/apps/web/src/assets/i18n/zhtw.json +++ b/apps/web/src/assets/i18n/zhtw.json @@ -348,6 +348,11 @@ "LIGHT_THEME": "亮色主題", "SYSTEM_THEME": "跟隨系統" }, + "LAYOUT": { + "HIDE_CHANNELS_LIST": "隱藏頻道列表", + "SHOW_CHANNELS_LIST": "顯示頻道列表", + "TOGGLE_SIDEBAR_TOOLTIP": "切換頻道列表 (⌘/Ctrl+B)" + }, "CHANNELS": { "SEARCH_CHANNEL": "搜尋頻道", "UPLOAD_OR_SELECT_OTHER_PLAYLIST": "上傳或選擇其他播放清單", diff --git a/docs/architecture/iptvnator-ui-guidelines.md b/docs/architecture/iptvnator-ui-guidelines.md index 429d7559b..ac461ba70 100644 --- a/docs/architecture/iptvnator-ui-guidelines.md +++ b/docs/architecture/iptvnator-ui-guidelines.md @@ -143,6 +143,28 @@ The shared row should be reused instead of rebuilding channel markup per view. - Keep the EPG content mounted while collapsed so current-program state can continue updating. +### Collapsible Live Sidebar + +- 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. +- Collapsed state is persisted in `live-sidebar-state` (helpers in + `@iptvnator/portal/shared/util`); missing or invalid values restore to + expanded. The state is global across all three modules so the user's choice + carries across portals and reloads. +- 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. +- Keyboard shortcut: `Cmd/Ctrl+B`. The handler ignores events that originate + inside ``, `