diff --git a/src/components/watch/watch.component.ts b/src/components/watch/watch.component.ts
index f1641db..805e528 100644
--- a/src/components/watch/watch.component.ts
+++ b/src/components/watch/watch.component.ts
@@ -163,6 +163,8 @@ export class WatchComponent implements OnDestroy, AfterViewInit {
video = signal(null);
loading = signal(true);
showFullDescription = signal(false);
+ /** Mode cinéma : le lecteur prend toute la largeur de la page. */
+ cinemaMode = signal(false);
// Prefer full description if available; otherwise fallback to shortDescription
descriptionText = computed(() => {
const v = this.video();
@@ -491,6 +493,17 @@ export class WatchComponent implements OnDestroy, AfterViewInit {
const target = ev.target as HTMLElement | null;
if (target?.closest?.('input, textarea, select, [contenteditable="true"]')) return;
if (ev.ctrlKey || ev.metaKey || ev.altKey) return;
+ // Échap : quitter le mode cinéma.
+ if (ev.key === 'Escape' && this.cinemaMode()) {
+ this.toggleCinema(false);
+ return;
+ }
+ // Touche "t" (comme YouTube) : basculer le mode cinéma.
+ if (ev.key === 't' || ev.key === 'T') {
+ ev.preventDefault();
+ this.toggleCinema();
+ return;
+ }
if (ev.key !== 's' && ev.key !== 'S') return;
if (!this.canSubscribe() || !this.isLoggedIn() || this.subscribeBusy()) return;
ev.preventDefault();
@@ -498,6 +511,15 @@ export class WatchComponent implements OnDestroy, AfterViewInit {
} catch {}
}
+ /** Bascule le mode cinéma (vidéo pleine largeur). Persiste le choix. */
+ toggleCinema(force?: boolean): void {
+ const next = typeof force === 'boolean' ? force : !this.cinemaMode();
+ this.cinemaMode.set(next);
+ try {
+ localStorage.setItem('newtube:cinema', next ? '1' : '0');
+ } catch {}
+ }
+
onAvatarError(): void {
this.channelAvatarBroken.set(true);
}
@@ -553,6 +575,10 @@ export class WatchComponent implements OnDestroy, AfterViewInit {
}
constructor() {
+ // Restaure le mode cinéma choisi précédemment.
+ try {
+ this.cinemaMode.set(localStorage.getItem('newtube:cinema') === '1');
+ } catch {}
// Écoute globale des événements du player YouTube embarqué (suivi transcript).
try { window.addEventListener('message', this.handlePlayerMessage); } catch {}
// Charge le cache d'abonnements pour que isSubscribed() soit fiable sur /watch.