← Commit history

2.15.3: fleet 16px gutter; module 2.3.0; smoke refuses stale servers

John Lauer ·2cb25e8bf8 ·1mo ago ·parent 7cccc95
6 files changed +56−6
Cargo.toml+1−1
@@ -1,6 +1,6 @@ [package] name = "adom-lbr"-version = "2.15.2"+version = "2.15.3" edition = "2021" description = "adom-lbr generator / EDA translator: the canonical adom-lbr JSON is the hub, with native converters to Altium (.SchLib/.PcbLib/.IntLib), EAGLE/Fusion (.lbr), and KiCad. Altium output is written natively — no Altium needed at conversion time." 
VERSION+1−1
@@ -1 +1 @@-2.15.2+2.15.3
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-lbr",-  "version": "2.15.2",+  "version": "2.15.3",   "type": "app",   "description": "adom-lbr \u2014 the EDA library translator. Bring a component in from any supported EDA tool and convert it to any other (KiCad \u21c4 Altium \u21c4 EAGLE/Fusion) through one canonical adom-lbr JSON \u2014 symbol + footprint + 3D + pin\u2194pad map. Altium is written natively (no Altium needed). Includes the adom-lbr Manager: browse wiki components and view symbol/footprint/3D + the per-EDA layer stackup.",   "dependencies": {},
src/manage.html+11−2
@@ -60,8 +60,17 @@      adom-ui-design and every app gets the fix. The panel's own container query collapses it      at a 700px PANEL border-box width, which is a panel measurement, not a viewport one.      What stays mine is the CONTENT padding, because the page owns its own breathing room-     whether the panel is open or closed. */-  #content{padding:20px 20px 24px}+     whether the panel is open or closed.++     THE HORIZONTAL PADDING IS 16px AND IS PART OF THE CONTRACT (newbie-panel module 2.3.0).+     Four conformant panels measured at the SAME 744px pane came back 734, 735, 702 and 694+     wide, purely because each page wrapped its mount point in a different gutter; at 694 one+     app dropped to a single column while the others stayed at two, at an identical pane+     width. So the panel's border box must be the pane minus 32, and selfCheck now fails a+     correct panel inside a wrongly padded page. I was at 20px a side, which is 8px too much.+     The vertical padding is still mine, and so is anything the app body wants BELOW the+     panel, which is where extra margin belongs if this page ever needs it. */+  #content{padding:20px 16px 24px}   /* tooltips (tooltips skill): 600ms, body-appended, clamped */   #tip2{position:fixed;z-index:5000;background:var(--overlay);border:1px solid var(--line);color:var(--text);font:12px var(--brand-body);padding:5px 9px;border-radius:6px;pointer-events:none;display:none;max-width:280px}   /* sidebar mode tabs: Projects (boards) | Parts (the whole wiki library) */
src/newbie-panel.js+13−1
@@ -421,6 +421,18 @@     var cols = cs.gridTemplateColumns.split(' ').filter(Boolean).length;     rows.push({ what: 'columns at this width', want: panel.getBoundingClientRect().width >= TWO_COL_MIN ? '2' : '1',                 got: String(cols), pass: true });+    /* THE GUTTER ROW. Four apps measured at the SAME 744px pane reported panel widths of+     * 734, 735, 702 and 694, because each page put a different amount of its own padding+     * around the mount point. 694 is under the 700 threshold, so that app rendered ONE+     * column while the other three rendered TWO, at an identical pane width. The panel was+     * conformant in all four; the PAGE around it was not. The fleet gutter is 16px a side,+     * so the panel's border box is the pane minus 32. */+    var vw = document.documentElement.clientWidth;+    var want32 = vw - 32, gotW = Math.round(panel.getBoundingClientRect().width);+    var gutterOk = Math.abs(gotW - want32) <= 2;+    if (!gutterOk) ok = false;+    rows.push({ what: 'panel gutter', want: want32 + 'px wide (16px a side)',+                got: gotW + 'px (' + Math.round((vw - gotW) / 2) + 'px a side)', pass: gutterOk });     var fam = getComputedStyle(panel.querySelector('.anp-phrase span') || panel).fontFamily;     var famOk = /Satoshi/.test(fam);     if (!famOk) ok = false;@@ -428,6 +440,6 @@     return { ok: ok, rows: rows };   } -  root.AdomNewbiePanel = { mount: mount, toast: toast, selfCheck: selfCheck, version: '2.1.2',+  root.AdomNewbiePanel = { mount: mount, toast: toast, selfCheck: selfCheck, version: '2.3.0',                            TWO_COL_MIN: TWO_COL_MIN, PHRASE_BUDGET: PHRASE_BUDGET }; })(typeof window !== 'undefined' ? window : this);
tools/page-smoke.js+29
@@ -33,6 +33,19 @@ const EXPECT = { };  (async () => {+  // NEVER MEASURE A SERVER YOU DID NOT START. This app's resolve_port deliberately falls+  // back to the next free port when its own is taken, so a lingering instance leaves the+  // harness talking to a STALE build on the port it expected while the fresh one runs+  // somewhere else. That produced a run where every check read zero and the page was in+  // fact perfect. Refuse to start on an occupied port, then prove the version.+  let occupied = false;+  try { await fetch(URL); occupied = true; } catch (e) {}+  if (occupied) {+    console.log(`[smoke] FAIL port ${PORT} is already answering: something else is serving it.`);+    console.log('        kill it, or run with SMOKE_PORT=<free port>. Refusing to measure a server I did not start.');+    process.exit(1);+  }+   const srv = spawn(BIN, ['dashboard', 'serve', '--port', String(PORT), '--foreground'],                     { stdio: 'ignore', detached: true });   const done = code => { try { process.kill(-srv.pid); } catch (e) {} process.exit(code); };@@ -41,6 +54,22 @@ const EXPECT = {     try { await fetch(URL); break; } catch (e) { await new Promise(r => setTimeout(r, 250)); }   } +  // Prove the thing answering is the build we just made, not a survivor from an earlier run.+  const want = require('fs').readFileSync('VERSION', 'utf8').trim();+  try {+    const st = await (await fetch(URL + 'api/status')).json();+    const bin = (st.leds || []).find(l => l.label === 'Binary');+    const got = bin && String(bin.short || '').replace(/^v/, '');+    if (got !== want) {+      console.log(`[smoke] FAIL served version is ${got}, expected ${want}: measuring the wrong server.`);+      done(1); return;+    }+    console.log(`[smoke] ok   serving ${got} on port ${PORT}`);+  } catch (e) {+    console.log('[smoke] FAIL could not read /api/status to confirm the version: ' + e.message);+    done(1); return;+  }+   const errs = [];   const vc = new VirtualConsole();   vc.on('jsdomError', e => errs.push(String(e.message || e)));