diff --git a/server/public/home.html b/server/public/home.html
index 10e342c..8faca6e 100644
--- a/server/public/home.html
+++ b/server/public/home.html
@@ -5391,14 +5391,24 @@ function bzNativeSyncTiles(){
if(!meetNative) return;
const NC=nativeCallPlugin(); if(!NC||!NC.syncVideoTiles) return;
const tiles=[];
+ // Native views draw ON TOP of the WebView, so a full-height tile would cover the control bar. Never let a
+ // tile's native video extend past the top of the meeting controls (or, in normal grid mode, below the grid).
+ const bar=document.querySelector('#meetGrid ~ .meet-bar') || document.querySelector('.meet-bar');
+ const gridEl=document.getElementById('meetGrid');
+ let maxBottom=Infinity;
+ if(bar){ const br=bar.getBoundingClientRect(); if(br.height>0) maxBottom=br.top; }
+ else if(gridEl){ const gr=gridEl.getBoundingClientRect(); if(gr.height>0) maxBottom=gr.bottom; }
document.querySelectorAll('#meetGrid .meet-tile').forEach(el=>{
const id=el.id ? el.id.replace('meet-tile-','') : ''; if(!id || id==='__waiting') return;
const r=el.getBoundingClientRect(); if(r.width<2||r.height<2) return;
+ let h=r.height;
+ if(r.top < maxBottom && (r.top + h) > maxBottom) h = maxBottom - r.top; // clamp so it never covers the controls
+ if(h<2) return;
let uid, local=false, name='', muted=false, screen=false;
if(id==='__local'){ uid=(ME&&ME.id)||''; local=true; name=(ME&&ME.name)||'You'; muted=!meetMic; }
else { uid=meetPeerUids.get(id)||''; name=meetNames.get(id)||'Guest'; muted=!!meetMuted.get(id); screen=meetSharers.has(id); } // sharer's tile → render their screen, not camera
if(!uid) return;
- tiles.push({ uid, local, name, muted, screen, x:r.left, y:r.top, w:r.width, h:r.height });
+ tiles.push({ uid, local, name, muted, screen, x:r.left, y:r.top, w:r.width, h });
});
try{ NC.syncVideoTiles({ tiles }); }catch(_){}
}