jscad-electronics 0.0.154 → 0.0.155

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/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/ChipBody.tsx","../lib/Crystal.tsx","../lib/ExtrudedPads.tsx","../lib/FootprintPad.tsx","../lib/FootprintPlatedHole.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/qfp.tsx","../lib/PinHeader.tsx","../lib/PinRow.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/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/Screen.tsx","../lib/SOD723.tsx","../lib/JSTZH1_5mm.tsx","../lib/JSTPH2_0mm.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/SOT-563.tsx","../lib/FlexScreen.tsx"],"sourcesContent":["import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorLength, width, height]}\n offset={[fullLength / 2 - terminatorLength / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorLength, width, height]}\n offset={[-fullLength / 2 + terminatorLength / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\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 {\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}>\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 { 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 key={index} color=\"#d6a258\">\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\">\n <Hull>{sealProfile}</Hull>\n </Colorize>\n <Colorize color=\"#b9bec2\">\n <Hull>{lidProfiles}</Hull>\n </Colorize>\n </>\n )\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { fp } from \"@tscircuit/footprinter\"\nimport { FootprintPad } from \"./FootprintPad\"\nimport { FootprintPlatedHole } from \"./FootprintPlatedHole\"\n\nexport const ExtrudedPads = ({\n circuitJson,\n footprint,\n}: { circuitJson?: AnyCircuitElement[]; footprint?: string }) => {\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 type { PcbSmtPad } from \"circuit-json\"\nimport {\n Colorize,\n Cuboid,\n ExtrudeLinear,\n Polygon,\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\") {\n return (\n <Colorize color={color}>\n <Translate offset={[pad.x, pad.y, -0.005]}>\n <Cuboid size={[pad.width, pad.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}>\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 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}>\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}>\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}>\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 { fp } from \"@tscircuit/footprinter\"\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 { 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 { 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 { SOT563 } from \"./SOT-563\"\nimport { BGA } from \"./BGA\"\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 // Normalize jstzh1_5mm formats to zh format\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 }\n\n const fpJson = fp.string(normalizedFootprint).json() as unknown as {\n w: number\n p: 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 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 faceup?: 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 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 // 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 faceup={fpJson.faceup}\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 \"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 \"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 (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 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 { 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 offset={{ x: x + 0.25 / 2, y, z: z }}>\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 {\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=\"#fff\">\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 { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\n// TODO use mm to convert width to mm (and accept strings)\nexport const Tssop = ({\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","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\n// MSOP (mini small outline package) — modeled after Tssop implementation\nexport const MSOP = ({\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","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 { 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 faceup,\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 faceup?: boolean\n smd?: boolean\n rightangle?: boolean\n}) => {\n return (\n <>\n <Translate y={rightangle ? -3 : 0}>\n <Cuboid\n color=\"#222\"\n size={[bodyLength, bodyWidth, bodyHeight]}\n center={[x, y, flipZ(bodyHeight / 2)]}\n />\n </Translate>\n {!faceup && (\n <Colorize color={PIN_METAL_COLOR}>\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\n <Colorize color={PIN_METAL_COLOR}>\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 faceup,\n rows = 1,\n smd,\n rightangle,\n}: {\n numberOfPins: number\n pitch?: number\n longSidePinLength?: number\n invert?: boolean\n faceup?: 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 const zOffset = !smd && !rightangle ? -bodyHeight - 1.6 : 0\n // Flip Z coordinates if invert is true\n const flipZ = (z: number) =>\n (invert || faceup ? -z + bodyHeight : z) + zOffset\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 faceup={faceup}\n smd={smd}\n rightangle={rightangle}\n />\n )\n })}\n </>\n )\n}\n","import { Cuboid, Colorize } from \"jscad-fiber\"\nimport { getQuadCoords } from \"./utils/getQuadCoords\"\nimport { getQuadPinMap } from \"./utils/getQuadPinMap\"\nexport const QFN = ({\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 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\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 { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\n// SOIC typical body and lead dimensions\nexport const SOIC = ({\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","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 { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const LQFP = ({\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\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 { Cuboid } 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}: {\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 // 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\n : bodyWidth / 2 - padSizeX / 2\n\n const pinNumber = i + 1\n pinPositions.push({ pinNumber, x, y, padSizeX, padSizeY })\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, Cuboid, RoundedCylinder, Rotate } from \"jscad-fiber\"\n\nexport interface MINIMELFProps {\n bodyLength?: number\n bodyDiameter?: number\n color?: string\n contactColor?: string\n}\n\nexport const MINIMELF = ({\n bodyLength = 3.5,\n bodyDiameter = 1.5,\n color = \"#3a3a3aff\",\n contactColor = \"#c6c6c6\",\n}: MINIMELFProps) => {\n const padLength = 0.5\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 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, 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 { 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 {\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 color={bodyColor}>\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 key={i} color={pinColor}>\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 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 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 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 color={bodyColor}>\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 key={i} color={pinColor}>\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 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 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 {\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 { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\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 { 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 color={tabColor}>\n <Cuboid\n size={[tabWidth, tabLength, tabThickness]}\n center={[tabCenterX, 0, tabThickness / 2]}\n />\n </Colorize>\n\n <Colorize 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 color={leadColor} key={`lead-${side}`}>\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 {\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}>\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}>\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 color=\"#c0c0c0\" key={`lead-${side}`}>\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 { 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 { Colorize, Cuboid, Rotate, RoundedCuboid, Translate } 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 flexCableWidth?: number\n flexCableThickness?: number\n flexCableColor?: string\n conductorCount?: number\n conductorPitch?: number\n conductorWidth?: number\n conductorThickness?: number\n conductorColor?: string\n cableEdgeMargin?: number\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}: {\n points: readonly Point3[]\n width: number\n thickness: number\n color: string\n acrossOffset?: number\n normalOffset?: number\n overlap?: number\n}) => (\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\n return (\n <Translate key={`${index}:${midpoint.join(\":\")}`} offset={midpoint}>\n <Rotate rotation={[pitch, 0, yaw]}>\n <RoundedCuboid\n size={[width, segmentLength + overlap, thickness]}\n center={[acrossOffset, 0, normalOffset]}\n roundRadius={roundRadius}\n />\n </Rotate>\n </Translate>\n )\n })}\n </Colorize>\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 conductorCount = 8,\n conductorPitch,\n conductorWidth,\n conductorThickness = 0.035,\n conductorColor = \"#8c4a18\",\n cableEdgeMargin = 0.6,\n exposedContactLength = 2.4,\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.isInteger(conductorCount) || conductorCount < 1) {\n throw new Error(\"conductorCount 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 conductorCount > 1 &&\n (!Number.isFinite(resolvedConductorPitch) || resolvedConductorPitch <= 0)\n ) {\n throw new Error(\"conductorPitch 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(\"conductorWidth\", resolvedConductorWidth)\n const conductorSpan =\n (conductorCount - 1) * resolvedConductorPitch + resolvedConductorWidth\n if (conductorSpan > usableCableWidth + EPSILON) {\n throw new Error(\n \"conductorPitch and conductorWidth do not fit inside the flex cable margins\",\n )\n }\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 const contactLength = Math.min(\n Math.max(0, exposedContactLength),\n totalCableLength / 2,\n )\n const resolvedStiffenerLength = Math.min(\n Math.max(0, stiffenerLength),\n totalCableLength / 2,\n )\n const startContacts = slicePath(path, 0, contactLength)\n const endContacts = slicePath(\n path,\n totalCableLength - contactLength,\n totalCableLength,\n )\n const startStiffener = slicePath(path, 0, resolvedStiffenerLength)\n const endStiffener = slicePath(\n path,\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({ length: conductorCount }, (_, index) =>\n conductorCount === 1\n ? 0\n : (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={path}\n width={resolvedCableWidth}\n thickness={flexCableThickness}\n color={flexCableColor}\n />\n )}\n\n {showFlexCable && showStiffeners && resolvedStiffenerLength > EPSILON && (\n <>\n <CableStrip\n points={startStiffener}\n width={resolvedCableWidth}\n thickness={stiffenerThickness}\n color={stiffenerColor}\n normalOffset={stiffenerNormalOffset}\n />\n <CableStrip\n points={endStiffener}\n width={resolvedCableWidth}\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={resolvedConductorWidth}\n thickness={conductorThickness}\n color={conductorColor}\n acrossOffset={acrossOffset}\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"],"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","Rotate","Translate","Union","jsx","jsxs","width","height","heightAboveSurface","Colorize","Cylinder","Hull","Fragment","jsx","jsxs","width","height","Cylinder","bodyLength","Colorize","Hull","fp","Colorize","Cuboid","ExtrudeLinear","Polygon","Translate","jsx","Colorize","Cuboid","Translate","Cylinder","Subtract","Hull","jsx","jsxs","width","height","Fragment","jsx","jsxs","fp","fp","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","Fragment","jsx","jsxs","bodyLength","fullLength","width","Colorize","Cuboid","Hull","Rotate","Translate","Fragment","jsx","jsxs","bodyLength","Translate","Cuboid","Colorize","Hull","Rotate","Fragment","jsx","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","Translate","Fragment","jsx","jsxs","width","bodyLength","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","Fragment","jsx","jsxs","bodyLength","fullLength","Cuboid","Translate","Colorize","Hull","Union","Fragment","jsx","jsxs","bodyLength","Cuboid","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Cylinder","Hull","Fragment","jsx","jsxs","bodyLength","Colorize","Cylinder","RoundedCylinder","Rotate","RoundedCuboid","Fragment","jsx","jsxs","bodyLength","Colorize","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","Colorize","Cuboid","Subtract","Translate","jsx","jsxs","width","height","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","Cylinder","Rotate","RoundedCuboid","Subtract","Translate","Fragment","jsx","jsxs","Colorize","Cuboid","Hull","Translate","Fragment","jsx","jsxs","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","Cuboid","Translate","Rotate","Colorize","Fragment","jsx","jsxs","fullLength","bodyLength","Fragment","jsx","fp","bodyLength","Rotate","Translate","width","height","Colorize","Rotate","RoundedCuboid","Translate","Fragment","Fragment","jsx","jsxs","ratioWidth","ratioHeight","width","height","Colorize","Translate","Rotate","RoundedCuboid"]}
1
+ {"version":3,"sources":["../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/ChipBody.tsx","../lib/Crystal.tsx","../lib/ExtrudedPads.tsx","../lib/FootprintPad.tsx","../lib/FootprintPlatedHole.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/qfp.tsx","../lib/PinHeader.tsx","../lib/PinRow.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/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/Screen.tsx","../lib/SOD723.tsx","../lib/JSTZH1_5mm.tsx","../lib/JSTPH2_0mm.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/SOT-563.tsx","../lib/FlexScreen.tsx"],"sourcesContent":["import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorLength, width, height]}\n offset={[fullLength / 2 - terminatorLength / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorLength, width, height]}\n offset={[-fullLength / 2 + terminatorLength / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n </>\n )\n}\n","import { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, width, height]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\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 {\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}>\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 { 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 key={index} color=\"#d6a258\">\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\">\n <Hull>{sealProfile}</Hull>\n </Colorize>\n <Colorize color=\"#b9bec2\">\n <Hull>{lidProfiles}</Hull>\n </Colorize>\n </>\n )\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { fp } from \"@tscircuit/footprinter\"\nimport { FootprintPad } from \"./FootprintPad\"\nimport { FootprintPlatedHole } from \"./FootprintPlatedHole\"\n\nexport const ExtrudedPads = ({\n circuitJson,\n footprint,\n}: { circuitJson?: AnyCircuitElement[]; footprint?: string }) => {\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 type { PcbSmtPad } from \"circuit-json\"\nimport {\n Colorize,\n Cuboid,\n ExtrudeLinear,\n Polygon,\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\") {\n return (\n <Colorize color={color}>\n <Translate offset={[pad.x, pad.y, -0.005]}>\n <Cuboid size={[pad.width, pad.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}>\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 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}>\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}>\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}>\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 { fp } from \"@tscircuit/footprinter\"\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 { 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 { 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 { SOT563 } from \"./SOT-563\"\nimport { BGA } from \"./BGA\"\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 // Normalize jstzh1_5mm formats to zh format\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 }\n\n const fpJson = fp.string(normalizedFootprint).json() as unknown as {\n w: number\n p: 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 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 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 // 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 \"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 \"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 (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 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 { 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 offset={{ x: x + 0.25 / 2, y, z: z }}>\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 {\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=\"#fff\">\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 { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\n// TODO use mm to convert width to mm (and accept strings)\nexport const Tssop = ({\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","import { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\n// MSOP (mini small outline package) — modeled after Tssop implementation\nexport const MSOP = ({\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","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 { 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 size={[bodyLength, bodyWidth, bodyHeight]}\n center={[x, y, flipZ(bodyHeight / 2)]}\n />\n </Translate>\n <Colorize color={PIN_METAL_COLOR}>\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 color={PIN_METAL_COLOR}>\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 { Cuboid, Colorize } from \"jscad-fiber\"\nimport { getQuadCoords } from \"./utils/getQuadCoords\"\nimport { getQuadPinMap } from \"./utils/getQuadPinMap\"\nexport const QFN = ({\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 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\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 { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\n// SOIC typical body and lead dimensions\nexport const SOIC = ({\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","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 { ChipBody } from \"./ChipBody\"\nimport { SmdChipLead } from \"./SmdChipLead\"\n\nexport const LQFP = ({\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\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 { Cuboid } 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}: {\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 // 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\n : bodyWidth / 2 - padSizeX / 2\n\n const pinNumber = i + 1\n pinPositions.push({ pinNumber, x, y, padSizeX, padSizeY })\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, Cuboid, RoundedCylinder, Rotate } from \"jscad-fiber\"\n\nexport interface MINIMELFProps {\n bodyLength?: number\n bodyDiameter?: number\n color?: string\n contactColor?: string\n}\n\nexport const MINIMELF = ({\n bodyLength = 3.5,\n bodyDiameter = 1.5,\n color = \"#3a3a3aff\",\n contactColor = \"#c6c6c6\",\n}: MINIMELFProps) => {\n const padLength = 0.5\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 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, 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 { 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 {\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 color={bodyColor}>\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 key={i} color={pinColor}>\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 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 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 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 color={bodyColor}>\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 key={i} color={pinColor}>\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 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 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 {\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 { 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 color={color}\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[fullLength / 2 - terminatorWidth / 2, 0, height / 2]}\n color=\"#ccc\"\n />\n <Cuboid\n size={[terminatorWidth, height, width]}\n offset={[-fullLength / 2 + terminatorWidth / 2, 0, height / 2]}\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 { 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 color={tabColor}>\n <Cuboid\n size={[tabWidth, tabLength, tabThickness]}\n center={[tabCenterX, 0, tabThickness / 2]}\n />\n </Colorize>\n\n <Colorize 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 color={leadColor} key={`lead-${side}`}>\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 {\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}>\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}>\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 color=\"#c0c0c0\" key={`lead-${side}`}>\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 { 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 { Colorize, Cuboid, Rotate, RoundedCuboid, Translate } 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 flexCableWidth?: number\n flexCableThickness?: number\n flexCableColor?: string\n conductorCount?: number\n conductorPitch?: number\n conductorWidth?: number\n conductorThickness?: number\n conductorColor?: string\n cableEdgeMargin?: number\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}: {\n points: readonly Point3[]\n width: number\n thickness: number\n color: string\n acrossOffset?: number\n normalOffset?: number\n overlap?: number\n}) => (\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\n return (\n <Translate key={`${index}:${midpoint.join(\":\")}`} offset={midpoint}>\n <Rotate rotation={[pitch, 0, yaw]}>\n <RoundedCuboid\n size={[width, segmentLength + overlap, thickness]}\n center={[acrossOffset, 0, normalOffset]}\n roundRadius={roundRadius}\n />\n </Rotate>\n </Translate>\n )\n })}\n </Colorize>\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 conductorCount = 8,\n conductorPitch,\n conductorWidth,\n conductorThickness = 0.035,\n conductorColor = \"#8c4a18\",\n cableEdgeMargin = 0.6,\n exposedContactLength = 2.4,\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.isInteger(conductorCount) || conductorCount < 1) {\n throw new Error(\"conductorCount 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 conductorCount > 1 &&\n (!Number.isFinite(resolvedConductorPitch) || resolvedConductorPitch <= 0)\n ) {\n throw new Error(\"conductorPitch 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(\"conductorWidth\", resolvedConductorWidth)\n const conductorSpan =\n (conductorCount - 1) * resolvedConductorPitch + resolvedConductorWidth\n if (conductorSpan > usableCableWidth + EPSILON) {\n throw new Error(\n \"conductorPitch and conductorWidth do not fit inside the flex cable margins\",\n )\n }\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 const contactLength = Math.min(\n Math.max(0, exposedContactLength),\n totalCableLength / 2,\n )\n const resolvedStiffenerLength = Math.min(\n Math.max(0, stiffenerLength),\n totalCableLength / 2,\n )\n const startContacts = slicePath(path, 0, contactLength)\n const endContacts = slicePath(\n path,\n totalCableLength - contactLength,\n totalCableLength,\n )\n const startStiffener = slicePath(path, 0, resolvedStiffenerLength)\n const endStiffener = slicePath(\n path,\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({ length: conductorCount }, (_, index) =>\n conductorCount === 1\n ? 0\n : (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={path}\n width={resolvedCableWidth}\n thickness={flexCableThickness}\n color={flexCableColor}\n />\n )}\n\n {showFlexCable && showStiffeners && resolvedStiffenerLength > EPSILON && (\n <>\n <CableStrip\n points={startStiffener}\n width={resolvedCableWidth}\n thickness={stiffenerThickness}\n color={stiffenerColor}\n normalOffset={stiffenerNormalOffset}\n />\n <CableStrip\n points={endStiffener}\n width={resolvedCableWidth}\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={resolvedConductorWidth}\n thickness={conductorThickness}\n color={conductorColor}\n acrossOffset={acrossOffset}\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"],"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","Rotate","Translate","Union","jsx","jsxs","width","height","heightAboveSurface","Colorize","Cylinder","Hull","Fragment","jsx","jsxs","width","height","Cylinder","bodyLength","Colorize","Hull","fp","Colorize","Cuboid","ExtrudeLinear","Polygon","Translate","jsx","Colorize","Cuboid","Translate","Cylinder","Subtract","Hull","jsx","jsxs","width","height","Fragment","jsx","jsxs","fp","fp","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","Fragment","jsx","jsxs","bodyLength","fullLength","width","Colorize","Cuboid","Hull","Rotate","Translate","Fragment","jsx","jsxs","bodyLength","Translate","Cuboid","Colorize","Hull","Rotate","Fragment","jsx","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","Translate","Fragment","jsx","jsxs","width","bodyLength","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","Fragment","jsx","jsxs","bodyLength","fullLength","Cuboid","Translate","Colorize","Hull","Union","Fragment","jsx","jsxs","bodyLength","Cuboid","Fragment","jsx","jsxs","bodyLength","Cuboid","Colorize","Cylinder","Hull","Fragment","jsx","jsxs","bodyLength","Colorize","Cylinder","RoundedCylinder","Rotate","RoundedCuboid","Fragment","jsx","jsxs","bodyLength","Colorize","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","Colorize","Cuboid","Subtract","Translate","jsx","jsxs","width","height","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","Cylinder","Rotate","RoundedCuboid","Subtract","Translate","Fragment","jsx","jsxs","Colorize","Cuboid","Hull","Translate","Fragment","jsx","jsxs","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","Cuboid","Translate","Rotate","Colorize","Fragment","jsx","jsxs","fullLength","bodyLength","Fragment","jsx","fp","bodyLength","Rotate","Translate","width","height","Colorize","Rotate","RoundedCuboid","Translate","Fragment","Fragment","jsx","jsxs","ratioWidth","ratioHeight","width","height","Colorize","Translate","Rotate","RoundedCuboid"]}