jscad-electronics 0.0.216 → 0.0.217

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../lib/materials.ts","../lib/A01005.tsx","../lib/A0201.tsx","../lib/A0402.tsx","../lib/A0603.tsx","../lib/A0805.tsx","../lib/A1206.tsx","../lib/A1210.tsx","../lib/A2010.tsx","../lib/A2512.tsx","../lib/BGA.tsx","../lib/LGA.tsx","../lib/ChipBody.tsx","../lib/Crystal.tsx","../lib/ExtrudedPads.tsx","../lib/FootprintPad.tsx","../lib/FootprintPlatedHole.tsx","../lib/models/ballbearing/register.tsx","../lib/model-registry.ts","../lib/models/ballbearing/BallBearing.tsx","../lib/mechanical/indexedMeshToGeom3.ts","../lib/models/ballbearing/mesh.ts","../lib/models/balltransferunit/register.tsx","../lib/models/balltransferunit/BallTransferUnit.tsx","../lib/models/balltransferunit/mesh.ts","../lib/mechanical/extrude-planar-profile.ts","../lib/models/buttonscrew/register.tsx","../lib/models/buttonscrew/ButtonScrew.tsx","../lib/models/buttonscrew/mesh.ts","../lib/models/cablegrommet/register.tsx","../lib/models/cablegrommet/CableGrommet.tsx","../lib/models/cablegrommet/mesh.ts","../lib/models/clampingshaftcollar/register.tsx","../lib/models/clampingshaftcollar/ClampingShaftCollar.tsx","../lib/models/clampingshaftcollar/mesh.ts","../lib/mechanical/shaft-mount-geometry.ts","../lib/models/compressionspring/register.tsx","../lib/models/compressionspring/CompressionSpring.tsx","../lib/models/compressionspring/mesh.ts","../lib/mechanical/clip-mesh-to-z-range.ts","../lib/models/flangedbushing/register.tsx","../lib/models/flangedbushing/FlangedBushing.tsx","../lib/models/flangedbushing/mesh.ts","../lib/models/flatheadscrew/register.tsx","../lib/models/flatheadscrew/FlatHeadScrew.tsx","../lib/models/flatheadscrew/mesh.ts","../lib/models/flexscreen/register.tsx","../lib/FlexScreen.tsx","../lib/Screen.tsx","../lib/models/helicalgear/register.tsx","../lib/HelicalGear.tsx","../lib/mechanical/helical-gear-mesh.ts","../lib/mechanical/spur-gear-mesh.ts","../lib/models/hexbolt/register.tsx","../lib/models/hexbolt/HexBolt.tsx","../lib/models/hexbolt/mesh.ts","../lib/models/hexnut/register.tsx","../lib/models/hexnut/HexNut.tsx","../lib/models/hexnut/mesh.ts","../lib/models/hexsocketbolt/register.tsx","../lib/HexSocketBolt.tsx","../lib/mechanical/hex-socket-bolt-mesh.ts","../lib/models/hollowpositioningarmtube/register.tsx","../lib/models/hollowpositioningarmtube/HollowPositioningArmTube.tsx","../lib/models/hollowpositioningarmtube/mesh.ts","../lib/models/nema/register.tsx","../lib/NemaMotor.tsx","../lib/utils/nemaMotorWireGeometry.ts","../lib/utils/nemaMotorParameters.ts","../lib/utils/nemaMotorGeometry.ts","../lib/models/panscrew/register.tsx","../lib/models/panscrew/PanScrew.tsx","../lib/models/panscrew/mesh.ts","../lib/models/plainbushing/register.tsx","../lib/models/plainbushing/PlainBushing.tsx","../lib/models/plainbushing/mesh.ts","../lib/models/rigidcoupler/register.tsx","../lib/models/rigidcoupler/RigidCoupler.tsx","../lib/models/rigidcoupler/mesh.ts","../lib/models/shaftcollar/register.tsx","../lib/models/shaftcollar/ShaftCollar.tsx","../lib/models/shaftcollar/mesh.ts","../lib/models/sheetmetal/register.tsx","../lib/SheetMetal.tsx","../lib/mechanical/sheet-metal-mesh.ts","../lib/models/spurgear/register.tsx","../lib/SpurGear.tsx","../lib/models/threadedrod/register.tsx","../lib/models/threadedrod/ThreadedRod.tsx","../lib/models/threadedrod/mesh.ts","../lib/models/torsionspring/register.tsx","../lib/models/torsionspring/TorsionSpring.tsx","../lib/models/torsionspring/mesh.ts","../lib/models/tslotextrusion/register.tsx","../lib/models/tslotextrusion/TSlotExtrusion.tsx","../lib/models/tslotextrusion/mesh.ts","../lib/models/tslotgusset/register.tsx","../lib/models/tslotgusset/TSlotGusset.tsx","../lib/models/tslotgusset/mesh.ts","../lib/models/tslotinsidecorner/register.tsx","../lib/models/tslotinsidecorner/TSlotInsideCorner.tsx","../lib/models/tslotinsidecorner/mesh.ts","../lib/models/wormgear/register.tsx","../lib/WormGear.tsx","../lib/mechanical/worm-gear-mesh.ts","../lib/generated/model-renderers.ts","../lib/default-model-registry.ts","../lib/utils/DualRowGullWing.tsx","../lib/SSOP.tsx","../lib/utils/FootprinterBodyModels.tsx","../lib/Footprinter3d.tsx","../lib/DualInlinePackage.tsx","../lib/utils/range.ts","../lib/utils/getExpandedStroke.ts","../lib/SmdChipLead.tsx","../lib/Tssop.tsx","../lib/MSOP.tsx","../lib/SmdLED.tsx","../lib/qfp.tsx","../lib/PinHeader.tsx","../lib/PinRow.tsx","../lib/utils/PhysicalQfn.tsx","../lib/qfn.tsx","../lib/utils/getQuadCoords.ts","../lib/utils/getQuadPinMap.ts","../lib/SOT-235.tsx","../lib/SOT-23-3P.tsx","../lib/SOT-23W.tsx","../lib/FemaleHeader.tsx","../lib/FemaleHeaderRow.tsx","../lib/PushButton.tsx","../lib/SOIC.tsx","../lib/VSSOP.tsx","../lib/SOD523.tsx","../lib/SOD882.tsx","../lib/SMA.tsx","../lib/SMB.tsx","../lib/SMC.tsx","../lib/SMF.tsx","../lib/sod-123F.tsx","../lib/sod-123FL.tsx","../lib/sod-123W.tsx","../lib/sod-123.tsx","../lib/sod-128.tsx","../lib/SOD-923.tsx","../lib/SOT-223.tsx","../lib/tqfp.tsx","../lib/SOT-323.tsx","../lib/utils/PhysicalLqfp.tsx","../lib/lqfp.tsx","../lib/SOT-723.tsx","../lib/dfn.tsx","../lib/hc49.tsx","../lib/MicroMELF.tsx","../lib/MINIMELF.tsx","../lib/MELF.tsx","../lib/ms012.tsx","../lib/ms013.tsx","../lib/TO220.tsx","../lib/SOT-457.tsx","../lib/SOT-963.tsx","../lib/TO92.tsx","../lib/SOT-363.tsx","../lib/SOT-886.tsx","../lib/sod-323.tsx","../lib/sod-323F.tsx","../lib/sod-323FL.tsx","../lib/AxialCapacitor.tsx","../lib/stampboard.tsx","../lib/MountedPcbModule.tsx","../lib/SOD723.tsx","../lib/JSTZH1_5mm.tsx","../lib/JSTPH2_0mm.tsx","../lib/JSTXH2_5mm.tsx","../lib/JstSh.tsx","../lib/FPC.tsx","../lib/SmdPinHeader.tsx","../lib/utils/getPlatedHoleCenters.ts","../lib/utils/getSmtPadRects.ts","../lib/GullWingBody.tsx","../lib/ParametricChip.tsx","../lib/Led5050.tsx","../lib/Led2835.tsx","../lib/RJ45.tsx","../lib/DPAK.tsx","../lib/ElectrolyticCapacitor.tsx","../lib/Potentiometer.tsx","../lib/SmdPushButton.tsx","../lib/SmdSlideSwitch.tsx","../lib/SOT-563.tsx","../lib/UsbCMidmount.tsx","../lib/SOT143.tsx","../lib/utils/FlatLeadDiode.tsx","../lib/DO219AD.tsx","../lib/SOD323HE.tsx","../lib/SOT89.tsx","../lib/TO277.tsx","../lib/TantalumCapacitor.tsx","../lib/TwoPadCrystal.tsx","../lib/CeramicChipAntenna.tsx","../lib/MelfResistor.tsx"],"sourcesContent":["/** Approximate visual finishes, not measured optical properties. */\nexport const componentMaterials = {\n moldedPlastic: { metalness: 0, roughness: 0.7 },\n rubber: { metalness: 0, roughness: 0.9 },\n sleeve: { metalness: 0, roughness: 0.45 },\n tinnedLead: { metalness: 0.8, roughness: 0.55 },\n goldContact: { metalness: 1, roughness: 0.25 },\n copper: { metalness: 1, roughness: 0.35 },\n brushedMetal: { metalness: 1, roughness: 0.4 },\n steel: { metalness: 1, roughness: 0.25 },\n} as const\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 0.4 // 0.4mm length\nconst width = 0.2 // 0.2mm width\nconst height = 0.13 // 0.13mm height\nconst terminatorWidth = 0.07\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A01005 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 0.6\nconst width = 0.3\nconst height = 0.33\nconst terminatorWidth = 0.1\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A0201 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 1.0\nconst width = 0.5\nconst height = 0.5\nconst terminatorWidth = 0.2\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A0402 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cube, Cuboid, Translate, Union } from \"jscad-fiber\"\n\n// TERMINATORS are the two gray metal boxes on the ends of the resistor\n// BODY is the black box middle part\n\nconst fullLength = 1.6\nconst bodyLength = fullLength - 0.3 * 2\nconst terminatorLength = 0.3\nconst width = 0.85\nconst height = 0.6\n\nexport const A0603 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorLength, width, height]}\n offset={[fullLength / 2 - terminatorLength / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorLength, width, height]}\n offset={[-fullLength / 2 + terminatorLength / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 2.0\nconst width = 1.25\nconst height = 0.55\nconst terminatorWidth = 0.5\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A0805 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 3.2\nconst width = 1.6\nconst height = 0.9\nconst terminatorWidth = 0.5\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A1206 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 3.2\nconst width = 2.5\nconst height = 1\nconst terminatorWidth = 0.6\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A1210 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 5.0\nconst width = 2.5\nconst height = 1.4\nconst terminatorWidth = 0.6\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A2010 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 6.3\nconst width = 3.2\nconst height = 1.8\nconst terminatorWidth = 0.8\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A2512 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { Cuboid, Sphere, Translate, Colorize, Rotate } from \"jscad-fiber\"\nimport { fp } from \"@tscircuit/footprinter\"\n\ninterface BGAProps {\n packageWidth?: number\n packageLength?: number\n packageHeight?: number\n standoffHeight?: number\n ballPitch?: number\n ballDiameter?: number\n ballRows?: number\n ballColumns?: number\n missingBalls?: number[]\n footprintString?: string\n}\n\nexport const BGA = ({\n packageWidth = 10,\n packageLength = 10,\n packageHeight = 1.2,\n standoffHeight = 0.2,\n ballPitch = 0.8,\n ballDiameter = 0.5,\n ballRows = 8,\n ballColumns = 8,\n missingBalls = [],\n footprintString,\n}: BGAProps) => {\n const bodyHeight = packageHeight - standoffHeight\n const bodyOffset = standoffHeight + bodyHeight / 2\n // The balls sit IN the standoff gap, between the board and the package.\n // This used to be -standoffHeight / 2, which centres them BELOW z = 0: every\n // ball hung through the board, which an underside view shows immediately.\n // Clamped to the ball radius so a ball larger than the gap still rests on\n // the board rather than sinking into it.\n const ballOffset = Math.max(standoffHeight / 2, ballDiameter / 2)\n\n const ballsSoup = footprintString\n ? fp.string(footprintString).circuitJson()\n : null\n\n return (\n <>\n {/* Package body */}\n <Translate z={bodyOffset}>\n <Colorize color=\"#555\">\n <Cuboid size={[packageWidth, packageLength, bodyHeight]} />\n </Colorize>\n </Translate>\n\n {/* Balls via ball parameters */}\n {!footprintString &&\n Array.from({ length: ballRows * ballColumns }).map((_, index) => {\n if (missingBalls.includes(index + 1)) return null\n const row = Math.floor(index / ballColumns)\n const col = index % ballColumns\n const x = (col - (ballColumns - 1) / 2) * ballPitch\n const y = (row - (ballRows - 1) / 2) * ballPitch\n return (\n <Translate key={index} x={x} y={y} z={ballOffset}>\n <Sphere radius={ballDiameter / 2} />\n </Translate>\n )\n })}\n\n {/* Balls via footprint string */}\n {ballsSoup &&\n ballsSoup.map((elm, index) => {\n if (elm.type === \"pcb_smtpad\") {\n return (\n <Translate\n key={index}\n x={(elm as any).x}\n y={(elm as any).y}\n z={ballOffset}\n >\n <Sphere radius={ballDiameter / 2} />\n </Translate>\n )\n }\n return null\n })}\n </>\n )\n}\n","import { Colorize, Cuboid, Translate, Cylinder, Subtract } from \"jscad-fiber\"\n/** Molded perimeter-land LGA. Opposite rows have equal counts; adjacent rows\n * may differ. Pads remain entirely under the body, with no QFN exposed pad.\n * X crosses the left/right rows. Pin 1 is at -X,+Y; dimensions are in mm.\n * This models the external envelope, not sensor-specific lids or apertures.\n */\nexport interface LGAProps {\n bodyWidth: number\n bodyLength: number\n bodyHeight: number\n landsPerSideX: number\n landsPerSideY: number\n pitch: number\n landWidth: number\n landLength: number\n /** Distance from the body edge to the outer edge of each land. */\n edgeInset: number\n /** Representative metallization thickness, not solder standoff. */\n landThickness: number\n}\nexport function LGA(p: LGAProps) {\n for (const k of [\n \"bodyWidth\",\n \"bodyLength\",\n \"bodyHeight\",\n \"pitch\",\n \"landWidth\",\n \"landLength\",\n \"landThickness\",\n ] as const)\n if (!Number.isFinite(p[k]) || p[k] <= 0)\n throw new Error(`${k} must be finite and positive`)\n for (const k of [\"landsPerSideX\", \"landsPerSideY\"] as const)\n if (!Number.isInteger(p[k]) || p[k] < 0)\n throw new Error(`${k} must be a nonnegative integer`)\n if (\n !Number.isFinite(p.edgeInset) ||\n p.edgeInset < 0 ||\n p.landThickness >= p.bodyHeight ||\n p.landWidth >= p.pitch ||\n p.landsPerSideX + p.landsPerSideY < 1\n )\n throw new Error(\"Invalid land layout or thickness\")\n const layouts = [\n {\n count: p.landsPerSideX,\n across: p.bodyWidth,\n along: p.bodyLength,\n horizontal: true,\n },\n {\n count: p.landsPerSideY,\n across: p.bodyLength,\n along: p.bodyWidth,\n horizontal: false,\n },\n ]\n for (const l of layouts) {\n if (l.count === 0) continue\n const row = (l.count - 1) * p.pitch + p.landWidth\n if (\n row >= l.along - 2 * p.edgeInset ||\n 2 * (p.edgeInset + p.landLength) >= l.across\n )\n throw new Error(\n \"Lands must fit below the body without opposite-row overlap\",\n )\n const other = l.horizontal ? p.landsPerSideY : p.landsPerSideX\n if (\n other > 0 &&\n row >= l.along - 2 * (p.edgeInset + p.landLength) &&\n (other - 1) * p.pitch + p.landWidth >=\n l.across - 2 * (p.edgeInset + p.landLength)\n )\n throw new Error(\"Adjacent land rows overlap at corners\")\n }\n const r = Math.min(p.bodyWidth, p.bodyLength) * 0.035\n return (\n <>\n <Colorize color=\"#353535\">\n <Subtract>\n <Translate z={(p.bodyHeight + p.landThickness / 2) / 2}>\n <Cuboid\n size={[\n p.bodyWidth,\n p.bodyLength,\n p.bodyHeight - p.landThickness / 2,\n ]}\n />\n </Translate>\n <Translate\n offset={[\n -p.bodyWidth / 2 + 2 * r,\n p.bodyLength / 2 - 2 * r,\n p.bodyHeight,\n ]}\n >\n <Cylinder radius={r} height={Math.min(0.04, p.bodyHeight / 10)} />\n </Translate>\n </Subtract>\n </Colorize>\n <Colorize color=\"#c5b987\">\n {layouts.flatMap((l) =>\n [-1, 1].flatMap((sign) =>\n Array.from({ length: l.count }, (_, i) => {\n const across =\n sign * (l.across / 2 - p.edgeInset - p.landLength / 2),\n along = ((l.count - 1) / 2 - i) * p.pitch\n return (\n <Translate\n key={`${l.horizontal}-${sign}-${i}`}\n offset={[\n l.horizontal ? across : along,\n l.horizontal ? along : across,\n p.landThickness / 2,\n ]}\n >\n <Cuboid\n size={\n l.horizontal\n ? [p.landLength, p.landWidth, p.landThickness]\n : [p.landWidth, p.landLength, p.landThickness]\n }\n />\n </Translate>\n )\n }),\n ),\n )}\n </Colorize>\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport {\n Colorize,\n Cuboid,\n Cylinder,\n Hull,\n Rotate,\n Subtract,\n Translate,\n Union,\n} from \"jscad-fiber\"\nexport interface ChipBodyProps {\n width: number\n length: number\n height: number\n heightAboveSurface?: number\n center: { x: number; y: number; z: number }\n color?: string\n taperRatio?: number\n faceRatio?: number\n straightHeightRatio?: number\n includeNotch?: boolean\n notchRadius?: number\n notchPosition?: { x: number; y: number; z: number }\n notchRotation?: [number, number, number]\n notchLength?: number\n notchWidth?: number\n chamferSize?: number\n}\n\nexport const ChipBody = ({\n center,\n width,\n length,\n height,\n heightAboveSurface = 0.15,\n color = \"#555\",\n taperRatio = 0.12,\n faceRatio = 0.75,\n straightHeightRatio = 0.5,\n includeNotch = true,\n notchRadius,\n notchPosition,\n notchRotation = [0, 0, 0],\n notchLength = 0.5,\n notchWidth = 0.25,\n chamferSize = 0,\n}: ChipBodyProps) => {\n const straightHeight = height * straightHeightRatio\n const taperHeight = height - straightHeight\n const taperInset = Math.min(width, length) * taperRatio\n const faceWidth = Math.max(width - taperInset, width * faceRatio)\n const faceLength = Math.max(length - taperInset, length * faceRatio)\n const defaultNotchRadius = Math.min(width, length) * 0.12\n const actualNotchRadius = notchRadius ?? defaultNotchRadius\n const defaultNotchPosition = {\n x: 0,\n y: length / 2 - actualNotchRadius * 0.25,\n z: height,\n }\n const actualNotchPosition = notchPosition ?? defaultNotchPosition\n const body = (\n <Union>\n <Hull>\n <Translate z={0.005}>\n <Cuboid size={[faceWidth, faceLength, 0.01]} />\n </Translate>\n <Translate z={straightHeight}>\n <Cuboid size={[width, length, 0.01]} />\n </Translate>\n </Hull>\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[width, length, 0.01]} />\n </Translate>\n <Translate z={straightHeight + taperHeight}>\n <Cuboid size={[faceWidth, faceLength, 0.01]} />\n </Translate>\n </Hull>\n </Union>\n )\n\n // TODO the bodies flex a bit outward IRL\n\n const chamferCutout = (xPos: number, yPos: number) => (\n <Translate offset={{ x: xPos, y: yPos, z: 0 }}>\n <Rotate rotation={[0, 0, Math.PI / 4]}>\n <Cuboid\n size={[\n chamferSize * Math.SQRT2,\n chamferSize * Math.SQRT2,\n height * 3,\n ]}\n />\n </Rotate>\n </Translate>\n )\n\n let finalBody = body\n\n if (chamferSize > 0) {\n const xOffset = width / 2\n const yOffset = length / 2\n finalBody = (\n <Subtract>\n {body}\n {chamferCutout(xOffset, yOffset)}\n {chamferCutout(-xOffset, yOffset)}\n {chamferCutout(xOffset, -yOffset)}\n {chamferCutout(-xOffset, -yOffset)}\n </Subtract>\n )\n }\n\n return (\n <Colorize color={color} material={componentMaterials.moldedPlastic}>\n <Translate offset={center}>\n <Translate offset={{ x: 0, y: 0, z: heightAboveSurface }}>\n {includeNotch ? (\n <Subtract>\n {finalBody}\n <Translate offset={actualNotchPosition}>\n <Rotate rotation={notchRotation}>\n <Cylinder radius={actualNotchRadius} height={notchWidth} />\n </Rotate>\n </Translate>\n </Subtract>\n ) : (\n finalBody\n )}\n </Translate>\n </Translate>\n </Colorize>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Colorize, Cylinder, ExtrudeLinear, Hull, Polygon } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\n\nexport interface CrystalProps {\n horizontalPadPitch?: number\n verticalPadPitch?: number\n padWidth?: number\n padHeight?: number\n bodyHeight?: number\n}\n\ntype Point = [number, number]\n\nconst getTerminalPoints = (\n [centerX, centerY]: Point,\n width: number,\n length: number,\n chamfer: number,\n isPinOne: boolean,\n): Point[] => {\n const xDirection = Math.sign(centerX)\n const yDirection = Math.sign(centerY)\n const halfWidth = width / 2\n const halfLength = length / 2\n const innerChamfer = isPinOne ? Math.min(0.32, length * 0.36) : 0\n const outerChamfer = Math.min(chamfer, halfWidth, halfLength)\n const points: Point[] = [\n [-halfWidth, -halfLength],\n [halfWidth, -halfLength],\n [halfWidth, halfLength - outerChamfer],\n [halfWidth - outerChamfer, halfLength],\n [-halfWidth, halfLength],\n ]\n if (innerChamfer) {\n points[0] = [-halfWidth + innerChamfer, -halfLength]\n points.push([-halfWidth, -halfLength + innerChamfer])\n }\n\n const oriented = points.map(\n ([x, y]) => [centerX + x * xDirection, centerY + y * yDirection] as Point,\n )\n\n return xDirection * yDirection < 0 ? oriented.reverse() : oriented\n}\n\ntype RoundedRectProfileOptions = {\n width: number\n length: number\n height: number\n radius: number\n z: number\n}\n\nconst getRoundedRectProfile = ({\n width,\n length,\n radius,\n height,\n z,\n}: RoundedRectProfileOptions) => {\n const x = width / 2 - radius\n const y = length / 2 - radius\n\n return (\n [\n [-x, -y],\n [x, -y],\n [x, y],\n [-x, y],\n ] as const\n ).map(([cornerX, cornerY], index) => (\n <Cylinder\n key={`${z}-${index}`}\n center={[cornerX, cornerY, z + height / 2]}\n height={height}\n radius={radius}\n />\n ))\n}\n\nexport const Crystal = ({\n horizontalPadPitch = 2.2,\n verticalPadPitch = 1.7,\n padWidth = 1.4,\n padHeight = 1.2,\n bodyHeight = 0.7,\n}: CrystalProps) => {\n const bodyWidth = horizontalPadPitch + padWidth * (5 / 7)\n const bodyLength = verticalPadPitch + padHeight * (2 / 3)\n const terminalThickness = Math.min(0.01, bodyHeight * 0.02)\n const terminalWidth = padWidth * (5 / 7)\n const terminalLength = padHeight * 0.75\n const ceramicTopZ = bodyHeight * (5 / 7)\n const baseHeight = ceramicTopZ - terminalThickness\n const sealHeight = bodyHeight * (2 / 35)\n const sealWidth = bodyWidth * 0.95\n const sealLength = bodyLength * 0.94\n const lidShoulderWidth = bodyWidth * 0.905\n const lidShoulderLength = bodyLength * 0.9\n const lidTopWidth = bodyWidth * 0.83\n const lidTopLength = bodyLength * 0.82\n const lidBaseZ = ceramicTopZ + sealHeight\n const lidProfileHeight = Math.min(0.01, bodyHeight * 0.015)\n const bodyChamfer = Math.min(0.12, bodyLength * 0.05)\n const terminalX = (bodyWidth - terminalWidth) / 2\n const terminalY = (bodyLength - terminalLength) / 2\n const terminalPositions = [\n [-terminalX, -terminalY],\n [terminalX, -terminalY],\n [terminalX, terminalY],\n [-terminalX, terminalY],\n ] satisfies Point[]\n const sealProfile = getRoundedRectProfile({\n width: sealWidth,\n length: sealLength,\n radius: Math.min(0.13, sealLength * 0.08),\n height: sealHeight,\n z: ceramicTopZ,\n })\n const lidProfiles = [\n ...getRoundedRectProfile({\n width: lidShoulderWidth,\n length: lidShoulderLength,\n radius: Math.min(0.14, lidShoulderLength * 0.08),\n height: lidProfileHeight,\n z: lidBaseZ,\n }),\n ...getRoundedRectProfile({\n width: lidTopWidth,\n length: lidTopLength,\n radius: Math.min(0.15, lidTopLength * 0.09),\n height: lidProfileHeight,\n z: bodyHeight - lidProfileHeight,\n }),\n ]\n\n return (\n <>\n {terminalPositions.map((center, index) => (\n <Colorize\n key={index}\n color=\"#d6a258\"\n material={componentMaterials.goldContact}\n >\n <ExtrudeLinear height={terminalThickness}>\n <Polygon\n points={getTerminalPoints(\n center,\n terminalWidth,\n terminalLength,\n bodyChamfer,\n index === 0,\n )}\n />\n </ExtrudeLinear>\n </Colorize>\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: terminalThickness }}\n width={bodyWidth}\n length={bodyLength}\n height={baseHeight - 0.005}\n heightAboveSurface={0}\n color=\"#34343d\"\n taperRatio={0}\n straightHeightRatio={1}\n includeNotch={false}\n chamferSize={bodyChamfer}\n />\n <Colorize color=\"#d2a057\" material={componentMaterials.goldContact}>\n <Hull>{sealProfile}</Hull>\n </Colorize>\n <Colorize color=\"#b9bec2\" material={componentMaterials.brushedMetal}>\n <Hull>{lidProfiles}</Hull>\n </Colorize>\n </>\n )\n}\n","import { mp } from \"@tscircuit/modelprinter\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport { fp } from \"@tscircuit/footprinter\"\nimport { FootprintPad } from \"./FootprintPad\"\nimport { FootprintPlatedHole } from \"./FootprintPlatedHole\"\nimport { modelRendererRegistry } from \"./default-model-registry\"\n\nexport const ExtrudedPads = ({\n circuitJson,\n footprint,\n}: { circuitJson?: AnyCircuitElement[]; footprint?: string }) => {\n // Mechanical models do not have PCB copper pads.\n if (\n !circuitJson &&\n footprint &&\n modelRendererRegistry.get(\n mp.string(footprint.split(\"_\", 1)[0]!).params().fn,\n )?.pads === \"none\"\n ) {\n mp.string(footprint).json() // Validate mechanical parameters before returning.\n return null\n }\n if (!circuitJson && footprint) {\n circuitJson = fp.string(footprint).circuitJson() as AnyCircuitElement[]\n }\n\n if (!circuitJson)\n throw new Error(\"No circuit json or footprint provided to ExtrudedPads\")\n\n return (\n <>\n {circuitJson\n .filter((s) => s.type === \"pcb_smtpad\")\n .map((pad, i) => {\n const isPin1 = pad.port_hints?.includes(\"1\")\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey:\n <FootprintPad key={i} pad={pad} isPin1={isPin1} />\n )\n })}\n {circuitJson\n .filter((s) => s.type === \"pcb_plated_hole\")\n .map((hole, i) => {\n const isPin1 = hole.port_hints?.includes(\"1\")\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey:\n <FootprintPlatedHole key={i} hole={hole} isPin1={isPin1} />\n )\n })}\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport type { PcbSmtPad } from \"circuit-json\"\nimport {\n Colorize,\n Cuboid,\n Cylinder,\n ExtrudeLinear,\n Polygon,\n Rotate,\n Translate,\n} from \"jscad-fiber\"\n\nconst PAD_THICKNESS = 0.01\n\nexport const FootprintPad = ({\n pad,\n isPin1,\n}: { pad: PcbSmtPad; isPin1?: boolean }) => {\n const color: [number, number, number] = isPin1 ? [0, 255, 0] : [255, 0, 0]\n\n if (pad.shape === \"rect\" || pad.shape === \"rotated_rect\") {\n return (\n <Colorize color={color} material={componentMaterials.copper}>\n <Translate offset={[pad.x, pad.y, -0.005]}>\n <Rotate\n angles={[\n 0,\n 0,\n pad.shape === \"rotated_rect\"\n ? (pad.ccw_rotation * Math.PI) / 180\n : 0,\n ]}\n >\n <Cuboid size={[pad.width, pad.height, PAD_THICKNESS]} />\n </Rotate>\n </Translate>\n </Colorize>\n )\n }\n\n if (pad.shape === \"circle\") {\n const radius = (pad as any).radius ?? (pad as any).r ?? 0.25\n return (\n <Colorize color={color} material={componentMaterials.copper}>\n <Translate offset={[pad.x, pad.y, -0.005]}>\n <Cylinder radius={radius} height={PAD_THICKNESS} />\n </Translate>\n </Colorize>\n )\n }\n\n // A polygon pad is how footprinter describes a tab — SOT-89's, for one. It\n // used to throw, which meant a footprint could not be rendered WITH ITS PADS\n // at all, and the failure named the shape rather than the footprint.\n if (pad.shape === \"polygon\") {\n const points = (pad.points ?? []).map(\n ({ x, y }) => [x, y] as [number, number],\n )\n if (points.length < 3) return null\n return (\n <Colorize color={color} material={componentMaterials.copper}>\n <Translate offset={[0, 0, -0.005]}>\n <ExtrudeLinear height={PAD_THICKNESS}>\n <Polygon points={points} />\n </ExtrudeLinear>\n </Translate>\n </Colorize>\n )\n }\n\n throw new Error(\"Shape not supported: \" + pad.shape)\n}\n","import { componentMaterials } from \"./materials\"\nimport type { PcbPlatedHole } from \"circuit-json\"\nimport {\n Colorize,\n Cuboid,\n Translate,\n Cylinder,\n Subtract,\n Hull,\n} from \"jscad-fiber\"\n\nexport const FootprintPlatedHole = ({\n hole,\n isPin1,\n}: { hole: PcbPlatedHole; isPin1?: boolean }) => {\n const color = isPin1 ? \"#00ff00\" : \"#b87333\"\n\n if (hole.shape === \"circle\") {\n return (\n <Colorize color={color} material={componentMaterials.copper}>\n <Translate offset={[hole.x, hole.y, -0.005]}>\n <Subtract>\n <Cylinder radius={hole.outer_diameter / 2} height={0.01} />\n <Cylinder radius={hole.hole_diameter / 2} height={0.01} />\n </Subtract>\n </Translate>\n </Colorize>\n )\n }\n if (hole.shape === \"circular_hole_with_rect_pad\") {\n return (\n <Colorize color={color} material={componentMaterials.copper}>\n <Translate offset={[hole.x, hole.y, 0]}>\n <Subtract>\n <Cuboid\n size={[hole.rect_pad_width, hole.rect_pad_height, 0.01]}\n center={[0, 0, 0]}\n />\n <Cylinder radius={hole.hole_diameter / 2} height={0.01} />\n </Subtract>\n </Translate>\n </Colorize>\n )\n }\n if (hole.shape === \"pill\") {\n const width = hole.outer_width\n const height = hole.outer_height\n const radius = Math.min(width, height) / 2\n const isHorizontal = width > height\n\n const holeWidth = hole.hole_width ?? 0.8\n const holeHeight = hole.hole_height ?? 0.8\n\n return (\n <Colorize color={color} material={componentMaterials.copper}>\n <Translate offset={[hole.x, hole.y, 0]}>\n <Subtract>\n <Hull>\n <Cylinder\n radius={radius}\n height={0.01}\n center={[\n isHorizontal ? -(width / 2 - radius) : 0,\n isHorizontal ? 0 : -(height / 2 - radius),\n 0,\n ]}\n />\n <Cylinder\n radius={radius}\n height={0.01}\n center={[\n isHorizontal ? width / 2 - radius : 0,\n isHorizontal ? 0 : height / 2 - radius,\n 0,\n ]}\n />\n </Hull>\n {holeWidth === holeHeight ? (\n <Cylinder radius={holeWidth / 2} height={0.01} />\n ) : (\n <Hull>\n <Cylinder\n radius={Math.min(holeWidth, holeHeight) / 2}\n height={0.01}\n center={[\n holeWidth > holeHeight\n ? -(holeWidth / 2 - holeHeight / 2)\n : 0,\n holeWidth > holeHeight\n ? 0\n : -(holeHeight / 2 - holeWidth / 2),\n 0,\n ]}\n />\n <Cylinder\n radius={Math.min(holeWidth, holeHeight) / 2}\n height={0.01}\n center={[\n holeWidth > holeHeight ? holeWidth / 2 - holeHeight / 2 : 0,\n holeWidth > holeHeight ? 0 : holeHeight / 2 - holeWidth / 2,\n 0,\n ]}\n />\n </Hull>\n )}\n </Subtract>\n </Translate>\n </Colorize>\n )\n }\n throw new Error(\"Shape not supported: \" + hole.shape)\n}\n","import { ballBearingModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { BallBearing } from \"./BallBearing\"\n\nexport const model = defineModelRenderer({\n name: \"ballbearing\",\n schema: ballBearingModelDefinitionSchema,\n render: ({ fn, ...props }) => <BallBearing {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { ModelDefinition } from \"@tscircuit/modelprinter\"\nimport type { JSX } from \"react\"\n\nexport type ModelRendererName = ModelDefinition[\"fn\"]\nexport type ModelRendererDefinition<Name extends ModelRendererName> = Extract<\n ModelDefinition,\n { fn: Name }\n>\nexport type ModelPadBehavior = \"none\" | \"footprinter\"\n\ntype IsUnion<Value, Whole = Value> = Value extends Whole\n ? [Whole] extends [Value]\n ? false\n : true\n : never\n\ntype LiteralModelName<Name extends ModelRendererName> =\n true extends IsUnion<Name> ? never : Name\n\nexport type ModelRenderer<Name extends ModelRendererName> = {\n readonly name: Name\n readonly schema: {\n parse(input: unknown): ModelRendererDefinition<NoInfer<Name>>\n }\n readonly render: (\n definition: ModelRendererDefinition<NoInfer<Name>>,\n ) => JSX.Element | null\n readonly pads: ModelPadBehavior\n}\n\n/** Keep the contract discriminator, schema output, and render input aligned. */\nexport function defineModelRenderer<const Name extends ModelRendererName>(\n model: ModelRenderer<Name> & {\n readonly name: LiteralModelName<NoInfer<Name>>\n },\n): ModelRenderer<Name> {\n return model\n}\n\ntype RegisteredModelRenderer = {\n readonly name: ModelRendererName\n readonly schema: { parse(input: unknown): ModelDefinition }\n readonly render: (definition: ModelDefinition) => JSX.Element | null\n readonly pads: ModelPadBehavior\n}\n\n/** Renderer registrations belong to this instance, never to globalThis. */\nexport class ModelRendererRegistry {\n private readonly models = new Map<string, RegisteredModelRenderer>()\n\n register<const Name extends ModelRendererName>(\n model: ModelRenderer<Name> & {\n readonly name: LiteralModelName<NoInfer<Name>>\n },\n ): void {\n if (typeof model.name !== \"string\" || !/^[a-z]+$/.test(model.name)) {\n throw new Error(\n \"Model renderer names must contain only lowercase letters\",\n )\n }\n if (this.models.has(model.name)) {\n throw new Error(`Model renderer \"${model.name}\" is already registered`)\n }\n if (model.pads !== \"none\" && model.pads !== \"footprinter\") {\n throw new Error('Model renderer pads must be \"none\" or \"footprinter\"')\n }\n const { name, schema, render, pads } = model\n this.models.set(name, {\n name,\n schema,\n pads,\n render: (definition) => {\n if (!definition || definition.fn !== name) {\n throw new Error(\n `Renderer for \"${name}\" requires a model with fn \"${name}\"`,\n )\n }\n // Registration ties this discriminator to the callback's input type.\n // The caller has already validated and normalized the MP definition;\n // do not repeat schema transforms or copy its object here.\n return render(definition as ModelRendererDefinition<Name>)\n },\n })\n }\n\n get(name: string): RegisteredModelRenderer | undefined {\n return this.models.get(name)\n }\n\n getModelNames(): string[] {\n return [...this.models.keys()]\n }\n\n render(definition: ModelDefinition): JSX.Element | null | undefined {\n return this.models.get(definition.fn)?.render(definition)\n }\n}\n","import type { BallBearingModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createBallBearingMesh } from \"./mesh\"\n\nexport type BallBearingProps = BallBearingModelPropsInput & { color?: string }\n\nexport function createBallBearingGeom(input: BallBearingModelPropsInput = {}) {\n return indexedMeshToGeom3(createBallBearingMesh(input))\n}\n\n/** Separately colored physical parts retain their individual closed surfaces. */\nexport function BallBearing({ color, ...props }: BallBearingProps) {\n const { parts } = createBallBearingMesh(props)\n return (\n <>\n {parts.map((part) => (\n <Colorize key={part.name} color={color ?? part.color}>\n <Custom geometry={indexedMeshToGeom3(part.mesh)} />\n </Colorize>\n ))}\n </>\n )\n}\n\nexport { createBallBearingMesh } from \"./mesh\"\nexport type {\n BallBearingMesh,\n BallBearingMeshPart,\n BallBearingMeshOptions,\n} from \"./mesh\"\n","import jscad from \"@jscad/modeling\"\n\n/** Preserve the outward winding of the migrated indexed triangle surfaces. */\nexport function indexedMeshToGeom3(mesh: {\n positions: number[]\n indices: number[]\n}) {\n const polygons: [number, number, number][][] = []\n for (let i = 0; i < mesh.indices.length; i += 3)\n polygons.push(\n mesh.indices\n .slice(i, i + 3)\n .map((index) => [\n mesh.positions[index * 3]!,\n mesh.positions[index * 3 + 1]!,\n mesh.positions[index * 3 + 2]!,\n ]),\n )\n return jscad.geometries.geom3.fromPoints(polygons)\n}\n","import {\n getBallBearingDimensions,\n type BallBearingModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\nexport interface BallBearingMeshPart {\n name: string\n color: string\n mesh: { positions: number[]; indices: number[] }\n /** Only rolling elements have centers/radii; useful to inspect nominal contact. */\n center?: [number, number, number]\n radius?: number\n}\nexport interface BallBearingMesh {\n positions: number[]\n indices: number[]\n parts: BallBearingMeshPart[]\n}\nexport type BallBearingMeshOptions = { segments?: number }\n\n/** ISO/de-facto envelope, nominal grooved races/balls/cage, and independently selected faces. */\nexport function createBallBearingMesh(\n input: BallBearingModelPropsInput = {},\n options: BallBearingMeshOptions = {},\n): BallBearingMesh {\n const d = getBallBearingDimensions(input)\n const segments = segmentsFor(options.segments)\n checkPrecision([\n d.outerDiameter,\n d.boreRadius,\n d.width,\n d.outerRadius - d.boreRadius,\n d.ballRadius,\n ])\n const c = d.rimChamfer,\n mid = d.midZ,\n half = d.grooveHalfWidth\n const innerProfile: ProfilePoint[] = [\n [d.innerRaceOuterRadius - c, 0],\n [d.innerRaceOuterRadius, c],\n ]\n for (let i = 0; i <= 24; i++) {\n const z = mid - half + (2 * half * i) / 24\n innerProfile.push([\n d.pitchRadius -\n Math.sqrt(Math.max(0, d.grooveRadius ** 2 - (z - mid) ** 2)),\n z,\n ])\n }\n innerProfile.push(\n [d.innerRaceOuterRadius, d.width - c],\n [d.innerRaceOuterRadius - c, d.width],\n [d.boreRadius + c, d.width],\n [d.boreRadius, d.width - c],\n [d.boreRadius, c],\n [d.boreRadius + c, 0],\n )\n const outerProfile: ProfilePoint[] = [\n [d.outerRadius - c, 0],\n [d.outerRadius, c],\n [d.outerRadius, d.width - c],\n [d.outerRadius - c, d.width],\n [d.outerRaceInnerRadius + c, d.width],\n [d.outerRaceInnerRadius, d.width - c],\n ]\n for (let i = 0; i <= 24; i++) {\n const z = mid + half - (2 * half * i) / 24\n outerProfile.push([\n d.pitchRadius +\n Math.sqrt(Math.max(0, d.grooveRadius ** 2 - (z - mid) ** 2)),\n z,\n ])\n }\n outerProfile.push(\n [d.outerRaceInnerRadius, c],\n [d.outerRaceInnerRadius + c, 0],\n )\n const parts: BallBearingMeshPart[] = [\n {\n name: \"inner race\",\n color: \"#9da4ac\",\n mesh: revolve(innerProfile, segments),\n },\n {\n name: \"outer race\",\n color: \"#9da4ac\",\n mesh: revolve(outerProfile, segments),\n },\n ]\n for (let i = 0; i < d.ballCount; i++) {\n const phase = (i * Math.PI * 2) / d.ballCount\n const center: Point = [\n d.pitchRadius * Math.cos(phase),\n d.pitchRadius * Math.sin(phase),\n mid,\n ]\n parts.push({\n name: `ball ${i + 1}`,\n color: \"#d5d9df\",\n mesh: sphere(center, d.ballRadius),\n center,\n radius: d.ballRadius,\n })\n const separator = ((i + 0.5) * Math.PI * 2) / d.ballCount\n parts.push({\n name: `cage separator ${i + 1}`,\n color: \"#b89b58\",\n mesh: annularSector(\n d.cageInnerRadius,\n d.cageOuterRadius,\n mid - 1.1 * d.ballRadius,\n mid + 1.1 * d.ballRadius,\n separator - d.cageSeparatorHalfAngle,\n separator + d.cageSeparatorHalfAngle,\n segments,\n ),\n })\n }\n for (const sign of [-1, 1]) {\n const z0 = mid + (sign === -1 ? -1.25 : 1.1) * d.ballRadius\n const z1 = mid + (sign === -1 ? -1.1 : 1.25) * d.ballRadius\n parts.push({\n name: `cage ${sign < 0 ? \"lower\" : \"upper\"} band`,\n color: \"#b89b58\",\n mesh: revolve(\n [\n [d.cageOuterRadius, z0],\n [d.cageOuterRadius, z1],\n [d.cageInnerRadius, z1],\n [d.cageInnerRadius, z0],\n ],\n segments,\n ),\n })\n }\n for (const sign of [-1, 1]) {\n const face =\n sign < 0\n ? d.bottomSideShielded\n ? \"shielded\"\n : d.bottomSideSealed\n ? \"sealed\"\n : \"open\"\n : d.topSideShielded\n ? \"shielded\"\n : d.topSideSealed\n ? \"sealed\"\n : \"open\"\n if (face === \"open\") continue\n const t = d.closureThickness\n const ri = d.innerRaceOuterRadius,\n ro = d.outerRaceInnerRadius\n const shape: [number, number][] =\n face === \"shielded\"\n ? [\n [ro, 0],\n [ro, t * 0.45],\n [ri, t * 0.45],\n [ri, 0],\n ]\n : [\n [ro, 0],\n [ro, t],\n [ri, t],\n [ri, 0],\n [ri + 0.15 * (ro - ri), 0.5 * t],\n [ro - 0.15 * (ro - ri), 0.5 * t],\n ]\n const profile: ProfilePoint[] =\n sign === -1\n ? shape\n : shape.map(([r, z]) => [r, d.width - z] as ProfilePoint).reverse()\n parts.push({\n name: `${face} ${sign < 0 ? \"lower\" : \"upper\"}`,\n color: face === \"sealed\" ? \"#252a30\" : \"#b5bbc3\",\n mesh: revolve(profile, segments),\n })\n }\n return { ...combine(parts), parts }\n}\n\ntype ProfilePoint = [number | ((angle: number) => number), number]\ntype Point = [number, number, number]\ntype Mesh = { positions: number[]; indices: number[] }\n\nfunction segmentsFor(value = 96) {\n if (!Number.isInteger(value) || value < 96 || value > 192 || value % 24 !== 0)\n throw new Error(\"Segments must be a multiple of 24 from 96 to 192\")\n return value\n}\nfunction checkPrecision(lengths: number[]) {\n const largest = Math.max(...lengths)\n if (\n !lengths.every(Number.isFinite) ||\n largest > 1e6 ||\n Math.min(...lengths) < Math.max(1e-5, largest * 1e-7)\n )\n throw new Error(\n \"Bearing dimensions exceed the renderer's numerical resolution\",\n )\n}\n/** Closed outward section, outside upward and bore downward; never a center cap. */\nfunction revolve(profile: ProfilePoint[], segments: number): Mesh {\n const positions: number[] = []\n const indices: number[] = []\n for (const [radius, z] of profile)\n for (let i = 0; i < segments; i++) {\n const angle = (i * Math.PI * 2) / segments\n const r = typeof radius === \"number\" ? radius : radius(angle)\n positions.push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n for (let j = 0; j < profile.length; j++)\n for (let i = 0; i < segments; i++) {\n const a = j * segments + i\n const b = j * segments + ((i + 1) % segments)\n const c = ((j + 1) % profile.length) * segments + ((i + 1) % segments)\n const e = ((j + 1) % profile.length) * segments + i\n indices.push(a, b, c, a, c, e)\n }\n return { positions, indices }\n}\nfunction annularSector(\n inner: number,\n outer: number,\n z0: number,\n z1: number,\n start: number,\n end: number,\n segments: number,\n): Mesh {\n const steps = Math.max(\n 2,\n Math.ceil(((end - start) / (2 * Math.PI)) * segments),\n )\n const count = steps + 1\n const profile: [number, number][] = [\n [outer, z0],\n [outer, z1],\n [inner, z1],\n [inner, z0],\n ]\n const positions: number[] = []\n const indices: number[] = []\n for (const [r, z] of profile)\n for (let i = 0; i <= steps; i++) {\n const angle = start + ((end - start) * i) / steps\n positions.push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n for (let j = 0; j < 4; j++)\n for (let i = 0; i < steps; i++) {\n const a = j * count + i\n const b = a + 1\n const c = ((j + 1) % 4) * count + i + 1\n const e = ((j + 1) % 4) * count + i\n indices.push(a, b, c, a, c, e)\n }\n indices.push(0, count, 2 * count, 0, 2 * count, 3 * count)\n const a = steps,\n b = count + steps,\n c = 2 * count + steps,\n e = 3 * count + steps\n indices.push(a, c, b, a, e, c)\n return { positions, indices }\n}\n/** Single pole vertices prevent collapsed triangles and nonmanifold pole seams. */\nfunction sphere(center: Point, radius: number): Mesh {\n const longitude = 24\n const latitude = 12\n const positions = [center[0], center[1], center[2] + radius]\n const indices: number[] = []\n for (let j = 1; j < latitude; j++) {\n const polar = (j * Math.PI) / latitude\n for (let i = 0; i < longitude; i++) {\n const azimuth = (i * Math.PI * 2) / longitude\n positions.push(\n center[0] + radius * Math.sin(polar) * Math.cos(azimuth),\n center[1] + radius * Math.sin(polar) * Math.sin(azimuth),\n center[2] + radius * Math.cos(polar),\n )\n }\n }\n const south = positions.length / 3\n positions.push(center[0], center[1], center[2] - radius)\n for (let i = 0; i < longitude; i++) {\n const next = (i + 1) % longitude\n indices.push(0, 1 + i, 1 + next)\n for (let j = 0; j < latitude - 2; j++) {\n const a = 1 + j * longitude + i,\n b = 1 + (j + 1) * longitude + i\n const c = 1 + (j + 1) * longitude + next,\n e = 1 + j * longitude + next\n indices.push(a, b, c, a, c, e)\n }\n const last = 1 + (latitude - 2) * longitude\n indices.push(south, last + next, last + i)\n }\n return { positions, indices }\n}\nfunction combine(parts: { mesh: Mesh }[]): Mesh {\n const positions: number[] = []\n const indices: number[] = []\n for (const { mesh } of parts) {\n const offset = positions.length / 3\n positions.push(...mesh.positions)\n indices.push(...mesh.indices.map((index) => index + offset))\n }\n return { positions, indices }\n}\n","import { ballTransferUnitModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { BallTransferUnit } from \"./BallTransferUnit\"\n\nexport const model = defineModelRenderer({\n name: \"balltransferunit\",\n schema: ballTransferUnitModelDefinitionSchema,\n render: ({ fn, ...props }) => <BallTransferUnit {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { BallTransferUnitModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createBallTransferUnitMesh } from \"./mesh\"\n\nexport type BallTransferUnitProps = BallTransferUnitModelPropsInput & {\n color?: string\n}\n\nexport function createBallTransferUnitGeom(\n input: BallTransferUnitModelPropsInput = {},\n) {\n return indexedMeshToGeom3(createBallTransferUnitMesh(input))\n}\n\nexport function BallTransferUnit({ color, ...props }: BallTransferUnitProps) {\n const { parts } = createBallTransferUnitMesh(props)\n return (\n <>\n {parts.map((part) => (\n <Colorize key={part.name} color={color ?? part.color}>\n <Custom geometry={indexedMeshToGeom3(part.mesh)} />\n </Colorize>\n ))}\n </>\n )\n}\n","import {\n getBallTransferUnitDimensions,\n type BallTransferUnitModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport earcut from \"earcut\"\nimport {\n circularProfile,\n joinProfileMeshes,\n type ProfilePoint,\n} from \"../../mechanical/extrude-planar-profile\"\n\ntype Mesh = { positions: number[]; indices: number[] }\ntype SectionPoint = [radius: number, z: number]\n\nexport interface BallTransferUnitMeshPart {\n name: \"housing\" | \"load ball\"\n color: string\n mesh: Mesh\n}\n\nexport interface BallTransferUnitMesh extends Mesh {\n parts: BallTransferUnitMeshPart[]\n}\n\n/** Millimeters; body bottom at Z=0, circular mounting flange at the cup mouth.\n * The load ball and the perforated cup are independently closed physical parts.\n * Internal recirculation details are nominally represented by the socket.\n */\nexport function createBallTransferUnitMesh(\n input: BallTransferUnitModelPropsInput = {},\n): BallTransferUnitMesh {\n const d = getBallTransferUnitDimensions(input)\n const lengths = [\n d.height,\n d.flangeDiameter,\n d.flangeThickness,\n d.flangeBottomZ,\n d.ballRadius,\n d.ballProtrusion,\n d.openingRadius,\n d.holeDiameter,\n d.socketBottomZ,\n d.bodyRadius - d.socketRadius,\n (d.pitchCircleDiameter - d.holeDiameter - d.bodyDiameter) / 2,\n (d.flangeDiameter - d.pitchCircleDiameter - d.holeDiameter) / 2,\n ]\n const largest = Math.max(...lengths)\n const resolution = Math.max(1e-5, largest * 1e-7)\n if (\n !lengths.every(Number.isFinite) ||\n largest > 1e6 ||\n Math.min(...lengths) < resolution\n )\n throw new Error(\n \"Ball transfer unit exceeds the renderer's numerical resolution\",\n )\n\n const segments = 96\n const latitude = 48\n const profile: SectionPoint[] = [\n [d.bodyRadius, 0],\n [d.bodyRadius, d.flangeBottomZ],\n [d.flangeRadius, d.flangeBottomZ],\n [d.flangeRadius, d.bodyHeight],\n [d.openingRadius, d.bodyHeight],\n ]\n const openingAngle = Math.acos(\n (d.bodyHeight - d.ballCenterZ) / d.socketRadius,\n )\n // Match the sphere's latitude samples. Zero clearance then preserves nominal\n // contact without an unrelated cup tessellation crossing the rolling ball.\n for (let j = 1; j < latitude; j++) {\n const angle = (j * Math.PI) / latitude\n // An aperture on an exact latitude can differ by one rounding bit after\n // acos. Omit samples indistinguishable from the already-authored mouth.\n if ((angle - openingAngle) * d.socketRadius > resolution)\n profile.push([\n d.socketRadius * Math.sin(angle),\n d.ballCenterZ + d.socketRadius * Math.cos(angle),\n ])\n }\n profile.push([0, d.socketBottomZ], [0, 0])\n\n const holes = d.mountingHoles.map(({ x, y, diameter }) =>\n circularProfile(x, y, diameter / 2, segments),\n )\n const flangeOutline = circularProfile(0, 0, d.flangeRadius, segments)\n const housing = joinProfileMeshes([\n // Cap faces are triangulated with all openings, rather than covered by\n // annular triangles and repaired afterward with Boolean subtraction.\n revolve(profile, segments, new Set([1, 3])),\n cap(\n flangeOutline,\n [circularProfile(0, 0, d.bodyRadius, segments), ...holes],\n d.flangeBottomZ,\n true,\n ),\n cap(\n flangeOutline,\n [circularProfile(0, 0, d.openingRadius, segments), ...holes],\n d.bodyHeight,\n false,\n ),\n ...holes.map((hole) => holeWall(hole, d.flangeBottomZ, d.bodyHeight)),\n ])\n const ball = revolve(\n Array.from({ length: latitude + 1 }, (_, j): SectionPoint => {\n // South to north yields outward winding. Each pole is a single vertex.\n const angle = Math.PI - (j * Math.PI) / latitude\n return [\n j === 0 || j === latitude ? 0 : d.ballRadius * Math.sin(angle),\n d.ballCenterZ + d.ballRadius * Math.cos(angle),\n ]\n }),\n segments,\n )\n const parts: BallTransferUnitMeshPart[] = [\n { name: \"housing\", color: \"#9da4ac\", mesh: housing },\n { name: \"load ball\", color: \"#d5d9df\", mesh: ball },\n ]\n const positions = [...housing.positions, ...ball.positions]\n const offset = housing.positions.length / 3\n const indices = [\n ...housing.indices,\n ...ball.indices.map((index) => index + offset),\n ]\n return { positions, indices, parts }\n}\n\n/** Revolve a counterclockwise section, retaining one vertex at each axis pole. */\nfunction revolve(\n profile: SectionPoint[],\n segments: number,\n omittedEdges = new Set<number>(),\n): Mesh {\n const positions: number[] = []\n const indices: number[] = []\n const rings = profile.map(([radius, z]) => {\n const start = positions.length / 3\n const count = radius === 0 ? 1 : segments\n for (let i = 0; i < count; i++) {\n const angle = (i * Math.PI * 2) / segments\n positions.push(radius * Math.cos(angle), radius * Math.sin(angle), z)\n }\n return { start, count }\n })\n for (let j = 0; j < rings.length; j++) {\n if (omittedEdges.has(j)) continue\n const a = rings[j]!\n const b = rings[(j + 1) % rings.length]!\n if (a.count === 1 && b.count === 1) continue\n for (let i = 0; i < segments; i++) {\n const next = (i + 1) % segments\n if (a.count === 1) indices.push(a.start, b.start + next, b.start + i)\n else if (b.count === 1) indices.push(a.start + i, a.start + next, b.start)\n else\n indices.push(\n a.start + i,\n a.start + next,\n b.start + next,\n a.start + i,\n b.start + next,\n b.start + i,\n )\n }\n }\n return { positions, indices }\n}\n\nfunction cap(\n outer: ProfilePoint[],\n holes: ProfilePoint[][],\n z: number,\n reverse: boolean,\n): Mesh {\n const loops = [outer, ...holes]\n const starts: number[] = []\n let count = outer.length\n for (const hole of holes) {\n starts.push(count)\n count += hole.length\n }\n const points = loops.flat()\n const indices = earcut(points.flat(), starts)\n if (reverse)\n for (let i = 0; i < indices.length; i += 3)\n [indices[i + 1], indices[i + 2]] = [indices[i + 2]!, indices[i + 1]!]\n return { positions: points.flatMap(([x, y]) => [x, y, z]), indices }\n}\n\nfunction holeWall(loop: ProfilePoint[], bottom: number, top: number): Mesh {\n const positions = [bottom, top].flatMap((z) =>\n loop.flatMap(([x, y]) => [x, y, z]),\n )\n const indices: number[] = []\n const count = loop.length\n for (let i = 0; i < count; i++) {\n const next = (i + 1) % count\n indices.push(i, next + count, next, i, i + count, next + count)\n }\n return { positions, indices }\n}\n","import earcut from \"earcut\"\n\nexport type ProfilePoint = [number, number]\nexport type ProfileMesh = { positions: number[]; indices: number[] }\ntype Point3 = [number, number, number]\n\n/** Triangulate a planar outline with through openings, preserving shared\n * indexed vertices and opposite edge winding. Omitted walls permit adjoining\n * straight and curved panels to be sewn without internal seam faces.\n */\nexport function extrudePlanarProfile({\n outer,\n holes = [],\n start,\n end,\n project = (u, v, depth) => [u, v, depth],\n reverse = false,\n skipWall = () => false,\n}: {\n outer: ProfilePoint[]\n holes?: ProfilePoint[][]\n start: number\n end: number\n project?: (u: number, v: number, depth: number) => Point3\n reverse?: boolean\n skipWall?: (a: ProfilePoint, b: ProfilePoint) => boolean\n}): ProfileMesh {\n const oriented = (loop: ProfilePoint[], clockwise: boolean) => {\n loop = loop.filter((point, index) => {\n const previous = loop[(index + loop.length - 1) % loop.length]!\n return point[0] !== previous[0] || point[1] !== previous[1]\n })\n const area = loop.reduce((sum, a, index) => {\n const b = loop[(index + 1) % loop.length]!\n return sum + a[0] * b[1] - a[1] * b[0]\n }, 0)\n if (!Number.isFinite(area) || area === 0)\n throw new Error(\"Profile exceeds mesh resolution limits\")\n return area < 0 === clockwise ? loop : [...loop].reverse()\n }\n const loops = [oriented(outer, false), ...holes.map((h) => oriented(h, true))]\n const points = loops.flat()\n const holeStarts: number[] = []\n let count = loops[0]!.length\n for (const hole of loops.slice(1)) {\n holeStarts.push(count)\n count += hole.length\n }\n const faces = earcut(points.flat(), holeStarts)\n const positions = [start, end].flatMap((depth) =>\n points.flatMap(([u, v]) => project(u, v, depth)),\n )\n const indices: number[] = []\n for (let i = 0; i < faces.length; i += 3) {\n const [a, b, c] = faces.slice(i, i + 3) as [number, number, number]\n indices.push(a, c, b, a + count, b + count, c + count)\n }\n let offset = 0\n for (const [loopIndex, loop] of loops.entries()) {\n for (let i = 0; i < loop.length; i++) {\n const next = (i + 1) % loop.length\n if (loopIndex === 0 && skipWall(loop[i]!, loop[next]!)) continue\n const a = offset + i\n const b = offset + next\n indices.push(a, b, b + count, a, b + count, a + count)\n }\n offset += loop.length\n }\n if (reverse)\n for (let i = 0; i < indices.length; i += 3)\n [indices[i + 1], indices[i + 2]] = [indices[i + 2]!, indices[i + 1]!]\n return { positions, indices }\n}\n\n/** Reuse seam vertices after joining independently triangulated panels. */\nexport function joinProfileMeshes(meshes: ProfileMesh[]): ProfileMesh {\n const positions: number[] = []\n const indices: number[] = []\n const vertices = new Map<string, number>()\n for (const mesh of meshes) {\n for (const index of mesh.indices) {\n const point = mesh.positions.slice(index * 3, index * 3 + 3)\n const key = point.map((value) => value.toFixed(12)).join(\",\")\n let shared = vertices.get(key)\n if (shared === undefined) {\n shared = positions.length / 3\n vertices.set(key, shared)\n positions.push(...point)\n }\n indices.push(shared)\n }\n }\n return { positions, indices }\n}\n\nexport function circularProfile(\n x: number,\n y: number,\n radius: number,\n segments = 96,\n): ProfilePoint[] {\n return Array.from({ length: segments }, (_, index) => {\n const angle = (index * 2 * Math.PI) / segments\n return [x + radius * Math.cos(angle), y + radius * Math.sin(angle)]\n })\n}\n","import { buttonScrewModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { ButtonScrew } from \"./ButtonScrew\"\n\nexport const model = defineModelRenderer({\n name: \"buttonscrew\",\n schema: buttonScrewModelDefinitionSchema,\n render: ({ fn, ...props }) => <ButtonScrew {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { ButtonScrewModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createButtonScrewMesh, type ButtonScrewMeshOptions } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type ButtonScrewProps = ButtonScrewModelPropsInput & { color?: string }\nexport function createButtonScrewGeom(\n input: ButtonScrewModelPropsInput,\n resolution?: ButtonScrewMeshOptions,\n) {\n return indexedMeshToGeom3(createButtonScrewMesh(input, resolution))\n}\nexport function ButtonScrew({ color = \"#737e8f\", ...props }: ButtonScrewProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createButtonScrewGeom(props)} />\n </Colorize>\n )\n}\nexport { createButtonScrewMesh } from \"./mesh\"\nexport type {\n ButtonScrewMesh,\n ButtonScrewMeshOptions,\n} from \"./mesh\"\n","import {\n buttonScrewModelPropsSchema,\n getButtonScrewDimensions,\n type ButtonScrewModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\n/** Indexed counterclockwise triangles in millimeters. */\nexport interface ButtonScrewMesh {\n positions: number[]\n indices: number[]\n}\n/** Renderer resolution affects tessellation only, never model specifications. */\nexport interface ButtonScrewMeshOptions {\n radialSegments?: number\n segmentsPerPitch?: number\n}\nfunction resolution(options: ButtonScrewMeshOptions) {\n const radial = options.radialSegments ?? 96\n const axial = options.segmentsPerPitch ?? 32\n if (\n !Number.isInteger(radial) ||\n radial < 24 ||\n radial > 192 ||\n radial % 12 !== 0 ||\n !Number.isInteger(axial) ||\n axial < 8 ||\n axial > 64\n )\n throw new Error(\n \"Mesh resolution limit: radial segments must be a multiple of 12 in [24,192], pitch segments an integer in [8,64]\",\n )\n return { radial, axial }\n}\nfunction surface(segments: number) {\n const positions: number[] = [],\n indices: number[] = []\n const ring = (z: number, radius: (angle: number) => number) => {\n const start = positions.length / 3\n for (let i = 0; i < segments; i++) {\n const angle = (i * 2 * Math.PI) / segments\n const r = radius(angle)\n positions.push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n return start\n }\n const connect = (a: number, b: number) => {\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n indices.push(a + i, a + n, b + n, a + i, b + n, b + i)\n }\n }\n const cap = (start: number, z: number, up: boolean) => {\n const center = positions.length / 3\n positions.push(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n indices.push(center, start + (up ? i : n), start + (up ? n : i))\n }\n }\n return { positions, indices, ring, connect, cap }\n}\nfunction hexRadius(angle: number, acrossFlats: number) {\n const period = Math.PI / 3\n const distance =\n ((((angle - Math.PI / 2 + period / 2) % period) + period) % period) -\n period / 2\n return acrossFlats / 2 / Math.cos(distance)\n}\nfunction threadDistance(z: number, angle: number, pitch: number, hand = 1) {\n const phase = (((z / pitch - (hand * angle) / (2 * Math.PI)) % 1) + 1) % 1\n return Math.min(phase, 1 - phase)\n}\n/** Closed nominal surface: bearing z=0, tip -length, blind hex socket above. */\nexport function createButtonScrewMesh(\n input: ButtonScrewModelPropsInput,\n options: ButtonScrewMeshOptions = {},\n): ButtonScrewMesh {\n const props = buttonScrewModelPropsSchema.parse(input)\n const d = getButtonScrewDimensions(input)\n const { radial, axial } = resolution(options)\n const steps = Math.max(2, Math.ceil((props.length / d.threadPitch) * axial))\n if (steps > 24000 || !Number.isFinite(steps))\n throw new Error(\"Mesh resolution limit: too many thread turns\")\n const m = surface(radial)\n const radius = d.diameter / 2\n const depth = (d.diameter - d.threadMinorDiameter) / 2\n const fillet = d.underHeadRadius\n const levels = new Set<number>(\n props.showThreads\n ? Array.from(\n { length: steps + 1 },\n (_, i) => -props.length + (props.length * i) / steps,\n )\n : [-props.length, 0],\n )\n levels.add(-props.length + d.tipChamfer)\n levels.add(-d.threadPitch)\n for (let i = 0; i <= 16; i++)\n levels.add(-fillet + fillet * Math.sin((i * Math.PI) / 32))\n let previous = -1\n const shaftLevels = [...levels]\n .sort((a, b) => a - b)\n .filter((z, index, sorted) => index === 0 || z - sorted[index - 1]! > 1e-10)\n for (const z of shaftLevels) {\n const current = m.ring(z, (angle) => {\n const envelope =\n z >= -fillet\n ? radius +\n fillet -\n Math.sqrt(Math.max(0, fillet ** 2 - (z + fillet) ** 2))\n : radius\n const groove = Math.min(\n depth,\n Math.max(\n 0,\n (threadDistance(z + props.length, angle, d.threadPitch) - 1 / 16) *\n d.threadPitch *\n Math.sqrt(3),\n ),\n )\n const threaded =\n envelope -\n (props.showThreads ? groove * Math.min(1, -z / d.threadPitch) : 0)\n const tip =\n z + props.length < d.tipChamfer\n ? radius - (d.tipChamfer - (z + props.length))\n : Infinity\n return Math.min(threaded, tip)\n })\n if (previous < 0) m.cap(current, z, false)\n else m.connect(previous, current)\n previous = current\n }\n const add = (z: number, radiusAt: (angle: number) => number) => {\n const current = m.ring(z, radiusAt)\n m.connect(previous, current)\n previous = current\n }\n add(0, () => d.headDiameter / 2)\n for (let i = 1; i <= 24; i++) {\n const z = (d.headHeight * i) / 24\n add(\n z,\n () =>\n d.crownArcCenterR +\n Math.sqrt(\n Math.max(0, d.crownRadius ** 2 - (z - d.crownArcCenterZ) ** 2),\n ),\n )\n }\n add(d.topZ, (angle) => hexRadius(angle, d.socketWidth))\n add(d.topZ - d.socketDepth, (angle) => hexRadius(angle, d.socketWidth))\n m.cap(previous, d.topZ - d.socketDepth, true)\n return { positions: m.positions, indices: m.indices }\n}\n","import { cableGrommetModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { CableGrommet } from \"./CableGrommet\"\n\nexport const model = defineModelRenderer({\n name: \"cablegrommet\",\n schema: cableGrommetModelDefinitionSchema,\n render: ({ fn, ...props }) => <CableGrommet {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { CableGrommetModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createCableGrommetMesh } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type CableGrommetProps = CableGrommetModelPropsInput & { color?: string }\n\nexport function createCableGrommetGeom(input: CableGrommetModelPropsInput) {\n return indexedMeshToGeom3(createCableGrommetMesh(input))\n}\n\nexport function CableGrommet({\n color = \"#343943\",\n ...props\n}: CableGrommetProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createCableGrommetGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createCableGrommetMesh } from \"./mesh\"\nexport type {\n CableGrommetMesh,\n CableGrommetMeshOptions,\n} from \"./mesh\"\n","import {\n cableGrommetModelPropsSchema,\n getCableGrommetDimensions,\n type CableGrommetModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\nexport interface CableGrommetMesh {\n positions: number[]\n indices: number[]\n}\n\nexport interface CableGrommetMeshOptions {\n /** Requested minimum; thin root walls can require more circular segments. */\n radialSegments?: number\n}\n\n/** Square-shouldered annulus centered on Z=0, with an open axial cable bore. */\nexport function createCableGrommetMesh(\n input: CableGrommetModelPropsInput,\n options: CableGrommetMeshOptions = {},\n): CableGrommetMesh {\n const props = cableGrommetModelPropsSchema.parse(input)\n const dimensions = getCableGrommetDimensions(props)\n const inner = props.innerDiameter / 2\n const root = dimensions.grooveRootDiameter / 2\n const outer = props.outerDiameter / 2\n const requested = options.radialSegments ?? 96\n if (\n !Number.isInteger(requested) ||\n requested < 12 ||\n requested > 4096 ||\n requested % 4 !== 0\n )\n throw new Error(\n \"Grommet radial segments must be a multiple of four in [12,4096]\",\n )\n // Keep exterior chord interiors beyond the nominal bore, even for thin walls.\n const wallAngle = Math.acos((inner + root) / (2 * root))\n const segments = Math.max(requested, 4 * Math.ceil(Math.PI / wallAngle / 4))\n if (!Number.isFinite(segments) || segments > 4096)\n throw new Error(\n \"Grommet wall exceeds mesh resolution limit (4096 segments)\",\n )\n\n const section: [number, number][] = [\n [inner, -props.height / 2],\n [outer, -props.height / 2],\n [outer, dimensions.grooveStartZ],\n [root, dimensions.grooveStartZ],\n [root, dimensions.grooveEndZ],\n [outer, dimensions.grooveEndZ],\n [outer, props.height / 2],\n [inner, props.height / 2],\n ]\n const positions: number[] = []\n const indices: number[] = []\n for (const [radius, z] of section)\n for (let sample = 0; sample < segments; sample++) {\n const angle = (sample * 2 * Math.PI) / segments\n positions.push(radius * Math.cos(angle), radius * Math.sin(angle), z)\n }\n for (let ring = 0; ring < section.length; ring++) {\n const a = ring * segments\n const b = ((ring + 1) % section.length) * segments\n for (let sample = 0; sample < segments; sample++) {\n const next = (sample + 1) % segments\n indices.push(\n a + sample,\n a + next,\n b + next,\n a + sample,\n b + next,\n b + sample,\n )\n }\n }\n return { positions, indices }\n}\n","import { clampingShaftCollarModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { ClampingShaftCollar } from \"./ClampingShaftCollar\"\n\nexport const model = defineModelRenderer({\n name: \"clampingshaftcollar\",\n schema: clampingShaftCollarModelDefinitionSchema,\n render: ({ fn, ...props }) => <ClampingShaftCollar {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { ClampingShaftCollarModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createClampingShaftCollarMesh } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type ClampingShaftCollarProps = ClampingShaftCollarModelPropsInput & {\n color?: string\n}\n\n/** Datum and mounting-hole coordinates follow the modelprinter contract. */\nexport function createClampingShaftCollarGeom(\n input: ClampingShaftCollarModelPropsInput,\n) {\n return indexedMeshToGeom3(createClampingShaftCollarMesh(input))\n}\n\nexport function ClampingShaftCollar({\n color = \"#737e8f\",\n ...props\n}: ClampingShaftCollarProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createClampingShaftCollarGeom(props)} />\n </Colorize>\n )\n}\nexport { createClampingShaftCollarMesh } from \"./mesh\"\nexport type { ClampingShaftCollarMesh } from \"./mesh\"\n","import jscad from \"@jscad/modeling\"\nimport {\n clampingShaftCollarModelPropsSchema,\n getClampingShaftCollarDimensions,\n type ClampingShaftCollarModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport {\n assertShaftMountResolution,\n createAnnularSleeve,\n createMountingHoleCutter,\n finishShaftMountMesh,\n subtractShaftMountParts,\n type ShaftMountMesh,\n} from \"../../mechanical/shaft-mount-geometry\"\n\nexport type ClampingShaftCollarMesh = ShaftMountMesh\n\n/** Geometry is driven by the corresponding modelprinter schema and hole layout. */\nexport function createClampingShaftCollarMesh(\n input: ClampingShaftCollarModelPropsInput,\n): ClampingShaftCollarMesh {\n const props = clampingShaftCollarModelPropsSchema.parse(input)\n const dimensions = getClampingShaftCollarDimensions(props)\n assertShaftMountResolution([dimensions.threadedHole])\n const body = createAnnularSleeve({\n outerRadius: props.outerDiameter / 2,\n boreARadius: props.boreDiameter / 2,\n length: props.width,\n chamfer: props.chamfer,\n })\n const s = dimensions.split\n const epsilon = 1e-4\n const slit = jscad.primitives.cuboid({\n size: [\n s.xMax - s.xMin + epsilon,\n s.yMax - s.yMin,\n s.zMax - s.zMin + 2 * epsilon,\n ],\n center: [\n (s.xMax + s.xMin + epsilon) / 2,\n (s.yMax + s.yMin) / 2,\n (s.zMax + s.zMin) / 2,\n ],\n })\n return finishShaftMountMesh(\n subtractShaftMountParts(\n body,\n slit,\n createMountingHoleCutter(dimensions.clearanceHole),\n createMountingHoleCutter(dimensions.threadedHole),\n ),\n )\n}\n","import jscad from \"@jscad/modeling\"\nimport { indexedMeshToGeom3 } from \"./indexedMeshToGeom3\"\n\ntype Geom3 = jscad.geometries.geom3.Geom3\nexport type ShaftMountMesh = { positions: number[]; indices: number[] }\nexport type MountingHole = {\n start: readonly [number, number, number]\n direction: readonly [number, number, number]\n diameter: number\n depth: number\n threadPitch?: number\n threadHand?: \"left\" | \"right\"\n}\nconst bodySegments = 64\nconst threadSegments = 24\nconst samplesPerTurn = 12\n\n/** A renderer allocation guard, independent of modelprinter's part contract. */\nexport function assertShaftMountResolution(holes: readonly MountingHole[]) {\n let triangles = 0\n for (const hole of holes) {\n const steps = hole.threadPitch\n ? Math.ceil((hole.depth / hole.threadPitch) * samplesPerTurn)\n : 1\n if (!Number.isFinite(steps) || steps > 768)\n throw new Error(\n \"Shaft mount exceeds mesh resolution limit (64 thread turns per hole)\",\n )\n triangles += (steps + 1) * threadSegments * 2\n }\n if (triangles > 100000)\n throw new Error(\"Shaft mount exceeds total mesh resolution limit\")\n}\n\n/** Revolve the contract meridian, including entry chamfers and a sharp midpoint\n * shoulder, with bore facets circumscribed around the nominal shaft clearance.\n * The caller obtains all dimensions from modelprinter.\n */\nexport function createAnnularSleeve({\n outerRadius,\n boreARadius,\n boreBRadius = boreARadius,\n length,\n chamfer,\n stepZ = length / 2,\n}: {\n outerRadius: number\n boreARadius: number\n boreBRadius?: number\n length: number\n chamfer: number\n stepZ?: number\n}): Geom3 {\n const halfAngle = Math.PI / bodySegments\n const cosine = Math.cos(halfAngle)\n // Outside polygons are inscribed; bore polygons circumscribe the nominal\n // shaft circle. Reject a ligament too thin to survive those approximations.\n if (\n (Math.max(boreARadius, boreBRadius) + chamfer) / cosine >=\n (outerRadius - chamfer) * cosine - 1e-6\n )\n throw new Error(\n \"Shaft mount wall/chamfer ligament exceeds mesh resolution limit\",\n )\n const raw: [number, number, boolean][] = [\n [0, outerRadius - chamfer, false],\n [chamfer, outerRadius, false],\n [length - chamfer, outerRadius, false],\n [length, outerRadius - chamfer, false],\n [length, boreBRadius + chamfer, true],\n [length - chamfer, boreBRadius, true],\n [stepZ, boreBRadius, true],\n [stepZ, boreARadius, true],\n [chamfer, boreARadius, true],\n [0, boreARadius + chamfer, true],\n ]\n const profile = raw.filter(\n ([z, r], i) => i === 0 || z !== raw[i - 1]![0] || r !== raw[i - 1]![1],\n )\n const positions: number[] = []\n const indices: number[] = []\n for (const [z, r, isBore] of profile)\n for (let i = 0; i < bodySegments; i++) {\n // Tangent flats at the cardinal axes preserve nominal shaft clearance\n // even where a radial thread crest reaches its analytic bore endpoint.\n const angle = ((i + (isBore ? 0.5 : 0)) * Math.PI * 2) / bodySegments\n const radius = isBore ? r / cosine : r\n positions.push(radius * Math.cos(angle), radius * Math.sin(angle), z)\n }\n for (let row = 0; row < profile.length; row++)\n for (let i = 0; i < bodySegments; i++) {\n const next = (i + 1) % bodySegments\n const a = row * bodySegments + i,\n b = row * bodySegments + next\n const c = ((row + 1) % profile.length) * bodySegments + next,\n d = ((row + 1) % profile.length) * bodySegments + i\n indices.push(a, b, c, a, c, d)\n }\n return indexedMeshToGeom3({ positions, indices })\n}\n\n/** Closed cutter with a truncated nominal 60-degree helical wall. Major\n * diameter equals the contract's thread diameter; hand follows the hole axis.\n * End extensions lie in the existing bore/slit/exterior, never in solid material.\n */\nexport function createMountingHoleCutter(hole: MountingHole): Geom3 {\n assertShaftMountResolution([hole])\n const pitch = hole.threadPitch\n const steps = pitch\n ? Math.max(2, Math.ceil((hole.depth / pitch) * samplesPerTurn))\n : 1\n const segments = pitch ? threadSegments : 48\n const extension = 1e-4\n const radius = hole.diameter / 2\n const threadDepth = pitch ? Math.min(pitch * 0.541266, radius * 0.8) : 0\n const hand = hole.threadHand === \"left\" ? -1 : 1\n const positions: number[] = []\n const indices: number[] = []\n const [dx, dy, dz] = hole.direction\n if (Math.abs(dz) > 1e-10 || Math.abs(Math.hypot(dx, dy) - 1) > 1e-10)\n throw new Error(\"Expected a horizontal unit hole axis\")\n const push = (x: number, y: number, z: number) => {\n // ex=world +Z, ey=(dy,-dx,0), ez=the documented hole direction.\n positions.push(\n hole.start[0] + y * dy + z * dx,\n hole.start[1] - y * dx + z * dy,\n hole.start[2] + x,\n )\n }\n for (let row = 0; row <= steps; row++) {\n const z = -extension + ((hole.depth + 2 * extension) * row) / steps\n for (let i = 0; i < segments; i++) {\n const angle = (i * Math.PI * 2) / segments\n const phase = pitch\n ? (((z / pitch - (hand * angle) / (Math.PI * 2)) % 1) + 1) % 1\n : 0\n const distance = Math.min(phase, 1 - phase)\n const r =\n radius -\n Math.min(\n threadDepth,\n Math.max(0, (distance - 1 / 8) * (pitch ?? 0) * Math.sqrt(3)),\n )\n push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n }\n for (let row = 0; row < steps; row++)\n for (let i = 0; i < segments; i++) {\n const next = (i + 1) % segments\n const a = row * segments + i,\n b = row * segments + next,\n c = (row + 1) * segments + next,\n d = (row + 1) * segments + i\n indices.push(a, b, c, a, c, d)\n }\n for (const end of [0, steps]) {\n const center = positions.length / 3\n push(0, 0, end === 0 ? -extension : hole.depth + extension)\n for (let i = 0; i < segments; i++) {\n const a = end * segments + i,\n b = end * segments + ((i + 1) % segments)\n indices.push(center, end === 0 ? b : a, end === 0 ? a : b)\n }\n }\n return indexedMeshToGeom3({ positions, indices })\n}\n\n/** Work above JSCAD's absolute BSP epsilon so small thread/bore intersection\n * fragments are retained. Scale back before producing the millimeter mesh.\n */\nexport function subtractShaftMountParts(\n body: Geom3,\n ...cutters: Geom3[]\n): Geom3 {\n const factor = 100\n const scaled = [body, ...cutters].map((geometry) =>\n jscad.transforms.scale([factor, factor, factor], geometry),\n )\n const result = jscad.booleans.subtract(scaled[0]!, ...scaled.slice(1))\n return jscad.transforms.scale([1 / factor, 1 / factor, 1 / factor], result)\n}\n\n/** Weld CSG seam coordinates, insert every missing T-junction vertex on an\n * unmatched edge, then triangulate with unsnapped face centers. A plain polygon\n * fan loses collinear seam vertices; JSCAD's snapped centers can move off-plane.\n */\nexport function finishShaftMountMesh(geometry: Geom3): ShaftMountMesh {\n const positions: number[] = []\n const vertices = new Map<string, number[]>()\n const tolerance = 1e-6\n const weld = (point: readonly number[]) => {\n const cell = point.map((v) => Math.floor(v / tolerance))\n for (let x = -1; x <= 1; x++)\n for (let y = -1; y <= 1; y++)\n for (let z = -1; z <= 1; z++) {\n const nearby =\n vertices.get(\n [cell[0]! + x, cell[1]! + y, cell[2]! + z].join(\",\"),\n ) ?? []\n for (const index of nearby)\n if (\n Math.hypot(\n ...point.map((v, axis) => v - positions[index * 3 + axis]!),\n ) < tolerance\n )\n return index\n }\n const index = positions.length / 3\n positions.push(...point)\n const key = cell.join(\",\")\n vertices.set(key, [...(vertices.get(key) ?? []), index])\n return index\n }\n const polygons = jscad.geometries.geom3\n .toPolygons(geometry)\n .map((polygon) =>\n polygon.vertices\n .map(weld)\n .filter((id, i, ids) => id !== ids[(i + ids.length - 1) % ids.length]),\n )\n .map((ids) => [...new Set(ids)])\n .filter((ids) => ids.length >= 3)\n .filter((ids) => {\n // A CSG sliver narrower than the weld tolerance has collapsed to a seam.\n // Keeping it while splitting its long edge would overlap adjacent faces.\n let longest = 0\n let origin: number[] = []\n let direction: number[] = []\n for (let i = 0; i < ids.length; i++)\n for (let j = i + 1; j < ids.length; j++) {\n const a = positions.slice(ids[i]! * 3, ids[i]! * 3 + 3)\n const delta = positions\n .slice(ids[j]! * 3, ids[j]! * 3 + 3)\n .map((v, axis) => v - a[axis]!)\n const squared = delta.reduce((sum, v) => sum + v * v, 0)\n if (squared > longest) {\n longest = squared\n origin = a\n direction = delta\n }\n }\n return ids.some((id) => {\n const delta = positions\n .slice(id * 3, id * 3 + 3)\n .map((v, axis) => v - origin[axis]!)\n const t =\n delta.reduce((sum, v, axis) => sum + v * direction[axis]!, 0) /\n longest\n return (\n Math.hypot(...delta.map((v, axis) => v - t * direction[axis]!)) >=\n tolerance\n )\n })\n })\n const edgeKey = (a: number, b: number) =>\n `${Math.min(a, b)},${Math.max(a, b)}`\n const edges = new Map<string, { a: number; b: number; count: number }>()\n for (const polygon of polygons)\n for (let i = 0; i < polygon.length; i++) {\n const a = polygon[i]!,\n b = polygon[(i + 1) % polygon.length]!,\n key = edgeKey(a, b)\n const edge = edges.get(key) ?? { a, b, count: 0 }\n edge.count++\n edges.set(key, edge)\n }\n const unmatched = [...edges.values()].filter((edge) => edge.count === 1)\n const candidates = [...new Set(unmatched.flatMap((edge) => [edge.a, edge.b]))]\n const splits = new Map<string, number[]>()\n for (const { a, b } of unmatched) {\n const origin = positions.slice(a * 3, a * 3 + 3)\n const direction = positions\n .slice(b * 3, b * 3 + 3)\n .map((v, axis) => v - origin[axis]!)\n const squared = direction.reduce((sum, v) => sum + v * v, 0)\n const points: { id: number; t: number }[] = []\n for (const id of candidates) {\n if (id === a || id === b) continue\n const delta = positions\n .slice(id * 3, id * 3 + 3)\n .map((v, axis) => v - origin[axis]!)\n const t =\n delta.reduce((sum, v, axis) => sum + v * direction[axis]!, 0) / squared\n if (t <= 0 || t >= 1) continue\n const distance = Math.hypot(\n ...delta.map((v, axis) => v - t * direction[axis]!),\n )\n if (distance < tolerance) points.push({ id, t })\n }\n points.sort((p, q) => p.t - q.t)\n splits.set(\n `${a},${b}`,\n points.map((p) => p.id),\n )\n splits.set(`${b},${a}`, points.map((p) => p.id).reverse())\n }\n const indices: number[] = []\n for (const polygon of polygons) {\n const perimeter = polygon.flatMap((a, i) => [\n a,\n ...(\n splits.get(`${a},${polygon[(i + 1) % polygon.length]!}`) ?? []\n ).filter((id) => !polygon.includes(id)),\n ])\n const unique = perimeter.filter(\n (id, i) =>\n id !== perimeter[(i + perimeter.length - 1) % perimeter.length],\n )\n if (unique.length === 3) {\n indices.push(...unique)\n continue\n }\n const center = positions.length / 3\n positions.push(\n ...[0, 1, 2].map(\n (axis) =>\n unique.reduce((sum, id) => sum + positions[id * 3 + axis]!, 0) /\n unique.length,\n ),\n )\n for (let i = 0; i < unique.length; i++)\n indices.push(center, unique[i]!, unique[(i + 1) % unique.length]!)\n }\n // Compact vertices after dropping zero-length CSG edges.\n const compact: number[] = []\n const remap = new Map<number, number>()\n return {\n positions: compact,\n indices: indices.map((index) => {\n let next = remap.get(index)\n if (next === undefined) {\n next = compact.length / 3\n remap.set(index, next)\n compact.push(...positions.slice(index * 3, index * 3 + 3))\n }\n return next\n }),\n }\n}\n","import { compressionSpringModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { CompressionSpring } from \"./CompressionSpring\"\n\nexport const model = defineModelRenderer({\n name: \"compressionspring\",\n schema: compressionSpringModelDefinitionSchema,\n render: ({ fn, ...props }) => <CompressionSpring {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { CompressionSpringModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createCompressionSpringMesh } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type CompressionSpringProps = CompressionSpringModelPropsInput & {\n color?: string\n}\n\nexport function createCompressionSpringGeom(\n input: CompressionSpringModelPropsInput,\n) {\n return indexedMeshToGeom3(createCompressionSpringMesh(input))\n}\n\nexport function CompressionSpring({\n color = \"#737e8f\",\n ...props\n}: CompressionSpringProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createCompressionSpringGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createCompressionSpringMesh } from \"./mesh\"\nexport type {\n CompressionSpringMesh,\n CompressionSpringMeshOptions,\n} from \"./mesh\"\n","import {\n compressionSpringModelPropsSchema,\n getCompressionSpringCenterlinePoint,\n getCompressionSpringDimensions,\n type CompressionSpringModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport { clipMeshToZRange } from \"../../mechanical/clip-mesh-to-z-range\"\n\nexport interface CompressionSpringMesh {\n positions: number[]\n indices: number[]\n}\n\nexport interface CompressionSpringMeshOptions {\n segmentsPerTurn?: number\n wireSegments?: number\n}\n\n/** Imported piecewise centerline, radial/axial wire sections, planar ground ends. */\nexport function createCompressionSpringMesh(\n input: CompressionSpringModelPropsInput,\n options: CompressionSpringMeshOptions = {},\n): CompressionSpringMesh {\n const props = compressionSpringModelPropsSchema.parse(input)\n const dimensions = getCompressionSpringDimensions(props)\n const segmentsPerTurn = options.segmentsPerTurn ?? 64\n const wireSegments = options.wireSegments ?? 24\n for (const [name, value, minimum, maximum] of [\n [\"segmentsPerTurn\", segmentsPerTurn, 16, 256],\n [\"wireSegments\", wireSegments, 8, 64],\n ] as const)\n if (\n !Number.isInteger(value) ||\n value < minimum ||\n value > maximum ||\n value % 4 !== 0\n )\n throw new Error(\n `${name} must be a multiple of four in [${minimum},${maximum}]`,\n )\n const steps = props.totalTurns * segmentsPerTurn\n if (!Number.isSafeInteger(steps) || (steps + 1) * wireSegments > 250000)\n throw new Error(\"Spring exceeds mesh resolution limit (250000 vertices)\")\n const scale = Math.max(props.outerDiameter, props.freeLength)\n if (\n dimensions.activePitch - props.wireDiameter <= scale * 1e-10 ||\n props.wireDiameter <= scale * 1e-10 ||\n dimensions.insideDiameter <= scale * 1e-10\n )\n throw new Error(\"Spring clearance exceeds mesh resolution limit\")\n\n const positions: number[] = []\n const indices: number[] = []\n const wireRadius = props.wireDiameter / 2\n for (let step = 0; step <= steps; step++) {\n const center = getCompressionSpringCenterlinePoint(\n props,\n step / segmentsPerTurn,\n )\n const meanRadius = Math.hypot(center.x, center.y)\n for (let sample = 0; sample < wireSegments; sample++) {\n const angle = (sample * 2 * Math.PI) / wireSegments\n // Exact cardinal section samples keep both bearing cuts and diameters exact.\n const cosine =\n sample === wireSegments / 4 || sample === (3 * wireSegments) / 4\n ? 0\n : Math.cos(angle)\n const sine =\n sample === 0 || sample === wireSegments / 2 ? 0 : Math.sin(angle)\n const radialOffset = wireRadius * cosine\n positions.push(\n center.x + (radialOffset * center.x) / meanRadius,\n center.y + (radialOffset * center.y) / meanRadius,\n center.z + wireRadius * sine,\n )\n }\n }\n const triangle = (a: number, b: number, c: number) => {\n if (props.hand === \"left\") indices.push(a, c, b)\n else indices.push(a, b, c)\n }\n for (let step = 0; step < steps; step++)\n for (let sample = 0; sample < wireSegments; sample++) {\n const next = (sample + 1) % wireSegments\n const a = step * wireSegments\n const b = (step + 1) * wireSegments\n triangle(a + sample, b + sample, b + next)\n triangle(a + sample, b + next, a + next)\n }\n // Terminal sections are cut in their radial/axial planes, before grinding.\n for (let corner = 1; corner + 1 < wireSegments; corner++) {\n triangle(0, corner, corner + 1)\n const end = steps * wireSegments\n triangle(end, end + corner + 1, end + corner)\n }\n return clipMeshToZRange(\n { positions, indices },\n dimensions.lowerBearingZ,\n dimensions.upperBearingZ,\n )\n}\n","import earcut from \"earcut\"\n\ntype Point = { key: string; coordinates: [number, number, number] }\ntype Mesh = { positions: number[]; indices: number[] }\n\n/** Clip triangles with shared edge intersections, then close the planar cuts. */\nexport function clipMeshToZRange(\n mesh: Mesh,\n lower: number,\n upper: number,\n): Mesh {\n const originals: Point[] = []\n const tolerance = 32 * Number.EPSILON * (upper - lower)\n for (let index = 0; index < mesh.positions.length / 3; index++)\n originals.push({\n key: `v${index}`,\n coordinates: [\n mesh.positions[index * 3]!,\n mesh.positions[index * 3 + 1]!,\n Math.abs(mesh.positions[index * 3 + 2]! - lower) <= tolerance\n ? lower\n : Math.abs(mesh.positions[index * 3 + 2]! - upper) <= tolerance\n ? upper\n : mesh.positions[index * 3 + 2]!,\n ],\n })\n const intersections = new Map<string, Point>()\n const crossing = (a: Point, b: Point, plane: number) => {\n if (a.coordinates[2] === plane) return a\n if (b.coordinates[2] === plane) return b\n const [first, second] = a.key < b.key ? [a, b] : [b, a]\n const key = `${plane}:${first.key}:${second.key}`\n let point = intersections.get(key)\n if (!point) {\n const fraction =\n (plane - first.coordinates[2]) /\n (second.coordinates[2] - first.coordinates[2])\n point = {\n key,\n coordinates: [\n first.coordinates[0] +\n fraction * (second.coordinates[0] - first.coordinates[0]),\n first.coordinates[1] +\n fraction * (second.coordinates[1] - first.coordinates[1]),\n plane,\n ],\n }\n intersections.set(key, point)\n }\n return point\n }\n const clip = (polygon: Point[], plane: number, keepAbove: boolean) => {\n const result: Point[] = []\n const inside = (point: Point) =>\n keepAbove ? point.coordinates[2] >= plane : point.coordinates[2] <= plane\n for (let index = 0; index < polygon.length; index++) {\n const a = polygon[index]!\n const b = polygon[(index + 1) % polygon.length]!\n if (inside(a)) result.push(a)\n if (inside(a) !== inside(b)) result.push(crossing(a, b, plane))\n }\n return result.filter(\n (point, index) =>\n point.key !== result[(index + result.length - 1) % result.length]?.key,\n )\n }\n const positions: number[] = []\n const indices: number[] = []\n const pointIndices = new Map<string, number>()\n const vertex = (point: Point) => {\n let index = pointIndices.get(point.key)\n if (index === undefined) {\n index = positions.length / 3\n positions.push(...point.coordinates)\n pointIndices.set(point.key, index)\n }\n return index\n }\n for (let index = 0; index < mesh.indices.length; index += 3) {\n const triangle = mesh.indices\n .slice(index, index + 3)\n .map((i) => originals[i]!)\n const polygon = clip(clip(triangle, lower, true), upper, false)\n for (let corner = 1; corner + 1 < polygon.length; corner++) {\n const points = [polygon[0]!, polygon[corner]!, polygon[corner + 1]!]\n if (new Set(points.map((point) => point.key)).size === 3)\n indices.push(...points.map(vertex))\n }\n }\n\n const edges = new Map<string, { from: number; to: number; count: number }>()\n for (let index = 0; index < indices.length; index += 3)\n for (let side = 0; side < 3; side++) {\n const from = indices[index + side]!\n const to = indices[index + ((side + 1) % 3)]!\n const key = `${Math.min(from, to)},${Math.max(from, to)}`\n const prior = edges.get(key)\n if (prior) prior.count++\n else edges.set(key, { from, to, count: 1 })\n }\n const boundary = [...edges.values()].filter((edge) => edge.count === 1)\n const outgoing = new Map(boundary.map(({ from, to }) => [from, to]))\n if (outgoing.size !== boundary.length)\n throw new Error(\"Ground clipping produced an ambiguous boundary\")\n while (outgoing.size > 0) {\n const start = outgoing.keys().next().value!\n const loop: number[] = []\n let current = start\n do {\n loop.push(current)\n const next = outgoing.get(current)\n if (next === undefined)\n throw new Error(\"Ground clipping produced an open boundary\")\n outgoing.delete(current)\n current = next\n } while (current !== start)\n const plane = positions[3 * start + 2]!\n if (\n (plane !== lower && plane !== upper) ||\n loop.some((i) => positions[3 * i + 2] !== plane)\n )\n throw new Error(\"Ground clipping boundary must lie on an end plane\")\n const coordinates = loop.flatMap((i) => [\n positions[3 * i]!,\n positions[3 * i + 1]!,\n ])\n const cap = earcut(coordinates)\n for (let index = 0; index < cap.length; index += 3) {\n const a = loop[cap[index]!]!\n let b = loop[cap[index + 1]!]!\n let c = loop[cap[index + 2]!]!\n const cross =\n (positions[b * 3]! - positions[a * 3]!) *\n (positions[c * 3 + 1]! - positions[a * 3 + 1]!) -\n (positions[b * 3 + 1]! - positions[a * 3 + 1]!) *\n (positions[c * 3]! - positions[a * 3]!)\n if ((plane === lower && cross > 0) || (plane === upper && cross < 0))\n [b, c] = [c, b]\n indices.push(a, b, c)\n }\n }\n return { positions, indices }\n}\n","import { flangedBushingModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { FlangedBushing } from \"./FlangedBushing\"\n\nexport const model = defineModelRenderer({\n name: \"flangedbushing\",\n schema: flangedBushingModelDefinitionSchema,\n render: ({ fn, ...props }) => <FlangedBushing {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { FlangedBushingModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createFlangedBushingMesh } from \"./mesh\"\n\nexport type FlangedBushingProps = FlangedBushingModelPropsInput & {\n color?: string\n}\n\n/** Square integral flange at the Z=0 end; bore continues through overall length. */\nexport function createFlangedBushingGeom(input: FlangedBushingModelPropsInput) {\n return indexedMeshToGeom3(createFlangedBushingMesh(input))\n}\n\nexport function FlangedBushing({\n color = \"#a18450\",\n ...props\n}: FlangedBushingProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createFlangedBushingGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createFlangedBushingMesh } from \"./mesh\"\nexport type { FlangedBushingMesh } from \"./mesh\"\n","import {\n flangedBushingModelPropsSchema,\n getFlangedBushingDimensions,\n type FlangedBushingModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\n/** Shared ring vertices and outward counterclockwise triangles, in millimeters. */\nexport interface FlangedBushingMesh {\n positions: number[]\n indices: number[]\n}\n\n/** Integral flange at Z=0..flangeThickness; total length includes the flange. */\nexport function createFlangedBushingMesh(\n input: FlangedBushingModelPropsInput,\n): FlangedBushingMesh {\n const props = flangedBushingModelPropsSchema.parse(input)\n const d = getFlangedBushingDimensions(props)\n const ri = d.innerDiameter / 2\n const ro = d.outerDiameter / 2\n const rf = d.flangeDiameter / 2\n // One continuous boundary, not two overlapping sleeves: the shoulder belongs\n // to the exterior and the bore remains uninterrupted through the flange.\n const profile: [number, number][] = [\n [rf, 0],\n [rf, d.shoulderZ],\n [ro, d.shoulderZ],\n [ro, d.length],\n [ri, d.length],\n [ri, 0],\n ]\n const segments = 96 // Four cardinal directions are exact; allocation is fixed.\n const positions: number[] = []\n const indices: number[] = []\n for (const [radius, z] of profile)\n for (let i = 0; i < segments; i++) {\n const angle = (i * Math.PI * 2) / segments\n positions.push(radius * Math.cos(angle), radius * Math.sin(angle), z)\n }\n for (let ring = 0; ring < profile.length; ring++) {\n const a = ring * segments\n const b = ((ring + 1) % profile.length) * segments\n for (let i = 0; i < segments; i++) {\n const next = (i + 1) % segments\n indices.push(a + i, a + next, b + next, a + i, b + next, b + i)\n }\n }\n return { positions, indices }\n}\n","import { flatHeadScrewModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { FlatHeadScrew } from \"./FlatHeadScrew\"\n\nexport const model = defineModelRenderer({\n name: \"flatheadscrew\",\n schema: flatHeadScrewModelDefinitionSchema,\n render: ({ fn, ...props }) => <FlatHeadScrew {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { FlatHeadScrewModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createFlatHeadScrewMesh, type FlatHeadScrewMeshOptions } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type FlatHeadScrewProps = FlatHeadScrewModelPropsInput & {\n color?: string\n}\nexport function createFlatHeadScrewGeom(\n input: FlatHeadScrewModelPropsInput,\n options?: FlatHeadScrewMeshOptions,\n) {\n return indexedMeshToGeom3(createFlatHeadScrewMesh(input, options))\n}\nexport function FlatHeadScrew({\n color = \"#737e8f\",\n ...props\n}: FlatHeadScrewProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createFlatHeadScrewGeom(props)} />\n </Colorize>\n )\n}\nexport { createFlatHeadScrewMesh } from \"./mesh\"\nexport type {\n FlatHeadScrewMesh,\n FlatHeadScrewMeshOptions,\n} from \"./mesh\"\n","import {\n flatHeadScrewModelPropsSchema,\n type FlatHeadScrewModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\nexport interface FlatHeadScrewMeshOptions {\n radialSegments?: number\n threadStepsPerTurn?: number\n}\n\n/** Outward-oriented, welded indexed surface, in millimeters. */\nexport interface FlatHeadScrewMesh {\n positions: number[]\n indices: number[]\n}\n\nexport function createFlatHeadScrewMesh(\n input: FlatHeadScrewModelPropsInput,\n options: FlatHeadScrewMeshOptions = {},\n): FlatHeadScrewMesh {\n const p = flatHeadScrewModelPropsSchema.parse(input)\n const segments = options.radialSegments ?? 96\n const axial = options.threadStepsPerTurn ?? 24\n if (\n !Number.isInteger(segments) ||\n segments < 24 ||\n segments > 192 ||\n segments % 24 !== 0 ||\n !Number.isInteger(axial) ||\n axial < 24 ||\n axial > 96\n )\n throw new Error(\n \"Screw mesh resolution requires 24..192 radial segments divisible by 24 and 24..96 thread steps\",\n )\n const positions: number[] = [],\n indices: number[] = []\n const welded = new Map<string, number>()\n const vertex = (x: number, y: number, z: number) => {\n const key = [x, y, z].map((v) => Math.round(v * 1e10)).join(\":\")\n const existing = welded.get(key)\n if (existing !== undefined) return existing\n const index = positions.length / 3\n positions.push(x, y, z)\n welded.set(key, index)\n return index\n }\n const triangle = (a: number, b: number, c: number) => {\n if (a === b || b === c || c === a) return\n const point = (i: number) => positions.slice(3 * i, 3 * i + 3)\n const A = point(a),\n B = point(b),\n C = point(c)\n const u = B.map((v, i) => v - A[i]!),\n v = C.map((w, i) => w - A[i]!)\n const area = Math.hypot(\n u[1]! * v[2]! - u[2]! * v[1]!,\n u[2]! * v[0]! - u[0]! * v[2]!,\n u[0]! * v[1]! - u[1]! * v[0]!,\n )\n if (area > 1e-12) indices.push(a, b, c)\n }\n const ring = (\n radiusAt: (theta: number) => number,\n zAt: number | ((theta: number) => number),\n ) =>\n Array.from({ length: segments }, (_, i) => {\n const theta = (i * 2 * Math.PI) / segments,\n r = radiusAt(theta)\n return vertex(\n r * Math.cos(theta),\n r * Math.sin(theta),\n typeof zAt === \"number\" ? zAt : zAt(theta),\n )\n })\n const connect = (a: number[], b: number[]) => {\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n triangle(a[i]!, a[n]!, b[n]!)\n triangle(a[i]!, b[n]!, b[i]!)\n }\n }\n const cap = (a: number[], z: number, up: boolean) => {\n const c = vertex(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n up ? triangle(c, a[i]!, a[n]!) : triangle(c, a[n]!, a[i]!)\n }\n }\n let previous: number[] = []\n const add = (\n radiusAt: (theta: number) => number,\n zAt: number | ((theta: number) => number),\n ) => {\n const r = ring(radiusAt, zAt)\n if (previous.length) connect(previous, r)\n previous = r\n return r\n }\n const major = p.diameter / 2,\n minor = p.threadRootDiameter / 2,\n pitch = p.threadPitch\n const shaftEnd = -p.headHeight - p.underHeadRadius * (Math.sqrt(2) - 1)\n const steps = p.showThreads\n ? Math.ceil(((shaftEnd + p.length) / pitch) * axial)\n : 1\n if ((steps + 100) * segments > 400000)\n throw new Error(\"Screw exceeds mesh resolution limit\")\n const levels = new Set<number>([\n -p.length,\n -p.length + p.tipChamfer,\n shaftEnd,\n ])\n if (p.showThreads)\n for (let i = 0; i <= steps; i++)\n levels.add(-p.length + ((shaftEnd + p.length) * i) / steps)\n for (const z of [...levels].sort((a, b) => a - b)) {\n const r = add((theta) => {\n // Phase is fixed at +X on the nominal tip plane, before chamfer clipping.\n const phase =\n ((((z + p.length) / pitch -\n ((p.threadHand === \"right\" ? 1 : -1) * theta) / (2 * Math.PI)) %\n 1) +\n 1) %\n 1\n const d = Math.min(phase, 1 - phase)\n const groove = Math.min(\n major - minor,\n Math.max(0, (d - 1 / 16) * pitch * Math.sqrt(3)),\n )\n const thread = p.showThreads ? major - groove : major\n return Math.min(\n thread,\n major - Math.max(0, p.tipChamfer - (z + p.length)),\n )\n }, z)\n if (z === -p.length) cap(r, z, false)\n }\n // Tangent circular under-head blend; its start also trims incomplete crests.\n add(() => major, shaftEnd)\n const filletCenterR = major + p.underHeadRadius\n const filletCenterZ = shaftEnd\n for (let i = 1; i <= 16; i++) {\n const angle = Math.PI - ((Math.PI - (3 * Math.PI) / 4) * i) / 16\n add(\n () => filletCenterR + p.underHeadRadius * Math.cos(angle),\n filletCenterZ + p.underHeadRadius * Math.sin(angle),\n )\n }\n\n const hexRadius = (theta: number) =>\n p.socketAcrossFlats /\n 2 /\n Math.max(\n Math.abs(Math.sin(theta)),\n Math.abs(Math.sin(theta + (2 * Math.PI) / 3)),\n Math.abs(Math.sin(theta + (4 * Math.PI) / 3)),\n )\n add(() => p.headDiameter / 2, 0)\n add(hexRadius, 0)\n add(hexRadius, -p.socketDepth)\n cap(previous, -p.socketDepth, true)\n\n return { positions, indices }\n}\n","import { flexScreenModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { FlexScreen } from \"../../FlexScreen\"\n\nexport const model = defineModelRenderer({\n name: \"flexscreen\",\n schema: flexScreenModelDefinitionSchema,\n render: ({ fn, ...props }) => <FlexScreen {...props} />,\n pads: \"footprinter\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import {\n Colorize,\n Cuboid,\n Hull,\n Rotate,\n RoundedCuboid,\n Translate,\n} from \"jscad-fiber\"\nimport { Fragment } from \"react\"\nimport { Screen } from \"./Screen\"\n\ntype Point3 = [number, number, number]\ntype Rotation3 = [number | string, number | string, number | string]\n\nexport type FlexScreenOrientation =\n | \"sitsFlat\"\n | \"sitsFlatBelowBoard\"\n | \"foldedToFaceAboveBoard\"\n | \"foldedToFaceBelowBoard\"\n | \"foldedToRightAngleAboveBoard\"\n | \"foldedToRightAngleBelowBoard\"\n\nexport type FlexScreenAspectRatio =\n | number\n | `${number}:${number}`\n | readonly [number, number]\n\nexport interface FlexScreenProps {\n /** Explicit screen width. If height is omitted, it is derived from the ratio. */\n width?: number\n /** Explicit screen height. If width is omitted, it is derived from the ratio. */\n height?: number\n /** Screen diagonal. Used with the ratio unless one other dimension is supplied. */\n diagonal?: number\n /** Width-to-height ratio. Accepts 1.777, \"16:9\", or [16, 9]. */\n aspectRatio?: FlexScreenAspectRatio\n /** Alias for aspectRatio. aspectRatio takes precedence when both are supplied. */\n ratio?: FlexScreenAspectRatio\n /** Diagonal used when width, height, and diagonal are all omitted. */\n defaultDiagonal?: number\n\n orientation?: FlexScreenOrientation\n /** Boolean orientation shortcuts for footprint/configuration builders. */\n sitsFlat?: boolean\n sitsFlatBelowBoard?: boolean\n foldedToFaceAboveBoard?: boolean\n foldedToFaceBelowBoard?: boolean\n /** Concise aliases for the 180-degree face-above/face-below folds. */\n foldsAboveBoard?: boolean\n foldsBelowBoard?: boolean\n foldedToRightAngleAboveBoard?: boolean\n foldedToRightAngleBelowBoard?: boolean\n\n screenThickness?: number\n bezelInset?: number\n bezelDepth?: number\n activeAreaWidth?: number\n activeAreaHeight?: number\n screenColor?: string\n bezelColor?: string\n showScreen?: boolean\n\n /** Centerline length of the modeled cable route. */\n flexCableLength?: number\n /** Cable body width. The connector end widens when its contacts need more room. */\n flexCableWidth?: number\n flexCableThickness?: number\n flexCableColor?: string\n /** Number of connector contacts, matching FPC.pinCount. */\n pinCount?: number\n /** Center-to-center connector contact spacing, matching FPC.pitch. */\n pitch?: number\n /** Connector contact width, matching FPC.padWidth (footprinter pw). */\n padWidth?: number\n /** Exposed contact length, matching FPC.padLength (footprinter pl). */\n padLength?: number\n /** Straight length of the widened connector end, before the taper. */\n tailLength?: number\n /** Length of the transition from the widened tail to the cable body. */\n taperLength?: number\n /** @deprecated Use pinCount. */\n conductorCount?: number\n /** @deprecated Use pitch. */\n conductorPitch?: number\n /** @deprecated Use padWidth. */\n conductorWidth?: number\n conductorThickness?: number\n conductorColor?: string\n cableEdgeMargin?: number\n /** @deprecated Use padLength. */\n exposedContactLength?: number\n showConductors?: boolean\n showFlexCable?: boolean\n\n showStiffeners?: boolean\n stiffenerLength?: number\n stiffenerThickness?: number\n stiffenerColor?: string\n\n /** Radius of the 90-degree cable bend in right-angle presets. */\n bendRadius?: number\n /** Number of straight segments used to approximate a 90-degree bend. */\n bendSegments?: number\n /** Straight cable length after the bend before the screen attachment. */\n rightAngleVerticalLead?: number\n /** Screen backplane distance above the board for a 180-degree upward fold. */\n distanceAboveBoard?: number\n /** Screen backplane distance below the board for a 180-degree downward fold. */\n distanceBelowBoard?: number\n /** Straight distance from the connector to the start of a 180-degree fold. */\n foldDistanceFromConnector?: number\n /** Maximum distance the 180-degree loop extends beyond the fold start. */\n foldOutset?: number\n /** Number of straight segments used to approximate a 180-degree fold. */\n foldSegments?: number\n screenGap?: number\n\n /** Board reference used to place above/below presets. The board is not rendered. */\n boardTopZ?: number\n boardThickness?: number\n boardClearance?: number\n cableStartX?: number\n cableStartY?: number\n /** Overrides the preset-derived cable centerline Z at the connector end. */\n cableStartZ?: number\n cableLateralOffset?: number\n\n /** Added after the orientation preset computes the screen attachment pose. */\n screenOffset?: { x?: number; y?: number; z?: number }\n /** Replaces the orientation preset's screen rotation. */\n screenRotation?: Rotation3\n /** Rotates the complete assembly around its cable origin. */\n rotation?: Rotation3\n /** Translates the complete assembly after rotation. */\n offset?: { x?: number; y?: number; z?: number }\n}\n\nexport interface ResolvedFlexScreenSize {\n width: number\n height: number\n diagonal: number\n aspectRatio: number\n}\n\nconst DEFAULT_ASPECT_RATIO = 16 / 9\nconst DEFAULT_DIAGONAL = 40\nconst EPSILON = 1e-6\n\nconst assertPositive = (name: string, value: number) => {\n if (!Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be a finite number greater than zero`)\n }\n}\n\nconst resolveAspectRatio = (\n value: FlexScreenAspectRatio | undefined,\n): number => {\n if (value === undefined) return DEFAULT_ASPECT_RATIO\n if (typeof value === \"number\") {\n assertPositive(\"aspectRatio\", value)\n return value\n }\n if (typeof value !== \"string\") {\n const [ratioWidth, ratioHeight] = value\n assertPositive(\"aspectRatio width\", ratioWidth)\n assertPositive(\"aspectRatio height\", ratioHeight)\n return ratioWidth / ratioHeight\n }\n const parts = value.split(\":\")\n if (parts.length !== 2) {\n throw new Error('aspectRatio must look like \"16:9\"')\n }\n const ratioWidth = Number(parts[0])\n const ratioHeight = Number(parts[1])\n assertPositive(\"aspectRatio width\", ratioWidth)\n assertPositive(\"aspectRatio height\", ratioHeight)\n return ratioWidth / ratioHeight\n}\n\nexport const resolveFlexScreenSize = ({\n width,\n height,\n diagonal,\n aspectRatio,\n ratio,\n defaultDiagonal = DEFAULT_DIAGONAL,\n}: Pick<\n FlexScreenProps,\n \"width\" | \"height\" | \"diagonal\" | \"aspectRatio\" | \"ratio\" | \"defaultDiagonal\"\n>): ResolvedFlexScreenSize => {\n const resolvedRatio = resolveAspectRatio(aspectRatio ?? ratio)\n\n if (width !== undefined) assertPositive(\"width\", width)\n if (height !== undefined) assertPositive(\"height\", height)\n if (diagonal !== undefined) assertPositive(\"diagonal\", diagonal)\n assertPositive(\"defaultDiagonal\", defaultDiagonal)\n\n let resolvedWidth: number\n let resolvedHeight: number\n\n if (width !== undefined && height !== undefined) {\n resolvedWidth = width\n resolvedHeight = height\n } else if (diagonal !== undefined && width !== undefined) {\n if (width >= diagonal) {\n throw new Error(\"width must be smaller than diagonal\")\n }\n resolvedWidth = width\n resolvedHeight = Math.sqrt(diagonal ** 2 - width ** 2)\n } else if (diagonal !== undefined && height !== undefined) {\n if (height >= diagonal) {\n throw new Error(\"height must be smaller than diagonal\")\n }\n resolvedWidth = Math.sqrt(diagonal ** 2 - height ** 2)\n resolvedHeight = height\n } else if (width !== undefined) {\n resolvedWidth = width\n resolvedHeight = width / resolvedRatio\n } else if (height !== undefined) {\n resolvedWidth = height * resolvedRatio\n resolvedHeight = height\n } else {\n const resolvedDiagonal = diagonal ?? defaultDiagonal\n resolvedHeight = resolvedDiagonal / Math.sqrt(resolvedRatio ** 2 + 1)\n resolvedWidth = resolvedHeight * resolvedRatio\n }\n\n return {\n width: resolvedWidth,\n height: resolvedHeight,\n diagonal: Math.hypot(resolvedWidth, resolvedHeight),\n aspectRatio: resolvedWidth / resolvedHeight,\n }\n}\n\nconst resolveOrientation = (props: FlexScreenProps): FlexScreenOrientation => {\n const shortcuts = [\n [\"sitsFlat\", props.sitsFlat],\n [\"sitsFlatBelowBoard\", props.sitsFlatBelowBoard],\n [\"foldedToFaceAboveBoard\", props.foldedToFaceAboveBoard],\n [\"foldedToFaceBelowBoard\", props.foldedToFaceBelowBoard],\n [\"foldedToFaceAboveBoard\", props.foldsAboveBoard],\n [\"foldedToFaceBelowBoard\", props.foldsBelowBoard],\n [\"foldedToRightAngleAboveBoard\", props.foldedToRightAngleAboveBoard],\n [\"foldedToRightAngleBelowBoard\", props.foldedToRightAngleBelowBoard],\n ].filter((entry) => entry[1]) as Array<[FlexScreenOrientation, boolean]>\n\n if (shortcuts.length > 1) {\n throw new Error(\n \"Only one FlexScreen boolean orientation shortcut can be true\",\n )\n }\n return shortcuts[0]?.[0] ?? props.orientation ?? \"sitsFlat\"\n}\n\nconst distance = (a: Point3, b: Point3) =>\n Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2])\n\nconst interpolate = (a: Point3, b: Point3, progress: number): Point3 => [\n a[0] + (b[0] - a[0]) * progress,\n a[1] + (b[1] - a[1]) * progress,\n a[2] + (b[2] - a[2]) * progress,\n]\n\nconst getPathDistances = (points: readonly Point3[]) => {\n const distances = [0]\n for (let index = 1; index < points.length; index += 1) {\n distances.push(\n distances[index - 1]! + distance(points[index - 1]!, points[index]!),\n )\n }\n return distances\n}\n\nconst pointAtDistance = (\n points: readonly Point3[],\n distances: readonly number[],\n targetDistance: number,\n): Point3 => {\n if (targetDistance <= 0) return points[0]!\n const totalLength = distances.at(-1)!\n if (targetDistance >= totalLength) return points.at(-1)!\n\n for (let index = 1; index < points.length; index += 1) {\n if (distances[index]! >= targetDistance) {\n const segmentStart = distances[index - 1]!\n const segmentLength = distances[index]! - segmentStart\n return interpolate(\n points[index - 1]!,\n points[index]!,\n (targetDistance - segmentStart) / segmentLength,\n )\n }\n }\n return points.at(-1)!\n}\n\nconst slicePath = (\n points: readonly Point3[],\n startDistance: number,\n endDistance: number,\n): Point3[] => {\n const distances = getPathDistances(points)\n const totalLength = distances.at(-1)!\n const safeStart = Math.max(0, Math.min(startDistance, totalLength))\n const safeEnd = Math.max(safeStart, Math.min(endDistance, totalLength))\n const result = [pointAtDistance(points, distances, safeStart)]\n\n for (let index = 1; index < points.length - 1; index += 1) {\n if (distances[index]! > safeStart && distances[index]! < safeEnd) {\n result.push(points[index]!)\n }\n }\n result.push(pointAtDistance(points, distances, safeEnd))\n return result\n}\n\nconst createFlatPath = (start: Point3, flexCableLength: number): Point3[] => [\n start,\n [start[0], start[1] + flexCableLength, start[2]],\n]\n\nconst createFoldedPath = ({\n start,\n endZ,\n flexCableLength,\n foldDistanceFromConnector,\n foldOutset,\n foldSegments,\n}: {\n start: Point3\n endZ: number\n flexCableLength: number\n foldDistanceFromConnector: number\n foldOutset: number\n foldSegments: number\n}): Point3[] => {\n const points: Point3[] = [start]\n const foldStart: Point3 = [\n start[0],\n start[1] + foldDistanceFromConnector,\n start[2],\n ]\n if (foldDistanceFromConnector > EPSILON) points.push(foldStart)\n\n for (let index = 1; index <= foldSegments; index += 1) {\n const angle = (Math.PI * index) / foldSegments\n points.push([\n start[0],\n foldStart[1] + foldOutset * Math.sin(angle),\n start[2] + ((endZ - start[2]) * (1 - Math.cos(angle))) / 2,\n ])\n }\n\n const minimumLength = getPathDistances(points).at(-1)!\n if (minimumLength > flexCableLength + EPSILON) {\n throw new Error(\n `flexCableLength must be at least ${minimumLength.toFixed(2)} for this 180-degree fold`,\n )\n }\n\n const tailLength = Math.max(0, flexCableLength - minimumLength)\n if (tailLength > EPSILON) {\n const foldEnd = points.at(-1)!\n points.push([foldEnd[0], foldEnd[1] - tailLength, foldEnd[2]])\n }\n return points\n}\n\nconst createRightAnglePath = ({\n start,\n flexCableLength,\n bendRadius,\n bendSegments,\n verticalLead,\n direction,\n}: {\n start: Point3\n flexCableLength: number\n bendRadius: number\n bendSegments: number\n verticalLead: number\n direction: 1 | -1\n}): Point3[] => {\n const bendLengthPerRadius =\n 2 * bendSegments * Math.sin(Math.PI / (4 * bendSegments))\n const resolvedRadius = Math.min(\n bendRadius,\n flexCableLength / bendLengthPerRadius,\n )\n const bendLength = resolvedRadius * bendLengthPerRadius\n const remainingLength = Math.max(0, flexCableLength - bendLength)\n const resolvedVerticalLead = Math.min(verticalLead, remainingLength * 0.45)\n const horizontalLength = remainingLength - resolvedVerticalLead\n const points: Point3[] = [start]\n\n if (horizontalLength > EPSILON) {\n points.push([start[0], start[1] + horizontalLength, start[2]])\n }\n\n for (let index = 1; index <= bendSegments; index += 1) {\n const angle = ((Math.PI / 2) * index) / bendSegments\n points.push([\n start[0],\n start[1] + horizontalLength + resolvedRadius * Math.sin(angle),\n start[2] + direction * resolvedRadius * (1 - Math.cos(angle)),\n ])\n }\n\n if (resolvedVerticalLead > EPSILON) {\n const arcEnd = points.at(-1)!\n points.push([\n arcEnd[0],\n arcEnd[1],\n arcEnd[2] + direction * resolvedVerticalLead,\n ])\n }\n return points\n}\n\nconst CableStrip = ({\n points,\n width,\n thickness,\n color,\n acrossOffset = 0,\n normalOffset = 0,\n overlap = 0.03,\n widthAtDistance,\n startDistance = 0,\n}: {\n points: readonly Point3[]\n width: number\n thickness: number\n color: string\n acrossOffset?: number\n normalOffset?: number\n overlap?: number\n widthAtDistance?: (distance: number) => number\n startDistance?: number\n}) => {\n const distances = getPathDistances(points)\n return (\n <Colorize color={color}>\n {points.slice(1).map((point, index) => {\n const previous = points[index]!\n const dx = point[0] - previous[0]\n const dy = point[1] - previous[1]\n const dz = point[2] - previous[2]\n const segmentLength = Math.hypot(dx, dy, dz)\n if (segmentLength < EPSILON) return null\n\n const pitch = Math.asin(dz / segmentLength)\n const yaw = Math.atan2(-dx, dy)\n const midpoint: Point3 = [\n (previous[0] + point[0]) / 2,\n (previous[1] + point[1]) / 2,\n (previous[2] + point[2]) / 2,\n ]\n const roundRadius = Math.max(\n 0.001,\n Math.min(width, thickness, segmentLength) / 2 - 0.001,\n )\n const startWidth =\n widthAtDistance?.(startDistance + distances[index]!) ?? width\n const endWidth =\n widthAtDistance?.(startDistance + distances[index + 1]!) ?? width\n\n return (\n <Translate key={`${index}:${midpoint.join(\":\")}`} offset={midpoint}>\n <Rotate rotation={[pitch, 0, yaw]}>\n {widthAtDistance ? (\n <Hull>\n <Cuboid\n size={[startWidth, overlap, thickness]}\n center={[acrossOffset, -segmentLength / 2, normalOffset]}\n />\n <Cuboid\n size={[endWidth, overlap, thickness]}\n center={[acrossOffset, segmentLength / 2, normalOffset]}\n />\n </Hull>\n ) : (\n <RoundedCuboid\n size={[width, segmentLength + overlap, thickness]}\n center={[acrossOffset, 0, normalOffset]}\n roundRadius={roundRadius}\n />\n )}\n </Rotate>\n </Translate>\n )\n })}\n </Colorize>\n )\n}\n\nexport const FlexScreen = (props: FlexScreenProps) => {\n const {\n width,\n height,\n diagonal,\n aspectRatio,\n ratio,\n defaultDiagonal,\n screenThickness = 1.2,\n bezelInset = 2,\n bezelDepth = 0.65,\n activeAreaWidth,\n activeAreaHeight,\n screenColor = \"#071b24\",\n bezelColor = \"#15181d\",\n showScreen = true,\n flexCableLength = 28,\n flexCableThickness = 0.18,\n flexCableColor = \"#d79528\",\n pinCount: conductorCount = props.conductorCount ?? 8,\n pitch: conductorPitch = props.conductorPitch,\n padWidth: conductorWidth = props.conductorWidth,\n conductorThickness = 0.035,\n conductorColor = \"#8c4a18\",\n cableEdgeMargin = 0.6,\n padLength: exposedContactLength = props.exposedContactLength ?? 2.4,\n tailLength,\n taperLength,\n showConductors = true,\n showFlexCable = true,\n showStiffeners = true,\n stiffenerLength = 3,\n stiffenerThickness = 0.16,\n stiffenerColor = \"#416bb3\",\n bendRadius = 3,\n bendSegments = 10,\n rightAngleVerticalLead = 3,\n distanceAboveBoard = 7,\n distanceBelowBoard = 7,\n foldDistanceFromConnector = 7,\n foldOutset = 4,\n foldSegments = 18,\n screenGap = 0.08,\n boardTopZ = 0,\n boardThickness = 1.6,\n boardClearance = 0.15,\n cableStartX = 0,\n cableStartY = 0,\n cableStartZ,\n cableLateralOffset = 0,\n screenOffset,\n screenRotation,\n rotation = [0, 0, 0],\n offset,\n } = props\n\n const size = resolveFlexScreenSize({\n width,\n height,\n diagonal,\n aspectRatio,\n ratio,\n defaultDiagonal,\n })\n const orientation = resolveOrientation(props)\n const belowBoard =\n orientation === \"sitsFlatBelowBoard\" ||\n orientation === \"foldedToFaceBelowBoard\" ||\n orientation === \"foldedToRightAngleBelowBoard\"\n const foldedFace =\n orientation === \"foldedToFaceAboveBoard\" ||\n orientation === \"foldedToFaceBelowBoard\"\n const rightAngle =\n orientation === \"foldedToRightAngleAboveBoard\" ||\n orientation === \"foldedToRightAngleBelowBoard\"\n\n assertPositive(\"screenThickness\", screenThickness)\n assertPositive(\"flexCableLength\", flexCableLength)\n assertPositive(\"flexCableThickness\", flexCableThickness)\n assertPositive(\"conductorThickness\", conductorThickness)\n assertPositive(\"bendRadius\", bendRadius)\n assertPositive(\"foldOutset\", foldOutset)\n assertPositive(\"boardThickness\", boardThickness)\n if (showStiffeners) assertPositive(\"stiffenerThickness\", stiffenerThickness)\n if (!Number.isFinite(exposedContactLength) || exposedContactLength < 0) {\n throw new Error(\"padLength must be a finite nonnegative length\")\n }\n if (!Number.isInteger(conductorCount) || conductorCount < 1) {\n throw new Error(\"pinCount must be a positive integer\")\n }\n if (!Number.isInteger(bendSegments) || bendSegments < 2) {\n throw new Error(\"bendSegments must be an integer of at least 2\")\n }\n if (!Number.isInteger(foldSegments) || foldSegments < 4) {\n throw new Error(\"foldSegments must be an integer of at least 4\")\n }\n if (\n boardClearance < 0 ||\n screenGap < 0 ||\n cableEdgeMargin < 0 ||\n exposedContactLength < 0 ||\n stiffenerLength < 0 ||\n rightAngleVerticalLead < 0 ||\n distanceAboveBoard < 0 ||\n distanceBelowBoard < 0 ||\n foldDistanceFromConnector < 0\n ) {\n throw new Error(\n \"clearances, margins, contact lengths, and lead lengths cannot be negative\",\n )\n }\n\n const resolvedCableWidth =\n props.flexCableWidth ?? Math.min(12, Math.max(5, size.width * 0.3))\n assertPositive(\"flexCableWidth\", resolvedCableWidth)\n const usableCableWidth = resolvedCableWidth - cableEdgeMargin * 2\n if (usableCableWidth <= 0) {\n throw new Error(\"cableEdgeMargin leaves no usable flex cable width\")\n }\n\n const resolvedConductorPitch =\n conductorPitch ??\n (conductorCount === 1 ? 0 : usableCableWidth / conductorCount)\n if (\n (conductorPitch !== undefined || conductorCount > 1) &&\n (!Number.isFinite(resolvedConductorPitch) || resolvedConductorPitch <= 0)\n ) {\n throw new Error(\"pitch must be greater than zero\")\n }\n const resolvedConductorWidth =\n conductorWidth ??\n (conductorCount === 1\n ? Math.min(usableCableWidth, resolvedCableWidth * 0.45)\n : resolvedConductorPitch * 0.48)\n assertPositive(\"padWidth\", resolvedConductorWidth)\n const conductorSpan =\n (conductorCount - 1) * resolvedConductorPitch + resolvedConductorWidth\n const connectorWidth = Math.max(\n resolvedCableWidth,\n conductorSpan + cableEdgeMargin * 2,\n )\n const widensAtConnector = connectorWidth > resolvedCableWidth + EPSILON\n // Keep the connector contacts at their specified pitch and fit the other end\n // to the body width, rather than stretching the entire cable.\n const screenConductorPitch = widensAtConnector\n ? conductorCount === 1\n ? 0\n : usableCableWidth / conductorCount\n : resolvedConductorPitch\n const screenConductorWidth = widensAtConnector\n ? Math.min(\n resolvedConductorWidth,\n conductorCount === 1 ? usableCableWidth : screenConductorPitch * 0.48,\n )\n : resolvedConductorWidth\n\n const cableStartsBelowBoard = belowBoard && !foldedFace\n const defaultCableZ = cableStartsBelowBoard\n ? boardTopZ - boardThickness - boardClearance - flexCableThickness / 2\n : boardTopZ + boardClearance + flexCableThickness / 2\n const start: Point3 = [\n cableStartX + cableLateralOffset,\n cableStartY,\n cableStartZ ?? defaultCableZ,\n ]\n const direction = belowBoard ? -1 : 1\n const foldedScreenBackZ =\n orientation === \"foldedToFaceAboveBoard\"\n ? boardTopZ + distanceAboveBoard\n : boardTopZ - boardThickness - distanceBelowBoard\n const foldedCableEndZ =\n orientation === \"foldedToFaceAboveBoard\"\n ? foldedScreenBackZ - screenGap - flexCableThickness / 2\n : foldedScreenBackZ + screenGap + flexCableThickness / 2\n const path = foldedFace\n ? createFoldedPath({\n start,\n endZ: foldedCableEndZ,\n flexCableLength,\n foldDistanceFromConnector,\n foldOutset,\n foldSegments,\n })\n : rightAngle\n ? createRightAnglePath({\n start,\n flexCableLength,\n bendRadius,\n bendSegments,\n verticalLead: rightAngleVerticalLead,\n direction,\n })\n : createFlatPath(start, flexCableLength)\n const totalCableLength = getPathDistances(path).at(-1)!\n if (tailLength !== undefined) {\n assertPositive(\"tailLength\", tailLength)\n if (tailLength >= totalCableLength) {\n throw new Error(\"tailLength must be shorter than flexCableLength\")\n }\n }\n if (taperLength !== undefined) assertPositive(\"taperLength\", taperLength)\n const contactLength = Math.min(\n Math.max(0, exposedContactLength),\n totalCableLength / 2,\n tailLength ?? Infinity,\n )\n const resolvedStiffenerLength = Math.min(\n Math.max(0, stiffenerLength),\n totalCableLength / 2,\n tailLength ?? Infinity,\n )\n const connectorLeadLength =\n tailLength ?? Math.max(contactLength, resolvedStiffenerLength)\n if (\n taperLength !== undefined &&\n connectorLeadLength + taperLength > totalCableLength + EPSILON\n ) {\n throw new Error(\n \"tailLength and taperLength must fit within flexCableLength\",\n )\n }\n const taperEndDistance = Math.min(\n totalCableLength,\n connectorLeadLength +\n (taperLength ?? Math.max(3, (connectorWidth - resolvedCableWidth) / 2)),\n )\n const cableWidthAtDistance = (distance: number) => {\n if (distance <= connectorLeadLength) return connectorWidth\n const progress = Math.min(\n 1,\n (distance - connectorLeadLength) /\n (taperEndDistance - connectorLeadLength),\n )\n return connectorWidth + (resolvedCableWidth - connectorWidth) * progress\n }\n const cablePath = widensAtConnector\n ? [\n ...slicePath(path, 0, connectorLeadLength),\n ...slicePath(path, connectorLeadLength, taperEndDistance).slice(1),\n ...slicePath(path, taperEndDistance, totalCableLength).slice(1),\n ]\n : path\n const widthProfile = widensAtConnector ? cableWidthAtDistance : undefined\n const startContacts = slicePath(path, 0, contactLength)\n const endContacts = slicePath(\n path,\n totalCableLength - contactLength,\n totalCableLength,\n )\n const startStiffener = slicePath(cablePath, 0, resolvedStiffenerLength)\n const endStiffener = slicePath(\n cablePath,\n totalCableLength - resolvedStiffenerLength,\n totalCableLength,\n )\n\n const pathEnd = path.at(-1)!\n let presetScreenRotation: Rotation3\n let screenCenter: Point3\n if (orientation === \"sitsFlat\") {\n presetScreenRotation = [0, 0, 0]\n screenCenter = [\n pathEnd[0],\n pathEnd[1] + size.height / 2,\n pathEnd[2] + flexCableThickness / 2 + screenGap,\n ]\n } else if (orientation === \"sitsFlatBelowBoard\") {\n presetScreenRotation = [0, Math.PI, 0]\n screenCenter = [\n pathEnd[0],\n pathEnd[1] + size.height / 2,\n pathEnd[2] - flexCableThickness / 2 - screenGap,\n ]\n } else if (orientation === \"foldedToFaceAboveBoard\") {\n presetScreenRotation = [0, 0, 0]\n screenCenter = [pathEnd[0], pathEnd[1] - size.height / 2, foldedScreenBackZ]\n } else if (orientation === \"foldedToFaceBelowBoard\") {\n presetScreenRotation = [0, Math.PI, 0]\n screenCenter = [pathEnd[0], pathEnd[1] - size.height / 2, foldedScreenBackZ]\n } else if (orientation === \"foldedToRightAngleAboveBoard\") {\n presetScreenRotation = [Math.PI / 2, 0, 0]\n screenCenter = [\n pathEnd[0],\n pathEnd[1] - flexCableThickness / 2 - screenGap,\n pathEnd[2] + size.height / 2,\n ]\n } else {\n presetScreenRotation = [-Math.PI / 2, 0, 0]\n screenCenter = [\n pathEnd[0],\n pathEnd[1] + flexCableThickness / 2 + screenGap,\n pathEnd[2] - size.height / 2,\n ]\n }\n screenCenter = [\n screenCenter[0] + (screenOffset?.x ?? 0),\n screenCenter[1] + (screenOffset?.y ?? 0),\n screenCenter[2] + (screenOffset?.z ?? 0),\n ]\n\n const conductorOffsets = Array.from(\n { length: conductorCount },\n (_, index) => (index - (conductorCount - 1) / 2) * resolvedConductorPitch,\n )\n const conductorNormalOffset = (flexCableThickness + conductorThickness) / 2\n const stiffenerNormalOffset = -(flexCableThickness + stiffenerThickness) / 2\n\n const assembly = (\n <>\n {showFlexCable && (\n <CableStrip\n points={cablePath}\n width={resolvedCableWidth}\n widthAtDistance={widthProfile}\n thickness={flexCableThickness}\n color={flexCableColor}\n />\n )}\n\n {showFlexCable && showStiffeners && resolvedStiffenerLength > EPSILON && (\n <>\n <CableStrip\n points={startStiffener}\n width={connectorWidth}\n thickness={stiffenerThickness}\n color={stiffenerColor}\n normalOffset={stiffenerNormalOffset}\n />\n <CableStrip\n points={endStiffener}\n width={resolvedCableWidth}\n widthAtDistance={widthProfile}\n startDistance={totalCableLength - resolvedStiffenerLength}\n thickness={stiffenerThickness}\n color={stiffenerColor}\n normalOffset={stiffenerNormalOffset}\n />\n </>\n )}\n\n {showFlexCable &&\n showConductors &&\n contactLength > EPSILON &&\n conductorOffsets.map((acrossOffset, index) => (\n <Fragment key={`conductor:${index}`}>\n <CableStrip\n points={startContacts}\n width={resolvedConductorWidth}\n thickness={conductorThickness}\n color={conductorColor}\n acrossOffset={acrossOffset}\n normalOffset={conductorNormalOffset}\n />\n <CableStrip\n points={endContacts}\n width={screenConductorWidth}\n thickness={conductorThickness}\n color={conductorColor}\n acrossOffset={\n (index - (conductorCount - 1) / 2) * screenConductorPitch\n }\n normalOffset={conductorNormalOffset}\n />\n </Fragment>\n ))}\n\n {showScreen && (\n <Translate offset={screenCenter}>\n <Rotate rotation={screenRotation ?? presetScreenRotation}>\n <Screen\n width={size.width}\n height={size.height}\n thickness={screenThickness}\n bezelInset={bezelInset}\n bezelDepth={bezelDepth}\n screenWidth={activeAreaWidth}\n screenHeight={activeAreaHeight}\n screenColor={screenColor}\n bezelColor={bezelColor}\n />\n </Rotate>\n </Translate>\n )}\n </>\n )\n\n return (\n <Translate\n offset={{\n x: offset?.x ?? 0,\n y: offset?.y ?? 0,\n z: offset?.z ?? 0,\n }}\n >\n <Translate offset={start}>\n <Rotate rotation={rotation}>\n <Translate offset={[-start[0], -start[1], -start[2]]}>\n {assembly}\n </Translate>\n </Rotate>\n </Translate>\n </Translate>\n )\n}\n\nexport default FlexScreen\n","import { Colorize, Cuboid, Subtract, Translate } from \"jscad-fiber\"\n\nexport interface ScreenProps {\n width?: number\n height?: number\n thickness?: number\n bezelInset?: number\n bezelDepth?: number\n screenColor?: string\n bezelColor?: string\n screenWidth?: number\n screenHeight?: number\n offset?: { x?: number; y?: number; z?: number }\n}\n\nexport const Screen = ({\n width = 30,\n height = 22,\n thickness = 1,\n bezelInset = 2,\n bezelDepth = 1,\n screenColor = \"#001414\",\n bezelColor = \"#0f1116\",\n screenWidth,\n screenHeight,\n offset,\n}: ScreenProps) => {\n const w = width\n const h = height\n const stackHeight = Math.max(thickness, 0.4)\n const clampedBezelDepth = Math.max(Math.min(bezelDepth, stackHeight), 0.2)\n const backBlockHeight = Math.max(stackHeight - clampedBezelDepth, 0)\n const inset = Math.max(bezelInset, 0)\n const innerWidth = Math.max(screenWidth ?? w - inset * 2, 2)\n const innerHeight = Math.max(screenHeight ?? h - inset * 2, 2)\n const screenThickness = Math.min(\n Math.max(clampedBezelDepth * 0.6, 0.2),\n clampedBezelDepth,\n )\n const offsetX = offset?.x ?? 0\n const offsetY = offset?.y ?? 0\n const offsetZ = offset?.z ?? 0\n\n return (\n <Translate offset={{ x: offsetX, y: offsetY, z: offsetZ }}>\n {backBlockHeight > 0 && (\n <Colorize color={bezelColor}>\n <Cuboid\n size={[w, h, backBlockHeight]}\n offset={[0, 0, backBlockHeight / 2]}\n />\n </Colorize>\n )}\n\n <Colorize color={bezelColor}>\n <Subtract>\n <Cuboid\n size={[w, h, clampedBezelDepth]}\n offset={[0, 0, backBlockHeight + clampedBezelDepth / 2]}\n />\n <Cuboid\n size={[innerWidth, innerHeight, clampedBezelDepth + 0.02]}\n offset={[0, 0, backBlockHeight + clampedBezelDepth / 2]}\n />\n </Subtract>\n </Colorize>\n\n <Colorize color={screenColor}>\n <Cuboid\n size={[innerWidth, innerHeight, screenThickness]}\n offset={[0, 0, backBlockHeight + screenThickness / 2]}\n />\n </Colorize>\n </Translate>\n )\n}\n\n// TODO: remove Display alias after downstreams migrate\nexport const Display = Screen\n\nexport default Screen\n","import { helicalGearModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { HelicalGear } from \"../../HelicalGear\"\n\nexport const model = defineModelRenderer({\n name: \"helicalgear\",\n schema: helicalGearModelDefinitionSchema,\n render: ({ fn, ...props }) => <HelicalGear {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { HelicalGearModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"./mechanical/indexedMeshToGeom3\"\nimport { createHelicalGearMesh } from \"./mechanical/helical-gear-mesh\"\n\nexport type HelicalGearProps = HelicalGearModelPropsInput & { color?: string }\n\n/** Axis +Z, lower face Z=0; optional hub extends above the gear face. */\nexport function createHelicalGearGeom(input: HelicalGearModelPropsInput) {\n return indexedMeshToGeom3(createHelicalGearMesh(input))\n}\n\nexport function HelicalGear({ color = \"#737e8f\", ...props }: HelicalGearProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createHelicalGearGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createHelicalGearMesh } from \"./mechanical/helical-gear-mesh\"\nexport type { HelicalGearMesh } from \"./mechanical/helical-gear-mesh\"\n","import {\n getHelicalGearDimensions,\n helicalGearModelPropsSchema,\n type HelicalGearModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport { createTwistedSpurGearMesh, type SpurGearMesh } from \"./spur-gear-mesh\"\n\nexport type HelicalGearMesh = SpurGearMesh\n\n/**\n * Twisted transverse involute teeth from Z=0 to faceWidth, with a stationary\n * round bore and optional hub. Zero helix angle reproduces the spur mesh.\n */\nexport function createHelicalGearMesh(\n input: HelicalGearModelPropsInput,\n): HelicalGearMesh {\n const props = helicalGearModelPropsSchema.parse(input)\n const { twistAngle } = getHelicalGearDimensions(props)\n const { helixAngle, handedness, segmentsPerTurn, ...spur } = props\n return createTwistedSpurGearMesh(\n spur,\n (twistAngle * Math.PI) / 180,\n segmentsPerTurn,\n )\n}\n","import {\n getSpurGearDimensions,\n spurGearModelPropsSchema,\n type SpurGearModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport earcut from \"earcut\"\n\n/** Indexed triangles, counterclockwise from outside; millimeters, Z up. */\nexport interface SpurGearMesh {\n positions: number[]\n indices: number[]\n}\n\ntype Point2 = [number, number]\n\n/**\n * An external involute spur gear with its lower face at Z=0. Tooth centers\n * start on +X and rotate counterclockwise with phase. The optional hub extends\n * above the upper face, and the round bore passes through both gear and hub.\n * Flanks are sampled involutes; tips and root valleys follow circular arcs.\n * Below the base circle the flanks extend radially, without a generated\n * trochoidal root fillet or cutter undercut. No CSG or renderer is required.\n */\nexport function createSpurGearMesh(\n input: SpurGearModelPropsInput,\n): SpurGearMesh {\n return createTwistedSpurGearMesh(input)\n}\n\n/** Shared transverse involute extrusion; twist is signed radians over the face. */\nexport function createTwistedSpurGearMesh(\n input: SpurGearModelPropsInput,\n twist = 0,\n segmentsPerTurn = 32,\n): SpurGearMesh {\n const props = spurGearModelPropsSchema.parse(input)\n const dimensions = getSpurGearDimensions(props)\n const pitchRadius = dimensions.pitchDiameter / 2\n const baseRadius = dimensions.baseDiameter / 2\n const outsideRadius = dimensions.outsideDiameter / 2\n const rootRadius = dimensions.rootDiameter / 2\n const pressureAngle = (props.pressureAngle * Math.PI) / 180\n const toothAngle = (Math.PI * 2) / props.toothCount\n const phase = (((props.phase % 360) + 360) % 360) * (Math.PI / 180)\n const baseHalfAngle =\n dimensions.toothThickness / (2 * pitchRadius) +\n Math.tan(pressureAngle) -\n pressureAngle\n // Involute parameter t gives radius rb*sqrt(1+t^2) and angular roll\n // t-atan(t). Sampling t avoids an arbitrary polygonal tooth approximation.\n const startRadius = Math.max(baseRadius, rootRadius)\n const startT = Math.sqrt(Math.max(0, (startRadius / baseRadius) ** 2 - 1))\n const outsideT = Math.sqrt((outsideRadius / baseRadius) ** 2 - 1)\n const halfAngle = (t: number) => baseHalfAngle - (t - Math.atan(t))\n const rootHalfAngle = halfAngle(startT)\n const tipHalfAngle = halfAngle(outsideT)\n const flankSteps = Math.max(2, Math.ceil(props.segmentsPerTooth / 2))\n const arcSteps = Math.max(1, Math.ceil(props.segmentsPerTooth / 4))\n const rootValleyAngle = toothAngle - 2 * rootHalfAngle\n const innerRadius = Math.max(props.boreDiameter, props.hubDiameter) / 2\n // A root arc's chord lies inside its analytic circle. Refine that arc when\n // a bore or hub almost fills the root, so the cap loops remain disjoint.\n const safeRootStep =\n innerRadius > 0\n ? (twist === 0 ? 1.8 : 0.8) * Math.acos(innerRadius / rootRadius)\n : Math.PI\n const rootArcSteps = Math.max(\n arcSteps,\n Math.ceil(rootValleyAngle / safeRootStep),\n )\n // Sample at least sixteen layers per tooth of twist, and refine near a bore\n // or hub so even the triangles between layers stay outside the inner loop.\n const twistStep = Math.min(\n toothAngle / 16,\n (2 * Math.PI) / segmentsPerTurn,\n safeRootStep,\n )\n const layers = Math.max(1, Math.ceil(Math.abs(twist) / twistStep))\n const pointsPerTooth =\n 2 * flankSteps + arcSteps + rootArcSteps + (rootRadius < baseRadius ? 2 : 0)\n if (\n !Number.isFinite(rootArcSteps) ||\n !Number.isFinite(layers) ||\n (layers + 1) * props.toothCount * pointsPerTooth + 1024 > 1_000_000\n )\n throw new Error(\n \"Involute gear exceeds mesh resolution limit (1 million vertices); reduce twist or resolution, or increase bore/hub wall thickness\",\n )\n const outline: Point2[] = []\n const polar = (radius: number, angle: number) => {\n outline.push([radius * Math.cos(angle), radius * Math.sin(angle)])\n }\n\n for (let tooth = 0; tooth < props.toothCount; tooth++) {\n const center = phase + tooth * toothAngle\n polar(rootRadius, center - rootHalfAngle)\n if (rootRadius < baseRadius) polar(baseRadius, center - baseHalfAngle)\n for (let step = 1; step <= flankSteps; step++) {\n const t = startT + ((outsideT - startT) * step) / flankSteps\n polar(baseRadius * Math.sqrt(1 + t * t), center - halfAngle(t))\n }\n for (let step = 1; step <= arcSteps; step++)\n polar(\n outsideRadius,\n center - tipHalfAngle + (2 * tipHalfAngle * step) / arcSteps,\n )\n for (let step = flankSteps - 1; step >= 0; step--) {\n const t = startT + ((outsideT - startT) * step) / flankSteps\n polar(baseRadius * Math.sqrt(1 + t * t), center + halfAngle(t))\n }\n if (rootRadius < baseRadius) polar(rootRadius, center + baseHalfAngle)\n // The next tooth adds the final valley point, avoiding repeated vertices.\n for (let step = 1; step < rootArcSteps; step++)\n polar(\n rootRadius,\n center + rootHalfAngle + (rootValleyAngle * step) / rootArcSteps,\n )\n }\n\n const positions: number[] = []\n const indices: number[] = []\n const ring = (points: Point2[], z: number) => {\n const start = positions.length / 3\n for (const [x, y] of points) positions.push(x, y, z)\n return start\n }\n const circleSegments = Math.max(48, Math.min(256, props.toothCount * 4))\n const circle = (radius: number): Point2[] =>\n Array.from({ length: circleSegments }, (_, segment) => {\n const angle = phase + (segment * Math.PI * 2) / circleSegments\n return [radius * Math.cos(angle), radius * Math.sin(angle)]\n })\n const connect = (\n bottom: number,\n top: number,\n count: number,\n inward = false,\n ) => {\n for (let i = 0; i < count; i++) {\n const next = (i + 1) % count\n if (inward)\n indices.push(\n bottom + i,\n top + next,\n bottom + next,\n bottom + i,\n top + i,\n top + next,\n )\n else\n indices.push(\n bottom + i,\n bottom + next,\n top + next,\n bottom + i,\n top + next,\n top + i,\n )\n }\n }\n const cap = (\n outer: Point2[],\n outerStart: number,\n upward: boolean,\n inner?: { points: Point2[]; start: number },\n ) => {\n const points = inner ? [...outer, ...inner.points] : outer\n const triangles = earcut(\n points.flatMap(([x, y]) => [x, y]),\n inner ? [outer.length] : [],\n )\n const vertex = (index: number) =>\n index < outer.length\n ? outerStart + index\n : inner!.start + index - outer.length\n for (let i = 0; i < triangles.length; i += 3) {\n const a = triangles[i]!\n const b = triangles[i + 1]!\n const c = triangles[i + 2]!\n const pa = points[a]!\n const pb = points[b]!\n const pc = points[c]!\n const area =\n (pb[0] - pa[0]) * (pc[1] - pa[1]) - (pb[1] - pa[1]) * (pc[0] - pa[0])\n if (area > 0 === upward) indices.push(vertex(a), vertex(b), vertex(c))\n else indices.push(vertex(a), vertex(c), vertex(b))\n }\n }\n\n const bottom = ring(outline, 0)\n let top = bottom\n let topOutline = outline\n for (let layer = 1; layer <= layers; layer++) {\n const angle = twist * (layer / layers)\n topOutline =\n twist === 0\n ? outline\n : outline.map(\n ([x, y]): Point2 => [\n x * Math.cos(angle) - y * Math.sin(angle),\n x * Math.sin(angle) + y * Math.cos(angle),\n ],\n )\n const next = ring(topOutline, props.faceWidth * (layer / layers))\n connect(top, next, outline.length)\n top = next\n }\n const hasHub = props.hubDiameter > 0 && props.hubLength > 0\n const height = props.faceWidth + (hasHub ? props.hubLength : 0)\n const bore =\n props.boreDiameter > 0 ? circle(props.boreDiameter / 2) : undefined\n const boreBottom = bore ? ring(bore, 0) : undefined\n const boreTop = bore ? ring(bore, height) : undefined\n if (bore) connect(boreBottom!, boreTop!, bore.length, true)\n cap(\n outline,\n bottom,\n false,\n bore ? { points: bore, start: boreBottom! } : undefined,\n )\n if (hasHub) {\n const hub = circle(props.hubDiameter / 2)\n const hubBottom = ring(hub, props.faceWidth)\n const hubTop = ring(hub, height)\n cap(topOutline, top, true, { points: hub, start: hubBottom })\n connect(hubBottom, hubTop, hub.length)\n // Both circular loops use identical angular samples. Direct annular\n // triangles avoid collinear bridge triangles in polygon triangulation.\n if (bore) connect(hubTop, boreTop!, hub.length)\n else cap(hub, hubTop, true)\n } else\n cap(\n topOutline,\n top,\n true,\n bore ? { points: bore, start: boreTop! } : undefined,\n )\n return { positions, indices }\n}\n","import { hexBoltModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { HexBolt } from \"./HexBolt\"\n\nexport const model = defineModelRenderer({\n name: \"hexbolt\",\n schema: hexBoltModelDefinitionSchema,\n render: ({ fn, ...props }) => <HexBolt {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { HexBoltModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createHexBoltMesh, type HexBoltMeshOptions } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type HexBoltProps = HexBoltModelPropsInput & { color?: string }\nexport function createHexBoltGeom(\n input: HexBoltModelPropsInput,\n options?: HexBoltMeshOptions,\n) {\n return indexedMeshToGeom3(createHexBoltMesh(input, options))\n}\nexport function HexBolt({ color = \"#737e8f\", ...props }: HexBoltProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createHexBoltGeom(props)} />\n </Colorize>\n )\n}\nexport { createHexBoltMesh } from \"./mesh\"\nexport type {\n HexBoltMesh,\n HexBoltMeshOptions,\n} from \"./mesh\"\n","import {\n hexBoltModelPropsSchema,\n type HexBoltModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\nexport interface HexBoltMeshOptions {\n radialSegments?: number\n threadStepsPerTurn?: number\n}\n\n/** Outward-oriented, welded indexed surface, in millimeters. */\nexport interface HexBoltMesh {\n positions: number[]\n indices: number[]\n}\n\nexport function createHexBoltMesh(\n input: HexBoltModelPropsInput,\n options: HexBoltMeshOptions = {},\n): HexBoltMesh {\n const p = hexBoltModelPropsSchema.parse(input)\n const segments = options.radialSegments ?? 96\n const axial = options.threadStepsPerTurn ?? 24\n if (\n !Number.isInteger(segments) ||\n segments < 24 ||\n segments > 192 ||\n segments % 24 !== 0 ||\n !Number.isInteger(axial) ||\n axial < 24 ||\n axial > 96\n )\n throw new Error(\n \"Screw mesh resolution requires 24..192 radial segments divisible by 24 and 24..96 thread steps\",\n )\n const positions: number[] = [],\n indices: number[] = []\n const welded = new Map<string, number>()\n const vertex = (x: number, y: number, z: number) => {\n const key = [x, y, z].map((v) => Math.round(v * 1e10)).join(\":\")\n const existing = welded.get(key)\n if (existing !== undefined) return existing\n const index = positions.length / 3\n positions.push(x, y, z)\n welded.set(key, index)\n return index\n }\n const triangle = (a: number, b: number, c: number) => {\n if (a === b || b === c || c === a) return\n const point = (i: number) => positions.slice(3 * i, 3 * i + 3)\n const A = point(a),\n B = point(b),\n C = point(c)\n const u = B.map((v, i) => v - A[i]!),\n v = C.map((w, i) => w - A[i]!)\n const area = Math.hypot(\n u[1]! * v[2]! - u[2]! * v[1]!,\n u[2]! * v[0]! - u[0]! * v[2]!,\n u[0]! * v[1]! - u[1]! * v[0]!,\n )\n if (area > 1e-12) indices.push(a, b, c)\n }\n const ring = (\n radiusAt: (theta: number) => number,\n zAt: number | ((theta: number) => number),\n ) =>\n Array.from({ length: segments }, (_, i) => {\n const theta = (i * 2 * Math.PI) / segments,\n r = radiusAt(theta)\n return vertex(\n r * Math.cos(theta),\n r * Math.sin(theta),\n typeof zAt === \"number\" ? zAt : zAt(theta),\n )\n })\n const connect = (a: number[], b: number[]) => {\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n triangle(a[i]!, a[n]!, b[n]!)\n triangle(a[i]!, b[n]!, b[i]!)\n }\n }\n const cap = (a: number[], z: number, up: boolean) => {\n const c = vertex(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n up ? triangle(c, a[i]!, a[n]!) : triangle(c, a[n]!, a[i]!)\n }\n }\n let previous: number[] = []\n const add = (\n radiusAt: (theta: number) => number,\n zAt: number | ((theta: number) => number),\n ) => {\n const r = ring(radiusAt, zAt)\n if (previous.length) connect(previous, r)\n previous = r\n return r\n }\n const major = p.diameter / 2,\n minor = p.threadRootDiameter / 2,\n pitch = p.threadPitch\n const shaftEnd = -p.underHeadRadius\n const steps = p.showThreads\n ? Math.ceil(((shaftEnd + p.length) / pitch) * axial)\n : 1\n if ((steps + 100) * segments > 400000)\n throw new Error(\"Screw exceeds mesh resolution limit\")\n const levels = new Set<number>([\n -p.length,\n -p.length + p.tipChamfer,\n shaftEnd,\n ])\n if (p.showThreads)\n for (let i = 0; i <= steps; i++)\n levels.add(-p.length + ((shaftEnd + p.length) * i) / steps)\n for (const z of [...levels].sort((a, b) => a - b)) {\n const r = add((theta) => {\n // Phase is fixed at +X on the nominal tip plane, before chamfer clipping.\n const phase =\n ((((z + p.length) / pitch -\n ((p.threadHand === \"right\" ? 1 : -1) * theta) / (2 * Math.PI)) %\n 1) +\n 1) %\n 1\n const d = Math.min(phase, 1 - phase)\n const groove = Math.min(\n major - minor,\n Math.max(0, (d - 1 / 16) * pitch * Math.sqrt(3)),\n )\n const thread = p.showThreads ? major - groove : major\n return Math.min(\n thread,\n major - Math.max(0, p.tipChamfer - (z + p.length)),\n )\n }, z)\n if (z === -p.length) cap(r, z, false)\n }\n // Tangent circular under-head blend; its start also trims incomplete crests.\n add(() => major, shaftEnd)\n const filletCenterR = major + p.underHeadRadius\n const filletCenterZ = shaftEnd\n for (let i = 1; i <= 16; i++) {\n const angle = Math.PI - ((Math.PI - Math.PI / 2) * i) / 16\n add(\n () => filletCenterR + p.underHeadRadius * Math.cos(angle),\n filletCenterZ + p.underHeadRadius * Math.sin(angle),\n )\n }\n\n const hexRadius = (theta: number) =>\n p.headAcrossFlats /\n 2 /\n Math.max(\n Math.abs(Math.sin(theta)),\n Math.abs(Math.sin(theta + (2 * Math.PI) / 3)),\n Math.abs(Math.sin(theta + (4 * Math.PI) / 3)),\n )\n add(hexRadius, 0)\n const slope = Math.tan((p.headChamferAngle * Math.PI) / 180)\n const start =\n p.headHeight - ((p.headCornerDiameter - p.headChamferDiameter) / 2) * slope\n add(hexRadius, start)\n for (let i = 1; i <= 12; i++) {\n const z = start + ((p.headHeight - start) * i) / 12\n add(\n (theta) =>\n Math.min(\n hexRadius(theta),\n p.headChamferDiameter / 2 + (p.headHeight - z) / slope,\n ),\n z,\n )\n }\n cap(previous, p.headHeight, true)\n\n return { positions, indices }\n}\n","import { hexNutModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { HexNut } from \"./HexNut\"\n\nexport const model = defineModelRenderer({\n name: \"hexnut\",\n schema: hexNutModelDefinitionSchema,\n render: ({ fn, ...props }) => <HexNut {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { HexNutModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createHexNutMesh, type HexNutMeshOptions } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type HexNutProps = HexNutModelPropsInput & { color?: string }\nexport function createHexNutGeom(\n input: HexNutModelPropsInput,\n resolution?: HexNutMeshOptions,\n) {\n return indexedMeshToGeom3(createHexNutMesh(input, resolution))\n}\nexport function HexNut({ color = \"#737e8f\", ...props }: HexNutProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createHexNutGeom(props)} />\n </Colorize>\n )\n}\nexport { createHexNutMesh } from \"./mesh\"\nexport type { HexNutMesh, HexNutMeshOptions } from \"./mesh\"\n","import {\n hexNutModelPropsSchema,\n getHexNutDimensions,\n type HexNutModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\n/** Indexed counterclockwise triangles in millimeters. */\nexport interface HexNutMesh {\n positions: number[]\n indices: number[]\n}\n/** Renderer resolution affects tessellation only, never model specifications. */\nexport interface HexNutMeshOptions {\n radialSegments?: number\n segmentsPerPitch?: number\n}\nfunction resolution(options: HexNutMeshOptions) {\n const radial = options.radialSegments ?? 96\n const axial = options.segmentsPerPitch ?? 32\n if (\n !Number.isInteger(radial) ||\n radial < 24 ||\n radial > 192 ||\n radial % 12 !== 0 ||\n !Number.isInteger(axial) ||\n axial < 8 ||\n axial > 64\n )\n throw new Error(\n \"Mesh resolution limit: radial segments must be a multiple of 12 in [24,192], pitch segments an integer in [8,64]\",\n )\n return { radial, axial }\n}\nfunction surface(segments: number) {\n const positions: number[] = [],\n indices: number[] = []\n const ring = (z: number, radius: (angle: number) => number) => {\n const start = positions.length / 3\n for (let i = 0; i < segments; i++) {\n const angle = (i * 2 * Math.PI) / segments\n const r = radius(angle)\n positions.push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n return start\n }\n const connect = (a: number, b: number) => {\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n indices.push(a + i, a + n, b + n, a + i, b + n, b + i)\n }\n }\n const cap = (start: number, z: number, up: boolean) => {\n const center = positions.length / 3\n positions.push(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n indices.push(center, start + (up ? i : n), start + (up ? n : i))\n }\n }\n return { positions, indices, ring, connect, cap }\n}\nfunction hexRadius(angle: number, acrossFlats: number) {\n const period = Math.PI / 3\n const distance =\n ((((angle - Math.PI / 2 + period / 2) % period) + period) % period) -\n period / 2\n return acrossFlats / 2 / Math.cos(distance)\n}\nfunction threadDistance(z: number, angle: number, pitch: number, hand = 1) {\n const phase = (((z / pitch - (hand * angle) / (2 * Math.PI)) % 1) + 1) % 1\n return Math.min(phase, 1 - phase)\n}\n/** Closed annular surface with a through internal thread and both conical mouths. */\nexport function createHexNutMesh(\n input: HexNutModelPropsInput,\n options: HexNutMeshOptions = {},\n): HexNutMesh {\n const props = hexNutModelPropsSchema.parse(input)\n const d = getHexNutDimensions(input)\n const { radial, axial } = resolution(options)\n const steps = Math.max(2, Math.ceil((d.height / d.threadPitch) * axial))\n if (steps > 24000 || !Number.isFinite(steps))\n throw new Error(\"Mesh resolution limit: too many thread turns\")\n const m = surface(radial)\n const outer = (z: number, angle: number) =>\n Math.min(\n hexRadius(angle, d.acrossFlats),\n d.faceDiameter / 2 + Math.min(z, d.height - z) * Math.sqrt(3),\n )\n // Include every sampled cone/hex intersection: linear Z interpolation then\n // preserves each radial ray's exact cone slope and flat-body transition.\n const outerLevels = [\n 0,\n d.outerChamferDepth,\n d.height - d.outerChamferDepth,\n d.height,\n ]\n for (let index = 0; index < radial; index++) {\n const angle = (index * 2 * Math.PI) / radial\n const height =\n (hexRadius(angle, d.acrossFlats) - d.faceDiameter / 2) / Math.sqrt(3)\n if (height > 1e-9 && height < d.outerChamferDepth - 1e-9)\n outerLevels.push(height, d.height - height)\n }\n const outerZ = outerLevels\n .sort((a, b) => a - b)\n .filter((z, index, sorted) => index === 0 || z - sorted[index - 1]! > 1e-10)\n const first = m.ring(0, (angle) => outer(0, angle))\n let previous = first\n for (const z of outerZ.slice(1)) {\n const current = m.ring(z, (angle) => outer(z, angle))\n m.connect(previous, current)\n previous = current\n }\n const levels = new Set(\n props.showThreads\n ? Array.from({ length: steps + 1 }, (_, i) => (d.height * i) / steps)\n : [0, d.height],\n )\n levels.add(d.boreChamferDepth)\n levels.add(d.height - d.boreChamferDepth)\n const minor = d.boreMinorDiameter / 2\n const depth = (d.diameter - d.boreMinorDiameter) / 2\n for (const z of [...levels].sort((a, b) => b - a)) {\n const current = m.ring(z, (angle) => {\n const groove = Math.min(\n depth,\n Math.max(\n 0,\n (threadDistance(z, angle, d.threadPitch) - 1 / 8) *\n d.threadPitch *\n Math.sqrt(3),\n ),\n )\n const threaded = minor + (props.showThreads ? groove : 0)\n return Math.max(threaded, d.mouthDiameter / 2 - Math.min(z, d.height - z))\n })\n m.connect(previous, current)\n previous = current\n }\n m.connect(previous, first)\n return { positions: m.positions, indices: m.indices }\n}\n","import { hexSocketBoltModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { HexSocketBolt } from \"../../HexSocketBolt\"\n\nexport const model = defineModelRenderer({\n name: \"hexsocketbolt\",\n schema: hexSocketBoltModelDefinitionSchema,\n render: ({ fn, ...props }) => <HexSocketBolt {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import { componentMaterials } from \"./materials\"\nimport type { HexSocketBoltModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createHexSocketBoltMesh } from \"./mechanical/hex-socket-bolt-mesh\"\nimport { indexedMeshToGeom3 } from \"./mechanical/indexedMeshToGeom3\"\n\nexport type HexSocketBoltProps = HexSocketBoltModelPropsInput & {\n color?: string\n}\n\n/** Bearing plane Z=0, tip along -Z, head along +Z. Threads are approximate. */\nexport function createHexSocketBoltGeom(input: HexSocketBoltModelPropsInput) {\n return indexedMeshToGeom3(createHexSocketBoltMesh(input))\n}\n\nexport function HexSocketBolt({\n color = \"#737e8f\",\n ...props\n}: HexSocketBoltProps) {\n return (\n <Colorize color={color} material={componentMaterials.steel}>\n <Custom geometry={createHexSocketBoltGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createHexSocketBoltMesh } from \"./mechanical/hex-socket-bolt-mesh\"\nexport type { HexSocketBoltMesh } from \"./mechanical/hex-socket-bolt-mesh\"\n","import {\n hexSocketBoltDimensions,\n hexSocketBoltModelPropsSchema,\n type HexSocketBoltModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\n/** Indexed triangles, counterclockwise from outside; millimeters, Z up. */\nexport interface HexSocketBoltMesh {\n positions: number[]\n indices: number[]\n}\n\n/**\n * Head bearing plane at Z=0; tip at -length; head extends along +Z.\n * Produces a closed surface with a blind hex socket and a right-hand,\n * truncated 60-degree helical thread. Threads are a visual approximation.\n * No renderer dependencies are needed to consume the indexed mesh.\n */\nexport const createHexSocketBoltMesh = (\n input: HexSocketBoltModelPropsInput,\n): HexSocketBoltMesh => {\n const props = hexSocketBoltModelPropsSchema.parse(input)\n const {\n diameter,\n threadPitch: pitch,\n headDiameter,\n headHeight,\n socketWidth,\n socketDepth,\n } = hexSocketBoltDimensions[props.metricSize]\n const { length, showThreads } = props\n const segments = 96 // Divisible by six, so socket corners are exact.\n const steps = showThreads ? Math.max(2, Math.ceil((length / pitch) * 24)) : 2\n // Avoid unbounded allocations for user-supplied lengths.\n if (steps > 24000)\n throw new Error(\n \"Bolt length exceeds mesh resolution limit (1000 thread turns)\",\n )\n const positions: number[] = []\n const indices: number[] = []\n const radius = diameter / 2\n const depth = pitch * 0.61343\n const bevel = Math.min(0.2, headHeight * 0.08)\n const tipBevel = Math.min(pitch * 0.6, length / 3)\n\n const ring = (z: number, radiusAt: (angle: number) => number) => {\n const start = positions.length / 3\n for (let i = 0; i < segments; i++) {\n const angle = (i * Math.PI * 2) / segments\n const r = radiusAt(angle)\n positions.push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n return start\n }\n // Following the surface from tip to socket floor also sets the winding for\n // the shoulder, top annulus and inward-facing socket walls correctly.\n const connect = (a: number, b: number) => {\n for (let i = 0; i < segments; i++) {\n const next = (i + 1) % segments\n indices.push(a + i, a + next, b + next, a + i, b + next, b + i)\n }\n }\n const cap = (start: number, z: number, upward: boolean) => {\n const center = positions.length / 3\n positions.push(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const a = start + i\n const b = start + ((i + 1) % segments)\n indices.push(center, upward ? a : b, upward ? b : a)\n }\n }\n let previous = -1\n // A smooth shank needs only its tip, bevel end and bearing plane. Sampling\n // it at thread pitch adds thousands of coplanar faces and makes STEP export\n // quadratic without improving the shape.\n const shaftLevels = showThreads\n ? Array.from(\n { length: steps + 1 },\n (_, step) => -length + (length * step) / steps,\n )\n : [-length, -length + tipBevel, 0]\n for (const z of shaftLevels) {\n const current = ring(z, (angle) => {\n // Constant phase winds counterclockwise as Z increases (right-hand).\n const phase = (((z / pitch - angle / (2 * Math.PI)) % 1) + 1) % 1\n const distance = Math.min(phase, 1 - phase)\n const groove = Math.min(\n depth,\n Math.max(0, (distance - 1 / 16) * pitch * Math.sqrt(3)),\n )\n const endRamp = Math.min(\n 1,\n (z + length) / tipBevel,\n -z / Math.min(pitch / 2, length / 3),\n )\n const tipCut = tipBevel * Math.max(0, 1 - (z + length) / tipBevel)\n return radius - (showThreads ? groove * endRamp : 0) - tipCut\n })\n if (previous < 0) cap(current, z, false)\n else connect(previous, current)\n previous = current\n }\n const addRing = (z: number, radiusAt: (angle: number) => number) => {\n const current = ring(z, radiusAt)\n connect(previous, current)\n previous = current\n }\n addRing(0, () => headDiameter / 2 - bevel)\n addRing(bevel, () => headDiameter / 2)\n addRing(headHeight - bevel, () => headDiameter / 2)\n addRing(headHeight, () => headDiameter / 2 - bevel)\n const hexRadius = (angle: number, acrossFlats: number) =>\n acrossFlats /\n 2 /\n Math.cos(((angle + Math.PI / 6) % (Math.PI / 3)) - Math.PI / 6)\n addRing(headHeight, (angle) => hexRadius(angle, socketWidth + bevel))\n addRing(headHeight - bevel / 2, (angle) => hexRadius(angle, socketWidth))\n addRing(headHeight - socketDepth, (angle) => hexRadius(angle, socketWidth))\n cap(previous, headHeight - socketDepth, true)\n return { positions, indices }\n}\n","import { hollowPositioningArmTubeModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { HollowPositioningArmTube } from \"./HollowPositioningArmTube\"\n\nexport const model = defineModelRenderer({\n name: \"hollowpositioningarmtube\",\n schema: hollowPositioningArmTubeModelDefinitionSchema,\n render: ({ fn, ...props }) => <HollowPositioningArmTube {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { HollowPositioningArmTubeModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createHollowPositioningArmTubeMesh } from \"./mesh\"\n\nexport type HollowPositioningArmTubeProps =\n HollowPositioningArmTubeModelPropsInput & { color?: string }\n\nexport function createHollowPositioningArmTubeGeom(\n input: HollowPositioningArmTubeModelPropsInput,\n) {\n return indexedMeshToGeom3(createHollowPositioningArmTubeMesh(input))\n}\n\nexport function HollowPositioningArmTube({\n color = \"#343943\",\n ...props\n}: HollowPositioningArmTubeProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createHollowPositioningArmTubeGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createHollowPositioningArmTubeMesh } from \"./mesh\"\nexport type {\n HollowPositioningArmTubeMesh,\n HollowPositioningArmTubeMeshOptions,\n} from \"./mesh\"\n","import {\n getHollowPositioningArmTubeDimensions,\n getHollowPositioningArmTubeFrame,\n hollowPositioningArmTubeModelPropsSchema,\n type HollowPositioningArmTubeModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\nexport interface HollowPositioningArmTubeMesh {\n positions: number[]\n indices: number[]\n}\n\nexport interface HollowPositioningArmTubeMeshOptions {\n radialSegments?: number\n segmentsPerRib?: number\n}\n\n/** One closed annular sweep with open ends and a smooth, continuous wire bore. */\nexport function createHollowPositioningArmTubeMesh(\n input: HollowPositioningArmTubeModelPropsInput,\n options: HollowPositioningArmTubeMeshOptions = {},\n): HollowPositioningArmTubeMesh {\n const props = hollowPositioningArmTubeModelPropsSchema.parse(input)\n const dimensions = getHollowPositioningArmTubeDimensions(props)\n const radialSegments = options.radialSegments ?? 24\n const segmentsPerRib = options.segmentsPerRib ?? 4\n for (const [name, value, minimum, maximum] of [\n [\"radialSegments\", radialSegments, 12, 128],\n [\"segmentsPerRib\", segmentsPerRib, 4, 32],\n ] as const)\n if (\n !Number.isInteger(value) ||\n value < minimum ||\n value > maximum ||\n value % 4 !== 0\n )\n throw new Error(\n `${name} must be a multiple of four in [${minimum},${maximum}]`,\n )\n\n const { totalLength, bendLength, minimumWallThickness } = dimensions\n const innerRadius = props.innerDiameter / 2\n const scale = Math.max(totalLength, props.outerDiameter)\n const tolerance = scale * 1e-10\n if (Math.min(innerRadius, minimumWallThickness, totalLength) <= tolerance)\n throw new Error(\n \"Hollow positioning arm tube wall, bore or length exceeds mesh resolution limit\",\n )\n\n // Limit centerline chord error relative to the bore and wall as well as angle.\n const sagitta = Math.min(innerRadius, minimumWallThickness) * 0.02\n const angleStep = Math.min(\n Math.PI / 36,\n 2 * Math.acos(1 - Math.min(sagitta / props.bendRadius, 1)),\n )\n const bendSteps =\n props.bendAngle === 0\n ? 0\n : Math.ceil((props.bendAngle * Math.PI) / 180 / angleStep)\n const ribSteps =\n props.ribDepth === 0\n ? 0\n : Math.ceil((totalLength / props.ribPitch) * segmentsPerRib)\n const maximumRings = Math.floor(250000 / (2 * radialSegments))\n if (\n !Number.isSafeInteger(bendSteps + ribSteps) ||\n bendSteps + ribSteps + 5 > maximumRings\n )\n throw new Error(\n \"Hollow positioning arm tube exceeds mesh resolution limit (250000 vertices)\",\n )\n\n const samples = [\n 0,\n props.startLength,\n props.startLength + bendLength,\n totalLength,\n ]\n for (let i = 1; i < bendSteps; i++)\n samples.push(props.startLength + (bendLength * i) / bendSteps)\n for (let i = 1; i < ribSteps; i++)\n samples.push((i * props.ribPitch) / segmentsPerRib)\n samples.sort((a, b) => a - b)\n // Coincident rib and bend boundaries share one ring, preventing sliver faces.\n const stations = samples.filter(\n (s, i) => i === 0 || s - samples[i - 1]! > tolerance,\n )\n if (totalLength - stations[stations.length - 1]! <= tolerance)\n stations[stations.length - 1] = totalLength\n\n const positions: number[] = []\n const indices: number[] = []\n const stride = radialSegments * 2\n for (const s of stations) {\n const { position, normal } = getHollowPositioningArmTubeFrame(props, s)\n const outerRadius =\n props.outerDiameter / 2 -\n (props.ribDepth === 0\n ? 0\n : (props.ribDepth / 2) *\n (1 + Math.cos(2 * Math.PI * ((s / props.ribPitch) % 1))))\n for (const radius of [outerRadius, innerRadius])\n for (let j = 0; j < radialSegments; j++) {\n const angle = (j * 2 * Math.PI) / radialSegments\n const cosine =\n j === radialSegments / 4 || j === (3 * radialSegments) / 4\n ? 0\n : Math.cos(angle)\n const sine = j === 0 || j === radialSegments / 2 ? 0 : Math.sin(angle)\n positions.push(\n position[0] + radius * cosine * normal[0],\n radius * sine,\n position[2] + radius * cosine * normal[2],\n )\n }\n }\n const quad = (a: number, b: number, c: number, d: number) => {\n indices.push(a, b, c, a, c, d)\n }\n for (let ring = 0; ring + 1 < stations.length; ring++)\n for (let j = 0; j < radialSegments; j++) {\n const next = (j + 1) % radialSegments\n const a = ring * stride\n const b = (ring + 1) * stride\n quad(a + j, a + next, b + next, b + j)\n quad(\n a + radialSegments + j,\n b + radialSegments + j,\n b + radialSegments + next,\n a + radialSegments + next,\n )\n }\n for (let j = 0; j < radialSegments; j++) {\n const next = (j + 1) % radialSegments\n quad(j, radialSegments + j, radialSegments + next, next)\n const end = (stations.length - 1) * stride\n quad(\n end + j,\n end + next,\n end + radialSegments + next,\n end + radialSegments + j,\n )\n }\n return { positions, indices }\n}\n","import { nemaMotorModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { NemaMotor } from \"../../NemaMotor\"\n\nexport const model = defineModelRenderer({\n name: \"nema\",\n schema: nemaMotorModelDefinitionSchema,\n render: ({ fn, ...props }) => <NemaMotor {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import { componentMaterials } from \"./materials\"\nimport jscad from \"@jscad/modeling\"\nimport type { generalize as Generalize } from \"@jscad/modeling/src/operations/modifiers/generalize\"\nimport { createNemaMotorWireGeometry } from \"./utils/nemaMotorWireGeometry\"\nimport { createNemaMotorSections } from \"./utils/nemaMotorGeometry\"\nimport {\n resolveNemaMotorProps,\n type NemaMotorModelPropsInput,\n} from \"./utils/nemaMotorParameters\"\nimport { createHexSocketBoltGeom } from \"./HexSocketBolt\"\nimport { Colorize, Custom } from \"jscad-fiber\"\n\n// JSCAD exposes generalize as a function at runtime, but its namespace\n// declaration exports a module. Keep the correction at this API boundary.\nconst generalize = jscad.modifiers.generalize as unknown as typeof Generalize\n\nexport type NemaMotorProps = NemaMotorModelPropsInput & {\n bodyColor?: string\n capColor?: string\n shaftColor?: string\n screwColor?: string\n}\nexport type NemaFrameMotorProps = Omit<NemaMotorProps, \"nemaSize\">\n\n/** Mounting face at Z=0, body along -Z, shaft along +Z; all lengths in mm.\n * Parameters follow the modelprinter NEMA contract; JSCAD builds all geometry.\n */\nexport function NemaMotor({\n bodyColor = \"#242830\",\n capColor = \"#aeb5bd\",\n shaftColor = \"#b8bec6\",\n screwColor = \"#626b78\",\n ...props\n}: NemaMotorProps) {\n const p = resolveNemaMotorProps(props)\n const screw =\n p.backFace === \"screws\"\n ? jscad.transforms.rotateX(\n Math.PI,\n createHexSocketBoltGeom({\n metricSize: p.backFaceScrewSize,\n length: p.backFaceHoleDepth,\n showThreads: false,\n }),\n )\n : undefined\n const halfPitch = p.backFaceHoleSpacing / 2\n return (\n <>\n {createNemaMotorSections(p).map((section, index) => {\n const outline = jscad.geometries.geom2.fromPoints(section.outline)\n const profile = section.holes.length\n ? jscad.booleans.subtract(\n outline,\n ...section.holes.map((h) => jscad.geometries.geom2.fromPoints(h)),\n )\n : outline\n const geometry = jscad.transforms.translate(\n [0, 0, section.zMin],\n jscad.extrusions.extrudeLinear(\n { height: section.zMax - section.zMin },\n profile,\n ),\n )\n return (\n <Colorize\n key={`${section.name}-${index}`}\n material={\n section.name === \"body\"\n ? componentMaterials.moldedPlastic\n : section.name === \"shaft\"\n ? componentMaterials.steel\n : componentMaterials.brushedMetal\n }\n color={\n section.name === \"body\"\n ? bodyColor\n : section.name === \"shaft\"\n ? shaftColor\n : capColor\n }\n >\n <Custom geometry={generalize({ simplify: true }, geometry)} />\n </Colorize>\n )\n })}\n {createNemaMotorWireGeometry(p).map(({ geometry, color }, index) => (\n <Colorize\n material={componentMaterials.rubber}\n key={`wire-${index}`}\n color={color}\n >\n <Custom geometry={generalize({ simplify: true }, geometry)} />\n </Colorize>\n ))}\n {screw &&\n [-halfPitch, halfPitch].flatMap((x) =>\n [-halfPitch, halfPitch].map((y) => (\n <Colorize\n material={componentMaterials.steel}\n key={`rear-screw-${x}-${y}`}\n color={screwColor}\n >\n {/* HexSocketBolt's +Z head is rotated to face -Z; its bearing plane\n is then placed on the motor's rear face, in the same mm frame. */}\n <Custom\n geometry={jscad.transforms.translate(\n [x, y, -p.bodyLength],\n generalize({ simplify: true }, screw),\n )}\n />\n </Colorize>\n )),\n )}\n </>\n )\n}\nexport const NEMA8 = (props: NemaFrameMotorProps) => (\n <NemaMotor {...props} nemaSize={8} />\n)\nexport const NEMA17 = (props: NemaFrameMotorProps) => (\n <NemaMotor {...props} nemaSize={17} />\n)\nexport const NEMA23 = (props: NemaFrameMotorProps) => (\n <NemaMotor {...props} nemaSize={23} />\n)\n","import jscad from \"@jscad/modeling\"\nimport {\n getJstMotorConnector,\n getNemaMotorReferencePoints,\n} from \"@tscircuit/modelprinter\"\nimport {\n resolveNemaMotorProps,\n type NemaMotorModelPropsInput,\n} from \"./nemaMotorParameters\"\n\n/** Visible wire termination in motor-local mm: +Z shaft, origin at front face.\n * Placement comes from the same spec reference used by assembly rotation.\n * Header dimensions, pin count and pitch come from modelprinter's shared\n * JST PH/SH profile; shell and contacts are illustrative.\n */\nexport function createNemaMotorWireGeometry(input: NemaMotorModelPropsInput) {\n const p = resolveNemaMotorProps(input)\n if (p.wireConnection === \"none\") return []\n const { position } = getNemaMotorReferencePoints(p).wireside\n const angle = (p.wireSideAngle * Math.PI) / 180\n // Only transform the direction/profile about +Z; the reference point already\n // includes its rotation. A point gets translation, a direction does not.\n const place = (geometry: jscad.geometries.geom3.Geom3) =>\n jscad.transforms.translate(\n [position.x, position.y, position.z],\n jscad.transforms.rotateZ(angle, geometry),\n )\n if (p.wireConnection === \"stubs\") {\n const colors = [\n \"#d53f3f\",\n \"#2463af\",\n \"#3b934b\",\n \"#252830\",\n \"#e5d049\",\n \"#eeeeee\",\n \"#ce7432\",\n \"#803e91\",\n ]\n return Array.from({ length: p.wireCount }, (_, i) => ({\n color: colors[i]!,\n geometry: place(\n jscad.transforms.translate(\n [\n (p.wireLength - 0.15) / 2,\n (i - (p.wireCount - 1) / 2) * p.wireDiameter * 1.5,\n 0,\n ],\n jscad.transforms.rotateY(\n Math.PI / 2,\n jscad.primitives.cylinder({\n height: p.wireLength + 0.15,\n radius: p.wireDiameter / 2,\n segments: 24,\n }),\n ),\n ),\n ),\n }))\n }\n const connector = getJstMotorConnector(p.wireConnection)!\n const { pinCount, pitch, bodyWidth, bodyHeight, matingDepth } = connector\n const wall = pitch === 2 ? 0.6 : 0.3\n const contactLength = pitch === 2 ? 3.4 : 2.4\n const contactSize = pitch === 2 ? 0.5 : 0.3\n const shell = jscad.booleans.subtract(\n jscad.primitives.cuboid({\n size: [matingDepth + 0.1, bodyWidth, bodyHeight],\n center: [(matingDepth - 0.1) / 2, 0, 0],\n }),\n jscad.primitives.cuboid({\n size: [matingDepth - 0.5, bodyWidth - 2 * wall, bodyHeight - 2 * wall],\n center: [matingDepth / 2 + 0.55, 0, 0],\n }),\n )\n return [\n { color: \"#eeeeea\", geometry: place(shell) },\n ...Array.from({ length: pinCount }, (_, i) => ({\n color: \"#b8bec6\",\n geometry: place(\n jscad.primitives.cuboid({\n size: [contactLength, contactSize, contactSize],\n center: [contactLength / 2, (i - (pinCount - 1) / 2) * pitch, 0],\n }),\n ),\n })),\n ]\n}\n","import { mp, nemaMotorModelPropsSchema } from \"@tscircuit/modelprinter\"\nexport type {\n NemaMotorModelProps,\n NemaMotorModelPropsInput,\n NemaSize,\n} from \"@tscircuit/modelprinter\"\n\nexport const resolveNemaMotorProps = nemaMotorModelPropsSchema.parse.bind(\n nemaMotorModelPropsSchema,\n)\n\nexport function parseNemaMotorString(source: string) {\n const definition = mp.string(source).json()\n if (definition.fn !== \"nema\")\n throw new Error(\"Expected nema8, nema17 or nema23\")\n const { fn, ...props } = definition\n return props\n}\n","import {\n resolveNemaMotorProps,\n type NemaMotorModelPropsInput,\n} from \"./nemaMotorParameters\"\n\nexport type NemaMotorPoint = [number, number]\nexport interface NemaMotorSection {\n name: \"body\" | \"frontCap\" | \"rearCap\" | \"pilot\" | \"shaft\"\n outline: NemaMotorPoint[]\n holes: NemaMotorPoint[][]\n zMin: number\n zMax: number\n}\nconst circle = (radius: number, x = 0, y = 0): NemaMotorPoint[] =>\n Array.from({ length: 96 }, (_, i) => [\n x + radius * Math.cos((i * Math.PI) / 48),\n y + radius * Math.sin((i * Math.PI) / 48),\n ])\nconst face = (width: number, chamfer: number): NemaMotorPoint[] => {\n const h = width / 2,\n c = chamfer\n if (c === 0)\n return [\n [-h, -h],\n [h, -h],\n [h, h],\n [-h, h],\n ]\n return [\n [-h + c, -h],\n [h - c, -h],\n [h, -h + c],\n [h, h - c],\n [h - c, h],\n [-h + c, h],\n [-h, h - c],\n [-h, -h + c],\n ]\n}\n\n/** Renderer-independent closed extrusions in mm. The shaft axis is +Z,\n * mounting face at Z=0, body at -bodyLength. Cap/core profiles are illustrative.\n * Blind holes have actual floors; front through holes clear the core.\n * Rear cap bores and screws are configured separately.\n * Threads and manufacturing tolerances are not represented. Wire geometry is added separately.\n */\nexport function createNemaMotorSections(\n input: NemaMotorModelPropsInput,\n): NemaMotorSection[] {\n const p = resolveNemaMotorProps(input)\n const sections: NemaMotorSection[] = []\n const add = (\n name: NemaMotorSection[\"name\"],\n outline: NemaMotorPoint[],\n zMin: number,\n zMax: number,\n holes: NemaMotorPoint[][] = [],\n ) => {\n if (zMax > zMin) sections.push({ name, outline, holes, zMin, zMax })\n }\n const front = face(p.bodyWidth, p.faceCornerChamfer)\n const core = face(p.bodyWidth, p.bodyCornerChamfer)\n const h = p.mountingHoleSpacing / 2\n const centers: NemaMotorPoint[] = [\n [-h, -h],\n [h, -h],\n [h, h],\n [-h, h],\n ]\n const holes = centers.map(([x, y]) =>\n circle(p.mountingHoleDiameter / 2, x, y),\n )\n const holeDepth = p.mountingHoleThrough\n ? p.frontCapLength\n : p.mountingHoleDepth\n add(\"frontCap\", front, -holeDepth, 0, holes)\n add(\"frontCap\", front, -p.frontCapLength, -holeDepth)\n add(\"body\", core, -p.bodyLength + p.rearCapLength, -p.frontCapLength)\n if (p.backFace === \"plain\") {\n add(\n \"rearCap\",\n p.mountingHoleThrough ? core : front,\n -p.bodyLength,\n -p.bodyLength + p.rearCapLength,\n )\n } else {\n const halfPitch = p.backFaceHoleSpacing / 2\n const rearHoles = [-halfPitch, halfPitch].flatMap((x) =>\n [-halfPitch, halfPitch].map((y) =>\n circle(p.backFaceHoleDiameter / 2, x, y),\n ),\n )\n // Rear-facing blind bores open at -bodyLength, with a solid floor inside\n // the cap. The full cap outline supports NEMA23's rear corner fasteners.\n add(\n \"rearCap\",\n front,\n -p.bodyLength,\n -p.bodyLength + p.backFaceHoleDepth,\n rearHoles,\n )\n add(\n \"rearCap\",\n front,\n -p.bodyLength + p.backFaceHoleDepth,\n -p.bodyLength + p.rearCapLength,\n )\n }\n add(\"pilot\", circle(p.pilotDiameter / 2), 0, p.pilotLength)\n const r = p.shaftDiameter / 2\n const round = circle(r)\n if (p.shaftShape === \"round\")\n add(\"shaft\", round, p.pilotLength, p.shaftLength)\n else {\n const cut = r - p.shaftFlatDepth\n const angle = Math.acos(cut / r)\n // Exact chord ends and a circular arc: no clamping duplicate vertices.\n const profile: NemaMotorPoint[] = Array.from({ length: 97 }, (_, i) => {\n const a = angle + ((2 * Math.PI - 2 * angle) * i) / 96\n return [r * Math.cos(a), r * Math.sin(a)]\n })\n const rotation = (p.shaftFlatAngle * Math.PI) / 180\n const d: NemaMotorPoint[] = profile.map(([x, y]) => [\n x * Math.cos(rotation) - y * Math.sin(rotation),\n x * Math.sin(rotation) + y * Math.cos(rotation),\n ])\n add(\"shaft\", round, p.pilotLength, p.shaftLength - p.shaftFlatLength)\n add(\"shaft\", d, p.shaftLength - p.shaftFlatLength, p.shaftLength)\n }\n return sections\n}\n","import { panScrewModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { PanScrew } from \"./PanScrew\"\n\nexport const model = defineModelRenderer({\n name: \"panscrew\",\n schema: panScrewModelDefinitionSchema,\n render: ({ fn, ...props }) => <PanScrew {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { PanScrewModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createPanScrewMesh, type PanScrewMeshOptions } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type PanScrewProps = PanScrewModelPropsInput & { color?: string }\nexport function createPanScrewGeom(\n input: PanScrewModelPropsInput,\n options?: PanScrewMeshOptions,\n) {\n return indexedMeshToGeom3(createPanScrewMesh(input, options))\n}\nexport function PanScrew({ color = \"#737e8f\", ...props }: PanScrewProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createPanScrewGeom(props)} />\n </Colorize>\n )\n}\nexport { createPanScrewMesh } from \"./mesh\"\nexport type {\n PanScrewMesh,\n PanScrewMeshOptions,\n} from \"./mesh\"\n","import {\n panScrewModelPropsSchema,\n type PanScrewModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\nexport interface PanScrewMeshOptions {\n radialSegments?: number\n threadStepsPerTurn?: number\n}\n\n/** Outward-oriented, welded indexed surface, in millimeters. */\nexport interface PanScrewMesh {\n positions: number[]\n indices: number[]\n}\n\nexport function createPanScrewMesh(\n input: PanScrewModelPropsInput,\n options: PanScrewMeshOptions = {},\n): PanScrewMesh {\n const p = panScrewModelPropsSchema.parse(input)\n const segments = options.radialSegments ?? 96\n const axial = options.threadStepsPerTurn ?? 24\n if (\n !Number.isInteger(segments) ||\n segments < 24 ||\n segments > 192 ||\n segments % 24 !== 0 ||\n !Number.isInteger(axial) ||\n axial < 24 ||\n axial > 96\n )\n throw new Error(\n \"Screw mesh resolution requires 24..192 radial segments divisible by 24 and 24..96 thread steps\",\n )\n const positions: number[] = [],\n indices: number[] = []\n const welded = new Map<string, number>()\n const vertex = (x: number, y: number, z: number) => {\n const key = [x, y, z].map((v) => Math.round(v * 1e10)).join(\":\")\n const existing = welded.get(key)\n if (existing !== undefined) return existing\n const index = positions.length / 3\n positions.push(x, y, z)\n welded.set(key, index)\n return index\n }\n const triangle = (a: number, b: number, c: number) => {\n if (a === b || b === c || c === a) return\n const point = (i: number) => positions.slice(3 * i, 3 * i + 3)\n const A = point(a),\n B = point(b),\n C = point(c)\n const u = B.map((v, i) => v - A[i]!),\n v = C.map((w, i) => w - A[i]!)\n const area = Math.hypot(\n u[1]! * v[2]! - u[2]! * v[1]!,\n u[2]! * v[0]! - u[0]! * v[2]!,\n u[0]! * v[1]! - u[1]! * v[0]!,\n )\n if (area > 1e-12) indices.push(a, b, c)\n }\n const ring = (\n radiusAt: (theta: number) => number,\n zAt: number | ((theta: number) => number),\n ) =>\n Array.from({ length: segments }, (_, i) => {\n const theta = (i * 2 * Math.PI) / segments,\n r = radiusAt(theta)\n return vertex(\n r * Math.cos(theta),\n r * Math.sin(theta),\n typeof zAt === \"number\" ? zAt : zAt(theta),\n )\n })\n const connect = (a: number[], b: number[]) => {\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n triangle(a[i]!, a[n]!, b[n]!)\n triangle(a[i]!, b[n]!, b[i]!)\n }\n }\n const cap = (a: number[], z: number, up: boolean) => {\n const c = vertex(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n up ? triangle(c, a[i]!, a[n]!) : triangle(c, a[n]!, a[i]!)\n }\n }\n let previous: number[] = []\n const add = (\n radiusAt: (theta: number) => number,\n zAt: number | ((theta: number) => number),\n ) => {\n const r = ring(radiusAt, zAt)\n if (previous.length) connect(previous, r)\n previous = r\n return r\n }\n const major = p.diameter / 2,\n minor = p.threadRootDiameter / 2,\n pitch = p.threadPitch\n const shaftEnd = -p.underHeadRadius\n const steps = p.showThreads\n ? Math.ceil(((shaftEnd + p.length) / pitch) * axial)\n : 1\n if ((steps + 160) * segments > 400000)\n throw new Error(\"Screw exceeds mesh resolution limit\")\n const levels = new Set<number>([\n -p.length,\n -p.length + p.tipChamfer,\n shaftEnd,\n ])\n if (p.showThreads)\n for (let i = 0; i <= steps; i++)\n levels.add(-p.length + ((shaftEnd + p.length) * i) / steps)\n for (const z of [...levels].sort((a, b) => a - b)) {\n const r = add((theta) => {\n // Phase is fixed at +X on the nominal tip plane, before chamfer clipping.\n const phase =\n ((((z + p.length) / pitch -\n ((p.threadHand === \"right\" ? 1 : -1) * theta) / (2 * Math.PI)) %\n 1) +\n 1) %\n 1\n const d = Math.min(phase, 1 - phase)\n const groove = Math.min(\n major - minor,\n Math.max(0, (d - 1 / 16) * pitch * Math.sqrt(3)),\n )\n const thread = p.showThreads ? major - groove : major\n return Math.min(\n thread,\n major - Math.max(0, p.tipChamfer - (z + p.length)),\n )\n }, z)\n if (z === -p.length) cap(r, z, false)\n }\n // Tangent circular under-head blend; its start also trims incomplete crests.\n add(() => major, shaftEnd)\n const filletCenterR = major + p.underHeadRadius\n const filletCenterZ = shaftEnd\n for (let i = 1; i <= 16; i++) {\n const angle = Math.PI - ((Math.PI - Math.PI / 2) * i) / 16\n add(\n () => filletCenterR + p.underHeadRadius * Math.cos(angle),\n filletCenterZ + p.underHeadRadius * Math.sin(angle),\n )\n }\n\n const crown = (r: number) =>\n p.headHeight -\n p.crownRadius +\n Math.sqrt(p.crownRadius * p.crownRadius - r * r)\n const rad265 = (p.recessOuterWingAngle * Math.PI) / 180,\n rad28 = (p.recessInnerWingAngle * Math.PI) / 180\n const tg = (p.recessReferenceDiameter - p.recessG) / 2 / Math.tan(rad265)\n const totalDepth = tg + (p.recessG / 2) * Math.tan(rad28)\n const tb = tg + ((p.recessG - p.recessB) / 2) * Math.tan(rad28)\n const beta = (p.recessBeta * Math.PI) / 180\n const alphaProjected = Math.atan(\n Math.tan((p.recessAlpha * Math.PI) / 360) / Math.cos(beta),\n )\n const cornerProjected = Math.atan(\n Math.tan((46 * Math.PI) / 180) / Math.cos(beta),\n )\n const dre = p.recessE / 2 / Math.tan(alphaProjected)\n // Type-H is a compound conical wing profile with four tapered corner cuts.\n const cornerRadius = (z: number, theta: number) => {\n const depth = p.recessReferencePlaneHeight - z\n const b = p.recessB / 2 - (depth - tb) * Math.tan(beta)\n const delta = Math.abs(\n ((theta - Math.PI / 4 + Math.PI / 4 + 4 * Math.PI) % (Math.PI / 2)) -\n Math.PI / 4,\n )\n const ca = Math.cos(delta),\n sa = Math.sin(delta)\n const tanA = Math.tan(alphaProjected),\n tanC = Math.tan(cornerProjected)\n const first = (tanA * b) / (tanA * ca - sa)\n const corner =\n first * ca <= b + dre\n ? first\n : (tanC * (b + dre) - p.recessE / 2) / (tanC * ca - sa)\n return Math.max(0, corner)\n }\n const recessRadius = (z: number, theta: number) => {\n const depth = p.recessReferencePlaneHeight - z\n const outer =\n depth <= tg\n ? p.recessReferenceDiameter / 2 - depth * Math.tan(rad265)\n : (totalDepth - depth) / Math.tan(rad28)\n return Math.max(0, Math.min(outer, cornerRadius(z, theta)))\n }\n // ISO 4757 r rounds the wing entry, not the g/bottom-cone junction.\n // Offset the spherical crown inward by r and the wing wall into material by r.\n // Their intersection is the center of a circle tangent to both surfaces.\n const entryRadius = p.recessRadius,\n sphereZ = p.headHeight - p.crownRadius,\n slope = Math.tan(rad265),\n line =\n p.recessReferenceDiameter / 2 -\n slope * p.recessReferencePlaneHeight +\n entryRadius / Math.cos(rad265),\n offset = slope * sphereZ + line,\n innerSphere = p.crownRadius - entryRadius,\n centerAboveSphere =\n (-slope * offset +\n Math.sqrt((1 + slope * slope) * innerSphere ** 2 - offset ** 2)) /\n (1 + slope * slope),\n entryCenterZ = sphereZ + centerAboveSphere,\n entryCenterR = slope * entryCenterZ + line,\n entryStart = Math.atan2(centerAboveSphere, entryCenterR),\n entryEnd = Math.PI - rad265,\n mouthR = entryCenterR + entryRadius * Math.cos(entryStart),\n wallZ = entryCenterZ + entryRadius * Math.sin(entryEnd)\n add(() => p.headDiameter / 2, 0)\n add(() => p.headDiameter / 2, crown(p.headDiameter / 2))\n // The wing mouth meets the crown tangentially. Corner cuts may narrow it.\n const opening = Array.from({ length: segments }, (_, i) => {\n const theta = (i * 2 * Math.PI) / segments\n let lo = 0,\n hi = mouthR\n for (let n = 0; n < 48; n++) {\n const r = (lo + hi) / 2\n if (r < cornerRadius(crown(r), theta)) lo = r\n else hi = r\n }\n return (lo + hi) / 2\n })\n for (let n = 1; n <= 20; n++) {\n const r = (theta: number) => {\n const i = Math.round((theta * segments) / (2 * Math.PI)) % segments\n return p.headDiameter / 2 + ((opening[i]! - p.headDiameter / 2) * n) / 20\n }\n add(r, (theta) => crown(r(theta)))\n }\n // A corner-limited ray joins the circle only at its true intersection.\n // Collapse earlier rows there instead of projecting them onto the wall:\n // the circle initially rises in Z, which would retrace that planar wall.\n const entryClips = Array.from({ length: segments }, (_, i) => {\n const theta = (i * 2 * Math.PI) / segments\n const point = (angle: number) => ({\n r: entryCenterR + entryRadius * Math.cos(angle),\n z: entryCenterZ + entryRadius * Math.sin(angle),\n })\n const outside = (angle: number) => {\n const q = point(angle)\n return q.r > cornerRadius(q.z, theta)\n }\n if (!outside(entryStart)) return { angle: entryStart, ...point(entryStart) }\n if (outside(entryEnd))\n return { angle: entryEnd, r: cornerRadius(wallZ, theta), z: wallZ }\n let lo = entryStart,\n hi = entryEnd\n for (let n = 0; n < 48; n++) {\n const angle = (lo + hi) / 2\n if (outside(angle)) lo = angle\n else hi = angle\n }\n const angle = (lo + hi) / 2\n return { angle, ...point(angle) }\n })\n for (let n = 0; n <= 24; n++) {\n const angle = entryStart + ((entryEnd - entryStart) * n) / 24\n const r = entryCenterR + entryRadius * Math.cos(angle),\n z = entryCenterZ + entryRadius * Math.sin(angle)\n const clip = (theta: number) =>\n entryClips[Math.round((theta * segments) / (2 * Math.PI)) % segments]!\n add(\n (theta) => (angle <= clip(theta).angle ? clip(theta).r : r),\n (theta) => (angle <= clip(theta).angle ? clip(theta).z : z),\n )\n }\n const floor = p.recessReferencePlaneHeight - totalDepth\n // Keep the nominal g junction explicit; f/t1 remain standard reference limits.\n const driveLevels = new Set<number>([p.recessReferencePlaneHeight - tg])\n for (let n = 1; n < 48; n++)\n driveLevels.add(wallZ + ((floor - wallZ) * n) / 48)\n for (const z of [...driveLevels]\n .filter((z) => z < wallZ && z > floor)\n .sort((a, b) => b - a)) {\n add((theta) => recessRadius(z, theta), z)\n }\n const point = vertex(0, 0, floor)\n for (let i = 0; i < segments; i++)\n triangle(point, previous[i]!, previous[(i + 1) % segments]!)\n\n return { positions, indices }\n}\n","import { plainBushingModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { PlainBushing } from \"./PlainBushing\"\n\nexport const model = defineModelRenderer({\n name: \"plainbushing\",\n schema: plainBushingModelDefinitionSchema,\n render: ({ fn, ...props }) => <PlainBushing {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { PlainBushingModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createPlainBushingMesh } from \"./mesh\"\n\nexport type PlainBushingProps = PlainBushingModelPropsInput & { color?: string }\n\n/** Through sleeve from Z=0 to length, with four optional 45-degree rim chamfers. */\nexport function createPlainBushingGeom(input: PlainBushingModelPropsInput) {\n return indexedMeshToGeom3(createPlainBushingMesh(input))\n}\n\nexport function PlainBushing({\n color = \"#a18450\",\n ...props\n}: PlainBushingProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createPlainBushingGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createPlainBushingMesh } from \"./mesh\"\nexport type { PlainBushingMesh } from \"./mesh\"\n","import {\n getPlainBushingDimensions,\n plainBushingModelPropsSchema,\n type PlainBushingModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\n/** Shared ring vertices and outward counterclockwise triangles, in millimeters. */\nexport interface PlainBushingMesh {\n positions: number[]\n indices: number[]\n}\n\n/** Annular end faces at Z=0/length; chamfers cut all four bore/outside rims. */\nexport function createPlainBushingMesh(\n input: PlainBushingModelPropsInput,\n): PlainBushingMesh {\n const props = plainBushingModelPropsSchema.parse(input)\n const d = getPlainBushingDimensions(props)\n const ri = d.innerDiameter / 2\n const ro = d.outerDiameter / 2\n const c = props.edgeChamfer\n // Traverse the closed radial/axial section: outside upward, inside downward.\n // No center cap is ever added, so both end openings remain connected.\n const profile: [number, number][] =\n c > 0\n ? [\n [d.endOuterDiameter / 2, 0],\n [ro, c],\n [ro, d.length - c],\n [d.endOuterDiameter / 2, d.length],\n [d.endInnerDiameter / 2, d.length],\n [ri, d.length - c],\n [ri, c],\n [d.endInnerDiameter / 2, 0],\n ]\n : [\n [ro, 0],\n [ro, d.length],\n [ri, d.length],\n [ri, 0],\n ]\n const segments = 96 // Four cardinal directions are exact; allocation is fixed.\n const positions: number[] = []\n const indices: number[] = []\n for (const [radius, z] of profile)\n for (let i = 0; i < segments; i++) {\n const angle = (i * Math.PI * 2) / segments\n positions.push(radius * Math.cos(angle), radius * Math.sin(angle), z)\n }\n for (let ring = 0; ring < profile.length; ring++) {\n const a = ring * segments\n const b = ((ring + 1) % profile.length) * segments\n for (let i = 0; i < segments; i++) {\n const next = (i + 1) % segments\n indices.push(a + i, a + next, b + next, a + i, b + next, b + i)\n }\n }\n return { positions, indices }\n}\n","import { rigidCouplerModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { RigidCoupler } from \"./RigidCoupler\"\n\nexport const model = defineModelRenderer({\n name: \"rigidcoupler\",\n schema: rigidCouplerModelDefinitionSchema,\n render: ({ fn, ...props }) => <RigidCoupler {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { RigidCouplerModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createRigidCouplerMesh } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type RigidCouplerProps = RigidCouplerModelPropsInput & { color?: string }\n\n/** Datum and mounting-hole coordinates follow the modelprinter contract. */\nexport function createRigidCouplerGeom(input: RigidCouplerModelPropsInput) {\n return indexedMeshToGeom3(createRigidCouplerMesh(input))\n}\n\nexport function RigidCoupler({\n color = \"#737e8f\",\n ...props\n}: RigidCouplerProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createRigidCouplerGeom(props)} />\n </Colorize>\n )\n}\nexport { createRigidCouplerMesh } from \"./mesh\"\nexport type { RigidCouplerMesh } from \"./mesh\"\n","import jscad from \"@jscad/modeling\"\nimport {\n rigidCouplerModelPropsSchema,\n getRigidCouplerDimensions,\n type RigidCouplerModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport {\n assertShaftMountResolution,\n createAnnularSleeve,\n createMountingHoleCutter,\n finishShaftMountMesh,\n subtractShaftMountParts,\n type ShaftMountMesh,\n} from \"../../mechanical/shaft-mount-geometry\"\n\nexport type RigidCouplerMesh = ShaftMountMesh\n\n/** Geometry is driven by the corresponding modelprinter schema and hole layout. */\nexport function createRigidCouplerMesh(\n input: RigidCouplerModelPropsInput,\n): RigidCouplerMesh {\n const props = rigidCouplerModelPropsSchema.parse(input)\n const dimensions = getRigidCouplerDimensions(props)\n assertShaftMountResolution(dimensions.screwHoles)\n const body = createAnnularSleeve({\n outerRadius: props.outerDiameter / 2,\n boreARadius: props.boreDiameter / 2,\n boreBRadius: props.boreBDiameter / 2,\n length: props.length,\n chamfer: props.chamfer,\n stepZ: dimensions.boreADepth,\n })\n return finishShaftMountMesh(\n subtractShaftMountParts(\n body,\n ...dimensions.screwHoles.map(createMountingHoleCutter),\n ),\n )\n}\n","import { shaftCollarModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { ShaftCollar } from \"./ShaftCollar\"\n\nexport const model = defineModelRenderer({\n name: \"shaftcollar\",\n schema: shaftCollarModelDefinitionSchema,\n render: ({ fn, ...props }) => <ShaftCollar {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { ShaftCollarModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createShaftCollarMesh } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type ShaftCollarProps = ShaftCollarModelPropsInput & { color?: string }\n\n/** Datum and mounting-hole coordinates follow the modelprinter contract. */\nexport function createShaftCollarGeom(input: ShaftCollarModelPropsInput) {\n return indexedMeshToGeom3(createShaftCollarMesh(input))\n}\n\nexport function ShaftCollar({ color = \"#737e8f\", ...props }: ShaftCollarProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createShaftCollarGeom(props)} />\n </Colorize>\n )\n}\nexport { createShaftCollarMesh } from \"./mesh\"\nexport type { ShaftCollarMesh } from \"./mesh\"\n","import jscad from \"@jscad/modeling\"\nimport {\n shaftCollarModelPropsSchema,\n getShaftCollarDimensions,\n type ShaftCollarModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport {\n assertShaftMountResolution,\n createAnnularSleeve,\n createMountingHoleCutter,\n finishShaftMountMesh,\n subtractShaftMountParts,\n type ShaftMountMesh,\n} from \"../../mechanical/shaft-mount-geometry\"\n\nexport type ShaftCollarMesh = ShaftMountMesh\n\n/** Geometry is driven by the corresponding modelprinter schema and hole layout. */\nexport function createShaftCollarMesh(\n input: ShaftCollarModelPropsInput,\n): ShaftCollarMesh {\n const props = shaftCollarModelPropsSchema.parse(input)\n const dimensions = getShaftCollarDimensions(props)\n assertShaftMountResolution([dimensions.screwHole])\n const body = createAnnularSleeve({\n outerRadius: props.outerDiameter / 2,\n boreARadius: props.boreDiameter / 2,\n length: props.width,\n chamfer: props.chamfer,\n })\n return finishShaftMountMesh(\n subtractShaftMountParts(\n body,\n createMountingHoleCutter(dimensions.screwHole),\n ),\n )\n}\n","import { sheetMetalModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { SheetMetal } from \"../../SheetMetal\"\n\nexport const model = defineModelRenderer({\n name: \"sheetmetal\",\n schema: sheetMetalModelDefinitionSchema,\n render: ({ fn, ...props }) => <SheetMetal {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import { componentMaterials } from \"./materials\"\nimport type { SheetMetalModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createSheetMetalMesh } from \"./mechanical/sheet-metal-mesh\"\nimport { indexedMeshToGeom3 } from \"./mechanical/indexedMeshToGeom3\"\n\nexport type SheetMetalProps = SheetMetalModelPropsInput & { color?: string }\n\n/** Base midsurface Z=0; bends and flanges rise along +Z. Dimensions in mm. */\nexport function createSheetMetalGeom(input: SheetMetalModelPropsInput) {\n return indexedMeshToGeom3(createSheetMetalMesh(input))\n}\n\nexport function SheetMetal({ color = \"#737e8f\", ...props }: SheetMetalProps) {\n return (\n <Colorize color={color} material={componentMaterials.brushedMetal}>\n <Custom geometry={createSheetMetalGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createSheetMetalMesh } from \"./mechanical/sheet-metal-mesh\"\nexport type { SheetMetalMesh } from \"./mechanical/sheet-metal-mesh\"\n","import earcut from \"earcut\"\nimport {\n sheetMetalModelPropsSchema,\n type SheetMetalModelPropsInput,\n type SheetMetalHole,\n} from \"@tscircuit/modelprinter\"\n\ntype Point2 = { u: number; v: number }\ntype Point3 = [number, number, number]\nexport interface SheetMetalMesh {\n positions: number[]\n indices: number[]\n}\n\nfunction holeOutline(hole: SheetMetalHole): Point2[] {\n const radius = (hole.shape === \"round\" ? hole.diameter : hole.width) / 2\n const straight = hole.shape === \"slot\" ? (hole.length - hole.width) / 2 : 0\n if (straight < 0) throw new Error(\"Slot length must be at least its width\")\n return Array.from({ length: 64 }, (_, i) => {\n if (hole.shape === \"round\") {\n const angle = (i * Math.PI) / 32\n return {\n u: hole.u + radius * Math.cos(angle),\n v: hole.v + radius * Math.sin(angle),\n }\n }\n // Two semicircles, with straight connections between their end points.\n const half = i < 32 ? 1 : -1\n const angle =\n -Math.PI / 2 +\n ((i < 32 ? i : i - 32) * Math.PI) / 31 +\n (i < 32 ? 0 : Math.PI)\n const along = half * straight + radius * Math.cos(angle)\n const across = radius * Math.sin(angle)\n return hole.shape === \"slot\" && hole.axis === \"v\"\n ? { u: hole.u - across, v: hole.v + along }\n : { u: hole.u + along, v: hole.v + across }\n })\n}\n\n/** Watertight sheet-metal plate, 90-degree angle or U-channel. Millimeters,\n * right-handed +Z up. Base midsurface at Z=0, centered in X/Y; flanges rise\n * above it. Lengths measure straight tangent-to-tangent sections. Bend skins\n * use the specified inside radius and constant material thickness.\n * Holes are through-cut on straight panels only; no bend allowance/unfolding.\n */\nexport function createSheetMetalMesh(\n input: SheetMetalModelPropsInput,\n): SheetMetalMesh {\n const props = sheetMetalModelPropsSchema.parse(input)\n const { width, baseLength, flangeHeight, thickness, profile } = props\n const radius = props.insideBendRadius + thickness / 2\n const positions: number[] = []\n const indices: number[] = []\n const addTriangle = (vertices: Point3[], reverse = false) => {\n const start = positions.length / 3\n for (const vertex of vertices) positions.push(...vertex)\n indices.push(start, start + (reverse ? 2 : 1), start + (reverse ? 1 : 2))\n }\n const addQuad = (vertices: Point3[], reverse = false) => {\n addTriangle([vertices[0]!, vertices[1]!, vertices[2]!], reverse)\n addTriangle([vertices[0]!, vertices[2]!, vertices[3]!], reverse)\n }\n const panels =\n profile === \"plate\"\n ? [\"base\"]\n : profile === \"angle\"\n ? [\"base\", \"right\"]\n : [\"base\", \"left\", \"right\"]\n for (const hole of props.holes) {\n if (!panels.includes(hole.panel))\n throw new Error(`No ${hole.panel} panel on ${profile}`)\n }\n for (const panel of panels) {\n const length = panel === \"base\" ? baseLength : flangeHeight\n const holes = props.holes\n .filter((hole) => hole.panel === panel)\n .map(holeOutline)\n const bounds = holes.map((outline) => ({\n minU: Math.min(...outline.map((p) => p.u)),\n maxU: Math.max(...outline.map((p) => p.u)),\n minV: Math.min(...outline.map((p) => p.v)),\n maxV: Math.max(...outline.map((p) => p.v)),\n }))\n for (const [i, box] of bounds.entries()) {\n if (\n box.minU <= -length / 2 ||\n box.maxU >= length / 2 ||\n box.minV <= -width / 2 ||\n box.maxV >= width / 2\n )\n throw new Error(`Hole crosses ${panel} panel edge or bend tangent`)\n for (const previous of bounds.slice(0, i))\n if (\n box.minU <= previous.maxU &&\n box.maxU >= previous.minU &&\n box.minV <= previous.maxV &&\n box.maxV >= previous.minV\n )\n throw new Error(\"Hole bounding boxes must not overlap\")\n }\n const outline: Point2[] = [\n { u: -length / 2, v: -width / 2 },\n { u: length / 2, v: -width / 2 },\n { u: length / 2, v: width / 2 },\n { u: -length / 2, v: width / 2 },\n ]\n const loops = [outline, ...holes.map((hole) => [...hole].reverse())]\n const points = loops.flat()\n const starts = holes.map((_, i) => 4 + i * 64)\n const triangles = earcut(\n points.flatMap((p) => [p.u, p.v]),\n starts,\n )\n const project = (point: Point2, offset: number): Point3 =>\n panel === \"base\"\n ? [point.u, point.v, offset]\n : [\n (panel === \"left\" ? -1 : 1) * (baseLength / 2 + radius - offset),\n point.v,\n radius + flangeHeight / 2 + point.u,\n ]\n const reverse = panel === \"left\"\n for (let i = 0; i < triangles.length; i += 3) {\n const face = triangles.slice(i, i + 3).map((index) => points[index]!)\n addTriangle(\n face.map((p) => project(p, thickness / 2)),\n reverse,\n )\n addTriangle(\n face.map((p) => project(p, -thickness / 2)),\n !reverse,\n )\n }\n for (const [loopIndex, loop] of loops.entries())\n for (let i = 0; i < loop.length; i++) {\n const a = loop[i]!,\n b = loop[(i + 1) % loop.length]!\n // Adjacent curved panels close these edges; avoid internal seam faces.\n if (\n loopIndex === 0 &&\n a.u === b.u &&\n ((panel === \"base\" &&\n ((a.u > 0 && profile !== \"plate\") ||\n (a.u < 0 && profile === \"channel\"))) ||\n (panel !== \"base\" && a.u < 0))\n )\n continue\n addQuad(\n [\n project(a, -thickness / 2),\n project(b, -thickness / 2),\n project(b, thickness / 2),\n project(a, thickness / 2),\n ],\n reverse,\n )\n }\n }\n const sides = profile === \"plate\" ? [] : profile === \"angle\" ? [1] : [-1, 1]\n for (const side of sides) {\n const project = (\n angle: number,\n crossSection: { y: number; offset: number },\n ): Point3 => {\n const r = radius - crossSection.offset\n return [\n side * (baseLength / 2 + r * Math.sin(angle)),\n crossSection.y,\n radius - r * Math.cos(angle),\n ]\n }\n for (let i = 0; i < 32; i++) {\n const a = (i * Math.PI) / 64,\n b = ((i + 1) * Math.PI) / 64\n for (const offset of [-thickness / 2, thickness / 2]) {\n addQuad(\n [\n project(a, { y: -width / 2, offset }),\n project(b, { y: -width / 2, offset }),\n project(b, { y: width / 2, offset }),\n project(a, { y: width / 2, offset }),\n ],\n offset < 0 !== side < 0,\n )\n }\n for (const y of [-width / 2, width / 2]) {\n addQuad(\n [\n project(a, { y, offset: -thickness / 2 }),\n project(b, { y, offset: -thickness / 2 }),\n project(b, { y, offset: thickness / 2 }),\n project(a, { y, offset: thickness / 2 }),\n ],\n y > 0 !== side < 0,\n )\n }\n }\n }\n return { positions, indices }\n}\n","import { spurGearModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { SpurGear } from \"../../SpurGear\"\n\nexport const model = defineModelRenderer({\n name: \"spurgear\",\n schema: spurGearModelDefinitionSchema,\n render: ({ fn, ...props }) => <SpurGear {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { SpurGearModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"./mechanical/indexedMeshToGeom3\"\nimport { createSpurGearMesh } from \"./mechanical/spur-gear-mesh\"\n\nexport type SpurGearProps = SpurGearModelPropsInput & { color?: string }\n\n/** Axis +Z, lower face Z=0; optional hub extends above the gear face. */\nexport function createSpurGearGeom(input: SpurGearModelPropsInput) {\n return indexedMeshToGeom3(createSpurGearMesh(input))\n}\n\nexport function SpurGear({ color = \"#737e8f\", ...props }: SpurGearProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createSpurGearGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createSpurGearMesh } from \"./mechanical/spur-gear-mesh\"\nexport type { SpurGearMesh } from \"./mechanical/spur-gear-mesh\"\n","import { threadedRodModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { ThreadedRod } from \"./ThreadedRod\"\n\nexport const model = defineModelRenderer({\n name: \"threadedrod\",\n schema: threadedRodModelDefinitionSchema,\n render: ({ fn, ...props }) => <ThreadedRod {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { ThreadedRodModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createThreadedRodMesh, type ThreadedRodMeshOptions } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type ThreadedRodProps = ThreadedRodModelPropsInput & { color?: string }\nexport function createThreadedRodGeom(\n input: ThreadedRodModelPropsInput,\n resolution?: ThreadedRodMeshOptions,\n) {\n return indexedMeshToGeom3(createThreadedRodMesh(input, resolution))\n}\nexport function ThreadedRod({ color = \"#737e8f\", ...props }: ThreadedRodProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createThreadedRodGeom(props)} />\n </Colorize>\n )\n}\nexport { createThreadedRodMesh } from \"./mesh\"\nexport type {\n ThreadedRodMesh,\n ThreadedRodMeshOptions,\n} from \"./mesh\"\n","import {\n threadedRodModelPropsSchema,\n getThreadedRodDimensions,\n type ThreadedRodModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\n/** Indexed counterclockwise triangles in millimeters. */\nexport interface ThreadedRodMesh {\n positions: number[]\n indices: number[]\n}\n/** Renderer resolution affects tessellation only, never model specifications. */\nexport interface ThreadedRodMeshOptions {\n radialSegments?: number\n segmentsPerPitch?: number\n}\nfunction resolution(options: ThreadedRodMeshOptions) {\n const radial = options.radialSegments ?? 96\n const axial = options.segmentsPerPitch ?? 32\n if (\n !Number.isInteger(radial) ||\n radial < 24 ||\n radial > 192 ||\n radial % 12 !== 0 ||\n !Number.isInteger(axial) ||\n axial < 8 ||\n axial > 64\n )\n throw new Error(\n \"Mesh resolution limit: radial segments must be a multiple of 12 in [24,192], pitch segments an integer in [8,64]\",\n )\n return { radial, axial }\n}\nfunction surface(segments: number) {\n const positions: number[] = [],\n indices: number[] = []\n const ring = (z: number, radius: (angle: number) => number) => {\n const start = positions.length / 3\n for (let i = 0; i < segments; i++) {\n const angle = (i * 2 * Math.PI) / segments\n const r = radius(angle)\n positions.push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n return start\n }\n const connect = (a: number, b: number) => {\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n indices.push(a + i, a + n, b + n, a + i, b + n, b + i)\n }\n }\n const cap = (start: number, z: number, up: boolean) => {\n const center = positions.length / 3\n positions.push(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n indices.push(center, start + (up ? i : n), start + (up ? n : i))\n }\n }\n return { positions, indices, ring, connect, cap }\n}\nfunction hexRadius(angle: number, acrossFlats: number) {\n const period = Math.PI / 3\n const distance =\n ((((angle - Math.PI / 2 + period / 2) % period) + period) % period) -\n period / 2\n return acrossFlats / 2 / Math.cos(distance)\n}\nfunction threadDistance(z: number, angle: number, pitch: number, hand = 1) {\n const phase = (((z / pitch - (hand * angle) / (2 * Math.PI)) % 1) + 1) % 1\n return Math.min(phase, 1 - phase)\n}\n/** Full single-start external thread, phase +X at z=0, flat chamfered ends. */\nexport function createThreadedRodMesh(\n input: ThreadedRodModelPropsInput,\n options: ThreadedRodMeshOptions = {},\n): ThreadedRodMesh {\n const props = threadedRodModelPropsSchema.parse(input)\n const d = getThreadedRodDimensions(input)\n const { radial, axial } = resolution(options)\n const steps = Math.max(2, Math.ceil((d.length / d.threadPitch) * axial))\n if (\n steps > 24000 ||\n !Number.isFinite(steps) ||\n Math.min(d.minorDiameter, d.endDiameter) < d.diameter * 1e-8\n )\n throw new Error(\n \"Mesh resolution limit: excessive turns or vanishing end/root radius\",\n )\n const m = surface(radial)\n const levels = new Set(\n Array.from({ length: steps + 1 }, (_, i) => (d.length * i) / steps),\n )\n levels.add(props.chamfer)\n levels.add(d.length - props.chamfer)\n const radius = d.diameter / 2,\n depth = (d.diameter - d.minorDiameter) / 2\n let previous = -1\n for (const z of [...levels].sort((a, b) => a - b)) {\n const current = m.ring(z, (angle) => {\n const groove = Math.min(\n depth,\n Math.max(\n 0,\n (threadDistance(z, angle, d.threadPitch, props.leftHand ? -1 : 1) -\n 1 / 16) *\n d.threadPitch *\n Math.sqrt(3),\n ),\n )\n const chamfer =\n radius - Math.max(0, props.chamfer - Math.min(z, d.length - z))\n return Math.min(radius - groove, chamfer)\n })\n if (previous < 0) m.cap(current, z, false)\n else m.connect(previous, current)\n previous = current\n }\n m.cap(previous, d.length, true)\n return { positions: m.positions, indices: m.indices }\n}\n","import { torsionSpringModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { TorsionSpring } from \"./TorsionSpring\"\nexport const model = defineModelRenderer({\n name: \"torsionspring\",\n schema: torsionSpringModelDefinitionSchema,\n render: ({ fn, ...props }) => <TorsionSpring {...props} />,\n pads: \"none\",\n})\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { TorsionSpringModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createTorsionSpringMesh } from \"./mesh\"\nexport type TorsionSpringProps = TorsionSpringModelPropsInput & {\n color?: string\n}\nexport function createTorsionSpringGeom(input: TorsionSpringModelPropsInput) {\n return indexedMeshToGeom3(createTorsionSpringMesh(input))\n}\nexport function TorsionSpring({\n color = \"#929ba6\",\n ...props\n}: TorsionSpringProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createTorsionSpringGeom(props)} />\n </Colorize>\n )\n}\nexport { createTorsionSpringMesh } from \"./mesh\"\nexport type { TorsionSpringMesh, TorsionSpringMeshOptions } from \"./mesh\"\n","import {\n torsionSpringModelPropsSchema,\n getTorsionSpringDimensions,\n getTorsionSpringFrame,\n type TorsionSpringModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nexport interface TorsionSpringMesh {\n positions: number[]\n indices: number[]\n}\nexport interface TorsionSpringMeshOptions {\n segmentsPerTurn?: number\n wireSegments?: number\n}\n/** Circular normal sections along the shared helix and its tangent legs. */\nexport function createTorsionSpringMesh(\n input: TorsionSpringModelPropsInput,\n options: TorsionSpringMeshOptions = {},\n): TorsionSpringMesh {\n const p = torsionSpringModelPropsSchema.parse(input),\n d = getTorsionSpringDimensions(p)\n const segmentsPerTurn = options.segmentsPerTurn ?? 64,\n wireSegments = options.wireSegments ?? 24\n for (const [name, value, minimum, maximum] of [\n [\"segmentsPerTurn\", segmentsPerTurn, 16, 256],\n [\"wireSegments\", wireSegments, 8, 64],\n ] as const)\n if (\n !Number.isInteger(value) ||\n value < minimum ||\n value > maximum ||\n value % 4 !== 0\n )\n throw new Error(\n `${name} must be a multiple of four in [${minimum},${maximum}]`,\n )\n const steps = Math.ceil(p.turns * segmentsPerTurn)\n if ((steps + 3) * wireSegments + 2 > 250000)\n throw new Error(\"Spring exceeds mesh resolution limit (250000 vertices)\")\n const scale = Math.max(\n p.outerDiameter,\n d.axialAdvance,\n p.startLegLength,\n p.endLegLength,\n )\n if (\n Math.min(\n p.wireDiameter,\n p.startLegLength,\n p.endLegLength,\n d.insideDiameter,\n p.pitch - p.wireDiameter,\n ) <=\n scale * 1e-10\n )\n throw new Error(\"Spring clearance exceeds mesh resolution limits\")\n const distances = [\n 0,\n ...Array.from(\n { length: steps + 1 },\n (_, i) => p.startLegLength + (d.coilLength * i) / steps,\n ),\n d.centerlineLength,\n ]\n // Mirror the same triangulation for left-hand coils; changing the diagonal\n // of a nonplanar quad would otherwise change its enclosed volume.\n const frameProps = { ...p, leftHand: false }\n const positions: number[] = [],\n indices: number[] = []\n for (const distance of distances) {\n const f = getTorsionSpringFrame(frameProps, distance)\n for (let j = 0; j < wireSegments; j++) {\n const angle = (2 * Math.PI * j) / wireSegments\n const c =\n j === wireSegments / 4 || j === (3 * wireSegments) / 4\n ? 0\n : Math.cos(angle)\n const s = j === 0 || j === wireSegments / 2 ? 0 : Math.sin(angle)\n for (let axis = 0; axis < 3; axis++)\n positions.push(\n f.position[axis]! +\n (p.wireDiameter / 2) *\n (f.normal[axis]! * c + f.binormal[axis]! * s),\n )\n }\n }\n for (let i = 0; i < distances.length - 1; i++)\n for (let j = 0; j < wireSegments; j++) {\n const n = (j + 1) % wireSegments,\n a = i * wireSegments,\n b = (i + 1) * wireSegments\n indices.push(a + j, a + n, b + j, a + n, b + n, b + j)\n }\n const firstCenter = positions.length / 3\n positions.push(\n ...getTorsionSpringFrame(frameProps, 0).position,\n ...getTorsionSpringFrame(frameProps, d.centerlineLength).position,\n )\n const end = (distances.length - 1) * wireSegments\n for (let j = 0; j < wireSegments; j++) {\n const n = (j + 1) % wireSegments\n indices.push(firstCenter, n, j, firstCenter + 1, end + j, end + n)\n }\n if (p.leftHand) {\n for (let i = 1; i < positions.length; i += 3) positions[i] = -positions[i]!\n for (let i = 0; i < indices.length; i += 3)\n [indices[i + 1], indices[i + 2]] = [indices[i + 2]!, indices[i + 1]!]\n }\n return { positions, indices }\n}\n","import { tSlotExtrusionModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { TSlotExtrusion } from \"./TSlotExtrusion\"\n\nexport const model = defineModelRenderer({\n name: \"tslotextrusion\",\n schema: tSlotExtrusionModelDefinitionSchema,\n render: ({ fn, ...props }) => <TSlotExtrusion {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { TSlotExtrusionModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createTSlotExtrusionMesh } from \"./mesh\"\n\nexport type TSlotExtrusionProps = TSlotExtrusionModelPropsInput & {\n color?: string\n}\n\nexport function createTSlotExtrusionGeom(\n input: TSlotExtrusionModelPropsInput = {},\n) {\n return indexedMeshToGeom3(createTSlotExtrusionMesh(input))\n}\n\nexport function TSlotExtrusion({\n color = \"#8995a3\",\n ...props\n}: TSlotExtrusionProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createTSlotExtrusionGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createTSlotExtrusionMesh } from \"./mesh\"\nexport type { TSlotExtrusionMesh } from \"./mesh\"\n","import {\n tSlotExtrusionModelPropsSchema,\n type TSlotExtrusionModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport {\n circularProfile,\n extrudePlanarProfile,\n type ProfilePoint,\n} from \"../../mechanical/extrude-planar-profile\"\n\nexport interface TSlotExtrusionMesh {\n positions: number[]\n indices: number[]\n}\n\n/** Four straight-sided T grooves and an optional bore, all open at both ends.\n * Section centered in XY; end mounting datum Z=0, length extends along +Z.\n */\nexport function createTSlotExtrusionMesh(\n input: TSlotExtrusionModelPropsInput = {},\n): TSlotExtrusionMesh {\n const props = tSlotExtrusionModelPropsSchema.parse(input)\n const { width, height, length, cornerRadius, lipThickness, pocketDepth } =\n props\n const slot = props.slotWidth / 2\n const pocket = props.pocketWidth / 2\n const depth = lipThickness + pocketDepth\n const outer: ProfilePoint[] = []\n for (let face = 0; face < 4; face++) {\n const span = (face % 2 === 0 ? width : height) / 2\n const extent = (face % 2 === 0 ? height : width) / 2\n const local: ProfilePoint[] = [\n [-span + cornerRadius, -extent],\n [-slot, -extent],\n [-slot, -extent + lipThickness],\n [-pocket, -extent + lipThickness],\n [-pocket, -extent + depth],\n [pocket, -extent + depth],\n [pocket, -extent + lipThickness],\n [slot, -extent + lipThickness],\n [slot, -extent],\n [span - cornerRadius, -extent],\n ]\n if (cornerRadius > 0)\n for (let step = 1; step < 24; step++) {\n const angle = -Math.PI / 2 + (step * Math.PI) / 48\n local.push([\n span - cornerRadius + cornerRadius * Math.cos(angle),\n -extent + cornerRadius + cornerRadius * Math.sin(angle),\n ])\n }\n for (const [u, v] of local)\n outer.push(\n face === 0\n ? [u, v]\n : face === 1\n ? [-v, u]\n : face === 2\n ? [-u, -v]\n : [v, -u],\n )\n }\n return extrudePlanarProfile({\n outer,\n holes:\n props.boreDiameter > 0\n ? [circularProfile(0, 0, props.boreDiameter / 2)]\n : [],\n start: 0,\n end: length,\n })\n}\n","import { tSlotGussetModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { TSlotGusset } from \"./TSlotGusset\"\n\nexport const model = defineModelRenderer({\n name: \"tslotgusset\",\n schema: tSlotGussetModelDefinitionSchema,\n render: ({ fn, ...props }) => <TSlotGusset {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { TSlotGussetModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createTSlotGussetMesh } from \"./mesh\"\n\nexport type TSlotGussetProps = TSlotGussetModelPropsInput & { color?: string }\n\nexport function createTSlotGussetGeom(input: TSlotGussetModelPropsInput = {}) {\n return indexedMeshToGeom3(createTSlotGussetMesh(input))\n}\n\nexport function TSlotGusset({ color = \"#8995a3\", ...props }: TSlotGussetProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createTSlotGussetGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createTSlotGussetMesh } from \"./mesh\"\nexport type { TSlotGussetMesh } from \"./mesh\"\n","import {\n getTSlotGussetMountingSlots,\n tSlotGussetModelPropsSchema,\n type TSlotGussetModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport {\n extrudePlanarProfile,\n circularProfile,\n type ProfilePoint,\n} from \"../../mechanical/extrude-planar-profile\"\n\nexport interface TSlotGussetMesh {\n positions: number[]\n indices: number[]\n}\n\n/** Right triangular flat plate at Z=0..thickness, with both complete through\n * capsules at the mounting centers/orientations resolved by modelprinter.\n */\nexport function createTSlotGussetMesh(\n input: TSlotGussetModelPropsInput = {},\n): TSlotGussetMesh {\n const props = tSlotGussetModelPropsSchema.parse(input)\n const holes = getTSlotGussetMountingSlots(props).map((slot) => {\n const radius = slot.width / 2\n const halfStraight = (slot.length - slot.width) / 2\n const rotate = (u: number, v: number): ProfilePoint =>\n slot.orientation === 0\n ? [slot.center.x + u, slot.center.y + v]\n : [slot.center.x - v, slot.center.y + u]\n if (halfStraight === 0)\n return circularProfile(0, 0, radius).map(([u, v]) => rotate(u, v))\n const loop: ProfilePoint[] = []\n for (const side of [1, -1])\n for (let step = 0; step <= 48; step++) {\n const angle =\n -Math.PI / 2 + (step * Math.PI) / 48 + (side < 0 ? Math.PI : 0)\n loop.push(\n rotate(\n side * halfStraight + radius * Math.cos(angle),\n radius * Math.sin(angle),\n ),\n )\n }\n return loop\n })\n return extrudePlanarProfile({\n outer: [\n [0, 0],\n [props.width, 0],\n [0, props.height],\n ],\n holes,\n start: 0,\n end: props.thickness,\n })\n}\n","import { tSlotInsideCornerModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { TSlotInsideCorner } from \"./TSlotInsideCorner\"\n\nexport const model = defineModelRenderer({\n name: \"tslotinsidecorner\",\n schema: tSlotInsideCornerModelDefinitionSchema,\n render: ({ fn, ...props }) => <TSlotInsideCorner {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { TSlotInsideCornerModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createTSlotInsideCornerMesh } from \"./mesh\"\n\nexport type TSlotInsideCornerProps = TSlotInsideCornerModelPropsInput & {\n color?: string\n}\n\nexport function createTSlotInsideCornerGeom(\n input: TSlotInsideCornerModelPropsInput = {},\n) {\n return indexedMeshToGeom3(createTSlotInsideCornerMesh(input))\n}\n\nexport function TSlotInsideCorner({\n color = \"#8995a3\",\n ...props\n}: TSlotInsideCornerProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createTSlotInsideCornerGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createTSlotInsideCornerMesh } from \"./mesh\"\nexport type { TSlotInsideCornerMesh } from \"./mesh\"\n","import {\n tSlotInsideCornerModelPropsSchema,\n type TSlotInsideCornerModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport {\n circularProfile,\n extrudePlanarProfile,\n joinProfileMeshes,\n type ProfilePoint,\n} from \"../../mechanical/extrude-planar-profile\"\n\nexport interface TSlotInsideCornerMesh {\n positions: number[]\n indices: number[]\n}\n\n/** Constant-thickness quarter bend joining two perpendicular drilled legs.\n * Virtual inside corner is X=Z=0; width is centered on Y. No internal seam caps.\n */\nexport function createTSlotInsideCornerMesh(\n input: TSlotInsideCornerModelPropsInput = {},\n): TSlotInsideCornerMesh {\n const props = tSlotInsideCornerModelPropsSchema.parse(input)\n const { width, legLength, thickness, bendRadius, holeOffset, holeDiameter } =\n props\n const r = bendRadius\n const outerRadius = r + thickness\n const panel: ProfilePoint[] = [\n [r, -width / 2],\n [legLength, -width / 2],\n [legLength, width / 2],\n [r, width / 2],\n ]\n const holes = [circularProfile(holeOffset, 0, holeDiameter / 2)]\n const bend: ProfilePoint[] = []\n if (r === 0) bend.push([0, 0])\n else\n for (let step = 0; step <= 48; step++) {\n const angle = -Math.PI / 2 - (step * Math.PI) / 96\n bend.push(\n step === 0\n ? [r, 0]\n : step === 48\n ? [0, r]\n : [r + r * Math.cos(angle), r + r * Math.sin(angle)],\n )\n }\n for (let step = 0; step <= 48; step++) {\n const angle = -Math.PI + (step * Math.PI) / 96\n bend.push(\n step === 0\n ? [-thickness, r]\n : step === 48\n ? [r, -thickness]\n : [\n r + outerRadius * Math.cos(angle),\n r + outerRadius * Math.sin(angle),\n ],\n )\n }\n return joinProfileMeshes([\n extrudePlanarProfile({\n outer: panel,\n holes,\n start: -thickness,\n end: 0,\n skipWall: (a, b) => a[0] === r && b[0] === r,\n }),\n extrudePlanarProfile({\n outer: panel,\n holes,\n start: -thickness,\n end: 0,\n project: (u, v, depth) => [depth, v, u],\n reverse: true,\n skipWall: (a, b) => a[0] === r && b[0] === r,\n }),\n extrudePlanarProfile({\n outer: bend,\n start: -width / 2,\n end: width / 2,\n project: (u, v, depth) => [u, depth, v],\n reverse: true,\n skipWall: (a, b) =>\n (a[0] === r && b[0] === r) || (a[1] === r && b[1] === r),\n }),\n ])\n}\n","import { wormGearModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { WormGear } from \"../../WormGear\"\n\nexport const model = defineModelRenderer({\n name: \"wormgear\",\n schema: wormGearModelDefinitionSchema,\n render: ({ fn, ...props }) => <WormGear {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { WormGearModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createWormGearMesh } from \"./mechanical/worm-gear-mesh\"\nimport { indexedMeshToGeom3 } from \"./mechanical/indexedMeshToGeom3\"\n\nexport type WormGearProps = WormGearModelPropsInput & {\n color?: string\n}\n\n/** Square-cut worm along +Z, from Z=0 to length. Threads are approximate. */\nexport function createWormGearGeom(input: WormGearModelPropsInput) {\n return indexedMeshToGeom3(createWormGearMesh(input))\n}\n\nexport function WormGear({ color = \"#737e8f\", ...props }: WormGearProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createWormGearGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createWormGearMesh } from \"./mechanical/worm-gear-mesh\"\nexport type { WormGearMesh } from \"./mechanical/worm-gear-mesh\"\n","import {\n getWormGearDimensions,\n wormGearModelPropsSchema,\n type WormGearModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport earcut from \"earcut\"\n\n/** Indexed triangles, counterclockwise from outside; millimeters, Z up. */\nexport interface WormGearMesh {\n positions: number[]\n indices: number[]\n}\n\n/**\n * A cylindrical worm from Z=0 to Z=length, with square-cut ends.\n * The axial trapezoidal rack profile is swept around +Z. A right-hand crest\n * winds counterclockwise as Z increases; phase rotates the entire solid.\n * This is a faceted visual worm, not a hobbed wheel or a conjugate gear pair.\n */\nexport const createWormGearMesh = (\n input: WormGearModelPropsInput,\n): WormGearMesh => {\n const props = wormGearModelPropsSchema.parse(input)\n const { outsideDiameter, rootDiameter, axialPitch, lead, toothThickness } =\n getWormGearDimensions(props)\n const outsideRadius = outsideDiameter / 2\n const rootRadius = rootDiameter / 2\n const pitchRadius = props.pitchDiameter / 2\n const pressureTangent = Math.tan((props.pressureAngle * Math.PI) / 180)\n const tipHalfWidth = toothThickness / 2 - props.module * pressureTangent\n const rootHalfWidth =\n toothThickness / 2 + (props.module + props.clearance) * pressureTangent\n\n // Each pitch has exact crest, pitch-cylinder and root samples.\n // Rotating this same profile at every level preserves narrow crests and\n // troughs even for multiple starts, instead of aliasing a fixed angle grid.\n // Root facets must stay outside a stationary bore, including between Z\n // levels. A triangle's angular span is at most its ring gap plus helix twist,\n // so bound both by acos(bore/root), with margin for numerical roundoff.\n const boreRadius = props.boreDiameter / 2\n const angularStepLimit =\n boreRadius > 0 ? Math.acos(boreRadius / rootRadius) * 0.8 : Infinity\n const samplesPerPitch = Math.max(\n Math.ceil(props.radialSegments / props.starts),\n Math.ceil((Math.PI * 2) / (props.starts * angularStepLimit)),\n )\n // segmentsPerTurn controls a revolution of the helix (one lead). Also keep\n // at least twelve axial levels per pitch when several starts share a lead.\n const stepsPerTurn = Math.max(\n props.segmentsPerTurn,\n props.radialSegments,\n props.starts * 12,\n Math.ceil((Math.PI * 2) / angularStepLimit),\n )\n const steps = Math.max(1, Math.ceil((props.length / lead) * stepsPerTurn))\n const extraVertices = boreRadius > 0 ? props.radialSegments * 2 : 2\n // Check before allocating any user-sized array, including dense angular\n // samples required by an almost-root-diameter bore.\n if (\n !Number.isFinite(samplesPerPitch) ||\n !Number.isFinite(steps) ||\n (steps + 1) * (samplesPerPitch + 6) * props.starts + extraVertices >\n 1_000_000\n ) {\n throw new Error(\n \"Worm gear exceeds mesh resolution limit (1000000 vertices); reduce length or resolution, or increase module or bore wall thickness\",\n )\n }\n const corners = [\n 0,\n tipHalfWidth / axialPitch,\n toothThickness / (2 * axialPitch),\n rootHalfWidth / axialPitch,\n 1 - rootHalfWidth / axialPitch,\n 1 - toothThickness / (2 * axialPitch),\n 1 - tipHalfWidth / axialPitch,\n 1,\n ]\n const fractions: number[] = []\n for (let index = 0; index < corners.length - 1; index++) {\n const from = corners[index]!\n const width = corners[index + 1]! - from\n const subdivisions = Math.max(1, Math.ceil(width * samplesPerPitch))\n for (let subdivision = 0; subdivision < subdivisions; subdivision++) {\n const fraction = from + (width * subdivision) / subdivisions\n if (\n fractions.length === 0 ||\n fraction - fractions[fractions.length - 1]! > 1e-12\n )\n fractions.push(fraction)\n }\n }\n const profile: { angle: number; radius: number }[] = []\n for (let start = 0; start < props.starts; start++) {\n for (const fraction of fractions) {\n const distance = Math.min(fraction, 1 - fraction) * axialPitch\n profile.push({\n angle: ((start + fraction) * Math.PI * 2) / props.starts,\n radius:\n distance <= tipHalfWidth\n ? outsideRadius\n : distance >= rootHalfWidth\n ? rootRadius\n : pitchRadius + (toothThickness / 2 - distance) / pressureTangent,\n })\n }\n }\n\n const count = profile.length\n\n const positions: number[] = []\n const indices: number[] = []\n const phase = ((props.phase % 360) * Math.PI) / 180\n const direction = props.handedness === \"right\" ? 1 : -1\n const ring = (z: number) => {\n const first = positions.length / 3\n const rotation = phase + direction * (z / lead) * Math.PI * 2\n for (const sample of profile) {\n const angle = sample.angle + rotation\n positions.push(\n sample.radius * Math.cos(angle),\n sample.radius * Math.sin(angle),\n z,\n )\n }\n return first\n }\n const connect = (lower: number, upper: number) => {\n for (let index = 0; index < count; index++) {\n const next = (index + 1) % count\n indices.push(\n lower + index,\n lower + next,\n upper + next,\n lower + index,\n upper + next,\n upper + index,\n )\n }\n }\n const bottom = ring(0)\n let previous = bottom\n for (let step = 1; step <= steps; step++) {\n const current = ring(props.length * (step / steps))\n connect(previous, current)\n previous = current\n }\n const top = previous\n\n if (props.boreDiameter === 0) {\n const cap = (boundary: number, z: number, upward: boolean) => {\n const center = positions.length / 3\n positions.push(0, 0, z)\n for (let index = 0; index < count; index++) {\n const next = (index + 1) % count\n indices.push(\n center,\n boundary + (upward ? index : next),\n boundary + (upward ? next : index),\n )\n }\n }\n cap(bottom, 0, false)\n cap(top, props.length, true)\n } else {\n // The bore has stationary circular rings. Keeping it independent of the\n // rotating tooth rings avoids twisting or narrowing the cylindrical bore.\n const holeCount = props.radialSegments\n const boreRing = (z: number) => {\n const first = positions.length / 3\n for (let index = 0; index < holeCount; index++) {\n const angle = phase + (index * Math.PI * 2) / holeCount\n positions.push(\n boreRadius * Math.cos(angle),\n boreRadius * Math.sin(angle),\n z,\n )\n }\n return first\n }\n const holeBottom = boreRing(0)\n const holeTop = boreRing(props.length)\n for (let index = 0; index < holeCount; index++) {\n const next = (index + 1) % holeCount\n indices.push(\n holeBottom + index,\n holeTop + next,\n holeBottom + next,\n holeBottom + index,\n holeTop + index,\n holeTop + next,\n )\n }\n const cap = (boundary: number, hole: number, upward: boolean) => {\n const vertices = Array.from(\n { length: count },\n (_, index) => boundary + index,\n )\n vertices.push(\n ...Array.from({ length: holeCount }, (_, index) => hole + index),\n )\n const flat = vertices.flatMap((vertex) => [\n positions[vertex * 3]!,\n positions[vertex * 3 + 1]!,\n ])\n const triangles = earcut(flat, [count], 2)\n for (let index = 0; index < triangles.length; index += 3) {\n const a = vertices[triangles[index]!]!\n const b = vertices[triangles[index + 1]!]!\n const c = vertices[triangles[index + 2]!]!\n const signedArea =\n (positions[b * 3]! - positions[a * 3]!) *\n (positions[c * 3 + 1]! - positions[a * 3 + 1]!) -\n (positions[b * 3 + 1]! - positions[a * 3 + 1]!) *\n (positions[c * 3]! - positions[a * 3]!)\n indices.push(\n a,\n signedArea > 0 === upward ? b : c,\n signedArea > 0 === upward ? c : b,\n )\n }\n }\n cap(bottom, holeBottom, false)\n cap(top, holeTop, true)\n }\n\n return { positions, indices }\n}\n","// Generated by scripts/generate-model-renderers.mjs. Do not edit.\nimport type { ModelRendererRegistry } from \"../model-registry\"\nimport { model as model0 } from \"../models/ballbearing/register\"\nimport { register as register0 } from \"../models/ballbearing/register\"\nimport { model as model1 } from \"../models/balltransferunit/register\"\nimport { register as register1 } from \"../models/balltransferunit/register\"\nimport { model as model2 } from \"../models/buttonscrew/register\"\nimport { register as register2 } from \"../models/buttonscrew/register\"\nimport { model as model3 } from \"../models/cablegrommet/register\"\nimport { register as register3 } from \"../models/cablegrommet/register\"\nimport { model as model4 } from \"../models/clampingshaftcollar/register\"\nimport { register as register4 } from \"../models/clampingshaftcollar/register\"\nimport { model as model5 } from \"../models/compressionspring/register\"\nimport { register as register5 } from \"../models/compressionspring/register\"\nimport { model as model6 } from \"../models/flangedbushing/register\"\nimport { register as register6 } from \"../models/flangedbushing/register\"\nimport { model as model7 } from \"../models/flatheadscrew/register\"\nimport { register as register7 } from \"../models/flatheadscrew/register\"\nimport { model as model8 } from \"../models/flexscreen/register\"\nimport { register as register8 } from \"../models/flexscreen/register\"\nimport { model as model9 } from \"../models/helicalgear/register\"\nimport { register as register9 } from \"../models/helicalgear/register\"\nimport { model as model10 } from \"../models/hexbolt/register\"\nimport { register as register10 } from \"../models/hexbolt/register\"\nimport { model as model11 } from \"../models/hexnut/register\"\nimport { register as register11 } from \"../models/hexnut/register\"\nimport { model as model12 } from \"../models/hexsocketbolt/register\"\nimport { register as register12 } from \"../models/hexsocketbolt/register\"\nimport { model as model13 } from \"../models/hollowpositioningarmtube/register\"\nimport { register as register13 } from \"../models/hollowpositioningarmtube/register\"\nimport { model as model14 } from \"../models/nema/register\"\nimport { register as register14 } from \"../models/nema/register\"\nimport { model as model15 } from \"../models/panscrew/register\"\nimport { register as register15 } from \"../models/panscrew/register\"\nimport { model as model16 } from \"../models/plainbushing/register\"\nimport { register as register16 } from \"../models/plainbushing/register\"\nimport { model as model17 } from \"../models/rigidcoupler/register\"\nimport { register as register17 } from \"../models/rigidcoupler/register\"\nimport { model as model18 } from \"../models/shaftcollar/register\"\nimport { register as register18 } from \"../models/shaftcollar/register\"\nimport { model as model19 } from \"../models/sheetmetal/register\"\nimport { register as register19 } from \"../models/sheetmetal/register\"\nimport { model as model20 } from \"../models/spurgear/register\"\nimport { register as register20 } from \"../models/spurgear/register\"\nimport { model as model21 } from \"../models/threadedrod/register\"\nimport { register as register21 } from \"../models/threadedrod/register\"\nimport { model as model22 } from \"../models/torsionspring/register\"\nimport { register as register22 } from \"../models/torsionspring/register\"\nimport { model as model23 } from \"../models/tslotextrusion/register\"\nimport { register as register23 } from \"../models/tslotextrusion/register\"\nimport { model as model24 } from \"../models/tslotgusset/register\"\nimport { register as register24 } from \"../models/tslotgusset/register\"\nimport { model as model25 } from \"../models/tslotinsidecorner/register\"\nimport { register as register25 } from \"../models/tslotinsidecorner/register\"\nimport { model as model26 } from \"../models/wormgear/register\"\nimport { register as register26 } from \"../models/wormgear/register\"\n\nexport const builtinModelRenderers = [\n model0,\n model1,\n model2,\n model3,\n model4,\n model5,\n model6,\n model7,\n model8,\n model9,\n model10,\n model11,\n model12,\n model13,\n model14,\n model15,\n model16,\n model17,\n model18,\n model19,\n model20,\n model21,\n model22,\n model23,\n model24,\n model25,\n model26,\n] as const\n\nexport function registerAllModelRenderers(registry: ModelRendererRegistry): void {\n register0(registry)\n register1(registry)\n register2(registry)\n register3(registry)\n register4(registry)\n register5(registry)\n register6(registry)\n register7(registry)\n register8(registry)\n register9(registry)\n register10(registry)\n register11(registry)\n register12(registry)\n register13(registry)\n register14(registry)\n register15(registry)\n register16(registry)\n register17(registry)\n register18(registry)\n register19(registry)\n register20(registry)\n register21(registry)\n register22(registry)\n register23(registry)\n register24(registry)\n register25(registry)\n register26(registry)\n}\n","import { registerAllModelRenderers } from \"./generated/model-renderers\"\nimport { ModelRendererRegistry } from \"./model-registry\"\n\nexport const modelRendererRegistry = new ModelRendererRegistry()\nregisterAllModelRenderers(modelRendererRegistry)\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n Hull,\n Subtract,\n Translate,\n Union,\n} from \"jscad-fiber\"\n\n/** Physical package dimensions in mm, independent of copper land dimensions.\n * X crosses the two lead rows; Y runs along each row. Z=0 is the seating plane.\n * Pin 1 is at negative X, positive Y. Bend curvature and the pin-1 dimple are\n * visual approximations, not additional package-identification parameters.\n */\nexport interface DualRowGullWingDimensions {\n pinCount: number\n pitch: number\n bodyWidth: number\n bodyLength: number\n /** Overall height A, including standoff A1. */\n bodyHeight: number\n standoff: number\n /** Outer lead-tip to outer lead-tip dimension E. */\n leadSpan: number\n leadWidth: number\n leadThickness: number\n /** Horizontal terminal contact, not the PCB land length. */\n contactLength: number\n /** Per-side inset of the top and bottom mold faces. */\n taperInset: number\n /** Both zero means no exposed pad; otherwise both must be positive. */\n exposedPadWidth?: number\n exposedPadLength?: number\n}\n\nexport function createDualRowGullWing(p: DualRowGullWingDimensions) {\n const {\n pinCount,\n pitch,\n bodyWidth,\n bodyLength,\n bodyHeight,\n standoff,\n leadSpan,\n leadWidth,\n leadThickness,\n contactLength,\n taperInset,\n exposedPadWidth = 0,\n exposedPadLength = 0,\n } = p\n for (const key of [\n \"pitch\",\n \"bodyWidth\",\n \"bodyLength\",\n \"bodyHeight\",\n \"leadSpan\",\n \"leadWidth\",\n \"leadThickness\",\n \"contactLength\",\n ] as const)\n if (!Number.isFinite(p[key]) || p[key] <= 0)\n throw new Error(`${key} must be finite and positive`)\n for (const [name, value] of Object.entries({\n standoff,\n taperInset,\n exposedPadWidth,\n exposedPadLength,\n }))\n if (!Number.isFinite(value) || value < 0)\n throw new Error(`${name} must be finite and nonnegative`)\n if (!Number.isInteger(pinCount) || pinCount < 4 || pinCount % 2)\n throw new Error(\"pinCount must be even and at least 4\")\n const moldHeight = bodyHeight - standoff\n const reach = (leadSpan - bodyWidth) / 2\n const rowLength = (pinCount / 2 - 1) * pitch + leadWidth\n if (\n moldHeight <= leadThickness * 2 ||\n leadWidth >= pitch ||\n rowLength >= bodyLength - 2 * taperInset ||\n taperInset * 2 >= Math.min(bodyWidth, bodyLength) ||\n contactLength >= reach\n )\n throw new Error(\"Invalid mold, lead spacing, or terminal reach\")\n if (\n (exposedPadWidth === 0) !== (exposedPadLength === 0) ||\n exposedPadWidth >= bodyWidth - 2 * taperInset ||\n exposedPadLength >= bodyLength - 2 * taperInset\n )\n throw new Error(\"Exposed pad must fit inside the bottom mold face\")\n const midZ = standoff + moldHeight / 2\n const slice = Math.min(0.002, moldHeight / 100)\n const body = (\n <Hull>\n <Translate z={standoff + slice / 2}>\n <Cuboid\n size={[\n bodyWidth - 2 * taperInset,\n bodyLength - 2 * taperInset,\n slice,\n ]}\n />\n </Translate>\n <Translate z={midZ}>\n <Cuboid size={[bodyWidth, bodyLength, slice]} />\n </Translate>\n <Translate z={bodyHeight - slice / 2}>\n <Cuboid\n size={[\n bodyWidth - 2 * taperInset,\n bodyLength - 2 * taperInset,\n slice,\n ]}\n />\n </Translate>\n </Hull>\n )\n const dimpleRadius = Math.min(bodyWidth, bodyLength) * 0.045\n const dimpleDepth = Math.min(0.04, moldHeight / 10)\n // Smoothstep centerline, made from overlapping convex slices: positive-volume\n // solids in both React and vanilla renderers. Each root extends into the mold.\n const lead = (side: number, y: number) => {\n const outer = leadSpan / 2\n const root = bodyWidth / 2 - Math.min(bodyWidth / 8, 0.15)\n const bendStart = outer - contactLength\n const bendEnd = bodyWidth / 2 + Math.min(0.08, (reach - contactLength) / 4)\n const points: [number, number][] = [\n [outer - slice / 2, leadThickness / 2],\n [bendStart, leadThickness / 2],\n ]\n for (let i = 1; i <= 12; i++) {\n const t = i / 12\n points.push([\n bendStart + (bendEnd - bendStart) * t,\n leadThickness / 2 + (midZ - leadThickness / 2) * t * t * (3 - 2 * t),\n ])\n }\n points.push([root, midZ])\n const section = ([x, z]: [number, number]) => (\n <Translate offset={{ x: side * x, y, z }}>\n <Cuboid size={[slice, leadWidth, leadThickness]} />\n </Translate>\n )\n return (\n <Union>\n {points.slice(1).map((point, i) => (\n <Hull key={i}>\n {section(points[i]!)}\n {section(point)}\n </Hull>\n ))}\n </Union>\n )\n }\n return (\n <>\n <Colorize color=\"#353535\">\n <Subtract>\n {body}\n <Translate\n offset={{\n x: -bodyWidth / 2 + taperInset + dimpleRadius * 2,\n y: bodyLength / 2 - taperInset - dimpleRadius * 2,\n z: bodyHeight,\n }}\n >\n <Cylinder radius={dimpleRadius} height={dimpleDepth * 2} />\n </Translate>\n </Subtract>\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n {Array.from({ length: pinCount }, (_, i) =>\n lead(\n i < pinCount / 2 ? -1 : 1,\n ((pinCount / 2 - 1) / 2 - (i % (pinCount / 2))) * pitch,\n ),\n )}\n </Colorize>\n {exposedPadWidth > 0 && (\n <Colorize color=\"#bfc1c4\">\n <Translate z={(standoff + leadThickness) / 2}>\n <Cuboid\n size={[\n exposedPadWidth,\n exposedPadLength,\n standoff + leadThickness,\n ]}\n />\n </Translate>\n </Colorize>\n )}\n </>\n )\n}\n","import {\n createDualRowGullWing,\n type DualRowGullWingDimensions,\n} from \"./utils/DualRowGullWing\"\n/** Explicit SSOP physical outline (e.g. JEDEC MO-150), in mm. Copper land\n * dimensions do not identify the package. Pin 1 is at -X,+Y; Z=0 seats the feet.\n * Mold draft, bend curvature and the pin-1 dimple are visual approximations.\n */\nexport type SSOPProps = Omit<\n DualRowGullWingDimensions,\n \"exposedPadWidth\" | \"exposedPadLength\"\n>\nexport const SSOP = (props: SSOPProps) => createDualRowGullWing(props)\n","import { LGA } from \"../LGA\"\nimport { SSOP } from \"../SSOP\"\n\nexport interface BodyFootprintParameters {\n fn: string\n num_pins: number\n w: number\n h: number\n p: number\n pw: number\n pl: number\n grid?: { x: number; y: number }\n bodywidth?: number\n bodyheight?: number\n bodythickness?: number\n}\n\n/** Consume only fields validated by Footprinter. Body height is Y in its\n * schema; body thickness is Z. Terminal dimensions are still approximations\n * until physical terminal fields are added upstream. No part lookup is used.\n */\nexport function renderFootprinterBodyModel(p: BodyFootprintParameters) {\n if (\n p.bodywidth === undefined &&\n p.bodyheight === undefined &&\n p.bodythickness === undefined\n )\n return null\n if (p.fn === \"ssop\") {\n const bodyWidth = p.bodywidth ?? p.w * 0.55\n const bodyLength = p.bodyheight ?? (p.num_pins / 2 - 1) * p.p + p.pw + 0.4\n const thickness = p.bodythickness ?? 1\n const leadWidth = Math.min(p.pw, p.p * 0.5)\n const rowLength = (p.num_pins / 2 - 1) * p.p + leadWidth\n if (bodyLength <= rowLength)\n throw new Error(\"SSOP bodyheight must contain the lead row\")\n // Footprinter's SSOP row centers are w + 0.2 apart. Estimate the lead\n // tip within each copper land; this is not a physical lead-span token.\n const leadSpan = Math.max(p.w + 0.2 + p.pl / 2, bodyWidth + p.p)\n const standoff = Math.min(0.1, thickness / 10)\n return (\n <SSOP\n pinCount={p.num_pins}\n pitch={p.p}\n bodyWidth={bodyWidth}\n bodyLength={bodyLength}\n bodyHeight={thickness + standoff}\n standoff={standoff}\n leadSpan={leadSpan}\n leadWidth={leadWidth}\n leadThickness={Math.min(0.15, thickness / 4)}\n contactLength={Math.min(p.pl / 2, (leadSpan - bodyWidth) / 4)}\n taperInset={Math.min(0.12, (bodyLength - rowLength) / 4, bodyWidth / 8)}\n />\n )\n }\n if (p.fn === \"lga\") {\n const bodyWidth = p.bodywidth ?? p.w\n const bodyLength = p.bodyheight ?? p.h\n const thickness = p.bodythickness ?? 1\n const grid = p.grid!\n const landWidth = Math.min(p.pw, p.p / 2)\n const roomX = bodyWidth - ((grid.y - 1) * p.p + landWidth)\n const roomY = bodyLength - ((grid.x - 1) * p.p + landWidth)\n const landLength = Math.min(\n p.pl / 2,\n bodyWidth / 8,\n bodyLength / 8,\n roomX / 4,\n roomY / 4,\n )\n // Use short edge lands; copper land lengths do not measure metallization.\n // Keep them within the specified mold rather than treating copper as body.\n return (\n <LGA\n bodyWidth={bodyWidth}\n bodyLength={bodyLength}\n bodyHeight={thickness}\n landsPerSideX={grid.x}\n landsPerSideY={grid.y}\n pitch={p.p}\n landWidth={landWidth}\n landLength={landLength}\n edgeInset={0}\n landThickness={Math.min(0.015, thickness / 10)}\n />\n )\n }\n return null\n}\n","import { modelRendererRegistry } from \"./default-model-registry\"\nimport { renderFootprinterBodyModel } from \"./utils/FootprinterBodyModels\"\nimport { fp } from \"@tscircuit/footprinter\"\nimport { mp } from \"@tscircuit/modelprinter\"\nimport { Rotate, Translate } from \"jscad-fiber\"\nimport { Dip } from \"./DualInlinePackage\"\nimport { Tssop } from \"./Tssop\"\nimport { MSOP } from \"./MSOP\"\nimport { A0402 } from \"./A0402\"\nimport { A0603 } from \"./A0603\"\nimport { SmdLED } from \"./SmdLED\"\nimport { A0805 } from \"./A0805\"\nimport { QFP } from \"./qfp\"\nimport { PinRow } from \"./PinRow\"\nimport QFN from \"./qfn\"\nimport SOT235 from \"./SOT-235\"\nimport { SOT233P } from \"./SOT-23-3P\"\nimport { SOT23W } from \"./SOT-23W\"\nimport { A0201 } from \"./A0201\"\nimport { A01005 } from \"./A01005\"\nimport { A1206 } from \"./A1206\"\nimport { A1210 } from \"./A1210\"\nimport { A2010 } from \"./A2010\"\nimport { A2512 } from \"./A2512\"\nimport { FemaleHeaderRow } from \"./FemaleHeaderRow\"\nimport { PushButton } from \"./PushButton\"\nimport { SOIC } from \"./SOIC\"\nimport { VSSOP } from \"./VSSOP\"\nimport { SOD523 } from \"./SOD523\"\nimport { SOD882 } from \"./SOD882\"\nimport { SMA } from \"./SMA\"\nimport { SMB } from \"./SMB\"\nimport { SMC } from \"./SMC\"\nimport { SMF } from \"./SMF\"\nimport { SOD123F } from \"./sod-123F\"\nimport { SOD123FL } from \"./sod-123FL\"\nimport { SOD123W } from \"./sod-123W\"\nimport { SOD123 } from \"./sod-123\"\nimport { SOD128 } from \"./sod-128\"\nimport { SOD923 } from \"./SOD-923\"\nimport { SOT223 } from \"./SOT-223\"\nimport TQFP from \"./tqfp\"\nimport { SOT323 } from \"./SOT-323\"\nimport { LQFP } from \"./lqfp\"\nimport { SOT723 } from \"./SOT-723\"\nimport { DFN } from \"./dfn\"\nimport { HC49 } from \"./hc49\"\nimport { MicroMELF } from \"./MicroMELF\"\nimport { MINIMELF } from \"./MINIMELF\"\nimport { MELF } from \"./MELF\"\nimport { MS012 } from \"./ms012\"\nimport { MS013 } from \"./ms013\"\nimport { TO220 } from \"./TO220\"\nimport { SOT457 } from \"./SOT-457\"\nimport { SOT963 } from \"./SOT-963\"\nimport { TO92 } from \"./TO92\"\nimport SOT363 from \"./SOT-363\"\nimport { SOT886 } from \"./SOT-886\"\nimport { SOD323 } from \"./sod-323\"\nimport { SOD323F } from \"./sod-323F\"\nimport { SOD323FL } from \"./sod-323FL\"\nimport { AxialCapacitor } from \"./AxialCapacitor\"\nimport { StampBoard } from \"./stampboard\"\nimport { MountedPcbModule } from \"./MountedPcbModule\"\nimport SOD723 from \"./SOD723\"\nimport { JSTZH1_5mm } from \"./JSTZH1_5mm\"\nimport { JSTPH2_0mm } from \"./JSTPH2_0mm\"\nimport { JSTXH2_5mm } from \"./JSTXH2_5mm\"\nimport { JstSh, isJstShFootprint } from \"./JstSh\"\nimport { Crystal } from \"./Crystal\"\nimport { FPC } from \"./FPC\"\nimport { SmdPinHeader } from \"./SmdPinHeader\"\nimport { mm } from \"@tscircuit/mm\"\nimport { getPlatedHoleCenters } from \"./utils/getPlatedHoleCenters\"\nimport { getSmtPadRects } from \"./utils/getSmtPadRects\"\nimport { GullWingBody } from \"./GullWingBody\"\nimport { ParametricChip } from \"./ParametricChip\"\nimport { Led5050 } from \"./Led5050\"\nimport { Led2835 } from \"./Led2835\"\nimport { RJ45 } from \"./RJ45\"\nimport { DPAK } from \"./DPAK\"\nimport { ElectrolyticCapacitor } from \"./ElectrolyticCapacitor\"\nimport { Potentiometer } from \"./Potentiometer\"\nimport { SmdPushButton } from \"./SmdPushButton\"\nimport { SmdSlideSwitch } from \"./SmdSlideSwitch\"\nimport { SOT563 } from \"./SOT-563\"\nimport { BGA } from \"./BGA\"\nimport { UsbCMidmount } from \"./UsbCMidmount\"\nimport { SOT143 } from \"./SOT143\"\n\n/**\n * Outputs a 3d model for any [footprinter string](https://github.com/tscircuit/footprinter)\n */\n\nexport const Footprinter3d = ({ footprint }: { footprint: string }) => {\n const modelFn = mp.string(footprint.split(\"_\", 1)[0]!).params().fn\n if (mp.getModelNames().includes(modelFn)) {\n const model = mp.string(footprint).json()\n const renderer = modelRendererRegistry.get(model.fn)\n if (renderer) {\n return renderer.render(model)\n }\n }\n\n // Normalize jst formats\n let normalizedFootprint = footprint\n if (footprint.startsWith(\"jstzh1_5mm\")) {\n const pinMatch = footprint.match(/jstzh1_5mm(\\d+)?/)\n const numPins = pinMatch && pinMatch[1] ? pinMatch[1] : \"7\"\n normalizedFootprint = `zh${numPins}`\n } else if (footprint.startsWith(\"jstph2_0mm\")) {\n const pinMatch = footprint.match(/jstph2_0mm(\\d+)?/)\n const numPins = pinMatch && pinMatch[1] ? pinMatch[1] : \"2\"\n normalizedFootprint = `jst${numPins}_ph`\n } else if (footprint.startsWith(\"jstxh2_5mm\")) {\n const pinMatch = footprint.match(/jstxh2_5mm(\\d+)?/)\n const numPins = pinMatch && pinMatch[1] ? pinMatch[1] : \"2\"\n normalizedFootprint = `jst${numPins}_xh`\n }\n\n const fpJson = fp.string(normalizedFootprint).json() as unknown as {\n w: number\n p: number\n bodywidth?: number\n bodyheight?: number\n bodythickness?: number\n bh?: number\n h: number\n pl: number\n pw: number\n ph?: number\n px?: number\n py?: number\n num_pins: number\n fn: string\n zh?: boolean\n xh?: boolean\n thermalpad?: { x: number; y: number }\n imperial: String\n male: boolean\n female: boolean\n id: number //innerDiameter\n od: number //outerDiameter\n invert?: boolean\n smd?: boolean\n surface_mount?: boolean\n rightangle?: boolean\n left?: number\n right?: number\n top?: number\n bottom?: number\n innerhole?: boolean\n innerholeedgedistance?: number\n nopin?: boolean\n screen?: boolean\n screenwidth?: number\n screenheight?: number\n screencenteroffsetx?: number\n screencenteroffsety?: number\n staggered?: boolean\n reverse?: boolean\n toppl?: number\n bottompl?: number\n mpx?: number\n mpy?: number\n mounttop?: boolean\n mpw?: number\n mpl?: number\n ledpins?: boolean\n firstpinleft?: boolean\n firstpintop?: boolean\n shieldx?: number\n shieldy?: number\n shieldid?: number\n shieldod?: number\n holex?: number\n holey?: number\n holed?: number\n ledx?: number\n ledp?: number\n ledy?: number\n bodyy?: number\n // TO-252 / TO-263: the exposed tab pad, and the lead-pad-to-tab-pad span\n tabw?: number\n tabh?: number\n span?: number\n // radial / electrolytic can\n d?: number\n // potentiometer body length along Y\n ca?: number\n // no-lead packages: exposed thermal pad, and whether leads sit outside\n // the body outline (QFP) or flush under it (QFN)\n ep?: boolean | { x: number; y: number }\n epw?: number\n eph?: number\n legsoutside?: boolean\n // grid packages (bga, lga, vson): pads by row/column\n grid?: { x: number; y: number }\n // led2835's two differently-sized pads\n p1w?: number\n p2w?: number\n p1x?: number\n p2x?: number\n }\n\n const colorMatch = footprint.match(/_color\\(([^)]+)\\)/)\n const color = colorMatch ? colorMatch[1] : undefined\n\n /**\n * footprinter reports a dimension as either a number or a string with a\n * unit (`\"4.20mm\"`), and omits it entirely when the footprint does not\n * define one. `mm` is the parser footprinter itself uses, so a body agrees\n * with its pads by construction; this only adds the missing case, because\n * `mm(undefined)` throws.\n */\n const dim = (value: unknown, fallback: number): number => {\n if (value === undefined || value === null) return fallback\n const parsed = mm(value as any)\n return Number.isFinite(parsed) ? parsed : fallback\n }\n\n const bodyModel = renderFootprinterBodyModel(fpJson)\n if (bodyModel) return bodyModel\n\n switch (fpJson.fn) {\n case \"crystal\":\n return (\n <Crystal\n horizontalPadPitch={fpJson.px}\n verticalPadPitch={fpJson.py}\n padWidth={fpJson.pw}\n padHeight={fpJson.ph}\n />\n )\n case \"dip\":\n return (\n <Dip numPins={fpJson.num_pins} pitch={fpJson.p} bodyWidth={fpJson.w} />\n )\n case \"axial\":\n return <AxialCapacitor pitch={fpJson.p} />\n case \"tssop\":\n return (\n <Tssop\n pinCount={fpJson.num_pins}\n leadLength={fpJson.pl}\n leadWidth={fpJson.pw}\n pitch={fpJson.p}\n bodyWidth={fpJson.w}\n />\n )\n case \"msop\":\n return (\n <MSOP\n pinCount={fpJson.num_pins}\n padContactLength={fpJson.pl}\n leadWidth={fpJson.pw}\n pitch={fpJson.p}\n bodyWidth={fpJson.w}\n />\n )\n case \"vssop\":\n return (\n <VSSOP\n pinCount={fpJson.num_pins as 8 | 10}\n leadLength={fpJson.pl}\n leadWidth={fpJson.pw}\n pitch={fpJson.p}\n bodyWidth={fpJson.w}\n bodyLength={fpJson.h}\n />\n )\n case \"qfp\":\n return (\n <QFP\n pinCount={fpJson.num_pins}\n pitch={fpJson.p}\n leadWidth={fpJson.pw}\n padContactLength={fpJson.pl}\n bodyWidth={fpJson.w}\n />\n )\n case \"tqfp\":\n return <TQFP />\n case \"lqfp\":\n return <LQFP pinCount={fpJson.num_pins} />\n case \"qfn\": {\n const hasThermalPad =\n typeof fpJson.thermalpad?.x === \"number\" &&\n typeof fpJson.thermalpad?.y === \"number\"\n return (\n <QFN\n num_pins={fpJson.num_pins}\n bodyWidth={fpJson.w}\n bodyLength={fpJson.h}\n pitch={fpJson.p}\n padLength={fpJson.pl}\n padWidth={fpJson.pw}\n thermalPadSize={\n hasThermalPad\n ? {\n width: fpJson.thermalpad!.x,\n length: fpJson.thermalpad!.y,\n }\n : undefined\n }\n />\n )\n }\n\n case \"dfn\": {\n const hasThermalPad =\n typeof fpJson.thermalpad?.x === \"number\" &&\n typeof fpJson.thermalpad?.y === \"number\"\n return (\n <DFN\n num_pins={fpJson.num_pins}\n bodyWidth={fpJson.w}\n bodyLength={fpJson.h}\n pitch={fpJson.p}\n padLength={fpJson.pl}\n padWidth={fpJson.pw}\n thermalPadSize={\n hasThermalPad\n ? {\n width: fpJson.thermalpad!.x,\n length: fpJson.thermalpad!.y,\n }\n : undefined\n }\n />\n )\n }\n\n case \"pinrow\":\n case \"headermodule\": {\n // Parse rows parameter from footprint string (e.g., \"pinrow4_rows2\")\n const rowsMatch = footprint.match(/_rows(\\d+)/)\n const rows = rowsMatch && rowsMatch[1] ? parseInt(rowsMatch[1], 10) : 1\n\n if (fpJson.male)\n return (\n <PinRow\n numberOfPins={fpJson.num_pins}\n pitch={fpJson.p}\n invert={fpJson.invert}\n rows={rows}\n smd={fpJson.smd || fpJson.surface_mount}\n rightangle={fpJson.rightangle}\n />\n )\n if (fpJson.female)\n return (\n <FemaleHeaderRow\n numberOfPins={fpJson.num_pins}\n pitch={fpJson.p}\n rows={rows}\n />\n )\n }\n case \"smdpinheader\":\n return (\n <SmdPinHeader\n numberOfPins={fpJson.num_pins}\n pitch={fpJson.p}\n bodyWidth={fpJson.bh}\n />\n )\n case \"led5050\":\n return <Led5050 color={color} />\n\n case \"led\": {\n const imperial = String(fpJson.imperial)\n if (imperial === \"0402\" || imperial === \"0603\" || imperial === \"0805\")\n return <SmdLED footprint={imperial} color={color} />\n break\n }\n\n case \"cap\": {\n switch (fpJson.imperial) {\n case \"0402\":\n return <A0402 color=\"#856c4d\" />\n case \"0603\":\n return <A0603 color=\"#856c4d\" />\n case \"0805\":\n return <A0805 color=\"#856c4d\" />\n case \"0201\":\n return <A0201 color=\"#856c4d\" />\n case \"01005\":\n return <A01005 color=\"#856c4d\" />\n case \"1206\":\n return <A1206 color=\"#856c4d\" />\n case \"1210\":\n return <A1210 color=\"#856c4d\" />\n case \"2010\":\n return <A2010 color=\"#856c4d\" />\n case \"2512\":\n return <A2512 color=\"#856c4d\" />\n }\n // No EIA size to look up: the pads are the only description of the part,\n // so fall through to the parametric chip below. Without this `break` the\n // case ran on into `sot235` and a capacitor rendered as a transistor.\n break\n }\n case \"sot23\":\n switch (fpJson.num_pins) {\n case 3:\n return <SOT233P color={color} />\n case 5:\n return <SOT235 />\n }\n break\n case \"sot25\":\n // SOT-23-5: the same 2.9 x 1.6 body as `sot23` with five pins.\n return <SOT235 />\n case \"sot\":\n case \"sot343\": {\n // Two packages whose LEAD COUNT does not match the body they would\n // otherwise be aliased to: footprinter's bare `sot` is a six-pin SOT-23\n // (SOT235 draws five) and `sot343` is SC-70-4 (SOT363 draws six). A\n // render makes that obvious — six pads under five leads — so both build\n // their leads from the pads instead.\n //\n // The BODY, though, is the designation's, not the pads': SOT-23-6 is\n // 1.60 x 2.90 and SC-70-4 is 1.25 x 2.00, per KiCad's F.Fab outlines\n // (`SOT-23-6`, `SOT-343_SC-70-4`) — the same reference footprinter's\n // kicad-parity tests use. Deriving those from the pad span instead put\n // SC-70-4 10% under size.\n const isSc70 = fpJson.fn === \"sot343\"\n return (\n <GullWingBody\n pads={getSmtPadRects(normalizedFootprint)}\n bodyWidth={isSc70 ? 1.25 : 1.6}\n bodyLength={isSc70 ? 2.0 : 2.9}\n bodyHeight={isSc70 ? 1.1 : 1.3}\n />\n )\n }\n case \"sot563\":\n return <SOT563 />\n case \"sot89\": {\n // SOT-89 is a SOT-223 at roughly a third of the volume: three leads one\n // side, one wide tab lead the other. Aliasing it to SOT-223 outright\n // would report a 6.5 x 3.5 body where there is a 4.5 x 2.5 one.\n const padSpan = dim(fpJson.w, 4.2)\n return (\n <SOT223\n fullWidth={padSpan}\n bodyWidth={padSpan * 0.6}\n bodyLength={dim(fpJson.h, 4.8) * 0.94}\n bodyHeight={1.5}\n leadWidth={dim(fpJson.pw, 0.48)}\n tabLeadWidth={dim(fpJson.pw, 0.48) * 2}\n padPitch={dim(fpJson.p, 1.5)}\n leadHeight={0.66}\n />\n )\n }\n case \"sot457\":\n return <SOT457 />\n case \"smdslideswitch\":\n return <SmdSlideSwitch footprint={normalizedFootprint} />\n case \"usbcmidmount\":\n return <UsbCMidmount footprint={normalizedFootprint} />\n case \"sot143\":\n return <SOT143 footprint={normalizedFootprint} />\n case \"sot223\":\n return <SOT223 />\n case \"sot23w\":\n return <SOT23W />\n case \"sot323\":\n return <SOT323 />\n case \"sod323f\":\n return <SOD323F />\n case \"sod323fl\":\n return <SOD323FL />\n case \"sot363\":\n return <SOT363 />\n case \"sot886\":\n return <SOT886 />\n case \"sot963\":\n return <SOT963 />\n case \"pushbutton\":\n return (\n <PushButton\n width={fpJson.w}\n length={fpJson.h}\n innerDiameter={fpJson.id}\n />\n )\n case \"jst\":\n if (isJstShFootprint(normalizedFootprint)) {\n return <JstSh footprint={normalizedFootprint} />\n }\n if (fpJson.zh) {\n return <JSTZH1_5mm numPins={fpJson.num_pins} />\n }\n if (fpJson.ph) {\n return <JSTPH2_0mm numPins={fpJson.num_pins} />\n }\n if (fpJson.xh) {\n return <JSTXH2_5mm numPins={fpJson.num_pins} />\n }\n break\n case \"fpc\":\n return (\n <FPC\n pinCount={fpJson.num_pins}\n pitch={fpJson.p}\n padWidth={fpJson.pw}\n padLength={fpJson.pl}\n staggered={fpJson.staggered}\n reverse={fpJson.reverse}\n rowPitch={fpJson.py}\n topPadLength={fpJson.toppl}\n bottomPadLength={fpJson.bottompl}\n mountPadPitchX={fpJson.mpx}\n mountPadOffsetY={fpJson.mpy}\n mountTop={fpJson.mounttop}\n mountPadWidth={fpJson.mpw}\n mountPadLength={fpJson.mpl}\n />\n )\n case \"rj45\":\n return (\n <RJ45\n bodyWidth={fpJson.w}\n bodyDepth={fpJson.h}\n bodyCenterY={fpJson.bodyy}\n ledPins={fpJson.ledpins || fpJson.num_pins === 14}\n firstPinLeft={fpJson.firstpinleft}\n firstPinTop={fpJson.firstpintop}\n signalPitch={fpJson.p}\n signalRowPitch={fpJson.py}\n signalHoleDiameter={fpJson.id}\n shieldPinX={fpJson.shieldx}\n shieldPinY={fpJson.shieldy}\n shieldHoleDiameter={fpJson.shieldid}\n locatorHoleX={fpJson.holex}\n locatorHoleY={fpJson.holey}\n locatorHoleDiameter={fpJson.holed}\n ledPinX={fpJson.ledx}\n ledPinPitch={fpJson.ledp}\n ledPinY={fpJson.ledy}\n />\n )\n case \"soic\":\n case \"sop8\":\n case \"ssop\":\n // SOP and SSOP are SOIC with different lead spans, and SOIC is already\n // driven entirely by the footprint's own numbers.\n return (\n <SOIC\n pinCount={fpJson.num_pins}\n leadLength={fpJson.pl}\n leadWidth={fpJson.pw}\n pitch={fpJson.p}\n bodyWidth={fpJson.w}\n />\n )\n case \"son\":\n case \"wson\":\n case \"vson\": {\n // Small-outline no-lead: terminals on two opposite edges, which is a\n // DFN. `vson` is the odd one: it describes its body outline as `grid`\n // (a SIZE, e.g. grid2x3mm) while `w` is the row span. `son` and `wson`\n // give w/h directly.\n const bodyWidth =\n fpJson.fn === \"vson\" ? dim(fpJson.grid?.x, 3) : dim(fpJson.w, 3)\n const bodyLength =\n fpJson.fn === \"vson\" ? dim(fpJson.grid?.y, 3) : dim(fpJson.h, 3)\n const thermalPadWidth = dim(fpJson.epw, 0)\n const thermalPadLength = dim(fpJson.eph, 0)\n const padLength = fpJson.pl !== undefined ? dim(fpJson.pl, 0) : undefined\n const padWidth = fpJson.pw !== undefined ? dim(fpJson.pw, 0) : undefined\n\n // WHICH edges the terminals sit on is a property of the footprint, not\n // of the family: `son` and `vson` put their two rows left and right,\n // `wson` puts them top and bottom. DFN always builds left and right, so\n // a `wson` came out turned 90 degrees from its own pads, with terminals\n // along the two edges the footprint has none on. Read the axis from the\n // pads, ignoring the thermal pad, which is not a row member.\n const signalPads = getSmtPadRects(normalizedFootprint).filter(\n (pad) => Number(pad.pin ?? 0) <= fpJson.num_pins,\n )\n const distinct = (values: number[]) =>\n new Set(values.map((value) => value.toFixed(3))).size\n const rowsAlongY =\n signalPads.length > 2 &&\n distinct(signalPads.map((pad) => pad.y)) === 2 &&\n distinct(signalPads.map((pad) => pad.x)) > 2\n\n const dfn = (\n <DFN\n num_pins={fpJson.num_pins}\n // Built in DFN's own frame and then turned to match the footprint,\n // so the body's X and Y swap with it, and the thermal pad's too.\n bodyWidth={rowsAlongY ? bodyLength : bodyWidth}\n bodyLength={rowsAlongY ? bodyWidth : bodyLength}\n pitch={dim(fpJson.p, 0.5)}\n padLength={padLength}\n padWidth={padWidth}\n thermalPadSize={\n fpJson.ep && thermalPadWidth > 0 && thermalPadLength > 0\n ? {\n width: rowsAlongY ? thermalPadLength : thermalPadWidth,\n length: rowsAlongY ? thermalPadWidth : thermalPadLength,\n }\n : undefined\n }\n />\n )\n return rowsAlongY ? (\n <Rotate rotation={[0, 0, \"90deg\"]}>{dfn}</Rotate>\n ) : (\n dfn\n )\n }\n case \"mlp\":\n case \"lga\":\n case \"quad\": {\n // Quad packages whose leads sit under the body are QFNs; footprinter's\n // `legsoutside` says when they stick out, which is a QFP. `lga` has no\n // leads at all, so its flush lands render as the smallest QFN pads.\n if (fpJson.legsoutside) {\n return (\n <QFP\n pinCount={fpJson.num_pins}\n pitch={dim(fpJson.p, 0.5)}\n leadWidth={dim(fpJson.pw, 0.25)}\n padContactLength={dim(fpJson.pl, 0.25)}\n bodyWidth={dim(fpJson.w, 6)}\n />\n )\n }\n // NOT `grid`: for these it is a pad COUNT per side (lga14 is 4x3 pads),\n // not a size. Reading it as millimetres gave a 4 x 3 body for a part\n // that is 2.4 x 2.9 — wrong by 60%, and invisible in a render.\n return (\n <QFN\n num_pins={fpJson.num_pins}\n bodyWidth={dim(fpJson.w, 6)}\n bodyLength={dim(fpJson.h, 6)}\n pitch={dim(fpJson.p, 0.5)}\n padLength={dim(fpJson.pl, 0.25)}\n padWidth={dim(fpJson.pw, 0.25)}\n />\n )\n }\n case \"bga\": {\n // BGA.tsx has been in this repo, unreferenced, the whole time.\n const pitch = dim(fpJson.p, 0.8)\n const columns = fpJson.grid?.x ?? 8\n const rows = fpJson.grid?.y ?? 8\n return (\n <BGA\n ballPitch={pitch}\n ballColumns={columns}\n ballRows={rows}\n ballDiameter={pitch * 0.625}\n packageWidth={columns * pitch}\n packageLength={rows * pitch}\n />\n )\n }\n case \"sod523\":\n return <SOD523 />\n case \"sod723\":\n return <SOD723 />\n case \"sod882\":\n return <SOD882 />\n case \"sma\":\n return <SMA />\n case \"smb\":\n return <SMB />\n case \"smc\":\n return <SMC />\n case \"smf\":\n return <SMF />\n case \"sod123\":\n return <SOD123 />\n case \"sod123f\":\n return <SOD123F />\n case \"sod123fl\":\n return <SOD123FL />\n case \"sod123w\":\n return <SOD123W />\n case \"sod110\":\n // SOD-110 is NOT a SOD-123W: 2.10 x 1.40 against 2.60 x 1.70 (KiCad\n // F.Fab, D_SOD-110 and Nexperia_CFP3_SOD-123W). Same construction, so\n // the same component — at its own size.\n return <SOD123W bodyWidth={2.1} bodyLength={1.4} />\n case \"sod128\":\n return <SOD128 />\n case \"sod323\":\n return <SOD323 />\n case \"sod323w\":\n return <SOD323 />\n case \"sod80\":\n // SOD-80 is the MiniMELF glass body: 3.5 long, 1.5 across.\n return <MINIMELF />\n case \"sod882d\":\n return <SOD882 />\n case \"smbf\":\n // SMBF is SMB's flat (low-profile) variant; same outline.\n return <SMB />\n case \"led2835\":\n return (\n <Led2835\n color={color}\n bodyWidth={dim(fpJson.w, 3.5)}\n bodyLength={dim(fpJson.h, 2.8)}\n pad1X={dim(fpJson.p1x, -0.9)}\n pad1Width={dim(fpJson.p1w, 2.2)}\n pad2X={dim(fpJson.p2x, 1.375)}\n pad2Width={dim(fpJson.p2w, 1.25)}\n padLength={dim(fpJson.ph, 2.2)}\n />\n )\n case \"electrolytic\":\n case \"radial\": {\n // A radial can. The diameter is the one dimension that matters for an\n // enclosure cavity and it is not always in the json: `electrolytic`\n // reports `d`, `radial` puts it in the NAME (radial_d5_p2.5). Falling\n // back to twice the lead pitch matches both of footprinter's own\n // defaults, and the height is derived — see ElectrolyticCapacitor.\n const pitch = dim(fpJson.p, 2.5)\n const namedDiameter = footprint.match(/_d([\\d.]+)/)\n const diameter =\n fpJson.d !== undefined\n ? dim(fpJson.d, pitch * 2)\n : namedDiameter\n ? Number(namedDiameter[1])\n : pitch * 2\n return <ElectrolyticCapacitor diameter={diameter} leadPitch={pitch} />\n }\n case \"potentiometer\":\n return (\n <Potentiometer\n bodyWidth={dim(fpJson.w, 5.35)}\n bodyLength={dim(fpJson.ca, 14)}\n bodyHeight={dim(fpJson.h, 4)}\n leads={getPlatedHoleCenters(normalizedFootprint)}\n />\n )\n case \"smdpushbutton\":\n return (\n <SmdPushButton\n padSpanX={dim(fpJson.px, 4.2)}\n padSpanY={dim(fpJson.py, 2.15)}\n padWidth={dim(fpJson.pw, 1.05)}\n padLength={dim(fpJson.ph, 0.7)}\n />\n )\n case \"breakoutheaders\": {\n // A breakout board carries a through-hole header down each side; the\n // headers are the tall part, and PinRow already models one.\n const pitch = dim(fpJson.p, 2.54)\n const halfWidth = dim(fpJson.w, 10) / 2\n const sides: Array<{ x: number; pins: number; key: string }> = [\n { x: -halfWidth, pins: fpJson.left ?? 0, key: \"left\" },\n { x: halfWidth, pins: fpJson.right ?? 0, key: \"right\" },\n ]\n return (\n <>\n {sides\n .filter(({ pins }) => pins > 0)\n .map(({ x, pins, key }) => (\n <Translate center={[x, 0, 0]} key={key}>\n <Rotate rotation={[0, 0, \"90deg\"]}>\n <PinRow numberOfPins={pins} pitch={pitch} />\n </Rotate>\n </Translate>\n ))}\n </>\n )\n }\n case \"sod923\":\n return <SOD923 />\n case \"hc49\":\n return <HC49 />\n case \"micromelf\":\n return <MicroMELF />\n case \"minimelf\":\n return <MINIMELF />\n case \"melf\":\n return <MELF />\n case \"ms012\":\n return (\n <MS012\n pinCount={fpJson.num_pins}\n padContactLength={fpJson.pl}\n leadWidth={fpJson.pw}\n pitch={fpJson.p}\n />\n )\n case \"ms013\":\n return (\n <MS013\n pinCount={fpJson.num_pins}\n padContactLength={fpJson.pl}\n leadWidth={fpJson.pw}\n pitch={fpJson.p}\n />\n )\n case \"sot723\":\n return <SOT723 />\n case \"to220\":\n return <TO220 leads={getPlatedHoleCenters(normalizedFootprint)} />\n case \"to220f\":\n // TO-220F is the fully-moulded (isolated) variant: same outline, tab\n // encapsulated rather than exposed.\n return (\n <TO220 mouldedTab leads={getPlatedHoleCenters(normalizedFootprint)} />\n )\n case \"to92\":\n return <TO92 leads={getPlatedHoleCenters(normalizedFootprint)} />\n case \"to92l\":\n case \"to92s\": {\n // Both are TO-92 at a different size, and the size is the whole reason\n // they are separate footprints: `to92l` is 4.8mm across, `to92s` 2.5mm.\n // The footprint's two extents are the cylinder and the flat-cut face.\n //\n // The lead PATTERN differs too, and is not in the json: `to92s` is\n // inline where `to92` is staggered, and `to92l` puts pin 1 at the\n // origin rather than centring the group. Taking the holes themselves is\n // the only way all three line up.\n const across = dim(fpJson.w, 4.8)\n const along = dim(fpJson.h, 4.0)\n const diameter = Math.max(across, along)\n return (\n <TO92\n bodyDiameter={diameter}\n flatCut={Math.max(diameter - Math.min(across, along), 0.4)}\n leads={getPlatedHoleCenters(normalizedFootprint)}\n />\n )\n }\n case \"to252\":\n case \"dpak\":\n case \"to263\":\n case \"d2pak\": {\n // TO-252/DPAK and TO-263/D2PAK are one construction at two sizes: a\n // moulded body on a large exposed tab, leads leaving the far face. The\n // footprint is asymmetric (leads at -span/2, tab at +span/2), so the\n // body sits over the TAB, not over the origin.\n const isD2Pak = fpJson.fn === \"to263\" || fpJson.fn === \"d2pak\"\n const tabWidth = dim(fpJson.tabw, isD2Pak ? 8.38 : 6.2)\n // The tab's own size, not the tab PAD's: footprinter draws a 10.7mm pad\n // for a TO-263 whose package is 10.0 across (KiCad TO-263-2 F.Fab), and\n // a body may not inherit a land's solder allowance.\n const tabLength = Math.min(\n dim(fpJson.tabh, isD2Pak ? 10 : 5.8),\n isD2Pak ? 10 : 6.5,\n )\n return (\n <DPAK\n bodyWidth={tabWidth}\n bodyLength={dim(fpJson.w, isD2Pak ? 10.1 : 6.6)}\n bodyHeight={isD2Pak ? 4.4 : 2.3}\n tabWidth={tabWidth}\n tabLength={tabLength}\n span={dim(fpJson.span, isD2Pak ? 10.21 : 6.85)}\n pitch={dim(fpJson.p, isD2Pak ? 2.54 : 2.29)}\n leadWidth={dim(fpJson.pw, 1.5)}\n leadContactLength={dim(fpJson.pl, 3)}\n />\n )\n }\n case \"stampboard\":\n case \"stampreceiver\":\n return (\n <StampBoard\n bodyWidth={fpJson.w}\n leadsLeft={fpJson.left}\n leadsRight={fpJson.right}\n leadsTop={fpJson.top}\n leadsBottom={fpJson.bottom}\n leadsPitch={fpJson.p}\n leadWidth={fpJson.pw}\n leadLength={fpJson.pl}\n innerHoles={fpJson.innerhole}\n innerHoleEdgeDistance={fpJson.innerholeedgedistance}\n />\n )\n case \"mountedpcbmodule\": {\n const rows = (fpJson as any).rows ?? 1\n const pinRowSide = (fpJson as any).pinRowSide ?? \"left\"\n const holeInset = (fpJson as any).holeInset\n const width = (fpJson as any).width\n const height = (fpJson as any).height\n const pinRow = (fpJson as any).pinrow\n const pinRowHoleEdgeToEdgeDist = (fpJson as any).pinRowHoleEdgeToEdgeDist\n const holes = Array.isArray((fpJson as any).holes)\n ? (fpJson as any).holes\n : []\n\n return (\n <MountedPcbModule\n numPins={pinRow}\n rows={rows}\n p={fpJson.p}\n id={fpJson.id}\n od={fpJson.od}\n width={width}\n height={height}\n pinRowSide={pinRowSide}\n holes={holes}\n holeInset={holeInset}\n pinRowHoleEdgeToEdgeDist={pinRowHoleEdgeToEdgeDist}\n nopin={fpJson.nopin}\n female={fpJson.female}\n screen={fpJson.screen}\n screenWidth={fpJson.screenwidth}\n screenHeight={fpJson.screenheight}\n screenCenterOffsetX={fpJson.screencenteroffsetx}\n screenCenterOffsetY={fpJson.screencenteroffsety}\n />\n )\n }\n }\n\n switch (fpJson.imperial) {\n case \"0402\":\n return <A0402 color={color} />\n case \"0603\":\n return <A0603 color={color} />\n case \"0805\":\n return <A0805 color={color} />\n case \"0201\":\n return <A0201 color={color} />\n case \"01005\":\n return <A01005 color={color} />\n case \"1206\":\n return <A1206 color={color} />\n case \"1210\":\n return <A1210 color={color} />\n case \"2010\":\n return <A2010 color={color} />\n case \"2512\":\n return <A2512 color={color} />\n }\n\n // A chip named by its pads rather than by an EIA size: `res_p0.8656mm_...`\n // and `cap_p0.8402mm_...` carry no `imperial`, so neither switch above can\n // match, and both used to end at `return null` -- an empty model, which\n // downstream renderers drop silently, taking the component off the board.\n //\n // Restricted to the two-terminal chip functions on purpose. Plenty of other\n // footprints carry a `p`, and a pin header is not a chip.\n if (\n (fpJson.fn === \"res\" || fpJson.fn === \"cap\") &&\n fpJson.p !== undefined &&\n fpJson.ph !== undefined\n ) {\n // `mm` is the parser footprinter itself uses on these same strings, so the\n // body agrees with the pads by construction -- including the inch forms\n // (`res_p0.1in_...`), which footprinter passes through unconverted.\n const padPitch = mm(fpJson.p)\n const padHeight = mm(fpJson.ph)\n if (Number.isFinite(padPitch) && Number.isFinite(padHeight)) {\n return (\n <ParametricChip\n padPitch={padPitch}\n padHeight={padHeight}\n color={color ?? (fpJson.fn === \"cap\" ? \"#856c4d\" : undefined)}\n />\n )\n }\n }\n\n return null\n}\n","import { componentMaterials } from \"./materials\"\nimport { Polygon, ExtrudeLinear, Rotate, Translate, Union } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\nimport { range } from \"./utils/range\"\nimport { getExpandedStroke } from \"./utils/getExpandedStroke\"\n\n// DIP components look like this:\n// https://github.com/nophead/NopSCADlib/raw/master/tests/png/dip.png\n\n// M 20 105 L 20 109 L 20 102 L 26 102 L 26 109 L 24 111 L 24 118 L 22 118 L 22 111 L 20 109\n\nconst normalizeOnY = (points: { x: number; y: number }[]) => {\n const minX = Math.min(...points.map((p) => p.x))\n const maxX = Math.max(...points.map((p) => p.x))\n const minY = Math.min(...points.map((p) => p.y))\n const maxY = Math.max(...points.map((p) => p.y))\n const height = maxY - minY\n const factor = 5.47 / height\n return points.map((p) => ({\n x: (p.x - minX - (maxX - minX) / 2) * factor,\n y: (p.y - minY) * factor,\n }))\n}\n\nconst svgPathPoints = normalizeOnY([\n { x: 20, y: 105 },\n { x: 20, y: 109 },\n { x: 20, y: 102 },\n { x: 26, y: 102 },\n { x: 26, y: 109 },\n { x: 24, y: 111 },\n { x: 24, y: 118 },\n { x: 22, y: 118 },\n { x: 22, y: 111 },\n { x: 20, y: 109 },\n])\n\nconst DIP_PIN_HEIGHT = 5.47\nconst heightAboveSurface = 0.5\n\nexport const DipPinLeg = ({ x, y, z }: { x: number; y: number; z: number }) => {\n const isRotated = x > 0\n return (\n <>\n <Translate\n material={componentMaterials.tinnedLead}\n offset={{ x: x + 0.25 / 2, y, z: z }}\n >\n <Rotate rotation={[\"-90deg\", 0, \"90deg\"]}>\n <ExtrudeLinear height={0.25}>\n <Polygon\n points={svgPathPoints\n .slice()\n .reverse()\n .map((p) => [p.x, p.y])}\n />\n </ExtrudeLinear>\n </Rotate>\n </Translate>\n <Translate\n offset={{\n x: x,\n y: y + (isRotated ? 1 : -1),\n z: z,\n }}\n >\n <Rotate rotation={[\"-90deg\", \"90deg\", isRotated ? \"180deg\" : \"0deg\"]}>\n <ExtrudeLinear height={2}>\n <Polygon\n points={getExpandedStroke(\n [\n [0, 0],\n [-1, 0],\n [-1, -1],\n ],\n 0.25,\n ).map((p) => [p.x, p.y])}\n />\n </ExtrudeLinear>\n </Rotate>\n </Translate>\n </>\n )\n}\n\nexport const Dip = ({\n numPins = 8,\n pitch = 2.54,\n bodyWidth = 6.4,\n rowSpacing,\n}: {\n numPins?: number\n pitch?: number\n bodyWidth?: number\n rowSpacing?: number\n}) => {\n const numPinsOnEachSide = Math.floor(numPins / 2)\n\n const pinRowSpacing =\n rowSpacing ?? (bodyWidth >= 7 ? bodyWidth : bodyWidth + 1.22)\n\n const chipBodyWidth = bodyWidth >= 7 ? pinRowSpacing - 1.22 : bodyWidth\n\n return (\n <>\n {range(numPins).map((i) => {\n const yRow = i % numPinsOnEachSide\n const xRow = (Math.floor(i / numPinsOnEachSide) - 0.5) * 2\n\n return (\n <DipPinLeg\n key={i}\n x={(xRow * pinRowSpacing) / 2}\n y={yRow * pitch - ((numPinsOnEachSide - 1) / 2) * pitch}\n z={DIP_PIN_HEIGHT / 2 + heightAboveSurface}\n />\n )\n })}\n <ChipBody\n width={chipBodyWidth}\n length={numPinsOnEachSide * pitch + 0.5}\n height={DIP_PIN_HEIGHT - heightAboveSurface}\n heightAboveSurface={heightAboveSurface}\n center={{ x: 0, y: 0, z: heightAboveSurface }}\n />\n </>\n )\n}\n\nexport const DualInlinePackage = Dip\n","export const range = (end: number) => Array.from({ length: end }, (_, i) => i)\n","interface Point {\n x: number\n y: number\n}\n\n/**\n * Expands a stroke (line) into a polygon of a given width.\n *\n * @param {Point[]} stroke - An array of points representing the stroke to be expanded.\n * Each point is an object with 'x' and 'y' properties.\n * @param {number} width - The width of the expanded stroke.\n * @returns {Point[]} An array of points representing the polygon that surrounds the expanded stroke.\n * The points alternate between the \"left\" and \"right\" sides of the stroke.\n * @throws {Error} Throws an error if the stroke has fewer than two points.\n *\n * @example\n * const stroke = [{ x: 0, y: 0 }, { x: 1, y: 1 }, { x: 2, y: 0 }];\n * const width = 0.5;\n * const expandedStroke = getExpandedStroke(stroke, width);\n */\nexport function getExpandedStroke(\n strokeInput: (Point | [number, number] | number[])[],\n width: number,\n): Point[] {\n if (strokeInput.length < 2) {\n throw new Error(\"Stroke must have at least two points\")\n }\n const stroke: Point[] = Array.isArray(strokeInput[0])\n ? (strokeInput as any).map(([x, y]: [number, number]) => ({ x, y }))\n : strokeInput\n\n const halfWidth = width / 2\n const leftSide: Point[] = []\n const rightSide: Point[] = []\n\n function getNormal(p1: Point, p2: Point): Point {\n const dx = p2.x - p1.x\n const dy = p2.y - p1.y\n const length = Math.sqrt(dx * dx + dy * dy)\n return { x: -dy / length, y: dx / length }\n }\n\n function addPoint(point: Point, normal: Point, factor: number) {\n const newPoint = {\n x: point.x + normal.x * halfWidth * factor,\n y: point.y + normal.y * halfWidth * factor,\n }\n if (factor > 0) {\n leftSide.push(newPoint)\n } else {\n rightSide.unshift(newPoint)\n }\n }\n\n // Handle the first point\n const firstNormal = getNormal(stroke[0]!, stroke[1]!)\n addPoint(stroke[0]!, firstNormal, 1)\n addPoint(stroke[0]!, firstNormal, -1)\n\n // Handle middle points\n for (let i = 1; i < stroke.length - 1; i++) {\n const prev = stroke[i - 1]!\n const current = stroke[i]!\n const next = stroke[i + 1]!\n\n const normalPrev = getNormal(prev, current)\n const normalNext = getNormal(current, next)\n\n // Calculate miter line\n const miterX = normalPrev.x + normalNext.x\n const miterY = normalPrev.y + normalNext.y\n const miterLength = Math.sqrt(miterX * miterX + miterY * miterY)\n\n // Check if miter is too long (sharp corner)\n const miterLimit = 2 // Adjust this value to control when to bevel\n if (miterLength / 2 > miterLimit * halfWidth) {\n // Use bevel join\n addPoint(current, normalPrev, 1)\n addPoint(current, normalNext, 1)\n addPoint(current, normalPrev, -1)\n addPoint(current, normalNext, -1)\n } else {\n // Use miter join\n const scale = 1 / miterLength\n addPoint(current, { x: miterX * scale, y: miterY * scale }, 1)\n addPoint(current, { x: miterX * scale, y: miterY * scale }, -1)\n }\n }\n\n // Handle the last point\n const lastNormal = getNormal(\n stroke[stroke.length - 2]!,\n stroke[stroke.length - 1]!,\n )\n addPoint(stroke[stroke.length - 1]!, lastNormal, 1)\n addPoint(stroke[stroke.length - 1]!, lastNormal, -1)\n\n // Combine left and right sides to form a closed polygon\n return [...leftSide, ...rightSide]\n}\n","import { componentMaterials } from \"./materials\"\nimport {\n Polygon,\n ExtrudeLinear,\n Translate,\n Rotate,\n Colorize,\n} from \"jscad-fiber\"\nimport { getExpandedStroke } from \"./utils/getExpandedStroke\"\n\nexport interface SmdChipLeadProps {\n thickness: number\n width: number\n height: number\n padContactLength: number\n bodyDistance: number\n curveLength?: number\n rotation?: number\n positionAnchor?: \"outer-edge\"\n position?: { x: number; y: number; z?: number }\n}\n\nfunction calculateSCurve(\n x: number,\n {\n height,\n padContactLength,\n curveLength,\n bodyDistance,\n steepness = 10,\n }: SmdChipLeadProps & { steepness?: number },\n) {\n if (!curveLength) curveLength = bodyDistance * 0.3\n let flatFromBodySectionLength = bodyDistance - padContactLength - curveLength\n if (flatFromBodySectionLength < 0) {\n curveLength += flatFromBodySectionLength\n flatFromBodySectionLength = 0\n }\n const curveStart = padContactLength * 0.75\n const curveEnd =\n padContactLength +\n curveLength +\n (bodyDistance - padContactLength - curveLength) * 0.25\n\n if (x <= curveStart) return 0\n if (x >= curveEnd) return height\n\n const t = (x - curveStart) / (curveEnd - curveStart)\n\n // Generalized logistic function (Richards curve)\n return height / (1 + Math.exp(-steepness * (t - 0.5)))\n}\n\n/**\n * Curved lead for an SMD chip\n */\nexport const SmdChipLead = (props: SmdChipLeadProps) => {\n const { thickness, width, padContactLength, bodyDistance, height, rotation } =\n props\n\n const N = 15\n\n const points = Array.from({ length: N })\n .map((_, i) => (i / (N - 1)) * bodyDistance)\n .map((x) => [x, calculateSCurve(x, props)] as [number, number])\n // const points = [\n // [0, 0],\n // [padContactLength / 2, 0],\n // ...Array.from({ length: N })\n // .map((_, i) => padContactLength + ((i + 1) / (N + 1)) * curveLength)\n // .map((x) => [x, calculateSCurve(x, props)] as [number, number]),\n // [\n // bodyDistance - (bodyDistance - (padContactLength + curveLength)) / 2,\n // height,\n // ],\n // [bodyDistance, height],\n // ]\n\n const polygon = getExpandedStroke(points, thickness)\n return (\n <Colorize color=\"#c4c7ca\" material={componentMaterials.tinnedLead}>\n <Translate offset={{ z: 0, y: 0, x: 0, ...props.position }}>\n <Rotate rotation={[\"90deg\", 0, rotation ?? 0]}>\n <Translate offset={{ x: 0, y: 0, z: -width / 2 }}>\n <ExtrudeLinear height={width}>\n <Polygon points={polygon.map((p) => [p.x, p.y])} />\n </ExtrudeLinear>\n </Translate>\n </Rotate>\n </Translate>\n </Colorize>\n )\n}\n","import {\n createDualRowGullWing,\n type DualRowGullWingDimensions,\n} from \"./utils/DualRowGullWing\"\nimport { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\n// TODO use mm to convert width to mm (and accept strings)\nconst LegacyTssop = ({\n pinCount,\n leadLength,\n leadWidth,\n pitch,\n bodyWidth,\n}: {\n pinCount: number\n pitch: number\n leadWidth: number\n leadLength: number\n bodyWidth: number\n}) => {\n const sidePinCount = Math.ceil(pinCount / 2)\n const isSmallTssop = sidePinCount <= 4\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const bodyLength =\n pitch * Math.max(sidePinCount - 1, 0) + (isSmallTssop ? 1.5 : 1.15)\n const bodyVisualWidth = bodyWidth - (isSmallTssop ? 0.66 : 0.58)\n const leadThickness = 0.15\n const leadHeight = 0.8\n const bodyHeight = 1.22\n const bodyStandoff = 0.24\n const padContactLength = leadLength * 0.5\n const leadReach =\n padContactLength + Math.max(0.22, Math.min(0.4, leadLength * 0.65))\n const leadStartOffset = bodyWidth / 2 + leadLength / 2\n const curveLength = leadReach * 0.1\n const notchInset = Math.min(Math.min(bodyVisualWidth, bodyLength) * 0.18, 1)\n const notchRadius = Math.min(\n Math.min(bodyVisualWidth, bodyLength) * 0.12,\n 0.45,\n )\n\n return (\n <>\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`left-${i}`}\n position={{\n x: -leadStartOffset,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={leadReach}\n curveLength={curveLength}\n height={leadHeight}\n />\n ))}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: leadStartOffset,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={leadReach}\n curveLength={curveLength}\n height={leadHeight}\n />\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyVisualWidth}\n length={bodyLength}\n height={bodyHeight}\n notchPosition={{\n x: -(bodyVisualWidth / 2 - notchInset - 0.2),\n y: bodyLength / 2 - notchInset - 0.2,\n z: bodyHeight,\n }}\n notchRadius={notchRadius}\n />\n </>\n )\n}\n\n/** TSSOP physical outline. leadSpan selects explicit package dimensions;\n * existing land-derived callers retain their current geometry.\n * See examples/fixtures/tssop-variants.ts for standard outline evidence.\n */\nexport type TssopProps =\n | Parameters<typeof LegacyTssop>[0]\n | DualRowGullWingDimensions\nexport const Tssop = (props: TssopProps) =>\n \"leadSpan\" in props ? createDualRowGullWing(props) : LegacyTssop(props)\n","import {\n createDualRowGullWing,\n type DualRowGullWingDimensions,\n} from \"./utils/DualRowGullWing\"\nimport { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\n// MSOP (mini small outline package) — modeled after Tssop implementation\nconst LegacyMSOP = ({\n pinCount,\n padContactLength = 0.4,\n leadWidth = 0.2,\n pitch = 0.65,\n bodyWidth = 3.0,\n}: {\n pinCount: number\n pitch?: number\n leadWidth?: number\n padContactLength?: number\n bodyWidth?: number\n}) => {\n const sidePinCount = Math.ceil(pinCount / 2)\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const leadThickness = 0.2\n\n return (\n <>\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={i}\n position={{\n x: -bodyWidth / 2 - padContactLength - 0.3,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={padContactLength + 0.4}\n height={0.6}\n />\n ))}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={i}\n rotation={Math.PI}\n position={{\n x: bodyWidth / 2 + padContactLength + 0.3,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={padContactLength + 0.4}\n height={0.6}\n />\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: leadThickness / 2 }}\n width={bodyWidth}\n length={bodyWidth}\n height={1.1}\n notchRadius={0.35}\n heightAboveSurface={0.1}\n taperRatio={0.09}\n />\n </>\n )\n}\n\n/** MO-187 MSOP physical outline. leadSpan selects explicit package dimensions;\n * existing callers retain the legacy default outline. See fixture source notes.\n */\nexport type MSOPProps =\n | Parameters<typeof LegacyMSOP>[0]\n | DualRowGullWingDimensions\nexport const MSOP = (props: MSOPProps) =>\n \"leadSpan\" in props ? createDualRowGullWing(props) : LegacyMSOP(props)\n","import { Colorize, Cuboid, RoundedCuboid, Translate } from \"jscad-fiber\"\n\nexport type SmdLedSize = \"0402\" | \"0603\" | \"0805\"\n\n/** Flat-top, two-contact LED packages in mm. The 0603 outline follows\n * modelcdn meshes for two Kingbright parts; other sizes use catalog dimensions.\n * A footprint alone cannot specify lens shape, emitted color, or exact height.\n */\nexport const smdLedDimensions = {\n \"0402\": { length: 1, width: 0.5, height: 0.5, terminalLength: 0.2 },\n \"0603\": { length: 1.62, width: 0.8, height: 0.615, terminalLength: 0.21 },\n \"0805\": { length: 2, width: 1.25, height: 0.75, terminalLength: 0.35 },\n} as const\n\nexport function SmdLED({\n footprint,\n color = \"#ffe8a0\",\n}: {\n footprint: SmdLedSize\n color?: string\n}) {\n const p = smdLedDimensions[footprint]\n if (footprint === \"0603\")\n return (\n <>\n <Colorize color=\"#f0eee7\">\n <RoundedCuboid\n size={[1.2, 0.79, 0.6]}\n roundRadius={0.02}\n center={[0, 0, 0.31]}\n />\n </Colorize>\n <Colorize color=\"#c7c9ca\">\n {[-1, 1].map((sign) => (\n <Cuboid\n key={sign}\n size={[0.21, 0.8, 0.22]}\n center={[sign * 0.705, 0, 0.11]}\n />\n ))}\n </Colorize>\n <Colorize color={color}>\n <Cuboid size={[0.72, 0.52, 0.01]} center={[0, 0, 0.61]} />\n </Colorize>\n </>\n )\n const terminalThickness = Math.min(0.1, p.height / 4)\n const apertureHeight = 0.02\n return (\n <>\n <Colorize color=\"#f0eee7\">\n <Translate z={(p.height + terminalThickness - apertureHeight) / 2}>\n <Cuboid\n size={[\n p.length,\n p.width,\n p.height - terminalThickness - apertureHeight,\n ]}\n />\n </Translate>\n </Colorize>\n <Colorize color=\"#c7c9ca\">\n {[-1, 1].map((sign) => (\n <Translate\n key={sign}\n offset={[\n (sign * (p.length - p.terminalLength)) / 2,\n 0,\n terminalThickness / 2,\n ]}\n >\n <Cuboid size={[p.terminalLength, p.width, terminalThickness]} />\n </Translate>\n ))}\n </Colorize>\n <Colorize color={color}>\n <Translate z={p.height - apertureHeight / 2}>\n <Cuboid size={[p.length * 0.45, p.width * 0.65, apertureHeight]} />\n </Translate>\n </Colorize>\n </>\n )\n}\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const QFP = ({\n pinCount,\n pitch,\n leadWidth,\n padContactLength,\n bodyWidth,\n}: {\n pinCount: number\n pitch?: number\n leadWidth?: number\n padContactLength?: number\n bodyWidth?: number\n}) => {\n const sidePinCount = pinCount / 4\n\n // get default values if not specified\n if (!pitch) pitch = getPitch(pinCount, bodyWidth)\n if (!padContactLength) padContactLength = getPadContactLength(pinCount)\n if (!leadWidth) leadWidth = getLeadWidth(pinCount, bodyWidth)\n if (!bodyWidth) bodyWidth = pitch * (sidePinCount + 4)\n\n const footprintPadLength = padContactLength\n const bodyLength = bodyWidth\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const leadReach = footprintPadLength * 0.5\n const fullLength = bodyLength + 2 * leadReach\n const fullWidth = fullLength\n const leadHeight = 0.8\n const leadThickness = 0.15\n const bodyDistance = leadReach\n const fullPadContactLength = leadReach * 0.5\n const curveLength = leadReach * 0.18\n\n return (\n <>\n {/* Pins on the left side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`left-${i}`}\n position={{\n x: -fullWidth / 2,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={fullPadContactLength}\n bodyDistance={bodyDistance}\n curveLength={curveLength}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the right side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={fullPadContactLength}\n bodyDistance={bodyDistance}\n curveLength={curveLength}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the bottom side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`bottom-${i}`}\n rotation={Math.PI / 2}\n position={{\n x: i * pitch - pinOffsetToCenter,\n y: -fullLength / 2,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={fullPadContactLength}\n bodyDistance={bodyDistance}\n curveLength={curveLength}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the top side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`top-${i}`}\n rotation={-Math.PI / 2}\n position={{\n x: i * pitch - pinOffsetToCenter,\n y: fullLength / 2,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={fullPadContactLength}\n bodyDistance={bodyDistance}\n curveLength={curveLength}\n height={leadHeight}\n />\n ))}\n\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={1.5}\n taperRatio={0.03}\n chamferSize={0.7}\n notchPosition={{\n x: -(bodyLength / 2 - 1.5),\n y: bodyWidth / 2 - 1.5,\n z: 1.5,\n }}\n notchRadius={1.5 / 2}\n />\n </>\n )\n}\n\n// Helper functions to determine default values based on pinCount and width of QFP as footprinter repo\nconst getPitch = (pinCount: number, width?: number): number => {\n switch (pinCount) {\n case 44:\n case 64:\n return 0.8\n case 52:\n return width === 14 ? 1 : 0.65\n case 208:\n return 0.5\n default:\n return 0.5\n }\n}\n\nconst getPadContactLength = (pinCount: number): number => {\n switch (pinCount) {\n case 32:\n return 0.6\n case 40:\n return 0.6\n case 52:\n case 64:\n return 0.65\n case 208:\n return 1.65\n default:\n return 0.6\n }\n}\n\nconst getLeadWidth = (pinCount: number, width?: number): number => {\n switch (pinCount) {\n case 44:\n case 64:\n return 0.5\n case 52:\n return width === 14 ? 0.45 : 0.55\n case 208:\n return 0.3\n default:\n return 0.25\n }\n}\nexport default QFP\n","import { componentMaterials } from \"./materials\"\nimport { Colorize, Cuboid, Hull, Rotate, Translate } from \"jscad-fiber\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nconst PIN_METAL_COLOR = \"#c0c0c0\"\n\nexport const PinHeader = ({\n x,\n y,\n pinThickness,\n shortSidePinLength,\n longSidePinLength,\n bodyHeight,\n bodyLength = 2.54,\n bodyWidth = 2.54,\n flipZ,\n smd,\n rightangle,\n}: {\n x: number\n y: number\n pinThickness: number\n shortSidePinLength: number\n longSidePinLength: number\n bodyHeight: number\n bodyLength?: number\n bodyWidth?: number\n flipZ: (z: number) => number\n smd?: boolean\n rightangle?: boolean\n}) => {\n return (\n <>\n <Translate y={rightangle ? -3 : 0}>\n <Cuboid\n color=\"#222\"\n material={componentMaterials.moldedPlastic}\n size={[bodyLength, bodyWidth, bodyHeight]}\n center={[x, y, flipZ(bodyHeight / 2)]}\n />\n </Translate>\n <Colorize\n color={PIN_METAL_COLOR}\n material={componentMaterials.goldContact}\n >\n {smd ? (\n <SmdChipLead\n rotation={-Math.PI / 2}\n position={{\n x: x,\n y: y + 1,\n z: pinThickness / 2,\n }}\n thickness={pinThickness}\n width={pinThickness}\n height={pinThickness}\n padContactLength={2}\n bodyDistance={3}\n />\n ) : (\n <Hull>\n <Cuboid\n color={PIN_METAL_COLOR}\n size={[pinThickness, pinThickness, shortSidePinLength * 0.9]}\n center={[x, y, flipZ(bodyHeight * 0.9 + bodyHeight / 2)]}\n />\n <Cuboid\n color={PIN_METAL_COLOR}\n size={[\n pinThickness / 1.8,\n pinThickness / 1.8,\n shortSidePinLength,\n ]}\n center={[x, y, flipZ(bodyHeight + bodyHeight / 2)]}\n />\n </Hull>\n )}\n </Colorize>\n\n <Colorize\n color={PIN_METAL_COLOR}\n material={componentMaterials.goldContact}\n >\n <Translate y={rightangle ? -3.9 : 0} z={rightangle ? 1 : 0}>\n <Rotate rotation={rightangle ? [-Math.PI / 2, 0, 0] : [0, 0, 0]}>\n <Hull>\n <Cuboid\n color={PIN_METAL_COLOR}\n size={[pinThickness, pinThickness, longSidePinLength * 0.9]}\n center={[x, y, flipZ((-longSidePinLength / 2) * 0.9)]}\n />\n <Cuboid\n color={PIN_METAL_COLOR}\n size={[\n pinThickness / 1.8,\n pinThickness / 1.8,\n longSidePinLength,\n ]}\n center={[x, y, flipZ(-longSidePinLength / 2)]}\n />\n </Hull>\n </Rotate>\n </Translate>\n </Colorize>\n </>\n )\n}\n","import { PinHeader } from \"./PinHeader\"\n\nexport const PinRow = ({\n numberOfPins,\n pitch = 2.54,\n longSidePinLength = 6,\n invert,\n rows = 1,\n smd,\n rightangle,\n}: {\n numberOfPins: number\n pitch?: number\n longSidePinLength?: number\n invert?: boolean\n rows?: number\n smd?: boolean\n rightangle?: boolean\n}) => {\n const pinThickness = 0.63\n const bodyHeight = 2\n const pinsPerRow = Math.ceil(numberOfPins / rows)\n const rowSpacing = 2.54 // Standard spacing between rows\n const shortSidePinLength = 3\n const xoff = -((pinsPerRow - 1) / 2) * pitch\n\n // A through-hole header is mounted on TOP of the board: the plastic body\n // sits on the surface (z 0 to bodyHeight), its long pins stand above it and\n // its short pins pass down through the holes.\n //\n // The default used to be the other way up — body at z -3.6 to -1.6, i.e.\n // hanging under the board with 2mm of pin poking through, which is a\n // BOTTOM-mounted header — and `invert` produced the ordinary one. Two things\n // follow from that being backwards: every through-hole header rendered\n // upside down, and the part measured 0.9mm above the board when it is really\n // about 8.5mm, so an enclosure sized from it left no room for the header at\n // all. `invert` now means what it says: mounted on the underside.\n // Which way up a header goes, and which end of its pins passes through the\n // board, are two different questions. This flag answers the SECOND one; the\n // first is the component's `layer`, which consumers already implement (see\n // 3d-viewer's cad-model-transform: a bottom-layer part is repositioned and\n // rotated 180 degrees about X). A model that flipped itself would be flipped\n // twice on a bottom-layer component, so nothing here ever puts the body\n // below z = 0.\n //\n // default long pins up, short pins down through the board — a male\n // header mounted the ordinary way\n // invert installed backwards: long pins down THROUGH the board, short\n // pins up. Unusual, but a real option (board stacking, wire\n // wrap), and what `invert` meant when it was added in #236.\n //\n // The default used to be the backwards one, and #256 then pushed the whole\n // part 3.6mm down to compensate, which put the body under the board.\n //\n // `faceup` is gone. It was added a day after `invert`, by a different\n // author, sharing its expression, and its only distinct effect was deleting\n // the pins below the board — which on a through-hole footprint, made of\n // plated HOLES, produces a part that cannot be soldered into its own land\n // pattern. The orientation it named (\"the male pin header should face\n // upwards, out of the top layer\") is what a correctly mounted header does\n // by default. It is deprecated in footprinter (tscircuit/footprinter#813)\n // and simply ignored here, so a footprint string that still carries it\n // renders the part correctly rather than differently.\n const throughHole = !smd && !rightangle\n const flipped = throughHole ? !invert : Boolean(invert)\n const flipZ = (z: number) => (flipped ? -z + bodyHeight : z)\n\n return (\n <>\n {Array.from({ length: numberOfPins }, (_, i) => {\n const row = Math.floor(i / pinsPerRow)\n const col = i % pinsPerRow\n const x = xoff + col * pitch\n const y = ((rows - 1) / 2 - row) * rowSpacing\n\n return (\n <PinHeader\n key={i}\n x={x}\n y={y}\n pinThickness={pinThickness}\n shortSidePinLength={shortSidePinLength}\n longSidePinLength={longSidePinLength}\n bodyHeight={bodyHeight}\n flipZ={flipZ}\n smd={smd}\n rightangle={rightangle}\n />\n )\n })}\n </>\n )\n}\n","import { Colorize, Cuboid, Cylinder, Subtract, Translate } from \"jscad-fiber\"\n\n/** Physical QFN outline, in mm. Unlike the legacy land-derived API, bodyWidth\n * and bodyLength measure the mold itself. Terminal spans measure outer edges,\n * allowing both sawn and punched standard outlines. Pin 1 is at -X,+Y.\n * This variant has equally many terminals on all four sides.\n */\nexport interface PhysicalQfnDimensions {\n num_pins: number\n bodyWidth: number\n bodyLength: number\n /** Overall height A from the seating plane. */\n bodyHeight: number\n standoff: number\n terminalSpanX: number\n terminalSpanY: number\n terminalThickness: number\n padWidth: number\n padLength: number\n pitch: number\n exposedPadWidth: number\n exposedPadLength: number\n}\n\nexport function createPhysicalQfn(p: PhysicalQfnDimensions) {\n const {\n num_pins,\n bodyWidth,\n bodyLength,\n bodyHeight,\n standoff,\n terminalSpanX,\n terminalSpanY,\n terminalThickness,\n padWidth,\n padLength,\n pitch,\n exposedPadWidth,\n exposedPadLength,\n } = p\n for (const key of [\n \"bodyWidth\",\n \"bodyLength\",\n \"bodyHeight\",\n \"terminalSpanX\",\n \"terminalSpanY\",\n \"terminalThickness\",\n \"padWidth\",\n \"padLength\",\n \"pitch\",\n \"exposedPadWidth\",\n \"exposedPadLength\",\n ] as const)\n if (!Number.isFinite(p[key]) || p[key] <= 0)\n throw new Error(`${key} must be finite and positive`)\n if (!Number.isInteger(num_pins) || num_pins < 8 || num_pins % 4)\n throw new Error(\"num_pins must be divisible by four and at least eight\")\n if (!Number.isFinite(standoff) || standoff < 0)\n throw new Error(\"standoff must be finite and nonnegative\")\n const rowLength = (num_pins / 4 - 1) * pitch + padWidth\n if (\n terminalThickness <= standoff ||\n terminalThickness >= bodyHeight ||\n padWidth >= pitch ||\n rowLength >= Math.min(bodyWidth, bodyLength)\n )\n throw new Error(\"Invalid mold, terminal thickness or spacing\")\n // Avoid disconnected roots, exposed-pad shorts, and adjacent-side overlap.\n if (\n terminalSpanX < bodyWidth ||\n terminalSpanY < bodyLength ||\n terminalSpanX / 2 - padLength >= bodyWidth / 2 ||\n terminalSpanY / 2 - padLength >= bodyLength / 2 ||\n exposedPadWidth >= Math.min(bodyWidth, terminalSpanX - 2 * padLength) ||\n exposedPadLength >= Math.min(bodyLength, terminalSpanY - 2 * padLength) ||\n rowLength >= Math.min(terminalSpanX, terminalSpanY) - 2 * padLength\n )\n throw new Error(\n \"Terminals must enter the mold and clear the exposed pad and corners\",\n )\n const body = (\n <Translate z={(bodyHeight + standoff) / 2}>\n <Cuboid size={[bodyWidth, bodyLength, bodyHeight - standoff]} />\n </Translate>\n )\n const radius = Math.min(bodyWidth, bodyLength) * 0.035\n return (\n <>\n <Colorize color=\"#353535\">\n <Subtract>\n {body}\n <Translate\n offset={{\n x: -bodyWidth / 2 + radius * 2,\n y: bodyLength / 2 - radius * 2,\n z: bodyHeight,\n }}\n >\n <Cylinder\n radius={radius}\n height={Math.min(0.06, (bodyHeight - standoff) / 5)}\n />\n </Translate>\n </Subtract>\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n {Array.from({ length: num_pins }, (_, i) => {\n const side = Math.floor(i / (num_pins / 4))\n const along = ((num_pins / 4 - 1) / 2 - (i % (num_pins / 4))) * pitch\n const horizontal = side % 2 === 0\n const sign = side < 2 ? -1 : 1\n const across =\n (((horizontal ? terminalSpanX : terminalSpanY) - padLength) / 2) *\n sign\n return (\n <Translate\n key={i}\n offset={{\n x: horizontal ? across : along,\n y: horizontal ? along : across,\n z: terminalThickness / 2,\n }}\n >\n <Cuboid\n size={\n horizontal\n ? [padLength, padWidth, terminalThickness]\n : [padWidth, padLength, terminalThickness]\n }\n />\n </Translate>\n )\n })}\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n <Translate z={terminalThickness / 2}>\n <Cuboid\n size={[exposedPadWidth, exposedPadLength, terminalThickness]}\n />\n </Translate>\n </Colorize>\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport {\n createPhysicalQfn,\n type PhysicalQfnDimensions,\n} from \"./utils/PhysicalQfn\"\nimport { Cuboid, Colorize } from \"jscad-fiber\"\nimport { getQuadCoords } from \"./utils/getQuadCoords\"\nimport { getQuadPinMap } from \"./utils/getQuadPinMap\"\nconst LegacyQFN = ({\n num_pins = 16,\n bodyWidth = 9,\n bodyLength = 9,\n bodyThickness = 0.8,\n thermalPadSize,\n padWidth = 0.25,\n padLength = 0.25,\n pitch = 0.5,\n thermalPadThickness = 0.05,\n}: {\n num_pins: number\n bodyWidth?: number\n bodyLength?: number\n bodyThickness?: number\n thermalPadSize?: {\n width: number\n length: number\n }\n padWidth?: number\n padLength?: number\n pitch?: number\n thermalPadThickness?: number\n}) => {\n const pin_map = getQuadPinMap({\n num_pins,\n cw: true,\n ccw: true,\n })\n const pinPositions = []\n const spc = num_pins / 4\n for (let i = 0; i < num_pins; i++) {\n const {\n x,\n y,\n o: orientation,\n } = getQuadCoords({\n pin_count: num_pins,\n pn: i + 1,\n w: bodyWidth,\n h: bodyLength,\n p: pitch,\n pl: padLength,\n legsoutside: false,\n })\n\n let pw = padWidth\n let pl = padLength\n if (orientation === \"vert\") {\n ;[pw, pl] = [pl, pw]\n }\n\n const pn = pin_map[i + 1]!\n pinPositions.push({ pn, x, y, pw, pl })\n }\n\n return (\n <>\n <Colorize material={componentMaterials.tinnedLead} color=\"grey\">\n <Cuboid\n center={[0, 0, bodyThickness / 2]}\n size={[bodyWidth, bodyLength, bodyThickness]}\n />\n </Colorize>\n {pinPositions.map((p, i) => (\n <Cuboid\n key={i}\n center={[p.x, p.y, thermalPadThickness / 2]}\n size={[p.pw, p.pl, thermalPadThickness]}\n />\n ))}\n {thermalPadSize?.length !== undefined &&\n thermalPadSize?.width !== undefined && (\n <Cuboid\n center={[0, 0, thermalPadThickness / 2]}\n size={[\n thermalPadSize.width,\n thermalPadSize.length,\n thermalPadThickness,\n ]}\n />\n )}\n </>\n )\n}\n\n/** Supplying bodyHeight opts into physical dimensions; legacy callers are unchanged. */\nexport type QFNProps = Parameters<typeof LegacyQFN>[0] | PhysicalQfnDimensions\nexport const QFN = (props: QFNProps) =>\n \"bodyHeight\" in props ? createPhysicalQfn(props) : LegacyQFN(props)\nexport default QFN\n","export const getQuadCoords = (params: {\n pin_count: number\n pn: number // pin number\n w: number // width of the package\n h: number // height (length) of the package\n p: number // pitch between pins\n pl: number // length of the pin\n legsoutside?: boolean\n}) => {\n const SIDES_CCW = [\"left\", \"bottom\", \"right\", \"top\"] as const\n const { pin_count, pn, w, h, p, pl, legsoutside } = params\n const sidePinCount = pin_count / 4\n const side = SIDES_CCW[Math.floor((pn - 1) / sidePinCount)]\n const pos = (pn - 1) % sidePinCount\n /** inner box width */\n const ibw = p * (sidePinCount - 1)\n /** inner box height */\n const ibh = p * (sidePinCount - 1)\n\n /** pad center distance from edge (negative is inside, positive is outside) */\n const pcdfe = legsoutside ? pl / 2 : -pl / 2\n\n switch (side) {\n case \"left\":\n return { x: -w / 2 - pcdfe, y: ibh / 2 - pos * p, o: \"vert\" }\n case \"bottom\":\n return { x: -ibw / 2 + pos * p, y: -h / 2 - pcdfe, o: \"horz\" }\n case \"right\":\n return { x: w / 2 + pcdfe, y: -ibh / 2 + pos * p, o: \"vert\" }\n case \"top\":\n return { x: ibw / 2 - pos * p, y: h / 2 + pcdfe, o: \"horz\" }\n default:\n throw new Error(\"Invalid pin number\")\n }\n}\n","export type PinOrderSpecifier =\n | \"leftside\"\n | \"topside\"\n | \"rightside\"\n | \"bottomside\"\n | \"toppin\"\n | \"bottompin\"\n | \"leftpin\"\n | \"rightpin\"\nexport const getQuadPinMap = ({\n num_pins,\n cw,\n ccw,\n startingpin,\n}: {\n num_pins: number\n cw?: boolean\n ccw?: boolean\n startingpin?: PinOrderSpecifier[]\n}): number[] => {\n const pin_map: number[] = []\n const pins_per_side = num_pins / 4\n let current_position_ccw_normal = 1\n\n /** Starting Flag Pins */\n const sfp: Record<PinOrderSpecifier, boolean> = {} as any\n for (const specifier of startingpin ?? []) {\n sfp[specifier] = true\n }\n if (!sfp.leftside && !sfp.topside && !sfp.rightside && !sfp.bottomside) {\n sfp.leftside = true\n }\n if (!sfp.bottompin && !sfp.leftpin && !sfp.rightpin && !sfp.toppin) {\n if (sfp.leftside) {\n sfp.toppin = true\n } else if (sfp.topside) {\n sfp.rightpin = true\n } else if (sfp.rightside) {\n sfp.bottompin = true\n } else if (sfp.bottomside) {\n sfp.leftpin = true\n }\n }\n\n if (sfp.leftside && sfp.toppin) {\n current_position_ccw_normal = 1\n } else if (sfp.leftside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side\n } else if (sfp.bottomside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side + 1\n } else if (sfp.bottomside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 2\n } else if (sfp.rightside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side * 2 + 1\n } else if (sfp.rightside && sfp.toppin) {\n current_position_ccw_normal = pins_per_side * 3\n } else if (sfp.topside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 3 + 1\n } else if (sfp.topside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side * 4\n }\n\n pin_map.push(-1) // the first index is meaningless\n\n // Each iteration we move the current position to the next pin, if we're\n // going CCW this means incrementing, if we're going CW this means\n // decrementing\n for (let i = 0; i < num_pins; i++) {\n pin_map[current_position_ccw_normal] = i + 1\n if (ccw || !cw) {\n current_position_ccw_normal++\n if (current_position_ccw_normal > num_pins) {\n current_position_ccw_normal = 1\n }\n } else {\n current_position_ccw_normal--\n if (current_position_ccw_normal < 1) {\n current_position_ccw_normal = num_pins\n }\n }\n }\n\n return pin_map\n}\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOT235 = () => {\n const fullWidth = 2.8\n const bodyWidth = 1.6\n const bodyLength = 2.9\n const bodyHeight = 1.2\n const leadWidth = 0.4\n const leadThickness = 0.15\n const leadHeight = 0.95\n const padContactLength = 0.5\n const padPitch = 0.95\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = fullWidth - bodyWidth\n\n return (\n <>\n {/* Leads on the right side (pins 1 and 2) */}\n <SmdChipLead\n key={1}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: -1,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: 1,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the left side (pin 3) */}\n <SmdChipLead\n key={3}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: -1,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: 1,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n />\n </>\n )\n}\n\nexport default SOT235\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOT233P = ({\n fullWidth = 2.9,\n fullLength = 2.8,\n color,\n}: {\n fullWidth?: number\n fullLength?: number\n color?: string\n} = {}) => {\n const bodyWidth = 1.3\n const bodyLength = 2.9\n const bodyHeight = 1.1\n const leadWidth = 0.4\n const leadThickness = 0.15\n const leadHeight = 0.95\n const padContactLength = 0.4\n const padThickness = leadThickness / 2\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = (fullWidth - bodyWidth) / 2 + 0.3\n\n return (\n <>\n {/* Leads on the left side (pins 1 and 2) */}\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2,\n y: 0.95,\n z: padThickness,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2,\n y: -0.95,\n z: padThickness,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the right side (pin 3) */}\n <SmdChipLead\n key={3}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2,\n y: 0,\n z: padThickness,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n color={color}\n />\n </>\n )\n}\n\nexport default SOT233P\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOT23W = ({ fullWidth = 2.9, fullLength = 2.8 }) => {\n const bodyWidth = 1.92\n const bodyLength = 2.9\n const bodyHeight = 1.1\n const leadWidth = 0.4\n const leadThickness = 0.15\n const leadHeight = 0.45\n const padContactLength = 0.25\n const padThickness = leadThickness / 2\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = (fullWidth - bodyWidth) / 2 + 0.3\n\n return (\n <>\n {/* Leads on the right side (pins 1 and 2) */}\n\n <SmdChipLead\n key={1}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2,\n y: 0,\n z: padThickness,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the left side (pin 3) */}\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2,\n y: -0.95,\n z: padThickness,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n <SmdChipLead\n key={3}\n position={{\n x: -fullWidth / 2,\n y: 0.95,\n z: padThickness,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n straightHeightRatio={0.45}\n heightAboveSurface={0.05}\n />\n </>\n )\n}\n\nexport default SOT23W\n","import { Colorize, Cuboid, Hull, Subtract } from \"jscad-fiber\"\n\nexport const FemaleHeader = ({\n x,\n y,\n z = 0,\n pitch = 2.54,\n legsLength = 3,\n innerDiameter = 0.945,\n bodyHeight = 5,\n bodyLength = pitch,\n bodyWidth = pitch,\n flipZ,\n}: {\n x: number\n y: number\n z?: number\n pitch?: number\n legsLength?: number\n innerDiameter?: number\n bodyHeight?: number\n bodyLength?: number\n bodyWidth?: number\n flipZ: (z: number) => number\n}) => {\n const effectiveInnerDiameter = innerDiameter || 0.945\n const pinThickness = effectiveInnerDiameter / 1.5\n const socketWidth = effectiveInnerDiameter\n const socketEntryWidth = socketWidth * 1.8\n const socketEntryHeight = Math.min(bodyHeight * 0.18, pitch * 0.24)\n const socketDepth = bodyHeight + 0.1\n const socketCenterZ = flipZ(z + socketDepth / 2)\n const socketEntryBaseZ = z + bodyHeight - socketEntryHeight\n const gapWidth = pinThickness * 1.6\n\n return (\n <>\n <Colorize color=\"#1a1a1a\">\n <Subtract>\n <Cuboid\n color=\"#000\"\n size={[bodyLength, bodyWidth, bodyHeight]}\n center={[x, y, flipZ(z + bodyHeight / 2)]}\n />\n <Cuboid\n size={[socketWidth, socketWidth, socketDepth]}\n center={[x, y, socketCenterZ]}\n />\n <Hull>\n <Cuboid\n size={[socketWidth, socketWidth, 0.01]}\n center={[x, y, flipZ(socketEntryBaseZ)]}\n />\n <Cuboid\n size={[socketEntryWidth, socketEntryWidth, 0.01]}\n center={[x, y, flipZ(z + bodyHeight)]}\n />\n </Hull>\n </Subtract>\n </Colorize>\n <Colorize color=\"silver\">\n <Hull>\n <Cuboid\n color=\"silver\"\n size={[pinThickness, pinThickness, legsLength * 0.9]}\n center={[x, y, flipZ(z + (-legsLength / 2) * 0.9)]}\n />\n <Cuboid\n color=\"silver\"\n size={[pinThickness / 1.8, pinThickness / 1.8, legsLength]}\n center={[x, y, flipZ(z + -legsLength / 2)]}\n />\n </Hull>\n <Cuboid\n color=\"silver\"\n size={[gapWidth, gapWidth, gapWidth * 0.5]}\n center={[x, y, flipZ(z + (gapWidth / 2) * 0.5)]}\n />\n </Colorize>\n </>\n )\n}\n","import { FemaleHeader } from \"./FemaleHeader\"\n\nexport const FemaleHeaderRow = ({\n numberOfPins,\n pitch = 2.54,\n legsLength = 3,\n innerDiameter = 0.945,\n rows = 1,\n invert,\n}: {\n numberOfPins: number\n pitch?: number\n legsLength?: number\n outerDiameter?: number\n innerDiameter?: number\n rows?: number\n invert?: boolean\n}) => {\n const bodyHeight = 5\n const pinsPerRow = Math.ceil(numberOfPins / rows)\n const rowSpacing = 2.54 // Standard spacing between rows\n const xoff = -((pinsPerRow - 1) / 2) * pitch\n\n // Flip Z for inversion\n const flipZ = (z: number) => (invert ? -z + bodyHeight : z)\n\n return (\n <>\n {Array.from({ length: numberOfPins }, (_, i) => {\n const row = Math.floor(i / pinsPerRow)\n const col = i % pinsPerRow\n const x = xoff + col * pitch\n const y = ((rows - 1) / 2 - row) * rowSpacing\n\n return (\n <FemaleHeader\n key={i}\n x={x}\n y={y}\n pitch={pitch}\n legsLength={legsLength}\n innerDiameter={innerDiameter}\n flipZ={flipZ}\n />\n )\n })}\n </>\n )\n}\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n ExtrudeLinear,\n Polygon,\n Rotate,\n RoundedCuboid,\n Translate,\n} from \"jscad-fiber\"\nimport { getExpandedStroke } from \"./utils/getExpandedStroke\"\n\nexport const PushButton = ({\n width,\n length,\n innerDiameter = 1,\n}: { width: number; length: number; innerDiameter?: number }) => {\n const bodyWidth = width\n const bodyLength = length\n const bodyHeight = width * 0.7\n const legWidth = innerDiameter / 2.5\n return (\n <>\n <RoundedCuboid\n color=\"#1a1a1f\"\n center={[0, 0, bodyHeight / 2]}\n size={[bodyLength, bodyLength, bodyHeight]}\n roundRadius={0.3}\n />\n <RoundedCuboid\n color=\"#f2f2f2\"\n center={[0, 0, bodyHeight + (bodyHeight * 0.1) / 2.5]}\n size={[bodyLength, bodyLength, bodyHeight * 0.1]}\n roundRadius={0.14}\n />\n <Cylinder\n color=\"#1a1a1f\"\n height={bodyHeight * 0.8}\n radius={bodyWidth / 3}\n center={[0, 0, bodyHeight + (bodyHeight * 0.8) / 2]}\n />\n <Cylinder\n color=\"#1a1a1f\"\n height={bodyHeight * 0.2}\n radius={innerDiameter / 2}\n center={[\n bodyLength / 3,\n bodyLength / 3,\n bodyHeight + (bodyHeight * 0.1) / 2,\n ]}\n />\n <Cylinder\n color=\"#1a1a1f\"\n height={bodyHeight * 0.2}\n radius={innerDiameter / 2}\n center={[\n -bodyLength / 3,\n -bodyLength / 3,\n bodyHeight + (bodyHeight * 0.1) / 2,\n ]}\n />\n <Cylinder\n color=\"#1a1a1f\"\n height={bodyHeight * 0.2}\n radius={innerDiameter / 2}\n center={[\n -bodyLength / 3,\n bodyLength / 3,\n bodyHeight + (bodyHeight * 0.1) / 2,\n ]}\n />\n <Cylinder\n color=\"#1a1a1f\"\n height={bodyHeight * 0.2}\n radius={innerDiameter / 2}\n center={[\n bodyLength / 3,\n -bodyLength / 3,\n bodyHeight + (bodyHeight * 0.1) / 2,\n ]}\n />\n <PushButtonLeg\n thickness={innerDiameter / 3}\n width={legWidth}\n horizontalLength={bodyLength * 0.8}\n verticalLength={bodyHeight / 2}\n position={{\n x: -bodyWidth / 2,\n y: -bodyLength / 2,\n z: -bodyHeight * 1.2,\n }}\n />\n <PushButtonLeg\n thickness={innerDiameter / 3}\n width={legWidth}\n horizontalLength={bodyLength * 0.8}\n verticalLength={bodyHeight / 2}\n position={{\n x: -bodyWidth / 2,\n y: bodyLength / 2,\n z: -bodyHeight * 1.2,\n }}\n rotation={Math.PI}\n />\n <PushButtonLeg\n thickness={innerDiameter / 3}\n width={legWidth}\n horizontalLength={bodyLength * 0.8}\n verticalLength={bodyHeight / 2}\n position={{ x: bodyWidth / 2, y: bodyLength / 2, z: -bodyHeight * 1.2 }}\n rotation={Math.PI}\n />\n <PushButtonLeg\n thickness={innerDiameter / 3}\n width={legWidth}\n horizontalLength={bodyLength * 0.8}\n verticalLength={bodyHeight / 2}\n position={{\n x: bodyWidth / 2 + innerDiameter / 3.6,\n y: -bodyLength / 2,\n z: -bodyHeight * 1.2,\n }}\n />\n </>\n )\n}\nexport interface PushButtonLegProps {\n thickness: number\n width: number\n horizontalLength: number\n verticalLength: number\n rotation?: number\n position?: { x: number; y: number; z?: number }\n}\n\nexport const PushButtonLeg = (props: PushButtonLegProps) => {\n const {\n thickness,\n width,\n horizontalLength,\n verticalLength,\n rotation = 0,\n position,\n } = props\n const points: [number, number][] = [\n [0, horizontalLength],\n [-verticalLength / 3, horizontalLength / 3],\n [-verticalLength / 5, horizontalLength / 4],\n [0, 0],\n ]\n const polygon = getExpandedStroke(points, thickness)\n\n return (\n <Colorize color=\"#f2f2f2\">\n <Translate\n offset={{\n x: position?.x || 0,\n y: position?.y || 0,\n z: position?.z || 0,\n }}\n >\n <Rotate rotation={[0, 55, rotation]}>\n <ExtrudeLinear height={width}>\n <Polygon points={polygon.map((p) => [p.y, p.x])} />\n </ExtrudeLinear>\n </Rotate>\n </Translate>\n </Colorize>\n )\n}\n","import {\n createDualRowGullWing,\n type DualRowGullWingDimensions,\n} from \"./utils/DualRowGullWing\"\nimport { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\n// SOIC typical body and lead dimensions\nconst LegacySOIC = ({\n pinCount,\n leadLength,\n leadWidth,\n pitch,\n bodyWidth,\n}: {\n pinCount: number\n pitch: number\n leadWidth: number\n leadLength: number\n bodyWidth: number\n}) => {\n const sidePinCount = Math.ceil(pinCount / 2)\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const leadThickness = 0.25\n const bodyHeight = 1.0\n const leadHeight = 0.8\n const leadBodyOffset = leadLength * 0\n const fullLength = pitch * (sidePinCount - 1) + leadWidth + 0.2\n const bodyWidthAdjusted = bodyWidth * 0.55\n\n return (\n <>\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={i}\n position={{\n x: -bodyWidth / 2 - leadBodyOffset,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={leadLength / 2}\n bodyDistance={leadLength + 0.3}\n height={leadHeight}\n />\n ))}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={i}\n rotation={Math.PI}\n position={{\n x: bodyWidth / 2 + leadBodyOffset,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={leadLength / 2}\n bodyDistance={leadLength + 0.3}\n height={leadHeight}\n />\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: leadThickness / 2 }}\n width={bodyWidthAdjusted}\n length={fullLength}\n height={bodyHeight}\n />\n </>\n )\n}\n\n/** Standard SOIC physical outline. Supplying leadSpan selects explicit package\n * dimensions; the legacy land-derived API is retained for existing callers.\n * See examples/fixtures/soic-variants.ts for MS-012 dimensional evidence.\n */\nexport type SOICProps =\n | Parameters<typeof LegacySOIC>[0]\n | DualRowGullWingDimensions\nexport const SOIC = (props: SOICProps) =>\n \"leadSpan\" in props ? createDualRowGullWing(props) : LegacySOIC(props)\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const VSSOP = ({\n pinCount,\n pitch,\n leadWidth,\n leadLength,\n bodyWidth,\n bodyLength,\n}: {\n pinCount: 8 | 10\n pitch?: number\n leadWidth?: number\n leadLength?: number\n bodyWidth?: number\n bodyLength?: number\n}) => {\n const defaults =\n pinCount === 8\n ? {\n pitch: 0.65,\n leadWidth: 0.3,\n leadLength: 1.6,\n }\n : {\n pitch: 0.5,\n leadWidth: 0.225,\n leadLength: 1.45,\n }\n\n const _pitch = !isNaN(parseFloat(pitch as any))\n ? parseFloat(pitch as any)\n : defaults.pitch\n const _leadWidth = !isNaN(parseFloat(leadWidth as any))\n ? parseFloat(leadWidth as any) * 0.8\n : defaults.leadWidth\n const _leadLength = !isNaN(parseFloat(leadLength as any))\n ? parseFloat(leadLength as any)\n : defaults.leadLength\n const _bodyWidth = !isNaN(parseFloat(bodyWidth as any))\n ? parseFloat(bodyWidth as any) * 0.8\n : 2.6\n const _bodyLength = !isNaN(parseFloat(bodyLength as any))\n ? parseFloat(bodyLength as any)\n : 2.0 + Number(_pitch) * 1.4\n\n const sidePinCount = pinCount / 2\n const pinOffsetToCenter = ((sidePinCount - 1) * _pitch) / 2\n const leadThickness = 0.15\n const leadHeight = 0.8\n\n const componentFullWidth = 4.5\n const leadBodyDistance = (componentFullWidth - _bodyWidth) / 2\n\n const padContactLength = leadBodyDistance * 0.5\n\n return (\n <>\n {/* Left leads - positioned at the tip, drawn inwards */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`left-${i}`}\n position={{\n x: -componentFullWidth / 2,\n y: pinOffsetToCenter - i * _pitch,\n z: leadThickness / 2,\n }}\n width={_leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength + 0.05}\n bodyDistance={leadBodyDistance + 0.1}\n height={leadHeight}\n />\n ))}\n {/* Right leads - positioned at the tip, drawn inwards */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: componentFullWidth / 2,\n y: pinOffsetToCenter - i * _pitch,\n z: leadThickness / 2,\n }}\n width={_leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength + 0.05}\n bodyDistance={leadBodyDistance + 0.1}\n height={leadHeight}\n />\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: leadThickness / 2 }}\n width={_bodyWidth}\n length={_bodyLength}\n height={1.0}\n />\n </>\n )\n}\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD523 = () => {\n const fullWidth = 2.15\n const bodyLength = 0.8\n const bodyHeight = 0.6\n\n const padWidth = 0.6\n const padLength = 0.5\n const padThickness = 0.12\n\n const bodyWidth = fullWidth - padLength\n const leftPadCenterX = -bodyWidth / 2 + padLength / 2 - 0.15 // 0.15 is the distance between the pad and the body as datasheet\n const rightPadCenterX = bodyWidth / 2 - padLength / 2 + 0.15 // 0.15 is the distance between the pad and the body as datasheet\n\n // top taper happens only in last quarter\n const taperOffset = 0.2\n const straightHeight = bodyHeight * 0.5\n\n // Body geometry\n // - straightHeight: the lower (straight) portion of the body\n // - taperOffset: how much smaller the top of the body becomes\n\n return (\n <>\n {/* Pads */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body (lifted above pads) */}\n <Colorize color=\"#222\">\n <Union>\n {/* Straight bottom section */}\n <Translate z={straightHeight / 2}>\n <Cuboid size={[bodyWidth, bodyLength, straightHeight]} />\n </Translate>\n\n {/* Tapered top quarter */}\n <Hull>\n {/* bottom of taper (same size as straight section top) */}\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n\n {/* top of taper (smaller) */}\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n </>\n )\n}\n\nexport default SOD523\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD882 = () => {\n const bodyLength = 0.98\n const bodyHeight = 0.47\n const pitch = 0.65\n\n const padWidth = 0.51\n const padLength = 0.26\n const padThickness = 0.12\n\n const bodyWidth = 0.58\n const leftPadCenterX = -pitch / 2\n const rightPadCenterX = pitch / 2\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Translate z={bodyHeight / 2 + 0.02}>\n <Cuboid size={[bodyLength, bodyWidth, bodyHeight]} />\n </Translate>\n </Colorize>\n\n <Cuboid\n color=\"#ccc\"\n size={[bodyLength + 0.001, padLength / 2, padLength / 4]}\n center={[0, padLength / 2, bodyHeight / 4]}\n />\n <Cuboid\n color=\"#ccc\"\n size={[bodyLength + 0.001, padLength / 2, padLength / 4]}\n center={[0, -padLength / 2, bodyHeight / 4]}\n />\n\n <Cuboid\n color=\"#ccc\"\n size={[padLength / 1.5, bodyWidth + 0.001, padLength / 4]}\n center={[pitch / 2, 0, bodyHeight / 4]}\n />\n <Cuboid\n color=\"#ccc\"\n size={[padLength / 1.5, bodyWidth + 0.001, padLength / 4]}\n center={[-pitch / 2, 0, bodyHeight / 4]}\n />\n </>\n )\n}\n\nexport default SOD882\n","import { Cuboid, Colorize, Union, Hull, Translate } from \"jscad-fiber\"\n\nexport const SMA = () => {\n const bodyWidth = 4.4\n const bodyLength = 3.4\n const bodyHeight = 2.3\n const padWidth = 1.45\n const padThickness = 0.12\n\n const leadThickness = 0.2\n const leadHeight = 1.14\n\n const taperOffset = 0.4\n const straightHeight = bodyHeight * 0.5\n\n const Body = (\n <Colorize color=\"#1a1a1a\">\n <Union>\n <Hull>\n <Translate z={padThickness + 0.01}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.03]}\n />\n </Translate>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n </Hull>\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n )\n\n const Lead = ({ xDir }: { xDir: number }) => {\n const verticalGap = 1\n const lowerPadGap = 1\n const lowerPadX =\n xDir * (bodyLength / 2 - (bodyHeight * 0.8) / 2 + lowerPadGap)\n const verticalLeadX =\n xDir * (bodyLength / 2 - leadThickness / 2 + verticalGap)\n const bodyEdgeX = xDir * (bodyLength / 2 - leadThickness / 2)\n const bridgeLength = Math.abs(bodyEdgeX - verticalLeadX)\n const bridgeCenterX = (verticalLeadX + bodyEdgeX) / 2\n\n return (\n <Colorize color=\"#c0c0c0\">\n <Union>\n <Cuboid\n size={[bodyHeight * 0.8, padWidth, leadThickness]}\n center={[lowerPadX, 0, leadThickness / 2]}\n />\n <Cuboid\n size={[leadThickness, padWidth, leadHeight]}\n center={[verticalLeadX, 0, leadHeight / 2 + leadThickness]}\n />\n <Cuboid\n size={[bridgeLength, padWidth, leadThickness]}\n center={[bridgeCenterX, 0, leadThickness / 2 + leadHeight]}\n />\n </Union>\n </Colorize>\n )\n }\n\n return (\n <>\n <Lead xDir={1} />\n <Lead xDir={-1} />\n {Body}\n </>\n )\n}\n\nexport default SMA\n","import { Cuboid, Colorize, Union, Hull, Translate } from \"jscad-fiber\"\n\nexport const SMB = () => {\n // Package outline for the designation, from KiCad's D_SMB F.Fab layer.\n // Was 4.4 x 3.4 — 15% narrow across the leads for a DO-214AA.\n const bodyWidth = 4.6\n const bodyLength = 4.0\n const bodyHeight = 2.3\n const padWidth = 1.45\n const padThickness = 0.12\n\n const leadThickness = 0.2\n const leadHeight = 1.14\n\n const taperOffset = 0.4\n const straightHeight = bodyHeight * 0.5\n\n const Body = (\n <Colorize color=\"#1a1a1a\">\n <Union>\n <Hull>\n <Translate z={padThickness + 0.01}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.03]}\n />\n </Translate>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n </Hull>\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n )\n\n const Lead = ({ xDir }: { xDir: number }) => {\n const verticalGap = 1\n const lowerPadGap = 1\n const lowerPadX =\n xDir * (bodyLength / 2 - (bodyHeight * 0.8) / 2 + lowerPadGap)\n const verticalLeadX =\n xDir * (bodyLength / 2 - leadThickness / 2 + verticalGap)\n const bodyEdgeX = xDir * (bodyLength / 2 - leadThickness / 2)\n const bridgeLength = Math.abs(bodyEdgeX - verticalLeadX)\n const bridgeCenterX = (verticalLeadX + bodyEdgeX) / 2\n\n return (\n <Colorize color=\"#c0c0c0\">\n <Union>\n <Cuboid\n size={[bodyHeight * 0.8, padWidth, leadThickness]}\n center={[lowerPadX, 0, leadThickness / 2]}\n />\n <Cuboid\n size={[leadThickness, padWidth, leadHeight]}\n center={[verticalLeadX, 0, leadHeight / 2 + leadThickness]}\n />\n <Cuboid\n size={[bridgeLength, padWidth, leadThickness]}\n center={[bridgeCenterX, 0, leadThickness / 2 + leadHeight]}\n />\n </Union>\n </Colorize>\n )\n }\n\n return (\n <>\n <Lead xDir={1} />\n <Lead xDir={-1} />\n {Body}\n </>\n )\n}\n\nexport default SMB\n","import { Cuboid, Colorize, Union, Hull, Translate } from \"jscad-fiber\"\n\nexport const SMC = () => {\n const bodyWidth = 6.8\n const bodyLength = 6\n const bodyHeight = 2.3\n const padWidth = 2.95\n const padThickness = 0.2 // the cad model above of bottom\n\n const leadThickness = 0.2\n const leadHeight = 1.14\n\n const taperOffset = 0.4\n const straightHeight = bodyHeight * 0.5\n\n const Body = (\n <Colorize color=\"#1a1a1a\">\n <Union>\n <Hull>\n <Translate z={padThickness + 0.01}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.03]}\n />\n </Translate>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n </Hull>\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n )\n\n const Lead = ({ xDir }: { xDir: number }) => {\n const verticalGap = 1\n const lowerPadGap = 1\n const lowerPadX =\n xDir * (bodyLength / 2 - (bodyHeight * 0.8) / 2 + lowerPadGap)\n const verticalLeadX =\n xDir * (bodyLength / 2 - leadThickness / 2 + verticalGap)\n const bodyEdgeX = xDir * (bodyLength / 2 - leadThickness / 2)\n const bridgeLength = Math.abs(bodyEdgeX - verticalLeadX)\n const bridgeCenterX = (verticalLeadX + bodyEdgeX) / 2\n\n return (\n <Colorize color=\"#c0c0c0\">\n <Union>\n <Cuboid\n size={[bodyHeight * 0.8, padWidth, leadThickness]}\n center={[lowerPadX, 0, leadThickness / 2]}\n />\n <Cuboid\n size={[leadThickness, padWidth, leadHeight]}\n center={[verticalLeadX, 0, leadHeight / 2 + leadThickness]}\n />\n <Cuboid\n size={[bridgeLength, padWidth, leadThickness]}\n center={[bridgeCenterX, 0, leadThickness / 2 + leadHeight]}\n />\n </Union>\n </Colorize>\n )\n }\n\n return (\n <>\n <Lead xDir={1} />\n <Lead xDir={-1} />\n {Body}\n </>\n )\n}\n\nexport default SMC\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SMF = () => {\n const fullWidth = 2.9\n const bodyLength = 1.9\n const bodyHeight = 1.08\n\n const padWidth = 1.2\n const padLength = 1\n const padThickness = 0.25\n\n const bodyWidth = fullWidth\n const leftPadCenterX = -1.3\n const rightPadCenterX = 1.3\n\n const taperOffset = 0.2\n const straightHeight = bodyHeight * 0.5\n\n const Body = (\n <Colorize color=\"#222\">\n <Union>\n <Translate z={straightHeight / 2}>\n <Cuboid size={[bodyWidth, bodyLength, straightHeight]} />\n </Translate>\n\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n )\n\n return (\n <>\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {Body}\n </>\n )\n}\n\nexport default SMF\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD123F = () => {\n const fullWidth = 2.7\n const bodyLength = 1.6\n const bodyHeight = 1.1\n\n const padWidth = 0.6\n const padLength = 1\n const padThickness = 0.12\n\n const leftPadCenterX = -1.3\n const rightPadCenterX = 1.3\n\n const taperOffset = 0.2\n const straightHeight = bodyHeight * 0.5\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Union>\n {/* Middle straight section */}\n <Translate z={straightHeight / 2}>\n <Cuboid size={[fullWidth, bodyLength, straightHeight]} />\n </Translate>\n\n {/* Top taper section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[fullWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[fullWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n </>\n )\n}\n\nexport default SOD123F\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD123FL = () => {\n const fullWidth = 2.75\n const bodyLength = 1.8\n\n const bodyHeight = 1\n\n const padWidth = 0.9\n const padLength = 1\n const padThickness = 0.2\n\n const leftPadCenterX = -(fullWidth / 2 - 0.075)\n const rightPadCenterX = fullWidth / 2 - 0.075\n\n const taperOffset = 0.4\n const straightHeight = bodyHeight * 0.2\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Union>\n {/* Middle straight section */}\n <Translate z={straightHeight / 2}>\n <Cuboid size={[fullWidth, bodyLength, straightHeight]} />\n </Translate>\n\n {/* Top taper section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[fullWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[fullWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[padThickness, bodyLength - taperOffset, 0.01]}\n center={[leftPadCenterX + taperOffset, 0, bodyHeight]}\n />\n </>\n )\n}\n\nexport default SOD123FL\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport interface SOD123WProps {\n /** Body extent along the leads (X). */\n bodyWidth?: number\n /** Body extent across the leads (Y). */\n bodyLength?: number\n bodyHeight?: number\n}\n\n/**\n * SOD-123W.\n *\n * Defaults are the package outline for that designation — 2.60 x 1.70, per\n * KiCad's `Nexperia_CFP3_SOD-123W` F.Fab layer, which is the same reference\n * footprinter's own kicad-parity tests compare against.\n *\n * The dimensions are props because the shape (a moulded body with a metal cap\n * at each end) serves several designations at different sizes; the SIZE is\n * what makes it one package or another, so it must never be assumed. `sod110`\n * used these defaults for a while and rendered a body 24% too long.\n */\nexport const SOD123W = ({\n bodyWidth = 2.6,\n bodyLength = 1.7,\n bodyHeight = 1,\n}: SOD123WProps = {}) => {\n const fullWidth = bodyWidth\n\n const padWidth = bodyLength * 0.53\n const padLength = bodyWidth * 0.35\n const padThickness = 0.2\n\n const leftPadCenterX = -(fullWidth / 2 - 0.075)\n const rightPadCenterX = fullWidth / 2 - 0.075\n\n const taperOffset = 0.4\n const lowerTaperOffset = 0.1\n const straightHeight = bodyHeight * 0.2\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Union>\n {/* Middle straight section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid\n size={[\n fullWidth - lowerTaperOffset / 2,\n bodyLength - lowerTaperOffset / 2,\n 0.01,\n ]}\n />\n </Translate>\n <Translate z={0.01}>\n <Cuboid\n size={[\n fullWidth - lowerTaperOffset,\n bodyLength - lowerTaperOffset,\n 0.01,\n ]}\n />\n </Translate>\n </Hull>\n\n {/* Top taper section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[fullWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[fullWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[padThickness * 2.7, bodyLength - taperOffset, 0.02]}\n center={[leftPadCenterX + taperOffset, 0, bodyHeight]}\n />\n </>\n )\n}\n\nexport default SOD123W\n","import { Cuboid } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport interface SOD123Props {\n /** Overall package length, including the leads, in millimeters. */\n fullWidth?: number\n /** Molded package width in millimeters. */\n fullLength?: number\n}\n\n/**\n * SOD-123 diode package.\n *\n * The defaults are the nominal dimensions from the Vishay 1N4148W package\n * drawing: https://www.vishay.com/docs/86356/1n4148w.pdf\n */\nexport const SOD123 = ({\n fullWidth = 3.7,\n fullLength = 1.55,\n}: SOD123Props = {}) => {\n const bodyWidth = fullWidth - 1\n const bodyLength = fullLength\n const packageHeight = 1.175\n const bodyStandoff = 0.1\n const bodyHeight = packageHeight - bodyStandoff\n const leadWidth = 0.55\n const leadThickness = 0.12\n const leadHeight = 0.35\n const bodyDistance = (fullWidth - bodyWidth) / 2\n const padContactLength = 0.25\n const leadCurveLength = 0.2\n\n return (\n <>\n <SmdChipLead\n position={{\n x: -fullWidth / 2,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n curveLength={leadCurveLength}\n height={leadHeight}\n />\n\n <SmdChipLead\n rotation={Math.PI}\n position={{\n x: fullWidth / 2,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n curveLength={leadCurveLength}\n height={leadHeight}\n />\n\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n heightAboveSurface={bodyStandoff}\n includeNotch={false}\n color=\"#222\"\n taperRatio={0.06}\n straightHeightRatio={0.6}\n />\n\n <Cuboid\n color=\"#777\"\n size={[0.45, bodyLength - 0.15, 0.02]}\n center={[-bodyWidth / 4, 0, packageHeight]}\n />\n </>\n )\n}\n\nexport default SOD123\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD128 = () => {\n const fullWidth = 3.8\n const bodyLength = 2.5\n\n const bodyHeight = 1\n\n const padWidth = 1.75\n const padLength = 0.9\n const padThickness = 0.2\n\n const leftPadCenterX = -(fullWidth / 2 - 0.075)\n const rightPadCenterX = fullWidth / 2 - 0.075\n\n const taperOffset = 0.4\n const lowerTaperOffset = 0.05\n const straightHeight = bodyHeight * 0.2\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Union>\n {/* Middle straight section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid\n size={[\n fullWidth - lowerTaperOffset / 2,\n bodyLength - lowerTaperOffset / 2,\n 0.01,\n ]}\n />\n </Translate>\n <Translate z={0.01}>\n <Cuboid\n size={[\n fullWidth - lowerTaperOffset,\n bodyLength - lowerTaperOffset,\n 0.01,\n ]}\n />\n </Translate>\n </Hull>\n\n {/* Top taper section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[fullWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[fullWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[padThickness * 2.7, bodyLength - taperOffset, 0.02]}\n center={[leftPadCenterX + taperOffset, 0, bodyHeight]}\n />\n </>\n )\n}\n\nexport default SOD128\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD923 = () => {\n const fullWidth = 0.8\n const bodyLength = 0.6\n\n const bodyHeight = 0.37\n\n const padWidth = 0.25\n const padLength = 0.4\n const padThickness = 0.14\n\n const leftPadCenterX = -(fullWidth / 2)\n const rightPadCenterX = fullWidth / 2\n\n const taperOffset = 0.1\n const straightHeight = padThickness\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Union>\n {/* Middle straight section */}\n <Translate z={straightHeight / 2}>\n <Cuboid size={[fullWidth, bodyLength, straightHeight]} />\n </Translate>\n\n {/* Top taper section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[fullWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[fullWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n </>\n )\n}\n\nexport default SOD923\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport interface SOT223Props {\n /** Pad-to-pad span across the leads (X). */\n fullWidth?: number\n /** X extent of the moulded body. */\n bodyWidth?: number\n /** Y extent of the moulded body. */\n bodyLength?: number\n bodyHeight?: number\n /** Y width of the three signal leads. */\n leadWidth?: number\n /** Y width of the single wide tab lead on the opposite side. */\n tabLeadWidth?: number\n /** Y pitch of the signal leads. */\n padPitch?: number\n /** How high the lead rises from the pad to the body face. */\n leadHeight?: number\n}\n\n/**\n * SOT-223 and its smaller relative SOT-89: three leads one side, one wide tab\n * lead the other. Same construction, different dimensions, so the dimensions\n * are props — SOT-89's body is 4.5 x 2.5 x 1.5, barely a third of the volume.\n */\nexport const SOT223 = ({\n fullWidth = 6.6,\n bodyWidth = 3.5,\n bodyLength = 6.5,\n bodyHeight = 1.7,\n leadWidth = 0.7,\n tabLeadWidth = 3,\n padPitch = 2.3,\n leadHeight = 0.75,\n}: SOT223Props = {}) => {\n const leftLeadWidth = tabLeadWidth\n const leadThickness = 0.25\n const padContactLength = 0.5\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = fullWidth - bodyWidth\n\n return (\n <>\n {/* Leads on the right side (pin 1) */}\n <SmdChipLead\n key={4}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leftLeadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the left side (pin 3) */}\n <SmdChipLead\n key={3}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: -padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n includeNotch={false}\n taperRatio={0.06}\n straightHeightRatio={0.45}\n />\n </>\n )\n}\n\nexport default SOT223\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const TQFP = () => {\n const pinCount = 64\n const pitch = 0.5\n const leadWidth = 0.2\n const padContactLength = 0.45\n const bodyWidth = 9\n const sidePinCount = pinCount / 4\n const bodyLength = bodyWidth\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const fullLength = bodyLength + 2 * padContactLength + 0.6\n const fullWidth = fullLength\n const leadHeight = 0.65\n const leadThickness = 0.25\n const bodyDistance = (fullWidth - bodyWidth) / 2 + 0.2\n\n return (\n <>\n {/* Pins on the left side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`left-${i}`}\n position={{\n x: -fullWidth / 2,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the right side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the bottom side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`bottom-${i}`}\n rotation={Math.PI / 2}\n position={{\n x: i * pitch - pinOffsetToCenter,\n y: -fullLength / 2,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the top side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`top-${i}`}\n rotation={-Math.PI / 2}\n position={{\n x: i * pitch - pinOffsetToCenter,\n y: fullLength / 2,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={1.2}\n chamferSize={0.7}\n taperRatio={0.05}\n notchPosition={{ x: -3.5, y: 3.5, z: 1.2 }}\n notchRadius={1.2 / 2}\n />\n </>\n )\n}\n\nexport default TQFP\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOT323 = () => {\n const fullWidth = 2.05\n const bodyWidth = 1.25\n const bodyLength = 2.0\n const bodyHeight = 0.9\n const leadWidth = 0.3\n const leadThickness = 0.18\n const leadHeight = 0.65\n const padContactLength = 0.2\n const padPitch = 0.65\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = fullWidth - bodyWidth\n\n return (\n <>\n {/* Lead on the right side (pin 1) */}\n <SmdChipLead\n key={4}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the left side (pin 3) */}\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: -padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n includeNotch={false}\n taperRatio={0.06}\n straightHeightRatio={0.7}\n heightAboveSurface={0.05}\n />\n </>\n )\n}\n\nexport default SOT323\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n Hull,\n Subtract,\n Translate,\n Union,\n} from \"jscad-fiber\"\n\n/** Physical package dimensions in mm, independent of copper land dimensions.\n * Four equal lead rows surround the mold. Z=0 is the seating plane.\n * Pin 1 is at negative X, positive Y. Bend curvature and the pin-1 dimple are\n * visual approximations, not additional package-identification parameters.\n */\nexport interface PhysicalLqfpDimensions {\n pinCount: number\n pitch: number\n bodyWidth: number\n bodyLength: number\n /** Overall height A, including standoff A1. */\n bodyHeight: number\n standoff: number\n /** Outer lead-tip to outer lead-tip dimension E. */\n leadSpanX: number\n leadSpanY: number\n leadWidth: number\n leadThickness: number\n /** Horizontal terminal contact, not the PCB land length. */\n contactLength: number\n /** Per-side inset of the top and bottom mold faces. */\n taperInset: number\n}\n\nexport function createPhysicalLqfp(p: PhysicalLqfpDimensions) {\n const {\n pinCount,\n pitch,\n bodyWidth,\n bodyLength,\n bodyHeight,\n standoff,\n leadSpanX,\n leadSpanY,\n leadWidth,\n leadThickness,\n contactLength,\n taperInset,\n } = p\n for (const key of [\n \"pitch\",\n \"bodyWidth\",\n \"bodyLength\",\n \"bodyHeight\",\n \"leadSpanX\",\n \"leadSpanY\",\n \"leadWidth\",\n \"leadThickness\",\n \"contactLength\",\n ] as const)\n if (!Number.isFinite(p[key]) || p[key] <= 0)\n throw new Error(`${key} must be finite and positive`)\n for (const [name, value] of Object.entries({\n standoff,\n taperInset,\n }))\n if (!Number.isFinite(value) || value < 0)\n throw new Error(`${name} must be finite and nonnegative`)\n if (!Number.isInteger(pinCount) || pinCount < 8 || pinCount % 4)\n throw new Error(\"pinCount must be divisible by four and at least eight\")\n const moldHeight = bodyHeight - standoff\n const reach = Math.min(leadSpanX - bodyWidth, leadSpanY - bodyLength) / 2\n const rowLength = (pinCount / 4 - 1) * pitch + leadWidth\n if (\n moldHeight <= leadThickness * 2 ||\n leadWidth >= pitch ||\n rowLength >= Math.min(bodyWidth, bodyLength) - 2 * taperInset ||\n taperInset * 2 >= Math.min(bodyWidth, bodyLength) ||\n contactLength >= reach\n )\n throw new Error(\"Invalid mold, lead spacing, or terminal reach\")\n const midZ = standoff + moldHeight / 2\n const slice = Math.min(0.002, moldHeight / 100)\n const body = (\n <Hull>\n <Translate z={standoff + slice / 2}>\n <Cuboid\n size={[\n bodyWidth - 2 * taperInset,\n bodyLength - 2 * taperInset,\n slice,\n ]}\n />\n </Translate>\n <Translate z={midZ}>\n <Cuboid size={[bodyWidth, bodyLength, slice]} />\n </Translate>\n <Translate z={bodyHeight - slice / 2}>\n <Cuboid\n size={[\n bodyWidth - 2 * taperInset,\n bodyLength - 2 * taperInset,\n slice,\n ]}\n />\n </Translate>\n </Hull>\n )\n const dimpleRadius = Math.min(bodyWidth, bodyLength) * 0.045\n const dimpleDepth = Math.min(0.04, moldHeight / 10)\n // Smoothstep centerline, made from overlapping convex slices: positive-volume\n // solids in both React and vanilla renderers. Each root extends into the mold.\n const lead = (side: number, along: number) => {\n const horizontal = side % 2 === 0\n const sign = side < 2 ? -1 : 1\n const width = horizontal ? bodyWidth : bodyLength\n const outer = (horizontal ? leadSpanX : leadSpanY) / 2\n const root = width / 2 - Math.min(width / 8, 0.15)\n const bendStart = outer - contactLength\n const bendEnd = width / 2 + Math.min(0.08, (reach - contactLength) / 4)\n const points: [number, number][] = [\n [outer - slice / 2, leadThickness / 2],\n [bendStart, leadThickness / 2],\n ]\n for (let i = 1; i <= 12; i++) {\n const t = i / 12\n points.push([\n bendStart + (bendEnd - bendStart) * t,\n leadThickness / 2 + (midZ - leadThickness / 2) * t * t * (3 - 2 * t),\n ])\n }\n points.push([root, midZ])\n const section = ([x, z]: [number, number]) => (\n <Translate\n offset={{\n x: horizontal ? sign * x : along,\n y: horizontal ? along : sign * x,\n z,\n }}\n >\n <Cuboid\n size={\n horizontal\n ? [slice, leadWidth, leadThickness]\n : [leadWidth, slice, leadThickness]\n }\n />\n </Translate>\n )\n return (\n <Union>\n {points.slice(1).map((point, i) => (\n <Hull key={i}>\n {section(points[i]!)}\n {section(point)}\n </Hull>\n ))}\n </Union>\n )\n }\n return (\n <>\n <Colorize color=\"#353535\">\n <Subtract>\n {body}\n <Translate\n offset={{\n x: -bodyWidth / 2 + taperInset + dimpleRadius * 2,\n y: bodyLength / 2 - taperInset - dimpleRadius * 2,\n z: bodyHeight,\n }}\n >\n <Cylinder radius={dimpleRadius} height={dimpleDepth * 2} />\n </Translate>\n </Subtract>\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n {Array.from({ length: pinCount }, (_, i) =>\n lead(\n Math.floor(i / (pinCount / 4)),\n ((pinCount / 4 - 1) / 2 - (i % (pinCount / 4))) * pitch,\n ),\n )}\n </Colorize>\n </>\n )\n}\n","import {\n createPhysicalLqfp,\n type PhysicalLqfpDimensions,\n} from \"./utils/PhysicalLqfp\"\nimport { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nconst LegacyLQFP = ({\n pinCount,\n pitch,\n leadWidth,\n padContactLength,\n bodyWidth,\n}: {\n pinCount: number\n pitch?: number\n leadWidth?: number\n padContactLength?: number\n bodyWidth?: number\n}) => {\n const sidePinCount = pinCount / 4\n if (sidePinCount !== Math.floor(sidePinCount)) {\n throw new Error(`LQFP pinCount must be divisible by 4, got ${pinCount}`)\n }\n\n // get default values if not specified\n if (!pitch) pitch = 0.5\n if (!padContactLength) padContactLength = 0.6\n if (!leadWidth) leadWidth = 0.22\n if (!bodyWidth) bodyWidth = pitch * (sidePinCount + 4)\n\n const bodyLength = bodyWidth\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const fullLength = bodyLength + 3.3 * padContactLength\n const fullWidth = fullLength\n const leadHeight = 0.8\n const leadThickness = 0.2\n const bodyDistance = (fullWidth - bodyWidth) / 2 + 0.4\n\n return (\n <>\n {/* Pins on the left side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`left-${i}`}\n position={{\n x: -fullWidth / 2 - 0.36,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the right side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + 0.36,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the bottom side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`bottom-${i}`}\n rotation={Math.PI / 2}\n position={{\n x: i * pitch - pinOffsetToCenter,\n y: -fullLength / 2 - 0.36,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the top side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`top-${i}`}\n rotation={-Math.PI / 2}\n position={{\n x: i * pitch - pinOffsetToCenter,\n y: fullLength / 2 + 0.36,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={1.5}\n heightAboveSurface={0.1}\n taperRatio={0.04}\n chamferSize={0.7}\n notchPosition={{\n x: -(bodyLength / 2 - 1.5),\n y: bodyLength / 2 - 1.5,\n z: 1.5,\n }}\n notchRadius={1.5 / 2}\n />\n </>\n )\n}\n\n/** leadSpanX selects explicit physical dimensions. Existing callers retain\n * their legacy geometry. See standard outline evidence in the fixtures.\n */\nexport type LQFPProps =\n | Parameters<typeof LegacyLQFP>[0]\n | PhysicalLqfpDimensions\nexport const LQFP = (props: LQFPProps) =>\n \"leadSpanX\" in props ? createPhysicalLqfp(props) : LegacyLQFP(props)\nexport default LQFP\n","import { Cuboid, Translate, Colorize, Hull, Union } from \"jscad-fiber\"\n\nexport const SOT723 = () => {\n // Body dimensions (mm)\n const bodyWidth = 0.85\n const bodyLength = 1.2\n const bodyHeight = 0.38\n\n const straightHeight = bodyHeight * 0.55\n const taperOffset = 0.1\n\n const padLength = 0.3\n const padThickness = 0.1\n const leftPadWidth = 0.2\n const rightPadWidth = 0.25\n\n const rightPadCenterX = 0.55\n const rightPadCenterY = 0\n\n const leftTopPadCenterX = -0.55\n const leftTopPadCenterY = 0.4\n\n const leftBottomPadCenterX = -0.55\n const leftBottomPadCenterY = -0.4\n\n return (\n <>\n {/* Body with straight lower section + hulled tapered top */}\n <Colorize color=\"#222\">\n <Union>\n {/* straight lower section */}\n <Cuboid\n size={[bodyWidth, bodyLength, straightHeight]}\n center={[0, 0, straightHeight / 2]}\n />\n\n {/* tapered top via Hull between two thin slices */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n\n {/* Pads */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, rightPadWidth, padThickness]}\n center={[rightPadCenterX, rightPadCenterY, padThickness / 2]}\n />\n\n <Cuboid\n color=\"#ccc\"\n size={[padLength, leftPadWidth, padThickness]}\n center={[leftTopPadCenterX, leftTopPadCenterY, padThickness / 2]}\n />\n\n <Cuboid\n color=\"#ccc\"\n size={[padLength, leftPadWidth, padThickness]}\n center={[leftBottomPadCenterX, leftBottomPadCenterY, padThickness / 2]}\n />\n </>\n )\n}\n\nexport default SOT723\n","import { componentMaterials } from \"./materials\"\n/** Parameterized dual-flat no-lead package family. Dimensions are millimeters.\n * Manufacturer case names belong in fixtures, not in model dispatch or exports.\n * Existing chamfered rendering remains the default; rectangular variants expose\n * mold standoff, terminal setback/thickness and optional pin-1 corner cuts.\n */\nimport { Colorize, Cuboid, Hull, Subtract } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\nexport const DFN = ({\n num_pins,\n bodyWidth = 5.3,\n bodyLength = 5.3,\n bodyThickness = 1,\n thermalPadSize,\n // For a body length of 5 the typical pad width/length are 0.6 and 1.\n // Scale those values proportionally when `bodyLength` changes.\n padWidth = (bodyLength / 5.3) * 0.6,\n padLength = (bodyLength / 5.3) * 1,\n pitch = 0.5,\n thermalPadThickness = 0.2,\n bodyStyle = \"chamfered\",\n standoff = 0,\n terminalInset = 0,\n terminalThickness = thermalPadThickness,\n pin1TerminalChamfer = 0,\n pin1MarkWidth = 0,\n}: {\n num_pins: number\n bodyWidth?: number\n bodyLength?: number\n bodyThickness?: number\n thermalPadSize?: {\n width: number\n length: number\n }\n padWidth?: number\n padLength?: number\n pitch?: number\n thermalPadThickness?: number\n /** Rectangular bodies support small no-lead variants; legacy outline is the default. */\n bodyStyle?: \"chamfered\" | \"rectangular\"\n /** For rectangular bodies: mold bottom above the seating plane, mm. Body thickness excludes this gap. */\n standoff?: number\n /** Setback of terminal outer edges from the mold edges, mm. */\n terminalInset?: number\n /** Leadframe thickness, independent of the optional exposed pad, mm. */\n terminalThickness?: number\n /** Two outside corner cuts on terminal 1, mm. */\n pin1TerminalChamfer?: number\n /** For rectangular bodies: optional top pin-1 stripe width in mm; zero omits it. */\n pin1MarkWidth?: number\n}) => {\n if (bodyStyle === \"rectangular\") {\n if (!Number.isInteger(num_pins) || num_pins < 2 || num_pins % 2 !== 0)\n throw new Error(\"DFN requires an even pin count of at least two\")\n for (const value of [\n bodyWidth,\n bodyLength,\n bodyThickness,\n padWidth,\n padLength,\n pitch,\n terminalThickness,\n ])\n if (!Number.isFinite(value) || value <= 0)\n throw new Error(\"DFN dimensions must be finite and positive\")\n for (const value of [\n standoff,\n terminalInset,\n pin1TerminalChamfer,\n pin1MarkWidth,\n ])\n if (!Number.isFinite(value) || value < 0)\n throw new Error(\"DFN offsets must be finite and nonnegative\")\n if (\n terminalThickness <= standoff ||\n terminalThickness > standoff + bodyThickness ||\n terminalInset + padLength >= bodyWidth / 2 ||\n (num_pins / 2 - 1) * pitch + padWidth > bodyLength ||\n (num_pins > 2 && padWidth >= pitch) ||\n pin1TerminalChamfer >= Math.min(padLength, padWidth / 2) ||\n pin1MarkWidth >= bodyWidth / 4\n )\n throw new Error(\n \"DFN dimensions leave disconnected or overlapping terminals\",\n )\n }\n // DFN packages have pads on two opposite sides (left & right).\n // Distribute pins evenly between the two sides.\n const pinPositions: Array<{\n pinNumber: number\n x: number\n y: number\n padSizeX: number // size across the package X axis (pad width)\n padSizeY: number // size along the package Y axis (pad length)\n }> = []\n\n const pinsPerSide = Math.floor(num_pins / 2)\n // pinSpan = distance between first and last pin on a side (along Y)\n const pinSpan = pitch * (pinsPerSide - 1)\n\n for (let i = 0; i < num_pins; i++) {\n const side = i < pinsPerSide ? \"left\" : \"right\"\n const indexOnSide = i % pinsPerSide\n const y = pinSpan / 2 - indexOnSide * pitch\n\n // Pads on DFN are typically oriented vertically (long edge along Y)\n const padSizeX = padLength // X dimension of pad (short side)\n const padSizeY = padWidth // Y dimension of pad (long side)\n\n // x position: place pad inside the body so its outer edge touches the\n // package edge. Pad center should be half the pad X size away from edge.\n const x =\n side === \"left\"\n ? -bodyWidth / 2 + padSizeX / 2 + terminalInset\n : bodyWidth / 2 - padSizeX / 2 - terminalInset\n\n const pinNumber = i + 1\n pinPositions.push({ pinNumber, x, y, padSizeX, padSizeY })\n }\n\n if (bodyStyle === \"rectangular\") {\n const top = standoff + bodyThickness\n const inkThickness = Math.min(bodyThickness, bodyLength) / 100\n const stripe = (\n <Cuboid\n size={[pin1MarkWidth, bodyLength * 0.8, inkThickness]}\n center={[\n -bodyWidth / 2 + pin1MarkWidth * 1.5,\n 0,\n top - inkThickness / 2,\n ]}\n />\n )\n const body = (\n <Cuboid\n size={[bodyWidth, bodyLength, bodyThickness]}\n center={[0, 0, standoff + bodyThickness / 2]}\n />\n )\n return (\n <>\n <Colorize material={componentMaterials.moldedPlastic} color=\"#25272a\">\n {pin1MarkWidth > 0 ? (\n <Subtract>\n {body}\n {stripe}\n </Subtract>\n ) : (\n body\n )}\n </Colorize>\n <Colorize material={componentMaterials.tinnedLead} color=\"#c7c9cd\">\n {pinPositions.map((p) =>\n p.pinNumber === 1 && pin1TerminalChamfer > 0 ? (\n <Hull key={p.pinNumber}>\n <Cuboid\n size={[\n padLength - pin1TerminalChamfer,\n padWidth,\n terminalThickness,\n ]}\n center={[\n p.x + pin1TerminalChamfer / 2,\n p.y,\n terminalThickness / 2,\n ]}\n />\n <Cuboid\n size={[\n padLength,\n padWidth - 2 * pin1TerminalChamfer,\n terminalThickness,\n ]}\n center={[p.x, p.y, terminalThickness / 2]}\n />\n </Hull>\n ) : (\n <Cuboid\n key={p.pinNumber}\n size={[p.padSizeX, p.padSizeY, terminalThickness]}\n center={[p.x, p.y, terminalThickness / 2]}\n />\n ),\n )}\n </Colorize>\n {thermalPadSize && (\n <Cuboid\n material={componentMaterials.tinnedLead}\n color=\"#c7c9cd\"\n size={[\n thermalPadSize.width,\n thermalPadSize.length,\n thermalPadThickness,\n ]}\n center={[0, 0, thermalPadThickness / 2]}\n />\n )}\n {pin1MarkWidth > 0 && <Colorize color=\"#969997\">{stripe}</Colorize>}\n </>\n )\n }\n return (\n <>\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyThickness}\n heightAboveSurface={0}\n color=\"grey\"\n chamferSize={0.2}\n taperRatio={0}\n notchPosition={{\n x: -(bodyWidth / 2 - padLength),\n y: bodyLength / 2 - padLength,\n z: bodyThickness,\n }}\n />\n {pinPositions.map((p, i) => (\n <Cuboid\n key={i}\n center={[p.x, p.y, thermalPadThickness / 2]}\n size={[p.padSizeX, p.padSizeY, thermalPadThickness]}\n />\n ))}\n {thermalPadSize?.length !== undefined &&\n thermalPadSize?.width !== undefined && (\n <Cuboid\n center={[0, 0, thermalPadThickness / 2]}\n size={[\n thermalPadSize.width,\n thermalPadSize.length,\n thermalPadThickness,\n ]}\n />\n )}\n </>\n )\n}\n\nexport default DFN\n","import { Colorize, Cylinder, Hull, RoundedCylinder } from \"jscad-fiber\"\n\nexport interface HC49Props {\n /** overall body length (mm) */\n bodyLength?: number\n /** body width (mm) */\n bodyWidth?: number\n /** body height (mm) */\n bodyHeight?: number\n /** distance between lead centers (mm) */\n leadSpacing?: number\n /** lead diameter (mm) */\n leadDiameter?: number\n /** length of the lead below the body (mm) */\n leadLength?: number\n color?: string\n leadColor?: string\n}\n\n/**\n * HC-49 (through-hole crystal) simplified 3D model.\n * Defaults chosen to match the HC-49/U-S recommended land pattern and dimensions.\n */\nexport const HC49 = ({\n bodyLength = 10.2,\n bodyWidth = 4.65,\n bodyHeight = 13.46,\n leadSpacing = 5,\n leadDiameter = 0.8,\n leadLength = 12.7,\n color = \"#ddd\",\n leadColor = \"#b87333\",\n}: HC49Props) => {\n // positions and sizes\n const halfLength = bodyLength / 2\n\n // build a capsule-like body by hullling two cylinders (circular ends) across the X axis\n const endRadius = bodyWidth / 2\n const endCenterX = halfLength - endRadius\n // center X for the through-hole leads (distance between centers = leadSpacing)\n const leadCenterX = leadSpacing / 2\n const baseHeight = 0.85\n\n return (\n <>\n <Colorize color={color}>\n <Hull>\n <RoundedCylinder\n height={bodyHeight}\n roundRadius={0.5}\n radius={endRadius}\n center={[-endCenterX, 0, bodyHeight]}\n />\n <RoundedCylinder\n height={bodyHeight}\n roundRadius={0.5}\n radius={endRadius}\n center={[endCenterX, 0, bodyHeight]}\n />\n </Hull>\n <Hull>\n <RoundedCylinder\n height={baseHeight}\n roundRadius={0.1}\n radius={endRadius + 0.85}\n center={[-endCenterX, 0, bodyHeight / 2 + baseHeight / 2]}\n />\n <RoundedCylinder\n height={baseHeight}\n roundRadius={0.1}\n radius={endRadius + 0.85}\n center={[endCenterX, 0, bodyHeight / 2 + baseHeight / 2]}\n />\n </Hull>\n </Colorize>\n\n {/* leads (through-hole) - cylinders oriented along Z, extending below the body */}\n <Colorize color={leadColor}>\n <Cylinder\n height={leadLength + bodyHeight / 2}\n radius={leadDiameter / 2}\n center={[-leadCenterX + 0.06, 0, -(leadLength / 2) + bodyHeight / 2]}\n />\n <Cylinder\n height={leadLength + bodyHeight / 2}\n radius={leadDiameter / 2}\n center={[leadCenterX - 0.06, 0, -(leadLength / 2) + bodyHeight / 2]}\n />\n </Colorize>\n </>\n )\n}\n\nexport default HC49\n","import {\n Colorize,\n Cylinder,\n RoundedCylinder,\n Rotate,\n RoundedCuboid,\n} from \"jscad-fiber\"\n\nexport interface MicroMELFProps {\n bodyLength?: number\n bodyDiameter?: number\n color?: string\n contactColor?: string\n cathodeIdentification?: string\n}\n\nexport const MicroMELF = ({\n bodyLength = 1.4,\n bodyDiameter = 1.1,\n color = \"#3a3a3aff\",\n contactColor = \"#c6c6c6\",\n cathodeIdentification = \"#111\",\n}: MicroMELFProps) => {\n const padLength = 0.2\n\n return (\n <>\n <Colorize color={color}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCuboid\n size={[bodyDiameter, bodyDiameter, bodyLength - padLength]}\n roundRadius={padLength}\n center={[-bodyDiameter / 2, 0, 0.05]}\n />\n <Cylinder\n height={padLength / 2}\n radius={bodyDiameter / 2 - padLength}\n center={[-bodyDiameter / 2, 0, -bodyLength / 2 + padLength / 2]}\n />\n </Rotate>\n </Colorize>\n {/* Cathode identification: a dark stripe near the left end of the body */}\n\n <Colorize color={cathodeIdentification}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCuboid\n size={[bodyDiameter * 1.01, bodyDiameter * 1.01, bodyLength / 3]}\n roundRadius={padLength}\n center={[-bodyDiameter / 2, 0, -bodyLength / 4 + 0.1]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={contactColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={padLength}\n radius={bodyDiameter / 2}\n roundRadius={padLength / 3}\n center={[-bodyDiameter / 2, 0, -bodyLength / 2]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={contactColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={padLength}\n radius={bodyDiameter / 2}\n roundRadius={padLength / 3}\n center={[-bodyDiameter / 2, 0, bodyLength / 2]}\n />\n </Rotate>\n </Colorize>\n </>\n )\n}\n\nexport default MicroMELF\n","import { Colorize, Cylinder, RoundedCylinder, Rotate } from \"jscad-fiber\"\n\nexport interface MINIMELFProps {\n bodyLength?: number\n bodyDiameter?: number\n color?: string\n contactColor?: string\n bandColor?: string\n}\n\nexport const MINIMELF = ({\n bodyLength = 3.5,\n bodyDiameter = 1.5,\n color = \"#202020\",\n contactColor = \"#c6c6c6\",\n bandColor = \"#f2f2f2\",\n}: MINIMELFProps) => {\n // Vishay LL4148 outline: total L=3.3–3.7, D=1.4–1.6, terminals <=0.47 mm.\n // https://www.vishay.com/docs/85557/ll4148.pdf\n // bodyLength describes the complete case, including both end contacts.\n const contactLength = 0.4\n const glassLength = bodyLength - 2 * contactLength + 0.04\n const contactOffset = (bodyLength - contactLength) / 2\n // Seat each metal cap into the thin pad instead of touching it along a line.\n const contactRadius = bodyDiameter / 2 + 0.02\n const bandLength = 0.14\n const bandOffset = -bodyLength / 2 + contactLength + 0.35\n\n return (\n <>\n <Colorize color={color}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={glassLength}\n radius={bodyDiameter / 2}\n roundRadius={0.05}\n center={[-bodyDiameter / 2, 0, 0]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={bandColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <Cylinder\n height={bandLength}\n radius={bodyDiameter / 2 + 0.002}\n center={[-bodyDiameter / 2, 0, bandOffset]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={contactColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={contactLength}\n radius={contactRadius}\n roundRadius={0.04}\n center={[-bodyDiameter / 2, 0, -contactOffset]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={contactColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={contactLength}\n radius={contactRadius}\n roundRadius={0.04}\n center={[-bodyDiameter / 2, 0, contactOffset]}\n />\n </Rotate>\n </Colorize>\n </>\n )\n}\n\nexport default MINIMELF\n","import { Colorize, Cuboid, RoundedCylinder, Rotate } from \"jscad-fiber\"\n\nexport interface MELFProps {\n bodyLength?: number\n bodyDiameter?: number\n color?: string\n contactColor?: string\n}\n\nexport const MELF = ({\n bodyLength = 3.9,\n bodyDiameter = 2.5,\n color = \"#3a3a3aff\",\n contactColor = \"#c6c6c6\",\n}: MELFProps) => {\n const padLength = 0.55\n\n return (\n <>\n <Colorize color={color}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={bodyLength}\n radius={bodyDiameter / 2}\n roundRadius={0.3}\n center={[-bodyDiameter / 2, 0, 0]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={contactColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={padLength}\n radius={bodyDiameter / 2}\n roundRadius={0.2}\n center={[-bodyDiameter / 2, 0, -bodyLength / 2]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={contactColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={padLength}\n radius={bodyDiameter / 2}\n roundRadius={0.2}\n center={[-bodyDiameter / 2, 0, bodyLength / 2]}\n />\n </Rotate>\n </Colorize>\n </>\n )\n}\n\nexport default MELF\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const MS012 = ({\n pinCount,\n padContactLength = 0.6,\n leadWidth = 0.41,\n pitch = 1.27,\n}: {\n pinCount: number\n pitch?: number\n leadWidth?: number\n padContactLength?: number\n}) => {\n if (pinCount % 2 !== 0) {\n throw new Error(\"MS012 pinCount must be even\")\n }\n const sidePinCount = pinCount / 2\n const bodyWidth = 4.9\n const bodyLength = 3.9\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const leadThickness = 0.2\n\n return (\n <>\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={i}\n position={{\n x: -bodyLength / 2 - padContactLength - 0.3,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={padContactLength + 0.4}\n height={0.85}\n />\n ))}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: bodyLength / 2 + padContactLength + 0.3,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={padContactLength + 0.4}\n height={0.85}\n />\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: leadThickness / 2 }}\n width={bodyLength}\n length={bodyWidth}\n height={1.55}\n notchPosition={{\n x: -(bodyLength / 2 - 1),\n y: bodyWidth / 2 - 1,\n z: 1.55,\n }}\n heightAboveSurface={0.17}\n taperRatio={0.09}\n />\n </>\n )\n}\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const MS013 = ({\n pinCount = 16,\n padContactLength = 0.6,\n leadWidth = 0.41,\n pitch = 1.27,\n}: {\n pinCount?: number\n pitch?: number\n leadWidth?: number\n padContactLength?: number\n}) => {\n if (pinCount !== 16) {\n throw new Error(\"MS013 only supports 16 pins\")\n }\n const sidePinCount = pinCount / 2\n const bodyWidth = 7.5\n const bodyLength = 10.3\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const leadThickness = 0.2\n\n return (\n <>\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={i}\n position={{\n x: -bodyWidth / 2 - padContactLength - 0.3,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={padContactLength + 0.4}\n height={0.85}\n />\n ))}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: bodyWidth / 2 + padContactLength + 0.3,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={padContactLength + 0.4}\n height={0.85}\n />\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: leadThickness / 2 }}\n width={bodyWidth}\n length={bodyLength}\n height={1.1}\n notchPosition={{\n x: -(bodyWidth / 2 - 1.5),\n y: bodyLength / 2 - 1.5,\n z: 1.1,\n }}\n heightAboveSurface={0.17}\n taperRatio={0.05}\n />\n </>\n )\n}\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n Rotate,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\n\nexport interface TO220Lead {\n x: number\n y: number\n}\n\nexport interface TO220Props {\n /**\n * TO-220F is the fully-moulded (isolated) variant: same outline, but the\n * metal tab is encapsulated rather than exposed. Aliasing the two would\n * report a bare metal face where there is plastic — which matters as soon\n * as anything reasons about the tab, so it is a flag rather than an alias.\n */\n mouldedTab?: boolean\n /** Where the leads meet the board, from the footprint's plated holes. */\n leads?: TO220Lead[]\n /** Width across the package (X). */\n bodyWidth?: number\n /** Thickness of the moulded body (Y). */\n bodyThickness?: number\n /** Height of the moulded body above its own base. */\n bodyHeight?: number\n /** How much metal tab stands above the moulded body. */\n tabHeight?: number\n tabThickness?: number\n mountingHoleDiameter?: number\n /** Gap between the board and the underside of the body. */\n standoff?: number\n /** How far the leads run below the board. */\n leadLength?: number\n bodyColor?: string\n tabColor?: string\n leadColor?: string\n}\n\nconst TO220_DEFAULT_LEADS: TO220Lead[] = [\n { x: -2.54, y: -1 },\n { x: 0, y: -1 },\n { x: 2.54, y: -1 },\n]\n\n/**\n * TO-220, mounted upright.\n *\n * Authored standing up, in board coordinates, rather than lying down and\n * rotated into place. The rotations it used to carry were bare numbers\n * (`rotation={[0, 55, -55]}`), which both renderers read as RADIANS: 55 rad is\n * 271.3°, so the part stood up only because 271.3° is nearly -90°, and it\n * leaned 1.3° off vertical. With 16mm leads it also measured 32.5mm tall for a\n * part that is 18mm over the board, and the holes met the leads at their tips\n * instead of just under the body.\n */\nexport const TO220 = ({\n mouldedTab = false,\n leads = TO220_DEFAULT_LEADS,\n bodyWidth = 10,\n bodyThickness = 4.5,\n bodyHeight = 9.2,\n tabHeight = 6.4,\n tabThickness = 1.4,\n mountingHoleDiameter = 3.6,\n standoff = 3,\n leadLength = 3,\n bodyColor = \"#222\",\n tabColor = \"#ccc\",\n leadColor = \"#d4b106\",\n}: TO220Props = {}) => {\n const centerX = leads.reduce((sum, lead) => sum + lead.x, 0) / leads.length\n const centerY = leads.reduce((sum, lead) => sum + lead.y, 0) / leads.length\n\n const bodyBottom = standoff\n const bodyTop = bodyBottom + bodyHeight\n const tabTop = bodyTop + tabHeight\n // The tab is flush with the back face of the moulding.\n const tabY = centerY + (bodyThickness - tabThickness) / 2\n const holeZ = tabTop - Math.max(mountingHoleDiameter * 0.8, 2.6)\n\n const leadWidth = 0.8\n const leadThickness = 0.5\n\n return (\n <>\n <Colorize color={bodyColor}>\n <Cuboid\n size={[bodyWidth, bodyThickness, bodyHeight]}\n center={[centerX, centerY, bodyBottom + bodyHeight / 2]}\n />\n </Colorize>\n\n {/* The tab, with its mounting hole. A moulded (TO-220F) part has the\n same outline in plastic. */}\n <Colorize color={mouldedTab ? bodyColor : tabColor}>\n <Subtract>\n <Cuboid\n size={[bodyWidth, tabThickness, tabHeight]}\n center={[centerX, tabY, bodyTop + tabHeight / 2]}\n />\n {/* Cylinder is Z-axis only in lib/vanilla, and a `rotation` prop on\n a primitive is IGNORED there — so the hole has to be turned by a\n <Rotate> wrapper, which both renderers honour. */}\n <Rotate rotation={[\"90deg\", 0, 0]}>\n <Translate center={[centerX, holeZ, -tabY]}>\n <Cylinder\n radius={mountingHoleDiameter / 2}\n height={tabThickness * 3}\n />\n </Translate>\n </Rotate>\n </Subtract>\n </Colorize>\n\n {leads.map((lead) => (\n <Colorize color={leadColor} key={`lead-${lead.x}-${lead.y}`}>\n <Cuboid\n size={[leadWidth, leadThickness, standoff + leadLength]}\n center={[lead.x, lead.y, (standoff - leadLength) / 2]}\n />\n </Colorize>\n ))}\n </>\n )\n}\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOT457 = () => {\n const fullWidth = 2.8\n const bodyWidth = 1.6\n const bodyLength = 2.9\n const bodyHeight = 1.2\n const leadWidth = 0.4\n const leadThickness = 0.15\n const leadHeight = 0.95\n const padContactLength = 0.5\n const padPitch = 0.95\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = fullWidth - bodyWidth\n\n return (\n <>\n {/* Leads on the right side (pins 1 and 2) */}\n <SmdChipLead\n key={1}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: -padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n <SmdChipLead\n key={3}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the left side (pin 3) */}\n <SmdChipLead\n key={3}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: -padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n straightHeightRatio={0.6}\n notchPosition={{\n x: -(bodyWidth / 2 - 0.4),\n y: bodyHeight / 2 + 0.4,\n z: bodyHeight + 0.05,\n }}\n notchRadius={0.1}\n />\n </>\n )\n}\n\nexport default SOT457\n","import { Cuboid } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\n\nexport const SOT963 = () => {\n const bodyWidth = 0.8\n const bodyLength = 1.0\n const bodyHeight = 0.37\n const terminalWidth = 0.15\n const terminalLength = 0.19\n const terminalThickness = 0.12\n const pitch = 0.35\n const pinsPerSide = 3\n const pinSpan = pitch * (pinsPerSide - 1)\n\n return (\n <>\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n heightAboveSurface={0}\n color=\"#1a1a1a\"\n taperRatio={0.15}\n straightHeightRatio={0}\n notchPosition={{\n x: -bodyWidth / 4,\n y: pinSpan / 2.2,\n z: bodyHeight + 0.1,\n }}\n />\n\n {[0, 1, 2].map((i) => {\n const y = -pinSpan / 2 + i * pitch\n return (\n <Cuboid\n key={`left-${i}`}\n center={[\n -bodyWidth / 2 + terminalLength / 2 - 0.1,\n y,\n terminalThickness / 2,\n ]}\n size={[terminalLength, terminalWidth, terminalThickness]}\n />\n )\n })}\n\n {[0, 1, 2].map((i) => {\n const y = -pinSpan / 2 + i * pitch\n return (\n <Cuboid\n key={`right-${i}`}\n center={[\n bodyWidth / 2 - terminalLength / 2 + 0.1,\n y,\n terminalThickness / 2,\n ]}\n size={[terminalLength, terminalWidth, terminalThickness]}\n />\n )\n })}\n </>\n )\n}\n\nexport default SOT963\n","import {\n Colorize,\n Cuboid,\n Hull,\n Translate,\n Cylinder,\n Subtract,\n} from \"jscad-fiber\"\n\nexport interface TO92Lead {\n x: number\n y: number\n}\n\nexport interface TO92Props {\n /**\n * Diameter of the round body. TO-92 comes in more than one size — `to92l`\n * is 4.8mm across, `to92s` 2.5mm — and the difference is the whole reason\n * these are separate footprints, so it must not be baked in.\n */\n bodyDiameter?: number\n bodyHeight?: number\n /** Depth of the flat cut across the cylinder. */\n flatCut?: number\n /**\n * Where the leads meet the board, taken from the footprint's plated holes.\n *\n * The pattern differs per footprint and cannot be inferred from the pitch:\n * `to92` sets its middle pin 1.27mm behind the outer two, `to92s` puts all\n * three in a row, and `to92l` places pin 1 at the origin so the group is not\n * centred at all. Defaults to `to92`'s pattern.\n */\n leads?: TO92Lead[]\n /**\n * Gap between the board and the underside of the moulded body — the leads\n * are formed in it.\n */\n standoff?: number\n /** How far the leads run below the board. */\n leadLength?: number\n bodyColor?: string\n}\n\nconst TO92_DEFAULT_LEADS: TO92Lead[] = [\n { x: -1.27, y: 0.98 },\n { x: 0, y: 2.25 },\n { x: 1.27, y: 0.98 },\n]\n\n/** The two leads furthest apart, and whatever is between them. */\nconst splitOuterLeads = (leads: TO92Lead[]) => {\n let outer: [TO92Lead, TO92Lead] = [leads[0]!, leads[leads.length - 1]!]\n let best = -1\n for (let i = 0; i < leads.length; i++) {\n for (let j = i + 1; j < leads.length; j++) {\n const separation = Math.hypot(\n leads[i]!.x - leads[j]!.x,\n leads[i]!.y - leads[j]!.y,\n )\n if (separation > best) {\n best = separation\n outer = [leads[i]!, leads[j]!]\n }\n }\n }\n return { outer, separation: best }\n}\n\n/**\n * TO-92.\n *\n * Seated and aligned from the footprint: the body is centred on the two outer\n * leads, starts `standoff` above the board and ends `bodyHeight` higher, and\n * every lead is formed from its own hole up to a row of exit points under the\n * body. It used to be translated 10.5mm up with 15mm leads on a hardcoded\n * pattern, which measured 19.5mm end to end for a 4.5mm part and only lined up\n * with one of the three TO-92 footprints.\n */\nexport const TO92 = ({\n bodyDiameter = 4.8,\n bodyHeight = 4.5,\n flatCut = 1.1,\n leads = TO92_DEFAULT_LEADS,\n standoff = 1.5,\n leadLength = 3,\n bodyColor = \"#222\",\n}: TO92Props = {}) => {\n const bodyRadius = bodyDiameter / 2\n const legWidth = 0.4\n const legThickness = 0.25\n\n const { outer, separation } = splitOuterLeads(leads)\n const [first, last] = outer\n const bodyCenter = {\n x: (first.x + last.x) / 2,\n y: (first.y + last.y) / 2,\n }\n\n // The leads leave the body base in a straight row along the outer-lead axis,\n // then splay to wherever their hole is. That is how a formed TO-92 is built,\n // and it makes the middle lead's bend fall out of the hole position rather\n // than being a constant.\n const axisLength = Math.max(separation, 0.001)\n const axis = {\n x: (last.x - first.x) / axisLength,\n y: (last.y - first.y) / axisLength,\n }\n const exitPitch = separation / 2\n const exitFor = (index: number) => {\n const offset = (index - (leads.length - 1) / 2) * exitPitch\n return {\n x: bodyCenter.x + axis.x * offset,\n y: bodyCenter.y + axis.y * offset,\n }\n }\n\n const leadSize: [number, number, number] = [\n legThickness,\n legWidth,\n legThickness,\n ]\n\n return (\n <>\n <Colorize color={bodyColor}>\n <Subtract>\n <Translate\n center={[bodyCenter.x, bodyCenter.y, standoff + bodyHeight / 2]}\n >\n <Cylinder radius={bodyRadius} height={bodyHeight} />\n </Translate>\n <Translate\n center={[\n bodyCenter.x,\n bodyCenter.y - (bodyRadius - flatCut / 2),\n standoff + bodyHeight / 2,\n ]}\n >\n <Cuboid size={[bodyRadius * 2, flatCut, bodyHeight + 0.2]} />\n </Translate>\n </Subtract>\n </Colorize>\n\n {leads.map((lead, index) => {\n const exit = exitFor(index)\n return (\n <Translate center={[0, 0, 0]} key={`lead-${lead.x}-${lead.y}`}>\n {/* formed section, from the hole up into the body base */}\n <Hull>\n <Translate center={[lead.x, lead.y, 0]}>\n <Cuboid size={leadSize} />\n </Translate>\n <Translate center={[exit.x, exit.y, standoff]}>\n <Cuboid size={leadSize} />\n </Translate>\n </Hull>\n {/* straight section, through the board and below it */}\n <Translate center={[lead.x, lead.y, -leadLength / 2]}>\n <Cuboid size={[legThickness, legWidth, leadLength]} />\n </Translate>\n </Translate>\n )\n })}\n </>\n )\n}\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOT363 = () => {\n const fullWidth = 2\n const bodyWidth = 1.25\n const bodyLength = 2\n const bodyHeight = 1.1\n const leadWidth = 0.25\n const leadThickness = 0.15\n const leadHeight = 0.85\n const padContactLength = 0.3\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = fullWidth - bodyWidth\n\n return (\n <>\n {/* Leads on the right side (pins 1 and 2) */}\n <SmdChipLead\n key={1}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: -0.65,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n <SmdChipLead\n key={3}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: 0.65,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the left side (pin 3) */}\n <SmdChipLead\n key={3}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: -0.65,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: 0.65,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n straightHeightRatio={0.6}\n notchPosition={{\n x: -(bodyWidth / 2 - 0.25),\n y: bodyHeight / 2 + 0.2,\n z: bodyHeight,\n }}\n heightAboveSurface={0.1}\n />\n </>\n )\n}\n\nexport default SOT363\n","import { Cuboid } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\n\nexport const SOT886 = () => {\n const bodyWidth = 1.0\n const bodyLength = 1.45\n const bodyHeight = 0.5\n const terminalWidth = 0.2\n const terminalLength = 0.3\n const terminalThickness = 0.05\n const pitch = 0.5\n const pinsPerSide = 3\n const pinSpan = pitch * (pinsPerSide - 1)\n\n return (\n <>\n <ChipBody\n center={{ x: 0, y: 0, z: terminalThickness }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n heightAboveSurface={0}\n color=\"#1a1a1a\"\n taperRatio={0}\n includeNotch={false}\n />\n\n {[0, 1, 2].map((i) => {\n const y = -pinSpan / 2 + i * pitch\n return (\n <Cuboid\n key={`left-${i}`}\n center={[\n -bodyWidth / 2 + terminalLength / 2,\n y,\n terminalThickness / 2,\n ]}\n size={[terminalLength, terminalWidth, terminalThickness]}\n />\n )\n })}\n\n {[0, 1, 2].map((i) => {\n const y = -pinSpan / 2 + i * pitch\n return (\n <Cuboid\n key={`right-${i}`}\n center={[\n bodyWidth / 2 - terminalLength / 2,\n y,\n terminalThickness / 2,\n ]}\n size={[terminalLength, terminalWidth, terminalThickness]}\n />\n )\n })}\n </>\n )\n}\n\nexport default SOT886\n","import { ChipBody } from \"./ChipBody\"\nimport { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOD323 = () => {\n const fullWidth = 2.5\n // Package outline for the designation, from KiCad's D_SOD-323 F.Fab layer\n // (the reference footprinter's own kicad-parity tests compare against).\n // Was 1.7 x 1.25, which is a SOD-323 about 15% too small across.\n const bodyLength = 1.4\n\n const bodyWidth = 1.8\n const bodyHeight = 0.95\n\n const leadWidth = 0.3\n const leadThickness = 0.175\n\n const padContactLength = 0.3\n\n const padCenterX = bodyWidth / 2\n\n const bodyDistance = 0.45\n const leadHeight = 0.7\n return (\n <>\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n\n <SmdChipLead\n key={1}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n includeNotch={false}\n taperRatio={0.06}\n straightHeightRatio={0.7}\n heightAboveSurface={0.05}\n />\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[bodyWidth / 3, bodyLength - 0.075, 0.02]}\n center={[(-padCenterX * 2) / 3 + 0.035, 0, bodyHeight + 0.05]}\n />\n </>\n )\n}\n\nexport default SOD323\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\n\nexport const SOD323F = () => {\n const fullWidth = 1.7\n const bodyLength = 1.25\n const bodyHeight = 0.725\n\n const padWidth = 0.325\n const padLength = 0.4\n const padThickness = 0.175\n\n const leftPadCenterX = -fullWidth / 2 - padLength / 2\n const rightPadCenterX = fullWidth / 2 + padLength / 2\n\n const taperOffset = 0.2\n const straightHeight = padThickness\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Union>\n {/* Middle straight section */}\n <Translate z={straightHeight / 2}>\n <Cuboid size={[fullWidth, bodyLength, straightHeight]} />\n </Translate>\n\n {/* Top taper section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[fullWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[fullWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[fullWidth / 3, bodyLength - taperOffset, 0.02]}\n center={[leftPadCenterX + fullWidth / 4.4 + taperOffset, 0, bodyHeight]}\n />\n </>\n )\n}\n\nexport default SOD323F\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\n\nexport const SOD323FL = () => {\n const fullWidth = 1.775\n const bodyLength = 1.25\n const bodyHeight = 0.725\n\n const padWidth = 0.325\n const padLength = 0.4\n const padThickness = 0.13\n\n const leftPadCenterX = -fullWidth / 2 - padLength / 2 + 0.04\n const rightPadCenterX = fullWidth / 2 + padLength / 2 - 0.04\n\n const taperOffset = 0.2\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <ChipBody\n width={fullWidth}\n length={bodyLength}\n height={bodyHeight}\n center={{ x: 0, y: 0, z: 0 }}\n heightAboveSurface={0}\n straightHeightRatio={0.7}\n taperRatio={0.06}\n includeNotch={false}\n />\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[fullWidth / 3, bodyLength - 0.05, 0.02]}\n center={[leftPadCenterX + fullWidth / 4.4 + taperOffset, 0, bodyHeight]}\n />\n </>\n )\n}\n\nexport default SOD323FL\n","import { Colorize, Cylinder, Rotate, Sphere, Translate } from \"jscad-fiber\"\n\ninterface AxialCapacitorProps {\n pitch: number\n}\n\nexport const AxialCapacitor = ({ pitch = 10 }: AxialCapacitorProps) => {\n const heightToCenterOfCapacitor = 0.5 + 4 / 2\n\n return (\n <>\n <Cylinder height={4} radius={0.5} center={[-pitch / 2, 0, 0.5]} />\n <Sphere\n radius={0.5}\n center={[-pitch / 2, 0, heightToCenterOfCapacitor]}\n />\n <Translate x={-2.5} y={0} z={heightToCenterOfCapacitor}>\n <Rotate rotation={[0, Math.PI / 2, 0]}>\n <Cylinder\n height={pitch}\n radius={0.5}\n center={[0, 0, heightToCenterOfCapacitor]}\n />\n <Colorize color=\"#d2b48c\">\n <Cylinder\n height={5}\n radius={1.3}\n center={[0, 0, heightToCenterOfCapacitor]}\n />\n </Colorize>\n </Rotate>\n </Translate>\n <Cylinder height={4} radius={0.5} center={[pitch / 2, 0, 0.5]} />\n <Sphere radius={0.5} center={[pitch / 2, 0, heightToCenterOfCapacitor]} />\n </>\n )\n}\n","import { Colorize, Cuboid, Cylinder, Subtract, Union } from \"jscad-fiber\"\n\nexport const StampBoard = ({\n bodyWidth = 21,\n boardThickness = 0.5,\n leadWidth = 1.6,\n leadLength = 2.4,\n leadsPitch = 2.54,\n leadsLeft,\n leadsRight,\n leadsTop,\n leadsBottom,\n innerHoles = true,\n innerHoleEdgeDistance = 1.61,\n innerHoleDiameter = 1,\n}: {\n bodyWidth?: number\n boardThickness?: number\n leadWidth?: number\n leadLength?: number\n leadsPitch?: number\n leadsLeft?: number\n leadsRight?: number\n leadsTop?: number\n leadsBottom?: number\n innerHoles?: boolean\n innerHoleEdgeDistance?: number\n innerHoleDiameter?: number\n}) => {\n const halfBoardWidth = bodyWidth / 2\n const boardCenterZ = boardThickness / 2\n const boardHeight = boardThickness * 1.05\n const holeRadius = innerHoleDiameter / 2\n const bodyLength =\n Math.max(leadsLeft || 0, leadsRight || 0, leadsTop || 0, leadsBottom || 0) *\n leadsPitch || 51\n\n const pads: { x: number; y: number; pl: number; pw: number }[] = []\n const holes: { x: number; y: number }[] = []\n\n if (leadsRight) {\n const yOffset = -((leadsRight - 1) / 2) * leadsPitch\n for (let i = 0; i < leadsRight; i++) {\n const y = yOffset + i * leadsPitch\n pads.push({\n x: halfBoardWidth - leadLength / 2,\n y: -y, // Flip y\n pl: leadLength,\n pw: leadWidth,\n })\n if (innerHoles) {\n holes.push(\n { x: halfBoardWidth, y: -y },\n { x: halfBoardWidth - innerHoleEdgeDistance, y: -y },\n )\n }\n }\n }\n\n if (leadsLeft) {\n const yOffset = -((leadsLeft - 1) / 2) * leadsPitch\n for (let i = 0; i < leadsLeft; i++) {\n const y = yOffset + i * leadsPitch\n pads.push({\n x: -halfBoardWidth + leadLength / 2,\n y: -y, // Flip y\n pl: leadLength,\n pw: leadWidth,\n })\n if (innerHoles) {\n holes.push(\n { x: -halfBoardWidth, y: -y },\n { x: -halfBoardWidth + innerHoleEdgeDistance, y: -y },\n )\n }\n }\n }\n\n if (leadsTop) {\n const xOffset = -((leadsTop - 1) / 2) * leadsPitch\n for (let i = 0; i < leadsTop; i++) {\n const x = xOffset + i * leadsPitch\n pads.push({\n x: -x, // Flip x\n y: bodyLength / 2 - leadLength / 2,\n pl: leadWidth,\n pw: leadLength,\n })\n if (innerHoles) {\n holes.push(\n { x: -x, y: bodyLength / 2 },\n { x: -x, y: bodyLength / 2 - innerHoleEdgeDistance },\n )\n }\n }\n }\n\n if (leadsBottom) {\n const xOffset = -((leadsBottom - 1) / 2) * leadsPitch\n for (let i = 0; i < leadsBottom; i++) {\n const x = xOffset + i * leadsPitch\n pads.push({\n x: -x, // Flip x\n y: -bodyLength / 2 + leadLength / 2,\n pl: leadWidth,\n pw: leadLength,\n })\n if (innerHoles) {\n holes.push(\n { x: -x, y: -bodyLength / 2 },\n { x: -x, y: -bodyLength / 2 + innerHoleEdgeDistance },\n )\n }\n }\n }\n\n const boardBody = (\n <Colorize color=\"#051a0a\">\n <Subtract>\n <Cuboid\n center={[0, 0, boardCenterZ]}\n size={[bodyWidth, bodyLength, boardThickness]}\n />\n {pads.map((pad, index) => (\n <Cuboid\n key={index}\n center={[pad.x, pad.y, boardCenterZ]}\n size={[pad.pl + 0.01, pad.pw + 0.01, boardHeight]}\n />\n ))}\n </Subtract>\n </Colorize>\n )\n\n const holePads =\n innerHoles &&\n holes.map((hole, index) => (\n <Cylinder\n key={index}\n color=\"black\"\n center={[hole.x, hole.y, boardCenterZ]}\n radius={holeRadius}\n height={boardThickness * 1.07}\n />\n ))\n\n const rectPads = pads.map((pad, index) => (\n <Cuboid\n key={index}\n center={[pad.x, pad.y, boardCenterZ]}\n size={[pad.pl + 0.01, pad.pw + 0.01, boardHeight]}\n />\n ))\n return (\n <>\n {boardBody}\n <Colorize color=\"#FFD700\">\n {innerHoles ? (\n <Subtract>\n <Union>\n {pads.map((pad, index) => (\n <Cuboid\n key={index}\n center={[pad.x, pad.y, boardCenterZ]}\n size={[pad.pl + 0.01, pad.pw + 0.01, boardHeight]}\n />\n ))}\n </Union>\n {holePads}\n </Subtract>\n ) : (\n rectPads\n )}\n </Colorize>\n </>\n )\n}\n\nexport default StampBoard\n","import { Colorize, Cuboid, Cylinder, Subtract } from \"jscad-fiber\"\nimport { PinHeader } from \"./PinHeader\"\nimport { FemaleHeader } from \"./FemaleHeader\"\nimport { Screen } from \"./Screen\"\n\nexport const MountedPcbModule = ({\n numPins = 5,\n rows = 1,\n p = 2.54,\n id = 1.0,\n od = 1.5,\n boardThickness = 1.6,\n width,\n height,\n pinRowSide = \"left\",\n holes = [],\n holeInset = 1.0,\n pinRowHoleEdgeToEdgeDist = 2.0,\n female,\n nopin,\n screen,\n screenWidth,\n screenHeight,\n screenCenterOffsetX,\n screenCenterOffsetY,\n}: {\n numPins?: number\n rows?: number\n p?: number\n id?: number\n od?: number\n boardThickness?: number\n width?: number | string\n height?: number | string\n pinRowSide?: \"left\" | \"right\" | \"top\" | \"bottom\"\n holes?: string[]\n holeInset?: number\n pinRowHoleEdgeToEdgeDist?: number\n female?: boolean\n nopin?: boolean\n screen?: boolean\n screenWidth?: number\n screenHeight?: number\n screenCenterOffsetX?: number\n screenCenterOffsetY?: number\n}) => {\n const showScreen = screen ?? false\n const boardCenterZ = boardThickness / 2\n const numPinsPerRow = Math.ceil(numPins / rows)\n\n // Calculate width and height if not provided\n let calculatedWidth: number\n let calculatedHeight: number\n if (pinRowSide === \"left\" || pinRowSide === \"right\") {\n calculatedWidth = (rows - 1) * p + 2 * pinRowHoleEdgeToEdgeDist\n calculatedHeight = (numPinsPerRow - 1) * p + 2 * pinRowHoleEdgeToEdgeDist\n } else {\n calculatedHeight = (rows - 1) * p + 2 * pinRowHoleEdgeToEdgeDist\n calculatedWidth = (numPinsPerRow - 1) * p + 2 * pinRowHoleEdgeToEdgeDist\n }\n if (numPins === 0) {\n calculatedWidth = 10\n calculatedHeight = 10\n }\n const finalWidth = Number(width ?? calculatedWidth)\n const finalHeight = Number(height ?? calculatedHeight)\n\n // Calculate pin positions\n const pins: { x: number; y: number }[] = []\n let pinStartX = 0\n let pinStartY = 0\n let pinDirectionX = 0\n let pinDirectionY = 0\n let rowDirectionX = 0\n let rowDirectionY = 0\n\n if (pinRowSide === \"left\" || pinRowSide === \"right\") {\n pinStartX =\n pinRowSide === \"left\"\n ? -finalWidth / 2 + pinRowHoleEdgeToEdgeDist\n : finalWidth / 2 - pinRowHoleEdgeToEdgeDist\n pinStartY = -((numPinsPerRow - 1) / 2) * p\n pinDirectionX = 0\n pinDirectionY = p\n rowDirectionX = pinRowSide === \"left\" ? p : -p\n rowDirectionY = 0\n } else {\n pinStartX = -((numPinsPerRow - 1) / 2) * p\n pinStartY =\n pinRowSide === \"top\"\n ? finalHeight / 2 - pinRowHoleEdgeToEdgeDist\n : -finalHeight / 2 + pinRowHoleEdgeToEdgeDist\n pinDirectionX = p\n pinDirectionY = 0\n rowDirectionX = 0\n rowDirectionY = pinRowSide === \"top\" ? -p : p\n }\n\n let pinNumber = 0\n for (let row = 0; row < rows && pinNumber < numPins; row++) {\n for (let col = 0; col < numPinsPerRow && pinNumber < numPins; col++) {\n const x = pinStartX + col * pinDirectionX + row * rowDirectionX\n const y = pinStartY + col * pinDirectionY + row * rowDirectionY\n pins.push({ x, y })\n pinNumber++\n }\n }\n\n // Calculate hole positions\n const holePositions: { x: number; y: number }[] = []\n if (holes) {\n for (const pos of holes) {\n let hx = 0\n let hy = 0\n if (pos === \"topleft\") {\n hx = -finalWidth / 2 + holeInset\n hy = finalHeight / 2 - holeInset\n } else if (pos === \"topright\") {\n hx = finalWidth / 2 - holeInset\n hy = finalHeight / 2 - holeInset\n } else if (pos === \"bottomleft\") {\n hx = -finalWidth / 2 + holeInset\n hy = -finalHeight / 2 + holeInset\n } else if (pos === \"bottomright\") {\n hx = finalWidth / 2 - holeInset\n hy = -finalHeight / 2 + holeInset\n } else if (pos === \"center\") {\n hx = 0\n hy = 0\n }\n holePositions.push({ x: hx, y: hy })\n }\n }\n // Recreated pin row geometry (local copy to avoid PinRow dependency)\n const pinThickness = 0.63\n const pinBodyHeight = 2\n const longSidePinLength = 6\n const shortSidePinLength = 3\n const boardOffsetZ = nopin || female ? 0 : pinBodyHeight\n const boardTopZ = boardOffsetZ + boardThickness\n // Board body with holes subtracted\n const boardBody = (\n <Colorize color=\"#008080\">\n <Subtract>\n <Cuboid\n center={[0, 0, boardCenterZ + boardOffsetZ]}\n size={[finalWidth, finalHeight, boardThickness]}\n />\n {holePositions.map((hole, index) => (\n <Cylinder\n key={`hole-${index}`}\n center={[hole.x, hole.y, boardCenterZ + boardOffsetZ]}\n radius={od / 2}\n height={boardThickness}\n />\n ))}\n {pins.map((pin, index) => (\n <Cylinder\n key={`pin-hole-${index}`}\n center={[pin.x, pin.y, boardCenterZ + boardOffsetZ]}\n radius={od / 2}\n height={boardThickness}\n />\n ))}\n </Subtract>\n </Colorize>\n )\n\n // Plated through-holes\n const platedHoles = pins.map((pin, index) => (\n <Colorize key={`pin-${index}`} color=\"#FFD700\">\n <Subtract>\n <Cylinder\n center={[pin.x, pin.y, boardThickness / 2 + boardOffsetZ]}\n radius={od / 2}\n height={boardThickness}\n />\n <Cylinder\n center={[pin.x, pin.y, boardThickness / 2 + boardOffsetZ]}\n radius={id / 2}\n height={boardThickness}\n />\n </Subtract>\n </Colorize>\n ))\n\n const headerPins = pins.map((pin, index) => (\n <PinHeader\n key={`pin-3d-${index}`}\n x={pin.x}\n y={pin.y}\n pinThickness={pinThickness}\n shortSidePinLength={shortSidePinLength}\n longSidePinLength={longSidePinLength}\n bodyHeight={pinBodyHeight}\n flipZ={(z: number) => z}\n />\n ))\n\n const femaleHeaderRow = pins.map((pin, index) => (\n <FemaleHeader\n key={`female-pin-3d-${index}`}\n x={pin.x}\n y={pin.y}\n flipZ={(z: number) => -z}\n />\n ))\n\n return (\n <>\n {boardBody}\n {platedHoles}\n {!female && !nopin && headerPins}\n {female && femaleHeaderRow}\n {showScreen && (\n <Screen\n width={screenWidth ?? finalWidth * 0.8}\n height={screenHeight ?? finalHeight * 0.6}\n offset={{\n x: screenCenterOffsetX ?? 0,\n y: screenCenterOffsetY ?? 0,\n z: boardTopZ,\n }}\n />\n )}\n </>\n )\n}\n\nexport default MountedPcbModule\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD723 = () => {\n const fullWidth = 1.4\n const bodyLength = 0.6\n const bodyHeight = 0.5\n\n const padWidth = 0.28\n const padLength = 0.5\n const padThickness = 0.12\n\n const bodyWidth = fullWidth - padLength\n const leftPadCenterX = -bodyWidth / 2 + padLength / 2 - 0.15 // 0.15 is the distance between the pad and the body as datasheet\n const rightPadCenterX = bodyWidth / 2 - padLength / 2 + 0.15 // 0.15 is the distance between the pad and the body as datasheet\n\n // top taper happens only in last quarter\n const taperOffset = 0.2\n const straightHeight = bodyHeight * 0.24\n\n // Body geometry\n // - straightHeight: the lower (straight) portion of the body\n // - taperOffset: how much smaller the top of the body becomes\n\n return (\n <>\n {/* Pads */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body (lifted above pads) */}\n <Colorize color=\"#222\">\n <Union>\n {/* Straight bottom section */}\n <Translate z={straightHeight / 2}>\n <Cuboid size={[bodyWidth, bodyLength, straightHeight]} />\n </Translate>\n\n {/* Tapered top quarter */}\n <Hull>\n {/* bottom of taper (same size as straight section top) */}\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n\n {/* top of taper (smaller) */}\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[fullWidth / 6, bodyLength - taperOffset, 0.02]}\n center={[-bodyWidth / 4, 0, bodyHeight]}\n />\n </>\n )\n}\n\nexport default SOD723\n","import { componentMaterials } from \"./materials\"\nimport {\n Colorize,\n Cuboid,\n Cylinder,\n Rotate,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\nimport type { PcbPlatedHole } from \"circuit-json\"\nimport { FootprintPlatedHole } from \"./FootprintPlatedHole\"\n\ninterface JSTZH1_5mmProps {\n numPins?: number\n showPins?: boolean\n showFootprint?: boolean\n bodyColor?: string\n pinColor?: string\n}\n\nexport const JSTZH1_5mm = ({\n numPins = 7,\n showPins = true,\n showFootprint = true,\n bodyColor = \"#f5f5f5\",\n pinColor = \"#635959\",\n}: JSTZH1_5mmProps) => {\n const pitch = 1.5\n const bodyHeight = 6\n const bodyDepth = 3.5\n const wallThickness = 0.5\n const hollowHeight = bodyHeight * 0.6\n const pinLength = 6\n const bodyWidth = (numPins - 1) * pitch + 4\n const startX = -((numPins - 1) * pitch) / 2\n\n return (\n <>\n <Translate offset={[0, 0, bodyHeight]}>\n <Rotate angles={[Math.PI, 0, 0]}>\n <Colorize\n material={componentMaterials.moldedPlastic}\n color={bodyColor}\n >\n <Subtract>\n <Cuboid\n size={[bodyWidth, bodyDepth, bodyHeight]}\n center={[0, 0, bodyHeight / 2]}\n />\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n bodyDepth - wallThickness * 2,\n hollowHeight,\n ]}\n center={[0, 0, hollowHeight / 2]}\n />\n <Cuboid\n size={[bodyWidth, bodyDepth / 3, hollowHeight]}\n center={[0, 0, hollowHeight / 6]}\n />\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n wallThickness / 2,\n hollowHeight,\n ]}\n center={[\n 0,\n bodyDepth / 2 - wallThickness / 4,\n hollowHeight / 2,\n ]}\n />\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n wallThickness / 2,\n hollowHeight,\n ]}\n center={[\n 0,\n -bodyDepth / 2 + wallThickness / 4,\n hollowHeight / 2,\n ]}\n />\n <Cuboid\n size={[1, wallThickness + 2, 1]}\n center={[-bodyWidth / 4, bodyDepth / 2, bodyHeight / 2]}\n />\n <Cuboid\n size={[1, wallThickness + 3, 1]}\n center={[bodyWidth / 4, bodyDepth / 2, bodyHeight / 2]}\n />\n <Cuboid\n size={[1, wallThickness + 2, 1]}\n center={[-bodyWidth / 4, -bodyDepth / 2, bodyHeight / 2]}\n />\n <Cuboid\n size={[1, wallThickness + 3, 1]}\n center={[bodyWidth / 4, -bodyDepth / 2, bodyHeight / 2]}\n />\n </Subtract>\n </Colorize>\n </Rotate>\n </Translate>\n\n {showPins &&\n Array.from({ length: numPins }).map((_, i) => (\n <Colorize\n key={i}\n material={componentMaterials.tinnedLead}\n color={pinColor}\n >\n <Cylinder\n height={pinLength}\n radius={0.35}\n center={[startX + i * pitch, 0, 2.5]}\n />\n </Colorize>\n ))}\n\n {showFootprint &&\n Array.from({ length: numPins }).map((_, i) => {\n const isPin1 = i === 0\n const hole: PcbPlatedHole = isPin1\n ? {\n type: \"pcb_plated_hole\",\n pcb_plated_hole_id: `jstzh_${i}`,\n shape: \"circular_hole_with_rect_pad\",\n x: startX + i * pitch,\n y: 0,\n hole_diameter: 0.73,\n hole_offset_x: 0,\n hole_offset_y: 0,\n rect_pad_width: 1.03,\n rect_pad_height: 1.73,\n hole_shape: \"circle\",\n pad_shape: \"rect\",\n layers: [\"top\", \"bottom\"],\n port_hints: [`${i + 1}`],\n }\n : {\n type: \"pcb_plated_hole\",\n pcb_plated_hole_id: `jstzh_${i}`,\n shape: \"pill\",\n ccw_rotation: 0,\n x: startX + i * pitch,\n y: 0,\n hole_height: 0.73,\n hole_width: 0.73,\n outer_height: 1.73,\n outer_width: 1.03,\n layers: [\"top\", \"bottom\"],\n port_hints: [`${i + 1}`],\n }\n return (\n <FootprintPlatedHole\n key={`footprint_${i}`}\n hole={hole}\n isPin1={isPin1}\n />\n )\n })}\n </>\n )\n}\n\nexport default JSTZH1_5mm\n","import { componentMaterials } from \"./materials\"\nimport type { PcbPlatedHole } from \"circuit-json\"\nimport {\n Colorize,\n Cuboid,\n Cylinder,\n Rotate,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\nimport { FootprintPlatedHole } from \"./FootprintPlatedHole\"\n\ninterface JSTPH2_0mmProps {\n numPins?: number\n showPins?: boolean\n showFootprint?: boolean\n bodyColor?: string\n pinColor?: string\n}\n\nexport const JSTPH2_0mm = ({\n numPins = 2,\n showPins = true,\n showFootprint = true,\n bodyColor = \"#f5f5f5\",\n pinColor = \"#635959\",\n}: JSTPH2_0mmProps) => {\n const pitch = 2.0\n // BxB-PH-K-S top-entry through-hole header dimensions from the JST drawing.\n const bodyHeight = 6\n const bodyDepth = 4.5\n const wallThickness = 0.5\n const hollowHeight = bodyHeight * 0.6\n const pinTailLength = 3.4\n const pinTop = 5.5\n // JST specifies a 0.5 mm square post for the through-hole header.\n const pinThickness = 0.5\n const pinLength = pinTailLength + pinTop\n const bodyWidth = (numPins - 1) * pitch + 3.9\n const startX = -((numPins - 1) * pitch) / 2\n const latchWindowWidth = 1\n const latchWindowHeight = 1.8\n const latchWindowInset = 0.7\n const topReliefWidth = 0.8\n const topReliefDepth = 0.65\n\n return (\n <>\n <Translate offset={[0, 0, bodyHeight]}>\n <Rotate angles={[Math.PI, 0, 0]}>\n <Colorize\n color={bodyColor}\n material={componentMaterials.moldedPlastic}\n >\n <Subtract>\n <Cuboid\n size={[bodyWidth, bodyDepth, bodyHeight]}\n center={[0, 0, bodyHeight / 2]}\n />\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n bodyDepth - wallThickness * 2,\n hollowHeight,\n ]}\n center={[0, 0, hollowHeight / 2]}\n />\n <Cuboid\n size={[bodyWidth, bodyDepth / 3, hollowHeight]}\n center={[0, 0, hollowHeight / 6]}\n />\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n wallThickness / 2,\n hollowHeight,\n ]}\n center={[\n 0,\n bodyDepth / 2 - wallThickness / 4,\n hollowHeight / 2,\n ]}\n />\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n wallThickness / 2,\n hollowHeight,\n ]}\n center={[\n 0,\n -bodyDepth / 2 + wallThickness / 4,\n hollowHeight / 2,\n ]}\n />\n <Cuboid\n size={[\n latchWindowWidth,\n bodyDepth + wallThickness,\n latchWindowHeight,\n ]}\n center={[-bodyWidth / 2 + latchWindowInset, 0, bodyHeight / 2]}\n />\n <Cuboid\n size={[\n latchWindowWidth,\n bodyDepth + wallThickness,\n latchWindowHeight,\n ]}\n center={[bodyWidth / 2 - latchWindowInset, 0, bodyHeight / 2]}\n />\n <Cuboid\n size={[wallThickness * 3, topReliefWidth, topReliefDepth]}\n center={[-bodyWidth / 2, 0, topReliefDepth / 2]}\n />\n <Translate offset={[-bodyWidth / 2, 0, topReliefDepth]}>\n <Rotate angles={[0, Math.PI / 2, 0]}>\n <Cylinder\n height={wallThickness * 3}\n radius={topReliefWidth / 2}\n />\n </Rotate>\n </Translate>\n <Cuboid\n size={[wallThickness * 3, topReliefWidth, topReliefDepth]}\n center={[bodyWidth / 2, 0, topReliefDepth / 2]}\n />\n <Translate offset={[bodyWidth / 2, 0, topReliefDepth]}>\n <Rotate angles={[0, Math.PI / 2, 0]}>\n <Cylinder\n height={wallThickness * 3}\n radius={topReliefWidth / 2}\n />\n </Rotate>\n </Translate>\n </Subtract>\n </Colorize>\n </Rotate>\n </Translate>\n\n {showPins &&\n Array.from({ length: numPins }).map((_, i) => (\n <Colorize\n key={i}\n color={pinColor}\n material={componentMaterials.tinnedLead}\n >\n <Cuboid\n size={[pinThickness, pinThickness, pinLength]}\n center={[startX + i * pitch, 0, (pinTop - pinTailLength) / 2]}\n />\n </Colorize>\n ))}\n\n {showFootprint &&\n Array.from({ length: numPins }).map((_, i) => {\n const isPin1 = i === 0\n const hole: PcbPlatedHole = isPin1\n ? {\n type: \"pcb_plated_hole\",\n pcb_plated_hole_id: `jstph_${i}`,\n shape: \"circular_hole_with_rect_pad\",\n x: startX + i * pitch,\n y: 0,\n hole_diameter: 0.73,\n hole_offset_x: 0,\n hole_offset_y: 0,\n rect_pad_width: 1.2,\n rect_pad_height: 1.2,\n hole_shape: \"circle\",\n pad_shape: \"rect\",\n layers: [\"top\", \"bottom\"],\n port_hints: [`${i + 1}`],\n }\n : {\n type: \"pcb_plated_hole\",\n pcb_plated_hole_id: `jstph_${i}`,\n shape: \"pill\",\n ccw_rotation: 0,\n x: startX + i * pitch,\n y: 0,\n hole_height: 0.73,\n hole_width: 0.73,\n outer_height: 1.2,\n outer_width: 1.2,\n layers: [\"top\", \"bottom\"],\n port_hints: [`${i + 1}`],\n }\n return (\n <FootprintPlatedHole\n key={`footprint_${i}`}\n hole={hole}\n isPin1={isPin1}\n />\n )\n })}\n </>\n )\n}\n\nexport default JSTPH2_0mm\n","import { componentMaterials } from \"./materials\"\nimport { Colorize, Cuboid, Subtract, Translate } from \"jscad-fiber\"\nimport type { PcbPlatedHole } from \"circuit-json\"\nimport { fp } from \"@tscircuit/footprinter\"\nimport { FootprintPlatedHole } from \"./FootprintPlatedHole\"\n\nexport interface JSTXH2_5mmProps {\n numPins?: number\n showPins?: boolean\n showFootprint?: boolean\n bodyColor?: string\n pinColor?: string\n}\n\nexport const JSTXH2_5mm = ({\n numPins = 4,\n showPins = true,\n showFootprint = true,\n bodyColor = \"#f8fafc\", // Natural white PA 66 nylon housing per spec\n pinColor = \"#635959\", // Tin-plated metallic gray posts\n}: JSTXH2_5mmProps) => {\n // Official JST XH 2.50mm Top Entry Dimensions (per eXH.pdf B#B-XH-A)\n const pitch = 2.5\n const bodyHeight = 7.0\n const bodyDepth = 5.75\n const wallThickness = 0.85\n const floorThickness = 1.65\n const hollowHeight = bodyHeight - floorThickness\n const pinLength = 8.75\n const bodyWidth = (numPins - 1) * pitch + 4.9\n const startX = -((numPins - 1) * pitch) / 2\n\n // Keying slot positions (near left and right edges of front wall)\n const keySlotWidth = 0.8\n const keySlotDepth = wallThickness + 0.2\n const keySlotHeight = 3.5\n const keySlotX = bodyWidth / 2 - 1.3\n\n // Central locking notch width (scales with pin count per JST spec)\n const lockNotchWidth = Math.min(\n bodyWidth - 3.4,\n Math.max(3.0, (numPins - 1) * pitch * 0.4 + 2.2),\n )\n const lockNotchHeight = 2.4\n\n return (\n <>\n {/* 1. White Nylon Connector Housing */}\n <Translate offset={[0, 0, bodyHeight / 2]}>\n <Colorize material={componentMaterials.moldedPlastic} color={bodyColor}>\n <Subtract>\n {/* Outer Solid Block */}\n <Cuboid size={[bodyWidth, bodyDepth, bodyHeight]} />\n\n {/* Inner Socket Cavity (open at top) */}\n <Translate offset={[0, 0, (bodyHeight - hollowHeight) / 2 + 0.1]}>\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n bodyDepth - wallThickness * 2,\n hollowHeight + 0.2,\n ]}\n />\n </Translate>\n\n {/* Front Central Locking Notch (top of front wall) */}\n <Translate\n offset={[\n 0,\n -bodyDepth / 2 + wallThickness / 2,\n bodyHeight / 2 - lockNotchHeight / 2 + 0.1,\n ]}\n >\n <Cuboid\n size={[\n lockNotchWidth,\n wallThickness + 0.2,\n lockNotchHeight + 0.2,\n ]}\n />\n </Translate>\n\n {/* Left Vertical Keying Guide Slot (front wall) */}\n <Translate\n offset={[\n -keySlotX,\n -bodyDepth / 2 + wallThickness / 2,\n bodyHeight / 2 - keySlotHeight / 2 + 0.1,\n ]}\n >\n <Cuboid\n size={[keySlotWidth, keySlotDepth, keySlotHeight + 0.2]}\n />\n </Translate>\n\n {/* Right Vertical Keying Guide Slot (front wall) */}\n <Translate\n offset={[\n keySlotX,\n -bodyDepth / 2 + wallThickness / 2,\n bodyHeight / 2 - keySlotHeight / 2 + 0.1,\n ]}\n >\n <Cuboid\n size={[keySlotWidth, keySlotDepth, keySlotHeight + 0.2]}\n />\n </Translate>\n\n {/* Bottom Stand-off / Venting Slots along front bottom edge */}\n {Array.from({ length: numPins }).map((_, i) => (\n <Translate\n key={`vent_${i}`}\n offset={[\n startX + i * pitch,\n -bodyDepth / 2 + 0.3,\n -bodyHeight / 2 + 0.25,\n ]}\n >\n <Cuboid size={[1.0, 0.8, 0.5]} />\n </Translate>\n ))}\n </Subtract>\n </Colorize>\n </Translate>\n\n {/* 2. Metal Square Through-Hole Contact Pins (0.64mm square) */}\n {showPins &&\n Array.from({ length: numPins }).map((_, i) => (\n <Colorize\n key={i}\n material={componentMaterials.tinnedLead}\n color={pinColor}\n >\n <Translate offset={[startX + i * pitch, 0, pinLength / 2 - 3.4]}>\n <Cuboid size={[0.64, 0.64, pinLength]} />\n </Translate>\n </Colorize>\n ))}\n\n {/* 3. PCB Plated Through-Hole Footprint (Using @tscircuit/footprinter) */}\n {showFootprint &&\n (() => {\n try {\n const circuitJson = fp.string(`jst${numPins}_xh`).circuitJson()\n const platedHoles = circuitJson.filter(\n (e): e is PcbPlatedHole => e.type === \"pcb_plated_hole\",\n )\n return platedHoles.map((hole, i) => (\n <FootprintPlatedHole\n key={`footprint_${i}`}\n hole={hole}\n isPin1={i === 0}\n />\n ))\n } catch {\n return null\n }\n })()}\n </>\n )\n}\n\nexport default JSTXH2_5mm\n","import { componentMaterials } from \"./materials\"\nimport { fp } from \"@tscircuit/footprinter\"\nimport { mm } from \"@tscircuit/mm\"\nimport { Colorize, Cuboid, Rotate, Subtract, Union } from \"jscad-fiber\"\n\ntype ShParams = {\n fn: string\n sh?: boolean\n smd?: boolean\n p: number\n num_pins: number\n mpx?: number\n mpy?: number\n}\n/** A generic pad fit is SH only when its pitch AND hold-down layout agree. */\nexport function isJstShFootprint(footprint: string): boolean {\n const p = fp.string(footprint).json() as unknown as ShParams\n if (p.fn !== \"jst\") return false\n return Boolean(\n p.sh ||\n (p.smd &&\n Math.abs(mm(p.p) - 1) < 0.01 &&\n Math.abs(mm(p.mpx ?? 0) - (p.num_pins - 1 + 2.6)) < 0.15 &&\n Math.abs(mm(p.mpy ?? 0) - 2.525) < 0.15),\n )\n}\n\n/** JST SH BMxxB-SRSS-TB top-entry header, nominal dimensions from JST eSH.pdf. */\nexport const JstSh = ({ footprint = \"jst6_sh\" }: { footprint?: string }) => {\n if (!isJstShFootprint(footprint))\n throw new Error(\n \"JstSh requires a named SH or matching 1mm SH top-entry footprint\",\n )\n const canonical = footprint.replace(/_pin1location\\([^)]*\\)/g, \"\")\n const params = fp.string(canonical).json() as unknown as ShParams\n const pads = fp\n .string(canonical)\n .circuitJson()\n .filter((e) => e.type === \"pcb_smtpad\" && e.shape === \"rect\")\n const target = fp\n .string(footprint)\n .circuitJson()\n .filter(\n (e) =>\n e.type === \"pcb_smtpad\" &&\n (e.shape === \"rect\" || e.shape === \"rotated_rect\"),\n )\n const n = params.num_pins\n if (!Number.isInteger(n) || n < 2 || n > 20 || pads.length !== n + 2)\n throw new Error(\"JstSh requires 2–20 contacts and two hold-down pads\")\n const signals = pads.slice(0, n),\n mounts = pads.slice(n)\n const angle =\n Math.atan2(target[1]!.y - target[0]!.y, target[1]!.x - target[0]!.x) -\n Math.atan2(pads[1]!.y - pads[0]!.y, pads[1]!.x - pads[0]!.x)\n const x = signals.reduce((sum, p) => sum + p.x, 0) / n,\n rowY = signals[0]!.y\n const direction = mounts[0]!.y > rowY ? 1 : -1\n const y = rowY + direction * 1.8,\n width = n + 2,\n depth = 2.9,\n height = 4.2\n const pinY = y - direction * 0.25\n return (\n <Rotate rotation={[0, 0, angle]}>\n <Colorize material={componentMaterials.moldedPlastic} color=\"#e4e1d6\">\n <Subtract>\n <Cuboid\n size={[width, depth, height]}\n center={[x, y, height / 2 + 0.05]}\n />\n <Cuboid\n size={[width - 1.3, 1.8, height]}\n center={[x, y, height / 2 + 0.8]}\n />\n {mounts.map((pad, i) => (\n <Cuboid\n key={`recess-${i}`}\n size={[0.7, pad.height * 0.8, 1.5]}\n center={[pad.x, pad.y, 0.75]}\n />\n ))}\n {[-1, 1].map((side) => (\n <Cuboid\n key={side}\n size={[0.55, 0.6, 1]}\n center={[\n x + side * (width / 2 - 0.9),\n y + (direction * depth) / 2,\n 4,\n ]}\n />\n ))}\n </Subtract>\n </Colorize>\n <Colorize material={componentMaterials.tinnedLead} color=\"#c6c7c9\">\n {signals.map((pad, i) => {\n const tailY = pad.y - direction * pad.height * 0.4\n return (\n <Union key={i}>\n <Cuboid\n size={[0.2, Math.abs(pinY - tailY) + 0.1, 0.2]}\n center={[pad.x, (pinY + tailY) / 2, 0.1]}\n />\n <Cuboid size={[0.2, 0.2, 3.45]} center={[pad.x, pinY, 1.725]} />\n </Union>\n )\n })}\n {mounts.map((pad, i) => (\n <Union key={`mount-${i}`}>\n <Cuboid\n size={[0.7, pad.height * 0.75, 0.2]}\n center={[pad.x, pad.y, 0.1]}\n />\n <Cuboid\n size={[0.2, pad.height * 0.6, 1.35]}\n center={[pad.x, pad.y, 0.675]}\n />\n </Union>\n ))}\n </Colorize>\n </Rotate>\n )\n}\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n Rotate,\n RoundedCuboid,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\n\nexport interface FPCProps {\n pinCount?: number\n pitch?: number\n padWidth?: number\n padLength?: number\n staggered?: boolean\n reverse?: boolean\n rowPitch?: number\n topPadLength?: number\n bottomPadLength?: number\n mountPadPitchX?: number\n mountPadOffsetY?: number\n mountTop?: boolean\n mountPadWidth?: number\n mountPadLength?: number\n}\n\nconst HOUSING_COLOR = \"#303339\"\nconst HOUSING_SHADOW = \"#1f2227\"\nconst ACTUATOR_COLOR = \"#eee8d8\"\nconst ACTUATOR_HIGHLIGHT = \"#f8f3e7\"\nconst TIN_COLOR = \"#b7bdc2\"\nconst TIN_HIGHLIGHT = \"#d2d6d9\"\nconst HOLD_DOWN_COLOR = \"#767d82\"\nconst HOLD_DOWN_HIGHLIGHT = \"#9ba1a5\"\n\nexport const FPC = ({\n pinCount = 12,\n pitch = 0.5,\n padWidth = 0.3,\n padLength = 1.25,\n staggered = false,\n reverse = false,\n rowPitch = 2.4,\n topPadLength = padLength,\n bottomPadLength = padLength,\n mountPadPitchX,\n mountPadOffsetY = 2.575,\n mountTop = false,\n mountPadWidth = 2,\n mountPadLength = 2.5,\n}: FPCProps) => {\n const contactSpan = Math.max((pinCount - 1) * pitch, pitch)\n const contactStartX = -contactSpan / 2\n const resolvedMountPitch =\n mountPadPitchX ?? contactSpan + (staggered ? 3.5 : 3.38)\n const mountY =\n mountPadOffsetY === 0 ? 0 : (mountTop ? 1 : -1) * mountPadOffsetY\n\n const contactRows = Array.from({ length: pinCount }, (_, index) => {\n const isUpperRow = staggered && (index % 2 === 1) !== reverse\n const y = staggered ? (isUpperRow ? rowPitch / 2 : -rowPitch / 2) : 0\n const length = isUpperRow ? topPadLength : bottomPadLength\n return {\n index,\n x: contactStartX + index * pitch,\n y,\n length,\n }\n })\n\n const contactMaxY = Math.max(\n ...contactRows.map((contact) => contact.y + contact.length / 2),\n )\n const contactMinY = Math.min(\n ...contactRows.map((contact) => contact.y - contact.length / 2),\n )\n const mountingMinY = mountY - mountPadLength / 2\n const mountingMaxY = mountY + mountPadLength / 2\n const signalSideY = mountTop ? contactMinY : contactMaxY\n const cableSideY = mountTop\n ? Math.max(mountingMaxY, contactMaxY) + 0.67\n : Math.min(mountingMinY, contactMinY) - 0.67\n const directionToSignal = mountTop ? -1 : 1\n const housingSignalY =\n signalSideY - directionToSignal * Math.max(padLength * 0.86, 1.05)\n const housingCableY = cableSideY + directionToSignal * 0.22\n const housingDepth = Math.abs(housingSignalY - housingCableY)\n const housingCenterY = (housingSignalY + housingCableY) / 2\n const cableEdgeY = housingCableY - directionToSignal * 0.01\n const bodyWidth = Math.max(\n contactSpan + 4.9,\n resolvedMountPitch + mountPadWidth * 0.76,\n )\n const openingWidth = Math.min(bodyWidth - 2.3, contactSpan + 1.1)\n const housingBaseHeight = 0.3\n const housingHeight = 1.42\n const overallHeight = 2\n const throatDepth = Math.min(0.92, housingDepth * 0.28)\n const throatCenterY =\n cableEdgeY + directionToSignal * (throatDepth / 2 - 0.04)\n const throatHeight = 1.6\n const throatCenterZ = 1.1\n const actuatorDepth = Math.max(housingDepth - 0.78, 1.5)\n const actuatorCenterY =\n cableEdgeY + directionToSignal * (actuatorDepth / 2 + 0.68)\n const actuatorWidth = bodyWidth - 0.72\n const actuatorHeight = 0.34\n const actuatorCenterZ = overallHeight - actuatorHeight / 2\n const hingeY =\n cableEdgeY + directionToSignal * Math.min(0.68, housingDepth * 0.22)\n const hingeZ = 1.48\n const terminalWidth = Math.max(padWidth * 0.82, 0.15)\n const terminalOuterY = signalSideY\n const terminalLength = Math.abs(terminalOuterY - housingSignalY)\n const terminalCenterY = (terminalOuterY + housingSignalY) / 2\n const springLength = Math.max(throatDepth * 0.8, 0.5)\n const springCenterY =\n cableEdgeY + directionToSignal * (springLength / 2 + 0.08)\n const endClipX = resolvedMountPitch / 2\n const clipHeight = 0.75\n const clipWallX = bodyWidth / 2 - 0.04\n const clipCapX = bodyWidth / 2 - 0.23\n const sideBossX = bodyWidth / 2 - 0.32\n const sideBossWidth = 0.68\n\n return (\n <>\n {[-1, 1].map((direction) => (\n <Cuboid\n key={`mount-pad:${direction}`}\n color={TIN_COLOR}\n center={[direction * endClipX, mountY, 0.07]}\n size={[mountPadWidth, mountPadLength, 0.14]}\n />\n ))}\n\n {contactRows.map((contact) => (\n <Cuboid\n key={`terminal:${contact.index}`}\n color={TIN_COLOR}\n center={[contact.x, terminalCenterY, 0.065]}\n size={[terminalWidth, terminalLength, 0.13]}\n />\n ))}\n\n <RoundedCuboid\n color={HOUSING_SHADOW}\n center={[0, housingCenterY, housingBaseHeight / 2]}\n size={[bodyWidth, housingDepth, housingBaseHeight]}\n roundRadius={0.1}\n />\n\n <Colorize color={HOUSING_COLOR}>\n <Subtract>\n <RoundedCuboid\n center={[0, housingCenterY, housingBaseHeight + housingHeight / 2]}\n size={[bodyWidth - 0.2, housingDepth - 0.12, housingHeight]}\n roundRadius={0.14}\n />\n <Cuboid\n center={[0, throatCenterY, throatCenterZ]}\n size={[openingWidth, throatDepth, throatHeight]}\n />\n <Cuboid\n center={[0, actuatorCenterY, overallHeight - actuatorHeight * 0.72]}\n size={[actuatorWidth - 0.32, actuatorDepth - 0.16, actuatorHeight]}\n />\n </Subtract>\n </Colorize>\n\n {contactRows.map((contact) => (\n <RoundedCuboid\n key={`spring:${contact.index}`}\n color={TIN_HIGHLIGHT}\n center={[contact.x, springCenterY, housingBaseHeight + 0.82]}\n size={[terminalWidth * 0.82, springLength, 0.14]}\n roundRadius={0.035}\n />\n ))}\n\n {contactRows.map((contact) => (\n <Cuboid\n key={`terminal-rise:${contact.index}`}\n color={TIN_COLOR}\n center={[\n contact.x,\n housingSignalY - directionToSignal * 0.03,\n housingBaseHeight + 0.32,\n ]}\n size={[terminalWidth, 0.13, 0.62]}\n />\n ))}\n\n <Cuboid\n color={HOUSING_SHADOW}\n center={[\n 0,\n cableEdgeY + directionToSignal * 0.1,\n housingBaseHeight + 0.71,\n ]}\n size={[openingWidth + 0.18, 0.16, 0.8]}\n />\n\n <RoundedCuboid\n color={ACTUATOR_COLOR}\n center={[0, actuatorCenterY, actuatorCenterZ]}\n size={[actuatorWidth, actuatorDepth, actuatorHeight]}\n roundRadius={0.11}\n />\n\n <Cuboid\n color={ACTUATOR_HIGHLIGHT}\n center={[\n 0,\n actuatorCenterY - directionToSignal * (actuatorDepth / 2 - 0.12),\n overallHeight - 0.035,\n ]}\n size={[actuatorWidth - 0.36, 0.24, 0.07]}\n />\n\n {[-1, 1].map((direction) => (\n <RoundedCuboid\n key={`actuator-ear:${direction}`}\n color={ACTUATOR_COLOR}\n center={[direction * sideBossX, hingeY, hingeZ]}\n size={[sideBossWidth, 0.92, 0.72]}\n roundRadius={0.1}\n />\n ))}\n\n {[-1, 1].map((direction) => (\n <Translate\n key={`hinge:${direction}`}\n x={direction * sideBossX}\n y={hingeY}\n z={hingeZ}\n >\n <Rotate rotation={[0, Math.PI / 2, 0]}>\n <Cylinder\n color={ACTUATOR_HIGHLIGHT}\n height={sideBossWidth + 0.12}\n radius={0.24}\n />\n </Rotate>\n </Translate>\n ))}\n\n {[-1, 1].map((direction) => (\n <RoundedCuboid\n key={`hold-down-wall:${direction}`}\n color={HOLD_DOWN_COLOR}\n center={[direction * clipWallX, mountY, clipHeight / 2]}\n size={[0.17, Math.min(mountPadLength * 0.3, 0.7), clipHeight]}\n roundRadius={0.04}\n />\n ))}\n\n {[-1, 1].map((direction) => (\n <RoundedCuboid\n key={`hold-down-cap:${direction}`}\n color={HOLD_DOWN_HIGHLIGHT}\n center={[direction * clipCapX, mountY, clipHeight - 0.05]}\n size={[0.42, Math.min(mountPadLength * 0.3, 0.7), 0.1]}\n roundRadius={0.035}\n />\n ))}\n\n <Cuboid\n color={HOUSING_SHADOW}\n center={[0, housingCenterY, 0.025]}\n size={[openingWidth + 0.7, housingDepth * 0.58, 0.05]}\n />\n\n <Cuboid\n color={HOUSING_SHADOW}\n center={[\n 0,\n housingSignalY - directionToSignal * 0.06,\n housingBaseHeight + 0.82,\n ]}\n size={[openingWidth + 0.4, 0.15, 0.92]}\n />\n </>\n )\n}\n","import { Colorize, Cuboid, Hull, Translate } from \"jscad-fiber\"\n\nexport interface SmdPinHeaderProps {\n numberOfPins: number\n pitch?: number\n pinThickness?: number\n bodyWidth?: number\n bodyHeight?: number\n standoffHeight?: number\n matingPinLength?: number\n tailSpan?: number\n}\n\nexport const SmdPinHeader = ({\n numberOfPins,\n pitch = 2.54,\n pinThickness = 0.64,\n bodyWidth = 2.5,\n bodyHeight = 2.54,\n standoffHeight = 1.27,\n matingPinLength = 5.8,\n tailSpan = 5.08,\n}: SmdPinHeaderProps) => {\n const xStart = -((numberOfPins - 1) * pitch) / 2\n const bodyTop = standoffHeight + bodyHeight\n const tailLength = tailSpan / 2\n const tipChamferHeight = pinThickness * 0.35\n\n return (\n <>\n {Array.from({ length: numberOfPins }, (_, index) => {\n const x = xStart + index * pitch\n const tailDirection = index % 2 === 0 ? 1 : -1\n const postBodyLength = matingPinLength - tipChamferHeight\n const verticalTailLength = standoffHeight - pinThickness / 2\n\n return (\n <Translate key={index} x={x}>\n <Cuboid\n color=\"#222\"\n size={[pitch, bodyWidth, bodyHeight]}\n center={[0, 0, standoffHeight + bodyHeight / 2]}\n />\n <Colorize color=\"#d4af37\">\n <Cuboid\n size={[pinThickness, tailLength, pinThickness]}\n center={[0, tailDirection * (tailLength / 2), pinThickness / 2]}\n />\n <Cuboid\n size={[pinThickness, pinThickness, verticalTailLength]}\n center={[0, 0, pinThickness / 2 + verticalTailLength / 2]}\n />\n <Cuboid\n size={[pinThickness, pinThickness, postBodyLength]}\n center={[0, 0, bodyTop + postBodyLength / 2]}\n />\n <Hull>\n <Cuboid\n size={[pinThickness, pinThickness, 0.01]}\n center={[0, 0, bodyTop + postBodyLength]}\n />\n <Cuboid\n size={[pinThickness * 0.65, pinThickness * 0.65, 0.01]}\n center={[0, 0, bodyTop + matingPinLength]}\n />\n </Hull>\n </Colorize>\n </Translate>\n )\n })}\n </>\n )\n}\n","import { fp } from \"@tscircuit/footprinter\"\n\nexport interface PlatedHoleCenter {\n x: number\n y: number\n pin?: string\n}\n\n/**\n * Where a footprint's plated holes are, for through-hole bodies that have to\n * put their leads through them.\n *\n * `fp.string(name).json()` does not describe the hole PATTERN, only its\n * parameters, and the pattern is what a lead has to match: `to92` puts its\n * middle pin 1.27mm behind the outer two, `to92s` puts all three in a row and\n * `to92l` offsets the whole group so pin 1 sits at the origin. A body that\n * assumes any one of those is visibly wrong on the other two — leads beside\n * the holes rather than through them.\n */\nexport const getPlatedHoleCenters = (footprint: string): PlatedHoleCenter[] => {\n const elements = fp.string(footprint).circuitJson() as Array<{\n type: string\n x?: number\n y?: number\n port_hints?: string[]\n }>\n\n return elements\n .filter(\n (element) =>\n element.type === \"pcb_plated_hole\" &&\n Number.isFinite(element.x) &&\n Number.isFinite(element.y),\n )\n .map((element) => ({\n x: element.x as number,\n y: element.y as number,\n pin: element.port_hints?.[0],\n }))\n}\n","import { fp } from \"@tscircuit/footprinter\"\n\nexport interface SmtPadRect {\n x: number\n y: number\n width: number\n height: number\n pin?: string\n}\n\n/**\n * A footprint's rectangular SMT pads, for bodies that build a lead per pad.\n *\n * Lead COUNT is not a property of a package outline — SOT-23-5 and SOT-23-6\n * share a body, SC-70-4 and SC-70-6 share a body — so a body picked by outline\n * alone can end up with more or fewer leads than the footprint has pads.\n * Reading the pads makes that impossible.\n *\n * Polygon pads (a SOT-89 tab, say) are skipped: they are not lead feet.\n */\nexport const getSmtPadRects = (footprint: string): SmtPadRect[] => {\n const elements = fp.string(footprint).circuitJson() as Array<{\n type: string\n shape?: string\n x?: number\n y?: number\n width?: number\n height?: number\n port_hints?: string[]\n }>\n\n return elements\n .filter(\n (element) =>\n element.type === \"pcb_smtpad\" &&\n element.shape === \"rect\" &&\n Number.isFinite(element.x) &&\n Number.isFinite(element.y),\n )\n .map((element) => ({\n x: element.x as number,\n y: element.y as number,\n width: element.width ?? 0.4,\n height: element.height ?? 0.4,\n pin: element.port_hints?.[0],\n }))\n}\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport interface SmdLeadPad {\n x: number\n y: number\n width?: number\n height?: number\n}\n\nexport interface GullWingBodyProps {\n /** X extent of the moulded body. */\n bodyWidth: number\n /** Y extent of the moulded body. */\n bodyLength: number\n bodyHeight?: number\n /** Where each lead meets the board, from the footprint's own pads. */\n pads: SmdLeadPad[]\n leadThickness?: number\n /** How high the lead rises from the board to the body, as a fraction of the body height. */\n leadHeightRatio?: number\n}\n\n/**\n * A small-outline package with gull-wing leads on its left and right faces,\n * one lead per PAD.\n *\n * Two things come from two different places on purpose:\n *\n * - the body is the designation's (`bodyWidth`/`bodyLength` are passed in\n * from the package outline, never derived from the land pattern);\n * - the leads are the footprint's, because lead COUNT is not a property of a\n * body outline. SOT-23-5 and SOT-23-6 share a body; SC-70-4 and SC-70-6\n * share a body. A body picked by outline alone ends up with the wrong\n * number of legs, which is what this component exists to prevent.\n *\n * The leg itself is `SmdChipLead`, the same S-curve every other gull-wing part\n * here uses (SOIC, SOT-235, SOT-223, MSOP, QFP, MS-012). Anything else is a\n * second kind of leg in a repo that already has one.\n */\nexport const GullWingBody = ({\n bodyWidth,\n bodyLength,\n bodyHeight = 1,\n pads,\n leadThickness = 0.15,\n leadHeightRatio = 0.75,\n}: GullWingBodyProps) => {\n const centerX = pads.reduce((sum, pad) => sum + pad.x, 0) / (pads.length || 1)\n const centerY = pads.reduce((sum, pad) => sum + pad.y, 0) / (pads.length || 1)\n const leadHeight = bodyHeight * leadHeightRatio\n\n // The body is centred on the PADS, not on the footprint origin. Normally\n // those are the same; for footprinter's `sot343` they are not — its pads sit\n // at -1.056 and +0.550 where SC-70-4's land is symmetric about the origin\n // (KiCad has ±0.825). A part solders to the centre of its pads, so following\n // them keeps the leads equal and attached; following the origin would put a\n // symmetric package visibly off its own land.\n\n return (\n <>\n <ChipBody\n center={{ x: centerX, y: centerY, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n />\n\n {pads.map((pad) => {\n const padWidth = pad.width ?? 0.4\n const padLength = pad.height ?? 0.4\n const side = pad.x >= centerX ? 1 : -1\n // The lead runs from the OUTER edge of its pad to the body face, plus\n // a little more so it merges into the body instead of stopping at it.\n //\n // Both halves of that matter. `SmdChipLead` draws from its anchor\n // inward by `bodyDistance`, so anchoring outboard of the pad (as the\n // fixed-geometry parts do, where the distance is generous enough to\n // hide it) leaves the inner end short of the body: 0.125mm of daylight\n // on SC-70-4 and 0.215mm on SOT-23-6, with the leg visibly floating.\n const outerX = pad.x + (side * padWidth) / 2\n const run = Math.max(Math.abs(outerX - centerX) - bodyWidth / 2, 0.1)\n const overlap = Math.min(0.15, bodyWidth * 0.15)\n\n return (\n <SmdChipLead\n key={`lead-${pad.x}-${pad.y}`}\n rotation={side > 0 ? Math.PI : 0}\n position={{\n x: outerX,\n y: pad.y,\n z: leadThickness / 2,\n }}\n width={padLength}\n thickness={leadThickness}\n padContactLength={padWidth * 0.6}\n bodyDistance={run + overlap}\n height={leadHeight}\n />\n )\n })}\n </>\n )\n}\n\nexport default GullWingBody\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\n/**\n * A two-terminal chip body sized from its land pattern.\n *\n * Footprinter names a chip either by EIA size (`0402`) or parametrically by the\n * pads it wants (`res_p0.8656mm_pw0.5657mm_ph0.54mm`). The named sizes have\n * hand-modelled bodies -- `A0402` and friends -- and keep using them. This is\n * for the parametric form, which carries no size to look up and until now\n * rendered nothing at all.\n *\n * The pads are the only evidence available, so the body is derived from them:\n *\n * - **length** is the pad pitch. A chip's terminations sit centred on its pads,\n * so pitch tracks body length closely: across every EIA size from 0201 up it\n * is within 10% of the real part (0402: 1.02 vs 1.0mm, 0603: 1.65 vs 1.6mm,\n * 1206: 2.93 vs 3.2mm).\n * - **width and height** are the pad height less a fillet allowance. A land\n * pattern is drawn wider than the part so solder can wet the ends, by\n * 5-30% depending on the size; 0.85 is the middle of that range. Chips of\n * this class are near-square in section, so the same figure serves for height.\n *\n * The result is a *plausible* body, not a datasheet one -- accurate to about\n * 15% for 0201 and larger, and deliberately over-estimating for 01005, where a\n * land pattern is proportionally much larger than the part. That is the right\n * trade for a part that would otherwise be invisible: an approximate body shows\n * the board is populated and shows what a clearance check has to clear, while\n * nothing at all silently hides a component.\n */\nexport const ParametricChip = ({\n padPitch,\n padHeight,\n color = \"#333\",\n}: {\n /** Centre-to-centre distance between the two pads, mm. */\n padPitch: number\n /** Pad extent across the part, mm. */\n padHeight: number\n color?: string\n}) => {\n const fullLength = padPitch\n const width = padHeight * 0.85\n const height = width\n // Matches the 20% proportion the hand-modelled A-series uses.\n const terminatorWidth = fullLength * 0.2\n const bodyLength = fullLength - terminatorWidth * 2\n\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n Rotate,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\n\nexport interface Led5050Props {\n color?: string\n bodyColor?: string\n leadColor?: string\n}\n\nexport const Led5050 = ({\n color = \"#ffff00\",\n bodyColor = \"#ffffff\",\n leadColor = \"#dedede\",\n}: Led5050Props) => {\n const bodySize = 5\n const leadSpan = 5.4\n const bodyBottom = 0.2\n const bodyHeight = 1.3\n const bodyTop = bodyBottom + bodyHeight\n const leadLength = 1.4\n const leadWidth = 1\n const leadThickness = 0.2\n const leadCenterX = leadSpan / 2 - leadLength / 2\n const lensRadius = 2\n const lensHeight = 0.25\n const lensTop = 1.55\n const cornerCutDepth = 0.3\n const leadYPositions = [-1.7, 0, 1.7]\n const leadSides = [-1, 1]\n\n return (\n <>\n {leadYPositions.flatMap((y) =>\n leadSides.map((side) => (\n <Cuboid\n key={`${side}-${y}`}\n color={leadColor}\n size={[leadLength, leadWidth, leadThickness]}\n center={[side * leadCenterX, y, leadThickness / 2]}\n />\n )),\n )}\n\n <Colorize color={bodyColor}>\n <Subtract>\n <ChipBody\n width={bodySize}\n length={bodySize}\n height={bodyHeight}\n heightAboveSurface={bodyBottom}\n center={{ x: 0, y: 0, z: 0 }}\n color={bodyColor}\n taperRatio={0.036}\n straightHeightRatio={0.01}\n includeNotch={false}\n />\n <Cylinder\n radius={lensRadius}\n height={lensHeight}\n center={[0, 0, bodyTop - lensHeight / 2]}\n />\n <Translate\n offset={[\n -bodySize / 2,\n bodySize / 2,\n bodyTop - cornerCutDepth / 2 + 0.005,\n ]}\n >\n <Rotate rotation={[0, 0, Math.PI / 4]}>\n <Cuboid size={[0.9, 0.9, cornerCutDepth + 0.01]} />\n </Rotate>\n </Translate>\n </Subtract>\n </Colorize>\n\n <Cylinder\n color={color}\n radius={lensRadius}\n height={lensHeight}\n center={[0, 0, lensTop - lensHeight / 2]}\n />\n </>\n )\n}\n\nexport default Led5050\n","import { Colorize, Cuboid } from \"jscad-fiber\"\n\nexport interface Led2835Props {\n /** X extent of the package (footprinter reports 3.5 for `led2835`). */\n bodyWidth?: number\n /** Y extent of the package. */\n bodyLength?: number\n bodyHeight?: number\n /** Emitter colour when lit — the lens square on the top face. */\n color?: string\n bodyColor?: string\n padColor?: string\n /** Pad centres and widths, so the terminals line up with the footprint. */\n pad1X?: number\n pad1Width?: number\n pad2X?: number\n pad2Width?: number\n padLength?: number\n}\n\n/**\n * 2835 chip LED: a flat rectangular package with an emitter window, unlike the\n * symmetric two-terminal chips (0805 etc.) whose pads are mirrored — footprinter\n * gives `led2835` two DIFFERENT pad widths at two different offsets, so the body\n * is not centred on the pads.\n */\nexport const Led2835 = ({\n bodyWidth = 3.5,\n bodyLength = 2.8,\n bodyHeight = 0.8,\n color = \"#ffe08a\",\n bodyColor = \"#f2f2f2\",\n padColor = \"#cccccc\",\n pad1X = -0.9,\n pad1Width = 2.2,\n pad2X = 1.375,\n pad2Width = 1.25,\n padLength = 2.2,\n}: Led2835Props = {}) => {\n const padThickness = 0.1\n const lensHeight = 0.15\n const bodyCenterX = (pad1X + pad2X) / 2\n const lensWidth = bodyWidth * 0.55\n const lensLength = bodyLength * 0.55\n\n return (\n <>\n {[\n { x: pad1X, w: pad1Width, key: \"pad-1\" },\n { x: pad2X, w: pad2Width, key: \"pad-2\" },\n ].map(({ x, w, key }) => (\n <Colorize color={padColor} key={key}>\n <Cuboid\n size={[w, padLength, padThickness]}\n center={[x, 0, padThickness / 2]}\n />\n </Colorize>\n ))}\n\n <Colorize color={bodyColor}>\n <Cuboid\n size={[bodyWidth, bodyLength, bodyHeight]}\n center={[bodyCenterX, 0, padThickness + bodyHeight / 2]}\n />\n </Colorize>\n\n <Colorize color={color}>\n <Cuboid\n size={[lensWidth, lensLength, lensHeight]}\n center={[\n bodyCenterX,\n 0,\n padThickness + bodyHeight + lensHeight / 2 - 0.05,\n ]}\n />\n </Colorize>\n </>\n )\n}\n\nexport default Led2835\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n Rotate,\n RoundedCuboid,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\n\nexport interface RJ45Props {\n /** Width of the shielded connector body in millimetres. */\n bodyWidth?: number\n /** Depth of the shielded connector body in millimetres. */\n bodyDepth?: number\n /** Height of the connector above the PCB in millimetres. */\n bodyHeight?: number\n /** Signed Y offset of the connector body from the signal rows. */\n bodyCenterY?: number\n /** Include the two indicator LEDs and their four through-hole leads. */\n ledPins?: boolean\n /** Mirror the eight signal pins so pin 1 is on the left. */\n firstPinLeft?: boolean\n /** Mirror the eight signal pins so pin 1 is in the top row. */\n firstPinTop?: boolean\n signalPitch?: number\n signalRowPitch?: number\n signalHoleDiameter?: number\n shieldPinX?: number\n shieldPinY?: number\n shieldHoleDiameter?: number\n locatorHoleX?: number\n locatorHoleY?: number\n locatorHoleDiameter?: number\n ledPinX?: number\n ledPinPitch?: number\n ledPinY?: number\n /** Override the inferred direction of the cable opening. */\n openingDirection?: -1 | 1\n shellColor?: string\n housingColor?: string\n contactColor?: string\n}\n\nconst range = (length: number) => Array.from({ length }, (_, index) => index)\n\n/**\n * Parametric, shielded 8P8C modular jack.\n *\n * The PCB-facing parameters intentionally mirror the `rj45` footprinter\n * function so the model's signal, shield, locator and optional LED leads stay\n * aligned with the generated land pattern.\n */\nexport const RJ45 = ({\n bodyWidth = 16.26,\n bodyDepth = 15.88,\n bodyHeight = 13.5,\n bodyCenterY = -0.96,\n ledPins = false,\n firstPinLeft = false,\n firstPinTop = false,\n signalPitch = 1.02,\n signalRowPitch = 1.78,\n signalHoleDiameter = 0.9144,\n shieldPinX = 8.13,\n shieldPinY = 0.13,\n shieldHoleDiameter = 1.8,\n locatorHoleX = 6.35,\n locatorHoleY = -3.43,\n locatorHoleDiameter = 3.25,\n ledPinX = 4.57,\n ledPinPitch = 2.29,\n ledPinY = 5.7,\n openingDirection,\n shellColor = \"#b7bdc2\",\n housingColor = \"#20242a\",\n contactColor = \"#d6a928\",\n}: RJ45Props) => {\n const frontDirection =\n openingDirection ?? (bodyCenterY > 0 ? (1 as const) : (-1 as const))\n const frontY = bodyCenterY + (frontDirection * bodyDepth) / 2\n const shellThickness = Math.min(0.38, bodyWidth * 0.024)\n const openingWidth = Math.max(bodyWidth - 2.5, bodyWidth * 0.72)\n const openingHeight = Math.min(bodyHeight - 2.4, 9.6)\n const openingCenterZ = 1.3 + openingHeight / 2\n const cavityDepth = Math.min(4.4, bodyDepth * 0.34)\n const cavityCenterY = frontY - (frontDirection * cavityDepth) / 2\n const backWallY =\n frontY - frontDirection * (cavityDepth + shellThickness * 0.7)\n const signalLeadRadius = Math.max(\n 0.22,\n Math.min(signalHoleDiameter * 0.36, 0.38),\n )\n const signalPinPositions = range(8).map((index) => {\n const defaultX = (3.5 - index) * signalPitch\n const defaultY = index % 2 === 0 ? -signalRowPitch / 2 : signalRowPitch / 2\n return {\n x: firstPinLeft ? -defaultX : defaultX,\n y: firstPinTop ? -defaultY : defaultY,\n }\n })\n const ledPinPositions = [\n -ledPinX - ledPinPitch,\n -ledPinX,\n ledPinX,\n ledPinX + ledPinPitch,\n ]\n const contactPitch = openingWidth / 10\n const contactY = frontY - frontDirection * Math.max(cavityDepth * 0.48, 1.2)\n const contactZ = openingCenterZ + openingHeight * 0.18\n const frontLipY = frontY + frontDirection * shellThickness * 0.2\n\n return (\n <>\n <Colorize color={shellColor}>\n <Subtract>\n <Cuboid\n center={[0, bodyCenterY, bodyHeight / 2]}\n size={[bodyWidth, bodyDepth, bodyHeight]}\n />\n <Cuboid\n center={[0, cavityCenterY, openingCenterZ]}\n size={[\n openingWidth,\n cavityDepth + shellThickness * 2,\n openingHeight,\n ]}\n />\n </Subtract>\n\n <Cuboid\n center={[0, frontLipY, 0.72]}\n size={[openingWidth + 0.5, shellThickness * 1.25, 1.05]}\n />\n\n {[-1, 1].map((direction) => (\n <Cuboid\n key={`shield-tab:${direction}`}\n center={[direction * shieldPinX, shieldPinY, 0.25]}\n size={[\n Math.max(shieldHoleDiameter * 0.46, 0.65),\n Math.max(shieldHoleDiameter * 0.72, 1.1),\n 3.4,\n ]}\n />\n ))}\n\n {[-1, 1].map((direction) => (\n <Cuboid\n key={`top-seam:${direction}`}\n center={[\n direction * bodyWidth * 0.24,\n bodyCenterY - frontDirection * bodyDepth * 0.08,\n bodyHeight + 0.04,\n ]}\n size={[bodyWidth * 0.22, bodyDepth * 0.42, 0.1]}\n />\n ))}\n </Colorize>\n\n <Colorize color={housingColor}>\n <Subtract>\n <RoundedCuboid\n center={[0, cavityCenterY, openingCenterZ]}\n size={[\n openingWidth - 0.2,\n cavityDepth + shellThickness * 0.5,\n openingHeight - 0.2,\n ]}\n roundRadius={0.22}\n />\n <Cuboid\n center={[\n 0,\n cavityCenterY - frontDirection * shellThickness * 0.2,\n openingCenterZ - 0.05,\n ]}\n size={[\n openingWidth - 1.25,\n cavityDepth + shellThickness,\n openingHeight - 1.35,\n ]}\n />\n </Subtract>\n\n <Cuboid\n center={[0, backWallY, openingCenterZ]}\n size={[openingWidth - 1.15, shellThickness, openingHeight - 1.25]}\n />\n\n <RoundedCuboid\n center={[0, frontY - frontDirection * cavityDepth * 0.28, 1.55]}\n size={[openingWidth - 2.6, cavityDepth * 0.5, 1.15]}\n roundRadius={0.16}\n />\n\n {[-1, 1].map((direction) => (\n <Cylinder\n key={`locator:${direction}`}\n center={[direction * locatorHoleX, locatorHoleY, -0.25]}\n radius={Math.max(locatorHoleDiameter * 0.41, 0.65)}\n height={2.7}\n />\n ))}\n </Colorize>\n\n <Colorize color={contactColor}>\n {signalPinPositions.map(({ x, y }, index) => (\n <Cylinder\n key={`signal-lead:${index}`}\n center={[x, y, 0.15]}\n radius={signalLeadRadius}\n height={3.1}\n />\n ))}\n\n {range(8).map((index) => (\n <Translate\n key={`socket-contact:${index}`}\n offset={[\n (index - 3.5) * contactPitch,\n contactY,\n contactZ + (index % 2 === 0 ? 0.03 : -0.03),\n ]}\n >\n <Rotate rotation={[frontDirection * 0.2, 0, 0]}>\n <RoundedCuboid\n size={[Math.max(contactPitch * 0.28, 0.28), 3.25, 0.16]}\n roundRadius={0.05}\n />\n </Rotate>\n </Translate>\n ))}\n\n {ledPins &&\n ledPinPositions.map((x, index) => (\n <Cylinder\n key={`led-lead:${index}`}\n center={[x, ledPinY, 0.15]}\n radius={signalLeadRadius}\n height={3.1}\n />\n ))}\n </Colorize>\n\n {ledPins && (\n <>\n <RoundedCuboid\n color=\"#73b744\"\n center={[\n -bodyWidth / 2 + 2.05,\n frontY + frontDirection * shellThickness * 0.35,\n bodyHeight - 2.05,\n ]}\n size={[2.15, shellThickness * 1.55, 1.45]}\n roundRadius={0.18}\n />\n <RoundedCuboid\n color=\"#e0aa35\"\n center={[\n bodyWidth / 2 - 2.05,\n frontY + frontDirection * shellThickness * 0.35,\n bodyHeight - 2.05,\n ]}\n size={[2.15, shellThickness * 1.55, 1.45]}\n roundRadius={0.18}\n />\n </>\n )}\n </>\n )\n}\n\nexport default RJ45\n","import { componentMaterials } from \"./materials\"\nimport { Colorize, Cuboid, Hull, Translate } from \"jscad-fiber\"\n\nexport interface DPAKProps {\n /** X extent of the moulded body (the lead-to-tab axis) */\n bodyWidth?: number\n /** Y extent of the moulded body (across the leads) */\n bodyLength?: number\n /** Height of the moulded body above the board */\n bodyHeight?: number\n /** X extent of the exposed metal tab (the drain/collector pad) */\n tabWidth?: number\n /** Y extent of the exposed metal tab */\n tabLength?: number\n /** Distance between the lead pad centres and the tab pad centre */\n span?: number\n /** Lead pitch along Y */\n pitch?: number\n /** Y width of one lead */\n leadWidth?: number\n /** X length of the lead's flat pad contact */\n leadContactLength?: number\n /**\n * TO-252 (DPAK) and TO-263 (D2PAK) differ only in size, so one body serves\n * both — pass the dimensions footprinter reports for the specific package.\n */\n color?: string\n tabColor?: string\n leadColor?: string\n}\n\n/**\n * TO-252 (DPAK) / TO-263 (D2PAK): a moulded body sitting on a large exposed\n * metal tab, with gull leads leaving the opposite face.\n *\n * The footprint is asymmetric — footprinter puts the lead pads at -span/2 and\n * the tab pad at +span/2 — so the body is placed over the tab rather than over\n * the origin. Getting that wrong moves a 4.4mm-tall part several millimetres,\n * which is exactly the error an enclosure clearance check cannot see.\n */\nexport const DPAK = ({\n bodyWidth = 6.1,\n bodyLength = 6.5,\n bodyHeight = 2.3,\n tabWidth = 6.2,\n tabLength = 5.8,\n span = 6.85,\n pitch = 2.29,\n leadWidth = 0.9,\n leadContactLength = 1.5,\n color = \"#222\",\n tabColor = \"#cccccc\",\n leadColor = \"#cccccc\",\n}: DPAKProps) => {\n const tabThickness = 0.5\n const tabCenterX = span / 2\n const leadPadX = -span / 2\n // The plastic covers the tab except for a strip at the far end.\n const bodyCenterX = tabCenterX + (tabWidth - bodyWidth) / 2\n const bodyFrontX = bodyCenterX - bodyWidth / 2\n const leadZ = tabThickness / 2\n const leadThickness = 0.4\n\n return (\n <>\n <Colorize material={componentMaterials.tinnedLead} color={tabColor}>\n <Cuboid\n size={[tabWidth, tabLength, tabThickness]}\n center={[tabCenterX, 0, tabThickness / 2]}\n />\n </Colorize>\n\n <Colorize material={componentMaterials.moldedPlastic} color={color}>\n <Cuboid\n size={[bodyWidth, bodyLength, bodyHeight]}\n center={[bodyCenterX, 0, tabThickness + bodyHeight / 2]}\n />\n </Colorize>\n\n {[-1, 1].map((side) => {\n return (\n <Colorize\n material={componentMaterials.tinnedLead}\n color={leadColor}\n key={`lead-${side}`}\n >\n {/* flat pad contact */}\n <Cuboid\n size={[leadContactLength, leadWidth, leadThickness]}\n center={[\n leadPadX + leadContactLength / 2,\n side * pitch,\n leadThickness / 2,\n ]}\n />\n {/* the run from the pad up into the body face */}\n <Hull>\n <Cuboid\n size={[0.1, leadWidth, leadThickness]}\n center={[\n leadPadX + leadContactLength,\n side * pitch,\n leadThickness / 2,\n ]}\n />\n <Cuboid\n size={[0.1, leadWidth, leadThickness]}\n center={[bodyFrontX, side * pitch, leadZ + tabThickness / 2]}\n />\n </Hull>\n </Colorize>\n )\n })}\n </>\n )\n}\n\nexport default DPAK\n","import { componentMaterials } from \"./materials\"\nimport {\n Colorize,\n Cuboid,\n Cylinder,\n RoundedCylinder,\n Subtract,\n} from \"jscad-fiber\"\n\nexport interface ElectrolyticCapacitorProps {\n /** Can diameter. footprinter reports this as `d` for `electrolytic`. */\n diameter?: number\n /**\n * Can height. Not part of any footprint: the same 10mm can is made in a\n * dozen heights. Defaults to `heightToDiameterRatio * diameter`, which for\n * the common radial series is a slight OVER-estimate — for a clearance\n * check that is the safe direction to be wrong in.\n */\n height?: number\n heightToDiameterRatio?: number\n /** Lead pitch (footprinter's `p`). */\n leadPitch?: number\n leadDiameter?: number\n /** How far the leads run below the board. */\n leadLength?: number\n sleeveColor?: string\n baseColor?: string\n}\n\n/**\n * Radial (can) electrolytic capacitor: the part an enclosure cavity is usually\n * sized around, and until now one with no body at all.\n *\n * Only the diameter and the lead pitch come from the footprint. The height is\n * derived, and deliberately generous — see `heightToDiameterRatio`.\n */\nexport const ElectrolyticCapacitor = ({\n diameter = 6.3,\n heightToDiameterRatio = 1.4,\n height = diameter * heightToDiameterRatio,\n leadPitch = 2.5,\n leadDiameter = 0.6,\n leadLength = 3,\n sleeveColor = \"#1b2a6b\",\n baseColor = \"#1a1a1a\",\n}: ElectrolyticCapacitorProps) => {\n const radius = diameter / 2\n const baseHeight = Math.min(1, diameter * 0.12)\n const canHeight = Math.max(height - baseHeight, 0.1)\n const canBottom = baseHeight\n const canTop = canBottom + canHeight\n // The pressure-relief score on the top face: two crossed grooves.\n const grooveWidth = Math.max(diameter * 0.06, 0.2)\n const grooveDepth = 0.3\n\n return (\n <>\n {/* rubber bung / base. Slightly narrower than the can: coincident side\n faces render as z-fighting moiré, not as a join. */}\n <Colorize color={baseColor} material={componentMaterials.rubber}>\n <Cylinder\n radius={radius - 0.05}\n height={baseHeight}\n center={[0, 0, baseHeight / 2]}\n />\n </Colorize>\n\n {/* aluminium can with its sleeve */}\n <Colorize color={sleeveColor} material={componentMaterials.sleeve}>\n <Subtract>\n <RoundedCylinder\n radius={radius}\n height={canHeight}\n roundRadius={Math.min(0.3, radius * 0.15)}\n center={[0, 0, canBottom + canHeight / 2]}\n />\n <Cuboid\n size={[diameter, grooveWidth, grooveDepth * 2]}\n center={[0, 0, canTop]}\n />\n <Cuboid\n size={[grooveWidth, diameter, grooveDepth * 2]}\n center={[0, 0, canTop]}\n />\n </Subtract>\n </Colorize>\n\n {[-1, 1].map((side) => (\n <Colorize\n material={componentMaterials.tinnedLead}\n color=\"#c0c0c0\"\n key={`lead-${side}`}\n >\n <Cylinder\n radius={leadDiameter / 2}\n height={leadLength + baseHeight}\n center={[(side * leadPitch) / 2, 0, (baseHeight - leadLength) / 2]}\n />\n </Colorize>\n ))}\n </>\n )\n}\n\nexport default ElectrolyticCapacitor\n","import { Colorize, Cuboid, Cylinder, Subtract } from \"jscad-fiber\"\n\nexport interface PotentiometerLead {\n x: number\n y: number\n}\n\nexport interface PotentiometerProps {\n /** X extent of the body (footprinter's `w`). */\n bodyWidth?: number\n /** Y extent of the body (footprinter's `ca`). */\n bodyLength?: number\n /** Height of the body above the board (footprinter's `h`). */\n bodyHeight?: number\n /** X offset of the body centre from the footprint origin. */\n bodyCenterX?: number\n /** Diameter of the adjuster on the top face. */\n adjusterDiameter?: number\n /**\n * A panel-mount pot's shaft. Zero by default and on purpose: the footprint\n * carries no shaft dimension, and inventing one would make an enclosure\n * cut a hole for a part that has no shaft, or clear a volume it does not\n * need. Pass it explicitly for a panel pot.\n */\n shaftDiameter?: number\n shaftHeight?: number\n /**\n * Where the pins meet the board, from the footprint's plated holes. A\n * through-hole part with no pins at all is not a body anyone can check\n * against its footprint — it just floats over three empty holes.\n */\n leads?: PotentiometerLead[]\n /** Diameter of a pin, and how far it runs below the board. */\n leadDiameter?: number\n leadLength?: number\n bodyColor?: string\n adjusterColor?: string\n}\n\n/**\n * Trimmer / potentiometer body.\n *\n * The extent comes from the footprint: `w` across, `ca` along, `h` tall. What\n * the footprint cannot tell us is the shaft, so there is none unless asked\n * for — see `shaftHeight`.\n *\n * Name: `core` also exports a `Potentiometer`, and that one is a circuit\n * element (a React component with ports and a footprint). This is a JSCAD\n * solid with no electrical meaning, and it is named for the package the way\n * every other body in this directory is (`PushButton`, `RJ45`, `Crystal`,\n * which shadow core the same way). Renaming it would break that convention to\n * avoid a collision that cannot occur: nothing imports both.\n */\nexport const Potentiometer = ({\n bodyWidth = 5.35,\n bodyLength = 14,\n bodyHeight = 4,\n bodyCenterX = bodyWidth / 2,\n adjusterDiameter = Math.min(bodyWidth, bodyLength) * 0.55,\n shaftDiameter = 0,\n shaftHeight = 0,\n leads = [],\n leadDiameter = 0.6,\n leadLength = 3,\n bodyColor = \"#1f4fa3\",\n adjusterColor = \"#d8d8d8\",\n}: PotentiometerProps) => {\n const adjusterHeight = 0.8\n const adjusterZ = bodyHeight + adjusterHeight / 2\n const slotWidth = Math.max(adjusterDiameter * 0.16, 0.3)\n\n return (\n <>\n <Colorize color={bodyColor}>\n <Cuboid\n size={[bodyWidth, bodyLength, bodyHeight]}\n center={[bodyCenterX, 0, bodyHeight / 2]}\n />\n </Colorize>\n\n {/* screwdriver adjuster, slot cut into it */}\n <Colorize color={adjusterColor}>\n <Subtract>\n <Cylinder\n radius={adjusterDiameter / 2}\n height={adjusterHeight}\n center={[bodyCenterX, 0, adjusterZ]}\n />\n <Cuboid\n size={[adjusterDiameter, slotWidth, adjusterHeight * 0.6]}\n center={[bodyCenterX, 0, adjusterZ + adjusterHeight / 2]}\n />\n </Subtract>\n </Colorize>\n\n {shaftHeight > 0 && shaftDiameter > 0 ? (\n <Colorize color={adjusterColor}>\n <Cylinder\n radius={shaftDiameter / 2}\n height={shaftHeight}\n center={[bodyCenterX, 0, bodyHeight + shaftHeight / 2]}\n />\n </Colorize>\n ) : null}\n\n {leads.map((lead) => (\n <Colorize color=\"#c0c0c0\" key={`lead-${lead.x}-${lead.y}`}>\n <Cylinder\n radius={leadDiameter / 2}\n height={bodyHeight / 2 + leadLength}\n center={[lead.x, lead.y, (bodyHeight / 2 - leadLength) / 2]}\n />\n </Colorize>\n ))}\n </>\n )\n}\n\nexport default Potentiometer\n","import { Colorize, Cuboid, Cylinder } from \"jscad-fiber\"\n\nexport interface SmdPushButtonProps {\n /** X extent of the moulded body. */\n bodyWidth?: number\n /** Y extent of the moulded body. */\n bodyLength?: number\n /** Height of the body above the board. */\n bodyHeight?: number\n /** Diameter of the actuator on the top face. */\n actuatorDiameter?: number\n /** How far the actuator stands proud of the body — the real part height. */\n actuatorHeight?: number\n /** X distance between the pad centres on opposite sides. */\n padSpanX?: number\n /** Y distance between the two pad rows. */\n padSpanY?: number\n padWidth?: number\n padLength?: number\n bodyColor?: string\n actuatorColor?: string\n leadColor?: string\n}\n\n/**\n * SMD tactile push button.\n *\n * The body outline is the footprint's silkscreen (2.86 x 3.04 for footprinter's\n * `smdpushbutton`); the height is the switch's, not the footprint's — a\n * footprint cannot describe an actuator. `actuatorHeight` is the part of that\n * height an enclosure lid has to clear or press on, so it is separate from\n * `bodyHeight` rather than folded into it.\n */\nexport const SmdPushButton = ({\n bodyWidth = 2.9,\n bodyLength = 3.0,\n bodyHeight = 1.4,\n actuatorDiameter = 1.5,\n actuatorHeight = 0.5,\n padSpanX = 4.2,\n padSpanY = 2.15,\n padWidth = 1.05,\n padLength = 0.7,\n bodyColor = \"#2b2b2b\",\n actuatorColor = \"#d9d9d9\",\n leadColor = \"#cccccc\",\n}: SmdPushButtonProps) => {\n const leadThickness = 0.15\n\n return (\n <>\n <Colorize color={bodyColor}>\n <Cuboid\n size={[bodyWidth, bodyLength, bodyHeight]}\n center={[0, 0, bodyHeight / 2]}\n />\n </Colorize>\n\n <Colorize color={actuatorColor}>\n <Cylinder\n radius={actuatorDiameter / 2}\n height={actuatorHeight}\n center={[0, 0, bodyHeight + actuatorHeight / 2]}\n />\n </Colorize>\n\n {[-1, 1].flatMap((sx) =>\n [-1, 1].map((sy) => (\n <Colorize color={leadColor} key={`lead-${sx}-${sy}`}>\n <Cuboid\n size={[padWidth, padLength, leadThickness]}\n center={[\n (sx * padSpanX) / 2,\n (sy * padSpanY) / 2,\n leadThickness / 2,\n ]}\n />\n </Colorize>\n )),\n )}\n </>\n )\n}\n\nexport default SmdPushButton\n","import { fp } from \"@tscircuit/footprinter\"\nimport { Colorize, Cuboid, Cylinder, Rotate, Subtract } from \"jscad-fiber\"\n\n/** Low-profile side-actuated SPDT switch; MSK12C02 and MINI MSK12C02 outlines. */\nexport const SmdSlideSwitch = ({\n footprint = \"smdslideswitch7\",\n position = 0,\n}: { footprint?: string; position?: 0 | 1 }) => {\n const canonical = footprint.replace(/_pin1location\\([^)]*\\)/g, \"\")\n const params = fp.string(canonical).json() as unknown as {\n mpx: number\n mounty: number\n }\n const elements = fp.string(canonical).circuitJson()\n const pads = elements.filter(\n (e) => e.type === \"pcb_smtpad\" && e.shape === \"rect\",\n )\n const target = fp\n .string(footprint)\n .circuitJson()\n .filter(\n (e) =>\n e.type === \"pcb_smtpad\" &&\n (e.shape === \"rect\" || e.shape === \"rotated_rect\"),\n )\n if (pads.length < 7 || !Number.isFinite(params.mpx) || params.mpx < 3)\n throw new Error(\"SmdSlideSwitch needs signal pads and four mounting pads\")\n const angle =\n Math.atan2(target[1]!.y - target[0]!.y, target[1]!.x - target[0]!.x) -\n Math.atan2(pads[1]!.y - pads[0]!.y, pads[1]!.x - pads[0]!.x)\n const width = params.mpx - 0.5,\n depth = 2.7,\n height = params.mpx > 6 ? 1.5 : 1.4,\n y = params.mounty\n return (\n <Rotate rotation={[0, 0, angle]}>\n <Colorize color=\"#aeb4ba\">\n <Subtract>\n <Cuboid size={[width, depth, height]} center={[0, y, height / 2]} />\n <Cuboid\n size={[width - 0.3, depth - 0.3, height]}\n center={[0, y, height / 2 - 0.15]}\n />\n <Cuboid size={[2.7, 0.5, 0.9]} center={[0, y - depth / 2, 0.65]} />\n </Subtract>\n </Colorize>\n <Colorize color=\"#28292c\">\n <Cuboid\n size={[width - 0.32, depth - 0.32, 0.35]}\n center={[0, y, 0.175]}\n />\n <Cuboid\n size={[1, 2.25, 0.65]}\n center={[position === 0 ? -0.5 : 0.5, y - 1.5, 0.65]}\n />\n {elements\n .filter((e) => e.type === \"pcb_hole\")\n .map((hole, i) =>\n \"hole_diameter\" in hole && \"x\" in hole ? (\n <Cylinder\n key={i}\n radius={hole.hole_diameter * 0.42}\n height={0.6}\n center={[hole.x, hole.y, -0.2]}\n />\n ) : null,\n )}\n </Colorize>\n <Colorize color=\"#c6c7c9\">\n {pads.map((pad, i) => {\n const signal = i < pads.length - 4\n const outerY = pad.y + pad.height * 0.4\n const innerY = Math.min(pad.y - pad.height * 0.4, y + depth / 2 - 0.2)\n return (\n <Cuboid\n key={i}\n size={[\n pad.width * 0.8,\n signal ? outerY - innerY : pad.height * 0.8,\n 0.18,\n ]}\n center={[pad.x, signal ? (outerY + innerY) / 2 : pad.y, 0.09]}\n />\n )\n })}\n </Colorize>\n </Rotate>\n )\n}\n","import { Cuboid, Translate, Rotate, Colorize } from \"jscad-fiber\"\n\nexport const SOT563 = ({ fullWidth = 1.94, fullLength = 1.6 }) => {\n const bodyWidth = 1.2\n const bodyLength = 1.6\n const bodyHeight = 0.55\n const leadWidth = 0.3\n const leadLength = 0.67\n const leadHeight = 0.13\n const leadSpacing = 0.5\n const bodyZOffset = -0.4\n\n return (\n <>\n {/* Main body - rotated 90 degrees around X-axis */}\n <Rotate rotation={[45 * Math.PI, 0, 0]}>\n <Translate center={[0, 0, bodyZOffset]}>\n <Colorize color=\"grey\">\n <Cuboid size={[bodyWidth, bodyLength, bodyHeight]} />\n </Colorize>\n </Translate>\n </Rotate>\n\n {/* Leads */}\n {[-1, 0, 1].flatMap((yOffset, index) => [\n // Left lead\n\n <Translate\n key={`left-${index}`}\n center={[\n -bodyWidth / 2 - 0.03,\n yOffset * leadSpacing,\n leadHeight / 2,\n ]}\n >\n <Cuboid size={[leadLength, leadWidth, leadHeight]} />\n </Translate>,\n // Right lead\n <Translate\n key={`right-${index}`}\n center={[bodyWidth / 2 + 0.03, yOffset * leadSpacing, leadHeight / 2]}\n >\n <Cuboid size={[leadLength, leadWidth, leadHeight]} />\n </Translate>,\n ])}\n </>\n )\n}\n\nexport default SOT563\n","import { componentMaterials } from \"./materials\"\nimport { fp } from \"@tscircuit/footprinter\"\nimport {\n Colorize,\n Cuboid,\n Cylinder,\n Hull,\n Rotate,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\n\nconst Capsule = ({\n width,\n height,\n depth,\n}: { width: number; height: number; depth: number }) => (\n <Hull>\n {[-1, 1].map((side) => (\n <Translate key={side} offset={[(side * (width - height)) / 2, 0, 0]}>\n <Rotate rotation={[Math.PI / 2, 0, 0]}>\n <Cylinder radius={height / 2} height={depth} />\n </Rotate>\n </Translate>\n ))}\n </Hull>\n)\n\n/** USB2 Type-C receptacle: rounded open shell, tongue, contacts and four slot tabs. */\nexport const UsbCMidmount = ({\n footprint = \"usbcmidmount16\",\n}: { footprint?: string }) => {\n const canonical = footprint.replace(/_pin1location\\([^)]*\\)/g, \"\")\n const params = fp.string(canonical).json() as unknown as {\n bodybottom: number\n rowy: number\n }\n const elements = fp.string(canonical).circuitJson()\n const pads = elements.filter(\n (e) => e.type === \"pcb_smtpad\" && e.shape === \"rect\",\n )\n const slots = elements.filter((e) => e.type === \"pcb_plated_hole\")\n const holes = elements.filter((e) => e.type === \"pcb_hole\")\n const target = fp\n .string(footprint)\n .circuitJson()\n .find((e) => e.type === \"pcb_plated_hole\")\n const first = slots[0]\n const angle =\n first && target && \"x\" in target\n ? Math.atan2(target.y, target.x) - Math.atan2(first.y, first.x)\n : 0\n const width = 8.94,\n height = 3.2,\n wall = 0.22\n const back = params.rowy + 0.23,\n front = -params.bodybottom\n const depth = back - front,\n centerY = (back + front) / 2,\n centerZ = 1.65\n if (!Number.isFinite(depth) || depth < 3 || slots.length !== 4)\n throw new Error(\n \"UsbCMidmount requires four mounting slots and a positive body depth\",\n )\n // Reach the sidewall at its widest point while preserving slot insertion depth.\n const tabBottom = -0.9,\n tabTop = centerZ + 0.1\n return (\n <Rotate rotation={[0, 0, angle]}>\n <Colorize color=\"#b8bdc4\" material={componentMaterials.brushedMetal}>\n <Translate offset={[0, centerY, centerZ]}>\n <Subtract>\n <Capsule width={width} height={height} depth={depth} />\n <Capsule\n width={width - wall * 2}\n height={height - wall * 2}\n depth={depth + 0.2}\n />\n </Subtract>\n </Translate>\n </Colorize>\n <Colorize color=\"#242529\" material={componentMaterials.moldedPlastic}>\n <Cuboid\n size={[6.65, depth - 1.1, 0.7]}\n center={[0, centerY + 0.3, centerZ]}\n />\n <Cuboid size={[7.6, 1, 2.45]} center={[0, back - 0.65, centerZ]} />\n {holes.map((hole, i) =>\n \"x\" in hole && \"hole_diameter\" in hole ? (\n <Cylinder\n key={i}\n radius={hole.hole_diameter * 0.42}\n height={0.8}\n center={[hole.x, hole.y, -0.3]}\n />\n ) : null,\n )}\n </Colorize>\n <Colorize color=\"#d3ad57\" material={componentMaterials.goldContact}>\n {[-1, 1].flatMap((side) =>\n [-2.75, -2.25, -1.25, -0.25, 0.25, 1.25, 2.25, 2.75].map((x) => (\n <Cuboid\n key={`${side}-${x}`}\n size={[0.24, depth - 2, 0.04]}\n center={[x, centerY + 0.1, centerZ + side * 0.365]}\n />\n )),\n )}\n {pads.map((pad, i) => (\n <Cuboid\n key={i}\n size={[\n Math.min(pad.width * 0.7, 0.35),\n pad.height * 0.8 + 0.35,\n 0.15,\n ]}\n center={[pad.x, pad.y - 0.175, 0.075]}\n />\n ))}\n </Colorize>\n <Colorize color=\"#b8bdc4\" material={componentMaterials.brushedMetal}>\n {slots.map((slot, i) => (\n <Cuboid\n key={i}\n size={[\n 0.4,\n \"hole_height\" in slot && slot.hole_height !== undefined\n ? Math.max(0.3, slot.hole_height - 0.2)\n : 1,\n tabTop - tabBottom,\n ]}\n center={[slot.x, slot.y, (tabTop + tabBottom) / 2]}\n />\n ))}\n </Colorize>\n </Rotate>\n )\n}\n","import { fp } from \"@tscircuit/footprinter\"\nimport { Rotate } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\nconst getPads = (footprint: string) =>\n fp\n .string(footprint)\n .circuitJson()\n .filter(\n (element) =>\n element.type === \"pcb_smtpad\" &&\n (element.shape === \"rect\" || element.shape === \"rotated_rect\"),\n )\n .map((pad) => ({ x: pad.x, y: pad.y, pin: pad.port_hints?.[0] }))\n\n/** SOT143B nominal dimensions: Nexperia SOT143B package outline (mm). */\nexport const SOT143 = ({ footprint = \"sot143\" }: { footprint?: string }) => {\n const pads = getPads(footprint)\n if (pads.length !== 4) throw new Error(\"SOT143 requires four signal pads\")\n const canonical = getPads(\"sot143\")\n const options = fp.string(footprint).json() as { pin1location?: string[] }\n // Resolve pin1location using the numbered pad direction, not bounding boxes:\n // the latter cannot distinguish the 180-degree variants of this package.\n const origin = canonical[1]!\n const target = pads.find((pad) => pad.pin === \"2\")!\n const angle = options.pin1location\n ? Math.round(\n (Math.atan2(target.y, target.x) - Math.atan2(origin.y, origin.x)) /\n (Math.PI / 2),\n ) *\n (Math.PI / 2)\n : 0\n const local = pads.map((pad) => ({\n ...pad,\n x: pad.x * Math.cos(angle) + pad.y * Math.sin(angle),\n y: -pad.x * Math.sin(angle) + pad.y * Math.cos(angle),\n }))\n return (\n <Rotate rotation={[0, 0, angle]}>\n <ChipBody\n width={2.9}\n length={1.3}\n height={0.95}\n heightAboveSurface={0.05}\n center={{ x: 0, y: 0, z: 0 }}\n includeNotch={false}\n taperRatio={0.06}\n />\n {local.map((pad) => {\n const side = pad.y < 0 ? -1 : 1\n const leadWidth = pad.pin === \"1\" ? 0.83 : 0.43\n // Solder land is deliberately larger than the actual lead toe.\n return (\n <SmdChipLead\n key={pad.pin}\n width={leadWidth}\n thickness={0.12}\n height={0.45}\n padContactLength={0.3}\n bodyDistance={0.6}\n rotation={side < 0 ? Math.PI / 2 : -Math.PI / 2}\n position={{ x: pad.x, y: side * 1.15, z: 0.06 }}\n />\n )\n })}\n </Rotate>\n )\n}\n","import { Colorize, Cuboid, Hull, Subtract } from \"jscad-fiber\"\n\n/** Physical outline dimensions in mm, independent of a PCB land pattern. */\nexport interface FlatLeadDiodeDimensions {\n bodyLength: number\n bodyWidth: number\n /** Overall height from the seating plane, including standoff. */\n bodyHeight: number\n /** Outer tip-to-tip span of the two terminals. */\n leadSpan: number\n cathodeLength: number\n cathodeWidth: number\n anodeLength: number\n anodeWidth: number\n terminalThickness: number\n standoff: number\n /** Inset of each top edge relative to the mold base. */\n taperInset: number\n /** Top cathode band width; zero omits the band. */\n markingWidth: number\n}\n\n/** Shared geometry for flat-lead diode outlines; standard wrappers supply defaults.\n * Cathode is at negative X. All dimensions remain physical; no footprint inference.\n */\nexport function createFlatLeadDiode(p: FlatLeadDiodeDimensions) {\n // React/Cosmos can supply auxiliary props such as children. Validate only dimensions.\n const dimensions = [\n \"bodyLength\",\n \"bodyWidth\",\n \"bodyHeight\",\n \"leadSpan\",\n \"cathodeLength\",\n \"cathodeWidth\",\n \"anodeLength\",\n \"anodeWidth\",\n \"terminalThickness\",\n \"standoff\",\n \"taperInset\",\n \"markingWidth\",\n ] as const\n for (const name of dimensions) {\n const value = p[name]\n const allowZero = [\"standoff\", \"taperInset\", \"markingWidth\"].includes(name)\n if (!Number.isFinite(value) || (allowZero ? value < 0 : value <= 0))\n throw new Error(`Invalid diode dimension: ${name}`)\n }\n const overhang = (p.leadSpan - p.bodyLength) / 2\n if (\n overhang < 0 ||\n p.cathodeLength <= overhang ||\n p.anodeLength <= overhang ||\n p.cathodeLength + p.anodeLength >= p.leadSpan ||\n p.cathodeWidth > p.bodyWidth ||\n p.anodeWidth > p.bodyWidth ||\n p.standoff >= p.terminalThickness ||\n p.terminalThickness >= p.bodyHeight ||\n p.taperInset * 2 >= Math.min(p.bodyLength, p.bodyWidth) ||\n p.markingWidth * 2 >= p.bodyLength - p.taperInset * 2\n )\n throw new Error(\n \"Diode dimensions leave disconnected terminals or an invalid mold\",\n )\n const slice = Math.min(p.bodyHeight - p.standoff, p.bodyWidth) / 100\n const body = (\n <Hull>\n <Cuboid\n size={[p.bodyLength, p.bodyWidth, slice]}\n center={[0, 0, p.standoff + slice / 2]}\n />\n <Cuboid\n size={[\n p.bodyLength - p.taperInset * 2,\n p.bodyWidth - p.taperInset * 2,\n slice,\n ]}\n center={[0, 0, p.bodyHeight - slice / 2]}\n />\n </Hull>\n )\n const stripe = (\n <Cuboid\n size={[p.markingWidth, (p.bodyWidth - p.taperInset * 2) * 0.9, slice]}\n center={[\n -p.bodyLength / 2 + p.taperInset + p.markingWidth,\n 0,\n p.bodyHeight - slice / 2,\n ]}\n />\n )\n return (\n <>\n <Colorize color=\"#25272a\">\n {p.markingWidth > 0 ? (\n <Subtract>\n {body}\n {stripe}\n </Subtract>\n ) : (\n body\n )}\n </Colorize>\n <Colorize color=\"#c7c9cd\">\n <Cuboid\n size={[p.cathodeLength, p.cathodeWidth, p.terminalThickness]}\n center={[\n -p.leadSpan / 2 + p.cathodeLength / 2,\n 0,\n p.terminalThickness / 2,\n ]}\n />\n <Cuboid\n size={[p.anodeLength, p.anodeWidth, p.terminalThickness]}\n center={[\n p.leadSpan / 2 - p.anodeLength / 2,\n 0,\n p.terminalThickness / 2,\n ]}\n />\n </Colorize>\n {p.markingWidth > 0 && <Colorize color=\"#aaaaa8\">{stripe}</Colorize>}\n </>\n )\n}\n","import {\n createFlatLeadDiode,\n type FlatLeadDiodeDimensions,\n} from \"./utils/FlatLeadDiode\"\n/** DO-219AD flat-lead outline, with independently sized cathode/anode contacts.\n * Body and terminal dimensions use midpoints of the outline ranges on page 3.\n * Mold standoff, taper and marking dimensions are visual approximations, exposed as props.\n * https://www.vishay.com/doc/?89019=\n * Dimension overrides represent variants of this standard outline. They are\n * geometry parameters, not new Footprinter tokens or manufacturer selectors.\n */\nexport type DO219ADProps = Partial<FlatLeadDiodeDimensions>\nexport const DO219AD = (props: DO219ADProps) =>\n createFlatLeadDiode({\n bodyLength: 2.2,\n bodyWidth: 1.3,\n bodyHeight: 0.68,\n leadSpan: 2.5,\n cathodeLength: 1.3,\n cathodeWidth: 0.88,\n anodeLength: 0.65,\n anodeWidth: 0.65,\n terminalThickness: 0.195,\n standoff: 0.11,\n taperInset: 0.05,\n markingWidth: 0.23,\n\n ...props,\n })\n","import {\n createFlatLeadDiode,\n type FlatLeadDiodeDimensions,\n} from \"./utils/FlatLeadDiode\"\n/** SOD-323HE flat-lead outline with symmetric contacts by default.\n * Dimensional reference: https://www.es.co.th/Schemetic/PDF/RFU02VSM6S.PDF\n * Defaults use nominal 2.0 x 1.4 mm mold, 2.5 mm lead span and 0.6 mm height.\n * Buried terminal length, taper and marking dimensions are visual approximations.\n * https://www.rohm.de/products/diodes/fast-recovery-diodes/standard/rfu02vsm6s-product\n * Dimension overrides represent variants of this standard outline. They are\n * geometry parameters, not new Footprinter tokens or manufacturer selectors.\n */\nexport type SOD323HEProps = Partial<FlatLeadDiodeDimensions>\nexport const SOD323HE = (props: SOD323HEProps) =>\n createFlatLeadDiode({\n bodyLength: 2,\n bodyWidth: 1.4,\n bodyHeight: 0.6,\n leadSpan: 2.5,\n cathodeLength: 0.55,\n cathodeWidth: 0.8,\n anodeLength: 0.55,\n anodeWidth: 0.8,\n terminalThickness: 0.17,\n standoff: 0.05,\n taperInset: 0.15,\n markingWidth: 0.2,\n\n ...props,\n })\n","import { Colorize, Cuboid, Translate, Hull, Union } from \"jscad-fiber\"\n/** Three-terminal SOT-89 / TO-243 / SC-62, in mm. Three flat leads at -X;\n * the middle terminal continues into the exposed die pad and rear tab at +X.\n * Body dimensions exclude metal. Z=0 is the seating plane. Mold draft is an\n * approximation; tab corner chamfers and lead-frame stamping details are omitted.\n */\nexport interface SOT89Props {\n bodyWidth: number\n bodyLength: number\n bodyHeight: number\n standoff: number\n pitch: number\n leadWidth: number\n centerLeadWidth: number\n leadLength: number\n terminalThickness: number\n tabWidth: number\n tabLength: number\n rearExtension: number\n taperInset: number\n}\nexport function SOT89(p: SOT89Props) {\n for (const k of [\n \"bodyWidth\",\n \"bodyLength\",\n \"bodyHeight\",\n \"pitch\",\n \"leadWidth\",\n \"centerLeadWidth\",\n \"leadLength\",\n \"terminalThickness\",\n \"tabWidth\",\n \"tabLength\",\n \"rearExtension\",\n ] as const)\n if (!Number.isFinite(p[k]) || p[k] <= 0)\n throw new Error(`${k} must be finite and positive`)\n if (\n !Number.isFinite(p.standoff) ||\n p.standoff < 0 ||\n !Number.isFinite(p.taperInset) ||\n p.taperInset < 0 ||\n p.terminalThickness <= p.standoff ||\n p.terminalThickness >= p.bodyHeight ||\n 2 * p.pitch + p.leadWidth >= p.bodyLength ||\n p.leadWidth >= p.pitch ||\n p.centerLeadWidth >= p.pitch ||\n p.tabWidth >= 2 * p.pitch - p.leadWidth ||\n p.tabWidth <= p.centerLeadWidth ||\n p.tabLength <= p.rearExtension ||\n p.tabLength >= p.bodyWidth + p.rearExtension ||\n 2 * p.taperInset >= Math.min(p.bodyWidth, p.bodyLength)\n )\n throw new Error(\"Invalid SOT-89 body or terminal layout\")\n const front = -p.bodyWidth / 2,\n rear = p.bodyWidth / 2 + p.rearExtension,\n tabFront = rear - p.tabLength\n const slice = Math.min(0.002, (p.bodyHeight - p.standoff) / 100)\n const block = (x: number, y: number, length: number, width: number) => (\n <Translate offset={[x, y, p.terminalThickness / 2]}>\n <Cuboid size={[length, width, p.terminalThickness]} />\n </Translate>\n )\n return (\n <>\n <Colorize color=\"#353535\">\n <Hull>\n <Translate z={p.standoff + slice / 2}>\n <Cuboid size={[p.bodyWidth, p.bodyLength, slice]} />\n </Translate>\n <Translate z={p.bodyHeight - slice / 2}>\n <Cuboid\n size={[\n p.bodyWidth - 2 * p.taperInset,\n p.bodyLength - 2 * p.taperInset,\n slice,\n ]}\n />\n </Translate>\n </Hull>\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n {[-1, 1].map((sign) =>\n block(\n front - p.leadLength / 2 + 0.125,\n sign * p.pitch,\n p.leadLength + 0.25,\n p.leadWidth,\n ),\n )}\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n <Union>\n {block(\n (front - p.leadLength + tabFront + 0.15) / 2,\n 0,\n tabFront + 0.15 - front + p.leadLength,\n p.centerLeadWidth,\n )}\n {block(rear - p.tabLength / 2, 0, p.tabLength, p.tabWidth)}\n </Union>\n </Colorize>\n </>\n )\n}\n","import { Colorize, Cuboid, Translate, Union } from \"jscad-fiber\"\n/** Flat three-terminal TO-277A outline, in mm. The broad cathode is at +X;\n * two anode contacts are at -X. Body dimensions exclude the metal frame.\n * No solder or footprint dimensions are consumed. Rounded mold edges and\n * terminal corner radii are simplified; the stepped cathode outline is retained.\n */\nexport interface TO277Props {\n bodyWidth: number\n bodyLength: number\n bodyHeight: number\n terminalThickness: number\n terminalSpan: number\n leadWidth: number\n leadLength: number\n pitch: number\n tabLength: number\n tabWidth: number\n tabNeckWidth: number\n tabNeckLength: number\n tabBarWidth: number\n tabBarLength: number\n}\nexport function TO277(p: TO277Props) {\n for (const k of [\n \"bodyWidth\",\n \"bodyLength\",\n \"bodyHeight\",\n \"terminalThickness\",\n \"terminalSpan\",\n \"leadWidth\",\n \"leadLength\",\n \"pitch\",\n \"tabLength\",\n \"tabWidth\",\n \"tabNeckWidth\",\n \"tabNeckLength\",\n \"tabBarWidth\",\n \"tabBarLength\",\n ] as const)\n if (!Number.isFinite(p[k]) || p[k] <= 0)\n throw new Error(`${k} must be finite and positive`)\n const rear = p.terminalSpan / 2,\n front = -rear,\n tabFront = rear - p.tabLength\n if (\n p.terminalThickness >= p.bodyHeight ||\n p.terminalSpan < p.bodyWidth ||\n p.pitch + p.leadWidth >= p.bodyLength ||\n p.leadWidth >= p.pitch ||\n front + p.leadLength >= tabFront ||\n front + p.leadLength <= -p.bodyWidth / 2 ||\n tabFront >= p.bodyWidth / 2 ||\n p.tabNeckWidth > p.tabWidth ||\n p.tabWidth > p.bodyLength ||\n p.tabBarWidth < p.tabWidth ||\n p.tabNeckLength + p.tabBarLength >= p.tabLength\n )\n throw new Error(\"Invalid TO-277 terminal geometry or clearance\")\n const block = (x: number, y: number, length: number, width: number) => (\n <Translate offset={[x, y, p.terminalThickness / 2]}>\n <Cuboid size={[length, width, p.terminalThickness]} />\n </Translate>\n )\n return (\n <>\n <Colorize color=\"#353535\">\n <Translate z={(p.bodyHeight + p.terminalThickness / 2) / 2}>\n <Cuboid\n size={[\n p.bodyWidth,\n p.bodyLength,\n p.bodyHeight - p.terminalThickness / 2,\n ]}\n />\n </Translate>\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n {[-1, 1].map((sign) =>\n block(\n front + p.leadLength / 2,\n (sign * p.pitch) / 2,\n p.leadLength,\n p.leadWidth,\n ),\n )}\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n <Union>\n {block(\n tabFront + (p.tabLength - p.tabNeckLength) / 2,\n 0,\n p.tabLength - p.tabNeckLength,\n p.tabWidth,\n )}\n {block(\n rear - p.tabNeckLength / 2 - 0.01,\n 0,\n p.tabNeckLength + 0.02,\n p.tabNeckWidth,\n )}\n {block(\n tabFront + p.tabBarLength / 2,\n 0,\n p.tabBarLength,\n p.tabBarWidth,\n )}\n </Union>\n </Colorize>\n </>\n )\n}\n","import { fp } from \"@tscircuit/footprinter\"\nimport { Colorize, Cuboid, Hull, Rotate, Translate, Union } from \"jscad-fiber\"\n\n// KYOCERA AVX TAJ standard cases, nominal L/W/H/W1/A (mm):\n// https://datasheets.kyocera-avx.com/TAJ.pdf\nexport const tantalumCases = {\n A: [3.2, 1.6, 1.6, 1.2, 0.8],\n B: [3.5, 2.8, 1.9, 2.2, 0.8],\n C: [6, 3.2, 2.6, 2.2, 1.3],\n D: [7.3, 4.3, 2.9, 2.4, 1.3],\n} as const\nexport type TantalumCase = keyof typeof tantalumCases\n\n/** Explicit case identity is required; copper dimensions do not determine height. */\nexport const TantalumCapacitor = ({\n caseSize = \"A\",\n footprint = \"smdpads2_p3.1mm_pw1.4mm_ph1.6mm\",\n}: { caseSize?: TantalumCase; footprint?: string }) => {\n const dims = tantalumCases[caseSize]\n if (!dims) throw new Error(\"Unsupported tantalum case\")\n const [length, width, height, leadWidth, leadLength] = dims\n const pads = fp\n .string(footprint)\n .circuitJson()\n .filter(\n (e) =>\n e.type === \"pcb_smtpad\" &&\n (e.shape === \"rect\" || e.shape === \"rotated_rect\"),\n )\n if (pads.length !== 2) throw new Error(\"TantalumCapacitor requires two pads\")\n const [a, b] = pads\n const angle = Math.atan2(b!.y - a!.y, b!.x - a!.x)\n return (\n <Translate offset={[(a!.x + b!.x) / 2, (a!.y + b!.y) / 2, 0]}>\n <Rotate rotation={[0, 0, angle]}>\n <Colorize color=\"#d5a64e\">\n <Hull>\n <Cuboid size={[length - 0.1, width, 0.02]} center={[0, 0, 0.21]} />\n <Cuboid\n size={[length - 0.25, width - 0.15, 0.02]}\n center={[0, 0, height - 0.01]}\n />\n </Hull>\n </Colorize>\n <Colorize color=\"#c5c8cb\">\n {[-1, 1].map((side) => (\n <Union key={side}>\n <Cuboid\n size={[leadLength, leadWidth, 0.25]}\n center={[(side * (length - leadLength)) / 2, 0, 0.125]}\n />\n <Cuboid\n size={[0.15, leadWidth, height * 0.45]}\n center={[(side * (length - 0.15)) / 2, 0, height * 0.225]}\n />\n </Union>\n ))}\n </Colorize>\n {/* Positive terminal stripe at pad 1, printed directly on the top face. */}\n <Cuboid\n size={[0.25, width - 0.25, 0.01]}\n center={[-length / 2 + 0.5, 0, height]}\n color=\"#423426\"\n />\n </Rotate>\n </Translate>\n )\n}\n","import { fp } from \"@tscircuit/footprinter\"\nimport { Colorize, Cuboid, RoundedCuboid, Rotate, Translate } from \"jscad-fiber\"\n\n// Manufacturer outlines, L/W/H in mm:\n// https://www.epson.com.cn/ed/search/prod-search.html\n// https://www.ndk.com/en/products/lineup/crystal-unit/NX3225GD.html\nexport const twoPadCrystalPackages = {\n FC135: [3.2, 1.5, 0.9, 0.7],\n FC12M: [2.05, 1.2, 0.6, 0.5],\n FC1610AN: [1.65, 1.05, 0.5, 0.4],\n NX3225GD: [3.2, 2.5, 0.8, 1.2],\n} as const\nexport type TwoPadCrystalPackage = keyof typeof twoPadCrystalPackages\n/** Two-terminal ceramic crystal enclosure. Package identity is explicitly supplied. */\nexport const TwoPadCrystal = ({\n packageName = \"FC135\",\n footprint = \"smdpads2_p2.5mm_pw1mm_ph1.8mm\",\n}: { packageName?: TwoPadCrystalPackage; footprint?: string }) => {\n const dims = twoPadCrystalPackages[packageName]\n if (!dims) throw new Error(\"Unsupported two-pad crystal package\")\n const [length, width, height, terminalLength] = dims\n const pads = fp\n .string(footprint)\n .circuitJson()\n .filter(\n (e) =>\n e.type === \"pcb_smtpad\" &&\n (e.shape === \"rect\" || e.shape === \"rotated_rect\"),\n )\n if (pads.length !== 2) throw new Error(\"TwoPadCrystal requires two pads\")\n const [a, b] = pads\n const angle = Math.atan2(b!.y - a!.y, b!.x - a!.x)\n return (\n <Translate offset={[(a!.x + b!.x) / 2, (a!.y + b!.y) / 2, 0]}>\n <Rotate rotation={[0, 0, angle]}>\n <Colorize color=\"#e0dcca\">\n <Cuboid size={[length, width, 0.2]} center={[0, 0, 0.13]} />\n </Colorize>\n <Colorize color=\"#acb1b8\">\n <RoundedCuboid\n size={[length - 0.04, width - 0.04, height - 0.18]}\n roundRadius={0.035}\n center={[0, 0, (height + 0.18) / 2]}\n />\n </Colorize>\n <Colorize color=\"#c6af65\">\n {[-1, 1].map((side) => (\n <Cuboid\n key={side}\n size={[terminalLength, width - 0.12, 0.06]}\n center={[(side * (length - terminalLength)) / 2, 0, 0.03]}\n />\n ))}\n </Colorize>\n </Rotate>\n </Translate>\n )\n}\n","import { fp } from \"@tscircuit/footprinter\"\nimport { Colorize, Cuboid, Rotate, Translate } from \"jscad-fiber\"\n\n/** Walsin RFANT5220110A0T outer geometry, L/W/T/A = 5.2/2/1.15/0.4 mm.\n * Source: ASC_RFANT5220110A0T_V15, page 2. Pad 1 is the feed end.\n * https://www.allelcoelec.nl/datasheets.1c/RFANT5220110A0T.pdf\n */\nexport const CeramicChipAntenna = ({\n footprint = \"smdpads2_p5.4mm_pw1mm_ph2mm\",\n}: { footprint?: string }) => {\n const pads = fp\n .string(footprint)\n .circuitJson()\n .filter(\n (e) =>\n e.type === \"pcb_smtpad\" &&\n (e.shape === \"rect\" || e.shape === \"rotated_rect\"),\n )\n if (pads.length !== 2) throw new Error(\"CeramicChipAntenna requires two pads\")\n const [a, b] = pads\n const angle = Math.atan2(b!.y - a!.y, b!.x - a!.x)\n return (\n <Translate offset={[(a!.x + b!.x) / 2, (a!.y + b!.y) / 2, 0]}>\n <Rotate rotation={[0, 0, angle]}>\n <Cuboid\n size={[4.44, 1.99, 1.14]}\n center={[0, 0, 0.575]}\n color=\"#4053a3\"\n />\n <Colorize color=\"#c2c4c7\">\n {[-1, 1].map((side) => (\n <Cuboid\n key={side}\n size={[0.4, 2, 1.15]}\n center={[side * 2.4, 0, 0.575]}\n color=\"#c2c4c7\"\n />\n ))}\n </Colorize>\n {/* Identification patch on the top by the feed end; it is not a third pad. */}\n <Cuboid\n size={[0.9, 2, 0.01]}\n center={[-1.75, 0, 1.145]}\n color=\"#b1b3b6\"\n />\n </Rotate>\n </Translate>\n )\n}\n","import { fp } from \"@tscircuit/footprinter\"\nimport { Colorize, Cylinder, Rotate, Translate } from \"jscad-fiber\"\n\n// Vishay MMU/MMA/MMB nominal L, D, K in mm: https://www.vishay.com/doc?28713=\nexport const melfResistorSizes = {\n \"0102\": [2.2, 1.1, 0.4],\n \"0204\": [3.6, 1.4, 0.75],\n \"0207\": [5.8, 2.2, 1.15],\n} as const\nexport type MelfResistorSize = keyof typeof melfResistorSizes\n\n/** Cylindrical resistor with end caps; no diode polarity band or inferred value. */\nexport const MelfResistor = ({\n size = \"0204\",\n footprint = \"smdpads2_p2.8mm_pw1.2mm_ph1.6mm\",\n}: { size?: MelfResistorSize; footprint?: string }) => {\n const dims = melfResistorSizes[size]\n if (!dims) throw new Error(\"Unsupported MELF resistor size\")\n const [length, diameter, capLength] = dims\n const pads = fp\n .string(footprint)\n .circuitJson()\n .filter(\n (e) =>\n e.type === \"pcb_smtpad\" &&\n (e.shape === \"rect\" || e.shape === \"rotated_rect\"),\n )\n if (pads.length !== 2) throw new Error(\"MelfResistor requires two pads\")\n const [a, b] = pads\n const angle = Math.atan2(b!.y - a!.y, b!.x - a!.x)\n return (\n <Translate offset={[(a!.x + b!.x) / 2, (a!.y + b!.y) / 2, diameter / 2]}>\n <Rotate rotation={[0, 0, angle]}>\n <Rotate rotation={[0, Math.PI / 2, 0]}>\n <Colorize color=\"#426d63\">\n <Cylinder\n radius={(diameter - 0.08) / 2}\n height={length - 2 * capLength + 0.04}\n />\n </Colorize>\n <Colorize color=\"#c6c8cb\">\n {[-1, 1].map((side) => (\n <Cylinder\n key={side}\n radius={diameter / 2}\n height={capLength}\n center={[0, 0, (side * (length - capLength)) / 2]}\n />\n ))}\n </Colorize>\n </Rotate>\n </Rotate>\n </Translate>\n )\n}\n"],"mappings":"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","names":["Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","bodyLength","width","height","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Translate","Fragment","jsx","jsxs","Colorize","Cuboid","Translate","Fragment","jsx","jsxs","Colorize","Cuboid","Cylinder","Rotate","Subtract","Translate","Union","jsx","jsxs","width","height","heightAboveSurface","Colorize","Cylinder","Hull","Fragment","jsx","jsxs","width","height","Cylinder","bodyLength","Colorize","Hull","mp","fp","Colorize","Cuboid","Cylinder","ExtrudeLinear","Polygon","Rotate","Translate","jsx","Colorize","Cuboid","Translate","Cylinder","Subtract","Hull","jsx","jsxs","width","height","model","Colorize","face","a","b","c","e","Fragment","jsx","Colorize","jsx","Colorize","Custom","earcut","resolution","revolve","earcut","Fragment","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","cap","distance","jsx","resolution","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jscad","jscad","distance","jscad","index","jscad","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","earcut","cap","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","v","cap","hexRadius","jsx","Colorize","Custom","jsx","model","register","Colorize","Cuboid","Hull","Rotate","Translate","Fragment","Colorize","Cuboid","Subtract","Translate","jsx","jsxs","width","height","Fragment","jsx","jsxs","ratioWidth","ratioHeight","width","height","Colorize","Translate","Rotate","Hull","Cuboid","distance","jsx","model","register","Colorize","Custom","earcut","circle","bottom","top","cap","height","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","v","cap","hexRadius","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","resolution","surface","cap","hexRadius","distance","threadDistance","height","jsx","resolution","Colorize","Custom","jsx","model","register","Colorize","Custom","cap","distance","hexRadius","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","jscad","jscad","jscad","width","holes","Colorize","Custom","Fragment","jsx","jsxs","jscad","jsx","model","register","Colorize","Custom","point","v","cap","angle","z","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","earcut","angle","width","outline","face","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","resolution","surface","cap","threadDistance","resolution","surface","jsx","resolution","Colorize","Custom","jsx","model","register","Colorize","Custom","distance","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","width","height","face","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","width","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","earcut","width","distance","cap","jsx","Colorize","Custom","jsx","model","register","register","Fragment","jsx","jsxs","mp","fp","Colorize","Cuboid","Cylinder","Hull","Subtract","Translate","Union","Fragment","jsx","jsxs","bodyLength","jsx","bodyLength","fp","mp","Rotate","Translate","Polygon","ExtrudeLinear","Rotate","Translate","width","Fragment","jsx","jsxs","height","Translate","Rotate","ExtrudeLinear","Polygon","Polygon","ExtrudeLinear","Translate","Rotate","Colorize","jsx","height","width","Colorize","Translate","Rotate","ExtrudeLinear","Polygon","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","jsxs","Colorize","Cuboid","RoundedCuboid","Translate","Fragment","jsx","jsxs","Fragment","jsx","jsxs","bodyLength","fullLength","width","Colorize","Cuboid","Hull","Rotate","Translate","Fragment","jsx","jsxs","bodyLength","Translate","Cuboid","Colorize","Hull","Rotate","Fragment","jsx","Colorize","Cuboid","Cylinder","Subtract","Translate","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","jsxs","fullLength","bodyLength","Fragment","jsx","jsxs","fullLength","bodyLength","Colorize","Cuboid","Hull","Subtract","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","Colorize","Cylinder","ExtrudeLinear","Polygon","Rotate","RoundedCuboid","Translate","Fragment","jsx","jsxs","width","bodyLength","RoundedCuboid","Cylinder","Colorize","Translate","Rotate","ExtrudeLinear","Polygon","Fragment","jsx","jsxs","fullLength","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Translate","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Union","Hull","Translate","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Union","Hull","Translate","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Union","Hull","Translate","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","bodyLength","Cuboid","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","jsxs","bodyLength","fullLength","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","Hull","Subtract","Translate","Union","Fragment","jsx","jsxs","bodyLength","width","Fragment","jsx","jsxs","bodyLength","fullLength","Cuboid","Translate","Colorize","Hull","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Subtract","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Subtract","Hull","Colorize","Cylinder","Hull","Fragment","jsx","jsxs","bodyLength","Colorize","Cylinder","RoundedCylinder","Rotate","RoundedCuboid","Fragment","jsx","jsxs","bodyLength","Colorize","Cylinder","RoundedCylinder","Rotate","Fragment","jsx","jsxs","bodyLength","Colorize","RoundedCylinder","Rotate","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","Rotate","Subtract","Translate","Fragment","jsx","jsxs","Fragment","jsx","jsxs","bodyLength","Cuboid","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Cuboid","Hull","Translate","Cylinder","Subtract","Fragment","jsx","jsxs","Fragment","jsx","jsxs","bodyLength","Cuboid","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Cuboid","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Union","Translate","Hull","Colorize","Cuboid","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Colorize","Cylinder","Rotate","Sphere","Translate","Fragment","jsx","jsxs","Colorize","Cuboid","Cylinder","Subtract","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","Subtract","Fragment","jsx","jsxs","width","height","Colorize","Subtract","Cuboid","Cylinder","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","Rotate","Subtract","Translate","Fragment","jsx","jsxs","Translate","Rotate","Colorize","Subtract","Cuboid","Cylinder","Colorize","Cuboid","Cylinder","Rotate","Subtract","Translate","Fragment","jsx","jsxs","Translate","Rotate","Colorize","Subtract","Cuboid","Cylinder","Colorize","Cuboid","Subtract","Translate","fp","Fragment","jsx","jsxs","Translate","Colorize","Subtract","Cuboid","fp","fp","Colorize","Cuboid","Rotate","Subtract","Union","jsx","jsxs","width","height","Colorize","Cuboid","Cylinder","Rotate","RoundedCuboid","Subtract","Translate","Fragment","jsx","jsxs","Colorize","Cuboid","Hull","Translate","Fragment","jsx","jsxs","mm","fp","fp","Fragment","jsx","jsxs","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Colorize","Cuboid","Cylinder","Rotate","Subtract","Translate","Fragment","jsx","jsxs","Cuboid","Colorize","Subtract","Cylinder","Translate","Rotate","Colorize","Cuboid","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","Rotate","RoundedCuboid","Subtract","Translate","Fragment","jsx","jsxs","range","Colorize","Cuboid","Hull","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","RoundedCylinder","Subtract","Fragment","jsx","jsxs","height","Colorize","Cuboid","Cylinder","Subtract","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","Fragment","jsx","jsxs","bodyLength","fp","Colorize","Cuboid","Cylinder","Rotate","Subtract","jsx","jsxs","width","height","Cuboid","Translate","Rotate","Colorize","Fragment","jsx","jsxs","fullLength","bodyLength","fp","Colorize","Cuboid","Cylinder","Hull","Rotate","Subtract","Translate","jsx","jsxs","width","height","fp","Rotate","jsx","jsxs","fp","Rotate","Fragment","jsx","mp","model","fp","mm","bodyLength","Rotate","Translate","width","height","Colorize","Cuboid","Hull","Subtract","Fragment","jsx","jsxs","Colorize","Cuboid","Translate","Hull","Union","Fragment","jsx","jsxs","width","Colorize","Cuboid","Translate","Union","Fragment","jsx","jsxs","width","fp","Colorize","Cuboid","Hull","Rotate","Translate","Union","jsx","jsxs","width","height","fp","Colorize","Cuboid","RoundedCuboid","Rotate","Translate","jsx","jsxs","width","height","fp","Colorize","Cuboid","Rotate","Translate","jsx","jsxs","fp","Colorize","Cylinder","Rotate","Translate","jsx","jsxs"]}
1
+ {"version":3,"sources":["../lib/materials.ts","../lib/A01005.tsx","../lib/A0201.tsx","../lib/A0402.tsx","../lib/A0603.tsx","../lib/A0805.tsx","../lib/A1206.tsx","../lib/A1210.tsx","../lib/A2010.tsx","../lib/A2512.tsx","../lib/BGA.tsx","../lib/LGA.tsx","../lib/ChipBody.tsx","../lib/Crystal.tsx","../lib/ExtrudedPads.tsx","../lib/FootprintPad.tsx","../lib/FootprintPlatedHole.tsx","../lib/models/ballbearing/register.tsx","../lib/model-registry.ts","../lib/models/ballbearing/BallBearing.tsx","../lib/mechanical/indexedMeshToGeom3.ts","../lib/models/ballbearing/mesh.ts","../lib/models/balltransferunit/register.tsx","../lib/models/balltransferunit/BallTransferUnit.tsx","../lib/models/balltransferunit/mesh.ts","../lib/mechanical/extrude-planar-profile.ts","../lib/models/buttonscrew/register.tsx","../lib/models/buttonscrew/ButtonScrew.tsx","../lib/models/buttonscrew/mesh.ts","../lib/models/cablegrommet/register.tsx","../lib/models/cablegrommet/CableGrommet.tsx","../lib/models/cablegrommet/mesh.ts","../lib/models/clampingshaftcollar/register.tsx","../lib/models/clampingshaftcollar/ClampingShaftCollar.tsx","../lib/models/clampingshaftcollar/mesh.ts","../lib/mechanical/shaft-mount-geometry.ts","../lib/models/compressionspring/register.tsx","../lib/models/compressionspring/CompressionSpring.tsx","../lib/models/compressionspring/mesh.ts","../lib/mechanical/clip-mesh-to-z-range.ts","../lib/models/flangedbushing/register.tsx","../lib/models/flangedbushing/FlangedBushing.tsx","../lib/models/flangedbushing/mesh.ts","../lib/models/flatheadscrew/register.tsx","../lib/models/flatheadscrew/FlatHeadScrew.tsx","../lib/models/flatheadscrew/mesh.ts","../lib/models/flexscreen/register.tsx","../lib/FlexScreen.tsx","../lib/Screen.tsx","../lib/models/helicalgear/register.tsx","../lib/HelicalGear.tsx","../lib/mechanical/helical-gear-mesh.ts","../lib/mechanical/spur-gear-mesh.ts","../lib/models/hexbolt/register.tsx","../lib/models/hexbolt/HexBolt.tsx","../lib/models/hexbolt/mesh.ts","../lib/models/hexnut/register.tsx","../lib/models/hexnut/HexNut.tsx","../lib/models/hexnut/mesh.ts","../lib/models/hexsocketbolt/register.tsx","../lib/HexSocketBolt.tsx","../lib/mechanical/hex-socket-bolt-mesh.ts","../lib/models/hollowpositioningarmtube/register.tsx","../lib/models/hollowpositioningarmtube/HollowPositioningArmTube.tsx","../lib/models/hollowpositioningarmtube/mesh.ts","../lib/models/nema/register.tsx","../lib/NemaMotor.tsx","../lib/utils/nemaMotorWireGeometry.ts","../lib/utils/nemaMotorParameters.ts","../lib/utils/nemaMotorGeometry.ts","../lib/models/panscrew/register.tsx","../lib/models/panscrew/PanScrew.tsx","../lib/models/panscrew/mesh.ts","../lib/models/plainbushing/register.tsx","../lib/models/plainbushing/PlainBushing.tsx","../lib/models/plainbushing/mesh.ts","../lib/models/rigidcoupler/register.tsx","../lib/models/rigidcoupler/RigidCoupler.tsx","../lib/models/rigidcoupler/mesh.ts","../lib/models/shaftcollar/register.tsx","../lib/models/shaftcollar/ShaftCollar.tsx","../lib/models/shaftcollar/mesh.ts","../lib/models/sheetmetal/register.tsx","../lib/SheetMetal.tsx","../lib/mechanical/sheet-metal-mesh.ts","../lib/models/spurgear/register.tsx","../lib/SpurGear.tsx","../lib/models/threadedrod/register.tsx","../lib/models/threadedrod/ThreadedRod.tsx","../lib/models/threadedrod/mesh.ts","../lib/models/torsionspring/register.tsx","../lib/models/torsionspring/TorsionSpring.tsx","../lib/models/torsionspring/mesh.ts","../lib/models/tslotextrusion/register.tsx","../lib/models/tslotextrusion/TSlotExtrusion.tsx","../lib/models/tslotextrusion/mesh.ts","../lib/models/tslotgusset/register.tsx","../lib/models/tslotgusset/TSlotGusset.tsx","../lib/models/tslotgusset/mesh.ts","../lib/models/tslotinsidecorner/register.tsx","../lib/models/tslotinsidecorner/TSlotInsideCorner.tsx","../lib/models/tslotinsidecorner/mesh.ts","../lib/models/wormgear/register.tsx","../lib/WormGear.tsx","../lib/mechanical/worm-gear-mesh.ts","../lib/generated/model-renderers.ts","../lib/default-model-registry.ts","../lib/utils/DualRowGullWing.tsx","../lib/SSOP.tsx","../lib/utils/FootprinterBodyModels.tsx","../lib/Footprinter3d.tsx","../lib/DualInlinePackage.tsx","../lib/utils/range.ts","../lib/utils/getExpandedStroke.ts","../lib/SmdChipLead.tsx","../lib/Tssop.tsx","../lib/MSOP.tsx","../lib/SmdLED.tsx","../lib/qfp.tsx","../lib/PinHeader.tsx","../lib/PinRow.tsx","../lib/utils/PhysicalQfn.tsx","../lib/qfn.tsx","../lib/utils/getQuadCoords.ts","../lib/utils/getQuadPinMap.ts","../lib/SOT-235.tsx","../lib/SOT-23-3P.tsx","../lib/SOT-23W.tsx","../lib/FemaleHeader.tsx","../lib/FemaleHeaderRow.tsx","../lib/PushButton.tsx","../lib/SOIC.tsx","../lib/VSSOP.tsx","../lib/SOD523.tsx","../lib/SOD882.tsx","../lib/SMA.tsx","../lib/SMB.tsx","../lib/SMC.tsx","../lib/SMF.tsx","../lib/sod-123F.tsx","../lib/sod-123FL.tsx","../lib/sod-123W.tsx","../lib/sod-123.tsx","../lib/sod-128.tsx","../lib/SOD-923.tsx","../lib/SOT-223.tsx","../lib/tqfp.tsx","../lib/SOT-323.tsx","../lib/utils/PhysicalLqfp.tsx","../lib/lqfp.tsx","../lib/SOT-723.tsx","../lib/dfn.tsx","../lib/hc49.tsx","../lib/MicroMELF.tsx","../lib/MINIMELF.tsx","../lib/MELF.tsx","../lib/ms012.tsx","../lib/ms013.tsx","../lib/TO220.tsx","../lib/SOT-457.tsx","../lib/SOT-963.tsx","../lib/TO92.tsx","../lib/SOT-363.tsx","../lib/SOT-886.tsx","../lib/sod-323.tsx","../lib/sod-323F.tsx","../lib/sod-323FL.tsx","../lib/AxialCapacitor.tsx","../lib/stampboard.tsx","../lib/MountedPcbModule.tsx","../lib/SOD723.tsx","../lib/JSTZH1_5mm.tsx","../lib/JSTPH2_0mm.tsx","../lib/JSTXH2_5mm.tsx","../lib/JstSh.tsx","../lib/FPC.tsx","../lib/SmdPinHeader.tsx","../lib/utils/getPlatedHoleCenters.ts","../lib/utils/getSmtPadRects.ts","../lib/GullWingBody.tsx","../lib/ParametricChip.tsx","../lib/Led5050.tsx","../lib/Led2835.tsx","../lib/RJ45.tsx","../lib/DPAK.tsx","../lib/ElectrolyticCapacitor.tsx","../lib/Potentiometer.tsx","../lib/SmdPushButton.tsx","../lib/SmdSlideSwitch.tsx","../lib/SOT-563.tsx","../lib/UsbCMidmount.tsx","../lib/SOT143.tsx","../lib/utils/FlatLeadDiode.tsx","../lib/DO219AD.tsx","../lib/SOD323HE.tsx","../lib/SOT89.tsx","../lib/TO277.tsx","../lib/TantalumCapacitor.tsx","../lib/TwoPadCrystal.tsx","../lib/CeramicChipAntenna.tsx","../lib/MelfResistor.tsx"],"sourcesContent":["/** Approximate visual finishes, not measured optical properties. */\nexport const componentMaterials = {\n moldedPlastic: { metalness: 0, roughness: 0.7 },\n rubber: { metalness: 0, roughness: 0.9 },\n sleeve: { metalness: 0, roughness: 0.45 },\n tinnedLead: { metalness: 0.8, roughness: 0.55 },\n goldContact: { metalness: 1, roughness: 0.25 },\n copper: { metalness: 1, roughness: 0.35 },\n brushedMetal: { metalness: 1, roughness: 0.4 },\n steel: { metalness: 1, roughness: 0.25 },\n} as const\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 0.4 // 0.4mm length\nconst width = 0.2 // 0.2mm width\nconst height = 0.13 // 0.13mm height\nconst terminatorWidth = 0.07\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A01005 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 0.6\nconst width = 0.3\nconst height = 0.33\nconst terminatorWidth = 0.1\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A0201 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 1.0\nconst width = 0.5\nconst height = 0.5\nconst terminatorWidth = 0.2\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A0402 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cube, Cuboid, Translate, Union } from \"jscad-fiber\"\n\n// TERMINATORS are the two gray metal boxes on the ends of the resistor\n// BODY is the black box middle part\n\nconst fullLength = 1.6\nconst bodyLength = fullLength - 0.3 * 2\nconst terminatorLength = 0.3\nconst width = 0.85\nconst height = 0.6\n\nexport const A0603 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorLength, width, height]}\n offset={[fullLength / 2 - terminatorLength / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorLength, width, height]}\n offset={[-fullLength / 2 + terminatorLength / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 2.0\nconst width = 1.25\nconst height = 0.55\nconst terminatorWidth = 0.5\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A0805 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 3.2\nconst width = 1.6\nconst height = 0.9\nconst terminatorWidth = 0.5\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A1206 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 3.2\nconst width = 2.5\nconst height = 1\nconst terminatorWidth = 0.6\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A1210 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 5.0\nconst width = 2.5\nconst height = 1.4\nconst terminatorWidth = 0.6\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A2010 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\nconst fullLength = 6.3\nconst width = 3.2\nconst height = 1.8\nconst terminatorWidth = 0.8\n\nconst bodyLength = fullLength - terminatorWidth * 2\n\nexport const A2512 = ({ color = \"#333\" }) => {\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { Cuboid, Sphere, Translate, Colorize, Rotate } from \"jscad-fiber\"\nimport { fp } from \"@tscircuit/footprinter\"\n\ninterface BGAProps {\n packageWidth?: number\n packageLength?: number\n packageHeight?: number\n standoffHeight?: number\n ballPitch?: number\n ballDiameter?: number\n ballRows?: number\n ballColumns?: number\n missingBalls?: number[]\n footprintString?: string\n}\n\nexport const BGA = ({\n packageWidth = 10,\n packageLength = 10,\n packageHeight = 1.2,\n standoffHeight = 0.2,\n ballPitch = 0.8,\n ballDiameter = 0.5,\n ballRows = 8,\n ballColumns = 8,\n missingBalls = [],\n footprintString,\n}: BGAProps) => {\n const bodyHeight = packageHeight - standoffHeight\n const bodyOffset = standoffHeight + bodyHeight / 2\n // The balls sit IN the standoff gap, between the board and the package.\n // This used to be -standoffHeight / 2, which centres them BELOW z = 0: every\n // ball hung through the board, which an underside view shows immediately.\n // Clamped to the ball radius so a ball larger than the gap still rests on\n // the board rather than sinking into it.\n const ballOffset = Math.max(standoffHeight / 2, ballDiameter / 2)\n\n const ballsSoup = footprintString\n ? fp.string(footprintString).circuitJson()\n : null\n\n return (\n <>\n {/* Package body */}\n <Translate z={bodyOffset}>\n <Colorize color=\"#555\">\n <Cuboid size={[packageWidth, packageLength, bodyHeight]} />\n </Colorize>\n </Translate>\n\n {/* Balls via ball parameters */}\n {!footprintString &&\n Array.from({ length: ballRows * ballColumns }).map((_, index) => {\n if (missingBalls.includes(index + 1)) return null\n const row = Math.floor(index / ballColumns)\n const col = index % ballColumns\n const x = (col - (ballColumns - 1) / 2) * ballPitch\n const y = (row - (ballRows - 1) / 2) * ballPitch\n return (\n <Translate key={index} x={x} y={y} z={ballOffset}>\n <Sphere radius={ballDiameter / 2} />\n </Translate>\n )\n })}\n\n {/* Balls via footprint string */}\n {ballsSoup &&\n ballsSoup.map((elm, index) => {\n if (elm.type === \"pcb_smtpad\") {\n return (\n <Translate\n key={index}\n x={(elm as any).x}\n y={(elm as any).y}\n z={ballOffset}\n >\n <Sphere radius={ballDiameter / 2} />\n </Translate>\n )\n }\n return null\n })}\n </>\n )\n}\n","import { Colorize, Cuboid, Translate, Cylinder, Subtract } from \"jscad-fiber\"\n/** Molded perimeter-land LGA. Opposite rows have equal counts; adjacent rows\n * may differ. Pads remain entirely under the body, with no QFN exposed pad.\n * X crosses the left/right rows. Pin 1 is at -X,+Y; dimensions are in mm.\n * This models the external envelope, not sensor-specific lids or apertures.\n */\nexport interface LGAProps {\n bodyWidth: number\n bodyLength: number\n bodyHeight: number\n landsPerSideX: number\n landsPerSideY: number\n pitch: number\n landWidth: number\n landLength: number\n /** Distance from the body edge to the outer edge of each land. */\n edgeInset: number\n /** Representative metallization thickness, not solder standoff. */\n landThickness: number\n}\nexport function LGA(p: LGAProps) {\n for (const k of [\n \"bodyWidth\",\n \"bodyLength\",\n \"bodyHeight\",\n \"pitch\",\n \"landWidth\",\n \"landLength\",\n \"landThickness\",\n ] as const)\n if (!Number.isFinite(p[k]) || p[k] <= 0)\n throw new Error(`${k} must be finite and positive`)\n for (const k of [\"landsPerSideX\", \"landsPerSideY\"] as const)\n if (!Number.isInteger(p[k]) || p[k] < 0)\n throw new Error(`${k} must be a nonnegative integer`)\n if (\n !Number.isFinite(p.edgeInset) ||\n p.edgeInset < 0 ||\n p.landThickness >= p.bodyHeight ||\n p.landWidth >= p.pitch ||\n p.landsPerSideX + p.landsPerSideY < 1\n )\n throw new Error(\"Invalid land layout or thickness\")\n const layouts = [\n {\n count: p.landsPerSideX,\n across: p.bodyWidth,\n along: p.bodyLength,\n horizontal: true,\n },\n {\n count: p.landsPerSideY,\n across: p.bodyLength,\n along: p.bodyWidth,\n horizontal: false,\n },\n ]\n for (const l of layouts) {\n if (l.count === 0) continue\n const row = (l.count - 1) * p.pitch + p.landWidth\n if (\n row >= l.along - 2 * p.edgeInset ||\n 2 * (p.edgeInset + p.landLength) >= l.across\n )\n throw new Error(\n \"Lands must fit below the body without opposite-row overlap\",\n )\n const other = l.horizontal ? p.landsPerSideY : p.landsPerSideX\n if (\n other > 0 &&\n row >= l.along - 2 * (p.edgeInset + p.landLength) &&\n (other - 1) * p.pitch + p.landWidth >=\n l.across - 2 * (p.edgeInset + p.landLength)\n )\n throw new Error(\"Adjacent land rows overlap at corners\")\n }\n const r = Math.min(p.bodyWidth, p.bodyLength) * 0.035\n return (\n <>\n <Colorize color=\"#353535\">\n <Subtract>\n <Translate z={(p.bodyHeight + p.landThickness / 2) / 2}>\n <Cuboid\n size={[\n p.bodyWidth,\n p.bodyLength,\n p.bodyHeight - p.landThickness / 2,\n ]}\n />\n </Translate>\n <Translate\n offset={[\n -p.bodyWidth / 2 + 2 * r,\n p.bodyLength / 2 - 2 * r,\n p.bodyHeight,\n ]}\n >\n <Cylinder radius={r} height={Math.min(0.04, p.bodyHeight / 10)} />\n </Translate>\n </Subtract>\n </Colorize>\n <Colorize color=\"#c5b987\">\n {layouts.flatMap((l) =>\n [-1, 1].flatMap((sign) =>\n Array.from({ length: l.count }, (_, i) => {\n const across =\n sign * (l.across / 2 - p.edgeInset - p.landLength / 2),\n along = ((l.count - 1) / 2 - i) * p.pitch\n return (\n <Translate\n key={`${l.horizontal}-${sign}-${i}`}\n offset={[\n l.horizontal ? across : along,\n l.horizontal ? along : across,\n p.landThickness / 2,\n ]}\n >\n <Cuboid\n size={\n l.horizontal\n ? [p.landLength, p.landWidth, p.landThickness]\n : [p.landWidth, p.landLength, p.landThickness]\n }\n />\n </Translate>\n )\n }),\n ),\n )}\n </Colorize>\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport {\n Colorize,\n Cuboid,\n Cylinder,\n Hull,\n Rotate,\n Subtract,\n Translate,\n Union,\n} from \"jscad-fiber\"\nexport interface ChipBodyProps {\n width: number\n length: number\n height: number\n heightAboveSurface?: number\n center: { x: number; y: number; z: number }\n color?: string\n taperRatio?: number\n faceRatio?: number\n straightHeightRatio?: number\n includeNotch?: boolean\n notchRadius?: number\n notchPosition?: { x: number; y: number; z: number }\n notchRotation?: [number, number, number]\n notchLength?: number\n notchWidth?: number\n chamferSize?: number\n}\n\nexport const ChipBody = ({\n center,\n width,\n length,\n height,\n heightAboveSurface = 0.15,\n color = \"#555\",\n taperRatio = 0.12,\n faceRatio = 0.75,\n straightHeightRatio = 0.5,\n includeNotch = true,\n notchRadius,\n notchPosition,\n notchRotation = [0, 0, 0],\n notchLength = 0.5,\n notchWidth = 0.25,\n chamferSize = 0,\n}: ChipBodyProps) => {\n const straightHeight = height * straightHeightRatio\n const taperHeight = height - straightHeight\n const taperInset = Math.min(width, length) * taperRatio\n const faceWidth = Math.max(width - taperInset, width * faceRatio)\n const faceLength = Math.max(length - taperInset, length * faceRatio)\n const defaultNotchRadius = Math.min(width, length) * 0.12\n const actualNotchRadius = notchRadius ?? defaultNotchRadius\n const defaultNotchPosition = {\n x: 0,\n y: length / 2 - actualNotchRadius * 0.25,\n z: height,\n }\n const actualNotchPosition = notchPosition ?? defaultNotchPosition\n const body = (\n <Union>\n <Hull>\n <Translate z={0.005}>\n <Cuboid size={[faceWidth, faceLength, 0.01]} />\n </Translate>\n <Translate z={straightHeight}>\n <Cuboid size={[width, length, 0.01]} />\n </Translate>\n </Hull>\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[width, length, 0.01]} />\n </Translate>\n <Translate z={straightHeight + taperHeight}>\n <Cuboid size={[faceWidth, faceLength, 0.01]} />\n </Translate>\n </Hull>\n </Union>\n )\n\n // TODO the bodies flex a bit outward IRL\n\n const chamferCutout = (xPos: number, yPos: number) => (\n <Translate offset={{ x: xPos, y: yPos, z: 0 }}>\n <Rotate rotation={[0, 0, Math.PI / 4]}>\n <Cuboid\n size={[\n chamferSize * Math.SQRT2,\n chamferSize * Math.SQRT2,\n height * 3,\n ]}\n />\n </Rotate>\n </Translate>\n )\n\n let finalBody = body\n\n if (chamferSize > 0) {\n const xOffset = width / 2\n const yOffset = length / 2\n finalBody = (\n <Subtract>\n {body}\n {chamferCutout(xOffset, yOffset)}\n {chamferCutout(-xOffset, yOffset)}\n {chamferCutout(xOffset, -yOffset)}\n {chamferCutout(-xOffset, -yOffset)}\n </Subtract>\n )\n }\n\n return (\n <Colorize color={color} material={componentMaterials.moldedPlastic}>\n <Translate offset={center}>\n <Translate offset={{ x: 0, y: 0, z: heightAboveSurface }}>\n {includeNotch ? (\n <Subtract>\n {finalBody}\n <Translate offset={actualNotchPosition}>\n <Rotate rotation={notchRotation}>\n <Cylinder radius={actualNotchRadius} height={notchWidth} />\n </Rotate>\n </Translate>\n </Subtract>\n ) : (\n finalBody\n )}\n </Translate>\n </Translate>\n </Colorize>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport { Colorize, Cylinder, ExtrudeLinear, Hull, Polygon } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\n\nexport interface CrystalProps {\n horizontalPadPitch?: number\n verticalPadPitch?: number\n padWidth?: number\n padHeight?: number\n bodyHeight?: number\n}\n\ntype Point = [number, number]\n\nconst getTerminalPoints = (\n [centerX, centerY]: Point,\n width: number,\n length: number,\n chamfer: number,\n isPinOne: boolean,\n): Point[] => {\n const xDirection = Math.sign(centerX)\n const yDirection = Math.sign(centerY)\n const halfWidth = width / 2\n const halfLength = length / 2\n const innerChamfer = isPinOne ? Math.min(0.32, length * 0.36) : 0\n const outerChamfer = Math.min(chamfer, halfWidth, halfLength)\n const points: Point[] = [\n [-halfWidth, -halfLength],\n [halfWidth, -halfLength],\n [halfWidth, halfLength - outerChamfer],\n [halfWidth - outerChamfer, halfLength],\n [-halfWidth, halfLength],\n ]\n if (innerChamfer) {\n points[0] = [-halfWidth + innerChamfer, -halfLength]\n points.push([-halfWidth, -halfLength + innerChamfer])\n }\n\n const oriented = points.map(\n ([x, y]) => [centerX + x * xDirection, centerY + y * yDirection] as Point,\n )\n\n return xDirection * yDirection < 0 ? oriented.reverse() : oriented\n}\n\ntype RoundedRectProfileOptions = {\n width: number\n length: number\n height: number\n radius: number\n z: number\n}\n\nconst getRoundedRectProfile = ({\n width,\n length,\n radius,\n height,\n z,\n}: RoundedRectProfileOptions) => {\n const x = width / 2 - radius\n const y = length / 2 - radius\n\n return (\n [\n [-x, -y],\n [x, -y],\n [x, y],\n [-x, y],\n ] as const\n ).map(([cornerX, cornerY], index) => (\n <Cylinder\n key={`${z}-${index}`}\n center={[cornerX, cornerY, z + height / 2]}\n height={height}\n radius={radius}\n />\n ))\n}\n\nexport const Crystal = ({\n horizontalPadPitch = 2.2,\n verticalPadPitch = 1.7,\n padWidth = 1.4,\n padHeight = 1.2,\n bodyHeight = 0.7,\n}: CrystalProps) => {\n const bodyWidth = horizontalPadPitch + padWidth * (5 / 7)\n const bodyLength = verticalPadPitch + padHeight * (2 / 3)\n const terminalThickness = Math.min(0.01, bodyHeight * 0.02)\n const terminalWidth = padWidth * (5 / 7)\n const terminalLength = padHeight * 0.75\n const ceramicTopZ = bodyHeight * (5 / 7)\n const baseHeight = ceramicTopZ - terminalThickness\n const sealHeight = bodyHeight * (2 / 35)\n const sealWidth = bodyWidth * 0.95\n const sealLength = bodyLength * 0.94\n const lidShoulderWidth = bodyWidth * 0.905\n const lidShoulderLength = bodyLength * 0.9\n const lidTopWidth = bodyWidth * 0.83\n const lidTopLength = bodyLength * 0.82\n const lidBaseZ = ceramicTopZ + sealHeight\n const lidProfileHeight = Math.min(0.01, bodyHeight * 0.015)\n const bodyChamfer = Math.min(0.12, bodyLength * 0.05)\n const terminalX = (bodyWidth - terminalWidth) / 2\n const terminalY = (bodyLength - terminalLength) / 2\n const terminalPositions = [\n [-terminalX, -terminalY],\n [terminalX, -terminalY],\n [terminalX, terminalY],\n [-terminalX, terminalY],\n ] satisfies Point[]\n const sealProfile = getRoundedRectProfile({\n width: sealWidth,\n length: sealLength,\n radius: Math.min(0.13, sealLength * 0.08),\n height: sealHeight,\n z: ceramicTopZ,\n })\n const lidProfiles = [\n ...getRoundedRectProfile({\n width: lidShoulderWidth,\n length: lidShoulderLength,\n radius: Math.min(0.14, lidShoulderLength * 0.08),\n height: lidProfileHeight,\n z: lidBaseZ,\n }),\n ...getRoundedRectProfile({\n width: lidTopWidth,\n length: lidTopLength,\n radius: Math.min(0.15, lidTopLength * 0.09),\n height: lidProfileHeight,\n z: bodyHeight - lidProfileHeight,\n }),\n ]\n\n return (\n <>\n {terminalPositions.map((center, index) => (\n <Colorize\n key={index}\n color=\"#d6a258\"\n material={componentMaterials.goldContact}\n >\n <ExtrudeLinear height={terminalThickness}>\n <Polygon\n points={getTerminalPoints(\n center,\n terminalWidth,\n terminalLength,\n bodyChamfer,\n index === 0,\n )}\n />\n </ExtrudeLinear>\n </Colorize>\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: terminalThickness }}\n width={bodyWidth}\n length={bodyLength}\n height={baseHeight - 0.005}\n heightAboveSurface={0}\n color=\"#34343d\"\n taperRatio={0}\n straightHeightRatio={1}\n includeNotch={false}\n chamferSize={bodyChamfer}\n />\n <Colorize color=\"#d2a057\" material={componentMaterials.goldContact}>\n <Hull>{sealProfile}</Hull>\n </Colorize>\n <Colorize color=\"#b9bec2\" material={componentMaterials.brushedMetal}>\n <Hull>{lidProfiles}</Hull>\n </Colorize>\n </>\n )\n}\n","import { mp } from \"@tscircuit/modelprinter\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport { fp } from \"@tscircuit/footprinter\"\nimport { FootprintPad } from \"./FootprintPad\"\nimport { FootprintPlatedHole } from \"./FootprintPlatedHole\"\nimport { modelRendererRegistry } from \"./default-model-registry\"\n\nexport const ExtrudedPads = ({\n circuitJson,\n footprint,\n}: { circuitJson?: AnyCircuitElement[]; footprint?: string }) => {\n // Mechanical models do not have PCB copper pads.\n if (\n !circuitJson &&\n footprint &&\n modelRendererRegistry.get(\n mp.string(footprint.split(\"_\", 1)[0]!).params().fn,\n )?.pads === \"none\"\n ) {\n mp.string(footprint).json() // Validate mechanical parameters before returning.\n return null\n }\n if (!circuitJson && footprint) {\n circuitJson = fp.string(footprint).circuitJson() as AnyCircuitElement[]\n }\n\n if (!circuitJson)\n throw new Error(\"No circuit json or footprint provided to ExtrudedPads\")\n\n return (\n <>\n {circuitJson\n .filter((s) => s.type === \"pcb_smtpad\")\n .map((pad, i) => {\n const isPin1 = pad.port_hints?.includes(\"1\")\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey:\n <FootprintPad key={i} pad={pad} isPin1={isPin1} />\n )\n })}\n {circuitJson\n .filter((s) => s.type === \"pcb_plated_hole\")\n .map((hole, i) => {\n const isPin1 = hole.port_hints?.includes(\"1\")\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey:\n <FootprintPlatedHole key={i} hole={hole} isPin1={isPin1} />\n )\n })}\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport type { PcbSmtPad } from \"circuit-json\"\nimport {\n Colorize,\n Cuboid,\n Cylinder,\n ExtrudeLinear,\n Polygon,\n Rotate,\n Translate,\n} from \"jscad-fiber\"\n\nconst PAD_THICKNESS = 0.01\n\nexport const FootprintPad = ({\n pad,\n isPin1,\n}: { pad: PcbSmtPad; isPin1?: boolean }) => {\n const color: [number, number, number] = isPin1 ? [0, 255, 0] : [255, 0, 0]\n\n if (pad.shape === \"rect\" || pad.shape === \"rotated_rect\") {\n return (\n <Colorize color={color} material={componentMaterials.copper}>\n <Translate offset={[pad.x, pad.y, -0.005]}>\n <Rotate\n angles={[\n 0,\n 0,\n pad.shape === \"rotated_rect\"\n ? (pad.ccw_rotation * Math.PI) / 180\n : 0,\n ]}\n >\n <Cuboid size={[pad.width, pad.height, PAD_THICKNESS]} />\n </Rotate>\n </Translate>\n </Colorize>\n )\n }\n\n if (pad.shape === \"circle\") {\n const radius = (pad as any).radius ?? (pad as any).r ?? 0.25\n return (\n <Colorize color={color} material={componentMaterials.copper}>\n <Translate offset={[pad.x, pad.y, -0.005]}>\n <Cylinder radius={radius} height={PAD_THICKNESS} />\n </Translate>\n </Colorize>\n )\n }\n\n // A polygon pad is how footprinter describes a tab — SOT-89's, for one. It\n // used to throw, which meant a footprint could not be rendered WITH ITS PADS\n // at all, and the failure named the shape rather than the footprint.\n if (pad.shape === \"polygon\") {\n const points = (pad.points ?? []).map(\n ({ x, y }) => [x, y] as [number, number],\n )\n if (points.length < 3) return null\n return (\n <Colorize color={color} material={componentMaterials.copper}>\n <Translate offset={[0, 0, -0.005]}>\n <ExtrudeLinear height={PAD_THICKNESS}>\n <Polygon points={points} />\n </ExtrudeLinear>\n </Translate>\n </Colorize>\n )\n }\n\n throw new Error(\"Shape not supported: \" + pad.shape)\n}\n","import { componentMaterials } from \"./materials\"\nimport type { PcbPlatedHole } from \"circuit-json\"\nimport {\n Colorize,\n Cuboid,\n Translate,\n Cylinder,\n Subtract,\n Hull,\n} from \"jscad-fiber\"\n\nexport const FootprintPlatedHole = ({\n hole,\n isPin1,\n}: { hole: PcbPlatedHole; isPin1?: boolean }) => {\n const color = isPin1 ? \"#00ff00\" : \"#b87333\"\n\n if (hole.shape === \"circle\") {\n return (\n <Colorize color={color} material={componentMaterials.copper}>\n <Translate offset={[hole.x, hole.y, -0.005]}>\n <Subtract>\n <Cylinder radius={hole.outer_diameter / 2} height={0.01} />\n <Cylinder radius={hole.hole_diameter / 2} height={0.01} />\n </Subtract>\n </Translate>\n </Colorize>\n )\n }\n if (hole.shape === \"circular_hole_with_rect_pad\") {\n return (\n <Colorize color={color} material={componentMaterials.copper}>\n <Translate offset={[hole.x, hole.y, 0]}>\n <Subtract>\n <Cuboid\n size={[hole.rect_pad_width, hole.rect_pad_height, 0.01]}\n center={[0, 0, 0]}\n />\n <Cylinder radius={hole.hole_diameter / 2} height={0.01} />\n </Subtract>\n </Translate>\n </Colorize>\n )\n }\n if (hole.shape === \"pill\") {\n const width = hole.outer_width\n const height = hole.outer_height\n const radius = Math.min(width, height) / 2\n const isHorizontal = width > height\n\n const holeWidth = hole.hole_width ?? 0.8\n const holeHeight = hole.hole_height ?? 0.8\n\n return (\n <Colorize color={color} material={componentMaterials.copper}>\n <Translate offset={[hole.x, hole.y, 0]}>\n <Subtract>\n <Hull>\n <Cylinder\n radius={radius}\n height={0.01}\n center={[\n isHorizontal ? -(width / 2 - radius) : 0,\n isHorizontal ? 0 : -(height / 2 - radius),\n 0,\n ]}\n />\n <Cylinder\n radius={radius}\n height={0.01}\n center={[\n isHorizontal ? width / 2 - radius : 0,\n isHorizontal ? 0 : height / 2 - radius,\n 0,\n ]}\n />\n </Hull>\n {holeWidth === holeHeight ? (\n <Cylinder radius={holeWidth / 2} height={0.01} />\n ) : (\n <Hull>\n <Cylinder\n radius={Math.min(holeWidth, holeHeight) / 2}\n height={0.01}\n center={[\n holeWidth > holeHeight\n ? -(holeWidth / 2 - holeHeight / 2)\n : 0,\n holeWidth > holeHeight\n ? 0\n : -(holeHeight / 2 - holeWidth / 2),\n 0,\n ]}\n />\n <Cylinder\n radius={Math.min(holeWidth, holeHeight) / 2}\n height={0.01}\n center={[\n holeWidth > holeHeight ? holeWidth / 2 - holeHeight / 2 : 0,\n holeWidth > holeHeight ? 0 : holeHeight / 2 - holeWidth / 2,\n 0,\n ]}\n />\n </Hull>\n )}\n </Subtract>\n </Translate>\n </Colorize>\n )\n }\n throw new Error(\"Shape not supported: \" + hole.shape)\n}\n","import { ballBearingModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { BallBearing } from \"./BallBearing\"\n\nexport const model = defineModelRenderer({\n name: \"ballbearing\",\n schema: ballBearingModelDefinitionSchema,\n render: ({ fn, ...props }) => <BallBearing {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { ModelDefinition } from \"@tscircuit/modelprinter\"\nimport type { JSX } from \"react\"\n\nexport type ModelRendererName = ModelDefinition[\"fn\"]\nexport type ModelRendererDefinition<Name extends ModelRendererName> = Extract<\n ModelDefinition,\n { fn: Name }\n>\nexport type ModelPadBehavior = \"none\" | \"footprinter\"\n\ntype IsUnion<Value, Whole = Value> = Value extends Whole\n ? [Whole] extends [Value]\n ? false\n : true\n : never\n\ntype LiteralModelName<Name extends ModelRendererName> =\n true extends IsUnion<Name> ? never : Name\n\nexport type ModelRenderer<Name extends ModelRendererName> = {\n readonly name: Name\n readonly schema: {\n parse(input: unknown): ModelRendererDefinition<NoInfer<Name>>\n }\n readonly render: (\n definition: ModelRendererDefinition<NoInfer<Name>>,\n ) => JSX.Element | null\n readonly pads: ModelPadBehavior\n}\n\n/** Keep the contract discriminator, schema output, and render input aligned. */\nexport function defineModelRenderer<const Name extends ModelRendererName>(\n model: ModelRenderer<Name> & {\n readonly name: LiteralModelName<NoInfer<Name>>\n },\n): ModelRenderer<Name> {\n return model\n}\n\ntype RegisteredModelRenderer = {\n readonly name: ModelRendererName\n readonly schema: { parse(input: unknown): ModelDefinition }\n readonly render: (definition: ModelDefinition) => JSX.Element | null\n readonly pads: ModelPadBehavior\n}\n\n/** Renderer registrations belong to this instance, never to globalThis. */\nexport class ModelRendererRegistry {\n private readonly models = new Map<string, RegisteredModelRenderer>()\n\n register<const Name extends ModelRendererName>(\n model: ModelRenderer<Name> & {\n readonly name: LiteralModelName<NoInfer<Name>>\n },\n ): void {\n if (typeof model.name !== \"string\" || !/^[a-z]+$/.test(model.name)) {\n throw new Error(\n \"Model renderer names must contain only lowercase letters\",\n )\n }\n if (this.models.has(model.name)) {\n throw new Error(`Model renderer \"${model.name}\" is already registered`)\n }\n if (model.pads !== \"none\" && model.pads !== \"footprinter\") {\n throw new Error('Model renderer pads must be \"none\" or \"footprinter\"')\n }\n const { name, schema, render, pads } = model\n this.models.set(name, {\n name,\n schema,\n pads,\n render: (definition) => {\n if (!definition || definition.fn !== name) {\n throw new Error(\n `Renderer for \"${name}\" requires a model with fn \"${name}\"`,\n )\n }\n // Registration ties this discriminator to the callback's input type.\n // The caller has already validated and normalized the MP definition;\n // do not repeat schema transforms or copy its object here.\n return render(definition as ModelRendererDefinition<Name>)\n },\n })\n }\n\n get(name: string): RegisteredModelRenderer | undefined {\n return this.models.get(name)\n }\n\n getModelNames(): string[] {\n return [...this.models.keys()]\n }\n\n render(definition: ModelDefinition): JSX.Element | null | undefined {\n return this.models.get(definition.fn)?.render(definition)\n }\n}\n","import type { BallBearingModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createBallBearingMesh } from \"./mesh\"\n\nexport type BallBearingProps = BallBearingModelPropsInput & { color?: string }\n\nexport function createBallBearingGeom(input: BallBearingModelPropsInput = {}) {\n return indexedMeshToGeom3(createBallBearingMesh(input))\n}\n\n/** Separately colored physical parts retain their individual closed surfaces. */\nexport function BallBearing({ color, ...props }: BallBearingProps) {\n const { parts } = createBallBearingMesh(props)\n return (\n <>\n {parts.map((part) => (\n <Colorize key={part.name} color={color ?? part.color}>\n <Custom geometry={indexedMeshToGeom3(part.mesh)} />\n </Colorize>\n ))}\n </>\n )\n}\n\nexport { createBallBearingMesh } from \"./mesh\"\nexport type {\n BallBearingMesh,\n BallBearingMeshPart,\n BallBearingMeshOptions,\n} from \"./mesh\"\n","import jscad from \"@jscad/modeling\"\n\n/** Preserve the outward winding of the migrated indexed triangle surfaces. */\nexport function indexedMeshToGeom3(mesh: {\n positions: number[]\n indices: number[]\n}) {\n const polygons: [number, number, number][][] = []\n for (let i = 0; i < mesh.indices.length; i += 3)\n polygons.push(\n mesh.indices\n .slice(i, i + 3)\n .map((index) => [\n mesh.positions[index * 3]!,\n mesh.positions[index * 3 + 1]!,\n mesh.positions[index * 3 + 2]!,\n ]),\n )\n return jscad.geometries.geom3.fromPoints(polygons)\n}\n","import {\n getBallBearingDimensions,\n type BallBearingModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\nexport interface BallBearingMeshPart {\n name: string\n color: string\n mesh: { positions: number[]; indices: number[] }\n /** Only rolling elements have centers/radii; useful to inspect nominal contact. */\n center?: [number, number, number]\n radius?: number\n}\nexport interface BallBearingMesh {\n positions: number[]\n indices: number[]\n parts: BallBearingMeshPart[]\n}\nexport type BallBearingMeshOptions = { segments?: number }\n\n/** ISO/de-facto envelope, nominal grooved races/balls/cage, and independently selected faces. */\nexport function createBallBearingMesh(\n input: BallBearingModelPropsInput = {},\n options: BallBearingMeshOptions = {},\n): BallBearingMesh {\n const d = getBallBearingDimensions(input)\n const segments = segmentsFor(options.segments)\n checkPrecision([\n d.outerDiameter,\n d.boreRadius,\n d.width,\n d.outerRadius - d.boreRadius,\n d.ballRadius,\n ])\n const c = d.rimChamfer,\n mid = d.midZ,\n half = d.grooveHalfWidth\n const innerProfile: ProfilePoint[] = [\n [d.innerRaceOuterRadius - c, 0],\n [d.innerRaceOuterRadius, c],\n ]\n for (let i = 0; i <= 24; i++) {\n const z = mid - half + (2 * half * i) / 24\n innerProfile.push([\n d.pitchRadius -\n Math.sqrt(Math.max(0, d.grooveRadius ** 2 - (z - mid) ** 2)),\n z,\n ])\n }\n innerProfile.push(\n [d.innerRaceOuterRadius, d.width - c],\n [d.innerRaceOuterRadius - c, d.width],\n [d.boreRadius + c, d.width],\n [d.boreRadius, d.width - c],\n [d.boreRadius, c],\n [d.boreRadius + c, 0],\n )\n const outerProfile: ProfilePoint[] = [\n [d.outerRadius - c, 0],\n [d.outerRadius, c],\n [d.outerRadius, d.width - c],\n [d.outerRadius - c, d.width],\n [d.outerRaceInnerRadius + c, d.width],\n [d.outerRaceInnerRadius, d.width - c],\n ]\n for (let i = 0; i <= 24; i++) {\n const z = mid + half - (2 * half * i) / 24\n outerProfile.push([\n d.pitchRadius +\n Math.sqrt(Math.max(0, d.grooveRadius ** 2 - (z - mid) ** 2)),\n z,\n ])\n }\n outerProfile.push(\n [d.outerRaceInnerRadius, c],\n [d.outerRaceInnerRadius + c, 0],\n )\n const parts: BallBearingMeshPart[] = [\n {\n name: \"inner race\",\n color: \"#9da4ac\",\n mesh: revolve(innerProfile, segments),\n },\n {\n name: \"outer race\",\n color: \"#9da4ac\",\n mesh: revolve(outerProfile, segments),\n },\n ]\n for (let i = 0; i < d.ballCount; i++) {\n const phase = (i * Math.PI * 2) / d.ballCount\n const center: Point = [\n d.pitchRadius * Math.cos(phase),\n d.pitchRadius * Math.sin(phase),\n mid,\n ]\n parts.push({\n name: `ball ${i + 1}`,\n color: \"#d5d9df\",\n mesh: sphere(center, d.ballRadius),\n center,\n radius: d.ballRadius,\n })\n const separator = ((i + 0.5) * Math.PI * 2) / d.ballCount\n parts.push({\n name: `cage separator ${i + 1}`,\n color: \"#b89b58\",\n mesh: annularSector(\n d.cageInnerRadius,\n d.cageOuterRadius,\n mid - 1.1 * d.ballRadius,\n mid + 1.1 * d.ballRadius,\n separator - d.cageSeparatorHalfAngle,\n separator + d.cageSeparatorHalfAngle,\n segments,\n ),\n })\n }\n for (const sign of [-1, 1]) {\n const z0 = mid + (sign === -1 ? -1.25 : 1.1) * d.ballRadius\n const z1 = mid + (sign === -1 ? -1.1 : 1.25) * d.ballRadius\n parts.push({\n name: `cage ${sign < 0 ? \"lower\" : \"upper\"} band`,\n color: \"#b89b58\",\n mesh: revolve(\n [\n [d.cageOuterRadius, z0],\n [d.cageOuterRadius, z1],\n [d.cageInnerRadius, z1],\n [d.cageInnerRadius, z0],\n ],\n segments,\n ),\n })\n }\n for (const sign of [-1, 1]) {\n const face =\n sign < 0\n ? d.bottomSideShielded\n ? \"shielded\"\n : d.bottomSideSealed\n ? \"sealed\"\n : \"open\"\n : d.topSideShielded\n ? \"shielded\"\n : d.topSideSealed\n ? \"sealed\"\n : \"open\"\n if (face === \"open\") continue\n const t = d.closureThickness\n const ri = d.innerRaceOuterRadius,\n ro = d.outerRaceInnerRadius\n const shape: [number, number][] =\n face === \"shielded\"\n ? [\n [ro, 0],\n [ro, t * 0.45],\n [ri, t * 0.45],\n [ri, 0],\n ]\n : [\n [ro, 0],\n [ro, t],\n [ri, t],\n [ri, 0],\n [ri + 0.15 * (ro - ri), 0.5 * t],\n [ro - 0.15 * (ro - ri), 0.5 * t],\n ]\n const profile: ProfilePoint[] =\n sign === -1\n ? shape\n : shape.map(([r, z]) => [r, d.width - z] as ProfilePoint).reverse()\n parts.push({\n name: `${face} ${sign < 0 ? \"lower\" : \"upper\"}`,\n color: face === \"sealed\" ? \"#252a30\" : \"#b5bbc3\",\n mesh: revolve(profile, segments),\n })\n }\n return { ...combine(parts), parts }\n}\n\ntype ProfilePoint = [number | ((angle: number) => number), number]\ntype Point = [number, number, number]\ntype Mesh = { positions: number[]; indices: number[] }\n\nfunction segmentsFor(value = 96) {\n if (!Number.isInteger(value) || value < 96 || value > 192 || value % 24 !== 0)\n throw new Error(\"Segments must be a multiple of 24 from 96 to 192\")\n return value\n}\nfunction checkPrecision(lengths: number[]) {\n const largest = Math.max(...lengths)\n if (\n !lengths.every(Number.isFinite) ||\n largest > 1e6 ||\n Math.min(...lengths) < Math.max(1e-5, largest * 1e-7)\n )\n throw new Error(\n \"Bearing dimensions exceed the renderer's numerical resolution\",\n )\n}\n/** Closed outward section, outside upward and bore downward; never a center cap. */\nfunction revolve(profile: ProfilePoint[], segments: number): Mesh {\n const positions: number[] = []\n const indices: number[] = []\n for (const [radius, z] of profile)\n for (let i = 0; i < segments; i++) {\n const angle = (i * Math.PI * 2) / segments\n const r = typeof radius === \"number\" ? radius : radius(angle)\n positions.push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n for (let j = 0; j < profile.length; j++)\n for (let i = 0; i < segments; i++) {\n const a = j * segments + i\n const b = j * segments + ((i + 1) % segments)\n const c = ((j + 1) % profile.length) * segments + ((i + 1) % segments)\n const e = ((j + 1) % profile.length) * segments + i\n indices.push(a, b, c, a, c, e)\n }\n return { positions, indices }\n}\nfunction annularSector(\n inner: number,\n outer: number,\n z0: number,\n z1: number,\n start: number,\n end: number,\n segments: number,\n): Mesh {\n const steps = Math.max(\n 2,\n Math.ceil(((end - start) / (2 * Math.PI)) * segments),\n )\n const count = steps + 1\n const profile: [number, number][] = [\n [outer, z0],\n [outer, z1],\n [inner, z1],\n [inner, z0],\n ]\n const positions: number[] = []\n const indices: number[] = []\n for (const [r, z] of profile)\n for (let i = 0; i <= steps; i++) {\n const angle = start + ((end - start) * i) / steps\n positions.push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n for (let j = 0; j < 4; j++)\n for (let i = 0; i < steps; i++) {\n const a = j * count + i\n const b = a + 1\n const c = ((j + 1) % 4) * count + i + 1\n const e = ((j + 1) % 4) * count + i\n indices.push(a, b, c, a, c, e)\n }\n indices.push(0, count, 2 * count, 0, 2 * count, 3 * count)\n const a = steps,\n b = count + steps,\n c = 2 * count + steps,\n e = 3 * count + steps\n indices.push(a, c, b, a, e, c)\n return { positions, indices }\n}\n/** Single pole vertices prevent collapsed triangles and nonmanifold pole seams. */\nfunction sphere(center: Point, radius: number): Mesh {\n const longitude = 24\n const latitude = 12\n const positions = [center[0], center[1], center[2] + radius]\n const indices: number[] = []\n for (let j = 1; j < latitude; j++) {\n const polar = (j * Math.PI) / latitude\n for (let i = 0; i < longitude; i++) {\n const azimuth = (i * Math.PI * 2) / longitude\n positions.push(\n center[0] + radius * Math.sin(polar) * Math.cos(azimuth),\n center[1] + radius * Math.sin(polar) * Math.sin(azimuth),\n center[2] + radius * Math.cos(polar),\n )\n }\n }\n const south = positions.length / 3\n positions.push(center[0], center[1], center[2] - radius)\n for (let i = 0; i < longitude; i++) {\n const next = (i + 1) % longitude\n indices.push(0, 1 + i, 1 + next)\n for (let j = 0; j < latitude - 2; j++) {\n const a = 1 + j * longitude + i,\n b = 1 + (j + 1) * longitude + i\n const c = 1 + (j + 1) * longitude + next,\n e = 1 + j * longitude + next\n indices.push(a, b, c, a, c, e)\n }\n const last = 1 + (latitude - 2) * longitude\n indices.push(south, last + next, last + i)\n }\n return { positions, indices }\n}\nfunction combine(parts: { mesh: Mesh }[]): Mesh {\n const positions: number[] = []\n const indices: number[] = []\n for (const { mesh } of parts) {\n const offset = positions.length / 3\n positions.push(...mesh.positions)\n indices.push(...mesh.indices.map((index) => index + offset))\n }\n return { positions, indices }\n}\n","import { ballTransferUnitModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { BallTransferUnit } from \"./BallTransferUnit\"\n\nexport const model = defineModelRenderer({\n name: \"balltransferunit\",\n schema: ballTransferUnitModelDefinitionSchema,\n render: ({ fn, ...props }) => <BallTransferUnit {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { BallTransferUnitModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createBallTransferUnitMesh } from \"./mesh\"\n\nexport type BallTransferUnitProps = BallTransferUnitModelPropsInput & {\n color?: string\n}\n\nexport function createBallTransferUnitGeom(\n input: BallTransferUnitModelPropsInput = {},\n) {\n return indexedMeshToGeom3(createBallTransferUnitMesh(input))\n}\n\nexport function BallTransferUnit({ color, ...props }: BallTransferUnitProps) {\n const { parts } = createBallTransferUnitMesh(props)\n return (\n <>\n {parts.map((part) => (\n <Colorize key={part.name} color={color ?? part.color}>\n <Custom geometry={indexedMeshToGeom3(part.mesh)} />\n </Colorize>\n ))}\n </>\n )\n}\n","import {\n getBallTransferUnitDimensions,\n type BallTransferUnitModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport earcut from \"earcut\"\nimport {\n circularProfile,\n joinProfileMeshes,\n type ProfilePoint,\n} from \"../../mechanical/extrude-planar-profile\"\n\ntype Mesh = { positions: number[]; indices: number[] }\ntype SectionPoint = [radius: number, z: number]\n\nexport interface BallTransferUnitMeshPart {\n name: \"housing\" | \"load ball\"\n color: string\n mesh: Mesh\n}\n\nexport interface BallTransferUnitMesh extends Mesh {\n parts: BallTransferUnitMeshPart[]\n}\n\n/** Millimeters; body bottom at Z=0, circular mounting flange at the cup mouth.\n * The load ball and the perforated cup are independently closed physical parts.\n * Internal recirculation details are nominally represented by the socket.\n */\nexport function createBallTransferUnitMesh(\n input: BallTransferUnitModelPropsInput = {},\n): BallTransferUnitMesh {\n const d = getBallTransferUnitDimensions(input)\n const lengths = [\n d.height,\n d.flangeDiameter,\n d.flangeThickness,\n d.flangeBottomZ,\n d.ballRadius,\n d.ballProtrusion,\n d.openingRadius,\n d.holeDiameter,\n d.socketBottomZ,\n d.bodyRadius - d.socketRadius,\n (d.pitchCircleDiameter - d.holeDiameter - d.bodyDiameter) / 2,\n (d.flangeDiameter - d.pitchCircleDiameter - d.holeDiameter) / 2,\n ]\n const largest = Math.max(...lengths)\n const resolution = Math.max(1e-5, largest * 1e-7)\n if (\n !lengths.every(Number.isFinite) ||\n largest > 1e6 ||\n Math.min(...lengths) < resolution\n )\n throw new Error(\n \"Ball transfer unit exceeds the renderer's numerical resolution\",\n )\n\n const segments = 96\n const latitude = 48\n const profile: SectionPoint[] = [\n [d.bodyRadius, 0],\n [d.bodyRadius, d.flangeBottomZ],\n [d.flangeRadius, d.flangeBottomZ],\n [d.flangeRadius, d.bodyHeight],\n [d.openingRadius, d.bodyHeight],\n ]\n const openingAngle = Math.acos(\n (d.bodyHeight - d.ballCenterZ) / d.socketRadius,\n )\n // Match the sphere's latitude samples. Zero clearance then preserves nominal\n // contact without an unrelated cup tessellation crossing the rolling ball.\n for (let j = 1; j < latitude; j++) {\n const angle = (j * Math.PI) / latitude\n // An aperture on an exact latitude can differ by one rounding bit after\n // acos. Omit samples indistinguishable from the already-authored mouth.\n if ((angle - openingAngle) * d.socketRadius > resolution)\n profile.push([\n d.socketRadius * Math.sin(angle),\n d.ballCenterZ + d.socketRadius * Math.cos(angle),\n ])\n }\n profile.push([0, d.socketBottomZ], [0, 0])\n\n const holes = d.mountingHoles.map(({ x, y, diameter }) =>\n circularProfile(x, y, diameter / 2, segments),\n )\n const flangeOutline = circularProfile(0, 0, d.flangeRadius, segments)\n const housing = joinProfileMeshes([\n // Cap faces are triangulated with all openings, rather than covered by\n // annular triangles and repaired afterward with Boolean subtraction.\n revolve(profile, segments, new Set([1, 3])),\n cap(\n flangeOutline,\n [circularProfile(0, 0, d.bodyRadius, segments), ...holes],\n d.flangeBottomZ,\n true,\n ),\n cap(\n flangeOutline,\n [circularProfile(0, 0, d.openingRadius, segments), ...holes],\n d.bodyHeight,\n false,\n ),\n ...holes.map((hole) => holeWall(hole, d.flangeBottomZ, d.bodyHeight)),\n ])\n const ball = revolve(\n Array.from({ length: latitude + 1 }, (_, j): SectionPoint => {\n // South to north yields outward winding. Each pole is a single vertex.\n const angle = Math.PI - (j * Math.PI) / latitude\n return [\n j === 0 || j === latitude ? 0 : d.ballRadius * Math.sin(angle),\n d.ballCenterZ + d.ballRadius * Math.cos(angle),\n ]\n }),\n segments,\n )\n const parts: BallTransferUnitMeshPart[] = [\n { name: \"housing\", color: \"#9da4ac\", mesh: housing },\n { name: \"load ball\", color: \"#d5d9df\", mesh: ball },\n ]\n const positions = [...housing.positions, ...ball.positions]\n const offset = housing.positions.length / 3\n const indices = [\n ...housing.indices,\n ...ball.indices.map((index) => index + offset),\n ]\n return { positions, indices, parts }\n}\n\n/** Revolve a counterclockwise section, retaining one vertex at each axis pole. */\nfunction revolve(\n profile: SectionPoint[],\n segments: number,\n omittedEdges = new Set<number>(),\n): Mesh {\n const positions: number[] = []\n const indices: number[] = []\n const rings = profile.map(([radius, z]) => {\n const start = positions.length / 3\n const count = radius === 0 ? 1 : segments\n for (let i = 0; i < count; i++) {\n const angle = (i * Math.PI * 2) / segments\n positions.push(radius * Math.cos(angle), radius * Math.sin(angle), z)\n }\n return { start, count }\n })\n for (let j = 0; j < rings.length; j++) {\n if (omittedEdges.has(j)) continue\n const a = rings[j]!\n const b = rings[(j + 1) % rings.length]!\n if (a.count === 1 && b.count === 1) continue\n for (let i = 0; i < segments; i++) {\n const next = (i + 1) % segments\n if (a.count === 1) indices.push(a.start, b.start + next, b.start + i)\n else if (b.count === 1) indices.push(a.start + i, a.start + next, b.start)\n else\n indices.push(\n a.start + i,\n a.start + next,\n b.start + next,\n a.start + i,\n b.start + next,\n b.start + i,\n )\n }\n }\n return { positions, indices }\n}\n\nfunction cap(\n outer: ProfilePoint[],\n holes: ProfilePoint[][],\n z: number,\n reverse: boolean,\n): Mesh {\n const loops = [outer, ...holes]\n const starts: number[] = []\n let count = outer.length\n for (const hole of holes) {\n starts.push(count)\n count += hole.length\n }\n const points = loops.flat()\n const indices = earcut(points.flat(), starts)\n if (reverse)\n for (let i = 0; i < indices.length; i += 3)\n [indices[i + 1], indices[i + 2]] = [indices[i + 2]!, indices[i + 1]!]\n return { positions: points.flatMap(([x, y]) => [x, y, z]), indices }\n}\n\nfunction holeWall(loop: ProfilePoint[], bottom: number, top: number): Mesh {\n const positions = [bottom, top].flatMap((z) =>\n loop.flatMap(([x, y]) => [x, y, z]),\n )\n const indices: number[] = []\n const count = loop.length\n for (let i = 0; i < count; i++) {\n const next = (i + 1) % count\n indices.push(i, next + count, next, i, i + count, next + count)\n }\n return { positions, indices }\n}\n","import earcut from \"earcut\"\n\nexport type ProfilePoint = [number, number]\nexport type ProfileMesh = { positions: number[]; indices: number[] }\ntype Point3 = [number, number, number]\n\n/** Triangulate a planar outline with through openings, preserving shared\n * indexed vertices and opposite edge winding. Omitted walls permit adjoining\n * straight and curved panels to be sewn without internal seam faces.\n */\nexport function extrudePlanarProfile({\n outer,\n holes = [],\n start,\n end,\n project = (u, v, depth) => [u, v, depth],\n reverse = false,\n skipWall = () => false,\n}: {\n outer: ProfilePoint[]\n holes?: ProfilePoint[][]\n start: number\n end: number\n project?: (u: number, v: number, depth: number) => Point3\n reverse?: boolean\n skipWall?: (a: ProfilePoint, b: ProfilePoint) => boolean\n}): ProfileMesh {\n const oriented = (loop: ProfilePoint[], clockwise: boolean) => {\n loop = loop.filter((point, index) => {\n const previous = loop[(index + loop.length - 1) % loop.length]!\n return point[0] !== previous[0] || point[1] !== previous[1]\n })\n const area = loop.reduce((sum, a, index) => {\n const b = loop[(index + 1) % loop.length]!\n return sum + a[0] * b[1] - a[1] * b[0]\n }, 0)\n if (!Number.isFinite(area) || area === 0)\n throw new Error(\"Profile exceeds mesh resolution limits\")\n return area < 0 === clockwise ? loop : [...loop].reverse()\n }\n const loops = [oriented(outer, false), ...holes.map((h) => oriented(h, true))]\n const points = loops.flat()\n const holeStarts: number[] = []\n let count = loops[0]!.length\n for (const hole of loops.slice(1)) {\n holeStarts.push(count)\n count += hole.length\n }\n const faces = earcut(points.flat(), holeStarts)\n const positions = [start, end].flatMap((depth) =>\n points.flatMap(([u, v]) => project(u, v, depth)),\n )\n const indices: number[] = []\n for (let i = 0; i < faces.length; i += 3) {\n const [a, b, c] = faces.slice(i, i + 3) as [number, number, number]\n indices.push(a, c, b, a + count, b + count, c + count)\n }\n let offset = 0\n for (const [loopIndex, loop] of loops.entries()) {\n for (let i = 0; i < loop.length; i++) {\n const next = (i + 1) % loop.length\n if (loopIndex === 0 && skipWall(loop[i]!, loop[next]!)) continue\n const a = offset + i\n const b = offset + next\n indices.push(a, b, b + count, a, b + count, a + count)\n }\n offset += loop.length\n }\n if (reverse)\n for (let i = 0; i < indices.length; i += 3)\n [indices[i + 1], indices[i + 2]] = [indices[i + 2]!, indices[i + 1]!]\n return { positions, indices }\n}\n\n/** Reuse seam vertices after joining independently triangulated panels. */\nexport function joinProfileMeshes(meshes: ProfileMesh[]): ProfileMesh {\n const positions: number[] = []\n const indices: number[] = []\n const vertices = new Map<string, number>()\n for (const mesh of meshes) {\n for (const index of mesh.indices) {\n const point = mesh.positions.slice(index * 3, index * 3 + 3)\n const key = point.map((value) => value.toFixed(12)).join(\",\")\n let shared = vertices.get(key)\n if (shared === undefined) {\n shared = positions.length / 3\n vertices.set(key, shared)\n positions.push(...point)\n }\n indices.push(shared)\n }\n }\n return { positions, indices }\n}\n\nexport function circularProfile(\n x: number,\n y: number,\n radius: number,\n segments = 96,\n): ProfilePoint[] {\n return Array.from({ length: segments }, (_, index) => {\n const angle = (index * 2 * Math.PI) / segments\n return [x + radius * Math.cos(angle), y + radius * Math.sin(angle)]\n })\n}\n","import { buttonScrewModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { ButtonScrew } from \"./ButtonScrew\"\n\nexport const model = defineModelRenderer({\n name: \"buttonscrew\",\n schema: buttonScrewModelDefinitionSchema,\n render: ({ fn, ...props }) => <ButtonScrew {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { ButtonScrewModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createButtonScrewMesh, type ButtonScrewMeshOptions } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type ButtonScrewProps = ButtonScrewModelPropsInput & { color?: string }\nexport function createButtonScrewGeom(\n input: ButtonScrewModelPropsInput,\n resolution?: ButtonScrewMeshOptions,\n) {\n return indexedMeshToGeom3(createButtonScrewMesh(input, resolution))\n}\nexport function ButtonScrew({ color = \"#737e8f\", ...props }: ButtonScrewProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createButtonScrewGeom(props)} />\n </Colorize>\n )\n}\nexport { createButtonScrewMesh } from \"./mesh\"\nexport type {\n ButtonScrewMesh,\n ButtonScrewMeshOptions,\n} from \"./mesh\"\n","import {\n buttonScrewModelPropsSchema,\n getButtonScrewDimensions,\n type ButtonScrewModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\n/** Indexed counterclockwise triangles in millimeters. */\nexport interface ButtonScrewMesh {\n positions: number[]\n indices: number[]\n}\n/** Renderer resolution affects tessellation only, never model specifications. */\nexport interface ButtonScrewMeshOptions {\n radialSegments?: number\n segmentsPerPitch?: number\n}\nfunction resolution(options: ButtonScrewMeshOptions) {\n const radial = options.radialSegments ?? 96\n const axial = options.segmentsPerPitch ?? 32\n if (\n !Number.isInteger(radial) ||\n radial < 24 ||\n radial > 192 ||\n radial % 12 !== 0 ||\n !Number.isInteger(axial) ||\n axial < 8 ||\n axial > 64\n )\n throw new Error(\n \"Mesh resolution limit: radial segments must be a multiple of 12 in [24,192], pitch segments an integer in [8,64]\",\n )\n return { radial, axial }\n}\nfunction surface(segments: number) {\n const positions: number[] = [],\n indices: number[] = []\n const ring = (z: number, radius: (angle: number) => number) => {\n const start = positions.length / 3\n for (let i = 0; i < segments; i++) {\n const angle = (i * 2 * Math.PI) / segments\n const r = radius(angle)\n positions.push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n return start\n }\n const connect = (a: number, b: number) => {\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n indices.push(a + i, a + n, b + n, a + i, b + n, b + i)\n }\n }\n const cap = (start: number, z: number, up: boolean) => {\n const center = positions.length / 3\n positions.push(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n indices.push(center, start + (up ? i : n), start + (up ? n : i))\n }\n }\n return { positions, indices, ring, connect, cap }\n}\nfunction hexRadius(angle: number, acrossFlats: number) {\n const period = Math.PI / 3\n const distance =\n ((((angle - Math.PI / 2 + period / 2) % period) + period) % period) -\n period / 2\n return acrossFlats / 2 / Math.cos(distance)\n}\nfunction threadDistance(z: number, angle: number, pitch: number, hand = 1) {\n const phase = (((z / pitch - (hand * angle) / (2 * Math.PI)) % 1) + 1) % 1\n return Math.min(phase, 1 - phase)\n}\n/** Closed nominal surface: bearing z=0, tip -length, blind hex socket above. */\nexport function createButtonScrewMesh(\n input: ButtonScrewModelPropsInput,\n options: ButtonScrewMeshOptions = {},\n): ButtonScrewMesh {\n const props = buttonScrewModelPropsSchema.parse(input)\n const d = getButtonScrewDimensions(input)\n const { radial, axial } = resolution(options)\n const steps = Math.max(2, Math.ceil((props.length / d.threadPitch) * axial))\n if (steps > 24000 || !Number.isFinite(steps))\n throw new Error(\"Mesh resolution limit: too many thread turns\")\n const m = surface(radial)\n const radius = d.diameter / 2\n const depth = (d.diameter - d.threadMinorDiameter) / 2\n const fillet = d.underHeadRadius\n const levels = new Set<number>(\n props.showThreads\n ? Array.from(\n { length: steps + 1 },\n (_, i) => -props.length + (props.length * i) / steps,\n )\n : [-props.length, 0],\n )\n levels.add(-props.length + d.tipChamfer)\n levels.add(-d.threadPitch)\n for (let i = 0; i <= 16; i++)\n levels.add(-fillet + fillet * Math.sin((i * Math.PI) / 32))\n let previous = -1\n const shaftLevels = [...levels]\n .sort((a, b) => a - b)\n .filter((z, index, sorted) => index === 0 || z - sorted[index - 1]! > 1e-10)\n for (const z of shaftLevels) {\n const current = m.ring(z, (angle) => {\n const envelope =\n z >= -fillet\n ? radius +\n fillet -\n Math.sqrt(Math.max(0, fillet ** 2 - (z + fillet) ** 2))\n : radius\n const groove = Math.min(\n depth,\n Math.max(\n 0,\n (threadDistance(z + props.length, angle, d.threadPitch) - 1 / 16) *\n d.threadPitch *\n Math.sqrt(3),\n ),\n )\n const threaded =\n envelope -\n (props.showThreads ? groove * Math.min(1, -z / d.threadPitch) : 0)\n const tip =\n z + props.length < d.tipChamfer\n ? radius - (d.tipChamfer - (z + props.length))\n : Infinity\n return Math.min(threaded, tip)\n })\n if (previous < 0) m.cap(current, z, false)\n else m.connect(previous, current)\n previous = current\n }\n const add = (z: number, radiusAt: (angle: number) => number) => {\n const current = m.ring(z, radiusAt)\n m.connect(previous, current)\n previous = current\n }\n add(0, () => d.headDiameter / 2)\n for (let i = 1; i <= 24; i++) {\n const z = (d.headHeight * i) / 24\n add(\n z,\n () =>\n d.crownArcCenterR +\n Math.sqrt(\n Math.max(0, d.crownRadius ** 2 - (z - d.crownArcCenterZ) ** 2),\n ),\n )\n }\n add(d.topZ, (angle) => hexRadius(angle, d.socketWidth))\n add(d.topZ - d.socketDepth, (angle) => hexRadius(angle, d.socketWidth))\n m.cap(previous, d.topZ - d.socketDepth, true)\n return { positions: m.positions, indices: m.indices }\n}\n","import { cableGrommetModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { CableGrommet } from \"./CableGrommet\"\n\nexport const model = defineModelRenderer({\n name: \"cablegrommet\",\n schema: cableGrommetModelDefinitionSchema,\n render: ({ fn, ...props }) => <CableGrommet {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { CableGrommetModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createCableGrommetMesh } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type CableGrommetProps = CableGrommetModelPropsInput & { color?: string }\n\nexport function createCableGrommetGeom(input: CableGrommetModelPropsInput) {\n return indexedMeshToGeom3(createCableGrommetMesh(input))\n}\n\nexport function CableGrommet({\n color = \"#343943\",\n ...props\n}: CableGrommetProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createCableGrommetGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createCableGrommetMesh } from \"./mesh\"\nexport type {\n CableGrommetMesh,\n CableGrommetMeshOptions,\n} from \"./mesh\"\n","import {\n cableGrommetModelPropsSchema,\n getCableGrommetDimensions,\n type CableGrommetModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\nexport interface CableGrommetMesh {\n positions: number[]\n indices: number[]\n}\n\nexport interface CableGrommetMeshOptions {\n /** Requested minimum; thin root walls can require more circular segments. */\n radialSegments?: number\n}\n\n/** Square-shouldered annulus centered on Z=0, with an open axial cable bore. */\nexport function createCableGrommetMesh(\n input: CableGrommetModelPropsInput,\n options: CableGrommetMeshOptions = {},\n): CableGrommetMesh {\n const props = cableGrommetModelPropsSchema.parse(input)\n const dimensions = getCableGrommetDimensions(props)\n const inner = props.innerDiameter / 2\n const root = dimensions.grooveRootDiameter / 2\n const outer = props.outerDiameter / 2\n const requested = options.radialSegments ?? 96\n if (\n !Number.isInteger(requested) ||\n requested < 12 ||\n requested > 4096 ||\n requested % 4 !== 0\n )\n throw new Error(\n \"Grommet radial segments must be a multiple of four in [12,4096]\",\n )\n // Keep exterior chord interiors beyond the nominal bore, even for thin walls.\n const wallAngle = Math.acos((inner + root) / (2 * root))\n const segments = Math.max(requested, 4 * Math.ceil(Math.PI / wallAngle / 4))\n if (!Number.isFinite(segments) || segments > 4096)\n throw new Error(\n \"Grommet wall exceeds mesh resolution limit (4096 segments)\",\n )\n\n const section: [number, number][] = [\n [inner, -props.height / 2],\n [outer, -props.height / 2],\n [outer, dimensions.grooveStartZ],\n [root, dimensions.grooveStartZ],\n [root, dimensions.grooveEndZ],\n [outer, dimensions.grooveEndZ],\n [outer, props.height / 2],\n [inner, props.height / 2],\n ]\n const positions: number[] = []\n const indices: number[] = []\n for (const [radius, z] of section)\n for (let sample = 0; sample < segments; sample++) {\n const angle = (sample * 2 * Math.PI) / segments\n positions.push(radius * Math.cos(angle), radius * Math.sin(angle), z)\n }\n for (let ring = 0; ring < section.length; ring++) {\n const a = ring * segments\n const b = ((ring + 1) % section.length) * segments\n for (let sample = 0; sample < segments; sample++) {\n const next = (sample + 1) % segments\n indices.push(\n a + sample,\n a + next,\n b + next,\n a + sample,\n b + next,\n b + sample,\n )\n }\n }\n return { positions, indices }\n}\n","import { clampingShaftCollarModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { ClampingShaftCollar } from \"./ClampingShaftCollar\"\n\nexport const model = defineModelRenderer({\n name: \"clampingshaftcollar\",\n schema: clampingShaftCollarModelDefinitionSchema,\n render: ({ fn, ...props }) => <ClampingShaftCollar {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { ClampingShaftCollarModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createClampingShaftCollarMesh } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type ClampingShaftCollarProps = ClampingShaftCollarModelPropsInput & {\n color?: string\n}\n\n/** Datum and mounting-hole coordinates follow the modelprinter contract. */\nexport function createClampingShaftCollarGeom(\n input: ClampingShaftCollarModelPropsInput,\n) {\n return indexedMeshToGeom3(createClampingShaftCollarMesh(input))\n}\n\nexport function ClampingShaftCollar({\n color = \"#737e8f\",\n ...props\n}: ClampingShaftCollarProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createClampingShaftCollarGeom(props)} />\n </Colorize>\n )\n}\nexport { createClampingShaftCollarMesh } from \"./mesh\"\nexport type { ClampingShaftCollarMesh } from \"./mesh\"\n","import jscad from \"@jscad/modeling\"\nimport {\n clampingShaftCollarModelPropsSchema,\n getClampingShaftCollarDimensions,\n type ClampingShaftCollarModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport {\n assertShaftMountResolution,\n createAnnularSleeve,\n createMountingHoleCutter,\n finishShaftMountMesh,\n subtractShaftMountParts,\n type ShaftMountMesh,\n} from \"../../mechanical/shaft-mount-geometry\"\n\nexport type ClampingShaftCollarMesh = ShaftMountMesh\n\n/** Geometry is driven by the corresponding modelprinter schema and hole layout. */\nexport function createClampingShaftCollarMesh(\n input: ClampingShaftCollarModelPropsInput,\n): ClampingShaftCollarMesh {\n const props = clampingShaftCollarModelPropsSchema.parse(input)\n const dimensions = getClampingShaftCollarDimensions(props)\n assertShaftMountResolution([dimensions.threadedHole])\n const body = createAnnularSleeve({\n outerRadius: props.outerDiameter / 2,\n boreARadius: props.boreDiameter / 2,\n length: props.width,\n chamfer: props.chamfer,\n })\n const s = dimensions.split\n const epsilon = 1e-4\n const slit = jscad.primitives.cuboid({\n size: [\n s.xMax - s.xMin + epsilon,\n s.yMax - s.yMin,\n s.zMax - s.zMin + 2 * epsilon,\n ],\n center: [\n (s.xMax + s.xMin + epsilon) / 2,\n (s.yMax + s.yMin) / 2,\n (s.zMax + s.zMin) / 2,\n ],\n })\n return finishShaftMountMesh(\n subtractShaftMountParts(\n body,\n slit,\n createMountingHoleCutter(dimensions.clearanceHole),\n createMountingHoleCutter(dimensions.threadedHole),\n ),\n )\n}\n","import jscad from \"@jscad/modeling\"\nimport { indexedMeshToGeom3 } from \"./indexedMeshToGeom3\"\n\ntype Geom3 = jscad.geometries.geom3.Geom3\nexport type ShaftMountMesh = { positions: number[]; indices: number[] }\nexport type MountingHole = {\n start: readonly [number, number, number]\n direction: readonly [number, number, number]\n diameter: number\n depth: number\n threadPitch?: number\n threadHand?: \"left\" | \"right\"\n}\nconst bodySegments = 64\nconst threadSegments = 24\nconst samplesPerTurn = 12\n\n/** A renderer allocation guard, independent of modelprinter's part contract. */\nexport function assertShaftMountResolution(holes: readonly MountingHole[]) {\n let triangles = 0\n for (const hole of holes) {\n const steps = hole.threadPitch\n ? Math.ceil((hole.depth / hole.threadPitch) * samplesPerTurn)\n : 1\n if (!Number.isFinite(steps) || steps > 768)\n throw new Error(\n \"Shaft mount exceeds mesh resolution limit (64 thread turns per hole)\",\n )\n triangles += (steps + 1) * threadSegments * 2\n }\n if (triangles > 100000)\n throw new Error(\"Shaft mount exceeds total mesh resolution limit\")\n}\n\n/** Revolve the contract meridian, including entry chamfers and a sharp midpoint\n * shoulder, with bore facets circumscribed around the nominal shaft clearance.\n * The caller obtains all dimensions from modelprinter.\n */\nexport function createAnnularSleeve({\n outerRadius,\n boreARadius,\n boreBRadius = boreARadius,\n length,\n chamfer,\n stepZ = length / 2,\n}: {\n outerRadius: number\n boreARadius: number\n boreBRadius?: number\n length: number\n chamfer: number\n stepZ?: number\n}): Geom3 {\n const halfAngle = Math.PI / bodySegments\n const cosine = Math.cos(halfAngle)\n // Outside polygons are inscribed; bore polygons circumscribe the nominal\n // shaft circle. Reject a ligament too thin to survive those approximations.\n if (\n (Math.max(boreARadius, boreBRadius) + chamfer) / cosine >=\n (outerRadius - chamfer) * cosine - 1e-6\n )\n throw new Error(\n \"Shaft mount wall/chamfer ligament exceeds mesh resolution limit\",\n )\n const raw: [number, number, boolean][] = [\n [0, outerRadius - chamfer, false],\n [chamfer, outerRadius, false],\n [length - chamfer, outerRadius, false],\n [length, outerRadius - chamfer, false],\n [length, boreBRadius + chamfer, true],\n [length - chamfer, boreBRadius, true],\n [stepZ, boreBRadius, true],\n [stepZ, boreARadius, true],\n [chamfer, boreARadius, true],\n [0, boreARadius + chamfer, true],\n ]\n const profile = raw.filter(\n ([z, r], i) => i === 0 || z !== raw[i - 1]![0] || r !== raw[i - 1]![1],\n )\n const positions: number[] = []\n const indices: number[] = []\n for (const [z, r, isBore] of profile)\n for (let i = 0; i < bodySegments; i++) {\n // Tangent flats at the cardinal axes preserve nominal shaft clearance\n // even where a radial thread crest reaches its analytic bore endpoint.\n const angle = ((i + (isBore ? 0.5 : 0)) * Math.PI * 2) / bodySegments\n const radius = isBore ? r / cosine : r\n positions.push(radius * Math.cos(angle), radius * Math.sin(angle), z)\n }\n for (let row = 0; row < profile.length; row++)\n for (let i = 0; i < bodySegments; i++) {\n const next = (i + 1) % bodySegments\n const a = row * bodySegments + i,\n b = row * bodySegments + next\n const c = ((row + 1) % profile.length) * bodySegments + next,\n d = ((row + 1) % profile.length) * bodySegments + i\n indices.push(a, b, c, a, c, d)\n }\n return indexedMeshToGeom3({ positions, indices })\n}\n\n/** Closed cutter with a truncated nominal 60-degree helical wall. Major\n * diameter equals the contract's thread diameter; hand follows the hole axis.\n * End extensions lie in the existing bore/slit/exterior, never in solid material.\n */\nexport function createMountingHoleCutter(hole: MountingHole): Geom3 {\n assertShaftMountResolution([hole])\n const pitch = hole.threadPitch\n const steps = pitch\n ? Math.max(2, Math.ceil((hole.depth / pitch) * samplesPerTurn))\n : 1\n const segments = pitch ? threadSegments : 48\n const extension = 1e-4\n const radius = hole.diameter / 2\n const threadDepth = pitch ? Math.min(pitch * 0.541266, radius * 0.8) : 0\n const hand = hole.threadHand === \"left\" ? -1 : 1\n const positions: number[] = []\n const indices: number[] = []\n const [dx, dy, dz] = hole.direction\n if (Math.abs(dz) > 1e-10 || Math.abs(Math.hypot(dx, dy) - 1) > 1e-10)\n throw new Error(\"Expected a horizontal unit hole axis\")\n const push = (x: number, y: number, z: number) => {\n // ex=world +Z, ey=(dy,-dx,0), ez=the documented hole direction.\n positions.push(\n hole.start[0] + y * dy + z * dx,\n hole.start[1] - y * dx + z * dy,\n hole.start[2] + x,\n )\n }\n for (let row = 0; row <= steps; row++) {\n const z = -extension + ((hole.depth + 2 * extension) * row) / steps\n for (let i = 0; i < segments; i++) {\n const angle = (i * Math.PI * 2) / segments\n const phase = pitch\n ? (((z / pitch - (hand * angle) / (Math.PI * 2)) % 1) + 1) % 1\n : 0\n const distance = Math.min(phase, 1 - phase)\n const r =\n radius -\n Math.min(\n threadDepth,\n Math.max(0, (distance - 1 / 8) * (pitch ?? 0) * Math.sqrt(3)),\n )\n push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n }\n for (let row = 0; row < steps; row++)\n for (let i = 0; i < segments; i++) {\n const next = (i + 1) % segments\n const a = row * segments + i,\n b = row * segments + next,\n c = (row + 1) * segments + next,\n d = (row + 1) * segments + i\n indices.push(a, b, c, a, c, d)\n }\n for (const end of [0, steps]) {\n const center = positions.length / 3\n push(0, 0, end === 0 ? -extension : hole.depth + extension)\n for (let i = 0; i < segments; i++) {\n const a = end * segments + i,\n b = end * segments + ((i + 1) % segments)\n indices.push(center, end === 0 ? b : a, end === 0 ? a : b)\n }\n }\n return indexedMeshToGeom3({ positions, indices })\n}\n\n/** Work above JSCAD's absolute BSP epsilon so small thread/bore intersection\n * fragments are retained. Scale back before producing the millimeter mesh.\n */\nexport function subtractShaftMountParts(\n body: Geom3,\n ...cutters: Geom3[]\n): Geom3 {\n const factor = 100\n const scaled = [body, ...cutters].map((geometry) =>\n jscad.transforms.scale([factor, factor, factor], geometry),\n )\n const result = jscad.booleans.subtract(scaled[0]!, ...scaled.slice(1))\n return jscad.transforms.scale([1 / factor, 1 / factor, 1 / factor], result)\n}\n\n/** Weld CSG seam coordinates, insert every missing T-junction vertex on an\n * unmatched edge, then triangulate with unsnapped face centers. A plain polygon\n * fan loses collinear seam vertices; JSCAD's snapped centers can move off-plane.\n */\nexport function finishShaftMountMesh(geometry: Geom3): ShaftMountMesh {\n const positions: number[] = []\n const vertices = new Map<string, number[]>()\n const tolerance = 1e-6\n const weld = (point: readonly number[]) => {\n const cell = point.map((v) => Math.floor(v / tolerance))\n for (let x = -1; x <= 1; x++)\n for (let y = -1; y <= 1; y++)\n for (let z = -1; z <= 1; z++) {\n const nearby =\n vertices.get(\n [cell[0]! + x, cell[1]! + y, cell[2]! + z].join(\",\"),\n ) ?? []\n for (const index of nearby)\n if (\n Math.hypot(\n ...point.map((v, axis) => v - positions[index * 3 + axis]!),\n ) < tolerance\n )\n return index\n }\n const index = positions.length / 3\n positions.push(...point)\n const key = cell.join(\",\")\n vertices.set(key, [...(vertices.get(key) ?? []), index])\n return index\n }\n const polygons = jscad.geometries.geom3\n .toPolygons(geometry)\n .map((polygon) =>\n polygon.vertices\n .map(weld)\n .filter((id, i, ids) => id !== ids[(i + ids.length - 1) % ids.length]),\n )\n .map((ids) => [...new Set(ids)])\n .filter((ids) => ids.length >= 3)\n .filter((ids) => {\n // A CSG sliver narrower than the weld tolerance has collapsed to a seam.\n // Keeping it while splitting its long edge would overlap adjacent faces.\n let longest = 0\n let origin: number[] = []\n let direction: number[] = []\n for (let i = 0; i < ids.length; i++)\n for (let j = i + 1; j < ids.length; j++) {\n const a = positions.slice(ids[i]! * 3, ids[i]! * 3 + 3)\n const delta = positions\n .slice(ids[j]! * 3, ids[j]! * 3 + 3)\n .map((v, axis) => v - a[axis]!)\n const squared = delta.reduce((sum, v) => sum + v * v, 0)\n if (squared > longest) {\n longest = squared\n origin = a\n direction = delta\n }\n }\n return ids.some((id) => {\n const delta = positions\n .slice(id * 3, id * 3 + 3)\n .map((v, axis) => v - origin[axis]!)\n const t =\n delta.reduce((sum, v, axis) => sum + v * direction[axis]!, 0) /\n longest\n return (\n Math.hypot(...delta.map((v, axis) => v - t * direction[axis]!)) >=\n tolerance\n )\n })\n })\n const edgeKey = (a: number, b: number) =>\n `${Math.min(a, b)},${Math.max(a, b)}`\n const edges = new Map<string, { a: number; b: number; count: number }>()\n for (const polygon of polygons)\n for (let i = 0; i < polygon.length; i++) {\n const a = polygon[i]!,\n b = polygon[(i + 1) % polygon.length]!,\n key = edgeKey(a, b)\n const edge = edges.get(key) ?? { a, b, count: 0 }\n edge.count++\n edges.set(key, edge)\n }\n const unmatched = [...edges.values()].filter((edge) => edge.count === 1)\n const candidates = [...new Set(unmatched.flatMap((edge) => [edge.a, edge.b]))]\n const splits = new Map<string, number[]>()\n for (const { a, b } of unmatched) {\n const origin = positions.slice(a * 3, a * 3 + 3)\n const direction = positions\n .slice(b * 3, b * 3 + 3)\n .map((v, axis) => v - origin[axis]!)\n const squared = direction.reduce((sum, v) => sum + v * v, 0)\n const points: { id: number; t: number }[] = []\n for (const id of candidates) {\n if (id === a || id === b) continue\n const delta = positions\n .slice(id * 3, id * 3 + 3)\n .map((v, axis) => v - origin[axis]!)\n const t =\n delta.reduce((sum, v, axis) => sum + v * direction[axis]!, 0) / squared\n if (t <= 0 || t >= 1) continue\n const distance = Math.hypot(\n ...delta.map((v, axis) => v - t * direction[axis]!),\n )\n if (distance < tolerance) points.push({ id, t })\n }\n points.sort((p, q) => p.t - q.t)\n splits.set(\n `${a},${b}`,\n points.map((p) => p.id),\n )\n splits.set(`${b},${a}`, points.map((p) => p.id).reverse())\n }\n const indices: number[] = []\n for (const polygon of polygons) {\n const perimeter = polygon.flatMap((a, i) => [\n a,\n ...(\n splits.get(`${a},${polygon[(i + 1) % polygon.length]!}`) ?? []\n ).filter((id) => !polygon.includes(id)),\n ])\n const unique = perimeter.filter(\n (id, i) =>\n id !== perimeter[(i + perimeter.length - 1) % perimeter.length],\n )\n if (unique.length === 3) {\n indices.push(...unique)\n continue\n }\n const center = positions.length / 3\n positions.push(\n ...[0, 1, 2].map(\n (axis) =>\n unique.reduce((sum, id) => sum + positions[id * 3 + axis]!, 0) /\n unique.length,\n ),\n )\n for (let i = 0; i < unique.length; i++)\n indices.push(center, unique[i]!, unique[(i + 1) % unique.length]!)\n }\n // Compact vertices after dropping zero-length CSG edges.\n const compact: number[] = []\n const remap = new Map<number, number>()\n return {\n positions: compact,\n indices: indices.map((index) => {\n let next = remap.get(index)\n if (next === undefined) {\n next = compact.length / 3\n remap.set(index, next)\n compact.push(...positions.slice(index * 3, index * 3 + 3))\n }\n return next\n }),\n }\n}\n","import { compressionSpringModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { CompressionSpring } from \"./CompressionSpring\"\n\nexport const model = defineModelRenderer({\n name: \"compressionspring\",\n schema: compressionSpringModelDefinitionSchema,\n render: ({ fn, ...props }) => <CompressionSpring {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { CompressionSpringModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createCompressionSpringMesh } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type CompressionSpringProps = CompressionSpringModelPropsInput & {\n color?: string\n}\n\nexport function createCompressionSpringGeom(\n input: CompressionSpringModelPropsInput,\n) {\n return indexedMeshToGeom3(createCompressionSpringMesh(input))\n}\n\nexport function CompressionSpring({\n color = \"#737e8f\",\n ...props\n}: CompressionSpringProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createCompressionSpringGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createCompressionSpringMesh } from \"./mesh\"\nexport type {\n CompressionSpringMesh,\n CompressionSpringMeshOptions,\n} from \"./mesh\"\n","import {\n compressionSpringModelPropsSchema,\n getCompressionSpringCenterlinePoint,\n getCompressionSpringDimensions,\n type CompressionSpringModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport { clipMeshToZRange } from \"../../mechanical/clip-mesh-to-z-range\"\n\nexport interface CompressionSpringMesh {\n positions: number[]\n indices: number[]\n}\n\nexport interface CompressionSpringMeshOptions {\n segmentsPerTurn?: number\n wireSegments?: number\n}\n\n/** Imported piecewise centerline, radial/axial wire sections, planar ground ends. */\nexport function createCompressionSpringMesh(\n input: CompressionSpringModelPropsInput,\n options: CompressionSpringMeshOptions = {},\n): CompressionSpringMesh {\n const props = compressionSpringModelPropsSchema.parse(input)\n const dimensions = getCompressionSpringDimensions(props)\n const segmentsPerTurn = options.segmentsPerTurn ?? 64\n const wireSegments = options.wireSegments ?? 24\n for (const [name, value, minimum, maximum] of [\n [\"segmentsPerTurn\", segmentsPerTurn, 16, 256],\n [\"wireSegments\", wireSegments, 8, 64],\n ] as const)\n if (\n !Number.isInteger(value) ||\n value < minimum ||\n value > maximum ||\n value % 4 !== 0\n )\n throw new Error(\n `${name} must be a multiple of four in [${minimum},${maximum}]`,\n )\n const steps = props.totalTurns * segmentsPerTurn\n if (!Number.isSafeInteger(steps) || (steps + 1) * wireSegments > 250000)\n throw new Error(\"Spring exceeds mesh resolution limit (250000 vertices)\")\n const scale = Math.max(props.outerDiameter, props.freeLength)\n if (\n dimensions.activePitch - props.wireDiameter <= scale * 1e-10 ||\n props.wireDiameter <= scale * 1e-10 ||\n dimensions.insideDiameter <= scale * 1e-10\n )\n throw new Error(\"Spring clearance exceeds mesh resolution limit\")\n\n const positions: number[] = []\n const indices: number[] = []\n const wireRadius = props.wireDiameter / 2\n for (let step = 0; step <= steps; step++) {\n const center = getCompressionSpringCenterlinePoint(\n props,\n step / segmentsPerTurn,\n )\n const meanRadius = Math.hypot(center.x, center.y)\n for (let sample = 0; sample < wireSegments; sample++) {\n const angle = (sample * 2 * Math.PI) / wireSegments\n // Exact cardinal section samples keep both bearing cuts and diameters exact.\n const cosine =\n sample === wireSegments / 4 || sample === (3 * wireSegments) / 4\n ? 0\n : Math.cos(angle)\n const sine =\n sample === 0 || sample === wireSegments / 2 ? 0 : Math.sin(angle)\n const radialOffset = wireRadius * cosine\n positions.push(\n center.x + (radialOffset * center.x) / meanRadius,\n center.y + (radialOffset * center.y) / meanRadius,\n center.z + wireRadius * sine,\n )\n }\n }\n const triangle = (a: number, b: number, c: number) => {\n if (props.hand === \"left\") indices.push(a, c, b)\n else indices.push(a, b, c)\n }\n for (let step = 0; step < steps; step++)\n for (let sample = 0; sample < wireSegments; sample++) {\n const next = (sample + 1) % wireSegments\n const a = step * wireSegments\n const b = (step + 1) * wireSegments\n triangle(a + sample, b + sample, b + next)\n triangle(a + sample, b + next, a + next)\n }\n // Terminal sections are cut in their radial/axial planes, before grinding.\n for (let corner = 1; corner + 1 < wireSegments; corner++) {\n triangle(0, corner, corner + 1)\n const end = steps * wireSegments\n triangle(end, end + corner + 1, end + corner)\n }\n return clipMeshToZRange(\n { positions, indices },\n dimensions.lowerBearingZ,\n dimensions.upperBearingZ,\n )\n}\n","import earcut from \"earcut\"\n\ntype Point = { key: string; coordinates: [number, number, number] }\ntype Mesh = { positions: number[]; indices: number[] }\n\n/** Clip triangles with shared edge intersections, then close the planar cuts. */\nexport function clipMeshToZRange(\n mesh: Mesh,\n lower: number,\n upper: number,\n): Mesh {\n const originals: Point[] = []\n const tolerance = 32 * Number.EPSILON * (upper - lower)\n for (let index = 0; index < mesh.positions.length / 3; index++)\n originals.push({\n key: `v${index}`,\n coordinates: [\n mesh.positions[index * 3]!,\n mesh.positions[index * 3 + 1]!,\n Math.abs(mesh.positions[index * 3 + 2]! - lower) <= tolerance\n ? lower\n : Math.abs(mesh.positions[index * 3 + 2]! - upper) <= tolerance\n ? upper\n : mesh.positions[index * 3 + 2]!,\n ],\n })\n const intersections = new Map<string, Point>()\n const crossing = (a: Point, b: Point, plane: number) => {\n if (a.coordinates[2] === plane) return a\n if (b.coordinates[2] === plane) return b\n const [first, second] = a.key < b.key ? [a, b] : [b, a]\n const key = `${plane}:${first.key}:${second.key}`\n let point = intersections.get(key)\n if (!point) {\n const fraction =\n (plane - first.coordinates[2]) /\n (second.coordinates[2] - first.coordinates[2])\n point = {\n key,\n coordinates: [\n first.coordinates[0] +\n fraction * (second.coordinates[0] - first.coordinates[0]),\n first.coordinates[1] +\n fraction * (second.coordinates[1] - first.coordinates[1]),\n plane,\n ],\n }\n intersections.set(key, point)\n }\n return point\n }\n const clip = (polygon: Point[], plane: number, keepAbove: boolean) => {\n const result: Point[] = []\n const inside = (point: Point) =>\n keepAbove ? point.coordinates[2] >= plane : point.coordinates[2] <= plane\n for (let index = 0; index < polygon.length; index++) {\n const a = polygon[index]!\n const b = polygon[(index + 1) % polygon.length]!\n if (inside(a)) result.push(a)\n if (inside(a) !== inside(b)) result.push(crossing(a, b, plane))\n }\n return result.filter(\n (point, index) =>\n point.key !== result[(index + result.length - 1) % result.length]?.key,\n )\n }\n const positions: number[] = []\n const indices: number[] = []\n const pointIndices = new Map<string, number>()\n const vertex = (point: Point) => {\n let index = pointIndices.get(point.key)\n if (index === undefined) {\n index = positions.length / 3\n positions.push(...point.coordinates)\n pointIndices.set(point.key, index)\n }\n return index\n }\n for (let index = 0; index < mesh.indices.length; index += 3) {\n const triangle = mesh.indices\n .slice(index, index + 3)\n .map((i) => originals[i]!)\n const polygon = clip(clip(triangle, lower, true), upper, false)\n for (let corner = 1; corner + 1 < polygon.length; corner++) {\n const points = [polygon[0]!, polygon[corner]!, polygon[corner + 1]!]\n if (new Set(points.map((point) => point.key)).size === 3)\n indices.push(...points.map(vertex))\n }\n }\n\n const edges = new Map<string, { from: number; to: number; count: number }>()\n for (let index = 0; index < indices.length; index += 3)\n for (let side = 0; side < 3; side++) {\n const from = indices[index + side]!\n const to = indices[index + ((side + 1) % 3)]!\n const key = `${Math.min(from, to)},${Math.max(from, to)}`\n const prior = edges.get(key)\n if (prior) prior.count++\n else edges.set(key, { from, to, count: 1 })\n }\n const boundary = [...edges.values()].filter((edge) => edge.count === 1)\n const outgoing = new Map(boundary.map(({ from, to }) => [from, to]))\n if (outgoing.size !== boundary.length)\n throw new Error(\"Ground clipping produced an ambiguous boundary\")\n while (outgoing.size > 0) {\n const start = outgoing.keys().next().value!\n const loop: number[] = []\n let current = start\n do {\n loop.push(current)\n const next = outgoing.get(current)\n if (next === undefined)\n throw new Error(\"Ground clipping produced an open boundary\")\n outgoing.delete(current)\n current = next\n } while (current !== start)\n const plane = positions[3 * start + 2]!\n if (\n (plane !== lower && plane !== upper) ||\n loop.some((i) => positions[3 * i + 2] !== plane)\n )\n throw new Error(\"Ground clipping boundary must lie on an end plane\")\n const coordinates = loop.flatMap((i) => [\n positions[3 * i]!,\n positions[3 * i + 1]!,\n ])\n const cap = earcut(coordinates)\n for (let index = 0; index < cap.length; index += 3) {\n const a = loop[cap[index]!]!\n let b = loop[cap[index + 1]!]!\n let c = loop[cap[index + 2]!]!\n const cross =\n (positions[b * 3]! - positions[a * 3]!) *\n (positions[c * 3 + 1]! - positions[a * 3 + 1]!) -\n (positions[b * 3 + 1]! - positions[a * 3 + 1]!) *\n (positions[c * 3]! - positions[a * 3]!)\n if ((plane === lower && cross > 0) || (plane === upper && cross < 0))\n [b, c] = [c, b]\n indices.push(a, b, c)\n }\n }\n return { positions, indices }\n}\n","import { flangedBushingModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { FlangedBushing } from \"./FlangedBushing\"\n\nexport const model = defineModelRenderer({\n name: \"flangedbushing\",\n schema: flangedBushingModelDefinitionSchema,\n render: ({ fn, ...props }) => <FlangedBushing {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { FlangedBushingModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createFlangedBushingMesh } from \"./mesh\"\n\nexport type FlangedBushingProps = FlangedBushingModelPropsInput & {\n color?: string\n}\n\n/** Square integral flange at the Z=0 end; bore continues through overall length. */\nexport function createFlangedBushingGeom(input: FlangedBushingModelPropsInput) {\n return indexedMeshToGeom3(createFlangedBushingMesh(input))\n}\n\nexport function FlangedBushing({\n color = \"#a18450\",\n ...props\n}: FlangedBushingProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createFlangedBushingGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createFlangedBushingMesh } from \"./mesh\"\nexport type { FlangedBushingMesh } from \"./mesh\"\n","import {\n flangedBushingModelPropsSchema,\n getFlangedBushingDimensions,\n type FlangedBushingModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\n/** Shared ring vertices and outward counterclockwise triangles, in millimeters. */\nexport interface FlangedBushingMesh {\n positions: number[]\n indices: number[]\n}\n\n/** Integral flange at Z=0..flangeThickness; total length includes the flange. */\nexport function createFlangedBushingMesh(\n input: FlangedBushingModelPropsInput,\n): FlangedBushingMesh {\n const props = flangedBushingModelPropsSchema.parse(input)\n const d = getFlangedBushingDimensions(props)\n const ri = d.innerDiameter / 2\n const ro = d.outerDiameter / 2\n const rf = d.flangeDiameter / 2\n // One continuous boundary, not two overlapping sleeves: the shoulder belongs\n // to the exterior and the bore remains uninterrupted through the flange.\n const profile: [number, number][] = [\n [rf, 0],\n [rf, d.shoulderZ],\n [ro, d.shoulderZ],\n [ro, d.length],\n [ri, d.length],\n [ri, 0],\n ]\n const segments = 96 // Four cardinal directions are exact; allocation is fixed.\n const positions: number[] = []\n const indices: number[] = []\n for (const [radius, z] of profile)\n for (let i = 0; i < segments; i++) {\n const angle = (i * Math.PI * 2) / segments\n positions.push(radius * Math.cos(angle), radius * Math.sin(angle), z)\n }\n for (let ring = 0; ring < profile.length; ring++) {\n const a = ring * segments\n const b = ((ring + 1) % profile.length) * segments\n for (let i = 0; i < segments; i++) {\n const next = (i + 1) % segments\n indices.push(a + i, a + next, b + next, a + i, b + next, b + i)\n }\n }\n return { positions, indices }\n}\n","import { flatHeadScrewModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { FlatHeadScrew } from \"./FlatHeadScrew\"\n\nexport const model = defineModelRenderer({\n name: \"flatheadscrew\",\n schema: flatHeadScrewModelDefinitionSchema,\n render: ({ fn, ...props }) => <FlatHeadScrew {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { FlatHeadScrewModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createFlatHeadScrewMesh, type FlatHeadScrewMeshOptions } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type FlatHeadScrewProps = FlatHeadScrewModelPropsInput & {\n color?: string\n}\nexport function createFlatHeadScrewGeom(\n input: FlatHeadScrewModelPropsInput,\n options?: FlatHeadScrewMeshOptions,\n) {\n return indexedMeshToGeom3(createFlatHeadScrewMesh(input, options))\n}\nexport function FlatHeadScrew({\n color = \"#737e8f\",\n ...props\n}: FlatHeadScrewProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createFlatHeadScrewGeom(props)} />\n </Colorize>\n )\n}\nexport { createFlatHeadScrewMesh } from \"./mesh\"\nexport type {\n FlatHeadScrewMesh,\n FlatHeadScrewMeshOptions,\n} from \"./mesh\"\n","import {\n flatHeadScrewModelPropsSchema,\n type FlatHeadScrewModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\nexport interface FlatHeadScrewMeshOptions {\n radialSegments?: number\n threadStepsPerTurn?: number\n}\n\n/** Outward-oriented, welded indexed surface, in millimeters. */\nexport interface FlatHeadScrewMesh {\n positions: number[]\n indices: number[]\n}\n\nexport function createFlatHeadScrewMesh(\n input: FlatHeadScrewModelPropsInput,\n options: FlatHeadScrewMeshOptions = {},\n): FlatHeadScrewMesh {\n const p = flatHeadScrewModelPropsSchema.parse(input)\n const segments = options.radialSegments ?? 96\n const axial = options.threadStepsPerTurn ?? 24\n if (\n !Number.isInteger(segments) ||\n segments < 24 ||\n segments > 192 ||\n segments % 24 !== 0 ||\n !Number.isInteger(axial) ||\n axial < 24 ||\n axial > 96\n )\n throw new Error(\n \"Screw mesh resolution requires 24..192 radial segments divisible by 24 and 24..96 thread steps\",\n )\n const positions: number[] = [],\n indices: number[] = []\n const welded = new Map<string, number>()\n const vertex = (x: number, y: number, z: number) => {\n const key = [x, y, z].map((v) => Math.round(v * 1e10)).join(\":\")\n const existing = welded.get(key)\n if (existing !== undefined) return existing\n const index = positions.length / 3\n positions.push(x, y, z)\n welded.set(key, index)\n return index\n }\n const triangle = (a: number, b: number, c: number) => {\n if (a === b || b === c || c === a) return\n const point = (i: number) => positions.slice(3 * i, 3 * i + 3)\n const A = point(a),\n B = point(b),\n C = point(c)\n const u = B.map((v, i) => v - A[i]!),\n v = C.map((w, i) => w - A[i]!)\n const area = Math.hypot(\n u[1]! * v[2]! - u[2]! * v[1]!,\n u[2]! * v[0]! - u[0]! * v[2]!,\n u[0]! * v[1]! - u[1]! * v[0]!,\n )\n if (area > 1e-12) indices.push(a, b, c)\n }\n const ring = (\n radiusAt: (theta: number) => number,\n zAt: number | ((theta: number) => number),\n ) =>\n Array.from({ length: segments }, (_, i) => {\n const theta = (i * 2 * Math.PI) / segments,\n r = radiusAt(theta)\n return vertex(\n r * Math.cos(theta),\n r * Math.sin(theta),\n typeof zAt === \"number\" ? zAt : zAt(theta),\n )\n })\n const connect = (a: number[], b: number[]) => {\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n triangle(a[i]!, a[n]!, b[n]!)\n triangle(a[i]!, b[n]!, b[i]!)\n }\n }\n const cap = (a: number[], z: number, up: boolean) => {\n const c = vertex(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n up ? triangle(c, a[i]!, a[n]!) : triangle(c, a[n]!, a[i]!)\n }\n }\n let previous: number[] = []\n const add = (\n radiusAt: (theta: number) => number,\n zAt: number | ((theta: number) => number),\n ) => {\n const r = ring(radiusAt, zAt)\n if (previous.length) connect(previous, r)\n previous = r\n return r\n }\n const major = p.diameter / 2,\n minor = p.threadRootDiameter / 2,\n pitch = p.threadPitch\n const shaftEnd = -p.headHeight - p.underHeadRadius * (Math.sqrt(2) - 1)\n const steps = p.showThreads\n ? Math.ceil(((shaftEnd + p.length) / pitch) * axial)\n : 1\n if ((steps + 100) * segments > 400000)\n throw new Error(\"Screw exceeds mesh resolution limit\")\n const levels = new Set<number>([\n -p.length,\n -p.length + p.tipChamfer,\n shaftEnd,\n ])\n if (p.showThreads)\n for (let i = 0; i <= steps; i++)\n levels.add(-p.length + ((shaftEnd + p.length) * i) / steps)\n for (const z of [...levels].sort((a, b) => a - b)) {\n const r = add((theta) => {\n // Phase is fixed at +X on the nominal tip plane, before chamfer clipping.\n const phase =\n ((((z + p.length) / pitch -\n ((p.threadHand === \"right\" ? 1 : -1) * theta) / (2 * Math.PI)) %\n 1) +\n 1) %\n 1\n const d = Math.min(phase, 1 - phase)\n const groove = Math.min(\n major - minor,\n Math.max(0, (d - 1 / 16) * pitch * Math.sqrt(3)),\n )\n const thread = p.showThreads ? major - groove : major\n return Math.min(\n thread,\n major - Math.max(0, p.tipChamfer - (z + p.length)),\n )\n }, z)\n if (z === -p.length) cap(r, z, false)\n }\n // Tangent circular under-head blend; its start also trims incomplete crests.\n add(() => major, shaftEnd)\n const filletCenterR = major + p.underHeadRadius\n const filletCenterZ = shaftEnd\n for (let i = 1; i <= 16; i++) {\n const angle = Math.PI - ((Math.PI - (3 * Math.PI) / 4) * i) / 16\n add(\n () => filletCenterR + p.underHeadRadius * Math.cos(angle),\n filletCenterZ + p.underHeadRadius * Math.sin(angle),\n )\n }\n\n const hexRadius = (theta: number) =>\n p.socketAcrossFlats /\n 2 /\n Math.max(\n Math.abs(Math.sin(theta)),\n Math.abs(Math.sin(theta + (2 * Math.PI) / 3)),\n Math.abs(Math.sin(theta + (4 * Math.PI) / 3)),\n )\n add(() => p.headDiameter / 2, 0)\n add(hexRadius, 0)\n add(hexRadius, -p.socketDepth)\n cap(previous, -p.socketDepth, true)\n\n return { positions, indices }\n}\n","import { flexScreenModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { FlexScreen } from \"../../FlexScreen\"\n\nexport const model = defineModelRenderer({\n name: \"flexscreen\",\n schema: flexScreenModelDefinitionSchema,\n render: ({ fn, ...props }) => <FlexScreen {...props} />,\n pads: \"footprinter\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import {\n Colorize,\n Cuboid,\n Hull,\n Rotate,\n RoundedCuboid,\n Translate,\n} from \"jscad-fiber\"\nimport { Fragment } from \"react\"\nimport { Screen } from \"./Screen\"\n\ntype Point3 = [number, number, number]\ntype Rotation3 = [number | string, number | string, number | string]\n\nexport type FlexScreenOrientation =\n | \"sitsFlat\"\n | \"sitsFlatBelowBoard\"\n | \"foldedToFaceAboveBoard\"\n | \"foldedToFaceBelowBoard\"\n | \"foldedToRightAngleAboveBoard\"\n | \"foldedToRightAngleBelowBoard\"\n\nexport type FlexScreenAspectRatio =\n | number\n | `${number}:${number}`\n | readonly [number, number]\n\nexport interface FlexScreenProps {\n /** Explicit screen width. If height is omitted, it is derived from the ratio. */\n width?: number\n /** Explicit screen height. If width is omitted, it is derived from the ratio. */\n height?: number\n /** Screen diagonal. Used with the ratio unless one other dimension is supplied. */\n diagonal?: number\n /** Width-to-height ratio. Accepts 1.777, \"16:9\", or [16, 9]. */\n aspectRatio?: FlexScreenAspectRatio\n /** Alias for aspectRatio. aspectRatio takes precedence when both are supplied. */\n ratio?: FlexScreenAspectRatio\n /** Diagonal used when width, height, and diagonal are all omitted. */\n defaultDiagonal?: number\n\n orientation?: FlexScreenOrientation\n /** Boolean orientation shortcuts for footprint/configuration builders. */\n sitsFlat?: boolean\n sitsFlatBelowBoard?: boolean\n foldedToFaceAboveBoard?: boolean\n foldedToFaceBelowBoard?: boolean\n /** Concise aliases for the 180-degree face-above/face-below folds. */\n foldsAboveBoard?: boolean\n foldsBelowBoard?: boolean\n foldedToRightAngleAboveBoard?: boolean\n foldedToRightAngleBelowBoard?: boolean\n\n screenThickness?: number\n bezelInset?: number\n bezelDepth?: number\n activeAreaWidth?: number\n activeAreaHeight?: number\n screenColor?: string\n bezelColor?: string\n showScreen?: boolean\n\n /** Centerline length of the modeled cable route. */\n flexCableLength?: number\n /** Cable body width. The connector end widens when its contacts need more room. */\n flexCableWidth?: number\n flexCableThickness?: number\n flexCableColor?: string\n /** Number of connector contacts, matching FPC.pinCount. */\n pinCount?: number\n /** Center-to-center connector contact spacing, matching FPC.pitch. */\n pitch?: number\n /** Connector contact width, matching FPC.padWidth (footprinter pw). */\n padWidth?: number\n /** Exposed contact length, matching FPC.padLength (footprinter pl). */\n padLength?: number\n /** Straight length of the widened connector end, before the taper. */\n tailLength?: number\n /** Length of the transition from the widened tail to the cable body. */\n taperLength?: number\n /** @deprecated Use pinCount. */\n conductorCount?: number\n /** @deprecated Use pitch. */\n conductorPitch?: number\n /** @deprecated Use padWidth. */\n conductorWidth?: number\n conductorThickness?: number\n conductorColor?: string\n cableEdgeMargin?: number\n /** @deprecated Use padLength. */\n exposedContactLength?: number\n showConductors?: boolean\n showFlexCable?: boolean\n\n showStiffeners?: boolean\n stiffenerLength?: number\n stiffenerThickness?: number\n stiffenerColor?: string\n\n /** Radius of the 90-degree cable bend in right-angle presets. */\n bendRadius?: number\n /** Number of straight segments used to approximate a 90-degree bend. */\n bendSegments?: number\n /** Straight cable length after the bend before the screen attachment. */\n rightAngleVerticalLead?: number\n /** Screen backplane distance above the board for a 180-degree upward fold. */\n distanceAboveBoard?: number\n /** Screen backplane distance below the board for a 180-degree downward fold. */\n distanceBelowBoard?: number\n /** Straight distance from the connector to the start of a 180-degree fold. */\n foldDistanceFromConnector?: number\n /** Maximum distance the 180-degree loop extends beyond the fold start. */\n foldOutset?: number\n /** Number of straight segments used to approximate a 180-degree fold. */\n foldSegments?: number\n screenGap?: number\n\n /** Board reference used to place above/below presets. The board is not rendered. */\n boardTopZ?: number\n boardThickness?: number\n boardClearance?: number\n cableStartX?: number\n cableStartY?: number\n /** Overrides the preset-derived cable centerline Z at the connector end. */\n cableStartZ?: number\n cableLateralOffset?: number\n\n /** Added after the orientation preset computes the screen attachment pose. */\n screenOffset?: { x?: number; y?: number; z?: number }\n /** Replaces the orientation preset's screen rotation. */\n screenRotation?: Rotation3\n /** Rotates the complete assembly around its cable origin. */\n rotation?: Rotation3\n /** Translates the complete assembly after rotation. */\n offset?: { x?: number; y?: number; z?: number }\n}\n\nexport interface ResolvedFlexScreenSize {\n width: number\n height: number\n diagonal: number\n aspectRatio: number\n}\n\nconst DEFAULT_ASPECT_RATIO = 16 / 9\nconst DEFAULT_DIAGONAL = 40\nconst EPSILON = 1e-6\n\nconst assertPositive = (name: string, value: number) => {\n if (!Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be a finite number greater than zero`)\n }\n}\n\nconst resolveAspectRatio = (\n value: FlexScreenAspectRatio | undefined,\n): number => {\n if (value === undefined) return DEFAULT_ASPECT_RATIO\n if (typeof value === \"number\") {\n assertPositive(\"aspectRatio\", value)\n return value\n }\n if (typeof value !== \"string\") {\n const [ratioWidth, ratioHeight] = value\n assertPositive(\"aspectRatio width\", ratioWidth)\n assertPositive(\"aspectRatio height\", ratioHeight)\n return ratioWidth / ratioHeight\n }\n const parts = value.split(\":\")\n if (parts.length !== 2) {\n throw new Error('aspectRatio must look like \"16:9\"')\n }\n const ratioWidth = Number(parts[0])\n const ratioHeight = Number(parts[1])\n assertPositive(\"aspectRatio width\", ratioWidth)\n assertPositive(\"aspectRatio height\", ratioHeight)\n return ratioWidth / ratioHeight\n}\n\nexport const resolveFlexScreenSize = ({\n width,\n height,\n diagonal,\n aspectRatio,\n ratio,\n defaultDiagonal = DEFAULT_DIAGONAL,\n}: Pick<\n FlexScreenProps,\n \"width\" | \"height\" | \"diagonal\" | \"aspectRatio\" | \"ratio\" | \"defaultDiagonal\"\n>): ResolvedFlexScreenSize => {\n const resolvedRatio = resolveAspectRatio(aspectRatio ?? ratio)\n\n if (width !== undefined) assertPositive(\"width\", width)\n if (height !== undefined) assertPositive(\"height\", height)\n if (diagonal !== undefined) assertPositive(\"diagonal\", diagonal)\n assertPositive(\"defaultDiagonal\", defaultDiagonal)\n\n let resolvedWidth: number\n let resolvedHeight: number\n\n if (width !== undefined && height !== undefined) {\n resolvedWidth = width\n resolvedHeight = height\n } else if (diagonal !== undefined && width !== undefined) {\n if (width >= diagonal) {\n throw new Error(\"width must be smaller than diagonal\")\n }\n resolvedWidth = width\n resolvedHeight = Math.sqrt(diagonal ** 2 - width ** 2)\n } else if (diagonal !== undefined && height !== undefined) {\n if (height >= diagonal) {\n throw new Error(\"height must be smaller than diagonal\")\n }\n resolvedWidth = Math.sqrt(diagonal ** 2 - height ** 2)\n resolvedHeight = height\n } else if (width !== undefined) {\n resolvedWidth = width\n resolvedHeight = width / resolvedRatio\n } else if (height !== undefined) {\n resolvedWidth = height * resolvedRatio\n resolvedHeight = height\n } else {\n const resolvedDiagonal = diagonal ?? defaultDiagonal\n resolvedHeight = resolvedDiagonal / Math.sqrt(resolvedRatio ** 2 + 1)\n resolvedWidth = resolvedHeight * resolvedRatio\n }\n\n return {\n width: resolvedWidth,\n height: resolvedHeight,\n diagonal: Math.hypot(resolvedWidth, resolvedHeight),\n aspectRatio: resolvedWidth / resolvedHeight,\n }\n}\n\nconst resolveOrientation = (props: FlexScreenProps): FlexScreenOrientation => {\n const shortcuts = [\n [\"sitsFlat\", props.sitsFlat],\n [\"sitsFlatBelowBoard\", props.sitsFlatBelowBoard],\n [\"foldedToFaceAboveBoard\", props.foldedToFaceAboveBoard],\n [\"foldedToFaceBelowBoard\", props.foldedToFaceBelowBoard],\n [\"foldedToFaceAboveBoard\", props.foldsAboveBoard],\n [\"foldedToFaceBelowBoard\", props.foldsBelowBoard],\n [\"foldedToRightAngleAboveBoard\", props.foldedToRightAngleAboveBoard],\n [\"foldedToRightAngleBelowBoard\", props.foldedToRightAngleBelowBoard],\n ].filter((entry) => entry[1]) as Array<[FlexScreenOrientation, boolean]>\n\n if (shortcuts.length > 1) {\n throw new Error(\n \"Only one FlexScreen boolean orientation shortcut can be true\",\n )\n }\n return shortcuts[0]?.[0] ?? props.orientation ?? \"sitsFlat\"\n}\n\nconst distance = (a: Point3, b: Point3) =>\n Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2])\n\nconst interpolate = (a: Point3, b: Point3, progress: number): Point3 => [\n a[0] + (b[0] - a[0]) * progress,\n a[1] + (b[1] - a[1]) * progress,\n a[2] + (b[2] - a[2]) * progress,\n]\n\nconst getPathDistances = (points: readonly Point3[]) => {\n const distances = [0]\n for (let index = 1; index < points.length; index += 1) {\n distances.push(\n distances[index - 1]! + distance(points[index - 1]!, points[index]!),\n )\n }\n return distances\n}\n\nconst pointAtDistance = (\n points: readonly Point3[],\n distances: readonly number[],\n targetDistance: number,\n): Point3 => {\n if (targetDistance <= 0) return points[0]!\n const totalLength = distances.at(-1)!\n if (targetDistance >= totalLength) return points.at(-1)!\n\n for (let index = 1; index < points.length; index += 1) {\n if (distances[index]! >= targetDistance) {\n const segmentStart = distances[index - 1]!\n const segmentLength = distances[index]! - segmentStart\n return interpolate(\n points[index - 1]!,\n points[index]!,\n (targetDistance - segmentStart) / segmentLength,\n )\n }\n }\n return points.at(-1)!\n}\n\nconst slicePath = (\n points: readonly Point3[],\n startDistance: number,\n endDistance: number,\n): Point3[] => {\n const distances = getPathDistances(points)\n const totalLength = distances.at(-1)!\n const safeStart = Math.max(0, Math.min(startDistance, totalLength))\n const safeEnd = Math.max(safeStart, Math.min(endDistance, totalLength))\n const result = [pointAtDistance(points, distances, safeStart)]\n\n for (let index = 1; index < points.length - 1; index += 1) {\n if (distances[index]! > safeStart && distances[index]! < safeEnd) {\n result.push(points[index]!)\n }\n }\n result.push(pointAtDistance(points, distances, safeEnd))\n return result\n}\n\nconst createFlatPath = (start: Point3, flexCableLength: number): Point3[] => [\n start,\n [start[0], start[1] + flexCableLength, start[2]],\n]\n\nconst createFoldedPath = ({\n start,\n endZ,\n flexCableLength,\n foldDistanceFromConnector,\n foldOutset,\n foldSegments,\n}: {\n start: Point3\n endZ: number\n flexCableLength: number\n foldDistanceFromConnector: number\n foldOutset: number\n foldSegments: number\n}): Point3[] => {\n const points: Point3[] = [start]\n const foldStart: Point3 = [\n start[0],\n start[1] + foldDistanceFromConnector,\n start[2],\n ]\n if (foldDistanceFromConnector > EPSILON) points.push(foldStart)\n\n for (let index = 1; index <= foldSegments; index += 1) {\n const angle = (Math.PI * index) / foldSegments\n points.push([\n start[0],\n foldStart[1] + foldOutset * Math.sin(angle),\n start[2] + ((endZ - start[2]) * (1 - Math.cos(angle))) / 2,\n ])\n }\n\n const minimumLength = getPathDistances(points).at(-1)!\n if (minimumLength > flexCableLength + EPSILON) {\n throw new Error(\n `flexCableLength must be at least ${minimumLength.toFixed(2)} for this 180-degree fold`,\n )\n }\n\n const tailLength = Math.max(0, flexCableLength - minimumLength)\n if (tailLength > EPSILON) {\n const foldEnd = points.at(-1)!\n points.push([foldEnd[0], foldEnd[1] - tailLength, foldEnd[2]])\n }\n return points\n}\n\nconst createRightAnglePath = ({\n start,\n flexCableLength,\n bendRadius,\n bendSegments,\n verticalLead,\n direction,\n}: {\n start: Point3\n flexCableLength: number\n bendRadius: number\n bendSegments: number\n verticalLead: number\n direction: 1 | -1\n}): Point3[] => {\n const bendLengthPerRadius =\n 2 * bendSegments * Math.sin(Math.PI / (4 * bendSegments))\n const resolvedRadius = Math.min(\n bendRadius,\n flexCableLength / bendLengthPerRadius,\n )\n const bendLength = resolvedRadius * bendLengthPerRadius\n const remainingLength = Math.max(0, flexCableLength - bendLength)\n const resolvedVerticalLead = Math.min(verticalLead, remainingLength * 0.45)\n const horizontalLength = remainingLength - resolvedVerticalLead\n const points: Point3[] = [start]\n\n if (horizontalLength > EPSILON) {\n points.push([start[0], start[1] + horizontalLength, start[2]])\n }\n\n for (let index = 1; index <= bendSegments; index += 1) {\n const angle = ((Math.PI / 2) * index) / bendSegments\n points.push([\n start[0],\n start[1] + horizontalLength + resolvedRadius * Math.sin(angle),\n start[2] + direction * resolvedRadius * (1 - Math.cos(angle)),\n ])\n }\n\n if (resolvedVerticalLead > EPSILON) {\n const arcEnd = points.at(-1)!\n points.push([\n arcEnd[0],\n arcEnd[1],\n arcEnd[2] + direction * resolvedVerticalLead,\n ])\n }\n return points\n}\n\nconst CableStrip = ({\n points,\n width,\n thickness,\n color,\n acrossOffset = 0,\n normalOffset = 0,\n overlap = 0.03,\n widthAtDistance,\n startDistance = 0,\n}: {\n points: readonly Point3[]\n width: number\n thickness: number\n color: string\n acrossOffset?: number\n normalOffset?: number\n overlap?: number\n widthAtDistance?: (distance: number) => number\n startDistance?: number\n}) => {\n const distances = getPathDistances(points)\n return (\n <Colorize color={color}>\n {points.slice(1).map((point, index) => {\n const previous = points[index]!\n const dx = point[0] - previous[0]\n const dy = point[1] - previous[1]\n const dz = point[2] - previous[2]\n const segmentLength = Math.hypot(dx, dy, dz)\n if (segmentLength < EPSILON) return null\n\n const pitch = Math.asin(dz / segmentLength)\n const yaw = Math.atan2(-dx, dy)\n const midpoint: Point3 = [\n (previous[0] + point[0]) / 2,\n (previous[1] + point[1]) / 2,\n (previous[2] + point[2]) / 2,\n ]\n const roundRadius = Math.max(\n 0.001,\n Math.min(width, thickness, segmentLength) / 2 - 0.001,\n )\n const startWidth =\n widthAtDistance?.(startDistance + distances[index]!) ?? width\n const endWidth =\n widthAtDistance?.(startDistance + distances[index + 1]!) ?? width\n\n return (\n <Translate key={`${index}:${midpoint.join(\":\")}`} offset={midpoint}>\n <Rotate rotation={[pitch, 0, yaw]}>\n {widthAtDistance ? (\n <Hull>\n <Cuboid\n size={[startWidth, overlap, thickness]}\n center={[acrossOffset, -segmentLength / 2, normalOffset]}\n />\n <Cuboid\n size={[endWidth, overlap, thickness]}\n center={[acrossOffset, segmentLength / 2, normalOffset]}\n />\n </Hull>\n ) : (\n <RoundedCuboid\n size={[width, segmentLength + overlap, thickness]}\n center={[acrossOffset, 0, normalOffset]}\n roundRadius={roundRadius}\n />\n )}\n </Rotate>\n </Translate>\n )\n })}\n </Colorize>\n )\n}\n\nexport const FlexScreen = (props: FlexScreenProps) => {\n const {\n width,\n height,\n diagonal,\n aspectRatio,\n ratio,\n defaultDiagonal,\n screenThickness = 1.2,\n bezelInset = 2,\n bezelDepth = 0.65,\n activeAreaWidth,\n activeAreaHeight,\n screenColor = \"#071b24\",\n bezelColor = \"#15181d\",\n showScreen = true,\n flexCableLength = 28,\n flexCableThickness = 0.18,\n flexCableColor = \"#d79528\",\n pinCount: conductorCount = props.conductorCount ?? 8,\n pitch: conductorPitch = props.conductorPitch,\n padWidth: conductorWidth = props.conductorWidth,\n conductorThickness = 0.035,\n conductorColor = \"#8c4a18\",\n cableEdgeMargin = 0.6,\n padLength: exposedContactLength = props.exposedContactLength ?? 2.4,\n tailLength,\n taperLength,\n showConductors = true,\n showFlexCable = true,\n showStiffeners = true,\n stiffenerLength = 3,\n stiffenerThickness = 0.16,\n stiffenerColor = \"#416bb3\",\n bendRadius = 3,\n bendSegments = 10,\n rightAngleVerticalLead = 3,\n distanceAboveBoard = 7,\n distanceBelowBoard = 7,\n foldDistanceFromConnector = 7,\n foldOutset = 4,\n foldSegments = 18,\n screenGap = 0.08,\n boardTopZ = 0,\n boardThickness = 1.6,\n boardClearance = 0.15,\n cableStartX = 0,\n cableStartY = 0,\n cableStartZ,\n cableLateralOffset = 0,\n screenOffset,\n screenRotation,\n rotation = [0, 0, 0],\n offset,\n } = props\n\n const size = resolveFlexScreenSize({\n width,\n height,\n diagonal,\n aspectRatio,\n ratio,\n defaultDiagonal,\n })\n const orientation = resolveOrientation(props)\n const belowBoard =\n orientation === \"sitsFlatBelowBoard\" ||\n orientation === \"foldedToFaceBelowBoard\" ||\n orientation === \"foldedToRightAngleBelowBoard\"\n const foldedFace =\n orientation === \"foldedToFaceAboveBoard\" ||\n orientation === \"foldedToFaceBelowBoard\"\n const rightAngle =\n orientation === \"foldedToRightAngleAboveBoard\" ||\n orientation === \"foldedToRightAngleBelowBoard\"\n\n assertPositive(\"screenThickness\", screenThickness)\n assertPositive(\"flexCableLength\", flexCableLength)\n assertPositive(\"flexCableThickness\", flexCableThickness)\n assertPositive(\"conductorThickness\", conductorThickness)\n assertPositive(\"bendRadius\", bendRadius)\n assertPositive(\"foldOutset\", foldOutset)\n assertPositive(\"boardThickness\", boardThickness)\n if (showStiffeners) assertPositive(\"stiffenerThickness\", stiffenerThickness)\n if (!Number.isFinite(exposedContactLength) || exposedContactLength < 0) {\n throw new Error(\"padLength must be a finite nonnegative length\")\n }\n if (!Number.isInteger(conductorCount) || conductorCount < 1) {\n throw new Error(\"pinCount must be a positive integer\")\n }\n if (!Number.isInteger(bendSegments) || bendSegments < 2) {\n throw new Error(\"bendSegments must be an integer of at least 2\")\n }\n if (!Number.isInteger(foldSegments) || foldSegments < 4) {\n throw new Error(\"foldSegments must be an integer of at least 4\")\n }\n if (\n boardClearance < 0 ||\n screenGap < 0 ||\n cableEdgeMargin < 0 ||\n exposedContactLength < 0 ||\n stiffenerLength < 0 ||\n rightAngleVerticalLead < 0 ||\n distanceAboveBoard < 0 ||\n distanceBelowBoard < 0 ||\n foldDistanceFromConnector < 0\n ) {\n throw new Error(\n \"clearances, margins, contact lengths, and lead lengths cannot be negative\",\n )\n }\n\n const resolvedCableWidth =\n props.flexCableWidth ?? Math.min(12, Math.max(5, size.width * 0.3))\n assertPositive(\"flexCableWidth\", resolvedCableWidth)\n const usableCableWidth = resolvedCableWidth - cableEdgeMargin * 2\n if (usableCableWidth <= 0) {\n throw new Error(\"cableEdgeMargin leaves no usable flex cable width\")\n }\n\n const resolvedConductorPitch =\n conductorPitch ??\n (conductorCount === 1 ? 0 : usableCableWidth / conductorCount)\n if (\n (conductorPitch !== undefined || conductorCount > 1) &&\n (!Number.isFinite(resolvedConductorPitch) || resolvedConductorPitch <= 0)\n ) {\n throw new Error(\"pitch must be greater than zero\")\n }\n const resolvedConductorWidth =\n conductorWidth ??\n (conductorCount === 1\n ? Math.min(usableCableWidth, resolvedCableWidth * 0.45)\n : resolvedConductorPitch * 0.48)\n assertPositive(\"padWidth\", resolvedConductorWidth)\n const conductorSpan =\n (conductorCount - 1) * resolvedConductorPitch + resolvedConductorWidth\n const connectorWidth = Math.max(\n resolvedCableWidth,\n conductorSpan + cableEdgeMargin * 2,\n )\n const widensAtConnector = connectorWidth > resolvedCableWidth + EPSILON\n // Keep the connector contacts at their specified pitch and fit the other end\n // to the body width, rather than stretching the entire cable.\n const screenConductorPitch = widensAtConnector\n ? conductorCount === 1\n ? 0\n : usableCableWidth / conductorCount\n : resolvedConductorPitch\n const screenConductorWidth = widensAtConnector\n ? Math.min(\n resolvedConductorWidth,\n conductorCount === 1 ? usableCableWidth : screenConductorPitch * 0.48,\n )\n : resolvedConductorWidth\n\n const cableStartsBelowBoard = belowBoard && !foldedFace\n const defaultCableZ = cableStartsBelowBoard\n ? boardTopZ - boardThickness - boardClearance - flexCableThickness / 2\n : boardTopZ + boardClearance + flexCableThickness / 2\n const start: Point3 = [\n cableStartX + cableLateralOffset,\n cableStartY,\n cableStartZ ?? defaultCableZ,\n ]\n const direction = belowBoard ? -1 : 1\n const foldedScreenBackZ =\n orientation === \"foldedToFaceAboveBoard\"\n ? boardTopZ + distanceAboveBoard\n : boardTopZ - boardThickness - distanceBelowBoard\n const foldedCableEndZ =\n orientation === \"foldedToFaceAboveBoard\"\n ? foldedScreenBackZ - screenGap - flexCableThickness / 2\n : foldedScreenBackZ + screenGap + flexCableThickness / 2\n const path = foldedFace\n ? createFoldedPath({\n start,\n endZ: foldedCableEndZ,\n flexCableLength,\n foldDistanceFromConnector,\n foldOutset,\n foldSegments,\n })\n : rightAngle\n ? createRightAnglePath({\n start,\n flexCableLength,\n bendRadius,\n bendSegments,\n verticalLead: rightAngleVerticalLead,\n direction,\n })\n : createFlatPath(start, flexCableLength)\n const totalCableLength = getPathDistances(path).at(-1)!\n if (tailLength !== undefined) {\n assertPositive(\"tailLength\", tailLength)\n if (tailLength >= totalCableLength) {\n throw new Error(\"tailLength must be shorter than flexCableLength\")\n }\n }\n if (taperLength !== undefined) assertPositive(\"taperLength\", taperLength)\n const contactLength = Math.min(\n Math.max(0, exposedContactLength),\n totalCableLength / 2,\n tailLength ?? Infinity,\n )\n const resolvedStiffenerLength = Math.min(\n Math.max(0, stiffenerLength),\n totalCableLength / 2,\n tailLength ?? Infinity,\n )\n const connectorLeadLength =\n tailLength ?? Math.max(contactLength, resolvedStiffenerLength)\n if (\n taperLength !== undefined &&\n connectorLeadLength + taperLength > totalCableLength + EPSILON\n ) {\n throw new Error(\n \"tailLength and taperLength must fit within flexCableLength\",\n )\n }\n const taperEndDistance = Math.min(\n totalCableLength,\n connectorLeadLength +\n (taperLength ?? Math.max(3, (connectorWidth - resolvedCableWidth) / 2)),\n )\n const cableWidthAtDistance = (distance: number) => {\n if (distance <= connectorLeadLength) return connectorWidth\n const progress = Math.min(\n 1,\n (distance - connectorLeadLength) /\n (taperEndDistance - connectorLeadLength),\n )\n return connectorWidth + (resolvedCableWidth - connectorWidth) * progress\n }\n const cablePath = widensAtConnector\n ? [\n ...slicePath(path, 0, connectorLeadLength),\n ...slicePath(path, connectorLeadLength, taperEndDistance).slice(1),\n ...slicePath(path, taperEndDistance, totalCableLength).slice(1),\n ]\n : path\n const widthProfile = widensAtConnector ? cableWidthAtDistance : undefined\n const startContacts = slicePath(path, 0, contactLength)\n const endContacts = slicePath(\n path,\n totalCableLength - contactLength,\n totalCableLength,\n )\n const startStiffener = slicePath(cablePath, 0, resolvedStiffenerLength)\n const endStiffener = slicePath(\n cablePath,\n totalCableLength - resolvedStiffenerLength,\n totalCableLength,\n )\n\n const pathEnd = path.at(-1)!\n let presetScreenRotation: Rotation3\n let screenCenter: Point3\n if (orientation === \"sitsFlat\") {\n presetScreenRotation = [0, 0, 0]\n screenCenter = [\n pathEnd[0],\n pathEnd[1] + size.height / 2,\n pathEnd[2] + flexCableThickness / 2 + screenGap,\n ]\n } else if (orientation === \"sitsFlatBelowBoard\") {\n presetScreenRotation = [0, Math.PI, 0]\n screenCenter = [\n pathEnd[0],\n pathEnd[1] + size.height / 2,\n pathEnd[2] - flexCableThickness / 2 - screenGap,\n ]\n } else if (orientation === \"foldedToFaceAboveBoard\") {\n presetScreenRotation = [0, 0, 0]\n screenCenter = [pathEnd[0], pathEnd[1] - size.height / 2, foldedScreenBackZ]\n } else if (orientation === \"foldedToFaceBelowBoard\") {\n presetScreenRotation = [0, Math.PI, 0]\n screenCenter = [pathEnd[0], pathEnd[1] - size.height / 2, foldedScreenBackZ]\n } else if (orientation === \"foldedToRightAngleAboveBoard\") {\n presetScreenRotation = [Math.PI / 2, 0, 0]\n screenCenter = [\n pathEnd[0],\n pathEnd[1] - flexCableThickness / 2 - screenGap,\n pathEnd[2] + size.height / 2,\n ]\n } else {\n presetScreenRotation = [-Math.PI / 2, 0, 0]\n screenCenter = [\n pathEnd[0],\n pathEnd[1] + flexCableThickness / 2 + screenGap,\n pathEnd[2] - size.height / 2,\n ]\n }\n screenCenter = [\n screenCenter[0] + (screenOffset?.x ?? 0),\n screenCenter[1] + (screenOffset?.y ?? 0),\n screenCenter[2] + (screenOffset?.z ?? 0),\n ]\n\n const conductorOffsets = Array.from(\n { length: conductorCount },\n (_, index) => (index - (conductorCount - 1) / 2) * resolvedConductorPitch,\n )\n const conductorNormalOffset = (flexCableThickness + conductorThickness) / 2\n const stiffenerNormalOffset = -(flexCableThickness + stiffenerThickness) / 2\n\n const assembly = (\n <>\n {showFlexCable && (\n <CableStrip\n points={cablePath}\n width={resolvedCableWidth}\n widthAtDistance={widthProfile}\n thickness={flexCableThickness}\n color={flexCableColor}\n />\n )}\n\n {showFlexCable && showStiffeners && resolvedStiffenerLength > EPSILON && (\n <>\n <CableStrip\n points={startStiffener}\n width={connectorWidth}\n thickness={stiffenerThickness}\n color={stiffenerColor}\n normalOffset={stiffenerNormalOffset}\n />\n <CableStrip\n points={endStiffener}\n width={resolvedCableWidth}\n widthAtDistance={widthProfile}\n startDistance={totalCableLength - resolvedStiffenerLength}\n thickness={stiffenerThickness}\n color={stiffenerColor}\n normalOffset={stiffenerNormalOffset}\n />\n </>\n )}\n\n {showFlexCable &&\n showConductors &&\n contactLength > EPSILON &&\n conductorOffsets.map((acrossOffset, index) => (\n <Fragment key={`conductor:${index}`}>\n <CableStrip\n points={startContacts}\n width={resolvedConductorWidth}\n thickness={conductorThickness}\n color={conductorColor}\n acrossOffset={acrossOffset}\n normalOffset={conductorNormalOffset}\n />\n <CableStrip\n points={endContacts}\n width={screenConductorWidth}\n thickness={conductorThickness}\n color={conductorColor}\n acrossOffset={\n (index - (conductorCount - 1) / 2) * screenConductorPitch\n }\n normalOffset={conductorNormalOffset}\n />\n </Fragment>\n ))}\n\n {showScreen && (\n <Translate offset={screenCenter}>\n <Rotate rotation={screenRotation ?? presetScreenRotation}>\n <Screen\n width={size.width}\n height={size.height}\n thickness={screenThickness}\n bezelInset={bezelInset}\n bezelDepth={bezelDepth}\n screenWidth={activeAreaWidth}\n screenHeight={activeAreaHeight}\n screenColor={screenColor}\n bezelColor={bezelColor}\n />\n </Rotate>\n </Translate>\n )}\n </>\n )\n\n return (\n <Translate\n offset={{\n x: offset?.x ?? 0,\n y: offset?.y ?? 0,\n z: offset?.z ?? 0,\n }}\n >\n <Translate offset={start}>\n <Rotate rotation={rotation}>\n <Translate offset={[-start[0], -start[1], -start[2]]}>\n {assembly}\n </Translate>\n </Rotate>\n </Translate>\n </Translate>\n )\n}\n\nexport default FlexScreen\n","import { Colorize, Cuboid, Subtract, Translate } from \"jscad-fiber\"\n\nexport interface ScreenProps {\n width?: number\n height?: number\n thickness?: number\n bezelInset?: number\n bezelDepth?: number\n screenColor?: string\n bezelColor?: string\n screenWidth?: number\n screenHeight?: number\n offset?: { x?: number; y?: number; z?: number }\n}\n\nexport const Screen = ({\n width = 30,\n height = 22,\n thickness = 1,\n bezelInset = 2,\n bezelDepth = 1,\n screenColor = \"#001414\",\n bezelColor = \"#0f1116\",\n screenWidth,\n screenHeight,\n offset,\n}: ScreenProps) => {\n const w = width\n const h = height\n const stackHeight = Math.max(thickness, 0.4)\n const clampedBezelDepth = Math.max(Math.min(bezelDepth, stackHeight), 0.2)\n const backBlockHeight = Math.max(stackHeight - clampedBezelDepth, 0)\n const inset = Math.max(bezelInset, 0)\n const innerWidth = Math.max(screenWidth ?? w - inset * 2, 2)\n const innerHeight = Math.max(screenHeight ?? h - inset * 2, 2)\n const screenThickness = Math.min(\n Math.max(clampedBezelDepth * 0.6, 0.2),\n clampedBezelDepth,\n )\n const offsetX = offset?.x ?? 0\n const offsetY = offset?.y ?? 0\n const offsetZ = offset?.z ?? 0\n\n return (\n <Translate offset={{ x: offsetX, y: offsetY, z: offsetZ }}>\n {backBlockHeight > 0 && (\n <Colorize color={bezelColor}>\n <Cuboid\n size={[w, h, backBlockHeight]}\n offset={[0, 0, backBlockHeight / 2]}\n />\n </Colorize>\n )}\n\n <Colorize color={bezelColor}>\n <Subtract>\n <Cuboid\n size={[w, h, clampedBezelDepth]}\n offset={[0, 0, backBlockHeight + clampedBezelDepth / 2]}\n />\n <Cuboid\n size={[innerWidth, innerHeight, clampedBezelDepth + 0.02]}\n offset={[0, 0, backBlockHeight + clampedBezelDepth / 2]}\n />\n </Subtract>\n </Colorize>\n\n <Colorize color={screenColor}>\n <Cuboid\n size={[innerWidth, innerHeight, screenThickness]}\n offset={[0, 0, backBlockHeight + screenThickness / 2]}\n />\n </Colorize>\n </Translate>\n )\n}\n\n// TODO: remove Display alias after downstreams migrate\nexport const Display = Screen\n\nexport default Screen\n","import { helicalGearModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { HelicalGear } from \"../../HelicalGear\"\n\nexport const model = defineModelRenderer({\n name: \"helicalgear\",\n schema: helicalGearModelDefinitionSchema,\n render: ({ fn, ...props }) => <HelicalGear {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { HelicalGearModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"./mechanical/indexedMeshToGeom3\"\nimport { createHelicalGearMesh } from \"./mechanical/helical-gear-mesh\"\n\nexport type HelicalGearProps = HelicalGearModelPropsInput & { color?: string }\n\n/** Axis +Z, lower face Z=0; optional hub extends above the gear face. */\nexport function createHelicalGearGeom(input: HelicalGearModelPropsInput) {\n return indexedMeshToGeom3(createHelicalGearMesh(input))\n}\n\nexport function HelicalGear({ color = \"#737e8f\", ...props }: HelicalGearProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createHelicalGearGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createHelicalGearMesh } from \"./mechanical/helical-gear-mesh\"\nexport type { HelicalGearMesh } from \"./mechanical/helical-gear-mesh\"\n","import {\n getHelicalGearDimensions,\n helicalGearModelPropsSchema,\n type HelicalGearModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport { createTwistedSpurGearMesh, type SpurGearMesh } from \"./spur-gear-mesh\"\n\nexport type HelicalGearMesh = SpurGearMesh\n\n/**\n * Twisted transverse involute teeth from Z=0 to faceWidth, with a stationary\n * round bore and optional hub. Zero helix angle reproduces the spur mesh.\n */\nexport function createHelicalGearMesh(\n input: HelicalGearModelPropsInput,\n): HelicalGearMesh {\n const props = helicalGearModelPropsSchema.parse(input)\n const { twistAngle } = getHelicalGearDimensions(props)\n const { helixAngle, handedness, segmentsPerTurn, ...spur } = props\n return createTwistedSpurGearMesh(\n spur,\n (twistAngle * Math.PI) / 180,\n segmentsPerTurn,\n )\n}\n","import {\n getSpurGearDimensions,\n spurGearModelPropsSchema,\n type SpurGearModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport earcut from \"earcut\"\n\n/** Indexed triangles, counterclockwise from outside; millimeters, Z up. */\nexport interface SpurGearMesh {\n positions: number[]\n indices: number[]\n}\n\ntype Point2 = [number, number]\n\n/**\n * An external involute spur gear with its lower face at Z=0. Tooth centers\n * start on +X and rotate counterclockwise with phase. The optional hub extends\n * above the upper face, and the round bore passes through both gear and hub.\n * Flanks are sampled involutes; tips and root valleys follow circular arcs.\n * Below the base circle the flanks extend radially, without a generated\n * trochoidal root fillet or cutter undercut. No CSG or renderer is required.\n */\nexport function createSpurGearMesh(\n input: SpurGearModelPropsInput,\n): SpurGearMesh {\n return createTwistedSpurGearMesh(input)\n}\n\n/** Shared transverse involute extrusion; twist is signed radians over the face. */\nexport function createTwistedSpurGearMesh(\n input: SpurGearModelPropsInput,\n twist = 0,\n segmentsPerTurn = 32,\n): SpurGearMesh {\n const props = spurGearModelPropsSchema.parse(input)\n const dimensions = getSpurGearDimensions(props)\n const pitchRadius = dimensions.pitchDiameter / 2\n const baseRadius = dimensions.baseDiameter / 2\n const outsideRadius = dimensions.outsideDiameter / 2\n const rootRadius = dimensions.rootDiameter / 2\n const pressureAngle = (props.pressureAngle * Math.PI) / 180\n const toothAngle = (Math.PI * 2) / props.toothCount\n const phase = (((props.phase % 360) + 360) % 360) * (Math.PI / 180)\n const baseHalfAngle =\n dimensions.toothThickness / (2 * pitchRadius) +\n Math.tan(pressureAngle) -\n pressureAngle\n // Involute parameter t gives radius rb*sqrt(1+t^2) and angular roll\n // t-atan(t). Sampling t avoids an arbitrary polygonal tooth approximation.\n const startRadius = Math.max(baseRadius, rootRadius)\n const startT = Math.sqrt(Math.max(0, (startRadius / baseRadius) ** 2 - 1))\n const outsideT = Math.sqrt((outsideRadius / baseRadius) ** 2 - 1)\n const halfAngle = (t: number) => baseHalfAngle - (t - Math.atan(t))\n const rootHalfAngle = halfAngle(startT)\n const tipHalfAngle = halfAngle(outsideT)\n const flankSteps = Math.max(2, Math.ceil(props.segmentsPerTooth / 2))\n const arcSteps = Math.max(1, Math.ceil(props.segmentsPerTooth / 4))\n const rootValleyAngle = toothAngle - 2 * rootHalfAngle\n const innerRadius = Math.max(props.boreDiameter, props.hubDiameter) / 2\n // A root arc's chord lies inside its analytic circle. Refine that arc when\n // a bore or hub almost fills the root, so the cap loops remain disjoint.\n const safeRootStep =\n innerRadius > 0\n ? (twist === 0 ? 1.8 : 0.8) * Math.acos(innerRadius / rootRadius)\n : Math.PI\n const rootArcSteps = Math.max(\n arcSteps,\n Math.ceil(rootValleyAngle / safeRootStep),\n )\n // Sample at least sixteen layers per tooth of twist, and refine near a bore\n // or hub so even the triangles between layers stay outside the inner loop.\n const twistStep = Math.min(\n toothAngle / 16,\n (2 * Math.PI) / segmentsPerTurn,\n safeRootStep,\n )\n const layers = Math.max(1, Math.ceil(Math.abs(twist) / twistStep))\n const pointsPerTooth =\n 2 * flankSteps + arcSteps + rootArcSteps + (rootRadius < baseRadius ? 2 : 0)\n if (\n !Number.isFinite(rootArcSteps) ||\n !Number.isFinite(layers) ||\n (layers + 1) * props.toothCount * pointsPerTooth + 1024 > 1_000_000\n )\n throw new Error(\n \"Involute gear exceeds mesh resolution limit (1 million vertices); reduce twist or resolution, or increase bore/hub wall thickness\",\n )\n const outline: Point2[] = []\n const polar = (radius: number, angle: number) => {\n outline.push([radius * Math.cos(angle), radius * Math.sin(angle)])\n }\n\n for (let tooth = 0; tooth < props.toothCount; tooth++) {\n const center = phase + tooth * toothAngle\n polar(rootRadius, center - rootHalfAngle)\n if (rootRadius < baseRadius) polar(baseRadius, center - baseHalfAngle)\n for (let step = 1; step <= flankSteps; step++) {\n const t = startT + ((outsideT - startT) * step) / flankSteps\n polar(baseRadius * Math.sqrt(1 + t * t), center - halfAngle(t))\n }\n for (let step = 1; step <= arcSteps; step++)\n polar(\n outsideRadius,\n center - tipHalfAngle + (2 * tipHalfAngle * step) / arcSteps,\n )\n for (let step = flankSteps - 1; step >= 0; step--) {\n const t = startT + ((outsideT - startT) * step) / flankSteps\n polar(baseRadius * Math.sqrt(1 + t * t), center + halfAngle(t))\n }\n if (rootRadius < baseRadius) polar(rootRadius, center + baseHalfAngle)\n // The next tooth adds the final valley point, avoiding repeated vertices.\n for (let step = 1; step < rootArcSteps; step++)\n polar(\n rootRadius,\n center + rootHalfAngle + (rootValleyAngle * step) / rootArcSteps,\n )\n }\n\n const positions: number[] = []\n const indices: number[] = []\n const ring = (points: Point2[], z: number) => {\n const start = positions.length / 3\n for (const [x, y] of points) positions.push(x, y, z)\n return start\n }\n const circleSegments = Math.max(48, Math.min(256, props.toothCount * 4))\n const circle = (radius: number): Point2[] =>\n Array.from({ length: circleSegments }, (_, segment) => {\n const angle = phase + (segment * Math.PI * 2) / circleSegments\n return [radius * Math.cos(angle), radius * Math.sin(angle)]\n })\n const connect = (\n bottom: number,\n top: number,\n count: number,\n inward = false,\n ) => {\n for (let i = 0; i < count; i++) {\n const next = (i + 1) % count\n if (inward)\n indices.push(\n bottom + i,\n top + next,\n bottom + next,\n bottom + i,\n top + i,\n top + next,\n )\n else\n indices.push(\n bottom + i,\n bottom + next,\n top + next,\n bottom + i,\n top + next,\n top + i,\n )\n }\n }\n const cap = (\n outer: Point2[],\n outerStart: number,\n upward: boolean,\n inner?: { points: Point2[]; start: number },\n ) => {\n const points = inner ? [...outer, ...inner.points] : outer\n const triangles = earcut(\n points.flatMap(([x, y]) => [x, y]),\n inner ? [outer.length] : [],\n )\n const vertex = (index: number) =>\n index < outer.length\n ? outerStart + index\n : inner!.start + index - outer.length\n for (let i = 0; i < triangles.length; i += 3) {\n const a = triangles[i]!\n const b = triangles[i + 1]!\n const c = triangles[i + 2]!\n const pa = points[a]!\n const pb = points[b]!\n const pc = points[c]!\n const area =\n (pb[0] - pa[0]) * (pc[1] - pa[1]) - (pb[1] - pa[1]) * (pc[0] - pa[0])\n if (area > 0 === upward) indices.push(vertex(a), vertex(b), vertex(c))\n else indices.push(vertex(a), vertex(c), vertex(b))\n }\n }\n\n const bottom = ring(outline, 0)\n let top = bottom\n let topOutline = outline\n for (let layer = 1; layer <= layers; layer++) {\n const angle = twist * (layer / layers)\n topOutline =\n twist === 0\n ? outline\n : outline.map(\n ([x, y]): Point2 => [\n x * Math.cos(angle) - y * Math.sin(angle),\n x * Math.sin(angle) + y * Math.cos(angle),\n ],\n )\n const next = ring(topOutline, props.faceWidth * (layer / layers))\n connect(top, next, outline.length)\n top = next\n }\n const hasHub = props.hubDiameter > 0 && props.hubLength > 0\n const height = props.faceWidth + (hasHub ? props.hubLength : 0)\n const bore =\n props.boreDiameter > 0 ? circle(props.boreDiameter / 2) : undefined\n const boreBottom = bore ? ring(bore, 0) : undefined\n const boreTop = bore ? ring(bore, height) : undefined\n if (bore) connect(boreBottom!, boreTop!, bore.length, true)\n cap(\n outline,\n bottom,\n false,\n bore ? { points: bore, start: boreBottom! } : undefined,\n )\n if (hasHub) {\n const hub = circle(props.hubDiameter / 2)\n const hubBottom = ring(hub, props.faceWidth)\n const hubTop = ring(hub, height)\n cap(topOutline, top, true, { points: hub, start: hubBottom })\n connect(hubBottom, hubTop, hub.length)\n // Both circular loops use identical angular samples. Direct annular\n // triangles avoid collinear bridge triangles in polygon triangulation.\n if (bore) connect(hubTop, boreTop!, hub.length)\n else cap(hub, hubTop, true)\n } else\n cap(\n topOutline,\n top,\n true,\n bore ? { points: bore, start: boreTop! } : undefined,\n )\n return { positions, indices }\n}\n","import { hexBoltModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { HexBolt } from \"./HexBolt\"\n\nexport const model = defineModelRenderer({\n name: \"hexbolt\",\n schema: hexBoltModelDefinitionSchema,\n render: ({ fn, ...props }) => <HexBolt {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { HexBoltModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createHexBoltMesh, type HexBoltMeshOptions } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type HexBoltProps = HexBoltModelPropsInput & { color?: string }\nexport function createHexBoltGeom(\n input: HexBoltModelPropsInput,\n options?: HexBoltMeshOptions,\n) {\n return indexedMeshToGeom3(createHexBoltMesh(input, options))\n}\nexport function HexBolt({ color = \"#737e8f\", ...props }: HexBoltProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createHexBoltGeom(props)} />\n </Colorize>\n )\n}\nexport { createHexBoltMesh } from \"./mesh\"\nexport type {\n HexBoltMesh,\n HexBoltMeshOptions,\n} from \"./mesh\"\n","import {\n hexBoltModelPropsSchema,\n type HexBoltModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\nexport interface HexBoltMeshOptions {\n radialSegments?: number\n threadStepsPerTurn?: number\n}\n\n/** Outward-oriented, welded indexed surface, in millimeters. */\nexport interface HexBoltMesh {\n positions: number[]\n indices: number[]\n}\n\nexport function createHexBoltMesh(\n input: HexBoltModelPropsInput,\n options: HexBoltMeshOptions = {},\n): HexBoltMesh {\n const p = hexBoltModelPropsSchema.parse(input)\n const segments = options.radialSegments ?? 96\n const axial = options.threadStepsPerTurn ?? 24\n if (\n !Number.isInteger(segments) ||\n segments < 24 ||\n segments > 192 ||\n segments % 24 !== 0 ||\n !Number.isInteger(axial) ||\n axial < 24 ||\n axial > 96\n )\n throw new Error(\n \"Screw mesh resolution requires 24..192 radial segments divisible by 24 and 24..96 thread steps\",\n )\n const positions: number[] = [],\n indices: number[] = []\n const welded = new Map<string, number>()\n const vertex = (x: number, y: number, z: number) => {\n const key = [x, y, z].map((v) => Math.round(v * 1e10)).join(\":\")\n const existing = welded.get(key)\n if (existing !== undefined) return existing\n const index = positions.length / 3\n positions.push(x, y, z)\n welded.set(key, index)\n return index\n }\n const triangle = (a: number, b: number, c: number) => {\n if (a === b || b === c || c === a) return\n const point = (i: number) => positions.slice(3 * i, 3 * i + 3)\n const A = point(a),\n B = point(b),\n C = point(c)\n const u = B.map((v, i) => v - A[i]!),\n v = C.map((w, i) => w - A[i]!)\n const area = Math.hypot(\n u[1]! * v[2]! - u[2]! * v[1]!,\n u[2]! * v[0]! - u[0]! * v[2]!,\n u[0]! * v[1]! - u[1]! * v[0]!,\n )\n if (area > 1e-12) indices.push(a, b, c)\n }\n const ring = (\n radiusAt: (theta: number) => number,\n zAt: number | ((theta: number) => number),\n ) =>\n Array.from({ length: segments }, (_, i) => {\n const theta = (i * 2 * Math.PI) / segments,\n r = radiusAt(theta)\n return vertex(\n r * Math.cos(theta),\n r * Math.sin(theta),\n typeof zAt === \"number\" ? zAt : zAt(theta),\n )\n })\n const connect = (a: number[], b: number[]) => {\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n triangle(a[i]!, a[n]!, b[n]!)\n triangle(a[i]!, b[n]!, b[i]!)\n }\n }\n const cap = (a: number[], z: number, up: boolean) => {\n const c = vertex(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n up ? triangle(c, a[i]!, a[n]!) : triangle(c, a[n]!, a[i]!)\n }\n }\n let previous: number[] = []\n const add = (\n radiusAt: (theta: number) => number,\n zAt: number | ((theta: number) => number),\n ) => {\n const r = ring(radiusAt, zAt)\n if (previous.length) connect(previous, r)\n previous = r\n return r\n }\n const major = p.diameter / 2,\n minor = p.threadRootDiameter / 2,\n pitch = p.threadPitch\n const shaftEnd = -p.underHeadRadius\n const steps = p.showThreads\n ? Math.ceil(((shaftEnd + p.length) / pitch) * axial)\n : 1\n if ((steps + 100) * segments > 400000)\n throw new Error(\"Screw exceeds mesh resolution limit\")\n const levels = new Set<number>([\n -p.length,\n -p.length + p.tipChamfer,\n shaftEnd,\n ])\n if (p.showThreads)\n for (let i = 0; i <= steps; i++)\n levels.add(-p.length + ((shaftEnd + p.length) * i) / steps)\n for (const z of [...levels].sort((a, b) => a - b)) {\n const r = add((theta) => {\n // Phase is fixed at +X on the nominal tip plane, before chamfer clipping.\n const phase =\n ((((z + p.length) / pitch -\n ((p.threadHand === \"right\" ? 1 : -1) * theta) / (2 * Math.PI)) %\n 1) +\n 1) %\n 1\n const d = Math.min(phase, 1 - phase)\n const groove = Math.min(\n major - minor,\n Math.max(0, (d - 1 / 16) * pitch * Math.sqrt(3)),\n )\n const thread = p.showThreads ? major - groove : major\n return Math.min(\n thread,\n major - Math.max(0, p.tipChamfer - (z + p.length)),\n )\n }, z)\n if (z === -p.length) cap(r, z, false)\n }\n // Tangent circular under-head blend; its start also trims incomplete crests.\n add(() => major, shaftEnd)\n const filletCenterR = major + p.underHeadRadius\n const filletCenterZ = shaftEnd\n for (let i = 1; i <= 16; i++) {\n const angle = Math.PI - ((Math.PI - Math.PI / 2) * i) / 16\n add(\n () => filletCenterR + p.underHeadRadius * Math.cos(angle),\n filletCenterZ + p.underHeadRadius * Math.sin(angle),\n )\n }\n\n const hexRadius = (theta: number) =>\n p.headAcrossFlats /\n 2 /\n Math.max(\n Math.abs(Math.sin(theta)),\n Math.abs(Math.sin(theta + (2 * Math.PI) / 3)),\n Math.abs(Math.sin(theta + (4 * Math.PI) / 3)),\n )\n add(hexRadius, 0)\n const slope = Math.tan((p.headChamferAngle * Math.PI) / 180)\n const start =\n p.headHeight - ((p.headCornerDiameter - p.headChamferDiameter) / 2) * slope\n add(hexRadius, start)\n for (let i = 1; i <= 12; i++) {\n const z = start + ((p.headHeight - start) * i) / 12\n add(\n (theta) =>\n Math.min(\n hexRadius(theta),\n p.headChamferDiameter / 2 + (p.headHeight - z) / slope,\n ),\n z,\n )\n }\n cap(previous, p.headHeight, true)\n\n return { positions, indices }\n}\n","import { hexNutModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { HexNut } from \"./HexNut\"\n\nexport const model = defineModelRenderer({\n name: \"hexnut\",\n schema: hexNutModelDefinitionSchema,\n render: ({ fn, ...props }) => <HexNut {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { HexNutModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createHexNutMesh, type HexNutMeshOptions } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type HexNutProps = HexNutModelPropsInput & { color?: string }\nexport function createHexNutGeom(\n input: HexNutModelPropsInput,\n resolution?: HexNutMeshOptions,\n) {\n return indexedMeshToGeom3(createHexNutMesh(input, resolution))\n}\nexport function HexNut({ color = \"#737e8f\", ...props }: HexNutProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createHexNutGeom(props)} />\n </Colorize>\n )\n}\nexport { createHexNutMesh } from \"./mesh\"\nexport type { HexNutMesh, HexNutMeshOptions } from \"./mesh\"\n","import {\n hexNutModelPropsSchema,\n getHexNutDimensions,\n type HexNutModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\n/** Indexed counterclockwise triangles in millimeters. */\nexport interface HexNutMesh {\n positions: number[]\n indices: number[]\n}\n/** Renderer resolution affects tessellation only, never model specifications. */\nexport interface HexNutMeshOptions {\n radialSegments?: number\n segmentsPerPitch?: number\n}\nfunction resolution(options: HexNutMeshOptions) {\n const radial = options.radialSegments ?? 96\n const axial = options.segmentsPerPitch ?? 32\n if (\n !Number.isInteger(radial) ||\n radial < 24 ||\n radial > 192 ||\n radial % 12 !== 0 ||\n !Number.isInteger(axial) ||\n axial < 8 ||\n axial > 64\n )\n throw new Error(\n \"Mesh resolution limit: radial segments must be a multiple of 12 in [24,192], pitch segments an integer in [8,64]\",\n )\n return { radial, axial }\n}\nfunction surface(segments: number) {\n const positions: number[] = [],\n indices: number[] = []\n const ring = (z: number, radius: (angle: number) => number) => {\n const start = positions.length / 3\n for (let i = 0; i < segments; i++) {\n const angle = (i * 2 * Math.PI) / segments\n const r = radius(angle)\n positions.push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n return start\n }\n const connect = (a: number, b: number) => {\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n indices.push(a + i, a + n, b + n, a + i, b + n, b + i)\n }\n }\n const cap = (start: number, z: number, up: boolean) => {\n const center = positions.length / 3\n positions.push(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n indices.push(center, start + (up ? i : n), start + (up ? n : i))\n }\n }\n return { positions, indices, ring, connect, cap }\n}\nfunction hexRadius(angle: number, acrossFlats: number) {\n const period = Math.PI / 3\n const distance =\n ((((angle - Math.PI / 2 + period / 2) % period) + period) % period) -\n period / 2\n return acrossFlats / 2 / Math.cos(distance)\n}\nfunction threadDistance(z: number, angle: number, pitch: number, hand = 1) {\n const phase = (((z / pitch - (hand * angle) / (2 * Math.PI)) % 1) + 1) % 1\n return Math.min(phase, 1 - phase)\n}\n/** Closed annular surface with a through internal thread and both conical mouths. */\nexport function createHexNutMesh(\n input: HexNutModelPropsInput,\n options: HexNutMeshOptions = {},\n): HexNutMesh {\n const props = hexNutModelPropsSchema.parse(input)\n const d = getHexNutDimensions(input)\n const { radial, axial } = resolution(options)\n const steps = Math.max(2, Math.ceil((d.height / d.threadPitch) * axial))\n if (steps > 24000 || !Number.isFinite(steps))\n throw new Error(\"Mesh resolution limit: too many thread turns\")\n const m = surface(radial)\n const outer = (z: number, angle: number) =>\n Math.min(\n hexRadius(angle, d.acrossFlats),\n d.faceDiameter / 2 + Math.min(z, d.height - z) * Math.sqrt(3),\n )\n // Include every sampled cone/hex intersection: linear Z interpolation then\n // preserves each radial ray's exact cone slope and flat-body transition.\n const outerLevels = [\n 0,\n d.outerChamferDepth,\n d.height - d.outerChamferDepth,\n d.height,\n ]\n for (let index = 0; index < radial; index++) {\n const angle = (index * 2 * Math.PI) / radial\n const height =\n (hexRadius(angle, d.acrossFlats) - d.faceDiameter / 2) / Math.sqrt(3)\n if (height > 1e-9 && height < d.outerChamferDepth - 1e-9)\n outerLevels.push(height, d.height - height)\n }\n const outerZ = outerLevels\n .sort((a, b) => a - b)\n .filter((z, index, sorted) => index === 0 || z - sorted[index - 1]! > 1e-10)\n const first = m.ring(0, (angle) => outer(0, angle))\n let previous = first\n for (const z of outerZ.slice(1)) {\n const current = m.ring(z, (angle) => outer(z, angle))\n m.connect(previous, current)\n previous = current\n }\n const levels = new Set(\n props.showThreads\n ? Array.from({ length: steps + 1 }, (_, i) =>\n i === steps ? d.height : (d.height * i) / steps,\n )\n : [0, d.height],\n )\n levels.add(d.boreChamferDepth)\n levels.add(d.height - d.boreChamferDepth)\n const minor = d.boreMinorDiameter / 2\n const depth = (d.diameter - d.boreMinorDiameter) / 2\n for (const z of [...levels].sort((a, b) => b - a)) {\n const current = m.ring(z, (angle) => {\n const groove = Math.min(\n depth,\n Math.max(\n 0,\n (threadDistance(z, angle, d.threadPitch) - 1 / 8) *\n d.threadPitch *\n Math.sqrt(3),\n ),\n )\n const threaded = minor + (props.showThreads ? groove : 0)\n return Math.max(threaded, d.mouthDiameter / 2 - Math.min(z, d.height - z))\n })\n m.connect(previous, current)\n previous = current\n }\n m.connect(previous, first)\n return { positions: m.positions, indices: m.indices }\n}\n","import { hexSocketBoltModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { HexSocketBolt } from \"../../HexSocketBolt\"\n\nexport const model = defineModelRenderer({\n name: \"hexsocketbolt\",\n schema: hexSocketBoltModelDefinitionSchema,\n render: ({ fn, ...props }) => <HexSocketBolt {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import { componentMaterials } from \"./materials\"\nimport type { HexSocketBoltModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createHexSocketBoltMesh } from \"./mechanical/hex-socket-bolt-mesh\"\nimport { indexedMeshToGeom3 } from \"./mechanical/indexedMeshToGeom3\"\n\nexport type HexSocketBoltProps = HexSocketBoltModelPropsInput & {\n color?: string\n}\n\n/** Bearing plane Z=0, tip along -Z, head along +Z. Threads are approximate. */\nexport function createHexSocketBoltGeom(input: HexSocketBoltModelPropsInput) {\n return indexedMeshToGeom3(createHexSocketBoltMesh(input))\n}\n\nexport function HexSocketBolt({\n color = \"#737e8f\",\n ...props\n}: HexSocketBoltProps) {\n return (\n <Colorize color={color} material={componentMaterials.steel}>\n <Custom geometry={createHexSocketBoltGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createHexSocketBoltMesh } from \"./mechanical/hex-socket-bolt-mesh\"\nexport type { HexSocketBoltMesh } from \"./mechanical/hex-socket-bolt-mesh\"\n","import {\n hexSocketBoltDimensions,\n hexSocketBoltModelPropsSchema,\n type HexSocketBoltModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\n/** Indexed triangles, counterclockwise from outside; millimeters, Z up. */\nexport interface HexSocketBoltMesh {\n positions: number[]\n indices: number[]\n}\n\n/**\n * Head bearing plane at Z=0; tip at -length; head extends along +Z.\n * Produces a closed surface with a blind hex socket and a right-hand,\n * truncated 60-degree helical thread. Threads are a visual approximation.\n * No renderer dependencies are needed to consume the indexed mesh.\n */\nexport const createHexSocketBoltMesh = (\n input: HexSocketBoltModelPropsInput,\n): HexSocketBoltMesh => {\n const props = hexSocketBoltModelPropsSchema.parse(input)\n const {\n diameter,\n threadPitch: pitch,\n headDiameter,\n headHeight,\n socketWidth,\n socketDepth,\n } = hexSocketBoltDimensions[props.metricSize]\n const { length, showThreads } = props\n const segments = 96 // Divisible by six, so socket corners are exact.\n const steps = showThreads ? Math.max(2, Math.ceil((length / pitch) * 24)) : 2\n // Avoid unbounded allocations for user-supplied lengths.\n if (steps > 24000)\n throw new Error(\n \"Bolt length exceeds mesh resolution limit (1000 thread turns)\",\n )\n const positions: number[] = []\n const indices: number[] = []\n const radius = diameter / 2\n const depth = pitch * 0.61343\n const bevel = Math.min(0.2, headHeight * 0.08)\n const tipBevel = Math.min(pitch * 0.6, length / 3)\n\n const ring = (z: number, radiusAt: (angle: number) => number) => {\n const start = positions.length / 3\n for (let i = 0; i < segments; i++) {\n const angle = (i * Math.PI * 2) / segments\n const r = radiusAt(angle)\n positions.push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n return start\n }\n // Following the surface from tip to socket floor also sets the winding for\n // the shoulder, top annulus and inward-facing socket walls correctly.\n const connect = (a: number, b: number) => {\n for (let i = 0; i < segments; i++) {\n const next = (i + 1) % segments\n indices.push(a + i, a + next, b + next, a + i, b + next, b + i)\n }\n }\n const cap = (start: number, z: number, upward: boolean) => {\n const center = positions.length / 3\n positions.push(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const a = start + i\n const b = start + ((i + 1) % segments)\n indices.push(center, upward ? a : b, upward ? b : a)\n }\n }\n let previous = -1\n // A smooth shank needs only its tip, bevel end and bearing plane. Sampling\n // it at thread pitch adds thousands of coplanar faces and makes STEP export\n // quadratic without improving the shape.\n const shaftLevels = showThreads\n ? Array.from(\n { length: steps + 1 },\n (_, step) => -length + (length * step) / steps,\n )\n : [-length, -length + tipBevel, 0]\n for (const z of shaftLevels) {\n const current = ring(z, (angle) => {\n // Constant phase winds counterclockwise as Z increases (right-hand).\n const phase = (((z / pitch - angle / (2 * Math.PI)) % 1) + 1) % 1\n const distance = Math.min(phase, 1 - phase)\n const groove = Math.min(\n depth,\n Math.max(0, (distance - 1 / 16) * pitch * Math.sqrt(3)),\n )\n const endRamp = Math.min(\n 1,\n (z + length) / tipBevel,\n -z / Math.min(pitch / 2, length / 3),\n )\n const tipCut = tipBevel * Math.max(0, 1 - (z + length) / tipBevel)\n return radius - (showThreads ? groove * endRamp : 0) - tipCut\n })\n if (previous < 0) cap(current, z, false)\n else connect(previous, current)\n previous = current\n }\n const addRing = (z: number, radiusAt: (angle: number) => number) => {\n const current = ring(z, radiusAt)\n connect(previous, current)\n previous = current\n }\n addRing(0, () => headDiameter / 2 - bevel)\n addRing(bevel, () => headDiameter / 2)\n addRing(headHeight - bevel, () => headDiameter / 2)\n addRing(headHeight, () => headDiameter / 2 - bevel)\n const hexRadius = (angle: number, acrossFlats: number) =>\n acrossFlats /\n 2 /\n Math.cos(((angle + Math.PI / 6) % (Math.PI / 3)) - Math.PI / 6)\n addRing(headHeight, (angle) => hexRadius(angle, socketWidth + bevel))\n addRing(headHeight - bevel / 2, (angle) => hexRadius(angle, socketWidth))\n addRing(headHeight - socketDepth, (angle) => hexRadius(angle, socketWidth))\n cap(previous, headHeight - socketDepth, true)\n return { positions, indices }\n}\n","import { hollowPositioningArmTubeModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { HollowPositioningArmTube } from \"./HollowPositioningArmTube\"\n\nexport const model = defineModelRenderer({\n name: \"hollowpositioningarmtube\",\n schema: hollowPositioningArmTubeModelDefinitionSchema,\n render: ({ fn, ...props }) => <HollowPositioningArmTube {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { HollowPositioningArmTubeModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createHollowPositioningArmTubeMesh } from \"./mesh\"\n\nexport type HollowPositioningArmTubeProps =\n HollowPositioningArmTubeModelPropsInput & { color?: string }\n\nexport function createHollowPositioningArmTubeGeom(\n input: HollowPositioningArmTubeModelPropsInput,\n) {\n return indexedMeshToGeom3(createHollowPositioningArmTubeMesh(input))\n}\n\nexport function HollowPositioningArmTube({\n color = \"#343943\",\n ...props\n}: HollowPositioningArmTubeProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createHollowPositioningArmTubeGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createHollowPositioningArmTubeMesh } from \"./mesh\"\nexport type {\n HollowPositioningArmTubeMesh,\n HollowPositioningArmTubeMeshOptions,\n} from \"./mesh\"\n","import {\n getHollowPositioningArmTubeDimensions,\n getHollowPositioningArmTubeFrame,\n hollowPositioningArmTubeModelPropsSchema,\n type HollowPositioningArmTubeModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\nexport interface HollowPositioningArmTubeMesh {\n positions: number[]\n indices: number[]\n}\n\nexport interface HollowPositioningArmTubeMeshOptions {\n radialSegments?: number\n segmentsPerRib?: number\n}\n\n/** One closed annular sweep with open ends and a smooth, continuous wire bore. */\nexport function createHollowPositioningArmTubeMesh(\n input: HollowPositioningArmTubeModelPropsInput,\n options: HollowPositioningArmTubeMeshOptions = {},\n): HollowPositioningArmTubeMesh {\n const props = hollowPositioningArmTubeModelPropsSchema.parse(input)\n const dimensions = getHollowPositioningArmTubeDimensions(props)\n const radialSegments = options.radialSegments ?? 24\n const segmentsPerRib = options.segmentsPerRib ?? 4\n for (const [name, value, minimum, maximum] of [\n [\"radialSegments\", radialSegments, 12, 128],\n [\"segmentsPerRib\", segmentsPerRib, 4, 32],\n ] as const)\n if (\n !Number.isInteger(value) ||\n value < minimum ||\n value > maximum ||\n value % 4 !== 0\n )\n throw new Error(\n `${name} must be a multiple of four in [${minimum},${maximum}]`,\n )\n\n const { totalLength, bendLength, minimumWallThickness } = dimensions\n const innerRadius = props.innerDiameter / 2\n const scale = Math.max(totalLength, props.outerDiameter)\n const tolerance = scale * 1e-10\n if (Math.min(innerRadius, minimumWallThickness, totalLength) <= tolerance)\n throw new Error(\n \"Hollow positioning arm tube wall, bore or length exceeds mesh resolution limit\",\n )\n\n // Limit centerline chord error relative to the bore and wall as well as angle.\n const sagitta = Math.min(innerRadius, minimumWallThickness) * 0.02\n const angleStep = Math.min(\n Math.PI / 36,\n 2 * Math.acos(1 - Math.min(sagitta / props.bendRadius, 1)),\n )\n const bendSteps =\n props.bendAngle === 0\n ? 0\n : Math.ceil((props.bendAngle * Math.PI) / 180 / angleStep)\n const ribSteps =\n props.ribDepth === 0\n ? 0\n : Math.ceil((totalLength / props.ribPitch) * segmentsPerRib)\n const maximumRings = Math.floor(250000 / (2 * radialSegments))\n if (\n !Number.isSafeInteger(bendSteps + ribSteps) ||\n bendSteps + ribSteps + 5 > maximumRings\n )\n throw new Error(\n \"Hollow positioning arm tube exceeds mesh resolution limit (250000 vertices)\",\n )\n\n const samples = [\n 0,\n props.startLength,\n props.startLength + bendLength,\n totalLength,\n ]\n for (let i = 1; i < bendSteps; i++)\n samples.push(props.startLength + (bendLength * i) / bendSteps)\n for (let i = 1; i < ribSteps; i++)\n samples.push((i * props.ribPitch) / segmentsPerRib)\n samples.sort((a, b) => a - b)\n // Coincident rib and bend boundaries share one ring, preventing sliver faces.\n const stations = samples.filter(\n (s, i) => i === 0 || s - samples[i - 1]! > tolerance,\n )\n if (totalLength - stations[stations.length - 1]! <= tolerance)\n stations[stations.length - 1] = totalLength\n\n const positions: number[] = []\n const indices: number[] = []\n const stride = radialSegments * 2\n for (const s of stations) {\n const { position, normal } = getHollowPositioningArmTubeFrame(props, s)\n const outerRadius =\n props.outerDiameter / 2 -\n (props.ribDepth === 0\n ? 0\n : (props.ribDepth / 2) *\n (1 + Math.cos(2 * Math.PI * ((s / props.ribPitch) % 1))))\n for (const radius of [outerRadius, innerRadius])\n for (let j = 0; j < radialSegments; j++) {\n const angle = (j * 2 * Math.PI) / radialSegments\n const cosine =\n j === radialSegments / 4 || j === (3 * radialSegments) / 4\n ? 0\n : Math.cos(angle)\n const sine = j === 0 || j === radialSegments / 2 ? 0 : Math.sin(angle)\n positions.push(\n position[0] + radius * cosine * normal[0],\n radius * sine,\n position[2] + radius * cosine * normal[2],\n )\n }\n }\n const quad = (a: number, b: number, c: number, d: number) => {\n indices.push(a, b, c, a, c, d)\n }\n for (let ring = 0; ring + 1 < stations.length; ring++)\n for (let j = 0; j < radialSegments; j++) {\n const next = (j + 1) % radialSegments\n const a = ring * stride\n const b = (ring + 1) * stride\n quad(a + j, a + next, b + next, b + j)\n quad(\n a + radialSegments + j,\n b + radialSegments + j,\n b + radialSegments + next,\n a + radialSegments + next,\n )\n }\n for (let j = 0; j < radialSegments; j++) {\n const next = (j + 1) % radialSegments\n quad(j, radialSegments + j, radialSegments + next, next)\n const end = (stations.length - 1) * stride\n quad(\n end + j,\n end + next,\n end + radialSegments + next,\n end + radialSegments + j,\n )\n }\n return { positions, indices }\n}\n","import { nemaMotorModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { NemaMotor } from \"../../NemaMotor\"\n\nexport const model = defineModelRenderer({\n name: \"nema\",\n schema: nemaMotorModelDefinitionSchema,\n render: ({ fn, ...props }) => <NemaMotor {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import { componentMaterials } from \"./materials\"\nimport jscad from \"@jscad/modeling\"\nimport type { generalize as Generalize } from \"@jscad/modeling/src/operations/modifiers/generalize\"\nimport { createNemaMotorWireGeometry } from \"./utils/nemaMotorWireGeometry\"\nimport { createNemaMotorSections } from \"./utils/nemaMotorGeometry\"\nimport {\n resolveNemaMotorProps,\n type NemaMotorModelPropsInput,\n} from \"./utils/nemaMotorParameters\"\nimport { createHexSocketBoltGeom } from \"./HexSocketBolt\"\nimport { Colorize, Custom } from \"jscad-fiber\"\n\n// JSCAD exposes generalize as a function at runtime, but its namespace\n// declaration exports a module. Keep the correction at this API boundary.\nconst generalize = jscad.modifiers.generalize as unknown as typeof Generalize\n\nexport type NemaMotorProps = NemaMotorModelPropsInput & {\n bodyColor?: string\n capColor?: string\n shaftColor?: string\n screwColor?: string\n}\nexport type NemaFrameMotorProps = Omit<NemaMotorProps, \"nemaSize\">\n\n/** Mounting face at Z=0, body along -Z, shaft along +Z; all lengths in mm.\n * Parameters follow the modelprinter NEMA contract; JSCAD builds all geometry.\n */\nexport function NemaMotor({\n bodyColor = \"#242830\",\n capColor = \"#aeb5bd\",\n shaftColor = \"#b8bec6\",\n screwColor = \"#626b78\",\n ...props\n}: NemaMotorProps) {\n const p = resolveNemaMotorProps(props)\n const screw =\n p.backFace === \"screws\"\n ? jscad.transforms.rotateX(\n Math.PI,\n createHexSocketBoltGeom({\n metricSize: p.backFaceScrewSize,\n length: p.backFaceHoleDepth,\n showThreads: false,\n }),\n )\n : undefined\n const halfPitch = p.backFaceHoleSpacing / 2\n return (\n <>\n {createNemaMotorSections(p).map((section, index) => {\n const outline = jscad.geometries.geom2.fromPoints(section.outline)\n const profile = section.holes.length\n ? jscad.booleans.subtract(\n outline,\n ...section.holes.map((h) => jscad.geometries.geom2.fromPoints(h)),\n )\n : outline\n const geometry = jscad.transforms.translate(\n [0, 0, section.zMin],\n jscad.extrusions.extrudeLinear(\n { height: section.zMax - section.zMin },\n profile,\n ),\n )\n return (\n <Colorize\n key={`${section.name}-${index}`}\n material={\n section.name === \"body\"\n ? componentMaterials.moldedPlastic\n : section.name === \"shaft\"\n ? componentMaterials.steel\n : componentMaterials.brushedMetal\n }\n color={\n section.name === \"body\"\n ? bodyColor\n : section.name === \"shaft\"\n ? shaftColor\n : capColor\n }\n >\n <Custom geometry={generalize({ simplify: true }, geometry)} />\n </Colorize>\n )\n })}\n {createNemaMotorWireGeometry(p).map(({ geometry, color }, index) => (\n <Colorize\n material={componentMaterials.rubber}\n key={`wire-${index}`}\n color={color}\n >\n <Custom geometry={generalize({ simplify: true }, geometry)} />\n </Colorize>\n ))}\n {screw &&\n [-halfPitch, halfPitch].flatMap((x) =>\n [-halfPitch, halfPitch].map((y) => (\n <Colorize\n material={componentMaterials.steel}\n key={`rear-screw-${x}-${y}`}\n color={screwColor}\n >\n {/* HexSocketBolt's +Z head is rotated to face -Z; its bearing plane\n is then placed on the motor's rear face, in the same mm frame. */}\n <Custom\n geometry={jscad.transforms.translate(\n [x, y, -p.bodyLength],\n generalize({ simplify: true }, screw),\n )}\n />\n </Colorize>\n )),\n )}\n </>\n )\n}\nexport const NEMA8 = (props: NemaFrameMotorProps) => (\n <NemaMotor {...props} nemaSize={8} />\n)\nexport const NEMA17 = (props: NemaFrameMotorProps) => (\n <NemaMotor {...props} nemaSize={17} />\n)\nexport const NEMA23 = (props: NemaFrameMotorProps) => (\n <NemaMotor {...props} nemaSize={23} />\n)\n","import jscad from \"@jscad/modeling\"\nimport {\n getJstMotorConnector,\n getNemaMotorReferencePoints,\n} from \"@tscircuit/modelprinter\"\nimport {\n resolveNemaMotorProps,\n type NemaMotorModelPropsInput,\n} from \"./nemaMotorParameters\"\n\n/** Visible wire termination in motor-local mm: +Z shaft, origin at front face.\n * Placement comes from the same spec reference used by assembly rotation.\n * Header dimensions, pin count and pitch come from modelprinter's shared\n * JST PH/SH profile; shell and contacts are illustrative.\n */\nexport function createNemaMotorWireGeometry(input: NemaMotorModelPropsInput) {\n const p = resolveNemaMotorProps(input)\n if (p.wireConnection === \"none\") return []\n const { position } = getNemaMotorReferencePoints(p).wireside\n const angle = (p.wireSideAngle * Math.PI) / 180\n // Only transform the direction/profile about +Z; the reference point already\n // includes its rotation. A point gets translation, a direction does not.\n const place = (geometry: jscad.geometries.geom3.Geom3) =>\n jscad.transforms.translate(\n [position.x, position.y, position.z],\n jscad.transforms.rotateZ(angle, geometry),\n )\n if (p.wireConnection === \"stubs\") {\n const colors = [\n \"#d53f3f\",\n \"#2463af\",\n \"#3b934b\",\n \"#252830\",\n \"#e5d049\",\n \"#eeeeee\",\n \"#ce7432\",\n \"#803e91\",\n ]\n return Array.from({ length: p.wireCount }, (_, i) => ({\n color: colors[i]!,\n geometry: place(\n jscad.transforms.translate(\n [\n (p.wireLength - 0.15) / 2,\n (i - (p.wireCount - 1) / 2) * p.wireDiameter * 1.5,\n 0,\n ],\n jscad.transforms.rotateY(\n Math.PI / 2,\n jscad.primitives.cylinder({\n height: p.wireLength + 0.15,\n radius: p.wireDiameter / 2,\n segments: 24,\n }),\n ),\n ),\n ),\n }))\n }\n const connector = getJstMotorConnector(p.wireConnection)!\n const { pinCount, pitch, bodyWidth, bodyHeight, matingDepth } = connector\n const wall = pitch === 2 ? 0.6 : 0.3\n const contactLength = pitch === 2 ? 3.4 : 2.4\n const contactSize = pitch === 2 ? 0.5 : 0.3\n const shell = jscad.booleans.subtract(\n jscad.primitives.cuboid({\n size: [matingDepth + 0.1, bodyWidth, bodyHeight],\n center: [(matingDepth - 0.1) / 2, 0, 0],\n }),\n jscad.primitives.cuboid({\n size: [matingDepth - 0.5, bodyWidth - 2 * wall, bodyHeight - 2 * wall],\n center: [matingDepth / 2 + 0.55, 0, 0],\n }),\n )\n return [\n { color: \"#eeeeea\", geometry: place(shell) },\n ...Array.from({ length: pinCount }, (_, i) => ({\n color: \"#b8bec6\",\n geometry: place(\n jscad.primitives.cuboid({\n size: [contactLength, contactSize, contactSize],\n center: [contactLength / 2, (i - (pinCount - 1) / 2) * pitch, 0],\n }),\n ),\n })),\n ]\n}\n","import { mp, nemaMotorModelPropsSchema } from \"@tscircuit/modelprinter\"\nexport type {\n NemaMotorModelProps,\n NemaMotorModelPropsInput,\n NemaSize,\n} from \"@tscircuit/modelprinter\"\n\nexport const resolveNemaMotorProps = nemaMotorModelPropsSchema.parse.bind(\n nemaMotorModelPropsSchema,\n)\n\nexport function parseNemaMotorString(source: string) {\n const definition = mp.string(source).json()\n if (definition.fn !== \"nema\")\n throw new Error(\"Expected nema8, nema17 or nema23\")\n const { fn, ...props } = definition\n return props\n}\n","import {\n resolveNemaMotorProps,\n type NemaMotorModelPropsInput,\n} from \"./nemaMotorParameters\"\n\nexport type NemaMotorPoint = [number, number]\nexport interface NemaMotorSection {\n name: \"body\" | \"frontCap\" | \"rearCap\" | \"pilot\" | \"shaft\"\n outline: NemaMotorPoint[]\n holes: NemaMotorPoint[][]\n zMin: number\n zMax: number\n}\nconst circle = (radius: number, x = 0, y = 0): NemaMotorPoint[] =>\n Array.from({ length: 96 }, (_, i) => [\n x + radius * Math.cos((i * Math.PI) / 48),\n y + radius * Math.sin((i * Math.PI) / 48),\n ])\nconst face = (width: number, chamfer: number): NemaMotorPoint[] => {\n const h = width / 2,\n c = chamfer\n if (c === 0)\n return [\n [-h, -h],\n [h, -h],\n [h, h],\n [-h, h],\n ]\n return [\n [-h + c, -h],\n [h - c, -h],\n [h, -h + c],\n [h, h - c],\n [h - c, h],\n [-h + c, h],\n [-h, h - c],\n [-h, -h + c],\n ]\n}\n\n/** Renderer-independent closed extrusions in mm. The shaft axis is +Z,\n * mounting face at Z=0, body at -bodyLength. Cap/core profiles are illustrative.\n * Blind holes have actual floors; front through holes clear the core.\n * Rear cap bores and screws are configured separately.\n * Threads and manufacturing tolerances are not represented. Wire geometry is added separately.\n */\nexport function createNemaMotorSections(\n input: NemaMotorModelPropsInput,\n): NemaMotorSection[] {\n const p = resolveNemaMotorProps(input)\n const sections: NemaMotorSection[] = []\n const add = (\n name: NemaMotorSection[\"name\"],\n outline: NemaMotorPoint[],\n zMin: number,\n zMax: number,\n holes: NemaMotorPoint[][] = [],\n ) => {\n if (zMax > zMin) sections.push({ name, outline, holes, zMin, zMax })\n }\n const front = face(p.bodyWidth, p.faceCornerChamfer)\n const core = face(p.bodyWidth, p.bodyCornerChamfer)\n const h = p.mountingHoleSpacing / 2\n const centers: NemaMotorPoint[] = [\n [-h, -h],\n [h, -h],\n [h, h],\n [-h, h],\n ]\n const holes = centers.map(([x, y]) =>\n circle(p.mountingHoleDiameter / 2, x, y),\n )\n const holeDepth = p.mountingHoleThrough\n ? p.frontCapLength\n : p.mountingHoleDepth\n add(\"frontCap\", front, -holeDepth, 0, holes)\n add(\"frontCap\", front, -p.frontCapLength, -holeDepth)\n add(\"body\", core, -p.bodyLength + p.rearCapLength, -p.frontCapLength)\n if (p.backFace === \"plain\") {\n add(\n \"rearCap\",\n p.mountingHoleThrough ? core : front,\n -p.bodyLength,\n -p.bodyLength + p.rearCapLength,\n )\n } else {\n const halfPitch = p.backFaceHoleSpacing / 2\n const rearHoles = [-halfPitch, halfPitch].flatMap((x) =>\n [-halfPitch, halfPitch].map((y) =>\n circle(p.backFaceHoleDiameter / 2, x, y),\n ),\n )\n // Rear-facing blind bores open at -bodyLength, with a solid floor inside\n // the cap. The full cap outline supports NEMA23's rear corner fasteners.\n add(\n \"rearCap\",\n front,\n -p.bodyLength,\n -p.bodyLength + p.backFaceHoleDepth,\n rearHoles,\n )\n add(\n \"rearCap\",\n front,\n -p.bodyLength + p.backFaceHoleDepth,\n -p.bodyLength + p.rearCapLength,\n )\n }\n add(\"pilot\", circle(p.pilotDiameter / 2), 0, p.pilotLength)\n const r = p.shaftDiameter / 2\n const round = circle(r)\n if (p.shaftShape === \"round\")\n add(\"shaft\", round, p.pilotLength, p.shaftLength)\n else {\n const cut = r - p.shaftFlatDepth\n const angle = Math.acos(cut / r)\n // Exact chord ends and a circular arc: no clamping duplicate vertices.\n const profile: NemaMotorPoint[] = Array.from({ length: 97 }, (_, i) => {\n const a = angle + ((2 * Math.PI - 2 * angle) * i) / 96\n return [r * Math.cos(a), r * Math.sin(a)]\n })\n const rotation = (p.shaftFlatAngle * Math.PI) / 180\n const d: NemaMotorPoint[] = profile.map(([x, y]) => [\n x * Math.cos(rotation) - y * Math.sin(rotation),\n x * Math.sin(rotation) + y * Math.cos(rotation),\n ])\n add(\"shaft\", round, p.pilotLength, p.shaftLength - p.shaftFlatLength)\n add(\"shaft\", d, p.shaftLength - p.shaftFlatLength, p.shaftLength)\n }\n return sections\n}\n","import { panScrewModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { PanScrew } from \"./PanScrew\"\n\nexport const model = defineModelRenderer({\n name: \"panscrew\",\n schema: panScrewModelDefinitionSchema,\n render: ({ fn, ...props }) => <PanScrew {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { PanScrewModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createPanScrewMesh, type PanScrewMeshOptions } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type PanScrewProps = PanScrewModelPropsInput & { color?: string }\nexport function createPanScrewGeom(\n input: PanScrewModelPropsInput,\n options?: PanScrewMeshOptions,\n) {\n return indexedMeshToGeom3(createPanScrewMesh(input, options))\n}\nexport function PanScrew({ color = \"#737e8f\", ...props }: PanScrewProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createPanScrewGeom(props)} />\n </Colorize>\n )\n}\nexport { createPanScrewMesh } from \"./mesh\"\nexport type {\n PanScrewMesh,\n PanScrewMeshOptions,\n} from \"./mesh\"\n","import {\n panScrewModelPropsSchema,\n type PanScrewModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\nexport interface PanScrewMeshOptions {\n radialSegments?: number\n threadStepsPerTurn?: number\n}\n\n/** Outward-oriented, welded indexed surface, in millimeters. */\nexport interface PanScrewMesh {\n positions: number[]\n indices: number[]\n}\n\nexport function createPanScrewMesh(\n input: PanScrewModelPropsInput,\n options: PanScrewMeshOptions = {},\n): PanScrewMesh {\n const p = panScrewModelPropsSchema.parse(input)\n const segments = options.radialSegments ?? 96\n const axial = options.threadStepsPerTurn ?? 24\n if (\n !Number.isInteger(segments) ||\n segments < 24 ||\n segments > 192 ||\n segments % 24 !== 0 ||\n !Number.isInteger(axial) ||\n axial < 24 ||\n axial > 96\n )\n throw new Error(\n \"Screw mesh resolution requires 24..192 radial segments divisible by 24 and 24..96 thread steps\",\n )\n const positions: number[] = [],\n indices: number[] = []\n const welded = new Map<string, number>()\n const vertex = (x: number, y: number, z: number) => {\n const key = [x, y, z].map((v) => Math.round(v * 1e10)).join(\":\")\n const existing = welded.get(key)\n if (existing !== undefined) return existing\n const index = positions.length / 3\n positions.push(x, y, z)\n welded.set(key, index)\n return index\n }\n const triangle = (a: number, b: number, c: number) => {\n if (a === b || b === c || c === a) return\n const point = (i: number) => positions.slice(3 * i, 3 * i + 3)\n const A = point(a),\n B = point(b),\n C = point(c)\n const u = B.map((v, i) => v - A[i]!),\n v = C.map((w, i) => w - A[i]!)\n const area = Math.hypot(\n u[1]! * v[2]! - u[2]! * v[1]!,\n u[2]! * v[0]! - u[0]! * v[2]!,\n u[0]! * v[1]! - u[1]! * v[0]!,\n )\n if (area > 1e-12) indices.push(a, b, c)\n }\n const ring = (\n radiusAt: (theta: number) => number,\n zAt: number | ((theta: number) => number),\n ) =>\n Array.from({ length: segments }, (_, i) => {\n const theta = (i * 2 * Math.PI) / segments,\n r = radiusAt(theta)\n return vertex(\n r * Math.cos(theta),\n r * Math.sin(theta),\n typeof zAt === \"number\" ? zAt : zAt(theta),\n )\n })\n const connect = (a: number[], b: number[]) => {\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n triangle(a[i]!, a[n]!, b[n]!)\n triangle(a[i]!, b[n]!, b[i]!)\n }\n }\n const cap = (a: number[], z: number, up: boolean) => {\n const c = vertex(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n up ? triangle(c, a[i]!, a[n]!) : triangle(c, a[n]!, a[i]!)\n }\n }\n let previous: number[] = []\n const add = (\n radiusAt: (theta: number) => number,\n zAt: number | ((theta: number) => number),\n ) => {\n const r = ring(radiusAt, zAt)\n if (previous.length) connect(previous, r)\n previous = r\n return r\n }\n const major = p.diameter / 2,\n minor = p.threadRootDiameter / 2,\n pitch = p.threadPitch\n const shaftEnd = -p.underHeadRadius\n const steps = p.showThreads\n ? Math.ceil(((shaftEnd + p.length) / pitch) * axial)\n : 1\n if ((steps + 160) * segments > 400000)\n throw new Error(\"Screw exceeds mesh resolution limit\")\n const levels = new Set<number>([\n -p.length,\n -p.length + p.tipChamfer,\n shaftEnd,\n ])\n if (p.showThreads)\n for (let i = 0; i <= steps; i++)\n levels.add(-p.length + ((shaftEnd + p.length) * i) / steps)\n for (const z of [...levels].sort((a, b) => a - b)) {\n const r = add((theta) => {\n // Phase is fixed at +X on the nominal tip plane, before chamfer clipping.\n const phase =\n ((((z + p.length) / pitch -\n ((p.threadHand === \"right\" ? 1 : -1) * theta) / (2 * Math.PI)) %\n 1) +\n 1) %\n 1\n const d = Math.min(phase, 1 - phase)\n const groove = Math.min(\n major - minor,\n Math.max(0, (d - 1 / 16) * pitch * Math.sqrt(3)),\n )\n const thread = p.showThreads ? major - groove : major\n return Math.min(\n thread,\n major - Math.max(0, p.tipChamfer - (z + p.length)),\n )\n }, z)\n if (z === -p.length) cap(r, z, false)\n }\n // Tangent circular under-head blend; its start also trims incomplete crests.\n add(() => major, shaftEnd)\n const filletCenterR = major + p.underHeadRadius\n const filletCenterZ = shaftEnd\n for (let i = 1; i <= 16; i++) {\n const angle = Math.PI - ((Math.PI - Math.PI / 2) * i) / 16\n add(\n () => filletCenterR + p.underHeadRadius * Math.cos(angle),\n filletCenterZ + p.underHeadRadius * Math.sin(angle),\n )\n }\n\n const crown = (r: number) =>\n p.headHeight -\n p.crownRadius +\n Math.sqrt(p.crownRadius * p.crownRadius - r * r)\n const rad265 = (p.recessOuterWingAngle * Math.PI) / 180,\n rad28 = (p.recessInnerWingAngle * Math.PI) / 180\n const tg = (p.recessReferenceDiameter - p.recessG) / 2 / Math.tan(rad265)\n const totalDepth = tg + (p.recessG / 2) * Math.tan(rad28)\n const tb = tg + ((p.recessG - p.recessB) / 2) * Math.tan(rad28)\n const beta = (p.recessBeta * Math.PI) / 180\n const alphaProjected = Math.atan(\n Math.tan((p.recessAlpha * Math.PI) / 360) / Math.cos(beta),\n )\n const cornerProjected = Math.atan(\n Math.tan((46 * Math.PI) / 180) / Math.cos(beta),\n )\n const dre = p.recessE / 2 / Math.tan(alphaProjected)\n // Type-H is a compound conical wing profile with four tapered corner cuts.\n const cornerRadius = (z: number, theta: number) => {\n const depth = p.recessReferencePlaneHeight - z\n const b = p.recessB / 2 - (depth - tb) * Math.tan(beta)\n const delta = Math.abs(\n ((theta - Math.PI / 4 + Math.PI / 4 + 4 * Math.PI) % (Math.PI / 2)) -\n Math.PI / 4,\n )\n const ca = Math.cos(delta),\n sa = Math.sin(delta)\n const tanA = Math.tan(alphaProjected),\n tanC = Math.tan(cornerProjected)\n const first = (tanA * b) / (tanA * ca - sa)\n const corner =\n first * ca <= b + dre\n ? first\n : (tanC * (b + dre) - p.recessE / 2) / (tanC * ca - sa)\n return Math.max(0, corner)\n }\n const recessRadius = (z: number, theta: number) => {\n const depth = p.recessReferencePlaneHeight - z\n const outer =\n depth <= tg\n ? p.recessReferenceDiameter / 2 - depth * Math.tan(rad265)\n : (totalDepth - depth) / Math.tan(rad28)\n return Math.max(0, Math.min(outer, cornerRadius(z, theta)))\n }\n // ISO 4757 r rounds the wing entry, not the g/bottom-cone junction.\n // Offset the spherical crown inward by r and the wing wall into material by r.\n // Their intersection is the center of a circle tangent to both surfaces.\n const entryRadius = p.recessRadius,\n sphereZ = p.headHeight - p.crownRadius,\n slope = Math.tan(rad265),\n line =\n p.recessReferenceDiameter / 2 -\n slope * p.recessReferencePlaneHeight +\n entryRadius / Math.cos(rad265),\n offset = slope * sphereZ + line,\n innerSphere = p.crownRadius - entryRadius,\n centerAboveSphere =\n (-slope * offset +\n Math.sqrt((1 + slope * slope) * innerSphere ** 2 - offset ** 2)) /\n (1 + slope * slope),\n entryCenterZ = sphereZ + centerAboveSphere,\n entryCenterR = slope * entryCenterZ + line,\n entryStart = Math.atan2(centerAboveSphere, entryCenterR),\n entryEnd = Math.PI - rad265,\n mouthR = entryCenterR + entryRadius * Math.cos(entryStart),\n wallZ = entryCenterZ + entryRadius * Math.sin(entryEnd)\n add(() => p.headDiameter / 2, 0)\n add(() => p.headDiameter / 2, crown(p.headDiameter / 2))\n // The wing mouth meets the crown tangentially. Corner cuts may narrow it.\n const opening = Array.from({ length: segments }, (_, i) => {\n const theta = (i * 2 * Math.PI) / segments\n let lo = 0,\n hi = mouthR\n for (let n = 0; n < 48; n++) {\n const r = (lo + hi) / 2\n if (r < cornerRadius(crown(r), theta)) lo = r\n else hi = r\n }\n return (lo + hi) / 2\n })\n for (let n = 1; n <= 20; n++) {\n const r = (theta: number) => {\n const i = Math.round((theta * segments) / (2 * Math.PI)) % segments\n return p.headDiameter / 2 + ((opening[i]! - p.headDiameter / 2) * n) / 20\n }\n add(r, (theta) => crown(r(theta)))\n }\n // A corner-limited ray joins the circle only at its true intersection.\n // Collapse earlier rows there instead of projecting them onto the wall:\n // the circle initially rises in Z, which would retrace that planar wall.\n const entryClips = Array.from({ length: segments }, (_, i) => {\n const theta = (i * 2 * Math.PI) / segments\n const point = (angle: number) => ({\n r: entryCenterR + entryRadius * Math.cos(angle),\n z: entryCenterZ + entryRadius * Math.sin(angle),\n })\n const outside = (angle: number) => {\n const q = point(angle)\n return q.r > cornerRadius(q.z, theta)\n }\n if (!outside(entryStart)) return { angle: entryStart, ...point(entryStart) }\n if (outside(entryEnd))\n return { angle: entryEnd, r: cornerRadius(wallZ, theta), z: wallZ }\n let lo = entryStart,\n hi = entryEnd\n for (let n = 0; n < 48; n++) {\n const angle = (lo + hi) / 2\n if (outside(angle)) lo = angle\n else hi = angle\n }\n const angle = (lo + hi) / 2\n return { angle, ...point(angle) }\n })\n for (let n = 0; n <= 24; n++) {\n const angle = entryStart + ((entryEnd - entryStart) * n) / 24\n const r = entryCenterR + entryRadius * Math.cos(angle),\n z = entryCenterZ + entryRadius * Math.sin(angle)\n const clip = (theta: number) =>\n entryClips[Math.round((theta * segments) / (2 * Math.PI)) % segments]!\n add(\n (theta) => (angle <= clip(theta).angle ? clip(theta).r : r),\n (theta) => (angle <= clip(theta).angle ? clip(theta).z : z),\n )\n }\n const floor = p.recessReferencePlaneHeight - totalDepth\n // Keep the nominal g junction explicit; f/t1 remain standard reference limits.\n const driveLevels = new Set<number>([p.recessReferencePlaneHeight - tg])\n for (let n = 1; n < 48; n++)\n driveLevels.add(wallZ + ((floor - wallZ) * n) / 48)\n for (const z of [...driveLevels]\n .filter((z) => z < wallZ && z > floor)\n .sort((a, b) => b - a)) {\n add((theta) => recessRadius(z, theta), z)\n }\n const point = vertex(0, 0, floor)\n for (let i = 0; i < segments; i++)\n triangle(point, previous[i]!, previous[(i + 1) % segments]!)\n\n return { positions, indices }\n}\n","import { plainBushingModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { PlainBushing } from \"./PlainBushing\"\n\nexport const model = defineModelRenderer({\n name: \"plainbushing\",\n schema: plainBushingModelDefinitionSchema,\n render: ({ fn, ...props }) => <PlainBushing {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { PlainBushingModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createPlainBushingMesh } from \"./mesh\"\n\nexport type PlainBushingProps = PlainBushingModelPropsInput & { color?: string }\n\n/** Through sleeve from Z=0 to length, with four optional 45-degree rim chamfers. */\nexport function createPlainBushingGeom(input: PlainBushingModelPropsInput) {\n return indexedMeshToGeom3(createPlainBushingMesh(input))\n}\n\nexport function PlainBushing({\n color = \"#a18450\",\n ...props\n}: PlainBushingProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createPlainBushingGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createPlainBushingMesh } from \"./mesh\"\nexport type { PlainBushingMesh } from \"./mesh\"\n","import {\n getPlainBushingDimensions,\n plainBushingModelPropsSchema,\n type PlainBushingModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\n/** Shared ring vertices and outward counterclockwise triangles, in millimeters. */\nexport interface PlainBushingMesh {\n positions: number[]\n indices: number[]\n}\n\n/** Annular end faces at Z=0/length; chamfers cut all four bore/outside rims. */\nexport function createPlainBushingMesh(\n input: PlainBushingModelPropsInput,\n): PlainBushingMesh {\n const props = plainBushingModelPropsSchema.parse(input)\n const d = getPlainBushingDimensions(props)\n const ri = d.innerDiameter / 2\n const ro = d.outerDiameter / 2\n const c = props.edgeChamfer\n // Traverse the closed radial/axial section: outside upward, inside downward.\n // No center cap is ever added, so both end openings remain connected.\n const profile: [number, number][] =\n c > 0\n ? [\n [d.endOuterDiameter / 2, 0],\n [ro, c],\n [ro, d.length - c],\n [d.endOuterDiameter / 2, d.length],\n [d.endInnerDiameter / 2, d.length],\n [ri, d.length - c],\n [ri, c],\n [d.endInnerDiameter / 2, 0],\n ]\n : [\n [ro, 0],\n [ro, d.length],\n [ri, d.length],\n [ri, 0],\n ]\n const segments = 96 // Four cardinal directions are exact; allocation is fixed.\n const positions: number[] = []\n const indices: number[] = []\n for (const [radius, z] of profile)\n for (let i = 0; i < segments; i++) {\n const angle = (i * Math.PI * 2) / segments\n positions.push(radius * Math.cos(angle), radius * Math.sin(angle), z)\n }\n for (let ring = 0; ring < profile.length; ring++) {\n const a = ring * segments\n const b = ((ring + 1) % profile.length) * segments\n for (let i = 0; i < segments; i++) {\n const next = (i + 1) % segments\n indices.push(a + i, a + next, b + next, a + i, b + next, b + i)\n }\n }\n return { positions, indices }\n}\n","import { rigidCouplerModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { RigidCoupler } from \"./RigidCoupler\"\n\nexport const model = defineModelRenderer({\n name: \"rigidcoupler\",\n schema: rigidCouplerModelDefinitionSchema,\n render: ({ fn, ...props }) => <RigidCoupler {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { RigidCouplerModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createRigidCouplerMesh } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type RigidCouplerProps = RigidCouplerModelPropsInput & { color?: string }\n\n/** Datum and mounting-hole coordinates follow the modelprinter contract. */\nexport function createRigidCouplerGeom(input: RigidCouplerModelPropsInput) {\n return indexedMeshToGeom3(createRigidCouplerMesh(input))\n}\n\nexport function RigidCoupler({\n color = \"#737e8f\",\n ...props\n}: RigidCouplerProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createRigidCouplerGeom(props)} />\n </Colorize>\n )\n}\nexport { createRigidCouplerMesh } from \"./mesh\"\nexport type { RigidCouplerMesh } from \"./mesh\"\n","import jscad from \"@jscad/modeling\"\nimport {\n rigidCouplerModelPropsSchema,\n getRigidCouplerDimensions,\n type RigidCouplerModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport {\n assertShaftMountResolution,\n createAnnularSleeve,\n createMountingHoleCutter,\n finishShaftMountMesh,\n subtractShaftMountParts,\n type ShaftMountMesh,\n} from \"../../mechanical/shaft-mount-geometry\"\n\nexport type RigidCouplerMesh = ShaftMountMesh\n\n/** Geometry is driven by the corresponding modelprinter schema and hole layout. */\nexport function createRigidCouplerMesh(\n input: RigidCouplerModelPropsInput,\n): RigidCouplerMesh {\n const props = rigidCouplerModelPropsSchema.parse(input)\n const dimensions = getRigidCouplerDimensions(props)\n assertShaftMountResolution(dimensions.screwHoles)\n const body = createAnnularSleeve({\n outerRadius: props.outerDiameter / 2,\n boreARadius: props.boreDiameter / 2,\n boreBRadius: props.boreBDiameter / 2,\n length: props.length,\n chamfer: props.chamfer,\n stepZ: dimensions.boreADepth,\n })\n return finishShaftMountMesh(\n subtractShaftMountParts(\n body,\n ...dimensions.screwHoles.map(createMountingHoleCutter),\n ),\n )\n}\n","import { shaftCollarModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { ShaftCollar } from \"./ShaftCollar\"\n\nexport const model = defineModelRenderer({\n name: \"shaftcollar\",\n schema: shaftCollarModelDefinitionSchema,\n render: ({ fn, ...props }) => <ShaftCollar {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { ShaftCollarModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createShaftCollarMesh } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type ShaftCollarProps = ShaftCollarModelPropsInput & { color?: string }\n\n/** Datum and mounting-hole coordinates follow the modelprinter contract. */\nexport function createShaftCollarGeom(input: ShaftCollarModelPropsInput) {\n return indexedMeshToGeom3(createShaftCollarMesh(input))\n}\n\nexport function ShaftCollar({ color = \"#737e8f\", ...props }: ShaftCollarProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createShaftCollarGeom(props)} />\n </Colorize>\n )\n}\nexport { createShaftCollarMesh } from \"./mesh\"\nexport type { ShaftCollarMesh } from \"./mesh\"\n","import jscad from \"@jscad/modeling\"\nimport {\n shaftCollarModelPropsSchema,\n getShaftCollarDimensions,\n type ShaftCollarModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport {\n assertShaftMountResolution,\n createAnnularSleeve,\n createMountingHoleCutter,\n finishShaftMountMesh,\n subtractShaftMountParts,\n type ShaftMountMesh,\n} from \"../../mechanical/shaft-mount-geometry\"\n\nexport type ShaftCollarMesh = ShaftMountMesh\n\n/** Geometry is driven by the corresponding modelprinter schema and hole layout. */\nexport function createShaftCollarMesh(\n input: ShaftCollarModelPropsInput,\n): ShaftCollarMesh {\n const props = shaftCollarModelPropsSchema.parse(input)\n const dimensions = getShaftCollarDimensions(props)\n assertShaftMountResolution([dimensions.screwHole])\n const body = createAnnularSleeve({\n outerRadius: props.outerDiameter / 2,\n boreARadius: props.boreDiameter / 2,\n length: props.width,\n chamfer: props.chamfer,\n })\n return finishShaftMountMesh(\n subtractShaftMountParts(\n body,\n createMountingHoleCutter(dimensions.screwHole),\n ),\n )\n}\n","import { sheetMetalModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { SheetMetal } from \"../../SheetMetal\"\n\nexport const model = defineModelRenderer({\n name: \"sheetmetal\",\n schema: sheetMetalModelDefinitionSchema,\n render: ({ fn, ...props }) => <SheetMetal {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import { componentMaterials } from \"./materials\"\nimport type { SheetMetalModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createSheetMetalMesh } from \"./mechanical/sheet-metal-mesh\"\nimport { indexedMeshToGeom3 } from \"./mechanical/indexedMeshToGeom3\"\n\nexport type SheetMetalProps = SheetMetalModelPropsInput & { color?: string }\n\n/** Base midsurface Z=0; bends and flanges rise along +Z. Dimensions in mm. */\nexport function createSheetMetalGeom(input: SheetMetalModelPropsInput) {\n return indexedMeshToGeom3(createSheetMetalMesh(input))\n}\n\nexport function SheetMetal({ color = \"#737e8f\", ...props }: SheetMetalProps) {\n return (\n <Colorize color={color} material={componentMaterials.brushedMetal}>\n <Custom geometry={createSheetMetalGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createSheetMetalMesh } from \"./mechanical/sheet-metal-mesh\"\nexport type { SheetMetalMesh } from \"./mechanical/sheet-metal-mesh\"\n","import earcut from \"earcut\"\nimport {\n sheetMetalModelPropsSchema,\n type SheetMetalModelPropsInput,\n type SheetMetalHole,\n} from \"@tscircuit/modelprinter\"\n\ntype Point2 = { u: number; v: number }\ntype Point3 = [number, number, number]\nexport interface SheetMetalMesh {\n positions: number[]\n indices: number[]\n}\n\nfunction holeOutline(hole: SheetMetalHole): Point2[] {\n const radius = (hole.shape === \"round\" ? hole.diameter : hole.width) / 2\n const straight = hole.shape === \"slot\" ? (hole.length - hole.width) / 2 : 0\n if (straight < 0) throw new Error(\"Slot length must be at least its width\")\n return Array.from({ length: 64 }, (_, i) => {\n if (hole.shape === \"round\") {\n const angle = (i * Math.PI) / 32\n return {\n u: hole.u + radius * Math.cos(angle),\n v: hole.v + radius * Math.sin(angle),\n }\n }\n // Two semicircles, with straight connections between their end points.\n const half = i < 32 ? 1 : -1\n const angle =\n -Math.PI / 2 +\n ((i < 32 ? i : i - 32) * Math.PI) / 31 +\n (i < 32 ? 0 : Math.PI)\n const along = half * straight + radius * Math.cos(angle)\n const across = radius * Math.sin(angle)\n return hole.shape === \"slot\" && hole.axis === \"v\"\n ? { u: hole.u - across, v: hole.v + along }\n : { u: hole.u + along, v: hole.v + across }\n })\n}\n\n/** Watertight sheet-metal plate, 90-degree angle or U-channel. Millimeters,\n * right-handed +Z up. Base midsurface at Z=0, centered in X/Y; flanges rise\n * above it. Lengths measure straight tangent-to-tangent sections. Bend skins\n * use the specified inside radius and constant material thickness.\n * Holes are through-cut on straight panels only; no bend allowance/unfolding.\n */\nexport function createSheetMetalMesh(\n input: SheetMetalModelPropsInput,\n): SheetMetalMesh {\n const props = sheetMetalModelPropsSchema.parse(input)\n const { width, baseLength, flangeHeight, thickness, profile } = props\n const radius = props.insideBendRadius + thickness / 2\n const positions: number[] = []\n const indices: number[] = []\n const addTriangle = (vertices: Point3[], reverse = false) => {\n const start = positions.length / 3\n for (const vertex of vertices) positions.push(...vertex)\n indices.push(start, start + (reverse ? 2 : 1), start + (reverse ? 1 : 2))\n }\n const addQuad = (vertices: Point3[], reverse = false) => {\n addTriangle([vertices[0]!, vertices[1]!, vertices[2]!], reverse)\n addTriangle([vertices[0]!, vertices[2]!, vertices[3]!], reverse)\n }\n const panels =\n profile === \"plate\"\n ? [\"base\"]\n : profile === \"angle\"\n ? [\"base\", \"right\"]\n : [\"base\", \"left\", \"right\"]\n for (const hole of props.holes) {\n if (!panels.includes(hole.panel))\n throw new Error(`No ${hole.panel} panel on ${profile}`)\n }\n for (const panel of panels) {\n const length = panel === \"base\" ? baseLength : flangeHeight\n const holes = props.holes\n .filter((hole) => hole.panel === panel)\n .map(holeOutline)\n const bounds = holes.map((outline) => ({\n minU: Math.min(...outline.map((p) => p.u)),\n maxU: Math.max(...outline.map((p) => p.u)),\n minV: Math.min(...outline.map((p) => p.v)),\n maxV: Math.max(...outline.map((p) => p.v)),\n }))\n for (const [i, box] of bounds.entries()) {\n if (\n box.minU <= -length / 2 ||\n box.maxU >= length / 2 ||\n box.minV <= -width / 2 ||\n box.maxV >= width / 2\n )\n throw new Error(`Hole crosses ${panel} panel edge or bend tangent`)\n for (const previous of bounds.slice(0, i))\n if (\n box.minU <= previous.maxU &&\n box.maxU >= previous.minU &&\n box.minV <= previous.maxV &&\n box.maxV >= previous.minV\n )\n throw new Error(\"Hole bounding boxes must not overlap\")\n }\n const outline: Point2[] = [\n { u: -length / 2, v: -width / 2 },\n { u: length / 2, v: -width / 2 },\n { u: length / 2, v: width / 2 },\n { u: -length / 2, v: width / 2 },\n ]\n const loops = [outline, ...holes.map((hole) => [...hole].reverse())]\n const points = loops.flat()\n const starts = holes.map((_, i) => 4 + i * 64)\n const triangles = earcut(\n points.flatMap((p) => [p.u, p.v]),\n starts,\n )\n const project = (point: Point2, offset: number): Point3 =>\n panel === \"base\"\n ? [point.u, point.v, offset]\n : [\n (panel === \"left\" ? -1 : 1) * (baseLength / 2 + radius - offset),\n point.v,\n radius + flangeHeight / 2 + point.u,\n ]\n const reverse = panel === \"left\"\n for (let i = 0; i < triangles.length; i += 3) {\n const face = triangles.slice(i, i + 3).map((index) => points[index]!)\n addTriangle(\n face.map((p) => project(p, thickness / 2)),\n reverse,\n )\n addTriangle(\n face.map((p) => project(p, -thickness / 2)),\n !reverse,\n )\n }\n for (const [loopIndex, loop] of loops.entries())\n for (let i = 0; i < loop.length; i++) {\n const a = loop[i]!,\n b = loop[(i + 1) % loop.length]!\n // Adjacent curved panels close these edges; avoid internal seam faces.\n if (\n loopIndex === 0 &&\n a.u === b.u &&\n ((panel === \"base\" &&\n ((a.u > 0 && profile !== \"plate\") ||\n (a.u < 0 && profile === \"channel\"))) ||\n (panel !== \"base\" && a.u < 0))\n )\n continue\n addQuad(\n [\n project(a, -thickness / 2),\n project(b, -thickness / 2),\n project(b, thickness / 2),\n project(a, thickness / 2),\n ],\n reverse,\n )\n }\n }\n const sides = profile === \"plate\" ? [] : profile === \"angle\" ? [1] : [-1, 1]\n for (const side of sides) {\n const project = (\n angle: number,\n crossSection: { y: number; offset: number },\n ): Point3 => {\n const r = radius - crossSection.offset\n return [\n side * (baseLength / 2 + r * Math.sin(angle)),\n crossSection.y,\n radius - r * Math.cos(angle),\n ]\n }\n for (let i = 0; i < 32; i++) {\n const a = (i * Math.PI) / 64,\n b = ((i + 1) * Math.PI) / 64\n for (const offset of [-thickness / 2, thickness / 2]) {\n addQuad(\n [\n project(a, { y: -width / 2, offset }),\n project(b, { y: -width / 2, offset }),\n project(b, { y: width / 2, offset }),\n project(a, { y: width / 2, offset }),\n ],\n offset < 0 !== side < 0,\n )\n }\n for (const y of [-width / 2, width / 2]) {\n addQuad(\n [\n project(a, { y, offset: -thickness / 2 }),\n project(b, { y, offset: -thickness / 2 }),\n project(b, { y, offset: thickness / 2 }),\n project(a, { y, offset: thickness / 2 }),\n ],\n y > 0 !== side < 0,\n )\n }\n }\n }\n return { positions, indices }\n}\n","import { spurGearModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { SpurGear } from \"../../SpurGear\"\n\nexport const model = defineModelRenderer({\n name: \"spurgear\",\n schema: spurGearModelDefinitionSchema,\n render: ({ fn, ...props }) => <SpurGear {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { SpurGearModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"./mechanical/indexedMeshToGeom3\"\nimport { createSpurGearMesh } from \"./mechanical/spur-gear-mesh\"\n\nexport type SpurGearProps = SpurGearModelPropsInput & { color?: string }\n\n/** Axis +Z, lower face Z=0; optional hub extends above the gear face. */\nexport function createSpurGearGeom(input: SpurGearModelPropsInput) {\n return indexedMeshToGeom3(createSpurGearMesh(input))\n}\n\nexport function SpurGear({ color = \"#737e8f\", ...props }: SpurGearProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createSpurGearGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createSpurGearMesh } from \"./mechanical/spur-gear-mesh\"\nexport type { SpurGearMesh } from \"./mechanical/spur-gear-mesh\"\n","import { threadedRodModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { ThreadedRod } from \"./ThreadedRod\"\n\nexport const model = defineModelRenderer({\n name: \"threadedrod\",\n schema: threadedRodModelDefinitionSchema,\n render: ({ fn, ...props }) => <ThreadedRod {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { ThreadedRodModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createThreadedRodMesh, type ThreadedRodMeshOptions } from \"./mesh\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\n\nexport type ThreadedRodProps = ThreadedRodModelPropsInput & { color?: string }\nexport function createThreadedRodGeom(\n input: ThreadedRodModelPropsInput,\n resolution?: ThreadedRodMeshOptions,\n) {\n return indexedMeshToGeom3(createThreadedRodMesh(input, resolution))\n}\nexport function ThreadedRod({ color = \"#737e8f\", ...props }: ThreadedRodProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createThreadedRodGeom(props)} />\n </Colorize>\n )\n}\nexport { createThreadedRodMesh } from \"./mesh\"\nexport type {\n ThreadedRodMesh,\n ThreadedRodMeshOptions,\n} from \"./mesh\"\n","import {\n threadedRodModelPropsSchema,\n getThreadedRodDimensions,\n type ThreadedRodModelPropsInput,\n} from \"@tscircuit/modelprinter\"\n\n/** Indexed counterclockwise triangles in millimeters. */\nexport interface ThreadedRodMesh {\n positions: number[]\n indices: number[]\n}\n/** Renderer resolution affects tessellation only, never model specifications. */\nexport interface ThreadedRodMeshOptions {\n radialSegments?: number\n segmentsPerPitch?: number\n}\nfunction resolution(options: ThreadedRodMeshOptions) {\n const radial = options.radialSegments ?? 96\n const axial = options.segmentsPerPitch ?? 32\n if (\n !Number.isInteger(radial) ||\n radial < 24 ||\n radial > 192 ||\n radial % 12 !== 0 ||\n !Number.isInteger(axial) ||\n axial < 8 ||\n axial > 64\n )\n throw new Error(\n \"Mesh resolution limit: radial segments must be a multiple of 12 in [24,192], pitch segments an integer in [8,64]\",\n )\n return { radial, axial }\n}\nfunction surface(segments: number) {\n const positions: number[] = [],\n indices: number[] = []\n const ring = (z: number, radius: (angle: number) => number) => {\n const start = positions.length / 3\n for (let i = 0; i < segments; i++) {\n const angle = (i * 2 * Math.PI) / segments\n const r = radius(angle)\n positions.push(r * Math.cos(angle), r * Math.sin(angle), z)\n }\n return start\n }\n const connect = (a: number, b: number) => {\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n indices.push(a + i, a + n, b + n, a + i, b + n, b + i)\n }\n }\n const cap = (start: number, z: number, up: boolean) => {\n const center = positions.length / 3\n positions.push(0, 0, z)\n for (let i = 0; i < segments; i++) {\n const n = (i + 1) % segments\n indices.push(center, start + (up ? i : n), start + (up ? n : i))\n }\n }\n return { positions, indices, ring, connect, cap }\n}\nfunction hexRadius(angle: number, acrossFlats: number) {\n const period = Math.PI / 3\n const distance =\n ((((angle - Math.PI / 2 + period / 2) % period) + period) % period) -\n period / 2\n return acrossFlats / 2 / Math.cos(distance)\n}\nfunction threadDistance(z: number, angle: number, pitch: number, hand = 1) {\n const phase = (((z / pitch - (hand * angle) / (2 * Math.PI)) % 1) + 1) % 1\n return Math.min(phase, 1 - phase)\n}\n/** Full single-start external thread, phase +X at z=0, flat chamfered ends. */\nexport function createThreadedRodMesh(\n input: ThreadedRodModelPropsInput,\n options: ThreadedRodMeshOptions = {},\n): ThreadedRodMesh {\n const props = threadedRodModelPropsSchema.parse(input)\n const d = getThreadedRodDimensions(input)\n const { radial, axial } = resolution(options)\n const steps = Math.max(2, Math.ceil((d.length / d.threadPitch) * axial))\n if (\n steps > 24000 ||\n !Number.isFinite(steps) ||\n Math.min(d.minorDiameter, d.endDiameter) < d.diameter * 1e-8\n )\n throw new Error(\n \"Mesh resolution limit: excessive turns or vanishing end/root radius\",\n )\n const m = surface(radial)\n const levels = new Set(\n Array.from({ length: steps + 1 }, (_, i) => (d.length * i) / steps),\n )\n levels.add(props.chamfer)\n levels.add(d.length - props.chamfer)\n const radius = d.diameter / 2,\n depth = (d.diameter - d.minorDiameter) / 2\n let previous = -1\n for (const z of [...levels].sort((a, b) => a - b)) {\n const current = m.ring(z, (angle) => {\n const groove = Math.min(\n depth,\n Math.max(\n 0,\n (threadDistance(z, angle, d.threadPitch, props.leftHand ? -1 : 1) -\n 1 / 16) *\n d.threadPitch *\n Math.sqrt(3),\n ),\n )\n const chamfer =\n radius - Math.max(0, props.chamfer - Math.min(z, d.length - z))\n return Math.min(radius - groove, chamfer)\n })\n if (previous < 0) m.cap(current, z, false)\n else m.connect(previous, current)\n previous = current\n }\n m.cap(previous, d.length, true)\n return { positions: m.positions, indices: m.indices }\n}\n","import { torsionSpringModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { TorsionSpring } from \"./TorsionSpring\"\nexport const model = defineModelRenderer({\n name: \"torsionspring\",\n schema: torsionSpringModelDefinitionSchema,\n render: ({ fn, ...props }) => <TorsionSpring {...props} />,\n pads: \"none\",\n})\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { TorsionSpringModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createTorsionSpringMesh } from \"./mesh\"\nexport type TorsionSpringProps = TorsionSpringModelPropsInput & {\n color?: string\n}\nexport function createTorsionSpringGeom(input: TorsionSpringModelPropsInput) {\n return indexedMeshToGeom3(createTorsionSpringMesh(input))\n}\nexport function TorsionSpring({\n color = \"#929ba6\",\n ...props\n}: TorsionSpringProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createTorsionSpringGeom(props)} />\n </Colorize>\n )\n}\nexport { createTorsionSpringMesh } from \"./mesh\"\nexport type { TorsionSpringMesh, TorsionSpringMeshOptions } from \"./mesh\"\n","import {\n torsionSpringModelPropsSchema,\n getTorsionSpringDimensions,\n getTorsionSpringFrame,\n type TorsionSpringModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nexport interface TorsionSpringMesh {\n positions: number[]\n indices: number[]\n}\nexport interface TorsionSpringMeshOptions {\n segmentsPerTurn?: number\n wireSegments?: number\n}\n/** Circular normal sections along the shared helix and its tangent legs. */\nexport function createTorsionSpringMesh(\n input: TorsionSpringModelPropsInput,\n options: TorsionSpringMeshOptions = {},\n): TorsionSpringMesh {\n const p = torsionSpringModelPropsSchema.parse(input),\n d = getTorsionSpringDimensions(p)\n const segmentsPerTurn = options.segmentsPerTurn ?? 64,\n wireSegments = options.wireSegments ?? 24\n for (const [name, value, minimum, maximum] of [\n [\"segmentsPerTurn\", segmentsPerTurn, 16, 256],\n [\"wireSegments\", wireSegments, 8, 64],\n ] as const)\n if (\n !Number.isInteger(value) ||\n value < minimum ||\n value > maximum ||\n value % 4 !== 0\n )\n throw new Error(\n `${name} must be a multiple of four in [${minimum},${maximum}]`,\n )\n const steps = Math.ceil(p.turns * segmentsPerTurn)\n if ((steps + 3) * wireSegments + 2 > 250000)\n throw new Error(\"Spring exceeds mesh resolution limit (250000 vertices)\")\n const scale = Math.max(\n p.outerDiameter,\n d.axialAdvance,\n p.startLegLength,\n p.endLegLength,\n )\n if (\n Math.min(\n p.wireDiameter,\n p.startLegLength,\n p.endLegLength,\n d.insideDiameter,\n p.pitch - p.wireDiameter,\n ) <=\n scale * 1e-10\n )\n throw new Error(\"Spring clearance exceeds mesh resolution limits\")\n const distances = [\n 0,\n ...Array.from(\n { length: steps + 1 },\n (_, i) => p.startLegLength + (d.coilLength * i) / steps,\n ),\n d.centerlineLength,\n ]\n // Mirror the same triangulation for left-hand coils; changing the diagonal\n // of a nonplanar quad would otherwise change its enclosed volume.\n const frameProps = { ...p, leftHand: false }\n const positions: number[] = [],\n indices: number[] = []\n for (const distance of distances) {\n const f = getTorsionSpringFrame(frameProps, distance)\n for (let j = 0; j < wireSegments; j++) {\n const angle = (2 * Math.PI * j) / wireSegments\n const c =\n j === wireSegments / 4 || j === (3 * wireSegments) / 4\n ? 0\n : Math.cos(angle)\n const s = j === 0 || j === wireSegments / 2 ? 0 : Math.sin(angle)\n for (let axis = 0; axis < 3; axis++)\n positions.push(\n f.position[axis]! +\n (p.wireDiameter / 2) *\n (f.normal[axis]! * c + f.binormal[axis]! * s),\n )\n }\n }\n for (let i = 0; i < distances.length - 1; i++)\n for (let j = 0; j < wireSegments; j++) {\n const n = (j + 1) % wireSegments,\n a = i * wireSegments,\n b = (i + 1) * wireSegments\n indices.push(a + j, a + n, b + j, a + n, b + n, b + j)\n }\n const firstCenter = positions.length / 3\n positions.push(\n ...getTorsionSpringFrame(frameProps, 0).position,\n ...getTorsionSpringFrame(frameProps, d.centerlineLength).position,\n )\n const end = (distances.length - 1) * wireSegments\n for (let j = 0; j < wireSegments; j++) {\n const n = (j + 1) % wireSegments\n indices.push(firstCenter, n, j, firstCenter + 1, end + j, end + n)\n }\n if (p.leftHand) {\n for (let i = 1; i < positions.length; i += 3) positions[i] = -positions[i]!\n for (let i = 0; i < indices.length; i += 3)\n [indices[i + 1], indices[i + 2]] = [indices[i + 2]!, indices[i + 1]!]\n }\n return { positions, indices }\n}\n","import { tSlotExtrusionModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { TSlotExtrusion } from \"./TSlotExtrusion\"\n\nexport const model = defineModelRenderer({\n name: \"tslotextrusion\",\n schema: tSlotExtrusionModelDefinitionSchema,\n render: ({ fn, ...props }) => <TSlotExtrusion {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { TSlotExtrusionModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createTSlotExtrusionMesh } from \"./mesh\"\n\nexport type TSlotExtrusionProps = TSlotExtrusionModelPropsInput & {\n color?: string\n}\n\nexport function createTSlotExtrusionGeom(\n input: TSlotExtrusionModelPropsInput = {},\n) {\n return indexedMeshToGeom3(createTSlotExtrusionMesh(input))\n}\n\nexport function TSlotExtrusion({\n color = \"#8995a3\",\n ...props\n}: TSlotExtrusionProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createTSlotExtrusionGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createTSlotExtrusionMesh } from \"./mesh\"\nexport type { TSlotExtrusionMesh } from \"./mesh\"\n","import {\n tSlotExtrusionModelPropsSchema,\n type TSlotExtrusionModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport {\n circularProfile,\n extrudePlanarProfile,\n type ProfilePoint,\n} from \"../../mechanical/extrude-planar-profile\"\n\nexport interface TSlotExtrusionMesh {\n positions: number[]\n indices: number[]\n}\n\n/** Four straight-sided T grooves and an optional bore, all open at both ends.\n * Section centered in XY; end mounting datum Z=0, length extends along +Z.\n */\nexport function createTSlotExtrusionMesh(\n input: TSlotExtrusionModelPropsInput = {},\n): TSlotExtrusionMesh {\n const props = tSlotExtrusionModelPropsSchema.parse(input)\n const { width, height, length, cornerRadius, lipThickness, pocketDepth } =\n props\n const slot = props.slotWidth / 2\n const pocket = props.pocketWidth / 2\n const depth = lipThickness + pocketDepth\n const outer: ProfilePoint[] = []\n for (let face = 0; face < 4; face++) {\n const span = (face % 2 === 0 ? width : height) / 2\n const extent = (face % 2 === 0 ? height : width) / 2\n const local: ProfilePoint[] = [\n [-span + cornerRadius, -extent],\n [-slot, -extent],\n [-slot, -extent + lipThickness],\n [-pocket, -extent + lipThickness],\n [-pocket, -extent + depth],\n [pocket, -extent + depth],\n [pocket, -extent + lipThickness],\n [slot, -extent + lipThickness],\n [slot, -extent],\n [span - cornerRadius, -extent],\n ]\n if (cornerRadius > 0)\n for (let step = 1; step < 24; step++) {\n const angle = -Math.PI / 2 + (step * Math.PI) / 48\n local.push([\n span - cornerRadius + cornerRadius * Math.cos(angle),\n -extent + cornerRadius + cornerRadius * Math.sin(angle),\n ])\n }\n for (const [u, v] of local)\n outer.push(\n face === 0\n ? [u, v]\n : face === 1\n ? [-v, u]\n : face === 2\n ? [-u, -v]\n : [v, -u],\n )\n }\n return extrudePlanarProfile({\n outer,\n holes:\n props.boreDiameter > 0\n ? [circularProfile(0, 0, props.boreDiameter / 2)]\n : [],\n start: 0,\n end: length,\n })\n}\n","import { tSlotGussetModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { TSlotGusset } from \"./TSlotGusset\"\n\nexport const model = defineModelRenderer({\n name: \"tslotgusset\",\n schema: tSlotGussetModelDefinitionSchema,\n render: ({ fn, ...props }) => <TSlotGusset {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { TSlotGussetModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createTSlotGussetMesh } from \"./mesh\"\n\nexport type TSlotGussetProps = TSlotGussetModelPropsInput & { color?: string }\n\nexport function createTSlotGussetGeom(input: TSlotGussetModelPropsInput = {}) {\n return indexedMeshToGeom3(createTSlotGussetMesh(input))\n}\n\nexport function TSlotGusset({ color = \"#8995a3\", ...props }: TSlotGussetProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createTSlotGussetGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createTSlotGussetMesh } from \"./mesh\"\nexport type { TSlotGussetMesh } from \"./mesh\"\n","import {\n getTSlotGussetMountingSlots,\n tSlotGussetModelPropsSchema,\n type TSlotGussetModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport {\n extrudePlanarProfile,\n circularProfile,\n type ProfilePoint,\n} from \"../../mechanical/extrude-planar-profile\"\n\nexport interface TSlotGussetMesh {\n positions: number[]\n indices: number[]\n}\n\n/** Right triangular flat plate at Z=0..thickness, with both complete through\n * capsules at the mounting centers/orientations resolved by modelprinter.\n */\nexport function createTSlotGussetMesh(\n input: TSlotGussetModelPropsInput = {},\n): TSlotGussetMesh {\n const props = tSlotGussetModelPropsSchema.parse(input)\n const holes = getTSlotGussetMountingSlots(props).map((slot) => {\n const radius = slot.width / 2\n const halfStraight = (slot.length - slot.width) / 2\n const rotate = (u: number, v: number): ProfilePoint =>\n slot.orientation === 0\n ? [slot.center.x + u, slot.center.y + v]\n : [slot.center.x - v, slot.center.y + u]\n if (halfStraight === 0)\n return circularProfile(0, 0, radius).map(([u, v]) => rotate(u, v))\n const loop: ProfilePoint[] = []\n for (const side of [1, -1])\n for (let step = 0; step <= 48; step++) {\n const angle =\n -Math.PI / 2 + (step * Math.PI) / 48 + (side < 0 ? Math.PI : 0)\n loop.push(\n rotate(\n side * halfStraight + radius * Math.cos(angle),\n radius * Math.sin(angle),\n ),\n )\n }\n return loop\n })\n return extrudePlanarProfile({\n outer: [\n [0, 0],\n [props.width, 0],\n [0, props.height],\n ],\n holes,\n start: 0,\n end: props.thickness,\n })\n}\n","import { tSlotInsideCornerModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { TSlotInsideCorner } from \"./TSlotInsideCorner\"\n\nexport const model = defineModelRenderer({\n name: \"tslotinsidecorner\",\n schema: tSlotInsideCornerModelDefinitionSchema,\n render: ({ fn, ...props }) => <TSlotInsideCorner {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { TSlotInsideCornerModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { indexedMeshToGeom3 } from \"../../mechanical/indexedMeshToGeom3\"\nimport { createTSlotInsideCornerMesh } from \"./mesh\"\n\nexport type TSlotInsideCornerProps = TSlotInsideCornerModelPropsInput & {\n color?: string\n}\n\nexport function createTSlotInsideCornerGeom(\n input: TSlotInsideCornerModelPropsInput = {},\n) {\n return indexedMeshToGeom3(createTSlotInsideCornerMesh(input))\n}\n\nexport function TSlotInsideCorner({\n color = \"#8995a3\",\n ...props\n}: TSlotInsideCornerProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createTSlotInsideCornerGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createTSlotInsideCornerMesh } from \"./mesh\"\nexport type { TSlotInsideCornerMesh } from \"./mesh\"\n","import {\n tSlotInsideCornerModelPropsSchema,\n type TSlotInsideCornerModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport {\n circularProfile,\n extrudePlanarProfile,\n joinProfileMeshes,\n type ProfilePoint,\n} from \"../../mechanical/extrude-planar-profile\"\n\nexport interface TSlotInsideCornerMesh {\n positions: number[]\n indices: number[]\n}\n\n/** Constant-thickness quarter bend joining two perpendicular drilled legs.\n * Virtual inside corner is X=Z=0; width is centered on Y. No internal seam caps.\n */\nexport function createTSlotInsideCornerMesh(\n input: TSlotInsideCornerModelPropsInput = {},\n): TSlotInsideCornerMesh {\n const props = tSlotInsideCornerModelPropsSchema.parse(input)\n const { width, legLength, thickness, bendRadius, holeOffset, holeDiameter } =\n props\n const r = bendRadius\n const outerRadius = r + thickness\n const panel: ProfilePoint[] = [\n [r, -width / 2],\n [legLength, -width / 2],\n [legLength, width / 2],\n [r, width / 2],\n ]\n const holes = [circularProfile(holeOffset, 0, holeDiameter / 2)]\n const bend: ProfilePoint[] = []\n if (r === 0) bend.push([0, 0])\n else\n for (let step = 0; step <= 48; step++) {\n const angle = -Math.PI / 2 - (step * Math.PI) / 96\n bend.push(\n step === 0\n ? [r, 0]\n : step === 48\n ? [0, r]\n : [r + r * Math.cos(angle), r + r * Math.sin(angle)],\n )\n }\n for (let step = 0; step <= 48; step++) {\n const angle = -Math.PI + (step * Math.PI) / 96\n bend.push(\n step === 0\n ? [-thickness, r]\n : step === 48\n ? [r, -thickness]\n : [\n r + outerRadius * Math.cos(angle),\n r + outerRadius * Math.sin(angle),\n ],\n )\n }\n return joinProfileMeshes([\n extrudePlanarProfile({\n outer: panel,\n holes,\n start: -thickness,\n end: 0,\n skipWall: (a, b) => a[0] === r && b[0] === r,\n }),\n extrudePlanarProfile({\n outer: panel,\n holes,\n start: -thickness,\n end: 0,\n project: (u, v, depth) => [depth, v, u],\n reverse: true,\n skipWall: (a, b) => a[0] === r && b[0] === r,\n }),\n extrudePlanarProfile({\n outer: bend,\n start: -width / 2,\n end: width / 2,\n project: (u, v, depth) => [u, depth, v],\n reverse: true,\n skipWall: (a, b) =>\n (a[0] === r && b[0] === r) || (a[1] === r && b[1] === r),\n }),\n ])\n}\n","import { wormGearModelDefinitionSchema } from \"@tscircuit/modelprinter\"\nimport {\n defineModelRenderer,\n type ModelRendererRegistry,\n} from \"../../model-registry\"\nimport { WormGear } from \"../../WormGear\"\n\nexport const model = defineModelRenderer({\n name: \"wormgear\",\n schema: wormGearModelDefinitionSchema,\n render: ({ fn, ...props }) => <WormGear {...props} />,\n pads: \"none\",\n})\n\nexport function register(registry: ModelRendererRegistry): void {\n registry.register(model)\n}\n","import type { WormGearModelPropsInput } from \"@tscircuit/modelprinter\"\nimport { Colorize, Custom } from \"jscad-fiber\"\nimport { createWormGearMesh } from \"./mechanical/worm-gear-mesh\"\nimport { indexedMeshToGeom3 } from \"./mechanical/indexedMeshToGeom3\"\n\nexport type WormGearProps = WormGearModelPropsInput & {\n color?: string\n}\n\n/** Square-cut worm along +Z, from Z=0 to length. Threads are approximate. */\nexport function createWormGearGeom(input: WormGearModelPropsInput) {\n return indexedMeshToGeom3(createWormGearMesh(input))\n}\n\nexport function WormGear({ color = \"#737e8f\", ...props }: WormGearProps) {\n return (\n <Colorize color={color}>\n <Custom geometry={createWormGearGeom(props)} />\n </Colorize>\n )\n}\n\nexport { createWormGearMesh } from \"./mechanical/worm-gear-mesh\"\nexport type { WormGearMesh } from \"./mechanical/worm-gear-mesh\"\n","import {\n getWormGearDimensions,\n wormGearModelPropsSchema,\n type WormGearModelPropsInput,\n} from \"@tscircuit/modelprinter\"\nimport earcut from \"earcut\"\n\n/** Indexed triangles, counterclockwise from outside; millimeters, Z up. */\nexport interface WormGearMesh {\n positions: number[]\n indices: number[]\n}\n\n/**\n * A cylindrical worm from Z=0 to Z=length, with square-cut ends.\n * The axial trapezoidal rack profile is swept around +Z. A right-hand crest\n * winds counterclockwise as Z increases; phase rotates the entire solid.\n * This is a faceted visual worm, not a hobbed wheel or a conjugate gear pair.\n */\nexport const createWormGearMesh = (\n input: WormGearModelPropsInput,\n): WormGearMesh => {\n const props = wormGearModelPropsSchema.parse(input)\n const { outsideDiameter, rootDiameter, axialPitch, lead, toothThickness } =\n getWormGearDimensions(props)\n const outsideRadius = outsideDiameter / 2\n const rootRadius = rootDiameter / 2\n const pitchRadius = props.pitchDiameter / 2\n const pressureTangent = Math.tan((props.pressureAngle * Math.PI) / 180)\n const tipHalfWidth = toothThickness / 2 - props.module * pressureTangent\n const rootHalfWidth =\n toothThickness / 2 + (props.module + props.clearance) * pressureTangent\n\n // Each pitch has exact crest, pitch-cylinder and root samples.\n // Rotating this same profile at every level preserves narrow crests and\n // troughs even for multiple starts, instead of aliasing a fixed angle grid.\n // Root facets must stay outside a stationary bore, including between Z\n // levels. A triangle's angular span is at most its ring gap plus helix twist,\n // so bound both by acos(bore/root), with margin for numerical roundoff.\n const boreRadius = props.boreDiameter / 2\n const angularStepLimit =\n boreRadius > 0 ? Math.acos(boreRadius / rootRadius) * 0.8 : Infinity\n const samplesPerPitch = Math.max(\n Math.ceil(props.radialSegments / props.starts),\n Math.ceil((Math.PI * 2) / (props.starts * angularStepLimit)),\n )\n // segmentsPerTurn controls a revolution of the helix (one lead). Also keep\n // at least twelve axial levels per pitch when several starts share a lead.\n const stepsPerTurn = Math.max(\n props.segmentsPerTurn,\n props.radialSegments,\n props.starts * 12,\n Math.ceil((Math.PI * 2) / angularStepLimit),\n )\n const steps = Math.max(1, Math.ceil((props.length / lead) * stepsPerTurn))\n const extraVertices = boreRadius > 0 ? props.radialSegments * 2 : 2\n // Check before allocating any user-sized array, including dense angular\n // samples required by an almost-root-diameter bore.\n if (\n !Number.isFinite(samplesPerPitch) ||\n !Number.isFinite(steps) ||\n (steps + 1) * (samplesPerPitch + 6) * props.starts + extraVertices >\n 1_000_000\n ) {\n throw new Error(\n \"Worm gear exceeds mesh resolution limit (1000000 vertices); reduce length or resolution, or increase module or bore wall thickness\",\n )\n }\n const corners = [\n 0,\n tipHalfWidth / axialPitch,\n toothThickness / (2 * axialPitch),\n rootHalfWidth / axialPitch,\n 1 - rootHalfWidth / axialPitch,\n 1 - toothThickness / (2 * axialPitch),\n 1 - tipHalfWidth / axialPitch,\n 1,\n ]\n const fractions: number[] = []\n for (let index = 0; index < corners.length - 1; index++) {\n const from = corners[index]!\n const width = corners[index + 1]! - from\n const subdivisions = Math.max(1, Math.ceil(width * samplesPerPitch))\n for (let subdivision = 0; subdivision < subdivisions; subdivision++) {\n const fraction = from + (width * subdivision) / subdivisions\n if (\n fractions.length === 0 ||\n fraction - fractions[fractions.length - 1]! > 1e-12\n )\n fractions.push(fraction)\n }\n }\n const profile: { angle: number; radius: number }[] = []\n for (let start = 0; start < props.starts; start++) {\n for (const fraction of fractions) {\n const distance = Math.min(fraction, 1 - fraction) * axialPitch\n profile.push({\n angle: ((start + fraction) * Math.PI * 2) / props.starts,\n radius:\n distance <= tipHalfWidth\n ? outsideRadius\n : distance >= rootHalfWidth\n ? rootRadius\n : pitchRadius + (toothThickness / 2 - distance) / pressureTangent,\n })\n }\n }\n\n const count = profile.length\n\n const positions: number[] = []\n const indices: number[] = []\n const phase = ((props.phase % 360) * Math.PI) / 180\n const direction = props.handedness === \"right\" ? 1 : -1\n const ring = (z: number) => {\n const first = positions.length / 3\n const rotation = phase + direction * (z / lead) * Math.PI * 2\n for (const sample of profile) {\n const angle = sample.angle + rotation\n positions.push(\n sample.radius * Math.cos(angle),\n sample.radius * Math.sin(angle),\n z,\n )\n }\n return first\n }\n const connect = (lower: number, upper: number) => {\n for (let index = 0; index < count; index++) {\n const next = (index + 1) % count\n indices.push(\n lower + index,\n lower + next,\n upper + next,\n lower + index,\n upper + next,\n upper + index,\n )\n }\n }\n const bottom = ring(0)\n let previous = bottom\n for (let step = 1; step <= steps; step++) {\n const current = ring(props.length * (step / steps))\n connect(previous, current)\n previous = current\n }\n const top = previous\n\n if (props.boreDiameter === 0) {\n const cap = (boundary: number, z: number, upward: boolean) => {\n const center = positions.length / 3\n positions.push(0, 0, z)\n for (let index = 0; index < count; index++) {\n const next = (index + 1) % count\n indices.push(\n center,\n boundary + (upward ? index : next),\n boundary + (upward ? next : index),\n )\n }\n }\n cap(bottom, 0, false)\n cap(top, props.length, true)\n } else {\n // The bore has stationary circular rings. Keeping it independent of the\n // rotating tooth rings avoids twisting or narrowing the cylindrical bore.\n const holeCount = props.radialSegments\n const boreRing = (z: number) => {\n const first = positions.length / 3\n for (let index = 0; index < holeCount; index++) {\n const angle = phase + (index * Math.PI * 2) / holeCount\n positions.push(\n boreRadius * Math.cos(angle),\n boreRadius * Math.sin(angle),\n z,\n )\n }\n return first\n }\n const holeBottom = boreRing(0)\n const holeTop = boreRing(props.length)\n for (let index = 0; index < holeCount; index++) {\n const next = (index + 1) % holeCount\n indices.push(\n holeBottom + index,\n holeTop + next,\n holeBottom + next,\n holeBottom + index,\n holeTop + index,\n holeTop + next,\n )\n }\n const cap = (boundary: number, hole: number, upward: boolean) => {\n const vertices = Array.from(\n { length: count },\n (_, index) => boundary + index,\n )\n vertices.push(\n ...Array.from({ length: holeCount }, (_, index) => hole + index),\n )\n const flat = vertices.flatMap((vertex) => [\n positions[vertex * 3]!,\n positions[vertex * 3 + 1]!,\n ])\n const triangles = earcut(flat, [count], 2)\n for (let index = 0; index < triangles.length; index += 3) {\n const a = vertices[triangles[index]!]!\n const b = vertices[triangles[index + 1]!]!\n const c = vertices[triangles[index + 2]!]!\n const signedArea =\n (positions[b * 3]! - positions[a * 3]!) *\n (positions[c * 3 + 1]! - positions[a * 3 + 1]!) -\n (positions[b * 3 + 1]! - positions[a * 3 + 1]!) *\n (positions[c * 3]! - positions[a * 3]!)\n indices.push(\n a,\n signedArea > 0 === upward ? b : c,\n signedArea > 0 === upward ? c : b,\n )\n }\n }\n cap(bottom, holeBottom, false)\n cap(top, holeTop, true)\n }\n\n return { positions, indices }\n}\n","// Generated by scripts/generate-model-renderers.mjs. Do not edit.\nimport type { ModelRendererRegistry } from \"../model-registry\"\nimport { model as model0 } from \"../models/ballbearing/register\"\nimport { register as register0 } from \"../models/ballbearing/register\"\nimport { model as model1 } from \"../models/balltransferunit/register\"\nimport { register as register1 } from \"../models/balltransferunit/register\"\nimport { model as model2 } from \"../models/buttonscrew/register\"\nimport { register as register2 } from \"../models/buttonscrew/register\"\nimport { model as model3 } from \"../models/cablegrommet/register\"\nimport { register as register3 } from \"../models/cablegrommet/register\"\nimport { model as model4 } from \"../models/clampingshaftcollar/register\"\nimport { register as register4 } from \"../models/clampingshaftcollar/register\"\nimport { model as model5 } from \"../models/compressionspring/register\"\nimport { register as register5 } from \"../models/compressionspring/register\"\nimport { model as model6 } from \"../models/flangedbushing/register\"\nimport { register as register6 } from \"../models/flangedbushing/register\"\nimport { model as model7 } from \"../models/flatheadscrew/register\"\nimport { register as register7 } from \"../models/flatheadscrew/register\"\nimport { model as model8 } from \"../models/flexscreen/register\"\nimport { register as register8 } from \"../models/flexscreen/register\"\nimport { model as model9 } from \"../models/helicalgear/register\"\nimport { register as register9 } from \"../models/helicalgear/register\"\nimport { model as model10 } from \"../models/hexbolt/register\"\nimport { register as register10 } from \"../models/hexbolt/register\"\nimport { model as model11 } from \"../models/hexnut/register\"\nimport { register as register11 } from \"../models/hexnut/register\"\nimport { model as model12 } from \"../models/hexsocketbolt/register\"\nimport { register as register12 } from \"../models/hexsocketbolt/register\"\nimport { model as model13 } from \"../models/hollowpositioningarmtube/register\"\nimport { register as register13 } from \"../models/hollowpositioningarmtube/register\"\nimport { model as model14 } from \"../models/nema/register\"\nimport { register as register14 } from \"../models/nema/register\"\nimport { model as model15 } from \"../models/panscrew/register\"\nimport { register as register15 } from \"../models/panscrew/register\"\nimport { model as model16 } from \"../models/plainbushing/register\"\nimport { register as register16 } from \"../models/plainbushing/register\"\nimport { model as model17 } from \"../models/rigidcoupler/register\"\nimport { register as register17 } from \"../models/rigidcoupler/register\"\nimport { model as model18 } from \"../models/shaftcollar/register\"\nimport { register as register18 } from \"../models/shaftcollar/register\"\nimport { model as model19 } from \"../models/sheetmetal/register\"\nimport { register as register19 } from \"../models/sheetmetal/register\"\nimport { model as model20 } from \"../models/spurgear/register\"\nimport { register as register20 } from \"../models/spurgear/register\"\nimport { model as model21 } from \"../models/threadedrod/register\"\nimport { register as register21 } from \"../models/threadedrod/register\"\nimport { model as model22 } from \"../models/torsionspring/register\"\nimport { register as register22 } from \"../models/torsionspring/register\"\nimport { model as model23 } from \"../models/tslotextrusion/register\"\nimport { register as register23 } from \"../models/tslotextrusion/register\"\nimport { model as model24 } from \"../models/tslotgusset/register\"\nimport { register as register24 } from \"../models/tslotgusset/register\"\nimport { model as model25 } from \"../models/tslotinsidecorner/register\"\nimport { register as register25 } from \"../models/tslotinsidecorner/register\"\nimport { model as model26 } from \"../models/wormgear/register\"\nimport { register as register26 } from \"../models/wormgear/register\"\n\nexport const builtinModelRenderers = [\n model0,\n model1,\n model2,\n model3,\n model4,\n model5,\n model6,\n model7,\n model8,\n model9,\n model10,\n model11,\n model12,\n model13,\n model14,\n model15,\n model16,\n model17,\n model18,\n model19,\n model20,\n model21,\n model22,\n model23,\n model24,\n model25,\n model26,\n] as const\n\nexport function registerAllModelRenderers(registry: ModelRendererRegistry): void {\n register0(registry)\n register1(registry)\n register2(registry)\n register3(registry)\n register4(registry)\n register5(registry)\n register6(registry)\n register7(registry)\n register8(registry)\n register9(registry)\n register10(registry)\n register11(registry)\n register12(registry)\n register13(registry)\n register14(registry)\n register15(registry)\n register16(registry)\n register17(registry)\n register18(registry)\n register19(registry)\n register20(registry)\n register21(registry)\n register22(registry)\n register23(registry)\n register24(registry)\n register25(registry)\n register26(registry)\n}\n","import { registerAllModelRenderers } from \"./generated/model-renderers\"\nimport { ModelRendererRegistry } from \"./model-registry\"\n\nexport const modelRendererRegistry = new ModelRendererRegistry()\nregisterAllModelRenderers(modelRendererRegistry)\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n Hull,\n Subtract,\n Translate,\n Union,\n} from \"jscad-fiber\"\n\n/** Physical package dimensions in mm, independent of copper land dimensions.\n * X crosses the two lead rows; Y runs along each row. Z=0 is the seating plane.\n * Pin 1 is at negative X, positive Y. Bend curvature and the pin-1 dimple are\n * visual approximations, not additional package-identification parameters.\n */\nexport interface DualRowGullWingDimensions {\n pinCount: number\n pitch: number\n bodyWidth: number\n bodyLength: number\n /** Overall height A, including standoff A1. */\n bodyHeight: number\n standoff: number\n /** Outer lead-tip to outer lead-tip dimension E. */\n leadSpan: number\n leadWidth: number\n leadThickness: number\n /** Horizontal terminal contact, not the PCB land length. */\n contactLength: number\n /** Per-side inset of the top and bottom mold faces. */\n taperInset: number\n /** Both zero means no exposed pad; otherwise both must be positive. */\n exposedPadWidth?: number\n exposedPadLength?: number\n}\n\nexport function createDualRowGullWing(p: DualRowGullWingDimensions) {\n const {\n pinCount,\n pitch,\n bodyWidth,\n bodyLength,\n bodyHeight,\n standoff,\n leadSpan,\n leadWidth,\n leadThickness,\n contactLength,\n taperInset,\n exposedPadWidth = 0,\n exposedPadLength = 0,\n } = p\n for (const key of [\n \"pitch\",\n \"bodyWidth\",\n \"bodyLength\",\n \"bodyHeight\",\n \"leadSpan\",\n \"leadWidth\",\n \"leadThickness\",\n \"contactLength\",\n ] as const)\n if (!Number.isFinite(p[key]) || p[key] <= 0)\n throw new Error(`${key} must be finite and positive`)\n for (const [name, value] of Object.entries({\n standoff,\n taperInset,\n exposedPadWidth,\n exposedPadLength,\n }))\n if (!Number.isFinite(value) || value < 0)\n throw new Error(`${name} must be finite and nonnegative`)\n if (!Number.isInteger(pinCount) || pinCount < 4 || pinCount % 2)\n throw new Error(\"pinCount must be even and at least 4\")\n const moldHeight = bodyHeight - standoff\n const reach = (leadSpan - bodyWidth) / 2\n const rowLength = (pinCount / 2 - 1) * pitch + leadWidth\n if (\n moldHeight <= leadThickness * 2 ||\n leadWidth >= pitch ||\n rowLength >= bodyLength - 2 * taperInset ||\n taperInset * 2 >= Math.min(bodyWidth, bodyLength) ||\n contactLength >= reach\n )\n throw new Error(\"Invalid mold, lead spacing, or terminal reach\")\n if (\n (exposedPadWidth === 0) !== (exposedPadLength === 0) ||\n exposedPadWidth >= bodyWidth - 2 * taperInset ||\n exposedPadLength >= bodyLength - 2 * taperInset\n )\n throw new Error(\"Exposed pad must fit inside the bottom mold face\")\n const midZ = standoff + moldHeight / 2\n const slice = Math.min(0.002, moldHeight / 100)\n const body = (\n <Hull>\n <Translate z={standoff + slice / 2}>\n <Cuboid\n size={[\n bodyWidth - 2 * taperInset,\n bodyLength - 2 * taperInset,\n slice,\n ]}\n />\n </Translate>\n <Translate z={midZ}>\n <Cuboid size={[bodyWidth, bodyLength, slice]} />\n </Translate>\n <Translate z={bodyHeight - slice / 2}>\n <Cuboid\n size={[\n bodyWidth - 2 * taperInset,\n bodyLength - 2 * taperInset,\n slice,\n ]}\n />\n </Translate>\n </Hull>\n )\n const dimpleRadius = Math.min(bodyWidth, bodyLength) * 0.045\n const dimpleDepth = Math.min(0.04, moldHeight / 10)\n // Smoothstep centerline, made from overlapping convex slices: positive-volume\n // solids in both React and vanilla renderers. Each root extends into the mold.\n const lead = (side: number, y: number) => {\n const outer = leadSpan / 2\n const root = bodyWidth / 2 - Math.min(bodyWidth / 8, 0.15)\n const bendStart = outer - contactLength\n const bendEnd = bodyWidth / 2 + Math.min(0.08, (reach - contactLength) / 4)\n const points: [number, number][] = [\n [outer - slice / 2, leadThickness / 2],\n [bendStart, leadThickness / 2],\n ]\n for (let i = 1; i <= 12; i++) {\n const t = i / 12\n points.push([\n bendStart + (bendEnd - bendStart) * t,\n leadThickness / 2 + (midZ - leadThickness / 2) * t * t * (3 - 2 * t),\n ])\n }\n points.push([root, midZ])\n const section = ([x, z]: [number, number]) => (\n <Translate offset={{ x: side * x, y, z }}>\n <Cuboid size={[slice, leadWidth, leadThickness]} />\n </Translate>\n )\n return (\n <Union>\n {points.slice(1).map((point, i) => (\n <Hull key={i}>\n {section(points[i]!)}\n {section(point)}\n </Hull>\n ))}\n </Union>\n )\n }\n return (\n <>\n <Colorize color=\"#353535\">\n <Subtract>\n {body}\n <Translate\n offset={{\n x: -bodyWidth / 2 + taperInset + dimpleRadius * 2,\n y: bodyLength / 2 - taperInset - dimpleRadius * 2,\n z: bodyHeight,\n }}\n >\n <Cylinder radius={dimpleRadius} height={dimpleDepth * 2} />\n </Translate>\n </Subtract>\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n {Array.from({ length: pinCount }, (_, i) =>\n lead(\n i < pinCount / 2 ? -1 : 1,\n ((pinCount / 2 - 1) / 2 - (i % (pinCount / 2))) * pitch,\n ),\n )}\n </Colorize>\n {exposedPadWidth > 0 && (\n <Colorize color=\"#bfc1c4\">\n <Translate z={(standoff + leadThickness) / 2}>\n <Cuboid\n size={[\n exposedPadWidth,\n exposedPadLength,\n standoff + leadThickness,\n ]}\n />\n </Translate>\n </Colorize>\n )}\n </>\n )\n}\n","import {\n createDualRowGullWing,\n type DualRowGullWingDimensions,\n} from \"./utils/DualRowGullWing\"\n/** Explicit SSOP physical outline (e.g. JEDEC MO-150), in mm. Copper land\n * dimensions do not identify the package. Pin 1 is at -X,+Y; Z=0 seats the feet.\n * Mold draft, bend curvature and the pin-1 dimple are visual approximations.\n */\nexport type SSOPProps = Omit<\n DualRowGullWingDimensions,\n \"exposedPadWidth\" | \"exposedPadLength\"\n>\nexport const SSOP = (props: SSOPProps) => createDualRowGullWing(props)\n","import { LGA } from \"../LGA\"\nimport { SSOP } from \"../SSOP\"\n\nexport interface BodyFootprintParameters {\n fn: string\n num_pins: number\n w: number\n h: number\n p: number\n pw: number\n pl: number\n grid?: { x: number; y: number }\n bodywidth?: number\n bodyheight?: number\n bodythickness?: number\n}\n\n/** Consume only fields validated by Footprinter. Body height is Y in its\n * schema; body thickness is Z. Terminal dimensions are still approximations\n * until physical terminal fields are added upstream. No part lookup is used.\n */\nexport function renderFootprinterBodyModel(p: BodyFootprintParameters) {\n if (\n p.bodywidth === undefined &&\n p.bodyheight === undefined &&\n p.bodythickness === undefined\n )\n return null\n if (p.fn === \"ssop\") {\n const bodyWidth = p.bodywidth ?? p.w * 0.55\n const bodyLength = p.bodyheight ?? (p.num_pins / 2 - 1) * p.p + p.pw + 0.4\n const thickness = p.bodythickness ?? 1\n const leadWidth = Math.min(p.pw, p.p * 0.5)\n const rowLength = (p.num_pins / 2 - 1) * p.p + leadWidth\n if (bodyLength <= rowLength)\n throw new Error(\"SSOP bodyheight must contain the lead row\")\n // Footprinter's SSOP row centers are w + 0.2 apart. Estimate the lead\n // tip within each copper land; this is not a physical lead-span token.\n const leadSpan = Math.max(p.w + 0.2 + p.pl / 2, bodyWidth + p.p)\n const standoff = Math.min(0.1, thickness / 10)\n return (\n <SSOP\n pinCount={p.num_pins}\n pitch={p.p}\n bodyWidth={bodyWidth}\n bodyLength={bodyLength}\n bodyHeight={thickness + standoff}\n standoff={standoff}\n leadSpan={leadSpan}\n leadWidth={leadWidth}\n leadThickness={Math.min(0.15, thickness / 4)}\n contactLength={Math.min(p.pl / 2, (leadSpan - bodyWidth) / 4)}\n taperInset={Math.min(0.12, (bodyLength - rowLength) / 4, bodyWidth / 8)}\n />\n )\n }\n if (p.fn === \"lga\") {\n const bodyWidth = p.bodywidth ?? p.w\n const bodyLength = p.bodyheight ?? p.h\n const thickness = p.bodythickness ?? 1\n const grid = p.grid!\n const landWidth = Math.min(p.pw, p.p / 2)\n const roomX = bodyWidth - ((grid.y - 1) * p.p + landWidth)\n const roomY = bodyLength - ((grid.x - 1) * p.p + landWidth)\n const landLength = Math.min(\n p.pl / 2,\n bodyWidth / 8,\n bodyLength / 8,\n roomX / 4,\n roomY / 4,\n )\n // Use short edge lands; copper land lengths do not measure metallization.\n // Keep them within the specified mold rather than treating copper as body.\n return (\n <LGA\n bodyWidth={bodyWidth}\n bodyLength={bodyLength}\n bodyHeight={thickness}\n landsPerSideX={grid.x}\n landsPerSideY={grid.y}\n pitch={p.p}\n landWidth={landWidth}\n landLength={landLength}\n edgeInset={0}\n landThickness={Math.min(0.015, thickness / 10)}\n />\n )\n }\n return null\n}\n","import { modelRendererRegistry } from \"./default-model-registry\"\nimport { renderFootprinterBodyModel } from \"./utils/FootprinterBodyModels\"\nimport { fp } from \"@tscircuit/footprinter\"\nimport { mp } from \"@tscircuit/modelprinter\"\nimport { Rotate, Translate } from \"jscad-fiber\"\nimport { Dip } from \"./DualInlinePackage\"\nimport { Tssop } from \"./Tssop\"\nimport { MSOP } from \"./MSOP\"\nimport { A0402 } from \"./A0402\"\nimport { A0603 } from \"./A0603\"\nimport { SmdLED } from \"./SmdLED\"\nimport { A0805 } from \"./A0805\"\nimport { QFP } from \"./qfp\"\nimport { PinRow } from \"./PinRow\"\nimport QFN from \"./qfn\"\nimport SOT235 from \"./SOT-235\"\nimport { SOT233P } from \"./SOT-23-3P\"\nimport { SOT23W } from \"./SOT-23W\"\nimport { A0201 } from \"./A0201\"\nimport { A01005 } from \"./A01005\"\nimport { A1206 } from \"./A1206\"\nimport { A1210 } from \"./A1210\"\nimport { A2010 } from \"./A2010\"\nimport { A2512 } from \"./A2512\"\nimport { FemaleHeaderRow } from \"./FemaleHeaderRow\"\nimport { PushButton } from \"./PushButton\"\nimport { SOIC } from \"./SOIC\"\nimport { VSSOP } from \"./VSSOP\"\nimport { SOD523 } from \"./SOD523\"\nimport { SOD882 } from \"./SOD882\"\nimport { SMA } from \"./SMA\"\nimport { SMB } from \"./SMB\"\nimport { SMC } from \"./SMC\"\nimport { SMF } from \"./SMF\"\nimport { SOD123F } from \"./sod-123F\"\nimport { SOD123FL } from \"./sod-123FL\"\nimport { SOD123W } from \"./sod-123W\"\nimport { SOD123 } from \"./sod-123\"\nimport { SOD128 } from \"./sod-128\"\nimport { SOD923 } from \"./SOD-923\"\nimport { SOT223 } from \"./SOT-223\"\nimport TQFP from \"./tqfp\"\nimport { SOT323 } from \"./SOT-323\"\nimport { LQFP } from \"./lqfp\"\nimport { SOT723 } from \"./SOT-723\"\nimport { DFN } from \"./dfn\"\nimport { HC49 } from \"./hc49\"\nimport { MicroMELF } from \"./MicroMELF\"\nimport { MINIMELF } from \"./MINIMELF\"\nimport { MELF } from \"./MELF\"\nimport { MS012 } from \"./ms012\"\nimport { MS013 } from \"./ms013\"\nimport { TO220 } from \"./TO220\"\nimport { SOT457 } from \"./SOT-457\"\nimport { SOT963 } from \"./SOT-963\"\nimport { TO92 } from \"./TO92\"\nimport SOT363 from \"./SOT-363\"\nimport { SOT886 } from \"./SOT-886\"\nimport { SOD323 } from \"./sod-323\"\nimport { SOD323F } from \"./sod-323F\"\nimport { SOD323FL } from \"./sod-323FL\"\nimport { AxialCapacitor } from \"./AxialCapacitor\"\nimport { StampBoard } from \"./stampboard\"\nimport { MountedPcbModule } from \"./MountedPcbModule\"\nimport SOD723 from \"./SOD723\"\nimport { JSTZH1_5mm } from \"./JSTZH1_5mm\"\nimport { JSTPH2_0mm } from \"./JSTPH2_0mm\"\nimport { JSTXH2_5mm } from \"./JSTXH2_5mm\"\nimport { JstSh, isJstShFootprint } from \"./JstSh\"\nimport { Crystal } from \"./Crystal\"\nimport { FPC } from \"./FPC\"\nimport { SmdPinHeader } from \"./SmdPinHeader\"\nimport { mm } from \"@tscircuit/mm\"\nimport { getPlatedHoleCenters } from \"./utils/getPlatedHoleCenters\"\nimport { getSmtPadRects } from \"./utils/getSmtPadRects\"\nimport { GullWingBody } from \"./GullWingBody\"\nimport { ParametricChip } from \"./ParametricChip\"\nimport { Led5050 } from \"./Led5050\"\nimport { Led2835 } from \"./Led2835\"\nimport { RJ45 } from \"./RJ45\"\nimport { DPAK } from \"./DPAK\"\nimport { ElectrolyticCapacitor } from \"./ElectrolyticCapacitor\"\nimport { Potentiometer } from \"./Potentiometer\"\nimport { SmdPushButton } from \"./SmdPushButton\"\nimport { SmdSlideSwitch } from \"./SmdSlideSwitch\"\nimport { SOT563 } from \"./SOT-563\"\nimport { BGA } from \"./BGA\"\nimport { UsbCMidmount } from \"./UsbCMidmount\"\nimport { SOT143 } from \"./SOT143\"\n\n/**\n * Outputs a 3d model for any [footprinter string](https://github.com/tscircuit/footprinter)\n */\n\nexport const Footprinter3d = ({ footprint }: { footprint: string }) => {\n const modelFn = mp.string(footprint.split(\"_\", 1)[0]!).params().fn\n if (mp.getModelNames().includes(modelFn)) {\n const model = mp.string(footprint).json()\n const renderer = modelRendererRegistry.get(model.fn)\n if (renderer) {\n return renderer.render(model)\n }\n }\n\n // Normalize jst formats\n let normalizedFootprint = footprint\n if (footprint.startsWith(\"jstzh1_5mm\")) {\n const pinMatch = footprint.match(/jstzh1_5mm(\\d+)?/)\n const numPins = pinMatch && pinMatch[1] ? pinMatch[1] : \"7\"\n normalizedFootprint = `zh${numPins}`\n } else if (footprint.startsWith(\"jstph2_0mm\")) {\n const pinMatch = footprint.match(/jstph2_0mm(\\d+)?/)\n const numPins = pinMatch && pinMatch[1] ? pinMatch[1] : \"2\"\n normalizedFootprint = `jst${numPins}_ph`\n } else if (footprint.startsWith(\"jstxh2_5mm\")) {\n const pinMatch = footprint.match(/jstxh2_5mm(\\d+)?/)\n const numPins = pinMatch && pinMatch[1] ? pinMatch[1] : \"2\"\n normalizedFootprint = `jst${numPins}_xh`\n }\n\n const fpJson = fp.string(normalizedFootprint).json() as unknown as {\n w: number\n p: number\n bodywidth?: number\n bodyheight?: number\n bodythickness?: number\n bh?: number\n h: number\n pl: number\n pw: number\n ph?: number\n px?: number\n py?: number\n num_pins: number\n fn: string\n zh?: boolean\n xh?: boolean\n thermalpad?: { x: number; y: number }\n imperial: String\n male: boolean\n female: boolean\n id: number //innerDiameter\n od: number //outerDiameter\n invert?: boolean\n smd?: boolean\n surface_mount?: boolean\n rightangle?: boolean\n left?: number\n right?: number\n top?: number\n bottom?: number\n innerhole?: boolean\n innerholeedgedistance?: number\n nopin?: boolean\n screen?: boolean\n screenwidth?: number\n screenheight?: number\n screencenteroffsetx?: number\n screencenteroffsety?: number\n staggered?: boolean\n reverse?: boolean\n toppl?: number\n bottompl?: number\n mpx?: number\n mpy?: number\n mounttop?: boolean\n mpw?: number\n mpl?: number\n ledpins?: boolean\n firstpinleft?: boolean\n firstpintop?: boolean\n shieldx?: number\n shieldy?: number\n shieldid?: number\n shieldod?: number\n holex?: number\n holey?: number\n holed?: number\n ledx?: number\n ledp?: number\n ledy?: number\n bodyy?: number\n // TO-252 / TO-263: the exposed tab pad, and the lead-pad-to-tab-pad span\n tabw?: number\n tabh?: number\n span?: number\n // radial / electrolytic can\n d?: number\n // potentiometer body length along Y\n ca?: number\n // no-lead packages: exposed thermal pad, and whether leads sit outside\n // the body outline (QFP) or flush under it (QFN)\n ep?: boolean | { x: number; y: number }\n epw?: number\n eph?: number\n legsoutside?: boolean\n // grid packages (bga, lga, vson): pads by row/column\n grid?: { x: number; y: number }\n // led2835's two differently-sized pads\n p1w?: number\n p2w?: number\n p1x?: number\n p2x?: number\n }\n\n const colorMatch = footprint.match(/_color\\(([^)]+)\\)/)\n const color = colorMatch ? colorMatch[1] : undefined\n\n /**\n * footprinter reports a dimension as either a number or a string with a\n * unit (`\"4.20mm\"`), and omits it entirely when the footprint does not\n * define one. `mm` is the parser footprinter itself uses, so a body agrees\n * with its pads by construction; this only adds the missing case, because\n * `mm(undefined)` throws.\n */\n const dim = (value: unknown, fallback: number): number => {\n if (value === undefined || value === null) return fallback\n const parsed = mm(value as any)\n return Number.isFinite(parsed) ? parsed : fallback\n }\n\n const bodyModel = renderFootprinterBodyModel(fpJson)\n if (bodyModel) return bodyModel\n\n switch (fpJson.fn) {\n case \"crystal\":\n return (\n <Crystal\n horizontalPadPitch={fpJson.px}\n verticalPadPitch={fpJson.py}\n padWidth={fpJson.pw}\n padHeight={fpJson.ph}\n />\n )\n case \"dip\":\n return (\n <Dip numPins={fpJson.num_pins} pitch={fpJson.p} bodyWidth={fpJson.w} />\n )\n case \"axial\":\n return <AxialCapacitor pitch={fpJson.p} />\n case \"tssop\":\n return (\n <Tssop\n pinCount={fpJson.num_pins}\n leadLength={fpJson.pl}\n leadWidth={fpJson.pw}\n pitch={fpJson.p}\n bodyWidth={fpJson.w}\n />\n )\n case \"msop\":\n return (\n <MSOP\n pinCount={fpJson.num_pins}\n padContactLength={fpJson.pl}\n leadWidth={fpJson.pw}\n pitch={fpJson.p}\n bodyWidth={fpJson.w}\n />\n )\n case \"vssop\":\n return (\n <VSSOP\n pinCount={fpJson.num_pins as 8 | 10}\n leadLength={fpJson.pl}\n leadWidth={fpJson.pw}\n pitch={fpJson.p}\n bodyWidth={fpJson.w}\n bodyLength={fpJson.h}\n />\n )\n case \"qfp\":\n return (\n <QFP\n pinCount={fpJson.num_pins}\n pitch={fpJson.p}\n leadWidth={fpJson.pw}\n padContactLength={fpJson.pl}\n bodyWidth={fpJson.w}\n />\n )\n case \"tqfp\":\n return <TQFP />\n case \"lqfp\":\n return <LQFP pinCount={fpJson.num_pins} />\n case \"qfn\": {\n const hasThermalPad =\n typeof fpJson.thermalpad?.x === \"number\" &&\n typeof fpJson.thermalpad?.y === \"number\"\n return (\n <QFN\n num_pins={fpJson.num_pins}\n bodyWidth={fpJson.w}\n bodyLength={fpJson.h}\n pitch={fpJson.p}\n padLength={fpJson.pl}\n padWidth={fpJson.pw}\n thermalPadSize={\n hasThermalPad\n ? {\n width: fpJson.thermalpad!.x,\n length: fpJson.thermalpad!.y,\n }\n : undefined\n }\n />\n )\n }\n\n case \"dfn\": {\n const hasThermalPad =\n typeof fpJson.thermalpad?.x === \"number\" &&\n typeof fpJson.thermalpad?.y === \"number\"\n return (\n <DFN\n num_pins={fpJson.num_pins}\n bodyWidth={fpJson.w}\n bodyLength={fpJson.h}\n pitch={fpJson.p}\n padLength={fpJson.pl}\n padWidth={fpJson.pw}\n thermalPadSize={\n hasThermalPad\n ? {\n width: fpJson.thermalpad!.x,\n length: fpJson.thermalpad!.y,\n }\n : undefined\n }\n />\n )\n }\n\n case \"pinrow\":\n case \"headermodule\": {\n // Parse rows parameter from footprint string (e.g., \"pinrow4_rows2\")\n const rowsMatch = footprint.match(/_rows(\\d+)/)\n const rows = rowsMatch && rowsMatch[1] ? parseInt(rowsMatch[1], 10) : 1\n\n if (fpJson.male)\n return (\n <PinRow\n numberOfPins={fpJson.num_pins}\n pitch={fpJson.p}\n invert={fpJson.invert}\n rows={rows}\n smd={fpJson.smd || fpJson.surface_mount}\n rightangle={fpJson.rightangle}\n />\n )\n if (fpJson.female)\n return (\n <FemaleHeaderRow\n numberOfPins={fpJson.num_pins}\n pitch={fpJson.p}\n rows={rows}\n />\n )\n }\n case \"smdpinheader\":\n return (\n <SmdPinHeader\n numberOfPins={fpJson.num_pins}\n pitch={fpJson.p}\n bodyWidth={fpJson.bh}\n />\n )\n case \"led5050\":\n return <Led5050 color={color} />\n\n case \"led\": {\n const imperial = String(fpJson.imperial)\n if (imperial === \"0402\" || imperial === \"0603\" || imperial === \"0805\")\n return <SmdLED footprint={imperial} color={color} />\n break\n }\n\n case \"cap\": {\n switch (fpJson.imperial) {\n case \"0402\":\n return <A0402 color=\"#856c4d\" />\n case \"0603\":\n return <A0603 color=\"#856c4d\" />\n case \"0805\":\n return <A0805 color=\"#856c4d\" />\n case \"0201\":\n return <A0201 color=\"#856c4d\" />\n case \"01005\":\n return <A01005 color=\"#856c4d\" />\n case \"1206\":\n return <A1206 color=\"#856c4d\" />\n case \"1210\":\n return <A1210 color=\"#856c4d\" />\n case \"2010\":\n return <A2010 color=\"#856c4d\" />\n case \"2512\":\n return <A2512 color=\"#856c4d\" />\n }\n // No EIA size to look up: the pads are the only description of the part,\n // so fall through to the parametric chip below. Without this `break` the\n // case ran on into `sot235` and a capacitor rendered as a transistor.\n break\n }\n case \"sot23\":\n switch (fpJson.num_pins) {\n case 3:\n return <SOT233P color={color} />\n case 5:\n return <SOT235 />\n }\n break\n case \"sot25\":\n // SOT-23-5: the same 2.9 x 1.6 body as `sot23` with five pins.\n return <SOT235 />\n case \"sot\":\n case \"sot343\": {\n // Two packages whose LEAD COUNT does not match the body they would\n // otherwise be aliased to: footprinter's bare `sot` is a six-pin SOT-23\n // (SOT235 draws five) and `sot343` is SC-70-4 (SOT363 draws six). A\n // render makes that obvious — six pads under five leads — so both build\n // their leads from the pads instead.\n //\n // The BODY, though, is the designation's, not the pads': SOT-23-6 is\n // 1.60 x 2.90 and SC-70-4 is 1.25 x 2.00, per KiCad's F.Fab outlines\n // (`SOT-23-6`, `SOT-343_SC-70-4`) — the same reference footprinter's\n // kicad-parity tests use. Deriving those from the pad span instead put\n // SC-70-4 10% under size.\n const isSc70 = fpJson.fn === \"sot343\"\n return (\n <GullWingBody\n pads={getSmtPadRects(normalizedFootprint)}\n bodyWidth={isSc70 ? 1.25 : 1.6}\n bodyLength={isSc70 ? 2.0 : 2.9}\n bodyHeight={isSc70 ? 1.1 : 1.3}\n />\n )\n }\n case \"sot563\":\n return <SOT563 />\n case \"sot89\": {\n // SOT-89 is a SOT-223 at roughly a third of the volume: three leads one\n // side, one wide tab lead the other. Aliasing it to SOT-223 outright\n // would report a 6.5 x 3.5 body where there is a 4.5 x 2.5 one.\n const padSpan = dim(fpJson.w, 4.2)\n return (\n <SOT223\n fullWidth={padSpan}\n bodyWidth={padSpan * 0.6}\n bodyLength={dim(fpJson.h, 4.8) * 0.94}\n bodyHeight={1.5}\n leadWidth={dim(fpJson.pw, 0.48)}\n tabLeadWidth={dim(fpJson.pw, 0.48) * 2}\n padPitch={dim(fpJson.p, 1.5)}\n leadHeight={0.66}\n />\n )\n }\n case \"sot457\":\n return <SOT457 />\n case \"smdslideswitch\":\n return <SmdSlideSwitch footprint={normalizedFootprint} />\n case \"usbcmidmount\":\n return <UsbCMidmount footprint={normalizedFootprint} />\n case \"sot143\":\n return <SOT143 footprint={normalizedFootprint} />\n case \"sot223\":\n return <SOT223 />\n case \"sot23w\":\n return <SOT23W />\n case \"sot323\":\n return <SOT323 />\n case \"sod323f\":\n return <SOD323F />\n case \"sod323fl\":\n return <SOD323FL />\n case \"sot363\":\n return <SOT363 />\n case \"sot886\":\n return <SOT886 />\n case \"sot963\":\n return <SOT963 />\n case \"pushbutton\":\n return (\n <PushButton\n width={fpJson.w}\n length={fpJson.h}\n innerDiameter={fpJson.id}\n />\n )\n case \"jst\":\n if (isJstShFootprint(normalizedFootprint)) {\n return <JstSh footprint={normalizedFootprint} />\n }\n if (fpJson.zh) {\n return <JSTZH1_5mm numPins={fpJson.num_pins} />\n }\n if (fpJson.ph) {\n return <JSTPH2_0mm numPins={fpJson.num_pins} />\n }\n if (fpJson.xh) {\n return <JSTXH2_5mm numPins={fpJson.num_pins} />\n }\n break\n case \"fpc\":\n return (\n <FPC\n pinCount={fpJson.num_pins}\n pitch={fpJson.p}\n padWidth={fpJson.pw}\n padLength={fpJson.pl}\n staggered={fpJson.staggered}\n reverse={fpJson.reverse}\n rowPitch={fpJson.py}\n topPadLength={fpJson.toppl}\n bottomPadLength={fpJson.bottompl}\n mountPadPitchX={fpJson.mpx}\n mountPadOffsetY={fpJson.mpy}\n mountTop={fpJson.mounttop}\n mountPadWidth={fpJson.mpw}\n mountPadLength={fpJson.mpl}\n />\n )\n case \"rj45\":\n return (\n <RJ45\n bodyWidth={fpJson.w}\n bodyDepth={fpJson.h}\n bodyCenterY={fpJson.bodyy}\n ledPins={fpJson.ledpins || fpJson.num_pins === 14}\n firstPinLeft={fpJson.firstpinleft}\n firstPinTop={fpJson.firstpintop}\n signalPitch={fpJson.p}\n signalRowPitch={fpJson.py}\n signalHoleDiameter={fpJson.id}\n shieldPinX={fpJson.shieldx}\n shieldPinY={fpJson.shieldy}\n shieldHoleDiameter={fpJson.shieldid}\n locatorHoleX={fpJson.holex}\n locatorHoleY={fpJson.holey}\n locatorHoleDiameter={fpJson.holed}\n ledPinX={fpJson.ledx}\n ledPinPitch={fpJson.ledp}\n ledPinY={fpJson.ledy}\n />\n )\n case \"soic\":\n case \"sop8\":\n case \"ssop\":\n // SOP and SSOP are SOIC with different lead spans, and SOIC is already\n // driven entirely by the footprint's own numbers.\n return (\n <SOIC\n pinCount={fpJson.num_pins}\n leadLength={fpJson.pl}\n leadWidth={fpJson.pw}\n pitch={fpJson.p}\n bodyWidth={fpJson.w}\n />\n )\n case \"son\":\n case \"wson\":\n case \"vson\": {\n // Small-outline no-lead: terminals on two opposite edges, which is a\n // DFN. `vson` is the odd one: it describes its body outline as `grid`\n // (a SIZE, e.g. grid2x3mm) while `w` is the row span. `son` and `wson`\n // give w/h directly.\n const bodyWidth =\n fpJson.fn === \"vson\" ? dim(fpJson.grid?.x, 3) : dim(fpJson.w, 3)\n const bodyLength =\n fpJson.fn === \"vson\" ? dim(fpJson.grid?.y, 3) : dim(fpJson.h, 3)\n const thermalPadWidth = dim(fpJson.epw, 0)\n const thermalPadLength = dim(fpJson.eph, 0)\n const padLength = fpJson.pl !== undefined ? dim(fpJson.pl, 0) : undefined\n const padWidth = fpJson.pw !== undefined ? dim(fpJson.pw, 0) : undefined\n\n // WHICH edges the terminals sit on is a property of the footprint, not\n // of the family: `son` and `vson` put their two rows left and right,\n // `wson` puts them top and bottom. DFN always builds left and right, so\n // a `wson` came out turned 90 degrees from its own pads, with terminals\n // along the two edges the footprint has none on. Read the axis from the\n // pads, ignoring the thermal pad, which is not a row member.\n const signalPads = getSmtPadRects(normalizedFootprint).filter(\n (pad) => Number(pad.pin ?? 0) <= fpJson.num_pins,\n )\n const distinct = (values: number[]) =>\n new Set(values.map((value) => value.toFixed(3))).size\n const rowsAlongY =\n signalPads.length > 2 &&\n distinct(signalPads.map((pad) => pad.y)) === 2 &&\n distinct(signalPads.map((pad) => pad.x)) > 2\n\n const dfn = (\n <DFN\n num_pins={fpJson.num_pins}\n // Built in DFN's own frame and then turned to match the footprint,\n // so the body's X and Y swap with it, and the thermal pad's too.\n bodyWidth={rowsAlongY ? bodyLength : bodyWidth}\n bodyLength={rowsAlongY ? bodyWidth : bodyLength}\n pitch={dim(fpJson.p, 0.5)}\n padLength={padLength}\n padWidth={padWidth}\n thermalPadSize={\n fpJson.ep && thermalPadWidth > 0 && thermalPadLength > 0\n ? {\n width: rowsAlongY ? thermalPadLength : thermalPadWidth,\n length: rowsAlongY ? thermalPadWidth : thermalPadLength,\n }\n : undefined\n }\n />\n )\n return rowsAlongY ? (\n <Rotate rotation={[0, 0, \"90deg\"]}>{dfn}</Rotate>\n ) : (\n dfn\n )\n }\n case \"mlp\":\n case \"lga\":\n case \"quad\": {\n // Quad packages whose leads sit under the body are QFNs; footprinter's\n // `legsoutside` says when they stick out, which is a QFP. `lga` has no\n // leads at all, so its flush lands render as the smallest QFN pads.\n if (fpJson.legsoutside) {\n return (\n <QFP\n pinCount={fpJson.num_pins}\n pitch={dim(fpJson.p, 0.5)}\n leadWidth={dim(fpJson.pw, 0.25)}\n padContactLength={dim(fpJson.pl, 0.25)}\n bodyWidth={dim(fpJson.w, 6)}\n />\n )\n }\n // NOT `grid`: for these it is a pad COUNT per side (lga14 is 4x3 pads),\n // not a size. Reading it as millimetres gave a 4 x 3 body for a part\n // that is 2.4 x 2.9 — wrong by 60%, and invisible in a render.\n return (\n <QFN\n num_pins={fpJson.num_pins}\n bodyWidth={dim(fpJson.w, 6)}\n bodyLength={dim(fpJson.h, 6)}\n pitch={dim(fpJson.p, 0.5)}\n padLength={dim(fpJson.pl, 0.25)}\n padWidth={dim(fpJson.pw, 0.25)}\n />\n )\n }\n case \"bga\": {\n // BGA.tsx has been in this repo, unreferenced, the whole time.\n const pitch = dim(fpJson.p, 0.8)\n const columns = fpJson.grid?.x ?? 8\n const rows = fpJson.grid?.y ?? 8\n return (\n <BGA\n ballPitch={pitch}\n ballColumns={columns}\n ballRows={rows}\n ballDiameter={pitch * 0.625}\n packageWidth={columns * pitch}\n packageLength={rows * pitch}\n />\n )\n }\n case \"sod523\":\n return <SOD523 />\n case \"sod723\":\n return <SOD723 />\n case \"sod882\":\n return <SOD882 />\n case \"sma\":\n return <SMA />\n case \"smb\":\n return <SMB />\n case \"smc\":\n return <SMC />\n case \"smf\":\n return <SMF />\n case \"sod123\":\n return <SOD123 />\n case \"sod123f\":\n return <SOD123F />\n case \"sod123fl\":\n return <SOD123FL />\n case \"sod123w\":\n return <SOD123W />\n case \"sod110\":\n // SOD-110 is NOT a SOD-123W: 2.10 x 1.40 against 2.60 x 1.70 (KiCad\n // F.Fab, D_SOD-110 and Nexperia_CFP3_SOD-123W). Same construction, so\n // the same component — at its own size.\n return <SOD123W bodyWidth={2.1} bodyLength={1.4} />\n case \"sod128\":\n return <SOD128 />\n case \"sod323\":\n return <SOD323 />\n case \"sod323w\":\n return <SOD323 />\n case \"sod80\":\n // SOD-80 is the MiniMELF glass body: 3.5 long, 1.5 across.\n return <MINIMELF />\n case \"sod882d\":\n return <SOD882 />\n case \"smbf\":\n // SMBF is SMB's flat (low-profile) variant; same outline.\n return <SMB />\n case \"led2835\":\n return (\n <Led2835\n color={color}\n bodyWidth={dim(fpJson.w, 3.5)}\n bodyLength={dim(fpJson.h, 2.8)}\n pad1X={dim(fpJson.p1x, -0.9)}\n pad1Width={dim(fpJson.p1w, 2.2)}\n pad2X={dim(fpJson.p2x, 1.375)}\n pad2Width={dim(fpJson.p2w, 1.25)}\n padLength={dim(fpJson.ph, 2.2)}\n />\n )\n case \"electrolytic\":\n case \"radial\": {\n // A radial can. The diameter is the one dimension that matters for an\n // enclosure cavity and it is not always in the json: `electrolytic`\n // reports `d`, `radial` puts it in the NAME (radial_d5_p2.5). Falling\n // back to twice the lead pitch matches both of footprinter's own\n // defaults, and the height is derived — see ElectrolyticCapacitor.\n const pitch = dim(fpJson.p, 2.5)\n const namedDiameter = footprint.match(/_d([\\d.]+)/)\n const diameter =\n fpJson.d !== undefined\n ? dim(fpJson.d, pitch * 2)\n : namedDiameter\n ? Number(namedDiameter[1])\n : pitch * 2\n return <ElectrolyticCapacitor diameter={diameter} leadPitch={pitch} />\n }\n case \"potentiometer\":\n return (\n <Potentiometer\n bodyWidth={dim(fpJson.w, 5.35)}\n bodyLength={dim(fpJson.ca, 14)}\n bodyHeight={dim(fpJson.h, 4)}\n leads={getPlatedHoleCenters(normalizedFootprint)}\n />\n )\n case \"smdpushbutton\":\n return (\n <SmdPushButton\n padSpanX={dim(fpJson.px, 4.2)}\n padSpanY={dim(fpJson.py, 2.15)}\n padWidth={dim(fpJson.pw, 1.05)}\n padLength={dim(fpJson.ph, 0.7)}\n />\n )\n case \"breakoutheaders\": {\n // A breakout board carries a through-hole header down each side; the\n // headers are the tall part, and PinRow already models one.\n const pitch = dim(fpJson.p, 2.54)\n const halfWidth = dim(fpJson.w, 10) / 2\n const sides: Array<{ x: number; pins: number; key: string }> = [\n { x: -halfWidth, pins: fpJson.left ?? 0, key: \"left\" },\n { x: halfWidth, pins: fpJson.right ?? 0, key: \"right\" },\n ]\n return (\n <>\n {sides\n .filter(({ pins }) => pins > 0)\n .map(({ x, pins, key }) => (\n <Translate center={[x, 0, 0]} key={key}>\n <Rotate rotation={[0, 0, \"90deg\"]}>\n <PinRow numberOfPins={pins} pitch={pitch} />\n </Rotate>\n </Translate>\n ))}\n </>\n )\n }\n case \"sod923\":\n return <SOD923 />\n case \"hc49\":\n return <HC49 />\n case \"micromelf\":\n return <MicroMELF />\n case \"minimelf\":\n return <MINIMELF />\n case \"melf\":\n return <MELF />\n case \"ms012\":\n return (\n <MS012\n pinCount={fpJson.num_pins}\n padContactLength={fpJson.pl}\n leadWidth={fpJson.pw}\n pitch={fpJson.p}\n />\n )\n case \"ms013\":\n return (\n <MS013\n pinCount={fpJson.num_pins}\n padContactLength={fpJson.pl}\n leadWidth={fpJson.pw}\n pitch={fpJson.p}\n />\n )\n case \"sot723\":\n return <SOT723 />\n case \"to220\":\n return <TO220 leads={getPlatedHoleCenters(normalizedFootprint)} />\n case \"to220f\":\n // TO-220F is the fully-moulded (isolated) variant: same outline, tab\n // encapsulated rather than exposed.\n return (\n <TO220 mouldedTab leads={getPlatedHoleCenters(normalizedFootprint)} />\n )\n case \"to92\":\n return <TO92 leads={getPlatedHoleCenters(normalizedFootprint)} />\n case \"to92l\":\n case \"to92s\": {\n // Both are TO-92 at a different size, and the size is the whole reason\n // they are separate footprints: `to92l` is 4.8mm across, `to92s` 2.5mm.\n // The footprint's two extents are the cylinder and the flat-cut face.\n //\n // The lead PATTERN differs too, and is not in the json: `to92s` is\n // inline where `to92` is staggered, and `to92l` puts pin 1 at the\n // origin rather than centring the group. Taking the holes themselves is\n // the only way all three line up.\n const across = dim(fpJson.w, 4.8)\n const along = dim(fpJson.h, 4.0)\n const diameter = Math.max(across, along)\n return (\n <TO92\n bodyDiameter={diameter}\n flatCut={Math.max(diameter - Math.min(across, along), 0.4)}\n leads={getPlatedHoleCenters(normalizedFootprint)}\n />\n )\n }\n case \"to252\":\n case \"dpak\":\n case \"to263\":\n case \"d2pak\": {\n // TO-252/DPAK and TO-263/D2PAK are one construction at two sizes: a\n // moulded body on a large exposed tab, leads leaving the far face. The\n // footprint is asymmetric (leads at -span/2, tab at +span/2), so the\n // body sits over the TAB, not over the origin.\n const isD2Pak = fpJson.fn === \"to263\" || fpJson.fn === \"d2pak\"\n const tabWidth = dim(fpJson.tabw, isD2Pak ? 8.38 : 6.2)\n // The tab's own size, not the tab PAD's: footprinter draws a 10.7mm pad\n // for a TO-263 whose package is 10.0 across (KiCad TO-263-2 F.Fab), and\n // a body may not inherit a land's solder allowance.\n const tabLength = Math.min(\n dim(fpJson.tabh, isD2Pak ? 10 : 5.8),\n isD2Pak ? 10 : 6.5,\n )\n return (\n <DPAK\n bodyWidth={tabWidth}\n bodyLength={dim(fpJson.w, isD2Pak ? 10.1 : 6.6)}\n bodyHeight={isD2Pak ? 4.4 : 2.3}\n tabWidth={tabWidth}\n tabLength={tabLength}\n span={dim(fpJson.span, isD2Pak ? 10.21 : 6.85)}\n pitch={dim(fpJson.p, isD2Pak ? 2.54 : 2.29)}\n leadWidth={dim(fpJson.pw, 1.5)}\n leadContactLength={dim(fpJson.pl, 3)}\n />\n )\n }\n case \"stampboard\":\n case \"stampreceiver\":\n return (\n <StampBoard\n bodyWidth={fpJson.w}\n leadsLeft={fpJson.left}\n leadsRight={fpJson.right}\n leadsTop={fpJson.top}\n leadsBottom={fpJson.bottom}\n leadsPitch={fpJson.p}\n leadWidth={fpJson.pw}\n leadLength={fpJson.pl}\n innerHoles={fpJson.innerhole}\n innerHoleEdgeDistance={fpJson.innerholeedgedistance}\n />\n )\n case \"mountedpcbmodule\": {\n const rows = (fpJson as any).rows ?? 1\n const pinRowSide = (fpJson as any).pinRowSide ?? \"left\"\n const holeInset = (fpJson as any).holeInset\n const width = (fpJson as any).width\n const height = (fpJson as any).height\n const pinRow = (fpJson as any).pinrow\n const pinRowHoleEdgeToEdgeDist = (fpJson as any).pinRowHoleEdgeToEdgeDist\n const holes = Array.isArray((fpJson as any).holes)\n ? (fpJson as any).holes\n : []\n\n return (\n <MountedPcbModule\n numPins={pinRow}\n rows={rows}\n p={fpJson.p}\n id={fpJson.id}\n od={fpJson.od}\n width={width}\n height={height}\n pinRowSide={pinRowSide}\n holes={holes}\n holeInset={holeInset}\n pinRowHoleEdgeToEdgeDist={pinRowHoleEdgeToEdgeDist}\n nopin={fpJson.nopin}\n female={fpJson.female}\n screen={fpJson.screen}\n screenWidth={fpJson.screenwidth}\n screenHeight={fpJson.screenheight}\n screenCenterOffsetX={fpJson.screencenteroffsetx}\n screenCenterOffsetY={fpJson.screencenteroffsety}\n />\n )\n }\n }\n\n switch (fpJson.imperial) {\n case \"0402\":\n return <A0402 color={color} />\n case \"0603\":\n return <A0603 color={color} />\n case \"0805\":\n return <A0805 color={color} />\n case \"0201\":\n return <A0201 color={color} />\n case \"01005\":\n return <A01005 color={color} />\n case \"1206\":\n return <A1206 color={color} />\n case \"1210\":\n return <A1210 color={color} />\n case \"2010\":\n return <A2010 color={color} />\n case \"2512\":\n return <A2512 color={color} />\n }\n\n // A chip named by its pads rather than by an EIA size: `res_p0.8656mm_...`\n // and `cap_p0.8402mm_...` carry no `imperial`, so neither switch above can\n // match, and both used to end at `return null` -- an empty model, which\n // downstream renderers drop silently, taking the component off the board.\n //\n // Restricted to the two-terminal chip functions on purpose. Plenty of other\n // footprints carry a `p`, and a pin header is not a chip.\n if (\n (fpJson.fn === \"res\" || fpJson.fn === \"cap\") &&\n fpJson.p !== undefined &&\n fpJson.ph !== undefined\n ) {\n // `mm` is the parser footprinter itself uses on these same strings, so the\n // body agrees with the pads by construction -- including the inch forms\n // (`res_p0.1in_...`), which footprinter passes through unconverted.\n const padPitch = mm(fpJson.p)\n const padHeight = mm(fpJson.ph)\n if (Number.isFinite(padPitch) && Number.isFinite(padHeight)) {\n return (\n <ParametricChip\n padPitch={padPitch}\n padHeight={padHeight}\n color={color ?? (fpJson.fn === \"cap\" ? \"#856c4d\" : undefined)}\n />\n )\n }\n }\n\n return null\n}\n","import { componentMaterials } from \"./materials\"\nimport { Polygon, ExtrudeLinear, Rotate, Translate, Union } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\nimport { range } from \"./utils/range\"\nimport { getExpandedStroke } from \"./utils/getExpandedStroke\"\n\n// DIP components look like this:\n// https://github.com/nophead/NopSCADlib/raw/master/tests/png/dip.png\n\n// M 20 105 L 20 109 L 20 102 L 26 102 L 26 109 L 24 111 L 24 118 L 22 118 L 22 111 L 20 109\n\nconst normalizeOnY = (points: { x: number; y: number }[]) => {\n const minX = Math.min(...points.map((p) => p.x))\n const maxX = Math.max(...points.map((p) => p.x))\n const minY = Math.min(...points.map((p) => p.y))\n const maxY = Math.max(...points.map((p) => p.y))\n const height = maxY - minY\n const factor = 5.47 / height\n return points.map((p) => ({\n x: (p.x - minX - (maxX - minX) / 2) * factor,\n y: (p.y - minY) * factor,\n }))\n}\n\nconst svgPathPoints = normalizeOnY([\n { x: 20, y: 105 },\n { x: 20, y: 109 },\n { x: 20, y: 102 },\n { x: 26, y: 102 },\n { x: 26, y: 109 },\n { x: 24, y: 111 },\n { x: 24, y: 118 },\n { x: 22, y: 118 },\n { x: 22, y: 111 },\n { x: 20, y: 109 },\n])\n\nconst DIP_PIN_HEIGHT = 5.47\nconst heightAboveSurface = 0.5\n\nexport const DipPinLeg = ({ x, y, z }: { x: number; y: number; z: number }) => {\n const isRotated = x > 0\n return (\n <>\n <Translate\n material={componentMaterials.tinnedLead}\n offset={{ x: x + 0.25 / 2, y, z: z }}\n >\n <Rotate rotation={[\"-90deg\", 0, \"90deg\"]}>\n <ExtrudeLinear height={0.25}>\n <Polygon\n points={svgPathPoints\n .slice()\n .reverse()\n .map((p) => [p.x, p.y])}\n />\n </ExtrudeLinear>\n </Rotate>\n </Translate>\n <Translate\n offset={{\n x: x,\n y: y + (isRotated ? 1 : -1),\n z: z,\n }}\n >\n <Rotate rotation={[\"-90deg\", \"90deg\", isRotated ? \"180deg\" : \"0deg\"]}>\n <ExtrudeLinear height={2}>\n <Polygon\n points={getExpandedStroke(\n [\n [0, 0],\n [-1, 0],\n [-1, -1],\n ],\n 0.25,\n ).map((p) => [p.x, p.y])}\n />\n </ExtrudeLinear>\n </Rotate>\n </Translate>\n </>\n )\n}\n\nexport const Dip = ({\n numPins = 8,\n pitch = 2.54,\n bodyWidth = 6.4,\n rowSpacing,\n}: {\n numPins?: number\n pitch?: number\n bodyWidth?: number\n rowSpacing?: number\n}) => {\n const numPinsOnEachSide = Math.floor(numPins / 2)\n\n const pinRowSpacing =\n rowSpacing ?? (bodyWidth >= 7 ? bodyWidth : bodyWidth + 1.22)\n\n const chipBodyWidth = bodyWidth >= 7 ? pinRowSpacing - 1.22 : bodyWidth\n\n return (\n <>\n {range(numPins).map((i) => {\n const yRow = i % numPinsOnEachSide\n const xRow = (Math.floor(i / numPinsOnEachSide) - 0.5) * 2\n\n return (\n <DipPinLeg\n key={i}\n x={(xRow * pinRowSpacing) / 2}\n y={yRow * pitch - ((numPinsOnEachSide - 1) / 2) * pitch}\n z={DIP_PIN_HEIGHT / 2 + heightAboveSurface}\n />\n )\n })}\n <ChipBody\n width={chipBodyWidth}\n length={numPinsOnEachSide * pitch + 0.5}\n height={DIP_PIN_HEIGHT - heightAboveSurface}\n heightAboveSurface={heightAboveSurface}\n center={{ x: 0, y: 0, z: heightAboveSurface }}\n />\n </>\n )\n}\n\nexport const DualInlinePackage = Dip\n","export const range = (end: number) => Array.from({ length: end }, (_, i) => i)\n","interface Point {\n x: number\n y: number\n}\n\n/**\n * Expands a stroke (line) into a polygon of a given width.\n *\n * @param {Point[]} stroke - An array of points representing the stroke to be expanded.\n * Each point is an object with 'x' and 'y' properties.\n * @param {number} width - The width of the expanded stroke.\n * @returns {Point[]} An array of points representing the polygon that surrounds the expanded stroke.\n * The points alternate between the \"left\" and \"right\" sides of the stroke.\n * @throws {Error} Throws an error if the stroke has fewer than two points.\n *\n * @example\n * const stroke = [{ x: 0, y: 0 }, { x: 1, y: 1 }, { x: 2, y: 0 }];\n * const width = 0.5;\n * const expandedStroke = getExpandedStroke(stroke, width);\n */\nexport function getExpandedStroke(\n strokeInput: (Point | [number, number] | number[])[],\n width: number,\n): Point[] {\n if (strokeInput.length < 2) {\n throw new Error(\"Stroke must have at least two points\")\n }\n const stroke: Point[] = Array.isArray(strokeInput[0])\n ? (strokeInput as any).map(([x, y]: [number, number]) => ({ x, y }))\n : strokeInput\n\n const halfWidth = width / 2\n const leftSide: Point[] = []\n const rightSide: Point[] = []\n\n function getNormal(p1: Point, p2: Point): Point {\n const dx = p2.x - p1.x\n const dy = p2.y - p1.y\n const length = Math.sqrt(dx * dx + dy * dy)\n return { x: -dy / length, y: dx / length }\n }\n\n function addPoint(point: Point, normal: Point, factor: number) {\n const newPoint = {\n x: point.x + normal.x * halfWidth * factor,\n y: point.y + normal.y * halfWidth * factor,\n }\n if (factor > 0) {\n leftSide.push(newPoint)\n } else {\n rightSide.unshift(newPoint)\n }\n }\n\n // Handle the first point\n const firstNormal = getNormal(stroke[0]!, stroke[1]!)\n addPoint(stroke[0]!, firstNormal, 1)\n addPoint(stroke[0]!, firstNormal, -1)\n\n // Handle middle points\n for (let i = 1; i < stroke.length - 1; i++) {\n const prev = stroke[i - 1]!\n const current = stroke[i]!\n const next = stroke[i + 1]!\n\n const normalPrev = getNormal(prev, current)\n const normalNext = getNormal(current, next)\n\n // Calculate miter line\n const miterX = normalPrev.x + normalNext.x\n const miterY = normalPrev.y + normalNext.y\n const miterLength = Math.sqrt(miterX * miterX + miterY * miterY)\n\n // Check if miter is too long (sharp corner)\n const miterLimit = 2 // Adjust this value to control when to bevel\n if (miterLength / 2 > miterLimit * halfWidth) {\n // Use bevel join\n addPoint(current, normalPrev, 1)\n addPoint(current, normalNext, 1)\n addPoint(current, normalPrev, -1)\n addPoint(current, normalNext, -1)\n } else {\n // Use miter join\n const scale = 1 / miterLength\n addPoint(current, { x: miterX * scale, y: miterY * scale }, 1)\n addPoint(current, { x: miterX * scale, y: miterY * scale }, -1)\n }\n }\n\n // Handle the last point\n const lastNormal = getNormal(\n stroke[stroke.length - 2]!,\n stroke[stroke.length - 1]!,\n )\n addPoint(stroke[stroke.length - 1]!, lastNormal, 1)\n addPoint(stroke[stroke.length - 1]!, lastNormal, -1)\n\n // Combine left and right sides to form a closed polygon\n return [...leftSide, ...rightSide]\n}\n","import { componentMaterials } from \"./materials\"\nimport {\n Polygon,\n ExtrudeLinear,\n Translate,\n Rotate,\n Colorize,\n} from \"jscad-fiber\"\nimport { getExpandedStroke } from \"./utils/getExpandedStroke\"\n\nexport interface SmdChipLeadProps {\n thickness: number\n width: number\n height: number\n padContactLength: number\n bodyDistance: number\n curveLength?: number\n rotation?: number\n positionAnchor?: \"outer-edge\"\n position?: { x: number; y: number; z?: number }\n}\n\nfunction calculateSCurve(\n x: number,\n {\n height,\n padContactLength,\n curveLength,\n bodyDistance,\n steepness = 10,\n }: SmdChipLeadProps & { steepness?: number },\n) {\n if (!curveLength) curveLength = bodyDistance * 0.3\n let flatFromBodySectionLength = bodyDistance - padContactLength - curveLength\n if (flatFromBodySectionLength < 0) {\n curveLength += flatFromBodySectionLength\n flatFromBodySectionLength = 0\n }\n const curveStart = padContactLength * 0.75\n const curveEnd =\n padContactLength +\n curveLength +\n (bodyDistance - padContactLength - curveLength) * 0.25\n\n if (x <= curveStart) return 0\n if (x >= curveEnd) return height\n\n const t = (x - curveStart) / (curveEnd - curveStart)\n\n // Generalized logistic function (Richards curve)\n return height / (1 + Math.exp(-steepness * (t - 0.5)))\n}\n\n/**\n * Curved lead for an SMD chip\n */\nexport const SmdChipLead = (props: SmdChipLeadProps) => {\n const { thickness, width, padContactLength, bodyDistance, height, rotation } =\n props\n\n const N = 15\n\n const points = Array.from({ length: N })\n .map((_, i) => (i / (N - 1)) * bodyDistance)\n .map((x) => [x, calculateSCurve(x, props)] as [number, number])\n // const points = [\n // [0, 0],\n // [padContactLength / 2, 0],\n // ...Array.from({ length: N })\n // .map((_, i) => padContactLength + ((i + 1) / (N + 1)) * curveLength)\n // .map((x) => [x, calculateSCurve(x, props)] as [number, number]),\n // [\n // bodyDistance - (bodyDistance - (padContactLength + curveLength)) / 2,\n // height,\n // ],\n // [bodyDistance, height],\n // ]\n\n const polygon = getExpandedStroke(points, thickness)\n return (\n <Colorize color=\"#c4c7ca\" material={componentMaterials.tinnedLead}>\n <Translate offset={{ z: 0, y: 0, x: 0, ...props.position }}>\n <Rotate rotation={[\"90deg\", 0, rotation ?? 0]}>\n <Translate offset={{ x: 0, y: 0, z: -width / 2 }}>\n <ExtrudeLinear height={width}>\n <Polygon points={polygon.map((p) => [p.x, p.y])} />\n </ExtrudeLinear>\n </Translate>\n </Rotate>\n </Translate>\n </Colorize>\n )\n}\n","import {\n createDualRowGullWing,\n type DualRowGullWingDimensions,\n} from \"./utils/DualRowGullWing\"\nimport { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\n// TODO use mm to convert width to mm (and accept strings)\nconst LegacyTssop = ({\n pinCount,\n leadLength,\n leadWidth,\n pitch,\n bodyWidth,\n}: {\n pinCount: number\n pitch: number\n leadWidth: number\n leadLength: number\n bodyWidth: number\n}) => {\n const sidePinCount = Math.ceil(pinCount / 2)\n const isSmallTssop = sidePinCount <= 4\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const bodyLength =\n pitch * Math.max(sidePinCount - 1, 0) + (isSmallTssop ? 1.5 : 1.15)\n const bodyVisualWidth = bodyWidth - (isSmallTssop ? 0.66 : 0.58)\n const leadThickness = 0.15\n const leadHeight = 0.8\n const bodyHeight = 1.22\n const bodyStandoff = 0.24\n const padContactLength = leadLength * 0.5\n const leadReach =\n padContactLength + Math.max(0.22, Math.min(0.4, leadLength * 0.65))\n const leadStartOffset = bodyWidth / 2 + leadLength / 2\n const curveLength = leadReach * 0.1\n const notchInset = Math.min(Math.min(bodyVisualWidth, bodyLength) * 0.18, 1)\n const notchRadius = Math.min(\n Math.min(bodyVisualWidth, bodyLength) * 0.12,\n 0.45,\n )\n\n return (\n <>\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`left-${i}`}\n position={{\n x: -leadStartOffset,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={leadReach}\n curveLength={curveLength}\n height={leadHeight}\n />\n ))}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: leadStartOffset,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={leadReach}\n curveLength={curveLength}\n height={leadHeight}\n />\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyVisualWidth}\n length={bodyLength}\n height={bodyHeight}\n notchPosition={{\n x: -(bodyVisualWidth / 2 - notchInset - 0.2),\n y: bodyLength / 2 - notchInset - 0.2,\n z: bodyHeight,\n }}\n notchRadius={notchRadius}\n />\n </>\n )\n}\n\n/** TSSOP physical outline. leadSpan selects explicit package dimensions;\n * existing land-derived callers retain their current geometry.\n * See examples/fixtures/tssop-variants.ts for standard outline evidence.\n */\nexport type TssopProps =\n | Parameters<typeof LegacyTssop>[0]\n | DualRowGullWingDimensions\nexport const Tssop = (props: TssopProps) =>\n \"leadSpan\" in props ? createDualRowGullWing(props) : LegacyTssop(props)\n","import {\n createDualRowGullWing,\n type DualRowGullWingDimensions,\n} from \"./utils/DualRowGullWing\"\nimport { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\n// MSOP (mini small outline package) — modeled after Tssop implementation\nconst LegacyMSOP = ({\n pinCount,\n padContactLength = 0.4,\n leadWidth = 0.2,\n pitch = 0.65,\n bodyWidth = 3.0,\n}: {\n pinCount: number\n pitch?: number\n leadWidth?: number\n padContactLength?: number\n bodyWidth?: number\n}) => {\n const sidePinCount = Math.ceil(pinCount / 2)\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const leadThickness = 0.2\n\n return (\n <>\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={i}\n position={{\n x: -bodyWidth / 2 - padContactLength - 0.3,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={padContactLength + 0.4}\n height={0.6}\n />\n ))}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={i}\n rotation={Math.PI}\n position={{\n x: bodyWidth / 2 + padContactLength + 0.3,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={padContactLength + 0.4}\n height={0.6}\n />\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: leadThickness / 2 }}\n width={bodyWidth}\n length={bodyWidth}\n height={1.1}\n notchRadius={0.35}\n heightAboveSurface={0.1}\n taperRatio={0.09}\n />\n </>\n )\n}\n\n/** MO-187 MSOP physical outline. leadSpan selects explicit package dimensions;\n * existing callers retain the legacy default outline. See fixture source notes.\n */\nexport type MSOPProps =\n | Parameters<typeof LegacyMSOP>[0]\n | DualRowGullWingDimensions\nexport const MSOP = (props: MSOPProps) =>\n \"leadSpan\" in props ? createDualRowGullWing(props) : LegacyMSOP(props)\n","import { Colorize, Cuboid, RoundedCuboid, Translate } from \"jscad-fiber\"\n\nexport type SmdLedSize = \"0402\" | \"0603\" | \"0805\"\n\n/** Flat-top, two-contact LED packages in mm. The 0603 outline follows\n * modelcdn meshes for two Kingbright parts; other sizes use catalog dimensions.\n * A footprint alone cannot specify lens shape, emitted color, or exact height.\n */\nexport const smdLedDimensions = {\n \"0402\": { length: 1, width: 0.5, height: 0.5, terminalLength: 0.2 },\n \"0603\": { length: 1.62, width: 0.8, height: 0.615, terminalLength: 0.21 },\n \"0805\": { length: 2, width: 1.25, height: 0.75, terminalLength: 0.35 },\n} as const\n\nexport function SmdLED({\n footprint,\n color = \"#ffe8a0\",\n}: {\n footprint: SmdLedSize\n color?: string\n}) {\n const p = smdLedDimensions[footprint]\n if (footprint === \"0603\")\n return (\n <>\n <Colorize color=\"#f0eee7\">\n <RoundedCuboid\n size={[1.2, 0.79, 0.6]}\n roundRadius={0.02}\n center={[0, 0, 0.31]}\n />\n </Colorize>\n <Colorize color=\"#c7c9ca\">\n {[-1, 1].map((sign) => (\n <Cuboid\n key={sign}\n size={[0.21, 0.8, 0.22]}\n center={[sign * 0.705, 0, 0.11]}\n />\n ))}\n </Colorize>\n <Colorize color={color}>\n <Cuboid size={[0.72, 0.52, 0.01]} center={[0, 0, 0.61]} />\n </Colorize>\n </>\n )\n const terminalThickness = Math.min(0.1, p.height / 4)\n const apertureHeight = 0.02\n return (\n <>\n <Colorize color=\"#f0eee7\">\n <Translate z={(p.height + terminalThickness - apertureHeight) / 2}>\n <Cuboid\n size={[\n p.length,\n p.width,\n p.height - terminalThickness - apertureHeight,\n ]}\n />\n </Translate>\n </Colorize>\n <Colorize color=\"#c7c9ca\">\n {[-1, 1].map((sign) => (\n <Translate\n key={sign}\n offset={[\n (sign * (p.length - p.terminalLength)) / 2,\n 0,\n terminalThickness / 2,\n ]}\n >\n <Cuboid size={[p.terminalLength, p.width, terminalThickness]} />\n </Translate>\n ))}\n </Colorize>\n <Colorize color={color}>\n <Translate z={p.height - apertureHeight / 2}>\n <Cuboid size={[p.length * 0.45, p.width * 0.65, apertureHeight]} />\n </Translate>\n </Colorize>\n </>\n )\n}\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const QFP = ({\n pinCount,\n pitch,\n leadWidth,\n padContactLength,\n bodyWidth,\n}: {\n pinCount: number\n pitch?: number\n leadWidth?: number\n padContactLength?: number\n bodyWidth?: number\n}) => {\n const sidePinCount = pinCount / 4\n\n // get default values if not specified\n if (!pitch) pitch = getPitch(pinCount, bodyWidth)\n if (!padContactLength) padContactLength = getPadContactLength(pinCount)\n if (!leadWidth) leadWidth = getLeadWidth(pinCount, bodyWidth)\n if (!bodyWidth) bodyWidth = pitch * (sidePinCount + 4)\n\n const footprintPadLength = padContactLength\n const bodyLength = bodyWidth\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const leadReach = footprintPadLength * 0.5\n const fullLength = bodyLength + 2 * leadReach\n const fullWidth = fullLength\n const leadHeight = 0.8\n const leadThickness = 0.15\n const bodyDistance = leadReach\n const fullPadContactLength = leadReach * 0.5\n const curveLength = leadReach * 0.18\n\n return (\n <>\n {/* Pins on the left side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`left-${i}`}\n position={{\n x: -fullWidth / 2,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={fullPadContactLength}\n bodyDistance={bodyDistance}\n curveLength={curveLength}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the right side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={fullPadContactLength}\n bodyDistance={bodyDistance}\n curveLength={curveLength}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the bottom side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`bottom-${i}`}\n rotation={Math.PI / 2}\n position={{\n x: i * pitch - pinOffsetToCenter,\n y: -fullLength / 2,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={fullPadContactLength}\n bodyDistance={bodyDistance}\n curveLength={curveLength}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the top side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`top-${i}`}\n rotation={-Math.PI / 2}\n position={{\n x: i * pitch - pinOffsetToCenter,\n y: fullLength / 2,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={fullPadContactLength}\n bodyDistance={bodyDistance}\n curveLength={curveLength}\n height={leadHeight}\n />\n ))}\n\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={1.5}\n taperRatio={0.03}\n chamferSize={0.7}\n notchPosition={{\n x: -(bodyLength / 2 - 1.5),\n y: bodyWidth / 2 - 1.5,\n z: 1.5,\n }}\n notchRadius={1.5 / 2}\n />\n </>\n )\n}\n\n// Helper functions to determine default values based on pinCount and width of QFP as footprinter repo\nconst getPitch = (pinCount: number, width?: number): number => {\n switch (pinCount) {\n case 44:\n case 64:\n return 0.8\n case 52:\n return width === 14 ? 1 : 0.65\n case 208:\n return 0.5\n default:\n return 0.5\n }\n}\n\nconst getPadContactLength = (pinCount: number): number => {\n switch (pinCount) {\n case 32:\n return 0.6\n case 40:\n return 0.6\n case 52:\n case 64:\n return 0.65\n case 208:\n return 1.65\n default:\n return 0.6\n }\n}\n\nconst getLeadWidth = (pinCount: number, width?: number): number => {\n switch (pinCount) {\n case 44:\n case 64:\n return 0.5\n case 52:\n return width === 14 ? 0.45 : 0.55\n case 208:\n return 0.3\n default:\n return 0.25\n }\n}\nexport default QFP\n","import { componentMaterials } from \"./materials\"\nimport { Colorize, Cuboid, Hull, Rotate, Translate } from \"jscad-fiber\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nconst PIN_METAL_COLOR = \"#c0c0c0\"\n\nexport const PinHeader = ({\n x,\n y,\n pinThickness,\n shortSidePinLength,\n longSidePinLength,\n bodyHeight,\n bodyLength = 2.54,\n bodyWidth = 2.54,\n flipZ,\n smd,\n rightangle,\n}: {\n x: number\n y: number\n pinThickness: number\n shortSidePinLength: number\n longSidePinLength: number\n bodyHeight: number\n bodyLength?: number\n bodyWidth?: number\n flipZ: (z: number) => number\n smd?: boolean\n rightangle?: boolean\n}) => {\n return (\n <>\n <Translate y={rightangle ? -3 : 0}>\n <Cuboid\n color=\"#222\"\n material={componentMaterials.moldedPlastic}\n size={[bodyLength, bodyWidth, bodyHeight]}\n center={[x, y, flipZ(bodyHeight / 2)]}\n />\n </Translate>\n <Colorize\n color={PIN_METAL_COLOR}\n material={componentMaterials.goldContact}\n >\n {smd ? (\n <SmdChipLead\n rotation={-Math.PI / 2}\n position={{\n x: x,\n y: y + 1,\n z: pinThickness / 2,\n }}\n thickness={pinThickness}\n width={pinThickness}\n height={pinThickness}\n padContactLength={2}\n bodyDistance={3}\n />\n ) : (\n <Hull>\n <Cuboid\n color={PIN_METAL_COLOR}\n size={[pinThickness, pinThickness, shortSidePinLength * 0.9]}\n center={[x, y, flipZ(bodyHeight * 0.9 + bodyHeight / 2)]}\n />\n <Cuboid\n color={PIN_METAL_COLOR}\n size={[\n pinThickness / 1.8,\n pinThickness / 1.8,\n shortSidePinLength,\n ]}\n center={[x, y, flipZ(bodyHeight + bodyHeight / 2)]}\n />\n </Hull>\n )}\n </Colorize>\n\n <Colorize\n color={PIN_METAL_COLOR}\n material={componentMaterials.goldContact}\n >\n <Translate y={rightangle ? -3.9 : 0} z={rightangle ? 1 : 0}>\n <Rotate rotation={rightangle ? [-Math.PI / 2, 0, 0] : [0, 0, 0]}>\n <Hull>\n <Cuboid\n color={PIN_METAL_COLOR}\n size={[pinThickness, pinThickness, longSidePinLength * 0.9]}\n center={[x, y, flipZ((-longSidePinLength / 2) * 0.9)]}\n />\n <Cuboid\n color={PIN_METAL_COLOR}\n size={[\n pinThickness / 1.8,\n pinThickness / 1.8,\n longSidePinLength,\n ]}\n center={[x, y, flipZ(-longSidePinLength / 2)]}\n />\n </Hull>\n </Rotate>\n </Translate>\n </Colorize>\n </>\n )\n}\n","import { PinHeader } from \"./PinHeader\"\n\nexport const PinRow = ({\n numberOfPins,\n pitch = 2.54,\n longSidePinLength = 6,\n invert,\n rows = 1,\n smd,\n rightangle,\n}: {\n numberOfPins: number\n pitch?: number\n longSidePinLength?: number\n invert?: boolean\n rows?: number\n smd?: boolean\n rightangle?: boolean\n}) => {\n const pinThickness = 0.63\n const bodyHeight = 2\n const pinsPerRow = Math.ceil(numberOfPins / rows)\n const rowSpacing = 2.54 // Standard spacing between rows\n const shortSidePinLength = 3\n const xoff = -((pinsPerRow - 1) / 2) * pitch\n\n // A through-hole header is mounted on TOP of the board: the plastic body\n // sits on the surface (z 0 to bodyHeight), its long pins stand above it and\n // its short pins pass down through the holes.\n //\n // The default used to be the other way up — body at z -3.6 to -1.6, i.e.\n // hanging under the board with 2mm of pin poking through, which is a\n // BOTTOM-mounted header — and `invert` produced the ordinary one. Two things\n // follow from that being backwards: every through-hole header rendered\n // upside down, and the part measured 0.9mm above the board when it is really\n // about 8.5mm, so an enclosure sized from it left no room for the header at\n // all. `invert` now means what it says: mounted on the underside.\n // Which way up a header goes, and which end of its pins passes through the\n // board, are two different questions. This flag answers the SECOND one; the\n // first is the component's `layer`, which consumers already implement (see\n // 3d-viewer's cad-model-transform: a bottom-layer part is repositioned and\n // rotated 180 degrees about X). A model that flipped itself would be flipped\n // twice on a bottom-layer component, so nothing here ever puts the body\n // below z = 0.\n //\n // default long pins up, short pins down through the board — a male\n // header mounted the ordinary way\n // invert installed backwards: long pins down THROUGH the board, short\n // pins up. Unusual, but a real option (board stacking, wire\n // wrap), and what `invert` meant when it was added in #236.\n //\n // The default used to be the backwards one, and #256 then pushed the whole\n // part 3.6mm down to compensate, which put the body under the board.\n //\n // `faceup` is gone. It was added a day after `invert`, by a different\n // author, sharing its expression, and its only distinct effect was deleting\n // the pins below the board — which on a through-hole footprint, made of\n // plated HOLES, produces a part that cannot be soldered into its own land\n // pattern. The orientation it named (\"the male pin header should face\n // upwards, out of the top layer\") is what a correctly mounted header does\n // by default. It is deprecated in footprinter (tscircuit/footprinter#813)\n // and simply ignored here, so a footprint string that still carries it\n // renders the part correctly rather than differently.\n const throughHole = !smd && !rightangle\n const flipped = throughHole ? !invert : Boolean(invert)\n const flipZ = (z: number) => (flipped ? -z + bodyHeight : z)\n\n return (\n <>\n {Array.from({ length: numberOfPins }, (_, i) => {\n const row = Math.floor(i / pinsPerRow)\n const col = i % pinsPerRow\n const x = xoff + col * pitch\n const y = ((rows - 1) / 2 - row) * rowSpacing\n\n return (\n <PinHeader\n key={i}\n x={x}\n y={y}\n pinThickness={pinThickness}\n shortSidePinLength={shortSidePinLength}\n longSidePinLength={longSidePinLength}\n bodyHeight={bodyHeight}\n flipZ={flipZ}\n smd={smd}\n rightangle={rightangle}\n />\n )\n })}\n </>\n )\n}\n","import { Colorize, Cuboid, Cylinder, Subtract, Translate } from \"jscad-fiber\"\n\n/** Physical QFN outline, in mm. Unlike the legacy land-derived API, bodyWidth\n * and bodyLength measure the mold itself. Terminal spans measure outer edges,\n * allowing both sawn and punched standard outlines. Pin 1 is at -X,+Y.\n * This variant has equally many terminals on all four sides.\n */\nexport interface PhysicalQfnDimensions {\n num_pins: number\n bodyWidth: number\n bodyLength: number\n /** Overall height A from the seating plane. */\n bodyHeight: number\n standoff: number\n terminalSpanX: number\n terminalSpanY: number\n terminalThickness: number\n padWidth: number\n padLength: number\n pitch: number\n exposedPadWidth: number\n exposedPadLength: number\n}\n\nexport function createPhysicalQfn(p: PhysicalQfnDimensions) {\n const {\n num_pins,\n bodyWidth,\n bodyLength,\n bodyHeight,\n standoff,\n terminalSpanX,\n terminalSpanY,\n terminalThickness,\n padWidth,\n padLength,\n pitch,\n exposedPadWidth,\n exposedPadLength,\n } = p\n for (const key of [\n \"bodyWidth\",\n \"bodyLength\",\n \"bodyHeight\",\n \"terminalSpanX\",\n \"terminalSpanY\",\n \"terminalThickness\",\n \"padWidth\",\n \"padLength\",\n \"pitch\",\n \"exposedPadWidth\",\n \"exposedPadLength\",\n ] as const)\n if (!Number.isFinite(p[key]) || p[key] <= 0)\n throw new Error(`${key} must be finite and positive`)\n if (!Number.isInteger(num_pins) || num_pins < 8 || num_pins % 4)\n throw new Error(\"num_pins must be divisible by four and at least eight\")\n if (!Number.isFinite(standoff) || standoff < 0)\n throw new Error(\"standoff must be finite and nonnegative\")\n const rowLength = (num_pins / 4 - 1) * pitch + padWidth\n if (\n terminalThickness <= standoff ||\n terminalThickness >= bodyHeight ||\n padWidth >= pitch ||\n rowLength >= Math.min(bodyWidth, bodyLength)\n )\n throw new Error(\"Invalid mold, terminal thickness or spacing\")\n // Avoid disconnected roots, exposed-pad shorts, and adjacent-side overlap.\n if (\n terminalSpanX < bodyWidth ||\n terminalSpanY < bodyLength ||\n terminalSpanX / 2 - padLength >= bodyWidth / 2 ||\n terminalSpanY / 2 - padLength >= bodyLength / 2 ||\n exposedPadWidth >= Math.min(bodyWidth, terminalSpanX - 2 * padLength) ||\n exposedPadLength >= Math.min(bodyLength, terminalSpanY - 2 * padLength) ||\n rowLength >= Math.min(terminalSpanX, terminalSpanY) - 2 * padLength\n )\n throw new Error(\n \"Terminals must enter the mold and clear the exposed pad and corners\",\n )\n const body = (\n <Translate z={(bodyHeight + standoff) / 2}>\n <Cuboid size={[bodyWidth, bodyLength, bodyHeight - standoff]} />\n </Translate>\n )\n const radius = Math.min(bodyWidth, bodyLength) * 0.035\n return (\n <>\n <Colorize color=\"#353535\">\n <Subtract>\n {body}\n <Translate\n offset={{\n x: -bodyWidth / 2 + radius * 2,\n y: bodyLength / 2 - radius * 2,\n z: bodyHeight,\n }}\n >\n <Cylinder\n radius={radius}\n height={Math.min(0.06, (bodyHeight - standoff) / 5)}\n />\n </Translate>\n </Subtract>\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n {Array.from({ length: num_pins }, (_, i) => {\n const side = Math.floor(i / (num_pins / 4))\n const along = ((num_pins / 4 - 1) / 2 - (i % (num_pins / 4))) * pitch\n const horizontal = side % 2 === 0\n const sign = side < 2 ? -1 : 1\n const across =\n (((horizontal ? terminalSpanX : terminalSpanY) - padLength) / 2) *\n sign\n return (\n <Translate\n key={i}\n offset={{\n x: horizontal ? across : along,\n y: horizontal ? along : across,\n z: terminalThickness / 2,\n }}\n >\n <Cuboid\n size={\n horizontal\n ? [padLength, padWidth, terminalThickness]\n : [padWidth, padLength, terminalThickness]\n }\n />\n </Translate>\n )\n })}\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n <Translate z={terminalThickness / 2}>\n <Cuboid\n size={[exposedPadWidth, exposedPadLength, terminalThickness]}\n />\n </Translate>\n </Colorize>\n </>\n )\n}\n","import { componentMaterials } from \"./materials\"\nimport {\n createPhysicalQfn,\n type PhysicalQfnDimensions,\n} from \"./utils/PhysicalQfn\"\nimport { Cuboid, Colorize } from \"jscad-fiber\"\nimport { getQuadCoords } from \"./utils/getQuadCoords\"\nimport { getQuadPinMap } from \"./utils/getQuadPinMap\"\nconst LegacyQFN = ({\n num_pins = 16,\n bodyWidth = 9,\n bodyLength = 9,\n bodyThickness = 0.8,\n thermalPadSize,\n padWidth = 0.25,\n padLength = 0.25,\n pitch = 0.5,\n thermalPadThickness = 0.05,\n}: {\n num_pins: number\n bodyWidth?: number\n bodyLength?: number\n bodyThickness?: number\n thermalPadSize?: {\n width: number\n length: number\n }\n padWidth?: number\n padLength?: number\n pitch?: number\n thermalPadThickness?: number\n}) => {\n const pin_map = getQuadPinMap({\n num_pins,\n cw: true,\n ccw: true,\n })\n const pinPositions = []\n const spc = num_pins / 4\n for (let i = 0; i < num_pins; i++) {\n const {\n x,\n y,\n o: orientation,\n } = getQuadCoords({\n pin_count: num_pins,\n pn: i + 1,\n w: bodyWidth,\n h: bodyLength,\n p: pitch,\n pl: padLength,\n legsoutside: false,\n })\n\n let pw = padWidth\n let pl = padLength\n if (orientation === \"vert\") {\n ;[pw, pl] = [pl, pw]\n }\n\n const pn = pin_map[i + 1]!\n pinPositions.push({ pn, x, y, pw, pl })\n }\n\n return (\n <>\n <Colorize material={componentMaterials.tinnedLead} color=\"grey\">\n <Cuboid\n center={[0, 0, bodyThickness / 2]}\n size={[bodyWidth, bodyLength, bodyThickness]}\n />\n </Colorize>\n {pinPositions.map((p, i) => (\n <Cuboid\n key={i}\n center={[p.x, p.y, thermalPadThickness / 2]}\n size={[p.pw, p.pl, thermalPadThickness]}\n />\n ))}\n {thermalPadSize?.length !== undefined &&\n thermalPadSize?.width !== undefined && (\n <Cuboid\n center={[0, 0, thermalPadThickness / 2]}\n size={[\n thermalPadSize.width,\n thermalPadSize.length,\n thermalPadThickness,\n ]}\n />\n )}\n </>\n )\n}\n\n/** Supplying bodyHeight opts into physical dimensions; legacy callers are unchanged. */\nexport type QFNProps = Parameters<typeof LegacyQFN>[0] | PhysicalQfnDimensions\nexport const QFN = (props: QFNProps) =>\n \"bodyHeight\" in props ? createPhysicalQfn(props) : LegacyQFN(props)\nexport default QFN\n","export const getQuadCoords = (params: {\n pin_count: number\n pn: number // pin number\n w: number // width of the package\n h: number // height (length) of the package\n p: number // pitch between pins\n pl: number // length of the pin\n legsoutside?: boolean\n}) => {\n const SIDES_CCW = [\"left\", \"bottom\", \"right\", \"top\"] as const\n const { pin_count, pn, w, h, p, pl, legsoutside } = params\n const sidePinCount = pin_count / 4\n const side = SIDES_CCW[Math.floor((pn - 1) / sidePinCount)]\n const pos = (pn - 1) % sidePinCount\n /** inner box width */\n const ibw = p * (sidePinCount - 1)\n /** inner box height */\n const ibh = p * (sidePinCount - 1)\n\n /** pad center distance from edge (negative is inside, positive is outside) */\n const pcdfe = legsoutside ? pl / 2 : -pl / 2\n\n switch (side) {\n case \"left\":\n return { x: -w / 2 - pcdfe, y: ibh / 2 - pos * p, o: \"vert\" }\n case \"bottom\":\n return { x: -ibw / 2 + pos * p, y: -h / 2 - pcdfe, o: \"horz\" }\n case \"right\":\n return { x: w / 2 + pcdfe, y: -ibh / 2 + pos * p, o: \"vert\" }\n case \"top\":\n return { x: ibw / 2 - pos * p, y: h / 2 + pcdfe, o: \"horz\" }\n default:\n throw new Error(\"Invalid pin number\")\n }\n}\n","export type PinOrderSpecifier =\n | \"leftside\"\n | \"topside\"\n | \"rightside\"\n | \"bottomside\"\n | \"toppin\"\n | \"bottompin\"\n | \"leftpin\"\n | \"rightpin\"\nexport const getQuadPinMap = ({\n num_pins,\n cw,\n ccw,\n startingpin,\n}: {\n num_pins: number\n cw?: boolean\n ccw?: boolean\n startingpin?: PinOrderSpecifier[]\n}): number[] => {\n const pin_map: number[] = []\n const pins_per_side = num_pins / 4\n let current_position_ccw_normal = 1\n\n /** Starting Flag Pins */\n const sfp: Record<PinOrderSpecifier, boolean> = {} as any\n for (const specifier of startingpin ?? []) {\n sfp[specifier] = true\n }\n if (!sfp.leftside && !sfp.topside && !sfp.rightside && !sfp.bottomside) {\n sfp.leftside = true\n }\n if (!sfp.bottompin && !sfp.leftpin && !sfp.rightpin && !sfp.toppin) {\n if (sfp.leftside) {\n sfp.toppin = true\n } else if (sfp.topside) {\n sfp.rightpin = true\n } else if (sfp.rightside) {\n sfp.bottompin = true\n } else if (sfp.bottomside) {\n sfp.leftpin = true\n }\n }\n\n if (sfp.leftside && sfp.toppin) {\n current_position_ccw_normal = 1\n } else if (sfp.leftside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side\n } else if (sfp.bottomside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side + 1\n } else if (sfp.bottomside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 2\n } else if (sfp.rightside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side * 2 + 1\n } else if (sfp.rightside && sfp.toppin) {\n current_position_ccw_normal = pins_per_side * 3\n } else if (sfp.topside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 3 + 1\n } else if (sfp.topside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side * 4\n }\n\n pin_map.push(-1) // the first index is meaningless\n\n // Each iteration we move the current position to the next pin, if we're\n // going CCW this means incrementing, if we're going CW this means\n // decrementing\n for (let i = 0; i < num_pins; i++) {\n pin_map[current_position_ccw_normal] = i + 1\n if (ccw || !cw) {\n current_position_ccw_normal++\n if (current_position_ccw_normal > num_pins) {\n current_position_ccw_normal = 1\n }\n } else {\n current_position_ccw_normal--\n if (current_position_ccw_normal < 1) {\n current_position_ccw_normal = num_pins\n }\n }\n }\n\n return pin_map\n}\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOT235 = () => {\n const fullWidth = 2.8\n const bodyWidth = 1.6\n const bodyLength = 2.9\n const bodyHeight = 1.2\n const leadWidth = 0.4\n const leadThickness = 0.15\n const leadHeight = 0.95\n const padContactLength = 0.5\n const padPitch = 0.95\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = fullWidth - bodyWidth\n\n return (\n <>\n {/* Leads on the right side (pins 1 and 2) */}\n <SmdChipLead\n key={1}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: -1,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: 1,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the left side (pin 3) */}\n <SmdChipLead\n key={3}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: -1,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: 1,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n />\n </>\n )\n}\n\nexport default SOT235\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOT233P = ({\n fullWidth = 2.9,\n fullLength = 2.8,\n color,\n}: {\n fullWidth?: number\n fullLength?: number\n color?: string\n} = {}) => {\n const bodyWidth = 1.3\n const bodyLength = 2.9\n const bodyHeight = 1.1\n const leadWidth = 0.4\n const leadThickness = 0.15\n const leadHeight = 0.95\n const padContactLength = 0.4\n const padThickness = leadThickness / 2\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = (fullWidth - bodyWidth) / 2 + 0.3\n\n return (\n <>\n {/* Leads on the left side (pins 1 and 2) */}\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2,\n y: 0.95,\n z: padThickness,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2,\n y: -0.95,\n z: padThickness,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the right side (pin 3) */}\n <SmdChipLead\n key={3}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2,\n y: 0,\n z: padThickness,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n color={color}\n />\n </>\n )\n}\n\nexport default SOT233P\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOT23W = ({ fullWidth = 2.9, fullLength = 2.8 }) => {\n const bodyWidth = 1.92\n const bodyLength = 2.9\n const bodyHeight = 1.1\n const leadWidth = 0.4\n const leadThickness = 0.15\n const leadHeight = 0.45\n const padContactLength = 0.25\n const padThickness = leadThickness / 2\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = (fullWidth - bodyWidth) / 2 + 0.3\n\n return (\n <>\n {/* Leads on the right side (pins 1 and 2) */}\n\n <SmdChipLead\n key={1}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2,\n y: 0,\n z: padThickness,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the left side (pin 3) */}\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2,\n y: -0.95,\n z: padThickness,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n <SmdChipLead\n key={3}\n position={{\n x: -fullWidth / 2,\n y: 0.95,\n z: padThickness,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n straightHeightRatio={0.45}\n heightAboveSurface={0.05}\n />\n </>\n )\n}\n\nexport default SOT23W\n","import { Colorize, Cuboid, Hull, Subtract } from \"jscad-fiber\"\n\nexport const FemaleHeader = ({\n x,\n y,\n z = 0,\n pitch = 2.54,\n legsLength = 3,\n innerDiameter = 0.945,\n bodyHeight = 5,\n bodyLength = pitch,\n bodyWidth = pitch,\n flipZ,\n}: {\n x: number\n y: number\n z?: number\n pitch?: number\n legsLength?: number\n innerDiameter?: number\n bodyHeight?: number\n bodyLength?: number\n bodyWidth?: number\n flipZ: (z: number) => number\n}) => {\n const effectiveInnerDiameter = innerDiameter || 0.945\n const pinThickness = effectiveInnerDiameter / 1.5\n const socketWidth = effectiveInnerDiameter\n const socketEntryWidth = socketWidth * 1.8\n const socketEntryHeight = Math.min(bodyHeight * 0.18, pitch * 0.24)\n const socketDepth = bodyHeight + 0.1\n const socketCenterZ = flipZ(z + socketDepth / 2)\n const socketEntryBaseZ = z + bodyHeight - socketEntryHeight\n const gapWidth = pinThickness * 1.6\n\n return (\n <>\n <Colorize color=\"#1a1a1a\">\n <Subtract>\n <Cuboid\n color=\"#000\"\n size={[bodyLength, bodyWidth, bodyHeight]}\n center={[x, y, flipZ(z + bodyHeight / 2)]}\n />\n <Cuboid\n size={[socketWidth, socketWidth, socketDepth]}\n center={[x, y, socketCenterZ]}\n />\n <Hull>\n <Cuboid\n size={[socketWidth, socketWidth, 0.01]}\n center={[x, y, flipZ(socketEntryBaseZ)]}\n />\n <Cuboid\n size={[socketEntryWidth, socketEntryWidth, 0.01]}\n center={[x, y, flipZ(z + bodyHeight)]}\n />\n </Hull>\n </Subtract>\n </Colorize>\n <Colorize color=\"silver\">\n <Hull>\n <Cuboid\n color=\"silver\"\n size={[pinThickness, pinThickness, legsLength * 0.9]}\n center={[x, y, flipZ(z + (-legsLength / 2) * 0.9)]}\n />\n <Cuboid\n color=\"silver\"\n size={[pinThickness / 1.8, pinThickness / 1.8, legsLength]}\n center={[x, y, flipZ(z + -legsLength / 2)]}\n />\n </Hull>\n <Cuboid\n color=\"silver\"\n size={[gapWidth, gapWidth, gapWidth * 0.5]}\n center={[x, y, flipZ(z + (gapWidth / 2) * 0.5)]}\n />\n </Colorize>\n </>\n )\n}\n","import { FemaleHeader } from \"./FemaleHeader\"\n\nexport const FemaleHeaderRow = ({\n numberOfPins,\n pitch = 2.54,\n legsLength = 3,\n innerDiameter = 0.945,\n rows = 1,\n invert,\n}: {\n numberOfPins: number\n pitch?: number\n legsLength?: number\n outerDiameter?: number\n innerDiameter?: number\n rows?: number\n invert?: boolean\n}) => {\n const bodyHeight = 5\n const pinsPerRow = Math.ceil(numberOfPins / rows)\n const rowSpacing = 2.54 // Standard spacing between rows\n const xoff = -((pinsPerRow - 1) / 2) * pitch\n\n // Flip Z for inversion\n const flipZ = (z: number) => (invert ? -z + bodyHeight : z)\n\n return (\n <>\n {Array.from({ length: numberOfPins }, (_, i) => {\n const row = Math.floor(i / pinsPerRow)\n const col = i % pinsPerRow\n const x = xoff + col * pitch\n const y = ((rows - 1) / 2 - row) * rowSpacing\n\n return (\n <FemaleHeader\n key={i}\n x={x}\n y={y}\n pitch={pitch}\n legsLength={legsLength}\n innerDiameter={innerDiameter}\n flipZ={flipZ}\n />\n )\n })}\n </>\n )\n}\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n ExtrudeLinear,\n Polygon,\n Rotate,\n RoundedCuboid,\n Translate,\n} from \"jscad-fiber\"\nimport { getExpandedStroke } from \"./utils/getExpandedStroke\"\n\nexport const PushButton = ({\n width,\n length,\n innerDiameter = 1,\n}: { width: number; length: number; innerDiameter?: number }) => {\n const bodyWidth = width\n const bodyLength = length\n const bodyHeight = width * 0.7\n const legWidth = innerDiameter / 2.5\n return (\n <>\n <RoundedCuboid\n color=\"#1a1a1f\"\n center={[0, 0, bodyHeight / 2]}\n size={[bodyLength, bodyLength, bodyHeight]}\n roundRadius={0.3}\n />\n <RoundedCuboid\n color=\"#f2f2f2\"\n center={[0, 0, bodyHeight + (bodyHeight * 0.1) / 2.5]}\n size={[bodyLength, bodyLength, bodyHeight * 0.1]}\n roundRadius={0.14}\n />\n <Cylinder\n color=\"#1a1a1f\"\n height={bodyHeight * 0.8}\n radius={bodyWidth / 3}\n center={[0, 0, bodyHeight + (bodyHeight * 0.8) / 2]}\n />\n <Cylinder\n color=\"#1a1a1f\"\n height={bodyHeight * 0.2}\n radius={innerDiameter / 2}\n center={[\n bodyLength / 3,\n bodyLength / 3,\n bodyHeight + (bodyHeight * 0.1) / 2,\n ]}\n />\n <Cylinder\n color=\"#1a1a1f\"\n height={bodyHeight * 0.2}\n radius={innerDiameter / 2}\n center={[\n -bodyLength / 3,\n -bodyLength / 3,\n bodyHeight + (bodyHeight * 0.1) / 2,\n ]}\n />\n <Cylinder\n color=\"#1a1a1f\"\n height={bodyHeight * 0.2}\n radius={innerDiameter / 2}\n center={[\n -bodyLength / 3,\n bodyLength / 3,\n bodyHeight + (bodyHeight * 0.1) / 2,\n ]}\n />\n <Cylinder\n color=\"#1a1a1f\"\n height={bodyHeight * 0.2}\n radius={innerDiameter / 2}\n center={[\n bodyLength / 3,\n -bodyLength / 3,\n bodyHeight + (bodyHeight * 0.1) / 2,\n ]}\n />\n <PushButtonLeg\n thickness={innerDiameter / 3}\n width={legWidth}\n horizontalLength={bodyLength * 0.8}\n verticalLength={bodyHeight / 2}\n position={{\n x: -bodyWidth / 2,\n y: -bodyLength / 2,\n z: -bodyHeight * 1.2,\n }}\n />\n <PushButtonLeg\n thickness={innerDiameter / 3}\n width={legWidth}\n horizontalLength={bodyLength * 0.8}\n verticalLength={bodyHeight / 2}\n position={{\n x: -bodyWidth / 2,\n y: bodyLength / 2,\n z: -bodyHeight * 1.2,\n }}\n rotation={Math.PI}\n />\n <PushButtonLeg\n thickness={innerDiameter / 3}\n width={legWidth}\n horizontalLength={bodyLength * 0.8}\n verticalLength={bodyHeight / 2}\n position={{ x: bodyWidth / 2, y: bodyLength / 2, z: -bodyHeight * 1.2 }}\n rotation={Math.PI}\n />\n <PushButtonLeg\n thickness={innerDiameter / 3}\n width={legWidth}\n horizontalLength={bodyLength * 0.8}\n verticalLength={bodyHeight / 2}\n position={{\n x: bodyWidth / 2 + innerDiameter / 3.6,\n y: -bodyLength / 2,\n z: -bodyHeight * 1.2,\n }}\n />\n </>\n )\n}\nexport interface PushButtonLegProps {\n thickness: number\n width: number\n horizontalLength: number\n verticalLength: number\n rotation?: number\n position?: { x: number; y: number; z?: number }\n}\n\nexport const PushButtonLeg = (props: PushButtonLegProps) => {\n const {\n thickness,\n width,\n horizontalLength,\n verticalLength,\n rotation = 0,\n position,\n } = props\n const points: [number, number][] = [\n [0, horizontalLength],\n [-verticalLength / 3, horizontalLength / 3],\n [-verticalLength / 5, horizontalLength / 4],\n [0, 0],\n ]\n const polygon = getExpandedStroke(points, thickness)\n\n return (\n <Colorize color=\"#f2f2f2\">\n <Translate\n offset={{\n x: position?.x || 0,\n y: position?.y || 0,\n z: position?.z || 0,\n }}\n >\n <Rotate rotation={[0, 55, rotation]}>\n <ExtrudeLinear height={width}>\n <Polygon points={polygon.map((p) => [p.y, p.x])} />\n </ExtrudeLinear>\n </Rotate>\n </Translate>\n </Colorize>\n )\n}\n","import {\n createDualRowGullWing,\n type DualRowGullWingDimensions,\n} from \"./utils/DualRowGullWing\"\nimport { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\n// SOIC typical body and lead dimensions\nconst LegacySOIC = ({\n pinCount,\n leadLength,\n leadWidth,\n pitch,\n bodyWidth,\n}: {\n pinCount: number\n pitch: number\n leadWidth: number\n leadLength: number\n bodyWidth: number\n}) => {\n const sidePinCount = Math.ceil(pinCount / 2)\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const leadThickness = 0.25\n const bodyHeight = 1.0\n const leadHeight = 0.8\n const leadBodyOffset = leadLength * 0\n const fullLength = pitch * (sidePinCount - 1) + leadWidth + 0.2\n const bodyWidthAdjusted = bodyWidth * 0.55\n\n return (\n <>\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={i}\n position={{\n x: -bodyWidth / 2 - leadBodyOffset,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={leadLength / 2}\n bodyDistance={leadLength + 0.3}\n height={leadHeight}\n />\n ))}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={i}\n rotation={Math.PI}\n position={{\n x: bodyWidth / 2 + leadBodyOffset,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={leadLength / 2}\n bodyDistance={leadLength + 0.3}\n height={leadHeight}\n />\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: leadThickness / 2 }}\n width={bodyWidthAdjusted}\n length={fullLength}\n height={bodyHeight}\n />\n </>\n )\n}\n\n/** Standard SOIC physical outline. Supplying leadSpan selects explicit package\n * dimensions; the legacy land-derived API is retained for existing callers.\n * See examples/fixtures/soic-variants.ts for MS-012 dimensional evidence.\n */\nexport type SOICProps =\n | Parameters<typeof LegacySOIC>[0]\n | DualRowGullWingDimensions\nexport const SOIC = (props: SOICProps) =>\n \"leadSpan\" in props ? createDualRowGullWing(props) : LegacySOIC(props)\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const VSSOP = ({\n pinCount,\n pitch,\n leadWidth,\n leadLength,\n bodyWidth,\n bodyLength,\n}: {\n pinCount: 8 | 10\n pitch?: number\n leadWidth?: number\n leadLength?: number\n bodyWidth?: number\n bodyLength?: number\n}) => {\n const defaults =\n pinCount === 8\n ? {\n pitch: 0.65,\n leadWidth: 0.3,\n leadLength: 1.6,\n }\n : {\n pitch: 0.5,\n leadWidth: 0.225,\n leadLength: 1.45,\n }\n\n const _pitch = !isNaN(parseFloat(pitch as any))\n ? parseFloat(pitch as any)\n : defaults.pitch\n const _leadWidth = !isNaN(parseFloat(leadWidth as any))\n ? parseFloat(leadWidth as any) * 0.8\n : defaults.leadWidth\n const _leadLength = !isNaN(parseFloat(leadLength as any))\n ? parseFloat(leadLength as any)\n : defaults.leadLength\n const _bodyWidth = !isNaN(parseFloat(bodyWidth as any))\n ? parseFloat(bodyWidth as any) * 0.8\n : 2.6\n const _bodyLength = !isNaN(parseFloat(bodyLength as any))\n ? parseFloat(bodyLength as any)\n : 2.0 + Number(_pitch) * 1.4\n\n const sidePinCount = pinCount / 2\n const pinOffsetToCenter = ((sidePinCount - 1) * _pitch) / 2\n const leadThickness = 0.15\n const leadHeight = 0.8\n\n const componentFullWidth = 4.5\n const leadBodyDistance = (componentFullWidth - _bodyWidth) / 2\n\n const padContactLength = leadBodyDistance * 0.5\n\n return (\n <>\n {/* Left leads - positioned at the tip, drawn inwards */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`left-${i}`}\n position={{\n x: -componentFullWidth / 2,\n y: pinOffsetToCenter - i * _pitch,\n z: leadThickness / 2,\n }}\n width={_leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength + 0.05}\n bodyDistance={leadBodyDistance + 0.1}\n height={leadHeight}\n />\n ))}\n {/* Right leads - positioned at the tip, drawn inwards */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: componentFullWidth / 2,\n y: pinOffsetToCenter - i * _pitch,\n z: leadThickness / 2,\n }}\n width={_leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength + 0.05}\n bodyDistance={leadBodyDistance + 0.1}\n height={leadHeight}\n />\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: leadThickness / 2 }}\n width={_bodyWidth}\n length={_bodyLength}\n height={1.0}\n />\n </>\n )\n}\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD523 = () => {\n const fullWidth = 2.15\n const bodyLength = 0.8\n const bodyHeight = 0.6\n\n const padWidth = 0.6\n const padLength = 0.5\n const padThickness = 0.12\n\n const bodyWidth = fullWidth - padLength\n const leftPadCenterX = -bodyWidth / 2 + padLength / 2 - 0.15 // 0.15 is the distance between the pad and the body as datasheet\n const rightPadCenterX = bodyWidth / 2 - padLength / 2 + 0.15 // 0.15 is the distance between the pad and the body as datasheet\n\n // top taper happens only in last quarter\n const taperOffset = 0.2\n const straightHeight = bodyHeight * 0.5\n\n // Body geometry\n // - straightHeight: the lower (straight) portion of the body\n // - taperOffset: how much smaller the top of the body becomes\n\n return (\n <>\n {/* Pads */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body (lifted above pads) */}\n <Colorize color=\"#222\">\n <Union>\n {/* Straight bottom section */}\n <Translate z={straightHeight / 2}>\n <Cuboid size={[bodyWidth, bodyLength, straightHeight]} />\n </Translate>\n\n {/* Tapered top quarter */}\n <Hull>\n {/* bottom of taper (same size as straight section top) */}\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n\n {/* top of taper (smaller) */}\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n </>\n )\n}\n\nexport default SOD523\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD882 = () => {\n const bodyLength = 0.98\n const bodyHeight = 0.47\n const pitch = 0.65\n\n const padWidth = 0.51\n const padLength = 0.26\n const padThickness = 0.12\n\n const bodyWidth = 0.58\n const leftPadCenterX = -pitch / 2\n const rightPadCenterX = pitch / 2\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Translate z={bodyHeight / 2 + 0.02}>\n <Cuboid size={[bodyLength, bodyWidth, bodyHeight]} />\n </Translate>\n </Colorize>\n\n <Cuboid\n color=\"#ccc\"\n size={[bodyLength + 0.001, padLength / 2, padLength / 4]}\n center={[0, padLength / 2, bodyHeight / 4]}\n />\n <Cuboid\n color=\"#ccc\"\n size={[bodyLength + 0.001, padLength / 2, padLength / 4]}\n center={[0, -padLength / 2, bodyHeight / 4]}\n />\n\n <Cuboid\n color=\"#ccc\"\n size={[padLength / 1.5, bodyWidth + 0.001, padLength / 4]}\n center={[pitch / 2, 0, bodyHeight / 4]}\n />\n <Cuboid\n color=\"#ccc\"\n size={[padLength / 1.5, bodyWidth + 0.001, padLength / 4]}\n center={[-pitch / 2, 0, bodyHeight / 4]}\n />\n </>\n )\n}\n\nexport default SOD882\n","import { Cuboid, Colorize, Union, Hull, Translate } from \"jscad-fiber\"\n\nexport const SMA = () => {\n const bodyWidth = 4.4\n const bodyLength = 3.4\n const bodyHeight = 2.3\n const padWidth = 1.45\n const padThickness = 0.12\n\n const leadThickness = 0.2\n const leadHeight = 1.14\n\n const taperOffset = 0.4\n const straightHeight = bodyHeight * 0.5\n\n const Body = (\n <Colorize color=\"#1a1a1a\">\n <Union>\n <Hull>\n <Translate z={padThickness + 0.01}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.03]}\n />\n </Translate>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n </Hull>\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n )\n\n const Lead = ({ xDir }: { xDir: number }) => {\n const verticalGap = 1\n const lowerPadGap = 1\n const lowerPadX =\n xDir * (bodyLength / 2 - (bodyHeight * 0.8) / 2 + lowerPadGap)\n const verticalLeadX =\n xDir * (bodyLength / 2 - leadThickness / 2 + verticalGap)\n const bodyEdgeX = xDir * (bodyLength / 2 - leadThickness / 2)\n const bridgeLength = Math.abs(bodyEdgeX - verticalLeadX)\n const bridgeCenterX = (verticalLeadX + bodyEdgeX) / 2\n\n return (\n <Colorize color=\"#c0c0c0\">\n <Union>\n <Cuboid\n size={[bodyHeight * 0.8, padWidth, leadThickness]}\n center={[lowerPadX, 0, leadThickness / 2]}\n />\n <Cuboid\n size={[leadThickness, padWidth, leadHeight]}\n center={[verticalLeadX, 0, leadHeight / 2 + leadThickness]}\n />\n <Cuboid\n size={[bridgeLength, padWidth, leadThickness]}\n center={[bridgeCenterX, 0, leadThickness / 2 + leadHeight]}\n />\n </Union>\n </Colorize>\n )\n }\n\n return (\n <>\n <Lead xDir={1} />\n <Lead xDir={-1} />\n {Body}\n </>\n )\n}\n\nexport default SMA\n","import { Cuboid, Colorize, Union, Hull, Translate } from \"jscad-fiber\"\n\nexport const SMB = () => {\n // Package outline for the designation, from KiCad's D_SMB F.Fab layer.\n // Was 4.4 x 3.4 — 15% narrow across the leads for a DO-214AA.\n const bodyWidth = 4.6\n const bodyLength = 4.0\n const bodyHeight = 2.3\n const padWidth = 1.45\n const padThickness = 0.12\n\n const leadThickness = 0.2\n const leadHeight = 1.14\n\n const taperOffset = 0.4\n const straightHeight = bodyHeight * 0.5\n\n const Body = (\n <Colorize color=\"#1a1a1a\">\n <Union>\n <Hull>\n <Translate z={padThickness + 0.01}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.03]}\n />\n </Translate>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n </Hull>\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n )\n\n const Lead = ({ xDir }: { xDir: number }) => {\n const verticalGap = 1\n const lowerPadGap = 1\n const lowerPadX =\n xDir * (bodyLength / 2 - (bodyHeight * 0.8) / 2 + lowerPadGap)\n const verticalLeadX =\n xDir * (bodyLength / 2 - leadThickness / 2 + verticalGap)\n const bodyEdgeX = xDir * (bodyLength / 2 - leadThickness / 2)\n const bridgeLength = Math.abs(bodyEdgeX - verticalLeadX)\n const bridgeCenterX = (verticalLeadX + bodyEdgeX) / 2\n\n return (\n <Colorize color=\"#c0c0c0\">\n <Union>\n <Cuboid\n size={[bodyHeight * 0.8, padWidth, leadThickness]}\n center={[lowerPadX, 0, leadThickness / 2]}\n />\n <Cuboid\n size={[leadThickness, padWidth, leadHeight]}\n center={[verticalLeadX, 0, leadHeight / 2 + leadThickness]}\n />\n <Cuboid\n size={[bridgeLength, padWidth, leadThickness]}\n center={[bridgeCenterX, 0, leadThickness / 2 + leadHeight]}\n />\n </Union>\n </Colorize>\n )\n }\n\n return (\n <>\n <Lead xDir={1} />\n <Lead xDir={-1} />\n {Body}\n </>\n )\n}\n\nexport default SMB\n","import { Cuboid, Colorize, Union, Hull, Translate } from \"jscad-fiber\"\n\nexport const SMC = () => {\n const bodyWidth = 6.8\n const bodyLength = 6\n const bodyHeight = 2.3\n const padWidth = 2.95\n const padThickness = 0.2 // the cad model above of bottom\n\n const leadThickness = 0.2\n const leadHeight = 1.14\n\n const taperOffset = 0.4\n const straightHeight = bodyHeight * 0.5\n\n const Body = (\n <Colorize color=\"#1a1a1a\">\n <Union>\n <Hull>\n <Translate z={padThickness + 0.01}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.03]}\n />\n </Translate>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n </Hull>\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n )\n\n const Lead = ({ xDir }: { xDir: number }) => {\n const verticalGap = 1\n const lowerPadGap = 1\n const lowerPadX =\n xDir * (bodyLength / 2 - (bodyHeight * 0.8) / 2 + lowerPadGap)\n const verticalLeadX =\n xDir * (bodyLength / 2 - leadThickness / 2 + verticalGap)\n const bodyEdgeX = xDir * (bodyLength / 2 - leadThickness / 2)\n const bridgeLength = Math.abs(bodyEdgeX - verticalLeadX)\n const bridgeCenterX = (verticalLeadX + bodyEdgeX) / 2\n\n return (\n <Colorize color=\"#c0c0c0\">\n <Union>\n <Cuboid\n size={[bodyHeight * 0.8, padWidth, leadThickness]}\n center={[lowerPadX, 0, leadThickness / 2]}\n />\n <Cuboid\n size={[leadThickness, padWidth, leadHeight]}\n center={[verticalLeadX, 0, leadHeight / 2 + leadThickness]}\n />\n <Cuboid\n size={[bridgeLength, padWidth, leadThickness]}\n center={[bridgeCenterX, 0, leadThickness / 2 + leadHeight]}\n />\n </Union>\n </Colorize>\n )\n }\n\n return (\n <>\n <Lead xDir={1} />\n <Lead xDir={-1} />\n {Body}\n </>\n )\n}\n\nexport default SMC\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SMF = () => {\n const fullWidth = 2.9\n const bodyLength = 1.9\n const bodyHeight = 1.08\n\n const padWidth = 1.2\n const padLength = 1\n const padThickness = 0.25\n\n const bodyWidth = fullWidth\n const leftPadCenterX = -1.3\n const rightPadCenterX = 1.3\n\n const taperOffset = 0.2\n const straightHeight = bodyHeight * 0.5\n\n const Body = (\n <Colorize color=\"#222\">\n <Union>\n <Translate z={straightHeight / 2}>\n <Cuboid size={[bodyWidth, bodyLength, straightHeight]} />\n </Translate>\n\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n )\n\n return (\n <>\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {Body}\n </>\n )\n}\n\nexport default SMF\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD123F = () => {\n const fullWidth = 2.7\n const bodyLength = 1.6\n const bodyHeight = 1.1\n\n const padWidth = 0.6\n const padLength = 1\n const padThickness = 0.12\n\n const leftPadCenterX = -1.3\n const rightPadCenterX = 1.3\n\n const taperOffset = 0.2\n const straightHeight = bodyHeight * 0.5\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Union>\n {/* Middle straight section */}\n <Translate z={straightHeight / 2}>\n <Cuboid size={[fullWidth, bodyLength, straightHeight]} />\n </Translate>\n\n {/* Top taper section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[fullWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[fullWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n </>\n )\n}\n\nexport default SOD123F\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD123FL = () => {\n const fullWidth = 2.75\n const bodyLength = 1.8\n\n const bodyHeight = 1\n\n const padWidth = 0.9\n const padLength = 1\n const padThickness = 0.2\n\n const leftPadCenterX = -(fullWidth / 2 - 0.075)\n const rightPadCenterX = fullWidth / 2 - 0.075\n\n const taperOffset = 0.4\n const straightHeight = bodyHeight * 0.2\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Union>\n {/* Middle straight section */}\n <Translate z={straightHeight / 2}>\n <Cuboid size={[fullWidth, bodyLength, straightHeight]} />\n </Translate>\n\n {/* Top taper section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[fullWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[fullWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[padThickness, bodyLength - taperOffset, 0.01]}\n center={[leftPadCenterX + taperOffset, 0, bodyHeight]}\n />\n </>\n )\n}\n\nexport default SOD123FL\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport interface SOD123WProps {\n /** Body extent along the leads (X). */\n bodyWidth?: number\n /** Body extent across the leads (Y). */\n bodyLength?: number\n bodyHeight?: number\n}\n\n/**\n * SOD-123W.\n *\n * Defaults are the package outline for that designation — 2.60 x 1.70, per\n * KiCad's `Nexperia_CFP3_SOD-123W` F.Fab layer, which is the same reference\n * footprinter's own kicad-parity tests compare against.\n *\n * The dimensions are props because the shape (a moulded body with a metal cap\n * at each end) serves several designations at different sizes; the SIZE is\n * what makes it one package or another, so it must never be assumed. `sod110`\n * used these defaults for a while and rendered a body 24% too long.\n */\nexport const SOD123W = ({\n bodyWidth = 2.6,\n bodyLength = 1.7,\n bodyHeight = 1,\n}: SOD123WProps = {}) => {\n const fullWidth = bodyWidth\n\n const padWidth = bodyLength * 0.53\n const padLength = bodyWidth * 0.35\n const padThickness = 0.2\n\n const leftPadCenterX = -(fullWidth / 2 - 0.075)\n const rightPadCenterX = fullWidth / 2 - 0.075\n\n const taperOffset = 0.4\n const lowerTaperOffset = 0.1\n const straightHeight = bodyHeight * 0.2\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Union>\n {/* Middle straight section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid\n size={[\n fullWidth - lowerTaperOffset / 2,\n bodyLength - lowerTaperOffset / 2,\n 0.01,\n ]}\n />\n </Translate>\n <Translate z={0.01}>\n <Cuboid\n size={[\n fullWidth - lowerTaperOffset,\n bodyLength - lowerTaperOffset,\n 0.01,\n ]}\n />\n </Translate>\n </Hull>\n\n {/* Top taper section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[fullWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[fullWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[padThickness * 2.7, bodyLength - taperOffset, 0.02]}\n center={[leftPadCenterX + taperOffset, 0, bodyHeight]}\n />\n </>\n )\n}\n\nexport default SOD123W\n","import { Cuboid } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport interface SOD123Props {\n /** Overall package length, including the leads, in millimeters. */\n fullWidth?: number\n /** Molded package width in millimeters. */\n fullLength?: number\n}\n\n/**\n * SOD-123 diode package.\n *\n * The defaults are the nominal dimensions from the Vishay 1N4148W package\n * drawing: https://www.vishay.com/docs/86356/1n4148w.pdf\n */\nexport const SOD123 = ({\n fullWidth = 3.7,\n fullLength = 1.55,\n}: SOD123Props = {}) => {\n const bodyWidth = fullWidth - 1\n const bodyLength = fullLength\n const packageHeight = 1.175\n const bodyStandoff = 0.1\n const bodyHeight = packageHeight - bodyStandoff\n const leadWidth = 0.55\n const leadThickness = 0.12\n const leadHeight = 0.35\n const bodyDistance = (fullWidth - bodyWidth) / 2\n const padContactLength = 0.25\n const leadCurveLength = 0.2\n\n return (\n <>\n <SmdChipLead\n position={{\n x: -fullWidth / 2,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n curveLength={leadCurveLength}\n height={leadHeight}\n />\n\n <SmdChipLead\n rotation={Math.PI}\n position={{\n x: fullWidth / 2,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n curveLength={leadCurveLength}\n height={leadHeight}\n />\n\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n heightAboveSurface={bodyStandoff}\n includeNotch={false}\n color=\"#222\"\n taperRatio={0.06}\n straightHeightRatio={0.6}\n />\n\n <Cuboid\n color=\"#777\"\n size={[0.45, bodyLength - 0.15, 0.02]}\n center={[-bodyWidth / 4, 0, packageHeight]}\n />\n </>\n )\n}\n\nexport default SOD123\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD128 = () => {\n const fullWidth = 3.8\n const bodyLength = 2.5\n\n const bodyHeight = 1\n\n const padWidth = 1.75\n const padLength = 0.9\n const padThickness = 0.2\n\n const leftPadCenterX = -(fullWidth / 2 - 0.075)\n const rightPadCenterX = fullWidth / 2 - 0.075\n\n const taperOffset = 0.4\n const lowerTaperOffset = 0.05\n const straightHeight = bodyHeight * 0.2\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Union>\n {/* Middle straight section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid\n size={[\n fullWidth - lowerTaperOffset / 2,\n bodyLength - lowerTaperOffset / 2,\n 0.01,\n ]}\n />\n </Translate>\n <Translate z={0.01}>\n <Cuboid\n size={[\n fullWidth - lowerTaperOffset,\n bodyLength - lowerTaperOffset,\n 0.01,\n ]}\n />\n </Translate>\n </Hull>\n\n {/* Top taper section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[fullWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[fullWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[padThickness * 2.7, bodyLength - taperOffset, 0.02]}\n center={[leftPadCenterX + taperOffset, 0, bodyHeight]}\n />\n </>\n )\n}\n\nexport default SOD128\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD923 = () => {\n const fullWidth = 0.8\n const bodyLength = 0.6\n\n const bodyHeight = 0.37\n\n const padWidth = 0.25\n const padLength = 0.4\n const padThickness = 0.14\n\n const leftPadCenterX = -(fullWidth / 2)\n const rightPadCenterX = fullWidth / 2\n\n const taperOffset = 0.1\n const straightHeight = padThickness\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Union>\n {/* Middle straight section */}\n <Translate z={straightHeight / 2}>\n <Cuboid size={[fullWidth, bodyLength, straightHeight]} />\n </Translate>\n\n {/* Top taper section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[fullWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[fullWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n </>\n )\n}\n\nexport default SOD923\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport interface SOT223Props {\n /** Pad-to-pad span across the leads (X). */\n fullWidth?: number\n /** X extent of the moulded body. */\n bodyWidth?: number\n /** Y extent of the moulded body. */\n bodyLength?: number\n bodyHeight?: number\n /** Y width of the three signal leads. */\n leadWidth?: number\n /** Y width of the single wide tab lead on the opposite side. */\n tabLeadWidth?: number\n /** Y pitch of the signal leads. */\n padPitch?: number\n /** How high the lead rises from the pad to the body face. */\n leadHeight?: number\n}\n\n/**\n * SOT-223 and its smaller relative SOT-89: three leads one side, one wide tab\n * lead the other. Same construction, different dimensions, so the dimensions\n * are props — SOT-89's body is 4.5 x 2.5 x 1.5, barely a third of the volume.\n */\nexport const SOT223 = ({\n fullWidth = 6.6,\n bodyWidth = 3.5,\n bodyLength = 6.5,\n bodyHeight = 1.7,\n leadWidth = 0.7,\n tabLeadWidth = 3,\n padPitch = 2.3,\n leadHeight = 0.75,\n}: SOT223Props = {}) => {\n const leftLeadWidth = tabLeadWidth\n const leadThickness = 0.25\n const padContactLength = 0.5\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = fullWidth - bodyWidth\n\n return (\n <>\n {/* Leads on the right side (pin 1) */}\n <SmdChipLead\n key={4}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leftLeadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the left side (pin 3) */}\n <SmdChipLead\n key={3}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: -padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n includeNotch={false}\n taperRatio={0.06}\n straightHeightRatio={0.45}\n />\n </>\n )\n}\n\nexport default SOT223\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const TQFP = () => {\n const pinCount = 64\n const pitch = 0.5\n const leadWidth = 0.2\n const padContactLength = 0.45\n const bodyWidth = 9\n const sidePinCount = pinCount / 4\n const bodyLength = bodyWidth\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const fullLength = bodyLength + 2 * padContactLength + 0.6\n const fullWidth = fullLength\n const leadHeight = 0.65\n const leadThickness = 0.25\n const bodyDistance = (fullWidth - bodyWidth) / 2 + 0.2\n\n return (\n <>\n {/* Pins on the left side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`left-${i}`}\n position={{\n x: -fullWidth / 2,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the right side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the bottom side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`bottom-${i}`}\n rotation={Math.PI / 2}\n position={{\n x: i * pitch - pinOffsetToCenter,\n y: -fullLength / 2,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the top side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`top-${i}`}\n rotation={-Math.PI / 2}\n position={{\n x: i * pitch - pinOffsetToCenter,\n y: fullLength / 2,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={1.2}\n chamferSize={0.7}\n taperRatio={0.05}\n notchPosition={{ x: -3.5, y: 3.5, z: 1.2 }}\n notchRadius={1.2 / 2}\n />\n </>\n )\n}\n\nexport default TQFP\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOT323 = () => {\n const fullWidth = 2.05\n const bodyWidth = 1.25\n const bodyLength = 2.0\n const bodyHeight = 0.9\n const leadWidth = 0.3\n const leadThickness = 0.18\n const leadHeight = 0.65\n const padContactLength = 0.2\n const padPitch = 0.65\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = fullWidth - bodyWidth\n\n return (\n <>\n {/* Lead on the right side (pin 1) */}\n <SmdChipLead\n key={4}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the left side (pin 3) */}\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: -padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n includeNotch={false}\n taperRatio={0.06}\n straightHeightRatio={0.7}\n heightAboveSurface={0.05}\n />\n </>\n )\n}\n\nexport default SOT323\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n Hull,\n Subtract,\n Translate,\n Union,\n} from \"jscad-fiber\"\n\n/** Physical package dimensions in mm, independent of copper land dimensions.\n * Four equal lead rows surround the mold. Z=0 is the seating plane.\n * Pin 1 is at negative X, positive Y. Bend curvature and the pin-1 dimple are\n * visual approximations, not additional package-identification parameters.\n */\nexport interface PhysicalLqfpDimensions {\n pinCount: number\n pitch: number\n bodyWidth: number\n bodyLength: number\n /** Overall height A, including standoff A1. */\n bodyHeight: number\n standoff: number\n /** Outer lead-tip to outer lead-tip dimension E. */\n leadSpanX: number\n leadSpanY: number\n leadWidth: number\n leadThickness: number\n /** Horizontal terminal contact, not the PCB land length. */\n contactLength: number\n /** Per-side inset of the top and bottom mold faces. */\n taperInset: number\n}\n\nexport function createPhysicalLqfp(p: PhysicalLqfpDimensions) {\n const {\n pinCount,\n pitch,\n bodyWidth,\n bodyLength,\n bodyHeight,\n standoff,\n leadSpanX,\n leadSpanY,\n leadWidth,\n leadThickness,\n contactLength,\n taperInset,\n } = p\n for (const key of [\n \"pitch\",\n \"bodyWidth\",\n \"bodyLength\",\n \"bodyHeight\",\n \"leadSpanX\",\n \"leadSpanY\",\n \"leadWidth\",\n \"leadThickness\",\n \"contactLength\",\n ] as const)\n if (!Number.isFinite(p[key]) || p[key] <= 0)\n throw new Error(`${key} must be finite and positive`)\n for (const [name, value] of Object.entries({\n standoff,\n taperInset,\n }))\n if (!Number.isFinite(value) || value < 0)\n throw new Error(`${name} must be finite and nonnegative`)\n if (!Number.isInteger(pinCount) || pinCount < 8 || pinCount % 4)\n throw new Error(\"pinCount must be divisible by four and at least eight\")\n const moldHeight = bodyHeight - standoff\n const reach = Math.min(leadSpanX - bodyWidth, leadSpanY - bodyLength) / 2\n const rowLength = (pinCount / 4 - 1) * pitch + leadWidth\n if (\n moldHeight <= leadThickness * 2 ||\n leadWidth >= pitch ||\n rowLength >= Math.min(bodyWidth, bodyLength) - 2 * taperInset ||\n taperInset * 2 >= Math.min(bodyWidth, bodyLength) ||\n contactLength >= reach\n )\n throw new Error(\"Invalid mold, lead spacing, or terminal reach\")\n const midZ = standoff + moldHeight / 2\n const slice = Math.min(0.002, moldHeight / 100)\n const body = (\n <Hull>\n <Translate z={standoff + slice / 2}>\n <Cuboid\n size={[\n bodyWidth - 2 * taperInset,\n bodyLength - 2 * taperInset,\n slice,\n ]}\n />\n </Translate>\n <Translate z={midZ}>\n <Cuboid size={[bodyWidth, bodyLength, slice]} />\n </Translate>\n <Translate z={bodyHeight - slice / 2}>\n <Cuboid\n size={[\n bodyWidth - 2 * taperInset,\n bodyLength - 2 * taperInset,\n slice,\n ]}\n />\n </Translate>\n </Hull>\n )\n const dimpleRadius = Math.min(bodyWidth, bodyLength) * 0.045\n const dimpleDepth = Math.min(0.04, moldHeight / 10)\n // Smoothstep centerline, made from overlapping convex slices: positive-volume\n // solids in both React and vanilla renderers. Each root extends into the mold.\n const lead = (side: number, along: number) => {\n const horizontal = side % 2 === 0\n const sign = side < 2 ? -1 : 1\n const width = horizontal ? bodyWidth : bodyLength\n const outer = (horizontal ? leadSpanX : leadSpanY) / 2\n const root = width / 2 - Math.min(width / 8, 0.15)\n const bendStart = outer - contactLength\n const bendEnd = width / 2 + Math.min(0.08, (reach - contactLength) / 4)\n const points: [number, number][] = [\n [outer - slice / 2, leadThickness / 2],\n [bendStart, leadThickness / 2],\n ]\n for (let i = 1; i <= 12; i++) {\n const t = i / 12\n points.push([\n bendStart + (bendEnd - bendStart) * t,\n leadThickness / 2 + (midZ - leadThickness / 2) * t * t * (3 - 2 * t),\n ])\n }\n points.push([root, midZ])\n const section = ([x, z]: [number, number]) => (\n <Translate\n offset={{\n x: horizontal ? sign * x : along,\n y: horizontal ? along : sign * x,\n z,\n }}\n >\n <Cuboid\n size={\n horizontal\n ? [slice, leadWidth, leadThickness]\n : [leadWidth, slice, leadThickness]\n }\n />\n </Translate>\n )\n return (\n <Union>\n {points.slice(1).map((point, i) => (\n <Hull key={i}>\n {section(points[i]!)}\n {section(point)}\n </Hull>\n ))}\n </Union>\n )\n }\n return (\n <>\n <Colorize color=\"#353535\">\n <Subtract>\n {body}\n <Translate\n offset={{\n x: -bodyWidth / 2 + taperInset + dimpleRadius * 2,\n y: bodyLength / 2 - taperInset - dimpleRadius * 2,\n z: bodyHeight,\n }}\n >\n <Cylinder radius={dimpleRadius} height={dimpleDepth * 2} />\n </Translate>\n </Subtract>\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n {Array.from({ length: pinCount }, (_, i) =>\n lead(\n Math.floor(i / (pinCount / 4)),\n ((pinCount / 4 - 1) / 2 - (i % (pinCount / 4))) * pitch,\n ),\n )}\n </Colorize>\n </>\n )\n}\n","import {\n createPhysicalLqfp,\n type PhysicalLqfpDimensions,\n} from \"./utils/PhysicalLqfp\"\nimport { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nconst LegacyLQFP = ({\n pinCount,\n pitch,\n leadWidth,\n padContactLength,\n bodyWidth,\n}: {\n pinCount: number\n pitch?: number\n leadWidth?: number\n padContactLength?: number\n bodyWidth?: number\n}) => {\n const sidePinCount = pinCount / 4\n if (sidePinCount !== Math.floor(sidePinCount)) {\n throw new Error(`LQFP pinCount must be divisible by 4, got ${pinCount}`)\n }\n\n // get default values if not specified\n if (!pitch) pitch = 0.5\n if (!padContactLength) padContactLength = 0.6\n if (!leadWidth) leadWidth = 0.22\n if (!bodyWidth) bodyWidth = pitch * (sidePinCount + 4)\n\n const bodyLength = bodyWidth\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const fullLength = bodyLength + 3.3 * padContactLength\n const fullWidth = fullLength\n const leadHeight = 0.8\n const leadThickness = 0.2\n const bodyDistance = (fullWidth - bodyWidth) / 2 + 0.4\n\n return (\n <>\n {/* Pins on the left side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`left-${i}`}\n position={{\n x: -fullWidth / 2 - 0.36,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the right side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + 0.36,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the bottom side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`bottom-${i}`}\n rotation={Math.PI / 2}\n position={{\n x: i * pitch - pinOffsetToCenter,\n y: -fullLength / 2 - 0.36,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n {/* Pins on the top side */}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`top-${i}`}\n rotation={-Math.PI / 2}\n position={{\n x: i * pitch - pinOffsetToCenter,\n y: fullLength / 2 + 0.36,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n ))}\n\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={1.5}\n heightAboveSurface={0.1}\n taperRatio={0.04}\n chamferSize={0.7}\n notchPosition={{\n x: -(bodyLength / 2 - 1.5),\n y: bodyLength / 2 - 1.5,\n z: 1.5,\n }}\n notchRadius={1.5 / 2}\n />\n </>\n )\n}\n\n/** leadSpanX selects explicit physical dimensions. Existing callers retain\n * their legacy geometry. See standard outline evidence in the fixtures.\n */\nexport type LQFPProps =\n | Parameters<typeof LegacyLQFP>[0]\n | PhysicalLqfpDimensions\nexport const LQFP = (props: LQFPProps) =>\n \"leadSpanX\" in props ? createPhysicalLqfp(props) : LegacyLQFP(props)\nexport default LQFP\n","import { Cuboid, Translate, Colorize, Hull, Union } from \"jscad-fiber\"\n\nexport const SOT723 = () => {\n // Body dimensions (mm)\n const bodyWidth = 0.85\n const bodyLength = 1.2\n const bodyHeight = 0.38\n\n const straightHeight = bodyHeight * 0.55\n const taperOffset = 0.1\n\n const padLength = 0.3\n const padThickness = 0.1\n const leftPadWidth = 0.2\n const rightPadWidth = 0.25\n\n const rightPadCenterX = 0.55\n const rightPadCenterY = 0\n\n const leftTopPadCenterX = -0.55\n const leftTopPadCenterY = 0.4\n\n const leftBottomPadCenterX = -0.55\n const leftBottomPadCenterY = -0.4\n\n return (\n <>\n {/* Body with straight lower section + hulled tapered top */}\n <Colorize color=\"#222\">\n <Union>\n {/* straight lower section */}\n <Cuboid\n size={[bodyWidth, bodyLength, straightHeight]}\n center={[0, 0, straightHeight / 2]}\n />\n\n {/* tapered top via Hull between two thin slices */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n\n {/* Pads */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, rightPadWidth, padThickness]}\n center={[rightPadCenterX, rightPadCenterY, padThickness / 2]}\n />\n\n <Cuboid\n color=\"#ccc\"\n size={[padLength, leftPadWidth, padThickness]}\n center={[leftTopPadCenterX, leftTopPadCenterY, padThickness / 2]}\n />\n\n <Cuboid\n color=\"#ccc\"\n size={[padLength, leftPadWidth, padThickness]}\n center={[leftBottomPadCenterX, leftBottomPadCenterY, padThickness / 2]}\n />\n </>\n )\n}\n\nexport default SOT723\n","import { componentMaterials } from \"./materials\"\n/** Parameterized dual-flat no-lead package family. Dimensions are millimeters.\n * Manufacturer case names belong in fixtures, not in model dispatch or exports.\n * Existing chamfered rendering remains the default; rectangular variants expose\n * mold standoff, terminal setback/thickness and optional pin-1 corner cuts.\n */\nimport { Colorize, Cuboid, Hull, Subtract } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\nexport const DFN = ({\n num_pins,\n bodyWidth = 5.3,\n bodyLength = 5.3,\n bodyThickness = 1,\n thermalPadSize,\n // For a body length of 5 the typical pad width/length are 0.6 and 1.\n // Scale those values proportionally when `bodyLength` changes.\n padWidth = (bodyLength / 5.3) * 0.6,\n padLength = (bodyLength / 5.3) * 1,\n pitch = 0.5,\n thermalPadThickness = 0.2,\n bodyStyle = \"chamfered\",\n standoff = 0,\n terminalInset = 0,\n terminalThickness = thermalPadThickness,\n pin1TerminalChamfer = 0,\n pin1MarkWidth = 0,\n}: {\n num_pins: number\n bodyWidth?: number\n bodyLength?: number\n bodyThickness?: number\n thermalPadSize?: {\n width: number\n length: number\n }\n padWidth?: number\n padLength?: number\n pitch?: number\n thermalPadThickness?: number\n /** Rectangular bodies support small no-lead variants; legacy outline is the default. */\n bodyStyle?: \"chamfered\" | \"rectangular\"\n /** For rectangular bodies: mold bottom above the seating plane, mm. Body thickness excludes this gap. */\n standoff?: number\n /** Setback of terminal outer edges from the mold edges, mm. */\n terminalInset?: number\n /** Leadframe thickness, independent of the optional exposed pad, mm. */\n terminalThickness?: number\n /** Two outside corner cuts on terminal 1, mm. */\n pin1TerminalChamfer?: number\n /** For rectangular bodies: optional top pin-1 stripe width in mm; zero omits it. */\n pin1MarkWidth?: number\n}) => {\n if (bodyStyle === \"rectangular\") {\n if (!Number.isInteger(num_pins) || num_pins < 2 || num_pins % 2 !== 0)\n throw new Error(\"DFN requires an even pin count of at least two\")\n for (const value of [\n bodyWidth,\n bodyLength,\n bodyThickness,\n padWidth,\n padLength,\n pitch,\n terminalThickness,\n ])\n if (!Number.isFinite(value) || value <= 0)\n throw new Error(\"DFN dimensions must be finite and positive\")\n for (const value of [\n standoff,\n terminalInset,\n pin1TerminalChamfer,\n pin1MarkWidth,\n ])\n if (!Number.isFinite(value) || value < 0)\n throw new Error(\"DFN offsets must be finite and nonnegative\")\n if (\n terminalThickness <= standoff ||\n terminalThickness > standoff + bodyThickness ||\n terminalInset + padLength >= bodyWidth / 2 ||\n (num_pins / 2 - 1) * pitch + padWidth > bodyLength ||\n (num_pins > 2 && padWidth >= pitch) ||\n pin1TerminalChamfer >= Math.min(padLength, padWidth / 2) ||\n pin1MarkWidth >= bodyWidth / 4\n )\n throw new Error(\n \"DFN dimensions leave disconnected or overlapping terminals\",\n )\n }\n // DFN packages have pads on two opposite sides (left & right).\n // Distribute pins evenly between the two sides.\n const pinPositions: Array<{\n pinNumber: number\n x: number\n y: number\n padSizeX: number // size across the package X axis (pad width)\n padSizeY: number // size along the package Y axis (pad length)\n }> = []\n\n const pinsPerSide = Math.floor(num_pins / 2)\n // pinSpan = distance between first and last pin on a side (along Y)\n const pinSpan = pitch * (pinsPerSide - 1)\n\n for (let i = 0; i < num_pins; i++) {\n const side = i < pinsPerSide ? \"left\" : \"right\"\n const indexOnSide = i % pinsPerSide\n const y = pinSpan / 2 - indexOnSide * pitch\n\n // Pads on DFN are typically oriented vertically (long edge along Y)\n const padSizeX = padLength // X dimension of pad (short side)\n const padSizeY = padWidth // Y dimension of pad (long side)\n\n // x position: place pad inside the body so its outer edge touches the\n // package edge. Pad center should be half the pad X size away from edge.\n const x =\n side === \"left\"\n ? -bodyWidth / 2 + padSizeX / 2 + terminalInset\n : bodyWidth / 2 - padSizeX / 2 - terminalInset\n\n const pinNumber = i + 1\n pinPositions.push({ pinNumber, x, y, padSizeX, padSizeY })\n }\n\n if (bodyStyle === \"rectangular\") {\n const top = standoff + bodyThickness\n const inkThickness = Math.min(bodyThickness, bodyLength) / 100\n const stripe = (\n <Cuboid\n size={[pin1MarkWidth, bodyLength * 0.8, inkThickness]}\n center={[\n -bodyWidth / 2 + pin1MarkWidth * 1.5,\n 0,\n top - inkThickness / 2,\n ]}\n />\n )\n const body = (\n <Cuboid\n size={[bodyWidth, bodyLength, bodyThickness]}\n center={[0, 0, standoff + bodyThickness / 2]}\n />\n )\n return (\n <>\n <Colorize material={componentMaterials.moldedPlastic} color=\"#25272a\">\n {pin1MarkWidth > 0 ? (\n <Subtract>\n {body}\n {stripe}\n </Subtract>\n ) : (\n body\n )}\n </Colorize>\n <Colorize material={componentMaterials.tinnedLead} color=\"#c7c9cd\">\n {pinPositions.map((p) =>\n p.pinNumber === 1 && pin1TerminalChamfer > 0 ? (\n <Hull key={p.pinNumber}>\n <Cuboid\n size={[\n padLength - pin1TerminalChamfer,\n padWidth,\n terminalThickness,\n ]}\n center={[\n p.x + pin1TerminalChamfer / 2,\n p.y,\n terminalThickness / 2,\n ]}\n />\n <Cuboid\n size={[\n padLength,\n padWidth - 2 * pin1TerminalChamfer,\n terminalThickness,\n ]}\n center={[p.x, p.y, terminalThickness / 2]}\n />\n </Hull>\n ) : (\n <Cuboid\n key={p.pinNumber}\n size={[p.padSizeX, p.padSizeY, terminalThickness]}\n center={[p.x, p.y, terminalThickness / 2]}\n />\n ),\n )}\n </Colorize>\n {thermalPadSize && (\n <Cuboid\n material={componentMaterials.tinnedLead}\n color=\"#c7c9cd\"\n size={[\n thermalPadSize.width,\n thermalPadSize.length,\n thermalPadThickness,\n ]}\n center={[0, 0, thermalPadThickness / 2]}\n />\n )}\n {pin1MarkWidth > 0 && <Colorize color=\"#969997\">{stripe}</Colorize>}\n </>\n )\n }\n return (\n <>\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyThickness}\n heightAboveSurface={0}\n color=\"grey\"\n chamferSize={0.2}\n taperRatio={0}\n notchPosition={{\n x: -(bodyWidth / 2 - padLength),\n y: bodyLength / 2 - padLength,\n z: bodyThickness,\n }}\n />\n {pinPositions.map((p, i) => (\n <Cuboid\n key={i}\n center={[p.x, p.y, thermalPadThickness / 2]}\n size={[p.padSizeX, p.padSizeY, thermalPadThickness]}\n />\n ))}\n {thermalPadSize?.length !== undefined &&\n thermalPadSize?.width !== undefined && (\n <Cuboid\n center={[0, 0, thermalPadThickness / 2]}\n size={[\n thermalPadSize.width,\n thermalPadSize.length,\n thermalPadThickness,\n ]}\n />\n )}\n </>\n )\n}\n\nexport default DFN\n","import { Colorize, Cylinder, Hull, RoundedCylinder } from \"jscad-fiber\"\n\nexport interface HC49Props {\n /** overall body length (mm) */\n bodyLength?: number\n /** body width (mm) */\n bodyWidth?: number\n /** body height (mm) */\n bodyHeight?: number\n /** distance between lead centers (mm) */\n leadSpacing?: number\n /** lead diameter (mm) */\n leadDiameter?: number\n /** length of the lead below the body (mm) */\n leadLength?: number\n color?: string\n leadColor?: string\n}\n\n/**\n * HC-49 (through-hole crystal) simplified 3D model.\n * Defaults chosen to match the HC-49/U-S recommended land pattern and dimensions.\n */\nexport const HC49 = ({\n bodyLength = 10.2,\n bodyWidth = 4.65,\n bodyHeight = 13.46,\n leadSpacing = 5,\n leadDiameter = 0.8,\n leadLength = 12.7,\n color = \"#ddd\",\n leadColor = \"#b87333\",\n}: HC49Props) => {\n // positions and sizes\n const halfLength = bodyLength / 2\n\n // build a capsule-like body by hullling two cylinders (circular ends) across the X axis\n const endRadius = bodyWidth / 2\n const endCenterX = halfLength - endRadius\n // center X for the through-hole leads (distance between centers = leadSpacing)\n const leadCenterX = leadSpacing / 2\n const baseHeight = 0.85\n\n return (\n <>\n <Colorize color={color}>\n <Hull>\n <RoundedCylinder\n height={bodyHeight}\n roundRadius={0.5}\n radius={endRadius}\n center={[-endCenterX, 0, bodyHeight]}\n />\n <RoundedCylinder\n height={bodyHeight}\n roundRadius={0.5}\n radius={endRadius}\n center={[endCenterX, 0, bodyHeight]}\n />\n </Hull>\n <Hull>\n <RoundedCylinder\n height={baseHeight}\n roundRadius={0.1}\n radius={endRadius + 0.85}\n center={[-endCenterX, 0, bodyHeight / 2 + baseHeight / 2]}\n />\n <RoundedCylinder\n height={baseHeight}\n roundRadius={0.1}\n radius={endRadius + 0.85}\n center={[endCenterX, 0, bodyHeight / 2 + baseHeight / 2]}\n />\n </Hull>\n </Colorize>\n\n {/* leads (through-hole) - cylinders oriented along Z, extending below the body */}\n <Colorize color={leadColor}>\n <Cylinder\n height={leadLength + bodyHeight / 2}\n radius={leadDiameter / 2}\n center={[-leadCenterX + 0.06, 0, -(leadLength / 2) + bodyHeight / 2]}\n />\n <Cylinder\n height={leadLength + bodyHeight / 2}\n radius={leadDiameter / 2}\n center={[leadCenterX - 0.06, 0, -(leadLength / 2) + bodyHeight / 2]}\n />\n </Colorize>\n </>\n )\n}\n\nexport default HC49\n","import {\n Colorize,\n Cylinder,\n RoundedCylinder,\n Rotate,\n RoundedCuboid,\n} from \"jscad-fiber\"\n\nexport interface MicroMELFProps {\n bodyLength?: number\n bodyDiameter?: number\n color?: string\n contactColor?: string\n cathodeIdentification?: string\n}\n\nexport const MicroMELF = ({\n bodyLength = 1.4,\n bodyDiameter = 1.1,\n color = \"#3a3a3aff\",\n contactColor = \"#c6c6c6\",\n cathodeIdentification = \"#111\",\n}: MicroMELFProps) => {\n const padLength = 0.2\n\n return (\n <>\n <Colorize color={color}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCuboid\n size={[bodyDiameter, bodyDiameter, bodyLength - padLength]}\n roundRadius={padLength}\n center={[-bodyDiameter / 2, 0, 0.05]}\n />\n <Cylinder\n height={padLength / 2}\n radius={bodyDiameter / 2 - padLength}\n center={[-bodyDiameter / 2, 0, -bodyLength / 2 + padLength / 2]}\n />\n </Rotate>\n </Colorize>\n {/* Cathode identification: a dark stripe near the left end of the body */}\n\n <Colorize color={cathodeIdentification}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCuboid\n size={[bodyDiameter * 1.01, bodyDiameter * 1.01, bodyLength / 3]}\n roundRadius={padLength}\n center={[-bodyDiameter / 2, 0, -bodyLength / 4 + 0.1]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={contactColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={padLength}\n radius={bodyDiameter / 2}\n roundRadius={padLength / 3}\n center={[-bodyDiameter / 2, 0, -bodyLength / 2]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={contactColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={padLength}\n radius={bodyDiameter / 2}\n roundRadius={padLength / 3}\n center={[-bodyDiameter / 2, 0, bodyLength / 2]}\n />\n </Rotate>\n </Colorize>\n </>\n )\n}\n\nexport default MicroMELF\n","import { Colorize, Cylinder, RoundedCylinder, Rotate } from \"jscad-fiber\"\n\nexport interface MINIMELFProps {\n bodyLength?: number\n bodyDiameter?: number\n color?: string\n contactColor?: string\n bandColor?: string\n}\n\nexport const MINIMELF = ({\n bodyLength = 3.5,\n bodyDiameter = 1.5,\n color = \"#202020\",\n contactColor = \"#c6c6c6\",\n bandColor = \"#f2f2f2\",\n}: MINIMELFProps) => {\n // Vishay LL4148 outline: total L=3.3–3.7, D=1.4–1.6, terminals <=0.47 mm.\n // https://www.vishay.com/docs/85557/ll4148.pdf\n // bodyLength describes the complete case, including both end contacts.\n const contactLength = 0.4\n const glassLength = bodyLength - 2 * contactLength + 0.04\n const contactOffset = (bodyLength - contactLength) / 2\n // Seat each metal cap into the thin pad instead of touching it along a line.\n const contactRadius = bodyDiameter / 2 + 0.02\n const bandLength = 0.14\n const bandOffset = -bodyLength / 2 + contactLength + 0.35\n\n return (\n <>\n <Colorize color={color}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={glassLength}\n radius={bodyDiameter / 2}\n roundRadius={0.05}\n center={[-bodyDiameter / 2, 0, 0]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={bandColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <Cylinder\n height={bandLength}\n radius={bodyDiameter / 2 + 0.002}\n center={[-bodyDiameter / 2, 0, bandOffset]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={contactColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={contactLength}\n radius={contactRadius}\n roundRadius={0.04}\n center={[-bodyDiameter / 2, 0, -contactOffset]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={contactColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={contactLength}\n radius={contactRadius}\n roundRadius={0.04}\n center={[-bodyDiameter / 2, 0, contactOffset]}\n />\n </Rotate>\n </Colorize>\n </>\n )\n}\n\nexport default MINIMELF\n","import { Colorize, Cuboid, RoundedCylinder, Rotate } from \"jscad-fiber\"\n\nexport interface MELFProps {\n bodyLength?: number\n bodyDiameter?: number\n color?: string\n contactColor?: string\n}\n\nexport const MELF = ({\n bodyLength = 3.9,\n bodyDiameter = 2.5,\n color = \"#3a3a3aff\",\n contactColor = \"#c6c6c6\",\n}: MELFProps) => {\n const padLength = 0.55\n\n return (\n <>\n <Colorize color={color}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={bodyLength}\n radius={bodyDiameter / 2}\n roundRadius={0.3}\n center={[-bodyDiameter / 2, 0, 0]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={contactColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={padLength}\n radius={bodyDiameter / 2}\n roundRadius={0.2}\n center={[-bodyDiameter / 2, 0, -bodyLength / 2]}\n />\n </Rotate>\n </Colorize>\n\n <Colorize color={contactColor}>\n <Rotate rotation={[0, \"90deg\", 0]}>\n <RoundedCylinder\n height={padLength}\n radius={bodyDiameter / 2}\n roundRadius={0.2}\n center={[-bodyDiameter / 2, 0, bodyLength / 2]}\n />\n </Rotate>\n </Colorize>\n </>\n )\n}\n\nexport default MELF\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const MS012 = ({\n pinCount,\n padContactLength = 0.6,\n leadWidth = 0.41,\n pitch = 1.27,\n}: {\n pinCount: number\n pitch?: number\n leadWidth?: number\n padContactLength?: number\n}) => {\n if (pinCount % 2 !== 0) {\n throw new Error(\"MS012 pinCount must be even\")\n }\n const sidePinCount = pinCount / 2\n const bodyWidth = 4.9\n const bodyLength = 3.9\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const leadThickness = 0.2\n\n return (\n <>\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={i}\n position={{\n x: -bodyLength / 2 - padContactLength - 0.3,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={padContactLength + 0.4}\n height={0.85}\n />\n ))}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: bodyLength / 2 + padContactLength + 0.3,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={padContactLength + 0.4}\n height={0.85}\n />\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: leadThickness / 2 }}\n width={bodyLength}\n length={bodyWidth}\n height={1.55}\n notchPosition={{\n x: -(bodyLength / 2 - 1),\n y: bodyWidth / 2 - 1,\n z: 1.55,\n }}\n heightAboveSurface={0.17}\n taperRatio={0.09}\n />\n </>\n )\n}\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const MS013 = ({\n pinCount = 16,\n padContactLength = 0.6,\n leadWidth = 0.41,\n pitch = 1.27,\n}: {\n pinCount?: number\n pitch?: number\n leadWidth?: number\n padContactLength?: number\n}) => {\n if (pinCount !== 16) {\n throw new Error(\"MS013 only supports 16 pins\")\n }\n const sidePinCount = pinCount / 2\n const bodyWidth = 7.5\n const bodyLength = 10.3\n const pinOffsetToCenter = ((sidePinCount - 1) * pitch) / 2\n const leadThickness = 0.2\n\n return (\n <>\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={i}\n position={{\n x: -bodyWidth / 2 - padContactLength - 0.3,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={padContactLength + 0.4}\n height={0.85}\n />\n ))}\n {Array.from({ length: sidePinCount }).map((_, i) => (\n <SmdChipLead\n key={`right-${i}`}\n rotation={Math.PI}\n position={{\n x: bodyWidth / 2 + padContactLength + 0.3,\n y: i * pitch - pinOffsetToCenter,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={padContactLength + 0.4}\n height={0.85}\n />\n ))}\n <ChipBody\n center={{ x: 0, y: 0, z: leadThickness / 2 }}\n width={bodyWidth}\n length={bodyLength}\n height={1.1}\n notchPosition={{\n x: -(bodyWidth / 2 - 1.5),\n y: bodyLength / 2 - 1.5,\n z: 1.1,\n }}\n heightAboveSurface={0.17}\n taperRatio={0.05}\n />\n </>\n )\n}\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n Rotate,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\n\nexport interface TO220Lead {\n x: number\n y: number\n}\n\nexport interface TO220Props {\n /**\n * TO-220F is the fully-moulded (isolated) variant: same outline, but the\n * metal tab is encapsulated rather than exposed. Aliasing the two would\n * report a bare metal face where there is plastic — which matters as soon\n * as anything reasons about the tab, so it is a flag rather than an alias.\n */\n mouldedTab?: boolean\n /** Where the leads meet the board, from the footprint's plated holes. */\n leads?: TO220Lead[]\n /** Width across the package (X). */\n bodyWidth?: number\n /** Thickness of the moulded body (Y). */\n bodyThickness?: number\n /** Height of the moulded body above its own base. */\n bodyHeight?: number\n /** How much metal tab stands above the moulded body. */\n tabHeight?: number\n tabThickness?: number\n mountingHoleDiameter?: number\n /** Gap between the board and the underside of the body. */\n standoff?: number\n /** How far the leads run below the board. */\n leadLength?: number\n bodyColor?: string\n tabColor?: string\n leadColor?: string\n}\n\nconst TO220_DEFAULT_LEADS: TO220Lead[] = [\n { x: -2.54, y: -1 },\n { x: 0, y: -1 },\n { x: 2.54, y: -1 },\n]\n\n/**\n * TO-220, mounted upright.\n *\n * Authored standing up, in board coordinates, rather than lying down and\n * rotated into place. The rotations it used to carry were bare numbers\n * (`rotation={[0, 55, -55]}`), which both renderers read as RADIANS: 55 rad is\n * 271.3°, so the part stood up only because 271.3° is nearly -90°, and it\n * leaned 1.3° off vertical. With 16mm leads it also measured 32.5mm tall for a\n * part that is 18mm over the board, and the holes met the leads at their tips\n * instead of just under the body.\n */\nexport const TO220 = ({\n mouldedTab = false,\n leads = TO220_DEFAULT_LEADS,\n bodyWidth = 10,\n bodyThickness = 4.5,\n bodyHeight = 9.2,\n tabHeight = 6.4,\n tabThickness = 1.4,\n mountingHoleDiameter = 3.6,\n standoff = 3,\n leadLength = 3,\n bodyColor = \"#222\",\n tabColor = \"#ccc\",\n leadColor = \"#d4b106\",\n}: TO220Props = {}) => {\n const centerX = leads.reduce((sum, lead) => sum + lead.x, 0) / leads.length\n const centerY = leads.reduce((sum, lead) => sum + lead.y, 0) / leads.length\n\n const bodyBottom = standoff\n const bodyTop = bodyBottom + bodyHeight\n const tabTop = bodyTop + tabHeight\n // The tab is flush with the back face of the moulding.\n const tabY = centerY + (bodyThickness - tabThickness) / 2\n const holeZ = tabTop - Math.max(mountingHoleDiameter * 0.8, 2.6)\n\n const leadWidth = 0.8\n const leadThickness = 0.5\n\n return (\n <>\n <Colorize color={bodyColor}>\n <Cuboid\n size={[bodyWidth, bodyThickness, bodyHeight]}\n center={[centerX, centerY, bodyBottom + bodyHeight / 2]}\n />\n </Colorize>\n\n {/* The tab, with its mounting hole. A moulded (TO-220F) part has the\n same outline in plastic. */}\n <Colorize color={mouldedTab ? bodyColor : tabColor}>\n <Subtract>\n <Cuboid\n size={[bodyWidth, tabThickness, tabHeight]}\n center={[centerX, tabY, bodyTop + tabHeight / 2]}\n />\n {/* Cylinder is Z-axis only in lib/vanilla, and a `rotation` prop on\n a primitive is IGNORED there — so the hole has to be turned by a\n <Rotate> wrapper, which both renderers honour. */}\n <Rotate rotation={[\"90deg\", 0, 0]}>\n <Translate center={[centerX, holeZ, -tabY]}>\n <Cylinder\n radius={mountingHoleDiameter / 2}\n height={tabThickness * 3}\n />\n </Translate>\n </Rotate>\n </Subtract>\n </Colorize>\n\n {leads.map((lead) => (\n <Colorize color={leadColor} key={`lead-${lead.x}-${lead.y}`}>\n <Cuboid\n size={[leadWidth, leadThickness, standoff + leadLength]}\n center={[lead.x, lead.y, (standoff - leadLength) / 2]}\n />\n </Colorize>\n ))}\n </>\n )\n}\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOT457 = () => {\n const fullWidth = 2.8\n const bodyWidth = 1.6\n const bodyLength = 2.9\n const bodyHeight = 1.2\n const leadWidth = 0.4\n const leadThickness = 0.15\n const leadHeight = 0.95\n const padContactLength = 0.5\n const padPitch = 0.95\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = fullWidth - bodyWidth\n\n return (\n <>\n {/* Leads on the right side (pins 1 and 2) */}\n <SmdChipLead\n key={1}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: -padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n <SmdChipLead\n key={3}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the left side (pin 3) */}\n <SmdChipLead\n key={3}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: -padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: padPitch,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n straightHeightRatio={0.6}\n notchPosition={{\n x: -(bodyWidth / 2 - 0.4),\n y: bodyHeight / 2 + 0.4,\n z: bodyHeight + 0.05,\n }}\n notchRadius={0.1}\n />\n </>\n )\n}\n\nexport default SOT457\n","import { Cuboid } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\n\nexport const SOT963 = () => {\n const bodyWidth = 0.8\n const bodyLength = 1.0\n const bodyHeight = 0.37\n const terminalWidth = 0.15\n const terminalLength = 0.19\n const terminalThickness = 0.12\n const pitch = 0.35\n const pinsPerSide = 3\n const pinSpan = pitch * (pinsPerSide - 1)\n\n return (\n <>\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n heightAboveSurface={0}\n color=\"#1a1a1a\"\n taperRatio={0.15}\n straightHeightRatio={0}\n notchPosition={{\n x: -bodyWidth / 4,\n y: pinSpan / 2.2,\n z: bodyHeight + 0.1,\n }}\n />\n\n {[0, 1, 2].map((i) => {\n const y = -pinSpan / 2 + i * pitch\n return (\n <Cuboid\n key={`left-${i}`}\n center={[\n -bodyWidth / 2 + terminalLength / 2 - 0.1,\n y,\n terminalThickness / 2,\n ]}\n size={[terminalLength, terminalWidth, terminalThickness]}\n />\n )\n })}\n\n {[0, 1, 2].map((i) => {\n const y = -pinSpan / 2 + i * pitch\n return (\n <Cuboid\n key={`right-${i}`}\n center={[\n bodyWidth / 2 - terminalLength / 2 + 0.1,\n y,\n terminalThickness / 2,\n ]}\n size={[terminalLength, terminalWidth, terminalThickness]}\n />\n )\n })}\n </>\n )\n}\n\nexport default SOT963\n","import {\n Colorize,\n Cuboid,\n Hull,\n Translate,\n Cylinder,\n Subtract,\n} from \"jscad-fiber\"\n\nexport interface TO92Lead {\n x: number\n y: number\n}\n\nexport interface TO92Props {\n /**\n * Diameter of the round body. TO-92 comes in more than one size — `to92l`\n * is 4.8mm across, `to92s` 2.5mm — and the difference is the whole reason\n * these are separate footprints, so it must not be baked in.\n */\n bodyDiameter?: number\n bodyHeight?: number\n /** Depth of the flat cut across the cylinder. */\n flatCut?: number\n /**\n * Where the leads meet the board, taken from the footprint's plated holes.\n *\n * The pattern differs per footprint and cannot be inferred from the pitch:\n * `to92` sets its middle pin 1.27mm behind the outer two, `to92s` puts all\n * three in a row, and `to92l` places pin 1 at the origin so the group is not\n * centred at all. Defaults to `to92`'s pattern.\n */\n leads?: TO92Lead[]\n /**\n * Gap between the board and the underside of the moulded body — the leads\n * are formed in it.\n */\n standoff?: number\n /** How far the leads run below the board. */\n leadLength?: number\n bodyColor?: string\n}\n\nconst TO92_DEFAULT_LEADS: TO92Lead[] = [\n { x: -1.27, y: 0.98 },\n { x: 0, y: 2.25 },\n { x: 1.27, y: 0.98 },\n]\n\n/** The two leads furthest apart, and whatever is between them. */\nconst splitOuterLeads = (leads: TO92Lead[]) => {\n let outer: [TO92Lead, TO92Lead] = [leads[0]!, leads[leads.length - 1]!]\n let best = -1\n for (let i = 0; i < leads.length; i++) {\n for (let j = i + 1; j < leads.length; j++) {\n const separation = Math.hypot(\n leads[i]!.x - leads[j]!.x,\n leads[i]!.y - leads[j]!.y,\n )\n if (separation > best) {\n best = separation\n outer = [leads[i]!, leads[j]!]\n }\n }\n }\n return { outer, separation: best }\n}\n\n/**\n * TO-92.\n *\n * Seated and aligned from the footprint: the body is centred on the two outer\n * leads, starts `standoff` above the board and ends `bodyHeight` higher, and\n * every lead is formed from its own hole up to a row of exit points under the\n * body. It used to be translated 10.5mm up with 15mm leads on a hardcoded\n * pattern, which measured 19.5mm end to end for a 4.5mm part and only lined up\n * with one of the three TO-92 footprints.\n */\nexport const TO92 = ({\n bodyDiameter = 4.8,\n bodyHeight = 4.5,\n flatCut = 1.1,\n leads = TO92_DEFAULT_LEADS,\n standoff = 1.5,\n leadLength = 3,\n bodyColor = \"#222\",\n}: TO92Props = {}) => {\n const bodyRadius = bodyDiameter / 2\n const legWidth = 0.4\n const legThickness = 0.25\n\n const { outer, separation } = splitOuterLeads(leads)\n const [first, last] = outer\n const bodyCenter = {\n x: (first.x + last.x) / 2,\n y: (first.y + last.y) / 2,\n }\n\n // The leads leave the body base in a straight row along the outer-lead axis,\n // then splay to wherever their hole is. That is how a formed TO-92 is built,\n // and it makes the middle lead's bend fall out of the hole position rather\n // than being a constant.\n const axisLength = Math.max(separation, 0.001)\n const axis = {\n x: (last.x - first.x) / axisLength,\n y: (last.y - first.y) / axisLength,\n }\n const exitPitch = separation / 2\n const exitFor = (index: number) => {\n const offset = (index - (leads.length - 1) / 2) * exitPitch\n return {\n x: bodyCenter.x + axis.x * offset,\n y: bodyCenter.y + axis.y * offset,\n }\n }\n\n const leadSize: [number, number, number] = [\n legThickness,\n legWidth,\n legThickness,\n ]\n\n return (\n <>\n <Colorize color={bodyColor}>\n <Subtract>\n <Translate\n center={[bodyCenter.x, bodyCenter.y, standoff + bodyHeight / 2]}\n >\n <Cylinder radius={bodyRadius} height={bodyHeight} />\n </Translate>\n <Translate\n center={[\n bodyCenter.x,\n bodyCenter.y - (bodyRadius - flatCut / 2),\n standoff + bodyHeight / 2,\n ]}\n >\n <Cuboid size={[bodyRadius * 2, flatCut, bodyHeight + 0.2]} />\n </Translate>\n </Subtract>\n </Colorize>\n\n {leads.map((lead, index) => {\n const exit = exitFor(index)\n return (\n <Translate center={[0, 0, 0]} key={`lead-${lead.x}-${lead.y}`}>\n {/* formed section, from the hole up into the body base */}\n <Hull>\n <Translate center={[lead.x, lead.y, 0]}>\n <Cuboid size={leadSize} />\n </Translate>\n <Translate center={[exit.x, exit.y, standoff]}>\n <Cuboid size={leadSize} />\n </Translate>\n </Hull>\n {/* straight section, through the board and below it */}\n <Translate center={[lead.x, lead.y, -leadLength / 2]}>\n <Cuboid size={[legThickness, legWidth, leadLength]} />\n </Translate>\n </Translate>\n )\n })}\n </>\n )\n}\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOT363 = () => {\n const fullWidth = 2\n const bodyWidth = 1.25\n const bodyLength = 2\n const bodyHeight = 1.1\n const leadWidth = 0.25\n const leadThickness = 0.15\n const leadHeight = 0.85\n const padContactLength = 0.3\n\n // Increase the bodyDistance to extend leads further out\n const extendedBodyDistance = fullWidth - bodyWidth\n\n return (\n <>\n {/* Leads on the right side (pins 1 and 2) */}\n <SmdChipLead\n key={1}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: -0.65,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n <SmdChipLead\n key={3}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2 + extendedBodyDistance / 4,\n y: 0.65,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n\n {/* Lead on the left side (pin 3) */}\n <SmdChipLead\n key={3}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: -0.65,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n <SmdChipLead\n key={2}\n position={{\n x: -fullWidth / 2 - extendedBodyDistance / 4,\n y: 0.65,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={extendedBodyDistance}\n height={leadHeight}\n />\n {/* Chip Body */}\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n straightHeightRatio={0.6}\n notchPosition={{\n x: -(bodyWidth / 2 - 0.25),\n y: bodyHeight / 2 + 0.2,\n z: bodyHeight,\n }}\n heightAboveSurface={0.1}\n />\n </>\n )\n}\n\nexport default SOT363\n","import { Cuboid } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\n\nexport const SOT886 = () => {\n const bodyWidth = 1.0\n const bodyLength = 1.45\n const bodyHeight = 0.5\n const terminalWidth = 0.2\n const terminalLength = 0.3\n const terminalThickness = 0.05\n const pitch = 0.5\n const pinsPerSide = 3\n const pinSpan = pitch * (pinsPerSide - 1)\n\n return (\n <>\n <ChipBody\n center={{ x: 0, y: 0, z: terminalThickness }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n heightAboveSurface={0}\n color=\"#1a1a1a\"\n taperRatio={0}\n includeNotch={false}\n />\n\n {[0, 1, 2].map((i) => {\n const y = -pinSpan / 2 + i * pitch\n return (\n <Cuboid\n key={`left-${i}`}\n center={[\n -bodyWidth / 2 + terminalLength / 2,\n y,\n terminalThickness / 2,\n ]}\n size={[terminalLength, terminalWidth, terminalThickness]}\n />\n )\n })}\n\n {[0, 1, 2].map((i) => {\n const y = -pinSpan / 2 + i * pitch\n return (\n <Cuboid\n key={`right-${i}`}\n center={[\n bodyWidth / 2 - terminalLength / 2,\n y,\n terminalThickness / 2,\n ]}\n size={[terminalLength, terminalWidth, terminalThickness]}\n />\n )\n })}\n </>\n )\n}\n\nexport default SOT886\n","import { ChipBody } from \"./ChipBody\"\nimport { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const SOD323 = () => {\n const fullWidth = 2.5\n // Package outline for the designation, from KiCad's D_SOD-323 F.Fab layer\n // (the reference footprinter's own kicad-parity tests compare against).\n // Was 1.7 x 1.25, which is a SOD-323 about 15% too small across.\n const bodyLength = 1.4\n\n const bodyWidth = 1.8\n const bodyHeight = 0.95\n\n const leadWidth = 0.3\n const leadThickness = 0.175\n\n const padContactLength = 0.3\n\n const padCenterX = bodyWidth / 2\n\n const bodyDistance = 0.45\n const leadHeight = 0.7\n return (\n <>\n <SmdChipLead\n key={1}\n position={{\n x: -fullWidth / 2,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n\n <SmdChipLead\n key={1}\n rotation={Math.PI}\n position={{\n x: fullWidth / 2,\n y: 0,\n z: leadThickness / 2,\n }}\n width={leadWidth}\n thickness={leadThickness}\n padContactLength={padContactLength}\n bodyDistance={bodyDistance}\n height={leadHeight}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <ChipBody\n center={{ x: 0, y: 0, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n includeNotch={false}\n taperRatio={0.06}\n straightHeightRatio={0.7}\n heightAboveSurface={0.05}\n />\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[bodyWidth / 3, bodyLength - 0.075, 0.02]}\n center={[(-padCenterX * 2) / 3 + 0.035, 0, bodyHeight + 0.05]}\n />\n </>\n )\n}\n\nexport default SOD323\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\n\nexport const SOD323F = () => {\n const fullWidth = 1.7\n const bodyLength = 1.25\n const bodyHeight = 0.725\n\n const padWidth = 0.325\n const padLength = 0.4\n const padThickness = 0.175\n\n const leftPadCenterX = -fullWidth / 2 - padLength / 2\n const rightPadCenterX = fullWidth / 2 + padLength / 2\n\n const taperOffset = 0.2\n const straightHeight = padThickness\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <Union>\n {/* Middle straight section */}\n <Translate z={straightHeight / 2}>\n <Cuboid size={[fullWidth, bodyLength, straightHeight]} />\n </Translate>\n\n {/* Top taper section */}\n <Hull>\n <Translate z={straightHeight}>\n <Cuboid size={[fullWidth, bodyLength, 0.01]} />\n </Translate>\n <Translate z={bodyHeight}>\n <Cuboid\n size={[fullWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[fullWidth / 3, bodyLength - taperOffset, 0.02]}\n center={[leftPadCenterX + fullWidth / 4.4 + taperOffset, 0, bodyHeight]}\n />\n </>\n )\n}\n\nexport default SOD323F\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\n\nexport const SOD323FL = () => {\n const fullWidth = 1.775\n const bodyLength = 1.25\n const bodyHeight = 0.725\n\n const padWidth = 0.325\n const padLength = 0.4\n const padThickness = 0.13\n\n const leftPadCenterX = -fullWidth / 2 - padLength / 2 + 0.04\n const rightPadCenterX = fullWidth / 2 + padLength / 2 - 0.04\n\n const taperOffset = 0.2\n\n return (\n <>\n {/* Left pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Right pad */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body */}\n <Colorize color=\"#222\">\n <ChipBody\n width={fullWidth}\n length={bodyLength}\n height={bodyHeight}\n center={{ x: 0, y: 0, z: 0 }}\n heightAboveSurface={0}\n straightHeightRatio={0.7}\n taperRatio={0.06}\n includeNotch={false}\n />\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[fullWidth / 3, bodyLength - 0.05, 0.02]}\n center={[leftPadCenterX + fullWidth / 4.4 + taperOffset, 0, bodyHeight]}\n />\n </>\n )\n}\n\nexport default SOD323FL\n","import { Colorize, Cylinder, Rotate, Sphere, Translate } from \"jscad-fiber\"\n\ninterface AxialCapacitorProps {\n pitch: number\n}\n\nexport const AxialCapacitor = ({ pitch = 10 }: AxialCapacitorProps) => {\n const heightToCenterOfCapacitor = 0.5 + 4 / 2\n\n return (\n <>\n <Cylinder height={4} radius={0.5} center={[-pitch / 2, 0, 0.5]} />\n <Sphere\n radius={0.5}\n center={[-pitch / 2, 0, heightToCenterOfCapacitor]}\n />\n <Translate x={-2.5} y={0} z={heightToCenterOfCapacitor}>\n <Rotate rotation={[0, Math.PI / 2, 0]}>\n <Cylinder\n height={pitch}\n radius={0.5}\n center={[0, 0, heightToCenterOfCapacitor]}\n />\n <Colorize color=\"#d2b48c\">\n <Cylinder\n height={5}\n radius={1.3}\n center={[0, 0, heightToCenterOfCapacitor]}\n />\n </Colorize>\n </Rotate>\n </Translate>\n <Cylinder height={4} radius={0.5} center={[pitch / 2, 0, 0.5]} />\n <Sphere radius={0.5} center={[pitch / 2, 0, heightToCenterOfCapacitor]} />\n </>\n )\n}\n","import { Colorize, Cuboid, Cylinder, Subtract, Union } from \"jscad-fiber\"\n\nexport const StampBoard = ({\n bodyWidth = 21,\n boardThickness = 0.5,\n leadWidth = 1.6,\n leadLength = 2.4,\n leadsPitch = 2.54,\n leadsLeft,\n leadsRight,\n leadsTop,\n leadsBottom,\n innerHoles = true,\n innerHoleEdgeDistance = 1.61,\n innerHoleDiameter = 1,\n}: {\n bodyWidth?: number\n boardThickness?: number\n leadWidth?: number\n leadLength?: number\n leadsPitch?: number\n leadsLeft?: number\n leadsRight?: number\n leadsTop?: number\n leadsBottom?: number\n innerHoles?: boolean\n innerHoleEdgeDistance?: number\n innerHoleDiameter?: number\n}) => {\n const halfBoardWidth = bodyWidth / 2\n const boardCenterZ = boardThickness / 2\n const boardHeight = boardThickness * 1.05\n const holeRadius = innerHoleDiameter / 2\n const bodyLength =\n Math.max(leadsLeft || 0, leadsRight || 0, leadsTop || 0, leadsBottom || 0) *\n leadsPitch || 51\n\n const pads: { x: number; y: number; pl: number; pw: number }[] = []\n const holes: { x: number; y: number }[] = []\n\n if (leadsRight) {\n const yOffset = -((leadsRight - 1) / 2) * leadsPitch\n for (let i = 0; i < leadsRight; i++) {\n const y = yOffset + i * leadsPitch\n pads.push({\n x: halfBoardWidth - leadLength / 2,\n y: -y, // Flip y\n pl: leadLength,\n pw: leadWidth,\n })\n if (innerHoles) {\n holes.push(\n { x: halfBoardWidth, y: -y },\n { x: halfBoardWidth - innerHoleEdgeDistance, y: -y },\n )\n }\n }\n }\n\n if (leadsLeft) {\n const yOffset = -((leadsLeft - 1) / 2) * leadsPitch\n for (let i = 0; i < leadsLeft; i++) {\n const y = yOffset + i * leadsPitch\n pads.push({\n x: -halfBoardWidth + leadLength / 2,\n y: -y, // Flip y\n pl: leadLength,\n pw: leadWidth,\n })\n if (innerHoles) {\n holes.push(\n { x: -halfBoardWidth, y: -y },\n { x: -halfBoardWidth + innerHoleEdgeDistance, y: -y },\n )\n }\n }\n }\n\n if (leadsTop) {\n const xOffset = -((leadsTop - 1) / 2) * leadsPitch\n for (let i = 0; i < leadsTop; i++) {\n const x = xOffset + i * leadsPitch\n pads.push({\n x: -x, // Flip x\n y: bodyLength / 2 - leadLength / 2,\n pl: leadWidth,\n pw: leadLength,\n })\n if (innerHoles) {\n holes.push(\n { x: -x, y: bodyLength / 2 },\n { x: -x, y: bodyLength / 2 - innerHoleEdgeDistance },\n )\n }\n }\n }\n\n if (leadsBottom) {\n const xOffset = -((leadsBottom - 1) / 2) * leadsPitch\n for (let i = 0; i < leadsBottom; i++) {\n const x = xOffset + i * leadsPitch\n pads.push({\n x: -x, // Flip x\n y: -bodyLength / 2 + leadLength / 2,\n pl: leadWidth,\n pw: leadLength,\n })\n if (innerHoles) {\n holes.push(\n { x: -x, y: -bodyLength / 2 },\n { x: -x, y: -bodyLength / 2 + innerHoleEdgeDistance },\n )\n }\n }\n }\n\n const boardBody = (\n <Colorize color=\"#051a0a\">\n <Subtract>\n <Cuboid\n center={[0, 0, boardCenterZ]}\n size={[bodyWidth, bodyLength, boardThickness]}\n />\n {pads.map((pad, index) => (\n <Cuboid\n key={index}\n center={[pad.x, pad.y, boardCenterZ]}\n size={[pad.pl + 0.01, pad.pw + 0.01, boardHeight]}\n />\n ))}\n </Subtract>\n </Colorize>\n )\n\n const holePads =\n innerHoles &&\n holes.map((hole, index) => (\n <Cylinder\n key={index}\n color=\"black\"\n center={[hole.x, hole.y, boardCenterZ]}\n radius={holeRadius}\n height={boardThickness * 1.07}\n />\n ))\n\n const rectPads = pads.map((pad, index) => (\n <Cuboid\n key={index}\n center={[pad.x, pad.y, boardCenterZ]}\n size={[pad.pl + 0.01, pad.pw + 0.01, boardHeight]}\n />\n ))\n return (\n <>\n {boardBody}\n <Colorize color=\"#FFD700\">\n {innerHoles ? (\n <Subtract>\n <Union>\n {pads.map((pad, index) => (\n <Cuboid\n key={index}\n center={[pad.x, pad.y, boardCenterZ]}\n size={[pad.pl + 0.01, pad.pw + 0.01, boardHeight]}\n />\n ))}\n </Union>\n {holePads}\n </Subtract>\n ) : (\n rectPads\n )}\n </Colorize>\n </>\n )\n}\n\nexport default StampBoard\n","import { Colorize, Cuboid, Cylinder, Subtract } from \"jscad-fiber\"\nimport { PinHeader } from \"./PinHeader\"\nimport { FemaleHeader } from \"./FemaleHeader\"\nimport { Screen } from \"./Screen\"\n\nexport const MountedPcbModule = ({\n numPins = 5,\n rows = 1,\n p = 2.54,\n id = 1.0,\n od = 1.5,\n boardThickness = 1.6,\n width,\n height,\n pinRowSide = \"left\",\n holes = [],\n holeInset = 1.0,\n pinRowHoleEdgeToEdgeDist = 2.0,\n female,\n nopin,\n screen,\n screenWidth,\n screenHeight,\n screenCenterOffsetX,\n screenCenterOffsetY,\n}: {\n numPins?: number\n rows?: number\n p?: number\n id?: number\n od?: number\n boardThickness?: number\n width?: number | string\n height?: number | string\n pinRowSide?: \"left\" | \"right\" | \"top\" | \"bottom\"\n holes?: string[]\n holeInset?: number\n pinRowHoleEdgeToEdgeDist?: number\n female?: boolean\n nopin?: boolean\n screen?: boolean\n screenWidth?: number\n screenHeight?: number\n screenCenterOffsetX?: number\n screenCenterOffsetY?: number\n}) => {\n const showScreen = screen ?? false\n const boardCenterZ = boardThickness / 2\n const numPinsPerRow = Math.ceil(numPins / rows)\n\n // Calculate width and height if not provided\n let calculatedWidth: number\n let calculatedHeight: number\n if (pinRowSide === \"left\" || pinRowSide === \"right\") {\n calculatedWidth = (rows - 1) * p + 2 * pinRowHoleEdgeToEdgeDist\n calculatedHeight = (numPinsPerRow - 1) * p + 2 * pinRowHoleEdgeToEdgeDist\n } else {\n calculatedHeight = (rows - 1) * p + 2 * pinRowHoleEdgeToEdgeDist\n calculatedWidth = (numPinsPerRow - 1) * p + 2 * pinRowHoleEdgeToEdgeDist\n }\n if (numPins === 0) {\n calculatedWidth = 10\n calculatedHeight = 10\n }\n const finalWidth = Number(width ?? calculatedWidth)\n const finalHeight = Number(height ?? calculatedHeight)\n\n // Calculate pin positions\n const pins: { x: number; y: number }[] = []\n let pinStartX = 0\n let pinStartY = 0\n let pinDirectionX = 0\n let pinDirectionY = 0\n let rowDirectionX = 0\n let rowDirectionY = 0\n\n if (pinRowSide === \"left\" || pinRowSide === \"right\") {\n pinStartX =\n pinRowSide === \"left\"\n ? -finalWidth / 2 + pinRowHoleEdgeToEdgeDist\n : finalWidth / 2 - pinRowHoleEdgeToEdgeDist\n pinStartY = -((numPinsPerRow - 1) / 2) * p\n pinDirectionX = 0\n pinDirectionY = p\n rowDirectionX = pinRowSide === \"left\" ? p : -p\n rowDirectionY = 0\n } else {\n pinStartX = -((numPinsPerRow - 1) / 2) * p\n pinStartY =\n pinRowSide === \"top\"\n ? finalHeight / 2 - pinRowHoleEdgeToEdgeDist\n : -finalHeight / 2 + pinRowHoleEdgeToEdgeDist\n pinDirectionX = p\n pinDirectionY = 0\n rowDirectionX = 0\n rowDirectionY = pinRowSide === \"top\" ? -p : p\n }\n\n let pinNumber = 0\n for (let row = 0; row < rows && pinNumber < numPins; row++) {\n for (let col = 0; col < numPinsPerRow && pinNumber < numPins; col++) {\n const x = pinStartX + col * pinDirectionX + row * rowDirectionX\n const y = pinStartY + col * pinDirectionY + row * rowDirectionY\n pins.push({ x, y })\n pinNumber++\n }\n }\n\n // Calculate hole positions\n const holePositions: { x: number; y: number }[] = []\n if (holes) {\n for (const pos of holes) {\n let hx = 0\n let hy = 0\n if (pos === \"topleft\") {\n hx = -finalWidth / 2 + holeInset\n hy = finalHeight / 2 - holeInset\n } else if (pos === \"topright\") {\n hx = finalWidth / 2 - holeInset\n hy = finalHeight / 2 - holeInset\n } else if (pos === \"bottomleft\") {\n hx = -finalWidth / 2 + holeInset\n hy = -finalHeight / 2 + holeInset\n } else if (pos === \"bottomright\") {\n hx = finalWidth / 2 - holeInset\n hy = -finalHeight / 2 + holeInset\n } else if (pos === \"center\") {\n hx = 0\n hy = 0\n }\n holePositions.push({ x: hx, y: hy })\n }\n }\n // Recreated pin row geometry (local copy to avoid PinRow dependency)\n const pinThickness = 0.63\n const pinBodyHeight = 2\n const longSidePinLength = 6\n const shortSidePinLength = 3\n const boardOffsetZ = nopin || female ? 0 : pinBodyHeight\n const boardTopZ = boardOffsetZ + boardThickness\n // Board body with holes subtracted\n const boardBody = (\n <Colorize color=\"#008080\">\n <Subtract>\n <Cuboid\n center={[0, 0, boardCenterZ + boardOffsetZ]}\n size={[finalWidth, finalHeight, boardThickness]}\n />\n {holePositions.map((hole, index) => (\n <Cylinder\n key={`hole-${index}`}\n center={[hole.x, hole.y, boardCenterZ + boardOffsetZ]}\n radius={od / 2}\n height={boardThickness}\n />\n ))}\n {pins.map((pin, index) => (\n <Cylinder\n key={`pin-hole-${index}`}\n center={[pin.x, pin.y, boardCenterZ + boardOffsetZ]}\n radius={od / 2}\n height={boardThickness}\n />\n ))}\n </Subtract>\n </Colorize>\n )\n\n // Plated through-holes\n const platedHoles = pins.map((pin, index) => (\n <Colorize key={`pin-${index}`} color=\"#FFD700\">\n <Subtract>\n <Cylinder\n center={[pin.x, pin.y, boardThickness / 2 + boardOffsetZ]}\n radius={od / 2}\n height={boardThickness}\n />\n <Cylinder\n center={[pin.x, pin.y, boardThickness / 2 + boardOffsetZ]}\n radius={id / 2}\n height={boardThickness}\n />\n </Subtract>\n </Colorize>\n ))\n\n const headerPins = pins.map((pin, index) => (\n <PinHeader\n key={`pin-3d-${index}`}\n x={pin.x}\n y={pin.y}\n pinThickness={pinThickness}\n shortSidePinLength={shortSidePinLength}\n longSidePinLength={longSidePinLength}\n bodyHeight={pinBodyHeight}\n flipZ={(z: number) => z}\n />\n ))\n\n const femaleHeaderRow = pins.map((pin, index) => (\n <FemaleHeader\n key={`female-pin-3d-${index}`}\n x={pin.x}\n y={pin.y}\n flipZ={(z: number) => -z}\n />\n ))\n\n return (\n <>\n {boardBody}\n {platedHoles}\n {!female && !nopin && headerPins}\n {female && femaleHeaderRow}\n {showScreen && (\n <Screen\n width={screenWidth ?? finalWidth * 0.8}\n height={screenHeight ?? finalHeight * 0.6}\n offset={{\n x: screenCenterOffsetX ?? 0,\n y: screenCenterOffsetY ?? 0,\n z: boardTopZ,\n }}\n />\n )}\n </>\n )\n}\n\nexport default MountedPcbModule\n","import { Colorize, Cuboid, Hull, Translate, Union } from \"jscad-fiber\"\n\nexport const SOD723 = () => {\n const fullWidth = 1.4\n const bodyLength = 0.6\n const bodyHeight = 0.5\n\n const padWidth = 0.28\n const padLength = 0.5\n const padThickness = 0.12\n\n const bodyWidth = fullWidth - padLength\n const leftPadCenterX = -bodyWidth / 2 + padLength / 2 - 0.15 // 0.15 is the distance between the pad and the body as datasheet\n const rightPadCenterX = bodyWidth / 2 - padLength / 2 + 0.15 // 0.15 is the distance between the pad and the body as datasheet\n\n // top taper happens only in last quarter\n const taperOffset = 0.2\n const straightHeight = bodyHeight * 0.24\n\n // Body geometry\n // - straightHeight: the lower (straight) portion of the body\n // - taperOffset: how much smaller the top of the body becomes\n\n return (\n <>\n {/* Pads */}\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[leftPadCenterX, 0, padThickness / 2]}\n />\n <Cuboid\n color=\"#ccc\"\n size={[padLength, padWidth, padThickness]}\n center={[rightPadCenterX, 0, padThickness / 2]}\n />\n\n {/* Body (lifted above pads) */}\n <Colorize color=\"#222\">\n <Union>\n {/* Straight bottom section */}\n <Translate z={straightHeight / 2}>\n <Cuboid size={[bodyWidth, bodyLength, straightHeight]} />\n </Translate>\n\n {/* Tapered top quarter */}\n <Hull>\n {/* bottom of taper (same size as straight section top) */}\n <Translate z={straightHeight}>\n <Cuboid size={[bodyWidth, bodyLength, 0.01]} />\n </Translate>\n\n {/* top of taper (smaller) */}\n <Translate z={bodyHeight}>\n <Cuboid\n size={[bodyWidth - taperOffset, bodyLength - taperOffset, 0.01]}\n />\n </Translate>\n </Hull>\n </Union>\n </Colorize>\n\n {/* Grey polarity/top strip */}\n <Cuboid\n color=\"#777\"\n size={[fullWidth / 6, bodyLength - taperOffset, 0.02]}\n center={[-bodyWidth / 4, 0, bodyHeight]}\n />\n </>\n )\n}\n\nexport default SOD723\n","import { componentMaterials } from \"./materials\"\nimport {\n Colorize,\n Cuboid,\n Cylinder,\n Rotate,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\nimport type { PcbPlatedHole } from \"circuit-json\"\nimport { FootprintPlatedHole } from \"./FootprintPlatedHole\"\n\ninterface JSTZH1_5mmProps {\n numPins?: number\n showPins?: boolean\n showFootprint?: boolean\n bodyColor?: string\n pinColor?: string\n}\n\nexport const JSTZH1_5mm = ({\n numPins = 7,\n showPins = true,\n showFootprint = true,\n bodyColor = \"#f5f5f5\",\n pinColor = \"#635959\",\n}: JSTZH1_5mmProps) => {\n const pitch = 1.5\n const bodyHeight = 6\n const bodyDepth = 3.5\n const wallThickness = 0.5\n const hollowHeight = bodyHeight * 0.6\n const pinLength = 6\n const bodyWidth = (numPins - 1) * pitch + 4\n const startX = -((numPins - 1) * pitch) / 2\n\n return (\n <>\n <Translate offset={[0, 0, bodyHeight]}>\n <Rotate angles={[Math.PI, 0, 0]}>\n <Colorize\n material={componentMaterials.moldedPlastic}\n color={bodyColor}\n >\n <Subtract>\n <Cuboid\n size={[bodyWidth, bodyDepth, bodyHeight]}\n center={[0, 0, bodyHeight / 2]}\n />\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n bodyDepth - wallThickness * 2,\n hollowHeight,\n ]}\n center={[0, 0, hollowHeight / 2]}\n />\n <Cuboid\n size={[bodyWidth, bodyDepth / 3, hollowHeight]}\n center={[0, 0, hollowHeight / 6]}\n />\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n wallThickness / 2,\n hollowHeight,\n ]}\n center={[\n 0,\n bodyDepth / 2 - wallThickness / 4,\n hollowHeight / 2,\n ]}\n />\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n wallThickness / 2,\n hollowHeight,\n ]}\n center={[\n 0,\n -bodyDepth / 2 + wallThickness / 4,\n hollowHeight / 2,\n ]}\n />\n <Cuboid\n size={[1, wallThickness + 2, 1]}\n center={[-bodyWidth / 4, bodyDepth / 2, bodyHeight / 2]}\n />\n <Cuboid\n size={[1, wallThickness + 3, 1]}\n center={[bodyWidth / 4, bodyDepth / 2, bodyHeight / 2]}\n />\n <Cuboid\n size={[1, wallThickness + 2, 1]}\n center={[-bodyWidth / 4, -bodyDepth / 2, bodyHeight / 2]}\n />\n <Cuboid\n size={[1, wallThickness + 3, 1]}\n center={[bodyWidth / 4, -bodyDepth / 2, bodyHeight / 2]}\n />\n </Subtract>\n </Colorize>\n </Rotate>\n </Translate>\n\n {showPins &&\n Array.from({ length: numPins }).map((_, i) => (\n <Colorize\n key={i}\n material={componentMaterials.tinnedLead}\n color={pinColor}\n >\n <Cylinder\n height={pinLength}\n radius={0.35}\n center={[startX + i * pitch, 0, 2.5]}\n />\n </Colorize>\n ))}\n\n {showFootprint &&\n Array.from({ length: numPins }).map((_, i) => {\n const isPin1 = i === 0\n const hole: PcbPlatedHole = isPin1\n ? {\n type: \"pcb_plated_hole\",\n pcb_plated_hole_id: `jstzh_${i}`,\n shape: \"circular_hole_with_rect_pad\",\n x: startX + i * pitch,\n y: 0,\n hole_diameter: 0.73,\n hole_offset_x: 0,\n hole_offset_y: 0,\n rect_pad_width: 1.03,\n rect_pad_height: 1.73,\n hole_shape: \"circle\",\n pad_shape: \"rect\",\n layers: [\"top\", \"bottom\"],\n port_hints: [`${i + 1}`],\n }\n : {\n type: \"pcb_plated_hole\",\n pcb_plated_hole_id: `jstzh_${i}`,\n shape: \"pill\",\n ccw_rotation: 0,\n x: startX + i * pitch,\n y: 0,\n hole_height: 0.73,\n hole_width: 0.73,\n outer_height: 1.73,\n outer_width: 1.03,\n layers: [\"top\", \"bottom\"],\n port_hints: [`${i + 1}`],\n }\n return (\n <FootprintPlatedHole\n key={`footprint_${i}`}\n hole={hole}\n isPin1={isPin1}\n />\n )\n })}\n </>\n )\n}\n\nexport default JSTZH1_5mm\n","import { componentMaterials } from \"./materials\"\nimport type { PcbPlatedHole } from \"circuit-json\"\nimport {\n Colorize,\n Cuboid,\n Cylinder,\n Rotate,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\nimport { FootprintPlatedHole } from \"./FootprintPlatedHole\"\n\ninterface JSTPH2_0mmProps {\n numPins?: number\n showPins?: boolean\n showFootprint?: boolean\n bodyColor?: string\n pinColor?: string\n}\n\nexport const JSTPH2_0mm = ({\n numPins = 2,\n showPins = true,\n showFootprint = true,\n bodyColor = \"#f5f5f5\",\n pinColor = \"#635959\",\n}: JSTPH2_0mmProps) => {\n const pitch = 2.0\n // BxB-PH-K-S top-entry through-hole header dimensions from the JST drawing.\n const bodyHeight = 6\n const bodyDepth = 4.5\n const wallThickness = 0.5\n const hollowHeight = bodyHeight * 0.6\n const pinTailLength = 3.4\n const pinTop = 5.5\n // JST specifies a 0.5 mm square post for the through-hole header.\n const pinThickness = 0.5\n const pinLength = pinTailLength + pinTop\n const bodyWidth = (numPins - 1) * pitch + 3.9\n const startX = -((numPins - 1) * pitch) / 2\n const latchWindowWidth = 1\n const latchWindowHeight = 1.8\n const latchWindowInset = 0.7\n const topReliefWidth = 0.8\n const topReliefDepth = 0.65\n\n return (\n <>\n <Translate offset={[0, 0, bodyHeight]}>\n <Rotate angles={[Math.PI, 0, 0]}>\n <Colorize\n color={bodyColor}\n material={componentMaterials.moldedPlastic}\n >\n <Subtract>\n <Cuboid\n size={[bodyWidth, bodyDepth, bodyHeight]}\n center={[0, 0, bodyHeight / 2]}\n />\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n bodyDepth - wallThickness * 2,\n hollowHeight,\n ]}\n center={[0, 0, hollowHeight / 2]}\n />\n <Cuboid\n size={[bodyWidth, bodyDepth / 3, hollowHeight]}\n center={[0, 0, hollowHeight / 6]}\n />\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n wallThickness / 2,\n hollowHeight,\n ]}\n center={[\n 0,\n bodyDepth / 2 - wallThickness / 4,\n hollowHeight / 2,\n ]}\n />\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n wallThickness / 2,\n hollowHeight,\n ]}\n center={[\n 0,\n -bodyDepth / 2 + wallThickness / 4,\n hollowHeight / 2,\n ]}\n />\n <Cuboid\n size={[\n latchWindowWidth,\n bodyDepth + wallThickness,\n latchWindowHeight,\n ]}\n center={[-bodyWidth / 2 + latchWindowInset, 0, bodyHeight / 2]}\n />\n <Cuboid\n size={[\n latchWindowWidth,\n bodyDepth + wallThickness,\n latchWindowHeight,\n ]}\n center={[bodyWidth / 2 - latchWindowInset, 0, bodyHeight / 2]}\n />\n <Cuboid\n size={[wallThickness * 3, topReliefWidth, topReliefDepth]}\n center={[-bodyWidth / 2, 0, topReliefDepth / 2]}\n />\n <Translate offset={[-bodyWidth / 2, 0, topReliefDepth]}>\n <Rotate angles={[0, Math.PI / 2, 0]}>\n <Cylinder\n height={wallThickness * 3}\n radius={topReliefWidth / 2}\n />\n </Rotate>\n </Translate>\n <Cuboid\n size={[wallThickness * 3, topReliefWidth, topReliefDepth]}\n center={[bodyWidth / 2, 0, topReliefDepth / 2]}\n />\n <Translate offset={[bodyWidth / 2, 0, topReliefDepth]}>\n <Rotate angles={[0, Math.PI / 2, 0]}>\n <Cylinder\n height={wallThickness * 3}\n radius={topReliefWidth / 2}\n />\n </Rotate>\n </Translate>\n </Subtract>\n </Colorize>\n </Rotate>\n </Translate>\n\n {showPins &&\n Array.from({ length: numPins }).map((_, i) => (\n <Colorize\n key={i}\n color={pinColor}\n material={componentMaterials.tinnedLead}\n >\n <Cuboid\n size={[pinThickness, pinThickness, pinLength]}\n center={[startX + i * pitch, 0, (pinTop - pinTailLength) / 2]}\n />\n </Colorize>\n ))}\n\n {showFootprint &&\n Array.from({ length: numPins }).map((_, i) => {\n const isPin1 = i === 0\n const hole: PcbPlatedHole = isPin1\n ? {\n type: \"pcb_plated_hole\",\n pcb_plated_hole_id: `jstph_${i}`,\n shape: \"circular_hole_with_rect_pad\",\n x: startX + i * pitch,\n y: 0,\n hole_diameter: 0.73,\n hole_offset_x: 0,\n hole_offset_y: 0,\n rect_pad_width: 1.2,\n rect_pad_height: 1.2,\n hole_shape: \"circle\",\n pad_shape: \"rect\",\n layers: [\"top\", \"bottom\"],\n port_hints: [`${i + 1}`],\n }\n : {\n type: \"pcb_plated_hole\",\n pcb_plated_hole_id: `jstph_${i}`,\n shape: \"pill\",\n ccw_rotation: 0,\n x: startX + i * pitch,\n y: 0,\n hole_height: 0.73,\n hole_width: 0.73,\n outer_height: 1.2,\n outer_width: 1.2,\n layers: [\"top\", \"bottom\"],\n port_hints: [`${i + 1}`],\n }\n return (\n <FootprintPlatedHole\n key={`footprint_${i}`}\n hole={hole}\n isPin1={isPin1}\n />\n )\n })}\n </>\n )\n}\n\nexport default JSTPH2_0mm\n","import { componentMaterials } from \"./materials\"\nimport { Colorize, Cuboid, Subtract, Translate } from \"jscad-fiber\"\nimport type { PcbPlatedHole } from \"circuit-json\"\nimport { fp } from \"@tscircuit/footprinter\"\nimport { FootprintPlatedHole } from \"./FootprintPlatedHole\"\n\nexport interface JSTXH2_5mmProps {\n numPins?: number\n showPins?: boolean\n showFootprint?: boolean\n bodyColor?: string\n pinColor?: string\n}\n\nexport const JSTXH2_5mm = ({\n numPins = 4,\n showPins = true,\n showFootprint = true,\n bodyColor = \"#f8fafc\", // Natural white PA 66 nylon housing per spec\n pinColor = \"#635959\", // Tin-plated metallic gray posts\n}: JSTXH2_5mmProps) => {\n // Official JST XH 2.50mm Top Entry Dimensions (per eXH.pdf B#B-XH-A)\n const pitch = 2.5\n const bodyHeight = 7.0\n const bodyDepth = 5.75\n const wallThickness = 0.85\n const floorThickness = 1.65\n const hollowHeight = bodyHeight - floorThickness\n const pinLength = 8.75\n const bodyWidth = (numPins - 1) * pitch + 4.9\n const startX = -((numPins - 1) * pitch) / 2\n\n // Keying slot positions (near left and right edges of front wall)\n const keySlotWidth = 0.8\n const keySlotDepth = wallThickness + 0.2\n const keySlotHeight = 3.5\n const keySlotX = bodyWidth / 2 - 1.3\n\n // Central locking notch width (scales with pin count per JST spec)\n const lockNotchWidth = Math.min(\n bodyWidth - 3.4,\n Math.max(3.0, (numPins - 1) * pitch * 0.4 + 2.2),\n )\n const lockNotchHeight = 2.4\n\n return (\n <>\n {/* 1. White Nylon Connector Housing */}\n <Translate offset={[0, 0, bodyHeight / 2]}>\n <Colorize material={componentMaterials.moldedPlastic} color={bodyColor}>\n <Subtract>\n {/* Outer Solid Block */}\n <Cuboid size={[bodyWidth, bodyDepth, bodyHeight]} />\n\n {/* Inner Socket Cavity (open at top) */}\n <Translate offset={[0, 0, (bodyHeight - hollowHeight) / 2 + 0.1]}>\n <Cuboid\n size={[\n bodyWidth - wallThickness * 2,\n bodyDepth - wallThickness * 2,\n hollowHeight + 0.2,\n ]}\n />\n </Translate>\n\n {/* Front Central Locking Notch (top of front wall) */}\n <Translate\n offset={[\n 0,\n -bodyDepth / 2 + wallThickness / 2,\n bodyHeight / 2 - lockNotchHeight / 2 + 0.1,\n ]}\n >\n <Cuboid\n size={[\n lockNotchWidth,\n wallThickness + 0.2,\n lockNotchHeight + 0.2,\n ]}\n />\n </Translate>\n\n {/* Left Vertical Keying Guide Slot (front wall) */}\n <Translate\n offset={[\n -keySlotX,\n -bodyDepth / 2 + wallThickness / 2,\n bodyHeight / 2 - keySlotHeight / 2 + 0.1,\n ]}\n >\n <Cuboid\n size={[keySlotWidth, keySlotDepth, keySlotHeight + 0.2]}\n />\n </Translate>\n\n {/* Right Vertical Keying Guide Slot (front wall) */}\n <Translate\n offset={[\n keySlotX,\n -bodyDepth / 2 + wallThickness / 2,\n bodyHeight / 2 - keySlotHeight / 2 + 0.1,\n ]}\n >\n <Cuboid\n size={[keySlotWidth, keySlotDepth, keySlotHeight + 0.2]}\n />\n </Translate>\n\n {/* Bottom Stand-off / Venting Slots along front bottom edge */}\n {Array.from({ length: numPins }).map((_, i) => (\n <Translate\n key={`vent_${i}`}\n offset={[\n startX + i * pitch,\n -bodyDepth / 2 + 0.3,\n -bodyHeight / 2 + 0.25,\n ]}\n >\n <Cuboid size={[1.0, 0.8, 0.5]} />\n </Translate>\n ))}\n </Subtract>\n </Colorize>\n </Translate>\n\n {/* 2. Metal Square Through-Hole Contact Pins (0.64mm square) */}\n {showPins &&\n Array.from({ length: numPins }).map((_, i) => (\n <Colorize\n key={i}\n material={componentMaterials.tinnedLead}\n color={pinColor}\n >\n <Translate offset={[startX + i * pitch, 0, pinLength / 2 - 3.4]}>\n <Cuboid size={[0.64, 0.64, pinLength]} />\n </Translate>\n </Colorize>\n ))}\n\n {/* 3. PCB Plated Through-Hole Footprint (Using @tscircuit/footprinter) */}\n {showFootprint &&\n (() => {\n try {\n const circuitJson = fp.string(`jst${numPins}_xh`).circuitJson()\n const platedHoles = circuitJson.filter(\n (e): e is PcbPlatedHole => e.type === \"pcb_plated_hole\",\n )\n return platedHoles.map((hole, i) => (\n <FootprintPlatedHole\n key={`footprint_${i}`}\n hole={hole}\n isPin1={i === 0}\n />\n ))\n } catch {\n return null\n }\n })()}\n </>\n )\n}\n\nexport default JSTXH2_5mm\n","import { componentMaterials } from \"./materials\"\nimport { fp } from \"@tscircuit/footprinter\"\nimport { mm } from \"@tscircuit/mm\"\nimport { Colorize, Cuboid, Rotate, Subtract, Union } from \"jscad-fiber\"\n\ntype ShParams = {\n fn: string\n sh?: boolean\n smd?: boolean\n p: number\n num_pins: number\n mpx?: number\n mpy?: number\n}\n/** A generic pad fit is SH only when its pitch AND hold-down layout agree. */\nexport function isJstShFootprint(footprint: string): boolean {\n const p = fp.string(footprint).json() as unknown as ShParams\n if (p.fn !== \"jst\") return false\n return Boolean(\n p.sh ||\n (p.smd &&\n Math.abs(mm(p.p) - 1) < 0.01 &&\n Math.abs(mm(p.mpx ?? 0) - (p.num_pins - 1 + 2.6)) < 0.15 &&\n Math.abs(mm(p.mpy ?? 0) - 2.525) < 0.15),\n )\n}\n\n/** JST SH BMxxB-SRSS-TB top-entry header, nominal dimensions from JST eSH.pdf. */\nexport const JstSh = ({ footprint = \"jst6_sh\" }: { footprint?: string }) => {\n if (!isJstShFootprint(footprint))\n throw new Error(\n \"JstSh requires a named SH or matching 1mm SH top-entry footprint\",\n )\n const canonical = footprint.replace(/_pin1location\\([^)]*\\)/g, \"\")\n const params = fp.string(canonical).json() as unknown as ShParams\n const pads = fp\n .string(canonical)\n .circuitJson()\n .filter((e) => e.type === \"pcb_smtpad\" && e.shape === \"rect\")\n const target = fp\n .string(footprint)\n .circuitJson()\n .filter(\n (e) =>\n e.type === \"pcb_smtpad\" &&\n (e.shape === \"rect\" || e.shape === \"rotated_rect\"),\n )\n const n = params.num_pins\n if (!Number.isInteger(n) || n < 2 || n > 20 || pads.length !== n + 2)\n throw new Error(\"JstSh requires 2–20 contacts and two hold-down pads\")\n const signals = pads.slice(0, n),\n mounts = pads.slice(n)\n const angle =\n Math.atan2(target[1]!.y - target[0]!.y, target[1]!.x - target[0]!.x) -\n Math.atan2(pads[1]!.y - pads[0]!.y, pads[1]!.x - pads[0]!.x)\n const x = signals.reduce((sum, p) => sum + p.x, 0) / n,\n rowY = signals[0]!.y\n const direction = mounts[0]!.y > rowY ? 1 : -1\n const y = rowY + direction * 1.8,\n width = n + 2,\n depth = 2.9,\n height = 4.2\n const pinY = y - direction * 0.25\n return (\n <Rotate rotation={[0, 0, angle]}>\n <Colorize material={componentMaterials.moldedPlastic} color=\"#e4e1d6\">\n <Subtract>\n <Cuboid\n size={[width, depth, height]}\n center={[x, y, height / 2 + 0.05]}\n />\n <Cuboid\n size={[width - 1.3, 1.8, height]}\n center={[x, y, height / 2 + 0.8]}\n />\n {mounts.map((pad, i) => (\n <Cuboid\n key={`recess-${i}`}\n size={[0.7, pad.height * 0.8, 1.5]}\n center={[pad.x, pad.y, 0.75]}\n />\n ))}\n {[-1, 1].map((side) => (\n <Cuboid\n key={side}\n size={[0.55, 0.6, 1]}\n center={[\n x + side * (width / 2 - 0.9),\n y + (direction * depth) / 2,\n 4,\n ]}\n />\n ))}\n </Subtract>\n </Colorize>\n <Colorize material={componentMaterials.tinnedLead} color=\"#c6c7c9\">\n {signals.map((pad, i) => {\n const tailY = pad.y - direction * pad.height * 0.4\n return (\n <Union key={i}>\n <Cuboid\n size={[0.2, Math.abs(pinY - tailY) + 0.1, 0.2]}\n center={[pad.x, (pinY + tailY) / 2, 0.1]}\n />\n <Cuboid size={[0.2, 0.2, 3.45]} center={[pad.x, pinY, 1.725]} />\n </Union>\n )\n })}\n {mounts.map((pad, i) => (\n <Union key={`mount-${i}`}>\n <Cuboid\n size={[0.7, pad.height * 0.75, 0.2]}\n center={[pad.x, pad.y, 0.1]}\n />\n <Cuboid\n size={[0.2, pad.height * 0.6, 1.35]}\n center={[pad.x, pad.y, 0.675]}\n />\n </Union>\n ))}\n </Colorize>\n </Rotate>\n )\n}\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n Rotate,\n RoundedCuboid,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\n\nexport interface FPCProps {\n pinCount?: number\n pitch?: number\n padWidth?: number\n padLength?: number\n staggered?: boolean\n reverse?: boolean\n rowPitch?: number\n topPadLength?: number\n bottomPadLength?: number\n mountPadPitchX?: number\n mountPadOffsetY?: number\n mountTop?: boolean\n mountPadWidth?: number\n mountPadLength?: number\n}\n\nconst HOUSING_COLOR = \"#303339\"\nconst HOUSING_SHADOW = \"#1f2227\"\nconst ACTUATOR_COLOR = \"#eee8d8\"\nconst ACTUATOR_HIGHLIGHT = \"#f8f3e7\"\nconst TIN_COLOR = \"#b7bdc2\"\nconst TIN_HIGHLIGHT = \"#d2d6d9\"\nconst HOLD_DOWN_COLOR = \"#767d82\"\nconst HOLD_DOWN_HIGHLIGHT = \"#9ba1a5\"\n\nexport const FPC = ({\n pinCount = 12,\n pitch = 0.5,\n padWidth = 0.3,\n padLength = 1.25,\n staggered = false,\n reverse = false,\n rowPitch = 2.4,\n topPadLength = padLength,\n bottomPadLength = padLength,\n mountPadPitchX,\n mountPadOffsetY = 2.575,\n mountTop = false,\n mountPadWidth = 2,\n mountPadLength = 2.5,\n}: FPCProps) => {\n const contactSpan = Math.max((pinCount - 1) * pitch, pitch)\n const contactStartX = -contactSpan / 2\n const resolvedMountPitch =\n mountPadPitchX ?? contactSpan + (staggered ? 3.5 : 3.38)\n const mountY =\n mountPadOffsetY === 0 ? 0 : (mountTop ? 1 : -1) * mountPadOffsetY\n\n const contactRows = Array.from({ length: pinCount }, (_, index) => {\n const isUpperRow = staggered && (index % 2 === 1) !== reverse\n const y = staggered ? (isUpperRow ? rowPitch / 2 : -rowPitch / 2) : 0\n const length = isUpperRow ? topPadLength : bottomPadLength\n return {\n index,\n x: contactStartX + index * pitch,\n y,\n length,\n }\n })\n\n const contactMaxY = Math.max(\n ...contactRows.map((contact) => contact.y + contact.length / 2),\n )\n const contactMinY = Math.min(\n ...contactRows.map((contact) => contact.y - contact.length / 2),\n )\n const mountingMinY = mountY - mountPadLength / 2\n const mountingMaxY = mountY + mountPadLength / 2\n const signalSideY = mountTop ? contactMinY : contactMaxY\n const cableSideY = mountTop\n ? Math.max(mountingMaxY, contactMaxY) + 0.67\n : Math.min(mountingMinY, contactMinY) - 0.67\n const directionToSignal = mountTop ? -1 : 1\n const housingSignalY =\n signalSideY - directionToSignal * Math.max(padLength * 0.86, 1.05)\n const housingCableY = cableSideY + directionToSignal * 0.22\n const housingDepth = Math.abs(housingSignalY - housingCableY)\n const housingCenterY = (housingSignalY + housingCableY) / 2\n const cableEdgeY = housingCableY - directionToSignal * 0.01\n const bodyWidth = Math.max(\n contactSpan + 4.9,\n resolvedMountPitch + mountPadWidth * 0.76,\n )\n const openingWidth = Math.min(bodyWidth - 2.3, contactSpan + 1.1)\n const housingBaseHeight = 0.3\n const housingHeight = 1.42\n const overallHeight = 2\n const throatDepth = Math.min(0.92, housingDepth * 0.28)\n const throatCenterY =\n cableEdgeY + directionToSignal * (throatDepth / 2 - 0.04)\n const throatHeight = 1.6\n const throatCenterZ = 1.1\n const actuatorDepth = Math.max(housingDepth - 0.78, 1.5)\n const actuatorCenterY =\n cableEdgeY + directionToSignal * (actuatorDepth / 2 + 0.68)\n const actuatorWidth = bodyWidth - 0.72\n const actuatorHeight = 0.34\n const actuatorCenterZ = overallHeight - actuatorHeight / 2\n const hingeY =\n cableEdgeY + directionToSignal * Math.min(0.68, housingDepth * 0.22)\n const hingeZ = 1.48\n const terminalWidth = Math.max(padWidth * 0.82, 0.15)\n const terminalOuterY = signalSideY\n const terminalLength = Math.abs(terminalOuterY - housingSignalY)\n const terminalCenterY = (terminalOuterY + housingSignalY) / 2\n const springLength = Math.max(throatDepth * 0.8, 0.5)\n const springCenterY =\n cableEdgeY + directionToSignal * (springLength / 2 + 0.08)\n const endClipX = resolvedMountPitch / 2\n const clipHeight = 0.75\n const clipWallX = bodyWidth / 2 - 0.04\n const clipCapX = bodyWidth / 2 - 0.23\n const sideBossX = bodyWidth / 2 - 0.32\n const sideBossWidth = 0.68\n\n return (\n <>\n {[-1, 1].map((direction) => (\n <Cuboid\n key={`mount-pad:${direction}`}\n color={TIN_COLOR}\n center={[direction * endClipX, mountY, 0.07]}\n size={[mountPadWidth, mountPadLength, 0.14]}\n />\n ))}\n\n {contactRows.map((contact) => (\n <Cuboid\n key={`terminal:${contact.index}`}\n color={TIN_COLOR}\n center={[contact.x, terminalCenterY, 0.065]}\n size={[terminalWidth, terminalLength, 0.13]}\n />\n ))}\n\n <RoundedCuboid\n color={HOUSING_SHADOW}\n center={[0, housingCenterY, housingBaseHeight / 2]}\n size={[bodyWidth, housingDepth, housingBaseHeight]}\n roundRadius={0.1}\n />\n\n <Colorize color={HOUSING_COLOR}>\n <Subtract>\n <RoundedCuboid\n center={[0, housingCenterY, housingBaseHeight + housingHeight / 2]}\n size={[bodyWidth - 0.2, housingDepth - 0.12, housingHeight]}\n roundRadius={0.14}\n />\n <Cuboid\n center={[0, throatCenterY, throatCenterZ]}\n size={[openingWidth, throatDepth, throatHeight]}\n />\n <Cuboid\n center={[0, actuatorCenterY, overallHeight - actuatorHeight * 0.72]}\n size={[actuatorWidth - 0.32, actuatorDepth - 0.16, actuatorHeight]}\n />\n </Subtract>\n </Colorize>\n\n {contactRows.map((contact) => (\n <RoundedCuboid\n key={`spring:${contact.index}`}\n color={TIN_HIGHLIGHT}\n center={[contact.x, springCenterY, housingBaseHeight + 0.82]}\n size={[terminalWidth * 0.82, springLength, 0.14]}\n roundRadius={0.035}\n />\n ))}\n\n {contactRows.map((contact) => (\n <Cuboid\n key={`terminal-rise:${contact.index}`}\n color={TIN_COLOR}\n center={[\n contact.x,\n housingSignalY - directionToSignal * 0.03,\n housingBaseHeight + 0.32,\n ]}\n size={[terminalWidth, 0.13, 0.62]}\n />\n ))}\n\n <Cuboid\n color={HOUSING_SHADOW}\n center={[\n 0,\n cableEdgeY + directionToSignal * 0.1,\n housingBaseHeight + 0.71,\n ]}\n size={[openingWidth + 0.18, 0.16, 0.8]}\n />\n\n <RoundedCuboid\n color={ACTUATOR_COLOR}\n center={[0, actuatorCenterY, actuatorCenterZ]}\n size={[actuatorWidth, actuatorDepth, actuatorHeight]}\n roundRadius={0.11}\n />\n\n <Cuboid\n color={ACTUATOR_HIGHLIGHT}\n center={[\n 0,\n actuatorCenterY - directionToSignal * (actuatorDepth / 2 - 0.12),\n overallHeight - 0.035,\n ]}\n size={[actuatorWidth - 0.36, 0.24, 0.07]}\n />\n\n {[-1, 1].map((direction) => (\n <RoundedCuboid\n key={`actuator-ear:${direction}`}\n color={ACTUATOR_COLOR}\n center={[direction * sideBossX, hingeY, hingeZ]}\n size={[sideBossWidth, 0.92, 0.72]}\n roundRadius={0.1}\n />\n ))}\n\n {[-1, 1].map((direction) => (\n <Translate\n key={`hinge:${direction}`}\n x={direction * sideBossX}\n y={hingeY}\n z={hingeZ}\n >\n <Rotate rotation={[0, Math.PI / 2, 0]}>\n <Cylinder\n color={ACTUATOR_HIGHLIGHT}\n height={sideBossWidth + 0.12}\n radius={0.24}\n />\n </Rotate>\n </Translate>\n ))}\n\n {[-1, 1].map((direction) => (\n <RoundedCuboid\n key={`hold-down-wall:${direction}`}\n color={HOLD_DOWN_COLOR}\n center={[direction * clipWallX, mountY, clipHeight / 2]}\n size={[0.17, Math.min(mountPadLength * 0.3, 0.7), clipHeight]}\n roundRadius={0.04}\n />\n ))}\n\n {[-1, 1].map((direction) => (\n <RoundedCuboid\n key={`hold-down-cap:${direction}`}\n color={HOLD_DOWN_HIGHLIGHT}\n center={[direction * clipCapX, mountY, clipHeight - 0.05]}\n size={[0.42, Math.min(mountPadLength * 0.3, 0.7), 0.1]}\n roundRadius={0.035}\n />\n ))}\n\n <Cuboid\n color={HOUSING_SHADOW}\n center={[0, housingCenterY, 0.025]}\n size={[openingWidth + 0.7, housingDepth * 0.58, 0.05]}\n />\n\n <Cuboid\n color={HOUSING_SHADOW}\n center={[\n 0,\n housingSignalY - directionToSignal * 0.06,\n housingBaseHeight + 0.82,\n ]}\n size={[openingWidth + 0.4, 0.15, 0.92]}\n />\n </>\n )\n}\n","import { Colorize, Cuboid, Hull, Translate } from \"jscad-fiber\"\n\nexport interface SmdPinHeaderProps {\n numberOfPins: number\n pitch?: number\n pinThickness?: number\n bodyWidth?: number\n bodyHeight?: number\n standoffHeight?: number\n matingPinLength?: number\n tailSpan?: number\n}\n\nexport const SmdPinHeader = ({\n numberOfPins,\n pitch = 2.54,\n pinThickness = 0.64,\n bodyWidth = 2.5,\n bodyHeight = 2.54,\n standoffHeight = 1.27,\n matingPinLength = 5.8,\n tailSpan = 5.08,\n}: SmdPinHeaderProps) => {\n const xStart = -((numberOfPins - 1) * pitch) / 2\n const bodyTop = standoffHeight + bodyHeight\n const tailLength = tailSpan / 2\n const tipChamferHeight = pinThickness * 0.35\n\n return (\n <>\n {Array.from({ length: numberOfPins }, (_, index) => {\n const x = xStart + index * pitch\n const tailDirection = index % 2 === 0 ? 1 : -1\n const postBodyLength = matingPinLength - tipChamferHeight\n const verticalTailLength = standoffHeight - pinThickness / 2\n\n return (\n <Translate key={index} x={x}>\n <Cuboid\n color=\"#222\"\n size={[pitch, bodyWidth, bodyHeight]}\n center={[0, 0, standoffHeight + bodyHeight / 2]}\n />\n <Colorize color=\"#d4af37\">\n <Cuboid\n size={[pinThickness, tailLength, pinThickness]}\n center={[0, tailDirection * (tailLength / 2), pinThickness / 2]}\n />\n <Cuboid\n size={[pinThickness, pinThickness, verticalTailLength]}\n center={[0, 0, pinThickness / 2 + verticalTailLength / 2]}\n />\n <Cuboid\n size={[pinThickness, pinThickness, postBodyLength]}\n center={[0, 0, bodyTop + postBodyLength / 2]}\n />\n <Hull>\n <Cuboid\n size={[pinThickness, pinThickness, 0.01]}\n center={[0, 0, bodyTop + postBodyLength]}\n />\n <Cuboid\n size={[pinThickness * 0.65, pinThickness * 0.65, 0.01]}\n center={[0, 0, bodyTop + matingPinLength]}\n />\n </Hull>\n </Colorize>\n </Translate>\n )\n })}\n </>\n )\n}\n","import { fp } from \"@tscircuit/footprinter\"\n\nexport interface PlatedHoleCenter {\n x: number\n y: number\n pin?: string\n}\n\n/**\n * Where a footprint's plated holes are, for through-hole bodies that have to\n * put their leads through them.\n *\n * `fp.string(name).json()` does not describe the hole PATTERN, only its\n * parameters, and the pattern is what a lead has to match: `to92` puts its\n * middle pin 1.27mm behind the outer two, `to92s` puts all three in a row and\n * `to92l` offsets the whole group so pin 1 sits at the origin. A body that\n * assumes any one of those is visibly wrong on the other two — leads beside\n * the holes rather than through them.\n */\nexport const getPlatedHoleCenters = (footprint: string): PlatedHoleCenter[] => {\n const elements = fp.string(footprint).circuitJson() as Array<{\n type: string\n x?: number\n y?: number\n port_hints?: string[]\n }>\n\n return elements\n .filter(\n (element) =>\n element.type === \"pcb_plated_hole\" &&\n Number.isFinite(element.x) &&\n Number.isFinite(element.y),\n )\n .map((element) => ({\n x: element.x as number,\n y: element.y as number,\n pin: element.port_hints?.[0],\n }))\n}\n","import { fp } from \"@tscircuit/footprinter\"\n\nexport interface SmtPadRect {\n x: number\n y: number\n width: number\n height: number\n pin?: string\n}\n\n/**\n * A footprint's rectangular SMT pads, for bodies that build a lead per pad.\n *\n * Lead COUNT is not a property of a package outline — SOT-23-5 and SOT-23-6\n * share a body, SC-70-4 and SC-70-6 share a body — so a body picked by outline\n * alone can end up with more or fewer leads than the footprint has pads.\n * Reading the pads makes that impossible.\n *\n * Polygon pads (a SOT-89 tab, say) are skipped: they are not lead feet.\n */\nexport const getSmtPadRects = (footprint: string): SmtPadRect[] => {\n const elements = fp.string(footprint).circuitJson() as Array<{\n type: string\n shape?: string\n x?: number\n y?: number\n width?: number\n height?: number\n port_hints?: string[]\n }>\n\n return elements\n .filter(\n (element) =>\n element.type === \"pcb_smtpad\" &&\n element.shape === \"rect\" &&\n Number.isFinite(element.x) &&\n Number.isFinite(element.y),\n )\n .map((element) => ({\n x: element.x as number,\n y: element.y as number,\n width: element.width ?? 0.4,\n height: element.height ?? 0.4,\n pin: element.port_hints?.[0],\n }))\n}\n","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport interface SmdLeadPad {\n x: number\n y: number\n width?: number\n height?: number\n}\n\nexport interface GullWingBodyProps {\n /** X extent of the moulded body. */\n bodyWidth: number\n /** Y extent of the moulded body. */\n bodyLength: number\n bodyHeight?: number\n /** Where each lead meets the board, from the footprint's own pads. */\n pads: SmdLeadPad[]\n leadThickness?: number\n /** How high the lead rises from the board to the body, as a fraction of the body height. */\n leadHeightRatio?: number\n}\n\n/**\n * A small-outline package with gull-wing leads on its left and right faces,\n * one lead per PAD.\n *\n * Two things come from two different places on purpose:\n *\n * - the body is the designation's (`bodyWidth`/`bodyLength` are passed in\n * from the package outline, never derived from the land pattern);\n * - the leads are the footprint's, because lead COUNT is not a property of a\n * body outline. SOT-23-5 and SOT-23-6 share a body; SC-70-4 and SC-70-6\n * share a body. A body picked by outline alone ends up with the wrong\n * number of legs, which is what this component exists to prevent.\n *\n * The leg itself is `SmdChipLead`, the same S-curve every other gull-wing part\n * here uses (SOIC, SOT-235, SOT-223, MSOP, QFP, MS-012). Anything else is a\n * second kind of leg in a repo that already has one.\n */\nexport const GullWingBody = ({\n bodyWidth,\n bodyLength,\n bodyHeight = 1,\n pads,\n leadThickness = 0.15,\n leadHeightRatio = 0.75,\n}: GullWingBodyProps) => {\n const centerX = pads.reduce((sum, pad) => sum + pad.x, 0) / (pads.length || 1)\n const centerY = pads.reduce((sum, pad) => sum + pad.y, 0) / (pads.length || 1)\n const leadHeight = bodyHeight * leadHeightRatio\n\n // The body is centred on the PADS, not on the footprint origin. Normally\n // those are the same; for footprinter's `sot343` they are not — its pads sit\n // at -1.056 and +0.550 where SC-70-4's land is symmetric about the origin\n // (KiCad has ±0.825). A part solders to the centre of its pads, so following\n // them keeps the leads equal and attached; following the origin would put a\n // symmetric package visibly off its own land.\n\n return (\n <>\n <ChipBody\n center={{ x: centerX, y: centerY, z: 0 }}\n width={bodyWidth}\n length={bodyLength}\n height={bodyHeight}\n />\n\n {pads.map((pad) => {\n const padWidth = pad.width ?? 0.4\n const padLength = pad.height ?? 0.4\n const side = pad.x >= centerX ? 1 : -1\n // The lead runs from the OUTER edge of its pad to the body face, plus\n // a little more so it merges into the body instead of stopping at it.\n //\n // Both halves of that matter. `SmdChipLead` draws from its anchor\n // inward by `bodyDistance`, so anchoring outboard of the pad (as the\n // fixed-geometry parts do, where the distance is generous enough to\n // hide it) leaves the inner end short of the body: 0.125mm of daylight\n // on SC-70-4 and 0.215mm on SOT-23-6, with the leg visibly floating.\n const outerX = pad.x + (side * padWidth) / 2\n const run = Math.max(Math.abs(outerX - centerX) - bodyWidth / 2, 0.1)\n const overlap = Math.min(0.15, bodyWidth * 0.15)\n\n return (\n <SmdChipLead\n key={`lead-${pad.x}-${pad.y}`}\n rotation={side > 0 ? Math.PI : 0}\n position={{\n x: outerX,\n y: pad.y,\n z: leadThickness / 2,\n }}\n width={padLength}\n thickness={leadThickness}\n padContactLength={padWidth * 0.6}\n bodyDistance={run + overlap}\n height={leadHeight}\n />\n )\n })}\n </>\n )\n}\n\nexport default GullWingBody\n","import { componentMaterials } from \"./materials\"\nimport { Cuboid } from \"jscad-fiber\"\n\n/**\n * A two-terminal chip body sized from its land pattern.\n *\n * Footprinter names a chip either by EIA size (`0402`) or parametrically by the\n * pads it wants (`res_p0.8656mm_pw0.5657mm_ph0.54mm`). The named sizes have\n * hand-modelled bodies -- `A0402` and friends -- and keep using them. This is\n * for the parametric form, which carries no size to look up and until now\n * rendered nothing at all.\n *\n * The pads are the only evidence available, so the body is derived from them:\n *\n * - **length** is the pad pitch. A chip's terminations sit centred on its pads,\n * so pitch tracks body length closely: across every EIA size from 0201 up it\n * is within 10% of the real part (0402: 1.02 vs 1.0mm, 0603: 1.65 vs 1.6mm,\n * 1206: 2.93 vs 3.2mm).\n * - **width and height** are the pad height less a fillet allowance. A land\n * pattern is drawn wider than the part so solder can wet the ends, by\n * 5-30% depending on the size; 0.85 is the middle of that range. Chips of\n * this class are near-square in section, so the same figure serves for height.\n *\n * The result is a *plausible* body, not a datasheet one -- accurate to about\n * 15% for 0201 and larger, and deliberately over-estimating for 01005, where a\n * land pattern is proportionally much larger than the part. That is the right\n * trade for a part that would otherwise be invisible: an approximate body shows\n * the board is populated and shows what a clearance check has to clear, while\n * nothing at all silently hides a component.\n */\nexport const ParametricChip = ({\n padPitch,\n padHeight,\n color = \"#333\",\n}: {\n /** Centre-to-centre distance between the two pads, mm. */\n padPitch: number\n /** Pad extent across the part, mm. */\n padHeight: number\n color?: string\n}) => {\n const fullLength = padPitch\n const width = padHeight * 0.85\n const height = width\n // Matches the 20% proportion the hand-modelled A-series uses.\n const terminatorWidth = fullLength * 0.2\n const bodyLength = fullLength - terminatorWidth * 2\n\n return (\n <>\n <Cuboid\n size={[bodyLength, width, height]}\n offset={[0, 0, height / 2]}\n material={componentMaterials.moldedPlastic}\n color={color}\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n material={componentMaterials.tinnedLead}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n Rotate,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\n\nexport interface Led5050Props {\n color?: string\n bodyColor?: string\n leadColor?: string\n}\n\nexport const Led5050 = ({\n color = \"#ffff00\",\n bodyColor = \"#ffffff\",\n leadColor = \"#dedede\",\n}: Led5050Props) => {\n const bodySize = 5\n const leadSpan = 5.4\n const bodyBottom = 0.2\n const bodyHeight = 1.3\n const bodyTop = bodyBottom + bodyHeight\n const leadLength = 1.4\n const leadWidth = 1\n const leadThickness = 0.2\n const leadCenterX = leadSpan / 2 - leadLength / 2\n const lensRadius = 2\n const lensHeight = 0.25\n const lensTop = 1.55\n const cornerCutDepth = 0.3\n const leadYPositions = [-1.7, 0, 1.7]\n const leadSides = [-1, 1]\n\n return (\n <>\n {leadYPositions.flatMap((y) =>\n leadSides.map((side) => (\n <Cuboid\n key={`${side}-${y}`}\n color={leadColor}\n size={[leadLength, leadWidth, leadThickness]}\n center={[side * leadCenterX, y, leadThickness / 2]}\n />\n )),\n )}\n\n <Colorize color={bodyColor}>\n <Subtract>\n <ChipBody\n width={bodySize}\n length={bodySize}\n height={bodyHeight}\n heightAboveSurface={bodyBottom}\n center={{ x: 0, y: 0, z: 0 }}\n color={bodyColor}\n taperRatio={0.036}\n straightHeightRatio={0.01}\n includeNotch={false}\n />\n <Cylinder\n radius={lensRadius}\n height={lensHeight}\n center={[0, 0, bodyTop - lensHeight / 2]}\n />\n <Translate\n offset={[\n -bodySize / 2,\n bodySize / 2,\n bodyTop - cornerCutDepth / 2 + 0.005,\n ]}\n >\n <Rotate rotation={[0, 0, Math.PI / 4]}>\n <Cuboid size={[0.9, 0.9, cornerCutDepth + 0.01]} />\n </Rotate>\n </Translate>\n </Subtract>\n </Colorize>\n\n <Cylinder\n color={color}\n radius={lensRadius}\n height={lensHeight}\n center={[0, 0, lensTop - lensHeight / 2]}\n />\n </>\n )\n}\n\nexport default Led5050\n","import { Colorize, Cuboid } from \"jscad-fiber\"\n\nexport interface Led2835Props {\n /** X extent of the package (footprinter reports 3.5 for `led2835`). */\n bodyWidth?: number\n /** Y extent of the package. */\n bodyLength?: number\n bodyHeight?: number\n /** Emitter colour when lit — the lens square on the top face. */\n color?: string\n bodyColor?: string\n padColor?: string\n /** Pad centres and widths, so the terminals line up with the footprint. */\n pad1X?: number\n pad1Width?: number\n pad2X?: number\n pad2Width?: number\n padLength?: number\n}\n\n/**\n * 2835 chip LED: a flat rectangular package with an emitter window, unlike the\n * symmetric two-terminal chips (0805 etc.) whose pads are mirrored — footprinter\n * gives `led2835` two DIFFERENT pad widths at two different offsets, so the body\n * is not centred on the pads.\n */\nexport const Led2835 = ({\n bodyWidth = 3.5,\n bodyLength = 2.8,\n bodyHeight = 0.8,\n color = \"#ffe08a\",\n bodyColor = \"#f2f2f2\",\n padColor = \"#cccccc\",\n pad1X = -0.9,\n pad1Width = 2.2,\n pad2X = 1.375,\n pad2Width = 1.25,\n padLength = 2.2,\n}: Led2835Props = {}) => {\n const padThickness = 0.1\n const lensHeight = 0.15\n const bodyCenterX = (pad1X + pad2X) / 2\n const lensWidth = bodyWidth * 0.55\n const lensLength = bodyLength * 0.55\n\n return (\n <>\n {[\n { x: pad1X, w: pad1Width, key: \"pad-1\" },\n { x: pad2X, w: pad2Width, key: \"pad-2\" },\n ].map(({ x, w, key }) => (\n <Colorize color={padColor} key={key}>\n <Cuboid\n size={[w, padLength, padThickness]}\n center={[x, 0, padThickness / 2]}\n />\n </Colorize>\n ))}\n\n <Colorize color={bodyColor}>\n <Cuboid\n size={[bodyWidth, bodyLength, bodyHeight]}\n center={[bodyCenterX, 0, padThickness + bodyHeight / 2]}\n />\n </Colorize>\n\n <Colorize color={color}>\n <Cuboid\n size={[lensWidth, lensLength, lensHeight]}\n center={[\n bodyCenterX,\n 0,\n padThickness + bodyHeight + lensHeight / 2 - 0.05,\n ]}\n />\n </Colorize>\n </>\n )\n}\n\nexport default Led2835\n","import {\n Colorize,\n Cuboid,\n Cylinder,\n Rotate,\n RoundedCuboid,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\n\nexport interface RJ45Props {\n /** Width of the shielded connector body in millimetres. */\n bodyWidth?: number\n /** Depth of the shielded connector body in millimetres. */\n bodyDepth?: number\n /** Height of the connector above the PCB in millimetres. */\n bodyHeight?: number\n /** Signed Y offset of the connector body from the signal rows. */\n bodyCenterY?: number\n /** Include the two indicator LEDs and their four through-hole leads. */\n ledPins?: boolean\n /** Mirror the eight signal pins so pin 1 is on the left. */\n firstPinLeft?: boolean\n /** Mirror the eight signal pins so pin 1 is in the top row. */\n firstPinTop?: boolean\n signalPitch?: number\n signalRowPitch?: number\n signalHoleDiameter?: number\n shieldPinX?: number\n shieldPinY?: number\n shieldHoleDiameter?: number\n locatorHoleX?: number\n locatorHoleY?: number\n locatorHoleDiameter?: number\n ledPinX?: number\n ledPinPitch?: number\n ledPinY?: number\n /** Override the inferred direction of the cable opening. */\n openingDirection?: -1 | 1\n shellColor?: string\n housingColor?: string\n contactColor?: string\n}\n\nconst range = (length: number) => Array.from({ length }, (_, index) => index)\n\n/**\n * Parametric, shielded 8P8C modular jack.\n *\n * The PCB-facing parameters intentionally mirror the `rj45` footprinter\n * function so the model's signal, shield, locator and optional LED leads stay\n * aligned with the generated land pattern.\n */\nexport const RJ45 = ({\n bodyWidth = 16.26,\n bodyDepth = 15.88,\n bodyHeight = 13.5,\n bodyCenterY = -0.96,\n ledPins = false,\n firstPinLeft = false,\n firstPinTop = false,\n signalPitch = 1.02,\n signalRowPitch = 1.78,\n signalHoleDiameter = 0.9144,\n shieldPinX = 8.13,\n shieldPinY = 0.13,\n shieldHoleDiameter = 1.8,\n locatorHoleX = 6.35,\n locatorHoleY = -3.43,\n locatorHoleDiameter = 3.25,\n ledPinX = 4.57,\n ledPinPitch = 2.29,\n ledPinY = 5.7,\n openingDirection,\n shellColor = \"#b7bdc2\",\n housingColor = \"#20242a\",\n contactColor = \"#d6a928\",\n}: RJ45Props) => {\n const frontDirection =\n openingDirection ?? (bodyCenterY > 0 ? (1 as const) : (-1 as const))\n const frontY = bodyCenterY + (frontDirection * bodyDepth) / 2\n const shellThickness = Math.min(0.38, bodyWidth * 0.024)\n const openingWidth = Math.max(bodyWidth - 2.5, bodyWidth * 0.72)\n const openingHeight = Math.min(bodyHeight - 2.4, 9.6)\n const openingCenterZ = 1.3 + openingHeight / 2\n const cavityDepth = Math.min(4.4, bodyDepth * 0.34)\n const cavityCenterY = frontY - (frontDirection * cavityDepth) / 2\n const backWallY =\n frontY - frontDirection * (cavityDepth + shellThickness * 0.7)\n const signalLeadRadius = Math.max(\n 0.22,\n Math.min(signalHoleDiameter * 0.36, 0.38),\n )\n const signalPinPositions = range(8).map((index) => {\n const defaultX = (3.5 - index) * signalPitch\n const defaultY = index % 2 === 0 ? -signalRowPitch / 2 : signalRowPitch / 2\n return {\n x: firstPinLeft ? -defaultX : defaultX,\n y: firstPinTop ? -defaultY : defaultY,\n }\n })\n const ledPinPositions = [\n -ledPinX - ledPinPitch,\n -ledPinX,\n ledPinX,\n ledPinX + ledPinPitch,\n ]\n const contactPitch = openingWidth / 10\n const contactY = frontY - frontDirection * Math.max(cavityDepth * 0.48, 1.2)\n const contactZ = openingCenterZ + openingHeight * 0.18\n const frontLipY = frontY + frontDirection * shellThickness * 0.2\n\n return (\n <>\n <Colorize color={shellColor}>\n <Subtract>\n <Cuboid\n center={[0, bodyCenterY, bodyHeight / 2]}\n size={[bodyWidth, bodyDepth, bodyHeight]}\n />\n <Cuboid\n center={[0, cavityCenterY, openingCenterZ]}\n size={[\n openingWidth,\n cavityDepth + shellThickness * 2,\n openingHeight,\n ]}\n />\n </Subtract>\n\n <Cuboid\n center={[0, frontLipY, 0.72]}\n size={[openingWidth + 0.5, shellThickness * 1.25, 1.05]}\n />\n\n {[-1, 1].map((direction) => (\n <Cuboid\n key={`shield-tab:${direction}`}\n center={[direction * shieldPinX, shieldPinY, 0.25]}\n size={[\n Math.max(shieldHoleDiameter * 0.46, 0.65),\n Math.max(shieldHoleDiameter * 0.72, 1.1),\n 3.4,\n ]}\n />\n ))}\n\n {[-1, 1].map((direction) => (\n <Cuboid\n key={`top-seam:${direction}`}\n center={[\n direction * bodyWidth * 0.24,\n bodyCenterY - frontDirection * bodyDepth * 0.08,\n bodyHeight + 0.04,\n ]}\n size={[bodyWidth * 0.22, bodyDepth * 0.42, 0.1]}\n />\n ))}\n </Colorize>\n\n <Colorize color={housingColor}>\n <Subtract>\n <RoundedCuboid\n center={[0, cavityCenterY, openingCenterZ]}\n size={[\n openingWidth - 0.2,\n cavityDepth + shellThickness * 0.5,\n openingHeight - 0.2,\n ]}\n roundRadius={0.22}\n />\n <Cuboid\n center={[\n 0,\n cavityCenterY - frontDirection * shellThickness * 0.2,\n openingCenterZ - 0.05,\n ]}\n size={[\n openingWidth - 1.25,\n cavityDepth + shellThickness,\n openingHeight - 1.35,\n ]}\n />\n </Subtract>\n\n <Cuboid\n center={[0, backWallY, openingCenterZ]}\n size={[openingWidth - 1.15, shellThickness, openingHeight - 1.25]}\n />\n\n <RoundedCuboid\n center={[0, frontY - frontDirection * cavityDepth * 0.28, 1.55]}\n size={[openingWidth - 2.6, cavityDepth * 0.5, 1.15]}\n roundRadius={0.16}\n />\n\n {[-1, 1].map((direction) => (\n <Cylinder\n key={`locator:${direction}`}\n center={[direction * locatorHoleX, locatorHoleY, -0.25]}\n radius={Math.max(locatorHoleDiameter * 0.41, 0.65)}\n height={2.7}\n />\n ))}\n </Colorize>\n\n <Colorize color={contactColor}>\n {signalPinPositions.map(({ x, y }, index) => (\n <Cylinder\n key={`signal-lead:${index}`}\n center={[x, y, 0.15]}\n radius={signalLeadRadius}\n height={3.1}\n />\n ))}\n\n {range(8).map((index) => (\n <Translate\n key={`socket-contact:${index}`}\n offset={[\n (index - 3.5) * contactPitch,\n contactY,\n contactZ + (index % 2 === 0 ? 0.03 : -0.03),\n ]}\n >\n <Rotate rotation={[frontDirection * 0.2, 0, 0]}>\n <RoundedCuboid\n size={[Math.max(contactPitch * 0.28, 0.28), 3.25, 0.16]}\n roundRadius={0.05}\n />\n </Rotate>\n </Translate>\n ))}\n\n {ledPins &&\n ledPinPositions.map((x, index) => (\n <Cylinder\n key={`led-lead:${index}`}\n center={[x, ledPinY, 0.15]}\n radius={signalLeadRadius}\n height={3.1}\n />\n ))}\n </Colorize>\n\n {ledPins && (\n <>\n <RoundedCuboid\n color=\"#73b744\"\n center={[\n -bodyWidth / 2 + 2.05,\n frontY + frontDirection * shellThickness * 0.35,\n bodyHeight - 2.05,\n ]}\n size={[2.15, shellThickness * 1.55, 1.45]}\n roundRadius={0.18}\n />\n <RoundedCuboid\n color=\"#e0aa35\"\n center={[\n bodyWidth / 2 - 2.05,\n frontY + frontDirection * shellThickness * 0.35,\n bodyHeight - 2.05,\n ]}\n size={[2.15, shellThickness * 1.55, 1.45]}\n roundRadius={0.18}\n />\n </>\n )}\n </>\n )\n}\n\nexport default RJ45\n","import { componentMaterials } from \"./materials\"\nimport { Colorize, Cuboid, Hull, Translate } from \"jscad-fiber\"\n\nexport interface DPAKProps {\n /** X extent of the moulded body (the lead-to-tab axis) */\n bodyWidth?: number\n /** Y extent of the moulded body (across the leads) */\n bodyLength?: number\n /** Height of the moulded body above the board */\n bodyHeight?: number\n /** X extent of the exposed metal tab (the drain/collector pad) */\n tabWidth?: number\n /** Y extent of the exposed metal tab */\n tabLength?: number\n /** Distance between the lead pad centres and the tab pad centre */\n span?: number\n /** Lead pitch along Y */\n pitch?: number\n /** Y width of one lead */\n leadWidth?: number\n /** X length of the lead's flat pad contact */\n leadContactLength?: number\n /**\n * TO-252 (DPAK) and TO-263 (D2PAK) differ only in size, so one body serves\n * both — pass the dimensions footprinter reports for the specific package.\n */\n color?: string\n tabColor?: string\n leadColor?: string\n}\n\n/**\n * TO-252 (DPAK) / TO-263 (D2PAK): a moulded body sitting on a large exposed\n * metal tab, with gull leads leaving the opposite face.\n *\n * The footprint is asymmetric — footprinter puts the lead pads at -span/2 and\n * the tab pad at +span/2 — so the body is placed over the tab rather than over\n * the origin. Getting that wrong moves a 4.4mm-tall part several millimetres,\n * which is exactly the error an enclosure clearance check cannot see.\n */\nexport const DPAK = ({\n bodyWidth = 6.1,\n bodyLength = 6.5,\n bodyHeight = 2.3,\n tabWidth = 6.2,\n tabLength = 5.8,\n span = 6.85,\n pitch = 2.29,\n leadWidth = 0.9,\n leadContactLength = 1.5,\n color = \"#222\",\n tabColor = \"#cccccc\",\n leadColor = \"#cccccc\",\n}: DPAKProps) => {\n const tabThickness = 0.5\n const tabCenterX = span / 2\n const leadPadX = -span / 2\n // The plastic covers the tab except for a strip at the far end.\n const bodyCenterX = tabCenterX + (tabWidth - bodyWidth) / 2\n const bodyFrontX = bodyCenterX - bodyWidth / 2\n const leadZ = tabThickness / 2\n const leadThickness = 0.4\n\n return (\n <>\n <Colorize material={componentMaterials.tinnedLead} color={tabColor}>\n <Cuboid\n size={[tabWidth, tabLength, tabThickness]}\n center={[tabCenterX, 0, tabThickness / 2]}\n />\n </Colorize>\n\n <Colorize material={componentMaterials.moldedPlastic} color={color}>\n <Cuboid\n size={[bodyWidth, bodyLength, bodyHeight]}\n center={[bodyCenterX, 0, tabThickness + bodyHeight / 2]}\n />\n </Colorize>\n\n {[-1, 1].map((side) => {\n return (\n <Colorize\n material={componentMaterials.tinnedLead}\n color={leadColor}\n key={`lead-${side}`}\n >\n {/* flat pad contact */}\n <Cuboid\n size={[leadContactLength, leadWidth, leadThickness]}\n center={[\n leadPadX + leadContactLength / 2,\n side * pitch,\n leadThickness / 2,\n ]}\n />\n {/* the run from the pad up into the body face */}\n <Hull>\n <Cuboid\n size={[0.1, leadWidth, leadThickness]}\n center={[\n leadPadX + leadContactLength,\n side * pitch,\n leadThickness / 2,\n ]}\n />\n <Cuboid\n size={[0.1, leadWidth, leadThickness]}\n center={[bodyFrontX, side * pitch, leadZ + tabThickness / 2]}\n />\n </Hull>\n </Colorize>\n )\n })}\n </>\n )\n}\n\nexport default DPAK\n","import { componentMaterials } from \"./materials\"\nimport {\n Colorize,\n Cuboid,\n Cylinder,\n RoundedCylinder,\n Subtract,\n} from \"jscad-fiber\"\n\nexport interface ElectrolyticCapacitorProps {\n /** Can diameter. footprinter reports this as `d` for `electrolytic`. */\n diameter?: number\n /**\n * Can height. Not part of any footprint: the same 10mm can is made in a\n * dozen heights. Defaults to `heightToDiameterRatio * diameter`, which for\n * the common radial series is a slight OVER-estimate — for a clearance\n * check that is the safe direction to be wrong in.\n */\n height?: number\n heightToDiameterRatio?: number\n /** Lead pitch (footprinter's `p`). */\n leadPitch?: number\n leadDiameter?: number\n /** How far the leads run below the board. */\n leadLength?: number\n sleeveColor?: string\n baseColor?: string\n}\n\n/**\n * Radial (can) electrolytic capacitor: the part an enclosure cavity is usually\n * sized around, and until now one with no body at all.\n *\n * Only the diameter and the lead pitch come from the footprint. The height is\n * derived, and deliberately generous — see `heightToDiameterRatio`.\n */\nexport const ElectrolyticCapacitor = ({\n diameter = 6.3,\n heightToDiameterRatio = 1.4,\n height = diameter * heightToDiameterRatio,\n leadPitch = 2.5,\n leadDiameter = 0.6,\n leadLength = 3,\n sleeveColor = \"#1b2a6b\",\n baseColor = \"#1a1a1a\",\n}: ElectrolyticCapacitorProps) => {\n const radius = diameter / 2\n const baseHeight = Math.min(1, diameter * 0.12)\n const canHeight = Math.max(height - baseHeight, 0.1)\n const canBottom = baseHeight\n const canTop = canBottom + canHeight\n // The pressure-relief score on the top face: two crossed grooves.\n const grooveWidth = Math.max(diameter * 0.06, 0.2)\n const grooveDepth = 0.3\n\n return (\n <>\n {/* rubber bung / base. Slightly narrower than the can: coincident side\n faces render as z-fighting moiré, not as a join. */}\n <Colorize color={baseColor} material={componentMaterials.rubber}>\n <Cylinder\n radius={radius - 0.05}\n height={baseHeight}\n center={[0, 0, baseHeight / 2]}\n />\n </Colorize>\n\n {/* aluminium can with its sleeve */}\n <Colorize color={sleeveColor} material={componentMaterials.sleeve}>\n <Subtract>\n <RoundedCylinder\n radius={radius}\n height={canHeight}\n roundRadius={Math.min(0.3, radius * 0.15)}\n center={[0, 0, canBottom + canHeight / 2]}\n />\n <Cuboid\n size={[diameter, grooveWidth, grooveDepth * 2]}\n center={[0, 0, canTop]}\n />\n <Cuboid\n size={[grooveWidth, diameter, grooveDepth * 2]}\n center={[0, 0, canTop]}\n />\n </Subtract>\n </Colorize>\n\n {[-1, 1].map((side) => (\n <Colorize\n material={componentMaterials.tinnedLead}\n color=\"#c0c0c0\"\n key={`lead-${side}`}\n >\n <Cylinder\n radius={leadDiameter / 2}\n height={leadLength + baseHeight}\n center={[(side * leadPitch) / 2, 0, (baseHeight - leadLength) / 2]}\n />\n </Colorize>\n ))}\n </>\n )\n}\n\nexport default ElectrolyticCapacitor\n","import { Colorize, Cuboid, Cylinder, Subtract } from \"jscad-fiber\"\n\nexport interface PotentiometerLead {\n x: number\n y: number\n}\n\nexport interface PotentiometerProps {\n /** X extent of the body (footprinter's `w`). */\n bodyWidth?: number\n /** Y extent of the body (footprinter's `ca`). */\n bodyLength?: number\n /** Height of the body above the board (footprinter's `h`). */\n bodyHeight?: number\n /** X offset of the body centre from the footprint origin. */\n bodyCenterX?: number\n /** Diameter of the adjuster on the top face. */\n adjusterDiameter?: number\n /**\n * A panel-mount pot's shaft. Zero by default and on purpose: the footprint\n * carries no shaft dimension, and inventing one would make an enclosure\n * cut a hole for a part that has no shaft, or clear a volume it does not\n * need. Pass it explicitly for a panel pot.\n */\n shaftDiameter?: number\n shaftHeight?: number\n /**\n * Where the pins meet the board, from the footprint's plated holes. A\n * through-hole part with no pins at all is not a body anyone can check\n * against its footprint — it just floats over three empty holes.\n */\n leads?: PotentiometerLead[]\n /** Diameter of a pin, and how far it runs below the board. */\n leadDiameter?: number\n leadLength?: number\n bodyColor?: string\n adjusterColor?: string\n}\n\n/**\n * Trimmer / potentiometer body.\n *\n * The extent comes from the footprint: `w` across, `ca` along, `h` tall. What\n * the footprint cannot tell us is the shaft, so there is none unless asked\n * for — see `shaftHeight`.\n *\n * Name: `core` also exports a `Potentiometer`, and that one is a circuit\n * element (a React component with ports and a footprint). This is a JSCAD\n * solid with no electrical meaning, and it is named for the package the way\n * every other body in this directory is (`PushButton`, `RJ45`, `Crystal`,\n * which shadow core the same way). Renaming it would break that convention to\n * avoid a collision that cannot occur: nothing imports both.\n */\nexport const Potentiometer = ({\n bodyWidth = 5.35,\n bodyLength = 14,\n bodyHeight = 4,\n bodyCenterX = bodyWidth / 2,\n adjusterDiameter = Math.min(bodyWidth, bodyLength) * 0.55,\n shaftDiameter = 0,\n shaftHeight = 0,\n leads = [],\n leadDiameter = 0.6,\n leadLength = 3,\n bodyColor = \"#1f4fa3\",\n adjusterColor = \"#d8d8d8\",\n}: PotentiometerProps) => {\n const adjusterHeight = 0.8\n const adjusterZ = bodyHeight + adjusterHeight / 2\n const slotWidth = Math.max(adjusterDiameter * 0.16, 0.3)\n\n return (\n <>\n <Colorize color={bodyColor}>\n <Cuboid\n size={[bodyWidth, bodyLength, bodyHeight]}\n center={[bodyCenterX, 0, bodyHeight / 2]}\n />\n </Colorize>\n\n {/* screwdriver adjuster, slot cut into it */}\n <Colorize color={adjusterColor}>\n <Subtract>\n <Cylinder\n radius={adjusterDiameter / 2}\n height={adjusterHeight}\n center={[bodyCenterX, 0, adjusterZ]}\n />\n <Cuboid\n size={[adjusterDiameter, slotWidth, adjusterHeight * 0.6]}\n center={[bodyCenterX, 0, adjusterZ + adjusterHeight / 2]}\n />\n </Subtract>\n </Colorize>\n\n {shaftHeight > 0 && shaftDiameter > 0 ? (\n <Colorize color={adjusterColor}>\n <Cylinder\n radius={shaftDiameter / 2}\n height={shaftHeight}\n center={[bodyCenterX, 0, bodyHeight + shaftHeight / 2]}\n />\n </Colorize>\n ) : null}\n\n {leads.map((lead) => (\n <Colorize color=\"#c0c0c0\" key={`lead-${lead.x}-${lead.y}`}>\n <Cylinder\n radius={leadDiameter / 2}\n height={bodyHeight / 2 + leadLength}\n center={[lead.x, lead.y, (bodyHeight / 2 - leadLength) / 2]}\n />\n </Colorize>\n ))}\n </>\n )\n}\n\nexport default Potentiometer\n","import { Colorize, Cuboid, Cylinder } from \"jscad-fiber\"\n\nexport interface SmdPushButtonProps {\n /** X extent of the moulded body. */\n bodyWidth?: number\n /** Y extent of the moulded body. */\n bodyLength?: number\n /** Height of the body above the board. */\n bodyHeight?: number\n /** Diameter of the actuator on the top face. */\n actuatorDiameter?: number\n /** How far the actuator stands proud of the body — the real part height. */\n actuatorHeight?: number\n /** X distance between the pad centres on opposite sides. */\n padSpanX?: number\n /** Y distance between the two pad rows. */\n padSpanY?: number\n padWidth?: number\n padLength?: number\n bodyColor?: string\n actuatorColor?: string\n leadColor?: string\n}\n\n/**\n * SMD tactile push button.\n *\n * The body outline is the footprint's silkscreen (2.86 x 3.04 for footprinter's\n * `smdpushbutton`); the height is the switch's, not the footprint's — a\n * footprint cannot describe an actuator. `actuatorHeight` is the part of that\n * height an enclosure lid has to clear or press on, so it is separate from\n * `bodyHeight` rather than folded into it.\n */\nexport const SmdPushButton = ({\n bodyWidth = 2.9,\n bodyLength = 3.0,\n bodyHeight = 1.4,\n actuatorDiameter = 1.5,\n actuatorHeight = 0.5,\n padSpanX = 4.2,\n padSpanY = 2.15,\n padWidth = 1.05,\n padLength = 0.7,\n bodyColor = \"#2b2b2b\",\n actuatorColor = \"#d9d9d9\",\n leadColor = \"#cccccc\",\n}: SmdPushButtonProps) => {\n const leadThickness = 0.15\n\n return (\n <>\n <Colorize color={bodyColor}>\n <Cuboid\n size={[bodyWidth, bodyLength, bodyHeight]}\n center={[0, 0, bodyHeight / 2]}\n />\n </Colorize>\n\n <Colorize color={actuatorColor}>\n <Cylinder\n radius={actuatorDiameter / 2}\n height={actuatorHeight}\n center={[0, 0, bodyHeight + actuatorHeight / 2]}\n />\n </Colorize>\n\n {[-1, 1].flatMap((sx) =>\n [-1, 1].map((sy) => (\n <Colorize color={leadColor} key={`lead-${sx}-${sy}`}>\n <Cuboid\n size={[padWidth, padLength, leadThickness]}\n center={[\n (sx * padSpanX) / 2,\n (sy * padSpanY) / 2,\n leadThickness / 2,\n ]}\n />\n </Colorize>\n )),\n )}\n </>\n )\n}\n\nexport default SmdPushButton\n","import { fp } from \"@tscircuit/footprinter\"\nimport { Colorize, Cuboid, Cylinder, Rotate, Subtract } from \"jscad-fiber\"\n\n/** Low-profile side-actuated SPDT switch; MSK12C02 and MINI MSK12C02 outlines. */\nexport const SmdSlideSwitch = ({\n footprint = \"smdslideswitch7\",\n position = 0,\n}: { footprint?: string; position?: 0 | 1 }) => {\n const canonical = footprint.replace(/_pin1location\\([^)]*\\)/g, \"\")\n const params = fp.string(canonical).json() as unknown as {\n mpx: number\n mounty: number\n }\n const elements = fp.string(canonical).circuitJson()\n const pads = elements.filter(\n (e) => e.type === \"pcb_smtpad\" && e.shape === \"rect\",\n )\n const target = fp\n .string(footprint)\n .circuitJson()\n .filter(\n (e) =>\n e.type === \"pcb_smtpad\" &&\n (e.shape === \"rect\" || e.shape === \"rotated_rect\"),\n )\n if (pads.length < 7 || !Number.isFinite(params.mpx) || params.mpx < 3)\n throw new Error(\"SmdSlideSwitch needs signal pads and four mounting pads\")\n const angle =\n Math.atan2(target[1]!.y - target[0]!.y, target[1]!.x - target[0]!.x) -\n Math.atan2(pads[1]!.y - pads[0]!.y, pads[1]!.x - pads[0]!.x)\n const width = params.mpx - 0.5,\n depth = 2.7,\n height = params.mpx > 6 ? 1.5 : 1.4,\n y = params.mounty\n return (\n <Rotate rotation={[0, 0, angle]}>\n <Colorize color=\"#aeb4ba\">\n <Subtract>\n <Cuboid size={[width, depth, height]} center={[0, y, height / 2]} />\n <Cuboid\n size={[width - 0.3, depth - 0.3, height]}\n center={[0, y, height / 2 - 0.15]}\n />\n <Cuboid size={[2.7, 0.5, 0.9]} center={[0, y - depth / 2, 0.65]} />\n </Subtract>\n </Colorize>\n <Colorize color=\"#28292c\">\n <Cuboid\n size={[width - 0.32, depth - 0.32, 0.35]}\n center={[0, y, 0.175]}\n />\n <Cuboid\n size={[1, 2.25, 0.65]}\n center={[position === 0 ? -0.5 : 0.5, y - 1.5, 0.65]}\n />\n {elements\n .filter((e) => e.type === \"pcb_hole\")\n .map((hole, i) =>\n \"hole_diameter\" in hole && \"x\" in hole ? (\n <Cylinder\n key={i}\n radius={hole.hole_diameter * 0.42}\n height={0.6}\n center={[hole.x, hole.y, -0.2]}\n />\n ) : null,\n )}\n </Colorize>\n <Colorize color=\"#c6c7c9\">\n {pads.map((pad, i) => {\n const signal = i < pads.length - 4\n const outerY = pad.y + pad.height * 0.4\n const innerY = Math.min(pad.y - pad.height * 0.4, y + depth / 2 - 0.2)\n return (\n <Cuboid\n key={i}\n size={[\n pad.width * 0.8,\n signal ? outerY - innerY : pad.height * 0.8,\n 0.18,\n ]}\n center={[pad.x, signal ? (outerY + innerY) / 2 : pad.y, 0.09]}\n />\n )\n })}\n </Colorize>\n </Rotate>\n )\n}\n","import { Cuboid, Translate, Rotate, Colorize } from \"jscad-fiber\"\n\nexport const SOT563 = ({ fullWidth = 1.94, fullLength = 1.6 }) => {\n const bodyWidth = 1.2\n const bodyLength = 1.6\n const bodyHeight = 0.55\n const leadWidth = 0.3\n const leadLength = 0.67\n const leadHeight = 0.13\n const leadSpacing = 0.5\n const bodyZOffset = -0.4\n\n return (\n <>\n {/* Main body - rotated 90 degrees around X-axis */}\n <Rotate rotation={[45 * Math.PI, 0, 0]}>\n <Translate center={[0, 0, bodyZOffset]}>\n <Colorize color=\"grey\">\n <Cuboid size={[bodyWidth, bodyLength, bodyHeight]} />\n </Colorize>\n </Translate>\n </Rotate>\n\n {/* Leads */}\n {[-1, 0, 1].flatMap((yOffset, index) => [\n // Left lead\n\n <Translate\n key={`left-${index}`}\n center={[\n -bodyWidth / 2 - 0.03,\n yOffset * leadSpacing,\n leadHeight / 2,\n ]}\n >\n <Cuboid size={[leadLength, leadWidth, leadHeight]} />\n </Translate>,\n // Right lead\n <Translate\n key={`right-${index}`}\n center={[bodyWidth / 2 + 0.03, yOffset * leadSpacing, leadHeight / 2]}\n >\n <Cuboid size={[leadLength, leadWidth, leadHeight]} />\n </Translate>,\n ])}\n </>\n )\n}\n\nexport default SOT563\n","import { componentMaterials } from \"./materials\"\nimport { fp } from \"@tscircuit/footprinter\"\nimport {\n Colorize,\n Cuboid,\n Cylinder,\n Hull,\n Rotate,\n Subtract,\n Translate,\n} from \"jscad-fiber\"\n\nconst Capsule = ({\n width,\n height,\n depth,\n}: { width: number; height: number; depth: number }) => (\n <Hull>\n {[-1, 1].map((side) => (\n <Translate key={side} offset={[(side * (width - height)) / 2, 0, 0]}>\n <Rotate rotation={[Math.PI / 2, 0, 0]}>\n <Cylinder radius={height / 2} height={depth} />\n </Rotate>\n </Translate>\n ))}\n </Hull>\n)\n\n/** USB2 Type-C receptacle: rounded open shell, tongue, contacts and four slot tabs. */\nexport const UsbCMidmount = ({\n footprint = \"usbcmidmount16\",\n}: { footprint?: string }) => {\n const canonical = footprint.replace(/_pin1location\\([^)]*\\)/g, \"\")\n const params = fp.string(canonical).json() as unknown as {\n bodybottom: number\n rowy: number\n }\n const elements = fp.string(canonical).circuitJson()\n const pads = elements.filter(\n (e) => e.type === \"pcb_smtpad\" && e.shape === \"rect\",\n )\n const slots = elements.filter((e) => e.type === \"pcb_plated_hole\")\n const holes = elements.filter((e) => e.type === \"pcb_hole\")\n const target = fp\n .string(footprint)\n .circuitJson()\n .find((e) => e.type === \"pcb_plated_hole\")\n const first = slots[0]\n const angle =\n first && target && \"x\" in target\n ? Math.atan2(target.y, target.x) - Math.atan2(first.y, first.x)\n : 0\n const width = 8.94,\n height = 3.2,\n wall = 0.22\n const back = params.rowy + 0.23,\n front = -params.bodybottom\n const depth = back - front,\n centerY = (back + front) / 2,\n centerZ = 1.65\n if (!Number.isFinite(depth) || depth < 3 || slots.length !== 4)\n throw new Error(\n \"UsbCMidmount requires four mounting slots and a positive body depth\",\n )\n // Reach the sidewall at its widest point while preserving slot insertion depth.\n const tabBottom = -0.9,\n tabTop = centerZ + 0.1\n return (\n <Rotate rotation={[0, 0, angle]}>\n <Colorize color=\"#b8bdc4\" material={componentMaterials.brushedMetal}>\n <Translate offset={[0, centerY, centerZ]}>\n <Subtract>\n <Capsule width={width} height={height} depth={depth} />\n <Capsule\n width={width - wall * 2}\n height={height - wall * 2}\n depth={depth + 0.2}\n />\n </Subtract>\n </Translate>\n </Colorize>\n <Colorize color=\"#242529\" material={componentMaterials.moldedPlastic}>\n <Cuboid\n size={[6.65, depth - 1.1, 0.7]}\n center={[0, centerY + 0.3, centerZ]}\n />\n <Cuboid size={[7.6, 1, 2.45]} center={[0, back - 0.65, centerZ]} />\n {holes.map((hole, i) =>\n \"x\" in hole && \"hole_diameter\" in hole ? (\n <Cylinder\n key={i}\n radius={hole.hole_diameter * 0.42}\n height={0.8}\n center={[hole.x, hole.y, -0.3]}\n />\n ) : null,\n )}\n </Colorize>\n <Colorize color=\"#d3ad57\" material={componentMaterials.goldContact}>\n {[-1, 1].flatMap((side) =>\n [-2.75, -2.25, -1.25, -0.25, 0.25, 1.25, 2.25, 2.75].map((x) => (\n <Cuboid\n key={`${side}-${x}`}\n size={[0.24, depth - 2, 0.04]}\n center={[x, centerY + 0.1, centerZ + side * 0.365]}\n />\n )),\n )}\n {pads.map((pad, i) => (\n <Cuboid\n key={i}\n size={[\n Math.min(pad.width * 0.7, 0.35),\n pad.height * 0.8 + 0.35,\n 0.15,\n ]}\n center={[pad.x, pad.y - 0.175, 0.075]}\n />\n ))}\n </Colorize>\n <Colorize color=\"#b8bdc4\" material={componentMaterials.brushedMetal}>\n {slots.map((slot, i) => (\n <Cuboid\n key={i}\n size={[\n 0.4,\n \"hole_height\" in slot && slot.hole_height !== undefined\n ? Math.max(0.3, slot.hole_height - 0.2)\n : 1,\n tabTop - tabBottom,\n ]}\n center={[slot.x, slot.y, (tabTop + tabBottom) / 2]}\n />\n ))}\n </Colorize>\n </Rotate>\n )\n}\n","import { fp } from \"@tscircuit/footprinter\"\nimport { Rotate } from \"jscad-fiber\"\nimport { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\nconst getPads = (footprint: string) =>\n fp\n .string(footprint)\n .circuitJson()\n .filter(\n (element) =>\n element.type === \"pcb_smtpad\" &&\n (element.shape === \"rect\" || element.shape === \"rotated_rect\"),\n )\n .map((pad) => ({ x: pad.x, y: pad.y, pin: pad.port_hints?.[0] }))\n\n/** SOT143B nominal dimensions: Nexperia SOT143B package outline (mm). */\nexport const SOT143 = ({ footprint = \"sot143\" }: { footprint?: string }) => {\n const pads = getPads(footprint)\n if (pads.length !== 4) throw new Error(\"SOT143 requires four signal pads\")\n const canonical = getPads(\"sot143\")\n const options = fp.string(footprint).json() as { pin1location?: string[] }\n // Resolve pin1location using the numbered pad direction, not bounding boxes:\n // the latter cannot distinguish the 180-degree variants of this package.\n const origin = canonical[1]!\n const target = pads.find((pad) => pad.pin === \"2\")!\n const angle = options.pin1location\n ? Math.round(\n (Math.atan2(target.y, target.x) - Math.atan2(origin.y, origin.x)) /\n (Math.PI / 2),\n ) *\n (Math.PI / 2)\n : 0\n const local = pads.map((pad) => ({\n ...pad,\n x: pad.x * Math.cos(angle) + pad.y * Math.sin(angle),\n y: -pad.x * Math.sin(angle) + pad.y * Math.cos(angle),\n }))\n return (\n <Rotate rotation={[0, 0, angle]}>\n <ChipBody\n width={2.9}\n length={1.3}\n height={0.95}\n heightAboveSurface={0.05}\n center={{ x: 0, y: 0, z: 0 }}\n includeNotch={false}\n taperRatio={0.06}\n />\n {local.map((pad) => {\n const side = pad.y < 0 ? -1 : 1\n const leadWidth = pad.pin === \"1\" ? 0.83 : 0.43\n // Solder land is deliberately larger than the actual lead toe.\n return (\n <SmdChipLead\n key={pad.pin}\n width={leadWidth}\n thickness={0.12}\n height={0.45}\n padContactLength={0.3}\n bodyDistance={0.6}\n rotation={side < 0 ? Math.PI / 2 : -Math.PI / 2}\n position={{ x: pad.x, y: side * 1.15, z: 0.06 }}\n />\n )\n })}\n </Rotate>\n )\n}\n","import { Colorize, Cuboid, Hull, Subtract } from \"jscad-fiber\"\n\n/** Physical outline dimensions in mm, independent of a PCB land pattern. */\nexport interface FlatLeadDiodeDimensions {\n bodyLength: number\n bodyWidth: number\n /** Overall height from the seating plane, including standoff. */\n bodyHeight: number\n /** Outer tip-to-tip span of the two terminals. */\n leadSpan: number\n cathodeLength: number\n cathodeWidth: number\n anodeLength: number\n anodeWidth: number\n terminalThickness: number\n standoff: number\n /** Inset of each top edge relative to the mold base. */\n taperInset: number\n /** Top cathode band width; zero omits the band. */\n markingWidth: number\n}\n\n/** Shared geometry for flat-lead diode outlines; standard wrappers supply defaults.\n * Cathode is at negative X. All dimensions remain physical; no footprint inference.\n */\nexport function createFlatLeadDiode(p: FlatLeadDiodeDimensions) {\n // React/Cosmos can supply auxiliary props such as children. Validate only dimensions.\n const dimensions = [\n \"bodyLength\",\n \"bodyWidth\",\n \"bodyHeight\",\n \"leadSpan\",\n \"cathodeLength\",\n \"cathodeWidth\",\n \"anodeLength\",\n \"anodeWidth\",\n \"terminalThickness\",\n \"standoff\",\n \"taperInset\",\n \"markingWidth\",\n ] as const\n for (const name of dimensions) {\n const value = p[name]\n const allowZero = [\"standoff\", \"taperInset\", \"markingWidth\"].includes(name)\n if (!Number.isFinite(value) || (allowZero ? value < 0 : value <= 0))\n throw new Error(`Invalid diode dimension: ${name}`)\n }\n const overhang = (p.leadSpan - p.bodyLength) / 2\n if (\n overhang < 0 ||\n p.cathodeLength <= overhang ||\n p.anodeLength <= overhang ||\n p.cathodeLength + p.anodeLength >= p.leadSpan ||\n p.cathodeWidth > p.bodyWidth ||\n p.anodeWidth > p.bodyWidth ||\n p.standoff >= p.terminalThickness ||\n p.terminalThickness >= p.bodyHeight ||\n p.taperInset * 2 >= Math.min(p.bodyLength, p.bodyWidth) ||\n p.markingWidth * 2 >= p.bodyLength - p.taperInset * 2\n )\n throw new Error(\n \"Diode dimensions leave disconnected terminals or an invalid mold\",\n )\n const slice = Math.min(p.bodyHeight - p.standoff, p.bodyWidth) / 100\n const body = (\n <Hull>\n <Cuboid\n size={[p.bodyLength, p.bodyWidth, slice]}\n center={[0, 0, p.standoff + slice / 2]}\n />\n <Cuboid\n size={[\n p.bodyLength - p.taperInset * 2,\n p.bodyWidth - p.taperInset * 2,\n slice,\n ]}\n center={[0, 0, p.bodyHeight - slice / 2]}\n />\n </Hull>\n )\n const stripe = (\n <Cuboid\n size={[p.markingWidth, (p.bodyWidth - p.taperInset * 2) * 0.9, slice]}\n center={[\n -p.bodyLength / 2 + p.taperInset + p.markingWidth,\n 0,\n p.bodyHeight - slice / 2,\n ]}\n />\n )\n return (\n <>\n <Colorize color=\"#25272a\">\n {p.markingWidth > 0 ? (\n <Subtract>\n {body}\n {stripe}\n </Subtract>\n ) : (\n body\n )}\n </Colorize>\n <Colorize color=\"#c7c9cd\">\n <Cuboid\n size={[p.cathodeLength, p.cathodeWidth, p.terminalThickness]}\n center={[\n -p.leadSpan / 2 + p.cathodeLength / 2,\n 0,\n p.terminalThickness / 2,\n ]}\n />\n <Cuboid\n size={[p.anodeLength, p.anodeWidth, p.terminalThickness]}\n center={[\n p.leadSpan / 2 - p.anodeLength / 2,\n 0,\n p.terminalThickness / 2,\n ]}\n />\n </Colorize>\n {p.markingWidth > 0 && <Colorize color=\"#aaaaa8\">{stripe}</Colorize>}\n </>\n )\n}\n","import {\n createFlatLeadDiode,\n type FlatLeadDiodeDimensions,\n} from \"./utils/FlatLeadDiode\"\n/** DO-219AD flat-lead outline, with independently sized cathode/anode contacts.\n * Body and terminal dimensions use midpoints of the outline ranges on page 3.\n * Mold standoff, taper and marking dimensions are visual approximations, exposed as props.\n * https://www.vishay.com/doc/?89019=\n * Dimension overrides represent variants of this standard outline. They are\n * geometry parameters, not new Footprinter tokens or manufacturer selectors.\n */\nexport type DO219ADProps = Partial<FlatLeadDiodeDimensions>\nexport const DO219AD = (props: DO219ADProps) =>\n createFlatLeadDiode({\n bodyLength: 2.2,\n bodyWidth: 1.3,\n bodyHeight: 0.68,\n leadSpan: 2.5,\n cathodeLength: 1.3,\n cathodeWidth: 0.88,\n anodeLength: 0.65,\n anodeWidth: 0.65,\n terminalThickness: 0.195,\n standoff: 0.11,\n taperInset: 0.05,\n markingWidth: 0.23,\n\n ...props,\n })\n","import {\n createFlatLeadDiode,\n type FlatLeadDiodeDimensions,\n} from \"./utils/FlatLeadDiode\"\n/** SOD-323HE flat-lead outline with symmetric contacts by default.\n * Dimensional reference: https://www.es.co.th/Schemetic/PDF/RFU02VSM6S.PDF\n * Defaults use nominal 2.0 x 1.4 mm mold, 2.5 mm lead span and 0.6 mm height.\n * Buried terminal length, taper and marking dimensions are visual approximations.\n * https://www.rohm.de/products/diodes/fast-recovery-diodes/standard/rfu02vsm6s-product\n * Dimension overrides represent variants of this standard outline. They are\n * geometry parameters, not new Footprinter tokens or manufacturer selectors.\n */\nexport type SOD323HEProps = Partial<FlatLeadDiodeDimensions>\nexport const SOD323HE = (props: SOD323HEProps) =>\n createFlatLeadDiode({\n bodyLength: 2,\n bodyWidth: 1.4,\n bodyHeight: 0.6,\n leadSpan: 2.5,\n cathodeLength: 0.55,\n cathodeWidth: 0.8,\n anodeLength: 0.55,\n anodeWidth: 0.8,\n terminalThickness: 0.17,\n standoff: 0.05,\n taperInset: 0.15,\n markingWidth: 0.2,\n\n ...props,\n })\n","import { Colorize, Cuboid, Translate, Hull, Union } from \"jscad-fiber\"\n/** Three-terminal SOT-89 / TO-243 / SC-62, in mm. Three flat leads at -X;\n * the middle terminal continues into the exposed die pad and rear tab at +X.\n * Body dimensions exclude metal. Z=0 is the seating plane. Mold draft is an\n * approximation; tab corner chamfers and lead-frame stamping details are omitted.\n */\nexport interface SOT89Props {\n bodyWidth: number\n bodyLength: number\n bodyHeight: number\n standoff: number\n pitch: number\n leadWidth: number\n centerLeadWidth: number\n leadLength: number\n terminalThickness: number\n tabWidth: number\n tabLength: number\n rearExtension: number\n taperInset: number\n}\nexport function SOT89(p: SOT89Props) {\n for (const k of [\n \"bodyWidth\",\n \"bodyLength\",\n \"bodyHeight\",\n \"pitch\",\n \"leadWidth\",\n \"centerLeadWidth\",\n \"leadLength\",\n \"terminalThickness\",\n \"tabWidth\",\n \"tabLength\",\n \"rearExtension\",\n ] as const)\n if (!Number.isFinite(p[k]) || p[k] <= 0)\n throw new Error(`${k} must be finite and positive`)\n if (\n !Number.isFinite(p.standoff) ||\n p.standoff < 0 ||\n !Number.isFinite(p.taperInset) ||\n p.taperInset < 0 ||\n p.terminalThickness <= p.standoff ||\n p.terminalThickness >= p.bodyHeight ||\n 2 * p.pitch + p.leadWidth >= p.bodyLength ||\n p.leadWidth >= p.pitch ||\n p.centerLeadWidth >= p.pitch ||\n p.tabWidth >= 2 * p.pitch - p.leadWidth ||\n p.tabWidth <= p.centerLeadWidth ||\n p.tabLength <= p.rearExtension ||\n p.tabLength >= p.bodyWidth + p.rearExtension ||\n 2 * p.taperInset >= Math.min(p.bodyWidth, p.bodyLength)\n )\n throw new Error(\"Invalid SOT-89 body or terminal layout\")\n const front = -p.bodyWidth / 2,\n rear = p.bodyWidth / 2 + p.rearExtension,\n tabFront = rear - p.tabLength\n const slice = Math.min(0.002, (p.bodyHeight - p.standoff) / 100)\n const block = (x: number, y: number, length: number, width: number) => (\n <Translate offset={[x, y, p.terminalThickness / 2]}>\n <Cuboid size={[length, width, p.terminalThickness]} />\n </Translate>\n )\n return (\n <>\n <Colorize color=\"#353535\">\n <Hull>\n <Translate z={p.standoff + slice / 2}>\n <Cuboid size={[p.bodyWidth, p.bodyLength, slice]} />\n </Translate>\n <Translate z={p.bodyHeight - slice / 2}>\n <Cuboid\n size={[\n p.bodyWidth - 2 * p.taperInset,\n p.bodyLength - 2 * p.taperInset,\n slice,\n ]}\n />\n </Translate>\n </Hull>\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n {[-1, 1].map((sign) =>\n block(\n front - p.leadLength / 2 + 0.125,\n sign * p.pitch,\n p.leadLength + 0.25,\n p.leadWidth,\n ),\n )}\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n <Union>\n {block(\n (front - p.leadLength + tabFront + 0.15) / 2,\n 0,\n tabFront + 0.15 - front + p.leadLength,\n p.centerLeadWidth,\n )}\n {block(rear - p.tabLength / 2, 0, p.tabLength, p.tabWidth)}\n </Union>\n </Colorize>\n </>\n )\n}\n","import { Colorize, Cuboid, Translate, Union } from \"jscad-fiber\"\n/** Flat three-terminal TO-277A outline, in mm. The broad cathode is at +X;\n * two anode contacts are at -X. Body dimensions exclude the metal frame.\n * No solder or footprint dimensions are consumed. Rounded mold edges and\n * terminal corner radii are simplified; the stepped cathode outline is retained.\n */\nexport interface TO277Props {\n bodyWidth: number\n bodyLength: number\n bodyHeight: number\n terminalThickness: number\n terminalSpan: number\n leadWidth: number\n leadLength: number\n pitch: number\n tabLength: number\n tabWidth: number\n tabNeckWidth: number\n tabNeckLength: number\n tabBarWidth: number\n tabBarLength: number\n}\nexport function TO277(p: TO277Props) {\n for (const k of [\n \"bodyWidth\",\n \"bodyLength\",\n \"bodyHeight\",\n \"terminalThickness\",\n \"terminalSpan\",\n \"leadWidth\",\n \"leadLength\",\n \"pitch\",\n \"tabLength\",\n \"tabWidth\",\n \"tabNeckWidth\",\n \"tabNeckLength\",\n \"tabBarWidth\",\n \"tabBarLength\",\n ] as const)\n if (!Number.isFinite(p[k]) || p[k] <= 0)\n throw new Error(`${k} must be finite and positive`)\n const rear = p.terminalSpan / 2,\n front = -rear,\n tabFront = rear - p.tabLength\n if (\n p.terminalThickness >= p.bodyHeight ||\n p.terminalSpan < p.bodyWidth ||\n p.pitch + p.leadWidth >= p.bodyLength ||\n p.leadWidth >= p.pitch ||\n front + p.leadLength >= tabFront ||\n front + p.leadLength <= -p.bodyWidth / 2 ||\n tabFront >= p.bodyWidth / 2 ||\n p.tabNeckWidth > p.tabWidth ||\n p.tabWidth > p.bodyLength ||\n p.tabBarWidth < p.tabWidth ||\n p.tabNeckLength + p.tabBarLength >= p.tabLength\n )\n throw new Error(\"Invalid TO-277 terminal geometry or clearance\")\n const block = (x: number, y: number, length: number, width: number) => (\n <Translate offset={[x, y, p.terminalThickness / 2]}>\n <Cuboid size={[length, width, p.terminalThickness]} />\n </Translate>\n )\n return (\n <>\n <Colorize color=\"#353535\">\n <Translate z={(p.bodyHeight + p.terminalThickness / 2) / 2}>\n <Cuboid\n size={[\n p.bodyWidth,\n p.bodyLength,\n p.bodyHeight - p.terminalThickness / 2,\n ]}\n />\n </Translate>\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n {[-1, 1].map((sign) =>\n block(\n front + p.leadLength / 2,\n (sign * p.pitch) / 2,\n p.leadLength,\n p.leadWidth,\n ),\n )}\n </Colorize>\n <Colorize color=\"#bfc1c4\">\n <Union>\n {block(\n tabFront + (p.tabLength - p.tabNeckLength) / 2,\n 0,\n p.tabLength - p.tabNeckLength,\n p.tabWidth,\n )}\n {block(\n rear - p.tabNeckLength / 2 - 0.01,\n 0,\n p.tabNeckLength + 0.02,\n p.tabNeckWidth,\n )}\n {block(\n tabFront + p.tabBarLength / 2,\n 0,\n p.tabBarLength,\n p.tabBarWidth,\n )}\n </Union>\n </Colorize>\n </>\n )\n}\n","import { fp } from \"@tscircuit/footprinter\"\nimport { Colorize, Cuboid, Hull, Rotate, Translate, Union } from \"jscad-fiber\"\n\n// KYOCERA AVX TAJ standard cases, nominal L/W/H/W1/A (mm):\n// https://datasheets.kyocera-avx.com/TAJ.pdf\nexport const tantalumCases = {\n A: [3.2, 1.6, 1.6, 1.2, 0.8],\n B: [3.5, 2.8, 1.9, 2.2, 0.8],\n C: [6, 3.2, 2.6, 2.2, 1.3],\n D: [7.3, 4.3, 2.9, 2.4, 1.3],\n} as const\nexport type TantalumCase = keyof typeof tantalumCases\n\n/** Explicit case identity is required; copper dimensions do not determine height. */\nexport const TantalumCapacitor = ({\n caseSize = \"A\",\n footprint = \"smdpads2_p3.1mm_pw1.4mm_ph1.6mm\",\n}: { caseSize?: TantalumCase; footprint?: string }) => {\n const dims = tantalumCases[caseSize]\n if (!dims) throw new Error(\"Unsupported tantalum case\")\n const [length, width, height, leadWidth, leadLength] = dims\n const pads = fp\n .string(footprint)\n .circuitJson()\n .filter(\n (e) =>\n e.type === \"pcb_smtpad\" &&\n (e.shape === \"rect\" || e.shape === \"rotated_rect\"),\n )\n if (pads.length !== 2) throw new Error(\"TantalumCapacitor requires two pads\")\n const [a, b] = pads\n const angle = Math.atan2(b!.y - a!.y, b!.x - a!.x)\n return (\n <Translate offset={[(a!.x + b!.x) / 2, (a!.y + b!.y) / 2, 0]}>\n <Rotate rotation={[0, 0, angle]}>\n <Colorize color=\"#d5a64e\">\n <Hull>\n <Cuboid size={[length - 0.1, width, 0.02]} center={[0, 0, 0.21]} />\n <Cuboid\n size={[length - 0.25, width - 0.15, 0.02]}\n center={[0, 0, height - 0.01]}\n />\n </Hull>\n </Colorize>\n <Colorize color=\"#c5c8cb\">\n {[-1, 1].map((side) => (\n <Union key={side}>\n <Cuboid\n size={[leadLength, leadWidth, 0.25]}\n center={[(side * (length - leadLength)) / 2, 0, 0.125]}\n />\n <Cuboid\n size={[0.15, leadWidth, height * 0.45]}\n center={[(side * (length - 0.15)) / 2, 0, height * 0.225]}\n />\n </Union>\n ))}\n </Colorize>\n {/* Positive terminal stripe at pad 1, printed directly on the top face. */}\n <Cuboid\n size={[0.25, width - 0.25, 0.01]}\n center={[-length / 2 + 0.5, 0, height]}\n color=\"#423426\"\n />\n </Rotate>\n </Translate>\n )\n}\n","import { fp } from \"@tscircuit/footprinter\"\nimport { Colorize, Cuboid, RoundedCuboid, Rotate, Translate } from \"jscad-fiber\"\n\n// Manufacturer outlines, L/W/H in mm:\n// https://www.epson.com.cn/ed/search/prod-search.html\n// https://www.ndk.com/en/products/lineup/crystal-unit/NX3225GD.html\nexport const twoPadCrystalPackages = {\n FC135: [3.2, 1.5, 0.9, 0.7],\n FC12M: [2.05, 1.2, 0.6, 0.5],\n FC1610AN: [1.65, 1.05, 0.5, 0.4],\n NX3225GD: [3.2, 2.5, 0.8, 1.2],\n} as const\nexport type TwoPadCrystalPackage = keyof typeof twoPadCrystalPackages\n/** Two-terminal ceramic crystal enclosure. Package identity is explicitly supplied. */\nexport const TwoPadCrystal = ({\n packageName = \"FC135\",\n footprint = \"smdpads2_p2.5mm_pw1mm_ph1.8mm\",\n}: { packageName?: TwoPadCrystalPackage; footprint?: string }) => {\n const dims = twoPadCrystalPackages[packageName]\n if (!dims) throw new Error(\"Unsupported two-pad crystal package\")\n const [length, width, height, terminalLength] = dims\n const pads = fp\n .string(footprint)\n .circuitJson()\n .filter(\n (e) =>\n e.type === \"pcb_smtpad\" &&\n (e.shape === \"rect\" || e.shape === \"rotated_rect\"),\n )\n if (pads.length !== 2) throw new Error(\"TwoPadCrystal requires two pads\")\n const [a, b] = pads\n const angle = Math.atan2(b!.y - a!.y, b!.x - a!.x)\n return (\n <Translate offset={[(a!.x + b!.x) / 2, (a!.y + b!.y) / 2, 0]}>\n <Rotate rotation={[0, 0, angle]}>\n <Colorize color=\"#e0dcca\">\n <Cuboid size={[length, width, 0.2]} center={[0, 0, 0.13]} />\n </Colorize>\n <Colorize color=\"#acb1b8\">\n <RoundedCuboid\n size={[length - 0.04, width - 0.04, height - 0.18]}\n roundRadius={0.035}\n center={[0, 0, (height + 0.18) / 2]}\n />\n </Colorize>\n <Colorize color=\"#c6af65\">\n {[-1, 1].map((side) => (\n <Cuboid\n key={side}\n size={[terminalLength, width - 0.12, 0.06]}\n center={[(side * (length - terminalLength)) / 2, 0, 0.03]}\n />\n ))}\n </Colorize>\n </Rotate>\n </Translate>\n )\n}\n","import { fp } from \"@tscircuit/footprinter\"\nimport { Colorize, Cuboid, Rotate, Translate } from \"jscad-fiber\"\n\n/** Walsin RFANT5220110A0T outer geometry, L/W/T/A = 5.2/2/1.15/0.4 mm.\n * Source: ASC_RFANT5220110A0T_V15, page 2. Pad 1 is the feed end.\n * https://www.allelcoelec.nl/datasheets.1c/RFANT5220110A0T.pdf\n */\nexport const CeramicChipAntenna = ({\n footprint = \"smdpads2_p5.4mm_pw1mm_ph2mm\",\n}: { footprint?: string }) => {\n const pads = fp\n .string(footprint)\n .circuitJson()\n .filter(\n (e) =>\n e.type === \"pcb_smtpad\" &&\n (e.shape === \"rect\" || e.shape === \"rotated_rect\"),\n )\n if (pads.length !== 2) throw new Error(\"CeramicChipAntenna requires two pads\")\n const [a, b] = pads\n const angle = Math.atan2(b!.y - a!.y, b!.x - a!.x)\n return (\n <Translate offset={[(a!.x + b!.x) / 2, (a!.y + b!.y) / 2, 0]}>\n <Rotate rotation={[0, 0, angle]}>\n <Cuboid\n size={[4.44, 1.99, 1.14]}\n center={[0, 0, 0.575]}\n color=\"#4053a3\"\n />\n <Colorize color=\"#c2c4c7\">\n {[-1, 1].map((side) => (\n <Cuboid\n key={side}\n size={[0.4, 2, 1.15]}\n center={[side * 2.4, 0, 0.575]}\n color=\"#c2c4c7\"\n />\n ))}\n </Colorize>\n {/* Identification patch on the top by the feed end; it is not a third pad. */}\n <Cuboid\n size={[0.9, 2, 0.01]}\n center={[-1.75, 0, 1.145]}\n color=\"#b1b3b6\"\n />\n </Rotate>\n </Translate>\n )\n}\n","import { fp } from \"@tscircuit/footprinter\"\nimport { Colorize, Cylinder, Rotate, Translate } from \"jscad-fiber\"\n\n// Vishay MMU/MMA/MMB nominal L, D, K in mm: https://www.vishay.com/doc?28713=\nexport const melfResistorSizes = {\n \"0102\": [2.2, 1.1, 0.4],\n \"0204\": [3.6, 1.4, 0.75],\n \"0207\": [5.8, 2.2, 1.15],\n} as const\nexport type MelfResistorSize = keyof typeof melfResistorSizes\n\n/** Cylindrical resistor with end caps; no diode polarity band or inferred value. */\nexport const MelfResistor = ({\n size = \"0204\",\n footprint = \"smdpads2_p2.8mm_pw1.2mm_ph1.6mm\",\n}: { size?: MelfResistorSize; footprint?: string }) => {\n const dims = melfResistorSizes[size]\n if (!dims) throw new Error(\"Unsupported MELF resistor size\")\n const [length, diameter, capLength] = dims\n const pads = fp\n .string(footprint)\n .circuitJson()\n .filter(\n (e) =>\n e.type === \"pcb_smtpad\" &&\n (e.shape === \"rect\" || e.shape === \"rotated_rect\"),\n )\n if (pads.length !== 2) throw new Error(\"MelfResistor requires two pads\")\n const [a, b] = pads\n const angle = Math.atan2(b!.y - a!.y, b!.x - a!.x)\n return (\n <Translate offset={[(a!.x + b!.x) / 2, (a!.y + b!.y) / 2, diameter / 2]}>\n <Rotate rotation={[0, 0, angle]}>\n <Rotate rotation={[0, Math.PI / 2, 0]}>\n <Colorize color=\"#426d63\">\n <Cylinder\n radius={(diameter - 0.08) / 2}\n height={length - 2 * capLength + 0.04}\n />\n </Colorize>\n <Colorize color=\"#c6c8cb\">\n {[-1, 1].map((side) => (\n <Cylinder\n key={side}\n radius={diameter / 2}\n height={capLength}\n center={[0, 0, (side * (length - capLength)) / 2]}\n />\n ))}\n </Colorize>\n </Rotate>\n </Rotate>\n </Translate>\n )\n}\n"],"mappings":"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","names":["Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","bodyLength","width","height","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Cuboid","Translate","Fragment","jsx","jsxs","Colorize","Cuboid","Translate","Fragment","jsx","jsxs","Colorize","Cuboid","Cylinder","Rotate","Subtract","Translate","Union","jsx","jsxs","width","height","heightAboveSurface","Colorize","Cylinder","Hull","Fragment","jsx","jsxs","width","height","Cylinder","bodyLength","Colorize","Hull","mp","fp","Colorize","Cuboid","Cylinder","ExtrudeLinear","Polygon","Rotate","Translate","jsx","Colorize","Cuboid","Translate","Cylinder","Subtract","Hull","jsx","jsxs","width","height","model","Colorize","face","a","b","c","e","Fragment","jsx","Colorize","jsx","Colorize","Custom","earcut","resolution","revolve","earcut","Fragment","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","cap","distance","jsx","resolution","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jscad","jscad","distance","jscad","index","jscad","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","earcut","cap","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","v","cap","hexRadius","jsx","Colorize","Custom","jsx","model","register","Colorize","Cuboid","Hull","Rotate","Translate","Fragment","Colorize","Cuboid","Subtract","Translate","jsx","jsxs","width","height","Fragment","jsx","jsxs","ratioWidth","ratioHeight","width","height","Colorize","Translate","Rotate","Hull","Cuboid","distance","jsx","model","register","Colorize","Custom","earcut","circle","bottom","top","cap","height","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","v","cap","hexRadius","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","resolution","surface","cap","hexRadius","distance","threadDistance","height","jsx","resolution","Colorize","Custom","jsx","model","register","Colorize","Custom","cap","distance","hexRadius","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","jscad","jscad","jscad","width","holes","Colorize","Custom","Fragment","jsx","jsxs","jscad","jsx","model","register","Colorize","Custom","point","v","cap","angle","z","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","earcut","angle","width","outline","face","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","resolution","surface","cap","threadDistance","resolution","surface","jsx","resolution","Colorize","Custom","jsx","model","register","Colorize","Custom","distance","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","width","height","face","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","width","jsx","Colorize","Custom","jsx","model","register","Colorize","Custom","earcut","width","distance","cap","jsx","Colorize","Custom","jsx","model","register","register","Fragment","jsx","jsxs","mp","fp","Colorize","Cuboid","Cylinder","Hull","Subtract","Translate","Union","Fragment","jsx","jsxs","bodyLength","jsx","bodyLength","fp","mp","Rotate","Translate","Polygon","ExtrudeLinear","Rotate","Translate","width","Fragment","jsx","jsxs","height","Translate","Rotate","ExtrudeLinear","Polygon","Polygon","ExtrudeLinear","Translate","Rotate","Colorize","jsx","height","width","Colorize","Translate","Rotate","ExtrudeLinear","Polygon","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","jsxs","Colorize","Cuboid","RoundedCuboid","Translate","Fragment","jsx","jsxs","Fragment","jsx","jsxs","bodyLength","fullLength","width","Colorize","Cuboid","Hull","Rotate","Translate","Fragment","jsx","jsxs","bodyLength","Translate","Cuboid","Colorize","Hull","Rotate","Fragment","jsx","Colorize","Cuboid","Cylinder","Subtract","Translate","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","jsxs","fullLength","bodyLength","Fragment","jsx","jsxs","fullLength","bodyLength","Colorize","Cuboid","Hull","Subtract","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","Colorize","Cylinder","ExtrudeLinear","Polygon","Rotate","RoundedCuboid","Translate","Fragment","jsx","jsxs","width","bodyLength","RoundedCuboid","Cylinder","Colorize","Translate","Rotate","ExtrudeLinear","Polygon","Fragment","jsx","jsxs","fullLength","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Translate","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Union","Hull","Translate","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Union","Hull","Translate","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Union","Hull","Translate","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","bodyLength","Cuboid","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","jsxs","bodyLength","fullLength","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","Hull","Subtract","Translate","Union","Fragment","jsx","jsxs","bodyLength","width","Fragment","jsx","jsxs","bodyLength","fullLength","Cuboid","Translate","Colorize","Hull","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Hull","Subtract","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Subtract","Hull","Colorize","Cylinder","Hull","Fragment","jsx","jsxs","bodyLength","Colorize","Cylinder","RoundedCylinder","Rotate","RoundedCuboid","Fragment","jsx","jsxs","bodyLength","Colorize","Cylinder","RoundedCylinder","Rotate","Fragment","jsx","jsxs","bodyLength","Colorize","RoundedCylinder","Rotate","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","jsxs","bodyLength","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","Rotate","Subtract","Translate","Fragment","jsx","jsxs","Fragment","jsx","jsxs","bodyLength","Cuboid","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Cuboid","Hull","Translate","Cylinder","Subtract","Fragment","jsx","jsxs","Fragment","jsx","jsxs","bodyLength","Cuboid","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Cuboid","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Union","Translate","Hull","Colorize","Cuboid","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Colorize","Cylinder","Rotate","Sphere","Translate","Fragment","jsx","jsxs","Colorize","Cuboid","Cylinder","Subtract","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","Subtract","Fragment","jsx","jsxs","width","height","Colorize","Subtract","Cuboid","Cylinder","Colorize","Cuboid","Hull","Translate","Union","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","Rotate","Subtract","Translate","Fragment","jsx","jsxs","Translate","Rotate","Colorize","Subtract","Cuboid","Cylinder","Colorize","Cuboid","Cylinder","Rotate","Subtract","Translate","Fragment","jsx","jsxs","Translate","Rotate","Colorize","Subtract","Cuboid","Cylinder","Colorize","Cuboid","Subtract","Translate","fp","Fragment","jsx","jsxs","Translate","Colorize","Subtract","Cuboid","fp","fp","Colorize","Cuboid","Rotate","Subtract","Union","jsx","jsxs","width","height","Colorize","Cuboid","Cylinder","Rotate","RoundedCuboid","Subtract","Translate","Fragment","jsx","jsxs","Colorize","Cuboid","Hull","Translate","Fragment","jsx","jsxs","mm","fp","fp","Fragment","jsx","jsxs","bodyLength","Cuboid","Fragment","jsx","jsxs","fullLength","width","height","terminatorWidth","bodyLength","Colorize","Cuboid","Cylinder","Rotate","Subtract","Translate","Fragment","jsx","jsxs","Cuboid","Colorize","Subtract","Cylinder","Translate","Rotate","Colorize","Cuboid","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","Rotate","RoundedCuboid","Subtract","Translate","Fragment","jsx","jsxs","range","Colorize","Cuboid","Hull","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","RoundedCylinder","Subtract","Fragment","jsx","jsxs","height","Colorize","Cuboid","Cylinder","Subtract","Fragment","jsx","jsxs","bodyLength","Colorize","Cuboid","Cylinder","Fragment","jsx","jsxs","bodyLength","fp","Colorize","Cuboid","Cylinder","Rotate","Subtract","jsx","jsxs","width","height","Cuboid","Translate","Rotate","Colorize","Fragment","jsx","jsxs","fullLength","bodyLength","fp","Colorize","Cuboid","Cylinder","Hull","Rotate","Subtract","Translate","jsx","jsxs","width","height","fp","Rotate","jsx","jsxs","fp","Rotate","Fragment","jsx","mp","model","fp","mm","bodyLength","Rotate","Translate","width","height","Colorize","Cuboid","Hull","Subtract","Fragment","jsx","jsxs","Colorize","Cuboid","Translate","Hull","Union","Fragment","jsx","jsxs","width","Colorize","Cuboid","Translate","Union","Fragment","jsx","jsxs","width","fp","Colorize","Cuboid","Hull","Rotate","Translate","Union","jsx","jsxs","width","height","fp","Colorize","Cuboid","RoundedCuboid","Rotate","Translate","jsx","jsxs","width","height","fp","Colorize","Cuboid","Rotate","Translate","jsx","jsxs","fp","Colorize","Cylinder","Rotate","Translate","jsx","jsxs"]}