skill
Adom Wiki Skill Pack
Public Made by Adomby adom
The Adom Wiki Skill Pack : one main skill plus the focused sub-skills that teach the AI to publish to wiki.adom.inc without breaking pages, name the wiki repo archetypes (Page, Skillpack, Family), and publish rich component pages (chips, molecules, boards). The wiki is six tools in one: git, package manager, releases, discussions, pull requests, and discovery. One package manager install drops the whole set onto your container. Includes reviewed Z-up component artwork, surface-selected MPN marki
← Commit history
Publish 0.6.0
6 files changed
+301−73
package.json+4−3@@ -1,8 +1,8 @@ { "slug": "adom-wiki-skillpack",- "version": "0.5.0",+ "version": "0.6.0", "type": "skill",- "description": "The Adom Wiki Skill Pack — one main skill plus 14 focused sub-skills that teach the AI to publish to wiki.adom.inc without breaking pages, name the wiki repo archetypes (Page, Skillpack, Family), and publish rich component pages (chips, molecules, boards). The wiki is six tools in one: git, adompkg, releases, discussions, pull requests, and discovery. One adompkg install drops the whole set onto your container.",+ "description": "The Adom Wiki Skill Pack \u2014 one main skill plus 14 focused sub-skills that teach the AI to publish to wiki.adom.inc without breaking pages, name the wiki repo archetypes (Page, Skillpack, Family), and publish rich component pages (chips, molecules, boards). The wiki is six tools in one: git, adompkg, releases, discussions, pull requests, and discovery. One adompkg install drops the whole set onto your container.", "discovery_triggers": [ "publish to the wiki", "the wiki",@@ -59,6 +59,7 @@ "skills/wiki-component/SKILL.md", "skills/wiki-component/component-page-generator/gen_chip.py", "skills/wiki-component/component-page-generator/template.html",+ "skills/wiki-component/component-page-generator/mkviewers.mjs", "skills/wiki-family/SKILL.md", "skills/wiki-skillpack/SKILL.md", "skills/wiki-hero/SKILL.md",@@ -82,4 +83,4 @@ "open-source", "mit" ]-}+}
page.json+85−41@@ -1,46 +1,90 @@ {- "type": "skill", "slug": "adom-wiki-skillpack",- "title": "Adom Wiki Skill Pack",- "brief": "How to use the Adom Wiki without breaking pages — the wiki is six tools in one (git, adompkg, releases, discussions, PRs, discovery), and three repo archetypes have emerged from real use: Page, Skillpack, and Family. Plus how to publish rich component pages (chips, molecules, boards). One install, 15 skills, plus a write-up of the design patterns for the people who build the wiki.",- "hero": {- "type": "image",- "path": "screenshots/hero.png"+ "version": "0.6.0",+ "type": "skill",+ "description": "The Adom Wiki Skill Pack — one main skill plus 14 focused sub-skills that teach the AI to publish to wiki.adom.inc without breaking pages, name the wiki repo archetypes (Page, Skillpack, Family), and publish rich component pages (chips, molecules, boards). The wiki is six tools in one: git, adompkg, releases, discussions, pull requests, and discovery. One adompkg install drops the whole set onto your container.",+ "discovery_triggers": [+ "publish to the wiki",+ "the wiki",+ "adompkg publish",+ "what kind of wiki repo",+ "wiki repo archetype",+ "publish a chip",+ "chip component page",+ "component readme",+ "molecule page",+ "tape and reel",+ "pin 1 orientation",+ "skillpack",+ "super skill",+ "wiki family repo",+ "parent child wiki",+ "how to make a wiki readme",+ "wiki page presentation",+ "hero in readme",+ "hero shows twice",+ "duplicate hero",+ "don't repeat the hero",+ "hero unlinked",+ "hero disappeared",+ "name a child page",+ "family child title",+ "private source public app",+ "proprietary wiki page",+ "wiki breadcrumb",+ "fork a wiki page",+ "wiki discovery",+ "page not surfacing",+ "discover endpoint",+ "wiki scoring",+ "wiki trending"+ ],+ "dependencies": {+ "john/adom-wiki-hero-image": "^0.2.1" },- "visibility": {- "public": true+ "files": [+ "SKILL.md",+ "README.md",+ "page.json",+ "install.sh",+ "uninstall.sh",+ "screenshots/hero.png",+ "screenshots/archetypes.png",+ "skills/wiki-anatomy/SKILL.md",+ "skills/wiki-api/SKILL.md",+ "skills/wiki-publish-safely/SKILL.md",+ "skills/wiki-readme/SKILL.md",+ "skills/wiki-visibility/SKILL.md",+ "skills/wiki-repo-styles/SKILL.md",+ "skills/wiki-component/SKILL.md",+ "skills/wiki-component/component-page-generator/gen_chip.py",+ "skills/wiki-component/component-page-generator/template.html",+ "skills/wiki-component/component-page-generator/mkviewers.mjs",+ "skills/wiki-family/SKILL.md",+ "skills/wiki-skillpack/SKILL.md",+ "skills/wiki-hero/SKILL.md",+ "skills/wiki-breadcrumbs/SKILL.md",+ "skills/wiki-forking/SKILL.md",+ "skills/wiki-discovery/SKILL.md",+ "skills/wiki-scoring/SKILL.md"+ ],+ "scripts": {+ "install": "./install.sh",+ "uninstall": "./uninstall.sh" },- "metadata": {- "tags": [- "wiki",- "adompkg",- "publishing",- "skillpack",- "guidelines",- "documentation",- "repo-archetypes",- "open-source",- "mit"- ],- "discovery_triggers": [- "publish to the wiki",- "the wiki",- "adompkg publish",- "what kind of wiki repo",- "wiki repo archetype",- "skillpack",- "super skill",- "wiki family repo",- "parent child wiki",- "wiki readme",- "hero disappeared",- "hero unlinked",- "private source public app",- "proprietary wiki page",- "wiki breadcrumb",- "fork a wiki page",- "wiki scoring",- "wiki trending"- ]+ "tags": [+ "wiki",+ "adompkg",+ "publishing",+ "skillpack",+ "guidelines",+ "documentation",+ "repo-archetypes",+ "open-source",+ "mit"+ ],+ "author": {+ "name": "John Lauer",+ "email": "[email protected]" }-}+}
skills/wiki-component/SKILL.md+33−5@@ -148,11 +148,39 @@ and **embed the live interactive viewers**. | pin-1 + seat-plane validation + pin-1-baked GLB | **adom-chipfit** | `adom-chipfit check --footprint x.kicad_mod --glb x.glb` | | symbol/footprint SVGs + 3D iso PNGs + manifest | **chip-thumbnailer** | `chip-thumbnailer once <MPN>` | -> The standalone CLI `preview` (interactive viewer HTML) needs service assets and-> may fail on a bare container; the **services and the wiki** generate the live-> viewers. Easiest path: publish the page (Layer A) so the wiki hosts the viewers,-> then `<iframe>` `/viewer/{symbol,footprint,3d}/component/<slug>?embed=1` into your-> custom layout. That is "embed adom-symbol / adom-footprint live."+### Generate the embeddable viewers FROM the apps (not just the wiki route)++The symbol/footprint viewers on the page must be the **real adom-symbol SymView /+adom-footprint FpView**, generated by the apps as **self-contained embeddable HTML**.+Two ways, in order of preference:++1. **Call the app generator functions directly** (best for a standalone page):+ ```js+ // adom-symbol: returns a self-contained interactive SymView HTML string+ import { generateBrandedViewer } from '<adom-symbol>/service/lib/viewer-gen.js';+ const symHtml = await generateBrandedViewer(symPath, mpn,+ { svgContent: existingSymbolSvg, // pass the rendered SVG to skip service-kicad+ pinDescriptions, manufacturer, datasheetUrl });+ // adom-footprint: self-contained interactive FpView (pads, courtyard, solder-blob toggle)+ import { generateFootprintViewer } from '<viewer>/kicad-footprint-viewer.js';+ const fpHtml = await generateFootprintViewer(modPath, mpn, { manufacturer, partName });+ ```+ Write each to `symview.html` / `fpview.html` and `<iframe src="symview.html">`+ them. They are fully self-contained (inline SVG + JS, no external fetch), so they+ embed anywhere. (`generateBrandedViewer` accepts a pre-rendered `svgContent` so it+ needs no service-kicad; `generateFootprintViewer` renders via service-kicad with a+ local fallback — feed it the chip's existing `*-footprint.svg` if its+ `fpExportSvg` dep is missing in your checkout.) The standalone Rust `adom-symbol+ preview` / `adom-footprint preview` *should* emit the same HTML but can fail on a+ bare container (missing service assets) — use the JS generators or the service.+2. **Reuse the wiki's hosted viewer** once the page is published (Layer A): the+ wiki runs these same generators server-side, so+ `<iframe src="/viewer/{symbol,footprint,3d}/component/<slug>?embed=1">` is the+ identical viewer. Good for the live page; the generators above are what you use+ before publishing / for a standalone preview.++ The shipped `component-page-generator/` does exactly this (`mkviewers.mjs` calls+ the app generators; the page embeds `symview.html`/`fpview.html`). ## 1. What goes in each section
skills/wiki-component/component-page-generator/gen_chip.py+80−1@@ -7,6 +7,27 @@ import json, os, re, base64, glob, subprocess, sys LIBROOT="/home/adom/project/chip-fetcher/library"+# Per-chip config: published wiki slug (=> embed LIVE viewers), hero, mfr resources, family.+CFG={+ "nRF54L15":{"slug":"nrf54l15","wiki":"https://wiki.adom.inc/john/nrf54l15",+ "hero":"/home/adom/project/wiki-nrf54l15/screenshots/hero.png",+ "resources":[("Nordic nRF54L15 product page","https://www.nordicsemi.com/Products/nRF54L15"),+ ("Product Specification (845-page datasheet)","https://docs.nordicsemi.com/bundle/ps_nrf54L15/page/keyfeatures_html5.html"),+ ("nRF Connect SDK","https://www.nordicsemi.com/Products/Development-software/nRF-Connect-SDK"),+ ("nRF54L15 DK (dev kit)","https://www.nordicsemi.com/Products/Development-hardware/nRF54L15-DK"),+ ("Nordic DevZone (support)","https://devzone.nordicsemi.com/")],+ "family":"nRF54L10 / nRF54L05 (same QFN-48 pinout, less NVM/RAM); broader nRF54H / nRF53 / nRF52 series."},+ "DMG2305UX-7":{"resources":[("Diodes Inc DMG2305UX product page","https://www.diodes.com/part/view/DMG2305UX/")],+ "family":"DMG3415UX, DMG2301L and other Diodes P-channel SOT-23 MOSFETs."},+ "LM358D":{"resources":[("TI LM358 product page","https://www.ti.com/product/LM358"),("LM358 datasheet","https://www.ti.com/lit/ds/symlink/lm358.pdf")],+ "family":"LM358DR (tape and reel), LM2904 (automotive), LM324 (quad)."},+ "BME688":{"resources":[("Bosch BME688 product page","https://www.bosch-sensortec.com/products/environmental-sensors/gas-sensors/bme688/")],+ "family":"BME680 (no AI gas), BME280 (T/RH/P, no gas)."},+ "TPS25751SRSMR":{"resources":[("TI TPS25751 product page","https://www.ti.com/product/TPS25751")],+ "family":"TPS25750, TPS65987 USB-PD controllers."},+ "WSL2010R0500FEA":{"resources":[("Vishay WSL2010 product page","https://www.vishay.com/en/product/30100/")],+ "family":"WSL series current-sense resistors (WSL1206, WSL2512)."},+} FONTS="/home/adom/datasheet-visualizer/public/fonts" OUT="/tmp/nrf-site" # served dir @@ -205,6 +226,61 @@ def gen(mpn, slug): if has_glb: cad.append(("GLB (web 3D)",f"{mpn}.glb")) cad_html="".join(f'<div class="dlcard"><div class="n">{f}</div><div class="d">{scrub(lbl)}</div></div>' for lbl,f in cad if glob.glob(f"{D}/{f}")) + cfg=CFG.get(mpn,{})+ pub=cfg.get("slug") # published wiki slug => live viewers+ wikiurl=cfg.get("wiki","#")+ # ---- viewers: live iframe when published, else inline static SVG ----+ def liveviewer(kind,label):+ u=f"https://wiki.adom.inc/viewer/{kind}/component/{pub}?embed=1"+ return f'<div class="viewer-cap"><span class="live">{label} (live)</span><span>drag, zoom, layer toggle</span></div><iframe class="viewer" src="{u}" loading="lazy"></iframe>'+ # Prefer the viewer HTML generated by the actual adom-symbol / adom-footprint apps+ # (mkviewers.mjs -> <slug>/symview.html, fpview.html), embedded same-origin.+ def appviewer(fname,label,extra=""):+ return f'<div class="viewer-cap"><span class="live">{label}</span><span>generated by the app, embedded{extra}</span></div><iframe class="viewer" src="{fname}" loading="lazy"></iframe>'+ if os.path.exists(f"{OUT}/{slug}/symview.html"):+ symview=appviewer("symview.html","adom-symbol SymView")+ elif pub: symview=liveviewer("symbol","adom-symbol SymView")+ else: symview=f'<div class="viewer-cap"><span class="src real">adom-symbol render</span></div><div class="render">{sym_svg}</div>'+ if os.path.exists(f"{OUT}/{slug}/fpview.html"):+ fpview=appviewer("fpview.html","adom-footprint FpView",", pin 1 top-left, toggle solder blobs")+ elif pub: fpview=liveviewer("footprint","adom-footprint FpView")+ else: fpview=f'<div class="viewer-cap"><span class="src real">adom-footprint render</span></div><div class="render">{fp_svg}</div>'+ d3view = (liveviewer("3d","Adom 3D viewer (Babylon)") if pub else f'<p style="color:var(--text-2);font-size:14px">{("GLB present" if has_glb else "STEP present")}; live Babylon viewer when published.</p>')+ # ---- hero ----+ heroimg=""+ hp=cfg.get("hero")+ if hp and os.path.exists(hp): heroimg="data:image/png;base64,"+b64f(hp)+ elif glob.glob(f"{D}/{mpn}-3d-iso-named.png"): heroimg="data:image/png;base64,"+b64f(glob.glob(f"{D}/{mpn}-3d-iso-named.png")[0])+ hero_disp = f'<div class="hero"><img src="{heroimg}" alt="{mpn}"></div>' if heroimg else ""+ # ---- toolbar buttons ----+ mu=(stock or {}).get("mouser",{}).get("product_url") if stock else None+ dk=f"https://www.digikey.com/en/products/result?keywords={mpn}"+ ICc,ICs,ICf,ICd,ICdl,ICca=ic('cube'),ic('symbol'),ic('footprint'),ic('doc',14),ic('download',16),ic('cart',16)+ if pub:+ direct=f'<a class="btn go" target="_blank" href="https://wiki.adom.inc/viewer/3d/component/{pub}">{ICc} 3D viewer</a><a class="btn go" target="_blank" href="https://wiki.adom.inc/viewer/symbol/component/{pub}">{ICs} Symbol viewer</a><a class="btn go" target="_blank" href="https://wiki.adom.inc/viewer/footprint/component/{pub}">{ICf} Footprint viewer</a><a class="btn go" target="_blank" href="{wikiurl}">{ICd} Wiki page</a>'+ directsrc='<span class="src real">real wiki viewers</span>'+ else:+ direct='<span class="btn dis">3D viewer</span><span class="btn dis">Symbol viewer</span><span class="btn dis">Footprint viewer</span><span class="src mock" style="align-self:center">live when published</span>'+ directsrc='<span class="src mock">publish to enable</span>'+ dlbtns="".join(f'<span class="btn" data-tip="{scrub(lbl)}">{ICdl} {f.split(".")[-1].upper()}</span>' for lbl,f in cad if glob.glob(f"{D}/{f}"))+ buybtns=(f'<a class="btn buy" target="_blank" href="{mu}">{ICca} Mouser</a>' if mu else '<span class="btn dis">Mouser</span>')+f'<a class="btn buy" target="_blank" href="{dk}">{ICca} DigiKey</a>'+ # ---- reel note ----+ reel=("This part number ends in -R: Tape and Reel." if mpn.upper().endswith(("R","-R","R7")) or "R" in mpn[-2:] else "Check the distributor packaging (Cut Tape / Tape and Reel / Tube / Tray).")+ # ---- resources ----+ res=cfg.get("resources",[])+ if res:+ resources='<ul class="r">'+"".join(f'<li><a href="{u}" target="_blank">{scrub(t)}</a></li>' for t,u in res)+'<li class="src mock">Errata, app notes, reference designs: auto-list all supplemental docs (TODO).</li></ul>'+ else:+ resources='<p class="src mock">Manufacturer resource links not configured for this part (TODO: pull from info.json / product page).</p>'+ # ---- variants (from ds2sf symbol.variants) ----+ vs=sym.get('variants') or []+ if vs:+ rows="".join(f'<tr><td class="k">{scrub(v.get("package"))}</td><td>{scrub(v.get("pin_count"))} pins</td><td>{"pin-compatible" if v.get("compatible_pinout") else "NOT pin-compatible"}</td><td>{scrub((v.get("notes") or ""))[:160]}</td></tr>' for v in vs)+ variants=f'<table><tr><th>Package</th><th>Pins</th><th>Compatibility</th><th>Notes</th></tr>{rows}</table><div class="cite"><b>Source:</b> ds2sf variant extraction.</div>'+ else:+ variants='<p class="src mock">No variant data extracted. TODO: list package / temperature / speed variants.</p>'+ related=f'<p style="color:var(--text-2);font-size:14px"><b>Family:</b> {scrub(cfg.get("family","see manufacturer portfolio."))}</p><p style="color:var(--text-2);font-size:14px;margin-top:8px"><b>Molecules using this chip:</b> <span class="src mock">query adom-molecules; none indexed yet. TODO: auto backlink index.</span></p>'+ HTML=TEMPLATE reps={ "__MPN__":mpn,"__MFR__":mfr,"__PKG__":pkg,"__DESC__":desc,"__CLS__":cls_label,@@ -214,7 +290,10 @@ def gen(mpn, slug): "__DSPAGES__":str(ds.get('page_count','?')),"__DSSHA__":scrub((ds.get('sha256') or '')[:16]), "__TOOL__":scrub(tooling.get('extractor','ds2sf'))+" "+scrub(tooling.get('extractor_version',''))+", "+scrub(tooling.get('claude_model','')), "__PROVIMGS__":prov_imgs,"__EVJS__":ev_js,- "__GLBNOTE__":"GLB present, live Babylon viewer when published." if has_glb else "STEP present, GLB on publish.",+ "__WIKIURL__":wikiurl,"__HERO__":hero_disp,"__DIRECTSRC__":directsrc,"__DIRECTBTNS__":direct,+ "__DLBTNS__":dlbtns,"__BUYBTNS__":buybtns,"__SYMVIEW__":symview,"__FPVIEW__":fpview,"__3DVIEW__":d3view,+ "__REELNOTE__":scrub(reel),"__RESOURCES__":resources,"__VARIANTS__":variants,"__RELATED__":related,+ "__IC_OPEN14__":ic("open",14),"__IC_BOX__":ic("box"),"__IC_BUILD__":ic("building"),"__IC_LAYERS__":ic("layers"),"__IC_LINK__":ic("link"), "__FAM5__":FAM5,"__FAM7__":FAM7,"__SAT4__":SAT4,"__SAT5__":SAT5,"__SAT7__":SAT7, "__IC_CHIP__":ic("chip"),"__IC_OPEN__":ic("open",16),"__IC_SYM__":ic("symbol"),"__IC_FP__":ic("footprint"), "__IC_CUBE__":ic("cube"),"__IC_GRID__":ic("grid"),"__IC_LIST__":ic("list"),"__IC_DOLLAR__":ic("dollar"),
skills/wiki-component/component-page-generator/mkviewers.mjsadded+38@@ -0,0 +1,38 @@+// Generate REAL embeddable SymView + FpView HTML via the adom-symbol / adom-footprint+// app generators, for each chip, into /tmp/nrf-site/<slug>/{symview,fpview}.html.+import { generateBrandedViewer } from '/home/adom/project/gallia/symbol-creator/lib/viewer-gen.js';+import { generateFootprintViewer } from '/tmp/gen/fpv/kicad-footprint-viewer.js';+import { readFileSync, writeFileSync, existsSync } from 'fs';+import { execSync } from 'child_process';++const LIB='/home/adom/project/chip-fetcher/library';+const OUT='/tmp/nrf-site';+const CHIPS=[+ ['nRF54L15','nrf54l15','Nordic Semiconductor'],+ ['DMG2305UX-7','dmg2305','Diodes Incorporated'],+ ['LM358D','lm358d','Texas Instruments'],+ ['BME688','bme688','Bosch Sensortec'],+ ['TPS25751SRSMR','tps25751','Texas Instruments'],+ ['WSL2010R0500FEA','wsl2010','Vishay'],+];+function g(d,p){try{return execSync(`ls ${d}/${p} 2>/dev/null|head -1`).toString().trim()}catch(e){return ''}}+for(const [mpn,slug,mfr] of CHIPS){+ const D=`${LIB}/${mpn}`;+ // pin descriptions from ds2sf+ let pinDescriptions={},groupDescriptions={};+ const symx=g(D,`${mpn}-symbol.extracted.json`);+ if(symx){const s=JSON.parse(readFileSync(symx,'utf-8'));for(const p of (s.pins||[])){if(p.number)pinDescriptions[p.number]=p.description||'';}}+ // SymView via adom-symbol generator (pre-rendered SVG -> no service-kicad needed)+ const symSvgP=g(D,`${mpn}-symbol.svg`), symP=g(D,`${mpn}.kicad_sym`);+ try{+ const html=await generateBrandedViewer(symP,mpn,{svgContent:readFileSync(symSvgP,'utf-8'),pinDescriptions,manufacturer:mfr});+ writeFileSync(`${OUT}/${slug}/symview.html`,html); console.log(`${slug} symview: ${html.length} bytes`);+ }catch(e){console.log(`${slug} symview FAIL: ${e.message}`);}+ // FpView via adom-footprint generator (shim feeds the real rendered footprint SVG)+ const fpSvgP=g(D,`${mpn}-footprint.svg`), modP=g(D,`${mpn}.kicad_mod`);+ try{+ process.env.FP_SVG = fpSvgP||'';+ const html=await generateFootprintViewer(modP,mpn,{manufacturer:mfr,partName:mpn});+ writeFileSync(`${OUT}/${slug}/fpview.html`,html); console.log(`${slug} fpview: ${html.length} bytes`);+ }catch(e){console.log(`${slug} fpview FAIL: ${e.message}`);}+}
skills/wiki-component/component-page-generator/template.html+61−23@@ -26,61 +26,99 @@ a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline} .legend{display:flex;gap:14px;font-size:12px;color:var(--text-2);margin:10px 0 0;flex-wrap:wrap}.dot{display:inline-block;width:9px;height:9px;border-radius:999px;margin-right:5px;vertical-align:middle} .src{font-size:11px;color:var(--text-3)}.src.real{color:#6fbf8f}.src.mock{color:#e0a06a} .todo{display:inline-flex;align-items:center;gap:4px;background:rgba(210,153,34,.15);border:1px solid rgba(210,153,34,.5);color:#e3b765;border-radius:8px;padding:1px 8px;font-size:11px;font-weight:600;margin-left:6px}+.hero{margin:14px 0;border:1px solid var(--border);border-radius:12px;overflow:hidden;background:var(--surface)}.hero img{display:block;width:100%}+.toolbar{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:15px 16px;margin:16px 0}+.toolbar h3{font-size:12px;text-transform:uppercase;letter-spacing:1.2px;color:var(--text-2);margin:0 0 8px;display:flex;align-items:center;gap:7px}+.ctxrow{display:flex;align-items:center;gap:9px;margin-bottom:10px;flex-wrap:wrap}.ctx{font-size:12.5px;color:var(--text-2);border:1px solid var(--border);border-radius:8px;padding:5px 10px;background:var(--elevated)}.ctx b{color:var(--accent)}+.lbl{font-size:12px;color:var(--text-3);margin:10px 0 5px;font-weight:600}+.btns{display:flex;flex-wrap:wrap;gap:7px}+.btn{display:inline-flex;align-items:center;gap:7px;padding:8px 12px;border-radius:8px;font-size:13.5px;font-weight:600;cursor:pointer;border:1px solid var(--border);background:var(--elevated);color:var(--text);user-select:none}+.btn:hover{border-color:var(--accent);color:var(--accent-bright)}.btn.go{border-color:rgba(0,184,176,.5);color:#7fe3dd;background:rgba(0,184,176,.10)}.btn.buy{color:#e8c578}.btn.dis{opacity:.4;cursor:not-allowed} .tabs{position:sticky;top:44px;z-index:15;display:flex;gap:4px;flex-wrap:wrap;background:rgba(13,17,23,.95);backdrop-filter:blur(7px);border-bottom:1px solid var(--border);padding:9px 0;margin-top:10px} .tab{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--text-2);padding:6px 11px;border-radius:8px;cursor:pointer;border:1px solid transparent;user-select:none}.tab:hover{color:var(--text)}.tab.on{color:var(--accent);border-color:var(--border);background:rgba(0,184,176,.08)} .tabpanel{display:none;background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:18px 20px;margin:14px 0}.tabpanel.on{display:block} .tabpanel h2{font-size:21px;margin-bottom:10px;display:flex;align-items:center;gap:9px}.tabpanel h2 svg{color:var(--accent)}+.viewer{width:100%;height:440px;border:1px solid var(--border);border-radius:8px;background:var(--bg)} .render{width:100%;border-radius:8px;border:1px solid var(--border);background:#fff;overflow:hidden}.render svg{display:block;width:100%;height:auto}-.viewer-cap{display:flex;gap:7px;font-size:12px;color:var(--text-2);margin:6px 0}-table{width:100%;border-collapse:collapse;font-size:13.5px;margin:6px 0}th,td{border-top:1px solid var(--border);padding:7px 9px;text-align:left;vertical-align:top}th{color:var(--text-2);font-weight:600}.k{font-family:'JetBrains Mono';color:#7fe3dd;font-size:12.5px}.ev{white-space:nowrap}-.evlink{color:var(--accent);cursor:pointer;font-family:'JetBrains Mono';font-size:12px}+.viewer-cap{display:flex;gap:7px;font-size:12px;color:var(--text-2);margin:6px 0;align-items:center}.viewer-cap .live{display:inline-flex;align-items:center;gap:5px;color:#7ee2a0}.viewer-cap .live::before{content:"";width:7px;height:7px;border-radius:999px;background:var(--green);box-shadow:0 0 6px var(--green)}+.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media(max-width:720px){.grid2{grid-template-columns:1fr}}+table{width:100%;border-collapse:collapse;font-size:13.5px;margin:6px 0}th,td{border-top:1px solid var(--border);padding:7px 9px;text-align:left;vertical-align:top}th{color:var(--text-2);font-weight:600}.k{font-family:'JetBrains Mono';color:#7fe3dd;font-size:12.5px}.ev{white-space:nowrap}.evlink{color:var(--accent);cursor:pointer;font-family:'JetBrains Mono';font-size:12px} .cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:10px}.dlcard{border:1px solid var(--border);border-radius:8px;padding:11px;background:var(--elevated)}.dlcard .n{font-family:'JetBrains Mono';font-size:12px}.dlcard .d{font-size:11.5px;color:var(--text-3);margin-top:3px} .todonote{display:flex;gap:9px;background:rgba(210,153,34,.07);border:1px solid rgba(210,153,34,.35);border-radius:8px;color:#e3c089;padding:10px 13px;font-size:13px;margin:10px 0}.todonote svg{color:var(--yellow);flex:none}-.ctxrow{display:flex;gap:9px;flex-wrap:wrap;margin-bottom:8px}.ctx{font-size:12.5px;color:var(--text-2);border:1px solid var(--border);border-radius:8px;padding:5px 10px;background:var(--elevated)}.ctx b{color:var(--accent)}+.ctxrow2{display:flex;gap:9px;flex-wrap:wrap;margin-bottom:8px} .provimg{width:100%;border:1px solid var(--border);border-radius:8px;cursor:zoom-in;background:#fff} .cite{font-size:11.5px;color:var(--text-2);border-top:1px dashed var(--border);margin-top:10px;padding-top:8px}.cite b{color:var(--text)} #lb{position:fixed;inset:0;background:rgba(2,6,10,.94);z-index:200;display:none;align-items:center;justify-content:center;flex-direction:column;padding:18px}#lb.on{display:flex}#lb img{max-width:100%;max-height:86vh;border-radius:8px;border:1px solid var(--border)}#lb .cap{color:var(--text-2);font-size:13px;margin-top:10px}#lb .x{position:absolute;top:14px;right:18px;color:#fff;font-size:26px;cursor:pointer} #tip{position:fixed;z-index:99999;background:var(--overlay);border:1px solid var(--border);color:var(--text);font-size:12.5px;padding:6px 9px;border-radius:8px;max-width:240px;pointer-events:none;opacity:0;transition:.18s}#tip.on{opacity:1}-.btn{display:inline-flex;align-items:center;gap:7px;padding:8px 12px;border-radius:8px;font-size:13.5px;font-weight:600;cursor:pointer;border:1px solid var(--border);background:var(--elevated);color:var(--text)}.btn:hover{border-color:var(--accent);color:var(--accent-bright)}.btn.dl{}+.toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%) translateY(20px);background:var(--overlay);border:1px solid var(--accent);color:#cfeee9;padding:11px 16px;border-radius:8px;font-size:14px;opacity:0;transition:.25s;z-index:60;display:flex;gap:9px;max-width:90vw}.toast.on{opacity:1;transform:translateX(-50%)}+ul.r{color:var(--text-2);font-size:14px;padding-left:18px}ul.r li{margin:3px 0} .foot{color:var(--text-3);font-size:12.5px;text-align:center;margin-top:26px} </style></head><body> <div class="hdr"><div class="brand">__IC_CHIP__ Adom Wiki <span class="sub">. Component</span></div><div class="vsep"></div> <span class="nm">__MPN__</span><span class="meta">__PKG__</span>-<div class="actions"><a href="#" data-tip="Open the live wiki page (when published)">__IC_OPEN__</a></div></div>+<div class="actions"><a href="__WIKIURL__" target="_blank" data-tip="Open the live wiki page">__IC_OPEN__</a></div></div> <div class="wrap">-<div class="intro"><div style="display:flex;gap:9px;align-items:center;flex-wrap:wrap"><span class="badge b-type">COMPONENT</span><span class="badge b-cls">__CLS__</span><span class="src" style="margin-left:auto">data-driven from chip-fetcher, standalone preview</span></div>+<div class="intro"><div style="display:flex;gap:9px;align-items:center;flex-wrap:wrap"><span class="badge b-type">COMPONENT</span><span class="badge b-cls">__CLS__</span><span class="src" style="margin-left:auto">data-driven from chip-fetcher</span></div> <h1>__MPN__</h1><p class="lead"><b>__MFR__.</b> __DESC__</p> <div class="legend"><span><span class="dot" style="background:#6fbf8f"></span>real data (chip-fetcher / ds2sf)</span><span><span class="dot" style="background:#e0a06a"></span>mock / not fetched</span><span class="todo">__IC_WARN__ TODO</span></div></div> +__HERO__++<div class="toolbar"><h3>__IC_OPEN__ Open this chip in</h3>+<div class="ctxrow"><span class="ctx">Context: <b>Hydrogen webview</b></span><span class="src mock">mock detector</span><span class="todo">__IC_WARN__ TODO: runtime context detect (HD / native / pup)</span></div>+<div class="lbl">Open directly, any browser / Hydrogen / pup __DIRECTSRC__</div><div class="btns">__DIRECTBTNS__</div>+<div class="lbl">Download CAD <span class="src real">real files</span></div><div class="btns">__DLBTNS__</div>+<div class="lbl">Buy</div><div class="btns">__BUYBTNS__</div>+<div class="lbl">Open in a container tool, tap to copy a Claude prompt</div><div class="btns">+<span class="btn" data-tip="Open the symbol in adom-symbol (SymView)" onclick="cp('open the __MPN__ symbol in adom-symbol')">adom-symbol</span>+<span class="btn" data-tip="Open the footprint in adom-footprint (FpView)" onclick="cp('open the __MPN__ footprint in adom-footprint')">adom-footprint</span>+<span class="btn" data-tip="Generate a Fusion .lbr" onclick="cp('generate a Fusion .lbr for the __MPN__ with adom-lbr')">adom-lbr</span>+<span class="btn" data-tip="Basic 3D viewer" onclick="cp('view the __MPN__ in adom-step')">adom-step</span>+<span class="btn" data-tip="Chip-on-pads fit + pin-1" onclick="cp('check the __MPN__ fit in adom-chipfit')">adom-chipfit</span>+<span class="btn" data-tip="STEP-native validation" onclick="cp('validate the __MPN__ in adom-chipsmith')">adom-chipsmith</span>+<span class="btn" data-tip="Open in chip-fetcher" onclick="cp('open the __MPN__ in chip-fetcher')">chip-fetcher</span>+<span class="btn" data-tip="Render via the shared headless KiCad service" onclick="cp('render the __MPN__ with service-kicad')">Adom KiCad viewer</span></div>+<div class="lbl">Open on your desktop, via adom-desktop</div><div class="btns">+<span class="btn" data-tip="Open in KiCad on your laptop" onclick="cp('open the __MPN__ in KiCad on my desktop')">KiCad __IC_OPEN14__</span>+<span class="btn" data-tip="Open in Fusion 360 on your laptop" onclick="cp('open the __MPN__ in Fusion 360 on my desktop')">Fusion 360 __IC_OPEN14__</span>+<span class="btn dis" data-tip="No adom-desktop verb yet">Altium</span><span class="btn dis" data-tip="No adom-desktop verb yet">OrCAD</span>+<span class="btn" data-tip="Send the library to Downloads and open the folder" onclick="cp('send the __MPN__ library to my Downloads folder and open it')">Send to Downloads</span>+<span class="btn dis" data-tip="Component Ocean is a distributor, not an Adom tool">Component Ocean</span></div>+<div class="todonote">__IC_WARN__<div><b>TODO, make this one-click.</b> No page to desktop bridge yet (and the wiki strips page JS), so tool / desktop buttons copy a paste-into-Claude prompt. Needs an injected window.adomDesktop bridge, context detection, endpoint enumeration, a reveal-folder verb, and Altium / OrCAD verbs.</div></div></div>+ <div class="tabs" id="tabs">-<span class="tab on" data-t="symbol" onclick="T('symbol')">__IC_SYM__ Symbol</span><span class="tab" data-t="fp" onclick="T('fp')">__IC_FP__ Footprint</span><span class="tab" data-t="d3" onclick="T('d3')">__IC_CUBE__ 3D</span><span class="tab" data-t="pins" onclick="T('pins')">__IC_GRID__ Pins</span><span class="tab" data-t="specs" onclick="T('specs')">__IC_LIST__ Specs</span><span class="tab" data-t="src" onclick="T('src')">__IC_DOLLAR__ Sourcing</span><span class="tab" data-t="prov" onclick="T('prov')">__IC_SHIELD__ Provenance</span><span class="tab" data-t="dl" onclick="T('dl')">__IC_DL__ Downloads</span>+<span class="tab on" data-t="symbol" onclick="T('symbol')">__IC_SYM__ Symbol</span><span class="tab" data-t="fp" onclick="T('fp')">__IC_FP__ Footprint</span><span class="tab" data-t="d3" onclick="T('d3')">__IC_CUBE__ 3D</span><span class="tab" data-t="pins" onclick="T('pins')">__IC_GRID__ Pins</span><span class="tab" data-t="specs" onclick="T('specs')">__IC_LIST__ Specs</span><span class="tab" data-t="src" onclick="T('src')">__IC_DOLLAR__ Sourcing</span><span class="tab" data-t="tr" onclick="T('tr')">__IC_BOX__ Tape and reel</span><span class="tab" data-t="res" onclick="T('res')">__IC_BUILD__ Resources</span><span class="tab" data-t="var" onclick="T('var')">__IC_LAYERS__ Variants</span><span class="tab" data-t="rel" onclick="T('rel')">__IC_LINK__ Related</span><span class="tab" data-t="prov" onclick="T('prov')">__IC_SHIELD__ Provenance</span><span class="tab" data-t="dl" onclick="T('dl')">__IC_DL__ Downloads</span> </div> -<div class="tabpanel on" id="symbol"><h2>__IC_SYM__ Schematic Symbol</h2><div class="viewer-cap"><span class="src real">adom-symbol render (chip-thumbnailer)</span></div><div class="render">__SYM__</div></div>-<div class="tabpanel" id="fp"><h2>__IC_FP__ Footprint</h2><div class="viewer-cap"><span class="src real">adom-footprint render</span><span>pin 1 = square pad, top left</span></div><div class="render">__FP__</div></div>-<div class="tabpanel" id="d3"><h2>__IC_CUBE__ 3D Model</h2><p style="color:var(--text-2);font-size:14px">__GLBNOTE__ The live wiki page renders an interactive Babylon viewer from the GLB.</p></div>-<div class="tabpanel" id="pins"><h2>__IC_GRID__ Pin map <span class="src real" style="font-size:12px;font-weight:400">__PINCOUNT__ pins, ds2sf extracted</span></h2><table><tr><th>Name</th><th>No.</th><th>Description</th><th class="ev">Cite</th></tr>__PINS__</table></div>-<div class="tabpanel" id="specs"><h2>__IC_LIST__ Specifications <span class="src real" style="font-size:12px;font-weight:400">class-aware</span></h2><table>__SPECS__</table><div class="cite"><b>Source:</b> info.json + datasheet. Parsed fields are best-effort from the description; full parametric pull is a TODO.</div></div>+<div class="tabpanel on" id="symbol"><h2>__IC_SYM__ Schematic Symbol</h2>__SYMVIEW__</div>+<div class="tabpanel" id="fp"><h2>__IC_FP__ Footprint and solder paste</h2>__FPVIEW__+<div class="grid2" style="margin-top:12px"><div><p style="font-weight:600;font-family:'Familjen Grotesk'">InstaPCB solder paste</p><p style="color:var(--text-2);font-size:13.5px">Fine-pitch packages get paste as a micro-dot aperture array (not full pads) to cut bridging. Default lead-free (SAC305); leaded selectable. Toggle the Solder blobs layer in the viewer.</p><div class="btns" style="margin-top:8px"><span class="btn" data-tip="Preview leaded" onclick="cp('preview leaded paste for __MPN__')">Leaded</span><span class="btn go">Lead-free</span></div></div><div class="todonote">__IC_WARN__<div><b>TODO:</b> leaded vs lead-free switch + bridging-risk heatmap in FpView. Report bridging in Discussions.</div></div></div></div>+<div class="tabpanel" id="d3"><h2>__IC_CUBE__ 3D Model</h2>__3DVIEW__</div>+<div class="tabpanel" id="pins"><h2>__IC_GRID__ Pin map <span class="src real" style="font-size:12px;font-weight:400">__PINCOUNT__ pins, ds2sf extracted</span></h2><table><tr><th>Name</th><th>No.</th><th>Description</th><th class="ev">Cite</th></tr>__PINS__</table><div class="cite"><b>Pinout source:</b> ds2sf extraction. Click a page number to see the cited datasheet page.</div></div>+<div class="tabpanel" id="specs"><h2>__IC_LIST__ Specifications <span class="src real" style="font-size:12px;font-weight:400">class-aware (__CLS__)</span></h2><table>__SPECS__</table><div class="cite"><b>Source:</b> info.json + datasheet. Parsed fields are best-effort; full parametric pull is a TODO.</div></div> <div class="tabpanel" id="src"><h2>__IC_DOLLAR__ Sourcing and availability</h2>__SRC__</div>+<div class="tabpanel" id="tr"><h2>__IC_BOX__ Tape and reel, pick and place</h2><ul class="r"><li>__REELNOTE__ <span class="src real">from MPN suffix</span></li><li>EIA-481 carrier; pocket referenced to sprocket holes (4.0 mm feed pitch); pin 1 conventionally Quadrant 1. <span class="todo">__IC_WARN__ TODO: embed the manufacturer tape-and-reel drawing + reel qty</span></li><li>MSL (moisture sensitivity) 1 to 6, state floor life. <span class="src mock">confirm per part</span></li><li>Pin-1 / zero orientation: IPC-7351 puts pin 1 top-left; IEC 61188-7 bottom-left. The footprint marks pin 1 with a square pad. Validate with adom-chipfit.</li></ul></div>+<div class="tabpanel" id="res"><h2>__IC_BUILD__ Manufacturer and resources <span class="src real" style="font-size:12px;font-weight:400">__MFR__</span></h2>__RESOURCES__</div>+<div class="tabpanel" id="var"><h2>__IC_LAYERS__ Variants</h2>__VARIANTS__</div>+<div class="tabpanel" id="rel"><h2>__IC_LINK__ Related</h2>__RELATED__</div> <div class="tabpanel" id="prov"><h2>__IC_SHIELD__ Provenance</h2><div class="src" style="margin-bottom:10px">Every datapoint traces to a source. Click any citation or page to enlarge the datasheet page.</div> <table><tr><th>Datasheet</th><td>__DSPAGES__ pages, sha256 <span class="mono">__DSSHA__</span></td></tr><tr><th>Extracted by</th><td class="mono">__TOOL__</td></tr></table> <h3 style="font-size:15px;margin:14px 0 4px">Dimension provenance (footprint)</h3><table><tr><th>Field</th><th>Value</th><th>Figure</th><th class="ev">Cite</th></tr>__DIMS__</table>-<h3 style="font-size:15px;margin:14px 0 4px">Review flags (ds2sf honest uncertainty)</h3><ul style="color:var(--text-2);font-size:13px;padding-left:18px">__REVIEW__</ul>-<div class="todonote">__IC_WARN__<div>Per-pin citations are in the Pins tab (click a page number). ds2sf refuses any datasheet without a pinout, so a refusal means we need a fuller PDF, not a fabricated answer.</div></div>-__PROVIMGS__</div>-<div class="tabpanel" id="dl"><h2>__IC_DL__ CAD downloads <span class="src real" style="font-size:12px;font-weight:400">real files</span></h2><div class="cards">__CAD__</div></div>+<h3 style="font-size:15px;margin:14px 0 4px">Review flags (ds2sf honest uncertainty)</h3><ul class="r">__REVIEW__</ul>+<div class="todonote">__IC_WARN__<div>Per-pin citations are in the Pins tab. ds2sf refuses any datasheet without a pinout, so a refusal means we need a fuller PDF, not a fabricated answer.</div></div>__PROVIMGS__</div>+<div class="tabpanel" id="dl"><h2>__IC_DL__ CAD downloads <span class="src real" style="font-size:12px;font-weight:400">real files</span></h2><div class="cards">__CAD__</div><p class="src" style="margin-top:10px">CAD via Ultra Librarian / chip-fetcher; GLB by service-step2glb; .lbr by adom-lbr.</p></div> -<div class="foot">Adom Wiki, component page, data-driven from chip-fetcher. Real data + ds2sf provenance; class-aware specs. Tabs, tooltips, and citation lightbox are live.</div>+<div class="foot">Adom Wiki, component page, data-driven from chip-fetcher. Real data + ds2sf provenance; class-aware specs; Open-in toolbar; tabs, tooltips, and citation lightbox live.</div> </div> <div id="lb"><span class="x" onclick="document.getElementById('lb').classList.remove('on')">✕</span><img alt="source page"><div class="cap"></div></div>-<div id="tip"></div>+<div id="tip"></div><div class="toast" id="toast"></div> <script> __EVJS__ function T(id){document.querySelectorAll('.tabpanel').forEach(p=>p.classList.toggle('on',p.id===id));document.querySelectorAll('.tab').forEach(t=>t.classList.toggle('on',t.dataset.t===id));var y=document.getElementById('tabs').getBoundingClientRect().top+window.scrollY-50;window.scrollTo({top:y,behavior:'smooth'})} function LB(src,cap){var l=document.getElementById('lb');l.querySelector('img').src=src;l.querySelector('.cap').textContent=cap||'';l.classList.add('on')} document.getElementById('lb').addEventListener('click',function(e){if(e.target.id==='lb')this.classList.remove('on')});+function cp(t){try{navigator.clipboard.writeText(t)}catch(e){}var x=document.getElementById('toast');x.textContent='Copied. Paste into Claude Code: '+t;x.classList.add('on');clearTimeout(window._t);window._t=setTimeout(()=>x.classList.remove('on'),2600)} var tip=document.getElementById('tip'),tmr;-document.addEventListener('mouseover',function(e){var el=e.target.closest('[data-tip]');if(!el)return;clearTimeout(tmr);tmr=setTimeout(function(){tip.textContent=el.getAttribute('data-tip');var r=el.getBoundingClientRect();tip.style.left=Math.min(r.left,innerWidth-250)+'px';tip.style.top=(r.bottom+8)+'px';tip.classList.add('on')},600)});-document.addEventListener('mouseout',function(e){if(e.target.closest('[data-tip]')){clearTimeout(tmr);tip.classList.remove('on')}});-</script>-</body></html>+document.addEventListener('mouseover',e=>{var el=e.target.closest('[data-tip]');if(!el)return;clearTimeout(tmr);tmr=setTimeout(()=>{tip.textContent=el.getAttribute('data-tip');var r=el.getBoundingClientRect();tip.style.left=Math.min(r.left,innerWidth-250)+'px';tip.style.top=(r.bottom+8)+'px';tip.classList.add('on')},600)});+document.addEventListener('mouseout',e=>{if(e.target.closest('[data-tip]')){clearTimeout(tmr);tip.classList.remove('on')}});+</script></body></html>