← Commit history

dashboard 1.9.63: pretty scrollbar, modal mechanics

John Lauer ·c6546afe7f ·1mo ago ·parent 4cd267f
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)">&#10005;</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]"-  }+  ] }\ No newline at end of file