feat(lecteur): menu FAB partage /watch et /shorts
CI / build-and-test (push) Successful in 14m48s

- PlayerMenuComponent : FAB circulaire translucide (haut-gauche) + panneau
  deroulant, commun aux deux pages (position, style, open/close, clic exterieur)
- /shorts : consolidation de tous les boutons (fournisseurs, langue, actions)
  dans le menu FAB ; suppression du rail a droite et de la rangee du haut
- /watch : actions (cinema, qualite, j'aime, playlist, transcription,
  telechargement, partage, ouvrir) deplacees dans le menu FAB
- AddToPlaylistComponent : variante menuItem pour s'integrer au menu
- styles .pm-item/.pm-sep/.pm-section-label dans index.css
This commit is contained in:
2026-09-30 22:50:46 -04:00
parent 2bcc7321aa
commit 01e0671de9
7 changed files with 301 additions and 240 deletions
+14 -4
View File
@@ -16,6 +16,7 @@ import { Video } from '../../models/video.model';
import { shortsFeedAccepts, isPlayable as isPlayablePolicy, type PlayableContext } from '../../app/shared/utils/section-policy';
import { SHORT_TO_LONG, type ProviderId } from '../../app/shared/providers/provider-ids';
import { dailymotionEmbedBase } from '../../app/shared/providers/dailymotion-player';
import { PlayerMenuComponent } from '../../app/shared/components/player-menu/player-menu.component';
import { SearchService } from '../../app/search/search.service';
import { ChannelProviderFactory } from '../../app/core/providers/channel/channel-provider.factory';
import {
@@ -87,7 +88,7 @@ const SHORTS_QUERIES: Record<string, string[]> = {
selector: 'app-watch-short',
standalone: true,
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [CommonModule, RouterLink],
imports: [CommonModule, RouterLink, PlayerMenuComponent],
templateUrl: './watch-short.component.html'
})
export class WatchShortComponent implements OnDestroy {
@@ -274,6 +275,18 @@ export class WatchShortComponent implements OnDestroy {
return this.langFilter() === 'profile' ? `Filtre actif : ${base} (profil)` : `Filtre actif : ${base}`;
} catch { return 'Filtre de langues'; }
});
/** Libellé court du mode de langue pour le menu FAB (« Français »…). */
readonly langFilterShort = computed(() => {
switch (this.langFilter()) {
case 'profile': return 'Profil';
case 'fr': return 'Français';
case 'en': return 'Anglais';
case 'fren': return 'FR + EN';
case 'all': return 'Toutes';
default: return this.langFilter();
}
});
readonly current = computed<Video | null>(() => {
const list = this.items();
const i = this.index();
@@ -955,9 +968,6 @@ export class WatchShortComponent implements OnDestroy {
try { this.isFullscreen.set(!!document.fullscreenElement); } catch {}
};
toggleMenu(): void {
this.menuOpen.update(o => !o);
}
closeMenu(): void {
this.menuOpen.set(false);
}