@tscircuit/runframe 0.0.1003 → 0.0.1004

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5298,7 +5298,7 @@ ${A}
5298
5298
  \`\`\`
5299
5299
  ${P.type}: ${k}
5300
5300
  \`\`\``}m(I,$)},children:[ye.jsx(Q0e,{className:"rf-w-4 rf-h-4"}),"Report Issue"]})]})]})};function F_n(t,e,n){const{transform:i,shouldDrawErrors:r}=n;if(!r)return[];const{pcb_port_ids:o}=t,s=e.find(h=>h.type==="pcb_port"&&h.pcb_port_id===o?.[0]),a=e.find(h=>h.type==="pcb_port"&&h.pcb_port_id===o?.[1]);if(!s||!a){const f=t.message?.match(/pcb_via\[#?(pcb_via_\d+)\]/)?.[1],m=e.find(y=>y.type==="pcb_via"&&y.pcb_via_id===f);if(m&&m.type==="pcb_via")return B_n(t,m,n);if(t.center){const y=Yt(i,{x:t.center.x,y:t.center.y});return[{name:"rect",type:"element",attributes:{x:(y.x-5).toString(),y:(y.y-5).toString(),width:"10",height:"10",fill:"red",transform:`rotate(45 ${y.x} ${y.y})`},children:[],value:""},{name:"text",type:"element",attributes:{x:y.x.toString(),y:(y.y-15).toString(),fill:"red","font-family":"sans-serif","font-size":"12","text-anchor":"middle"},children:[{type:"text",value:t.message||"Pcb Trace Error",name:"",attributes:{},children:[]}],value:""}]}else return[]}const c=Yt(i,{x:s.x,y:s.y}),l=Yt(i,{x:a.x,y:a.y}),u={x:(c.x+l.x)/2,y:(c.y+l.y)/2};return isNaN(c.x)||isNaN(c.y)||isNaN(l.x)||isNaN(l.y)||isNaN(u.x)||isNaN(u.y)?[]:[{name:"line",type:"element",attributes:{x1:c.x.toString(),y1:c.y.toString(),x2:u.x.toString(),y2:u.y.toString(),stroke:"red","stroke-width":"1.5","stroke-dasharray":"2,2"},children:[],value:""},{name:"line",type:"element",attributes:{x1:u.x.toString(),y1:u.y.toString(),x2:l.x.toString(),y2:l.y.toString(),stroke:"red","stroke-width":"1.5","stroke-dasharray":"2,2"},children:[],value:""},{name:"rect",type:"element",attributes:{x:(u.x-5).toString(),y:(u.y-5).toString(),width:"10",height:"10",fill:"red",transform:`rotate(45 ${u.x} ${u.y})`},children:[],value:""},{name:"text",type:"element",attributes:{x:u.x.toString(),y:(u.y-15).toString(),fill:"red","font-family":"sans-serif","font-size":"12","text-anchor":"middle"},children:[{type:"text",value:t.message||"Pcb Trace Error",name:"",attributes:{},children:[]}],value:""}]}function B_n(t,e,n){const{transform:i}=n;if(t.center&&e){const r=Yt(i,{x:t.center.x,y:t.center.y}),o=Yt(i,{x:e.x,y:e.y}),s=o.x-r.x,a=o.y-r.y,c=Math.sqrt(s*s+a*a),l=Math.atan2(a,s)*180/Math.PI,d=c+10*2,h=20,f=(r.x+o.x)/2,m=(r.y+o.y)/2;return[{name:"rect",type:"element",attributes:{x:(f-d/2).toString(),y:(m-h/2).toString(),width:d.toString(),height:h.toString(),fill:"none",stroke:"red","stroke-width":"1","stroke-dasharray":"3,2",transform:`rotate(${l} ${f} ${m})`},children:[],value:""},{name:"rect",type:"element",attributes:{x:(f-5).toString(),y:(m-5).toString(),width:"10",height:"10",fill:"red",transform:`rotate(45 ${f} ${m})`},children:[],value:""},{name:"text",type:"element",attributes:{x:f.toString(),y:(m-h/2-5).toString(),fill:"red","font-family":"sans-serif","font-size":"12","text-anchor":"middle"},children:[{type:"text",value:t.message||"Pcb Trace Error",name:"",attributes:{},children:[]}],value:""}]}return[]}function U_n(t,e){const{transform:n,layer:i}=e;if(!t.route||!Array.isArray(t.route))return[];const r=t.route[0],o=t.route[t.route.length-1],s=r.x===o.x&&r.y===o.y,a=t.route.slice(0,s?-1:void 0).map((c,l)=>{const[u,d]=Yt(n,[c.x,c.y]);return l===0?`M ${u} ${d}`:`L ${u} ${d}`}).join(" ")+(s?" Z":"");return[{name:"path",type:"element",attributes:{class:"pcb-fabrication-note-path",stroke:t.color||"rgba(255,255,255,0.5)",fill:"none",d:a,"stroke-width":(t.stroke_width*Math.abs(n.a)).toString(),"data-pcb-component-id":t.pcb_component_id,"data-pcb-fabrication-note-path-id":t.pcb_fabrication_note_path_id},value:"",children:[]}]}function $_n(t,e){const{transform:n,layer:i}=e,{anchor_position:r,anchor_alignment:o,text:s,font_size:a=1,layer:c="top",color:l}=t;if(i&&c!==i)return[];if(!r||typeof r.x!="number"||typeof r.y!="number")return console.error("Invalid anchor_position:",r),[];const[u,d]=Yt(n,[r.x,r.y]),h=a*Math.abs(n.a),f=cs(Cs(u,d),ov(Math.PI/180));return[{name:"text",type:"element",attributes:{x:"0",y:"0","font-family":"Arial, sans-serif","font-size":h.toString(),"text-anchor":"middle","dominant-baseline":"central",transform:aw(f),class:"pcb-fabrication-note-text",fill:l||"rgba(255,255,255,0.5)"},children:[{type:"text",value:s,name:"",attributes:{},children:[]}],value:""}]}function j_n(t,e){const{transform:n,colorMap:i}=e,[r,o]=Yt(n,[t.x,t.y]);if(t.shape==="pill"){const s=t.outer_width*Math.abs(n.a),a=t.outer_height*Math.abs(n.a),c=t.hole_width*Math.abs(n.a),l=t.hole_height*Math.abs(n.a),u=s/2,d=c/2,h=a-s,f=t.ccw_rotation||0,m=f?`translate(${r} ${o}) rotate(${-f})`:`translate(${r} ${o})`,y=f?`translate(${r} ${o}) rotate(${-f})`:`translate(${r} ${o})`;return[{name:"g",type:"element",children:[{name:"path",type:"element",attributes:{class:"pcb-hole-outer",fill:i.copper.top,d:`M${-u},${-h/2} v${h} a${u},${u} 0 0 0 ${s},0 v-${h} a${u},${u} 0 0 0 -${s},0 z`,transform:m},value:"",children:[]},{name:"path",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,d:`M${-d},${-(l-c)/2} v${l-c} a${d},${d} 0 0 0 ${c},0 v-${l-c} a${d},${d} 0 0 0 -${c},0 z`,transform:y},value:"",children:[]}],value:"",attributes:{}}]}if(t.shape==="circle"){const s=t.outer_diameter*Math.abs(n.a),a=t.outer_diameter*Math.abs(n.a),c=t.hole_diameter*Math.abs(n.a),l=t.hole_diameter*Math.abs(n.a),u=Math.min(s,a)/2,d=Math.min(c,l)/2;return[{name:"g",type:"element",children:[{name:"circle",type:"element",attributes:{class:"pcb-hole-outer",fill:i.copper.top,cx:r.toString(),cy:o.toString(),r:u.toString()},value:"",children:[]},{name:"circle",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,cx:r.toString(),cy:o.toString(),r:d.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(t.shape==="circular_hole_with_rect_pad"){const s=t,a=t.hole_diameter*Math.abs(n.a),c=t.rect_pad_width*Math.abs(n.a),l=t.rect_pad_height*Math.abs(n.a),u=(t.rect_border_radius??0)*Math.abs(n.a),d=a/2,[h,f]=Yt(n,[s.x+(s.hole_offset_x??0),s.y+(s.hole_offset_y??0)]);return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"pcb-hole-outer-pad",fill:i.copper.top,x:(r-c/2).toString(),y:(o-l/2).toString(),width:c.toString(),height:l.toString(),...u?{rx:u.toString(),ry:u.toString()}:{}},value:"",children:[]},{name:"circle",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,cx:h.toString(),cy:f.toString(),r:d.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(t.shape==="pill_hole_with_rect_pad"){const s=t,a=s.rect_pad_width*Math.abs(n.a),c=s.rect_pad_height*Math.abs(n.a),l=(s.rect_border_radius??0)*Math.abs(n.a),u=s.hole_height*Math.abs(n.a),d=s.hole_width*Math.abs(n.a),h=s,f=h.hole_offset_x??0,m=h.hole_offset_y??0,[y,g]=Yt(n,[s.x+f,s.y+m]),b=Math.min(u,d)/2;return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"pcb-hole-outer-pad",fill:i.copper.top,x:(r-a/2).toString(),y:(o-c/2).toString(),width:a.toString(),height:c.toString(),...l?{rx:l.toString(),ry:l.toString()}:{}},value:"",children:[]},{name:"rect",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,x:(y-d/2).toString(),y:(g-u/2).toString(),width:d.toString(),height:u.toString(),rx:b.toString(),ry:b.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(t.shape==="rotated_pill_hole_with_rect_pad"){const s=t,a=s.rect_pad_width*Math.abs(n.a),c=s.rect_pad_height*Math.abs(n.a),l=(s.rect_border_radius??0)*Math.abs(n.a),u=s.hole_height*Math.abs(n.a),d=s.hole_width*Math.abs(n.a),h=s,f=h.hole_offset_x??0,m=h.hole_offset_y??0,[y,g]=Yt(n,[s.x+f,s.y+m]),b=Math.min(u,d)/2;return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"pcb-hole-outer-pad",fill:i.copper.top,x:(-a/2).toString(),y:(-c/2).toString(),width:a.toString(),height:c.toString(),transform:`translate(${r} ${o}) rotate(${-s.rect_ccw_rotation})`,...l?{rx:l.toString(),ry:l.toString()}:{}},value:"",children:[]},{name:"rect",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,x:(-d/2).toString(),y:(-u/2).toString(),width:d.toString(),height:u.toString(),rx:b.toString(),ry:b.toString(),transform:`translate(${y} ${g}) rotate(${-s.hole_ccw_rotation})`},value:"",children:[]}],value:"",attributes:{}}]}return[]}function H_n(t,e){const{transform:n,layer:i,colorMap:r}=e;if(!t.route||!Array.isArray(t.route))return[];let o=t.route.map((u,d)=>{const[h,f]=Yt(n,[u.x,u.y]);return d===0?`M ${h} ${f}`:`L ${h} ${f}`}).join(" ");const s=t.route[0],a=t.route[t.route.length-1];s&&a&&s.x===a.x&&s.y===a.y&&(o+=" Z");const c=t.layer||"top";if(i&&c!==i)return[];const l=c==="bottom"?r.silkscreen.bottom:r.silkscreen.top;return[{name:"path",type:"element",attributes:{class:`pcb-silkscreen pcb-silkscreen-${c}`,d:o,fill:"none",stroke:l,"stroke-width":(t.stroke_width*Math.abs(n.a)).toString(),"stroke-linecap":"round","stroke-linejoin":"round","data-pcb-component-id":t.pcb_component_id,"data-pcb-silkscreen-path-id":t.pcb_silkscreen_path_id},value:"",children:[]}]}function V_n(t,e){const{transform:n,layer:i,colorMap:r}=e,{anchor_position:o,text:s,font_size:a=1,layer:c="top",ccw_rotation:l=0,anchor_alignment:u="center"}=t;if(i&&c!==i)return[];if(!o||typeof o.x!="number"||typeof o.y!="number")return console.error("Invalid anchor_position:",o),[];const[d,h]=Yt(n,[o.x,o.y]),f=a*Math.abs(n.a);let m="middle",y="central";const g=0,b=0;switch(u){case"top_left":m="start",y="text-before-edge";break;case"top_center":m="middle",y="text-before-edge";break;case"top_right":m="end",y="text-before-edge";break;case"center_left":m="start",y="central";break;case"center_right":m="end",y="central";break;case"bottom_left":m="start",y="text-after-edge";break;case"bottom_center":m="middle",y="text-after-edge";break;case"bottom_right":m="end",y="text-after-edge";break;case"center":default:m="middle",y="central";break}const v=cs(Cs(d,h),ov(-l*Math.PI/180),...c==="bottom"?[kg(-1,1)]:[]),w=c==="bottom"?r.silkscreen.bottom:r.silkscreen.top,T=s.split(`
5301
- `),N=T.length===1?[{type:"text",value:s,name:"",attributes:{},children:[]}]:T.map((P,M)=>({type:"element",name:"tspan",value:"",attributes:{x:"0",...M>0?{dy:f.toString()}:{}},children:[{type:"text",value:P,name:"",attributes:{},children:[]}]}));return[{name:"text",type:"element",attributes:{x:"0",y:"0",dx:g.toString(),dy:b.toString(),fill:w,"font-family":"Arial, sans-serif","font-size":f.toString(),"text-anchor":m,"dominant-baseline":y,transform:aw(v),class:`pcb-silkscreen-text pcb-silkscreen-${c}`,"data-pcb-silkscreen-text-id":t.pcb_component_id,stroke:"none"},children:N,value:""}]}function G_n(t,e){const{transform:n,layer:i,colorMap:r}=e,{center:o,width:s,height:a,layer:c="top",pcb_silkscreen_rect_id:l,stroke_width:u,is_filled:d,has_stroke:h,is_stroke_dashed:f}=t;if(i&&c!==i)return[];if(!o||typeof o.x!="number"||typeof o.y!="number"||typeof s!="number"||typeof a!="number")return console.error("Invalid rectangle data:",{center:o,width:s,height:a}),[];const[m,y]=Yt(n,[o.x,o.y]),g=s*Math.abs(n.a),b=a*Math.abs(n.d),v=u*Math.abs(n.a),w=c==="bottom"?r.silkscreen.bottom:r.silkscreen.top,T={x:(m-g/2).toString(),y:(y-b/2).toString(),width:g.toString(),height:b.toString(),class:`pcb-silkscreen-rect pcb-silkscreen-${c}`,"data-pcb-silkscreen-rect-id":l};T.fill=d?w:"none";let N;if(h===void 0?N=v>0:N=h,N){if(T.stroke=w,T["stroke-width"]=v.toString(),f){const P=.1*Math.abs(n.a),M=.05*Math.abs(n.a);T["stroke-dasharray"]=`${P} ${M}`}}else T.stroke="none";return[{name:"rect",type:"element",attributes:T,value:"",children:[]}]}function Y_n(t,e){const{transform:n,layer:i,colorMap:r}=e,{center:o,radius:s,layer:a="top",pcb_silkscreen_circle_id:c,stroke_width:l=1}=t;if(i&&a!==i)return[];if(!o||typeof o.x!="number"||typeof o.y!="number"||typeof s!="number")return console.error("Invalid PCB Silkscreen Circle data:",{center:o,radius:s}),[];const[u,d]=Yt(n,[o.x,o.y]),h=s*Math.abs(n.a),f=l*Math.abs(n.a),m=a==="bottom"?r.silkscreen.bottom:r.silkscreen.top;return[{name:"circle",type:"element",attributes:{cx:u.toString(),cy:d.toString(),r:h.toString(),class:`pcb-silkscreen-circle pcb-silkscreen-${a}`,stroke:m,"stroke-width":f.toString(),"data-pcb-silkscreen-circle-id":c},value:"",children:[]}]}function q_n(t,e){const{transform:n,layer:i,colorMap:r}=e,{x1:o,y1:s,x2:a,y2:c,stroke_width:l,layer:u="top",pcb_silkscreen_line_id:d}=t;if(i&&u!==i)return[];if(typeof o!="number"||typeof s!="number"||typeof a!="number"||typeof c!="number")return console.error("Invalid coordinates:",{x1:o,y1:s,x2:a,y2:c}),[];const[h,f]=Yt(n,[o,s]),[m,y]=Yt(n,[a,c]),g=l*Math.abs(n.a),b=u==="bottom"?r.silkscreen.bottom:r.silkscreen.top;return[{name:"line",type:"element",attributes:{x1:h.toString(),y1:f.toString(),x2:m.toString(),y2:y.toString(),stroke:b,"stroke-width":g.toString(),class:`pcb-silkscreen-line pcb-silkscreen-${u}`,"data-pcb-silkscreen-line-id":d},value:"",children:[]}]}function X_n(t){const e=[];for(let n=0;n<t.length-1;n++)e.push([t[n],t[n+1]]);return e}var ex={copper:{top:"rgb(200, 52, 52)",bottom:"rgb(77, 127, 196)"},soldermask:{top:"rgb(200, 52, 52)",bottom:"rgb(77, 127, 196)"},drill:"#FF26E2",silkscreen:{top:"#f2eda1",bottom:"#5da9e9"},boardOutline:"rgba(255, 255, 255, 0.5)",debugComponent:{fill:null,stroke:null}};ex.drill,ex.silkscreen.top,ex.silkscreen.bottom,ex.copper.top,ex.copper.bottom;function hM(t,e=ex){return e.copper[t]??"white"}var W_n={bottom:"rgb(105, 105, 105)",top:"rgb(105, 105, 105)"};function Bj(t){return W_n[t]??"rgb(105, 105, 105)"}function Z_n(t,e){const{transform:n,layer:i,colorMap:r,renderSolderMask:o}=e;if(!t.route||!Array.isArray(t.route)||t.route.length<2)return[];const s=X_n(t.route),a=[];for(const[c,l]of s){const u=Yt(n,[c.x,c.y]),d=Yt(n,[l.x,l.y]),h="layer"in c?c.layer:"layer"in l?l.layer:null;if(!h||i&&h!==i)continue;const f=hM(h,r),m=r.soldermask[h]??f,y="width"in c?c.width:"width"in l?l.width:null,g=y?(y*Math.abs(n.a)).toString():"0.3";if(o){const b={name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-trace",stroke:f,fill:"none",d:`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]}`,"stroke-width":g,"stroke-linecap":"round","stroke-linejoin":"round","shape-rendering":"crispEdges","data-layer":h}},v={name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-soldermask",stroke:m,fill:"none",d:`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]}`,"stroke-width":g,"stroke-linecap":"round","stroke-linejoin":"round","shape-rendering":"crispEdges","data-layer":h}};a.push(v,b)}else{const b={name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-trace",stroke:m,fill:"none",d:`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]}`,"stroke-width":g,"stroke-linecap":"round","stroke-linejoin":"round","shape-rendering":"crispEdges","data-layer":h}};a.push(b)}}return a.sort((c,l)=>{const u=c.attributes["data-layer"],d=l.attributes["data-layer"];return u==="bottom"&&d!=="bottom"?-1:u==="top"&&d!=="top"?1:0}),a}function K_n(t,e){const{transform:n,layer:i,colorMap:r}=e;if(i&&t.layer!==i)return[];const o=!!t?.is_covered_with_solder_mask,s=r.soldermask[t.layer]??r.soldermask.top;if(t.shape==="rect"||t.shape==="rotated_rect"){const a=t.width*Math.abs(n.a),c=t.height*Math.abs(n.d),[l,u]=Yt(n,[t.x,t.y]),d=(t.rect_border_radius??0)*Math.abs(n.a);if(t.shape==="rotated_rect"&&t.ccw_rotation){const m={name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:hM(t.layer,r),x:(-a/2).toString(),y:(-c/2).toString(),width:a.toString(),height:c.toString(),transform:`translate(${l} ${u}) rotate(${-t.ccw_rotation})`,"data-layer":t.layer,...d?{rx:d.toString(),ry:d.toString()}:{}}};if(!o)return[m];const y={name:m.name,type:m.type,value:"",children:[],attributes:{...m.attributes,class:"pcb-solder-mask",fill:s}};return[m,y]}const h={name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:hM(t.layer,r),x:(l-a/2).toString(),y:(u-c/2).toString(),width:a.toString(),height:c.toString(),"data-layer":t.layer,...d?{rx:d.toString(),ry:d.toString()}:{}}};if(!o)return[h];const f={name:h.name,type:h.type,value:"",children:[],attributes:{...h.attributes,class:"pcb-solder-mask",fill:s}};return[h,f]}if(t.shape==="pill"){const a=t.width*Math.abs(n.a),c=t.height*Math.abs(n.d),l=t.radius*Math.abs(n.a),[u,d]=Yt(n,[t.x,t.y]),h={name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:hM(t.layer,r),x:(u-a/2).toString(),y:(d-c/2).toString(),width:a.toString(),height:c.toString(),rx:l.toString(),ry:l.toString(),"data-layer":t.layer}};if(!o)return[h];const f={name:h.name,type:h.type,value:"",children:[],attributes:{...h.attributes,class:"pcb-solder-mask",fill:s}};return[h,f]}if(t.shape==="circle"){const a=t.radius*Math.abs(n.a),[c,l]=Yt(n,[t.x,t.y]),u={name:"circle",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:hM(t.layer,r),cx:c.toString(),cy:l.toString(),r:a.toString(),"data-layer":t.layer}};if(!o)return[u];const d={name:u.name,type:u.type,value:"",children:[],attributes:{...u.attributes,class:"pcb-solder-mask",fill:s}};return[u,d]}if(t.shape==="polygon"){const a=(t.points??[]).map(u=>Yt(n,[u.x,u.y])),c={name:"polygon",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:hM(t.layer,r),points:a.map(u=>u.join(",")).join(" "),"data-layer":t.layer}};if(!o)return[c];const l={name:c.name,type:c.type,value:"",children:[],attributes:{...c.attributes,class:"pcb-solder-mask",fill:s}};return[c,l]}return[]}function IZe(t,e){const{transform:n,colorMap:i}=e,{width:r,height:o,center:s,outline:a}=t;let c;if(a&&Array.isArray(a)&&a.length>=3)c=a.map((l,u)=>{const[d,h]=Yt(n,[l.x,l.y]);return u===0?`M ${d} ${h}`:`L ${d} ${h}`}).join(" ");else{const l=r/2,u=o/2,d=Yt(n,[s.x-l,s.y-u]),h=Yt(n,[s.x+l,s.y-u]),f=Yt(n,[s.x+l,s.y+u]),m=Yt(n,[s.x-l,s.y+u]);c=`M ${d[0]} ${d[1]} L ${h[0]} ${h[1]} L ${f[0]} ${f[1]} L ${m[0]} ${m[1]}`}return c+=" Z",[{name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-board",d:c,fill:"none",stroke:i.boardOutline,"stroke-width":(.1*Math.abs(n.a)).toString()}}]}function Q_n(t,e){const{transform:n,colorMap:i}=e,[r,o]=Yt(n,[t.x,t.y]),s=t.outer_diameter*Math.abs(n.a),a=t.outer_diameter*Math.abs(n.a),c=t.hole_diameter*Math.abs(n.a),l=t.hole_diameter*Math.abs(n.a),u=Math.min(s,a)/2,d=Math.min(c,l)/2;return{name:"g",type:"element",children:[{name:"circle",type:"element",attributes:{class:"pcb-hole-outer",fill:i.copper.top,cx:r.toString(),cy:o.toString(),r:u.toString()}},{name:"circle",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,cx:r.toString(),cy:o.toString(),r:d.toString()}}]}}function J_n(t,e){const{transform:n,colorMap:i}=e,[r,o]=Yt(n,[t.x,t.y]);if(t.hole_shape==="circle"||t.hole_shape==="square"){const s=t.hole_diameter*Math.abs(n.a),a=s/2;return t.hole_shape==="circle"?[{name:"circle",type:"element",attributes:{class:"pcb-hole",cx:r.toString(),cy:o.toString(),r:a.toString(),fill:i.drill},children:[],value:""}]:[{name:"rect",type:"element",attributes:{class:"pcb-hole",x:(r-a).toString(),y:(o-a).toString(),width:s.toString(),height:s.toString(),fill:i.drill},children:[],value:""}]}if(t.hole_shape==="oval"){const s=t.hole_width*Math.abs(n.a),a=t.hole_height*Math.abs(n.a),c=s/2,l=a/2;return[{name:"ellipse",type:"element",attributes:{class:"pcb-hole",cx:r.toString(),cy:o.toString(),rx:c.toString(),ry:l.toString(),fill:i.drill},children:[],value:""}]}return[]}var eyn=(t,e)=>{const n=ea(e).pcb_smtpad.get(t);if(n&&"x"in n&&"y"in n)return{x:n.x,y:n.y};const i=ea(e).pcb_plated_hole.get(t);return i&&"x"in i&&"y"in i?{x:i.x,y:i.y}:null},tyn=(t,e,n,i)=>{const r=n.getIdsConnectedToNet(e);let o=null,s=1/0;for(const a of r){const c=eyn(a,i);if(c){const l=t.x-c.x,u=t.y-c.y,d=Math.sqrt(l*l+u*u);d>0&&d<s&&(s=d,o=c)}}return o};function nyn(t,e){const{transform:n}=e,i=J6(t),r=t.filter(c=>c.type==="pcb_port"),o=t.filter(c=>c.type==="source_trace"),s=[];r.forEach((c,l)=>{const u=c.pcb_port_id;if(!u)return;const d=i.getNetConnectedToId(u);if(!d)return;let h=!1;const f=ea(t).source_port.getWhere({pcb_port_id:u});if(f&&f.source_port_id){const g=f.source_port_id;for(const b of o)if(Array.isArray(b.connected_source_port_ids)&&b.connected_source_port_ids.includes(g)&&Array.isArray(b.connected_source_net_ids)&&b.connected_source_net_ids.length>0){h=!0;break}}const m={x:c.x,y:c.y},y=tyn(m,d,i,t);y&&s.push({key:`${u}-${l}`,startPoint:m,endPoint:y,isInNet:h})});const a=[];for(const c of s){const l=Yt(n,[c.startPoint.x,c.startPoint.y]),u=Yt(n,[c.endPoint.x,c.endPoint.y]),d={x1:l[0].toString(),y1:l[1].toString(),x2:u[0].toString(),y2:u[1].toString(),stroke:"white","stroke-width":"1","stroke-dasharray":"6,6"};a.push({name:"line",type:"element",attributes:d,value:"",children:[]})}return a}function iyn(t,e){const{transform:n,colorMap:i}=e;if(t.shape==="rect"){const r=t,[o,s]=Yt(n,[r.center.x,r.center.y]),a=r.width*Math.abs(n.a),c=r.height*Math.abs(n.d),l=-(r.rotation??0);return[{name:"rect",type:"element",attributes:{class:"pcb-cutout pcb-cutout-rect",x:(-a/2).toString(),y:(-c/2).toString(),width:a.toString(),height:c.toString(),fill:i.drill,transform:aw(cs(Cs(o,s),ov(l*Math.PI/180)))},children:[],value:""}]}if(t.shape==="circle"){const r=t,[o,s]=Yt(n,[r.center.x,r.center.y]),a=r.radius*Math.abs(n.a);return[{name:"circle",type:"element",attributes:{class:"pcb-cutout pcb-cutout-circle",cx:o.toString(),cy:s.toString(),r:a.toString(),fill:i.drill},children:[],value:""}]}if(t.shape==="polygon"){const r=t;return!r.points||r.points.length===0?[]:[{name:"polygon",type:"element",attributes:{class:"pcb-cutout pcb-cutout-polygon",points:r.points.map(a=>Yt(n,[a.x,a.y])).map(a=>`${a[0]},${a[1]}`).join(" "),fill:i.drill},children:[],value:""}]}return[]}function NZe(t,e){if(t.length===0)return"";const n=t.map(r=>{const[o,s]=Yt(e,[r.x,r.y]);return{...r,x:o,y:s}});let i=`M ${n[0].x} ${n[0].y}`;for(let r=0;r<n.length;r++){const o=n[r],s=n[(r+1)%n.length];if(o.bulge){if(Math.hypot(s.x-o.x,s.y-o.y)<1e-9)continue;const a=o.bulge,c=s.x-o.x,l=s.y-o.y,u=Math.hypot(c,l),d=Math.abs(u/4/a*(a*a+1)),h=a<0?1:0,f=Math.abs(a)>1?1:0;i+=` A ${d} ${d} 0 ${f} ${h} ${s.x} ${s.y}`}else i+=` L ${s.x} ${s.y}`}return i+=" Z",i}function ryn(t,e){const{transform:n,layer:i,colorMap:r}=e,{layer:o}=t;if(i&&o!==i)return[];const s=hM(o,r),a="0.5";if(t.shape==="rect"){const[c,l]=Yt(n,[t.center.x,t.center.y]),u=t.width*Math.abs(n.a),d=t.height*Math.abs(n.d),h=-(t.rotation??0);return[{name:"rect",type:"element",attributes:{class:"pcb-copper-pour pcb-copper-pour-rect",x:(-u/2).toString(),y:(-d/2).toString(),width:u.toString(),height:d.toString(),fill:s,"fill-opacity":a,transform:aw(cs(Cs(c,l),ov(h*Math.PI/180))),"data-layer":o},children:[],value:""}]}if(t.shape==="polygon")return!t.points||t.points.length===0?[]:[{name:"polygon",type:"element",attributes:{class:"pcb-copper-pour pcb-copper-pour-polygon",points:t.points.map(u=>Yt(n,[u.x,u.y])).map(u=>`${u[0]},${u[1]}`).join(" "),fill:s,"fill-opacity":a,"data-layer":o},children:[],value:""}];if(t.shape==="brep"){const{brep_shape:c}=t;let l=NZe(c.outer_ring.vertices,n);for(const u of c.inner_rings??[])l+=` ${NZe(u.vertices,n)}`;return[{name:"path",type:"element",attributes:{class:"pcb-copper-pour pcb-copper-pour-brep",d:l,fill:s,"fill-rule":"evenodd","fill-opacity":a,"data-layer":o},children:[],value:""}]}return[]}function oyn(t,e){const{transform:n}=e,{center:i,width:r,height:o,rotation:s=0}=t,[a,c]=Yt(n,[i.x,i.y]),l=r*Math.abs(n.a),u=o*Math.abs(n.d),d=`translate(${a}, ${c}) rotate(${-s}) scale(1, -1)`;return!e.colorMap.debugComponent?.fill&&!e.colorMap.debugComponent?.stroke?[]:[{name:"g",type:"element",attributes:{transform:d},children:[{name:"rect",type:"element",attributes:{class:"pcb-component",x:(-l/2).toString(),y:(-u/2).toString(),width:l.toString(),height:u.toString(),fill:e.colorMap.debugComponent.fill??"transparent",stroke:e.colorMap.debugComponent.stroke??"transparent"}}],value:""}]}function oC(t){return t.find(n=>n.type==="project_software_metadata"||n.type==="source_project_metadata")?.software_used_string}var syn={version:"0.0.201"},sC=syn.version,kZe=["pcb_trace_error","pcb_plated_hole","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_silkscreen_text","pcb_silkscreen_path","pcb_via","pcb_cutout","pcb_copper_pour","pcb_smtpad","pcb_trace","pcb_component","pcb_board"];function $me(t,e){const n=e?.drawPaddingOutsideBoard??!0,i=e?.layer,r=e?.colorOverrides,o={copper:{top:r?.copper?.top??ex.copper.top,bottom:r?.copper?.bottom??ex.copper.bottom},drill:r?.drill??ex.drill,silkscreen:{top:r?.silkscreen?.top??ex.silkscreen.top,bottom:r?.silkscreen?.bottom??ex.silkscreen.bottom},boardOutline:r?.boardOutline??ex.boardOutline,soldermask:{top:r?.soldermask?.top??ex.soldermask.top,bottom:r?.soldermask?.bottom??ex.soldermask.bottom},debugComponent:{fill:r?.debugComponent?.fill??ex.debugComponent.fill,stroke:r?.debugComponent?.stroke??ex.debugComponent.stroke}};let s=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=Number.POSITIVE_INFINITY,d=Number.POSITIVE_INFINITY,h=Number.NEGATIVE_INFINITY,f=Number.NEGATIVE_INFINITY;for(const ke of t)if(ke.type==="pcb_board")ke.outline&&Array.isArray(ke.outline)&&ke.outline.length>=3?(Me(ke.outline),Ie(ke.outline)):"center"in ke&&"width"in ke&&"height"in ke&&(ue(ke.center,ke.width,ke.height),he(ke.center,ke.width,ke.height));else if("x"in ke&&"y"in ke)ue({x:ke.x,y:ke.y},0,0);else if(ke.type==="pcb_smtpad"){const ce=ke;ce.shape==="rect"||ce.shape==="rotated_rect"||ce.shape==="pill"?ue({x:ce.x,y:ce.y},ce.width,ce.height):ce.shape==="circle"?ue({x:ce.x,y:ce.y},ce.radius*2,ce.radius*2):ce.shape==="polygon"&&De(ce.points)}else"route"in ke?De(ke.route):ke.type==="pcb_silkscreen_text"||ke.type==="pcb_silkscreen_rect"||ke.type==="pcb_silkscreen_circle"||ke.type==="pcb_silkscreen_line"?Ge(ke):ke.type==="pcb_copper_pour"&&(ke.shape==="rect"?ue(ke.center,ke.width,ke.height):ke.shape==="polygon"&&De(ke.points));const m=n?1:0,y=n||!Number.isFinite(u)?s:u,g=n||!Number.isFinite(d)?a:d,b=n||!Number.isFinite(h)?c:h,v=n||!Number.isFinite(f)?l:f,w=b-y+2*m,T=v-g+2*m;let N=e?.width??800,R=e?.height??600;if(e?.matchBoardAspectRatio){const ke=h-u,ce=f-d;if(ke>0&&ce>0){const we=ke/ce;e?.width&&!e?.height?R=e.width/we:e?.height&&!e?.width?N=e.height*we:R=N/we}}const P=[];for(const ke of t)"route"in ke&&ke.route!==void 0&&P.push(ke.route);const M=N/w,I=R/T,A=Math.min(M,I),$=(N-w*A)/2,k=(R-T*A)/2,V=cs(Cs($-y*A+m*A,R-k+g*A-m*A),kg(A,-A)),X={transform:V,layer:i,shouldDrawErrors:e?.shouldDrawErrors,drawPaddingOutsideBoard:n,colorMap:o,renderSolderMask:e?.renderSolderMask};function W(ke){if(ke.type==="pcb_smtpad")return ke.layer==="top"||ke.layer==="bottom"?ke.layer:void 0;if(ke.type==="pcb_trace")for(const ce of ke.route??[]){const we="layer"in ce&&ce.layer||"from_layer"in ce&&ce.from_layer||"to_layer"in ce&&ce.to_layer||void 0;if(we==="top"||we==="bottom")return we}}function K(ke){return ke.type==="pcb_trace"||ke.type==="pcb_smtpad"}let te=t.sort((ke,ce)=>{const we=W(ke),xe=W(ce);if(K(ke)&&K(ce)&&we!==xe){if(we==="top")return 1;if(xe==="top"||we==="bottom")return-1;if(xe==="bottom")return 1}return(kZe.indexOf(ce.type)??9999)-(kZe.indexOf(ke.type)??9999)}).flatMap(ke=>ayn({elm:ke,circuitJson:t,ctx:X}));for(const ke of t)if("stroke_width"in ke){String(A*ke.stroke_width);break}if(e?.shouldDrawRatsNest){const ke=nyn(t,X);te=te.concat(ke)}const se=[{name:"style",type:"element",value:"",attributes:{},children:[{type:"text",value:"",name:"",attributes:{},children:[]}]},{name:"rect",type:"element",value:"",attributes:{class:"boundary",x:"0",y:"0",fill:e?.backgroundColor??"#000",width:N.toString(),height:R.toString()},children:[]}];n&&se.push(cyn(V,s,a,c,l)),se.push(...te);const de=oC(t),be=sC,re={name:"svg",type:"element",attributes:{xmlns:"http://www.w3.org/2000/svg",width:N.toString(),height:R.toString(),...de&&{"data-software-used-string":de},...e?.includeVersion&&{"data-circuit-to-svg-version":be}},value:"",children:se.filter(ke=>ke!==null)};try{return FP(re)}catch(ke){throw console.error("Error stringifying SVG object:",ke),ke}function ue(ke,ce,we){const xe=ce/2,Ye=we/2;s=Math.min(s,ke.x-xe),a=Math.min(a,ke.y-Ye),c=Math.max(c,ke.x+xe),l=Math.max(l,ke.y+Ye)}function he(ke,ce,we){const xe=ce/2,Ye=we/2;u=Math.min(u,ke.x-xe),d=Math.min(d,ke.y-Ye),h=Math.max(h,ke.x+xe),f=Math.max(f,ke.y+Ye)}function Me(ke){for(const ce of ke)s=Math.min(s,ce.x),a=Math.min(a,ce.y),c=Math.max(c,ce.x),l=Math.max(l,ce.y)}function Ie(ke){for(const ce of ke)u=Math.min(u,ce.x),d=Math.min(d,ce.y),h=Math.max(h,ce.x),f=Math.max(f,ce.y)}function De(ke){for(const ce of ke)s=Math.min(s,ce.x),a=Math.min(a,ce.y),c=Math.max(c,ce.x),l=Math.max(l,ce.y)}function Ge(ke){if(ke.type==="pcb_silkscreen_text")ue(ke.anchor_position,0,0);else if(ke.type==="pcb_silkscreen_path")De(ke.route);else if(ke.type==="pcb_silkscreen_rect")ue(ke.center,ke.width,ke.height);else if(ke.type==="pcb_silkscreen_circle")ue(ke.center,ke.radius*2,ke.radius*2);else if(ke.type==="pcb_silkscreen_line")ue({x:ke.x1,y:ke.y1},0,0),ue({x:ke.x2,y:ke.y2},0,0);else if(ke.type==="pcb_cutout"){const ce=ke;ce.shape==="rect"?ue(ce.center,ce.width,ce.height):ce.shape==="circle"?ue(ce.center,ce.radius*2,ce.radius*2):ce.shape==="polygon"&&De(ce.points)}}}function ayn({elm:t,circuitJson:e,ctx:n}){switch(t.type){case"pcb_trace_error":return F_n(t,e,n).filter(Boolean);case"pcb_component":return oyn(t,n).filter(Boolean);case"pcb_trace":return Z_n(t,n);case"pcb_copper_pour":return ryn(t,n);case"pcb_plated_hole":return j_n(t,n).filter(Boolean);case"pcb_hole":return J_n(t,n);case"pcb_smtpad":return K_n(t,n);case"pcb_silkscreen_text":return V_n(t,n);case"pcb_silkscreen_rect":return G_n(t,n);case"pcb_silkscreen_circle":return Y_n(t,n);case"pcb_silkscreen_line":return q_n(t,n);case"pcb_fabrication_note_path":return U_n(t,n);case"pcb_fabrication_note_text":return $_n(t,n);case"pcb_silkscreen_path":return H_n(t,n);case"pcb_board":return n.drawPaddingOutsideBoard?IZe(t,n):[];case"pcb_via":return Q_n(t,n);case"pcb_cutout":return iyn(t,n);default:return[]}}function cyn(t,e,n,i,r){const[o,s]=Yt(t,[e,n]),[a,c]=Yt(t,[i,r]),l=Math.abs(a-o),u=Math.abs(c-s),d=Math.min(o,a),h=Math.min(s,c);return{name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-boundary",fill:"none",stroke:"#fff","stroke-width":"0.3",x:d.toString(),y:h.toString(),width:l.toString(),height:u.toString()}}}var lyn=$me,Uj={fill:"none",stroke:"rgb(0,0,0)",strokeOpacity:"0.8",strokeWidthFactor:.2};function uyn(t,e,n={}){const{width:i,height:r,center:o,outline:s}=t;let a;if(s&&Array.isArray(s)&&s.length>=3)a=s.map((c,l)=>{const[u,d]=Yt(e,[c.x,c.y]);return l===0?`M ${u} ${d}`:`L ${u} ${d}`}).join(" ");else{const c=i/2,l=r/2,u=Yt(e,[o.x-c,o.y-l]),d=Yt(e,[o.x+c,o.y-l]),h=Yt(e,[o.x+c,o.y+l]),f=Yt(e,[o.x-c,o.y+l]);a=`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]} L ${h[0]} ${h[1]} L ${f[0]} ${f[1]}`}return a+=" Z",[{name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-board",d:a,fill:n.fill??Uj.fill,stroke:n.stroke??Uj.stroke,"stroke-opacity":n.strokeOpacity??Uj.strokeOpacity,"stroke-width":((n.strokeWidthFactor??Uj.strokeWidthFactor)*Math.abs(e.a)).toString()}}]}var dyn={pin_number:.15,negated_pin_number:.15*.8,reference_designator:.18,manufacturer_number:.18,net_label:.18,error:.05},aC=(t,e)=>e??dyn[t],l3=(t,e,n)=>Math.abs(t.a)*aC(e,n);function hyn(t,e){const{elm:n,portPosition:i,name:r,arePinsInterchangeable:o}=t,{transform:s}=e,{center:a,width:c,height:l,rotation:u=0,layer:d="top"}=n;if(!a||typeof c!="number"||typeof l!="number")return null;const[h,f]=Yt(s,[a.x,a.y]),[m,y]=Yt(s,[i.x,i.y]),g=c*Math.abs(s.a),b=l*Math.abs(s.d),v=y>f,w=m<h,T=[pyn(g,b,u,d),fyn(g,b,r??"")];return o||T.push(myn(g,b,u,d,v,w)),{name:"g",type:"element",value:"",attributes:{transform:`translate(${h}, ${f}) scale(1, -1)`},children:T}}function pyn(t,e,n,i){const r=t/2,o=e/2;return{name:"path",type:"element",attributes:{class:"assembly-component",d:_yn(r,o,n),"stroke-width":.8.toFixed(2),transform:`rotate(${-n})`,"stroke-dasharray":i==="bottom"?"2,2":""},value:"",children:[]}}function fyn(t,e,n,i){const r=Math.min(t,e),c=Math.min(58,Math.max(3,r*.8)),l=e>t;return{name:"text",type:"element",attributes:{x:"0",y:"0",class:"assembly-component-label","text-anchor":"middle",dy:".10em",style:"pointer-events: none","font-size":`${c.toFixed(1)}px`,transform:l?"rotate(90) scale(1, -1)":"scale(1, -1)"},children:[{type:"text",value:n||"",name:"",attributes:{},children:[]}],value:""}}function myn(t,e,n,i,r,o){const s=t/2,a=e/2,c=Math.min(s,a)*.5;let l;return r&&o?l=[[-s,-a],[-s+c,-a],[-s,-a+c]]:r&&!o?l=[[s,-a],[s-c,-a],[s,-a+c]]:!r&&o?l=[[-s,a],[-s+c,a],[-s,a-c]]:l=[[s,a],[s-c,a],[s,a-c]],{name:"polygon",type:"element",attributes:{class:"assembly-pin1-indicator",points:l.map(d=>d.join(",")).join(" "),fill:"#333",stroke:"none",transform:`rotate(${-n})`},value:"",children:[]}}function _yn(t,e,n){const i=(a,c,l)=>{const u=Math.PI/180*l,d=Math.cos(u),h=Math.sin(u);return[a*d-c*h,a*h+c*d]};return`${[[-t,-e],[t,-e],[t,e],[-t,e]].map(([a,c])=>i(a,c,n)).map(([a,c],l)=>l===0?`M${a},${c}`:`L${a},${c}`).join(" ")} Z`}var jme="rgb(190, 190, 190)";function yyn(t,e){const{transform:n}=e,[i,r]=Yt(n,[t.x,t.y]);if(t.hole_shape==="circle"||t.hole_shape==="square"){const o=t.hole_diameter*Math.abs(n.a),s=o/2;return t.hole_shape==="circle"?[{name:"circle",type:"element",attributes:{class:"assembly-hole",cx:i.toString(),cy:r.toString(),r:s.toString(),fill:jme},children:[],value:""}]:[{name:"rect",type:"element",attributes:{class:"assembly-hole",x:(i-s).toString(),y:(r-s).toString(),width:o.toString(),height:o.toString(),fill:jme},children:[],value:""}]}if(t.hole_shape==="oval"){const o=t.hole_width*Math.abs(n.a),s=t.hole_height*Math.abs(n.a),a=o/2,c=s/2;return[{name:"ellipse",type:"element",attributes:{class:"assembly-hole",cx:i.toString(),cy:r.toString(),rx:a.toString(),ry:c.toString(),fill:jme},children:[],value:""}]}return[]}var QI="rgb(210, 210, 210)",JI="rgb(190, 190, 190)";function gyn(t,e){const{transform:n}=e,[i,r]=Yt(n,[t.x,t.y]);if(t.shape==="pill"){const o=t.outer_width*Math.abs(n.a),s=t.outer_height*Math.abs(n.a),a=t.hole_width*Math.abs(n.a),c=t.hole_height*Math.abs(n.a),l=o/2,u=s-o,d=a/2;return[{name:"g",type:"element",children:[{name:"path",type:"element",attributes:{class:"assembly-hole-outer",fill:QI,d:`M${i-l},${r-u/2} v${u} a${l},${l} 0 0 0 ${o},0 v-${u} a${l},${l} 0 0 0 -${o},0 z`},value:"",children:[]},{name:"path",type:"element",attributes:{class:"assembly-hole-inner",fill:JI,d:`M${i-d},${r-(c-a)/2} v${c-a} a${d},${d} 0 0 0 ${a},0 v-${c-a} a${d},${d} 0 0 0 -${a},0 z`},value:"",children:[]}],value:"",attributes:{}}]}if(t.shape==="circle"){const o=t.outer_diameter*Math.abs(n.a),s=t.outer_diameter*Math.abs(n.a),a=t.hole_diameter*Math.abs(n.a),c=t.hole_diameter*Math.abs(n.a),l=Math.min(o,s)/2,u=Math.min(a,c)/2;return[{name:"g",type:"element",children:[{name:"circle",type:"element",attributes:{class:"assembly-hole-outer",fill:QI,cx:i.toString(),cy:r.toString(),r:l.toString()},value:"",children:[]},{name:"circle",type:"element",attributes:{class:"assembly-hole-inner",fill:JI,cx:i.toString(),cy:r.toString(),r:u.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(t.shape==="circular_hole_with_rect_pad"){const o=t,s=o.hole_diameter*Math.abs(n.a),a=o.rect_pad_width*Math.abs(n.a),c=o.rect_pad_height*Math.abs(n.a),l=(o.rect_border_radius??0)*Math.abs(n.a),u=s/2,[d,h]=Yt(n,[o.x+o.hole_offset_x,o.y+o.hole_offset_y]);return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"assembly-hole-outer-pad",fill:QI,x:(i-a/2).toString(),y:(r-c/2).toString(),width:a.toString(),height:c.toString(),...l?{rx:l.toString(),ry:l.toString()}:{}},value:"",children:[]},{name:"circle",type:"element",attributes:{class:"assembly-hole-inner",fill:JI,cx:d.toString(),cy:h.toString(),r:u.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(t.shape==="pill_hole_with_rect_pad"){const o=t,s=o.rect_pad_width*Math.abs(n.a),a=o.rect_pad_height*Math.abs(n.a),c=(o.rect_border_radius??0)*Math.abs(n.a),l=o.hole_height*Math.abs(n.a),u=o.hole_width*Math.abs(n.a),d=o,h=d.hole_offset_x??0,f=d.hole_offset_y??0,[m,y]=Yt(n,[o.x+h,o.y+f]),g=Math.min(l,u)/2;return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"assembly-hole-outer-pad",fill:QI,x:(i-s/2).toString(),y:(r-a/2).toString(),width:s.toString(),height:a.toString(),...c?{rx:c.toString(),ry:c.toString()}:{}},value:"",children:[]},{name:"rect",type:"element",attributes:{class:"assembly-hole-inner",fill:JI,x:(m-u/2).toString(),y:(y-l/2).toString(),width:u.toString(),height:l.toString(),rx:g.toString(),ry:g.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(t.shape==="rotated_pill_hole_with_rect_pad"){const o=t,s=o.rect_pad_width*Math.abs(n.a),a=o.rect_pad_height*Math.abs(n.a),c=(o.rect_border_radius??0)*Math.abs(n.a),l=o.hole_height*Math.abs(n.a),u=o.hole_width*Math.abs(n.a),d=o,h=d.hole_offset_x??0,f=d.hole_offset_y??0,[m,y]=Yt(n,[o.x+h,o.y+f]),g=Math.min(l,u)/2;return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"assembly-hole-outer-pad",fill:QI,x:(-s/2).toString(),y:(-a/2).toString(),width:s.toString(),height:a.toString(),transform:`translate(${i} ${r}) rotate(${-o.rect_ccw_rotation})`,...c?{rx:c.toString(),ry:c.toString()}:{}},value:"",children:[]},{name:"rect",type:"element",attributes:{class:"assembly-hole-inner",fill:JI,x:(-u/2).toString(),y:(-l/2).toString(),width:u.toString(),height:l.toString(),rx:g.toString(),ry:g.toString(),transform:`translate(${m} ${y}) rotate(${-o.hole_ccw_rotation})`},value:"",children:[]}],value:"",attributes:{}}]}return[]}var eN="rgb(210, 210, 210)";function byn(t,e){const{transform:n}=e;if(t.shape==="rect"||t.shape==="rotated_rect"){const i=t.width*Math.abs(n.a),r=t.height*Math.abs(n.d),[o,s]=Yt(n,[t.x,t.y]),a=(t.rect_border_radius??0)*Math.abs(n.a);return t.shape==="rotated_rect"&&t.ccw_rotation?[{name:"rect",type:"element",attributes:{class:"assembly-pad",fill:eN,x:(-i/2).toString(),y:(-r/2).toString(),width:i.toString(),height:r.toString(),transform:`translate(${o} ${s}) rotate(${-t.ccw_rotation})`,"data-layer":t.layer,...a?{rx:a.toString(),ry:a.toString()}:{}},value:"",children:[]}]:[{name:"rect",type:"element",attributes:{class:"assembly-pad",fill:eN,x:(o-i/2).toString(),y:(s-r/2).toString(),width:i.toString(),height:r.toString(),"data-layer":t.layer,...a?{rx:a.toString(),ry:a.toString()}:{}},value:"",children:[]}]}if(t.shape==="pill"){const i=t.width*Math.abs(n.a),r=t.height*Math.abs(n.d),o=t.radius*Math.abs(n.a),[s,a]=Yt(n,[t.x,t.y]);return[{name:"rect",type:"element",attributes:{class:"assembly-pad",fill:eN,x:(s-i/2).toString(),y:(a-r/2).toString(),width:i.toString(),height:r.toString(),rx:o.toString(),ry:o.toString(),"data-layer":t.layer},value:"",children:[]}]}if(t.shape==="circle"){const i=t.radius*Math.abs(n.a),[r,o]=Yt(n,[t.x,t.y]);return[{name:"circle",type:"element",attributes:{class:"assembly-pad",fill:eN,cx:r.toString(),cy:o.toString(),r:i.toString(),"data-layer":t.layer},value:"",children:[]}]}if(t.shape==="polygon"){const i=(t.points??[]).map(r=>Yt(n,[r.x,r.y]));return[{name:"polygon",type:"element",attributes:{class:"assembly-pad",fill:eN,points:i.map(r=>r.join(",")).join(" "),"data-layer":t.layer},value:"",children:[]}]}return[]}var OZe=["pcb_component","pcb_smtpad","pcb_hole","pcb_plated_hole","pcb_board"];function LZe(t,e){let n=Number.POSITIVE_INFINITY,i=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(const R of t)if(R.type==="pcb_board"){const P=R.center,M=R.width||0,I=R.height||0;n=Math.min(n,P.x-M/2),i=Math.min(i,P.y-I/2),r=Math.max(r,P.x+M/2),o=Math.max(o,P.y+I/2)}const s=1,a=r-n+2*s,c=o-i+2*s,l=e?.width??800,u=e?.height??600,d=l/a,h=u/c,f=Math.min(d,h),m=(l-a*f)/2,y=(u-c*f)/2,g=cs(Cs(m-n*f+s*f,u-y+i*f-s*f),kg(f,-f)),b={transform:g},v=t.sort((R,P)=>(OZe.indexOf(P.type)??9999)-(OZe.indexOf(R.type)??9999)).flatMap(R=>xyn(R,b,t)),w=oC(t),T=sC,N={name:"svg",type:"element",attributes:{xmlns:"http://www.w3.org/2000/svg",width:l.toString(),height:u.toString(),...w&&{"data-software-used-string":w},...e?.includeVersion&&{"data-circuit-to-svg-version":T}},value:"",children:[{name:"style",type:"element",children:[{type:"text",value:`
5301
+ `),N=T.length===1?[{type:"text",value:s,name:"",attributes:{},children:[]}]:T.map((P,M)=>({type:"element",name:"tspan",value:"",attributes:{x:"0",...M>0?{dy:f.toString()}:{}},children:[{type:"text",value:P,name:"",attributes:{},children:[]}]}));return[{name:"text",type:"element",attributes:{x:"0",y:"0",dx:g.toString(),dy:b.toString(),fill:w,"font-family":"Arial, sans-serif","font-size":f.toString(),"text-anchor":m,"dominant-baseline":y,transform:aw(v),class:`pcb-silkscreen-text pcb-silkscreen-${c}`,"data-pcb-silkscreen-text-id":t.pcb_component_id,stroke:"none"},children:N,value:""}]}function G_n(t,e){const{transform:n,layer:i,colorMap:r}=e,{center:o,width:s,height:a,layer:c="top",pcb_silkscreen_rect_id:l,stroke_width:u,is_filled:d,has_stroke:h,is_stroke_dashed:f}=t;if(i&&c!==i)return[];if(!o||typeof o.x!="number"||typeof o.y!="number"||typeof s!="number"||typeof a!="number")return console.error("Invalid rectangle data:",{center:o,width:s,height:a}),[];const[m,y]=Yt(n,[o.x,o.y]),g=s*Math.abs(n.a),b=a*Math.abs(n.d),v=u*Math.abs(n.a),w=c==="bottom"?r.silkscreen.bottom:r.silkscreen.top,T={x:(m-g/2).toString(),y:(y-b/2).toString(),width:g.toString(),height:b.toString(),class:`pcb-silkscreen-rect pcb-silkscreen-${c}`,"data-pcb-silkscreen-rect-id":l};T.fill=d?w:"none";let N;if(h===void 0?N=v>0:N=h,N){if(T.stroke=w,T["stroke-width"]=v.toString(),f){const P=.1*Math.abs(n.a),M=.05*Math.abs(n.a);T["stroke-dasharray"]=`${P} ${M}`}}else T.stroke="none";return[{name:"rect",type:"element",attributes:T,value:"",children:[]}]}function Y_n(t,e){const{transform:n,layer:i,colorMap:r}=e,{center:o,radius:s,layer:a="top",pcb_silkscreen_circle_id:c,stroke_width:l=1}=t;if(i&&a!==i)return[];if(!o||typeof o.x!="number"||typeof o.y!="number"||typeof s!="number")return console.error("Invalid PCB Silkscreen Circle data:",{center:o,radius:s}),[];const[u,d]=Yt(n,[o.x,o.y]),h=s*Math.abs(n.a),f=l*Math.abs(n.a),m=a==="bottom"?r.silkscreen.bottom:r.silkscreen.top;return[{name:"circle",type:"element",attributes:{cx:u.toString(),cy:d.toString(),r:h.toString(),class:`pcb-silkscreen-circle pcb-silkscreen-${a}`,stroke:m,"stroke-width":f.toString(),"data-pcb-silkscreen-circle-id":c},value:"",children:[]}]}function q_n(t,e){const{transform:n,layer:i,colorMap:r}=e,{x1:o,y1:s,x2:a,y2:c,stroke_width:l,layer:u="top",pcb_silkscreen_line_id:d}=t;if(i&&u!==i)return[];if(typeof o!="number"||typeof s!="number"||typeof a!="number"||typeof c!="number")return console.error("Invalid coordinates:",{x1:o,y1:s,x2:a,y2:c}),[];const[h,f]=Yt(n,[o,s]),[m,y]=Yt(n,[a,c]),g=l*Math.abs(n.a),b=u==="bottom"?r.silkscreen.bottom:r.silkscreen.top;return[{name:"line",type:"element",attributes:{x1:h.toString(),y1:f.toString(),x2:m.toString(),y2:y.toString(),stroke:b,"stroke-width":g.toString(),class:`pcb-silkscreen-line pcb-silkscreen-${u}`,"data-pcb-silkscreen-line-id":d},value:"",children:[]}]}function X_n(t){const e=[];for(let n=0;n<t.length-1;n++)e.push([t[n],t[n+1]]);return e}var ex={copper:{top:"rgb(200, 52, 52)",bottom:"rgb(77, 127, 196)"},soldermask:{top:"rgb(200, 52, 52)",bottom:"rgb(77, 127, 196)"},drill:"#FF26E2",silkscreen:{top:"#f2eda1",bottom:"#5da9e9"},boardOutline:"rgba(255, 255, 255, 0.5)",debugComponent:{fill:null,stroke:null}};ex.drill,ex.silkscreen.top,ex.silkscreen.bottom,ex.copper.top,ex.copper.bottom;function hM(t,e=ex){return e.copper[t]??"white"}var W_n={bottom:"rgb(105, 105, 105)",top:"rgb(105, 105, 105)"};function Bj(t){return W_n[t]??"rgb(105, 105, 105)"}function Z_n(t,e){const{transform:n,layer:i,colorMap:r,renderSolderMask:o}=e;if(!t.route||!Array.isArray(t.route)||t.route.length<2)return[];const s=X_n(t.route),a=[];for(const[c,l]of s){const u=Yt(n,[c.x,c.y]),d=Yt(n,[l.x,l.y]),h="layer"in c?c.layer:"layer"in l?l.layer:null;if(!h||i&&h!==i)continue;const f=hM(h,r),m=r.soldermask[h]??f,y="width"in c?c.width:"width"in l?l.width:null,g=y?(y*Math.abs(n.a)).toString():"0.3";if(o){const b={name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-trace",stroke:f,fill:"none",d:`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]}`,"stroke-width":g,"stroke-linecap":"round","stroke-linejoin":"round","shape-rendering":"crispEdges","data-layer":h}},v={name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-soldermask",stroke:m,fill:"none",d:`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]}`,"stroke-width":g,"stroke-linecap":"round","stroke-linejoin":"round","shape-rendering":"crispEdges","data-layer":h}};a.push(v,b)}else{const b={name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-trace",stroke:m,fill:"none",d:`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]}`,"stroke-width":g,"stroke-linecap":"round","stroke-linejoin":"round","shape-rendering":"crispEdges","data-layer":h}};a.push(b)}}return a.sort((c,l)=>{const u=c.attributes["data-layer"],d=l.attributes["data-layer"];return u==="bottom"&&d!=="bottom"?-1:u==="top"&&d!=="top"?1:0}),a}function K_n(t,e){const{transform:n,layer:i,colorMap:r}=e;if(i&&t.layer!==i)return[];const o=!!t?.is_covered_with_solder_mask,s=r.soldermask[t.layer]??r.soldermask.top;if(t.shape==="rect"||t.shape==="rotated_rect"){const a=t.width*Math.abs(n.a),c=t.height*Math.abs(n.d),[l,u]=Yt(n,[t.x,t.y]),d=(t.rect_border_radius??0)*Math.abs(n.a);if(t.shape==="rotated_rect"&&t.ccw_rotation){const m={name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:hM(t.layer,r),x:(-a/2).toString(),y:(-c/2).toString(),width:a.toString(),height:c.toString(),transform:`translate(${l} ${u}) rotate(${-t.ccw_rotation})`,"data-layer":t.layer,...d?{rx:d.toString(),ry:d.toString()}:{}}};if(!o)return[m];const y={name:m.name,type:m.type,value:"",children:[],attributes:{...m.attributes,class:"pcb-solder-mask",fill:s}};return[m,y]}const h={name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:hM(t.layer,r),x:(l-a/2).toString(),y:(u-c/2).toString(),width:a.toString(),height:c.toString(),"data-layer":t.layer,...d?{rx:d.toString(),ry:d.toString()}:{}}};if(!o)return[h];const f={name:h.name,type:h.type,value:"",children:[],attributes:{...h.attributes,class:"pcb-solder-mask",fill:s}};return[h,f]}if(t.shape==="pill"){const a=t.width*Math.abs(n.a),c=t.height*Math.abs(n.d),l=t.radius*Math.abs(n.a),[u,d]=Yt(n,[t.x,t.y]),h={name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:hM(t.layer,r),x:(u-a/2).toString(),y:(d-c/2).toString(),width:a.toString(),height:c.toString(),rx:l.toString(),ry:l.toString(),"data-layer":t.layer}};if(!o)return[h];const f={name:h.name,type:h.type,value:"",children:[],attributes:{...h.attributes,class:"pcb-solder-mask",fill:s}};return[h,f]}if(t.shape==="circle"){const a=t.radius*Math.abs(n.a),[c,l]=Yt(n,[t.x,t.y]),u={name:"circle",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:hM(t.layer,r),cx:c.toString(),cy:l.toString(),r:a.toString(),"data-layer":t.layer}};if(!o)return[u];const d={name:u.name,type:u.type,value:"",children:[],attributes:{...u.attributes,class:"pcb-solder-mask",fill:s}};return[u,d]}if(t.shape==="polygon"){const a=(t.points??[]).map(u=>Yt(n,[u.x,u.y])),c={name:"polygon",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:hM(t.layer,r),points:a.map(u=>u.join(",")).join(" "),"data-layer":t.layer}};if(!o)return[c];const l={name:c.name,type:c.type,value:"",children:[],attributes:{...c.attributes,class:"pcb-solder-mask",fill:s}};return[c,l]}return[]}function IZe(t,e){const{transform:n,colorMap:i}=e,{width:r,height:o,center:s,outline:a}=t;let c;if(a&&Array.isArray(a)&&a.length>=3)c=a.map((l,u)=>{const[d,h]=Yt(n,[l.x,l.y]);return u===0?`M ${d} ${h}`:`L ${d} ${h}`}).join(" ");else{const l=r/2,u=o/2,d=Yt(n,[s.x-l,s.y-u]),h=Yt(n,[s.x+l,s.y-u]),f=Yt(n,[s.x+l,s.y+u]),m=Yt(n,[s.x-l,s.y+u]);c=`M ${d[0]} ${d[1]} L ${h[0]} ${h[1]} L ${f[0]} ${f[1]} L ${m[0]} ${m[1]}`}return c+=" Z",[{name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-board",d:c,fill:"none",stroke:i.boardOutline,"stroke-width":(.1*Math.abs(n.a)).toString()}}]}function Q_n(t,e){const{transform:n,colorMap:i}=e,[r,o]=Yt(n,[t.x,t.y]),s=t.outer_diameter*Math.abs(n.a),a=t.outer_diameter*Math.abs(n.a),c=t.hole_diameter*Math.abs(n.a),l=t.hole_diameter*Math.abs(n.a),u=Math.min(s,a)/2,d=Math.min(c,l)/2;return{name:"g",type:"element",children:[{name:"circle",type:"element",attributes:{class:"pcb-hole-outer",fill:i.copper.top,cx:r.toString(),cy:o.toString(),r:u.toString()}},{name:"circle",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,cx:r.toString(),cy:o.toString(),r:d.toString()}}]}}function J_n(t,e){const{transform:n,colorMap:i}=e,[r,o]=Yt(n,[t.x,t.y]);if(t.hole_shape==="circle"||t.hole_shape==="square"){const s=t.hole_diameter*Math.abs(n.a),a=s/2;return t.hole_shape==="circle"?[{name:"circle",type:"element",attributes:{class:"pcb-hole",cx:r.toString(),cy:o.toString(),r:a.toString(),fill:i.drill},children:[],value:""}]:[{name:"rect",type:"element",attributes:{class:"pcb-hole",x:(r-a).toString(),y:(o-a).toString(),width:s.toString(),height:s.toString(),fill:i.drill},children:[],value:""}]}if(t.hole_shape==="oval"){const s=t.hole_width*Math.abs(n.a),a=t.hole_height*Math.abs(n.a),c=s/2,l=a/2;return[{name:"ellipse",type:"element",attributes:{class:"pcb-hole",cx:r.toString(),cy:o.toString(),rx:c.toString(),ry:l.toString(),fill:i.drill},children:[],value:""}]}return[]}var eyn=(t,e)=>{const n=ea(e).pcb_smtpad.get(t);if(n&&"x"in n&&"y"in n)return{x:n.x,y:n.y};const i=ea(e).pcb_plated_hole.get(t);return i&&"x"in i&&"y"in i?{x:i.x,y:i.y}:null},tyn=(t,e,n,i)=>{const r=n.getIdsConnectedToNet(e);let o=null,s=1/0;for(const a of r){const c=eyn(a,i);if(c){const l=t.x-c.x,u=t.y-c.y,d=Math.sqrt(l*l+u*u);d>0&&d<s&&(s=d,o=c)}}return o};function nyn(t,e){const{transform:n}=e,i=J6(t),r=t.filter(c=>c.type==="pcb_port"),o=t.filter(c=>c.type==="source_trace"),s=[];r.forEach((c,l)=>{const u=c.pcb_port_id;if(!u)return;const d=i.getNetConnectedToId(u);if(!d)return;let h=!1;const f=ea(t).source_port.getWhere({pcb_port_id:u});if(f&&f.source_port_id){const g=f.source_port_id;for(const b of o)if(Array.isArray(b.connected_source_port_ids)&&b.connected_source_port_ids.includes(g)&&Array.isArray(b.connected_source_net_ids)&&b.connected_source_net_ids.length>0){h=!0;break}}const m={x:c.x,y:c.y},y=tyn(m,d,i,t);y&&s.push({key:`${u}-${l}`,startPoint:m,endPoint:y,isInNet:h})});const a=[];for(const c of s){const l=Yt(n,[c.startPoint.x,c.startPoint.y]),u=Yt(n,[c.endPoint.x,c.endPoint.y]),d={x1:l[0].toString(),y1:l[1].toString(),x2:u[0].toString(),y2:u[1].toString(),stroke:"white","stroke-width":"1","stroke-dasharray":"6,6"};a.push({name:"line",type:"element",attributes:d,value:"",children:[]})}return a}function iyn(t,e){const{transform:n,colorMap:i}=e;if(t.shape==="rect"){const r=t,[o,s]=Yt(n,[r.center.x,r.center.y]),a=r.width*Math.abs(n.a),c=r.height*Math.abs(n.d),l=-(r.rotation??0);return[{name:"rect",type:"element",attributes:{class:"pcb-cutout pcb-cutout-rect",x:(-a/2).toString(),y:(-c/2).toString(),width:a.toString(),height:c.toString(),fill:i.drill,transform:aw(cs(Cs(o,s),ov(l*Math.PI/180)))},children:[],value:""}]}if(t.shape==="circle"){const r=t,[o,s]=Yt(n,[r.center.x,r.center.y]),a=r.radius*Math.abs(n.a);return[{name:"circle",type:"element",attributes:{class:"pcb-cutout pcb-cutout-circle",cx:o.toString(),cy:s.toString(),r:a.toString(),fill:i.drill},children:[],value:""}]}if(t.shape==="polygon"){const r=t;return!r.points||r.points.length===0?[]:[{name:"polygon",type:"element",attributes:{class:"pcb-cutout pcb-cutout-polygon",points:r.points.map(a=>Yt(n,[a.x,a.y])).map(a=>`${a[0]},${a[1]}`).join(" "),fill:i.drill},children:[],value:""}]}return[]}function NZe(t,e){if(t.length===0)return"";const n=t.map(r=>{const[o,s]=Yt(e,[r.x,r.y]);return{...r,x:o,y:s}});let i=`M ${n[0].x} ${n[0].y}`;for(let r=0;r<n.length;r++){const o=n[r],s=n[(r+1)%n.length];if(o.bulge){if(Math.hypot(s.x-o.x,s.y-o.y)<1e-9)continue;const a=o.bulge,c=s.x-o.x,l=s.y-o.y,u=Math.hypot(c,l),d=Math.abs(u/4/a*(a*a+1)),h=a<0?1:0,f=Math.abs(a)>1?1:0;i+=` A ${d} ${d} 0 ${f} ${h} ${s.x} ${s.y}`}else i+=` L ${s.x} ${s.y}`}return i+=" Z",i}function ryn(t,e){const{transform:n,layer:i,colorMap:r}=e,{layer:o}=t;if(i&&o!==i)return[];const s=hM(o,r),a="0.5";if(t.shape==="rect"){const[c,l]=Yt(n,[t.center.x,t.center.y]),u=t.width*Math.abs(n.a),d=t.height*Math.abs(n.d),h=-(t.rotation??0);return[{name:"rect",type:"element",attributes:{class:"pcb-copper-pour pcb-copper-pour-rect",x:(-u/2).toString(),y:(-d/2).toString(),width:u.toString(),height:d.toString(),fill:s,"fill-opacity":a,transform:aw(cs(Cs(c,l),ov(h*Math.PI/180))),"data-layer":o},children:[],value:""}]}if(t.shape==="polygon")return!t.points||t.points.length===0?[]:[{name:"polygon",type:"element",attributes:{class:"pcb-copper-pour pcb-copper-pour-polygon",points:t.points.map(u=>Yt(n,[u.x,u.y])).map(u=>`${u[0]},${u[1]}`).join(" "),fill:s,"fill-opacity":a,"data-layer":o},children:[],value:""}];if(t.shape==="brep"){const{brep_shape:c}=t;let l=NZe(c.outer_ring.vertices,n);for(const u of c.inner_rings??[])l+=` ${NZe(u.vertices,n)}`;return[{name:"path",type:"element",attributes:{class:"pcb-copper-pour pcb-copper-pour-brep",d:l,fill:s,"fill-rule":"evenodd","fill-opacity":a,"data-layer":o},children:[],value:""}]}return[]}function oyn(t,e){const{transform:n}=e,{center:i,width:r,height:o,rotation:s=0}=t,[a,c]=Yt(n,[i.x,i.y]),l=r*Math.abs(n.a),u=o*Math.abs(n.d),d=`translate(${a}, ${c}) rotate(${-s}) scale(1, -1)`;return!e.colorMap.debugComponent?.fill&&!e.colorMap.debugComponent?.stroke?[]:[{name:"g",type:"element",attributes:{transform:d},children:[{name:"rect",type:"element",attributes:{class:"pcb-component",x:(-l/2).toString(),y:(-u/2).toString(),width:l.toString(),height:u.toString(),fill:e.colorMap.debugComponent.fill??"transparent",stroke:e.colorMap.debugComponent.stroke??"transparent"}}],value:""}]}function oC(t){return t.find(n=>n.type==="project_software_metadata"||n.type==="source_project_metadata")?.software_used_string}var syn={version:"0.0.202"},sC=syn.version,kZe=["pcb_trace_error","pcb_plated_hole","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_silkscreen_text","pcb_silkscreen_path","pcb_via","pcb_cutout","pcb_copper_pour","pcb_smtpad","pcb_trace","pcb_component","pcb_board"];function $me(t,e){const n=e?.drawPaddingOutsideBoard??!0,i=e?.layer,r=e?.colorOverrides,o={copper:{top:r?.copper?.top??ex.copper.top,bottom:r?.copper?.bottom??ex.copper.bottom},drill:r?.drill??ex.drill,silkscreen:{top:r?.silkscreen?.top??ex.silkscreen.top,bottom:r?.silkscreen?.bottom??ex.silkscreen.bottom},boardOutline:r?.boardOutline??ex.boardOutline,soldermask:{top:r?.soldermask?.top??ex.soldermask.top,bottom:r?.soldermask?.bottom??ex.soldermask.bottom},debugComponent:{fill:r?.debugComponent?.fill??ex.debugComponent.fill,stroke:r?.debugComponent?.stroke??ex.debugComponent.stroke}};let s=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=Number.POSITIVE_INFINITY,d=Number.POSITIVE_INFINITY,h=Number.NEGATIVE_INFINITY,f=Number.NEGATIVE_INFINITY;for(const ke of t)if(ke.type==="pcb_board")ke.outline&&Array.isArray(ke.outline)&&ke.outline.length>=3?(Me(ke.outline),Ie(ke.outline)):"center"in ke&&"width"in ke&&"height"in ke&&(ue(ke.center,ke.width,ke.height),he(ke.center,ke.width,ke.height));else if("x"in ke&&"y"in ke)ue({x:ke.x,y:ke.y},0,0);else if(ke.type==="pcb_smtpad"){const ce=ke;ce.shape==="rect"||ce.shape==="rotated_rect"||ce.shape==="pill"?ue({x:ce.x,y:ce.y},ce.width,ce.height):ce.shape==="circle"?ue({x:ce.x,y:ce.y},ce.radius*2,ce.radius*2):ce.shape==="polygon"&&De(ce.points)}else"route"in ke?De(ke.route):ke.type==="pcb_silkscreen_text"||ke.type==="pcb_silkscreen_rect"||ke.type==="pcb_silkscreen_circle"||ke.type==="pcb_silkscreen_line"?Ge(ke):ke.type==="pcb_copper_pour"&&(ke.shape==="rect"?ue(ke.center,ke.width,ke.height):ke.shape==="polygon"&&De(ke.points));const m=n?1:0,y=n||!Number.isFinite(u)?s:u,g=n||!Number.isFinite(d)?a:d,b=n||!Number.isFinite(h)?c:h,v=n||!Number.isFinite(f)?l:f,w=b-y+2*m,T=v-g+2*m;let N=e?.width??800,R=e?.height??600;if(e?.matchBoardAspectRatio){const ke=h-u,ce=f-d;if(ke>0&&ce>0){const we=ke/ce;e?.width&&!e?.height?R=e.width/we:e?.height&&!e?.width?N=e.height*we:R=N/we}}const P=[];for(const ke of t)"route"in ke&&ke.route!==void 0&&P.push(ke.route);const M=N/w,I=R/T,A=Math.min(M,I),$=(N-w*A)/2,k=(R-T*A)/2,V=cs(Cs($-y*A+m*A,R-k+g*A-m*A),kg(A,-A)),X={transform:V,layer:i,shouldDrawErrors:e?.shouldDrawErrors,drawPaddingOutsideBoard:n,colorMap:o,renderSolderMask:e?.renderSolderMask};function W(ke){if(ke.type==="pcb_smtpad")return ke.layer==="top"||ke.layer==="bottom"?ke.layer:void 0;if(ke.type==="pcb_trace")for(const ce of ke.route??[]){const we="layer"in ce&&ce.layer||"from_layer"in ce&&ce.from_layer||"to_layer"in ce&&ce.to_layer||void 0;if(we==="top"||we==="bottom")return we}}function K(ke){return ke.type==="pcb_trace"||ke.type==="pcb_smtpad"}let te=t.sort((ke,ce)=>{const we=W(ke),xe=W(ce);if(K(ke)&&K(ce)&&we!==xe){if(we==="top")return 1;if(xe==="top"||we==="bottom")return-1;if(xe==="bottom")return 1}return(kZe.indexOf(ce.type)??9999)-(kZe.indexOf(ke.type)??9999)}).flatMap(ke=>ayn({elm:ke,circuitJson:t,ctx:X}));for(const ke of t)if("stroke_width"in ke){String(A*ke.stroke_width);break}if(e?.shouldDrawRatsNest){const ke=nyn(t,X);te=te.concat(ke)}const se=[{name:"style",type:"element",value:"",attributes:{},children:[{type:"text",value:"",name:"",attributes:{},children:[]}]},{name:"rect",type:"element",value:"",attributes:{class:"boundary",x:"0",y:"0",fill:e?.backgroundColor??"#000",width:N.toString(),height:R.toString()},children:[]}];n&&se.push(cyn(V,s,a,c,l)),se.push(...te);const de=oC(t),be=sC,re={name:"svg",type:"element",attributes:{xmlns:"http://www.w3.org/2000/svg",width:N.toString(),height:R.toString(),...de&&{"data-software-used-string":de},...e?.includeVersion&&{"data-circuit-to-svg-version":be}},value:"",children:se.filter(ke=>ke!==null)};try{return FP(re)}catch(ke){throw console.error("Error stringifying SVG object:",ke),ke}function ue(ke,ce,we){const xe=ce/2,Ye=we/2;s=Math.min(s,ke.x-xe),a=Math.min(a,ke.y-Ye),c=Math.max(c,ke.x+xe),l=Math.max(l,ke.y+Ye)}function he(ke,ce,we){const xe=ce/2,Ye=we/2;u=Math.min(u,ke.x-xe),d=Math.min(d,ke.y-Ye),h=Math.max(h,ke.x+xe),f=Math.max(f,ke.y+Ye)}function Me(ke){for(const ce of ke)s=Math.min(s,ce.x),a=Math.min(a,ce.y),c=Math.max(c,ce.x),l=Math.max(l,ce.y)}function Ie(ke){for(const ce of ke)u=Math.min(u,ce.x),d=Math.min(d,ce.y),h=Math.max(h,ce.x),f=Math.max(f,ce.y)}function De(ke){for(const ce of ke)s=Math.min(s,ce.x),a=Math.min(a,ce.y),c=Math.max(c,ce.x),l=Math.max(l,ce.y)}function Ge(ke){if(ke.type==="pcb_silkscreen_text")ue(ke.anchor_position,0,0);else if(ke.type==="pcb_silkscreen_path")De(ke.route);else if(ke.type==="pcb_silkscreen_rect")ue(ke.center,ke.width,ke.height);else if(ke.type==="pcb_silkscreen_circle")ue(ke.center,ke.radius*2,ke.radius*2);else if(ke.type==="pcb_silkscreen_line")ue({x:ke.x1,y:ke.y1},0,0),ue({x:ke.x2,y:ke.y2},0,0);else if(ke.type==="pcb_cutout"){const ce=ke;ce.shape==="rect"?ue(ce.center,ce.width,ce.height):ce.shape==="circle"?ue(ce.center,ce.radius*2,ce.radius*2):ce.shape==="polygon"&&De(ce.points)}}}function ayn({elm:t,circuitJson:e,ctx:n}){switch(t.type){case"pcb_trace_error":return F_n(t,e,n).filter(Boolean);case"pcb_component":return oyn(t,n).filter(Boolean);case"pcb_trace":return Z_n(t,n);case"pcb_copper_pour":return ryn(t,n);case"pcb_plated_hole":return j_n(t,n).filter(Boolean);case"pcb_hole":return J_n(t,n);case"pcb_smtpad":return K_n(t,n);case"pcb_silkscreen_text":return V_n(t,n);case"pcb_silkscreen_rect":return G_n(t,n);case"pcb_silkscreen_circle":return Y_n(t,n);case"pcb_silkscreen_line":return q_n(t,n);case"pcb_fabrication_note_path":return U_n(t,n);case"pcb_fabrication_note_text":return $_n(t,n);case"pcb_silkscreen_path":return H_n(t,n);case"pcb_board":return n.drawPaddingOutsideBoard?IZe(t,n):[];case"pcb_via":return Q_n(t,n);case"pcb_cutout":return iyn(t,n);default:return[]}}function cyn(t,e,n,i,r){const[o,s]=Yt(t,[e,n]),[a,c]=Yt(t,[i,r]),l=Math.abs(a-o),u=Math.abs(c-s),d=Math.min(o,a),h=Math.min(s,c);return{name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-boundary",fill:"none",stroke:"#fff","stroke-width":"0.3",x:d.toString(),y:h.toString(),width:l.toString(),height:u.toString()}}}var lyn=$me,Uj={fill:"none",stroke:"rgb(0,0,0)",strokeOpacity:"0.8",strokeWidthFactor:.2};function uyn(t,e,n={}){const{width:i,height:r,center:o,outline:s}=t;let a;if(s&&Array.isArray(s)&&s.length>=3)a=s.map((c,l)=>{const[u,d]=Yt(e,[c.x,c.y]);return l===0?`M ${u} ${d}`:`L ${u} ${d}`}).join(" ");else{const c=i/2,l=r/2,u=Yt(e,[o.x-c,o.y-l]),d=Yt(e,[o.x+c,o.y-l]),h=Yt(e,[o.x+c,o.y+l]),f=Yt(e,[o.x-c,o.y+l]);a=`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]} L ${h[0]} ${h[1]} L ${f[0]} ${f[1]}`}return a+=" Z",[{name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-board",d:a,fill:n.fill??Uj.fill,stroke:n.stroke??Uj.stroke,"stroke-opacity":n.strokeOpacity??Uj.strokeOpacity,"stroke-width":((n.strokeWidthFactor??Uj.strokeWidthFactor)*Math.abs(e.a)).toString()}}]}var dyn={pin_number:.15,negated_pin_number:.15*.8,reference_designator:.18,manufacturer_number:.18,net_label:.18,error:.05},aC=(t,e)=>e??dyn[t],l3=(t,e,n)=>Math.abs(t.a)*aC(e,n);function hyn(t,e){const{elm:n,portPosition:i,name:r,arePinsInterchangeable:o}=t,{transform:s}=e,{center:a,width:c,height:l,rotation:u=0,layer:d="top"}=n;if(!a||typeof c!="number"||typeof l!="number")return null;const[h,f]=Yt(s,[a.x,a.y]),[m,y]=Yt(s,[i.x,i.y]),g=c*Math.abs(s.a),b=l*Math.abs(s.d),v=y>f,w=m<h,T=[pyn(g,b,u,d),fyn(g,b,r??"")];return o||T.push(myn(g,b,u,d,v,w)),{name:"g",type:"element",value:"",attributes:{transform:`translate(${h}, ${f}) scale(1, -1)`},children:T}}function pyn(t,e,n,i){const r=t/2,o=e/2;return{name:"path",type:"element",attributes:{class:"assembly-component",d:_yn(r,o,n),"stroke-width":.8.toFixed(2),transform:`rotate(${-n})`,"stroke-dasharray":i==="bottom"?"2,2":""},value:"",children:[]}}function fyn(t,e,n,i){const r=Math.min(t,e),c=Math.min(58,Math.max(3,r*.8)),l=e>t;return{name:"text",type:"element",attributes:{x:"0",y:"0",class:"assembly-component-label","text-anchor":"middle",dy:".10em",style:"pointer-events: none","font-size":`${c.toFixed(1)}px`,transform:l?"rotate(90) scale(1, -1)":"scale(1, -1)"},children:[{type:"text",value:n||"",name:"",attributes:{},children:[]}],value:""}}function myn(t,e,n,i,r,o){const s=t/2,a=e/2,c=Math.min(s,a)*.5;let l;return r&&o?l=[[-s,-a],[-s+c,-a],[-s,-a+c]]:r&&!o?l=[[s,-a],[s-c,-a],[s,-a+c]]:!r&&o?l=[[-s,a],[-s+c,a],[-s,a-c]]:l=[[s,a],[s-c,a],[s,a-c]],{name:"polygon",type:"element",attributes:{class:"assembly-pin1-indicator",points:l.map(d=>d.join(",")).join(" "),fill:"#333",stroke:"none",transform:`rotate(${-n})`},value:"",children:[]}}function _yn(t,e,n){const i=(a,c,l)=>{const u=Math.PI/180*l,d=Math.cos(u),h=Math.sin(u);return[a*d-c*h,a*h+c*d]};return`${[[-t,-e],[t,-e],[t,e],[-t,e]].map(([a,c])=>i(a,c,n)).map(([a,c],l)=>l===0?`M${a},${c}`:`L${a},${c}`).join(" ")} Z`}var jme="rgb(190, 190, 190)";function yyn(t,e){const{transform:n}=e,[i,r]=Yt(n,[t.x,t.y]);if(t.hole_shape==="circle"||t.hole_shape==="square"){const o=t.hole_diameter*Math.abs(n.a),s=o/2;return t.hole_shape==="circle"?[{name:"circle",type:"element",attributes:{class:"assembly-hole",cx:i.toString(),cy:r.toString(),r:s.toString(),fill:jme},children:[],value:""}]:[{name:"rect",type:"element",attributes:{class:"assembly-hole",x:(i-s).toString(),y:(r-s).toString(),width:o.toString(),height:o.toString(),fill:jme},children:[],value:""}]}if(t.hole_shape==="oval"){const o=t.hole_width*Math.abs(n.a),s=t.hole_height*Math.abs(n.a),a=o/2,c=s/2;return[{name:"ellipse",type:"element",attributes:{class:"assembly-hole",cx:i.toString(),cy:r.toString(),rx:a.toString(),ry:c.toString(),fill:jme},children:[],value:""}]}return[]}var QI="rgb(210, 210, 210)",JI="rgb(190, 190, 190)";function gyn(t,e){const{transform:n}=e,[i,r]=Yt(n,[t.x,t.y]);if(t.shape==="pill"){const o=t.outer_width*Math.abs(n.a),s=t.outer_height*Math.abs(n.a),a=t.hole_width*Math.abs(n.a),c=t.hole_height*Math.abs(n.a),l=o/2,u=s-o,d=a/2;return[{name:"g",type:"element",children:[{name:"path",type:"element",attributes:{class:"assembly-hole-outer",fill:QI,d:`M${i-l},${r-u/2} v${u} a${l},${l} 0 0 0 ${o},0 v-${u} a${l},${l} 0 0 0 -${o},0 z`},value:"",children:[]},{name:"path",type:"element",attributes:{class:"assembly-hole-inner",fill:JI,d:`M${i-d},${r-(c-a)/2} v${c-a} a${d},${d} 0 0 0 ${a},0 v-${c-a} a${d},${d} 0 0 0 -${a},0 z`},value:"",children:[]}],value:"",attributes:{}}]}if(t.shape==="circle"){const o=t.outer_diameter*Math.abs(n.a),s=t.outer_diameter*Math.abs(n.a),a=t.hole_diameter*Math.abs(n.a),c=t.hole_diameter*Math.abs(n.a),l=Math.min(o,s)/2,u=Math.min(a,c)/2;return[{name:"g",type:"element",children:[{name:"circle",type:"element",attributes:{class:"assembly-hole-outer",fill:QI,cx:i.toString(),cy:r.toString(),r:l.toString()},value:"",children:[]},{name:"circle",type:"element",attributes:{class:"assembly-hole-inner",fill:JI,cx:i.toString(),cy:r.toString(),r:u.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(t.shape==="circular_hole_with_rect_pad"){const o=t,s=o.hole_diameter*Math.abs(n.a),a=o.rect_pad_width*Math.abs(n.a),c=o.rect_pad_height*Math.abs(n.a),l=(o.rect_border_radius??0)*Math.abs(n.a),u=s/2,[d,h]=Yt(n,[o.x+o.hole_offset_x,o.y+o.hole_offset_y]);return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"assembly-hole-outer-pad",fill:QI,x:(i-a/2).toString(),y:(r-c/2).toString(),width:a.toString(),height:c.toString(),...l?{rx:l.toString(),ry:l.toString()}:{}},value:"",children:[]},{name:"circle",type:"element",attributes:{class:"assembly-hole-inner",fill:JI,cx:d.toString(),cy:h.toString(),r:u.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(t.shape==="pill_hole_with_rect_pad"){const o=t,s=o.rect_pad_width*Math.abs(n.a),a=o.rect_pad_height*Math.abs(n.a),c=(o.rect_border_radius??0)*Math.abs(n.a),l=o.hole_height*Math.abs(n.a),u=o.hole_width*Math.abs(n.a),d=o,h=d.hole_offset_x??0,f=d.hole_offset_y??0,[m,y]=Yt(n,[o.x+h,o.y+f]),g=Math.min(l,u)/2;return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"assembly-hole-outer-pad",fill:QI,x:(i-s/2).toString(),y:(r-a/2).toString(),width:s.toString(),height:a.toString(),...c?{rx:c.toString(),ry:c.toString()}:{}},value:"",children:[]},{name:"rect",type:"element",attributes:{class:"assembly-hole-inner",fill:JI,x:(m-u/2).toString(),y:(y-l/2).toString(),width:u.toString(),height:l.toString(),rx:g.toString(),ry:g.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(t.shape==="rotated_pill_hole_with_rect_pad"){const o=t,s=o.rect_pad_width*Math.abs(n.a),a=o.rect_pad_height*Math.abs(n.a),c=(o.rect_border_radius??0)*Math.abs(n.a),l=o.hole_height*Math.abs(n.a),u=o.hole_width*Math.abs(n.a),d=o,h=d.hole_offset_x??0,f=d.hole_offset_y??0,[m,y]=Yt(n,[o.x+h,o.y+f]),g=Math.min(l,u)/2;return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"assembly-hole-outer-pad",fill:QI,x:(-s/2).toString(),y:(-a/2).toString(),width:s.toString(),height:a.toString(),transform:`translate(${i} ${r}) rotate(${-o.rect_ccw_rotation})`,...c?{rx:c.toString(),ry:c.toString()}:{}},value:"",children:[]},{name:"rect",type:"element",attributes:{class:"assembly-hole-inner",fill:JI,x:(-u/2).toString(),y:(-l/2).toString(),width:u.toString(),height:l.toString(),rx:g.toString(),ry:g.toString(),transform:`translate(${m} ${y}) rotate(${-o.hole_ccw_rotation})`},value:"",children:[]}],value:"",attributes:{}}]}return[]}var eN="rgb(210, 210, 210)";function byn(t,e){const{transform:n}=e;if(t.shape==="rect"||t.shape==="rotated_rect"){const i=t.width*Math.abs(n.a),r=t.height*Math.abs(n.d),[o,s]=Yt(n,[t.x,t.y]),a=(t.rect_border_radius??0)*Math.abs(n.a);return t.shape==="rotated_rect"&&t.ccw_rotation?[{name:"rect",type:"element",attributes:{class:"assembly-pad",fill:eN,x:(-i/2).toString(),y:(-r/2).toString(),width:i.toString(),height:r.toString(),transform:`translate(${o} ${s}) rotate(${-t.ccw_rotation})`,"data-layer":t.layer,...a?{rx:a.toString(),ry:a.toString()}:{}},value:"",children:[]}]:[{name:"rect",type:"element",attributes:{class:"assembly-pad",fill:eN,x:(o-i/2).toString(),y:(s-r/2).toString(),width:i.toString(),height:r.toString(),"data-layer":t.layer,...a?{rx:a.toString(),ry:a.toString()}:{}},value:"",children:[]}]}if(t.shape==="pill"){const i=t.width*Math.abs(n.a),r=t.height*Math.abs(n.d),o=t.radius*Math.abs(n.a),[s,a]=Yt(n,[t.x,t.y]);return[{name:"rect",type:"element",attributes:{class:"assembly-pad",fill:eN,x:(s-i/2).toString(),y:(a-r/2).toString(),width:i.toString(),height:r.toString(),rx:o.toString(),ry:o.toString(),"data-layer":t.layer},value:"",children:[]}]}if(t.shape==="circle"){const i=t.radius*Math.abs(n.a),[r,o]=Yt(n,[t.x,t.y]);return[{name:"circle",type:"element",attributes:{class:"assembly-pad",fill:eN,cx:r.toString(),cy:o.toString(),r:i.toString(),"data-layer":t.layer},value:"",children:[]}]}if(t.shape==="polygon"){const i=(t.points??[]).map(r=>Yt(n,[r.x,r.y]));return[{name:"polygon",type:"element",attributes:{class:"assembly-pad",fill:eN,points:i.map(r=>r.join(",")).join(" "),"data-layer":t.layer},value:"",children:[]}]}return[]}var OZe=["pcb_component","pcb_smtpad","pcb_hole","pcb_plated_hole","pcb_board"];function LZe(t,e){let n=Number.POSITIVE_INFINITY,i=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(const R of t)if(R.type==="pcb_board"){const P=R.center,M=R.width||0,I=R.height||0;n=Math.min(n,P.x-M/2),i=Math.min(i,P.y-I/2),r=Math.max(r,P.x+M/2),o=Math.max(o,P.y+I/2)}const s=1,a=r-n+2*s,c=o-i+2*s,l=e?.width??800,u=e?.height??600,d=l/a,h=u/c,f=Math.min(d,h),m=(l-a*f)/2,y=(u-c*f)/2,g=cs(Cs(m-n*f+s*f,u-y+i*f-s*f),kg(f,-f)),b={transform:g},v=t.sort((R,P)=>(OZe.indexOf(P.type)??9999)-(OZe.indexOf(R.type)??9999)).flatMap(R=>xyn(R,b,t)),w=oC(t),T=sC,N={name:"svg",type:"element",attributes:{xmlns:"http://www.w3.org/2000/svg",width:l.toString(),height:u.toString(),...w&&{"data-software-used-string":w},...e?.includeVersion&&{"data-circuit-to-svg-version":T}},value:"",children:[{name:"style",type:"element",children:[{type:"text",value:`
5302
5302
  .assembly-component {
5303
5303
  fill: none;
5304
5304
  stroke: #000;
@@ -5364,7 +5364,7 @@ ${A}
5364
5364
  \`\`\`
5365
5365
  ${P.type}: ${k}
5366
5366
  \`\`\``}m(I,U)},children:[he.jsx(jme,{className:"rf-w-4 rf-h-4"}),"Report Issue"]})]})]})};function zgn(n,e,t){const{transform:i,shouldDrawErrors:r}=t;if(!r)return[];const{pcb_port_ids:o}=n,s=e.find(h=>h.type==="pcb_port"&&h.pcb_port_id===o?.[0]),a=e.find(h=>h.type==="pcb_port"&&h.pcb_port_id===o?.[1]);if(!s||!a){const f=n.message?.match(/pcb_via\[#?(pcb_via_\d+)\]/)?.[1],m=e.find(y=>y.type==="pcb_via"&&y.pcb_via_id===f);if(m&&m.type==="pcb_via")return Fgn(n,m,t);if(n.center){const y=Yt(i,{x:n.center.x,y:n.center.y});return[{name:"rect",type:"element",attributes:{x:(y.x-5).toString(),y:(y.y-5).toString(),width:"10",height:"10",fill:"red",transform:`rotate(45 ${y.x} ${y.y})`},children:[],value:""},{name:"text",type:"element",attributes:{x:y.x.toString(),y:(y.y-15).toString(),fill:"red","font-family":"sans-serif","font-size":"12","text-anchor":"middle"},children:[{type:"text",value:n.message||"Pcb Trace Error",name:"",attributes:{},children:[]}],value:""}]}else return[]}const c=Yt(i,{x:s.x,y:s.y}),l=Yt(i,{x:a.x,y:a.y}),u={x:(c.x+l.x)/2,y:(c.y+l.y)/2};return isNaN(c.x)||isNaN(c.y)||isNaN(l.x)||isNaN(l.y)||isNaN(u.x)||isNaN(u.y)?[]:[{name:"line",type:"element",attributes:{x1:c.x.toString(),y1:c.y.toString(),x2:u.x.toString(),y2:u.y.toString(),stroke:"red","stroke-width":"1.5","stroke-dasharray":"2,2"},children:[],value:""},{name:"line",type:"element",attributes:{x1:u.x.toString(),y1:u.y.toString(),x2:l.x.toString(),y2:l.y.toString(),stroke:"red","stroke-width":"1.5","stroke-dasharray":"2,2"},children:[],value:""},{name:"rect",type:"element",attributes:{x:(u.x-5).toString(),y:(u.y-5).toString(),width:"10",height:"10",fill:"red",transform:`rotate(45 ${u.x} ${u.y})`},children:[],value:""},{name:"text",type:"element",attributes:{x:u.x.toString(),y:(u.y-15).toString(),fill:"red","font-family":"sans-serif","font-size":"12","text-anchor":"middle"},children:[{type:"text",value:n.message||"Pcb Trace Error",name:"",attributes:{},children:[]}],value:""}]}function Fgn(n,e,t){const{transform:i}=t;if(n.center&&e){const r=Yt(i,{x:n.center.x,y:n.center.y}),o=Yt(i,{x:e.x,y:e.y}),s=o.x-r.x,a=o.y-r.y,c=Math.sqrt(s*s+a*a),l=Math.atan2(a,s)*180/Math.PI,d=c+10*2,h=20,f=(r.x+o.x)/2,m=(r.y+o.y)/2;return[{name:"rect",type:"element",attributes:{x:(f-d/2).toString(),y:(m-h/2).toString(),width:d.toString(),height:h.toString(),fill:"none",stroke:"red","stroke-width":"1","stroke-dasharray":"3,2",transform:`rotate(${l} ${f} ${m})`},children:[],value:""},{name:"rect",type:"element",attributes:{x:(f-5).toString(),y:(m-5).toString(),width:"10",height:"10",fill:"red",transform:`rotate(45 ${f} ${m})`},children:[],value:""},{name:"text",type:"element",attributes:{x:f.toString(),y:(m-h/2-5).toString(),fill:"red","font-family":"sans-serif","font-size":"12","text-anchor":"middle"},children:[{type:"text",value:n.message||"Pcb Trace Error",name:"",attributes:{},children:[]}],value:""}]}return[]}function $gn(n,e){const{transform:t,layer:i}=e;if(!n.route||!Array.isArray(n.route))return[];const r=n.route[0],o=n.route[n.route.length-1],s=r.x===o.x&&r.y===o.y,a=n.route.slice(0,s?-1:void 0).map((c,l)=>{const[u,d]=Yt(t,[c.x,c.y]);return l===0?`M ${u} ${d}`:`L ${u} ${d}`}).join(" ")+(s?" Z":"");return[{name:"path",type:"element",attributes:{class:"pcb-fabrication-note-path",stroke:n.color||"rgba(255,255,255,0.5)",fill:"none",d:a,"stroke-width":(n.stroke_width*Math.abs(t.a)).toString(),"data-pcb-component-id":n.pcb_component_id,"data-pcb-fabrication-note-path-id":n.pcb_fabrication_note_path_id},value:"",children:[]}]}function Bgn(n,e){const{transform:t,layer:i}=e,{anchor_position:r,anchor_alignment:o,text:s,font_size:a=1,layer:c="top",color:l}=n;if(i&&c!==i)return[];if(!r||typeof r.x!="number"||typeof r.y!="number")return console.error("Invalid anchor_position:",r),[];const[u,d]=Yt(t,[r.x,r.y]),h=a*Math.abs(t.a),f=ls(Rs(u,d),sv(Math.PI/180));return[{name:"text",type:"element",attributes:{x:"0",y:"0","font-family":"Arial, sans-serif","font-size":h.toString(),"text-anchor":"middle","dominant-baseline":"central",transform:iw(f),class:"pcb-fabrication-note-text",fill:l||"rgba(255,255,255,0.5)"},children:[{type:"text",value:s,name:"",attributes:{},children:[]}],value:""}]}function Ugn(n,e){const{transform:t,colorMap:i}=e,[r,o]=Yt(t,[n.x,n.y]);if(n.shape==="pill"){const s=n.outer_width*Math.abs(t.a),a=n.outer_height*Math.abs(t.a),c=n.hole_width*Math.abs(t.a),l=n.hole_height*Math.abs(t.a),u=s/2,d=c/2,h=a-s,f=n.ccw_rotation||0,m=f?`translate(${r} ${o}) rotate(${-f})`:`translate(${r} ${o})`,y=f?`translate(${r} ${o}) rotate(${-f})`:`translate(${r} ${o})`;return[{name:"g",type:"element",children:[{name:"path",type:"element",attributes:{class:"pcb-hole-outer",fill:i.copper.top,d:`M${-u},${-h/2} v${h} a${u},${u} 0 0 0 ${s},0 v-${h} a${u},${u} 0 0 0 -${s},0 z`,transform:m},value:"",children:[]},{name:"path",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,d:`M${-d},${-(l-c)/2} v${l-c} a${d},${d} 0 0 0 ${c},0 v-${l-c} a${d},${d} 0 0 0 -${c},0 z`,transform:y},value:"",children:[]}],value:"",attributes:{}}]}if(n.shape==="circle"){const s=n.outer_diameter*Math.abs(t.a),a=n.outer_diameter*Math.abs(t.a),c=n.hole_diameter*Math.abs(t.a),l=n.hole_diameter*Math.abs(t.a),u=Math.min(s,a)/2,d=Math.min(c,l)/2;return[{name:"g",type:"element",children:[{name:"circle",type:"element",attributes:{class:"pcb-hole-outer",fill:i.copper.top,cx:r.toString(),cy:o.toString(),r:u.toString()},value:"",children:[]},{name:"circle",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,cx:r.toString(),cy:o.toString(),r:d.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(n.shape==="circular_hole_with_rect_pad"){const s=n,a=n.hole_diameter*Math.abs(t.a),c=n.rect_pad_width*Math.abs(t.a),l=n.rect_pad_height*Math.abs(t.a),u=(n.rect_border_radius??0)*Math.abs(t.a),d=a/2,[h,f]=Yt(t,[s.x+(s.hole_offset_x??0),s.y+(s.hole_offset_y??0)]);return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"pcb-hole-outer-pad",fill:i.copper.top,x:(r-c/2).toString(),y:(o-l/2).toString(),width:c.toString(),height:l.toString(),...u?{rx:u.toString(),ry:u.toString()}:{}},value:"",children:[]},{name:"circle",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,cx:h.toString(),cy:f.toString(),r:d.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(n.shape==="pill_hole_with_rect_pad"){const s=n,a=s.rect_pad_width*Math.abs(t.a),c=s.rect_pad_height*Math.abs(t.a),l=(s.rect_border_radius??0)*Math.abs(t.a),u=s.hole_height*Math.abs(t.a),d=s.hole_width*Math.abs(t.a),h=s,f=h.hole_offset_x??0,m=h.hole_offset_y??0,[y,g]=Yt(t,[s.x+f,s.y+m]),b=Math.min(u,d)/2;return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"pcb-hole-outer-pad",fill:i.copper.top,x:(r-a/2).toString(),y:(o-c/2).toString(),width:a.toString(),height:c.toString(),...l?{rx:l.toString(),ry:l.toString()}:{}},value:"",children:[]},{name:"rect",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,x:(y-d/2).toString(),y:(g-u/2).toString(),width:d.toString(),height:u.toString(),rx:b.toString(),ry:b.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(n.shape==="rotated_pill_hole_with_rect_pad"){const s=n,a=s.rect_pad_width*Math.abs(t.a),c=s.rect_pad_height*Math.abs(t.a),l=(s.rect_border_radius??0)*Math.abs(t.a),u=s.hole_height*Math.abs(t.a),d=s.hole_width*Math.abs(t.a),h=s,f=h.hole_offset_x??0,m=h.hole_offset_y??0,[y,g]=Yt(t,[s.x+f,s.y+m]),b=Math.min(u,d)/2;return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"pcb-hole-outer-pad",fill:i.copper.top,x:(-a/2).toString(),y:(-c/2).toString(),width:a.toString(),height:c.toString(),transform:`translate(${r} ${o}) rotate(${-s.rect_ccw_rotation})`,...l?{rx:l.toString(),ry:l.toString()}:{}},value:"",children:[]},{name:"rect",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,x:(-d/2).toString(),y:(-u/2).toString(),width:d.toString(),height:u.toString(),rx:b.toString(),ry:b.toString(),transform:`translate(${y} ${g}) rotate(${-s.hole_ccw_rotation})`},value:"",children:[]}],value:"",attributes:{}}]}return[]}function jgn(n,e){const{transform:t,layer:i,colorMap:r}=e;if(!n.route||!Array.isArray(n.route))return[];let o=n.route.map((u,d)=>{const[h,f]=Yt(t,[u.x,u.y]);return d===0?`M ${h} ${f}`:`L ${h} ${f}`}).join(" ");const s=n.route[0],a=n.route[n.route.length-1];s&&a&&s.x===a.x&&s.y===a.y&&(o+=" Z");const c=n.layer||"top";if(i&&c!==i)return[];const l=c==="bottom"?r.silkscreen.bottom:r.silkscreen.top;return[{name:"path",type:"element",attributes:{class:`pcb-silkscreen pcb-silkscreen-${c}`,d:o,fill:"none",stroke:l,"stroke-width":(n.stroke_width*Math.abs(t.a)).toString(),"stroke-linecap":"round","stroke-linejoin":"round","data-pcb-component-id":n.pcb_component_id,"data-pcb-silkscreen-path-id":n.pcb_silkscreen_path_id},value:"",children:[]}]}function Hgn(n,e){const{transform:t,layer:i,colorMap:r}=e,{anchor_position:o,text:s,font_size:a=1,layer:c="top",ccw_rotation:l=0,anchor_alignment:u="center"}=n;if(i&&c!==i)return[];if(!o||typeof o.x!="number"||typeof o.y!="number")return console.error("Invalid anchor_position:",o),[];const[d,h]=Yt(t,[o.x,o.y]),f=a*Math.abs(t.a);let m="middle",y="central";const g=0,b=0;switch(u){case"top_left":m="start",y="text-before-edge";break;case"top_center":m="middle",y="text-before-edge";break;case"top_right":m="end",y="text-before-edge";break;case"center_left":m="start",y="central";break;case"center_right":m="end",y="central";break;case"bottom_left":m="start",y="text-after-edge";break;case"bottom_center":m="middle",y="text-after-edge";break;case"bottom_right":m="end",y="text-after-edge";break;case"center":default:m="middle",y="central";break}const v=ls(Rs(d,h),sv(-l*Math.PI/180),...c==="bottom"?[kg(-1,1)]:[]),w=c==="bottom"?r.silkscreen.bottom:r.silkscreen.top,T=s.split(`
5367
- `),N=T.length===1?[{type:"text",value:s,name:"",attributes:{},children:[]}]:T.map((P,M)=>({type:"element",name:"tspan",value:"",attributes:{x:"0",...M>0?{dy:f.toString()}:{}},children:[{type:"text",value:P,name:"",attributes:{},children:[]}]}));return[{name:"text",type:"element",attributes:{x:"0",y:"0",dx:g.toString(),dy:b.toString(),fill:w,"font-family":"Arial, sans-serif","font-size":f.toString(),"text-anchor":m,"dominant-baseline":y,transform:iw(v),class:`pcb-silkscreen-text pcb-silkscreen-${c}`,"data-pcb-silkscreen-text-id":n.pcb_component_id,stroke:"none"},children:N,value:""}]}function Vgn(n,e){const{transform:t,layer:i,colorMap:r}=e,{center:o,width:s,height:a,layer:c="top",pcb_silkscreen_rect_id:l,stroke_width:u,is_filled:d,has_stroke:h,is_stroke_dashed:f}=n;if(i&&c!==i)return[];if(!o||typeof o.x!="number"||typeof o.y!="number"||typeof s!="number"||typeof a!="number")return console.error("Invalid rectangle data:",{center:o,width:s,height:a}),[];const[m,y]=Yt(t,[o.x,o.y]),g=s*Math.abs(t.a),b=a*Math.abs(t.d),v=u*Math.abs(t.a),w=c==="bottom"?r.silkscreen.bottom:r.silkscreen.top,T={x:(m-g/2).toString(),y:(y-b/2).toString(),width:g.toString(),height:b.toString(),class:`pcb-silkscreen-rect pcb-silkscreen-${c}`,"data-pcb-silkscreen-rect-id":l};T.fill=d?w:"none";let N;if(h===void 0?N=v>0:N=h,N){if(T.stroke=w,T["stroke-width"]=v.toString(),f){const P=.1*Math.abs(t.a),M=.05*Math.abs(t.a);T["stroke-dasharray"]=`${P} ${M}`}}else T.stroke="none";return[{name:"rect",type:"element",attributes:T,value:"",children:[]}]}function Ggn(n,e){const{transform:t,layer:i,colorMap:r}=e,{center:o,radius:s,layer:a="top",pcb_silkscreen_circle_id:c,stroke_width:l=1}=n;if(i&&a!==i)return[];if(!o||typeof o.x!="number"||typeof o.y!="number"||typeof s!="number")return console.error("Invalid PCB Silkscreen Circle data:",{center:o,radius:s}),[];const[u,d]=Yt(t,[o.x,o.y]),h=s*Math.abs(t.a),f=l*Math.abs(t.a),m=a==="bottom"?r.silkscreen.bottom:r.silkscreen.top;return[{name:"circle",type:"element",attributes:{cx:u.toString(),cy:d.toString(),r:h.toString(),class:`pcb-silkscreen-circle pcb-silkscreen-${a}`,stroke:m,"stroke-width":f.toString(),"data-pcb-silkscreen-circle-id":c},value:"",children:[]}]}function Ygn(n,e){const{transform:t,layer:i,colorMap:r}=e,{x1:o,y1:s,x2:a,y2:c,stroke_width:l,layer:u="top",pcb_silkscreen_line_id:d}=n;if(i&&u!==i)return[];if(typeof o!="number"||typeof s!="number"||typeof a!="number"||typeof c!="number")return console.error("Invalid coordinates:",{x1:o,y1:s,x2:a,y2:c}),[];const[h,f]=Yt(t,[o,s]),[m,y]=Yt(t,[a,c]),g=l*Math.abs(t.a),b=u==="bottom"?r.silkscreen.bottom:r.silkscreen.top;return[{name:"line",type:"element",attributes:{x1:h.toString(),y1:f.toString(),x2:m.toString(),y2:y.toString(),stroke:b,"stroke-width":g.toString(),class:`pcb-silkscreen-line pcb-silkscreen-${u}`,"data-pcb-silkscreen-line-id":d},value:"",children:[]}]}function qgn(n){const e=[];for(let t=0;t<n.length-1;t++)e.push([n[t],n[t+1]]);return e}var ex={copper:{top:"rgb(200, 52, 52)",bottom:"rgb(77, 127, 196)"},soldermask:{top:"rgb(200, 52, 52)",bottom:"rgb(77, 127, 196)"},drill:"#FF26E2",silkscreen:{top:"#f2eda1",bottom:"#5da9e9"},boardOutline:"rgba(255, 255, 255, 0.5)",debugComponent:{fill:null,stroke:null}};ex.drill,ex.silkscreen.top,ex.silkscreen.bottom,ex.copper.top,ex.copper.bottom;function vM(n,e=ex){return e.copper[n]??"white"}var Xgn={bottom:"rgb(105, 105, 105)",top:"rgb(105, 105, 105)"};function fH(n){return Xgn[n]??"rgb(105, 105, 105)"}function Wgn(n,e){const{transform:t,layer:i,colorMap:r,renderSolderMask:o}=e;if(!n.route||!Array.isArray(n.route)||n.route.length<2)return[];const s=qgn(n.route),a=[];for(const[c,l]of s){const u=Yt(t,[c.x,c.y]),d=Yt(t,[l.x,l.y]),h="layer"in c?c.layer:"layer"in l?l.layer:null;if(!h||i&&h!==i)continue;const f=vM(h,r),m=r.soldermask[h]??f,y="width"in c?c.width:"width"in l?l.width:null,g=y?(y*Math.abs(t.a)).toString():"0.3";if(o){const b={name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-trace",stroke:f,fill:"none",d:`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]}`,"stroke-width":g,"stroke-linecap":"round","stroke-linejoin":"round","shape-rendering":"crispEdges","data-layer":h}},v={name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-soldermask",stroke:m,fill:"none",d:`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]}`,"stroke-width":g,"stroke-linecap":"round","stroke-linejoin":"round","shape-rendering":"crispEdges","data-layer":h}};a.push(v,b)}else{const b={name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-trace",stroke:m,fill:"none",d:`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]}`,"stroke-width":g,"stroke-linecap":"round","stroke-linejoin":"round","shape-rendering":"crispEdges","data-layer":h}};a.push(b)}}return a.sort((c,l)=>{const u=c.attributes["data-layer"],d=l.attributes["data-layer"];return u==="bottom"&&d!=="bottom"?-1:u==="top"&&d!=="top"?1:0}),a}function Zgn(n,e){const{transform:t,layer:i,colorMap:r}=e;if(i&&n.layer!==i)return[];const o=!!n?.is_covered_with_solder_mask,s=r.soldermask[n.layer]??r.soldermask.top;if(n.shape==="rect"||n.shape==="rotated_rect"){const a=n.width*Math.abs(t.a),c=n.height*Math.abs(t.d),[l,u]=Yt(t,[n.x,n.y]),d=(n.rect_border_radius??0)*Math.abs(t.a);if(n.shape==="rotated_rect"&&n.ccw_rotation){const m={name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:vM(n.layer,r),x:(-a/2).toString(),y:(-c/2).toString(),width:a.toString(),height:c.toString(),transform:`translate(${l} ${u}) rotate(${-n.ccw_rotation})`,"data-layer":n.layer,...d?{rx:d.toString(),ry:d.toString()}:{}}};if(!o)return[m];const y={name:m.name,type:m.type,value:"",children:[],attributes:{...m.attributes,class:"pcb-solder-mask",fill:s}};return[m,y]}const h={name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:vM(n.layer,r),x:(l-a/2).toString(),y:(u-c/2).toString(),width:a.toString(),height:c.toString(),"data-layer":n.layer,...d?{rx:d.toString(),ry:d.toString()}:{}}};if(!o)return[h];const f={name:h.name,type:h.type,value:"",children:[],attributes:{...h.attributes,class:"pcb-solder-mask",fill:s}};return[h,f]}if(n.shape==="pill"){const a=n.width*Math.abs(t.a),c=n.height*Math.abs(t.d),l=n.radius*Math.abs(t.a),[u,d]=Yt(t,[n.x,n.y]),h={name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:vM(n.layer,r),x:(u-a/2).toString(),y:(d-c/2).toString(),width:a.toString(),height:c.toString(),rx:l.toString(),ry:l.toString(),"data-layer":n.layer}};if(!o)return[h];const f={name:h.name,type:h.type,value:"",children:[],attributes:{...h.attributes,class:"pcb-solder-mask",fill:s}};return[h,f]}if(n.shape==="circle"){const a=n.radius*Math.abs(t.a),[c,l]=Yt(t,[n.x,n.y]),u={name:"circle",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:vM(n.layer,r),cx:c.toString(),cy:l.toString(),r:a.toString(),"data-layer":n.layer}};if(!o)return[u];const d={name:u.name,type:u.type,value:"",children:[],attributes:{...u.attributes,class:"pcb-solder-mask",fill:s}};return[u,d]}if(n.shape==="polygon"){const a=(n.points??[]).map(u=>Yt(t,[u.x,u.y])),c={name:"polygon",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:vM(n.layer,r),points:a.map(u=>u.join(",")).join(" "),"data-layer":n.layer}};if(!o)return[c];const l={name:c.name,type:c.type,value:"",children:[],attributes:{...c.attributes,class:"pcb-solder-mask",fill:s}};return[c,l]}return[]}function zKe(n,e){const{transform:t,colorMap:i}=e,{width:r,height:o,center:s,outline:a}=n;let c;if(a&&Array.isArray(a)&&a.length>=3)c=a.map((l,u)=>{const[d,h]=Yt(t,[l.x,l.y]);return u===0?`M ${d} ${h}`:`L ${d} ${h}`}).join(" ");else{const l=r/2,u=o/2,d=Yt(t,[s.x-l,s.y-u]),h=Yt(t,[s.x+l,s.y-u]),f=Yt(t,[s.x+l,s.y+u]),m=Yt(t,[s.x-l,s.y+u]);c=`M ${d[0]} ${d[1]} L ${h[0]} ${h[1]} L ${f[0]} ${f[1]} L ${m[0]} ${m[1]}`}return c+=" Z",[{name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-board",d:c,fill:"none",stroke:i.boardOutline,"stroke-width":(.1*Math.abs(t.a)).toString()}}]}function Kgn(n,e){const{transform:t,colorMap:i}=e,[r,o]=Yt(t,[n.x,n.y]),s=n.outer_diameter*Math.abs(t.a),a=n.outer_diameter*Math.abs(t.a),c=n.hole_diameter*Math.abs(t.a),l=n.hole_diameter*Math.abs(t.a),u=Math.min(s,a)/2,d=Math.min(c,l)/2;return{name:"g",type:"element",children:[{name:"circle",type:"element",attributes:{class:"pcb-hole-outer",fill:i.copper.top,cx:r.toString(),cy:o.toString(),r:u.toString()}},{name:"circle",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,cx:r.toString(),cy:o.toString(),r:d.toString()}}]}}function Qgn(n,e){const{transform:t,colorMap:i}=e,[r,o]=Yt(t,[n.x,n.y]);if(n.hole_shape==="circle"||n.hole_shape==="square"){const s=n.hole_diameter*Math.abs(t.a),a=s/2;return n.hole_shape==="circle"?[{name:"circle",type:"element",attributes:{class:"pcb-hole",cx:r.toString(),cy:o.toString(),r:a.toString(),fill:i.drill},children:[],value:""}]:[{name:"rect",type:"element",attributes:{class:"pcb-hole",x:(r-a).toString(),y:(o-a).toString(),width:s.toString(),height:s.toString(),fill:i.drill},children:[],value:""}]}if(n.hole_shape==="oval"){const s=n.hole_width*Math.abs(t.a),a=n.hole_height*Math.abs(t.a),c=s/2,l=a/2;return[{name:"ellipse",type:"element",attributes:{class:"pcb-hole",cx:r.toString(),cy:o.toString(),rx:c.toString(),ry:l.toString(),fill:i.drill},children:[],value:""}]}return[]}var Jgn=(n,e)=>{const t=ta(e).pcb_smtpad.get(n);if(t&&"x"in t&&"y"in t)return{x:t.x,y:t.y};const i=ta(e).pcb_plated_hole.get(n);return i&&"x"in i&&"y"in i?{x:i.x,y:i.y}:null},e1n=(n,e,t,i)=>{const r=t.getIdsConnectedToNet(e);let o=null,s=1/0;for(const a of r){const c=Jgn(a,i);if(c){const l=n.x-c.x,u=n.y-c.y,d=Math.sqrt(l*l+u*u);d>0&&d<s&&(s=d,o=c)}}return o};function t1n(n,e){const{transform:t}=e,i=e6(n),r=n.filter(c=>c.type==="pcb_port"),o=n.filter(c=>c.type==="source_trace"),s=[];r.forEach((c,l)=>{const u=c.pcb_port_id;if(!u)return;const d=i.getNetConnectedToId(u);if(!d)return;let h=!1;const f=ta(n).source_port.getWhere({pcb_port_id:u});if(f&&f.source_port_id){const g=f.source_port_id;for(const b of o)if(Array.isArray(b.connected_source_port_ids)&&b.connected_source_port_ids.includes(g)&&Array.isArray(b.connected_source_net_ids)&&b.connected_source_net_ids.length>0){h=!0;break}}const m={x:c.x,y:c.y},y=e1n(m,d,i,n);y&&s.push({key:`${u}-${l}`,startPoint:m,endPoint:y,isInNet:h})});const a=[];for(const c of s){const l=Yt(t,[c.startPoint.x,c.startPoint.y]),u=Yt(t,[c.endPoint.x,c.endPoint.y]),d={x1:l[0].toString(),y1:l[1].toString(),x2:u[0].toString(),y2:u[1].toString(),stroke:"white","stroke-width":"1","stroke-dasharray":"6,6"};a.push({name:"line",type:"element",attributes:d,value:"",children:[]})}return a}function n1n(n,e){const{transform:t,colorMap:i}=e;if(n.shape==="rect"){const r=n,[o,s]=Yt(t,[r.center.x,r.center.y]),a=r.width*Math.abs(t.a),c=r.height*Math.abs(t.d),l=-(r.rotation??0);return[{name:"rect",type:"element",attributes:{class:"pcb-cutout pcb-cutout-rect",x:(-a/2).toString(),y:(-c/2).toString(),width:a.toString(),height:c.toString(),fill:i.drill,transform:iw(ls(Rs(o,s),sv(l*Math.PI/180)))},children:[],value:""}]}if(n.shape==="circle"){const r=n,[o,s]=Yt(t,[r.center.x,r.center.y]),a=r.radius*Math.abs(t.a);return[{name:"circle",type:"element",attributes:{class:"pcb-cutout pcb-cutout-circle",cx:o.toString(),cy:s.toString(),r:a.toString(),fill:i.drill},children:[],value:""}]}if(n.shape==="polygon"){const r=n;return!r.points||r.points.length===0?[]:[{name:"polygon",type:"element",attributes:{class:"pcb-cutout pcb-cutout-polygon",points:r.points.map(a=>Yt(t,[a.x,a.y])).map(a=>`${a[0]},${a[1]}`).join(" "),fill:i.drill},children:[],value:""}]}return[]}function FKe(n,e){if(n.length===0)return"";const t=n.map(r=>{const[o,s]=Yt(e,[r.x,r.y]);return{...r,x:o,y:s}});let i=`M ${t[0].x} ${t[0].y}`;for(let r=0;r<t.length;r++){const o=t[r],s=t[(r+1)%t.length];if(o.bulge){if(Math.hypot(s.x-o.x,s.y-o.y)<1e-9)continue;const a=o.bulge,c=s.x-o.x,l=s.y-o.y,u=Math.hypot(c,l),d=Math.abs(u/4/a*(a*a+1)),h=a<0?1:0,f=Math.abs(a)>1?1:0;i+=` A ${d} ${d} 0 ${f} ${h} ${s.x} ${s.y}`}else i+=` L ${s.x} ${s.y}`}return i+=" Z",i}function i1n(n,e){const{transform:t,layer:i,colorMap:r}=e,{layer:o}=n;if(i&&o!==i)return[];const s=vM(o,r),a="0.5";if(n.shape==="rect"){const[c,l]=Yt(t,[n.center.x,n.center.y]),u=n.width*Math.abs(t.a),d=n.height*Math.abs(t.d),h=-(n.rotation??0);return[{name:"rect",type:"element",attributes:{class:"pcb-copper-pour pcb-copper-pour-rect",x:(-u/2).toString(),y:(-d/2).toString(),width:u.toString(),height:d.toString(),fill:s,"fill-opacity":a,transform:iw(ls(Rs(c,l),sv(h*Math.PI/180))),"data-layer":o},children:[],value:""}]}if(n.shape==="polygon")return!n.points||n.points.length===0?[]:[{name:"polygon",type:"element",attributes:{class:"pcb-copper-pour pcb-copper-pour-polygon",points:n.points.map(u=>Yt(t,[u.x,u.y])).map(u=>`${u[0]},${u[1]}`).join(" "),fill:s,"fill-opacity":a,"data-layer":o},children:[],value:""}];if(n.shape==="brep"){const{brep_shape:c}=n;let l=FKe(c.outer_ring.vertices,t);for(const u of c.inner_rings??[])l+=` ${FKe(u.vertices,t)}`;return[{name:"path",type:"element",attributes:{class:"pcb-copper-pour pcb-copper-pour-brep",d:l,fill:s,"fill-rule":"evenodd","fill-opacity":a,"data-layer":o},children:[],value:""}]}return[]}function r1n(n,e){const{transform:t}=e,{center:i,width:r,height:o,rotation:s=0}=n,[a,c]=Yt(t,[i.x,i.y]),l=r*Math.abs(t.a),u=o*Math.abs(t.d),d=`translate(${a}, ${c}) rotate(${-s}) scale(1, -1)`;return!e.colorMap.debugComponent?.fill&&!e.colorMap.debugComponent?.stroke?[]:[{name:"g",type:"element",attributes:{transform:d},children:[{name:"rect",type:"element",attributes:{class:"pcb-component",x:(-l/2).toString(),y:(-u/2).toString(),width:l.toString(),height:u.toString(),fill:e.colorMap.debugComponent.fill??"transparent",stroke:e.colorMap.debugComponent.stroke??"transparent"}}],value:""}]}function mC(n){return n.find(t=>t.type==="project_software_metadata"||t.type==="source_project_metadata")?.software_used_string}var o1n={version:"0.0.201"},_C=o1n.version,$Ke=["pcb_trace_error","pcb_plated_hole","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_silkscreen_text","pcb_silkscreen_path","pcb_via","pcb_cutout","pcb_copper_pour","pcb_smtpad","pcb_trace","pcb_component","pcb_board"];function P_e(n,e){const t=e?.drawPaddingOutsideBoard??!0,i=e?.layer,r=e?.colorOverrides,o={copper:{top:r?.copper?.top??ex.copper.top,bottom:r?.copper?.bottom??ex.copper.bottom},drill:r?.drill??ex.drill,silkscreen:{top:r?.silkscreen?.top??ex.silkscreen.top,bottom:r?.silkscreen?.bottom??ex.silkscreen.bottom},boardOutline:r?.boardOutline??ex.boardOutline,soldermask:{top:r?.soldermask?.top??ex.soldermask.top,bottom:r?.soldermask?.bottom??ex.soldermask.bottom},debugComponent:{fill:r?.debugComponent?.fill??ex.debugComponent.fill,stroke:r?.debugComponent?.stroke??ex.debugComponent.stroke}};let s=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=Number.POSITIVE_INFINITY,d=Number.POSITIVE_INFINITY,h=Number.NEGATIVE_INFINITY,f=Number.NEGATIVE_INFINITY;for(const Ne of n)if(Ne.type==="pcb_board")Ne.outline&&Array.isArray(Ne.outline)&&Ne.outline.length>=3?(Ee(Ne.outline),Re(Ne.outline)):"center"in Ne&&"width"in Ne&&"height"in Ne&&(oe(Ne.center,Ne.width,Ne.height),pe(Ne.center,Ne.width,Ne.height));else if("x"in Ne&&"y"in Ne)oe({x:Ne.x,y:Ne.y},0,0);else if(Ne.type==="pcb_smtpad"){const le=Ne;le.shape==="rect"||le.shape==="rotated_rect"||le.shape==="pill"?oe({x:le.x,y:le.y},le.width,le.height):le.shape==="circle"?oe({x:le.x,y:le.y},le.radius*2,le.radius*2):le.shape==="polygon"&&Oe(le.points)}else"route"in Ne?Oe(Ne.route):Ne.type==="pcb_silkscreen_text"||Ne.type==="pcb_silkscreen_rect"||Ne.type==="pcb_silkscreen_circle"||Ne.type==="pcb_silkscreen_line"?Ve(Ne):Ne.type==="pcb_copper_pour"&&(Ne.shape==="rect"?oe(Ne.center,Ne.width,Ne.height):Ne.shape==="polygon"&&Oe(Ne.points));const m=t?1:0,y=t||!Number.isFinite(u)?s:u,g=t||!Number.isFinite(d)?a:d,b=t||!Number.isFinite(h)?c:h,v=t||!Number.isFinite(f)?l:f,w=b-y+2*m,T=v-g+2*m;let N=e?.width??800,R=e?.height??600;if(e?.matchBoardAspectRatio){const Ne=h-u,le=f-d;if(Ne>0&&le>0){const Se=Ne/le;e?.width&&!e?.height?R=e.width/Se:e?.height&&!e?.width?N=e.height*Se:R=N/Se}}const P=[];for(const Ne of n)"route"in Ne&&Ne.route!==void 0&&P.push(Ne.route);const M=N/w,I=R/T,A=Math.min(M,I),U=(N-w*A)/2,k=(R-T*A)/2,V=ls(Rs(U-y*A+m*A,R-k+g*A-m*A),kg(A,-A)),Y={transform:V,layer:i,shouldDrawErrors:e?.shouldDrawErrors,drawPaddingOutsideBoard:t,colorMap:o,renderSolderMask:e?.renderSolderMask};function W(Ne){if(Ne.type==="pcb_smtpad")return Ne.layer==="top"||Ne.layer==="bottom"?Ne.layer:void 0;if(Ne.type==="pcb_trace")for(const le of Ne.route??[]){const Se="layer"in le&&le.layer||"from_layer"in le&&le.from_layer||"to_layer"in le&&le.to_layer||void 0;if(Se==="top"||Se==="bottom")return Se}}function K(Ne){return Ne.type==="pcb_trace"||Ne.type==="pcb_smtpad"}let ee=n.sort((Ne,le)=>{const Se=W(Ne),xe=W(le);if(K(Ne)&&K(le)&&Se!==xe){if(Se==="top")return 1;if(xe==="top"||Se==="bottom")return-1;if(xe==="bottom")return 1}return($Ke.indexOf(le.type)??9999)-($Ke.indexOf(Ne.type)??9999)}).flatMap(Ne=>s1n({elm:Ne,circuitJson:n,ctx:Y}));for(const Ne of n)if("stroke_width"in Ne){String(A*Ne.stroke_width);break}if(e?.shouldDrawRatsNest){const Ne=t1n(n,Y);ee=ee.concat(Ne)}const ae=[{name:"style",type:"element",value:"",attributes:{},children:[{type:"text",value:"",name:"",attributes:{},children:[]}]},{name:"rect",type:"element",value:"",attributes:{class:"boundary",x:"0",y:"0",fill:e?.backgroundColor??"#000",width:N.toString(),height:R.toString()},children:[]}];t&&ae.push(a1n(V,s,a,c,l)),ae.push(...ee);const ue=mC(n),ge=_C,re={name:"svg",type:"element",attributes:{xmlns:"http://www.w3.org/2000/svg",width:N.toString(),height:R.toString(),...ue&&{"data-software-used-string":ue},...e?.includeVersion&&{"data-circuit-to-svg-version":ge}},value:"",children:ae.filter(Ne=>Ne!==null)};try{return Y7(re)}catch(Ne){throw console.error("Error stringifying SVG object:",Ne),Ne}function oe(Ne,le,Se){const xe=le/2,Ye=Se/2;s=Math.min(s,Ne.x-xe),a=Math.min(a,Ne.y-Ye),c=Math.max(c,Ne.x+xe),l=Math.max(l,Ne.y+Ye)}function pe(Ne,le,Se){const xe=le/2,Ye=Se/2;u=Math.min(u,Ne.x-xe),d=Math.min(d,Ne.y-Ye),h=Math.max(h,Ne.x+xe),f=Math.max(f,Ne.y+Ye)}function Ee(Ne){for(const le of Ne)s=Math.min(s,le.x),a=Math.min(a,le.y),c=Math.max(c,le.x),l=Math.max(l,le.y)}function Re(Ne){for(const le of Ne)u=Math.min(u,le.x),d=Math.min(d,le.y),h=Math.max(h,le.x),f=Math.max(f,le.y)}function Oe(Ne){for(const le of Ne)s=Math.min(s,le.x),a=Math.min(a,le.y),c=Math.max(c,le.x),l=Math.max(l,le.y)}function Ve(Ne){if(Ne.type==="pcb_silkscreen_text")oe(Ne.anchor_position,0,0);else if(Ne.type==="pcb_silkscreen_path")Oe(Ne.route);else if(Ne.type==="pcb_silkscreen_rect")oe(Ne.center,Ne.width,Ne.height);else if(Ne.type==="pcb_silkscreen_circle")oe(Ne.center,Ne.radius*2,Ne.radius*2);else if(Ne.type==="pcb_silkscreen_line")oe({x:Ne.x1,y:Ne.y1},0,0),oe({x:Ne.x2,y:Ne.y2},0,0);else if(Ne.type==="pcb_cutout"){const le=Ne;le.shape==="rect"?oe(le.center,le.width,le.height):le.shape==="circle"?oe(le.center,le.radius*2,le.radius*2):le.shape==="polygon"&&Oe(le.points)}}}function s1n({elm:n,circuitJson:e,ctx:t}){switch(n.type){case"pcb_trace_error":return zgn(n,e,t).filter(Boolean);case"pcb_component":return r1n(n,t).filter(Boolean);case"pcb_trace":return Wgn(n,t);case"pcb_copper_pour":return i1n(n,t);case"pcb_plated_hole":return Ugn(n,t).filter(Boolean);case"pcb_hole":return Qgn(n,t);case"pcb_smtpad":return Zgn(n,t);case"pcb_silkscreen_text":return Hgn(n,t);case"pcb_silkscreen_rect":return Vgn(n,t);case"pcb_silkscreen_circle":return Ggn(n,t);case"pcb_silkscreen_line":return Ygn(n,t);case"pcb_fabrication_note_path":return $gn(n,t);case"pcb_fabrication_note_text":return Bgn(n,t);case"pcb_silkscreen_path":return jgn(n,t);case"pcb_board":return t.drawPaddingOutsideBoard?zKe(n,t):[];case"pcb_via":return Kgn(n,t);case"pcb_cutout":return n1n(n,t);default:return[]}}function a1n(n,e,t,i,r){const[o,s]=Yt(n,[e,t]),[a,c]=Yt(n,[i,r]),l=Math.abs(a-o),u=Math.abs(c-s),d=Math.min(o,a),h=Math.min(s,c);return{name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-boundary",fill:"none",stroke:"#fff","stroke-width":"0.3",x:d.toString(),y:h.toString(),width:l.toString(),height:u.toString()}}}var c1n=P_e,mH={fill:"none",stroke:"rgb(0,0,0)",strokeOpacity:"0.8",strokeWidthFactor:.2};function l1n(n,e,t={}){const{width:i,height:r,center:o,outline:s}=n;let a;if(s&&Array.isArray(s)&&s.length>=3)a=s.map((c,l)=>{const[u,d]=Yt(e,[c.x,c.y]);return l===0?`M ${u} ${d}`:`L ${u} ${d}`}).join(" ");else{const c=i/2,l=r/2,u=Yt(e,[o.x-c,o.y-l]),d=Yt(e,[o.x+c,o.y-l]),h=Yt(e,[o.x+c,o.y+l]),f=Yt(e,[o.x-c,o.y+l]);a=`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]} L ${h[0]} ${h[1]} L ${f[0]} ${f[1]}`}return a+=" Z",[{name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-board",d:a,fill:t.fill??mH.fill,stroke:t.stroke??mH.stroke,"stroke-opacity":t.strokeOpacity??mH.strokeOpacity,"stroke-width":((t.strokeWidthFactor??mH.strokeWidthFactor)*Math.abs(e.a)).toString()}}]}var u1n={pin_number:.15,negated_pin_number:.15*.8,reference_designator:.18,manufacturer_number:.18,net_label:.18,error:.05},yC=(n,e)=>e??u1n[n],m3=(n,e,t)=>Math.abs(n.a)*yC(e,t);function d1n(n,e){const{elm:t,portPosition:i,name:r,arePinsInterchangeable:o}=n,{transform:s}=e,{center:a,width:c,height:l,rotation:u=0,layer:d="top"}=t;if(!a||typeof c!="number"||typeof l!="number")return null;const[h,f]=Yt(s,[a.x,a.y]),[m,y]=Yt(s,[i.x,i.y]),g=c*Math.abs(s.a),b=l*Math.abs(s.d),v=y>f,w=m<h,T=[h1n(g,b,u,d),p1n(g,b,r??"")];return o||T.push(f1n(g,b,u,d,v,w)),{name:"g",type:"element",value:"",attributes:{transform:`translate(${h}, ${f}) scale(1, -1)`},children:T}}function h1n(n,e,t,i){const r=n/2,o=e/2;return{name:"path",type:"element",attributes:{class:"assembly-component",d:m1n(r,o,t),"stroke-width":.8.toFixed(2),transform:`rotate(${-t})`,"stroke-dasharray":i==="bottom"?"2,2":""},value:"",children:[]}}function p1n(n,e,t,i){const r=Math.min(n,e),c=Math.min(58,Math.max(3,r*.8)),l=e>n;return{name:"text",type:"element",attributes:{x:"0",y:"0",class:"assembly-component-label","text-anchor":"middle",dy:".10em",style:"pointer-events: none","font-size":`${c.toFixed(1)}px`,transform:l?"rotate(90) scale(1, -1)":"scale(1, -1)"},children:[{type:"text",value:t||"",name:"",attributes:{},children:[]}],value:""}}function f1n(n,e,t,i,r,o){const s=n/2,a=e/2,c=Math.min(s,a)*.5;let l;return r&&o?l=[[-s,-a],[-s+c,-a],[-s,-a+c]]:r&&!o?l=[[s,-a],[s-c,-a],[s,-a+c]]:!r&&o?l=[[-s,a],[-s+c,a],[-s,a-c]]:l=[[s,a],[s-c,a],[s,a-c]],{name:"polygon",type:"element",attributes:{class:"assembly-pin1-indicator",points:l.map(d=>d.join(",")).join(" "),fill:"#333",stroke:"none",transform:`rotate(${-t})`},value:"",children:[]}}function m1n(n,e,t){const i=(a,c,l)=>{const u=Math.PI/180*l,d=Math.cos(u),h=Math.sin(u);return[a*d-c*h,a*h+c*d]};return`${[[-n,-e],[n,-e],[n,e],[-n,e]].map(([a,c])=>i(a,c,t)).map(([a,c],l)=>l===0?`M${a},${c}`:`L${a},${c}`).join(" ")} Z`}var I_e="rgb(190, 190, 190)";function _1n(n,e){const{transform:t}=e,[i,r]=Yt(t,[n.x,n.y]);if(n.hole_shape==="circle"||n.hole_shape==="square"){const o=n.hole_diameter*Math.abs(t.a),s=o/2;return n.hole_shape==="circle"?[{name:"circle",type:"element",attributes:{class:"assembly-hole",cx:i.toString(),cy:r.toString(),r:s.toString(),fill:I_e},children:[],value:""}]:[{name:"rect",type:"element",attributes:{class:"assembly-hole",x:(i-s).toString(),y:(r-s).toString(),width:o.toString(),height:o.toString(),fill:I_e},children:[],value:""}]}if(n.hole_shape==="oval"){const o=n.hole_width*Math.abs(t.a),s=n.hole_height*Math.abs(t.a),a=o/2,c=s/2;return[{name:"ellipse",type:"element",attributes:{class:"assembly-hole",cx:i.toString(),cy:r.toString(),rx:a.toString(),ry:c.toString(),fill:I_e},children:[],value:""}]}return[]}var uN="rgb(210, 210, 210)",dN="rgb(190, 190, 190)";function y1n(n,e){const{transform:t}=e,[i,r]=Yt(t,[n.x,n.y]);if(n.shape==="pill"){const o=n.outer_width*Math.abs(t.a),s=n.outer_height*Math.abs(t.a),a=n.hole_width*Math.abs(t.a),c=n.hole_height*Math.abs(t.a),l=o/2,u=s-o,d=a/2;return[{name:"g",type:"element",children:[{name:"path",type:"element",attributes:{class:"assembly-hole-outer",fill:uN,d:`M${i-l},${r-u/2} v${u} a${l},${l} 0 0 0 ${o},0 v-${u} a${l},${l} 0 0 0 -${o},0 z`},value:"",children:[]},{name:"path",type:"element",attributes:{class:"assembly-hole-inner",fill:dN,d:`M${i-d},${r-(c-a)/2} v${c-a} a${d},${d} 0 0 0 ${a},0 v-${c-a} a${d},${d} 0 0 0 -${a},0 z`},value:"",children:[]}],value:"",attributes:{}}]}if(n.shape==="circle"){const o=n.outer_diameter*Math.abs(t.a),s=n.outer_diameter*Math.abs(t.a),a=n.hole_diameter*Math.abs(t.a),c=n.hole_diameter*Math.abs(t.a),l=Math.min(o,s)/2,u=Math.min(a,c)/2;return[{name:"g",type:"element",children:[{name:"circle",type:"element",attributes:{class:"assembly-hole-outer",fill:uN,cx:i.toString(),cy:r.toString(),r:l.toString()},value:"",children:[]},{name:"circle",type:"element",attributes:{class:"assembly-hole-inner",fill:dN,cx:i.toString(),cy:r.toString(),r:u.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(n.shape==="circular_hole_with_rect_pad"){const o=n,s=o.hole_diameter*Math.abs(t.a),a=o.rect_pad_width*Math.abs(t.a),c=o.rect_pad_height*Math.abs(t.a),l=(o.rect_border_radius??0)*Math.abs(t.a),u=s/2,[d,h]=Yt(t,[o.x+o.hole_offset_x,o.y+o.hole_offset_y]);return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"assembly-hole-outer-pad",fill:uN,x:(i-a/2).toString(),y:(r-c/2).toString(),width:a.toString(),height:c.toString(),...l?{rx:l.toString(),ry:l.toString()}:{}},value:"",children:[]},{name:"circle",type:"element",attributes:{class:"assembly-hole-inner",fill:dN,cx:d.toString(),cy:h.toString(),r:u.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(n.shape==="pill_hole_with_rect_pad"){const o=n,s=o.rect_pad_width*Math.abs(t.a),a=o.rect_pad_height*Math.abs(t.a),c=(o.rect_border_radius??0)*Math.abs(t.a),l=o.hole_height*Math.abs(t.a),u=o.hole_width*Math.abs(t.a),d=o,h=d.hole_offset_x??0,f=d.hole_offset_y??0,[m,y]=Yt(t,[o.x+h,o.y+f]),g=Math.min(l,u)/2;return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"assembly-hole-outer-pad",fill:uN,x:(i-s/2).toString(),y:(r-a/2).toString(),width:s.toString(),height:a.toString(),...c?{rx:c.toString(),ry:c.toString()}:{}},value:"",children:[]},{name:"rect",type:"element",attributes:{class:"assembly-hole-inner",fill:dN,x:(m-u/2).toString(),y:(y-l/2).toString(),width:u.toString(),height:l.toString(),rx:g.toString(),ry:g.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(n.shape==="rotated_pill_hole_with_rect_pad"){const o=n,s=o.rect_pad_width*Math.abs(t.a),a=o.rect_pad_height*Math.abs(t.a),c=(o.rect_border_radius??0)*Math.abs(t.a),l=o.hole_height*Math.abs(t.a),u=o.hole_width*Math.abs(t.a),d=o,h=d.hole_offset_x??0,f=d.hole_offset_y??0,[m,y]=Yt(t,[o.x+h,o.y+f]),g=Math.min(l,u)/2;return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"assembly-hole-outer-pad",fill:uN,x:(-s/2).toString(),y:(-a/2).toString(),width:s.toString(),height:a.toString(),transform:`translate(${i} ${r}) rotate(${-o.rect_ccw_rotation})`,...c?{rx:c.toString(),ry:c.toString()}:{}},value:"",children:[]},{name:"rect",type:"element",attributes:{class:"assembly-hole-inner",fill:dN,x:(-u/2).toString(),y:(-l/2).toString(),width:u.toString(),height:l.toString(),rx:g.toString(),ry:g.toString(),transform:`translate(${m} ${y}) rotate(${-o.hole_ccw_rotation})`},value:"",children:[]}],value:"",attributes:{}}]}return[]}var hN="rgb(210, 210, 210)";function g1n(n,e){const{transform:t}=e;if(n.shape==="rect"||n.shape==="rotated_rect"){const i=n.width*Math.abs(t.a),r=n.height*Math.abs(t.d),[o,s]=Yt(t,[n.x,n.y]),a=(n.rect_border_radius??0)*Math.abs(t.a);return n.shape==="rotated_rect"&&n.ccw_rotation?[{name:"rect",type:"element",attributes:{class:"assembly-pad",fill:hN,x:(-i/2).toString(),y:(-r/2).toString(),width:i.toString(),height:r.toString(),transform:`translate(${o} ${s}) rotate(${-n.ccw_rotation})`,"data-layer":n.layer,...a?{rx:a.toString(),ry:a.toString()}:{}},value:"",children:[]}]:[{name:"rect",type:"element",attributes:{class:"assembly-pad",fill:hN,x:(o-i/2).toString(),y:(s-r/2).toString(),width:i.toString(),height:r.toString(),"data-layer":n.layer,...a?{rx:a.toString(),ry:a.toString()}:{}},value:"",children:[]}]}if(n.shape==="pill"){const i=n.width*Math.abs(t.a),r=n.height*Math.abs(t.d),o=n.radius*Math.abs(t.a),[s,a]=Yt(t,[n.x,n.y]);return[{name:"rect",type:"element",attributes:{class:"assembly-pad",fill:hN,x:(s-i/2).toString(),y:(a-r/2).toString(),width:i.toString(),height:r.toString(),rx:o.toString(),ry:o.toString(),"data-layer":n.layer},value:"",children:[]}]}if(n.shape==="circle"){const i=n.radius*Math.abs(t.a),[r,o]=Yt(t,[n.x,n.y]);return[{name:"circle",type:"element",attributes:{class:"assembly-pad",fill:hN,cx:r.toString(),cy:o.toString(),r:i.toString(),"data-layer":n.layer},value:"",children:[]}]}if(n.shape==="polygon"){const i=(n.points??[]).map(r=>Yt(t,[r.x,r.y]));return[{name:"polygon",type:"element",attributes:{class:"assembly-pad",fill:hN,points:i.map(r=>r.join(",")).join(" "),"data-layer":n.layer},value:"",children:[]}]}return[]}var BKe=["pcb_component","pcb_smtpad","pcb_hole","pcb_plated_hole","pcb_board"];function UKe(n,e){let t=Number.POSITIVE_INFINITY,i=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(const R of n)if(R.type==="pcb_board"){const P=R.center,M=R.width||0,I=R.height||0;t=Math.min(t,P.x-M/2),i=Math.min(i,P.y-I/2),r=Math.max(r,P.x+M/2),o=Math.max(o,P.y+I/2)}const s=1,a=r-t+2*s,c=o-i+2*s,l=e?.width??800,u=e?.height??600,d=l/a,h=u/c,f=Math.min(d,h),m=(l-a*f)/2,y=(u-c*f)/2,g=ls(Rs(m-t*f+s*f,u-y+i*f-s*f),kg(f,-f)),b={transform:g},v=n.sort((R,P)=>(BKe.indexOf(P.type)??9999)-(BKe.indexOf(R.type)??9999)).flatMap(R=>b1n(R,b,n)),w=mC(n),T=_C,N={name:"svg",type:"element",attributes:{xmlns:"http://www.w3.org/2000/svg",width:l.toString(),height:u.toString(),...w&&{"data-software-used-string":w},...e?.includeVersion&&{"data-circuit-to-svg-version":T}},value:"",children:[{name:"style",type:"element",children:[{type:"text",value:`
5367
+ `),N=T.length===1?[{type:"text",value:s,name:"",attributes:{},children:[]}]:T.map((P,M)=>({type:"element",name:"tspan",value:"",attributes:{x:"0",...M>0?{dy:f.toString()}:{}},children:[{type:"text",value:P,name:"",attributes:{},children:[]}]}));return[{name:"text",type:"element",attributes:{x:"0",y:"0",dx:g.toString(),dy:b.toString(),fill:w,"font-family":"Arial, sans-serif","font-size":f.toString(),"text-anchor":m,"dominant-baseline":y,transform:iw(v),class:`pcb-silkscreen-text pcb-silkscreen-${c}`,"data-pcb-silkscreen-text-id":n.pcb_component_id,stroke:"none"},children:N,value:""}]}function Vgn(n,e){const{transform:t,layer:i,colorMap:r}=e,{center:o,width:s,height:a,layer:c="top",pcb_silkscreen_rect_id:l,stroke_width:u,is_filled:d,has_stroke:h,is_stroke_dashed:f}=n;if(i&&c!==i)return[];if(!o||typeof o.x!="number"||typeof o.y!="number"||typeof s!="number"||typeof a!="number")return console.error("Invalid rectangle data:",{center:o,width:s,height:a}),[];const[m,y]=Yt(t,[o.x,o.y]),g=s*Math.abs(t.a),b=a*Math.abs(t.d),v=u*Math.abs(t.a),w=c==="bottom"?r.silkscreen.bottom:r.silkscreen.top,T={x:(m-g/2).toString(),y:(y-b/2).toString(),width:g.toString(),height:b.toString(),class:`pcb-silkscreen-rect pcb-silkscreen-${c}`,"data-pcb-silkscreen-rect-id":l};T.fill=d?w:"none";let N;if(h===void 0?N=v>0:N=h,N){if(T.stroke=w,T["stroke-width"]=v.toString(),f){const P=.1*Math.abs(t.a),M=.05*Math.abs(t.a);T["stroke-dasharray"]=`${P} ${M}`}}else T.stroke="none";return[{name:"rect",type:"element",attributes:T,value:"",children:[]}]}function Ggn(n,e){const{transform:t,layer:i,colorMap:r}=e,{center:o,radius:s,layer:a="top",pcb_silkscreen_circle_id:c,stroke_width:l=1}=n;if(i&&a!==i)return[];if(!o||typeof o.x!="number"||typeof o.y!="number"||typeof s!="number")return console.error("Invalid PCB Silkscreen Circle data:",{center:o,radius:s}),[];const[u,d]=Yt(t,[o.x,o.y]),h=s*Math.abs(t.a),f=l*Math.abs(t.a),m=a==="bottom"?r.silkscreen.bottom:r.silkscreen.top;return[{name:"circle",type:"element",attributes:{cx:u.toString(),cy:d.toString(),r:h.toString(),class:`pcb-silkscreen-circle pcb-silkscreen-${a}`,stroke:m,"stroke-width":f.toString(),"data-pcb-silkscreen-circle-id":c},value:"",children:[]}]}function Ygn(n,e){const{transform:t,layer:i,colorMap:r}=e,{x1:o,y1:s,x2:a,y2:c,stroke_width:l,layer:u="top",pcb_silkscreen_line_id:d}=n;if(i&&u!==i)return[];if(typeof o!="number"||typeof s!="number"||typeof a!="number"||typeof c!="number")return console.error("Invalid coordinates:",{x1:o,y1:s,x2:a,y2:c}),[];const[h,f]=Yt(t,[o,s]),[m,y]=Yt(t,[a,c]),g=l*Math.abs(t.a),b=u==="bottom"?r.silkscreen.bottom:r.silkscreen.top;return[{name:"line",type:"element",attributes:{x1:h.toString(),y1:f.toString(),x2:m.toString(),y2:y.toString(),stroke:b,"stroke-width":g.toString(),class:`pcb-silkscreen-line pcb-silkscreen-${u}`,"data-pcb-silkscreen-line-id":d},value:"",children:[]}]}function qgn(n){const e=[];for(let t=0;t<n.length-1;t++)e.push([n[t],n[t+1]]);return e}var ex={copper:{top:"rgb(200, 52, 52)",bottom:"rgb(77, 127, 196)"},soldermask:{top:"rgb(200, 52, 52)",bottom:"rgb(77, 127, 196)"},drill:"#FF26E2",silkscreen:{top:"#f2eda1",bottom:"#5da9e9"},boardOutline:"rgba(255, 255, 255, 0.5)",debugComponent:{fill:null,stroke:null}};ex.drill,ex.silkscreen.top,ex.silkscreen.bottom,ex.copper.top,ex.copper.bottom;function vM(n,e=ex){return e.copper[n]??"white"}var Xgn={bottom:"rgb(105, 105, 105)",top:"rgb(105, 105, 105)"};function fH(n){return Xgn[n]??"rgb(105, 105, 105)"}function Wgn(n,e){const{transform:t,layer:i,colorMap:r,renderSolderMask:o}=e;if(!n.route||!Array.isArray(n.route)||n.route.length<2)return[];const s=qgn(n.route),a=[];for(const[c,l]of s){const u=Yt(t,[c.x,c.y]),d=Yt(t,[l.x,l.y]),h="layer"in c?c.layer:"layer"in l?l.layer:null;if(!h||i&&h!==i)continue;const f=vM(h,r),m=r.soldermask[h]??f,y="width"in c?c.width:"width"in l?l.width:null,g=y?(y*Math.abs(t.a)).toString():"0.3";if(o){const b={name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-trace",stroke:f,fill:"none",d:`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]}`,"stroke-width":g,"stroke-linecap":"round","stroke-linejoin":"round","shape-rendering":"crispEdges","data-layer":h}},v={name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-soldermask",stroke:m,fill:"none",d:`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]}`,"stroke-width":g,"stroke-linecap":"round","stroke-linejoin":"round","shape-rendering":"crispEdges","data-layer":h}};a.push(v,b)}else{const b={name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-trace",stroke:m,fill:"none",d:`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]}`,"stroke-width":g,"stroke-linecap":"round","stroke-linejoin":"round","shape-rendering":"crispEdges","data-layer":h}};a.push(b)}}return a.sort((c,l)=>{const u=c.attributes["data-layer"],d=l.attributes["data-layer"];return u==="bottom"&&d!=="bottom"?-1:u==="top"&&d!=="top"?1:0}),a}function Zgn(n,e){const{transform:t,layer:i,colorMap:r}=e;if(i&&n.layer!==i)return[];const o=!!n?.is_covered_with_solder_mask,s=r.soldermask[n.layer]??r.soldermask.top;if(n.shape==="rect"||n.shape==="rotated_rect"){const a=n.width*Math.abs(t.a),c=n.height*Math.abs(t.d),[l,u]=Yt(t,[n.x,n.y]),d=(n.rect_border_radius??0)*Math.abs(t.a);if(n.shape==="rotated_rect"&&n.ccw_rotation){const m={name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:vM(n.layer,r),x:(-a/2).toString(),y:(-c/2).toString(),width:a.toString(),height:c.toString(),transform:`translate(${l} ${u}) rotate(${-n.ccw_rotation})`,"data-layer":n.layer,...d?{rx:d.toString(),ry:d.toString()}:{}}};if(!o)return[m];const y={name:m.name,type:m.type,value:"",children:[],attributes:{...m.attributes,class:"pcb-solder-mask",fill:s}};return[m,y]}const h={name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:vM(n.layer,r),x:(l-a/2).toString(),y:(u-c/2).toString(),width:a.toString(),height:c.toString(),"data-layer":n.layer,...d?{rx:d.toString(),ry:d.toString()}:{}}};if(!o)return[h];const f={name:h.name,type:h.type,value:"",children:[],attributes:{...h.attributes,class:"pcb-solder-mask",fill:s}};return[h,f]}if(n.shape==="pill"){const a=n.width*Math.abs(t.a),c=n.height*Math.abs(t.d),l=n.radius*Math.abs(t.a),[u,d]=Yt(t,[n.x,n.y]),h={name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:vM(n.layer,r),x:(u-a/2).toString(),y:(d-c/2).toString(),width:a.toString(),height:c.toString(),rx:l.toString(),ry:l.toString(),"data-layer":n.layer}};if(!o)return[h];const f={name:h.name,type:h.type,value:"",children:[],attributes:{...h.attributes,class:"pcb-solder-mask",fill:s}};return[h,f]}if(n.shape==="circle"){const a=n.radius*Math.abs(t.a),[c,l]=Yt(t,[n.x,n.y]),u={name:"circle",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:vM(n.layer,r),cx:c.toString(),cy:l.toString(),r:a.toString(),"data-layer":n.layer}};if(!o)return[u];const d={name:u.name,type:u.type,value:"",children:[],attributes:{...u.attributes,class:"pcb-solder-mask",fill:s}};return[u,d]}if(n.shape==="polygon"){const a=(n.points??[]).map(u=>Yt(t,[u.x,u.y])),c={name:"polygon",type:"element",value:"",children:[],attributes:{class:"pcb-pad",fill:vM(n.layer,r),points:a.map(u=>u.join(",")).join(" "),"data-layer":n.layer}};if(!o)return[c];const l={name:c.name,type:c.type,value:"",children:[],attributes:{...c.attributes,class:"pcb-solder-mask",fill:s}};return[c,l]}return[]}function zKe(n,e){const{transform:t,colorMap:i}=e,{width:r,height:o,center:s,outline:a}=n;let c;if(a&&Array.isArray(a)&&a.length>=3)c=a.map((l,u)=>{const[d,h]=Yt(t,[l.x,l.y]);return u===0?`M ${d} ${h}`:`L ${d} ${h}`}).join(" ");else{const l=r/2,u=o/2,d=Yt(t,[s.x-l,s.y-u]),h=Yt(t,[s.x+l,s.y-u]),f=Yt(t,[s.x+l,s.y+u]),m=Yt(t,[s.x-l,s.y+u]);c=`M ${d[0]} ${d[1]} L ${h[0]} ${h[1]} L ${f[0]} ${f[1]} L ${m[0]} ${m[1]}`}return c+=" Z",[{name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-board",d:c,fill:"none",stroke:i.boardOutline,"stroke-width":(.1*Math.abs(t.a)).toString()}}]}function Kgn(n,e){const{transform:t,colorMap:i}=e,[r,o]=Yt(t,[n.x,n.y]),s=n.outer_diameter*Math.abs(t.a),a=n.outer_diameter*Math.abs(t.a),c=n.hole_diameter*Math.abs(t.a),l=n.hole_diameter*Math.abs(t.a),u=Math.min(s,a)/2,d=Math.min(c,l)/2;return{name:"g",type:"element",children:[{name:"circle",type:"element",attributes:{class:"pcb-hole-outer",fill:i.copper.top,cx:r.toString(),cy:o.toString(),r:u.toString()}},{name:"circle",type:"element",attributes:{class:"pcb-hole-inner",fill:i.drill,cx:r.toString(),cy:o.toString(),r:d.toString()}}]}}function Qgn(n,e){const{transform:t,colorMap:i}=e,[r,o]=Yt(t,[n.x,n.y]);if(n.hole_shape==="circle"||n.hole_shape==="square"){const s=n.hole_diameter*Math.abs(t.a),a=s/2;return n.hole_shape==="circle"?[{name:"circle",type:"element",attributes:{class:"pcb-hole",cx:r.toString(),cy:o.toString(),r:a.toString(),fill:i.drill},children:[],value:""}]:[{name:"rect",type:"element",attributes:{class:"pcb-hole",x:(r-a).toString(),y:(o-a).toString(),width:s.toString(),height:s.toString(),fill:i.drill},children:[],value:""}]}if(n.hole_shape==="oval"){const s=n.hole_width*Math.abs(t.a),a=n.hole_height*Math.abs(t.a),c=s/2,l=a/2;return[{name:"ellipse",type:"element",attributes:{class:"pcb-hole",cx:r.toString(),cy:o.toString(),rx:c.toString(),ry:l.toString(),fill:i.drill},children:[],value:""}]}return[]}var Jgn=(n,e)=>{const t=ta(e).pcb_smtpad.get(n);if(t&&"x"in t&&"y"in t)return{x:t.x,y:t.y};const i=ta(e).pcb_plated_hole.get(n);return i&&"x"in i&&"y"in i?{x:i.x,y:i.y}:null},e1n=(n,e,t,i)=>{const r=t.getIdsConnectedToNet(e);let o=null,s=1/0;for(const a of r){const c=Jgn(a,i);if(c){const l=n.x-c.x,u=n.y-c.y,d=Math.sqrt(l*l+u*u);d>0&&d<s&&(s=d,o=c)}}return o};function t1n(n,e){const{transform:t}=e,i=e6(n),r=n.filter(c=>c.type==="pcb_port"),o=n.filter(c=>c.type==="source_trace"),s=[];r.forEach((c,l)=>{const u=c.pcb_port_id;if(!u)return;const d=i.getNetConnectedToId(u);if(!d)return;let h=!1;const f=ta(n).source_port.getWhere({pcb_port_id:u});if(f&&f.source_port_id){const g=f.source_port_id;for(const b of o)if(Array.isArray(b.connected_source_port_ids)&&b.connected_source_port_ids.includes(g)&&Array.isArray(b.connected_source_net_ids)&&b.connected_source_net_ids.length>0){h=!0;break}}const m={x:c.x,y:c.y},y=e1n(m,d,i,n);y&&s.push({key:`${u}-${l}`,startPoint:m,endPoint:y,isInNet:h})});const a=[];for(const c of s){const l=Yt(t,[c.startPoint.x,c.startPoint.y]),u=Yt(t,[c.endPoint.x,c.endPoint.y]),d={x1:l[0].toString(),y1:l[1].toString(),x2:u[0].toString(),y2:u[1].toString(),stroke:"white","stroke-width":"1","stroke-dasharray":"6,6"};a.push({name:"line",type:"element",attributes:d,value:"",children:[]})}return a}function n1n(n,e){const{transform:t,colorMap:i}=e;if(n.shape==="rect"){const r=n,[o,s]=Yt(t,[r.center.x,r.center.y]),a=r.width*Math.abs(t.a),c=r.height*Math.abs(t.d),l=-(r.rotation??0);return[{name:"rect",type:"element",attributes:{class:"pcb-cutout pcb-cutout-rect",x:(-a/2).toString(),y:(-c/2).toString(),width:a.toString(),height:c.toString(),fill:i.drill,transform:iw(ls(Rs(o,s),sv(l*Math.PI/180)))},children:[],value:""}]}if(n.shape==="circle"){const r=n,[o,s]=Yt(t,[r.center.x,r.center.y]),a=r.radius*Math.abs(t.a);return[{name:"circle",type:"element",attributes:{class:"pcb-cutout pcb-cutout-circle",cx:o.toString(),cy:s.toString(),r:a.toString(),fill:i.drill},children:[],value:""}]}if(n.shape==="polygon"){const r=n;return!r.points||r.points.length===0?[]:[{name:"polygon",type:"element",attributes:{class:"pcb-cutout pcb-cutout-polygon",points:r.points.map(a=>Yt(t,[a.x,a.y])).map(a=>`${a[0]},${a[1]}`).join(" "),fill:i.drill},children:[],value:""}]}return[]}function FKe(n,e){if(n.length===0)return"";const t=n.map(r=>{const[o,s]=Yt(e,[r.x,r.y]);return{...r,x:o,y:s}});let i=`M ${t[0].x} ${t[0].y}`;for(let r=0;r<t.length;r++){const o=t[r],s=t[(r+1)%t.length];if(o.bulge){if(Math.hypot(s.x-o.x,s.y-o.y)<1e-9)continue;const a=o.bulge,c=s.x-o.x,l=s.y-o.y,u=Math.hypot(c,l),d=Math.abs(u/4/a*(a*a+1)),h=a<0?1:0,f=Math.abs(a)>1?1:0;i+=` A ${d} ${d} 0 ${f} ${h} ${s.x} ${s.y}`}else i+=` L ${s.x} ${s.y}`}return i+=" Z",i}function i1n(n,e){const{transform:t,layer:i,colorMap:r}=e,{layer:o}=n;if(i&&o!==i)return[];const s=vM(o,r),a="0.5";if(n.shape==="rect"){const[c,l]=Yt(t,[n.center.x,n.center.y]),u=n.width*Math.abs(t.a),d=n.height*Math.abs(t.d),h=-(n.rotation??0);return[{name:"rect",type:"element",attributes:{class:"pcb-copper-pour pcb-copper-pour-rect",x:(-u/2).toString(),y:(-d/2).toString(),width:u.toString(),height:d.toString(),fill:s,"fill-opacity":a,transform:iw(ls(Rs(c,l),sv(h*Math.PI/180))),"data-layer":o},children:[],value:""}]}if(n.shape==="polygon")return!n.points||n.points.length===0?[]:[{name:"polygon",type:"element",attributes:{class:"pcb-copper-pour pcb-copper-pour-polygon",points:n.points.map(u=>Yt(t,[u.x,u.y])).map(u=>`${u[0]},${u[1]}`).join(" "),fill:s,"fill-opacity":a,"data-layer":o},children:[],value:""}];if(n.shape==="brep"){const{brep_shape:c}=n;let l=FKe(c.outer_ring.vertices,t);for(const u of c.inner_rings??[])l+=` ${FKe(u.vertices,t)}`;return[{name:"path",type:"element",attributes:{class:"pcb-copper-pour pcb-copper-pour-brep",d:l,fill:s,"fill-rule":"evenodd","fill-opacity":a,"data-layer":o},children:[],value:""}]}return[]}function r1n(n,e){const{transform:t}=e,{center:i,width:r,height:o,rotation:s=0}=n,[a,c]=Yt(t,[i.x,i.y]),l=r*Math.abs(t.a),u=o*Math.abs(t.d),d=`translate(${a}, ${c}) rotate(${-s}) scale(1, -1)`;return!e.colorMap.debugComponent?.fill&&!e.colorMap.debugComponent?.stroke?[]:[{name:"g",type:"element",attributes:{transform:d},children:[{name:"rect",type:"element",attributes:{class:"pcb-component",x:(-l/2).toString(),y:(-u/2).toString(),width:l.toString(),height:u.toString(),fill:e.colorMap.debugComponent.fill??"transparent",stroke:e.colorMap.debugComponent.stroke??"transparent"}}],value:""}]}function mC(n){return n.find(t=>t.type==="project_software_metadata"||t.type==="source_project_metadata")?.software_used_string}var o1n={version:"0.0.202"},_C=o1n.version,$Ke=["pcb_trace_error","pcb_plated_hole","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_silkscreen_text","pcb_silkscreen_path","pcb_via","pcb_cutout","pcb_copper_pour","pcb_smtpad","pcb_trace","pcb_component","pcb_board"];function P_e(n,e){const t=e?.drawPaddingOutsideBoard??!0,i=e?.layer,r=e?.colorOverrides,o={copper:{top:r?.copper?.top??ex.copper.top,bottom:r?.copper?.bottom??ex.copper.bottom},drill:r?.drill??ex.drill,silkscreen:{top:r?.silkscreen?.top??ex.silkscreen.top,bottom:r?.silkscreen?.bottom??ex.silkscreen.bottom},boardOutline:r?.boardOutline??ex.boardOutline,soldermask:{top:r?.soldermask?.top??ex.soldermask.top,bottom:r?.soldermask?.bottom??ex.soldermask.bottom},debugComponent:{fill:r?.debugComponent?.fill??ex.debugComponent.fill,stroke:r?.debugComponent?.stroke??ex.debugComponent.stroke}};let s=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=Number.POSITIVE_INFINITY,d=Number.POSITIVE_INFINITY,h=Number.NEGATIVE_INFINITY,f=Number.NEGATIVE_INFINITY;for(const Ne of n)if(Ne.type==="pcb_board")Ne.outline&&Array.isArray(Ne.outline)&&Ne.outline.length>=3?(Ee(Ne.outline),Re(Ne.outline)):"center"in Ne&&"width"in Ne&&"height"in Ne&&(oe(Ne.center,Ne.width,Ne.height),pe(Ne.center,Ne.width,Ne.height));else if("x"in Ne&&"y"in Ne)oe({x:Ne.x,y:Ne.y},0,0);else if(Ne.type==="pcb_smtpad"){const le=Ne;le.shape==="rect"||le.shape==="rotated_rect"||le.shape==="pill"?oe({x:le.x,y:le.y},le.width,le.height):le.shape==="circle"?oe({x:le.x,y:le.y},le.radius*2,le.radius*2):le.shape==="polygon"&&Oe(le.points)}else"route"in Ne?Oe(Ne.route):Ne.type==="pcb_silkscreen_text"||Ne.type==="pcb_silkscreen_rect"||Ne.type==="pcb_silkscreen_circle"||Ne.type==="pcb_silkscreen_line"?Ve(Ne):Ne.type==="pcb_copper_pour"&&(Ne.shape==="rect"?oe(Ne.center,Ne.width,Ne.height):Ne.shape==="polygon"&&Oe(Ne.points));const m=t?1:0,y=t||!Number.isFinite(u)?s:u,g=t||!Number.isFinite(d)?a:d,b=t||!Number.isFinite(h)?c:h,v=t||!Number.isFinite(f)?l:f,w=b-y+2*m,T=v-g+2*m;let N=e?.width??800,R=e?.height??600;if(e?.matchBoardAspectRatio){const Ne=h-u,le=f-d;if(Ne>0&&le>0){const Se=Ne/le;e?.width&&!e?.height?R=e.width/Se:e?.height&&!e?.width?N=e.height*Se:R=N/Se}}const P=[];for(const Ne of n)"route"in Ne&&Ne.route!==void 0&&P.push(Ne.route);const M=N/w,I=R/T,A=Math.min(M,I),U=(N-w*A)/2,k=(R-T*A)/2,V=ls(Rs(U-y*A+m*A,R-k+g*A-m*A),kg(A,-A)),Y={transform:V,layer:i,shouldDrawErrors:e?.shouldDrawErrors,drawPaddingOutsideBoard:t,colorMap:o,renderSolderMask:e?.renderSolderMask};function W(Ne){if(Ne.type==="pcb_smtpad")return Ne.layer==="top"||Ne.layer==="bottom"?Ne.layer:void 0;if(Ne.type==="pcb_trace")for(const le of Ne.route??[]){const Se="layer"in le&&le.layer||"from_layer"in le&&le.from_layer||"to_layer"in le&&le.to_layer||void 0;if(Se==="top"||Se==="bottom")return Se}}function K(Ne){return Ne.type==="pcb_trace"||Ne.type==="pcb_smtpad"}let ee=n.sort((Ne,le)=>{const Se=W(Ne),xe=W(le);if(K(Ne)&&K(le)&&Se!==xe){if(Se==="top")return 1;if(xe==="top"||Se==="bottom")return-1;if(xe==="bottom")return 1}return($Ke.indexOf(le.type)??9999)-($Ke.indexOf(Ne.type)??9999)}).flatMap(Ne=>s1n({elm:Ne,circuitJson:n,ctx:Y}));for(const Ne of n)if("stroke_width"in Ne){String(A*Ne.stroke_width);break}if(e?.shouldDrawRatsNest){const Ne=t1n(n,Y);ee=ee.concat(Ne)}const ae=[{name:"style",type:"element",value:"",attributes:{},children:[{type:"text",value:"",name:"",attributes:{},children:[]}]},{name:"rect",type:"element",value:"",attributes:{class:"boundary",x:"0",y:"0",fill:e?.backgroundColor??"#000",width:N.toString(),height:R.toString()},children:[]}];t&&ae.push(a1n(V,s,a,c,l)),ae.push(...ee);const ue=mC(n),ge=_C,re={name:"svg",type:"element",attributes:{xmlns:"http://www.w3.org/2000/svg",width:N.toString(),height:R.toString(),...ue&&{"data-software-used-string":ue},...e?.includeVersion&&{"data-circuit-to-svg-version":ge}},value:"",children:ae.filter(Ne=>Ne!==null)};try{return Y7(re)}catch(Ne){throw console.error("Error stringifying SVG object:",Ne),Ne}function oe(Ne,le,Se){const xe=le/2,Ye=Se/2;s=Math.min(s,Ne.x-xe),a=Math.min(a,Ne.y-Ye),c=Math.max(c,Ne.x+xe),l=Math.max(l,Ne.y+Ye)}function pe(Ne,le,Se){const xe=le/2,Ye=Se/2;u=Math.min(u,Ne.x-xe),d=Math.min(d,Ne.y-Ye),h=Math.max(h,Ne.x+xe),f=Math.max(f,Ne.y+Ye)}function Ee(Ne){for(const le of Ne)s=Math.min(s,le.x),a=Math.min(a,le.y),c=Math.max(c,le.x),l=Math.max(l,le.y)}function Re(Ne){for(const le of Ne)u=Math.min(u,le.x),d=Math.min(d,le.y),h=Math.max(h,le.x),f=Math.max(f,le.y)}function Oe(Ne){for(const le of Ne)s=Math.min(s,le.x),a=Math.min(a,le.y),c=Math.max(c,le.x),l=Math.max(l,le.y)}function Ve(Ne){if(Ne.type==="pcb_silkscreen_text")oe(Ne.anchor_position,0,0);else if(Ne.type==="pcb_silkscreen_path")Oe(Ne.route);else if(Ne.type==="pcb_silkscreen_rect")oe(Ne.center,Ne.width,Ne.height);else if(Ne.type==="pcb_silkscreen_circle")oe(Ne.center,Ne.radius*2,Ne.radius*2);else if(Ne.type==="pcb_silkscreen_line")oe({x:Ne.x1,y:Ne.y1},0,0),oe({x:Ne.x2,y:Ne.y2},0,0);else if(Ne.type==="pcb_cutout"){const le=Ne;le.shape==="rect"?oe(le.center,le.width,le.height):le.shape==="circle"?oe(le.center,le.radius*2,le.radius*2):le.shape==="polygon"&&Oe(le.points)}}}function s1n({elm:n,circuitJson:e,ctx:t}){switch(n.type){case"pcb_trace_error":return zgn(n,e,t).filter(Boolean);case"pcb_component":return r1n(n,t).filter(Boolean);case"pcb_trace":return Wgn(n,t);case"pcb_copper_pour":return i1n(n,t);case"pcb_plated_hole":return Ugn(n,t).filter(Boolean);case"pcb_hole":return Qgn(n,t);case"pcb_smtpad":return Zgn(n,t);case"pcb_silkscreen_text":return Hgn(n,t);case"pcb_silkscreen_rect":return Vgn(n,t);case"pcb_silkscreen_circle":return Ggn(n,t);case"pcb_silkscreen_line":return Ygn(n,t);case"pcb_fabrication_note_path":return $gn(n,t);case"pcb_fabrication_note_text":return Bgn(n,t);case"pcb_silkscreen_path":return jgn(n,t);case"pcb_board":return t.drawPaddingOutsideBoard?zKe(n,t):[];case"pcb_via":return Kgn(n,t);case"pcb_cutout":return n1n(n,t);default:return[]}}function a1n(n,e,t,i,r){const[o,s]=Yt(n,[e,t]),[a,c]=Yt(n,[i,r]),l=Math.abs(a-o),u=Math.abs(c-s),d=Math.min(o,a),h=Math.min(s,c);return{name:"rect",type:"element",value:"",children:[],attributes:{class:"pcb-boundary",fill:"none",stroke:"#fff","stroke-width":"0.3",x:d.toString(),y:h.toString(),width:l.toString(),height:u.toString()}}}var c1n=P_e,mH={fill:"none",stroke:"rgb(0,0,0)",strokeOpacity:"0.8",strokeWidthFactor:.2};function l1n(n,e,t={}){const{width:i,height:r,center:o,outline:s}=n;let a;if(s&&Array.isArray(s)&&s.length>=3)a=s.map((c,l)=>{const[u,d]=Yt(e,[c.x,c.y]);return l===0?`M ${u} ${d}`:`L ${u} ${d}`}).join(" ");else{const c=i/2,l=r/2,u=Yt(e,[o.x-c,o.y-l]),d=Yt(e,[o.x+c,o.y-l]),h=Yt(e,[o.x+c,o.y+l]),f=Yt(e,[o.x-c,o.y+l]);a=`M ${u[0]} ${u[1]} L ${d[0]} ${d[1]} L ${h[0]} ${h[1]} L ${f[0]} ${f[1]}`}return a+=" Z",[{name:"path",type:"element",value:"",children:[],attributes:{class:"pcb-board",d:a,fill:t.fill??mH.fill,stroke:t.stroke??mH.stroke,"stroke-opacity":t.strokeOpacity??mH.strokeOpacity,"stroke-width":((t.strokeWidthFactor??mH.strokeWidthFactor)*Math.abs(e.a)).toString()}}]}var u1n={pin_number:.15,negated_pin_number:.15*.8,reference_designator:.18,manufacturer_number:.18,net_label:.18,error:.05},yC=(n,e)=>e??u1n[n],m3=(n,e,t)=>Math.abs(n.a)*yC(e,t);function d1n(n,e){const{elm:t,portPosition:i,name:r,arePinsInterchangeable:o}=n,{transform:s}=e,{center:a,width:c,height:l,rotation:u=0,layer:d="top"}=t;if(!a||typeof c!="number"||typeof l!="number")return null;const[h,f]=Yt(s,[a.x,a.y]),[m,y]=Yt(s,[i.x,i.y]),g=c*Math.abs(s.a),b=l*Math.abs(s.d),v=y>f,w=m<h,T=[h1n(g,b,u,d),p1n(g,b,r??"")];return o||T.push(f1n(g,b,u,d,v,w)),{name:"g",type:"element",value:"",attributes:{transform:`translate(${h}, ${f}) scale(1, -1)`},children:T}}function h1n(n,e,t,i){const r=n/2,o=e/2;return{name:"path",type:"element",attributes:{class:"assembly-component",d:m1n(r,o,t),"stroke-width":.8.toFixed(2),transform:`rotate(${-t})`,"stroke-dasharray":i==="bottom"?"2,2":""},value:"",children:[]}}function p1n(n,e,t,i){const r=Math.min(n,e),c=Math.min(58,Math.max(3,r*.8)),l=e>n;return{name:"text",type:"element",attributes:{x:"0",y:"0",class:"assembly-component-label","text-anchor":"middle",dy:".10em",style:"pointer-events: none","font-size":`${c.toFixed(1)}px`,transform:l?"rotate(90) scale(1, -1)":"scale(1, -1)"},children:[{type:"text",value:t||"",name:"",attributes:{},children:[]}],value:""}}function f1n(n,e,t,i,r,o){const s=n/2,a=e/2,c=Math.min(s,a)*.5;let l;return r&&o?l=[[-s,-a],[-s+c,-a],[-s,-a+c]]:r&&!o?l=[[s,-a],[s-c,-a],[s,-a+c]]:!r&&o?l=[[-s,a],[-s+c,a],[-s,a-c]]:l=[[s,a],[s-c,a],[s,a-c]],{name:"polygon",type:"element",attributes:{class:"assembly-pin1-indicator",points:l.map(d=>d.join(",")).join(" "),fill:"#333",stroke:"none",transform:`rotate(${-t})`},value:"",children:[]}}function m1n(n,e,t){const i=(a,c,l)=>{const u=Math.PI/180*l,d=Math.cos(u),h=Math.sin(u);return[a*d-c*h,a*h+c*d]};return`${[[-n,-e],[n,-e],[n,e],[-n,e]].map(([a,c])=>i(a,c,t)).map(([a,c],l)=>l===0?`M${a},${c}`:`L${a},${c}`).join(" ")} Z`}var I_e="rgb(190, 190, 190)";function _1n(n,e){const{transform:t}=e,[i,r]=Yt(t,[n.x,n.y]);if(n.hole_shape==="circle"||n.hole_shape==="square"){const o=n.hole_diameter*Math.abs(t.a),s=o/2;return n.hole_shape==="circle"?[{name:"circle",type:"element",attributes:{class:"assembly-hole",cx:i.toString(),cy:r.toString(),r:s.toString(),fill:I_e},children:[],value:""}]:[{name:"rect",type:"element",attributes:{class:"assembly-hole",x:(i-s).toString(),y:(r-s).toString(),width:o.toString(),height:o.toString(),fill:I_e},children:[],value:""}]}if(n.hole_shape==="oval"){const o=n.hole_width*Math.abs(t.a),s=n.hole_height*Math.abs(t.a),a=o/2,c=s/2;return[{name:"ellipse",type:"element",attributes:{class:"assembly-hole",cx:i.toString(),cy:r.toString(),rx:a.toString(),ry:c.toString(),fill:I_e},children:[],value:""}]}return[]}var uN="rgb(210, 210, 210)",dN="rgb(190, 190, 190)";function y1n(n,e){const{transform:t}=e,[i,r]=Yt(t,[n.x,n.y]);if(n.shape==="pill"){const o=n.outer_width*Math.abs(t.a),s=n.outer_height*Math.abs(t.a),a=n.hole_width*Math.abs(t.a),c=n.hole_height*Math.abs(t.a),l=o/2,u=s-o,d=a/2;return[{name:"g",type:"element",children:[{name:"path",type:"element",attributes:{class:"assembly-hole-outer",fill:uN,d:`M${i-l},${r-u/2} v${u} a${l},${l} 0 0 0 ${o},0 v-${u} a${l},${l} 0 0 0 -${o},0 z`},value:"",children:[]},{name:"path",type:"element",attributes:{class:"assembly-hole-inner",fill:dN,d:`M${i-d},${r-(c-a)/2} v${c-a} a${d},${d} 0 0 0 ${a},0 v-${c-a} a${d},${d} 0 0 0 -${a},0 z`},value:"",children:[]}],value:"",attributes:{}}]}if(n.shape==="circle"){const o=n.outer_diameter*Math.abs(t.a),s=n.outer_diameter*Math.abs(t.a),a=n.hole_diameter*Math.abs(t.a),c=n.hole_diameter*Math.abs(t.a),l=Math.min(o,s)/2,u=Math.min(a,c)/2;return[{name:"g",type:"element",children:[{name:"circle",type:"element",attributes:{class:"assembly-hole-outer",fill:uN,cx:i.toString(),cy:r.toString(),r:l.toString()},value:"",children:[]},{name:"circle",type:"element",attributes:{class:"assembly-hole-inner",fill:dN,cx:i.toString(),cy:r.toString(),r:u.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(n.shape==="circular_hole_with_rect_pad"){const o=n,s=o.hole_diameter*Math.abs(t.a),a=o.rect_pad_width*Math.abs(t.a),c=o.rect_pad_height*Math.abs(t.a),l=(o.rect_border_radius??0)*Math.abs(t.a),u=s/2,[d,h]=Yt(t,[o.x+o.hole_offset_x,o.y+o.hole_offset_y]);return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"assembly-hole-outer-pad",fill:uN,x:(i-a/2).toString(),y:(r-c/2).toString(),width:a.toString(),height:c.toString(),...l?{rx:l.toString(),ry:l.toString()}:{}},value:"",children:[]},{name:"circle",type:"element",attributes:{class:"assembly-hole-inner",fill:dN,cx:d.toString(),cy:h.toString(),r:u.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(n.shape==="pill_hole_with_rect_pad"){const o=n,s=o.rect_pad_width*Math.abs(t.a),a=o.rect_pad_height*Math.abs(t.a),c=(o.rect_border_radius??0)*Math.abs(t.a),l=o.hole_height*Math.abs(t.a),u=o.hole_width*Math.abs(t.a),d=o,h=d.hole_offset_x??0,f=d.hole_offset_y??0,[m,y]=Yt(t,[o.x+h,o.y+f]),g=Math.min(l,u)/2;return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"assembly-hole-outer-pad",fill:uN,x:(i-s/2).toString(),y:(r-a/2).toString(),width:s.toString(),height:a.toString(),...c?{rx:c.toString(),ry:c.toString()}:{}},value:"",children:[]},{name:"rect",type:"element",attributes:{class:"assembly-hole-inner",fill:dN,x:(m-u/2).toString(),y:(y-l/2).toString(),width:u.toString(),height:l.toString(),rx:g.toString(),ry:g.toString()},value:"",children:[]}],value:"",attributes:{}}]}if(n.shape==="rotated_pill_hole_with_rect_pad"){const o=n,s=o.rect_pad_width*Math.abs(t.a),a=o.rect_pad_height*Math.abs(t.a),c=(o.rect_border_radius??0)*Math.abs(t.a),l=o.hole_height*Math.abs(t.a),u=o.hole_width*Math.abs(t.a),d=o,h=d.hole_offset_x??0,f=d.hole_offset_y??0,[m,y]=Yt(t,[o.x+h,o.y+f]),g=Math.min(l,u)/2;return[{name:"g",type:"element",children:[{name:"rect",type:"element",attributes:{class:"assembly-hole-outer-pad",fill:uN,x:(-s/2).toString(),y:(-a/2).toString(),width:s.toString(),height:a.toString(),transform:`translate(${i} ${r}) rotate(${-o.rect_ccw_rotation})`,...c?{rx:c.toString(),ry:c.toString()}:{}},value:"",children:[]},{name:"rect",type:"element",attributes:{class:"assembly-hole-inner",fill:dN,x:(-u/2).toString(),y:(-l/2).toString(),width:u.toString(),height:l.toString(),rx:g.toString(),ry:g.toString(),transform:`translate(${m} ${y}) rotate(${-o.hole_ccw_rotation})`},value:"",children:[]}],value:"",attributes:{}}]}return[]}var hN="rgb(210, 210, 210)";function g1n(n,e){const{transform:t}=e;if(n.shape==="rect"||n.shape==="rotated_rect"){const i=n.width*Math.abs(t.a),r=n.height*Math.abs(t.d),[o,s]=Yt(t,[n.x,n.y]),a=(n.rect_border_radius??0)*Math.abs(t.a);return n.shape==="rotated_rect"&&n.ccw_rotation?[{name:"rect",type:"element",attributes:{class:"assembly-pad",fill:hN,x:(-i/2).toString(),y:(-r/2).toString(),width:i.toString(),height:r.toString(),transform:`translate(${o} ${s}) rotate(${-n.ccw_rotation})`,"data-layer":n.layer,...a?{rx:a.toString(),ry:a.toString()}:{}},value:"",children:[]}]:[{name:"rect",type:"element",attributes:{class:"assembly-pad",fill:hN,x:(o-i/2).toString(),y:(s-r/2).toString(),width:i.toString(),height:r.toString(),"data-layer":n.layer,...a?{rx:a.toString(),ry:a.toString()}:{}},value:"",children:[]}]}if(n.shape==="pill"){const i=n.width*Math.abs(t.a),r=n.height*Math.abs(t.d),o=n.radius*Math.abs(t.a),[s,a]=Yt(t,[n.x,n.y]);return[{name:"rect",type:"element",attributes:{class:"assembly-pad",fill:hN,x:(s-i/2).toString(),y:(a-r/2).toString(),width:i.toString(),height:r.toString(),rx:o.toString(),ry:o.toString(),"data-layer":n.layer},value:"",children:[]}]}if(n.shape==="circle"){const i=n.radius*Math.abs(t.a),[r,o]=Yt(t,[n.x,n.y]);return[{name:"circle",type:"element",attributes:{class:"assembly-pad",fill:hN,cx:r.toString(),cy:o.toString(),r:i.toString(),"data-layer":n.layer},value:"",children:[]}]}if(n.shape==="polygon"){const i=(n.points??[]).map(r=>Yt(t,[r.x,r.y]));return[{name:"polygon",type:"element",attributes:{class:"assembly-pad",fill:hN,points:i.map(r=>r.join(",")).join(" "),"data-layer":n.layer},value:"",children:[]}]}return[]}var BKe=["pcb_component","pcb_smtpad","pcb_hole","pcb_plated_hole","pcb_board"];function UKe(n,e){let t=Number.POSITIVE_INFINITY,i=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(const R of n)if(R.type==="pcb_board"){const P=R.center,M=R.width||0,I=R.height||0;t=Math.min(t,P.x-M/2),i=Math.min(i,P.y-I/2),r=Math.max(r,P.x+M/2),o=Math.max(o,P.y+I/2)}const s=1,a=r-t+2*s,c=o-i+2*s,l=e?.width??800,u=e?.height??600,d=l/a,h=u/c,f=Math.min(d,h),m=(l-a*f)/2,y=(u-c*f)/2,g=ls(Rs(m-t*f+s*f,u-y+i*f-s*f),kg(f,-f)),b={transform:g},v=n.sort((R,P)=>(BKe.indexOf(P.type)??9999)-(BKe.indexOf(R.type)??9999)).flatMap(R=>b1n(R,b,n)),w=mC(n),T=_C,N={name:"svg",type:"element",attributes:{xmlns:"http://www.w3.org/2000/svg",width:l.toString(),height:u.toString(),...w&&{"data-software-used-string":w},...e?.includeVersion&&{"data-circuit-to-svg-version":T}},value:"",children:[{name:"style",type:"element",children:[{type:"text",value:`
5368
5368
  .assembly-component {
5369
5369
  fill: none;
5370
5370
  stroke: #000;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@tscircuit/runframe",
3
3
  "main": "dist/preview.js",
4
4
  "type": "module",
5
- "version": "0.0.1003",
5
+ "version": "0.0.1004",
6
6
  "exports": {
7
7
  ".": "./dist/preview.js",
8
8
  "./preview": "./dist/preview.js",
@@ -69,7 +69,7 @@
69
69
  "circuit-json-to-gerber": "^0.0.34",
70
70
  "circuit-json-to-gltf": "^0.0.7",
71
71
  "circuit-json-to-pnp-csv": "^0.0.7",
72
- "circuit-to-svg": "^0.0.202",
72
+ "circuit-to-svg": "^0.0.203",
73
73
  "class-variance-authority": "^0.7.1",
74
74
  "clsx": "^2.1.1",
75
75
  "comlink": "^4.4.2",