app
Fusion - the Fusion 360 Bridge
Public Made by Adomby adom
Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.
← Commit history
dashboard 1.9.63: pretty scrollbar, modal mechanics
7 files changed
+68−18
CHANGELOG.md+15@@ -3,6 +3,21 @@ All notable changes to the Adom Bridge Fusion 360 bridge, newest first. Canonical: https://wiki.adom.inc/adom/fusion-bridge ยท GitHub backup: `adom-inc/fusion-bridge` +## 1.9.63 - 2026-08-18 (dashboard only; bridge zip stays 1.9.62)++- **The house scrollbar, everywhere** (John: "that scrollbar is hideous"). Thin, transparent+ track, translucent pill that only turns teal on hover - applied globally, not just in the+ modal. The Settings dialog no longer scrolls ITSELF: the radius element is overflow:hidden and+ an inner body scrolls with an 8px track inset, so the bar can never slice through the rounded+ corners. New adom-ui-design `scrollbars` sub-skill carries the full recipe (the existing one+ was buried in shotlog's dev skill, unavailable to other apps).+- **Settings modal mechanics completed** (John: click-outside was missing, X unknown, dim+ unverified): X button in the header, click-outside closes via a backdrop hit-test (a naive+ handler also fires on the dialog's own padding), Escape still native, backdrop dim verified at+ rgba(0,0,0,.55). All four drive-tested live. The four behaviors are now mandatory in the+ settings-layout skill, along with the Settings-never-Preferences naming rule (our own copy had+ one "preferences" left, now fixed).+ ## 1.9.62 - 2026-08-18 - **AUTO-GREEN: opening the Dashboard now MAKES everything ready (John's ruling).** "The meaning
bin/fusion-dashboard⋯ 1 unchanged line ⋯
dashboard/Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "fusion-dashboard"-version = "1.9.62"+version = "1.9.63" edition = "2021" [dependencies]
dashboard/ui/index.html+39−7@@ -12,6 +12,14 @@ --accent:#00b8b1;--accent-hover:#00d4cb;--green:#3fb950;--red:#f85149;--yellow:#d29922;--blue:#64abff; } *{box-sizing:border-box;margin:0;padding:0}+/* The house scrollbar (adom-ui-design > scrollbars): thin, transparent track, translucent+ pill that only asserts itself on hover. Never the OS default. */+*{scrollbar-width:thin;scrollbar-color:rgba(139,148,158,.38) transparent}+::-webkit-scrollbar{width:10px;height:10px}+::-webkit-scrollbar-track{background:transparent}+::-webkit-scrollbar-thumb{background:rgba(139,148,158,.32);border-radius:999px;border:2px solid transparent;background-clip:padding-box}+::-webkit-scrollbar-thumb:hover{background:rgba(0,184,177,.55);background-clip:padding-box}+::-webkit-scrollbar-corner{background:transparent} @font-face{font-family:'Familjen Grotesk';src:url('https://adom.inc/fonts/FamiljenGrotesk-SemiBold.woff2') format('woff2');font-weight:600} @font-face{font-family:'Satoshi';src:url('https://adom.inc/fonts/Satoshi-Regular.woff2') format('woff2');font-weight:400} @font-face{font-family:'Satoshi';src:url('https://adom.inc/fonts/Satoshi-Medium.woff2') format('woff2');font-weight:500}@@ -91,7 +99,15 @@ dialog::backdrop{background:rgba(0,0,0,.55)} .sstate.ok{color:var(--green)}.sstate.err{color:var(--red)} .sshot{margin-top:8px;width:100%;border-radius:8px;border:1px solid var(--border);display:none;cursor:zoom-in} .sshot.show{display:block}-dialog.settings{max-width:560px;max-height:70vh;overflow:auto;padding:18px}+dialog.settings{max-width:560px;overflow:hidden;padding:0}+.dlghead{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px 18px 10px}+.dlghead h2{margin:0;font-size:17px}+.dlgbody{max-height:70vh;overflow:auto;padding:0 18px 18px}+.dlgbody::-webkit-scrollbar-track{margin:8px 0}+.xbtn{width:30px;height:30px;display:flex;align-items:center;justify-content:center;background:none;border:1px solid transparent;border-radius:8px;color:var(--text-2);cursor:pointer;font-size:18px;line-height:1;transition:background .15s ease,border-color .15s ease,color .15s ease,transform .06s ease}+.xbtn:hover{background:var(--elevated);border-color:var(--border);color:var(--text)}+.xbtn:active{transform:scale(.9);background:var(--surface)}+.xbtn:focus-visible{outline:2px solid var(--accent);outline-offset:2px} .settings-card{background:var(--elevated);border:1px solid var(--border);border-left:3px solid color-mix(in srgb, var(--accent) 45%, transparent);border-radius:10px;padding:.9rem 1.1rem 1rem;margin-bottom:1rem} .card-title{font-size:13px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:10px;font-family:'Familjen Grotesk',sans-serif} .card-status{font-size:11px;color:var(--text-2);font-weight:400}@@ -158,8 +174,12 @@ dialog.settings{max-width:560px;max-height:70vh;overflow:auto;padding:18px} <div id="prompts"></div> </main> -<dialog id="dlgSettings" class="settings" tabindex="-1">- <h2 style="margin:0 0 14px">Fusion Dashboard Settings</h2>+<dialog id="dlgSettings" class="settings" tabindex="-1" aria-label="Fusion Dashboard Settings">+ <div class="dlghead">+ <h2>Fusion Dashboard Settings</h2>+ <button class="xbtn" id="btnXSettings" aria-label="Close settings" data-tip="Close settings (Escape, or click outside)">✕</button>+ </div>+ <div class="dlgbody" id="settingsBody"> <div class="settings-card"> <div class="card-title">Opening the Dashboard <span class="card-status" id="stAutoGreen">reading...</span></div>@@ -196,8 +216,9 @@ dialog.settings{max-width:560px;max-height:70vh;overflow:auto;padding:18px} <input id="inpPart" style="flex:0 1 260px;background:var(--surface);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:7px 10px;font:12.5px 'JetBrains Mono',monospace"></div> </div> - <div class="setfoot">Settings are stored on this machine: the Dashboard's own choices in <code>~/.adom/fusion-dashboard/settings.json</code>, the Fusion upkeep and badge choices as sticky bridge preferences on the target box.</div>- <div class="btnrow" style="justify-content:flex-end"><button class="btn" id="btnCloseSettings">Close</button></div>+ </div><!-- /dlgbody -->+ <div class="setfoot" style="padding:0 18px 14px">Settings are stored on this machine: the Dashboard's own choices in <code>~/.adom/fusion-dashboard/settings.json</code>, the Fusion upkeep and badge choices as sticky bridge settings on the target box.</div>+ <div class="btnrow" style="justify-content:flex-end;padding:0 18px 16px;margin-top:0"><button class="btn" id="btnCloseSettings">Close</button></div> </dialog> <dialog id="dlgSetup">@@ -305,10 +326,21 @@ $('#btnSettings').onclick=async()=>{ // showModal() autofocuses the first focusable child; ours is the wiki-part INPUT in the last // card, so the modal opened scrolled to the bottom. Focus the dialog itself and pin to top. dlg.focus();- dlg.scrollTop=0;- requestAnimationFrame(()=>{dlg.scrollTop=0;});+ const body=$('#settingsBody');body.scrollTop=0;+ requestAnimationFrame(()=>{body.scrollTop=0;}); }; $('#btnCloseSettings').onclick=()=>$('#dlgSettings').close();+$('#btnXSettings').onclick=()=>$('#dlgSettings').close();+// Click-OUTSIDE closes. A <dialog>'s backdrop is part of the dialog element, so a click that+// lands on the dialog itself (not on its children) is a backdrop click - but only trust it when+// the pointer is actually outside the dialog's box, or a click on the dialog's own padding+// would close it too (John, 2026-08-18: "click outside the settings dialog and it expires").+$('#dlgSettings').addEventListener('click',e=>{+ const d=$('#dlgSettings');if(e.target!==d)return;+ const r=d.getBoundingClientRect();+ const inside=e.clientX>=r.left&&e.clientX<=r.right&&e.clientY>=r.top&&e.clientY<=r.bottom;+ if(!inside)d.close();+}); function wireToggle(sel,actionName,label){$(sel).onclick=async(e)=>{ const t=e.currentTarget;const now=!t.classList.contains('is-on'); t.classList.toggle('is-on',now);t.setAttribute('aria-checked',String(now));
install.sh+1−1@@ -21,7 +21,7 @@ echo "Installed fusion-bridge skills: $(ls "$PKG_DIR/skills" 2>/dev/null | tr '\ # binary (the three-artifact pattern: bridge zip -> ab, THIS pkg -> container skills + # this download, page media -> wiki). Per the wiki's PKG_VS_RELEASE policy, binaries are # platform-tagged RELEASE assets, never tarball content - the installer fetches them.-DASH_VERSION="1.9.62"+DASH_VERSION="1.9.63" DASH_URL="https://wiki.adom.inc/download/adom/fusion-bridge/${DASH_VERSION}/fusion-dashboard" DEST="" if [ -w /usr/local/bin ]; then DEST=/usr/local/bin
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "fusion-bridge",- "version": "1.9.62",+ "version": "1.9.63", "type": "app", "description": "This package installs the bridge's SKILLS into your container so your AI knows how to drive it; Adom Bridge loads the bridge runtime itself from the release zip.", "dependencies": {
page.json+11−8@@ -1,16 +1,20 @@ { "slug": "fusion-bridge",- "version": "1.9.62",+ "version": "1.9.63", "type": "app", "description": "This package installs the bridge's SKILLS into your container so your AI knows how to drive it; Adom Bridge loads the bridge runtime itself from the release zip.", "dependencies": {- "adom/adom-desktop": "*"+ "adom/adom-desktop": "^1.9.0" }, "scripts": { "install": "./install.sh", "uninstall": "./uninstall.sh" }, "tags": [+ "ab",+ "bridge",+ "fusion",+ "desktop-app", "fusion360", "autodesk", "cad",@@ -70,7 +74,10 @@ "build a basic parts library", "add a 3d model to a component", "make a fusion 360 library with 3d",- "set up the fusion bridge"+ "set up the fusion bridge",+ "fusion dashboard",+ "fusion status page",+ "open the fusion launch page" ], "discovery_pitch": "Use the Adom Bridge Fusion 360 bridge when the user wants to DRIVE Autodesk Fusion 360 from the cloud: open/search their team's Fusion cloud designs, lay out a PCB or do electronics, export STEP/IGES/STL/Gerbers/BOM, or build a component library with real rendering 3D. It runs Fusion on the user's own machine via Adom Bridge. NOT for web/browser/login/form-filling (that's the native-browser extension) and NOT for KiCad (that's the kicad bridge).", "brief": "Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.",@@ -99,9 +106,5 @@ "label": "Part volume", "prompt": "How much material does each printed part in this assembly use?" }- ],- "author": {- "name": "John Lauer",- "email": "[email protected]"- }+ ] }