@tscircuit/pcb-viewer 1.7.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -9469,6 +9469,9 @@ var require_dist = __commonJS({
9469
9469
  schematic_path: function() {
9470
9470
  return schematic_path;
9471
9471
  },
9472
+ schematic_pin_styles: function() {
9473
+ return schematic_pin_styles;
9474
+ },
9472
9475
  schematic_port: function() {
9473
9476
  return schematic_port;
9474
9477
  },
@@ -9809,6 +9812,12 @@ var require_dist = __commonJS({
9809
9812
  points: import_zod22.z.array(point)
9810
9813
  });
9811
9814
  var import_zod23 = require_lib2();
9815
+ var schematic_pin_styles = import_zod23.z.record(import_zod23.z.object({
9816
+ left_margin: length.optional(),
9817
+ right_margin: length.optional(),
9818
+ top_margin: length.optional(),
9819
+ bottom_margin: length.optional()
9820
+ }));
9812
9821
  var schematic_component = import_zod23.z.object({
9813
9822
  type: import_zod23.z.literal("schematic_component"),
9814
9823
  rotation: rotation.default(0),
@@ -9817,7 +9826,9 @@ var require_dist = __commonJS({
9817
9826
  source_component_id: import_zod23.z.string(),
9818
9827
  schematic_component_id: import_zod23.z.string(),
9819
9828
  pin_spacing: length.optional(),
9829
+ pin_styles: schematic_pin_styles.optional(),
9820
9830
  box_width: length.optional(),
9831
+ symbol_name: import_zod23.z.string().optional(),
9821
9832
  port_arrangement: import_zod23.z.union([
9822
9833
  import_zod23.z.object({
9823
9834
  left_size: import_zod23.z.number(),
@@ -10094,6 +10105,11 @@ var require_dist = __commonJS({
10094
10105
  source_trace_id: import_zod39.z.string().optional(),
10095
10106
  pcb_component_id: import_zod39.z.string().optional(),
10096
10107
  pcb_trace_id: import_zod39.z.string(),
10108
+ route_thickness_mode: import_zod39.z.enum([
10109
+ "constant",
10110
+ "interpolated"
10111
+ ]).default("interpolated").optional(),
10112
+ should_round_corners: import_zod39.z.boolean().optional(),
10097
10113
  route: import_zod39.z.array(import_zod39.z.union([
10098
10114
  import_zod39.z.object({
10099
10115
  route_type: import_zod39.z.literal("wire"),
@@ -10147,9 +10163,11 @@ var require_dist = __commonJS({
10147
10163
  var import_zod43 = require_lib2();
10148
10164
  var pcb_board = import_zod43.z.object({
10149
10165
  type: import_zod43.z.literal("pcb_board"),
10166
+ pcb_board_id: import_zod43.z.string().default("pcb_board_0").optional(),
10150
10167
  width: length,
10151
10168
  height: length,
10152
- center: point
10169
+ center: point,
10170
+ outline: import_zod43.z.array(point).optional()
10153
10171
  }).describe("Defines the board outline of the PCB");
10154
10172
  var import_zod44 = require_lib2();
10155
10173
  var pcb_placement_error = import_zod44.z.object({
@@ -11786,6 +11804,12 @@ var drawPill = function(drawer, pill) {
11786
11804
  });
11787
11805
  drawer.pill(pill.x, pill.y, pill.w, pill.h);
11788
11806
  };
11807
+ var drawPolygon = function(drawer, polygon) {
11808
+ drawer.equip({
11809
+ color: polygon.layer
11810
+ });
11811
+ drawer.polygon(polygon.points);
11812
+ };
11789
11813
  var drawPrimitive = function(drawer, primitive) {
11790
11814
  switch(primitive.pcb_drawing_type){
11791
11815
  case "line":
@@ -11800,6 +11824,8 @@ var drawPrimitive = function(drawer, primitive) {
11800
11824
  return drawOval(drawer, primitive);
11801
11825
  case "pill":
11802
11826
  return drawPill(drawer, primitive);
11827
+ case "polygon":
11828
+ return drawPolygon(drawer, primitive);
11803
11829
  }
11804
11830
  };
11805
11831
  var drawPrimitives = function(drawer, primitives) {
@@ -12225,6 +12251,34 @@ var Drawer = /*#__PURE__*/ function() {
12225
12251
  ctx.closePath();
12226
12252
  }
12227
12253
  },
12254
+ {
12255
+ key: "polygon",
12256
+ value: function polygon(points) {
12257
+ var _this = this;
12258
+ if (points.length < 3) {
12259
+ console.warn("Polygon must have at least 3 points");
12260
+ return;
12261
+ }
12262
+ this.applyAperture();
12263
+ var ctx = this.getLayerCtx();
12264
+ var transformedPoints = points.map(function(point) {
12265
+ return (0, import_transformation_matrix.applyToPoint)(_this.transform, [
12266
+ point.x,
12267
+ point.y
12268
+ ]);
12269
+ });
12270
+ ctx.beginPath();
12271
+ ctx.moveTo(transformedPoints[0][0], transformedPoints[0][1]);
12272
+ for(var i = 1; i < transformedPoints.length; i++){
12273
+ ctx.lineTo(transformedPoints[i][0], transformedPoints[i][1]);
12274
+ }
12275
+ ctx.closePath();
12276
+ ctx.fill();
12277
+ var lineWidth = scaleOnly(this.transform, this.aperture.size);
12278
+ ctx.lineWidth = lineWidth;
12279
+ ctx.stroke();
12280
+ }
12281
+ },
12228
12282
  {
12229
12283
  /* NOTE: This is not gerber compatible */ key: "debugText",
12230
12284
  value: function debugText(text, x, y) {
@@ -12488,6 +12542,85 @@ var CanvasPrimitiveRenderer = function(param) {
12488
12542
  var import_react14 = require("react");
12489
12543
  // src/lib/convert-element-to-primitive.ts
12490
12544
  var import_soup_util = __toESM(require_dist2());
12545
+ // src/lib/util/expand-stroke.ts
12546
+ function getExpandedStroke(strokeInput, defaultWidth) {
12547
+ if (strokeInput.length < 2) {
12548
+ throw new Error("Stroke must have at least two points");
12549
+ }
12550
+ var stroke = strokeInput.map(function(point) {
12551
+ if (Array.isArray(point)) {
12552
+ return {
12553
+ x: point[0],
12554
+ y: point[1]
12555
+ };
12556
+ }
12557
+ return point;
12558
+ });
12559
+ var leftSide = [];
12560
+ var rightSide = [];
12561
+ function getNormal(p1, p2) {
12562
+ var dx = p2.x - p1.x;
12563
+ var dy = p2.y - p1.y;
12564
+ var length = Math.sqrt(dx * dx + dy * dy);
12565
+ return {
12566
+ x: -dy / length,
12567
+ y: dx / length
12568
+ };
12569
+ }
12570
+ function addPoint(point, normal, factor, width) {
12571
+ var halfWidth = width / 2;
12572
+ var newPoint = {
12573
+ x: point.x + normal.x * halfWidth * factor,
12574
+ y: point.y + normal.y * halfWidth * factor
12575
+ };
12576
+ if (factor > 0) {
12577
+ leftSide.push(newPoint);
12578
+ } else {
12579
+ rightSide.unshift(newPoint);
12580
+ }
12581
+ }
12582
+ var firstNormal = getNormal(stroke[0], stroke[1]);
12583
+ var _stroke__trace_width;
12584
+ var firstWidth = (_stroke__trace_width = stroke[0].trace_width) !== null && _stroke__trace_width !== void 0 ? _stroke__trace_width : defaultWidth;
12585
+ addPoint(stroke[0], firstNormal, 1, firstWidth);
12586
+ addPoint(stroke[0], firstNormal, -1, firstWidth);
12587
+ for(var i = 1; i < stroke.length - 1; i++){
12588
+ var prev = stroke[i - 1];
12589
+ var current = stroke[i];
12590
+ var next = stroke[i + 1];
12591
+ var normalPrev = getNormal(prev, current);
12592
+ var normalNext = getNormal(current, next);
12593
+ var miterX = normalPrev.x + normalNext.x;
12594
+ var miterY = normalPrev.y + normalNext.y;
12595
+ var miterLength = Math.sqrt(miterX * miterX + miterY * miterY);
12596
+ var _current_trace_width;
12597
+ var currentWidth = (_current_trace_width = current.trace_width) !== null && _current_trace_width !== void 0 ? _current_trace_width : defaultWidth;
12598
+ var miterLimit = 2;
12599
+ if (miterLength / 2 > miterLimit * (currentWidth / 2)) {
12600
+ addPoint(current, normalPrev, 1, currentWidth);
12601
+ addPoint(current, normalNext, 1, currentWidth);
12602
+ addPoint(current, normalPrev, -1, currentWidth);
12603
+ addPoint(current, normalNext, -1, currentWidth);
12604
+ } else {
12605
+ var scale2 = 1 / miterLength;
12606
+ addPoint(current, {
12607
+ x: miterX * scale2,
12608
+ y: miterY * scale2
12609
+ }, 1, currentWidth);
12610
+ addPoint(current, {
12611
+ x: miterX * scale2,
12612
+ y: miterY * scale2
12613
+ }, -1, currentWidth);
12614
+ }
12615
+ }
12616
+ var lastNormal = getNormal(stroke[stroke.length - 2], stroke[stroke.length - 1]);
12617
+ var _stroke__trace_width1;
12618
+ var lastWidth = (_stroke__trace_width1 = stroke[stroke.length - 1].trace_width) !== null && _stroke__trace_width1 !== void 0 ? _stroke__trace_width1 : defaultWidth;
12619
+ addPoint(stroke[stroke.length - 1], lastNormal, 1, lastWidth);
12620
+ addPoint(stroke[stroke.length - 1], lastNormal, -1, lastWidth);
12621
+ return _to_consumable_array(leftSide).concat(_to_consumable_array(rightSide));
12622
+ }
12623
+ // src/lib/convert-element-to-primitive.ts
12491
12624
  var convertElementToPrimitives = function(element, allElements) {
12492
12625
  var _pcb_port_get;
12493
12626
  var _parent_pcb_component = "pcb_component_id" in element ? allElements.find(function(elm) {
@@ -12503,7 +12636,23 @@ var convertElementToPrimitives = function(element, allElements) {
12503
12636
  switch(element.type){
12504
12637
  case "pcb_board":
12505
12638
  {
12506
- var width = element.width, height = element.height, center = element.center;
12639
+ var width = element.width, height = element.height, center = element.center, outline = element.outline;
12640
+ if (outline && outline.length > 2) {
12641
+ return outline.map(function(point, index, array) {
12642
+ return {
12643
+ pcb_drawing_type: "line",
12644
+ x1: point.x,
12645
+ y1: point.y,
12646
+ x2: index === array.length - 1 ? array[0].x : array[index + 1].x,
12647
+ y2: index === array.length - 1 ? array[0].y : array[index + 1].y,
12648
+ width: 1,
12649
+ // Add the required width property
12650
+ zoomIndependent: true,
12651
+ layer: "board",
12652
+ _element: element
12653
+ };
12654
+ });
12655
+ }
12507
12656
  return [
12508
12657
  {
12509
12658
  pcb_drawing_type: "line",
@@ -12693,42 +12842,70 @@ var convertElementToPrimitives = function(element, allElements) {
12693
12842
  case "pcb_trace":
12694
12843
  {
12695
12844
  var primitives = [];
12696
- var prevX = null;
12697
- var prevY = null;
12698
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
12699
- try {
12700
- for(var _iterator = element.route[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
12701
- var route = _step.value;
12702
- if (route.route_type === "wire") {
12703
- if (prevX !== null && prevY !== null) {
12704
- primitives.push({
12705
- pcb_drawing_type: "line",
12706
- x1: prevX,
12707
- y1: prevY,
12708
- x2: route.x,
12709
- y2: route.y,
12710
- width: route.width,
12711
- squareCap: false,
12712
- layer: route.layer
12713
- });
12714
- }
12715
- prevX = route.x;
12716
- prevY = route.y;
12717
- }
12718
- }
12719
- } catch (err) {
12720
- _didIteratorError = true;
12721
- _iteratorError = err;
12722
- } finally{
12845
+ if (element.route_thickness_mode === "constant") {
12846
+ var prevX = null;
12847
+ var prevY = null;
12848
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
12723
12849
  try {
12724
- if (!_iteratorNormalCompletion && _iterator.return != null) {
12725
- _iterator.return();
12850
+ for(var _iterator = element.route[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
12851
+ var route = _step.value;
12852
+ if (route.route_type === "wire") {
12853
+ if (prevX !== null && prevY !== null) {
12854
+ primitives.push({
12855
+ pcb_drawing_type: "line",
12856
+ x1: prevX,
12857
+ y1: prevY,
12858
+ x2: route.x,
12859
+ y2: route.y,
12860
+ width: route.width,
12861
+ squareCap: false,
12862
+ layer: route.layer
12863
+ });
12864
+ }
12865
+ prevX = route.x;
12866
+ prevY = route.y;
12867
+ }
12726
12868
  }
12869
+ } catch (err) {
12870
+ _didIteratorError = true;
12871
+ _iteratorError = err;
12727
12872
  } finally{
12728
- if (_didIteratorError) {
12729
- throw _iteratorError;
12873
+ try {
12874
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
12875
+ _iterator.return();
12876
+ }
12877
+ } finally{
12878
+ if (_didIteratorError) {
12879
+ throw _iteratorError;
12880
+ }
12730
12881
  }
12731
12882
  }
12883
+ } else if (element.route_thickness_mode === "interpolated") {
12884
+ var strokeInput = element.route.map(function(r) {
12885
+ return {
12886
+ x: r.x,
12887
+ y: r.y,
12888
+ trace_width: r.route_type === "wire" ? r.width : 0.5
12889
+ };
12890
+ });
12891
+ var expandedStroke = getExpandedStroke(strokeInput, 0.5);
12892
+ primitives.push({
12893
+ pcb_drawing_type: "polygon",
12894
+ points: expandedStroke,
12895
+ layer: element.route[0].layer
12896
+ });
12897
+ element.route.forEach(function(r) {
12898
+ if (r.route_type === "via") {
12899
+ primitives.push({
12900
+ pcb_drawing_type: "circle",
12901
+ x: r.x,
12902
+ y: r.y,
12903
+ radius: r.outer_diameter / 2,
12904
+ fill: true,
12905
+ layer: element.route.layer
12906
+ });
12907
+ }
12908
+ });
12732
12909
  }
12733
12910
  return primitives;
12734
12911
  }
@@ -13390,7 +13567,7 @@ var import_soup2 = __toESM(require_dist());
13390
13567
  // package.json
13391
13568
  var package_default = {
13392
13569
  name: "@tscircuit/pcb-viewer",
13393
- version: "1.6.0",
13570
+ version: "1.8.0",
13394
13571
  main: "dist/index.js",
13395
13572
  repository: "tscircuit/pcb-viewer",
13396
13573
  license: "MIT",
@@ -13413,11 +13590,11 @@ var package_default = {
13413
13590
  "@storybook/nextjs": "^8.0.6",
13414
13591
  "@storybook/react": "^8.0.6",
13415
13592
  "@swc/core": "^1.4.12",
13416
- "@tscircuit/builder": "^1.11.0",
13593
+ "@tscircuit/builder": "^1.11.4",
13417
13594
  "@tscircuit/eagle-xml-converter": "^0.0.6",
13418
- "@tscircuit/props": "^0.0.31",
13595
+ "@tscircuit/props": "^0.0.46",
13419
13596
  "@tscircuit/react-fiber": "^1.1.25",
13420
- "@tscircuit/soup": "^0.0.50",
13597
+ "@tscircuit/soup": "^0.0.58",
13421
13598
  "@tscircuit/soup-util": "^0.0.13",
13422
13599
  "@types/node": "18.7.23",
13423
13600
  "@types/react": "^18.3.3",
@@ -14258,57 +14435,40 @@ var EditTraceHintOverlay = function(param) {
14258
14435
  var route = e.route;
14259
14436
  var pcb_port = (0, import_soup_util2.su)(soup).pcb_port.get(e.pcb_port_id);
14260
14437
  var pcb_port_screen = (0, import_transformation_matrix6.applyToPoint)(transform, pcb_port);
14261
- var strokeInput = [
14262
- {
14263
- x: pcb_port_screen.x,
14264
- y: pcb_port_screen.y,
14265
- trace_width: 0.5
14266
- }
14267
- ].concat(// Start with a small width
14268
- _to_consumable_array(route.map(function(r) {
14269
- if (r === void 0) {
14270
- throw new Error("route contains undefined point");
14271
- }
14272
- return {
14273
- x: (0, import_transformation_matrix6.applyToPoint)(transform, r).x,
14274
- y: (0, import_transformation_matrix6.applyToPoint)(transform, r).y,
14275
- trace_width: r.trace_width
14276
- };
14277
- })));
14278
- var expandedStroke = getExpandedStroke(strokeInput, 0.5);
14279
- var expandedPath = expandedStroke.map(function(point, index) {
14280
- return "".concat(index === 0 ? "M" : "L", " ").concat(point.x, ",").concat(point.y);
14281
- }).join(" ") + " Z";
14282
- var originalPath = strokeInput.map(function(point, index) {
14283
- return "".concat(index === 0 ? "M" : "L", " ").concat(point.x, ",").concat(point.y);
14284
- }).join(" ");
14285
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("g", {
14438
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react13.Fragment, {
14286
14439
  children: [
14287
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("path", {
14288
- d: expandedPath,
14289
- fill: "red"
14290
- }, "expanded-path-".concat(e.pcb_port_id)),
14291
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("path", {
14292
- d: originalPath,
14293
- style: {
14294
- mixBlendMode: "difference"
14295
- },
14440
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("rect", {
14441
+ x: pcb_port_screen.x - 10,
14442
+ y: pcb_port_screen.y - 10,
14443
+ width: 20,
14444
+ height: 20,
14296
14445
  stroke: "red"
14297
- }, "original-path-".concat(e.pcb_port_id)),
14298
- strokeInput.map(function(r, i) {
14299
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("g", {
14446
+ }, "rect-".concat(e.pcb_port_id)),
14447
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("path", {
14448
+ stroke: "red",
14449
+ d: "M ".concat(pcb_port_screen.x, " ").concat(pcb_port_screen.y, " ").concat(route.map(function(r) {
14450
+ return (0, import_transformation_matrix6.applyToPoint)(transform, r);
14451
+ }).map(function(r) {
14452
+ return "L ".concat(r.x, " ").concat(r.y);
14453
+ }).join(" "))
14454
+ }, "path-".concat(e.pcb_port_id)),
14455
+ route.map(function(r) {
14456
+ return _object_spread({}, r, (0, import_transformation_matrix6.applyToPoint)(transform, r));
14457
+ }).map(function(r, i) {
14458
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react13.Fragment, {
14300
14459
  children: [
14301
14460
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("circle", {
14302
14461
  cx: r.x,
14303
14462
  cy: r.y,
14304
- r: r.trace_width ? r.trace_width / 2 : 8,
14463
+ r: 8,
14305
14464
  stroke: "red"
14306
14465
  }),
14307
14466
  r.via && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("circle", {
14308
14467
  cx: r.x,
14309
14468
  cy: r.y,
14310
- r: r.trace_width ? r.trace_width / 2 : 8,
14311
- stroke: "red"
14469
+ r: 16,
14470
+ stroke: "red",
14471
+ fill: "transparent"
14312
14472
  })
14313
14473
  ]
14314
14474
  }, i);
@@ -14338,83 +14498,6 @@ var EditTraceHintOverlay = function(param) {
14338
14498
  ]
14339
14499
  });
14340
14500
  };
14341
- function getExpandedStroke(strokeInput, defaultWidth) {
14342
- if (strokeInput.length < 2) {
14343
- throw new Error("Stroke must have at least two points");
14344
- }
14345
- var stroke = strokeInput.map(function(point) {
14346
- if (Array.isArray(point)) {
14347
- return {
14348
- x: point[0],
14349
- y: point[1]
14350
- };
14351
- }
14352
- return point;
14353
- });
14354
- var leftSide = [];
14355
- var rightSide = [];
14356
- function getNormal(p1, p2) {
14357
- var dx = p2.x - p1.x;
14358
- var dy = p2.y - p1.y;
14359
- var length = Math.sqrt(dx * dx + dy * dy);
14360
- return {
14361
- x: -dy / length,
14362
- y: dx / length
14363
- };
14364
- }
14365
- function addPoint(point, normal, factor, width) {
14366
- var halfWidth = width / 2;
14367
- var newPoint = {
14368
- x: point.x + normal.x * halfWidth * factor,
14369
- y: point.y + normal.y * halfWidth * factor
14370
- };
14371
- if (factor > 0) {
14372
- leftSide.push(newPoint);
14373
- } else {
14374
- rightSide.unshift(newPoint);
14375
- }
14376
- }
14377
- var firstNormal = getNormal(stroke[0], stroke[1]);
14378
- var _stroke__trace_width;
14379
- var firstWidth = (_stroke__trace_width = stroke[0].trace_width) !== null && _stroke__trace_width !== void 0 ? _stroke__trace_width : defaultWidth;
14380
- addPoint(stroke[0], firstNormal, 1, firstWidth);
14381
- addPoint(stroke[0], firstNormal, -1, firstWidth);
14382
- for(var i = 1; i < stroke.length - 1; i++){
14383
- var prev = stroke[i - 1];
14384
- var current = stroke[i];
14385
- var next = stroke[i + 1];
14386
- var normalPrev = getNormal(prev, current);
14387
- var normalNext = getNormal(current, next);
14388
- var miterX = normalPrev.x + normalNext.x;
14389
- var miterY = normalPrev.y + normalNext.y;
14390
- var miterLength = Math.sqrt(miterX * miterX + miterY * miterY);
14391
- var _current_trace_width;
14392
- var currentWidth = (_current_trace_width = current.trace_width) !== null && _current_trace_width !== void 0 ? _current_trace_width : defaultWidth;
14393
- var miterLimit = 2;
14394
- if (miterLength / 2 > miterLimit * (currentWidth / 2)) {
14395
- addPoint(current, normalPrev, 1, currentWidth);
14396
- addPoint(current, normalNext, 1, currentWidth);
14397
- addPoint(current, normalPrev, -1, currentWidth);
14398
- addPoint(current, normalNext, -1, currentWidth);
14399
- } else {
14400
- var scale2 = 1 / miterLength;
14401
- addPoint(current, {
14402
- x: miterX * scale2,
14403
- y: miterY * scale2
14404
- }, 1, currentWidth);
14405
- addPoint(current, {
14406
- x: miterX * scale2,
14407
- y: miterY * scale2
14408
- }, -1, currentWidth);
14409
- }
14410
- }
14411
- var lastNormal = getNormal(stroke[stroke.length - 2], stroke[stroke.length - 1]);
14412
- var _stroke__trace_width1;
14413
- var lastWidth = (_stroke__trace_width1 = stroke[stroke.length - 1].trace_width) !== null && _stroke__trace_width1 !== void 0 ? _stroke__trace_width1 : defaultWidth;
14414
- addPoint(stroke[stroke.length - 1], lastNormal, 1, lastWidth);
14415
- addPoint(stroke[stroke.length - 1], lastNormal, -1, lastWidth);
14416
- return _to_consumable_array(leftSide).concat(_to_consumable_array(rightSide));
14417
- }
14418
14501
  // src/components/RatsNestOverlay.tsx
14419
14502
  var import_transformation_matrix7 = require("transformation-matrix");
14420
14503
  var import_soup_util3 = __toESM(require_dist2());