app
Base Scaffold Control Panel
Public Made by Adomby adom
The Base Scaffold System's control panel: electrical specifications and the connect/disconnect interface between a base scaffold and the workcell ecosystem.
← Commit history
viewers: one srcdoc iframe per board (viewer engine is a singleton per document)
1 file changed
+77−68
README.html+77−68@@ -4,8 +4,6 @@ <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Base Scaffold Control Panel</title>-<link rel="stylesheet" href="/static/vendor/adom-3d-viewer-babylon9/style.css">-<script type="module" src="/static/vendor/adom-3d-viewer-babylon9/adom-3d-viewer-babylon9.esm.js?v=20260717e"></script> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body {@@ -33,7 +31,7 @@ img { max-width: 100%; border-radius: 6px; display: block; margin: 0 0 16px; } border-radius: 8px; overflow: hidden; background: #0d1117; border: 1px solid #21262d; }-.viewer-slot .mount { position: absolute; inset: 0; }+.viewer-slot .vframe { position: absolute; inset: 0; width: 100%; height: 100%; border: none; } .viewer-slot .fallback { position: absolute; inset: 0; object-fit: contain; width: 100%; height: 100%; margin: 0; } .viewer-slot .vctl { position: absolute; left: 12px; bottom: 12px; z-index: 10; display: none; gap: 6px;@@ -67,27 +65,87 @@ img { max-width: 100%; border-radius: 6px; display: block; margin: 0 0 16px; } <h3>Workcell side</h3> -<div class="viewer-slot" data-glb="/api/pages/adom/base-scaffold-control-panel/files/models/workcell-q.glb"- data-img="/api/pages/adom/base-scaffold-control-panel/files/diagrams/viewer-workcell.png">- <img class="fallback" src="/api/pages/adom/base-scaffold-control-panel/files/diagrams/viewer-workcell.png" alt="Control panel — workcell side">- <div class="mount"></div>- <div class="vctl">- <button type="button" data-act="ground">Ground</button>- <button type="button" data-act="light">Bottom light</button>- </div>+<div class="viewer-slot">+ <iframe class="vframe" srcdoc="<!doctype html><html><head><meta charset="utf-8">+<link rel="stylesheet" href="https://wiki.adom.inc/static/vendor/adom-3d-viewer-babylon9/style.css">+<script type="module" src="https://wiki.adom.inc/static/vendor/adom-3d-viewer-babylon9/adom-3d-viewer-babylon9.esm.js?v=20260717e"></script>+<style>+* { margin:0; padding:0; box-sizing:border-box }+html,body { width:100%; height:100%; overflow:hidden; background:#0d1117 }+#wrap { position:absolute; inset:0 }+#fb { position:absolute; inset:0; width:100%; height:100%; object-fit:contain }+#ctl { position:absolute; left:12px; bottom:12px; z-index:10; display:none; gap:6px; font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif }+#ctl button { background:rgba(22,27,34,.85); border:1px solid rgba(240,246,252,.12); color:#8b949e; font-size:12px; line-height:1; padding:7px 11px; border-radius:14px; cursor:pointer }+#ctl button.on { color:#e6edf3; border-color:#2f81f7; background:rgba(31,111,235,.18) }+</style></head><body>+<img id="fb" src="https://wiki.adom.inc/api/pages/adom/base-scaffold-control-panel/files/diagrams/viewer-workcell.png" alt="board render">+<div id="wrap"></div>+<div id="ctl"><button id="g" type="button">Ground</button><button id="l" type="button">Bottom light</button></div>+<script type="module">+const V = window.Adom3DViewerBabylon9;+const wrap = document.getElementById('wrap');+if (typeof V === 'undefined') { wrap.remove(); }+else {+ try {+ const viewer = V.init(wrap, { zUp: true, showViewCube: true, showGround: true });+ viewer.loadModel('https://wiki.adom.inc/api/pages/adom/base-scaffold-control-panel/files/models/workcell-q.glb').then(() => {+ viewer.frameModel();+ try { if (viewer.toggleAxes) viewer.toggleAxes('world', false); } catch (e) {}+ document.getElementById('fb').remove();+ const ctl = document.getElementById('ctl');+ const g = document.getElementById('g'), l = document.getElementById('l');+ let groundOn = true;+ const paint = () => { g.classList.toggle('on', groundOn); l.classList.toggle('on', viewer.getBottomLightState()); };+ g.onclick = () => { groundOn = !groundOn; viewer.setGroundVisible(groundOn); paint(); };+ l.onclick = () => { viewer.setBottomLight(!viewer.getBottomLightState()); paint(); };+ paint(); ctl.style.display = 'flex';+ }).catch(() => wrap.remove());+ } catch (e) { wrap.remove(); }+}+</script></body></html>" loading="lazy" title="3D viewer"></iframe> </div> <p class="viewer-note">Drag to orbit · wheel to zoom · right-drag to pan · the cube snaps the view.</p> <h3>Scaffold side</h3> -<div class="viewer-slot" data-glb="/api/pages/adom/base-scaffold-control-panel/files/models/scaffold-q.glb"- data-img="/api/pages/adom/base-scaffold-control-panel/files/diagrams/viewer-scaffold.png">- <img class="fallback" src="/api/pages/adom/base-scaffold-control-panel/files/diagrams/viewer-scaffold.png" alt="Control panel — scaffold side">- <div class="mount"></div>- <div class="vctl">- <button type="button" data-act="ground">Ground</button>- <button type="button" data-act="light">Bottom light</button>- </div>+<div class="viewer-slot">+ <iframe class="vframe" srcdoc="<!doctype html><html><head><meta charset="utf-8">+<link rel="stylesheet" href="https://wiki.adom.inc/static/vendor/adom-3d-viewer-babylon9/style.css">+<script type="module" src="https://wiki.adom.inc/static/vendor/adom-3d-viewer-babylon9/adom-3d-viewer-babylon9.esm.js?v=20260717e"></script>+<style>+* { margin:0; padding:0; box-sizing:border-box }+html,body { width:100%; height:100%; overflow:hidden; background:#0d1117 }+#wrap { position:absolute; inset:0 }+#fb { position:absolute; inset:0; width:100%; height:100%; object-fit:contain }+#ctl { position:absolute; left:12px; bottom:12px; z-index:10; display:none; gap:6px; font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif }+#ctl button { background:rgba(22,27,34,.85); border:1px solid rgba(240,246,252,.12); color:#8b949e; font-size:12px; line-height:1; padding:7px 11px; border-radius:14px; cursor:pointer }+#ctl button.on { color:#e6edf3; border-color:#2f81f7; background:rgba(31,111,235,.18) }+</style></head><body>+<img id="fb" src="https://wiki.adom.inc/api/pages/adom/base-scaffold-control-panel/files/diagrams/viewer-scaffold.png" alt="board render">+<div id="wrap"></div>+<div id="ctl"><button id="g" type="button">Ground</button><button id="l" type="button">Bottom light</button></div>+<script type="module">+const V = window.Adom3DViewerBabylon9;+const wrap = document.getElementById('wrap');+if (typeof V === 'undefined') { wrap.remove(); }+else {+ try {+ const viewer = V.init(wrap, { zUp: true, showViewCube: true, showGround: true });+ viewer.loadModel('https://wiki.adom.inc/api/pages/adom/base-scaffold-control-panel/files/models/scaffold-q.glb').then(() => {+ viewer.frameModel();+ try { if (viewer.toggleAxes) viewer.toggleAxes('world', false); } catch (e) {}+ document.getElementById('fb').remove();+ const ctl = document.getElementById('ctl');+ const g = document.getElementById('g'), l = document.getElementById('l');+ let groundOn = true;+ const paint = () => { g.classList.toggle('on', groundOn); l.classList.toggle('on', viewer.getBottomLightState()); };+ g.onclick = () => { groundOn = !groundOn; viewer.setGroundVisible(groundOn); paint(); };+ l.onclick = () => { viewer.setBottomLight(!viewer.getBottomLightState()); paint(); };+ paint(); ctl.style.display = 'flex';+ }).catch(() => wrap.remove());+ } catch (e) { wrap.remove(); }+}+</script></body></html>" loading="lazy" title="3D viewer"></iframe> </div> <p class="viewer-note">Drag to orbit · wheel to zoom · right-drag to pan · the cube snaps the view.</p> @@ -194,54 +252,5 @@ img { max-width: 100%; border-radius: 6px; display: block; margin: 0 0 16px; } </div> -<script type="module">-// Mount Colby's Babylon viewer (the wiki's own 3D viewer bundle) on each slot.-// Load chain per slot: draco GLB -> quantized GLB (no wasm needed) -> static image.-const Viewer = window.Adom3DViewerBabylon9;-try {- if (window.BABYLON && window.BABYLON.DracoCompression) {- window.BABYLON.DracoCompression.Configuration = { decoder: {- wasmUrl: "/static/vendor/adom-3d-viewer-babylon9/draco/draco_wasm_wrapper_gltf.js",- wasmBinaryUrl: "/static/vendor/adom-3d-viewer-babylon9/draco/draco_decoder_gltf.wasm",- fallbackUrl: "/static/vendor/adom-3d-viewer-babylon9/draco/draco_decoder_gltf.js",- } };- }-} catch (e) {}--document.querySelectorAll('.viewer-slot').forEach((slot) => {- const mount = slot.querySelector('.mount');- const fallbackImg = slot.querySelector('.fallback');- const ctl = slot.querySelector('.vctl');- function showStatic() {- mount.remove();- if (ctl) ctl.remove();- }- if (typeof Viewer === 'undefined') { showStatic(); return; }- let viewer;- try {- viewer = Viewer.init(mount, { zUp: true, showViewCube: true, showGround: true });- } catch (e) { showStatic(); return; }- const tryLoad = (url) => viewer.loadModel(url).then(() => {- viewer.frameModel();- try { if (viewer.toggleAxes) viewer.toggleAxes('world', false); } catch (e) {}- fallbackImg.remove();- // Ground + bottom light toggles, matching the component-page viewer chrome.- try {- let groundOn = true;- const gBtn = ctl.querySelector('[data-act="ground"]');- const lBtn = ctl.querySelector('[data-act="light"]');- const paint = () => {- gBtn.classList.toggle('on', groundOn);- lBtn.classList.toggle('on', viewer.getBottomLightState());- };- gBtn.addEventListener('click', () => { groundOn = !groundOn; viewer.setGroundVisible(groundOn); paint(); });- lBtn.addEventListener('click', () => { viewer.setBottomLight(!viewer.getBottomLightState()); paint(); });- paint();- ctl.style.display = 'flex';- } catch (e) {}- });- tryLoad(slot.dataset.glb).catch(() => showStatic());-});-</script> </body> </html>