jscad-electronics 0.0.139 → 0.0.141

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
@@ -4963,8 +4963,357 @@ var JSTZH1_5mm = ({
4963
4963
  ] });
4964
4964
  };
4965
4965
 
4966
+ // lib/FPC.tsx
4967
+ import {
4968
+ Colorize as Colorize37,
4969
+ Cuboid as Cuboid45,
4970
+ Cylinder as Cylinder12,
4971
+ Rotate as Rotate13,
4972
+ RoundedCuboid as RoundedCuboid3,
4973
+ Subtract as Subtract10,
4974
+ Translate as Translate31
4975
+ } from "jscad-fiber";
4976
+ import { Fragment as Fragment62, jsx as jsx68, jsxs as jsxs64 } from "react/jsx-runtime";
4977
+ var HOUSING_COLOR = "#303339";
4978
+ var HOUSING_SHADOW = "#1f2227";
4979
+ var ACTUATOR_COLOR = "#eee8d8";
4980
+ var ACTUATOR_HIGHLIGHT = "#f8f3e7";
4981
+ var TIN_COLOR = "#b7bdc2";
4982
+ var TIN_HIGHLIGHT = "#d2d6d9";
4983
+ var HOLD_DOWN_COLOR = "#767d82";
4984
+ var HOLD_DOWN_HIGHLIGHT = "#9ba1a5";
4985
+ var FPC = ({
4986
+ pinCount = 12,
4987
+ pitch = 0.5,
4988
+ padWidth = 0.3,
4989
+ padLength = 1.25,
4990
+ staggered = false,
4991
+ reverse = false,
4992
+ rowPitch = 2.4,
4993
+ topPadLength = padLength,
4994
+ bottomPadLength = padLength,
4995
+ mountPadPitchX,
4996
+ mountPadOffsetY = 2.575,
4997
+ mountTop = false,
4998
+ mountPadWidth = 2,
4999
+ mountPadLength = 2.5
5000
+ }) => {
5001
+ const contactSpan = Math.max((pinCount - 1) * pitch, pitch);
5002
+ const contactStartX = -contactSpan / 2;
5003
+ const resolvedMountPitch = mountPadPitchX ?? contactSpan + (staggered ? 3.5 : 3.38);
5004
+ const mountY = mountPadOffsetY === 0 ? 0 : (mountTop ? 1 : -1) * mountPadOffsetY;
5005
+ const contactRows = Array.from({ length: pinCount }, (_, index) => {
5006
+ const isUpperRow = staggered && index % 2 === 1 !== reverse;
5007
+ const y = staggered ? isUpperRow ? rowPitch / 2 : -rowPitch / 2 : 0;
5008
+ const length = isUpperRow ? topPadLength : bottomPadLength;
5009
+ return {
5010
+ index,
5011
+ x: contactStartX + index * pitch,
5012
+ y,
5013
+ length
5014
+ };
5015
+ });
5016
+ const contactMaxY = Math.max(
5017
+ ...contactRows.map((contact) => contact.y + contact.length / 2)
5018
+ );
5019
+ const contactMinY = Math.min(
5020
+ ...contactRows.map((contact) => contact.y - contact.length / 2)
5021
+ );
5022
+ const mountingMinY = mountY - mountPadLength / 2;
5023
+ const mountingMaxY = mountY + mountPadLength / 2;
5024
+ const signalSideY = mountTop ? contactMinY : contactMaxY;
5025
+ const cableSideY = mountTop ? Math.max(mountingMaxY, contactMaxY) + 0.67 : Math.min(mountingMinY, contactMinY) - 0.67;
5026
+ const directionToSignal = mountTop ? -1 : 1;
5027
+ const housingSignalY = signalSideY - directionToSignal * Math.max(padLength * 0.86, 1.05);
5028
+ const housingCableY = cableSideY + directionToSignal * 0.22;
5029
+ const housingDepth = Math.abs(housingSignalY - housingCableY);
5030
+ const housingCenterY = (housingSignalY + housingCableY) / 2;
5031
+ const cableEdgeY = housingCableY - directionToSignal * 0.01;
5032
+ const bodyWidth = Math.max(
5033
+ contactSpan + 4.9,
5034
+ resolvedMountPitch + mountPadWidth * 0.76
5035
+ );
5036
+ const openingWidth = Math.min(bodyWidth - 2.3, contactSpan + 1.1);
5037
+ const housingBaseHeight = 0.3;
5038
+ const housingHeight = 1.42;
5039
+ const overallHeight = 2;
5040
+ const throatDepth = Math.min(0.92, housingDepth * 0.28);
5041
+ const throatCenterY = cableEdgeY + directionToSignal * (throatDepth / 2 - 0.04);
5042
+ const throatHeight = 1.6;
5043
+ const throatCenterZ = 1.1;
5044
+ const actuatorDepth = Math.max(housingDepth - 0.78, 1.5);
5045
+ const actuatorCenterY = cableEdgeY + directionToSignal * (actuatorDepth / 2 + 0.68);
5046
+ const actuatorWidth = bodyWidth - 0.72;
5047
+ const actuatorHeight = 0.34;
5048
+ const actuatorCenterZ = overallHeight - actuatorHeight / 2;
5049
+ const hingeY = cableEdgeY + directionToSignal * Math.min(0.68, housingDepth * 0.22);
5050
+ const hingeZ = 1.48;
5051
+ const terminalWidth = Math.max(padWidth * 0.82, 0.15);
5052
+ const terminalOuterY = signalSideY;
5053
+ const terminalLength = Math.abs(terminalOuterY - housingSignalY);
5054
+ const terminalCenterY = (terminalOuterY + housingSignalY) / 2;
5055
+ const springLength = Math.max(throatDepth * 0.8, 0.5);
5056
+ const springCenterY = cableEdgeY + directionToSignal * (springLength / 2 + 0.08);
5057
+ const endClipX = resolvedMountPitch / 2;
5058
+ const clipHeight = 0.75;
5059
+ const clipWallX = bodyWidth / 2 - 0.04;
5060
+ const clipCapX = bodyWidth / 2 - 0.23;
5061
+ const sideBossX = bodyWidth / 2 - 0.32;
5062
+ const sideBossWidth = 0.68;
5063
+ return /* @__PURE__ */ jsxs64(Fragment62, { children: [
5064
+ [-1, 1].map((direction) => /* @__PURE__ */ jsx68(
5065
+ Cuboid45,
5066
+ {
5067
+ color: TIN_COLOR,
5068
+ center: [direction * endClipX, mountY, 0.07],
5069
+ size: [mountPadWidth, mountPadLength, 0.14]
5070
+ },
5071
+ `mount-pad:${direction}`
5072
+ )),
5073
+ contactRows.map((contact) => /* @__PURE__ */ jsx68(
5074
+ Cuboid45,
5075
+ {
5076
+ color: TIN_COLOR,
5077
+ center: [contact.x, terminalCenterY, 0.065],
5078
+ size: [terminalWidth, terminalLength, 0.13]
5079
+ },
5080
+ `terminal:${contact.index}`
5081
+ )),
5082
+ /* @__PURE__ */ jsx68(
5083
+ RoundedCuboid3,
5084
+ {
5085
+ color: HOUSING_SHADOW,
5086
+ center: [0, housingCenterY, housingBaseHeight / 2],
5087
+ size: [bodyWidth, housingDepth, housingBaseHeight],
5088
+ roundRadius: 0.1
5089
+ }
5090
+ ),
5091
+ /* @__PURE__ */ jsx68(Colorize37, { color: HOUSING_COLOR, children: /* @__PURE__ */ jsxs64(Subtract10, { children: [
5092
+ /* @__PURE__ */ jsx68(
5093
+ RoundedCuboid3,
5094
+ {
5095
+ center: [0, housingCenterY, housingBaseHeight + housingHeight / 2],
5096
+ size: [bodyWidth - 0.2, housingDepth - 0.12, housingHeight],
5097
+ roundRadius: 0.14
5098
+ }
5099
+ ),
5100
+ /* @__PURE__ */ jsx68(
5101
+ Cuboid45,
5102
+ {
5103
+ center: [0, throatCenterY, throatCenterZ],
5104
+ size: [openingWidth, throatDepth, throatHeight]
5105
+ }
5106
+ ),
5107
+ /* @__PURE__ */ jsx68(
5108
+ Cuboid45,
5109
+ {
5110
+ center: [0, actuatorCenterY, overallHeight - actuatorHeight * 0.72],
5111
+ size: [actuatorWidth - 0.32, actuatorDepth - 0.16, actuatorHeight]
5112
+ }
5113
+ )
5114
+ ] }) }),
5115
+ contactRows.map((contact) => /* @__PURE__ */ jsx68(
5116
+ RoundedCuboid3,
5117
+ {
5118
+ color: TIN_HIGHLIGHT,
5119
+ center: [contact.x, springCenterY, housingBaseHeight + 0.82],
5120
+ size: [terminalWidth * 0.82, springLength, 0.14],
5121
+ roundRadius: 0.035
5122
+ },
5123
+ `spring:${contact.index}`
5124
+ )),
5125
+ contactRows.map((contact) => /* @__PURE__ */ jsx68(
5126
+ Cuboid45,
5127
+ {
5128
+ color: TIN_COLOR,
5129
+ center: [
5130
+ contact.x,
5131
+ housingSignalY - directionToSignal * 0.03,
5132
+ housingBaseHeight + 0.32
5133
+ ],
5134
+ size: [terminalWidth, 0.13, 0.62]
5135
+ },
5136
+ `terminal-rise:${contact.index}`
5137
+ )),
5138
+ /* @__PURE__ */ jsx68(
5139
+ Cuboid45,
5140
+ {
5141
+ color: HOUSING_SHADOW,
5142
+ center: [
5143
+ 0,
5144
+ cableEdgeY + directionToSignal * 0.1,
5145
+ housingBaseHeight + 0.71
5146
+ ],
5147
+ size: [openingWidth + 0.18, 0.16, 0.8]
5148
+ }
5149
+ ),
5150
+ /* @__PURE__ */ jsx68(
5151
+ RoundedCuboid3,
5152
+ {
5153
+ color: ACTUATOR_COLOR,
5154
+ center: [0, actuatorCenterY, actuatorCenterZ],
5155
+ size: [actuatorWidth, actuatorDepth, actuatorHeight],
5156
+ roundRadius: 0.11
5157
+ }
5158
+ ),
5159
+ /* @__PURE__ */ jsx68(
5160
+ Cuboid45,
5161
+ {
5162
+ color: ACTUATOR_HIGHLIGHT,
5163
+ center: [
5164
+ 0,
5165
+ actuatorCenterY - directionToSignal * (actuatorDepth / 2 - 0.12),
5166
+ overallHeight - 0.035
5167
+ ],
5168
+ size: [actuatorWidth - 0.36, 0.24, 0.07]
5169
+ }
5170
+ ),
5171
+ [-1, 1].map((direction) => /* @__PURE__ */ jsx68(
5172
+ RoundedCuboid3,
5173
+ {
5174
+ color: ACTUATOR_COLOR,
5175
+ center: [direction * sideBossX, hingeY, hingeZ],
5176
+ size: [sideBossWidth, 0.92, 0.72],
5177
+ roundRadius: 0.1
5178
+ },
5179
+ `actuator-ear:${direction}`
5180
+ )),
5181
+ [-1, 1].map((direction) => /* @__PURE__ */ jsx68(
5182
+ Translate31,
5183
+ {
5184
+ x: direction * sideBossX,
5185
+ y: hingeY,
5186
+ z: hingeZ,
5187
+ children: /* @__PURE__ */ jsx68(Rotate13, { rotation: [0, Math.PI / 2, 0], children: /* @__PURE__ */ jsx68(
5188
+ Cylinder12,
5189
+ {
5190
+ color: ACTUATOR_HIGHLIGHT,
5191
+ height: sideBossWidth + 0.12,
5192
+ radius: 0.24
5193
+ }
5194
+ ) })
5195
+ },
5196
+ `hinge:${direction}`
5197
+ )),
5198
+ [-1, 1].map((direction) => /* @__PURE__ */ jsx68(
5199
+ RoundedCuboid3,
5200
+ {
5201
+ color: HOLD_DOWN_COLOR,
5202
+ center: [direction * clipWallX, mountY, clipHeight / 2],
5203
+ size: [0.17, Math.min(mountPadLength * 0.3, 0.7), clipHeight],
5204
+ roundRadius: 0.04
5205
+ },
5206
+ `hold-down-wall:${direction}`
5207
+ )),
5208
+ [-1, 1].map((direction) => /* @__PURE__ */ jsx68(
5209
+ RoundedCuboid3,
5210
+ {
5211
+ color: HOLD_DOWN_HIGHLIGHT,
5212
+ center: [direction * clipCapX, mountY, clipHeight - 0.05],
5213
+ size: [0.42, Math.min(mountPadLength * 0.3, 0.7), 0.1],
5214
+ roundRadius: 0.035
5215
+ },
5216
+ `hold-down-cap:${direction}`
5217
+ )),
5218
+ /* @__PURE__ */ jsx68(
5219
+ Cuboid45,
5220
+ {
5221
+ color: HOUSING_SHADOW,
5222
+ center: [0, housingCenterY, 0.025],
5223
+ size: [openingWidth + 0.7, housingDepth * 0.58, 0.05]
5224
+ }
5225
+ ),
5226
+ /* @__PURE__ */ jsx68(
5227
+ Cuboid45,
5228
+ {
5229
+ color: HOUSING_SHADOW,
5230
+ center: [
5231
+ 0,
5232
+ housingSignalY - directionToSignal * 0.06,
5233
+ housingBaseHeight + 0.82
5234
+ ],
5235
+ size: [openingWidth + 0.4, 0.15, 0.92]
5236
+ }
5237
+ )
5238
+ ] });
5239
+ };
5240
+
5241
+ // lib/SmdPinHeader.tsx
5242
+ import { Colorize as Colorize38, Cuboid as Cuboid46, Hull as Hull24, Translate as Translate32 } from "jscad-fiber";
5243
+ import { Fragment as Fragment63, jsx as jsx69, jsxs as jsxs65 } from "react/jsx-runtime";
5244
+ var SmdPinHeader = ({
5245
+ numberOfPins,
5246
+ pitch = 2.54,
5247
+ pinThickness = 0.64,
5248
+ bodyWidth = 2.5,
5249
+ bodyHeight = 2.54,
5250
+ standoffHeight = 1.27,
5251
+ matingPinLength = 5.8,
5252
+ tailSpan = 5.08
5253
+ }) => {
5254
+ const xStart = -((numberOfPins - 1) * pitch) / 2;
5255
+ const bodyTop = standoffHeight + bodyHeight;
5256
+ const tailLength = tailSpan / 2;
5257
+ const tipChamferHeight = pinThickness * 0.35;
5258
+ return /* @__PURE__ */ jsx69(Fragment63, { children: Array.from({ length: numberOfPins }, (_, index) => {
5259
+ const x = xStart + index * pitch;
5260
+ const tailDirection = index % 2 === 0 ? 1 : -1;
5261
+ const postBodyLength = matingPinLength - tipChamferHeight;
5262
+ const verticalTailLength = standoffHeight - pinThickness / 2;
5263
+ return /* @__PURE__ */ jsxs65(Translate32, { x, children: [
5264
+ /* @__PURE__ */ jsx69(
5265
+ Cuboid46,
5266
+ {
5267
+ color: "#222",
5268
+ size: [pitch, bodyWidth, bodyHeight],
5269
+ center: [0, 0, standoffHeight + bodyHeight / 2]
5270
+ }
5271
+ ),
5272
+ /* @__PURE__ */ jsxs65(Colorize38, { color: "#d4af37", children: [
5273
+ /* @__PURE__ */ jsx69(
5274
+ Cuboid46,
5275
+ {
5276
+ size: [pinThickness, tailLength, pinThickness],
5277
+ center: [0, tailDirection * (tailLength / 2), pinThickness / 2]
5278
+ }
5279
+ ),
5280
+ /* @__PURE__ */ jsx69(
5281
+ Cuboid46,
5282
+ {
5283
+ size: [pinThickness, pinThickness, verticalTailLength],
5284
+ center: [0, 0, pinThickness / 2 + verticalTailLength / 2]
5285
+ }
5286
+ ),
5287
+ /* @__PURE__ */ jsx69(
5288
+ Cuboid46,
5289
+ {
5290
+ size: [pinThickness, pinThickness, postBodyLength],
5291
+ center: [0, 0, bodyTop + postBodyLength / 2]
5292
+ }
5293
+ ),
5294
+ /* @__PURE__ */ jsxs65(Hull24, { children: [
5295
+ /* @__PURE__ */ jsx69(
5296
+ Cuboid46,
5297
+ {
5298
+ size: [pinThickness, pinThickness, 0.01],
5299
+ center: [0, 0, bodyTop + postBodyLength]
5300
+ }
5301
+ ),
5302
+ /* @__PURE__ */ jsx69(
5303
+ Cuboid46,
5304
+ {
5305
+ size: [pinThickness * 0.65, pinThickness * 0.65, 0.01],
5306
+ center: [0, 0, bodyTop + matingPinLength]
5307
+ }
5308
+ )
5309
+ ] })
5310
+ ] })
5311
+ ] }, index);
5312
+ }) });
5313
+ };
5314
+
4966
5315
  // lib/Footprinter3d.tsx
