← Commit history

Dashboard 1.0.118: Watch the recording goes fullscreen from the click (Hydrogen grows the webview to 90 percent), Escape and fullscreenchange close it

John Lauer ·b69140021a ·1mo ago ·parent 37ccd01
2 files changed +17−8
dashboard/ui/index.html+16−7
@@ -329,6 +329,7 @@ main a:hover{border-bottom-color:var(--accent)} #vidBox .vb-bar button{background:#161b22;color:#e6edf3;border:1px solid #2a3341;border-radius:8px;padding:6px 10px;cursor:pointer;font-size:13px;} #vidBox .vb-bar button:hover{border-color:#2dd4bf;} #vidBox video{width:min(96vw,1400px);max-height:calc(100vh - 80px);background:#000;border-radius:10px;outline:none;}+#vidBox:fullscreen{padding:24px;} #vidBox:fullscreen video{width:min(96vw,1800px);max-height:calc(100vh - 90px);} </style> </head> <body>@@ -657,6 +658,10 @@ function mountVideo(){   demoBtn.insertAdjacentElement('afterend',b); } function openVideo(){+  // Hydrogen Desktop's WebView2 implements the standard Fullscreen API by growing+  // the webview to 90% of the HD window (the shotlog lightbox relies on it). The+  // request must run straight from the click (no await before it) or the gesture+  // is lost; the fixed overlay is the fallback when the host refuses.   let box=document.getElementById('vidBox');   if(!box){     box=document.createElement('div'); box.id='vidBox';@@ -666,14 +671,18 @@ function openVideo(){     document.body.appendChild(box);     box.querySelector('#vbClose').addEventListener('click',closeVideo);     box.addEventListener('click',e=>{ if(e.target===box) closeVideo(); });-    box.querySelector('#vbFull').addEventListener('click',async()=>{-      const v=box.querySelector('#vbVideo');-      try{ if(v.requestFullscreen) await v.requestFullscreen(); else if(v.webkitEnterFullscreen) v.webkitEnterFullscreen(); else throw new Error('no fullscreen api'); }-      catch(e){ toast('fullscreen is blocked by the host frame; the player already fills this pane','err'); }-    });-    document.addEventListener('keydown',e=>{ if(e.key==='Escape'&&box.style.display!=='none') closeVideo(); });+    box.querySelector('#vbFull').addEventListener('click',()=>{ goFull(box); });+    document.addEventListener('keydown',e=>{ if(e.key==='Escape'&&box.style.display!=='none'&&!document.fullscreenElement) closeVideo(); });+    document.addEventListener('fullscreenchange',()=>{ if(!document.fullscreenElement&&box.dataset.wasFull==='1'){ box.dataset.wasFull=''; closeVideo(); } });   }-  const v=box.querySelector('#vbVideo'); v.src=DEMO_VIDEO_URL; box.style.display='flex'; v.play().catch(()=>{});+  const v=box.querySelector('#vbVideo'); v.src=DEMO_VIDEO_URL; box.style.display='flex';+  goFull(box);+  v.play().catch(()=>{});+}+function goFull(box){+  try{+    if(box.requestFullscreen){ box.dataset.wasFull='1'; box.requestFullscreen().catch(()=>{ box.dataset.wasFull=''; }); }+  }catch(e){ box.dataset.wasFull=''; } } function closeVideo(){ const box=document.getElementById('vidBox'); if(!box)return; const v=box.querySelector('#vbVideo'); v.pause(); v.removeAttribute('src'); v.load(); box.style.display='none'; } // Guided demo with a REAL progress bar + the stepShot stream (one screenshot per finished beat).
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "kicad-bridge",-  "version": "1.0.117",+  "version": "1.0.118",   "type": "app",   "description": "Skills for your container so your AI knows how to drive the KiCad bridge. The bridge runtime itself is the release zip; Adom Bridge loads that.",   "tags": [