diff --git a/server/player/index.html b/server/player/index.html
index afc3652..6da4291 100644
--- a/server/player/index.html
+++ b/server/player/index.html
@@ -34,11 +34,17 @@
/* Player */
#playerContainer { position: fixed; inset: 0; background: #000; }
- /* Fullscreen single-zone playback: YouTube's IFrame API replaces our placeholder
- with an iframe whose width/height attributes don't always survive layout. Pin
- any direct iframe child to the container so YT/widget embeds fill the screen. */
+ /* Fullscreen single-zone playback: YouTube's IFrame API measures the placeholder
+ at construction time. If that happens before layout settles, YT bakes in a
+ 300x150 fallback as inline pixel dimensions on the iframe, which our %-based
+ rules can't override. Force fullscreen via absolute positioning + !important. */
#playerContainer > iframe,
- #playerContainer > div > iframe { width: 100%; height: 100%; border: none; display: block; }
+ #playerContainer > div > iframe {
+ position: absolute !important;
+ top: 0 !important; left: 0 !important;
+ width: 100% !important; height: 100% !important;
+ border: none !important; display: block !important;
+ }
.zone { position: absolute; overflow: hidden; }
.zone video { width: 100%; height: 100%; object-fit: cover; }
.zone img { width: 100%; height: 100%; object-fit: cover; }
diff --git a/server/player/sw.js b/server/player/sw.js
index 4413a0a..ef51f89 100644
--- a/server/player/sw.js
+++ b/server/player/sw.js
@@ -1,4 +1,4 @@
-const CACHE_NAME = 'rd-player-v5';
+const CACHE_NAME = 'rd-player-v6';
// Install: skip waiting to activate immediately
self.addEventListener('install', (event) => {