@tscircuit/3d-viewer 0.0.521 → 0.0.523

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.
Files changed (2) hide show
  1. package/dist/index.js +639 -778
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -243,9 +243,9 @@ var require_trigonometry = __commonJS({
243
243
  "use strict";
244
244
  var { NEPS } = require_constants();
245
245
  var rezero = (n) => Math.abs(n) < NEPS ? 0 : n;
246
- var sin2 = (radians) => rezero(Math.sin(radians));
247
- var cos2 = (radians) => rezero(Math.cos(radians));
248
- module.exports = { sin: sin2, cos: cos2 };
246
+ var sin = (radians) => rezero(Math.sin(radians));
247
+ var cos = (radians) => rezero(Math.cos(radians));
248
+ module.exports = { sin, cos };
249
249
  }
250
250
  });
251
251
 
@@ -281,7 +281,7 @@ var require_fromRotation = __commonJS({
281
281
  "node_modules/@jscad/modeling/src/maths/mat4/fromRotation.js"(exports, module) {
282
282
  "use strict";
283
283
  var { EPS } = require_constants();
284
- var { sin: sin2, cos: cos2 } = require_trigonometry();
284
+ var { sin, cos } = require_trigonometry();
285
285
  var identity = require_identity();
286
286
  var fromRotation = (out, rad, axis) => {
287
287
  let [x, y, z18] = axis;
@@ -293,8 +293,8 @@ var require_fromRotation = __commonJS({
293
293
  x *= len;
294
294
  y *= len;
295
295
  z18 *= len;
296
- const s = sin2(rad);
297
- const c = cos2(rad);
296
+ const s = sin(rad);
297
+ const c = cos(rad);
298
298
  const t = 1 - c;
299
299
  out[0] = x * x * t + c;
300
300
  out[1] = y * x * t + z18 * s;
@@ -349,14 +349,14 @@ var require_fromScaling = __commonJS({
349
349
  var require_fromTaitBryanRotation = __commonJS({
350
350
  "node_modules/@jscad/modeling/src/maths/mat4/fromTaitBryanRotation.js"(exports, module) {
351
351
  "use strict";
352
- var { sin: sin2, cos: cos2 } = require_trigonometry();
352
+ var { sin, cos } = require_trigonometry();
353
353
  var fromTaitBryanRotation = (out, yaw, pitch, roll) => {
354
- const sy = sin2(yaw);
355
- const cy = cos2(yaw);
356
- const sp = sin2(pitch);
357
- const cp = cos2(pitch);
358
- const sr = sin2(roll);
359
- const cr = cos2(roll);
354
+ const sy = sin(yaw);
355
+ const cy = cos(yaw);
356
+ const sp = sin(pitch);
357
+ const cp = cos(pitch);
358
+ const sr = sin(roll);
359
+ const cr = cos(roll);
360
360
  out[0] = cp * cy;
361
361
  out[1] = cp * sy;
362
362
  out[2] = -sp;
@@ -825,13 +825,13 @@ var require_rotateZ = __commonJS({
825
825
  var require_scale = __commonJS({
826
826
  "node_modules/@jscad/modeling/src/maths/vec3/scale.js"(exports, module) {
827
827
  "use strict";
828
- var scale3 = (out, vector, amount) => {
828
+ var scale2 = (out, vector, amount) => {
829
829
  out[0] = vector[0] * amount;
830
830
  out[1] = vector[1] * amount;
831
831
  out[2] = vector[2] * amount;
832
832
  return out;
833
833
  };
834
- module.exports = scale3;
834
+ module.exports = scale2;
835
835
  }
836
836
  });
837
837
 
@@ -904,7 +904,7 @@ var require_toString = __commonJS({
904
904
  var require_transform = __commonJS({
905
905
  "node_modules/@jscad/modeling/src/maths/vec3/transform.js"(exports, module) {
906
906
  "use strict";
907
- var transform2 = (out, vector, matrix) => {
907
+ var transform = (out, vector, matrix) => {
908
908
  const x = vector[0];
909
909
  const y = vector[1];
910
910
  const z18 = vector[2];
@@ -915,7 +915,7 @@ var require_transform = __commonJS({
915
915
  out[2] = (matrix[2] * x + matrix[6] * y + matrix[10] * z18 + matrix[14]) / w;
916
916
  return out;
917
917
  };
918
- module.exports = transform2;
918
+ module.exports = transform;
919
919
  }
920
920
  });
921
921
 
@@ -999,10 +999,10 @@ var require_fromVectorRotation = __commonJS({
999
999
  var require_fromXRotation = __commonJS({
1000
1000
  "node_modules/@jscad/modeling/src/maths/mat4/fromXRotation.js"(exports, module) {
1001
1001
  "use strict";
1002
- var { sin: sin2, cos: cos2 } = require_trigonometry();
1002
+ var { sin, cos } = require_trigonometry();
1003
1003
  var fromXRotation = (out, radians) => {
1004
- const s = sin2(radians);
1005
- const c = cos2(radians);
1004
+ const s = sin(radians);
1005
+ const c = cos(radians);
1006
1006
  out[0] = 1;
1007
1007
  out[1] = 0;
1008
1008
  out[2] = 0;
@@ -1029,10 +1029,10 @@ var require_fromXRotation = __commonJS({
1029
1029
  var require_fromYRotation = __commonJS({
1030
1030
  "node_modules/@jscad/modeling/src/maths/mat4/fromYRotation.js"(exports, module) {
1031
1031
  "use strict";
1032
- var { sin: sin2, cos: cos2 } = require_trigonometry();
1032
+ var { sin, cos } = require_trigonometry();
1033
1033
  var fromYRotation = (out, radians) => {
1034
- const s = sin2(radians);
1035
- const c = cos2(radians);
1034
+ const s = sin(radians);
1035
+ const c = cos(radians);
1036
1036
  out[0] = c;
1037
1037
  out[1] = 0;
1038
1038
  out[2] = -s;
@@ -1059,10 +1059,10 @@ var require_fromYRotation = __commonJS({
1059
1059
  var require_fromZRotation = __commonJS({
1060
1060
  "node_modules/@jscad/modeling/src/maths/mat4/fromZRotation.js"(exports, module) {
1061
1061
  "use strict";
1062
- var { sin: sin2, cos: cos2 } = require_trigonometry();
1062
+ var { sin, cos } = require_trigonometry();
1063
1063
  var fromZRotation = (out, radians) => {
1064
- const s = sin2(radians);
1065
- const c = cos2(radians);
1064
+ const s = sin(radians);
1065
+ const c = cos(radians);
1066
1066
  out[0] = c;
1067
1067
  out[1] = s;
1068
1068
  out[2] = 0;
@@ -1214,9 +1214,9 @@ var require_rotate = __commonJS({
1214
1214
  "node_modules/@jscad/modeling/src/maths/mat4/rotate.js"(exports, module) {
1215
1215
  "use strict";
1216
1216
  var { EPS } = require_constants();
1217
- var { sin: sin2, cos: cos2 } = require_trigonometry();
1217
+ var { sin, cos } = require_trigonometry();
1218
1218
  var copy = require_copy();
1219
- var rotate3 = (out, matrix, radians, axis) => {
1219
+ var rotate2 = (out, matrix, radians, axis) => {
1220
1220
  let [x, y, z18] = axis;
1221
1221
  const lengthSquared = x * x + y * y + z18 * z18;
1222
1222
  if (Math.abs(lengthSquared) < EPS) {
@@ -1226,8 +1226,8 @@ var require_rotate = __commonJS({
1226
1226
  x *= len;
1227
1227
  y *= len;
1228
1228
  z18 *= len;
1229
- const s = sin2(radians);
1230
- const c = cos2(radians);
1229
+ const s = sin(radians);
1230
+ const c = cos(radians);
1231
1231
  const t = 1 - c;
1232
1232
  const a00 = matrix[0];
1233
1233
  const a01 = matrix[1];
@@ -1270,7 +1270,7 @@ var require_rotate = __commonJS({
1270
1270
  }
1271
1271
  return out;
1272
1272
  };
1273
- module.exports = rotate3;
1273
+ module.exports = rotate2;
1274
1274
  }
1275
1275
  });
1276
1276
 
@@ -1278,10 +1278,10 @@ var require_rotate = __commonJS({
1278
1278
  var require_rotateX2 = __commonJS({
1279
1279
  "node_modules/@jscad/modeling/src/maths/mat4/rotateX.js"(exports, module) {
1280
1280
  "use strict";
1281
- var { sin: sin2, cos: cos2 } = require_trigonometry();
1281
+ var { sin, cos } = require_trigonometry();
1282
1282
  var rotateX = (out, matrix, radians) => {
1283
- const s = sin2(radians);
1284
- const c = cos2(radians);
1283
+ const s = sin(radians);
1284
+ const c = cos(radians);
1285
1285
  const a10 = matrix[4];
1286
1286
  const a11 = matrix[5];
1287
1287
  const a12 = matrix[6];
@@ -1318,10 +1318,10 @@ var require_rotateX2 = __commonJS({
1318
1318
  var require_rotateY2 = __commonJS({
1319
1319
  "node_modules/@jscad/modeling/src/maths/mat4/rotateY.js"(exports, module) {
1320
1320
  "use strict";
1321
- var { sin: sin2, cos: cos2 } = require_trigonometry();
1321
+ var { sin, cos } = require_trigonometry();
1322
1322
  var rotateY = (out, matrix, radians) => {
1323
- const s = sin2(radians);
1324
- const c = cos2(radians);
1323
+ const s = sin(radians);
1324
+ const c = cos(radians);
1325
1325
  const a00 = matrix[0];
1326
1326
  const a01 = matrix[1];
1327
1327
  const a02 = matrix[2];
@@ -1358,10 +1358,10 @@ var require_rotateY2 = __commonJS({
1358
1358
  var require_rotateZ2 = __commonJS({
1359
1359
  "node_modules/@jscad/modeling/src/maths/mat4/rotateZ.js"(exports, module) {
1360
1360
  "use strict";
1361
- var { sin: sin2, cos: cos2 } = require_trigonometry();
1361
+ var { sin, cos } = require_trigonometry();
1362
1362
  var rotateZ3 = (out, matrix, radians) => {
1363
- const s = sin2(radians);
1364
- const c = cos2(radians);
1363
+ const s = sin(radians);
1364
+ const c = cos(radians);
1365
1365
  const a00 = matrix[0];
1366
1366
  const a01 = matrix[1];
1367
1367
  const a02 = matrix[2];
@@ -1398,7 +1398,7 @@ var require_rotateZ2 = __commonJS({
1398
1398
  var require_scale2 = __commonJS({
1399
1399
  "node_modules/@jscad/modeling/src/maths/mat4/scale.js"(exports, module) {
1400
1400
  "use strict";
1401
- var scale3 = (out, matrix, dimensions) => {
1401
+ var scale2 = (out, matrix, dimensions) => {
1402
1402
  const x = dimensions[0];
1403
1403
  const y = dimensions[1];
1404
1404
  const z18 = dimensions[2];
@@ -1420,7 +1420,7 @@ var require_scale2 = __commonJS({
1420
1420
  out[15] = matrix[15];
1421
1421
  return out;
1422
1422
  };
1423
- module.exports = scale3;
1423
+ module.exports = scale2;
1424
1424
  }
1425
1425
  });
1426
1426
 
@@ -1464,7 +1464,7 @@ var require_toString2 = __commonJS({
1464
1464
  var require_translate = __commonJS({
1465
1465
  "node_modules/@jscad/modeling/src/maths/mat4/translate.js"(exports, module) {
1466
1466
  "use strict";
1467
- var translate7 = (out, matrix, offsets) => {
1467
+ var translate6 = (out, matrix, offsets) => {
1468
1468
  const x = offsets[0];
1469
1469
  const y = offsets[1];
1470
1470
  const z18 = offsets[2];
@@ -1517,7 +1517,7 @@ var require_translate = __commonJS({
1517
1517
  }
1518
1518
  return out;
1519
1519
  };
1520
- module.exports = translate7;
1520
+ module.exports = translate6;
1521
1521
  }
1522
1522
  });
1523
1523
 
@@ -1729,10 +1729,10 @@ var require_equals3 = __commonJS({
1729
1729
  var require_fromAngleRadians = __commonJS({
1730
1730
  "node_modules/@jscad/modeling/src/maths/vec2/fromAngleRadians.js"(exports, module) {
1731
1731
  "use strict";
1732
- var { sin: sin2, cos: cos2 } = require_trigonometry();
1732
+ var { sin, cos } = require_trigonometry();
1733
1733
  var fromAngleRadians = (out, radians) => {
1734
- out[0] = cos2(radians);
1735
- out[1] = sin2(radians);
1734
+ out[0] = cos(radians);
1735
+ out[1] = sin(radians);
1736
1736
  return out;
1737
1737
  };
1738
1738
  module.exports = fromAngleRadians;
@@ -1857,7 +1857,7 @@ var require_negate2 = __commonJS({
1857
1857
  var require_rotate2 = __commonJS({
1858
1858
  "node_modules/@jscad/modeling/src/maths/vec2/rotate.js"(exports, module) {
1859
1859
  "use strict";
1860
- var rotate3 = (out, vector, origin, radians) => {
1860
+ var rotate2 = (out, vector, origin, radians) => {
1861
1861
  const x = vector[0] - origin[0];
1862
1862
  const y = vector[1] - origin[1];
1863
1863
  const c = Math.cos(radians);
@@ -1866,7 +1866,7 @@ var require_rotate2 = __commonJS({
1866
1866
  out[1] = x * s + y * c + origin[1];
1867
1867
  return out;
1868
1868
  };
1869
- module.exports = rotate3;
1869
+ module.exports = rotate2;
1870
1870
  }
1871
1871
  });
1872
1872
 
@@ -1876,8 +1876,8 @@ var require_normal = __commonJS({
1876
1876
  "use strict";
1877
1877
  var { TAU } = require_constants();
1878
1878
  var create = require_create4();
1879
- var rotate3 = require_rotate2();
1880
- var normal = (out, vector) => rotate3(out, vector, create(), TAU / 4);
1879
+ var rotate2 = require_rotate2();
1880
+ var normal = (out, vector) => rotate2(out, vector, create(), TAU / 4);
1881
1881
  module.exports = normal;
1882
1882
  }
1883
1883
  });
@@ -1905,12 +1905,12 @@ var require_normalize2 = __commonJS({
1905
1905
  var require_scale3 = __commonJS({
1906
1906
  "node_modules/@jscad/modeling/src/maths/vec2/scale.js"(exports, module) {
1907
1907
  "use strict";
1908
- var scale3 = (out, vector, amount) => {
1908
+ var scale2 = (out, vector, amount) => {
1909
1909
  out[0] = vector[0] * amount;
1910
1910
  out[1] = vector[1] * amount;
1911
1911
  return out;
1912
1912
  };
1913
- module.exports = scale3;
1913
+ module.exports = scale2;
1914
1914
  }
1915
1915
  });
1916
1916
 
@@ -1979,14 +1979,14 @@ var require_toString3 = __commonJS({
1979
1979
  var require_transform2 = __commonJS({
1980
1980
  "node_modules/@jscad/modeling/src/maths/vec2/transform.js"(exports, module) {
1981
1981
  "use strict";
1982
- var transform2 = (out, vector, matrix) => {
1982
+ var transform = (out, vector, matrix) => {
1983
1983
  const x = vector[0];
1984
1984
  const y = vector[1];
1985
1985
  out[0] = matrix[0] * x + matrix[4] * y + matrix[12];
1986
1986
  out[1] = matrix[1] * x + matrix[5] * y + matrix[13];
1987
1987
  return out;
1988
1988
  };
1989
- module.exports = transform2;
1989
+ module.exports = transform;
1990
1990
  }
1991
1991
  });
1992
1992
 
@@ -2332,7 +2332,7 @@ var require_transform3 = __commonJS({
2332
2332
  "use strict";
2333
2333
  var mat4 = require_mat4();
2334
2334
  var reverse = require_reverse();
2335
- var transform2 = (matrix, geometry) => {
2335
+ var transform = (matrix, geometry) => {
2336
2336
  const transforms = mat4.multiply(mat4.create(), matrix, geometry.transforms);
2337
2337
  const transformed = Object.assign({}, geometry, { transforms });
2338
2338
  if (matrix[0] * matrix[5] - matrix[4] * matrix[1] < 0) {
@@ -2340,7 +2340,7 @@ var require_transform3 = __commonJS({
2340
2340
  }
2341
2341
  return transformed;
2342
2342
  };
2343
- module.exports = transform2;
2343
+ module.exports = transform;
2344
2344
  }
2345
2345
  });
2346
2346
 
@@ -2666,7 +2666,7 @@ var require_Face = __commonJS({
2666
2666
  var dot = require_dot();
2667
2667
  var length51 = require_length();
2668
2668
  var normalize = require_normalize();
2669
- var scale3 = require_scale();
2669
+ var scale2 = require_scale();
2670
2670
  var subtract5 = require_subtract();
2671
2671
  var HalfEdge = require_HalfEdge();
2672
2672
  var VISIBLE = 0;
@@ -2714,7 +2714,7 @@ var require_Face = __commonJS({
2714
2714
  this.nVertices += 1;
2715
2715
  }
2716
2716
  this.area = length51(this.normal);
2717
- this.normal = scale3(this.normal, this.normal, 1 / this.area);
2717
+ this.normal = scale2(this.normal, this.normal, 1 / this.area);
2718
2718
  }
2719
2719
  computeNormalMinArea(minArea) {
2720
2720
  this.computeNormal();
@@ -2734,9 +2734,9 @@ var require_Face = __commonJS({
2734
2734
  const p2 = maxEdge.head().point;
2735
2735
  const maxVector = subtract5([], p2, p1);
2736
2736
  const maxLength = Math.sqrt(maxSquaredLength);
2737
- scale3(maxVector, maxVector, 1 / maxLength);
2737
+ scale2(maxVector, maxVector, 1 / maxLength);
2738
2738
  const maxProjection = dot(this.normal, maxVector);
2739
- scale3(maxVector, maxVector, -maxProjection);
2739
+ scale2(maxVector, maxVector, -maxProjection);
2740
2740
  add(this.normal, this.normal, maxVector);
2741
2741
  normalize(this.normal, this.normal);
2742
2742
  }
@@ -2748,7 +2748,7 @@ var require_Face = __commonJS({
2748
2748
  add(this.centroid, this.centroid, edge.head().point);
2749
2749
  edge = edge.next;
2750
2750
  } while (edge !== this.edge);
2751
- scale3(this.centroid, this.centroid, 1 / this.nVertices);
2751
+ scale2(this.centroid, this.centroid, 1 / this.nVertices);
2752
2752
  }
2753
2753
  computeNormalAndCentroid(minArea) {
2754
2754
  if (typeof minArea !== "undefined") {
@@ -3779,7 +3779,7 @@ var require_transform4 = __commonJS({
3779
3779
  var vec3 = require_vec3();
3780
3780
  var fromPoints = require_fromPoints3();
3781
3781
  var flip4 = require_flip();
3782
- var transform2 = (out, plane, matrix) => {
3782
+ var transform = (out, plane, matrix) => {
3783
3783
  const ismirror = mat4.isMirroring(matrix);
3784
3784
  const r = vec3.orthogonal(vec3.create(), plane);
3785
3785
  const u = vec3.cross(r, plane, r);
@@ -3797,7 +3797,7 @@ var require_transform4 = __commonJS({
3797
3797
  }
3798
3798
  return out;
3799
3799
  };
3800
- module.exports = transform2;
3800
+ module.exports = transform;
3801
3801
  }
3802
3802
  });
3803
3803
 
@@ -4049,7 +4049,7 @@ var require_fromScalar3 = __commonJS({
4049
4049
  var require_transform5 = __commonJS({
4050
4050
  "node_modules/@jscad/modeling/src/maths/vec4/transform.js"(exports, module) {
4051
4051
  "use strict";
4052
- var transform2 = (out, vector, matrix) => {
4052
+ var transform = (out, vector, matrix) => {
4053
4053
  const [x, y, z18, w] = vector;
4054
4054
  out[0] = matrix[0] * x + matrix[4] * y + matrix[8] * z18 + matrix[12] * w;
4055
4055
  out[1] = matrix[1] * x + matrix[5] * y + matrix[9] * z18 + matrix[13] * w;
@@ -4057,7 +4057,7 @@ var require_transform5 = __commonJS({
4057
4057
  out[3] = matrix[3] * x + matrix[7] * y + matrix[11] * z18 + matrix[15] * w;
4058
4058
  return out;
4059
4059
  };
4060
- module.exports = transform2;
4060
+ module.exports = transform;
4061
4061
  }
4062
4062
  });
4063
4063
 
@@ -4178,14 +4178,14 @@ var require_transform6 = __commonJS({
4178
4178
  var mat4 = require_mat4();
4179
4179
  var vec3 = require_vec3();
4180
4180
  var create = require_create6();
4181
- var transform2 = (matrix, polygon3) => {
4181
+ var transform = (matrix, polygon3) => {
4182
4182
  const vertices = polygon3.vertices.map((vertex) => vec3.transform(vec3.create(), vertex, matrix));
4183
4183
  if (mat4.isMirroring(matrix)) {
4184
4184
  vertices.reverse();
4185
4185
  }
4186
4186
  return create(vertices);
4187
4187
  };
4188
- module.exports = transform2;
4188
+ module.exports = transform;
4189
4189
  }
4190
4190
  });
4191
4191
 
@@ -4492,11 +4492,11 @@ var require_transform7 = __commonJS({
4492
4492
  "node_modules/@jscad/modeling/src/geometries/geom3/transform.js"(exports, module) {
4493
4493
  "use strict";
4494
4494
  var mat4 = require_mat4();
4495
- var transform2 = (matrix, geometry) => {
4495
+ var transform = (matrix, geometry) => {
4496
4496
  const transforms = mat4.multiply(mat4.create(), matrix, geometry.transforms);
4497
4497
  return Object.assign({}, geometry, { transforms });
4498
4498
  };
4499
- module.exports = transform2;
4499
+ module.exports = transform;
4500
4500
  }
4501
4501
  });
4502
4502
 
@@ -5085,11 +5085,11 @@ var require_transform8 = __commonJS({
5085
5085
  "node_modules/@jscad/modeling/src/geometries/path2/transform.js"(exports, module) {
5086
5086
  "use strict";
5087
5087
  var mat4 = require_mat4();
5088
- var transform2 = (matrix, geometry) => {
5088
+ var transform = (matrix, geometry) => {
5089
5089
  const transforms = mat4.multiply(mat4.create(), matrix, geometry.transforms);
5090
5090
  return Object.assign({}, geometry, { transforms });
5091
5091
  };
5092
- module.exports = transform2;
5092
+ module.exports = transform;
5093
5093
  }
5094
5094
  });
5095
5095
 
@@ -6289,14 +6289,14 @@ var require_transform9 = __commonJS({
6289
6289
  var fromPoints = require_fromPoints6();
6290
6290
  var origin = require_origin();
6291
6291
  var direction = require_direction();
6292
- var transform2 = (out, line, matrix) => {
6292
+ var transform = (out, line, matrix) => {
6293
6293
  const org = origin(line);
6294
6294
  const dir = direction(line);
6295
6295
  vec2.transform(org, org, matrix);
6296
6296
  vec2.transform(dir, dir, matrix);
6297
6297
  return fromPoints(out, org, dir);
6298
6298
  };
6299
- module.exports = transform2;
6299
+ module.exports = transform;
6300
6300
  }
6301
6301
  });
6302
6302
 
@@ -6570,7 +6570,7 @@ var require_transform10 = __commonJS({
6570
6570
  "use strict";
6571
6571
  var vec3 = require_vec3();
6572
6572
  var fromPointAndDirection = require_fromPointAndDirection();
6573
- var transform2 = (out, line, matrix) => {
6573
+ var transform = (out, line, matrix) => {
6574
6574
  const point = line[0];
6575
6575
  const direction = line[1];
6576
6576
  const pointPlusDirection = vec3.add(vec3.create(), point, direction);
@@ -6579,7 +6579,7 @@ var require_transform10 = __commonJS({
6579
6579
  const newdirection = vec3.subtract(newPointPlusDirection, newPointPlusDirection, newpoint);
6580
6580
  return fromPointAndDirection(out, newpoint, newdirection);
6581
6581
  };
6582
- module.exports = transform2;
6582
+ module.exports = transform;
6583
6583
  }
6584
6584
  });
6585
6585
 
@@ -7252,7 +7252,7 @@ var require_ellipse = __commonJS({
7252
7252
  var { EPS, TAU } = require_constants();
7253
7253
  var vec2 = require_vec2();
7254
7254
  var geom2 = require_geom2();
7255
- var { sin: sin2, cos: cos2 } = require_trigonometry();
7255
+ var { sin, cos } = require_trigonometry();
7256
7256
  var { isGTE, isNumberArray } = require_commonChecks();
7257
7257
  var ellipse3 = (options) => {
7258
7258
  const defaults = {
@@ -7289,7 +7289,7 @@ var require_ellipse = __commonJS({
7289
7289
  segments = rotation < TAU ? segments + 1 : segments;
7290
7290
  for (let i = 0; i < segments; i++) {
7291
7291
  const angle = step * i + startAngle;
7292
- const point = vec2.fromValues(radius[0] * cos2(angle), radius[1] * sin2(angle));
7292
+ const point = vec2.fromValues(radius[0] * cos(angle), radius[1] * sin(angle));
7293
7293
  vec2.add(point, centerv, point);
7294
7294
  points.push(point);
7295
7295
  }
@@ -7396,7 +7396,7 @@ var require_cylinderElliptic = __commonJS({
7396
7396
  var vec3 = require_vec3();
7397
7397
  var geom3 = require_geom3();
7398
7398
  var poly3 = require_poly3();
7399
- var { sin: sin2, cos: cos2 } = require_trigonometry();
7399
+ var { sin, cos } = require_trigonometry();
7400
7400
  var { isGT, isGTE, isNumberArray } = require_commonChecks();
7401
7401
  var cylinderElliptic = (options) => {
7402
7402
  const defaults = {
@@ -7442,8 +7442,8 @@ var require_cylinderElliptic = __commonJS({
7442
7442
  const v3 = vec3.create();
7443
7443
  const point = (stack, slice, radius) => {
7444
7444
  const angle = slice * rotation + startAngle;
7445
- vec3.scale(v1, axisX, radius[0] * cos2(angle));
7446
- vec3.scale(v2, axisY, radius[1] * sin2(angle));
7445
+ vec3.scale(v1, axisX, radius[0] * cos(angle));
7446
+ vec3.scale(v2, axisY, radius[1] * sin(angle));
7447
7447
  vec3.add(v1, v1, v2);
7448
7448
  vec3.scale(v3, ray, stack);
7449
7449
  vec3.add(v3, v3, start);
@@ -7528,7 +7528,7 @@ var require_ellipsoid = __commonJS({
7528
7528
  var vec3 = require_vec3();
7529
7529
  var geom3 = require_geom3();
7530
7530
  var poly3 = require_poly3();
7531
- var { sin: sin2, cos: cos2 } = require_trigonometry();
7531
+ var { sin, cos } = require_trigonometry();
7532
7532
  var { isGTE, isNumberArray } = require_commonChecks();
7533
7533
  var ellipsoid = (options) => {
7534
7534
  const defaults = {
@@ -7553,13 +7553,13 @@ var require_ellipsoid = __commonJS({
7553
7553
  const p2 = vec3.create();
7554
7554
  for (let slice1 = 0; slice1 <= segments; slice1++) {
7555
7555
  const angle = TAU * slice1 / segments;
7556
- const cylinderpoint = vec3.add(vec3.create(), vec3.scale(p1, xvector, cos2(angle)), vec3.scale(p2, yvector, sin2(angle)));
7556
+ const cylinderpoint = vec3.add(vec3.create(), vec3.scale(p1, xvector, cos(angle)), vec3.scale(p2, yvector, sin(angle)));
7557
7557
  if (slice1 > 0) {
7558
7558
  let prevcospitch, prevsinpitch;
7559
7559
  for (let slice2 = 0; slice2 <= qsegments; slice2++) {
7560
7560
  const pitch = TAU / 4 * slice2 / qsegments;
7561
- const cospitch = cos2(pitch);
7562
- const sinpitch = sin2(pitch);
7561
+ const cospitch = cos(pitch);
7562
+ const sinpitch = sin(pitch);
7563
7563
  if (slice2 > 0) {
7564
7564
  let points = [];
7565
7565
  let point;
@@ -7883,13 +7883,13 @@ var require_roundedCuboid = __commonJS({
7883
7883
  var vec3 = require_vec3();
7884
7884
  var geom3 = require_geom3();
7885
7885
  var poly3 = require_poly3();
7886
- var { sin: sin2, cos: cos2 } = require_trigonometry();
7886
+ var { sin, cos } = require_trigonometry();
7887
7887
  var { isGTE, isNumberArray } = require_commonChecks();
7888
7888
  var cuboid5 = require_cuboid();
7889
7889
  var createCorners = (center, size4, radius, segments, slice, positive) => {
7890
7890
  const pitch = TAU / 4 * slice / segments;
7891
- const cospitch = cos2(pitch);
7892
- const sinpitch = sin2(pitch);
7891
+ const cospitch = cos(pitch);
7892
+ const sinpitch = sin(pitch);
7893
7893
  const layersegments = segments - slice;
7894
7894
  let layerradius = radius * cospitch;
7895
7895
  let layeroffset = size4[2] - (radius - radius * sinpitch);
@@ -8035,7 +8035,7 @@ var require_roundedCylinder = __commonJS({
8035
8035
  var vec3 = require_vec3();
8036
8036
  var geom3 = require_geom3();
8037
8037
  var poly3 = require_poly3();
8038
- var { sin: sin2, cos: cos2 } = require_trigonometry();
8038
+ var { sin, cos } = require_trigonometry();
8039
8039
  var { isGTE, isNumberArray } = require_commonChecks();
8040
8040
  var cylinder5 = require_cylinder();
8041
8041
  var roundedCylinder = (options) => {
@@ -8082,7 +8082,7 @@ var require_roundedCylinder = __commonJS({
8082
8082
  let prevcylinderpoint;
8083
8083
  for (let slice1 = 0; slice1 <= segments; slice1++) {
8084
8084
  const angle = TAU * slice1 / segments;
8085
- const cylinderpoint = vec3.add(vec3.create(), vec3.scale(v1, xvector, cos2(angle)), vec3.scale(v2, yvector, sin2(angle)));
8085
+ const cylinderpoint = vec3.add(vec3.create(), vec3.scale(v1, xvector, cos(angle)), vec3.scale(v2, yvector, sin(angle)));
8086
8086
  if (slice1 > 0) {
8087
8087
  let points = [];
8088
8088
  points.push(vec3.add(vec3.create(), start, cylinderpoint));
@@ -8093,8 +8093,8 @@ var require_roundedCylinder = __commonJS({
8093
8093
  let prevcospitch, prevsinpitch;
8094
8094
  for (let slice2 = 0; slice2 <= qsegments; slice2++) {
8095
8095
  const pitch = TAU / 4 * slice2 / qsegments;
8096
- const cospitch = cos2(pitch);
8097
- const sinpitch = sin2(pitch);
8096
+ const cospitch = cos(pitch);
8097
+ const sinpitch = sin(pitch);
8098
8098
  if (slice2 > 0) {
8099
8099
  points = [];
8100
8100
  let point;
@@ -8802,10 +8802,10 @@ var require_eliminateHoles = __commonJS({
8802
8802
  p = m;
8803
8803
  do {
8804
8804
  if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
8805
- const tan2 = Math.abs(hy - p.y) / (hx - p.x);
8806
- if (locallyInside(p, hole) && (tan2 < tanMin || tan2 === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) {
8805
+ const tan = Math.abs(hy - p.y) / (hx - p.x);
8806
+ if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) {
8807
8807
  m = p;
8808
- tanMin = tan2;
8808
+ tanMin = tan;
8809
8809
  }
8810
8810
  }
8811
8811
  p = p.next;
@@ -9145,11 +9145,11 @@ var require_transform11 = __commonJS({
9145
9145
  "use strict";
9146
9146
  var vec3 = require_vec3();
9147
9147
  var create = require_create13();
9148
- var transform2 = (matrix, slice) => {
9148
+ var transform = (matrix, slice) => {
9149
9149
  const edges = slice.edges.map((edge) => [vec3.transform(vec3.create(), edge[0], matrix), vec3.transform(vec3.create(), edge[1], matrix)]);
9150
9150
  return create(edges);
9151
9151
  };
9152
- module.exports = transform2;
9152
+ module.exports = transform;
9153
9153
  }
9154
9154
  });
9155
9155
 
@@ -9473,7 +9473,7 @@ var require_rotate3 = __commonJS({
9473
9473
  var geom2 = require_geom2();
9474
9474
  var geom3 = require_geom3();
9475
9475
  var path2 = require_path2();
9476
- var rotate3 = (angles, ...objects) => {
9476
+ var rotate2 = (angles, ...objects) => {
9477
9477
  if (!Array.isArray(angles)) throw new Error("angles must be an array");
9478
9478
  objects = flatten(objects);
9479
9479
  if (objects.length === 0) throw new Error("wrong number of arguments");
@@ -9491,11 +9491,11 @@ var require_rotate3 = __commonJS({
9491
9491
  });
9492
9492
  return results.length === 1 ? results[0] : results;
9493
9493
  };
9494
- var rotateX = (angle, ...objects) => rotate3([angle, 0, 0], objects);
9495
- var rotateY = (angle, ...objects) => rotate3([0, angle, 0], objects);
9496
- var rotateZ3 = (angle, ...objects) => rotate3([0, 0, angle], objects);
9494
+ var rotateX = (angle, ...objects) => rotate2([angle, 0, 0], objects);
9495
+ var rotateY = (angle, ...objects) => rotate2([0, angle, 0], objects);
9496
+ var rotateZ3 = (angle, ...objects) => rotate2([0, 0, angle], objects);
9497
9497
  module.exports = {
9498
- rotate: rotate3,
9498
+ rotate: rotate2,
9499
9499
  rotateX,
9500
9500
  rotateY,
9501
9501
  rotateZ: rotateZ3
@@ -9512,7 +9512,7 @@ var require_translate2 = __commonJS({
9512
9512
  var geom2 = require_geom2();
9513
9513
  var geom3 = require_geom3();
9514
9514
  var path2 = require_path2();
9515
- var translate7 = (offset4, ...objects) => {
9515
+ var translate6 = (offset4, ...objects) => {
9516
9516
  if (!Array.isArray(offset4)) throw new Error("offset must be an array");
9517
9517
  objects = flatten(objects);
9518
9518
  if (objects.length === 0) throw new Error("wrong number of arguments");
@@ -9527,11 +9527,11 @@ var require_translate2 = __commonJS({
9527
9527
  });
9528
9528
  return results.length === 1 ? results[0] : results;
9529
9529
  };
9530
- var translateX = (offset4, ...objects) => translate7([offset4, 0, 0], objects);
9531
- var translateY = (offset4, ...objects) => translate7([0, offset4, 0], objects);
9532
- var translateZ = (offset4, ...objects) => translate7([0, 0, offset4], objects);
9530
+ var translateX = (offset4, ...objects) => translate6([offset4, 0, 0], objects);
9531
+ var translateY = (offset4, ...objects) => translate6([0, offset4, 0], objects);
9532
+ var translateZ = (offset4, ...objects) => translate6([0, 0, offset4], objects);
9533
9533
  module.exports = {
9534
- translate: translate7,
9534
+ translate: translate6,
9535
9535
  translateX,
9536
9536
  translateY,
9537
9537
  translateZ
@@ -9545,8 +9545,8 @@ var require_torus = __commonJS({
9545
9545
  "use strict";
9546
9546
  var { TAU } = require_constants();
9547
9547
  var extrudeRotate = require_extrudeRotate();
9548
- var { rotate: rotate3 } = require_rotate3();
9549
- var { translate: translate7 } = require_translate2();
9548
+ var { rotate: rotate2 } = require_rotate3();
9549
+ var { translate: translate6 } = require_translate2();
9550
9550
  var circle = require_circle();
9551
9551
  var { isGT, isGTE } = require_commonChecks();
9552
9552
  var torus = (options) => {
@@ -9569,9 +9569,9 @@ var require_torus = __commonJS({
9569
9569
  if (innerRadius >= outerRadius) throw new Error("inner circle is too large to rotate about the outer circle");
9570
9570
  let innerCircle = circle({ radius: innerRadius, segments: innerSegments });
9571
9571
  if (innerRotation !== 0) {
9572
- innerCircle = rotate3([0, 0, innerRotation], innerCircle);
9572
+ innerCircle = rotate2([0, 0, innerRotation], innerCircle);
9573
9573
  }
9574
- innerCircle = translate7([outerRadius, 0], innerCircle);
9574
+ innerCircle = translate6([outerRadius, 0], innerCircle);
9575
9575
  const extrudeOptions = {
9576
9576
  startAngle,
9577
9577
  angle: outerRotation,
@@ -9928,7 +9928,7 @@ var require_vectorText = __commonJS({
9928
9928
  }
9929
9929
  return line;
9930
9930
  };
9931
- var vectorText2 = (options, text) => {
9931
+ var vectorText = (options, text) => {
9932
9932
  const {
9933
9933
  xOffset,
9934
9934
  yOffset,
@@ -9985,7 +9985,7 @@ var require_vectorText = __commonJS({
9985
9985
  }
9986
9986
  return output;
9987
9987
  };
9988
- module.exports = vectorText2;
9988
+ module.exports = vectorText;
9989
9989
  }
9990
9990
  });
9991
9991
 
@@ -13296,7 +13296,7 @@ var require_align = __commonJS({
13296
13296
  var flatten = require_flatten();
13297
13297
  var padArrayToLength = require_padArrayToLength();
13298
13298
  var measureAggregateBoundingBox = require_measureAggregateBoundingBox();
13299
- var { translate: translate7 } = require_translate2();
13299
+ var { translate: translate6 } = require_translate2();
13300
13300
  var validateOptions = (options) => {
13301
13301
  if (!Array.isArray(options.modes) || options.modes.length > 3) throw new Error("align(): modes must be an array of length <= 3");
13302
13302
  options.modes = padArrayToLength(options.modes, "none", 3);
@@ -13333,7 +13333,7 @@ var require_align = __commonJS({
13333
13333
  translation[i] = relativeTo[i] - bounds[0][i];
13334
13334
  }
13335
13335
  }
13336
- return translate7(translation, geometry);
13336
+ return translate6(translation, geometry);
13337
13337
  };
13338
13338
  var align = (options, ...geometries) => {
13339
13339
  const defaults = {
@@ -13370,7 +13370,7 @@ var require_center = __commonJS({
13370
13370
  var geom3 = require_geom3();
13371
13371
  var path2 = require_path2();
13372
13372
  var measureBoundingBox = require_measureBoundingBox2();
13373
- var { translate: translate7 } = require_translate2();
13373
+ var { translate: translate6 } = require_translate2();
13374
13374
  var centerGeometry = (options, object) => {
13375
13375
  const defaults = {
13376
13376
  axes: [true, true, true],
@@ -13382,7 +13382,7 @@ var require_center = __commonJS({
13382
13382
  if (axes[0]) offset4[0] = relativeTo[0] - (bounds[0][0] + (bounds[1][0] - bounds[0][0]) / 2);
13383
13383
  if (axes[1]) offset4[1] = relativeTo[1] - (bounds[0][1] + (bounds[1][1] - bounds[0][1]) / 2);
13384
13384
  if (axes[2]) offset4[2] = relativeTo[2] - (bounds[0][2] + (bounds[1][2] - bounds[0][2]) / 2);
13385
- return translate7(offset4, object);
13385
+ return translate6(offset4, object);
13386
13386
  };
13387
13387
  var center = (options, ...objects) => {
13388
13388
  const defaults = {
@@ -13424,7 +13424,7 @@ var require_scale4 = __commonJS({
13424
13424
  var geom2 = require_geom2();
13425
13425
  var geom3 = require_geom3();
13426
13426
  var path2 = require_path2();
13427
- var scale3 = (factors, ...objects) => {
13427
+ var scale2 = (factors, ...objects) => {
13428
13428
  if (!Array.isArray(factors)) throw new Error("factors must be an array");
13429
13429
  objects = flatten(objects);
13430
13430
  if (objects.length === 0) throw new Error("wrong number of arguments");
@@ -13440,11 +13440,11 @@ var require_scale4 = __commonJS({
13440
13440
  });
13441
13441
  return results.length === 1 ? results[0] : results;
13442
13442
  };
13443
- var scaleX = (factor, ...objects) => scale3([factor, 1, 1], objects);
13444
- var scaleY = (factor, ...objects) => scale3([1, factor, 1], objects);
13445
- var scaleZ = (factor, ...objects) => scale3([1, 1, factor], objects);
13443
+ var scaleX = (factor, ...objects) => scale2([factor, 1, 1], objects);
13444
+ var scaleY = (factor, ...objects) => scale2([1, factor, 1], objects);
13445
+ var scaleZ = (factor, ...objects) => scale2([1, 1, factor], objects);
13446
13446
  module.exports = {
13447
- scale: scale3,
13447
+ scale: scale2,
13448
13448
  scaleX,
13449
13449
  scaleY,
13450
13450
  scaleZ
@@ -13460,7 +13460,7 @@ var require_transform12 = __commonJS({
13460
13460
  var geom2 = require_geom2();
13461
13461
  var geom3 = require_geom3();
13462
13462
  var path2 = require_path2();
13463
- var transform2 = (matrix, ...objects) => {
13463
+ var transform = (matrix, ...objects) => {
13464
13464
  objects = flatten(objects);
13465
13465
  if (objects.length === 0) throw new Error("wrong number of arguments");
13466
13466
  const results = objects.map((object) => {
@@ -13471,7 +13471,7 @@ var require_transform12 = __commonJS({
13471
13471
  });
13472
13472
  return results.length === 1 ? results[0] : results;
13473
13473
  };
13474
- module.exports = transform2;
13474
+ module.exports = transform;
13475
13475
  }
13476
13476
  });
13477
13477
 
@@ -14245,7 +14245,7 @@ var require_browser = __commonJS({
14245
14245
 
14246
14246
  // src/CadViewer.tsx
14247
14247
  import { useState as useState36, useCallback as useCallback21, useRef as useRef26, useEffect as useEffect44 } from "react";
14248
- import * as THREE36 from "three";
14248
+ import * as THREE37 from "three";
14249
14249
 
14250
14250
  // src/CadViewerJscad.tsx
14251
14251
  import { su as su11 } from "@tscircuit/circuit-json-util";
@@ -22331,7 +22331,7 @@ var m2host = (raw_params) => {
22331
22331
  }
22332
22332
  const centerX = (minX + maxX) / 2;
22333
22333
  const centerY = (minY + maxY) / 2;
22334
- const translate7 = (el) => {
22334
+ const translate6 = (el) => {
22335
22335
  if (typeof el.x === "number") el.x -= centerX;
22336
22336
  if (typeof el.y === "number") el.y -= centerY;
22337
22337
  if (el.center) {
@@ -22345,9 +22345,9 @@ var m2host = (raw_params) => {
22345
22345
  }));
22346
22346
  }
22347
22347
  };
22348
- for (const pad2 of pads) translate7(pad2);
22349
- translate7(cutout);
22350
- translate7(pin1Marker);
22348
+ for (const pad2 of pads) translate6(pad2);
22349
+ translate6(cutout);
22350
+ translate6(pin1Marker);
22351
22351
  return {
22352
22352
  circuitJson: [
22353
22353
  ...pads,
@@ -22789,9 +22789,9 @@ function getExpandedStroke(strokeInput, width10) {
22789
22789
  addPoint(current, normalPrev, -1);
22790
22790
  addPoint(current, normalNext, -1);
22791
22791
  } else {
22792
- const scale3 = 1 / miterLength;
22793
- addPoint(current, { x: miterX * scale3, y: miterY * scale3 }, 1);
22794
- addPoint(current, { x: miterX * scale3, y: miterY * scale3 }, -1);
22792
+ const scale2 = 1 / miterLength;
22793
+ addPoint(current, { x: miterX * scale2, y: miterY * scale2 }, 1);
22794
+ addPoint(current, { x: miterX * scale2, y: miterY * scale2 }, -1);
22795
22795
  }
22796
22796
  }
22797
22797
  const lastNormal = getNormal(
@@ -27509,7 +27509,7 @@ var FootprinterModel = ({
27509
27509
  onHover,
27510
27510
  onUnhover,
27511
27511
  isHovered,
27512
- scale: scale3,
27512
+ scale: scale2,
27513
27513
  isTranslucent = false
27514
27514
  }) => {
27515
27515
  const { rootObject } = useThree();
@@ -27549,7 +27549,7 @@ var FootprinterModel = ({
27549
27549
  if (!group) return;
27550
27550
  if (positionOffset) group.position.fromArray(positionOffset);
27551
27551
  if (rotationOffset) group.rotation.fromArray(rotationOffset);
27552
- if (scale3 !== void 0) group.scale.setScalar(scale3);
27552
+ if (scale2 !== void 0) group.scale.setScalar(scale2);
27553
27553
  }, [
27554
27554
  group,
27555
27555
  positionOffset?.[0],
@@ -27558,7 +27558,7 @@ var FootprinterModel = ({
27558
27558
  rotationOffset?.[0],
27559
27559
  rotationOffset?.[1],
27560
27560
  rotationOffset?.[2],
27561
- scale3
27561
+ scale2
27562
27562
  ]);
27563
27563
  useEffect5(() => {
27564
27564
  if (!group) return;
@@ -27627,7 +27627,7 @@ function GltfModel({
27627
27627
  onHover,
27628
27628
  onUnhover,
27629
27629
  isHovered,
27630
- scale: scale3,
27630
+ scale: scale2,
27631
27631
  isTranslucent = false
27632
27632
  }) {
27633
27633
  const { renderer, rootObject } = useThree();
@@ -27675,7 +27675,7 @@ function GltfModel({
27675
27675
  if (!model) return;
27676
27676
  if (position) model.position.fromArray(position);
27677
27677
  if (rotation) model.rotation.fromArray(rotation);
27678
- if (scale3 !== void 0) model.scale.setScalar(scale3);
27678
+ if (scale2 !== void 0) model.scale.setScalar(scale2);
27679
27679
  }, [
27680
27680
  model,
27681
27681
  position?.[0],
@@ -27684,7 +27684,7 @@ function GltfModel({
27684
27684
  rotation?.[0],
27685
27685
  rotation?.[1],
27686
27686
  rotation?.[2],
27687
- scale3
27687
+ scale2
27688
27688
  ]);
27689
27689
  useEffect6(() => {
27690
27690
  if (!rootObject || !model) return;
@@ -27769,7 +27769,7 @@ var JscadModel = ({
27769
27769
  onHover,
27770
27770
  onUnhover,
27771
27771
  isHovered,
27772
- scale: scale3,
27772
+ scale: scale2,
27773
27773
  isTranslucent = false
27774
27774
  }) => {
27775
27775
  const { rootObject } = useThree();
@@ -27803,7 +27803,7 @@ var JscadModel = ({
27803
27803
  if (!mesh) return;
27804
27804
  if (positionOffset) mesh.position.fromArray(positionOffset);
27805
27805
  if (rotationOffset) mesh.rotation.fromArray(rotationOffset);
27806
- if (scale3 !== void 0) mesh.scale.setScalar(scale3);
27806
+ if (scale2 !== void 0) mesh.scale.setScalar(scale2);
27807
27807
  }, [
27808
27808
  mesh,
27809
27809
  positionOffset?.[0],
@@ -27812,7 +27812,7 @@ var JscadModel = ({
27812
27812
  rotationOffset?.[0],
27813
27813
  rotationOffset?.[1],
27814
27814
  rotationOffset?.[2],
27815
- scale3
27815
+ scale2
27816
27816
  ]);
27817
27817
  useMemo6(() => {
27818
27818
  if (!material) return;
@@ -27952,7 +27952,7 @@ function MixedStlModel({
27952
27952
  onHover,
27953
27953
  onUnhover,
27954
27954
  isHovered,
27955
- scale: scale3,
27955
+ scale: scale2,
27956
27956
  isTranslucent = false
27957
27957
  }) {
27958
27958
  const obj = useGlobalObjLoader(url);
@@ -28008,8 +28008,8 @@ function MixedStlModel({
28008
28008
  model.rotation.copy(rotation);
28009
28009
  }
28010
28010
  }
28011
- if (scale3 !== void 0) {
28012
- model.scale.setScalar(scale3);
28011
+ if (scale2 !== void 0) {
28012
+ model.scale.setScalar(scale2);
28013
28013
  }
28014
28014
  }, [
28015
28015
  model,
@@ -28019,7 +28019,7 @@ function MixedStlModel({
28019
28019
  Array.isArray(rotation) ? rotation[0] : rotation?.x,
28020
28020
  Array.isArray(rotation) ? rotation[1] : rotation?.y,
28021
28021
  Array.isArray(rotation) ? rotation[2] : rotation?.z,
28022
- scale3
28022
+ scale2
28023
28023
  ]);
28024
28024
  if (obj instanceof Error) {
28025
28025
  throw obj;
@@ -28181,7 +28181,7 @@ var StepModel = ({
28181
28181
  stepUrl,
28182
28182
  position,
28183
28183
  rotation,
28184
- scale: scale3,
28184
+ scale: scale2,
28185
28185
  onHover,
28186
28186
  onUnhover,
28187
28187
  isHovered,
@@ -28273,7 +28273,7 @@ var StepModel = ({
28273
28273
  gltfUrl: stepGltfUrl,
28274
28274
  position,
28275
28275
  rotation,
28276
- scale: scale3,
28276
+ scale: scale2,
28277
28277
  onHover,
28278
28278
  onUnhover,
28279
28279
  isHovered,
@@ -28483,7 +28483,7 @@ import * as THREE16 from "three";
28483
28483
  // package.json
28484
28484
  var package_default = {
28485
28485
  name: "@tscircuit/3d-viewer",
28486
- version: "0.0.520",
28486
+ version: "0.0.522",
28487
28487
  main: "./dist/index.js",
28488
28488
  module: "./dist/index.js",
28489
28489
  type: "module",
@@ -31169,7 +31169,7 @@ var Text = ({
31169
31169
  parent,
31170
31170
  position,
31171
31171
  rotation,
31172
- scale: scale3,
31172
+ scale: scale2,
31173
31173
  color,
31174
31174
  fontSize,
31175
31175
  anchorX,
@@ -31182,7 +31182,7 @@ var Text = ({
31182
31182
  textMesh.text = children;
31183
31183
  if (position) textMesh.position.fromArray(position);
31184
31184
  if (rotation) textMesh.rotation.fromArray(rotation);
31185
- if (scale3) textMesh.scale.fromArray(scale3);
31185
+ if (scale2) textMesh.scale.fromArray(scale2);
31186
31186
  textMesh.color = color || "white";
31187
31187
  textMesh.fontSize = fontSize || 1;
31188
31188
  textMesh.anchorX = anchorX || "center";
@@ -31195,7 +31195,7 @@ var Text = ({
31195
31195
  children,
31196
31196
  position,
31197
31197
  rotation,
31198
- scale3,
31198
+ scale2,
31199
31199
  color,
31200
31200
  fontSize,
31201
31201
  anchorX,
@@ -31452,221 +31452,7 @@ import { su as su8 } from "@tscircuit/circuit-json-util";
31452
31452
  import { useEffect as useEffect23, useMemo as useMemo19 } from "react";
31453
31453
 
31454
31454
  // src/textures/create-combined-board-textures.ts
31455
- import * as THREE26 from "three";
31456
-
31457
- // src/utils/copper-text-texture.ts
31458
- var import_text = __toESM(require_text(), 1);
31459
- import * as THREE19 from "three";
31460
-
31461
- // node_modules/transformation-matrix/src/applyToPoint.js
31462
- function applyToPoint(matrix, point) {
31463
- return Array.isArray(point) ? [
31464
- matrix.a * point[0] + matrix.c * point[1] + matrix.e,
31465
- matrix.b * point[0] + matrix.d * point[1] + matrix.f
31466
- ] : {
31467
- x: matrix.a * point.x + matrix.c * point.y + matrix.e,
31468
- y: matrix.b * point.x + matrix.d * point.y + matrix.f
31469
- };
31470
- }
31471
-
31472
- // node_modules/transformation-matrix/src/utils.js
31473
- function isUndefined(val) {
31474
- return typeof val === "undefined";
31475
- }
31476
-
31477
- // node_modules/transformation-matrix/src/translate.js
31478
- function translate6(tx, ty = 0) {
31479
- return {
31480
- a: 1,
31481
- c: 0,
31482
- e: tx,
31483
- b: 0,
31484
- d: 1,
31485
- f: ty
31486
- };
31487
- }
31488
-
31489
- // node_modules/transformation-matrix/src/transform.js
31490
- function transform(...matrices) {
31491
- matrices = Array.isArray(matrices[0]) ? matrices[0] : matrices;
31492
- const multiply = (m1, m2) => {
31493
- return {
31494
- a: m1.a * m2.a + m1.c * m2.b,
31495
- c: m1.a * m2.c + m1.c * m2.d,
31496
- e: m1.a * m2.e + m1.c * m2.f + m1.e,
31497
- b: m1.b * m2.a + m1.d * m2.b,
31498
- d: m1.b * m2.c + m1.d * m2.d,
31499
- f: m1.b * m2.e + m1.d * m2.f + m1.f
31500
- };
31501
- };
31502
- switch (matrices.length) {
31503
- case 0:
31504
- throw new Error("no matrices provided");
31505
- case 1:
31506
- return matrices[0];
31507
- case 2:
31508
- return multiply(matrices[0], matrices[1]);
31509
- default: {
31510
- const [m1, m2, ...rest] = matrices;
31511
- const m = multiply(m1, m2);
31512
- return transform(m, ...rest);
31513
- }
31514
- }
31515
- }
31516
- function compose(...matrices) {
31517
- return transform(...matrices);
31518
- }
31519
-
31520
- // node_modules/transformation-matrix/src/rotate.js
31521
- var { cos, sin, PI } = Math;
31522
- function rotate2(angle, cx, cy) {
31523
- const cosAngle = cos(angle);
31524
- const sinAngle = sin(angle);
31525
- const rotationMatrix = {
31526
- a: cosAngle,
31527
- c: -sinAngle,
31528
- e: 0,
31529
- b: sinAngle,
31530
- d: cosAngle,
31531
- f: 0
31532
- };
31533
- if (isUndefined(cx) || isUndefined(cy)) {
31534
- return rotationMatrix;
31535
- }
31536
- return transform([
31537
- translate6(cx, cy),
31538
- rotationMatrix,
31539
- translate6(-cx, -cy)
31540
- ]);
31541
- }
31542
-
31543
- // node_modules/transformation-matrix/src/skew.js
31544
- var { tan } = Math;
31545
-
31546
- // node_modules/transformation-matrix/src/fromTransformAttribute.autogenerated.js
31547
- function peg$subclass(child, parent) {
31548
- function C() {
31549
- this.constructor = child;
31550
- }
31551
- C.prototype = parent.prototype;
31552
- child.prototype = new C();
31553
- }
31554
- function peg$SyntaxError(message, expected, found, location) {
31555
- var self = Error.call(this, message);
31556
- if (Object.setPrototypeOf) {
31557
- Object.setPrototypeOf(self, peg$SyntaxError.prototype);
31558
- }
31559
- self.expected = expected;
31560
- self.found = found;
31561
- self.location = location;
31562
- self.name = "SyntaxError";
31563
- return self;
31564
- }
31565
- peg$subclass(peg$SyntaxError, Error);
31566
- function peg$padEnd(str, targetLength, padString) {
31567
- padString = padString || " ";
31568
- if (str.length > targetLength) {
31569
- return str;
31570
- }
31571
- targetLength -= str.length;
31572
- padString += padString.repeat(targetLength);
31573
- return str + padString.slice(0, targetLength);
31574
- }
31575
- peg$SyntaxError.prototype.format = function(sources) {
31576
- var str = "Error: " + this.message;
31577
- if (this.location) {
31578
- var src = null;
31579
- var k;
31580
- for (k = 0; k < sources.length; k++) {
31581
- if (sources[k].source === this.location.source) {
31582
- src = sources[k].text.split(/\r\n|\n|\r/g);
31583
- break;
31584
- }
31585
- }
31586
- var s = this.location.start;
31587
- var offset_s = this.location.source && typeof this.location.source.offset === "function" ? this.location.source.offset(s) : s;
31588
- var loc = this.location.source + ":" + offset_s.line + ":" + offset_s.column;
31589
- if (src) {
31590
- var e = this.location.end;
31591
- var filler = peg$padEnd("", offset_s.line.toString().length, " ");
31592
- var line = src[s.line - 1];
31593
- var last = s.line === e.line ? e.column : line.length + 1;
31594
- var hatLen = last - s.column || 1;
31595
- str += "\n --> " + loc + "\n" + filler + " |\n" + offset_s.line + " | " + line + "\n" + filler + " | " + peg$padEnd("", s.column - 1, " ") + peg$padEnd("", hatLen, "^");
31596
- } else {
31597
- str += "\n at " + loc;
31598
- }
31599
- }
31600
- return str;
31601
- };
31602
- peg$SyntaxError.buildMessage = function(expected, found) {
31603
- var DESCRIBE_EXPECTATION_FNS = {
31604
- literal: function(expectation) {
31605
- return '"' + literalEscape(expectation.text) + '"';
31606
- },
31607
- class: function(expectation) {
31608
- var escapedParts = expectation.parts.map(function(part) {
31609
- return Array.isArray(part) ? classEscape(part[0]) + "-" + classEscape(part[1]) : classEscape(part);
31610
- });
31611
- return "[" + (expectation.inverted ? "^" : "") + escapedParts.join("") + "]";
31612
- },
31613
- any: function() {
31614
- return "any character";
31615
- },
31616
- end: function() {
31617
- return "end of input";
31618
- },
31619
- other: function(expectation) {
31620
- return expectation.description;
31621
- }
31622
- };
31623
- function hex(ch) {
31624
- return ch.charCodeAt(0).toString(16).toUpperCase();
31625
- }
31626
- function literalEscape(s) {
31627
- return s.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function(ch) {
31628
- return "\\x0" + hex(ch);
31629
- }).replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) {
31630
- return "\\x" + hex(ch);
31631
- });
31632
- }
31633
- function classEscape(s) {
31634
- return s.replace(/\\/g, "\\\\").replace(/\]/g, "\\]").replace(/\^/g, "\\^").replace(/-/g, "\\-").replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function(ch) {
31635
- return "\\x0" + hex(ch);
31636
- }).replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) {
31637
- return "\\x" + hex(ch);
31638
- });
31639
- }
31640
- function describeExpectation(expectation) {
31641
- return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
31642
- }
31643
- function describeExpected(expected2) {
31644
- var descriptions = expected2.map(describeExpectation);
31645
- var i, j;
31646
- descriptions.sort();
31647
- if (descriptions.length > 0) {
31648
- for (i = 1, j = 1; i < descriptions.length; i++) {
31649
- if (descriptions[i - 1] !== descriptions[i]) {
31650
- descriptions[j] = descriptions[i];
31651
- j++;
31652
- }
31653
- }
31654
- descriptions.length = j;
31655
- }
31656
- switch (descriptions.length) {
31657
- case 1:
31658
- return descriptions[0];
31659
- case 2:
31660
- return descriptions[0] + " or " + descriptions[1];
31661
- default:
31662
- return descriptions.slice(0, -1).join(", ") + ", or " + descriptions[descriptions.length - 1];
31663
- }
31664
- }
31665
- function describeFound(found2) {
31666
- return found2 ? '"' + literalEscape(found2) + '"' : "end of input";
31667
- }
31668
- return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
31669
- };
31455
+ import * as THREE27 from "three";
31670
31456
 
31671
31457
  // node_modules/@tscircuit/math-utils/dist/chunk-5N7UJNVK.js
31672
31458
  var getBoundsFromPoints = (points) => {
@@ -31718,257 +31504,9 @@ function calculateOutlineBounds(boardData) {
31718
31504
  };
31719
31505
  }
31720
31506
 
31721
- // src/utils/copper-text-texture.ts
31722
- function parseDimension2(value, defaultValue) {
31723
- if (value === void 0) return defaultValue;
31724
- if (typeof value === "number") return value;
31725
- const num = parseFloat(value.replace(/mm$/, ""));
31726
- return isNaN(num) ? defaultValue : num;
31727
- }
31728
- function shouldMirrorText(text) {
31729
- if (text.layer === "bottom") {
31730
- return text.is_mirrored !== false;
31731
- }
31732
- return text.is_mirrored === true;
31733
- }
31734
- function getTextMetrics(outlines) {
31735
- const points = outlines.flat();
31736
- if (points.length === 0) {
31737
- return {
31738
- minX: 0,
31739
- maxX: 0,
31740
- minY: 0,
31741
- maxY: 0,
31742
- width: 0,
31743
- height: 0,
31744
- centerX: 0,
31745
- centerY: 0
31746
- };
31747
- }
31748
- const minX = Math.min(...points.map((p) => p[0]));
31749
- const maxX = Math.max(...points.map((p) => p[0]));
31750
- const minY = Math.min(...points.map((p) => p[1]));
31751
- const maxY = Math.max(...points.map((p) => p[1]));
31752
- return {
31753
- minX,
31754
- maxX,
31755
- minY,
31756
- maxY,
31757
- width: maxX - minX,
31758
- height: maxY - minY,
31759
- centerX: (minX + maxX) / 2,
31760
- centerY: (minY + maxY) / 2
31761
- };
31762
- }
31763
- function processTextOutlines(rawOutlines) {
31764
- const processed = [];
31765
- rawOutlines.forEach((outline) => {
31766
- if (outline.length === 29) {
31767
- processed.push(outline.slice(0, 15));
31768
- processed.push(outline.slice(14, 29));
31769
- } else if (outline.length === 17) {
31770
- processed.push(outline.slice(0, 10));
31771
- processed.push(outline.slice(9, 17));
31772
- } else {
31773
- processed.push(outline);
31774
- }
31775
- });
31776
- return processed;
31777
- }
31778
- function getAlignmentOffset(metrics, alignment) {
31779
- let xOff = -metrics.centerX;
31780
- let yOff = -metrics.centerY;
31781
- if (alignment.includes("left")) {
31782
- xOff = -metrics.minX;
31783
- } else if (alignment.includes("right")) {
31784
- xOff = -metrics.maxX;
31785
- }
31786
- if (alignment.includes("top")) {
31787
- yOff = -metrics.maxY;
31788
- } else if (alignment.includes("bottom")) {
31789
- yOff = -metrics.minY;
31790
- }
31791
- return { x: xOff, y: yOff };
31792
- }
31793
- function buildTransformMatrix(text, metrics) {
31794
- const transformMatrices = [];
31795
- let rotationDeg = text.ccw_rotation ?? 0;
31796
- const shouldMirror = shouldMirrorText(text);
31797
- if (shouldMirror) {
31798
- transformMatrices.push(
31799
- translate6(metrics.centerX, metrics.centerY),
31800
- { a: -1, b: 0, c: 0, d: 1, e: 0, f: 0 },
31801
- // horizontal flip
31802
- translate6(-metrics.centerX, -metrics.centerY)
31803
- );
31804
- rotationDeg = -rotationDeg;
31805
- }
31806
- if (rotationDeg) {
31807
- const rad = rotationDeg * Math.PI / 180;
31808
- transformMatrices.push(
31809
- translate6(metrics.centerX, metrics.centerY),
31810
- rotate2(rad),
31811
- translate6(-metrics.centerX, -metrics.centerY)
31812
- );
31813
- }
31814
- const matrix = transformMatrices.length > 0 ? compose(...transformMatrices) : void 0;
31815
- return { matrix, rotationDeg };
31816
- }
31817
- function drawTextStrokes(ctx, outlines, transform2, offset4, anchorPos, canvasXFromPcb, canvasYFromPcb) {
31818
- outlines.forEach((segment) => {
31819
- ctx.beginPath();
31820
- segment.forEach((p, index2) => {
31821
- let transformedP = { x: p[0], y: p[1] };
31822
- if (transform2) {
31823
- transformedP = applyToPoint(transform2, transformedP);
31824
- }
31825
- const pcbX = transformedP.x + offset4.x + anchorPos.x;
31826
- const pcbY = transformedP.y + offset4.y + anchorPos.y;
31827
- const canvasX = canvasXFromPcb(pcbX);
31828
- const canvasY = canvasYFromPcb(pcbY);
31829
- if (index2 === 0) ctx.moveTo(canvasX, canvasY);
31830
- else ctx.lineTo(canvasX, canvasY);
31831
- });
31832
- ctx.stroke();
31833
- });
31834
- }
31835
- function drawRotatedRect(ctx, centerX, centerY, width10, height10, rotationRad) {
31836
- ctx.save();
31837
- ctx.translate(centerX, centerY);
31838
- ctx.rotate(-rotationRad);
31839
- ctx.fillRect(-width10 / 2, -height10 / 2, width10, height10);
31840
- ctx.restore();
31841
- }
31842
- function drawKnockoutText(ctx, text, outlines, metrics, transform2, rotationDeg, canvasXFromPcb, canvasYFromPcb, traceTextureResolution, copperColor) {
31843
- const fontSize = typeof text.font_size === "number" ? text.font_size : 0.2;
31844
- const padding = {
31845
- left: parseDimension2(text.knockout_padding?.left, fontSize * 0.5),
31846
- right: parseDimension2(text.knockout_padding?.right, fontSize * 0.5),
31847
- top: parseDimension2(text.knockout_padding?.top, fontSize * 0.3),
31848
- bottom: parseDimension2(text.knockout_padding?.bottom, fontSize * 0.3)
31849
- };
31850
- const rectWidth = metrics.width + padding.left + padding.right;
31851
- const rectHeight = metrics.height + padding.top + padding.bottom;
31852
- const rectCenterCanvasX = canvasXFromPcb(text.anchor_position.x);
31853
- const rectCenterCanvasY = canvasYFromPcb(text.anchor_position.y);
31854
- const rectWidthPx = rectWidth * traceTextureResolution;
31855
- const rectHeightPx = rectHeight * traceTextureResolution;
31856
- ctx.fillStyle = copperColor;
31857
- const rotationRad = rotationDeg * Math.PI / 180;
31858
- drawRotatedRect(
31859
- ctx,
31860
- rectCenterCanvasX,
31861
- rectCenterCanvasY,
31862
- rectWidthPx,
31863
- rectHeightPx,
31864
- rotationRad
31865
- );
31866
- const textOffset = {
31867
- x: -metrics.centerX,
31868
- y: -metrics.centerY
31869
- };
31870
- ctx.globalCompositeOperation = "destination-out";
31871
- drawTextStrokes(
31872
- ctx,
31873
- outlines,
31874
- transform2,
31875
- textOffset,
31876
- text.anchor_position,
31877
- canvasXFromPcb,
31878
- canvasYFromPcb
31879
- );
31880
- ctx.globalCompositeOperation = "source-over";
31881
- }
31882
- function createCopperTextTextureForLayer({
31883
- layer,
31884
- circuitJson,
31885
- boardData,
31886
- copperColor = "rgb(230, 153, 51)",
31887
- // Same as colors.copper [0.9, 0.6, 0.2]
31888
- traceTextureResolution
31889
- }) {
31890
- const copperTexts = circuitJson.filter(
31891
- (e) => e.type === "pcb_copper_text"
31892
- );
31893
- const textsOnLayer = copperTexts.filter((t) => t.layer === layer);
31894
- if (textsOnLayer.length === 0) {
31895
- return null;
31896
- }
31897
- const boardOutlineBounds = calculateOutlineBounds(boardData);
31898
- const canvas = document.createElement("canvas");
31899
- const canvasWidth = Math.floor(
31900
- boardOutlineBounds.width * traceTextureResolution
31901
- );
31902
- const canvasHeight = Math.floor(
31903
- boardOutlineBounds.height * traceTextureResolution
31904
- );
31905
- canvas.width = canvasWidth;
31906
- canvas.height = canvasHeight;
31907
- const ctx = canvas.getContext("2d");
31908
- if (!ctx) return null;
31909
- if (layer === "bottom") {
31910
- ctx.translate(0, canvasHeight);
31911
- ctx.scale(1, -1);
31912
- }
31913
- ctx.strokeStyle = copperColor;
31914
- ctx.fillStyle = copperColor;
31915
- const canvasXFromPcb = (pcbX) => (pcbX - boardOutlineBounds.minX) * traceTextureResolution;
31916
- const canvasYFromPcb = (pcbY) => (boardOutlineBounds.maxY - pcbY) * traceTextureResolution;
31917
- textsOnLayer.forEach((textS) => {
31918
- const fontSize = typeof textS.font_size === "number" ? textS.font_size : 0.2;
31919
- const textStrokeWidth = Math.max(0.02, fontSize * 0.08) * traceTextureResolution;
31920
- ctx.lineWidth = textStrokeWidth;
31921
- ctx.lineCap = "round";
31922
- ctx.lineJoin = "round";
31923
- const rawTextOutlines = (0, import_text.vectorText)({
31924
- height: fontSize * 0.45,
31925
- input: textS.text
31926
- });
31927
- const processedOutlines = processTextOutlines(rawTextOutlines);
31928
- const metrics = getTextMetrics(processedOutlines);
31929
- const { matrix: transform2, rotationDeg } = buildTransformMatrix(
31930
- textS,
31931
- metrics
31932
- );
31933
- if (textS.is_knockout) {
31934
- drawKnockoutText(
31935
- ctx,
31936
- textS,
31937
- processedOutlines,
31938
- metrics,
31939
- transform2,
31940
- rotationDeg,
31941
- canvasXFromPcb,
31942
- canvasYFromPcb,
31943
- traceTextureResolution,
31944
- copperColor
31945
- );
31946
- } else {
31947
- const alignment = textS.anchor_alignment || "center";
31948
- const offset4 = getAlignmentOffset(metrics, alignment);
31949
- drawTextStrokes(
31950
- ctx,
31951
- processedOutlines,
31952
- transform2,
31953
- offset4,
31954
- textS.anchor_position,
31955
- canvasXFromPcb,
31956
- canvasYFromPcb
31957
- );
31958
- }
31959
- });
31960
- const texture = new THREE19.CanvasTexture(canvas);
31961
- texture.generateMipmaps = true;
31962
- texture.minFilter = THREE19.LinearMipmapLinearFilter;
31963
- texture.magFilter = THREE19.LinearFilter;
31964
- texture.anisotropy = 16;
31965
- texture.needsUpdate = true;
31966
- return texture;
31967
- }
31968
-
31969
31507
  // src/utils/pad-texture.ts
31970
31508
  import { su as su5 } from "@tscircuit/circuit-json-util";
31971
- import * as THREE20 from "three";
31509
+ import * as THREE19 from "three";
31972
31510
  function createPadTextureForLayer({
31973
31511
  layer,
31974
31512
  circuitJson,
@@ -32091,17 +31629,17 @@ function createPadTextureForLayer({
32091
31629
  ctx.restore();
32092
31630
  }
32093
31631
  });
32094
- const texture = new THREE20.CanvasTexture(canvas);
31632
+ const texture = new THREE19.CanvasTexture(canvas);
32095
31633
  texture.generateMipmaps = true;
32096
- texture.minFilter = THREE20.LinearMipmapLinearFilter;
32097
- texture.magFilter = THREE20.LinearFilter;
31634
+ texture.minFilter = THREE19.LinearMipmapLinearFilter;
31635
+ texture.magFilter = THREE19.LinearFilter;
32098
31636
  texture.anisotropy = 16;
32099
31637
  texture.needsUpdate = true;
32100
31638
  return texture;
32101
31639
  }
32102
31640
 
32103
31641
  // src/utils/panel-outline-texture.ts
32104
- import * as THREE21 from "three";
31642
+ import * as THREE20 from "three";
32105
31643
  import { su as su6 } from "@tscircuit/circuit-json-util";
32106
31644
  function createPanelOutlineTextureForLayer({
32107
31645
  layer,
@@ -32157,17 +31695,17 @@ function createPanelOutlineTextureForLayer({
32157
31695
  );
32158
31696
  }
32159
31697
  });
32160
- const texture = new THREE21.CanvasTexture(canvas);
31698
+ const texture = new THREE20.CanvasTexture(canvas);
32161
31699
  texture.generateMipmaps = true;
32162
- texture.minFilter = THREE21.LinearMipmapLinearFilter;
32163
- texture.magFilter = THREE21.LinearFilter;
31700
+ texture.minFilter = THREE20.LinearMipmapLinearFilter;
31701
+ texture.magFilter = THREE20.LinearFilter;
32164
31702
  texture.anisotropy = 16;
32165
31703
  texture.needsUpdate = true;
32166
31704
  return texture;
32167
31705
  }
32168
31706
 
32169
31707
  // src/utils/trace-texture.ts
32170
- import * as THREE22 from "three";
31708
+ import * as THREE21 from "three";
32171
31709
  import { su as su7 } from "@tscircuit/circuit-json-util";
32172
31710
  function isWireRoutePoint(point) {
32173
31711
  return point && point.route_type === "wire" && typeof point.layer === "string" && typeof point.width === "number";
@@ -32280,6 +31818,127 @@ function createTraceTextureForLayer({
32280
31818
  }
32281
31819
  });
32282
31820
  ctx.globalCompositeOperation = "source-over";
31821
+ const texture = new THREE21.CanvasTexture(canvas);
31822
+ texture.generateMipmaps = true;
31823
+ texture.minFilter = THREE21.LinearMipmapLinearFilter;
31824
+ texture.magFilter = THREE21.LinearFilter;
31825
+ texture.anisotropy = 16;
31826
+ texture.needsUpdate = true;
31827
+ return texture;
31828
+ }
31829
+
31830
+ // src/textures/create-copper-text-texture-for-layer.ts
31831
+ import * as THREE22 from "three";
31832
+
31833
+ // src/textures/copper-text/copper-text-drawing.ts
31834
+ import { CircuitToCanvasDrawer } from "circuit-to-canvas";
31835
+ var setDrawerBounds = (drawer, bounds) => {
31836
+ drawer.setCameraBounds({
31837
+ minX: bounds.minX,
31838
+ maxX: bounds.maxX,
31839
+ minY: bounds.minY,
31840
+ maxY: bounds.maxY
31841
+ });
31842
+ };
31843
+ var drawCopperTextLayer = ({
31844
+ ctx,
31845
+ layer,
31846
+ bounds,
31847
+ elements,
31848
+ copperColor
31849
+ }) => {
31850
+ const renderLayer = layer === "top" ? "top_copper" : "bottom_copper";
31851
+ const drawer = new CircuitToCanvasDrawer(ctx);
31852
+ drawer.configure({
31853
+ colorOverrides: {
31854
+ copper: {
31855
+ top: copperColor,
31856
+ bottom: copperColor,
31857
+ inner1: copperColor,
31858
+ inner2: copperColor,
31859
+ inner3: copperColor,
31860
+ inner4: copperColor,
31861
+ inner5: copperColor,
31862
+ inner6: copperColor
31863
+ }
31864
+ }
31865
+ });
31866
+ setDrawerBounds(drawer, bounds);
31867
+ drawer.drawElements(elements, {
31868
+ layers: [renderLayer]
31869
+ });
31870
+ const knockoutTexts = elements.filter(
31871
+ (element) => element.type === "pcb_copper_text" && element.is_knockout === true
31872
+ );
31873
+ if (knockoutTexts.length === 0) return;
31874
+ const maskCanvas = document.createElement("canvas");
31875
+ maskCanvas.width = ctx.canvas.width;
31876
+ maskCanvas.height = ctx.canvas.height;
31877
+ const maskCtx = maskCanvas.getContext("2d");
31878
+ if (!maskCtx) return;
31879
+ const knockoutCutoutDrawer = new CircuitToCanvasDrawer(maskCtx);
31880
+ knockoutCutoutDrawer.configure({
31881
+ colorOverrides: {
31882
+ copper: {
31883
+ top: "rgb(255,255,255)",
31884
+ bottom: "rgb(255,255,255)",
31885
+ inner1: "rgb(255,255,255)",
31886
+ inner2: "rgb(255,255,255)",
31887
+ inner3: "rgb(255,255,255)",
31888
+ inner4: "rgb(255,255,255)",
31889
+ inner5: "rgb(255,255,255)",
31890
+ inner6: "rgb(255,255,255)"
31891
+ }
31892
+ }
31893
+ });
31894
+ setDrawerBounds(knockoutCutoutDrawer, bounds);
31895
+ knockoutCutoutDrawer.drawElements(
31896
+ knockoutTexts.map((text) => ({
31897
+ ...text,
31898
+ is_knockout: false
31899
+ })),
31900
+ {
31901
+ layers: [renderLayer]
31902
+ }
31903
+ );
31904
+ ctx.save();
31905
+ ctx.globalCompositeOperation = "destination-out";
31906
+ ctx.drawImage(maskCanvas, 0, 0);
31907
+ ctx.restore();
31908
+ };
31909
+
31910
+ // src/textures/create-copper-text-texture-for-layer.ts
31911
+ function createCopperTextTextureForLayer({
31912
+ layer,
31913
+ circuitJson,
31914
+ boardData,
31915
+ copperColor = "rgb(230, 153, 51)",
31916
+ traceTextureResolution = TRACE_TEXTURE_RESOLUTION
31917
+ }) {
31918
+ const elements = circuitJson.filter(
31919
+ (element) => element.type === "pcb_copper_text" && "layer" in element && element.layer === layer
31920
+ );
31921
+ if (elements.length === 0) return null;
31922
+ const bounds = calculateOutlineBounds(boardData);
31923
+ const canvasWidth = Math.floor(bounds.width * traceTextureResolution);
31924
+ const canvasHeight = Math.floor(bounds.height * traceTextureResolution);
31925
+ if (canvasWidth <= 0 || canvasHeight <= 0) return null;
31926
+ const canvas = document.createElement("canvas");
31927
+ canvas.width = canvasWidth;
31928
+ canvas.height = canvasHeight;
31929
+ const ctx = canvas.getContext("2d");
31930
+ if (!ctx) return null;
31931
+ if (layer === "bottom") {
31932
+ ctx.translate(0, canvasHeight);
31933
+ ctx.scale(1, -1);
31934
+ }
31935
+ drawCopperTextLayer({
31936
+ ctx,
31937
+ layer,
31938
+ bounds,
31939
+ elements,
31940
+ copperColor
31941
+ });
32283
31942
  const texture = new THREE22.CanvasTexture(canvas);
32284
31943
  texture.generateMipmaps = true;
32285
31944
  texture.minFilter = THREE22.LinearMipmapLinearFilter;
@@ -32291,7 +31950,7 @@ function createTraceTextureForLayer({
32291
31950
 
32292
31951
  // src/textures/create-copper-pour-texture-for-layer.ts
32293
31952
  import * as THREE23 from "three";
32294
- import { CircuitToCanvasDrawer } from "circuit-to-canvas";
31953
+ import { CircuitToCanvasDrawer as CircuitToCanvasDrawer2 } from "circuit-to-canvas";
32295
31954
 
32296
31955
  // src/geoms/brep-converter.ts
32297
31956
  var import_primitives7 = __toESM(require_primitives(), 1);
@@ -32439,7 +32098,7 @@ function createCopperPourTextureForLayer({
32439
32098
  );
32440
32099
  const brepPours = poursOnLayer.filter((pour) => pour.shape === "brep");
32441
32100
  if (rectAndPolygonPours.length > 0) {
32442
- const drawer = new CircuitToCanvasDrawer(ctx);
32101
+ const drawer = new CircuitToCanvasDrawer2(ctx);
32443
32102
  drawer.setCameraBounds({
32444
32103
  minX: boardOutlineBounds.minX,
32445
32104
  maxX: boardOutlineBounds.maxX,
@@ -32505,9 +32164,158 @@ function createCopperPourTextureForLayer({
32505
32164
  return texture;
32506
32165
  }
32507
32166
 
32508
- // src/textures/create-silkscreen-texture-for-layer.ts
32167
+ // src/textures/create-fabrication-note-texture-for-layer.ts
32509
32168
  import * as THREE24 from "three";
32510
32169
 
32170
+ // src/textures/fabrication-note/fabrication-note-drawing.ts
32171
+ import { CircuitToCanvasDrawer as CircuitToCanvasDrawer3 } from "circuit-to-canvas";
32172
+
32173
+ // src/utils/units.ts
32174
+ var MM_PER_INCH = 25.4;
32175
+ var MM_PER_MIL = MM_PER_INCH / 1e3;
32176
+ var dimensionRegex = /^\s*(-?\d*(?:\.\d+)?)(?:\s*(mm|mil|inch|in|"))?\s*$/i;
32177
+ function normalizeUnit(unit) {
32178
+ if (!unit) return void 0;
32179
+ const normalized = unit.trim().toLowerCase();
32180
+ if (normalized === '"') return "in";
32181
+ if (normalized === "inch") return "in";
32182
+ return normalized;
32183
+ }
32184
+ function parseDimensionToMm(value) {
32185
+ if (value === null || value === void 0) return void 0;
32186
+ if (typeof value === "number") {
32187
+ return Number.isFinite(value) ? value : void 0;
32188
+ }
32189
+ if (typeof value !== "string") return void 0;
32190
+ const trimmed = value.trim();
32191
+ if (trimmed.length === 0) return void 0;
32192
+ const match = trimmed.match(dimensionRegex);
32193
+ if (!match) {
32194
+ const numeric = Number.parseFloat(trimmed);
32195
+ return Number.isFinite(numeric) ? numeric : void 0;
32196
+ }
32197
+ const [, magnitudeRaw, unitRaw] = match;
32198
+ const magnitude = Number.parseFloat(magnitudeRaw || "0");
32199
+ if (!Number.isFinite(magnitude)) return void 0;
32200
+ const unit = normalizeUnit(unitRaw);
32201
+ switch (unit) {
32202
+ case "mil":
32203
+ return magnitude * MM_PER_MIL;
32204
+ case "in":
32205
+ return magnitude * MM_PER_INCH;
32206
+ case "mm":
32207
+ case void 0:
32208
+ return magnitude;
32209
+ default:
32210
+ return magnitude;
32211
+ }
32212
+ }
32213
+ function coerceDimensionToMm(value, fallback) {
32214
+ const parsed = parseDimensionToMm(value);
32215
+ return parsed === void 0 ? fallback : parsed;
32216
+ }
32217
+
32218
+ // src/textures/fabrication-note/fabrication-note-drawing.ts
32219
+ var FABRICATION_NOTE_COLOR = "rgb(255,243,204)";
32220
+ var TRANSPARENT = "rgba(0,0,0,0)";
32221
+ var setDrawerBounds2 = (drawer, bounds) => {
32222
+ drawer.setCameraBounds({
32223
+ minX: bounds.minX,
32224
+ maxX: bounds.maxX,
32225
+ minY: bounds.minY,
32226
+ maxY: bounds.maxY
32227
+ });
32228
+ };
32229
+ var normalizeFabricationElement = (element) => {
32230
+ if (element.type === "pcb_fabrication_note_rect") {
32231
+ return {
32232
+ ...element,
32233
+ width: parseDimensionToMm(element.width) ?? 0,
32234
+ height: parseDimensionToMm(element.height) ?? 0,
32235
+ stroke_width: coerceDimensionToMm(element.stroke_width, 0.1),
32236
+ corner_radius: parseDimensionToMm(element.corner_radius)
32237
+ };
32238
+ }
32239
+ if (element.type === "pcb_fabrication_note_path") {
32240
+ return {
32241
+ ...element,
32242
+ stroke_width: coerceDimensionToMm(element.stroke_width, 0.1)
32243
+ };
32244
+ }
32245
+ if (element.type === "pcb_fabrication_note_text") {
32246
+ return {
32247
+ ...element,
32248
+ font_size: coerceDimensionToMm(element.font_size, 1)
32249
+ };
32250
+ }
32251
+ if (element.type === "pcb_fabrication_note_dimension") {
32252
+ return {
32253
+ ...element,
32254
+ font_size: coerceDimensionToMm(element.font_size, 1),
32255
+ arrow_size: coerceDimensionToMm(element.arrow_size, 1),
32256
+ offset_distance: coerceDimensionToMm(element.offset_distance, 0)
32257
+ };
32258
+ }
32259
+ return element;
32260
+ };
32261
+ var drawFabricationNoteLayer = ({
32262
+ ctx,
32263
+ layer,
32264
+ bounds,
32265
+ elements
32266
+ }) => {
32267
+ const renderLayer = `${layer}_fabrication_note`;
32268
+ const normalizedElements = elements.map(normalizeFabricationElement);
32269
+ const drawer = new CircuitToCanvasDrawer3(ctx);
32270
+ drawer.configure({
32271
+ colorOverrides: {
32272
+ copper: {
32273
+ top: TRANSPARENT,
32274
+ bottom: TRANSPARENT,
32275
+ inner1: TRANSPARENT,
32276
+ inner2: TRANSPARENT,
32277
+ inner3: TRANSPARENT,
32278
+ inner4: TRANSPARENT,
32279
+ inner5: TRANSPARENT,
32280
+ inner6: TRANSPARENT
32281
+ },
32282
+ copperPour: {
32283
+ top: TRANSPARENT,
32284
+ bottom: TRANSPARENT
32285
+ },
32286
+ drill: TRANSPARENT,
32287
+ boardOutline: TRANSPARENT,
32288
+ substrate: TRANSPARENT,
32289
+ keepout: TRANSPARENT,
32290
+ courtyard: {
32291
+ top: TRANSPARENT,
32292
+ bottom: TRANSPARENT
32293
+ },
32294
+ soldermask: {
32295
+ top: TRANSPARENT,
32296
+ bottom: TRANSPARENT
32297
+ },
32298
+ soldermaskWithCopperUnderneath: {
32299
+ top: TRANSPARENT,
32300
+ bottom: TRANSPARENT
32301
+ },
32302
+ soldermaskOverCopper: {
32303
+ top: TRANSPARENT,
32304
+ bottom: TRANSPARENT
32305
+ },
32306
+ silkscreen: {
32307
+ top: TRANSPARENT,
32308
+ bottom: TRANSPARENT
32309
+ },
32310
+ fabricationNote: FABRICATION_NOTE_COLOR
32311
+ }
32312
+ });
32313
+ setDrawerBounds2(drawer, bounds);
32314
+ drawer.drawElements(normalizedElements, {
32315
+ layers: [renderLayer]
32316
+ });
32317
+ };
32318
+
32511
32319
  // src/textures/soldermask/soldermask-bounds.ts
32512
32320
  var boundsFromPanel = (panel) => ({
32513
32321
  minX: panel.center.x - panel.width / 2,
@@ -32550,11 +32358,57 @@ var getSoldermaskRenderBounds = (circuitJson, boardData) => {
32550
32358
  return boardsForBounds.map((board) => calculateOutlineBounds(board)).reduce((acc, bounds) => mergeBounds(acc, bounds));
32551
32359
  };
32552
32360
 
32361
+ // src/textures/create-fabrication-note-texture-for-layer.ts
32362
+ var isFabricationNoteElement = (element, layer) => {
32363
+ if (!("layer" in element) || element.layer !== layer) return false;
32364
+ return element.type.startsWith("pcb_fabrication_note_");
32365
+ };
32366
+ function createFabricationNoteTextureForLayer({
32367
+ layer,
32368
+ circuitJson,
32369
+ boardData,
32370
+ traceTextureResolution = TRACE_TEXTURE_RESOLUTION
32371
+ }) {
32372
+ const elements = circuitJson.filter(
32373
+ (element) => isFabricationNoteElement(element, layer)
32374
+ );
32375
+ if (elements.length === 0) return null;
32376
+ const bounds = getSoldermaskRenderBounds(circuitJson, boardData);
32377
+ const canvasWidth = Math.floor(bounds.width * traceTextureResolution);
32378
+ const canvasHeight = Math.floor(bounds.height * traceTextureResolution);
32379
+ if (canvasWidth <= 0 || canvasHeight <= 0) return null;
32380
+ const canvas = document.createElement("canvas");
32381
+ canvas.width = canvasWidth;
32382
+ canvas.height = canvasHeight;
32383
+ const ctx = canvas.getContext("2d");
32384
+ if (!ctx) return null;
32385
+ if (layer === "bottom") {
32386
+ ctx.translate(0, canvasHeight);
32387
+ ctx.scale(1, -1);
32388
+ }
32389
+ drawFabricationNoteLayer({
32390
+ ctx,
32391
+ layer,
32392
+ bounds,
32393
+ elements
32394
+ });
32395
+ const texture = new THREE24.CanvasTexture(canvas);
32396
+ texture.generateMipmaps = true;
32397
+ texture.minFilter = THREE24.LinearMipmapLinearFilter;
32398
+ texture.magFilter = THREE24.LinearFilter;
32399
+ texture.anisotropy = 16;
32400
+ texture.needsUpdate = true;
32401
+ return texture;
32402
+ }
32403
+
32404
+ // src/textures/create-silkscreen-texture-for-layer.ts
32405
+ import * as THREE25 from "three";
32406
+
32553
32407
  // src/textures/silkscreen/silkscreen-drawing.ts
32554
- import { CircuitToCanvasDrawer as CircuitToCanvasDrawer2 } from "circuit-to-canvas";
32555
- var FABRICATION_NOTE_COLOR = "rgb(255,243,204)";
32556
- var TRANSPARENT = "rgba(0,0,0,0)";
32557
- var setDrawerBounds = (drawer, bounds) => {
32408
+ import { CircuitToCanvasDrawer as CircuitToCanvasDrawer4 } from "circuit-to-canvas";
32409
+ var FABRICATION_NOTE_COLOR2 = "rgb(255,243,204)";
32410
+ var TRANSPARENT2 = "rgba(0,0,0,0)";
32411
+ var setDrawerBounds3 = (drawer, bounds) => {
32558
32412
  drawer.setCameraBounds({
32559
32413
  minX: bounds.minX,
32560
32414
  maxX: bounds.maxX,
@@ -32570,51 +32424,51 @@ var drawSilkscreenLayer = ({
32570
32424
  silkscreenColor
32571
32425
  }) => {
32572
32426
  const renderLayer = layer === "top" ? "top_silkscreen" : "bottom_silkscreen";
32573
- const drawer = new CircuitToCanvasDrawer2(ctx);
32427
+ const drawer = new CircuitToCanvasDrawer4(ctx);
32574
32428
  drawer.configure({
32575
32429
  colorOverrides: {
32576
32430
  copper: {
32577
- top: TRANSPARENT,
32578
- bottom: TRANSPARENT,
32579
- inner1: TRANSPARENT,
32580
- inner2: TRANSPARENT,
32581
- inner3: TRANSPARENT,
32582
- inner4: TRANSPARENT,
32583
- inner5: TRANSPARENT,
32584
- inner6: TRANSPARENT
32431
+ top: TRANSPARENT2,
32432
+ bottom: TRANSPARENT2,
32433
+ inner1: TRANSPARENT2,
32434
+ inner2: TRANSPARENT2,
32435
+ inner3: TRANSPARENT2,
32436
+ inner4: TRANSPARENT2,
32437
+ inner5: TRANSPARENT2,
32438
+ inner6: TRANSPARENT2
32585
32439
  },
32586
32440
  copperPour: {
32587
- top: TRANSPARENT,
32588
- bottom: TRANSPARENT
32441
+ top: TRANSPARENT2,
32442
+ bottom: TRANSPARENT2
32589
32443
  },
32590
- drill: TRANSPARENT,
32591
- boardOutline: TRANSPARENT,
32592
- substrate: TRANSPARENT,
32593
- keepout: TRANSPARENT,
32444
+ drill: TRANSPARENT2,
32445
+ boardOutline: TRANSPARENT2,
32446
+ substrate: TRANSPARENT2,
32447
+ keepout: TRANSPARENT2,
32594
32448
  courtyard: {
32595
- top: TRANSPARENT,
32596
- bottom: TRANSPARENT
32449
+ top: TRANSPARENT2,
32450
+ bottom: TRANSPARENT2
32597
32451
  },
32598
32452
  soldermask: {
32599
- top: TRANSPARENT,
32600
- bottom: TRANSPARENT
32453
+ top: TRANSPARENT2,
32454
+ bottom: TRANSPARENT2
32601
32455
  },
32602
32456
  soldermaskWithCopperUnderneath: {
32603
- top: TRANSPARENT,
32604
- bottom: TRANSPARENT
32457
+ top: TRANSPARENT2,
32458
+ bottom: TRANSPARENT2
32605
32459
  },
32606
32460
  soldermaskOverCopper: {
32607
- top: TRANSPARENT,
32608
- bottom: TRANSPARENT
32461
+ top: TRANSPARENT2,
32462
+ bottom: TRANSPARENT2
32609
32463
  },
32610
32464
  silkscreen: {
32611
32465
  top: silkscreenColor,
32612
32466
  bottom: silkscreenColor
32613
32467
  },
32614
- fabricationNote: FABRICATION_NOTE_COLOR
32468
+ fabricationNote: FABRICATION_NOTE_COLOR2
32615
32469
  }
32616
32470
  });
32617
- setDrawerBounds(drawer, bounds);
32471
+ setDrawerBounds3(drawer, bounds);
32618
32472
  drawer.drawElements(elements, {
32619
32473
  layers: [renderLayer]
32620
32474
  });
@@ -32624,7 +32478,7 @@ var drawSilkscreenLayer = ({
32624
32478
  var isSilkscreenElement = (element, layer) => {
32625
32479
  if (!("layer" in element) || element.layer !== layer) return false;
32626
32480
  const elementType = element.type;
32627
- return elementType.startsWith("pcb_silkscreen_") || elementType === "pcb_fabrication_note_rect" || elementType === "pcb_note_line";
32481
+ return elementType.startsWith("pcb_silkscreen_") || elementType === "pcb_note_line";
32628
32482
  };
32629
32483
  function createSilkscreenTextureForLayer({
32630
32484
  layer,
@@ -32657,20 +32511,20 @@ function createSilkscreenTextureForLayer({
32657
32511
  elements,
32658
32512
  silkscreenColor
32659
32513
  });
32660
- const texture = new THREE24.CanvasTexture(canvas);
32514
+ const texture = new THREE25.CanvasTexture(canvas);
32661
32515
  texture.generateMipmaps = true;
32662
- texture.minFilter = THREE24.LinearMipmapLinearFilter;
32663
- texture.magFilter = THREE24.LinearFilter;
32516
+ texture.minFilter = THREE25.LinearMipmapLinearFilter;
32517
+ texture.magFilter = THREE25.LinearFilter;
32664
32518
  texture.anisotropy = 16;
32665
32519
  texture.needsUpdate = true;
32666
32520
  return texture;
32667
32521
  }
32668
32522
 
32669
32523
  // src/textures/create-soldermask-texture-for-layer.ts
32670
- import * as THREE25 from "three";
32524
+ import * as THREE26 from "three";
32671
32525
 
32672
32526
  // src/textures/soldermask/soldermask-drawing.ts
32673
- import { CircuitToCanvasDrawer as CircuitToCanvasDrawer3 } from "circuit-to-canvas";
32527
+ import { CircuitToCanvasDrawer as CircuitToCanvasDrawer5 } from "circuit-to-canvas";
32674
32528
  var toRgb = (colorArr) => {
32675
32529
  const [r = 0, g = 0, b = 0] = colorArr;
32676
32530
  return `rgb(${Math.round(r * 255)}, ${Math.round(g * 255)}, ${Math.round(
@@ -32689,7 +32543,7 @@ var getSoldermaskPalette = (material) => {
32689
32543
  transparent: "rgba(0,0,0,0)"
32690
32544
  };
32691
32545
  };
32692
- var setDrawerBounds2 = (drawer, bounds) => {
32546
+ var setDrawerBounds4 = (drawer, bounds) => {
32693
32547
  drawer.setCameraBounds({
32694
32548
  minX: bounds.minX,
32695
32549
  maxX: bounds.maxX,
@@ -32706,7 +32560,7 @@ var drawSoldermaskLayer = ({
32706
32560
  }) => {
32707
32561
  const palette = getSoldermaskPalette(boardMaterial);
32708
32562
  const copperRenderLayer = layer === "top" ? "top_copper" : "bottom_copper";
32709
- const drawer = new CircuitToCanvasDrawer3(ctx);
32563
+ const drawer = new CircuitToCanvasDrawer5(ctx);
32710
32564
  drawer.configure({
32711
32565
  colorOverrides: {
32712
32566
  copper: {
@@ -32737,7 +32591,7 @@ var drawSoldermaskLayer = ({
32737
32591
  }
32738
32592
  }
32739
32593
  });
32740
- setDrawerBounds2(drawer, bounds);
32594
+ setDrawerBounds4(drawer, bounds);
32741
32595
  drawer.drawElements(elements, {
32742
32596
  layers: [copperRenderLayer],
32743
32597
  drawSoldermask: true,
@@ -32750,7 +32604,7 @@ var drawSoldermaskLayer = ({
32750
32604
  if (uncoveredPours.length > 0) {
32751
32605
  ctx.save();
32752
32606
  ctx.globalCompositeOperation = "destination-out";
32753
- const cutoutDrawer = new CircuitToCanvasDrawer3(ctx);
32607
+ const cutoutDrawer = new CircuitToCanvasDrawer5(ctx);
32754
32608
  cutoutDrawer.configure({
32755
32609
  colorOverrides: {
32756
32610
  copper: {
@@ -32765,7 +32619,7 @@ var drawSoldermaskLayer = ({
32765
32619
  }
32766
32620
  }
32767
32621
  });
32768
- setDrawerBounds2(cutoutDrawer, bounds);
32622
+ setDrawerBounds4(cutoutDrawer, bounds);
32769
32623
  cutoutDrawer.drawElements(uncoveredPours, { layers: [copperRenderLayer] });
32770
32624
  ctx.restore();
32771
32625
  }
@@ -32799,10 +32653,10 @@ function createSoldermaskTextureForLayer({
32799
32653
  elements,
32800
32654
  boardMaterial: boardData.material
32801
32655
  });
32802
- const texture = new THREE25.CanvasTexture(canvas);
32656
+ const texture = new THREE26.CanvasTexture(canvas);
32803
32657
  texture.generateMipmaps = true;
32804
- texture.minFilter = THREE25.LinearMipmapLinearFilter;
32805
- texture.magFilter = THREE25.LinearFilter;
32658
+ texture.minFilter = THREE26.LinearMipmapLinearFilter;
32659
+ texture.magFilter = THREE26.LinearFilter;
32806
32660
  texture.anisotropy = 16;
32807
32661
  texture.needsUpdate = true;
32808
32662
  return texture;
@@ -32840,10 +32694,10 @@ var createCombinedTexture = ({
32840
32694
  const image = texture.image;
32841
32695
  ctx.drawImage(image, 0, 0, canvasWidth, canvasHeight);
32842
32696
  });
32843
- const combinedTexture = new THREE26.CanvasTexture(canvas);
32697
+ const combinedTexture = new THREE27.CanvasTexture(canvas);
32844
32698
  combinedTexture.generateMipmaps = false;
32845
- combinedTexture.minFilter = THREE26.LinearFilter;
32846
- combinedTexture.magFilter = THREE26.LinearFilter;
32699
+ combinedTexture.minFilter = THREE27.LinearFilter;
32700
+ combinedTexture.magFilter = THREE27.LinearFilter;
32847
32701
  combinedTexture.premultiplyAlpha = true;
32848
32702
  combinedTexture.anisotropy = 16;
32849
32703
  combinedTexture.needsUpdate = true;
@@ -32904,6 +32758,12 @@ function createCombinedBoardTextures({
32904
32758
  silkscreenColor,
32905
32759
  traceTextureResolution
32906
32760
  }) : null;
32761
+ const fabricationNoteTexture = showSilkscreen ? createFabricationNoteTextureForLayer({
32762
+ layer,
32763
+ circuitJson,
32764
+ boardData,
32765
+ traceTextureResolution
32766
+ }) : null;
32907
32767
  const panelOutlineTexture = showBoardBody ? createPanelOutlineTextureForLayer({
32908
32768
  layer,
32909
32769
  circuitJson,
@@ -32914,10 +32774,11 @@ function createCombinedBoardTextures({
32914
32774
  textures: [
32915
32775
  copperPourTexture,
32916
32776
  traceTexture,
32917
- copperTextTexture,
32918
32777
  padTexture,
32919
32778
  soldermaskTexture,
32779
+ copperTextTexture,
32920
32780
  silkscreenTexture,
32781
+ fabricationNoteTexture,
32921
32782
  panelOutlineTexture
32922
32783
  ],
32923
32784
  boardData,
@@ -32932,7 +32793,7 @@ function createCombinedBoardTextures({
32932
32793
  }
32933
32794
 
32934
32795
  // src/textures/create-three-texture-meshes.ts
32935
- import * as THREE27 from "three";
32796
+ import * as THREE28 from "three";
32936
32797
  function createTexturePlane(config, boardData) {
32937
32798
  const {
32938
32799
  texture,
@@ -32944,15 +32805,15 @@ function createTexturePlane(config, boardData) {
32944
32805
  } = config;
32945
32806
  if (!texture) return null;
32946
32807
  const boardOutlineBounds = calculateOutlineBounds(boardData);
32947
- const planeGeom = new THREE27.PlaneGeometry(
32808
+ const planeGeom = new THREE28.PlaneGeometry(
32948
32809
  boardOutlineBounds.width,
32949
32810
  boardOutlineBounds.height
32950
32811
  );
32951
- const material = new THREE27.MeshBasicMaterial({
32812
+ const material = new THREE28.MeshBasicMaterial({
32952
32813
  map: texture,
32953
32814
  transparent: true,
32954
32815
  alphaTest: 0.08,
32955
- side: THREE27.DoubleSide,
32816
+ side: THREE28.DoubleSide,
32956
32817
  depthWrite: true,
32957
32818
  polygonOffset: usePolygonOffset,
32958
32819
  polygonOffsetFactor: usePolygonOffset ? -4 : 0,
@@ -32960,7 +32821,7 @@ function createTexturePlane(config, boardData) {
32960
32821
  polygonOffsetUnits: usePolygonOffset ? -4 : 0,
32961
32822
  opacity: isFaux ? FAUX_BOARD_OPACITY : 1
32962
32823
  });
32963
- const mesh = new THREE27.Mesh(planeGeom, material);
32824
+ const mesh = new THREE28.Mesh(planeGeom, material);
32964
32825
  mesh.position.set(
32965
32826
  boardOutlineBounds.centerX,
32966
32827
  boardOutlineBounds.centerY,
@@ -33005,7 +32866,7 @@ function createTextureMeshes(textures, boardData, pcbThickness, isFaux = false)
33005
32866
  }
33006
32867
 
33007
32868
  // src/three-components/JscadBoardTextures.tsx
33008
- import * as THREE28 from "three";
32869
+ import * as THREE29 from "three";
33009
32870
 
33010
32871
  // src/utils/layer-texture-resolution.ts
33011
32872
  var DEFAULT_MAX_TEXTURE_PIXELS = 4e6;
@@ -33101,7 +32962,7 @@ function JscadBoardTextures({
33101
32962
  const typedMaterial = material;
33102
32963
  for (const prop of textureProps) {
33103
32964
  const texture = typedMaterial[prop];
33104
- if (texture && texture instanceof THREE28.Texture) {
32965
+ if (texture && texture instanceof THREE29.Texture) {
33105
32966
  texture.dispose();
33106
32967
  typedMaterial[prop] = null;
33107
32968
  }
@@ -33111,22 +32972,22 @@ function JscadBoardTextures({
33111
32972
  const createTexturePlane2 = (texture, zOffset, isBottomLayer, name, usePolygonOffset = false, depthWrite = true, renderOrder = 1) => {
33112
32973
  if (!texture) return null;
33113
32974
  const boardOutlineBounds = calculateOutlineBounds(boardData);
33114
- const planeGeom = new THREE28.PlaneGeometry(
32975
+ const planeGeom = new THREE29.PlaneGeometry(
33115
32976
  boardOutlineBounds.width,
33116
32977
  boardOutlineBounds.height
33117
32978
  );
33118
- const material = new THREE28.MeshBasicMaterial({
32979
+ const material = new THREE29.MeshBasicMaterial({
33119
32980
  map: texture,
33120
32981
  transparent: true,
33121
32982
  alphaTest: 0.08,
33122
- side: THREE28.DoubleSide,
32983
+ side: THREE29.DoubleSide,
33123
32984
  depthWrite,
33124
32985
  polygonOffset: usePolygonOffset,
33125
32986
  polygonOffsetFactor: usePolygonOffset ? -4 : 0,
33126
32987
  polygonOffsetUnits: usePolygonOffset ? -4 : 0,
33127
32988
  opacity: isFaux ? FAUX_BOARD_OPACITY : 1
33128
32989
  });
33129
- const mesh = new THREE28.Mesh(planeGeom, material);
32990
+ const mesh = new THREE29.Mesh(planeGeom, material);
33130
32991
  mesh.position.set(
33131
32992
  boardOutlineBounds.centerX,
33132
32993
  boardOutlineBounds.centerY,
@@ -33171,7 +33032,7 @@ function JscadBoardTextures({
33171
33032
  mesh.geometry.dispose();
33172
33033
  if (Array.isArray(mesh.material)) {
33173
33034
  mesh.material.forEach((material) => disposeTextureMaterial(material));
33174
- } else if (mesh.material instanceof THREE28.Material) {
33035
+ } else if (mesh.material instanceof THREE29.Material) {
33175
33036
  disposeTextureMaterial(mesh.material);
33176
33037
  }
33177
33038
  });
@@ -33404,12 +33265,12 @@ var CadViewerJscad = forwardRef3(
33404
33265
  // src/CadViewerManifold.tsx
33405
33266
  import { su as su17 } from "@tscircuit/circuit-json-util";
33406
33267
  import { useEffect as useEffect25, useMemo as useMemo22, useState as useState16 } from "react";
33407
- import * as THREE35 from "three";
33268
+ import * as THREE36 from "three";
33408
33269
 
33409
33270
  // src/hooks/useManifoldBoardBuilder.ts
33410
33271
  import { su as su16 } from "@tscircuit/circuit-json-util";
33411
33272
  import { useEffect as useEffect24, useMemo as useMemo21, useRef as useRef9, useState as useState15 } from "react";
33412
- import * as THREE32 from "three";
33273
+ import * as THREE33 from "three";
33413
33274
 
33414
33275
  // src/utils/manifold/create-manifold-board.ts
33415
33276
  var arePointsClockwise2 = (points) => {
@@ -33751,17 +33612,17 @@ function processNonPlatedHolesForManifold(Manifold, CrossSection, circuitJson, p
33751
33612
 
33752
33613
  // src/utils/manifold/process-plated-holes.ts
33753
33614
  import { su as su14 } from "@tscircuit/circuit-json-util";
33754
- import * as THREE30 from "three";
33615
+ import * as THREE31 from "three";
33755
33616
 
33756
33617
  // src/utils/manifold-mesh-to-three-geometry.ts
33757
- import * as THREE29 from "three";
33618
+ import * as THREE30 from "three";
33758
33619
  function manifoldMeshToThreeGeometry(manifoldMesh) {
33759
- const geometry = new THREE29.BufferGeometry();
33620
+ const geometry = new THREE30.BufferGeometry();
33760
33621
  geometry.setAttribute(
33761
33622
  "position",
33762
- new THREE29.Float32BufferAttribute(manifoldMesh.vertProperties, 3)
33623
+ new THREE30.Float32BufferAttribute(manifoldMesh.vertProperties, 3)
33763
33624
  );
33764
- geometry.setIndex(new THREE29.Uint32BufferAttribute(manifoldMesh.triVerts, 1));
33625
+ geometry.setIndex(new THREE30.Uint32BufferAttribute(manifoldMesh.triVerts, 1));
33765
33626
  if (manifoldMesh.runIndex && manifoldMesh.runIndex.length > 1 && manifoldMesh.runOriginalID) {
33766
33627
  for (let i = 0; i < manifoldMesh.runIndex.length - 1; i++) {
33767
33628
  const start = manifoldMesh.runIndex[i];
@@ -33795,7 +33656,7 @@ var createEllipsePoints = (width10, height10, segments) => {
33795
33656
  }
33796
33657
  return points;
33797
33658
  };
33798
- var COPPER_COLOR = new THREE30.Color(...colors.copper);
33659
+ var COPPER_COLOR = new THREE31.Color(...colors.copper);
33799
33660
  var PLATED_HOLE_LIP_HEIGHT = 0.05;
33800
33661
  var PLATED_HOLE_PAD_THICKNESS = 3e-3;
33801
33662
  var PLATED_HOLE_SURFACE_CLEARANCE = 5e-4;
@@ -34537,7 +34398,7 @@ function processPlatedHolesForManifold(Manifold, CrossSection, circuitJson, pcbT
34537
34398
 
34538
34399
  // src/utils/manifold/process-vias.ts
34539
34400
  import { su as su15 } from "@tscircuit/circuit-json-util";
34540
- import * as THREE31 from "three";
34401
+ import * as THREE32 from "three";
34541
34402
 
34542
34403
  // src/utils/via-geoms.ts
34543
34404
  function createViaCopper2({
@@ -34590,7 +34451,7 @@ function createViaCopper2({
34590
34451
  }
34591
34452
 
34592
34453
  // src/utils/manifold/process-vias.ts
34593
- var COPPER_COLOR2 = new THREE31.Color(...colors.copper);
34454
+ var COPPER_COLOR2 = new THREE32.Color(...colors.copper);
34594
34455
  function processViasForManifold(Manifold, circuitJson, pcbThickness, manifoldInstancesForCleanup, boardClipVolume) {
34595
34456
  const viaBoardDrills = [];
34596
34457
  const pcbVias = su15(circuitJson).pcb_via.list();
@@ -34810,7 +34671,7 @@ var useManifoldBoardBuilder = (manifoldJSModule, circuitJson, visibility) => {
34810
34671
  {
34811
34672
  key: "plated-holes-union",
34812
34673
  geometry: cutPlatedGeom,
34813
- color: new THREE32.Color(
34674
+ color: new THREE33.Color(
34814
34675
  colors.copper[0],
34815
34676
  colors.copper[1],
34816
34677
  colors.copper[2]
@@ -34840,7 +34701,7 @@ var useManifoldBoardBuilder = (manifoldJSModule, circuitJson, visibility) => {
34840
34701
  const matColorArray = boardMaterialColors[boardData.material] ?? colors.fr4Tan;
34841
34702
  currentGeoms.board = {
34842
34703
  geometry: finalBoardGeom,
34843
- color: new THREE32.Color(
34704
+ color: new THREE33.Color(
34844
34705
  matColorArray[0],
34845
34706
  matColorArray[1],
34846
34707
  matColorArray[2]
@@ -34885,11 +34746,11 @@ var useManifoldBoardBuilder = (manifoldJSModule, circuitJson, visibility) => {
34885
34746
  };
34886
34747
 
34887
34748
  // src/utils/manifold/create-three-geometry-meshes.ts
34888
- import * as THREE34 from "three";
34749
+ import * as THREE35 from "three";
34889
34750
 
34890
34751
  // src/utils/create-board-material.ts
34891
- import * as THREE33 from "three";
34892
- var DEFAULT_SIDE = THREE33.DoubleSide;
34752
+ import * as THREE34 from "three";
34753
+ var DEFAULT_SIDE = THREE34.DoubleSide;
34893
34754
  var createBoardMaterial = ({
34894
34755
  material,
34895
34756
  color,
@@ -34897,7 +34758,7 @@ var createBoardMaterial = ({
34897
34758
  isFaux = false
34898
34759
  }) => {
34899
34760
  if (material === "fr4") {
34900
- return new THREE33.MeshPhysicalMaterial({
34761
+ return new THREE34.MeshPhysicalMaterial({
34901
34762
  color,
34902
34763
  side,
34903
34764
  metalness: 0,
@@ -34914,7 +34775,7 @@ var createBoardMaterial = ({
34914
34775
  polygonOffsetUnits: 1
34915
34776
  });
34916
34777
  }
34917
- return new THREE33.MeshStandardMaterial({
34778
+ return new THREE34.MeshStandardMaterial({
34918
34779
  color,
34919
34780
  side,
34920
34781
  flatShading: true,
@@ -34933,12 +34794,12 @@ function createGeometryMeshes(geoms) {
34933
34794
  const meshes = [];
34934
34795
  if (!geoms) return meshes;
34935
34796
  if (geoms.board && geoms.board.geometry) {
34936
- const mesh = new THREE34.Mesh(
34797
+ const mesh = new THREE35.Mesh(
34937
34798
  geoms.board.geometry,
34938
34799
  createBoardMaterial({
34939
34800
  material: geoms.board.material,
34940
34801
  color: geoms.board.color,
34941
- side: THREE34.DoubleSide,
34802
+ side: THREE35.DoubleSide,
34942
34803
  isFaux: geoms.board.isFaux
34943
34804
  })
34944
34805
  );
@@ -34948,11 +34809,11 @@ function createGeometryMeshes(geoms) {
34948
34809
  const createMeshesFromArray = (geomArray) => {
34949
34810
  if (geomArray) {
34950
34811
  geomArray.forEach((comp) => {
34951
- const mesh = new THREE34.Mesh(
34812
+ const mesh = new THREE35.Mesh(
34952
34813
  comp.geometry,
34953
- new THREE34.MeshStandardMaterial({
34814
+ new THREE35.MeshStandardMaterial({
34954
34815
  color: comp.color,
34955
- side: THREE34.DoubleSide,
34816
+ side: THREE35.DoubleSide,
34956
34817
  flatShading: true
34957
34818
  // Consistent with board
34958
34819
  })
@@ -34996,7 +34857,7 @@ var BoardMeshes = ({
34996
34857
  const typedMaterial = material;
34997
34858
  for (const prop of textureProps) {
34998
34859
  const texture = typedMaterial[prop];
34999
- if (texture && texture instanceof THREE35.Texture) {
34860
+ if (texture && texture instanceof THREE36.Texture) {
35000
34861
  texture.dispose();
35001
34862
  typedMaterial[prop] = null;
35002
34863
  }
@@ -37592,21 +37453,21 @@ function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetPar
37592
37453
  }
37593
37454
  const clientRect = element.getBoundingClientRect();
37594
37455
  const domElement = unwrapElement(element);
37595
- let scale3 = createCoords(1);
37456
+ let scale2 = createCoords(1);
37596
37457
  if (includeScale) {
37597
37458
  if (offsetParent) {
37598
37459
  if (isElement(offsetParent)) {
37599
- scale3 = getScale(offsetParent);
37460
+ scale2 = getScale(offsetParent);
37600
37461
  }
37601
37462
  } else {
37602
- scale3 = getScale(element);
37463
+ scale2 = getScale(element);
37603
37464
  }
37604
37465
  }
37605
37466
  const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);
37606
- let x = (clientRect.left + visualOffsets.x) / scale3.x;
37607
- let y = (clientRect.top + visualOffsets.y) / scale3.y;
37608
- let width10 = clientRect.width / scale3.x;
37609
- let height10 = clientRect.height / scale3.y;
37467
+ let x = (clientRect.left + visualOffsets.x) / scale2.x;
37468
+ let y = (clientRect.top + visualOffsets.y) / scale2.y;
37469
+ let width10 = clientRect.width / scale2.x;
37470
+ let height10 = clientRect.height / scale2.y;
37610
37471
  if (domElement) {
37611
37472
  const win = getWindow(domElement);
37612
37473
  const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;
@@ -37668,7 +37529,7 @@ function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {
37668
37529
  scrollLeft: 0,
37669
37530
  scrollTop: 0
37670
37531
  };
37671
- let scale3 = createCoords(1);
37532
+ let scale2 = createCoords(1);
37672
37533
  const offsets = createCoords(0);
37673
37534
  const isOffsetParentAnElement = isHTMLElement(offsetParent);
37674
37535
  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
@@ -37677,17 +37538,17 @@ function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {
37677
37538
  }
37678
37539
  if (isHTMLElement(offsetParent)) {
37679
37540
  const offsetRect = getBoundingClientRect(offsetParent);
37680
- scale3 = getScale(offsetParent);
37541
+ scale2 = getScale(offsetParent);
37681
37542
  offsets.x = offsetRect.x + offsetParent.clientLeft;
37682
37543
  offsets.y = offsetRect.y + offsetParent.clientTop;
37683
37544
  }
37684
37545
  }
37685
37546
  const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);
37686
37547
  return {
37687
- width: rect.width * scale3.x,
37688
- height: rect.height * scale3.y,
37689
- x: rect.x * scale3.x - scroll.scrollLeft * scale3.x + offsets.x + htmlOffset.x,
37690
- y: rect.y * scale3.y - scroll.scrollTop * scale3.y + offsets.y + htmlOffset.y
37548
+ width: rect.width * scale2.x,
37549
+ height: rect.height * scale2.y,
37550
+ x: rect.x * scale2.x - scroll.scrollLeft * scale2.x + offsets.x + htmlOffset.x,
37551
+ y: rect.y * scale2.y - scroll.scrollTop * scale2.y + offsets.y + htmlOffset.y
37691
37552
  };
37692
37553
  }
37693
37554
  function getClientRects(element) {
@@ -37754,11 +37615,11 @@ function getInnerBoundingClientRect(element, strategy) {
37754
37615
  const clientRect = getBoundingClientRect(element, true, strategy === "fixed");
37755
37616
  const top = clientRect.top + element.clientTop;
37756
37617
  const left = clientRect.left + element.clientLeft;
37757
- const scale3 = isHTMLElement(element) ? getScale(element) : createCoords(1);
37758
- const width10 = element.clientWidth * scale3.x;
37759
- const height10 = element.clientHeight * scale3.y;
37760
- const x = left * scale3.x;
37761
- const y = top * scale3.y;
37618
+ const scale2 = isHTMLElement(element) ? getScale(element) : createCoords(1);
37619
+ const width10 = element.clientWidth * scale2.x;
37620
+ const height10 = element.clientHeight * scale2.y;
37621
+ const x = left * scale2.x;
37622
+ const y = top * scale2.y;
37762
37623
  return {
37763
37624
  width: width10,
37764
37625
  height: height10,
@@ -38214,7 +38075,7 @@ function useFloating(options) {
38214
38075
  reference: externalReference,
38215
38076
  floating: externalFloating
38216
38077
  } = {},
38217
- transform: transform2 = true,
38078
+ transform = true,
38218
38079
  whileElementsMounted,
38219
38080
  open
38220
38081
  } = options;
@@ -38329,7 +38190,7 @@ function useFloating(options) {
38329
38190
  }
38330
38191
  const x = roundByDPR(elements.floating, data.x);
38331
38192
  const y = roundByDPR(elements.floating, data.y);
38332
- if (transform2) {
38193
+ if (transform) {
38333
38194
  return {
38334
38195
  ...initialStyles,
38335
38196
  transform: "translate(" + x + "px, " + y + "px)",
@@ -38343,7 +38204,7 @@ function useFloating(options) {
38343
38204
  left: x,
38344
38205
  top: y
38345
38206
  };
38346
- }, [strategy, transform2, elements.floating, data.x, data.y]);
38207
+ }, [strategy, transform, elements.floating, data.x, data.y]);
38347
38208
  return React28.useMemo(() => ({
38348
38209
  ...data,
38349
38210
  update,
@@ -41885,7 +41746,7 @@ var KeyboardShortcutsDialog = ({
41885
41746
 
41886
41747
  // src/CadViewer.tsx
41887
41748
  import { jsx as jsx38, jsxs as jsxs11 } from "react/jsx-runtime";
41888
- var DEFAULT_TARGET = new THREE36.Vector3(0, 0, 0);
41749
+ var DEFAULT_TARGET = new THREE37.Vector3(0, 0, 0);
41889
41750
  var INITIAL_CAMERA_POSITION = [5, -5, 5];
41890
41751
  var CadViewerInner = (props) => {
41891
41752
  const [engine, setEngine] = useState36("manifold");
@@ -42152,11 +42013,11 @@ var CadViewer = (props) => {
42152
42013
  // src/convert-circuit-json-to-3d-svg.ts
42153
42014
  var import_debug = __toESM(require_browser(), 1);
42154
42015
  import { su as su18 } from "@tscircuit/circuit-json-util";
42155
- import * as THREE40 from "three";
42016
+ import * as THREE41 from "three";
42156
42017
  import { SVGRenderer } from "three/examples/jsm/renderers/SVGRenderer.js";
42157
42018
 
42158
42019
  // src/utils/create-geometry-from-polygons.ts
42159
- import * as THREE37 from "three";
42020
+ import * as THREE38 from "three";
42160
42021
  import { BufferGeometry as BufferGeometry4, Float32BufferAttribute as Float32BufferAttribute3 } from "three";
42161
42022
  function createGeometryFromPolygons(polygons) {
42162
42023
  const geometry = new BufferGeometry4();
@@ -42170,12 +42031,12 @@ function createGeometryFromPolygons(polygons) {
42170
42031
  ...polygon3.vertices[i + 1]
42171
42032
  // Third vertex
42172
42033
  );
42173
- const v1 = new THREE37.Vector3(...polygon3.vertices[0]);
42174
- const v2 = new THREE37.Vector3(...polygon3.vertices[i]);
42175
- const v3 = new THREE37.Vector3(...polygon3.vertices[i + 1]);
42176
- const normal = new THREE37.Vector3().crossVectors(
42177
- new THREE37.Vector3().subVectors(v2, v1),
42178
- new THREE37.Vector3().subVectors(v3, v1)
42034
+ const v1 = new THREE38.Vector3(...polygon3.vertices[0]);
42035
+ const v2 = new THREE38.Vector3(...polygon3.vertices[i]);
42036
+ const v3 = new THREE38.Vector3(...polygon3.vertices[i + 1]);
42037
+ const normal = new THREE38.Vector3().crossVectors(
42038
+ new THREE38.Vector3().subVectors(v2, v1),
42039
+ new THREE38.Vector3().subVectors(v3, v1)
42179
42040
  ).normalize();
42180
42041
  normals.push(
42181
42042
  normal.x,
@@ -42199,10 +42060,10 @@ function createGeometryFromPolygons(polygons) {
42199
42060
  var import_modeling2 = __toESM(require_src(), 1);
42200
42061
  var import_jscad_planner2 = __toESM(require_dist(), 1);
42201
42062
  var jscadModeling2 = __toESM(require_src(), 1);
42202
- import * as THREE39 from "three";
42063
+ import * as THREE40 from "three";
42203
42064
 
42204
42065
  // src/utils/load-model.ts
42205
- import * as THREE38 from "three";
42066
+ import * as THREE39 from "three";
42206
42067
  import { GLTFLoader as GLTFLoader2 } from "three/examples/jsm/loaders/GLTFLoader.js";
42207
42068
  import { OBJLoader as OBJLoader2 } from "three/examples/jsm/loaders/OBJLoader.js";
42208
42069
  import { STLLoader as STLLoader2 } from "three/examples/jsm/loaders/STLLoader.js";
@@ -42210,12 +42071,12 @@ async function load3DModel(url) {
42210
42071
  if (url.endsWith(".stl")) {
42211
42072
  const loader = new STLLoader2();
42212
42073
  const geometry = await loader.loadAsync(url);
42213
- const material = new THREE38.MeshStandardMaterial({
42074
+ const material = new THREE39.MeshStandardMaterial({
42214
42075
  color: 8947848,
42215
42076
  metalness: 0.5,
42216
42077
  roughness: 0.5
42217
42078
  });
42218
- return new THREE38.Mesh(geometry, material);
42079
+ return new THREE39.Mesh(geometry, material);
42219
42080
  }
42220
42081
  if (url.endsWith(".obj")) {
42221
42082
  const loader = new OBJLoader2();
@@ -42248,9 +42109,9 @@ async function renderComponent(component, scene) {
42248
42109
  }
42249
42110
  if (component.rotation) {
42250
42111
  model.rotation.set(
42251
- THREE39.MathUtils.degToRad(component.rotation.x ?? 0),
42252
- THREE39.MathUtils.degToRad(component.rotation.y ?? 0),
42253
- THREE39.MathUtils.degToRad(component.rotation.z ?? 0)
42112
+ THREE40.MathUtils.degToRad(component.rotation.x ?? 0),
42113
+ THREE40.MathUtils.degToRad(component.rotation.y ?? 0),
42114
+ THREE40.MathUtils.degToRad(component.rotation.z ?? 0)
42254
42115
  );
42255
42116
  }
42256
42117
  scene.add(model);
@@ -42264,13 +42125,13 @@ async function renderComponent(component, scene) {
42264
42125
  );
42265
42126
  if (jscadObject && (jscadObject.polygons || jscadObject.sides)) {
42266
42127
  const threeGeom = convertCSGToThreeGeom(jscadObject);
42267
- const material2 = new THREE39.MeshStandardMaterial({
42128
+ const material2 = new THREE40.MeshStandardMaterial({
42268
42129
  color: 8947848,
42269
42130
  metalness: 0.5,
42270
42131
  roughness: 0.5,
42271
- side: THREE39.DoubleSide
42132
+ side: THREE40.DoubleSide
42272
42133
  });
42273
- const mesh2 = new THREE39.Mesh(threeGeom, material2);
42134
+ const mesh2 = new THREE40.Mesh(threeGeom, material2);
42274
42135
  if (component.position) {
42275
42136
  mesh2.position.set(
42276
42137
  component.position.x ?? 0,
@@ -42280,9 +42141,9 @@ async function renderComponent(component, scene) {
42280
42141
  }
42281
42142
  if (component.rotation) {
42282
42143
  mesh2.rotation.set(
42283
- THREE39.MathUtils.degToRad(component.rotation.x ?? 0),
42284
- THREE39.MathUtils.degToRad(component.rotation.y ?? 0),
42285
- THREE39.MathUtils.degToRad(component.rotation.z ?? 0)
42144
+ THREE40.MathUtils.degToRad(component.rotation.x ?? 0),
42145
+ THREE40.MathUtils.degToRad(component.rotation.y ?? 0),
42146
+ THREE40.MathUtils.degToRad(component.rotation.z ?? 0)
42286
42147
  );
42287
42148
  }
42288
42149
  scene.add(mesh2);
@@ -42299,17 +42160,17 @@ async function renderComponent(component, scene) {
42299
42160
  if (!geom || !geom.polygons && !geom.sides) {
42300
42161
  continue;
42301
42162
  }
42302
- const color = new THREE39.Color(geomInfo.color);
42163
+ const color = new THREE40.Color(geomInfo.color);
42303
42164
  color.convertLinearToSRGB();
42304
42165
  const geomWithColor = { ...geom, color: [color.r, color.g, color.b] };
42305
42166
  const threeGeom = convertCSGToThreeGeom(geomWithColor);
42306
- const material2 = new THREE39.MeshStandardMaterial({
42167
+ const material2 = new THREE40.MeshStandardMaterial({
42307
42168
  vertexColors: true,
42308
42169
  metalness: 0.2,
42309
42170
  roughness: 0.8,
42310
- side: THREE39.DoubleSide
42171
+ side: THREE40.DoubleSide
42311
42172
  });
42312
- const mesh2 = new THREE39.Mesh(threeGeom, material2);
42173
+ const mesh2 = new THREE40.Mesh(threeGeom, material2);
42313
42174
  if (component.position) {
42314
42175
  mesh2.position.set(
42315
42176
  component.position.x ?? 0,
@@ -42319,22 +42180,22 @@ async function renderComponent(component, scene) {
42319
42180
  }
42320
42181
  if (component.rotation) {
42321
42182
  mesh2.rotation.set(
42322
- THREE39.MathUtils.degToRad(component.rotation.x ?? 0),
42323
- THREE39.MathUtils.degToRad(component.rotation.y ?? 0),
42324
- THREE39.MathUtils.degToRad(component.rotation.z ?? 0)
42183
+ THREE40.MathUtils.degToRad(component.rotation.x ?? 0),
42184
+ THREE40.MathUtils.degToRad(component.rotation.y ?? 0),
42185
+ THREE40.MathUtils.degToRad(component.rotation.z ?? 0)
42325
42186
  );
42326
42187
  }
42327
42188
  scene.add(mesh2);
42328
42189
  }
42329
42190
  return;
42330
42191
  }
42331
- const geometry = new THREE39.BoxGeometry(0.5, 0.5, 0.5);
42332
- const material = new THREE39.MeshStandardMaterial({
42192
+ const geometry = new THREE40.BoxGeometry(0.5, 0.5, 0.5);
42193
+ const material = new THREE40.MeshStandardMaterial({
42333
42194
  color: 16711680,
42334
42195
  transparent: true,
42335
42196
  opacity: 0.25
42336
42197
  });
42337
- const mesh = new THREE39.Mesh(geometry, material);
42198
+ const mesh = new THREE40.Mesh(geometry, material);
42338
42199
  if (component.position) {
42339
42200
  mesh.position.set(
42340
42201
  component.position.x ?? 0,
@@ -42355,11 +42216,11 @@ async function convertCircuitJsonTo3dSvg(circuitJson, options = {}) {
42355
42216
  padding = 20,
42356
42217
  zoom = 1.5
42357
42218
  } = options;
42358
- const scene = new THREE40.Scene();
42219
+ const scene = new THREE41.Scene();
42359
42220
  const renderer = new SVGRenderer();
42360
42221
  renderer.setSize(width10, height10);
42361
- renderer.setClearColor(new THREE40.Color(backgroundColor), 1);
42362
- const camera = new THREE40.OrthographicCamera();
42222
+ renderer.setClearColor(new THREE41.Color(backgroundColor), 1);
42223
+ const camera = new THREE41.OrthographicCamera();
42363
42224
  const aspect = width10 / height10;
42364
42225
  const frustumSize = 100;
42365
42226
  const halfFrustumSize = frustumSize / 2 / zoom;
@@ -42373,11 +42234,11 @@ async function convertCircuitJsonTo3dSvg(circuitJson, options = {}) {
42373
42234
  camera.position.set(position.x, position.y, position.z);
42374
42235
  camera.up.set(0, 1, 0);
42375
42236
  const lookAt = options.camera?.lookAt ?? { x: 0, y: 0, z: 0 };
42376
- camera.lookAt(new THREE40.Vector3(lookAt.x, lookAt.y, lookAt.z));
42237
+ camera.lookAt(new THREE41.Vector3(lookAt.x, lookAt.y, lookAt.z));
42377
42238
  camera.updateProjectionMatrix();
42378
- const ambientLight = new THREE40.AmbientLight(16777215, Math.PI / 2);
42239
+ const ambientLight = new THREE41.AmbientLight(16777215, Math.PI / 2);
42379
42240
  scene.add(ambientLight);
42380
- const pointLight = new THREE40.PointLight(16777215, Math.PI / 4);
42241
+ const pointLight = new THREE41.PointLight(16777215, Math.PI / 4);
42381
42242
  pointLight.position.set(-10, -10, 10);
42382
42243
  scene.add(pointLight);
42383
42244
  const components = su18(circuitJson).cad_component.list();
@@ -42388,7 +42249,7 @@ async function convertCircuitJsonTo3dSvg(circuitJson, options = {}) {
42388
42249
  const boardGeom = createBoardGeomFromCircuitJson(circuitJson);
42389
42250
  if (boardGeom) {
42390
42251
  const solderMaskColor = colors.fr4SolderMaskGreen;
42391
- const baseColor = new THREE40.Color(
42252
+ const baseColor = new THREE41.Color(
42392
42253
  solderMaskColor[0],
42393
42254
  solderMaskColor[1],
42394
42255
  solderMaskColor[2]
@@ -42400,33 +42261,33 @@ async function convertCircuitJsonTo3dSvg(circuitJson, options = {}) {
42400
42261
  const material = createBoardMaterial({
42401
42262
  material: boardData?.material,
42402
42263
  color: baseColor,
42403
- side: THREE40.DoubleSide
42264
+ side: THREE41.DoubleSide
42404
42265
  });
42405
- const mesh = new THREE40.Mesh(geometry, material);
42266
+ const mesh = new THREE41.Mesh(geometry, material);
42406
42267
  scene.add(mesh);
42407
42268
  }
42408
42269
  }
42409
- const gridColor = new THREE40.Color(8947848);
42410
- const gridHelper = new THREE40.GridHelper(100, 100, gridColor, gridColor);
42270
+ const gridColor = new THREE41.Color(8947848);
42271
+ const gridHelper = new THREE41.GridHelper(100, 100, gridColor, gridColor);
42411
42272
  gridHelper.rotation.x = Math.PI / 2;
42412
42273
  const materials = Array.isArray(gridHelper.material) ? gridHelper.material : [gridHelper.material];
42413
42274
  for (const mat of materials) {
42414
42275
  mat.transparent = true;
42415
42276
  mat.opacity = 0.3;
42416
- if (mat instanceof THREE40.LineBasicMaterial) {
42277
+ if (mat instanceof THREE41.LineBasicMaterial) {
42417
42278
  mat.color = gridColor;
42418
42279
  mat.vertexColors = false;
42419
42280
  }
42420
42281
  }
42421
42282
  scene.add(gridHelper);
42422
- const box = new THREE40.Box3().setFromObject(scene);
42423
- const center = box.getCenter(new THREE40.Vector3());
42424
- const size4 = box.getSize(new THREE40.Vector3());
42283
+ const box = new THREE41.Box3().setFromObject(scene);
42284
+ const center = box.getCenter(new THREE41.Vector3());
42285
+ const size4 = box.getSize(new THREE41.Vector3());
42425
42286
  scene.position.sub(center);
42426
42287
  const maxDim = Math.max(size4.x, size4.y, size4.z);
42427
42288
  if (maxDim > 0) {
42428
- const scale3 = (1 - padding / 100) / maxDim;
42429
- scene.scale.multiplyScalar(scale3 * 100);
42289
+ const scale2 = (1 - padding / 100) / maxDim;
42290
+ scene.scale.multiplyScalar(scale2 * 100);
42430
42291
  }
42431
42292
  camera.updateProjectionMatrix();
42432
42293
  renderer.render(scene, camera);