jscad-electronics 0.0.149 → 0.0.150

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.
package/dist/index.js CHANGED
@@ -349,7 +349,7 @@ var BGA = ({
349
349
  }) => {
350
350
  const bodyHeight = packageHeight - standoffHeight;
351
351
  const bodyOffset = standoffHeight + bodyHeight / 2;
352
- const ballOffset = -standoffHeight / 2;
352
+ const ballOffset = Math.max(standoffHeight / 2, ballDiameter / 2);
353
353
  const ballsSoup = footprintString ? fp.string(footprintString).circuitJson() : null;
354
354
  return /* @__PURE__ */ jsxs10(Fragment10, { children: [
355
355
  /* @__PURE__ */ jsx10(Translate2, { z: bodyOffset, children: /* @__PURE__ */ jsx10(Colorize, { color: "#555", children: /* @__PURE__ */ jsx10(Cuboid10, { size: [packageWidth, packageLength, bodyHeight] }) }) }),
@@ -757,7 +757,8 @@ var ExtrudedPads = ({
757
757
  };
758
758
 
759
759
  // lib/Footprinter3d.tsx
760
- import { fp as fp3 } from "@tscircuit/footprinter";
760
+ import { fp as fp5 } from "@tscircuit/footprinter";
761
+ import { Rotate as Rotate17, Translate as Translate37 } from "jscad-fiber";
761
762
 
762
763
  // lib/DualInlinePackage.tsx
763
764
  import { Polygon as Polygon3, ExtrudeLinear as ExtrudeLinear3, Rotate as Rotate3, Translate as Translate6 } from "jscad-fiber";
@@ -2457,8 +2458,8 @@ var SMA = () => {
2457
2458
  import { Cuboid as Cuboid21, Colorize as Colorize14, Union as Union7, Hull as Hull9, Translate as Translate13 } from "jscad-fiber";
2458
2459
  import { Fragment as Fragment31, jsx as jsx35, jsxs as jsxs31 } from "react/jsx-runtime";
2459
2460
  var SMB = () => {
2460
- const bodyWidth = 4.4;
2461
- const bodyLength10 = 3.4;
2461
+ const bodyWidth = 4.6;
2462
+ const bodyLength10 = 4;
2462
2463
  const bodyHeight = 2.3;
2463
2464
  const padWidth = 1.45;
2464
2465
  const padThickness = 0.12;
@@ -2748,12 +2749,14 @@ var SOD123FL = () => {
2748
2749
  // lib/sod-123W.tsx
2749
2750
  import { Colorize as Colorize19, Cuboid as Cuboid26, Hull as Hull14, Translate as Translate18, Union as Union12 } from "jscad-fiber";
2750
2751
  import { Fragment as Fragment36, jsx as jsx40, jsxs as jsxs36 } from "react/jsx-runtime";
2751
- var SOD123W = () => {
2752
- const fullWidth = 2.6;
2753
- const bodyLength10 = 1.7;
2754
- const bodyHeight = 1;
2755
- const padWidth = 0.9;
2756
- const padLength = 0.9;
2752
+ var SOD123W = ({
2753
+ bodyWidth = 2.6,
2754
+ bodyLength: bodyLength10 = 1.7,
2755
+ bodyHeight = 1
2756
+ } = {}) => {
2757
+ const fullWidth = bodyWidth;
2758
+ const padWidth = bodyLength10 * 0.53;
2759
+ const padLength = bodyWidth * 0.35;
2757
2760
  const padThickness = 0.2;
2758
2761
  const leftPadCenterX = -(fullWidth / 2 - 0.075);
2759
2762
  const rightPadCenterX = fullWidth / 2 - 0.075;
@@ -3022,17 +3025,19 @@ var SOD923 = () => {
3022
3025
 
3023
3026
  // lib/SOT-223.tsx
3024
3027
  import { Fragment as Fragment40, jsx as jsx44, jsxs as jsxs40 } from "react/jsx-runtime";
3025
- var SOT223 = () => {
3026
- const fullWidth = 6.6;
3027
- const bodyWidth = 3.5;
3028
- const bodyLength10 = 6.5;
3029
- const bodyHeight = 1.7;
3030
- const leadWidth = 0.7;
3031
- const leftLeadWidth = 3;
3028
+ var SOT223 = ({
3029
+ fullWidth = 6.6,
3030
+ bodyWidth = 3.5,
3031
+ bodyLength: bodyLength10 = 6.5,
3032
+ bodyHeight = 1.7,
3033
+ leadWidth = 0.7,
3034
+ tabLeadWidth = 3,
3035
+ padPitch = 2.3,
3036
+ leadHeight = 0.75
3037
+ } = {}) => {
3038
+ const leftLeadWidth = tabLeadWidth;
3032
3039
  const leadThickness = 0.25;
3033
- const leadHeight = 0.75;
3034
3040
  const padContactLength = 0.5;
3035
- const padPitch = 2.3;
3036
3041
  const extendedBodyDistance = fullWidth - bodyWidth;
3037
3042
  return /* @__PURE__ */ jsxs40(Fragment40, { children: [
3038
3043
  /* @__PURE__ */ jsx44(
@@ -3914,85 +3919,73 @@ var MS013 = ({
3914
3919
  import {
3915
3920
  Colorize as Colorize27,
3916
3921
  Cuboid as Cuboid34,
3917
- Hull as Hull19,
3918
- Rotate as Rotate10,
3919
- Translate as Translate22,
3920
3922
  Cylinder as Cylinder7,
3921
- Subtract as Subtract4
3923
+ Rotate as Rotate10,
3924
+ Subtract as Subtract4,
3925
+ Translate as Translate22
3922
3926
  } from "jscad-fiber";
3923
3927
  import { Fragment as Fragment52, jsx as jsx56, jsxs as jsxs52 } from "react/jsx-runtime";
3924
- var TO220 = () => {
3925
- const fullLength10 = 20;
3926
- const bodyLength10 = 9.9;
3927
- const bodyHeight = 4.5;
3928
- const zOffset = 1;
3929
- const padWidth = 9.9;
3930
- const padLength = 6.5;
3931
- const padThickness = 1.3;
3932
- const padHoleDiameter = 3;
3933
- const prongWidth = 0.81;
3934
- const prongLength = 16;
3935
- const prongHeight = 0.5;
3936
- const prongPitch = 2.7;
3937
- const bodyWidth = padWidth;
3938
- const bodyFrontX = fullLength10 - bodyLength10 / 2;
3939
- const bodyBackX = fullLength10 + bodyLength10 / 2;
3940
- const prongCenterX = bodyFrontX - prongLength / 2;
3941
- const padCenterX = bodyBackX + padLength / 2;
3942
- return /* @__PURE__ */ jsx56(Translate22, { center: [0, 0, zOffset], children: /* @__PURE__ */ jsxs52(Fragment52, { children: [
3943
- /* @__PURE__ */ jsxs52(Rotate10, { rotation: [0, 55, -55], children: [
3944
- /* @__PURE__ */ jsxs52(Subtract4, { children: [
3945
- /* @__PURE__ */ jsx56(
3946
- Cuboid34,
3947
- {
3948
- color: "#ccc",
3949
- size: [padLength + 0.1, padWidth, padThickness],
3950
- center: [padCenterX, 0, padThickness - 2]
3951
- }
3952
- ),
3953
- /* @__PURE__ */ jsx56(
3954
- Cylinder7,
3955
- {
3956
- color: "black",
3957
- center: [padCenterX, 0, padThickness - 2],
3958
- radius: padHoleDiameter / 2,
3959
- height: padThickness * 1.2
3960
- }
3961
- )
3962
- ] }),
3963
- /* @__PURE__ */ jsx56(Colorize27, { color: "#222", children: /* @__PURE__ */ jsx56(
3964
- ChipBody,
3928
+ var TO220_DEFAULT_LEADS = [
3929
+ { x: -2.54, y: -1 },
3930
+ { x: 0, y: -1 },
3931
+ { x: 2.54, y: -1 }
3932
+ ];
3933
+ var TO220 = ({
3934
+ mouldedTab = false,
3935
+ leads = TO220_DEFAULT_LEADS,
3936
+ bodyWidth = 10,
3937
+ bodyThickness = 4.5,
3938
+ bodyHeight = 9.2,
3939
+ tabHeight = 6.4,
3940
+ tabThickness = 1.4,
3941
+ mountingHoleDiameter = 3.6,
3942
+ standoff = 3,
3943
+ leadLength = 3,
3944
+ bodyColor = "#222",
3945
+ tabColor = "#ccc",
3946
+ leadColor = "#d4b106"
3947
+ } = {}) => {
3948
+ const centerX = leads.reduce((sum, lead) => sum + lead.x, 0) / leads.length;
3949
+ const centerY = leads.reduce((sum, lead) => sum + lead.y, 0) / leads.length;
3950
+ const bodyBottom = standoff;
3951
+ const bodyTop = bodyBottom + bodyHeight;
3952
+ const tabTop = bodyTop + tabHeight;
3953
+ const tabY = centerY + (bodyThickness - tabThickness) / 2;
3954
+ const holeZ = tabTop - Math.max(mountingHoleDiameter * 0.8, 2.6);
3955
+ const leadWidth = 0.8;
3956
+ const leadThickness = 0.5;
3957
+ return /* @__PURE__ */ jsxs52(Fragment52, { children: [
3958
+ /* @__PURE__ */ jsx56(Colorize27, { color: bodyColor, children: /* @__PURE__ */ jsx56(
3959
+ Cuboid34,
3960
+ {
3961
+ size: [bodyWidth, bodyThickness, bodyHeight],
3962
+ center: [centerX, centerY, bodyBottom + bodyHeight / 2]
3963
+ }
3964
+ ) }),
3965
+ /* @__PURE__ */ jsx56(Colorize27, { color: mouldedTab ? bodyColor : tabColor, children: /* @__PURE__ */ jsxs52(Subtract4, { children: [
3966
+ /* @__PURE__ */ jsx56(
3967
+ Cuboid34,
3965
3968
  {
3966
- width: bodyWidth,
3967
- length: bodyLength10,
3968
- height: bodyHeight,
3969
- center: { x: fullLength10, y: 0, z: -2.4 },
3970
- includeNotch: false,
3971
- straightHeightRatio: 0.3,
3972
- taperRatio: 0.04,
3973
- heightAboveSurface: 1
3969
+ size: [bodyWidth, tabThickness, tabHeight],
3970
+ center: [centerX, tabY, bodyTop + tabHeight / 2]
3974
3971
  }
3975
- ) })
3976
- ] }),
3977
- /* @__PURE__ */ jsx56(Rotate10, { rotation: [0, 55, 55], children: Array.from({ length: 3 }).map((_, i) => {
3978
- const x = prongCenterX;
3979
- const y = (i - 1) * prongPitch;
3980
- const z = -prongHeight - 0.6;
3981
- return /* @__PURE__ */ jsxs52(Colorize27, { color: "gold", children: [
3982
- /* @__PURE__ */ jsxs52(Hull19, { children: [
3983
- /* @__PURE__ */ jsx56(Translate22, { center: [bodyFrontX - bodyHeight / 2 + 0.1, y, z], children: /* @__PURE__ */ jsx56(Cuboid34, { size: [bodyHeight, prongWidth + 1, prongHeight] }) }),
3984
- /* @__PURE__ */ jsx56(
3985
- Translate22,
3986
- {
3987
- center: [bodyFrontX - bodyHeight / 2 - 1 + 0.1, y, z],
3988
- children: /* @__PURE__ */ jsx56(Cuboid34, { size: [bodyHeight, prongWidth, prongHeight] })
3989
- }
3990
- )
3991
- ] }),
3992
- /* @__PURE__ */ jsx56(Translate22, { center: [x, y, z], children: /* @__PURE__ */ jsx56(Cuboid34, { size: [prongLength + 0.1, prongWidth, prongHeight] }) })
3993
- ] }, `prong-${i}`);
3994
- }) })
3995
- ] }) });
3972
+ ),
3973
+ /* @__PURE__ */ jsx56(Rotate10, { rotation: ["90deg", 0, 0], children: /* @__PURE__ */ jsx56(Translate22, { center: [centerX, holeZ, -tabY], children: /* @__PURE__ */ jsx56(
3974
+ Cylinder7,
3975
+ {
3976
+ radius: mountingHoleDiameter / 2,
3977
+ height: tabThickness * 3
3978
+ }
3979
+ ) }) })
3980
+ ] }) }),
3981
+ leads.map((lead) => /* @__PURE__ */ jsx56(Colorize27, { color: leadColor, children: /* @__PURE__ */ jsx56(
3982
+ Cuboid34,
3983
+ {
3984
+ size: [leadWidth, leadThickness, standoff + leadLength],
3985
+ center: [lead.x, lead.y, (standoff - leadLength) / 2]
3986
+ }
3987
+ ) }, `lead-${lead.x}-${lead.y}`))
3988
+ ] });
3996
3989
  };
3997
3990
 
3998
3991
  // lib/SOT-457.tsx
@@ -4196,50 +4189,106 @@ var SOT963 = () => {
4196
4189
  import {
4197
4190
  Colorize as Colorize28,
4198
4191
  Cuboid as Cuboid36,
4199
- Hull as Hull20,
4192
+ Hull as Hull19,
4200
4193
  Translate as Translate23,
4201
4194
  Cylinder as Cylinder8,
4202
4195
  Subtract as Subtract5
4203
4196
  } from "jscad-fiber";
4204
- import { jsx as jsx59, jsxs as jsxs55 } from "react/jsx-runtime";
4205
- var TO92 = () => {
4206
- const bodyRadius = 2.4;
4207
- const bodyHeight = 4.5;
4208
- const flatCut = 1.1;
4197
+ import { Fragment as Fragment55, jsx as jsx59, jsxs as jsxs55 } from "react/jsx-runtime";
4198
+ var TO92_DEFAULT_LEADS = [
4199
+ { x: -1.27, y: 0.98 },
4200
+ { x: 0, y: 2.25 },
4201
+ { x: 1.27, y: 0.98 }
4202
+ ];
4203
+ var splitOuterLeads = (leads) => {
4204
+ let outer = [leads[0], leads[leads.length - 1]];
4205
+ let best = -1;
4206
+ for (let i = 0; i < leads.length; i++) {
4207
+ for (let j = i + 1; j < leads.length; j++) {
4208
+ const separation = Math.hypot(
4209
+ leads[i].x - leads[j].x,
4210
+ leads[i].y - leads[j].y
4211
+ );
4212
+ if (separation > best) {
4213
+ best = separation;
4214
+ outer = [leads[i], leads[j]];
4215
+ }
4216
+ }
4217
+ }
4218
+ return { outer, separation: best };
4219
+ };
4220
+ var TO92 = ({
4221
+ bodyDiameter = 4.8,
4222
+ bodyHeight = 4.5,
4223
+ flatCut = 1.1,
4224
+ leads = TO92_DEFAULT_LEADS,
4225
+ standoff = 1.5,
4226
+ leadLength = 3,
4227
+ bodyColor = "#222"
4228
+ } = {}) => {
4229
+ const bodyRadius = bodyDiameter / 2;
4209
4230
  const legWidth = 0.4;
4210
4231
  const legThickness = 0.25;
4211
- const bodyZ = bodyHeight / 2;
4212
- const bodyColor = "#222";
4213
- const leadLength = 0.43;
4214
- const leadTipSize = [leadLength, legWidth, 1.32];
4215
- const leadSmallSize = [
4216
- leadLength,
4232
+ const { outer, separation } = splitOuterLeads(leads);
4233
+ const [first, last] = outer;
4234
+ const bodyCenter = {
4235
+ x: (first.x + last.x) / 2,
4236
+ y: (first.y + last.y) / 2
4237
+ };
4238
+ const axisLength = Math.max(separation, 1e-3);
4239
+ const axis = {
4240
+ x: (last.x - first.x) / axisLength,
4241
+ y: (last.y - first.y) / axisLength
4242
+ };
4243
+ const exitPitch = separation / 2;
4244
+ const exitFor = (index) => {
4245
+ const offset = (index - (leads.length - 1) / 2) * exitPitch;
4246
+ return {
4247
+ x: bodyCenter.x + axis.x * offset,
4248
+ y: bodyCenter.y + axis.y * offset
4249
+ };
4250
+ };
4251
+ const leadSize = [
4252
+ legThickness,
4217
4253
  legWidth,
4218
4254
  legThickness
4219
4255
  ];
4220
- const leadTipPos1 = [0, 0, -0.66];
4221
- const leadMidPosA = [0, 0, -1.32];
4222
- const leadMidPosB = [0, 1.28, -2.72];
4223
- const leadTipPos2 = [0, 1.28, -8.9];
4224
- const sideLeadZ = -7.5;
4225
- return /* @__PURE__ */ jsxs55(Translate23, { center: [0, 1, 10.5], children: [
4256
+ return /* @__PURE__ */ jsxs55(Fragment55, { children: [
4226
4257
  /* @__PURE__ */ jsx59(Colorize28, { color: bodyColor, children: /* @__PURE__ */ jsxs55(Subtract5, { children: [
4227
- /* @__PURE__ */ jsx59(Translate23, { center: [0, 0, bodyZ], children: /* @__PURE__ */ jsx59(Cylinder8, { radius: bodyRadius, height: bodyHeight }) }),
4228
- /* @__PURE__ */ jsx59(Translate23, { center: [0, -(bodyRadius - flatCut / 2), bodyZ], children: /* @__PURE__ */ jsx59(Cuboid36, { size: [bodyRadius * 2, flatCut, bodyHeight + 0.2] }) })
4258
+ /* @__PURE__ */ jsx59(
4259
+ Translate23,
4260
+ {
4261
+ center: [bodyCenter.x, bodyCenter.y, standoff + bodyHeight / 2],
4262
+ children: /* @__PURE__ */ jsx59(Cylinder8, { radius: bodyRadius, height: bodyHeight })
4263
+ }
4264
+ ),
4265
+ /* @__PURE__ */ jsx59(
4266
+ Translate23,
4267
+ {
4268
+ center: [
4269
+ bodyCenter.x,
4270
+ bodyCenter.y - (bodyRadius - flatCut / 2),
4271
+ standoff + bodyHeight / 2
4272
+ ],
4273
+ children: /* @__PURE__ */ jsx59(Cuboid36, { size: [bodyRadius * 2, flatCut, bodyHeight + 0.2] })
4274
+ }
4275
+ )
4229
4276
  ] }) }),
4230
- /* @__PURE__ */ jsx59(Translate23, { center: leadTipPos1, children: /* @__PURE__ */ jsx59(Cuboid36, { size: leadTipSize }) }),
4231
- /* @__PURE__ */ jsxs55(Hull20, { children: [
4232
- /* @__PURE__ */ jsx59(Translate23, { center: leadMidPosA, children: /* @__PURE__ */ jsx59(Cuboid36, { size: leadSmallSize }) }),
4233
- /* @__PURE__ */ jsx59(Translate23, { center: leadMidPosB, children: /* @__PURE__ */ jsx59(Cuboid36, { size: leadSmallSize }) })
4234
- ] }),
4235
- /* @__PURE__ */ jsx59(Translate23, { center: leadTipPos2, children: /* @__PURE__ */ jsx59(Cuboid36, { size: [leadLength, legWidth, 12.2] }) }),
4236
- /* @__PURE__ */ jsx59(Translate23, { center: [1.3, 0, sideLeadZ], children: /* @__PURE__ */ jsx59(Cuboid36, { size: [leadLength, legWidth, 15] }) }),
4237
- /* @__PURE__ */ jsx59(Translate23, { center: [-1.3, 0, sideLeadZ], children: /* @__PURE__ */ jsx59(Cuboid36, { size: [leadLength, legWidth, 15] }) })
4277
+ leads.map((lead, index) => {
4278
+ const exit = exitFor(index);
4279
+ return /* @__PURE__ */ jsxs55(Translate23, { center: [0, 0, 0], children: [
4280
+ /* @__PURE__ */ jsxs55(Hull19, { children: [
4281
+ /* @__PURE__ */ jsx59(Translate23, { center: [lead.x, lead.y, 0], children: /* @__PURE__ */ jsx59(Cuboid36, { size: leadSize }) }),
4282
+ /* @__PURE__ */ jsx59(Translate23, { center: [exit.x, exit.y, standoff], children: /* @__PURE__ */ jsx59(Cuboid36, { size: leadSize }) })
4283
+ ] }),
4284
+ /* @__PURE__ */ jsx59(Translate23, { center: [lead.x, lead.y, -leadLength / 2], children: /* @__PURE__ */ jsx59(Cuboid36, { size: [legThickness, legWidth, leadLength] }) })
4285
+ ] }, `lead-${lead.x}-${lead.y}`);
4286
+ })
4238
4287
  ] });
4239
4288
  };
4240
4289
 
4241
4290
  // lib/SOT-363.tsx
4242
- import { Fragment as Fragment55, jsx as jsx60, jsxs as jsxs56 } from "react/jsx-runtime";
4291
+ import { Fragment as Fragment56, jsx as jsx60, jsxs as jsxs56 } from "react/jsx-runtime";
4243
4292
  var SOT363 = () => {
4244
4293
  const fullWidth = 2;
4245
4294
  const bodyWidth = 1.25;
@@ -4250,7 +4299,7 @@ var SOT363 = () => {
4250
4299
  const leadHeight = 0.85;
4251
4300
  const padContactLength = 0.3;
4252
4301
  const extendedBodyDistance = fullWidth - bodyWidth;
4253
- return /* @__PURE__ */ jsxs56(Fragment55, { children: [
4302
+ return /* @__PURE__ */ jsxs56(Fragment56, { children: [
4254
4303
  /* @__PURE__ */ jsx60(
4255
4304
  SmdChipLead,
4256
4305
  {
@@ -4372,7 +4421,7 @@ var SOT_363_default = SOT363;
4372
4421
 
4373
4422
  // lib/SOT-886.tsx
4374
4423
  import { Cuboid as Cuboid37 } from "jscad-fiber";
4375
- import { Fragment as Fragment56, jsx as jsx61, jsxs as jsxs57 } from "react/jsx-runtime";
4424
+ import { Fragment as Fragment57, jsx as jsx61, jsxs as jsxs57 } from "react/jsx-runtime";
4376
4425
  var SOT886 = () => {
4377
4426
  const bodyWidth = 1;
4378
4427
  const bodyLength10 = 1.45;
@@ -4383,7 +4432,7 @@ var SOT886 = () => {
4383
4432
  const pitch = 0.5;
4384
4433
  const pinsPerSide = 3;
4385
4434
  const pinSpan = pitch * (pinsPerSide - 1);
4386
- return /* @__PURE__ */ jsxs57(Fragment56, { children: [
4435
+ return /* @__PURE__ */ jsxs57(Fragment57, { children: [
4387
4436
  /* @__PURE__ */ jsx61(
4388
4437
  ChipBody,
4389
4438
  {
@@ -4432,11 +4481,11 @@ var SOT886 = () => {
4432
4481
 
4433
4482
  // lib/sod-323.tsx
4434
4483
  import { Colorize as Colorize29, Cuboid as Cuboid38 } from "jscad-fiber";
4435
- import { Fragment as Fragment57, jsx as jsx62, jsxs as jsxs58 } from "react/jsx-runtime";
4484
+ import { Fragment as Fragment58, jsx as jsx62, jsxs as jsxs58 } from "react/jsx-runtime";
4436
4485
  var SOD323 = () => {
4437
4486
  const fullWidth = 2.5;
4438
- const bodyLength10 = 1.25;
4439
- const bodyWidth = 1.7;
4487
+ const bodyLength10 = 1.4;
4488
+ const bodyWidth = 1.8;
4440
4489
  const bodyHeight = 0.95;
4441
4490
  const leadWidth = 0.3;
4442
4491
  const leadThickness = 0.175;
@@ -4444,7 +4493,7 @@ var SOD323 = () => {
4444
4493
  const padCenterX = bodyWidth / 2;
4445
4494
  const bodyDistance = 0.45;
4446
4495
  const leadHeight = 0.7;
4447
- return /* @__PURE__ */ jsxs58(Fragment57, { children: [
4496
+ return /* @__PURE__ */ jsxs58(Fragment58, { children: [
4448
4497
  /* @__PURE__ */ jsx62(
4449
4498
  SmdChipLead,
4450
4499
  {
@@ -4503,8 +4552,8 @@ var SOD323 = () => {
4503
4552
  };
4504
4553
 
4505
4554
  // lib/sod-323F.tsx
4506
- import { Colorize as Colorize30, Cuboid as Cuboid39, Hull as Hull22, Translate as Translate25, Union as Union17 } from "jscad-fiber";
4507
- import { Fragment as Fragment58, jsx as jsx63, jsxs as jsxs59 } from "react/jsx-runtime";
4555
+ import { Colorize as Colorize30, Cuboid as Cuboid39, Hull as Hull21, Translate as Translate25, Union as Union17 } from "jscad-fiber";
4556
+ import { Fragment as Fragment59, jsx as jsx63, jsxs as jsxs59 } from "react/jsx-runtime";
4508
4557
  var SOD323F = () => {
4509
4558
  const fullWidth = 1.7;
4510
4559
  const bodyLength10 = 1.25;
@@ -4516,7 +4565,7 @@ var SOD323F = () => {
4516
4565
  const rightPadCenterX = fullWidth / 2 + padLength / 2;
4517
4566
  const taperOffset = 0.2;
4518
4567
  const straightHeight = padThickness;
4519
- return /* @__PURE__ */ jsxs59(Fragment58, { children: [
4568
+ return /* @__PURE__ */ jsxs59(Fragment59, { children: [
4520
4569
  /* @__PURE__ */ jsx63(
4521
4570
  Cuboid39,
4522
4571
  {
@@ -4535,7 +4584,7 @@ var SOD323F = () => {
4535
4584
  ),
4536
4585
  /* @__PURE__ */ jsx63(Colorize30, { color: "#222", children: /* @__PURE__ */ jsxs59(Union17, { children: [
4537
4586
  /* @__PURE__ */ jsx63(Translate25, { z: straightHeight / 2, children: /* @__PURE__ */ jsx63(Cuboid39, { size: [fullWidth, bodyLength10, straightHeight] }) }),
4538
- /* @__PURE__ */ jsxs59(Hull22, { children: [
4587
+ /* @__PURE__ */ jsxs59(Hull21, { children: [
4539
4588
  /* @__PURE__ */ jsx63(Translate25, { z: straightHeight, children: /* @__PURE__ */ jsx63(Cuboid39, { size: [fullWidth, bodyLength10, 0.01] }) }),
4540
4589
  /* @__PURE__ */ jsx63(Translate25, { z: bodyHeight, children: /* @__PURE__ */ jsx63(
4541
4590
  Cuboid39,
@@ -4558,7 +4607,7 @@ var SOD323F = () => {
4558
4607
 
4559
4608
  // lib/sod-323FL.tsx
4560
4609
  import { Colorize as Colorize31, Cuboid as Cuboid40 } from "jscad-fiber";
4561
- import { Fragment as Fragment59, jsx as jsx64, jsxs as jsxs60 } from "react/jsx-runtime";
4610
+ import { Fragment as Fragment60, jsx as jsx64, jsxs as jsxs60 } from "react/jsx-runtime";
4562
4611
  var SOD323FL = () => {
4563
4612
  const fullWidth = 1.775;
4564
4613
  const bodyLength10 = 1.25;
@@ -4569,7 +4618,7 @@ var SOD323FL = () => {
4569
4618
  const leftPadCenterX = -fullWidth / 2 - padLength / 2 + 0.04;
4570
4619
  const rightPadCenterX = fullWidth / 2 + padLength / 2 - 0.04;
4571
4620
  const taperOffset = 0.2;
4572
- return /* @__PURE__ */ jsxs60(Fragment59, { children: [
4621
+ return /* @__PURE__ */ jsxs60(Fragment60, { children: [
4573
4622
  /* @__PURE__ */ jsx64(
4574
4623
  Cuboid40,
4575
4624
  {
@@ -4612,10 +4661,10 @@ var SOD323FL = () => {
4612
4661
 
4613
4662
  // lib/AxialCapacitor.tsx
4614
4663
  import { Colorize as Colorize32, Cylinder as Cylinder9, Rotate as Rotate11, Sphere as Sphere2, Translate as Translate27 } from "jscad-fiber";
4615
- import { Fragment as Fragment60, jsx as jsx65, jsxs as jsxs61 } from "react/jsx-runtime";
4664
+ import { Fragment as Fragment61, jsx as jsx65, jsxs as jsxs61 } from "react/jsx-runtime";
4616
4665
  var AxialCapacitor = ({ pitch = 10 }) => {
4617
4666
  const heightToCenterOfCapacitor = 0.5 + 4 / 2;
4618
- return /* @__PURE__ */ jsxs61(Fragment60, { children: [
4667
+ return /* @__PURE__ */ jsxs61(Fragment61, { children: [
4619
4668
  /* @__PURE__ */ jsx65(Cylinder9, { height: 4, radius: 0.5, center: [-pitch / 2, 0, 0.5] }),
4620
4669
  /* @__PURE__ */ jsx65(
4621
4670
  Sphere2,
@@ -4649,7 +4698,7 @@ var AxialCapacitor = ({ pitch = 10 }) => {
4649
4698
 
4650
4699
  // lib/stampboard.tsx
4651
4700
  import { Colorize as Colorize33, Cuboid as Cuboid41, Cylinder as Cylinder10, Subtract as Subtract6, Union as Union19 } from "jscad-fiber";
4652
- import { Fragment as Fragment61, jsx as jsx66, jsxs as jsxs62 } from "react/jsx-runtime";
4701
+ import { Fragment as Fragment62, jsx as jsx66, jsxs as jsxs62 } from "react/jsx-runtime";
4653
4702
  var StampBoard = ({
4654
4703
  bodyWidth = 21,
4655
4704
  boardThickness = 0.5,
@@ -4782,7 +4831,7 @@ var StampBoard = ({
4782
4831
  },
4783
4832
  index
4784
4833
  ));
4785
- return /* @__PURE__ */ jsxs62(Fragment61, { children: [
4834
+ return /* @__PURE__ */ jsxs62(Fragment62, { children: [
4786
4835
  boardBody,
4787
4836
  /* @__PURE__ */ jsx66(Colorize33, { color: "#FFD700", children: innerHoles ? /* @__PURE__ */ jsxs62(Subtract6, { children: [
4788
4837
  /* @__PURE__ */ jsx66(Union19, { children: pads.map((pad, index) => /* @__PURE__ */ jsx66(
@@ -4867,7 +4916,7 @@ var Screen = ({
4867
4916
  var Display = Screen;
4868
4917
 
4869
4918
  // lib/MountedPcbModule.tsx
4870
- import { Fragment as Fragment62, jsx as jsx68, jsxs as jsxs64 } from "react/jsx-runtime";
4919
+ import { Fragment as Fragment63, jsx as jsx68, jsxs as jsxs64 } from "react/jsx-runtime";
4871
4920
  var MountedPcbModule = ({
4872
4921
  numPins = 5,
4873
4922
  rows = 1,
@@ -5035,7 +5084,7 @@ var MountedPcbModule = ({
5035
5084
  },
5036
5085
  `female-pin-3d-${index}`
5037
5086
  ));
5038
- return /* @__PURE__ */ jsxs64(Fragment62, { children: [
5087
+ return /* @__PURE__ */ jsxs64(Fragment63, { children: [
5039
5088
  boardBody,
5040
5089
  platedHoles,
5041
5090
  !female && !nopin && headerPins,
@@ -5056,8 +5105,8 @@ var MountedPcbModule = ({
5056
5105
  };
5057
5106
 
5058
5107
  // lib/SOD723.tsx
5059
- import { Colorize as Colorize36, Cuboid as Cuboid44, Hull as Hull24, Translate as Translate29, Union as Union20 } from "jscad-fiber";
5060
- import { Fragment as Fragment63, jsx as jsx69, jsxs as jsxs65 } from "react/jsx-runtime";
5108
+ import { Colorize as Colorize36, Cuboid as Cuboid44, Hull as Hull23, Translate as Translate29, Union as Union20 } from "jscad-fiber";
5109
+ import { Fragment as Fragment64, jsx as jsx69, jsxs as jsxs65 } from "react/jsx-runtime";
5061
5110
  var SOD723 = () => {
5062
5111
  const fullWidth = 1.4;
5063
5112
  const bodyLength10 = 0.6;
@@ -5070,7 +5119,7 @@ var SOD723 = () => {
5070
5119
  const rightPadCenterX = bodyWidth / 2 - padLength / 2 + 0.15;
5071
5120
  const taperOffset = 0.2;
5072
5121
  const straightHeight = bodyHeight * 0.24;
5073
- return /* @__PURE__ */ jsxs65(Fragment63, { children: [
5122
+ return /* @__PURE__ */ jsxs65(Fragment64, { children: [
5074
5123
  /* @__PURE__ */ jsx69(
5075
5124
  Cuboid44,
5076
5125
  {
@@ -5089,7 +5138,7 @@ var SOD723 = () => {
5089
5138
  ),
5090
5139
  /* @__PURE__ */ jsx69(Colorize36, { color: "#222", children: /* @__PURE__ */ jsxs65(Union20, { children: [
5091
5140
  /* @__PURE__ */ jsx69(Translate29, { z: straightHeight / 2, children: /* @__PURE__ */ jsx69(Cuboid44, { size: [bodyWidth, bodyLength10, straightHeight] }) }),
5092
- /* @__PURE__ */ jsxs65(Hull24, { children: [
5141
+ /* @__PURE__ */ jsxs65(Hull23, { children: [
5093
5142
  /* @__PURE__ */ jsx69(Translate29, { z: straightHeight, children: /* @__PURE__ */ jsx69(Cuboid44, { size: [bodyWidth, bodyLength10, 0.01] }) }),
5094
5143
  /* @__PURE__ */ jsx69(Translate29, { z: bodyHeight, children: /* @__PURE__ */ jsx69(
5095
5144
  Cuboid44,
@@ -5120,7 +5169,7 @@ import {
5120
5169
  Subtract as Subtract9,
5121
5170
  Translate as Translate30
5122
5171
  } from "jscad-fiber";
5123
- import { Fragment as Fragment64, jsx as jsx70, jsxs as jsxs66 } from "react/jsx-runtime";
5172
+ import { Fragment as Fragment65, jsx as jsx70, jsxs as jsxs66 } from "react/jsx-runtime";
5124
5173
  var JSTZH1_5mm = ({
5125
5174
  numPins = 7,
5126
5175
  showPins = true,
@@ -5136,7 +5185,7 @@ var JSTZH1_5mm = ({
5136
5185
  const pinLength = 6;
5137
5186
  const bodyWidth = (numPins - 1) * pitch + 4;
5138
5187
  const startX = -((numPins - 1) * pitch) / 2;
5139
- return /* @__PURE__ */ jsxs66(Fragment64, { children: [
5188
+ return /* @__PURE__ */ jsxs66(Fragment65, { children: [
5140
5189
  /* @__PURE__ */ jsx70(Translate30, { offset: [0, 0, bodyHeight], children: /* @__PURE__ */ jsx70(Rotate12, { angles: [Math.PI, 0, 0], children: /* @__PURE__ */ jsx70(Colorize37, { color: bodyColor, children: /* @__PURE__ */ jsxs66(Subtract9, { children: [
5141
5190
  /* @__PURE__ */ jsx70(
5142
5191
  Cuboid45,
@@ -5280,7 +5329,7 @@ import {
5280
5329
  Subtract as Subtract10,
5281
5330
  Translate as Translate31
5282
5331
  } from "jscad-fiber";
5283
- import { Fragment as Fragment65, jsx as jsx71, jsxs as jsxs67 } from "react/jsx-runtime";
5332
+ import { Fragment as Fragment66, jsx as jsx71, jsxs as jsxs67 } from "react/jsx-runtime";
5284
5333
  var HOUSING_COLOR = "#303339";
5285
5334
  var HOUSING_SHADOW = "#1f2227";
5286
5335
  var ACTUATOR_COLOR = "#eee8d8";
@@ -5367,7 +5416,7 @@ var FPC = ({
5367
5416
  const clipCapX = bodyWidth / 2 - 0.23;
5368
5417
  const sideBossX = bodyWidth / 2 - 0.32;
5369
5418
  const sideBossWidth = 0.68;
5370
- return /* @__PURE__ */ jsxs67(Fragment65, { children: [
5419
+ return /* @__PURE__ */ jsxs67(Fragment66, { children: [
5371
5420
  [-1, 1].map((direction) => /* @__PURE__ */ jsx71(
5372
5421
  Cuboid46,
5373
5422
  {
@@ -5546,8 +5595,8 @@ var FPC = ({
5546
5595
  };
5547
5596
 
5548
5597
  // lib/SmdPinHeader.tsx
5549
- import { Colorize as Colorize39, Cuboid as Cuboid47, Hull as Hull25, Translate as Translate32 } from "jscad-fiber";
5550
- import { Fragment as Fragment66, jsx as jsx72, jsxs as jsxs68 } from "react/jsx-runtime";
5598
+ import { Colorize as Colorize39, Cuboid as Cuboid47, Hull as Hull24, Translate as Translate32 } from "jscad-fiber";
5599
+ import { Fragment as Fragment67, jsx as jsx72, jsxs as jsxs68 } from "react/jsx-runtime";
5551
5600
  var SmdPinHeader = ({
5552
5601
  numberOfPins,
5553
5602
  pitch = 2.54,
@@ -5562,7 +5611,7 @@ var SmdPinHeader = ({
5562
5611
  const bodyTop = standoffHeight + bodyHeight;
5563
5612
  const tailLength = tailSpan / 2;
5564
5613
  const tipChamferHeight = pinThickness * 0.35;
5565
- return /* @__PURE__ */ jsx72(Fragment66, { children: Array.from({ length: numberOfPins }, (_, index) => {
5614
+ return /* @__PURE__ */ jsx72(Fragment67, { children: Array.from({ length: numberOfPins }, (_, index) => {
5566
5615
  const x = xStart + index * pitch;
5567
5616
  const tailDirection = index % 2 === 0 ? 1 : -1;
5568
5617
  const postBodyLength = matingPinLength - tipChamferHeight;
@@ -5598,7 +5647,7 @@ var SmdPinHeader = ({
5598
5647
  center: [0, 0, bodyTop + postBodyLength / 2]
5599
5648
  }
5600
5649
  ),
5601
- /* @__PURE__ */ jsxs68(Hull25, { children: [
5650
+ /* @__PURE__ */ jsxs68(Hull24, { children: [
5602
5651
  /* @__PURE__ */ jsx72(
5603
5652
  Cuboid47,
5604
5653
  {
@@ -5622,9 +5671,88 @@ var SmdPinHeader = ({
5622
5671
  // lib/Footprinter3d.tsx
5623
5672
  import { mm } from "@tscircuit/mm";
5624
5673
 
5674
+ // lib/utils/getPlatedHoleCenters.ts
5675
+ import { fp as fp3 } from "@tscircuit/footprinter";
5676
+ var getPlatedHoleCenters = (footprint) => {
5677
+ const elements = fp3.string(footprint).circuitJson();
5678
+ return elements.filter(
5679
+ (element) => element.type === "pcb_plated_hole" && Number.isFinite(element.x) && Number.isFinite(element.y)
5680
+ ).map((element) => ({
5681
+ x: element.x,
5682
+ y: element.y,
5683
+ pin: element.port_hints?.[0]
5684
+ }));
5685
+ };
5686
+
5687
+ // lib/utils/getSmtPadRects.ts
5688
+ import { fp as fp4 } from "@tscircuit/footprinter";
5689
+ var getSmtPadRects = (footprint) => {
5690
+ const elements = fp4.string(footprint).circuitJson();
5691
+ return elements.filter(
5692
+ (element) => element.type === "pcb_smtpad" && element.shape === "rect" && Number.isFinite(element.x) && Number.isFinite(element.y)
5693
+ ).map((element) => ({
5694
+ x: element.x,
5695
+ y: element.y,
5696
+ width: element.width ?? 0.4,
5697
+ height: element.height ?? 0.4,
5698
+ pin: element.port_hints?.[0]
5699
+ }));
5700
+ };
5701
+
5702
+ // lib/GullWingBody.tsx
5703
+ import { Fragment as Fragment68, jsx as jsx73, jsxs as jsxs69 } from "react/jsx-runtime";
5704
+ var GullWingBody = ({
5705
+ bodyWidth,
5706
+ bodyLength: bodyLength10,
5707
+ bodyHeight = 1,
5708
+ pads,
5709
+ leadThickness = 0.15,
5710
+ leadHeightRatio = 0.75
5711
+ }) => {
5712
+ const centerX = pads.reduce((sum, pad) => sum + pad.x, 0) / (pads.length || 1);
5713
+ const centerY = pads.reduce((sum, pad) => sum + pad.y, 0) / (pads.length || 1);
5714
+ const leadHeight = bodyHeight * leadHeightRatio;
5715
+ return /* @__PURE__ */ jsxs69(Fragment68, { children: [
5716
+ /* @__PURE__ */ jsx73(
5717
+ ChipBody,
5718
+ {
5719
+ center: { x: centerX, y: centerY, z: 0 },
5720
+ width: bodyWidth,
5721
+ length: bodyLength10,
5722
+ height: bodyHeight
5723
+ }
5724
+ ),
5725
+ pads.map((pad) => {
5726
+ const padWidth = pad.width ?? 0.4;
5727
+ const padLength = pad.height ?? 0.4;
5728
+ const side = pad.x >= centerX ? 1 : -1;
5729
+ const outerX = pad.x + side * padWidth / 2;
5730
+ const run = Math.max(Math.abs(outerX - centerX) - bodyWidth / 2, 0.1);
5731
+ const overlap = Math.min(0.15, bodyWidth * 0.15);
5732
+ return /* @__PURE__ */ jsx73(
5733
+ SmdChipLead,
5734
+ {
5735
+ rotation: side > 0 ? Math.PI : 0,
5736
+ position: {
5737
+ x: outerX,
5738
+ y: pad.y,
5739
+ z: leadThickness / 2
5740
+ },
5741
+ width: padLength,
5742
+ thickness: leadThickness,
5743
+ padContactLength: padWidth * 0.6,
5744
+ bodyDistance: run + overlap,
5745
+ height: leadHeight
5746
+ },
5747
+ `lead-${pad.x}-${pad.y}`
5748
+ );
5749
+ })
5750
+ ] });
5751
+ };
5752
+
5625
5753
  // lib/ParametricChip.tsx
5626
5754
  import { Cuboid as Cuboid48 } from "jscad-fiber";
5627
- import { Fragment as Fragment67, jsx as jsx73, jsxs as jsxs69 } from "react/jsx-runtime";
5755
+ import { Fragment as Fragment69, jsx as jsx74, jsxs as jsxs70 } from "react/jsx-runtime";
5628
5756
  var ParametricChip = ({
5629
5757
  padPitch,
5630
5758
  padHeight,
@@ -5635,8 +5763,8 @@ var ParametricChip = ({
5635
5763
  const height10 = width10;
5636
5764
  const terminatorWidth9 = fullLength10 * 0.2;
5637
5765
  const bodyLength10 = fullLength10 - terminatorWidth9 * 2;
5638
- return /* @__PURE__ */ jsxs69(Fragment67, { children: [
5639
- /* @__PURE__ */ jsx73(
5766
+ return /* @__PURE__ */ jsxs70(Fragment69, { children: [
5767
+ /* @__PURE__ */ jsx74(
5640
5768
  Cuboid48,
5641
5769
  {
5642
5770
  size: [bodyLength10, width10, height10],
@@ -5644,7 +5772,7 @@ var ParametricChip = ({
5644
5772
  color
5645
5773
  }
5646
5774
  ),
5647
- /* @__PURE__ */ jsx73(
5775
+ /* @__PURE__ */ jsx74(
5648
5776
  Cuboid48,
5649
5777
  {
5650
5778
  size: [terminatorWidth9, height10, width10],
@@ -5652,7 +5780,7 @@ var ParametricChip = ({
5652
5780
  color: "#ccc"
5653
5781
  }
5654
5782
  ),
5655
- /* @__PURE__ */ jsx73(
5783
+ /* @__PURE__ */ jsx74(
5656
5784
  Cuboid48,
5657
5785
  {
5658
5786
  size: [terminatorWidth9, height10, width10],
@@ -5672,7 +5800,7 @@ import {
5672
5800
  Subtract as Subtract11,
5673
5801
  Translate as Translate33
5674
5802
  } from "jscad-fiber";
5675
- import { Fragment as Fragment68, jsx as jsx74, jsxs as jsxs70 } from "react/jsx-runtime";
5803
+ import { Fragment as Fragment70, jsx as jsx75, jsxs as jsxs71 } from "react/jsx-runtime";
5676
5804
  var Led5050 = ({
5677
5805
  color = "#ffff00",
5678
5806
  bodyColor = "#ffffff",
@@ -5693,9 +5821,9 @@ var Led5050 = ({
5693
5821
  const cornerCutDepth = 0.3;
5694
5822
  const leadYPositions = [-1.7, 0, 1.7];
5695
5823
  const leadSides = [-1, 1];
5696
- return /* @__PURE__ */ jsxs70(Fragment68, { children: [
5824
+ return /* @__PURE__ */ jsxs71(Fragment70, { children: [
5697
5825
  leadYPositions.flatMap(
5698
- (y) => leadSides.map((side) => /* @__PURE__ */ jsx74(
5826
+ (y) => leadSides.map((side) => /* @__PURE__ */ jsx75(
5699
5827
  Cuboid49,
5700
5828
  {
5701
5829
  color: leadColor,
@@ -5705,8 +5833,8 @@ var Led5050 = ({
5705
5833
  `${side}-${y}`
5706
5834
  ))
5707
5835
  ),
5708
- /* @__PURE__ */ jsx74(Colorize40, { color: bodyColor, children: /* @__PURE__ */ jsxs70(Subtract11, { children: [
5709
- /* @__PURE__ */ jsx74(
5836
+ /* @__PURE__ */ jsx75(Colorize40, { color: bodyColor, children: /* @__PURE__ */ jsxs71(Subtract11, { children: [
5837
+ /* @__PURE__ */ jsx75(
5710
5838
  ChipBody,
5711
5839
  {
5712
5840
  width: bodySize,
@@ -5720,7 +5848,7 @@ var Led5050 = ({
5720
5848
  includeNotch: false
5721
5849
  }
5722
5850
  ),
5723
- /* @__PURE__ */ jsx74(
5851
+ /* @__PURE__ */ jsx75(
5724
5852
  Cylinder14,
5725
5853
  {
5726
5854
  radius: lensRadius,
@@ -5728,7 +5856,7 @@ var Led5050 = ({
5728
5856
  center: [0, 0, bodyTop - lensHeight / 2]
5729
5857
  }
5730
5858
  ),
5731
- /* @__PURE__ */ jsx74(
5859
+ /* @__PURE__ */ jsx75(
5732
5860
  Translate33,
5733
5861
  {
5734
5862
  offset: [
@@ -5736,11 +5864,11 @@ var Led5050 = ({
5736
5864
  bodySize / 2,
5737
5865
  bodyTop - cornerCutDepth / 2 + 5e-3
5738
5866
  ],
5739
- children: /* @__PURE__ */ jsx74(Rotate14, { rotation: [0, 0, Math.PI / 4], children: /* @__PURE__ */ jsx74(Cuboid49, { size: [0.9, 0.9, cornerCutDepth + 0.01] }) })
5867
+ children: /* @__PURE__ */ jsx75(Rotate14, { rotation: [0, 0, Math.PI / 4], children: /* @__PURE__ */ jsx75(Cuboid49, { size: [0.9, 0.9, cornerCutDepth + 0.01] }) })
5740
5868
  }
5741
5869
  )
5742
5870
  ] }) }),
5743
- /* @__PURE__ */ jsx74(
5871
+ /* @__PURE__ */ jsx75(
5744
5872
  Cylinder14,
5745
5873
  {
5746
5874
  color,
@@ -5752,17 +5880,70 @@ var Led5050 = ({
5752
5880
  ] });
5753
5881
  };
5754
5882
 
5883
+ // lib/Led2835.tsx
5884
+ import { Colorize as Colorize41, Cuboid as Cuboid50 } from "jscad-fiber";
5885
+ import { Fragment as Fragment71, jsx as jsx76, jsxs as jsxs72 } from "react/jsx-runtime";
5886
+ var Led2835 = ({
5887
+ bodyWidth = 3.5,
5888
+ bodyLength: bodyLength10 = 2.8,
5889
+ bodyHeight = 0.8,
5890
+ color = "#ffe08a",
5891
+ bodyColor = "#f2f2f2",
5892
+ padColor = "#cccccc",
5893
+ pad1X = -0.9,
5894
+ pad1Width = 2.2,
5895
+ pad2X = 1.375,
5896
+ pad2Width = 1.25,
5897
+ padLength = 2.2
5898
+ } = {}) => {
5899
+ const padThickness = 0.1;
5900
+ const lensHeight = 0.15;
5901
+ const bodyCenterX = (pad1X + pad2X) / 2;
5902
+ const lensWidth = bodyWidth * 0.55;
5903
+ const lensLength = bodyLength10 * 0.55;
5904
+ return /* @__PURE__ */ jsxs72(Fragment71, { children: [
5905
+ [
5906
+ { x: pad1X, w: pad1Width, key: "pad-1" },
5907
+ { x: pad2X, w: pad2Width, key: "pad-2" }
5908
+ ].map(({ x, w, key }) => /* @__PURE__ */ jsx76(Colorize41, { color: padColor, children: /* @__PURE__ */ jsx76(
5909
+ Cuboid50,
5910
+ {
5911
+ size: [w, padLength, padThickness],
5912
+ center: [x, 0, padThickness / 2]
5913
+ }
5914
+ ) }, key)),
5915
+ /* @__PURE__ */ jsx76(Colorize41, { color: bodyColor, children: /* @__PURE__ */ jsx76(
5916
+ Cuboid50,
5917
+ {
5918
+ size: [bodyWidth, bodyLength10, bodyHeight],
5919
+ center: [bodyCenterX, 0, padThickness + bodyHeight / 2]
5920
+ }
5921
+ ) }),
5922
+ /* @__PURE__ */ jsx76(Colorize41, { color, children: /* @__PURE__ */ jsx76(
5923
+ Cuboid50,
5924
+ {
5925
+ size: [lensWidth, lensLength, lensHeight],
5926
+ center: [
5927
+ bodyCenterX,
5928
+ 0,
5929
+ padThickness + bodyHeight + lensHeight / 2 - 0.05
5930
+ ]
5931
+ }
5932
+ ) })
5933
+ ] });
5934
+ };
5935
+
5755
5936
  // lib/RJ45.tsx
5756
5937
  import {
5757
- Colorize as Colorize41,
5758
- Cuboid as Cuboid50,
5938
+ Colorize as Colorize42,
5939
+ Cuboid as Cuboid51,
5759
5940
  Cylinder as Cylinder15,
5760
5941
  Rotate as Rotate15,
5761
5942
  RoundedCuboid as RoundedCuboid4,
5762
5943
  Subtract as Subtract12,
5763
5944
  Translate as Translate34
5764
5945
  } from "jscad-fiber";
5765
- import { Fragment as Fragment69, jsx as jsx75, jsxs as jsxs71 } from "react/jsx-runtime";
5946
+ import { Fragment as Fragment72, jsx as jsx77, jsxs as jsxs73 } from "react/jsx-runtime";
5766
5947
  var range2 = (length) => Array.from({ length }, (_, index) => index);
5767
5948
  var RJ45 = ({
5768
5949
  bodyWidth = 16.26,
@@ -5820,18 +6001,18 @@ var RJ45 = ({
5820
6001
  const contactY = frontY - frontDirection * Math.max(cavityDepth * 0.48, 1.2);
5821
6002
  const contactZ = openingCenterZ + openingHeight * 0.18;
5822
6003
  const frontLipY = frontY + frontDirection * shellThickness * 0.2;
5823
- return /* @__PURE__ */ jsxs71(Fragment69, { children: [
5824
- /* @__PURE__ */ jsxs71(Colorize41, { color: shellColor, children: [
5825
- /* @__PURE__ */ jsxs71(Subtract12, { children: [
5826
- /* @__PURE__ */ jsx75(
5827
- Cuboid50,
6004
+ return /* @__PURE__ */ jsxs73(Fragment72, { children: [
6005
+ /* @__PURE__ */ jsxs73(Colorize42, { color: shellColor, children: [
6006
+ /* @__PURE__ */ jsxs73(Subtract12, { children: [
6007
+ /* @__PURE__ */ jsx77(
6008
+ Cuboid51,
5828
6009
  {
5829
6010
  center: [0, bodyCenterY, bodyHeight / 2],
5830
6011
  size: [bodyWidth, bodyDepth, bodyHeight]
5831
6012
  }
5832
6013
  ),
5833
- /* @__PURE__ */ jsx75(
5834
- Cuboid50,
6014
+ /* @__PURE__ */ jsx77(
6015
+ Cuboid51,
5835
6016
  {
5836
6017
  center: [0, cavityCenterY, openingCenterZ],
5837
6018
  size: [
@@ -5842,15 +6023,15 @@ var RJ45 = ({
5842
6023
  }
5843
6024
  )
5844
6025
  ] }),
5845
- /* @__PURE__ */ jsx75(
5846
- Cuboid50,
6026
+ /* @__PURE__ */ jsx77(
6027
+ Cuboid51,
5847
6028
  {
5848
6029
  center: [0, frontLipY, 0.72],
5849
6030
  size: [openingWidth + 0.5, shellThickness * 1.25, 1.05]
5850
6031
  }
5851
6032
  ),
5852
- [-1, 1].map((direction) => /* @__PURE__ */ jsx75(
5853
- Cuboid50,
6033
+ [-1, 1].map((direction) => /* @__PURE__ */ jsx77(
6034
+ Cuboid51,
5854
6035
  {
5855
6036
  center: [direction * shieldPinX, shieldPinY, 0.25],
5856
6037
  size: [
@@ -5861,8 +6042,8 @@ var RJ45 = ({
5861
6042
  },
5862
6043
  `shield-tab:${direction}`
5863
6044
  )),
5864
- [-1, 1].map((direction) => /* @__PURE__ */ jsx75(
5865
- Cuboid50,
6045
+ [-1, 1].map((direction) => /* @__PURE__ */ jsx77(
6046
+ Cuboid51,
5866
6047
  {
5867
6048
  center: [
5868
6049
  direction * bodyWidth * 0.24,
@@ -5874,9 +6055,9 @@ var RJ45 = ({
5874
6055
  `top-seam:${direction}`
5875
6056
  ))
5876
6057
  ] }),
5877
- /* @__PURE__ */ jsxs71(Colorize41, { color: housingColor, children: [
5878
- /* @__PURE__ */ jsxs71(Subtract12, { children: [
5879
- /* @__PURE__ */ jsx75(
6058
+ /* @__PURE__ */ jsxs73(Colorize42, { color: housingColor, children: [
6059
+ /* @__PURE__ */ jsxs73(Subtract12, { children: [
6060
+ /* @__PURE__ */ jsx77(
5880
6061
  RoundedCuboid4,
5881
6062
  {
5882
6063
  center: [0, cavityCenterY, openingCenterZ],
@@ -5888,8 +6069,8 @@ var RJ45 = ({
5888
6069
  roundRadius: 0.22
5889
6070
  }
5890
6071
  ),
5891
- /* @__PURE__ */ jsx75(
5892
- Cuboid50,
6072
+ /* @__PURE__ */ jsx77(
6073
+ Cuboid51,
5893
6074
  {
5894
6075
  center: [
5895
6076
  0,
@@ -5904,14 +6085,14 @@ var RJ45 = ({
5904
6085
  }
5905
6086
  )
5906
6087
  ] }),
5907
- /* @__PURE__ */ jsx75(
5908
- Cuboid50,
6088
+ /* @__PURE__ */ jsx77(
6089
+ Cuboid51,
5909
6090
  {
5910
6091
  center: [0, backWallY, openingCenterZ],
5911
6092
  size: [openingWidth - 1.15, shellThickness, openingHeight - 1.25]
5912
6093
  }
5913
6094
  ),
5914
- /* @__PURE__ */ jsx75(
6095
+ /* @__PURE__ */ jsx77(
5915
6096
  RoundedCuboid4,
5916
6097
  {
5917
6098
  center: [0, frontY - frontDirection * cavityDepth * 0.28, 1.55],
@@ -5919,7 +6100,7 @@ var RJ45 = ({
5919
6100
  roundRadius: 0.16
5920
6101
  }
5921
6102
  ),
5922
- [-1, 1].map((direction) => /* @__PURE__ */ jsx75(
6103
+ [-1, 1].map((direction) => /* @__PURE__ */ jsx77(
5923
6104
  Cylinder15,
5924
6105
  {
5925
6106
  center: [direction * locatorHoleX, locatorHoleY, -0.25],
@@ -5929,8 +6110,8 @@ var RJ45 = ({
5929
6110
  `locator:${direction}`
5930
6111
  ))
5931
6112
  ] }),
5932
- /* @__PURE__ */ jsxs71(Colorize41, { color: contactColor, children: [
5933
- signalPinPositions.map(({ x, y }, index) => /* @__PURE__ */ jsx75(
6113
+ /* @__PURE__ */ jsxs73(Colorize42, { color: contactColor, children: [
6114
+ signalPinPositions.map(({ x, y }, index) => /* @__PURE__ */ jsx77(
5934
6115
  Cylinder15,
5935
6116
  {
5936
6117
  center: [x, y, 0.15],
@@ -5939,7 +6120,7 @@ var RJ45 = ({
5939
6120
  },
5940
6121
  `signal-lead:${index}`
5941
6122
  )),
5942
- range2(8).map((index) => /* @__PURE__ */ jsx75(
6123
+ range2(8).map((index) => /* @__PURE__ */ jsx77(
5943
6124
  Translate34,
5944
6125
  {
5945
6126
  offset: [
@@ -5947,7 +6128,7 @@ var RJ45 = ({
5947
6128
  contactY,
5948
6129
  contactZ + (index % 2 === 0 ? 0.03 : -0.03)
5949
6130
  ],
5950
- children: /* @__PURE__ */ jsx75(Rotate15, { rotation: [frontDirection * 0.2, 0, 0], children: /* @__PURE__ */ jsx75(
6131
+ children: /* @__PURE__ */ jsx77(Rotate15, { rotation: [frontDirection * 0.2, 0, 0], children: /* @__PURE__ */ jsx77(
5951
6132
  RoundedCuboid4,
5952
6133
  {
5953
6134
  size: [Math.max(contactPitch * 0.28, 0.28), 3.25, 0.16],
@@ -5957,7 +6138,7 @@ var RJ45 = ({
5957
6138
  },
5958
6139
  `socket-contact:${index}`
5959
6140
  )),
5960
- ledPins && ledPinPositions.map((x, index) => /* @__PURE__ */ jsx75(
6141
+ ledPins && ledPinPositions.map((x, index) => /* @__PURE__ */ jsx77(
5961
6142
  Cylinder15,
5962
6143
  {
5963
6144
  center: [x, ledPinY, 0.15],
@@ -5967,8 +6148,8 @@ var RJ45 = ({
5967
6148
  `led-lead:${index}`
5968
6149
  ))
5969
6150
  ] }),
5970
- ledPins && /* @__PURE__ */ jsxs71(Fragment69, { children: [
5971
- /* @__PURE__ */ jsx75(
6151
+ ledPins && /* @__PURE__ */ jsxs73(Fragment72, { children: [
6152
+ /* @__PURE__ */ jsx77(
5972
6153
  RoundedCuboid4,
5973
6154
  {
5974
6155
  color: "#73b744",
@@ -5981,7 +6162,7 @@ var RJ45 = ({
5981
6162
  roundRadius: 0.18
5982
6163
  }
5983
6164
  ),
5984
- /* @__PURE__ */ jsx75(
6165
+ /* @__PURE__ */ jsx77(
5985
6166
  RoundedCuboid4,
5986
6167
  {
5987
6168
  color: "#e0aa35",
@@ -5998,8 +6179,311 @@ var RJ45 = ({
5998
6179
  ] });
5999
6180
  };
6000
6181
 
6182
+ // lib/DPAK.tsx
6183
+ import { Colorize as Colorize43, Cuboid as Cuboid52, Hull as Hull25 } from "jscad-fiber";
6184
+ import { Fragment as Fragment73, jsx as jsx78, jsxs as jsxs74 } from "react/jsx-runtime";
6185
+ var DPAK = ({
6186
+ bodyWidth = 6.1,
6187
+ bodyLength: bodyLength10 = 6.5,
6188
+ bodyHeight = 2.3,
6189
+ tabWidth = 6.2,
6190
+ tabLength = 5.8,
6191
+ span = 6.85,
6192
+ pitch = 2.29,
6193
+ leadWidth = 0.9,
6194
+ leadContactLength = 1.5,
6195
+ color = "#222",
6196
+ tabColor = "#cccccc",
6197
+ leadColor = "#cccccc"
6198
+ }) => {
6199
+ const tabThickness = 0.5;
6200
+ const tabCenterX = span / 2;
6201
+ const leadPadX = -span / 2;
6202
+ const bodyCenterX = tabCenterX + (tabWidth - bodyWidth) / 2;
6203
+ const bodyFrontX = bodyCenterX - bodyWidth / 2;
6204
+ const leadZ = tabThickness / 2;
6205
+ const leadThickness = 0.4;
6206
+ return /* @__PURE__ */ jsxs74(Fragment73, { children: [
6207
+ /* @__PURE__ */ jsx78(Colorize43, { color: tabColor, children: /* @__PURE__ */ jsx78(
6208
+ Cuboid52,
6209
+ {
6210
+ size: [tabWidth, tabLength, tabThickness],
6211
+ center: [tabCenterX, 0, tabThickness / 2]
6212
+ }
6213
+ ) }),
6214
+ /* @__PURE__ */ jsx78(Colorize43, { color, children: /* @__PURE__ */ jsx78(
6215
+ Cuboid52,
6216
+ {
6217
+ size: [bodyWidth, bodyLength10, bodyHeight],
6218
+ center: [bodyCenterX, 0, tabThickness + bodyHeight / 2]
6219
+ }
6220
+ ) }),
6221
+ [-1, 1].map((side) => {
6222
+ return /* @__PURE__ */ jsxs74(Colorize43, { color: leadColor, children: [
6223
+ /* @__PURE__ */ jsx78(
6224
+ Cuboid52,
6225
+ {
6226
+ size: [leadContactLength, leadWidth, leadThickness],
6227
+ center: [
6228
+ leadPadX + leadContactLength / 2,
6229
+ side * pitch,
6230
+ leadThickness / 2
6231
+ ]
6232
+ }
6233
+ ),
6234
+ /* @__PURE__ */ jsxs74(Hull25, { children: [
6235
+ /* @__PURE__ */ jsx78(
6236
+ Cuboid52,
6237
+ {
6238
+ size: [0.1, leadWidth, leadThickness],
6239
+ center: [
6240
+ leadPadX + leadContactLength,
6241
+ side * pitch,
6242
+ leadThickness / 2
6243
+ ]
6244
+ }
6245
+ ),
6246
+ /* @__PURE__ */ jsx78(
6247
+ Cuboid52,
6248
+ {
6249
+ size: [0.1, leadWidth, leadThickness],
6250
+ center: [bodyFrontX, side * pitch, leadZ + tabThickness / 2]
6251
+ }
6252
+ )
6253
+ ] })
6254
+ ] }, `lead-${side}`);
6255
+ })
6256
+ ] });
6257
+ };
6258
+
6259
+ // lib/ElectrolyticCapacitor.tsx
6260
+ import {
6261
+ Colorize as Colorize44,
6262
+ Cuboid as Cuboid53,
6263
+ Cylinder as Cylinder16,
6264
+ RoundedCylinder as RoundedCylinder5,
6265
+ Subtract as Subtract13
6266
+ } from "jscad-fiber";
6267
+ import { Fragment as Fragment74, jsx as jsx79, jsxs as jsxs75 } from "react/jsx-runtime";
6268
+ var ElectrolyticCapacitor = ({
6269
+ diameter = 6.3,
6270
+ heightToDiameterRatio = 1.4,
6271
+ height: height10 = diameter * heightToDiameterRatio,
6272
+ leadPitch = 2.5,
6273
+ leadDiameter = 0.6,
6274
+ leadLength = 3,
6275
+ sleeveColor = "#1b2a6b",
6276
+ baseColor = "#1a1a1a"
6277
+ }) => {
6278
+ const radius = diameter / 2;
6279
+ const baseHeight = Math.min(1, diameter * 0.12);
6280
+ const canHeight = Math.max(height10 - baseHeight, 0.1);
6281
+ const canBottom = baseHeight;
6282
+ const canTop = canBottom + canHeight;
6283
+ const grooveWidth = Math.max(diameter * 0.06, 0.2);
6284
+ const grooveDepth = 0.3;
6285
+ return /* @__PURE__ */ jsxs75(Fragment74, { children: [
6286
+ /* @__PURE__ */ jsx79(Colorize44, { color: baseColor, children: /* @__PURE__ */ jsx79(
6287
+ Cylinder16,
6288
+ {
6289
+ radius: radius - 0.05,
6290
+ height: baseHeight,
6291
+ center: [0, 0, baseHeight / 2]
6292
+ }
6293
+ ) }),
6294
+ /* @__PURE__ */ jsx79(Colorize44, { color: sleeveColor, children: /* @__PURE__ */ jsxs75(Subtract13, { children: [
6295
+ /* @__PURE__ */ jsx79(
6296
+ RoundedCylinder5,
6297
+ {
6298
+ radius,
6299
+ height: canHeight,
6300
+ roundRadius: Math.min(0.3, radius * 0.15),
6301
+ center: [0, 0, canBottom + canHeight / 2]
6302
+ }
6303
+ ),
6304
+ /* @__PURE__ */ jsx79(
6305
+ Cuboid53,
6306
+ {
6307
+ size: [diameter, grooveWidth, grooveDepth * 2],
6308
+ center: [0, 0, canTop]
6309
+ }
6310
+ ),
6311
+ /* @__PURE__ */ jsx79(
6312
+ Cuboid53,
6313
+ {
6314
+ size: [grooveWidth, diameter, grooveDepth * 2],
6315
+ center: [0, 0, canTop]
6316
+ }
6317
+ )
6318
+ ] }) }),
6319
+ [-1, 1].map((side) => /* @__PURE__ */ jsx79(Colorize44, { color: "#c0c0c0", children: /* @__PURE__ */ jsx79(
6320
+ Cylinder16,
6321
+ {
6322
+ radius: leadDiameter / 2,
6323
+ height: leadLength + baseHeight,
6324
+ center: [side * leadPitch / 2, 0, (baseHeight - leadLength) / 2]
6325
+ }
6326
+ ) }, `lead-${side}`))
6327
+ ] });
6328
+ };
6329
+
6330
+ // lib/Potentiometer.tsx
6331
+ import { Colorize as Colorize45, Cuboid as Cuboid54, Cylinder as Cylinder17, Subtract as Subtract14 } from "jscad-fiber";
6332
+ import { Fragment as Fragment75, jsx as jsx80, jsxs as jsxs76 } from "react/jsx-runtime";
6333
+ var Potentiometer = ({
6334
+ bodyWidth = 5.35,
6335
+ bodyLength: bodyLength10 = 14,
6336
+ bodyHeight = 4,
6337
+ bodyCenterX = bodyWidth / 2,
6338
+ adjusterDiameter = Math.min(bodyWidth, bodyLength10) * 0.55,
6339
+ shaftDiameter = 0,
6340
+ shaftHeight = 0,
6341
+ leads = [],
6342
+ leadDiameter = 0.6,
6343
+ leadLength = 3,
6344
+ bodyColor = "#1f4fa3",
6345
+ adjusterColor = "#d8d8d8"
6346
+ }) => {
6347
+ const adjusterHeight = 0.8;
6348
+ const adjusterZ = bodyHeight + adjusterHeight / 2;
6349
+ const slotWidth = Math.max(adjusterDiameter * 0.16, 0.3);
6350
+ return /* @__PURE__ */ jsxs76(Fragment75, { children: [
6351
+ /* @__PURE__ */ jsx80(Colorize45, { color: bodyColor, children: /* @__PURE__ */ jsx80(
6352
+ Cuboid54,
6353
+ {
6354
+ size: [bodyWidth, bodyLength10, bodyHeight],
6355
+ center: [bodyCenterX, 0, bodyHeight / 2]
6356
+ }
6357
+ ) }),
6358
+ /* @__PURE__ */ jsx80(Colorize45, { color: adjusterColor, children: /* @__PURE__ */ jsxs76(Subtract14, { children: [
6359
+ /* @__PURE__ */ jsx80(
6360
+ Cylinder17,
6361
+ {
6362
+ radius: adjusterDiameter / 2,
6363
+ height: adjusterHeight,
6364
+ center: [bodyCenterX, 0, adjusterZ]
6365
+ }
6366
+ ),
6367
+ /* @__PURE__ */ jsx80(
6368
+ Cuboid54,
6369
+ {
6370
+ size: [adjusterDiameter, slotWidth, adjusterHeight * 0.6],
6371
+ center: [bodyCenterX, 0, adjusterZ + adjusterHeight / 2]
6372
+ }
6373
+ )
6374
+ ] }) }),
6375
+ shaftHeight > 0 && shaftDiameter > 0 ? /* @__PURE__ */ jsx80(Colorize45, { color: adjusterColor, children: /* @__PURE__ */ jsx80(
6376
+ Cylinder17,
6377
+ {
6378
+ radius: shaftDiameter / 2,
6379
+ height: shaftHeight,
6380
+ center: [bodyCenterX, 0, bodyHeight + shaftHeight / 2]
6381
+ }
6382
+ ) }) : null,
6383
+ leads.map((lead) => /* @__PURE__ */ jsx80(Colorize45, { color: "#c0c0c0", children: /* @__PURE__ */ jsx80(
6384
+ Cylinder17,
6385
+ {
6386
+ radius: leadDiameter / 2,
6387
+ height: bodyHeight / 2 + leadLength,
6388
+ center: [lead.x, lead.y, (bodyHeight / 2 - leadLength) / 2]
6389
+ }
6390
+ ) }, `lead-${lead.x}-${lead.y}`))
6391
+ ] });
6392
+ };
6393
+
6394
+ // lib/SmdPushButton.tsx
6395
+ import { Colorize as Colorize46, Cuboid as Cuboid55, Cylinder as Cylinder18 } from "jscad-fiber";
6396
+ import { Fragment as Fragment76, jsx as jsx81, jsxs as jsxs77 } from "react/jsx-runtime";
6397
+ var SmdPushButton = ({
6398
+ bodyWidth = 2.9,
6399
+ bodyLength: bodyLength10 = 3,
6400
+ bodyHeight = 1.4,
6401
+ actuatorDiameter = 1.5,
6402
+ actuatorHeight = 0.5,
6403
+ padSpanX = 4.2,
6404
+ padSpanY = 2.15,
6405
+ padWidth = 1.05,
6406
+ padLength = 0.7,
6407
+ bodyColor = "#2b2b2b",
6408
+ actuatorColor = "#d9d9d9",
6409
+ leadColor = "#cccccc"
6410
+ }) => {
6411
+ const leadThickness = 0.15;
6412
+ return /* @__PURE__ */ jsxs77(Fragment76, { children: [
6413
+ /* @__PURE__ */ jsx81(Colorize46, { color: bodyColor, children: /* @__PURE__ */ jsx81(
6414
+ Cuboid55,
6415
+ {
6416
+ size: [bodyWidth, bodyLength10, bodyHeight],
6417
+ center: [0, 0, bodyHeight / 2]
6418
+ }
6419
+ ) }),
6420
+ /* @__PURE__ */ jsx81(Colorize46, { color: actuatorColor, children: /* @__PURE__ */ jsx81(
6421
+ Cylinder18,
6422
+ {
6423
+ radius: actuatorDiameter / 2,
6424
+ height: actuatorHeight,
6425
+ center: [0, 0, bodyHeight + actuatorHeight / 2]
6426
+ }
6427
+ ) }),
6428
+ [-1, 1].flatMap(
6429
+ (sx) => [-1, 1].map((sy) => /* @__PURE__ */ jsx81(Colorize46, { color: leadColor, children: /* @__PURE__ */ jsx81(
6430
+ Cuboid55,
6431
+ {
6432
+ size: [padWidth, padLength, leadThickness],
6433
+ center: [
6434
+ sx * padSpanX / 2,
6435
+ sy * padSpanY / 2,
6436
+ leadThickness / 2
6437
+ ]
6438
+ }
6439
+ ) }, `lead-${sx}-${sy}`))
6440
+ )
6441
+ ] });
6442
+ };
6443
+
6444
+ // lib/SOT-563.tsx
6445
+ import { Cuboid as Cuboid56, Translate as Translate36, Rotate as Rotate16, Colorize as Colorize47 } from "jscad-fiber";
6446
+ import { Fragment as Fragment77, jsx as jsx82, jsxs as jsxs78 } from "react/jsx-runtime";
6447
+ var SOT563 = ({ fullWidth = 1.94, fullLength: fullLength10 = 1.6 }) => {
6448
+ const bodyWidth = 1.2;
6449
+ const bodyLength10 = 1.6;
6450
+ const bodyHeight = 0.55;
6451
+ const leadWidth = 0.3;
6452
+ const leadLength = 0.67;
6453
+ const leadHeight = 0.13;
6454
+ const leadSpacing = 0.5;
6455
+ const bodyZOffset = -0.4;
6456
+ return /* @__PURE__ */ jsxs78(Fragment77, { children: [
6457
+ /* @__PURE__ */ jsx82(Rotate16, { rotation: [45 * Math.PI, 0, 0], children: /* @__PURE__ */ jsx82(Translate36, { center: [0, 0, bodyZOffset], children: /* @__PURE__ */ jsx82(Colorize47, { color: "grey", children: /* @__PURE__ */ jsx82(Cuboid56, { size: [bodyWidth, bodyLength10, bodyHeight] }) }) }) }),
6458
+ [-1, 0, 1].flatMap((yOffset, index) => [
6459
+ // Left lead
6460
+ /* @__PURE__ */ jsx82(
6461
+ Translate36,
6462
+ {
6463
+ center: [
6464
+ -bodyWidth / 2 - 0.03,
6465
+ yOffset * leadSpacing,
6466
+ leadHeight / 2
6467
+ ],
6468
+ children: /* @__PURE__ */ jsx82(Cuboid56, { size: [leadLength, leadWidth, leadHeight] })
6469
+ },
6470
+ `left-${index}`
6471
+ ),
6472
+ // Right lead
6473
+ /* @__PURE__ */ jsx82(
6474
+ Translate36,
6475
+ {
6476
+ center: [bodyWidth / 2 + 0.03, yOffset * leadSpacing, leadHeight / 2],
6477
+ children: /* @__PURE__ */ jsx82(Cuboid56, { size: [leadLength, leadWidth, leadHeight] })
6478
+ },
6479
+ `right-${index}`
6480
+ )
6481
+ ])
6482
+ ] });
6483
+ };
6484
+
6001
6485
  // lib/Footprinter3d.tsx
6002
- import { jsx as jsx76 } from "react/jsx-runtime";
6486
+ import { Fragment as Fragment78, jsx as jsx83 } from "react/jsx-runtime";
6003
6487
  var Footprinter3d = ({ footprint }) => {
6004
6488
  let normalizedFootprint = footprint;
6005
6489
  if (footprint.startsWith("jstzh1_5mm")) {
@@ -6007,12 +6491,17 @@ var Footprinter3d = ({ footprint }) => {
6007
6491
  const numPins = pinMatch && pinMatch[1] ? pinMatch[1] : "7";
6008
6492
  normalizedFootprint = `zh${numPins}`;
6009
6493
  }
6010
- const fpJson = fp3.string(normalizedFootprint).json();
6494
+ const fpJson = fp5.string(normalizedFootprint).json();
6011
6495
  const colorMatch = footprint.match(/_color\(([^)]+)\)/);
6012
6496
  const color = colorMatch ? colorMatch[1] : void 0;
6497
+ const dim = (value, fallback) => {
6498
+ if (value === void 0 || value === null) return fallback;
6499
+ const parsed = mm(value);
6500
+ return Number.isFinite(parsed) ? parsed : fallback;
6501
+ };
6013
6502
  switch (fpJson.fn) {
6014
6503
  case "crystal":
6015
- return /* @__PURE__ */ jsx76(
6504
+ return /* @__PURE__ */ jsx83(
6016
6505
  Crystal,
6017
6506
  {
6018
6507
  horizontalPadPitch: fpJson.px,
@@ -6022,11 +6511,11 @@ var Footprinter3d = ({ footprint }) => {
6022
6511
  }
6023
6512
  );
6024
6513
  case "dip":
6025
- return /* @__PURE__ */ jsx76(Dip, { numPins: fpJson.num_pins, pitch: fpJson.p, bodyWidth: fpJson.w });
6514
+ return /* @__PURE__ */ jsx83(Dip, { numPins: fpJson.num_pins, pitch: fpJson.p, bodyWidth: fpJson.w });
6026
6515
  case "axial":
6027
- return /* @__PURE__ */ jsx76(AxialCapacitor, { pitch: fpJson.p });
6516
+ return /* @__PURE__ */ jsx83(AxialCapacitor, { pitch: fpJson.p });
6028
6517
  case "tssop":
6029
- return /* @__PURE__ */ jsx76(
6518
+ return /* @__PURE__ */ jsx83(
6030
6519
  Tssop,
6031
6520
  {
6032
6521
  pinCount: fpJson.num_pins,
@@ -6037,7 +6526,7 @@ var Footprinter3d = ({ footprint }) => {
6037
6526
  }
6038
6527
  );
6039
6528
  case "msop":
6040
- return /* @__PURE__ */ jsx76(
6529
+ return /* @__PURE__ */ jsx83(
6041
6530
  MSOP,
6042
6531
  {
6043
6532
  pinCount: fpJson.num_pins,
@@ -6048,7 +6537,7 @@ var Footprinter3d = ({ footprint }) => {
6048
6537
  }
6049
6538
  );
6050
6539
  case "vssop":
6051
- return /* @__PURE__ */ jsx76(
6540
+ return /* @__PURE__ */ jsx83(
6052
6541
  VSSOP,
6053
6542
  {
6054
6543
  pinCount: fpJson.num_pins,
@@ -6060,7 +6549,7 @@ var Footprinter3d = ({ footprint }) => {
6060
6549
  }
6061
6550
  );
6062
6551
  case "qfp":
6063
- return /* @__PURE__ */ jsx76(
6552
+ return /* @__PURE__ */ jsx83(
6064
6553
  QFP,
6065
6554
  {
6066
6555
  pinCount: fpJson.num_pins,
@@ -6071,12 +6560,12 @@ var Footprinter3d = ({ footprint }) => {
6071
6560
  }
6072
6561
  );
6073
6562
  case "tqfp":
6074
- return /* @__PURE__ */ jsx76(tqfp_default, {});
6563
+ return /* @__PURE__ */ jsx83(tqfp_default, {});
6075
6564
  case "lqfp":
6076
- return /* @__PURE__ */ jsx76(LQFP, { pinCount: fpJson.num_pins });
6565
+ return /* @__PURE__ */ jsx83(LQFP, { pinCount: fpJson.num_pins });
6077
6566
  case "qfn": {
6078
6567
  const hasThermalPad = typeof fpJson.thermalpad?.x === "number" && typeof fpJson.thermalpad?.y === "number";
6079
- return /* @__PURE__ */ jsx76(
6568
+ return /* @__PURE__ */ jsx83(
6080
6569
  qfn_default,
6081
6570
  {
6082
6571
  num_pins: fpJson.num_pins,
@@ -6094,7 +6583,7 @@ var Footprinter3d = ({ footprint }) => {
6094
6583
  }
6095
6584
  case "dfn": {
6096
6585
  const hasThermalPad = typeof fpJson.thermalpad?.x === "number" && typeof fpJson.thermalpad?.y === "number";
6097
- return /* @__PURE__ */ jsx76(
6586
+ return /* @__PURE__ */ jsx83(
6098
6587
  DFN,
6099
6588
  {
6100
6589
  num_pins: fpJson.num_pins,
@@ -6114,7 +6603,7 @@ var Footprinter3d = ({ footprint }) => {
6114
6603
  const rowsMatch = footprint.match(/_rows(\d+)/);
6115
6604
  const rows = rowsMatch && rowsMatch[1] ? parseInt(rowsMatch[1], 10) : 1;
6116
6605
  if (fpJson.male)
6117
- return /* @__PURE__ */ jsx76(
6606
+ return /* @__PURE__ */ jsx83(
6118
6607
  PinRow,
6119
6608
  {
6120
6609
  numberOfPins: fpJson.num_pins,
@@ -6127,7 +6616,7 @@ var Footprinter3d = ({ footprint }) => {
6127
6616
  }
6128
6617
  );
6129
6618
  if (fpJson.female)
6130
- return /* @__PURE__ */ jsx76(
6619
+ return /* @__PURE__ */ jsx83(
6131
6620
  FemaleHeaderRow,
6132
6621
  {
6133
6622
  numberOfPins: fpJson.num_pins,
@@ -6137,7 +6626,7 @@ var Footprinter3d = ({ footprint }) => {
6137
6626
  );
6138
6627
  }
6139
6628
  case "smdpinheader":
6140
- return /* @__PURE__ */ jsx76(
6629
+ return /* @__PURE__ */ jsx83(
6141
6630
  SmdPinHeader,
6142
6631
  {
6143
6632
  numberOfPins: fpJson.num_pins,
@@ -6146,58 +6635,91 @@ var Footprinter3d = ({ footprint }) => {
6146
6635
  }
6147
6636
  );
6148
6637
  case "led5050":
6149
- return /* @__PURE__ */ jsx76(Led5050, { color });
6638
+ return /* @__PURE__ */ jsx83(Led5050, { color });
6150
6639
  case "cap": {
6151
6640
  switch (fpJson.imperial) {
6152
6641
  case "0402":
6153
- return /* @__PURE__ */ jsx76(A0402, { color: "#856c4d" });
6642
+ return /* @__PURE__ */ jsx83(A0402, { color: "#856c4d" });
6154
6643
  case "0603":
6155
- return /* @__PURE__ */ jsx76(A0603, { color: "#856c4d" });
6644
+ return /* @__PURE__ */ jsx83(A0603, { color: "#856c4d" });
6156
6645
  case "0805":
6157
- return /* @__PURE__ */ jsx76(A0805, { color: "#856c4d" });
6646
+ return /* @__PURE__ */ jsx83(A0805, { color: "#856c4d" });
6158
6647
  case "0201":
6159
- return /* @__PURE__ */ jsx76(A0201, { color: "#856c4d" });
6648
+ return /* @__PURE__ */ jsx83(A0201, { color: "#856c4d" });
6160
6649
  case "01005":
6161
- return /* @__PURE__ */ jsx76(A01005, { color: "#856c4d" });
6650
+ return /* @__PURE__ */ jsx83(A01005, { color: "#856c4d" });
6162
6651
  case "1206":
6163
- return /* @__PURE__ */ jsx76(A1206, { color: "#856c4d" });
6652
+ return /* @__PURE__ */ jsx83(A1206, { color: "#856c4d" });
6164
6653
  case "1210":
6165
- return /* @__PURE__ */ jsx76(A1210, { color: "#856c4d" });
6654
+ return /* @__PURE__ */ jsx83(A1210, { color: "#856c4d" });
6166
6655
  case "2010":
6167
- return /* @__PURE__ */ jsx76(A2010, { color: "#856c4d" });
6656
+ return /* @__PURE__ */ jsx83(A2010, { color: "#856c4d" });
6168
6657
  case "2512":
6169
- return /* @__PURE__ */ jsx76(A2512, { color: "#856c4d" });
6658
+ return /* @__PURE__ */ jsx83(A2512, { color: "#856c4d" });
6170
6659
  }
6171
6660
  break;
6172
6661
  }
6173
6662
  case "sot23":
6174
6663
  switch (fpJson.num_pins) {
6175
6664
  case 3:
6176
- return /* @__PURE__ */ jsx76(SOT233P, { color });
6665
+ return /* @__PURE__ */ jsx83(SOT233P, { color });
6177
6666
  case 5:
6178
- return /* @__PURE__ */ jsx76(SOT_235_default, {});
6667
+ return /* @__PURE__ */ jsx83(SOT_235_default, {});
6179
6668
  }
6180
6669
  break;
6670
+ case "sot25":
6671
+ return /* @__PURE__ */ jsx83(SOT_235_default, {});
6672
+ case "sot":
6673
+ case "sot343": {
6674
+ const isSc70 = fpJson.fn === "sot343";
6675
+ return /* @__PURE__ */ jsx83(
6676
+ GullWingBody,
6677
+ {
6678
+ pads: getSmtPadRects(normalizedFootprint),
6679
+ bodyWidth: isSc70 ? 1.25 : 1.6,
6680
+ bodyLength: isSc70 ? 2 : 2.9,
6681
+ bodyHeight: isSc70 ? 1.1 : 1.3
6682
+ }
6683
+ );
6684
+ }
6685
+ case "sot563":
6686
+ return /* @__PURE__ */ jsx83(SOT563, {});
6687
+ case "sot89": {
6688
+ const padSpan = dim(fpJson.w, 4.2);
6689
+ return /* @__PURE__ */ jsx83(
6690
+ SOT223,
6691
+ {
6692
+ fullWidth: padSpan,
6693
+ bodyWidth: padSpan * 0.6,
6694
+ bodyLength: dim(fpJson.h, 4.8) * 0.94,
6695
+ bodyHeight: 1.5,
6696
+ leadWidth: dim(fpJson.pw, 0.48),
6697
+ tabLeadWidth: dim(fpJson.pw, 0.48) * 2,
6698
+ padPitch: dim(fpJson.p, 1.5),
6699
+ leadHeight: 0.66
6700
+ }
6701
+ );
6702
+ }
6181
6703
  case "sot457":
6182
- return /* @__PURE__ */ jsx76(SOT457, {});
6704
+ return /* @__PURE__ */ jsx83(SOT457, {});
6183
6705
  case "sot223":
6184
- return /* @__PURE__ */ jsx76(SOT223, {});
6706
+ return /* @__PURE__ */ jsx83(SOT223, {});
6185
6707
  case "sot23w":
6186
- return /* @__PURE__ */ jsx76(SOT23W, {});
6708
+ return /* @__PURE__ */ jsx83(SOT23W, {});
6187
6709
  case "sot323":
6188
- return /* @__PURE__ */ jsx76(SOT323, {});
6710
+ return /* @__PURE__ */ jsx83(SOT323, {});
6189
6711
  case "sod323f":
6190
- return /* @__PURE__ */ jsx76(SOD323F, {});
6712
+ return /* @__PURE__ */ jsx83(SOD323F, {});
6191
6713
  case "sod323fl":
6192
- return /* @__PURE__ */ jsx76(SOD323FL, {});
6714
+ return /* @__PURE__ */ jsx83(SOD323FL, {});
6193
6715
  case "sot363":
6194
- return /* @__PURE__ */ jsx76(SOT_363_default, {});
6716
+ return /* @__PURE__ */ jsx83(SOT_363_default, {});
6195
6717
  case "sot886":
6196
- return /* @__PURE__ */ jsx76(SOT886, {});
6718
+ return /* @__PURE__ */ jsx83(SOT886, {});
6197
6719
  case "sot963":
6198
- return /* @__PURE__ */ jsx76(SOT963, {});
6720
+ return /* @__PURE__ */ jsx83(SOT963, {});
6199
6721
  case "pushbutton":
6200
- return /* @__PURE__ */ jsx76(
6722
+ return /* @__PURE__ */ jsx83(
6201
6723
  PushButton,
6202
6724
  {
6203
6725
  width: fpJson.w,
@@ -6207,11 +6729,11 @@ var Footprinter3d = ({ footprint }) => {
6207
6729
  );
6208
6730
  case "jst":
6209
6731
  if (fpJson.zh) {
6210
- return /* @__PURE__ */ jsx76(JSTZH1_5mm, { numPins: fpJson.num_pins });
6732
+ return /* @__PURE__ */ jsx83(JSTZH1_5mm, { numPins: fpJson.num_pins });
6211
6733
  }
6212
6734
  break;
6213
6735
  case "fpc":
6214
- return /* @__PURE__ */ jsx76(
6736
+ return /* @__PURE__ */ jsx83(
6215
6737
  FPC,
6216
6738
  {
6217
6739
  pinCount: fpJson.num_pins,
@@ -6231,7 +6753,7 @@ var Footprinter3d = ({ footprint }) => {
6231
6753
  }
6232
6754
  );
6233
6755
  case "rj45":
6234
- return /* @__PURE__ */ jsx76(
6756
+ return /* @__PURE__ */ jsx83(
6235
6757
  RJ45,
6236
6758
  {
6237
6759
  bodyWidth: fpJson.w,
@@ -6255,7 +6777,9 @@ var Footprinter3d = ({ footprint }) => {
6255
6777
  }
6256
6778
  );
6257
6779
  case "soic":
6258
- return /* @__PURE__ */ jsx76(
6780
+ case "sop8":
6781
+ case "ssop":
6782
+ return /* @__PURE__ */ jsx83(
6259
6783
  SOIC,
6260
6784
  {
6261
6785
  pinCount: fpJson.num_pins,
@@ -6265,44 +6789,178 @@ var Footprinter3d = ({ footprint }) => {
6265
6789
  bodyWidth: fpJson.w
6266
6790
  }
6267
6791
  );
6792
+ case "son":
6793
+ case "wson":
6794
+ case "vson": {
6795
+ const bodyWidth = fpJson.fn === "vson" ? dim(fpJson.grid?.x, 3) : dim(fpJson.w, 3);
6796
+ const bodyLength10 = fpJson.fn === "vson" ? dim(fpJson.grid?.y, 3) : dim(fpJson.h, 3);
6797
+ const thermalPadWidth = dim(fpJson.epw, 0);
6798
+ const thermalPadLength = dim(fpJson.eph, 0);
6799
+ const padLength = fpJson.pl !== void 0 ? dim(fpJson.pl, 0) : void 0;
6800
+ const padWidth = fpJson.pw !== void 0 ? dim(fpJson.pw, 0) : void 0;
6801
+ const signalPads = getSmtPadRects(normalizedFootprint).filter(
6802
+ (pad) => Number(pad.pin ?? 0) <= fpJson.num_pins
6803
+ );
6804
+ const distinct = (values) => new Set(values.map((value) => value.toFixed(3))).size;
6805
+ const rowsAlongY = signalPads.length > 2 && distinct(signalPads.map((pad) => pad.y)) === 2 && distinct(signalPads.map((pad) => pad.x)) > 2;
6806
+ const dfn = /* @__PURE__ */ jsx83(
6807
+ DFN,
6808
+ {
6809
+ num_pins: fpJson.num_pins,
6810
+ bodyWidth: rowsAlongY ? bodyLength10 : bodyWidth,
6811
+ bodyLength: rowsAlongY ? bodyWidth : bodyLength10,
6812
+ pitch: dim(fpJson.p, 0.5),
6813
+ padLength,
6814
+ padWidth,
6815
+ thermalPadSize: fpJson.ep && thermalPadWidth > 0 && thermalPadLength > 0 ? {
6816
+ width: rowsAlongY ? thermalPadLength : thermalPadWidth,
6817
+ length: rowsAlongY ? thermalPadWidth : thermalPadLength
6818
+ } : void 0
6819
+ }
6820
+ );
6821
+ return rowsAlongY ? /* @__PURE__ */ jsx83(Rotate17, { rotation: [0, 0, "90deg"], children: dfn }) : dfn;
6822
+ }
6823
+ case "mlp":
6824
+ case "lga":
6825
+ case "quad": {
6826
+ if (fpJson.legsoutside) {
6827
+ return /* @__PURE__ */ jsx83(
6828
+ QFP,
6829
+ {
6830
+ pinCount: fpJson.num_pins,
6831
+ pitch: dim(fpJson.p, 0.5),
6832
+ leadWidth: dim(fpJson.pw, 0.25),
6833
+ padContactLength: dim(fpJson.pl, 0.25),
6834
+ bodyWidth: dim(fpJson.w, 6)
6835
+ }
6836
+ );
6837
+ }
6838
+ return /* @__PURE__ */ jsx83(
6839
+ qfn_default,
6840
+ {
6841
+ num_pins: fpJson.num_pins,
6842
+ bodyWidth: dim(fpJson.w, 6),
6843
+ bodyLength: dim(fpJson.h, 6),
6844
+ pitch: dim(fpJson.p, 0.5),
6845
+ padLength: dim(fpJson.pl, 0.25),
6846
+ padWidth: dim(fpJson.pw, 0.25)
6847
+ }
6848
+ );
6849
+ }
6850
+ case "bga": {
6851
+ const pitch = dim(fpJson.p, 0.8);
6852
+ const columns = fpJson.grid?.x ?? 8;
6853
+ const rows = fpJson.grid?.y ?? 8;
6854
+ return /* @__PURE__ */ jsx83(
6855
+ BGA,
6856
+ {
6857
+ ballPitch: pitch,
6858
+ ballColumns: columns,
6859
+ ballRows: rows,
6860
+ ballDiameter: pitch * 0.625,
6861
+ packageWidth: columns * pitch,
6862
+ packageLength: rows * pitch
6863
+ }
6864
+ );
6865
+ }
6268
6866
  case "sod523":
6269
- return /* @__PURE__ */ jsx76(SOD523, {});
6867
+ return /* @__PURE__ */ jsx83(SOD523, {});
6270
6868
  case "sod723":
6271
- return /* @__PURE__ */ jsx76(SOD723_default, {});
6869
+ return /* @__PURE__ */ jsx83(SOD723_default, {});
6272
6870
  case "sod882":
6273
- return /* @__PURE__ */ jsx76(SOD882, {});
6871
+ return /* @__PURE__ */ jsx83(SOD882, {});
6274
6872
  case "sma":
6275
- return /* @__PURE__ */ jsx76(SMA, {});
6873
+ return /* @__PURE__ */ jsx83(SMA, {});
6276
6874
  case "smb":
6277
- return /* @__PURE__ */ jsx76(SMB, {});
6875
+ return /* @__PURE__ */ jsx83(SMB, {});
6278
6876
  case "smc":
6279
- return /* @__PURE__ */ jsx76(SMC, {});
6877
+ return /* @__PURE__ */ jsx83(SMC, {});
6280
6878
  case "smf":
6281
- return /* @__PURE__ */ jsx76(SMF, {});
6879
+ return /* @__PURE__ */ jsx83(SMF, {});
6282
6880
  case "sod123":
6283
- return /* @__PURE__ */ jsx76(SOD123, {});
6881
+ return /* @__PURE__ */ jsx83(SOD123, {});
6284
6882
  case "sod123f":
6285
- return /* @__PURE__ */ jsx76(SOD123F, {});
6883
+ return /* @__PURE__ */ jsx83(SOD123F, {});
6286
6884
  case "sod123fl":
6287
- return /* @__PURE__ */ jsx76(SOD123FL, {});
6885
+ return /* @__PURE__ */ jsx83(SOD123FL, {});
6288
6886
  case "sod123w":
6289
- return /* @__PURE__ */ jsx76(SOD123W, {});
6887
+ return /* @__PURE__ */ jsx83(SOD123W, {});
6888
+ case "sod110":
6889
+ return /* @__PURE__ */ jsx83(SOD123W, { bodyWidth: 2.1, bodyLength: 1.4 });
6290
6890
  case "sod128":
6291
- return /* @__PURE__ */ jsx76(SOD128, {});
6891
+ return /* @__PURE__ */ jsx83(SOD128, {});
6292
6892
  case "sod323":
6293
- return /* @__PURE__ */ jsx76(SOD323, {});
6893
+ return /* @__PURE__ */ jsx83(SOD323, {});
6894
+ case "sod323w":
6895
+ return /* @__PURE__ */ jsx83(SOD323, {});
6896
+ case "sod80":
6897
+ return /* @__PURE__ */ jsx83(MINIMELF, {});
6898
+ case "sod882d":
6899
+ return /* @__PURE__ */ jsx83(SOD882, {});
6900
+ case "smbf":
6901
+ return /* @__PURE__ */ jsx83(SMB, {});
6902
+ case "led2835":
6903
+ return /* @__PURE__ */ jsx83(
6904
+ Led2835,
6905
+ {
6906
+ color,
6907
+ bodyWidth: dim(fpJson.w, 3.5),
6908
+ bodyLength: dim(fpJson.h, 2.8),
6909
+ pad1X: dim(fpJson.p1x, -0.9),
6910
+ pad1Width: dim(fpJson.p1w, 2.2),
6911
+ pad2X: dim(fpJson.p2x, 1.375),
6912
+ pad2Width: dim(fpJson.p2w, 1.25),
6913
+ padLength: dim(fpJson.ph, 2.2)
6914
+ }
6915
+ );
6916
+ case "electrolytic":
6917
+ case "radial": {
6918
+ const pitch = dim(fpJson.p, 2.5);
6919
+ const namedDiameter = footprint.match(/_d([\d.]+)/);
6920
+ const diameter = fpJson.d !== void 0 ? dim(fpJson.d, pitch * 2) : namedDiameter ? Number(namedDiameter[1]) : pitch * 2;
6921
+ return /* @__PURE__ */ jsx83(ElectrolyticCapacitor, { diameter, leadPitch: pitch });
6922
+ }
6923
+ case "potentiometer":
6924
+ return /* @__PURE__ */ jsx83(
6925
+ Potentiometer,
6926
+ {
6927
+ bodyWidth: dim(fpJson.w, 5.35),
6928
+ bodyLength: dim(fpJson.ca, 14),
6929
+ bodyHeight: dim(fpJson.h, 4),
6930
+ leads: getPlatedHoleCenters(normalizedFootprint)
6931
+ }
6932
+ );
6933
+ case "smdpushbutton":
6934
+ return /* @__PURE__ */ jsx83(
6935
+ SmdPushButton,
6936
+ {
6937
+ padSpanX: dim(fpJson.px, 4.2),
6938
+ padSpanY: dim(fpJson.py, 2.15),
6939
+ padWidth: dim(fpJson.pw, 1.05),
6940
+ padLength: dim(fpJson.ph, 0.7)
6941
+ }
6942
+ );
6943
+ case "breakoutheaders": {
6944
+ const pitch = dim(fpJson.p, 2.54);
6945
+ const halfWidth = dim(fpJson.w, 10) / 2;
6946
+ const sides = [
6947
+ { x: -halfWidth, pins: fpJson.left ?? 0, key: "left" },
6948
+ { x: halfWidth, pins: fpJson.right ?? 0, key: "right" }
6949
+ ];
6950
+ return /* @__PURE__ */ jsx83(Fragment78, { children: sides.filter(({ pins }) => pins > 0).map(({ x, pins, key }) => /* @__PURE__ */ jsx83(Translate37, { center: [x, 0, 0], children: /* @__PURE__ */ jsx83(Rotate17, { rotation: [0, 0, "90deg"], children: /* @__PURE__ */ jsx83(PinRow, { numberOfPins: pins, pitch }) }) }, key)) });
6951
+ }
6294
6952
  case "sod923":
6295
- return /* @__PURE__ */ jsx76(SOD923, {});
6953
+ return /* @__PURE__ */ jsx83(SOD923, {});
6296
6954
  case "hc49":
6297
- return /* @__PURE__ */ jsx76(HC49, {});
6955
+ return /* @__PURE__ */ jsx83(HC49, {});
6298
6956
  case "micromelf":
6299
- return /* @__PURE__ */ jsx76(MicroMELF, {});
6957
+ return /* @__PURE__ */ jsx83(MicroMELF, {});
6300
6958
  case "minimelf":
6301
- return /* @__PURE__ */ jsx76(MINIMELF, {});
6959
+ return /* @__PURE__ */ jsx83(MINIMELF, {});
6302
6960
  case "melf":
6303
- return /* @__PURE__ */ jsx76(MELF, {});
6961
+ return /* @__PURE__ */ jsx83(MELF, {});
6304
6962
  case "ms012":
6305
- return /* @__PURE__ */ jsx76(
6963
+ return /* @__PURE__ */ jsx83(
6306
6964
  MS012,
6307
6965
  {
6308
6966
  pinCount: fpJson.num_pins,
@@ -6312,7 +6970,7 @@ var Footprinter3d = ({ footprint }) => {
6312
6970
  }
6313
6971
  );
6314
6972
  case "ms013":
6315
- return /* @__PURE__ */ jsx76(
6973
+ return /* @__PURE__ */ jsx83(
6316
6974
  MS013,
6317
6975
  {
6318
6976
  pinCount: fpJson.num_pins,
@@ -6322,14 +6980,55 @@ var Footprinter3d = ({ footprint }) => {
6322
6980
  }
6323
6981
  );
6324
6982
  case "sot723":
6325
- return /* @__PURE__ */ jsx76(SOT723, {});
6983
+ return /* @__PURE__ */ jsx83(SOT723, {});
6326
6984
  case "to220":
6327
- return /* @__PURE__ */ jsx76(TO220, {});
6985
+ return /* @__PURE__ */ jsx83(TO220, { leads: getPlatedHoleCenters(normalizedFootprint) });
6986
+ case "to220f":
6987
+ return /* @__PURE__ */ jsx83(TO220, { mouldedTab: true, leads: getPlatedHoleCenters(normalizedFootprint) });
6328
6988
  case "to92":
6329
- return /* @__PURE__ */ jsx76(TO92, {});
6989
+ return /* @__PURE__ */ jsx83(TO92, { leads: getPlatedHoleCenters(normalizedFootprint) });
6990
+ case "to92l":
6991
+ case "to92s": {
6992
+ const across = dim(fpJson.w, 4.8);
6993
+ const along = dim(fpJson.h, 4);
6994
+ const diameter = Math.max(across, along);
6995
+ return /* @__PURE__ */ jsx83(
6996
+ TO92,
6997
+ {
6998
+ bodyDiameter: diameter,
6999
+ flatCut: Math.max(diameter - Math.min(across, along), 0.4),
7000
+ leads: getPlatedHoleCenters(normalizedFootprint)
7001
+ }
7002
+ );
7003
+ }
7004
+ case "to252":
7005
+ case "dpak":
7006
+ case "to263":
7007
+ case "d2pak": {
7008
+ const isD2Pak = fpJson.fn === "to263" || fpJson.fn === "d2pak";
7009
+ const tabWidth = dim(fpJson.tabw, isD2Pak ? 8.38 : 6.2);
7010
+ const tabLength = Math.min(
7011
+ dim(fpJson.tabh, isD2Pak ? 10 : 5.8),
7012
+ isD2Pak ? 10 : 6.5
7013
+ );
7014
+ return /* @__PURE__ */ jsx83(
7015
+ DPAK,
7016
+ {
7017
+ bodyWidth: tabWidth,
7018
+ bodyLength: dim(fpJson.w, isD2Pak ? 10.1 : 6.6),
7019
+ bodyHeight: isD2Pak ? 4.4 : 2.3,
7020
+ tabWidth,
7021
+ tabLength,
7022
+ span: dim(fpJson.span, isD2Pak ? 10.21 : 6.85),
7023
+ pitch: dim(fpJson.p, isD2Pak ? 2.54 : 2.29),
7024
+ leadWidth: dim(fpJson.pw, 1.5),
7025
+ leadContactLength: dim(fpJson.pl, 3)
7026
+ }
7027
+ );
7028
+ }
6330
7029
  case "stampboard":
6331
7030
  case "stampreceiver":
6332
- return /* @__PURE__ */ jsx76(
7031
+ return /* @__PURE__ */ jsx83(
6333
7032
  StampBoard,
6334
7033
  {
6335
7034
  bodyWidth: fpJson.w,
@@ -6353,7 +7052,7 @@ var Footprinter3d = ({ footprint }) => {
6353
7052
  const pinRow = fpJson.pinrow;
6354
7053
  const pinRowHoleEdgeToEdgeDist = fpJson.pinRowHoleEdgeToEdgeDist;
6355
7054
  const holes = Array.isArray(fpJson.holes) ? fpJson.holes : [];
6356
- return /* @__PURE__ */ jsx76(
7055
+ return /* @__PURE__ */ jsx83(
6357
7056
  MountedPcbModule,
6358
7057
  {
6359
7058
  numPins: pinRow,
@@ -6380,29 +7079,29 @@ var Footprinter3d = ({ footprint }) => {
6380
7079
  }
6381
7080
  switch (fpJson.imperial) {
6382
7081
  case "0402":
6383
- return /* @__PURE__ */ jsx76(A0402, { color });
7082
+ return /* @__PURE__ */ jsx83(A0402, { color });
6384
7083
  case "0603":
6385
- return /* @__PURE__ */ jsx76(A0603, { color });
7084
+ return /* @__PURE__ */ jsx83(A0603, { color });
6386
7085
  case "0805":
6387
- return /* @__PURE__ */ jsx76(A0805, { color });
7086
+ return /* @__PURE__ */ jsx83(A0805, { color });
6388
7087
  case "0201":
6389
- return /* @__PURE__ */ jsx76(A0201, { color });
7088
+ return /* @__PURE__ */ jsx83(A0201, { color });
6390
7089
  case "01005":
6391
- return /* @__PURE__ */ jsx76(A01005, { color });
7090
+ return /* @__PURE__ */ jsx83(A01005, { color });
6392
7091
  case "1206":
6393
- return /* @__PURE__ */ jsx76(A1206, { color });
7092
+ return /* @__PURE__ */ jsx83(A1206, { color });
6394
7093
  case "1210":
6395
- return /* @__PURE__ */ jsx76(A1210, { color });
7094
+ return /* @__PURE__ */ jsx83(A1210, { color });
6396
7095
  case "2010":
6397
- return /* @__PURE__ */ jsx76(A2010, { color });
7096
+ return /* @__PURE__ */ jsx83(A2010, { color });
6398
7097
  case "2512":
6399
- return /* @__PURE__ */ jsx76(A2512, { color });
7098
+ return /* @__PURE__ */ jsx83(A2512, { color });
6400
7099
  }
6401
7100
  if ((fpJson.fn === "res" || fpJson.fn === "cap") && fpJson.p !== void 0 && fpJson.ph !== void 0) {
6402
7101
  const padPitch = mm(fpJson.p);
6403
7102
  const padHeight = mm(fpJson.ph);
6404
7103
  if (Number.isFinite(padPitch) && Number.isFinite(padHeight)) {
6405
- return /* @__PURE__ */ jsx76(
7104
+ return /* @__PURE__ */ jsx83(
6406
7105
  ParametricChip,
6407
7106
  {
6408
7107
  padPitch,
@@ -6414,47 +7113,6 @@ var Footprinter3d = ({ footprint }) => {
6414
7113
  }
6415
7114
  return null;
6416
7115
  };
6417
-
6418
- // lib/SOT-563.tsx
6419
- import { Cuboid as Cuboid51, Translate as Translate35, Rotate as Rotate16, Colorize as Colorize42 } from "jscad-fiber";
6420
- import { Fragment as Fragment70, jsx as jsx77, jsxs as jsxs72 } from "react/jsx-runtime";
6421
- var SOT563 = ({ fullWidth = 1.94, fullLength: fullLength10 = 1.6 }) => {
6422
- const bodyWidth = 1.2;
6423
- const bodyLength10 = 1.6;
6424
- const bodyHeight = 0.55;
6425
- const leadWidth = 0.3;
6426
- const leadLength = 0.67;
6427
- const leadHeight = 0.13;
6428
- const leadSpacing = 0.5;
6429
- const bodyZOffset = -0.4;
6430
- return /* @__PURE__ */ jsxs72(Fragment70, { children: [
6431
- /* @__PURE__ */ jsx77(Rotate16, { rotation: [45 * Math.PI, 0, 0], children: /* @__PURE__ */ jsx77(Translate35, { center: [0, 0, bodyZOffset], children: /* @__PURE__ */ jsx77(Colorize42, { color: "grey", children: /* @__PURE__ */ jsx77(Cuboid51, { size: [bodyWidth, bodyLength10, bodyHeight] }) }) }) }),
6432
- [-1, 0, 1].flatMap((yOffset, index) => [
6433
- // Left lead
6434
- /* @__PURE__ */ jsx77(
6435
- Translate35,
6436
- {
6437
- center: [
6438
- -bodyWidth / 2 - 0.03,
6439
- yOffset * leadSpacing,
6440
- leadHeight / 2
6441
- ],
6442
- children: /* @__PURE__ */ jsx77(Cuboid51, { size: [leadLength, leadWidth, leadHeight] })
6443
- },
6444
- `left-${index}`
6445
- ),
6446
- // Right lead
6447
- /* @__PURE__ */ jsx77(
6448
- Translate35,
6449
- {
6450
- center: [bodyWidth / 2 + 0.03, yOffset * leadSpacing, leadHeight / 2],
6451
- children: /* @__PURE__ */ jsx77(Cuboid51, { size: [leadLength, leadWidth, leadHeight] })
6452
- },
6453
- `right-${index}`
6454
- )
6455
- ])
6456
- ] });
6457
- };
6458
7116
  export {
6459
7117
  A01005,
6460
7118
  A0201,
@@ -6470,7 +7128,9 @@ export {
6470
7128
  ChipBody,
6471
7129
  Crystal,
6472
7130
  DFN,
7131
+ DPAK,
6473
7132
  Display,
7133
+ ElectrolyticCapacitor,
6474
7134
  ExtrudedPads,
6475
7135
  FPC,
6476
7136
  FemaleHeader,
@@ -6478,9 +7138,11 @@ export {
6478
7138
  FootprintPad,
6479
7139
  FootprintPlatedHole,
6480
7140
  Footprinter3d,
7141
+ GullWingBody,
6481
7142
  HC49,
6482
7143
  JSTZH1_5mm,
6483
7144
  LQFP,
7145
+ Led2835,
6484
7146
  Led5050,
6485
7147
  MELF,
6486
7148
  MINIMELF,
@@ -6491,6 +7153,7 @@ export {
6491
7153
  MountedPcbModule,
6492
7154
  PinHeader,
6493
7155
  PinRow,
7156
+ Potentiometer,
6494
7157
  QFN,
6495
7158
  QFP,
6496
7159
  RJ45,
@@ -6523,6 +7186,7 @@ export {
6523
7186
  Screen,
6524
7187
  SmdChipLead,
6525
7188
  SmdPinHeader,
7189
+ SmdPushButton,
6526
7190
  StampBoard,
6527
7191
  TO220,
6528
7192
  TO92,