app
Parts Search
Public Made by Adomby adom
One search box across Mouser, DigiKey and JLCPCB: parallel queries, side-by-side product photos, and a Mouser-preferred recommendation that reasons around stock and lead time.
← Commit history
v1.4.3: Panel heading spans the panel; the demo button is filled again
6 files changed
+30−106
Cargo.lock+1−1@@ -10,7 +10,7 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "adom-parts-search"-version = "1.4.2"+version = "1.4.3" dependencies = [ "base64", "clap",
Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "adom-parts-search"-version = "1.4.2"+version = "1.4.3" edition = "2021" description = "Parts Search Electronics component search — CLI, backend HTTP service, and Hydrogen webview app" license = "MIT"
VERSION+1−1@@ -1 +1 @@-1.4.2+1.4.3
package.json+1−40@@ -38,44 +38,5 @@ "SKILL.md", "BUILD-SKILL.md", "CHANGELOG.md"- ],- "changelog": "Panel heading spans the panel; the demo button is filled again",- "discovery_triggers": [- "parts search",- "find part",- "source component",- "source part",- "compare distributors",- "compare vendors",- "Mouser or DigiKey",- "BOM sourcing",- "price this part",- "where can I get",- "check stock",- "parts availability",- "fastest delivery",- "cheapest part",- "component search",- "part lookup",- "price breaks"- ],- "discovery_pitch": "Search Mouser, DigiKey and JLCPCB in parallel with product photos; Mouser-preferred best-source pick. Say 'with parts search' to your AI.",- "sample_prompts": [- {- "label": "source an STM32F103RBT6",- "prompt": "source an STM32F103RBT6"- },- {- "label": "where can I get an ESP32-S3-WROOM cheape",- "prompt": "where can I get an ESP32-S3-WROOM cheapest and fastest"- },- {- "label": "compare Mouser, DigiKey and JLCPCB for a",- "prompt": "compare Mouser, DigiKey and JLCPCB for an LM555"- },- {- "label": "price this BOM across distributors",- "prompt": "price this BOM across distributors"- } ]-}+}
page.json+8−49@@ -33,25 +33,13 @@ }, "hero": { "type": "image",- "path": "screenshots/hero.png"+ "path": "docs/hero.png" }, "sample_prompts": [- {- "label": "source an STM32F103RBT6",- "prompt": "source an STM32F103RBT6"- },- {- "label": "where can I get an ESP32-S3-WROOM cheape",- "prompt": "where can I get an ESP32-S3-WROOM cheapest and fastest"- },- {- "label": "compare Mouser, DigiKey and JLCPCB for a",- "prompt": "compare Mouser, DigiKey and JLCPCB for an LM555"- },- {- "label": "price this BOM across distributors",- "prompt": "price this BOM across distributors"- }+ "source an STM32F103RBT6",+ "where can I get an ESP32-S3-WROOM cheapest and fastest",+ "compare Mouser, DigiKey and JLCPCB for an LM555",+ "price this BOM across distributors" ], "discovery_triggers": [ "parts search",@@ -66,41 +54,12 @@ "where can I get", "check stock", "parts availability",- "fastest delivery",- "cheapest part",- "component search",- "part lookup",- "price breaks"+ "fastest delivery" ],- "discovery_pitch": "Search Mouser, DigiKey and JLCPCB in parallel with product photos; Mouser-preferred best-source pick. Say 'with parts search' to your AI.",+ "discovery_pitch": "Search Mouser + DigiKey + JLCPCB in parallel from one interface, with product photos and a Mouser-preferred best-source pick.", "metadata": { "platform": "linux" }, "category": "tools",- "org": "adom",- "description": "One search box across Mouser, DigiKey and JLCPCB. Parallel queries, side-by-side product photos, and a Mouser-preferred recommendation that reasons around stock and lead time. Dock Bar ready: serve, health, settings, Say it.",- "dependencies": {- "adom/adom-mouser": "*",- "adom/adom-digikey": "*",- "adom/adom-jlcpcb": "*"- },- "needs_sudo": false,- "scripts": {- "install": "./install.sh",- "uninstall": "./uninstall.sh"- },- "files": [- "bin/**",- "skills/**",- "docs/icon.svg",- "dockbar.json",- "install.sh",- "uninstall.sh",- "package.json",- "README.md",- "SKILL.md",- "BUILD-SKILL.md",- "CHANGELOG.md"- ],- "changelog": "Panel heading spans the panel; the demo button is filled again"+ "org": "adom" }
src/app/ui.html+18−14@@ -94,20 +94,24 @@ main>:first-child{margin-top:0} /* The newbie panel: ONE full-width band, a SIBLING of the app body (never inside the app grid, or it stays a column however wide you style it). Two columns: the demo button alone on the left, the prompts table right. */-.say{margin:0 0 16px;position:relative;display:grid;grid-template-columns:clamp(180px,30%,220px) 1fr;gap:24px;background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:16px 44px 16px 16px;animation:fadein .25s ease}+.say{margin:0 0 16px;position:relative;display:grid;grid-template-columns:clamp(180px,30%,220px) 1fr;grid-template-areas:"head head" "left right";gap:16px 24px;background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:16px 44px 16px 16px;animation:fadein .25s ease} .say[hidden]{display:none}-.say-left{display:flex;align-items:flex-start;border-right:1px solid var(--border);padding-right:24px;margin-right:-24px}-.say-right{min-width:0}+.say-left{grid-area:left;display:flex;align-items:flex-start;border-right:1px solid var(--border);padding-right:24px;margin-right:-24px}+.say-right{grid-area:right;min-width:0}+.say-head{grid-area:head}+.say-head{grid-area:head;min-width:0} .say-head h2{font:600 15px var(--brand-heading);color:var(--text);margin:0}-.say-sub{color:var(--text-2);font-size:13.5px;margin:4px 0 10px;max-width:70ch}+.say-sub{color:var(--text-2);font-size:13.5px;margin:4px 0 0;max-width:70ch} .say-sub b{color:var(--text);font-weight:600} .say-close{position:absolute;top:10px;right:10px;width:28px;height:28px;color:var(--text-2)} .say-close svg{width:16px;height:16px} /* The demo button is the panel's ONLY filled button. */-.demo-btn{background:var(--accent);border-color:var(--accent);color:var(--on-accent);border-radius:8px;padding:10px 18px;font:600 14px var(--brand-heading);gap:8px;min-height:auto;box-shadow:none}-.demo-btn:hover{background:var(--accent-hover);border-color:var(--accent-hover)}-.demo-btn svg{width:16px;height:16px}-.demo-btn:disabled{opacity:.6;cursor:progress}+.say .say .demo-btn{background:var(--accent);border-color:var(--accent);color:var(--on-accent);border-radius:8px;padding:10px 18px;font:600 14px var(--brand-heading);gap:8px;min-height:auto;box-shadow:none}+.say .say .demo-btn:hover{background:var(--accent-hover);border-color:var(--accent-hover)}+.say .demo-btn:active{background:#009d97;border-color:#009d97}+.say .demo-btn:active{background:#009d97;border-color:#009d97}+.say .say .demo-btn svg{width:16px;height:16px}+.say .say .demo-btn:disabled{opacity:.6;cursor:progress} /* Prompts are a TABLE, not pills: phrases differ in length, so pills go ragged and the eye reads the boxes instead of the words. The action cell tracks the PHRASE (max-content), so the icons never strand at the window edge. */@@ -394,9 +398,9 @@ select.sel:disabled{opacity:.5;cursor:not-allowed} pane band is ~744-853px, so collapsing any higher would hide the two-column layout in the exact pane it exists for. 744px is in the test matrix. */ @media (max-width:620px){- .say{grid-template-columns:1fr;gap:14px;padding:14px 40px 14px 14px}+ .say{grid-template-columns:1fr;grid-template-areas:"head" "left" "right";gap:14px;padding:14px 40px 14px 14px} .say-left{border-right:none;border-bottom:1px solid var(--border);padding:0 0 14px;margin:0}- .say-left .demo-btn{width:100%;justify-content:center;min-height:44px}+ .say .demo-btn{width:100%;justify-content:center;min-height:44px} } /* ---- Responsive: reshape, do not shrink ---- */@@ -455,14 +459,14 @@ select.sel:disabled{opacity:.5;cursor:not-allowed} <div class="app-body" id="appBody"> <main> <section class="say" id="say" aria-labelledby="sayTitle" hidden>+ <div class="say-head">+ <h2 id="sayTitle">Say it</h2>+ <p class="say-sub">You never need this page's buttons: just tell your AI what you want, using the words <b>parts search</b>. Copy a phrase, or send it straight to a new AI thread.</p>+ </div> <div class="say-left"> <button class="btn demo-btn" id="btnDemo" data-tooltip="A two-minute narrated walk through the whole page: the prompts, a live search across all three vendors, the best-source banner, Settings, and the health lights."><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 4.8v14.4a.6.6 0 0 0 .92.5l11.3-7.2a.6.6 0 0 0 0-1l-11.3-7.2a.6.6 0 0 0-.92.5z"/></svg>Play the 2-minute demo</button> </div> <div class="say-right">- <div class="say-head">- <h2 id="sayTitle">Say it</h2>- <p class="say-sub">You never need this page's buttons: just tell your AI what you want, using the words <b>parts search</b>. Copy a phrase, or send it straight to a new AI thread.</p>- </div> <div class="say-table" id="sayList" role="list"></div> </div> <button class="iconbtn say-close" id="sayClose" aria-label="Close the prompts panel" data-tooltip="Close this panel. The question mark in the header brings it back, and your choice is remembered."><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg></button>