From 9e96ab972b487d5b0e882086db6fb1dea9179a24 Mon Sep 17 00:00:00 2001 From: seveibar Date: Sat, 25 Jul 2026 14:21:31 -0700 Subject: [PATCH 1/2] Bump footprinter for new model types --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 50bf881..6f72f97 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "jscad-electronics", "devDependencies": { "@biomejs/biome": "^1.9.3", - "@tscircuit/footprinter": "^0.0.374", + "@tscircuit/footprinter": "^0.0.391", "@types/react": "19", "@types/react-dom": "19", "@types/three": "^0.179.0", @@ -179,7 +179,7 @@ "@tscircuit/alphabet": ["@tscircuit/alphabet@0.0.24", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-vYYLwDwpTULFDwuqB5+U4RlTiHJ3Ez4Sf5OEv7rB1oVbhmh8p3Xl7h3vsi5eD4SE+x+0e8eSXKSlwSLCN94vZA=="], - "@tscircuit/footprinter": ["@tscircuit/footprinter@0.0.374", "", { "dependencies": { "@tscircuit/mm": "^0.0.8", "zod": "^3.23.8" }, "peerDependencies": { "circuit-json": "*" } }, "sha512-TqcB8fBoquEWCOIttNSvq3OD+g3j9INFn0Zn//Jmje8U42TW7SpxW5vF+N04zoCmIQ3WkMpeC2032zD4uYbg5Q=="], + "@tscircuit/footprinter": ["@tscircuit/footprinter@0.0.391", "", { "dependencies": { "@tscircuit/mm": "^0.0.8", "zod": "^3.23.8" }, "peerDependencies": { "circuit-json": "*" } }, "sha512-6sUm5uyUJjk0U19Fy1J6w5lfxdB1kQe8lMTtWjjnSTP2dCKmcoBS1Hy5bWhvRuWllYwZkAwztsHYI9DnYDoj6w=="], "@tscircuit/mm": ["@tscircuit/mm@0.0.8", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-nl7nxE7AhARbKuobflI0LUzoir7+wJyvwfPw6bzA/O0Q3YTcH3vBkU/Of+V/fp6ht+AofiCXj7YAH9E446138Q=="], diff --git a/package.json b/package.json index 6b6f4d0..767d7c0 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "@biomejs/biome": "^1.9.3", - "@tscircuit/footprinter": "^0.0.374", + "@tscircuit/footprinter": "^0.0.391", "@types/react": "19", "@types/react-dom": "19", "@types/three": "^0.179.0", From eb0fa479f785f64fa2dc44c8bf08c05d23d703d2 Mon Sep 17 00:00:00 2001 From: seveibar Date: Sat, 25 Jul 2026 14:22:49 -0700 Subject: [PATCH 2/2] Add crystal 3D model --- .../footprinter3d/fp-crystal4.example.tsx | 12 +++++ lib/Crystal.tsx | 51 ++++++++++++++++++ lib/Footprinter3d.tsx | 13 +++++ lib/index.ts | 1 + .../snapshots/__snapshots__/crystal.snap.png | Bin 0 -> 47626 bytes tests/snapshots/crystal.test.ts | 8 +++ 6 files changed, 85 insertions(+) create mode 100644 examples/footprinter3d/fp-crystal4.example.tsx create mode 100644 lib/Crystal.tsx create mode 100644 tests/snapshots/__snapshots__/crystal.snap.png create mode 100644 tests/snapshots/crystal.test.ts diff --git a/examples/footprinter3d/fp-crystal4.example.tsx b/examples/footprinter3d/fp-crystal4.example.tsx new file mode 100644 index 0000000..5e6687f --- /dev/null +++ b/examples/footprinter3d/fp-crystal4.example.tsx @@ -0,0 +1,12 @@ +import { JsCadView } from "jscad-fiber" +import { ExtrudedPads } from "lib/ExtrudedPads" +import { Footprinter3d } from "lib/Footprinter3d" + +const footprint = "crystal4" + +export default () => ( + + + + +) diff --git a/lib/Crystal.tsx b/lib/Crystal.tsx new file mode 100644 index 0000000..21fd7d0 --- /dev/null +++ b/lib/Crystal.tsx @@ -0,0 +1,51 @@ +import { Cuboid, Cylinder, RoundedCuboid } from "jscad-fiber" + +export interface CrystalProps { + padPitchX?: number + padPitchY?: number + padWidth?: number + padHeight?: number + bodyHeight?: number +} + +export const Crystal = ({ + padPitchX = 2.2, + padPitchY = 1.7, + padWidth = 1.4, + padHeight = 1.2, + bodyHeight = 0.8, +}: CrystalProps) => { + const bodyWidth = Math.max(padPitchX + padWidth - 0.4, 1.6) + const bodyLength = Math.max(padPitchY + padHeight - 0.4, 1.2) + const baseHeight = 0.12 + const canWidth = Math.max(bodyWidth - 0.12, 0.8) + const canLength = Math.max(bodyLength - 0.12, 0.8) + const canHeight = Math.max(bodyHeight - baseHeight, 0.25) + const cornerRadius = Math.min(0.24, canWidth / 4, canLength / 4) + + return ( + <> + + + + + ) +} diff --git a/lib/Footprinter3d.tsx b/lib/Footprinter3d.tsx index a32c152..8a5f0a4 100644 --- a/lib/Footprinter3d.tsx +++ b/lib/Footprinter3d.tsx @@ -57,6 +57,7 @@ import { StampBoard } from "./stampboard" import { MountedPcbModule } from "./MountedPcbModule" import SOD723 from "./SOD723" import { JSTZH1_5mm } from "./JSTZH1_5mm" +import { Crystal } from "./Crystal" /** * Outputs a 3d model for any [footprinter string](https://github.com/tscircuit/footprinter) @@ -103,6 +104,9 @@ export const Footprinter3d = ({ footprint }: { footprint: string }) => { screenheight?: number screencenteroffsetx?: number screencenteroffsety?: number + px?: number + py?: number + ph?: number } switch (fpJson.fn) { @@ -325,6 +329,15 @@ export const Footprinter3d = ({ footprint }: { footprint: string }) => { return case "hc49": return + case "crystal": + return ( + + ) case "micromelf": return case "minimelf": diff --git a/lib/index.ts b/lib/index.ts index c3ad613..facc857 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -70,3 +70,4 @@ export * from "./TO92" export * from "./MountedPcbModule" export * from "./Screen" export * from "./JSTZH1_5mm" +export * from "./Crystal" diff --git a/tests/snapshots/__snapshots__/crystal.snap.png b/tests/snapshots/__snapshots__/crystal.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..d45d62ece9d4a97c218af95ee52a798c12247383 GIT binary patch literal 47626 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%0AQJvCSi{IIX!2 z?bl|3Ln`gOX*2?yZ)O#Eg3$6}XaVlhtb}Z@0*@ESDXK?C$+Fdhc+QC2y! z@2C=7Cfq4psmAf(exf;fq*oPT_=u2?VQu!&&Tkb>GErb3(DE0?_>CnXUkTVmFTM51 z{C9N2hYAz|T*;!zcr1B0Nvm3J-|eM@JK&Rx^N)S8&SDtssG&dRxh5sFhrkhlzL6RX zJd(hJKkEmC{E1n#O1;f4kU=d05#y(($}EcZ=Gv*YlLW#@2u5!WQVOh)_B}@17-;n# z4)IT^jC3k-@iw~l+|kd8@o%+24}4eCNMCcEF9~JMF02!`MZZ20?6~+E|6-*rXGB(! zeNSr7Q~O3 zryalh_DQK$eIo7Ko_;UXW(YHr18!nAUvBKYqA>gB`&eVL5hHc$eZA|m{#)He-(+q^ zJ=1HxF*GqFO?5pEYMEWssh8Tu?QUG*`HI_GU$NiUmA=Zt{kHK1&nu%D29f-8U0geK z@d=I*D6@MS4=jlR2L(YtR+g-HYW3_!cndUnx zJqjz$>dJy<-afj$sQXz5HadGguzB_1rN3(1ZhIi$D*UT1Iu$cg(OGyWg9K2BuExGO6z>&TC^6Eiu zfdcFkiBpS~kuar!e8S^}&iHUn+Utn|h2QkIj42jh#1TeichsAvWcXII8V~W|dMg*) zhM$SQ90$=*Qu7euTG_n`Jp7K6ehSKCbz3!SaTxnRuja~7cYL*ul8V`<+j6&5`iqOg zB(NPh;ix0FoiXYU0Sj6%F;|4^`7kZ)~f{72#+Pb}m#G$##$Sx1!5v-Z@sA6{=tH@i?JpY~pn3 zwv=g_U+&Dekc<)>_jE#B?A}5RNg)$fhCx(voWa!o#~4Bh4#FeZBFpFxB3ls*^e$*g zgBgjj+t%t42Usv-cj1e39^gR*o{fW_5&FG~!GT7FWVKt&=5G~)k-RAyN1|7pH&M#8 zJ1S=szOdVaY6-w-_3z}9FN5DA+AC!V93FjChhxz})ts$6h6*I(|Wj(b77e5Q$- z0`1;mlF%_udCsk$q|lhcOtFfk$E#+G;62y$qcG@iP3uaOf7ucK#O!saISx#oUa&qz zxpR*$R2h!9l+$>N`^wxKY7CHhyqCI&Vlgu(|A_TnuOiBs3ao|_P~moIo?R9*#yJ8n z3k$K2WXQ2AX6^6)z>bRP$kwd+Uf6zfSNy_Z zZo9Yho7xK6lmsb=`dSwA{3iSh0s=HzN_v@N5HxuTpKyJAVZu$0_=swwZ<4&KX{&F? zWmmo`koLFPfD_a)B+UHmiMqh*FI^}uh>>-7K<+w4(ai_wkIlA~Ypf@?faw8liUc|Z zlD?gN4gFo367>n!-)4`4+(*e}CJ1*Q@&li5r=4_roNB zm_HWxCD4{3&k>L=25XfbA0ZrwIK*ar71S8b5^Vc8Bt1)co%pIIm_|2tdKx!Lad|~* zH>4cvdg-rC-1S`S#a_WAUlmlgInB(#JxCb|5&oPuxujIxn8ddjFB|(iSXFBho~N^=F7_ zRcVt``fvB`W7lo^#w zi(lp7Faz(qMsuj>?rP*uiM)JhQnsm*33y1UFx6RP_*&up=I4CADdzl!O=b%d8d&oZ z)~C;*u0#K7U4=(q=Q+TCk5PD$ghS5?6bvv;5{Voa-1V?T7P<;E!))NI;d?P~1UmPU zE=ih7_lqyCEg2eue4FCzsPThw4mf5sKdJ%v*%!l)7OPFWe|&=unr9~f4cx9dB?~@) z{^n92QSVUvc9=laxplQ2|K+5M^}#qHuKg;PyN%*Z^q`d>%$4BmSqL1UvE?ZttX)HFWQT3EH=x z6#auI{Gob%8XCLV=!LJMWpi9kpL2|9Rjcju?NPNcHpM!;Zw|)_?o9~jwDVAfe+Utw zOvIc4dJtqKNIG2mzuptHWp;cuhItpyUpV5z7bgT-w?OY!fVc7-edhBE^wp)ji#Ns! z=MpUMA4xQRfW-^+r#~WOL`F9zCB#l69_UlC(v`ehWT74ArH;U3h(O_~`7Iwl#rZ*v zI20oek@I^LN|EE+=2HKiVlti+BaALs`pe|3t;o~rRfQ>UH(W zrb~a{Lvvv3n;b!y#^a;R_5R`CNaY_GtBBzY&stk*7>5=``ILGG3}EsW|8O{Z^XNn^ zk1Ze#<~J1(aNF>^zmQ8N&|M*Tfv|EYik83jeEc*a%7Vb5RP0GN5E^P*gTveDR>NT> zjr8s-UGFvi$oa!k&VgRd*e4jKJD24+_XlPPVNc<6-I-s@vYD*H2*-(g+WWaJOtDzG zED+R^)VPwFLcSK74(YwZP1Ab4CTq73ot5B@9CHE~Nk|(+8K0}u2Dl!ZvTeYY`k7vr za+g!XNoISj4VyBw0@fK&WxJWD?^h5VWD~O1;|_EkcS`((dB}v$a-StJG0w^?`sP0_ z=dN9!8c}3kBz~uVlImPmm!PK2+-lbgLeOun!*!|B9a5;1TZOHNgfx@I_L!UlkAkgo zx?q!=qUO27U#`tsnAx}6rLp+&{!@FHB75Z?f2M)J<1QaeRpEIo>!8Y>c7Hh+d8PKJ ziRhL}qwz&*4d%^`LjaCu{G5;_^~9o}3tB`mp$Sh?tdW1d4vKf;i0baM1oR`lo0NM> z9gk;2okJ#xHY)s}6+N1ryyA*88N|`#BOaIq%6}Dv_CE2NLX5c0<9sT%QulW z^s_Tj=j5^LkDTXVxhK5Wz3016mHnTm5`Lq5L0(G9-R#tW^YJ0ufpm-KvA~E5raJS2 z?*9F}pT|bZtpCOkEDzqlcHxk3RTJk6t0ANS!e!o*tcz&RP{OhzDfpdI=yixb_w5b0 zr9>1{&Y{*r!irhMiW10)j=e7?;?GzhK);d4=8wE6I&7`?YPIceBt&0pJA&UJ9l@se zdu}0P(#nN-3M>Mg{pK?L_8pl9OD!qK53ns48obZLmzlB)c@ug7YjQY|m_qCXNyikV5n_MIKis6CHcSEue;+_V|}x5gT-rgTO`Y2`HsP zGGPnvl24a8`mi3mIR5e#<|nuvX_?kw*)O5nM#AasR0_f)8P5`0nHArHWJKLIHpUfD z411n$;%3VSNQV%@a? zy$MhFlCz%NET8W)oA=!&e|qnmID$#Kg%b}4E#Ey)Im|;eS56a5ehh@6*i9c;qnK^i z|N3pSnRamKXok^r#mj@&^zKLd=-{FRcHEK8Li|+a+v8YAj|JROjtm*4%(s)9ma}#k z@;cLhc1nQE0@2e#0B!bU`(|hM8>n3=^V}|d{7M(ChC)v|S|Ow*C<*(Z-b#Y(o}0tW zv5lfIcoA6FHY*NT7&VKIjEG6?%s|4&PeM#A5MF%-X2I+{8#;q!f9-@6Dj5S}NKPu> zR4W#-q}x0#)rfOytODK8d}O516$YVx`>)9M`##v@wI!)K_1Q!=d;5-Hc5}#6VG2w3 z`O56O4&`|q+n`CAucR+3F?JCH_Ah)|u$#i!{n;3euNb9h-x!Hcu^YUIZ6X?u2==uo zZHzqltGhK8$&O$WT%s?JcMr@VVG`>PR8@Uv#}kGzDsL%Efm`Cw z6`wzXk+)@HDk*AG6T?_+NCd79#-8;#9dEnoyQxlBtQQIL_OkR}#5khdKElYGCIiZK zT{k9OQ8C1)35!u$P+I9~ncw#t*~HLVlIGsmm(tClqr3^f=t!kB@%}<(+Pv(?60NUx z%(e_w_8nWwHEt`sHEu`syRf86TN>ApiM~4NfD8QX56$W0aRINEzG=a+F7CbNNCx-| zg!i$j$;C}nvtM&YczuFJ5HJLTY{xc6xO1gl(1<%{{{ zbHY=T_6ou~6tGclbKgDZkS|?`?)%Ny$Ka@pV^h=jLk;Z3tnqwWM{8a{Q%$bsKEr0v zILXrBezIIg#lwO_QE?pMSP{!khzhxqBf&mY@Ww#1b(g$04SV4C++r)wMXXRd$x zi=N?syvK-~@6T~BuWKjjBBf<#;E0~G-zc@QNvV9^&ap2F6yg(Ws2S_Jn9hB~^Kp)g zW|7KpN(B`WwfGaoiC2+ZYjG09ZP7TakGmXi$wEADTZwQeB#9u%{>ab5iv&OIJ}2}@ zEQTJQ9sr$$hFIxXJTaFTcG+tR(R^NEQ0pbpk7+oi^O*y#(ekp?@ZJ5v_*{gra0~rF zOg6$+a~Nc%$F)i;1|e)C(1)y=`@tIXYV;t zhtyBjcY$Ird1tckPLOyZZ>)MOoMDB-eL`saalXRrdWWsywGBP0?V0o8>tFGj6Lh1_ zlspt)OBv_P;GzfziTEQybj{85htb1xLKgCD@&ue}`$)w6AOcuYzM7$<(^oe*$Iz+* z{~@?+6m2nA`I70_#&Z3erP#vAGSLMO%PdYPe3wdrA;+k!QK4z11wC|z1<{Q8oP#vV zzAeeu`+*a5e^a?t3FZbOD_QIBLs|c{;Wzy){nO%lMHeK*hl4JmXxnm`{F4Bj@)b#P z0o*kq3SK>!Daxq0lt|&ok2pmii9y4ta60PF-y*Q4UqNi0XhzDthUo^)K0oirC2w$- zBa6Qsi@XLKhRvcKNC#5X%>Z$f&*fiHB!V4kq@ij&HMEjWIhjtkM zZ>Atjd9hK9YOdZ%riDK3BsFp|{SD|N=Y7E9>nqG#7^Ma#q`)()OOhZ#We-K{&BdS9 zthYkxtb6Z9ATjQ|Plax%R$hWFJt}yG&;v&}-8R`F6G}M>IHS{2tFu0q2|6{k+ zRUwjzuk);iML_L9dbVTxkA|)MCa0^vy=4^rT$j`5-d&tLiE=EC7G|Uck&O}b%x)?|fjslC63OJSBs!AZ55YO4@B3taZDnT}l3kglUjF=q=iE$dc zs+2F}_#d$A)3vS2*{kW=^HJVJ_YGx!N5e-B)N?ev+|g1FJMXI;^$+9`t-8Uzt^dgk z4`t)xd>qyu+yS=?4hfubr>ht$U3xa}x|FEYQg2nCNZ7vl$%U7SxCRCoA-6jGZlU;y zZNo;n3t8N7&lW29M64WtGK-==xFyHJ+pF`)jOc65>S#5ka-KA9K@9{U`T$kNocGzc z0eujw^R|X?HiOi->b)##av)f~{_T=&D~2x&krBEQJ6lcqb>F0T33n;zJ@0J$+L}*E zf)XR<0tcUg$oacX%uecJXe;6$jPNl?n#p0mGnLs^mpq06UmzoH4Nadma_0M-jxC%> z@ZeeM*0+*V-?*ubS39nf=gEy{%vXlJdo(I_s%;OF?oEmPGo8o&7|{hZ9pQ6hSGC|u z{>vZM(_kVgR!`5J29Zle4I@eXS#5dz&=&)b zxqo1Wmo7v&4!CJ?rxYQVl$hxPjZzz&0)d?~H$U-@D3tlT?lIJ5d7sPR1Ia3KSYgFlztzT|LL0p*OVs(;2Nu>il@q%V^Yc%E%x zFuDb%AS%R>*dVLh(-5-g$a8!?rGmihVipJ%=-n6y7?aVBVn^O&PVjfV$a>$)`CE~v z^I-J$r1Hgfjg^souuuE$Wi!oABR?YoeE#mNngF@F8v6NzCac`*02lXMoh{E!--&Zu1R5D)8h2gG~~QgatBA`ppM64Mu%ctZ`6;Icmm|uXMf_$1ln7}Ft9(88vXkhYtf#RN1uT4b z9vzjpZiIp(K|%3E!kkLS;BzZm=dPRhS_#ZZse1ykn4~Uw+y&{0o0eEE7J+|En@oOY zhR6$e7@+Zjo6s0VDPTX)3ce0cPg2Z3Ek_&O}RCH40uR( ziwn_C)yJ}rf^Ye51H={t_-BF;ll%kih5`QZ#MW?b<`R>5~iftF46 zA5L-1KOb&}=-UR2Au1SV-acCZ{ z=Agq~%LZ4a{=U2+JQqpALVoeHEND4+fyV_YZGqU)jxFo>EbyP}QMf;%0aF2cVhy=+1jX4i#cz4#58Utjs zw~5p%l}QBkD+{0UVwb8?edMoUEMgwX305xpY-U@jJ|8%pIdP- zf%T$cQ97w=PhSvE3F2^x2{C$0_<-HHy{K=Zl3T&Au;`eSc_~vhDi$2~hvzvg<;WOX z8E|U<`wL?tgVeO?^BZVw6A1VexO#B|T{xB{HVRIz4=$lq6SqB?4Ga-{AURy|{ZIo( z;*GFb_Thu7%)yCFs9WI14nNK)>NgRIwiVl0vtqmY!}uv+@ri7sdv8k4C@ML^Z}2?< z;J*=4SNVRMJ^SqC7_x&uDX82Z8MvQ=aS+@)`~<@p-?zk>VtSWvkQ0&To$=of{>evc z?HE-V5a-Tm(=f553rh}-SaS~}A&JB!_KXG*kXUaDAes!c0g>P8Fv9KH(y&c3D6*^4 z=MwobGuCF*>CKWQAo1F?3Qn`^?&tp!J}PM)Z?4ia3MpHvB%z?)gPPo8G zZ$OS4q)a55IX0#s2Uj&T61O479vlII%?N{b8OBT<<&7TqX=|qKkDEo`Vil{vER-Kh zu$uSdXYLqi1>#5UWGN-K;Qb>c4mTutI2>mJs~{z3QtYdEiO z)^9|RRHw{Cg9ro0@jyThiR}=xcv^R5#9uA~tQ#L^Dh-uShj-hO#hjF%o*!R@Kwa=$ z8+28@m%RGoX>lqY^!T1!yI1KUkFYBPWWq{aI85InxG4f-AT$uYu8*7AnT}qWVS;FR z!7Bodg?&1UCYy_9X z!P#o3Md*%e!q;cYj5#kF6Mxp6F^>LO^O+oOO{L1u9b$ND`tzjrsAmux5nmU5rQK(6 zFjkBdwmfw4-YJJY^bY)SNscxJXOkj-)4O z2wV&IqyX#59rCoMK%eOwe~nd28ynkNx+H&VBNFnZQY~<`bqPjyAYk;HMh`CbeAg_C zjNm=sH#1K0eZhM0{j3j8wm0^_o*?6P2WUtrA5G~Te}PIXoN@Gf`%9I>L$zRXUBY3# ze~jHR?DO0{B#R7!1_8QSrT_4sfwRZzp7)olkHFqw#CAvQ<{E0ej`J(&R7&#h7L{Lc zaRpUjH8rAWgEb^9C}o-L0cPfy%~ujkyMq|ys}TObycji67)QN(?AK#g#TGOeelJzy zt8o#aXF$ci@Sw@^>d<=N{`xP<@(L1!gvY5w_b+Uyx>d}%?)UzaZP51QI8uH`R<{+p zG^fhcJRfiw<8`n-ZIJD$Y#&L2(2=X@dg9P{;C{LFT<8g>RT43bjM7=vPkj67Sh&qy zVg;B-#cn}hT;S>6q!Vsyb91(Y%tGW(M<)^Hx(#JS?G?do!Ag)9LN_s13Ta^F1S??z z3k0oQxWU!eE@DWyA>GBzH;vCITb~mMdkXBlnT{9bA4Z_DMeogCa%3f}z7BRzqlIu} zaOK2}lrs`dJ_iG1(hfR)9xYQ9{(y`q7|mDWY=vYnnWbWtVmqAWU58r%1<28ElPHwk zrmo_UURr-gz+w<@?WNJScqz_byf3SSIDQ|A#vPA&6!Io{Kn5NaWv_IdU+%y7n8G|urG=Q)M1oAc*b=|uRR-8#9EelD zjox!#FCDzqluMiCL;w!)jKm&!mBrfl9z3;HV1}Q4z>vdQBGPnrTq)g$>Sl2^!9HwB zlEI?NvOlnWCup>hDCv80Kcp z@o6p5b<)WbGjf=QM1KtO5HR{}b^KD&gia))otJlUr8s*j;)6ugnYM{K_f|zpV{P1N zZZwN+je~Cs!}1pb6SvnjzC#3i-&@ruChn-vreNh>M-wHeNAVnuss)4@#HkM%Kxu^v ztK6w>HfbPUWYD3$cPYZ1p+k%U@d_*lXlqQl$#8_Ze{s6Ve$DcS#n+OQ=JON9A9{t- z%)PJGm|&(UIX%pTb?N5Re*dp~+ftIHEvt6oq5JU7dJivNSc3CAVRVj2FM+Vzr&(=b^^&%Yw!-uhT}}$Z94F=RzVJDO;OI>*O90;Gv0n>YX}&eV!*&;7*O2x*Ud&TaW7vc&&?;G6V z&@$k0@Gq=|I+g6_=?m{r6YCzx+%>n56;u}I_^kciD~($yBEnHJ!`2&f&JVVo{ef6p z+U3wk?#O2LU7a*X30apB&*n)(;5b6W>`d_>!(sOwIa~Ot6shW$;C9%5sMB?as}yeP z-I=ZKB`~F_M;dWyzrxN-tB?G7@b@W$F)hop*(FZG0`u;pRv_#dYkMpRSu6%wFRdHhZwrRGxw(h8*yQ~lBBZ#<1kF;K=`bGLf?00_N8(E~+H|QaIe-&BykcS8+(CWg+{@v*q_!KTeDlbhD zMjH6G|Mz%?@aFQiu$~FjwI{X$RNMtfLP+bypU9@suiwo|{8ZWqMNgFl>^*0oLYhkl z6?P$tn|i5MMFx37VC;d*cKX2Q4jFK?(0oQ_o9kBVO6Og~+zl^T#rcUUbS4jodgomq z)D8>&5RX_M?{B>5(#QK`zC^Mb_gb=OJ+x#Ck%)S12PhGX-nxTsKYN=I@0F9!%Sa5& zmnE1KTcTp~kTpYfBh&l#mnMfectnU5z86%rX;;|nDxhtV2>p8_T#K71M5C~5A@NBh zo>8^EVHK;EhHKH}nmli4qeis!T3R>tYu2>ef%#t+|0!5%Pu{V^d&RUM^jvPVZ@CE8 z3fQ#jwopqT$EJg$J?aOpoY%|F&Wn|pTe9?+y?q#>4;k5Ji=P4*Q_nnqOl+UVcHliM zku4=n{e|tUfPPUhxaDqn7>$7^ss{;7v;VcM7gOE#7$lda-=U&k3<7dz48psQ@D*k+ zc$bd_je#mUs-W}tleSd&HRL}qM5datDJmSID{iX2$R;c6{3#ry+zq`w_E5SAD}L4( znz20VBjse7p|5yE2Sm~7({~502=9`?<<2lLKKe#e+_=ogRWu8u5KW+Da-%zqa-;$mD8|N6-%X2q`L?o<{Zjz&MlH0Eaa zfXpE>y#^93)2bqJwUV6Qxy>9I*B2vwisC^ zwfZC~ec*h|ad@_5nsHgKYVQU=FY&VCr-loVNDv0k!o)1xQ&>p8+19iwNtBD zVRjH5f)uOTLUP7}*o_kUDBCfjI^uhbBIcaGu@io|N?0J9TCnM5mXG*d7h9R&fRKCo z%(=I@&_;J~o*mYd9624VfHNxu4hS60BzgN--8vFUCf=Z0wh86KVts<8d#Wi}0k_NE zWR*t`mX#%Yz+-Q*@s{e18Ih5Rtd~DE3~_65hj3=|zyY$Q@kIZEy-wGLbwhsYicbsk z>bReen2yMVUhLit?s*>`-n0_9HDsYZnj0%uTy>nDMjK#JG?NUN*crI=-Qq3M(s+T|wO^%m&wNM+O*z@HK11C*M&0^Gsdp@APosaK!ERhITi&0Yk(ZJ_ z!t|=BXwic1I4x-zfk&=t><;Hc1=&_o9>$!{he>Ocv~&bTDy2Qlv;k8)#g#j%4nh;w z7PHOg6Rm2CdC6OXMfc%$p`f!ds@qg}mYa;Q zD`>fNE$r6;u|jPrID}y9TctZhTy@6qq%UX?&x@?=p}f`S;=5mR=mpV){MOz{MGG}- zZ~1U_psd$mrr)F${jO^PMG2`%@s{;>mz}IlGVPw7IiH|MXc(mI?%iD@XTetEn(w<< zn&>Q+U4l+wk~U=?ZJ)-8IErduSjbT8a2@FVBVLK$XMVic2T!+G_ig^U&(%L3-^EI1 zjSaE>TAnQO;2N%z5evTn>M*E0-7tM6!(`gNu)dxmYw>R@jT&}qn+E+AhL`1B!Jdvw z{9?G0vNDGYce#j!`Q4dhCFn+zJ%@Y+cfsSQ1>Y;>vqg6 zSl6j##ZjCXUiNq1#;vZfWOUTg$dvo5d;hQ1Xe4yz-IpczKZaiT8iRZLWUQvOejq)* ziZ2vvSBgbsaN8EzF#!VJf@~M-6@_gs*P*hlWz4y^INKgKL~Vzj@jXe1;ea>P76JIPgP5+}K?3UTQ@YY_ig7H`nmxN1|&QHw4r z1-|4)qKAK{r#-k>(!kQVHggaw6uvG~0AW|_1PlF1s+}vvyR%!obSfS@7Q%8bG+~?fJ)m~oT+6ry)9<|ON zr7Xc0!n+e%%g{A9lw8(3Ra$uZl_i}$pLYelODV*r5DJa1NUn`()6+_=g@(7s`|m$Ek8x-mn-Zbud`_N+P{qFn?&*kx-0QZf?q!(V z1kZ6p`t*1)^SBKB)Bf*yi z<|L+n0(tdfp;p_WsagF)ROahjE^~uChg`6QHVwFcEa%NJQ$l@Y;&c0tW`$A4E^xH{i_p7qzfmFJ3XJWYGVf=oZP zdAE@|3o5>o^YHZf))BXf7QJ>hDCtkMDp{?b=Ziv&Li5WHU ztsLXc<+==CQ>_hU&+E?~o84iXA2=C5kMt?nlSm*t;0#0|ofvZzJR46Epu6vd;ezE_6pagR z`hz90-0rE#ZnhmwnvA}susxqz@}mHEAPb-Nk&!p=5u5$+xkvWN;35lW+h*v5JEt3= z_u+UXjXth5Zf=yK3^ALO6Sfb&bj|acK8xB0nP|<#@3Gt)NXt#fgk?pC&|0_@R)x&f zDl*8d5nJ!|$#>p6uI9gMI}RNz7}6ne`tY(}TFxz}bK9DZ#eOuVEwOo%Ey{Z+vqBXL zu`mLDwgX3=7%tbh+6vUk+`ybMKPGHZLp=;rtl`X-KGV2vf2!_c{X&$`)iq>~3ak3ZJzt{*Ds^4uOaY(<$Q>H(zv|Qr0};;&T~2AS=%S7w zIBYS+Yn4g~Jv!A9thy`vGJ@iEqS_>2jeDvI4XBv({2a&rj2n+J4N`;TUsi@jQIfWnERdya`VKsQ1WJKD(rgx}g{ z`2N(xT~ay+RLESrdFvmwC(kbQWJ_7e>;sDvEqErUU&?;=BNF}7-|w-#{eu~s_|eI% z?h1Or>I_m7BzxGHF3L02XwKads9`ve90eT@;lLJM%W3o%AHEgcvNd^;bvJHKzibpI zL%evIAm%L{=^AoYdGJB%WTm$0(rv`}!P3V$8L!U_bi4K7Hcx!{)Smjrs^+o!Vqbi% zw4U3guW>|vg~Gb4@lY!N&g z8|)1?;bXkEo=&4DbHXv&PZ9(hwI62Y&(cq>LO_B~!i4DhS93d8b2z6E`kDzdui?C~j=p+t3+0RmLv9Gx)0Vdexgh>5 z=$f=XzP?W<4cV{HS6}dbD0q}J9N*6`-a_?+)vs1&hKi)aKYuXXmxyxUSx_QfxP4d7 zRbS-78RiUD*kxGS+S+(~y(=;bc)6Jl4j~yYx9D&#^bxnW?09)iJGscXuDB(bTfbm^ zRDI&=c-69f^pL@qSg^$y={6rCf&KFHRrcHSH4JIy+0AK!PIFn;gXy%<-^cRv(9vns zZ=buE*oE8K+T~vn++hMOS(R9wzp*{eDBD`r{~GS3C;8-=MaK&Xx4%9feKGR8nJfAa z)TuJ@U}qAtBSBV8^;>hjXfSs|-lKy`rocMV9kTUvm#sx?wW1hh7ZqpCFn0}dT8w+A9`4--WW?GL+^rqv%)n^rl#c!gnm z`PW(2PFNELda^n5JmGpg&u^~Xwl-4*&7bpP+04MQHE&N|+% zD+6ARX4pEO|8>*GT^Jm*7>Bc&8z>oO2mSMkAIRi-wp@}({4zh`Fk+7pW6t`>HLp^u zXFU+lAwSQMmS>O=bMtlu%g}l{dP^&bO_Q6)zD!s83cBW`&ooDLa~FzKsVDlosUYOa zPJP#KVSs%T7&>!1ywN7OqR_9yCm>8#C#BagWih?=Z6=M4AUC?4IiYe^m@NIp+kj(y zaVkT~VIcGNUXVm8#z^OvxrQyBLe$f@mVtrW01N=Y5g+ay0DwXr2mk<#-{AlN6p;XU z03ZZc6aWZhherVbaHIin06;ei1ppvQ@c#$@zs8NxH#o0Yf~Q5OhYM^90OX{UC86S9 GgZ>XhM_?%c literal 0 HcmV?d00001 diff --git a/tests/snapshots/crystal.test.ts b/tests/snapshots/crystal.test.ts new file mode 100644 index 0000000..cf4dc88 --- /dev/null +++ b/tests/snapshots/crystal.test.ts @@ -0,0 +1,8 @@ +import { expect, test } from "bun:test" +import "../fixtures/png-matcher" +import { renderFootprint } from "../helpers/render-footprint" + +test("Crystal-4 package", async () => { + const pngBuffer = await renderFootprint("crystal4") + await expect(pngBuffer).toMatchPngSnapshot(import.meta.path) +})