← Commit history
Cargo.lock+1−1
@@ -4,7 +4,7 @@ version = 4  [[package]] name = "adom-footprint"-version = "1.0.25"+version = "1.0.26" dependencies = [  "anyhow",  "clap",
Cargo.toml+1−1
@@ -1,6 +1,6 @@ [package] name = "adom-footprint"-version = "1.0.25"+version = "1.0.26" edition = "2021" description = "Create, preview, lint, and deliver KiCad footprints (.kicad_mod) with interactive FpView viewer" 
SKILL.md+2−2
@@ -79,13 +79,13 @@ The interactive HTML5 footprint viewer includes: - Pad hover highlighting (teal #00b8b1) - Rich tooltips: pad number, name, size, shape, layer - Toggle layers: Grid, Solder blobs, Labels-- Solder blob visualization (300um dots at 0.25mm pitch for InstaPCB jetting)+- Solder blob visualization (300um dots at 0.25mm pitch for 3rd party fab jetting) - Sticky click-to-pin tooltips - Cursor coordinates (mm)  ## Lint checks -The linter validates against KiCad and InstaPCB design rules:+The linter validates against KiCad and 3rd party fab design rules: - Courtyard present and 0.25mm minimum clearance - Fabrication outline on F.Fab layer - Pin 1 marker on silkscreen
VERSION+1−1
@@ -1 +1 @@-1.0.25+1.0.26
bin/adom-footprint
⋯ 1 unchanged line ⋯
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-footprint",-  "version": "1.0.25",+  "version": "1.0.26",   "type": "app",   "description": "KiCad footprint creator with layer HUD viewer and delivery to KiCad/Fusion 360",   "dependencies": {
page.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-footprint",-  "version": "1.0.25",+  "version": "1.0.26",   "type": "app",   "description": "KiCad footprint creator with layer HUD viewer and delivery to KiCad/Fusion 360",   "dependencies": {
src/fp_render.rs+1−1
@@ -4,7 +4,7 @@ //! silkscreen, drill holes and pad numbers come back and the colours are exact: //!   Courtyard #FF26E2 (magenta, dashed) · Fab #6e7681 (grey) · Silk #00cccc //!   (cyan) · Copper pads #C83434/#ef5350 (red) · Drill dark w/ #666 ring · white-//!   pad numbers. Paste apertures + the InstaPCB dots layer on top of all of it.+//!   pad numbers. Paste apertures + the paste dots layer on top of all of it.  use regex::Regex; use std::fmt::Write as _;
src/main.rs+1−1
@@ -67,7 +67,7 @@ enum Cmd {         write: bool,     },     /// Export a self-contained, INTERACTIVE HTML package (pan/zoom + a Layers-    /// panel with the InstaPCB paste-dot overlay) for embedding in an iframe —+    /// panel with the paste-dot overlay) for embedding in an iframe —     /// e.g. a wiki component page. No server, no external assets.     Embed {         #[arg(long)]
src/paste.rs+1−1
@@ -94,7 +94,7 @@ pub fn paste_apertures(kicad_mod: &str) -> Vec<Aperture> {             let has_paste = block.contains("F.Paste") || !block.contains("(layers"); // default smd → paste             // The exposed thermal pad still gets jetted paste (in the via gaps) even             // when the source omits F.Paste — the paddle needs solder to bond, and-            // Adom jets paste directly (no stencil), so F.Paste in the file isn't a+            // the 3rd party fab jets paste directly (no stencil), so F.Paste in the file isn't a             // prerequisite. Matches the exposed-pad test in heatsink_vias().             let square = { let r = w / h.max(0.001); (0.6..=1.67).contains(&r) };             let is_exposed_pad = w.min(h) >= 1.8 && square;
src/render.rs+5−5
@@ -21,10 +21,10 @@ const OY: f64 = 105.0; const MARGIN: f64 = 1.0;  /// Render the footprint to a themed SVG, cropped to `bbox` (footprint-local mm).-/// CLEAN by default — NO InstaPCB paste-dot overlay. John's standing rule: the+/// CLEAN by default — NO paste-dot overlay. John's standing rule: the /// default footprint render (cards, thumbnails, preview, the live app's initial-/// view) must show the bare footprint; the InstaPCB paste layer is opt-in. Use-/// `render_footprint_svg_with_paste` only where InstaPCB is the point (`embed`).+/// view) must show the bare footprint; the paste layer is opt-in. Use+/// `render_footprint_svg_with_paste` only where paste is the point (`embed`). pub fn render_footprint_svg(kicad_mod: &str, _bbox: (f64, f64, f64, f64)) -> Result<String> {     let normalized = normalize_legacy(kicad_mod);     let fp = crate::fp_render::parse(&normalized);@@ -32,8 +32,8 @@ pub fn render_footprint_svg(kicad_mod: &str, _bbox: (f64, f64, f64, f64)) -> Res     Ok(svg) } -/// Same render, PLUS the InstaPCB paste apertures + 300 µm jetted-dot overlay.-/// Only the `embed` flow (the interactive InstaPCB layer panel) uses this.+/// Same render, PLUS the paste apertures + 300 µm jetted-dot overlay.+/// Only the `embed` flow (the interactive paste layer panel) uses this. pub fn render_footprint_svg_with_paste(kicad_mod: &str, _bbox: (f64, f64, f64, f64)) -> Result<String> {     let normalized = normalize_legacy(kicad_mod);     let fp = crate::fp_render::parse(&normalized);
src/server.rs+1−1
@@ -373,7 +373,7 @@ fn route(method: &Method, url: &str, body: &str) -> Response<std::io::Cursor<Vec                         .map(String::from)                         .or_else(|| crate::first_footprint_name(km))                         .unwrap_or_else(|| "footprint".to_string());-                    // Bake the paste group so the live Layers panel's InstaPCB+                    // Bake the paste group so the live Layers panel's paste                     // toggle can show/hide it — but the client defaults it OFF                     // (app.html: paste-dots is opt-in), so the initial view is clean.                     match crate::render::render_footprint_svg_with_paste(km, crate::bbox_from_mod(km)) {