← Commit history

2.11.7: house scrollbars; clipboard focus fallback

John Lauer ·e0e7fcf0b4 ·1mo ago ·parent 19ef2f1
6 files changed +35−20
Cargo.lock+1−1
@@ -10,7 +10,7 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"  [[package]] name = "adom-lbr"-version = "2.11.6"+version = "2.11.7" dependencies = [  "altium-codec",  "anyhow",
Cargo.toml+1−1
@@ -1,6 +1,6 @@ [package] name = "adom-lbr"-version = "2.11.6"+version = "2.11.7" 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.11.6+2.11.7
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-lbr",-  "version": "2.11.6",+  "version": "2.11.7",   "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": {},
page.json+9−12
@@ -1,8 +1,8 @@ {   "slug": "adom-lbr",-  "version": "2.11.6",+  "version": "2.11.7",   "type": "app",-  "description": "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.",+  "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": {},   "tags": [     "eda",@@ -52,24 +52,21 @@   ],   "files": [     "bin/**",-    "assets/**",     "SKILL.md",-    "skills/**",     "README.md",     "install.sh",     "uninstall.sh",-    "screenshots/**",-    "dockbar.json"+    "screenshots/**"   ],-  "discovery_pitch": "Convert electronic-component symbols + footprints between any two EDA tools — KiCad, Altium (written natively, no Altium needed), and EAGLE/Fusion — through one canonical adom-lbr JSON, silk/courtyard/fab layers preserved. Plus a Manager to browse and inspect any wiki part.",+  "discovery_pitch": "Convert electronic-component symbols + footprints between any two EDA tools \u2014 KiCad, Altium (written natively, no Altium needed), and EAGLE/Fusion \u2014 through one canonical adom-lbr JSON, silk/courtyard/fab layers preserved. Plus a Manager to browse and inspect any wiki part.",   "sample_prompts": [     {       "prompt": "Convert this KiCad symbol and footprint to an Altium SchLib and PcbLib",-      "label": "KiCad → Altium"+      "label": "KiCad \u2192 Altium"     },     {       "prompt": "Import this Altium footprint into the adom-lbr JSON",-      "label": "Altium → JSON"+      "label": "Altium \u2192 JSON"     },     {       "prompt": "Bundle this part into a single Altium IntLib",@@ -77,15 +74,15 @@     },     {       "prompt": "Convert this Altium SchLib and PcbLib to a KiCad symbol and footprint",-      "label": "Altium → KiCad"+      "label": "Altium \u2192 KiCad"     },     {       "prompt": "Export this adom-lbr JSON to a KiCad .kicad_sym and .kicad_mod",-      "label": "JSON → KiCad"+      "label": "JSON \u2192 KiCad"     },     {       "prompt": "Open the adom-lbr Manager to browse wiki components and view the layer stackup",       "label": "Browse parts"     }   ]-}\ No newline at end of file+}
src/manage.html+22−4
@@ -11,6 +11,13 @@         --surface:#161b22;--elevated:#1c2128;--overlay:#21262d;--border:#30363d;--text:#e6edf3;--text-body:#c9d1d9;--text-2:#8b949e;--accent:#00b8b1;--on-accent:#05221f;--red:#f85149;--yellow:#d29922;--green:#3fb950;         --brand-heading:"Familjen Grotesk",-apple-system,Segoe UI,Roboto,sans-serif;--brand-body:Satoshi,-apple-system,Segoe UI,Roboto,sans-serif}   *{box-sizing:border-box}+  /* House scrollbars everywhere (the wiki's slim dark pill; scrollbars sub-skill, John 2026-08-18) */+  *{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}   body{margin:0;font:14px/1.5 -apple-system,Segoe UI,Roboto,sans-serif;background:var(--bg);color:var(--ink);height:100vh;display:flex;flex-direction:column}   #panes{display:flex;flex:1;min-height:0}   /* ---- the 44px app header: name left, live LEDs + version + the cog right ---- */@@ -76,7 +83,7 @@   dialog.settings:focus{outline:none}   .settings-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 14px 12px 18px;border-bottom:1px solid var(--border);cursor:move;user-select:none}   .settings-head h2{margin:0;font:600 15px/1.3 var(--brand-heading);color:var(--text);display:flex;align-items:center;gap:10px}-  .settings-body{max-height:70vh;overflow:auto;padding:18px;scrollbar-width:thin;scrollbar-color:rgba(139,148,158,.35) transparent}+  .settings-body{max-height:70vh;overflow:auto;padding:18px;scrollbar-gutter:stable}   .settings-body::-webkit-scrollbar{width:8px}   .settings-body::-webkit-scrollbar-track{background:transparent;margin:12px 0}   .settings-body::-webkit-scrollbar-thumb{background:rgba(139,148,158,.35);border-radius:999px;border:2px solid transparent;background-clip:padding-box}@@ -178,7 +185,7 @@   #refresh.spin{animation:sp .6s linear infinite}   @keyframes sp{to{transform:rotate(360deg)}}   #q{margin:10px;padding:8px 10px;background:#0d0f14;border:1px solid var(--edge);border-radius:8px;color:var(--ink)}-  #rows{overflow:auto;flex:1}+  #rows{overflow:auto;flex:1;scrollbar-gutter:stable}   .row{padding:10px 16px;border-bottom:1px solid var(--edge);cursor:pointer}   .row:hover{background:#1e222b}   .row.sel{background:#243049;border-left:3px solid var(--acc);padding-left:13px}@@ -663,9 +670,20 @@ refreshStatus(); setInterval(refreshStatus,15000); loadSettings();   // the Say-it strip's visibility rides settings, so load them at startup  // ---- "Say it": phrases come from dockbar.json `say` via the server ----+function copyViaTextarea(t){+  const ta=document.createElement('textarea');ta.value=t;ta.style.cssText='position:fixed;opacity:0';document.body.appendChild(ta);ta.select();+  let ok=false;try{ok=document.execCommand('copy');}catch(_){ }ta.remove();return ok;+} async function copyText(t){-  try{ await navigator.clipboard.writeText(t); return true; }-  catch(e){ const ta=document.createElement('textarea');ta.value=t;document.body.appendChild(ta);ta.select();let ok=false;try{ok=document.execCommand('copy');}catch(_){ }ta.remove();return ok; }+  // An unfocused window HANGS navigator.clipboard.writeText ("document is not+  // focused") - check synchronously and stay in-gesture with execCommand+  // (parts-search 1.1.2 recipe); race the async path at ~800 ms regardless.+  if(!document.hasFocus())return copyViaTextarea(t);+  try{+    await Promise.race([navigator.clipboard.writeText(t),+      new Promise((_,rej)=>setTimeout(()=>rej(new Error('clipboard timeout')),800))]);+    return true;+  }catch(e){ return copyViaTextarea(t); } } function applySayVisibility(){   const el=document.getElementById('say');