app
KiCad - the KiCad Bridge
Public Made by Adomby adom
Reference implementation of the KiCad bridge: multi-instance Python server, forward path via kicad-cli, reverse path via in-process plugin. Most complex of the three bundled bridges.
← 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
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": [