app
Adom Library
Public Made by Adomby adom
adom-lbr — the EDA library translator. Bring a component in from any supported EDA tool and convert it to any other (KiCad ⇄ Altium ⇄ EAGLE/Fusion) through one canonical adom-lbr JSON — symbol + footprint + 3D + pin↔pad 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.
← Commit history
2.15.3: fleet 16px gutter; module 2.3.0; smoke refuses stale servers
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)));