mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-16 14:16:16 -08:00
fix(embedded-mpv): stop native-view video jump by moving control menus into the dock (#1207)
* fix(embedded-mpv): stop native-view video jump by moving menus into the dock Opening any control popover in the native-view embedded MPV dock used to shrink the MPV view by a 300 px bottom cutout so the popover DOM stayed clickable, which made mpv re-letterbox the video on every menu open/close. All five menus now render horizontally inside the fixed-height controls strip, so menu state never changes the native view bounds: - volume expands as an inline horizontal slider next to the mute button - audio/subtitle/speed/aspect morph the dock row into a back button, a panel title, and a scrollable chip ribbon (app-embedded-mpv-dock-panel) with wheel-to-horizontal-scroll mapping, edge fades, active-chip reveal/focus, roving arrow-key navigation, ellipsis + tooltips, and RTL-aware scrolling - boundsProvider loses the menus.anyOpen() cutout branch and the MENU_OPEN_BOTTOM_CUTOUT_PX constant is removed; HIDDEN_BOUNDS for modal overlays is unchanged - global arrow shortcuts (seek/volume) are suspended while a chip panel is open so arrows walk the chips; Esc, click-outside, and close-on-select semantics are preserved - new EMBEDDED_MPV.PLAYER.BACK i18n key in all 18 languages Regression coverage: the new dock-panels spec asserts the bounds provider returns full host bounds while every menu is open (fails against the old cutout behavior), plus panel morph/a11y/selection specs and a dedicated dock-panel component spec (keyboard, wheel, tabindex, emits). Frame-copy shared controls (app-player-controls) are untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(embedded-mpv): address native-view dock review feedback Resolves the actionable P2 review comments on the dock rework: - Inline volume no longer clips the dock actions. At sidebar-constrained player widths (~480-660px, viewport wider than the 720px breakpoint) the new in-flow volume slider widened the non-shrinking actions column and, under overflow:hidden, clipped the fullscreen button. Add min-width:0 to .embedded-mpv-player__actions and __volume-group so the inline volume (a scroll container) compresses its own slider instead of pushing neighbors off-edge. Verified in Chromium: fullscreen stays visible down to 480px. - Space now selects a focused chip. onPanelKeydown stops Space/Enter from bubbling to the global shortcut handler (whose Space case preventDefault'd the button's native activation and toggled playback) without calling preventDefault itself, so the menuitemradio chip activates and emits chipSelected. Matches the WAI-ARIA menu activation-key expectation. - Simplify dock-panel opener tracking: always remember the toggled kind so focus restoration is correct if in-panel switching ever becomes reachable (currently unreachable — the toggle buttons are removed from the DOM while a panel is open); restoreOpenerFocus still no-ops unless focus fell to body. Not changed: the "closePanels no-ops when unavailable" comment — verified unreachable (chip selection closes via menus.close() directly, not through closePopovers; isAvailable() is engine-bound and the native dock only renders while it is true, with engine handoff calling menus.closeAll()). Regression test added for Space/Enter chip activation. The volume-overflow fix is CSS layout (no jsdom layout engine) and was validated in a real browser. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c707af1334
commit
aa1941cf2c
35 files changed
+1666
-622
No files matched your search
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "رجوع",
|
||||
"RETRY": "إعادة المحاولة",
|
||||
"STALLED": "يستغرق بدء هذا البث وقتًا أطول من المتوقع.",
|
||||
"PLAYBACK_FAILED": "فشل التشغيل عبر MPV المضمّن.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "رجوع",
|
||||
"RETRY": "حاول مرة أخرى",
|
||||
"STALLED": "هاد البث كياخد وقت كثر من المتوقع باش يبدا.",
|
||||
"PLAYBACK_FAILED": "فشل التشغيل بـ MPV المدمج.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "Назад",
|
||||
"RETRY": "Паўтарыць",
|
||||
"STALLED": "Гэты паток запускаецца даўжэй, чым чакалася.",
|
||||
"PLAYBACK_FAILED": "Не ўдалося прайграць праз убудаваны MPV.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "Zurück",
|
||||
"RETRY": "Erneut versuchen",
|
||||
"STALLED": "Der Start dieses Streams dauert länger als erwartet.",
|
||||
"PLAYBACK_FAILED": "Die Wiedergabe mit eingebettetem MPV ist fehlgeschlagen.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "Πίσω",
|
||||
"RETRY": "Επανάληψη",
|
||||
"STALLED": "Η έναρξη αυτής της ροής καθυστερεί περισσότερο από το αναμενόμενο.",
|
||||
"PLAYBACK_FAILED": "Η αναπαραγωγή με το ενσωματωμένο MPV απέτυχε.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "Back",
|
||||
"RETRY": "Retry",
|
||||
"STALLED": "This stream is taking longer than expected to start.",
|
||||
"PLAYBACK_FAILED": "Embedded MPV playback failed.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "Atrás",
|
||||
"RETRY": "Reintentar",
|
||||
"STALLED": "Este stream está tardando más de lo esperado en iniciarse.",
|
||||
"PLAYBACK_FAILED": "Falló la reproducción de MPV integrado.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "Retour",
|
||||
"RETRY": "Réessayer",
|
||||
"STALLED": "Ce flux met plus de temps que prévu à démarrer.",
|
||||
"PLAYBACK_FAILED": "Échec de la lecture avec MPV intégré.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "Indietro",
|
||||
"RETRY": "Riprova",
|
||||
"STALLED": "L'avvio di questo stream sta richiedendo più tempo del previsto.",
|
||||
"PLAYBACK_FAILED": "Riproduzione con MPV integrato non riuscita.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "戻る",
|
||||
"RETRY": "再試行",
|
||||
"STALLED": "このストリームの開始に予想より時間がかかっています。",
|
||||
"PLAYBACK_FAILED": "組み込みMPVでの再生に失敗しました。",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "뒤로",
|
||||
"RETRY": "다시 시도",
|
||||
"STALLED": "이 스트림의 시작이 예상보다 오래 걸리고 있습니다.",
|
||||
"PLAYBACK_FAILED": "내장 MPV 재생에 실패했습니다.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "Terug",
|
||||
"RETRY": "Opnieuw proberen",
|
||||
"STALLED": "Deze stream doet er langer over dan verwacht om te starten.",
|
||||
"PLAYBACK_FAILED": "Afspelen via Embedded MPV is mislukt.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "Wstecz",
|
||||
"RETRY": "Spróbuj ponownie",
|
||||
"STALLED": "Uruchamianie tego strumienia trwa dłużej niż zwykle.",
|
||||
"PLAYBACK_FAILED": "Odtwarzanie we wbudowanym MPV nie powiodło się.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "Voltar",
|
||||
"RETRY": "Tentar novamente",
|
||||
"STALLED": "Este stream está demorando mais do que o esperado para iniciar.",
|
||||
"PLAYBACK_FAILED": "Falha na reprodução do MPV integrado.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "Назад",
|
||||
"RETRY": "Повторить",
|
||||
"STALLED": "Запуск этого потока занимает больше времени, чем ожидалось.",
|
||||
"PLAYBACK_FAILED": "Не удалось воспроизвести через встроенный MPV.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "Geri",
|
||||
"RETRY": "Tekrar dene",
|
||||
"STALLED": "Bu yayının başlaması beklenenden uzun sürüyor.",
|
||||
"PLAYBACK_FAILED": "Gömülü MPV oynatması başarısız oldu.",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "返回",
|
||||
"RETRY": "重试",
|
||||
"STALLED": "该流的启动时间超出预期。",
|
||||
"PLAYBACK_FAILED": "嵌入式 MPV 播放失败。",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
},
|
||||
"EMBEDDED_MPV": {
|
||||
"PLAYER": {
|
||||
"BACK": "返回",
|
||||
"RETRY": "重試",
|
||||
"STALLED": "此串流的啟動時間比預期長。",
|
||||
"PLAYBACK_FAILED": "內嵌 MPV 播放失敗。",
|
||||
|
||||
Reference in new issue
Block a user