← Commit history

RESTORE inner copper L2/L15 (a greedy regex in the all-vector edit had deleted their loader); tooltips: real enter/leave semantics + 600ms (svg-child crossings were resetting the timer forever); layer checkbox tooltips

John Lauer ·7a005ac2d6 ·3mo ago ·parent 29a09c0
3 files changed +22−9
package.json+1−1
@@ -2,7 +2,7 @@   "slug": "bq25792-charger",   "title": "BQ25792 Charger",   "type": "component",-  "version": "0.1.83",+  "version": "0.1.84",   "description": "BQ25792 Charger - buck-boost 1S-4S battery charger board by Adonis, with real 3D copper traces and measured stackup.",   "tags": [     "hardware"
page.json+10−3
@@ -4,9 +4,16 @@   "slug": "bq25792-charger",   "title": "BQ25792 Charger",   "brief": "Buck-boost 1S-4S battery charger board (TI BQ25792) with 14 Adom machine pins, by Adonis",-  "version": "0.1.83",+  "version": "0.1.84",   "tags": [-    "hardware"+    "adom",+    "adom-modular",+    "component",+    "charger",+    "battery",+    "bq25792",+    "power",+    "usb-c"   ],   "license": "proprietary",   "component": {@@ -49,7 +56,7 @@     "email": "[email protected]"   },   "visibility": "public",-  "description": "BQ25792 Charger - buck-boost 1S-4S battery charger board by Adonis, with real 3D copper traces and measured stackup.",+  "description": "BQ25792 Charger - a buck-boost 1S-4S battery charger board (Texas Instruments BQ25792) designed by Adonis in Fusion 360, with 14 Adom machine pins for the modular stack. Interactive colored 3D model, schematic and layout views.",   "dependencies": {},   "files": [     "README.md",
readme.html+11−5
@@ -38,7 +38,7 @@     background:rgba(13,17,23,0.55); backdrop-filter:blur(8px); border:1px solid rgba(48,54,61,0.8);     border-radius:10px; padding:6px; }   .fbtn { padding:7px; border-radius:8px; border:1px solid transparent; background:transparent; color:#c9d1d9; cursor:pointer; display:inline-flex; align-items:center; justify-content:center; }-  .fbtn svg { width:16px; height:16px; flex:none; stroke:currentColor; fill:none; stroke-width:1.7; stroke-linecap:round; stroke-linejoin:round; }+  .fbtn svg { pointer-events:none; width:16px; height:16px; flex:none; stroke:currentColor; fill:none; stroke-width:1.7; stroke-linecap:round; stroke-linejoin:round; }   .fbtn:hover { background:rgba(48,54,61,0.7); }   .fbtn.active { background:#0b3d33; border-color:#00b8b1; color:#5ff5e8; }   #vstatus { position:absolute; right:14px; bottom:10px; z-index:30; font-size:12px; color:#8b949e;@@ -377,12 +377,13 @@ exported bodies + design rules.</p>     // ALL-VECTOR silk + mask (real geometry; textured quads cast no/solid shadows).     // Masks are gerber NEGATIVES (board outline minus pad openings); z baked in each GLB.     for(const v of [["silk-top-vec.glb.png","silk_top"],["mask-top-vec.glb.png","mask_top"],-                    ["mask-bot-vec.glb.png","mask_bot"],["silk-bot-vec.glb.png","silk_bot"]]){+                    ["mask-bot-vec.glb.png","mask_bot"],["silk-bot-vec.glb.png","silk_bot"],+                    ["cu-l2-vec.glb.png","cu_l2"],["cu-l15-vec.glb.png","cu_l15"]]){       const vb=await loadPngBytes(R+v[0]);       let vpre=sc.meshes.length;       await B().SceneLoader.AppendAsync("", new File([vb],v[1]+".glb",{type:"model/gltf-binary"}), sc, null, ".glb");       const vm=sc.meshes.slice(vpre).filter(m=>m.getTotalVertices&&m.getTotalVertices()>0);-      vm.forEach(m=>{ m.position.z=0; });+      vm.forEach(m=>{ m.position.z=0; if(v[1].indexOf("cu_")===0) m.material=copperMat; });       attach(v[1], vm);     } @@ -557,6 +558,7 @@ exported bodies + design rules.</p>       bx.setAttribute("data-tip","Bounding box: draw this layer's exact extents (X/Y/Z) to verify its position and height"); bx.textContent="\u25A1";       bx.addEventListener("click",function(e){ e.stopPropagation(); toggleBBox(L,bx); });       const cb=document.createElement("input"); cb.type="checkbox"; cb.checked=true; L.cb=cb;+      cb.setAttribute("data-tip","Show or hide this layer");       cb.addEventListener("change",function(){ L.visible=cb.checked; applyVisibility(); });       const nm=document.createElement("span"); nm.className="lp-name"; nm.textContent=L.label;       const z=document.createElement("span"); z.className="lp-z"; L.zEl=z;@@ -719,13 +721,17 @@ exported bodies + design rules.</p>     }     function show(el){ const t=el.getAttribute("data-tip"); if(!t) return; tt.textContent=t; tt.style.left="-9999px"; tt.classList.add("show"); place(el); }     function hide(){ tt.classList.remove("show"); }+    let curEl=null;     document.addEventListener("mouseover",function(e){       const el=e.target.closest("[data-tip]"); if(!el) return;-      clearTimeout(timer); timer=setTimeout(function(){ show(el); },800);+      if(el===curEl) return;                     // crossing into svg/path CHILDREN - not a new hover+      curEl=el;+      clearTimeout(timer); timer=setTimeout(function(){ show(el); },600);     });     document.addEventListener("mouseout",function(e){       const el=e.target.closest("[data-tip]"); if(!el) return;-      clearTimeout(timer); hide();+      if(el.contains(e.relatedTarget)) return;   // still inside the control - not a real leave+      curEl=null; clearTimeout(timer); hide();     });     document.addEventListener("click",hide,true);     window.__ttReady=true;