diff --git a/CLAUDE.md b/CLAUDE.md index 323e433f2..fdfb23910 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -621,7 +621,7 @@ This project uses modern Angular signal-based APIs and patterns. **ALWAYS** use **VOD/Series Detail Pages (two-state layout)**: - Xtream and Stalker detail pages use the shared `PortalDetailShellComponent` (`libs/ui/components/src/lib/portal-detail-shell/`) with two states: **Browse** (hero with poster/metadata/actions, episodes below) and **Watch** (hero collapses with a ~300ms morph, the inline player takes the full content width, metadata moves to an About block below the episodes) -- Watch state derives from `inlinePlayback() !== null` only; external MPV/VLC playback keeps the browse layout. Esc and the now-playing back button close the inline player back to browse without route navigation +- Watch state derives from `inlinePlayback() !== null` only; external MPV/VLC playback keeps the browse layout. Esc and "Close player" exit to browse without navigation; the now-playing back arrow is route-level back (straight to the list via the host's `goBack()`) - Hosts pass hero chips/meta/actions as `*appDetailTags`/`*appDetailMeta`/`*appDetailActions` templates; the shell stamps them into both the hero and the About block - Seasons are tabs (`SeasonTabsComponent`, dropdown beyond 6 seasons) with auto-selection (playing episode's season → resume season → first) that fires the same `seasonSelected` lazy-load/enrichment hooks as manual clicks; grid/list episode view toggle persists to localStorage; season descriptions come from `get_series_info` (Xtream) or TMDB (Stalker) - See `docs/architecture/embedded-inline-playback.md` ("Two-State Detail Layout") diff --git a/apps/web/src/assets/i18n/ar.json b/apps/web/src/assets/i18n/ar.json index 490ee6cf4..ba2530487 100644 --- a/apps/web/src/assets/i18n/ar.json +++ b/apps/web/src/assets/i18n/ar.json @@ -2,6 +2,7 @@ "CANCEL": "إلغاء", "CLEAR": "مسح", "CLOSE": "إغلاق", + "BACK": "رجوع", "SHOW_MORE": "المزيد", "SHOW_LESS": "أقل", "PLAYLISTS": "قوائم التشغيل", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "نسخ رابط البث", "NOW_PLAYING": "قيد التشغيل", "CLOSE_PLAYER": "إغلاق المشغل", - "BACK_TO_BROWSE": "العودة إلى التفاصيل", "ABOUT": "نبذة", "SEASONS_AND_EPISODES": "المواسم والحلقات", "SEASON_TAB": "الموسم {{number}}", diff --git a/apps/web/src/assets/i18n/ary.json b/apps/web/src/assets/i18n/ary.json index a3bd848c2..0c7280ba1 100644 --- a/apps/web/src/assets/i18n/ary.json +++ b/apps/web/src/assets/i18n/ary.json @@ -2,6 +2,7 @@ "CANCEL": "إلغاء", "CLEAR": "مسح", "CLOSE": "سد", + "BACK": "رجع", "SHOW_MORE": "وري كثر", "SHOW_LESS": "وري قل", "PLAYLISTS": "قوائم التشغيل", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "نسخ رابط البث", "NOW_PLAYING": "كيتشغل دابا", "CLOSE_PLAYER": "سد المشغل", - "BACK_TO_BROWSE": "رجوع للتفاصيل", "ABOUT": "حول", "SEASONS_AND_EPISODES": "المواسم والحلقات", "SEASON_TAB": "الموسم {{number}}", diff --git a/apps/web/src/assets/i18n/by.json b/apps/web/src/assets/i18n/by.json index 11216a53c..454e6c65f 100644 --- a/apps/web/src/assets/i18n/by.json +++ b/apps/web/src/assets/i18n/by.json @@ -2,6 +2,7 @@ "CANCEL": "Адмена", "CLEAR": "Ачысціць", "CLOSE": "Закрыць", + "BACK": "Назад", "SHOW_MORE": "Болей", "SHOW_LESS": "Меней", "PLAYLISTS": "Плэйлісты", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "Капіраваць URL-адрас патоку", "NOW_PLAYING": "Зараз прайграецца", "CLOSE_PLAYER": "Закрыць прайгравальнік", - "BACK_TO_BROWSE": "Назад да дэталяў", "ABOUT": "Пра фільм", "SEASONS_AND_EPISODES": "Сезоны і эпізоды", "SEASON_TAB": "Сезон {{number}}", diff --git a/apps/web/src/assets/i18n/de.json b/apps/web/src/assets/i18n/de.json index 61cea28cc..015d8e617 100644 --- a/apps/web/src/assets/i18n/de.json +++ b/apps/web/src/assets/i18n/de.json @@ -2,6 +2,7 @@ "CANCEL": "Abbrechen", "CLEAR": "Leeren", "CLOSE": "Schließen", + "BACK": "Zurück", "SHOW_MORE": "Mehr", "SHOW_LESS": "Weniger", "PLAYLISTS": "Playlisten", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "Stream-URL kopieren", "NOW_PLAYING": "Wird wiedergegeben", "CLOSE_PLAYER": "Player schließen", - "BACK_TO_BROWSE": "Zurück zu den Details", "ABOUT": "Info", "SEASONS_AND_EPISODES": "Staffeln und Folgen", "SEASON_TAB": "Staffel {{number}}", diff --git a/apps/web/src/assets/i18n/el.json b/apps/web/src/assets/i18n/el.json index b722c13fc..44eb43e3b 100644 --- a/apps/web/src/assets/i18n/el.json +++ b/apps/web/src/assets/i18n/el.json @@ -2,6 +2,7 @@ "CANCEL": "Ακύρωση", "CLEAR": "Εκκαθάριση", "CLOSE": "Κλείσιμο", + "BACK": "Πίσω", "SHOW_MORE": "Περισσότερα", "SHOW_LESS": "Λιγότερα", "PLAYLISTS": "Λίστα Αναπαραγωγής", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "Αντιγραφή διεύθηνσης URL ροής", "NOW_PLAYING": "Τώρα παίζει", "CLOSE_PLAYER": "Κλείσιμο προγράμματος αναπαραγωγής", - "BACK_TO_BROWSE": "Πίσω στις λεπτομέρειες", "ABOUT": "Σχετικά", "SEASONS_AND_EPISODES": "Σεζόν και επεισόδια", "SEASON_TAB": "Σεζόν {{number}}", diff --git a/apps/web/src/assets/i18n/en.json b/apps/web/src/assets/i18n/en.json index 321fddc75..0c10f8cef 100644 --- a/apps/web/src/assets/i18n/en.json +++ b/apps/web/src/assets/i18n/en.json @@ -2,6 +2,7 @@ "CANCEL": "Cancel", "CLEAR": "Clear", "CLOSE": "Close", + "BACK": "Back", "SHOW_MORE": "More", "SHOW_LESS": "Less", "PLAYLISTS": "Playlists", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "Copy Stream URL", "NOW_PLAYING": "Now playing", "CLOSE_PLAYER": "Close player", - "BACK_TO_BROWSE": "Back to details", "ABOUT": "About", "SEASONS_AND_EPISODES": "Seasons and Episodes", "SEASON_TAB": "Season {{number}}", diff --git a/apps/web/src/assets/i18n/es.json b/apps/web/src/assets/i18n/es.json index e568ee152..9fea237d8 100644 --- a/apps/web/src/assets/i18n/es.json +++ b/apps/web/src/assets/i18n/es.json @@ -2,6 +2,7 @@ "CANCEL": "Cancelar", "CLEAR": "Borrar", "CLOSE": "Cerrar", + "BACK": "Atrás", "SHOW_MORE": "Más", "SHOW_LESS": "Menos", "PLAYLISTS": "Listas de reproducción", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "Copiar URL de transmisión", "NOW_PLAYING": "Reproduciendo ahora", "CLOSE_PLAYER": "Cerrar reproductor", - "BACK_TO_BROWSE": "Volver a los detalles", "ABOUT": "Acerca de", "SEASONS_AND_EPISODES": "Temporadas y episodios", "SEASON_TAB": "Temporada {{number}}", diff --git a/apps/web/src/assets/i18n/fr.json b/apps/web/src/assets/i18n/fr.json index a1facf90c..153aed137 100644 --- a/apps/web/src/assets/i18n/fr.json +++ b/apps/web/src/assets/i18n/fr.json @@ -2,6 +2,7 @@ "CANCEL": "Annuler", "CLEAR": "Effacer", "CLOSE": "Fermer", + "BACK": "Retour", "SHOW_MORE": "Plus", "SHOW_LESS": "Moins", "PLAYLISTS": "Listes de lecture", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "Copier l'URL du flux", "NOW_PLAYING": "En cours de lecture", "CLOSE_PLAYER": "Fermer le lecteur", - "BACK_TO_BROWSE": "Retour aux détails", "ABOUT": "À propos", "SEASONS_AND_EPISODES": "Saisons et épisodes", "SEASON_TAB": "Saison {{number}}", diff --git a/apps/web/src/assets/i18n/it.json b/apps/web/src/assets/i18n/it.json index 30e78d8e5..ae4fcf81d 100644 --- a/apps/web/src/assets/i18n/it.json +++ b/apps/web/src/assets/i18n/it.json @@ -2,6 +2,7 @@ "CANCEL": "Annulla", "CLEAR": "Cancella", "CLOSE": "Chiudi", + "BACK": "Indietro", "SHOW_MORE": "Altro", "SHOW_LESS": "Meno", "PLAYLISTS": "Playlist", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "Copia URL streaming", "NOW_PLAYING": "In riproduzione", "CLOSE_PLAYER": "Chiudi lettore", - "BACK_TO_BROWSE": "Torna ai dettagli", "ABOUT": "Info", "SEASONS_AND_EPISODES": "Stagioni ed episodi", "SEASON_TAB": "Stagione {{number}}", diff --git a/apps/web/src/assets/i18n/ja.json b/apps/web/src/assets/i18n/ja.json index 190b21834..1b4143563 100644 --- a/apps/web/src/assets/i18n/ja.json +++ b/apps/web/src/assets/i18n/ja.json @@ -2,6 +2,7 @@ "CANCEL": "キャンセル", "CLEAR": "クリア", "CLOSE": "閉じる", + "BACK": "戻る", "SHOW_MORE": "もっと見る", "SHOW_LESS": "折りたたむ", "PLAYLISTS": "プレイリスト", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "ストリームURLをコピー", "NOW_PLAYING": "再生中", "CLOSE_PLAYER": "プレーヤーを閉じる", - "BACK_TO_BROWSE": "詳細に戻る", "ABOUT": "概要", "SEASONS_AND_EPISODES": "シーズンとエピソード", "SEASON_TAB": "シーズン{{number}}", diff --git a/apps/web/src/assets/i18n/ko.json b/apps/web/src/assets/i18n/ko.json index b791eae01..bb8a15cc4 100644 --- a/apps/web/src/assets/i18n/ko.json +++ b/apps/web/src/assets/i18n/ko.json @@ -2,6 +2,7 @@ "CANCEL": "취소", "CLEAR": "지우기", "CLOSE": "닫기", + "BACK": "뒤로", "SHOW_MORE": "더 보기", "SHOW_LESS": "간략히 보기", "PLAYLISTS": "재생목록", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "스트림 URL 복사", "NOW_PLAYING": "지금 재생 중", "CLOSE_PLAYER": "플레이어 닫기", - "BACK_TO_BROWSE": "세부 정보로 돌아가기", "ABOUT": "정보", "SEASONS_AND_EPISODES": "시즌 및 에피소드", "SEASON_TAB": "시즌 {{number}}", diff --git a/apps/web/src/assets/i18n/nl.json b/apps/web/src/assets/i18n/nl.json index 53e624690..6feeaa613 100644 --- a/apps/web/src/assets/i18n/nl.json +++ b/apps/web/src/assets/i18n/nl.json @@ -2,6 +2,7 @@ "CANCEL": "Annuleren", "CLEAR": "Wissen", "CLOSE": "Afsluiten", + "BACK": "Terug", "SHOW_MORE": "Meer", "SHOW_LESS": "Minder", "PLAYLISTS": "Afspeellijst", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "Kopieër Stream URL", "NOW_PLAYING": "Nu bezig", "CLOSE_PLAYER": "Speler sluiten", - "BACK_TO_BROWSE": "Terug naar details", "ABOUT": "Over", "SEASONS_AND_EPISODES": "Seizoenen en afleveringen", "SEASON_TAB": "Seizoen {{number}}", diff --git a/apps/web/src/assets/i18n/pl.json b/apps/web/src/assets/i18n/pl.json index 4e99f98fa..cb9af4de2 100644 --- a/apps/web/src/assets/i18n/pl.json +++ b/apps/web/src/assets/i18n/pl.json @@ -2,6 +2,7 @@ "CANCEL": "Anuluj", "CLEAR": "Wyczyść", "CLOSE": "Zamknij", + "BACK": "Wstecz", "SHOW_MORE": "Więcej", "SHOW_LESS": "Mniej", "PLAYLISTS": "Listy odtwarzania", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "Kopiuj URL strumienia", "NOW_PLAYING": "Teraz odtwarzane", "CLOSE_PLAYER": "Zamknij odtwarzacz", - "BACK_TO_BROWSE": "Wróć do szczegółów", "ABOUT": "Informacje", "SEASONS_AND_EPISODES": "Sezony i odcinki", "SEASON_TAB": "Sezon {{number}}", diff --git a/apps/web/src/assets/i18n/pt.json b/apps/web/src/assets/i18n/pt.json index 7b6c33047..ceddf223d 100644 --- a/apps/web/src/assets/i18n/pt.json +++ b/apps/web/src/assets/i18n/pt.json @@ -2,6 +2,7 @@ "CANCEL": "Cancelar", "CLEAR": "Limpar", "CLOSE": "Fechar", + "BACK": "Voltar", "SHOW_MORE": "Mais", "SHOW_LESS": "Menos", "PLAYLISTS": "Playlists", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "Copiar URL do Stream", "NOW_PLAYING": "Reproduzindo agora", "CLOSE_PLAYER": "Fechar reprodutor", - "BACK_TO_BROWSE": "Voltar aos detalhes", "ABOUT": "Sobre", "SEASONS_AND_EPISODES": "Temporadas e episódios", "SEASON_TAB": "Temporada {{number}}", diff --git a/apps/web/src/assets/i18n/ru.json b/apps/web/src/assets/i18n/ru.json index 5471b144f..548ce29b2 100644 --- a/apps/web/src/assets/i18n/ru.json +++ b/apps/web/src/assets/i18n/ru.json @@ -2,6 +2,7 @@ "CANCEL": "Отмена", "CLEAR": "Очистить", "CLOSE": "Закрыть", + "BACK": "Назад", "SHOW_MORE": "Больше", "SHOW_LESS": "Меньше", "PLAYLISTS": "Плейлисты", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "Копировать URL-адрес потока", "NOW_PLAYING": "Сейчас воспроизводится", "CLOSE_PLAYER": "Закрыть плеер", - "BACK_TO_BROWSE": "Назад к сведениям", "ABOUT": "Об этом", "SEASONS_AND_EPISODES": "Сезоны и эпизоды", "SEASON_TAB": "Сезон {{number}}", diff --git a/apps/web/src/assets/i18n/tr.json b/apps/web/src/assets/i18n/tr.json index 871cbc06f..36bbb0ed9 100644 --- a/apps/web/src/assets/i18n/tr.json +++ b/apps/web/src/assets/i18n/tr.json @@ -2,6 +2,7 @@ "CANCEL": "İptal", "CLEAR": "Temizle", "CLOSE": "Kapat", + "BACK": "Geri", "SHOW_MORE": "Daha fazla", "SHOW_LESS": "Daha az", "PLAYLISTS": "Oynatma Listeleri", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "Yayın URL'sini kopyala", "NOW_PLAYING": "Şimdi oynatılıyor", "CLOSE_PLAYER": "Oynatıcıyı kapat", - "BACK_TO_BROWSE": "Ayrıntılara dön", "ABOUT": "Hakkında", "SEASONS_AND_EPISODES": "Sezonlar ve Bölümler", "SEASON_TAB": "{{number}}. Sezon", diff --git a/apps/web/src/assets/i18n/zh.json b/apps/web/src/assets/i18n/zh.json index bfc62c44c..777ae5d33 100644 --- a/apps/web/src/assets/i18n/zh.json +++ b/apps/web/src/assets/i18n/zh.json @@ -2,6 +2,7 @@ "CANCEL": "取消", "CLEAR": "清除", "CLOSE": "关闭", + "BACK": "返回", "SHOW_MORE": "更多", "SHOW_LESS": "收起", "PLAYLISTS": "播放列表", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "复制流 URL", "NOW_PLAYING": "正在播放", "CLOSE_PLAYER": "关闭播放器", - "BACK_TO_BROWSE": "返回详情页", "ABOUT": "简介", "SEASONS_AND_EPISODES": "季与集", "SEASON_TAB": "第 {{number}} 季", diff --git a/apps/web/src/assets/i18n/zhtw.json b/apps/web/src/assets/i18n/zhtw.json index 6ff40a3ec..495789324 100644 --- a/apps/web/src/assets/i18n/zhtw.json +++ b/apps/web/src/assets/i18n/zhtw.json @@ -2,6 +2,7 @@ "CANCEL": "取消", "CLEAR": "清除", "CLOSE": "關閉", + "BACK": "返回", "SHOW_MORE": "更多", "SHOW_LESS": "收起", "PLAYLISTS": "播放清單", @@ -920,7 +921,6 @@ "COPY_STREAM_URL": "複製串流網址", "NOW_PLAYING": "現正播放", "CLOSE_PLAYER": "關閉播放器", - "BACK_TO_BROWSE": "返回詳細資訊", "ABOUT": "簡介", "SEASONS_AND_EPISODES": "季數與集數", "SEASON_TAB": "第 {{number}} 季", diff --git a/docs/architecture/embedded-inline-playback.md b/docs/architecture/embedded-inline-playback.md index 394dc7eff..69f7c642d 100644 --- a/docs/architecture/embedded-inline-playback.md +++ b/docs/architecture/embedded-inline-playback.md @@ -112,9 +112,12 @@ Contracts: - Escape closes inline playback: the shell emits `closePlayerRequested` when playback is active, the event was not `defaultPrevented`, and no element is in browser fullscreen; hosts wire it to `closeInlinePlayer()`. -- The inline player's now-playing bar has a back button that emits the - existing `closed` output — in watch state, back returns to browse, it - does not navigate the route. +- The now-playing bar separates two exits: the back arrow emits + `backClicked`, which hosts wire to their route-level `goBack()` (straight + back to the list — everything browse offers is also visible in watch, so + a two-step unwind would be ceremony); the "Close player" button and + Escape emit `closed`/`closePlayerRequested` and return to browse without + navigating. - Entering watch scrolls the shell to the top; leaving keeps the scroll position. diff --git a/libs/portal/stalker/feature/src/lib/stalker-series-view/stalker-series-view.component.html b/libs/portal/stalker/feature/src/lib/stalker-series-view/stalker-series-view.component.html index 0499a4959..b2f1c99d7 100644 --- a/libs/portal/stalker/feature/src/lib/stalker-series-view/stalker-series-view.component.html +++ b/libs/portal/stalker/feature/src/lib/stalker-series-view/stalker-series-view.component.html @@ -125,6 +125,7 @@ [seriesNavigation]="inlineSeriesNavigation()" (timeUpdate)="handleInlineTimeUpdate($event)" (closed)="closeInlinePlayer()" + (backClicked)="goBack()" (streamUrlCopied)="showCopyNotification()" (playbackEnded)="handleInlinePlaybackEnded()" (previousEpisodeRequested)="playPreviousEpisode()" diff --git a/libs/portal/xtream/feature/src/lib/serial-details/serial-details.component.html b/libs/portal/xtream/feature/src/lib/serial-details/serial-details.component.html index 4f43085af..d7bfb3592 100644 --- a/libs/portal/xtream/feature/src/lib/serial-details/serial-details.component.html +++ b/libs/portal/xtream/feature/src/lib/serial-details/serial-details.component.html @@ -134,6 +134,7 @@ [seriesNavigation]="inlineSeriesNavigation()" (timeUpdate)="handleInlineTimeUpdate($event)" (closed)="closeInlinePlayer()" + (backClicked)="goBack()" (streamUrlCopied)="showCopyNotification()" (playbackEnded)="handleInlinePlaybackEnded()" (previousEpisodeRequested)="playPreviousEpisode()" diff --git a/libs/portal/xtream/feature/src/lib/vod-details/vod-details-route.component.html b/libs/portal/xtream/feature/src/lib/vod-details/vod-details-route.component.html index a54ff46be..c95b2a366 100644 --- a/libs/portal/xtream/feature/src/lib/vod-details/vod-details-route.component.html +++ b/libs/portal/xtream/feature/src/lib/vod-details/vod-details-route.component.html @@ -205,6 +205,7 @@ [playback]="playback" (timeUpdate)="handleInlineTimeUpdate($event)" (closed)="closeInlinePlayer()" + (backClicked)="goBack()" (streamUrlCopied)="showCopyNotification()" (externalFallbackRequested)=" handleExternalFallbackRequest($event) diff --git a/libs/ui/playback/src/lib/portal-inline-player/portal-inline-player.component.html b/libs/ui/playback/src/lib/portal-inline-player/portal-inline-player.component.html index c35f35191..8b9c597ed 100644 --- a/libs/ui/playback/src/lib/portal-inline-player/portal-inline-player.component.html +++ b/libs/ui/playback/src/lib/portal-inline-player/portal-inline-player.component.html @@ -7,9 +7,9 @@ type="button" class="player-shell__back" data-testid="inline-player-back" - [attr.aria-label]="'PORTALS.BACK_TO_BROWSE' | translate" - [matTooltip]="'PORTALS.BACK_TO_BROWSE' | translate" - (click)="onClose()" + [attr.aria-label]="'BACK' | translate" + [matTooltip]="'BACK' | translate" + (click)="onBack()" > arrow_back diff --git a/libs/ui/playback/src/lib/portal-inline-player/portal-inline-player.component.spec.ts b/libs/ui/playback/src/lib/portal-inline-player/portal-inline-player.component.spec.ts index 1f332f05a..cd930d81e 100644 --- a/libs/ui/playback/src/lib/portal-inline-player/portal-inline-player.component.spec.ts +++ b/libs/ui/playback/src/lib/portal-inline-player/portal-inline-player.component.spec.ts @@ -122,12 +122,18 @@ describe('PortalInlinePlayerComponent', () => { expect(events).toEqual(['ended', 'previous', 'next']); }); - it('emits closed from the back button in the now-playing bar', () => { + it('emits backClicked (not closed) from the back button in the now-playing bar', () => { + let backCount = 0; let closedCount = 0; fixture.componentRef.setInput('playback', { streamUrl: 'https://example.test/vod/1.mp4', title: 'Movie', }); + ( + component as unknown as { + backClicked: { subscribe: (fn: () => void) => void }; + } + ).backClicked.subscribe(() => backCount++); ( component as unknown as { closed: { subscribe: (fn: () => void) => void }; @@ -141,6 +147,7 @@ describe('PortalInlinePlayerComponent', () => { ) as HTMLButtonElement; expect(backButton).toBeTruthy(); backButton.click(); - expect(closedCount).toBe(1); + expect(backCount).toBe(1); + expect(closedCount).toBe(0); }); }); diff --git a/libs/ui/playback/src/lib/portal-inline-player/portal-inline-player.component.ts b/libs/ui/playback/src/lib/portal-inline-player/portal-inline-player.component.ts index 3721ff1f0..bc4291a3e 100644 --- a/libs/ui/playback/src/lib/portal-inline-player/portal-inline-player.component.ts +++ b/libs/ui/playback/src/lib/portal-inline-player/portal-inline-player.component.ts @@ -62,6 +62,8 @@ export class PortalInlinePlayerComponent { }); readonly closed = output(); + /** Back arrow in the now-playing bar: route-level back, not just close. */ + readonly backClicked = output(); readonly timeUpdate = output<{ currentTime: number; duration: number; @@ -76,6 +78,10 @@ export class PortalInlinePlayerComponent { this.closed.emit(); } + onBack(): void { + this.backClicked.emit(); + } + onTimeUpdate(event: { currentTime: number; duration: number }): void { this.timeUpdate.emit(event); } diff --git a/libs/ui/playback/src/lib/vod-details/vod-details.component.html b/libs/ui/playback/src/lib/vod-details/vod-details.component.html index 2ca437221..913645971 100644 --- a/libs/ui/playback/src/lib/vod-details/vod-details.component.html +++ b/libs/ui/playback/src/lib/vod-details/vod-details.component.html @@ -181,6 +181,7 @@ [playback]="playback" (timeUpdate)="onInlineTimeUpdate($event)" (closed)="closeInlinePlayback()" + (backClicked)="goBack()" (streamUrlCopied)="onStreamUrlCopied()" (externalFallbackRequested)=" onInlineExternalFallbackRequested($event)