4967
- import { jsx as jsx68 } from "react/jsx-runtime";
5316
+ import { jsx as jsx70 } from "react/jsx-runtime";
4968
5317
  var Footprinter3d = ({ footprint }) => {
4969
5318
  let normalizedFootprint = footprint;
4970
5319
  if (footprint.startsWith("jstzh1_5mm")) {
@@ -4975,11 +5324,11 @@ var Footprinter3d = ({ footprint }) => {
4975
5324
  const fpJson = fp3.string(normalizedFootprint).json();
4976
5325
  switch (fpJson.fn) {
4977
5326
  case "dip":
4978
- return /* @__PURE__ */ jsx68(Dip, { numPins: fpJson.num_pins, pitch: fpJson.p, bodyWidth: fpJson.w });
5327
+ return /* @__PURE__ */ jsx70(Dip, { numPins: fpJson.num_pins, pitch: fpJson.p, bodyWidth: fpJson.w });
4979
5328
  case "axial":
4980
- return /* @__PURE__ */ jsx68(AxialCapacitor, { pitch: fpJson.p });
5329
+ return /* @__PURE__ */ jsx70(AxialCapacitor, { pitch: fpJson.p });
4981
5330
  case "tssop":
4982
- return /* @__PURE__ */ jsx68(
5331
+ return /* @__PURE__ */ jsx70(
4983
5332
  Tssop,
4984
5333
  {
4985
5334
  pinCount: fpJson.num_pins,
@@ -4990,7 +5339,7 @@ var Footprinter3d = ({ footprint }) => {
4990
5339
  }
4991
5340
  );
4992
5341
  case "msop":
4993
- return /* @__PURE__ */ jsx68(
5342
+ return /* @__PURE__ */ jsx70(
4994
5343
  MSOP,
4995
5344
  {
4996
5345
  pinCount: fpJson.num_pins,
@@ -5001,7 +5350,7 @@ var Footprinter3d = ({ footprint }) => {
5001
5350
  }
5002
5351
  );
5003
5352
  case "vssop":
5004
- return /* @__PURE__ */ jsx68(
5353
+ return /* @__PURE__ */ jsx70(
5005
5354
  VSSOP,
5006
5355
  {
5007
5356
  pinCount: fpJson.num_pins,
@@ -5013,7 +5362,7 @@ var Footprinter3d = ({ footprint }) => {
5013
5362
  }
5014
5363
  );
5015
5364
  case "qfp":
5016
- return /* @__PURE__ */ jsx68(
5365
+ return /* @__PURE__ */ jsx70(
5017
5366
  QFP,
5018
5367
  {
5019
5368
  pinCount: fpJson.num_pins,
@@ -5024,12 +5373,12 @@ var Footprinter3d = ({ footprint }) => {
5024
5373
  }
5025
5374
  );
5026
5375
  case "tqfp":
5027
- return /* @__PURE__ */ jsx68(tqfp_default, {});
5376
+ return /* @__PURE__ */ jsx70(tqfp_default, {});
5028
5377
  case "lqfp":
5029
- return /* @__PURE__ */ jsx68(LQFP, { pinCount: fpJson.num_pins });
5378
+ return /* @__PURE__ */ jsx70(LQFP, { pinCount: fpJson.num_pins });
5030
5379
  case "qfn": {
5031
5380
  const hasThermalPad = typeof fpJson.thermalpad?.x === "number" && typeof fpJson.thermalpad?.y === "number";
5032
- return /* @__PURE__ */ jsx68(
5381
+ return /* @__PURE__ */ jsx70(
5033
5382
  qfn_default,
5034
5383
  {
5035
5384
  num_pins: fpJson.num_pins,
@@ -5047,7 +5396,7 @@ var Footprinter3d = ({ footprint }) => {
5047
5396
  }
5048
5397
  case "dfn": {
5049
5398
  const hasThermalPad = typeof fpJson.thermalpad?.x === "number" && typeof fpJson.thermalpad?.y === "number";
5050
- return /* @__PURE__ */ jsx68(
5399
+ return /* @__PURE__ */ jsx70(
5051
5400
  DFN,
5052
5401
  {
5053
5402
  num_pins: fpJson.num_pins,
@@ -5067,7 +5416,7 @@ var Footprinter3d = ({ footprint }) => {
5067
5416
  const rowsMatch = footprint.match(/_rows(\d+)/);
5068
5417
  const rows = rowsMatch && rowsMatch[1] ? parseInt(rowsMatch[1], 10) : 1;
5069
5418
  if (fpJson.male)
5070
- return /* @__PURE__ */ jsx68(
5419
+ return /* @__PURE__ */ jsx70(
5071
5420
  PinRow,
5072
5421
  {
5073
5422
  numberOfPins: fpJson.num_pins,
@@ -5080,7 +5429,7 @@ var Footprinter3d = ({ footprint }) => {
5080
5429
  }
5081
5430
  );
5082
5431
  if (fpJson.female)
5083
- return /* @__PURE__ */ jsx68(
5432
+ return /* @__PURE__ */ jsx70(
5084
5433
  FemaleHeaderRow,
5085
5434
  {
5086
5435
  numberOfPins: fpJson.num_pins,
@@ -5089,50 +5438,59 @@ var Footprinter3d = ({ footprint }) => {
5089
5438
  }
5090
5439
  );
5091
5440
  }
5441
+ case "smdpinheader":
5442
+ return /* @__PURE__ */ jsx70(
5443
+ SmdPinHeader,
5444
+ {
5445
+ numberOfPins: fpJson.num_pins,
5446
+ pitch: fpJson.p,
5447
+ bodyWidth: fpJson.bh
5448
+ }
5449
+ );
5092
5450
  case "cap": {
5093
5451
  switch (fpJson.imperial) {
5094
5452
  case "0402":
5095
- return /* @__PURE__ */ jsx68(A0402, { color: "#856c4d" });
5453
+ return /* @__PURE__ */ jsx70(A0402, { color: "#856c4d" });
5096
5454
  case "0603":
5097
- return /* @__PURE__ */ jsx68(A0603, { color: "#856c4d" });
5455
+ return /* @__PURE__ */ jsx70(A0603, { color: "#856c4d" });
5098
5456
  case "0805":
5099
- return /* @__PURE__ */ jsx68(A0805, { color: "#856c4d" });
5457
+ return /* @__PURE__ */ jsx70(A0805, { color: "#856c4d" });
5100
5458
  case "0201":
5101
- return /* @__PURE__ */ jsx68(A0201, { color: "#856c4d" });
5459
+ return /* @__PURE__ */ jsx70(A0201, { color: "#856c4d" });
5102
5460
  case "01005":
5103
- return /* @__PURE__ */ jsx68(A01005, { color: "#856c4d" });
5461
+ return /* @__PURE__ */ jsx70(A01005, { color: "#856c4d" });
5104
5462
  case "1206":
5105
- return /* @__PURE__ */ jsx68(A1206, { color: "#856c4d" });
5463
+ return /* @__PURE__ */ jsx70(A1206, { color: "#856c4d" });
5106
5464
  case "1210":
5107
- return /* @__PURE__ */ jsx68(A1210, { color: "#856c4d" });
5465
+ return /* @__PURE__ */ jsx70(A1210, { color: "#856c4d" });
5108
5466
  case "2010":
5109
- return /* @__PURE__ */ jsx68(A2010, { color: "#856c4d" });
5467
+ return /* @__PURE__ */ jsx70(A2010, { color: "#856c4d" });
5110
5468
  case "2512":
5111
- return /* @__PURE__ */ jsx68(A2512, { color: "#856c4d" });
5469
+ return /* @__PURE__ */ jsx70(A2512, { color: "#856c4d" });
5112
5470
  }
5113
5471
  }
5114
5472
  case "sot235":
5115
- return /* @__PURE__ */ jsx68(SOT_235_default, {});
5473
+ return /* @__PURE__ */ jsx70(SOT_235_default, {});
5116
5474
  case "sot457":
5117
- return /* @__PURE__ */ jsx68(SOT457, {});
5475
+ return /* @__PURE__ */ jsx70(SOT457, {});
5118
5476
  case "sot223":
5119
- return /* @__PURE__ */ jsx68(SOT223, {});
5477
+ return /* @__PURE__ */ jsx70(SOT223, {});
5120
5478
  case "sot23w":
5121
- return /* @__PURE__ */ jsx68(SOT23W, {});
5479
+ return /* @__PURE__ */ jsx70(SOT23W, {});
5122
5480
  case "sot323":
5123
- return /* @__PURE__ */ jsx68(SOT323, {});
5481
+ return /* @__PURE__ */ jsx70(SOT323, {});
5124
5482
  case "sod323f":
5125
- return /* @__PURE__ */ jsx68(SOD323F, {});
5483
+ return /* @__PURE__ */ jsx70(SOD323F, {});
5126
5484
  case "sod323fl":
5127
- return /* @__PURE__ */ jsx68(SOD323FL, {});
5485
+ return /* @__PURE__ */ jsx70(SOD323FL, {});
5128
5486
  case "sot363":
5129
- return /* @__PURE__ */ jsx68(SOT_363_default, {});
5487
+ return /* @__PURE__ */ jsx70(SOT_363_default, {});
5130
5488
  case "sot886":
5131
- return /* @__PURE__ */ jsx68(SOT886, {});
5489
+ return /* @__PURE__ */ jsx70(SOT886, {});
5132
5490
  case "sot963":
5133
- return /* @__PURE__ */ jsx68(SOT963, {});
5491
+ return /* @__PURE__ */ jsx70(SOT963, {});
5134
5492
  case "pushbutton":
5135
- return /* @__PURE__ */ jsx68(
5493
+ return /* @__PURE__ */ jsx70(
5136
5494
  PushButton,
5137
5495
  {
5138
5496
  width: fpJson.w,
@@ -5142,11 +5500,31 @@ var Footprinter3d = ({ footprint }) => {
5142
5500
  );
5143
5501
  case "jst":
5144
5502
  if (fpJson.zh) {
5145
- return /* @__PURE__ */ jsx68(JSTZH1_5mm, { numPins: fpJson.num_pins });
5503
+ return /* @__PURE__ */ jsx70(JSTZH1_5mm, { numPins: fpJson.num_pins });
5146
5504
  }
5147
5505
  break;
5506
+ case "fpc":
5507
+ return /* @__PURE__ */ jsx70(
5508
+ FPC,
5509
+ {
5510
+ pinCount: fpJson.num_pins,
5511
+ pitch: fpJson.p,
5512
+ padWidth: fpJson.pw,
5513
+ padLength: fpJson.pl,
5514
+ staggered: fpJson.staggered,
5515
+ reverse: fpJson.reverse,
5516
+ rowPitch: fpJson.py,
5517
+ topPadLength: fpJson.toppl,
5518
+ bottomPadLength: fpJson.bottompl,
5519
+ mountPadPitchX: fpJson.mpx,
5520
+ mountPadOffsetY: fpJson.mpy,
5521
+ mountTop: fpJson.mounttop,
5522
+ mountPadWidth: fpJson.mpw,
5523
+ mountPadLength: fpJson.mpl
5524
+ }
5525
+ );
5148
5526
  case "soic":
5149
- return /* @__PURE__ */ jsx68(
5527
+ return /* @__PURE__ */ jsx70(
5150
5528
  SOIC,
5151
5529
  {
5152
5530
  pinCount: fpJson.num_pins,
@@ -5157,41 +5535,41 @@ var Footprinter3d = ({ footprint }) => {
5157
5535
  }
5158
5536
  );
5159
5537
  case "sod523":
5160
- return /* @__PURE__ */ jsx68(SOD523, {});
5538
+ return /* @__PURE__ */ jsx70(SOD523, {});
5161
5539
  case "sod723":
5162
- return /* @__PURE__ */ jsx68(SOD723_default, {});
5540
+ return /* @__PURE__ */ jsx70(SOD723_default, {});
5163
5541
  case "sod882":
5164
- return /* @__PURE__ */ jsx68(SOD882, {});
5542
+ return /* @__PURE__ */ jsx70(SOD882, {});
5165
5543
  case "sma":
5166
- return /* @__PURE__ */ jsx68(SMA, {});
5544
+ return /* @__PURE__ */ jsx70(SMA, {});
5167
5545
  case "smb":
5168
- return /* @__PURE__ */ jsx68(SMB, {});
5546
+ return /* @__PURE__ */ jsx70(SMB, {});
5169
5547
  case "smc":
5170
- return /* @__PURE__ */ jsx68(SMC, {});
5548
+ return /* @__PURE__ */ jsx70(SMC, {});
5171
5549
  case "smf":
5172
- return /* @__PURE__ */ jsx68(SMF, {});
5550
+ return /* @__PURE__ */ jsx70(SMF, {});
5173
5551
  case "sod123f":
5174
- return /* @__PURE__ */ jsx68(SOD123F, {});
5552
+ return /* @__PURE__ */ jsx70(SOD123F, {});
5175
5553
  case "sod123fl":
5176
- return /* @__PURE__ */ jsx68(SOD123FL, {});
5554
+ return /* @__PURE__ */ jsx70(SOD123FL, {});
5177
5555
  case "sod123w":
5178
- return /* @__PURE__ */ jsx68(SOD123W, {});
5556
+ return /* @__PURE__ */ jsx70(SOD123W, {});
5179
5557
  case "sod128":
5180
- return /* @__PURE__ */ jsx68(SOD128, {});
5558
+ return /* @__PURE__ */ jsx70(SOD128, {});
5181
5559
  case "sod323":
5182
- return /* @__PURE__ */ jsx68(SOD323, {});
5560
+ return /* @__PURE__ */ jsx70(SOD323, {});
5183
5561
  case "sod923":
5184
- return /* @__PURE__ */ jsx68(SOD923, {});
5562
+ return /* @__PURE__ */ jsx70(SOD923, {});
5185
5563
  case "hc49":
5186
- return /* @__PURE__ */ jsx68(HC49, {});
5564
+ return /* @__PURE__ */ jsx70(HC49, {});
5187
5565
  case "micromelf":
5188
- return /* @__PURE__ */ jsx68(MicroMELF, {});
5566
+ return /* @__PURE__ */ jsx70(MicroMELF, {});
5189
5567
  case "minimelf":
5190
- return /* @__PURE__ */ jsx68(MINIMELF, {});
5568
+ return /* @__PURE__ */ jsx70(MINIMELF, {});
5191
5569
  case "melf":
5192
- return /* @__PURE__ */ jsx68(MELF, {});
5570
+ return /* @__PURE__ */ jsx70(MELF, {});
5193
5571
  case "ms012":
5194
- return /* @__PURE__ */ jsx68(
5572
+ return /* @__PURE__ */ jsx70(
5195
5573
  MS012,
5196
5574
  {
5197
5575
  pinCount: fpJson.num_pins,
@@ -5201,7 +5579,7 @@ var Footprinter3d = ({ footprint }) => {
5201
5579
  }
5202
5580
  );
5203
5581
  case "ms013":
5204
- return /* @__PURE__ */ jsx68(
5582
+ return /* @__PURE__ */ jsx70(
5205
5583
  MS013,
5206
5584
  {
5207
5585
  pinCount: fpJson.num_pins,
@@ -5211,14 +5589,14 @@ var Footprinter3d = ({ footprint }) => {
5211
5589
  }
5212
5590
  );
5213
5591
  case "sot723":
5214
- return /* @__PURE__ */ jsx68(SOT723, {});
5592
+ return /* @__PURE__ */ jsx70(SOT723, {});
5215
5593
  case "to220":
5216
- return /* @__PURE__ */ jsx68(TO220, {});
5594
+ return /* @__PURE__ */ jsx70(TO220, {});
5217
5595
  case "to92":
5218
- return /* @__PURE__ */ jsx68(TO92, {});
5596
+ return /* @__PURE__ */ jsx70(TO92, {});
5219
5597
  case "stampboard":
5220
5598
  case "stampreceiver":
5221
- return /* @__PURE__ */ jsx68(
5599
+ return /* @__PURE__ */ jsx70(
5222
5600
  StampBoard,
5223
5601
  {
5224
5602
  bodyWidth: fpJson.w,
@@ -5242,7 +5620,7 @@ var Footprinter3d = ({ footprint }) => {
5242
5620
  const pinRow = fpJson.pinrow;
5243
5621
  const pinRowHoleEdgeToEdgeDist = fpJson.pinRowHoleEdgeToEdgeDist;
5244
5622
  const holes = Array.isArray(fpJson.holes) ? fpJson.holes : [];
5245
- return /* @__PURE__ */ jsx68(
5623
+ return /* @__PURE__ */ jsx70(
5246
5624
  MountedPcbModule,
5247
5625
  {
5248
5626
  numPins: pinRow,
@@ -5271,29 +5649,29 @@ var Footprinter3d = ({ footprint }) => {
5271
5649
  const color = colorMatch ? colorMatch[1] : void 0;
5272
5650
  switch (fpJson.imperial) {
5273
5651
  case "0402":
5274
- return /* @__PURE__ */ jsx68(A0402, { color });
5652
+ return /* @__PURE__ */ jsx70(A0402, { color });
5275
5653
  case "0603":
5276
- return /* @__PURE__ */ jsx68(A0603, { color });
5654
+ return /* @__PURE__ */ jsx70(A0603, { color });
5277
5655
  case "0805":
5278
- return /* @__PURE__ */ jsx68(A0805, { color });
5656
+ return /* @__PURE__ */ jsx70(A0805, { color });
5279
5657
  case "0201":
5280
- return /* @__PURE__ */ jsx68(A0201, { color });
5658
+ return /* @__PURE__ */ jsx70(A0201, { color });
5281
5659
  case "01005":
5282
- return /* @__PURE__ */ jsx68(A01005, { color });
5660
+ return /* @__PURE__ */ jsx70(A01005, { color });
5283
5661
  case "1206":
5284
- return /* @__PURE__ */ jsx68(A1206, { color });
5662
+ return /* @__PURE__ */ jsx70(A1206, { color });
5285
5663
  case "1210":
5286
- return /* @__PURE__ */ jsx68(A1210, { color });
5664
+ return /* @__PURE__ */ jsx70(A1210, { color });
5287
5665
  case "2010":
5288
- return /* @__PURE__ */ jsx68(A2010, { color });
5666
+ return /* @__PURE__ */ jsx70(A2010, { color });
5289
5667
  case "2512":
5290
- return /* @__PURE__ */ jsx68(A2512, { color });
5668
+ return /* @__PURE__ */ jsx70(A2512, { color });
5291
5669
  }
5292
5670
  return null;
5293
5671
  };
5294
5672
 
5295
5673
  // lib/SOT-23-3P.tsx
5296
- import { Fragment as Fragment62, jsx as jsx69, jsxs as jsxs64 } from "react/jsx-runtime";
5674
+ import { Fragment as Fragment64, jsx as jsx71, jsxs as jsxs66 } from "react/jsx-runtime";
5297
5675
  var SOT233P = ({ fullWidth = 2.9, fullLength: fullLength10 = 2.8 }) => {
5298
5676
  const bodyWidth = 1.3;
5299
5677
  const bodyLength10 = 2.9;
@@ -5304,8 +5682,8 @@ var SOT233P = ({ fullWidth = 2.9, fullLength: fullLength10 = 2.8 }) => {
5304
5682
  const padContactLength = 0.4;
5305
5683
  const padThickness = leadThickness / 2;
5306
5684
  const extendedBodyDistance = (fullWidth - bodyWidth) / 2 + 0.3;
5307
- return /* @__PURE__ */ jsxs64(Fragment62, { children: [
5308
- /* @__PURE__ */ jsx69(
5685
+ return /* @__PURE__ */ jsxs66(Fragment64, { children: [
5686
+ /* @__PURE__ */ jsx71(
5309
5687
  SmdChipLead,
5310
5688
  {
5311
5689
  rotation: Math.PI,
@@ -5322,7 +5700,7 @@ var SOT233P = ({ fullWidth = 2.9, fullLength: fullLength10 = 2.8 }) => {
5322
5700
  },
5323
5701
  1
5324
5702
  ),
5325
- /* @__PURE__ */ jsx69(
5703
+ /* @__PURE__ */ jsx71(
5326
5704
  SmdChipLead,
5327
5705
  {
5328
5706
  rotation: Math.PI,
@@ -5339,7 +5717,7 @@ var SOT233P = ({ fullWidth = 2.9, fullLength: fullLength10 = 2.8 }) => {
5339
5717
  },
5340
5718
  2
5341
5719
  ),
5342
- /* @__PURE__ */ jsx69(
5720
+ /* @__PURE__ */ jsx71(
5343
5721
  SmdChipLead,
5344
5722
  {
5345
5723
  position: {
@@ -5355,7 +5733,7 @@ var SOT233P = ({ fullWidth = 2.9, fullLength: fullLength10 = 2.8 }) => {
5355
5733
  },
5356
5734
  3
5357
5735
  ),
5358
- /* @__PURE__ */ jsx69(
5736
+ /* @__PURE__ */ jsx71(
5359
5737
  ChipBody,
5360
5738
  {
5361
5739
  center: { x: 0, y: 0, z: 0 },
@@ -5368,8 +5746,8 @@ var SOT233P = ({ fullWidth = 2.9, fullLength: fullLength10 = 2.8 }) => {
5368
5746
  };
5369
5747
 
5370
5748
  // lib/SOT-563.tsx
5371
- import { Cuboid as Cuboid45, Translate as Translate31, Rotate as Rotate13, Colorize as Colorize37 } from "jscad-fiber";
5372
- import { Fragment as Fragment63, jsx as jsx70, jsxs as jsxs65 } from "react/jsx-runtime";
5749
+ import { Cuboid as Cuboid47, Translate as Translate33, Rotate as Rotate14, Colorize as Colorize39 } from "jscad-fiber";
5750
+ import { Fragment as Fragment65, jsx as jsx72, jsxs as jsxs67 } from "react/jsx-runtime";
5373
5751
  var SOT563 = ({ fullWidth = 1.94, fullLength: fullLength10 = 1.6 }) => {
5374
5752
  const bodyWidth = 1.2;
5375
5753
  const bodyLength10 = 1.6;
@@ -5379,28 +5757,28 @@ var SOT563 = ({ fullWidth = 1.94, fullLength: fullLength10 = 1.6 }) => {
5379
5757
  const leadHeight = 0.13;
5380
5758
  const leadSpacing = 0.5;
5381
5759
  const bodyZOffset = -0.4;
5382
- return /* @__PURE__ */ jsxs65(Fragment63, { children: [
5383
- /* @__PURE__ */ jsx70(Rotate13, { rotation: [45 * Math.PI, 0, 0], children: /* @__PURE__ */ jsx70(Translate31, { center: [0, 0, bodyZOffset], children: /* @__PURE__ */ jsx70(Colorize37, { color: "grey", children: /* @__PURE__ */ jsx70(Cuboid45, { size: [bodyWidth, bodyLength10, bodyHeight] }) }) }) }),
5760
+ return /* @__PURE__ */ jsxs67(Fragment65, { children: [
5761
+ /* @__PURE__ */ jsx72(Rotate14, { rotation: [45 * Math.PI, 0, 0], children: /* @__PURE__ */ jsx72(Translate33, { center: [0, 0, bodyZOffset], children: /* @__PURE__ */ jsx72(Colorize39, { color: "grey", children: /* @__PURE__ */ jsx72(Cuboid47, { size: [bodyWidth, bodyLength10, bodyHeight] }) }) }) }),
5384
5762
  [-1, 0, 1].flatMap((yOffset, index) => [
5385
5763
  // Left lead
5386
- /* @__PURE__ */ jsx70(
5387
- Translate31,
5764
+ /* @__PURE__ */ jsx72(
5765
+ Translate33,
5388
5766
  {
5389
5767
  center: [
5390
5768
  -bodyWidth / 2 - 0.03,
5391
5769
  yOffset * leadSpacing,
5392
5770
  leadHeight / 2
5393
5771
  ],
5394
- children: /* @__PURE__ */ jsx70(Cuboid45, { size: [leadLength, leadWidth, leadHeight] })
5772
+ children: /* @__PURE__ */ jsx72(Cuboid47, { size: [leadLength, leadWidth, leadHeight] })
5395
5773
  },
5396
5774
  `left-${index}`
5397
5775
  ),
5398
5776
  // Right lead
5399
- /* @__PURE__ */ jsx70(
5400
- Translate31,
5777
+ /* @__PURE__ */ jsx72(
5778
+ Translate33,
5401
5779
  {
5402
5780
  center: [bodyWidth / 2 + 0.03, yOffset * leadSpacing, leadHeight / 2],
5403
- children: /* @__PURE__ */ jsx70(Cuboid45, { size: [leadLength, leadWidth, leadHeight] })
5781
+ children: /* @__PURE__ */ jsx72(Cuboid47, { size: [leadLength, leadWidth, leadHeight] })
5404
5782
  },
5405
5783
  `right-${index}`
5406
5784
  )
@@ -5409,7 +5787,7 @@ var SOT563 = ({ fullWidth = 1.94, fullLength: fullLength10 = 1.6 }) => {
5409
5787
  };
5410
5788
 
5411
5789
  // lib/sod-123.tsx
5412
- import { Fragment as Fragment64, jsx as jsx71, jsxs as jsxs66 } from "react/jsx-runtime";
5790
+ import { Fragment as Fragment66, jsx as jsx73, jsxs as jsxs68 } from "react/jsx-runtime";
5413
5791
  var SOD123 = ({ fullWidth = 3.8, fullLength: fullLength10 = 1.6 }) => {
5414
5792
  const bodyWidth = 2.9;
5415
5793
  const bodyLength10 = 1.3;
@@ -5420,8 +5798,8 @@ var SOD123 = ({ fullWidth = 3.8, fullLength: fullLength10 = 1.6 }) => {
5420
5798
  const padContactLength = 0.4;
5421
5799
  const padThickness = leadThickness / 2;
5422
5800
  const bodyDistance = (fullWidth - bodyWidth) / 2;
5423
- return /* @__PURE__ */ jsxs66(Fragment64, { children: [
5424
- /* @__PURE__ */ jsx71(
5801
+ return /* @__PURE__ */ jsxs68(Fragment66, { children: [
5802
+ /* @__PURE__ */ jsx73(
5425
5803
  SmdChipLead,
5426
5804
  {
5427
5805
  position: {
@@ -5437,7 +5815,7 @@ var SOD123 = ({ fullWidth = 3.8, fullLength: fullLength10 = 1.6 }) => {
5437
5815
  },
5438
5816
  1
5439
5817
  ),
5440
- /* @__PURE__ */ jsx71(
5818
+ /* @__PURE__ */ jsx73(
5441
5819
  SmdChipLead,
5442
5820
  {
5443
5821
  rotation: Math.PI,
@@ -5454,7 +5832,7 @@ var SOD123 = ({ fullWidth = 3.8, fullLength: fullLength10 = 1.6 }) => {
5454
5832
  },
5455
5833
  2
5456
5834
  ),
5457
- /* @__PURE__ */ jsx71(
5835
+ /* @__PURE__ */ jsx73(
5458
5836
  ChipBody,
5459
5837
  {
5460
5838
  center: { x: 0, y: 0, z: 0 },
@@ -5481,6 +5859,7 @@ export {
5481
5859
  DFN,
5482
5860
  Display,
5483
5861
  ExtrudedPads,
5862
+ FPC,
5484
5863
  FemaleHeader,
5485
5864
  FemaleHeaderRow,
5486
5865
  FootprintPad,
@@ -5528,6 +5907,7 @@ export {
5528
5907
  SOT963,
5529
5908
  Screen,
5530
5909
  SmdChipLead,
5910
+ SmdPinHeader,
5531
5911
  StampBoard,
5532
5912
  TO220,
5533
5913
  TO92,