← Commit history

Publish 1.0.84

John Lauer ·5429d313ea ·1mo ago ·parent 6855485
4 files changed +30−5
dashboard/kicad_dashboard.py+7−1
@@ -49,7 +49,7 @@ from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from pathlib import Path from urllib.parse import unquote, urlparse -VERSION = "3.4.2"+VERSION = "3.5.0" AI_THREAD = "kicad-dashboard" DEFAULT_PORT = 8931 UI_DIR = Path(__file__).resolve().parent / "ui"@@ -112,6 +112,7 @@ def _hydrogen_control_url():   LAST_VIEWPORT = {}+VIEWPORT_LOG = [] MIN_SHELL_VERSION = (1, 0, 142)   # the build that fixed the run-prompt kill  @@ -1160,6 +1161,9 @@ class Handler(BaseHTTPRequestHandler):             return self._send(200, mime, f.read_bytes(),                               {"Cache-Control": "no-cache"})         if path.endswith("/api/viewport"):+            if "matrix" in (urlparse(self.path).query or ""):+                return self._json({"reports": sorted(VIEWPORT_LOG,+                                                     key=lambda r: r.get("innerWidth") or 0)})             return self._json(LAST_VIEWPORT or {"note": "no page has reported a viewport yet"})         if path == "/console":             with _console_lock:@@ -1223,6 +1227,8 @@ class Handler(BaseHTTPRequestHandler):             global LAST_VIEWPORT             LAST_VIEWPORT = dict(body or {})             LAST_VIEWPORT["at"] = time.strftime("%H:%M:%S")+            VIEWPORT_LOG.append(dict(LAST_VIEWPORT))+            del VIEWPORT_LOG[:-16]             log(f"viewport {LAST_VIEWPORT.get('innerWidth')}px cols={LAST_VIEWPORT.get('panelCols')}")             return self._json({"ok": True})         if path.endswith("/api/say-send"):
dashboard/ui/index.html+21−2
@@ -26,7 +26,26 @@ body{background:var(--bg);color:var(--text-body);font:15px/1.5 'Satoshi',sans-se ::-webkit-scrollbar-thumb:hover{background:rgba(0,184,177,.55);background-clip:padding-box} ::-webkit-scrollbar-corner{background:transparent} body{overflow-x:hidden}          /* the page never scrolls horizontally */-header{height:44px;display:flex;align-items:center;gap:12px;padding:0 16px;margin:0;border-radius:0;background:var(--surface);border-bottom:1px solid var(--border)}+header{height:44px;display:flex;align-items:center;gap:12px;padding:0 16px;margin:0;border-radius:0;background:var(--surface);border-bottom:1px solid var(--border);overflow:hidden}+/* The header was the ONLY thing overflowing narrow panes: measured at a real+   236px surface the nowrap brand + target chip + four ghost buttons pushed+   scrollWidth to 410. Everything below the header already fitted. So the bar+   shrinks: brand ellipsises, the chip caps and ellipsises, the buttons never+   shrink (they are the controls), and the subtitle drops out first. */+.brand{min-width:0;overflow:hidden;text-overflow:ellipsis}+.brand svg{flex:none}+.actions{flex:none}+.target-chip{min-width:0;max-width:38vw;overflow:hidden}+.target-chip #chipName{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}+@media (max-width:620px){+  .brand .sub{display:none}+  .target-chip{max-width:30vw}+}+@media (max-width:420px){+  header{gap:8px;padding:0 10px}+  .vsep{display:none}+  .target-chip{max-width:26vw}+} .brand{display:flex;align-items:center;gap:8px;font:600 15px var(--sans);color:var(--text);white-space:nowrap;cursor:default} .brand img{width:18px;height:18px;border-radius:4px;display:block} .vsep{width:1px;height:20px;background:var(--border)}@@ -298,7 +317,7 @@ main a:hover{border-bottom-color:var(--accent)} <header>   <div class="brand" id="brand" tabindex="0">     <svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="flex:none"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="M7.5 15.5H9.5L16.5 8.5"/><circle cx="7.5" cy="15.5" r="2.5"/><circle cx="16.5" cy="8.5" r="2.5"/></svg>-    KiCad Dashboard <span style="color:var(--text-2);font-weight:400">&middot; the KiCad bridge</span>+    KiCad Dashboard <span class="sub" style="color:var(--text-2);font-weight:400">&middot; the KiCad bridge</span>   </div>   <div class="vsep"></div>   <!-- dash-header: the standard target chip (which box answers), LED inside;
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "kicad-bridge",-  "version": "1.0.83",+  "version": "1.0.84",   "type": "app",   "description": "Skills for your container so your AI knows how to drive the KiCad bridge. The bridge runtime itself is the release zip; Adom Bridge loads that.",   "tags": [
page.json+1−1
@@ -4,7 +4,7 @@   "slug": "kicad-bridge",   "title": "KiCad - the KiCad Bridge",   "brief": "Reference implementation of the KiCad bridge — multi-instance Python server, forward path via kicad-cli, reverse path via in-process plugin. Most complex of the three bundled bridges.",-  "version": "1.0.83",+  "version": "1.0.84",   "tags": [     "kicad",     "pcb",