jscad-electronics 0.0.210 → 0.0.211

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/vanilla.js CHANGED
@@ -179,28 +179,28 @@ var FootprintPlatedHole = ({
179
179
  throw new Error("Shape not supported: " + hole.shape);
180
180
  };
181
181
 
182
- // lib/models/buttonscrew/register.tsx
183
- import { buttonScrewModelDefinitionSchema } from "@tscircuit/modelprinter";
182
+ // lib/models/ballbearing/register.tsx
183
+ import { ballBearingModelDefinitionSchema } from "@tscircuit/modelprinter";
184
184
 
185
185
  // lib/model-registry.ts
186
- function defineModelRenderer(model24) {
187
- return model24;
186
+ function defineModelRenderer(model25) {
187
+ return model25;
188
188
  }
189
189
  var ModelRendererRegistry = class {
190
190
  models = /* @__PURE__ */ new Map();
191
- register(model24) {
192
- if (typeof model24.name !== "string" || !/^[a-z]+$/.test(model24.name)) {
191
+ register(model25) {
192
+ if (typeof model25.name !== "string" || !/^[a-z]+$/.test(model25.name)) {
193
193
  throw new Error(
194
194
  "Model renderer names must contain only lowercase letters"
195
195
  );
196
196
  }
197
- if (this.models.has(model24.name)) {
198
- throw new Error(`Model renderer "${model24.name}" is already registered`);
197
+ if (this.models.has(model25.name)) {
198
+ throw new Error(`Model renderer "${model25.name}" is already registered`);
199
199
  }
200
- if (model24.pads !== "none" && model24.pads !== "footprinter") {
200
+ if (model25.pads !== "none" && model25.pads !== "footprinter") {
201
201
  throw new Error('Model renderer pads must be "none" or "footprinter"');
202
202
  }
203
- const { name, schema, render: render2, pads } = model24;
203
+ const { name, schema, render: render2, pads } = model25;
204
204
  this.models.set(name, {
205
205
  name,
206
206
  schema,
@@ -226,6 +226,287 @@ var ModelRendererRegistry = class {
226
226
  }
227
227
  };
228
228
 
229
+ // lib/mechanical/indexedMeshToGeom3.ts
230
+ import jscad from "@jscad/modeling";
231
+ function indexedMeshToGeom3(mesh) {
232
+ const polygons = [];
233
+ for (let i = 0; i < mesh.indices.length; i += 3)
234
+ polygons.push(
235
+ mesh.indices.slice(i, i + 3).map((index) => [
236
+ mesh.positions[index * 3],
237
+ mesh.positions[index * 3 + 1],
238
+ mesh.positions[index * 3 + 2]
239
+ ])
240
+ );
241
+ return jscad.geometries.geom3.fromPoints(polygons);
242
+ }
243
+
244
+ // lib/models/ballbearing/mesh.ts
245
+ import {
246
+ getBallBearingDimensions
247
+ } from "@tscircuit/modelprinter";
248
+ function createBallBearingMesh(input = {}, options = {}) {
249
+ const d = getBallBearingDimensions(input);
250
+ const segments = segmentsFor(options.segments);
251
+ checkPrecision([
252
+ d.outerDiameter,
253
+ d.boreRadius,
254
+ d.width,
255
+ d.outerRadius - d.boreRadius,
256
+ d.ballRadius
257
+ ]);
258
+ const c = d.rimChamfer, mid = d.midZ, half = d.grooveHalfWidth;
259
+ const innerProfile = [
260
+ [d.innerRaceOuterRadius - c, 0],
261
+ [d.innerRaceOuterRadius, c]
262
+ ];
263
+ for (let i = 0; i <= 24; i++) {
264
+ const z = mid - half + 2 * half * i / 24;
265
+ innerProfile.push([
266
+ d.pitchRadius - Math.sqrt(Math.max(0, d.grooveRadius ** 2 - (z - mid) ** 2)),
267
+ z
268
+ ]);
269
+ }
270
+ innerProfile.push(
271
+ [d.innerRaceOuterRadius, d.width - c],
272
+ [d.innerRaceOuterRadius - c, d.width],
273
+ [d.boreRadius + c, d.width],
274
+ [d.boreRadius, d.width - c],
275
+ [d.boreRadius, c],
276
+ [d.boreRadius + c, 0]
277
+ );
278
+ const outerProfile = [
279
+ [d.outerRadius - c, 0],
280
+ [d.outerRadius, c],
281
+ [d.outerRadius, d.width - c],
282
+ [d.outerRadius - c, d.width],
283
+ [d.outerRaceInnerRadius + c, d.width],
284
+ [d.outerRaceInnerRadius, d.width - c]
285
+ ];
286
+ for (let i = 0; i <= 24; i++) {
287
+ const z = mid + half - 2 * half * i / 24;
288
+ outerProfile.push([
289
+ d.pitchRadius + Math.sqrt(Math.max(0, d.grooveRadius ** 2 - (z - mid) ** 2)),
290
+ z
291
+ ]);
292
+ }
293
+ outerProfile.push(
294
+ [d.outerRaceInnerRadius, c],
295
+ [d.outerRaceInnerRadius + c, 0]
296
+ );
297
+ const parts = [
298
+ {
299
+ name: "inner race",
300
+ color: "#9da4ac",
301
+ mesh: revolve(innerProfile, segments)
302
+ },
303
+ {
304
+ name: "outer race",
305
+ color: "#9da4ac",
306
+ mesh: revolve(outerProfile, segments)
307
+ }
308
+ ];
309
+ for (let i = 0; i < d.ballCount; i++) {
310
+ const phase = i * Math.PI * 2 / d.ballCount;
311
+ const center = [
312
+ d.pitchRadius * Math.cos(phase),
313
+ d.pitchRadius * Math.sin(phase),
314
+ mid
315
+ ];
316
+ parts.push({
317
+ name: `ball ${i + 1}`,
318
+ color: "#d5d9df",
319
+ mesh: sphere(center, d.ballRadius),
320
+ center,
321
+ radius: d.ballRadius
322
+ });
323
+ const separator = (i + 0.5) * Math.PI * 2 / d.ballCount;
324
+ parts.push({
325
+ name: `cage separator ${i + 1}`,
326
+ color: "#b89b58",
327
+ mesh: annularSector(
328
+ d.cageInnerRadius,
329
+ d.cageOuterRadius,
330
+ mid - 1.1 * d.ballRadius,
331
+ mid + 1.1 * d.ballRadius,
332
+ separator - d.cageSeparatorHalfAngle,
333
+ separator + d.cageSeparatorHalfAngle,
334
+ segments
335
+ )
336
+ });
337
+ }
338
+ for (const sign of [-1, 1]) {
339
+ const z0 = mid + (sign === -1 ? -1.25 : 1.1) * d.ballRadius;
340
+ const z1 = mid + (sign === -1 ? -1.1 : 1.25) * d.ballRadius;
341
+ parts.push({
342
+ name: `cage ${sign < 0 ? "lower" : "upper"} band`,
343
+ color: "#b89b58",
344
+ mesh: revolve(
345
+ [
346
+ [d.cageOuterRadius, z0],
347
+ [d.cageOuterRadius, z1],
348
+ [d.cageInnerRadius, z1],
349
+ [d.cageInnerRadius, z0]
350
+ ],
351
+ segments
352
+ )
353
+ });
354
+ }
355
+ for (const sign of [-1, 1]) {
356
+ const face2 = sign < 0 ? d.bottomSideShielded ? "shielded" : d.bottomSideSealed ? "sealed" : "open" : d.topSideShielded ? "shielded" : d.topSideSealed ? "sealed" : "open";
357
+ if (face2 === "open") continue;
358
+ const t = d.closureThickness;
359
+ const ri = d.innerRaceOuterRadius, ro = d.outerRaceInnerRadius;
360
+ const shape = face2 === "shielded" ? [
361
+ [ro, 0],
362
+ [ro, t * 0.45],
363
+ [ri, t * 0.45],
364
+ [ri, 0]
365
+ ] : [
366
+ [ro, 0],
367
+ [ro, t],
368
+ [ri, t],
369
+ [ri, 0],
370
+ [ri + 0.15 * (ro - ri), 0.5 * t],
371
+ [ro - 0.15 * (ro - ri), 0.5 * t]
372
+ ];
373
+ const profile = sign === -1 ? shape : shape.map(([r, z]) => [r, d.width - z]).reverse();
374
+ parts.push({
375
+ name: `${face2} ${sign < 0 ? "lower" : "upper"}`,
376
+ color: face2 === "sealed" ? "#252a30" : "#b5bbc3",
377
+ mesh: revolve(profile, segments)
378
+ });
379
+ }
380
+ return { ...combine(parts), parts };
381
+ }
382
+ function segmentsFor(value = 96) {
383
+ if (!Number.isInteger(value) || value < 96 || value > 192 || value % 24 !== 0)
384
+ throw new Error("Segments must be a multiple of 24 from 96 to 192");
385
+ return value;
386
+ }
387
+ function checkPrecision(lengths) {
388
+ const largest = Math.max(...lengths);
389
+ if (!lengths.every(Number.isFinite) || largest > 1e6 || Math.min(...lengths) < Math.max(1e-5, largest * 1e-7))
390
+ throw new Error(
391
+ "Bearing dimensions exceed the renderer's numerical resolution"
392
+ );
393
+ }
394
+ function revolve(profile, segments) {
395
+ const positions = [];
396
+ const indices = [];
397
+ for (const [radius, z] of profile)
398
+ for (let i = 0; i < segments; i++) {
399
+ const angle = i * Math.PI * 2 / segments;
400
+ const r = typeof radius === "number" ? radius : radius(angle);
401
+ positions.push(r * Math.cos(angle), r * Math.sin(angle), z);
402
+ }
403
+ for (let j = 0; j < profile.length; j++)
404
+ for (let i = 0; i < segments; i++) {
405
+ const a = j * segments + i;
406
+ const b = j * segments + (i + 1) % segments;
407
+ const c = (j + 1) % profile.length * segments + (i + 1) % segments;
408
+ const e = (j + 1) % profile.length * segments + i;
409
+ indices.push(a, b, c, a, c, e);
410
+ }
411
+ return { positions, indices };
412
+ }
413
+ function annularSector(inner, outer, z0, z1, start, end, segments) {
414
+ const steps = Math.max(
415
+ 2,
416
+ Math.ceil((end - start) / (2 * Math.PI) * segments)
417
+ );
418
+ const count = steps + 1;
419
+ const profile = [
420
+ [outer, z0],
421
+ [outer, z1],
422
+ [inner, z1],
423
+ [inner, z0]
424
+ ];
425
+ const positions = [];
426
+ const indices = [];
427
+ for (const [r, z] of profile)
428
+ for (let i = 0; i <= steps; i++) {
429
+ const angle = start + (end - start) * i / steps;
430
+ positions.push(r * Math.cos(angle), r * Math.sin(angle), z);
431
+ }
432
+ for (let j = 0; j < 4; j++)
433
+ for (let i = 0; i < steps; i++) {
434
+ const a2 = j * count + i;
435
+ const b2 = a2 + 1;
436
+ const c2 = (j + 1) % 4 * count + i + 1;
437
+ const e2 = (j + 1) % 4 * count + i;
438
+ indices.push(a2, b2, c2, a2, c2, e2);
439
+ }
440
+ indices.push(0, count, 2 * count, 0, 2 * count, 3 * count);
441
+ const a = steps, b = count + steps, c = 2 * count + steps, e = 3 * count + steps;
442
+ indices.push(a, c, b, a, e, c);
443
+ return { positions, indices };
444
+ }
445
+ function sphere(center, radius) {
446
+ const longitude = 24;
447
+ const latitude = 12;
448
+ const positions = [center[0], center[1], center[2] + radius];
449
+ const indices = [];
450
+ for (let j = 1; j < latitude; j++) {
451
+ const polar = j * Math.PI / latitude;
452
+ for (let i = 0; i < longitude; i++) {
453
+ const azimuth = i * Math.PI * 2 / longitude;
454
+ positions.push(
455
+ center[0] + radius * Math.sin(polar) * Math.cos(azimuth),
456
+ center[1] + radius * Math.sin(polar) * Math.sin(azimuth),
457
+ center[2] + radius * Math.cos(polar)
458
+ );
459
+ }
460
+ }
461
+ const south = positions.length / 3;
462
+ positions.push(center[0], center[1], center[2] - radius);
463
+ for (let i = 0; i < longitude; i++) {
464
+ const next = (i + 1) % longitude;
465
+ indices.push(0, 1 + i, 1 + next);
466
+ for (let j = 0; j < latitude - 2; j++) {
467
+ const a = 1 + j * longitude + i, b = 1 + (j + 1) * longitude + i;
468
+ const c = 1 + (j + 1) * longitude + next, e = 1 + j * longitude + next;
469
+ indices.push(a, b, c, a, c, e);
470
+ }
471
+ const last = 1 + (latitude - 2) * longitude;
472
+ indices.push(south, last + next, last + i);
473
+ }
474
+ return { positions, indices };
475
+ }
476
+ function combine(parts) {
477
+ const positions = [];
478
+ const indices = [];
479
+ for (const { mesh } of parts) {
480
+ const offset = positions.length / 3;
481
+ positions.push(...mesh.positions);
482
+ indices.push(...mesh.indices.map((index) => index + offset));
483
+ }
484
+ return { positions, indices };
485
+ }
486
+
487
+ // lib/models/ballbearing/BallBearing.tsx
488
+ function createBallBearingGeom(input = {}) {
489
+ return indexedMeshToGeom3(createBallBearingMesh(input));
490
+ }
491
+ function BallBearing({ color, ...props }) {
492
+ const { parts } = createBallBearingMesh(props);
493
+ return /* @__PURE__ */ jsx(Fragment2, { children: parts.map((part) => /* @__PURE__ */ jsx(Colorize, { color: color ?? part.color, children: /* @__PURE__ */ jsx(Custom, { geometry: indexedMeshToGeom3(part.mesh) }) }, part.name)) });
494
+ }
495
+
496
+ // lib/models/ballbearing/register.tsx
497
+ var model = defineModelRenderer({
498
+ name: "ballbearing",
499
+ schema: ballBearingModelDefinitionSchema,
500
+ render: ({ fn, ...props }) => /* @__PURE__ */ jsx(BallBearing, { ...props }),
501
+ pads: "none"
502
+ });
503
+ function register(registry) {
504
+ registry.register(model);
505
+ }
506
+
507
+ // lib/models/buttonscrew/register.tsx
508
+ import { buttonScrewModelDefinitionSchema } from "@tscircuit/modelprinter";
509
+
229
510
  // lib/models/buttonscrew/mesh.ts
230
511
  import {
231
512
  buttonScrewModelPropsSchema,
@@ -338,21 +619,6 @@ function createButtonScrewMesh(input, options = {}) {
338
619
  return { positions: m.positions, indices: m.indices };
339
620
  }
340
621
 
341
- // lib/mechanical/indexedMeshToGeom3.ts
342
- import jscad from "@jscad/modeling";
343
- function indexedMeshToGeom3(mesh) {
344
- const polygons = [];
345
- for (let i = 0; i < mesh.indices.length; i += 3)
346
- polygons.push(
347
- mesh.indices.slice(i, i + 3).map((index) => [
348
- mesh.positions[index * 3],
349
- mesh.positions[index * 3 + 1],
350
- mesh.positions[index * 3 + 2]
351
- ])
352
- );
353
- return jscad.geometries.geom3.fromPoints(polygons);
354
- }
355
-
356
622
  // lib/models/buttonscrew/ButtonScrew.tsx
357
623
  function createButtonScrewGeom(input, resolution4) {
358
624
  return indexedMeshToGeom3(createButtonScrewMesh(input, resolution4));
@@ -362,14 +628,14 @@ function ButtonScrew({ color = "#737e8f", ...props }) {
362
628
  }
363
629
 
364
630
  // lib/models/buttonscrew/register.tsx
365
- var model = defineModelRenderer({
631
+ var model2 = defineModelRenderer({
366
632
  name: "buttonscrew",
367
633
  schema: buttonScrewModelDefinitionSchema,
368
634
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(ButtonScrew, { ...props }),
369
635
  pads: "none"
370
636
  });
371
- function register(registry) {
372
- registry.register(model);
637
+ function register2(registry) {
638
+ registry.register(model2);
373
639
  }
374
640
 
375
641
  // lib/models/cablegrommet/register.tsx
@@ -444,14 +710,14 @@ function CableGrommet({
444
710
  }
445
711
 
446
712
  // lib/models/cablegrommet/register.tsx
447
- var model2 = defineModelRenderer({
713
+ var model3 = defineModelRenderer({
448
714
  name: "cablegrommet",
449
715
  schema: cableGrommetModelDefinitionSchema,
450
716
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(CableGrommet, { ...props }),
451
717
  pads: "none"
452
718
  });
453
- function register2(registry) {
454
- registry.register(model2);
719
+ function register3(registry) {
720
+ registry.register(model3);
455
721
  }
456
722
 
457
723
  // lib/models/clampingshaftcollar/register.tsx
@@ -752,14 +1018,14 @@ function ClampingShaftCollar({
752
1018
  }
753
1019
 
754
1020
  // lib/models/clampingshaftcollar/register.tsx
755
- var model3 = defineModelRenderer({
1021
+ var model4 = defineModelRenderer({
756
1022
  name: "clampingshaftcollar",
757
1023
  schema: clampingShaftCollarModelDefinitionSchema,
758
1024
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(ClampingShaftCollar, { ...props }),
759
1025
  pads: "none"
760
1026
  });
761
- function register3(registry) {
762
- registry.register(model3);
1027
+ function register4(registry) {
1028
+ registry.register(model4);
763
1029
  }
764
1030
 
765
1031
  // lib/models/compressionspring/register.tsx
@@ -965,14 +1231,14 @@ function CompressionSpring({
965
1231
  }
966
1232
 
967
1233
  // lib/models/compressionspring/register.tsx
968
- var model4 = defineModelRenderer({
1234
+ var model5 = defineModelRenderer({
969
1235
  name: "compressionspring",
970
1236
  schema: compressionSpringModelDefinitionSchema,
971
1237
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(CompressionSpring, { ...props }),
972
1238
  pads: "none"
973
1239
  });
974
- function register4(registry) {
975
- registry.register(model4);
1240
+ function register5(registry) {
1241
+ registry.register(model5);
976
1242
  }
977
1243
 
978
1244
  // lib/models/flangedbushing/register.tsx
@@ -1028,14 +1294,14 @@ function FlangedBushing({
1028
1294
  }
1029
1295
 
1030
1296
  // lib/models/flangedbushing/register.tsx
1031
- var model5 = defineModelRenderer({
1297
+ var model6 = defineModelRenderer({
1032
1298
  name: "flangedbushing",
1033
1299
  schema: flangedBushingModelDefinitionSchema,
1034
1300
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(FlangedBushing, { ...props }),
1035
1301
  pads: "none"
1036
1302
  });
1037
- function register5(registry) {
1038
- registry.register(model5);
1303
+ function register6(registry) {
1304
+ registry.register(model6);
1039
1305
  }
1040
1306
 
1041
1307
  // lib/models/flatheadscrew/register.tsx
@@ -1168,14 +1434,14 @@ function FlatHeadScrew({
1168
1434
  }
1169
1435
 
1170
1436
  // lib/models/flatheadscrew/register.tsx
1171
- var model6 = defineModelRenderer({
1437
+ var model7 = defineModelRenderer({
1172
1438
  name: "flatheadscrew",
1173
1439
  schema: flatHeadScrewModelDefinitionSchema,
1174
1440
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(FlatHeadScrew, { ...props }),
1175
1441
  pads: "none"
1176
1442
  });
1177
- function register6(registry) {
1178
- registry.register(model6);
1443
+ function register7(registry) {
1444
+ registry.register(model7);
1179
1445
  }
1180
1446
 
1181
1447
  // lib/models/flexscreen/register.tsx
@@ -1853,14 +2119,14 @@ var FlexScreen = (props) => {
1853
2119
  };
1854
2120
 
1855
2121
  // lib/models/flexscreen/register.tsx
1856
- var model7 = defineModelRenderer({
2122
+ var model8 = defineModelRenderer({
1857
2123
  name: "flexscreen",
1858
2124
  schema: flexScreenModelDefinitionSchema,
1859
2125
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(FlexScreen, { ...props }),
1860
2126
  pads: "footprinter"
1861
2127
  });
1862
- function register7(registry) {
1863
- registry.register(model7);
2128
+ function register8(registry) {
2129
+ registry.register(model8);
1864
2130
  }
1865
2131
 
1866
2132
  // lib/models/helicalgear/register.tsx
@@ -2066,14 +2332,14 @@ function HelicalGear({ color = "#737e8f", ...props }) {
2066
2332
  }
2067
2333
 
2068
2334
  // lib/models/helicalgear/register.tsx
2069
- var model8 = defineModelRenderer({
2335
+ var model9 = defineModelRenderer({
2070
2336
  name: "helicalgear",
2071
2337
  schema: helicalGearModelDefinitionSchema,
2072
2338
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(HelicalGear, { ...props }),
2073
2339
  pads: "none"
2074
2340
  });
2075
- function register8(registry) {
2076
- registry.register(model8);
2341
+ function register9(registry) {
2342
+ registry.register(model9);
2077
2343
  }
2078
2344
 
2079
2345
  // lib/models/hexbolt/register.tsx
@@ -2214,14 +2480,14 @@ function HexBolt({ color = "#737e8f", ...props }) {
2214
2480
  }
2215
2481
 
2216
2482
  // lib/models/hexbolt/register.tsx
2217
- var model9 = defineModelRenderer({
2483
+ var model10 = defineModelRenderer({
2218
2484
  name: "hexbolt",
2219
2485
  schema: hexBoltModelDefinitionSchema,
2220
2486
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(HexBolt, { ...props }),
2221
2487
  pads: "none"
2222
2488
  });
2223
- function register9(registry) {
2224
- registry.register(model9);
2489
+ function register10(registry) {
2490
+ registry.register(model10);
2225
2491
  }
2226
2492
 
2227
2493
  // lib/models/hexnut/register.tsx
@@ -2344,14 +2610,14 @@ function HexNut({ color = "#737e8f", ...props }) {
2344
2610
  }
2345
2611
 
2346
2612
  // lib/models/hexnut/register.tsx
2347
- var model10 = defineModelRenderer({
2613
+ var model11 = defineModelRenderer({
2348
2614
  name: "hexnut",
2349
2615
  schema: hexNutModelDefinitionSchema,
2350
2616
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(HexNut, { ...props }),
2351
2617
  pads: "none"
2352
2618
  });
2353
- function register10(registry) {
2354
- registry.register(model10);
2619
+ function register11(registry) {
2620
+ registry.register(model11);
2355
2621
  }
2356
2622
 
2357
2623
  // lib/models/hexsocketbolt/register.tsx
@@ -2463,14 +2729,14 @@ function HexSocketBolt({
2463
2729
  }
2464
2730
 
2465
2731
  // lib/models/hexsocketbolt/register.tsx
2466
- var model11 = defineModelRenderer({
2732
+ var model12 = defineModelRenderer({
2467
2733
  name: "hexsocketbolt",
2468
2734
  schema: hexSocketBoltModelDefinitionSchema,
2469
2735
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(HexSocketBolt, { ...props }),
2470
2736
  pads: "none"
2471
2737
  });
2472
- function register11(registry) {
2473
- registry.register(model11);
2738
+ function register12(registry) {
2739
+ registry.register(model12);
2474
2740
  }
2475
2741
 
2476
2742
  // lib/models/nema/register.tsx
@@ -2739,14 +3005,14 @@ var NEMA17 = (props) => /* @__PURE__ */ jsx(NemaMotor, { ...props, nemaSize: 17
2739
3005
  var NEMA23 = (props) => /* @__PURE__ */ jsx(NemaMotor, { ...props, nemaSize: 23 });
2740
3006
 
2741
3007
  // lib/models/nema/register.tsx
2742
- var model12 = defineModelRenderer({
3008
+ var model13 = defineModelRenderer({
2743
3009
  name: "nema",
2744
3010
  schema: nemaMotorModelDefinitionSchema,
2745
3011
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(NemaMotor, { ...props }),
2746
3012
  pads: "none"
2747
3013
  });
2748
- function register12(registry) {
2749
- registry.register(model12);
3014
+ function register13(registry) {
3015
+ registry.register(model13);
2750
3016
  }
2751
3017
 
2752
3018
  // lib/models/panscrew/register.tsx
@@ -2958,14 +3224,14 @@ function PanScrew({ color = "#737e8f", ...props }) {
2958
3224
  }
2959
3225
 
2960
3226
  // lib/models/panscrew/register.tsx
2961
- var model13 = defineModelRenderer({
3227
+ var model14 = defineModelRenderer({
2962
3228
  name: "panscrew",
2963
3229
  schema: panScrewModelDefinitionSchema,
2964
3230
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(PanScrew, { ...props }),
2965
3231
  pads: "none"
2966
3232
  });
2967
- function register13(registry) {
2968
- registry.register(model13);
3233
+ function register14(registry) {
3234
+ registry.register(model14);
2969
3235
  }
2970
3236
 
2971
3237
  // lib/models/plainbushing/register.tsx
@@ -3028,14 +3294,14 @@ function PlainBushing({
3028
3294
  }
3029
3295
 
3030
3296
  // lib/models/plainbushing/register.tsx
3031
- var model14 = defineModelRenderer({
3297
+ var model15 = defineModelRenderer({
3032
3298
  name: "plainbushing",
3033
3299
  schema: plainBushingModelDefinitionSchema,
3034
3300
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(PlainBushing, { ...props }),
3035
3301
  pads: "none"
3036
3302
  });
3037
- function register14(registry) {
3038
- registry.register(model14);
3303
+ function register15(registry) {
3304
+ registry.register(model15);
3039
3305
  }
3040
3306
 
3041
3307
  // lib/models/rigidcoupler/register.tsx
@@ -3079,14 +3345,14 @@ function RigidCoupler({
3079
3345
  }
3080
3346
 
3081
3347
  // lib/models/rigidcoupler/register.tsx
3082
- var model15 = defineModelRenderer({
3348
+ var model16 = defineModelRenderer({
3083
3349
  name: "rigidcoupler",
3084
3350
  schema: rigidCouplerModelDefinitionSchema,
3085
3351
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(RigidCoupler, { ...props }),
3086
3352
  pads: "none"
3087
3353
  });
3088
- function register15(registry) {
3089
- registry.register(model15);
3354
+ function register16(registry) {
3355
+ registry.register(model16);
3090
3356
  }
3091
3357
 
3092
3358
  // lib/models/shaftcollar/register.tsx
@@ -3125,14 +3391,14 @@ function ShaftCollar({ color = "#737e8f", ...props }) {
3125
3391
  }
3126
3392
 
3127
3393
  // lib/models/shaftcollar/register.tsx
3128
- var model16 = defineModelRenderer({
3394
+ var model17 = defineModelRenderer({
3129
3395
  name: "shaftcollar",
3130
3396
  schema: shaftCollarModelDefinitionSchema,
3131
3397
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(ShaftCollar, { ...props }),
3132
3398
  pads: "none"
3133
3399
  });
3134
- function register16(registry) {
3135
- registry.register(model16);
3400
+ function register17(registry) {
3401
+ registry.register(model17);
3136
3402
  }
3137
3403
 
3138
3404
  // lib/models/sheetmetal/register.tsx
@@ -3292,14 +3558,14 @@ function SheetMetal({ color = "#737e8f", ...props }) {
3292
3558
  }
3293
3559
 
3294
3560
  // lib/models/sheetmetal/register.tsx
3295
- var model17 = defineModelRenderer({
3561
+ var model18 = defineModelRenderer({
3296
3562
  name: "sheetmetal",
3297
3563
  schema: sheetMetalModelDefinitionSchema,
3298
3564
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(SheetMetal, { ...props }),
3299
3565
  pads: "none"
3300
3566
  });
3301
- function register17(registry) {
3302
- registry.register(model17);
3567
+ function register18(registry) {
3568
+ registry.register(model18);
3303
3569
  }
3304
3570
 
3305
3571
  // lib/models/spurgear/register.tsx
@@ -3314,14 +3580,14 @@ function SpurGear({ color = "#737e8f", ...props }) {
3314
3580
  }
3315
3581
 
3316
3582
  // lib/models/spurgear/register.tsx
3317
- var model18 = defineModelRenderer({
3583
+ var model19 = defineModelRenderer({
3318
3584
  name: "spurgear",
3319
3585
  schema: spurGearModelDefinitionSchema,
3320
3586
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(SpurGear, { ...props }),
3321
3587
  pads: "none"
3322
3588
  });
3323
- function register18(registry) {
3324
- registry.register(model18);
3589
+ function register19(registry) {
3590
+ registry.register(model19);
3325
3591
  }
3326
3592
 
3327
3593
  // lib/models/threadedrod/register.tsx
@@ -3423,14 +3689,14 @@ function ThreadedRod({ color = "#737e8f", ...props }) {
3423
3689
  }
3424
3690
 
3425
3691
  // lib/models/threadedrod/register.tsx
3426
- var model19 = defineModelRenderer({
3692
+ var model20 = defineModelRenderer({
3427
3693
  name: "threadedrod",
3428
3694
  schema: threadedRodModelDefinitionSchema,
3429
3695
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(ThreadedRod, { ...props }),
3430
3696
  pads: "none"
3431
3697
  });
3432
- function register19(registry) {
3433
- registry.register(model19);
3698
+ function register20(registry) {
3699
+ registry.register(model20);
3434
3700
  }
3435
3701
 
3436
3702
  // lib/models/tslotextrusion/register.tsx
@@ -3580,14 +3846,14 @@ function TSlotExtrusion({
3580
3846
  }
3581
3847
 
3582
3848
  // lib/models/tslotextrusion/register.tsx
3583
- var model20 = defineModelRenderer({
3849
+ var model21 = defineModelRenderer({
3584
3850
  name: "tslotextrusion",
3585
3851
  schema: tSlotExtrusionModelDefinitionSchema,
3586
3852
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(TSlotExtrusion, { ...props }),
3587
3853
  pads: "none"
3588
3854
  });
3589
- function register20(registry) {
3590
- registry.register(model20);
3855
+ function register21(registry) {
3856
+ registry.register(model21);
3591
3857
  }
3592
3858
 
3593
3859
  // lib/models/tslotgusset/register.tsx
@@ -3640,14 +3906,14 @@ function TSlotGusset({ color = "#8995a3", ...props }) {
3640
3906
  }
3641
3907
 
3642
3908
  // lib/models/tslotgusset/register.tsx
3643
- var model21 = defineModelRenderer({
3909
+ var model22 = defineModelRenderer({
3644
3910
  name: "tslotgusset",
3645
3911
  schema: tSlotGussetModelDefinitionSchema,
3646
3912
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(TSlotGusset, { ...props }),
3647
3913
  pads: "none"
3648
3914
  });
3649
- function register21(registry) {
3650
- registry.register(model21);
3915
+ function register22(registry) {
3916
+ registry.register(model22);
3651
3917
  }
3652
3918
 
3653
3919
  // lib/models/tslotinsidecorner/register.tsx
@@ -3727,14 +3993,14 @@ function TSlotInsideCorner({
3727
3993
  }
3728
3994
 
3729
3995
  // lib/models/tslotinsidecorner/register.tsx
3730
- var model22 = defineModelRenderer({
3996
+ var model23 = defineModelRenderer({
3731
3997
  name: "tslotinsidecorner",
3732
3998
  schema: tSlotInsideCornerModelDefinitionSchema,
3733
3999
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(TSlotInsideCorner, { ...props }),
3734
4000
  pads: "none"
3735
4001
  });
3736
- function register22(registry) {
3737
- registry.register(model22);
4002
+ function register23(registry) {
4003
+ registry.register(model23);
3738
4004
  }
3739
4005
 
3740
4006
  // lib/models/wormgear/register.tsx
@@ -3926,14 +4192,14 @@ function WormGear({ color = "#737e8f", ...props }) {
3926
4192
  }
3927
4193
 
3928
4194
  // lib/models/wormgear/register.tsx
3929
- var model23 = defineModelRenderer({
4195
+ var model24 = defineModelRenderer({
3930
4196
  name: "wormgear",
3931
4197
  schema: wormGearModelDefinitionSchema,
3932
4198
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(WormGear, { ...props }),
3933
4199
  pads: "none"
3934
4200
  });
3935
- function register23(registry) {
3936
- registry.register(model23);
4201
+ function register24(registry) {
4202
+ registry.register(model24);
3937
4203
  }
3938
4204
 
3939
4205
  // lib/generated/model-renderers.ts
@@ -3961,6 +4227,7 @@ function registerAllModelRenderers(registry) {
3961
4227
  register21(registry);
3962
4228
  register22(registry);
3963
4229
  register23(registry);
4230
+ register24(registry);
3964
4231
  }
3965
4232
 
3966
4233
  // lib/default-model-registry.ts
@@ -11517,10 +11784,10 @@ var SOT143 = ({ footprint = "sot143" }) => {
11517
11784
  var Footprinter3d = ({ footprint }) => {
11518
11785
  const modelFn = mp3.string(footprint.split("_", 1)[0]).params().fn;
11519
11786
  if (mp3.getModelNames().includes(modelFn)) {
11520
- const model24 = mp3.string(footprint).json();
11521
- const renderer = modelRendererRegistry.get(model24.fn);
11787
+ const model25 = mp3.string(footprint).json();
11788
+ const renderer = modelRendererRegistry.get(model25.fn);
11522
11789
  if (renderer) {
11523
- return renderer.render(model24);
11790
+ return renderer.render(model25);
11524
11791
  }
11525
11792
  }
11526
11793
  let normalizedFootprint = footprint;
@@ -12471,6 +12738,7 @@ function createJSCADRenderer(jscad8) {
12471
12738
  return { createJSCADRoot };
12472
12739
  }
12473
12740
  export {
12741
+ BallBearing,
12474
12742
  ButtonScrew,
12475
12743
  CableGrommet,
12476
12744
  ClampingShaftCollar,
@@ -12498,6 +12766,8 @@ export {
12498
12766
  ThreadedRod,
12499
12767
  WormGear,
12500
12768
  convertCSGToThreeGeom,
12769
+ createBallBearingGeom,
12770
+ createBallBearingMesh,
12501
12771
  createButtonScrewGeom,
12502
12772
  createButtonScrewMesh,
12503
12773
  createCableGrommetGeom,