@tscircuit/pcb-viewer 1.11.374 → 1.11.375

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
@@ -6343,16 +6343,31 @@ var getBoundsOfPcbElements = (elements) => {
6343
6343
  centerX = elm.center.x;
6344
6344
  centerY = elm.center.y;
6345
6345
  }
6346
+ const rotation = typeof elm.rotation === "number" ? elm.rotation : 0;
6346
6347
  if (centerX !== void 0 && centerY !== void 0) {
6347
6348
  minX = Math.min(minX, centerX);
6348
6349
  minY = Math.min(minY, centerY);
6349
6350
  maxX = Math.max(maxX, centerX);
6350
6351
  maxY = Math.max(maxY, centerY);
6351
6352
  if (width !== void 0 && height !== void 0) {
6352
- minX = Math.min(minX, centerX - width / 2);
6353
- minY = Math.min(minY, centerY - height / 2);
6354
- maxX = Math.max(maxX, centerX + width / 2);
6355
- maxY = Math.max(maxY, centerY + height / 2);
6353
+ if (rotation) {
6354
+ const rotatedBounds = getRotatedRectBounds(
6355
+ centerX,
6356
+ centerY,
6357
+ width,
6358
+ height,
6359
+ rotation
6360
+ );
6361
+ minX = Math.min(minX, rotatedBounds.minX);
6362
+ minY = Math.min(minY, rotatedBounds.minY);
6363
+ maxX = Math.max(maxX, rotatedBounds.maxX);
6364
+ maxY = Math.max(maxY, rotatedBounds.maxY);
6365
+ } else {
6366
+ minX = Math.min(minX, centerX - width / 2);
6367
+ minY = Math.min(minY, centerY - height / 2);
6368
+ maxX = Math.max(maxX, centerX + width / 2);
6369
+ maxY = Math.max(maxY, centerY + height / 2);
6370
+ }
6356
6371
  }
6357
6372
  if ("radius" in elm) {
6358
6373
  minX = Math.min(minX, centerX - elm.radius);
@@ -6534,6 +6549,16 @@ var getDebugLayoutObject = (lo) => {
6534
6549
  if ("outer_diameter" in lo) {
6535
6550
  width = lo.outer_diameter;
6536
6551
  height = lo.outer_diameter;
6552
+ } else if ("rect_pad_width" in lo && "rect_pad_height" in lo) {
6553
+ width = lo.rect_pad_width;
6554
+ height = lo.rect_pad_height;
6555
+ if ("hole_diameter" in lo) {
6556
+ width = Math.max(width, lo.hole_diameter);
6557
+ height = Math.max(height, lo.hole_diameter);
6558
+ }
6559
+ } else if ("hole_diameter" in lo) {
6560
+ width = lo.hole_diameter;
6561
+ height = lo.hole_diameter;
6537
6562
  }
6538
6563
  }
6539
6564
  if (width === void 0 || height === void 0) {
@@ -8142,11 +8167,27 @@ var convertElementToPrimitives = (element, allElements) => {
8142
8167
  case "pcb_trace": {
8143
8168
  const primitives = [];
8144
8169
  if (element.route_thickness_mode === "interpolated") {
8145
- const strokeInput = element.route.map((r) => ({
8146
- x: r.x,
8147
- y: r.y,
8148
- trace_width: r.route_type === "wire" ? r.width : 0.5
8149
- }));
8170
+ const strokeInput = element.route.flatMap((routePoint) => {
8171
+ if (routePoint.route_type === "through_pad") {
8172
+ return [
8173
+ {
8174
+ ...routePoint.start,
8175
+ trace_width: routePoint.width
8176
+ },
8177
+ {
8178
+ ...routePoint.end,
8179
+ trace_width: routePoint.width
8180
+ }
8181
+ ];
8182
+ }
8183
+ return [
8184
+ {
8185
+ x: routePoint.x,
8186
+ y: routePoint.y,
8187
+ trace_width: routePoint.route_type === "wire" ? routePoint.width : 0.5
8188
+ }
8189
+ ];
8190
+ });
8150
8191
  const expandedStroke = getExpandedStroke(strokeInput, 0.5);
8151
8192
  const layer = element.route[0].layer;
8152
8193
  primitives.push({
@@ -8840,8 +8881,10 @@ var zIndexMap = {
8840
8881
  ratsNestOverlay: 30,
8841
8882
  toolbarOverlay: 70,
8842
8883
  warnings: 30,
8843
- topLayer: 20,
8844
- // each layer after this is 1 less than the previous (supports up to 20 layers)
8884
+ // Canvas layers are assigned z-indexes below this value. A 10-layer board
8885
+ // needs 26 canvas planes once masks, silkscreen, notes, and other overlays
8886
+ // are included, so keep enough room for the complete stack.
8887
+ topLayer: 30,
8845
8888
  clickToInteractOverlay: 100
8846
8889
  };
8847
8890
 
@@ -8885,12 +8928,6 @@ var LAYER_NAME_TO_COLOR = {
8885
8928
  };
8886
8929
  var DEFAULT_DRAW_ORDER = [
8887
8930
  "board",
8888
- "inner6",
8889
- "inner5",
8890
- "inner4",
8891
- "inner3",
8892
- "inner2",
8893
- "inner1",
8894
8931
  "bottom",
8895
8932
  "soldermask_bottom",
8896
8933
  "bottom_silkscreen",
@@ -9192,6 +9229,14 @@ var Drawer = class {
9192
9229
  */
9193
9230
  orderAndFadeLayers() {
9194
9231
  const { canvasLayerMap, foregroundLayer } = this;
9232
+ const innerLayers = Object.keys(canvasLayerMap).filter((layer) => /^inner\d+$/.test(layer)).sort(
9233
+ (a, b) => Number(b.slice("inner".length)) - Number(a.slice("inner".length))
9234
+ );
9235
+ const defaultDrawOrder = [
9236
+ "board",
9237
+ ...innerLayers,
9238
+ ...DEFAULT_DRAW_ORDER.filter((layer) => layer !== "board")
9239
+ ];
9195
9240
  const associatedSoldermask = foregroundLayer === "top" ? "soldermask_top" : foregroundLayer === "bottom" ? "soldermask_bottom" : void 0;
9196
9241
  const associatedSilkscreen = foregroundLayer === "top" ? "top_silkscreen" : foregroundLayer === "bottom" ? "bottom_silkscreen" : void 0;
9197
9242
  const associatedNotes = foregroundLayer === "top" ? "top_notes" : foregroundLayer === "bottom" ? "bottom_notes" : void 0;
@@ -9219,7 +9264,7 @@ var Drawer = class {
9219
9264
  ...associatedCourtyard ? [associatedCourtyard] : []
9220
9265
  ];
9221
9266
  const order = [
9222
- ...DEFAULT_DRAW_ORDER.filter((l) => !layersToShiftToTop.includes(l)),
9267
+ ...defaultDrawOrder.filter((l) => !layersToShiftToTop.includes(l)),
9223
9268
  ...foregroundLayer === "drill" ? [] : [foregroundLayer],
9224
9269
  ...associatedSoldermask ? [associatedSoldermask] : [],
9225
9270
  "edge_cuts",
@@ -9553,6 +9598,55 @@ import {
9553
9598
  DEFAULT_PCB_COLOR_MAP as DEFAULT_PCB_COLOR_MAP3
9554
9599
  } from "circuit-to-canvas";
9555
9600
  import color from "color";
9601
+
9602
+ // src/lib/copper-layers.ts
9603
+ var getCopperLayerRefs = (numLayers = 2) => {
9604
+ const layerCount = Math.max(2, Math.min(10, Math.floor(numLayers)));
9605
+ return [
9606
+ "top",
9607
+ ...Array.from(
9608
+ { length: layerCount - 2 },
9609
+ (_, index) => `inner${index + 1}`
9610
+ ),
9611
+ "bottom"
9612
+ ];
9613
+ };
9614
+ var getCopperLayerRefsFromElements = (elements) => {
9615
+ const board = elements.find((element) => element.type === "pcb_board");
9616
+ return getCopperLayerRefs(board?.num_layers ?? 2);
9617
+ };
9618
+ var getCopperRenderLayer = (layer) => `${layer}_copper`;
9619
+ var normalizeCopperRenderLayers = (layers) => layers.map(
9620
+ (layer) => layer.endsWith("_copper") ? layer.slice(0, -"_copper".length) : layer
9621
+ );
9622
+ var getOrderedCanvasLayers = (elements) => {
9623
+ const innerLayers = getCopperLayerRefsFromElements(elements).filter(
9624
+ (layer) => layer.startsWith("inner")
9625
+ );
9626
+ return [
9627
+ "board",
9628
+ "bottom",
9629
+ "soldermask_bottom",
9630
+ "bottom_silkscreen",
9631
+ "top",
9632
+ "soldermask_top",
9633
+ "soldermask_with_copper_bottom",
9634
+ "soldermask_with_copper_top",
9635
+ "top_fabrication",
9636
+ "bottom_fabrication",
9637
+ ...innerLayers,
9638
+ "drill",
9639
+ "edge_cuts",
9640
+ "bottom_notes",
9641
+ "top_notes",
9642
+ "top_silkscreen",
9643
+ "top_courtyard",
9644
+ "bottom_courtyard",
9645
+ "other"
9646
+ ];
9647
+ };
9648
+
9649
+ // src/lib/draw-pcb-smtpad.ts
9556
9650
  var HOVER_COLOR_MAP = {
9557
9651
  ...DEFAULT_PCB_COLOR_MAP3,
9558
9652
  copper: {
@@ -9564,7 +9658,9 @@ var HOVER_COLOR_MAP = {
9564
9658
  inner3: color(colors_default.board.copper.in3).lighten(0.5).toString(),
9565
9659
  inner4: color(colors_default.board.copper.in4).lighten(0.5).toString(),
9566
9660
  inner5: color(colors_default.board.copper.in5).lighten(0.5).toString(),
9567
- inner6: color(colors_default.board.copper.in6).lighten(0.5).toString()
9661
+ inner6: color(colors_default.board.copper.in6).lighten(0.5).toString(),
9662
+ inner7: color(colors_default.board.copper.in7).lighten(0.5).toString(),
9663
+ inner8: color(colors_default.board.copper.in8).lighten(0.5).toString()
9568
9664
  }
9569
9665
  };
9570
9666
  function isPcbSmtPad(element) {
@@ -9578,20 +9674,8 @@ function drawPcbSmtPadElementsForLayer({
9578
9674
  primitives,
9579
9675
  drawSoldermask
9580
9676
  }) {
9581
- const smtPadElements = elements.filter(isPcbSmtPad).filter((element) => {
9582
- const elementLayer = element.layer;
9583
- return layers.some((layer) => {
9584
- if (layer === "top_copper" && elementLayer === "top") return true;
9585
- if (layer === "bottom_copper" && elementLayer === "bottom") return true;
9586
- if (layer === "inner1_copper" && elementLayer === "inner1") return true;
9587
- if (layer === "inner2_copper" && elementLayer === "inner2") return true;
9588
- if (layer === "inner3_copper" && elementLayer === "inner3") return true;
9589
- if (layer === "inner4_copper" && elementLayer === "inner4") return true;
9590
- if (layer === "inner5_copper" && elementLayer === "inner5") return true;
9591
- if (layer === "inner6_copper" && elementLayer === "inner6") return true;
9592
- return false;
9593
- });
9594
- });
9677
+ const targetLayers = new Set(normalizeCopperRenderLayers(layers));
9678
+ const smtPadElements = elements.filter(isPcbSmtPad).filter((element) => targetLayers.has(element.layer));
9595
9679
  if (smtPadElements.length === 0) return;
9596
9680
  const highlightedElementIds = /* @__PURE__ */ new Set();
9597
9681
  if (primitives) {
@@ -9640,15 +9724,14 @@ var HOVER_COLOR_MAP2 = {
9640
9724
  inner3: color2(colors_default.board.copper.in3).lighten(0.5).toString(),
9641
9725
  inner4: color2(colors_default.board.copper.in4).lighten(0.5).toString(),
9642
9726
  inner5: color2(colors_default.board.copper.in5).lighten(0.5).toString(),
9643
- inner6: color2(colors_default.board.copper.in6).lighten(0.5).toString()
9727
+ inner6: color2(colors_default.board.copper.in6).lighten(0.5).toString(),
9728
+ inner7: color2(colors_default.board.copper.in7).lighten(0.5).toString(),
9729
+ inner8: color2(colors_default.board.copper.in8).lighten(0.5).toString()
9644
9730
  }
9645
9731
  };
9646
9732
  function isPcbTrace(element) {
9647
9733
  return element.type === "pcb_trace";
9648
9734
  }
9649
- var normalizeCopperLayers = (layers) => layers.map(
9650
- (layer) => layer.endsWith("_copper") ? layer.replace("_copper", "") : layer
9651
- );
9652
9735
  var filterTraceByLayers = (trace, targetLayers) => {
9653
9736
  const filteredRoute = trace.route.filter((segment) => {
9654
9737
  if (segment.route_type === "wire" && "layer" in segment && targetLayers.has(segment.layer)) {
@@ -9675,7 +9758,7 @@ function drawPcbTraceElementsForLayer({
9675
9758
  realToCanvasMat,
9676
9759
  primitives
9677
9760
  }) {
9678
- const targetLayers = new Set(normalizeCopperLayers(layers));
9761
+ const targetLayers = new Set(normalizeCopperRenderLayers(layers));
9679
9762
  const traceElements = elements.filter(isPcbTrace).map((trace) => filterTraceByLayers(trace, targetLayers)).filter((trace) => trace !== null);
9680
9763
  if (traceElements.length === 0) return;
9681
9764
  const highlightedElementIds = /* @__PURE__ */ new Set();
@@ -9719,7 +9802,15 @@ var HOVER_COLOR_MAP3 = {
9719
9802
  copper: {
9720
9803
  ...DEFAULT_PCB_COLOR_MAP5.copper,
9721
9804
  top: color3(colors_default.board.pad_front).lighten(0.5).toString(),
9722
- bottom: color3(colors_default.board.pad_back).lighten(0.5).toString()
9805
+ bottom: color3(colors_default.board.pad_back).lighten(0.5).toString(),
9806
+ inner1: color3(colors_default.board.copper.in1).lighten(0.5).toString(),
9807
+ inner2: color3(colors_default.board.copper.in2).lighten(0.5).toString(),
9808
+ inner3: color3(colors_default.board.copper.in3).lighten(0.5).toString(),
9809
+ inner4: color3(colors_default.board.copper.in4).lighten(0.5).toString(),
9810
+ inner5: color3(colors_default.board.copper.in5).lighten(0.5).toString(),
9811
+ inner6: color3(colors_default.board.copper.in6).lighten(0.5).toString(),
9812
+ inner7: color3(colors_default.board.copper.in7).lighten(0.5).toString(),
9813
+ inner8: color3(colors_default.board.copper.in8).lighten(0.5).toString()
9723
9814
  }
9724
9815
  };
9725
9816
  function isPlatedHole(element) {
@@ -10175,7 +10266,9 @@ var HOVER_SOLDERMASK_COLOR_MAP = {
10175
10266
  inner3: color5(colors_default.board.copper.in3).lighten(0.5).toString(),
10176
10267
  inner4: color5(colors_default.board.copper.in4).lighten(0.5).toString(),
10177
10268
  inner5: color5(colors_default.board.copper.in5).lighten(0.5).toString(),
10178
- inner6: color5(colors_default.board.copper.in6).lighten(0.5).toString()
10269
+ inner6: color5(colors_default.board.copper.in6).lighten(0.5).toString(),
10270
+ inner7: color5(colors_default.board.copper.in7).lighten(0.5).toString(),
10271
+ inner8: color5(colors_default.board.copper.in8).lighten(0.5).toString()
10179
10272
  },
10180
10273
  soldermask: {
10181
10274
  ...DEFAULT_PCB_COLOR_MAP6.soldermask,
@@ -10297,7 +10390,15 @@ var HOVER_COLOR_MAP4 = {
10297
10390
  copper: {
10298
10391
  ...DEFAULT_PCB_COLOR_MAP8.copper,
10299
10392
  top: color6(colors_default.board.pad_front).lighten(0.5).toString(),
10300
- bottom: color6(colors_default.board.pad_back).lighten(0.5).toString()
10393
+ bottom: color6(colors_default.board.pad_back).lighten(0.5).toString(),
10394
+ inner1: color6(colors_default.board.copper.in1).lighten(0.5).toString(),
10395
+ inner2: color6(colors_default.board.copper.in2).lighten(0.5).toString(),
10396
+ inner3: color6(colors_default.board.copper.in3).lighten(0.5).toString(),
10397
+ inner4: color6(colors_default.board.copper.in4).lighten(0.5).toString(),
10398
+ inner5: color6(colors_default.board.copper.in5).lighten(0.5).toString(),
10399
+ inner6: color6(colors_default.board.copper.in6).lighten(0.5).toString(),
10400
+ inner7: color6(colors_default.board.copper.in7).lighten(0.5).toString(),
10401
+ inner8: color6(colors_default.board.copper.in8).lighten(0.5).toString()
10301
10402
  }
10302
10403
  };
10303
10404
  function isPcbVia(element) {
@@ -10379,32 +10480,6 @@ function drawCourtyardElementsForLayer({
10379
10480
  import { useEffect as useEffect5, useRef as useRef3 } from "react";
10380
10481
  import { SuperGrid, toMMSI } from "react-supergrid";
10381
10482
  import { jsx as jsx3, jsxs } from "react/jsx-runtime";
10382
- var orderedLayers = [
10383
- "board",
10384
- "bottom",
10385
- "soldermask_bottom",
10386
- "bottom_silkscreen",
10387
- "top",
10388
- "soldermask_top",
10389
- "soldermask_with_copper_bottom",
10390
- "soldermask_with_copper_top",
10391
- "top_fabrication",
10392
- "bottom_fabrication",
10393
- "inner1",
10394
- "inner2",
10395
- "inner3",
10396
- "inner4",
10397
- "inner5",
10398
- "inner6",
10399
- "drill",
10400
- "edge_cuts",
10401
- "bottom_notes",
10402
- "top_notes",
10403
- "top_silkscreen",
10404
- "top_courtyard",
10405
- "bottom_courtyard",
10406
- "other"
10407
- ];
10408
10483
  var CanvasPrimitiveRenderer = ({
10409
10484
  primitives,
10410
10485
  elements,
@@ -10442,22 +10517,11 @@ var CanvasPrimitiveRenderer = ({
10442
10517
  if (transform) {
10443
10518
  const topCanvas = canvasRefs.current.top;
10444
10519
  const bottomCanvas = canvasRefs.current.bottom;
10445
- const inner1Canvas = canvasRefs.current.inner1;
10446
- const inner2Canvas = canvasRefs.current.inner2;
10447
- const inner3Canvas = canvasRefs.current.inner3;
10448
- const inner4Canvas = canvasRefs.current.inner4;
10449
- const inner5Canvas = canvasRefs.current.inner5;
10450
- const inner6Canvas = canvasRefs.current.inner6;
10451
- const copperLayers = [
10452
- { canvas: topCanvas, copperLayer: "top_copper" },
10453
- { canvas: bottomCanvas, copperLayer: "bottom_copper" },
10454
- { canvas: inner1Canvas, copperLayer: "inner1_copper" },
10455
- { canvas: inner2Canvas, copperLayer: "inner2_copper" },
10456
- { canvas: inner3Canvas, copperLayer: "inner3_copper" },
10457
- { canvas: inner4Canvas, copperLayer: "inner4_copper" },
10458
- { canvas: inner5Canvas, copperLayer: "inner5_copper" },
10459
- { canvas: inner6Canvas, copperLayer: "inner6_copper" }
10460
- ];
10520
+ const copperLayers = getCopperLayerRefsFromElements(elements).map((layer) => ({
10521
+ canvas: canvasRefs.current[layer],
10522
+ layer,
10523
+ copperLayer: getCopperRenderLayer(layer)
10524
+ }));
10461
10525
  for (const { canvas, copperLayer } of copperLayers) {
10462
10526
  if (!canvas) continue;
10463
10527
  drawPcbTraceElementsForLayer({
@@ -10477,24 +10541,15 @@ var CanvasPrimitiveRenderer = ({
10477
10541
  realToCanvasMat: transform
10478
10542
  });
10479
10543
  }
10480
- if (topCanvas) {
10481
- drawPlatedHolePads({
10482
- canvas: topCanvas,
10483
- elements,
10484
- layers: ["top_copper"],
10485
- realToCanvasMat: transform,
10486
- primitives,
10487
- drawSoldermask: isShowingSolderMask
10488
- });
10489
- }
10490
- if (bottomCanvas) {
10544
+ for (const { canvas, copperLayer, layer } of copperLayers) {
10545
+ if (!canvas) continue;
10491
10546
  drawPlatedHolePads({
10492
- canvas: bottomCanvas,
10547
+ canvas,
10493
10548
  elements,
10494
- layers: ["bottom_copper"],
10549
+ layers: [copperLayer],
10495
10550
  realToCanvasMat: transform,
10496
10551
  primitives,
10497
- drawSoldermask: isShowingSolderMask
10552
+ drawSoldermask: isShowingSolderMask && (layer === "top" || layer === "bottom")
10498
10553
  });
10499
10554
  }
10500
10555
  for (const { canvas, copperLayer } of copperLayers) {
@@ -10517,24 +10572,15 @@ var CanvasPrimitiveRenderer = ({
10517
10572
  drawSoldermask: isShowingSolderMask
10518
10573
  });
10519
10574
  }
10520
- if (topCanvas) {
10521
- drawPcbViaElementsForLayer({
10522
- canvas: topCanvas,
10523
- elements,
10524
- layers: ["top_copper"],
10525
- realToCanvasMat: transform,
10526
- primitives,
10527
- drawSoldermask: isShowingSolderMask
10528
- });
10529
- }
10530
- if (bottomCanvas) {
10575
+ for (const { canvas, copperLayer, layer } of copperLayers) {
10576
+ if (!canvas) continue;
10531
10577
  drawPcbViaElementsForLayer({
10532
- canvas: bottomCanvas,
10578
+ canvas,
10533
10579
  elements,
10534
- layers: ["bottom_copper"],
10580
+ layers: [copperLayer],
10535
10581
  realToCanvasMat: transform,
10536
10582
  primitives,
10537
- drawSoldermask: isShowingSolderMask
10583
+ drawSoldermask: isShowingSolderMask && (layer === "top" || layer === "bottom")
10538
10584
  });
10539
10585
  }
10540
10586
  if (isShowingSolderMask) {
@@ -10727,7 +10773,7 @@ var CanvasPrimitiveRenderer = ({
10727
10773
  stringifyCoord: (x, y, z) => `${toMMSI(x, z)}, ${toMMSI(y, z)}`
10728
10774
  }
10729
10775
  ),
10730
- orderedLayers.filter((layer) => {
10776
+ getOrderedCanvasLayers(elements).filter((layer) => {
10731
10777
  if (!isShowingSolderMask && layer.includes("soldermask")) return false;
10732
10778
  if (!isShowingSilkscreen && layer.includes("silkscreen")) return false;
10733
10779
  return true;
@@ -14904,7 +14950,7 @@ import { css as css3 } from "@emotion/css";
14904
14950
  // package.json
14905
14951
  var package_default = {
14906
14952
  name: "@tscircuit/pcb-viewer",
14907
- version: "1.11.373",
14953
+ version: "1.11.374",
14908
14954
  main: "dist/index.js",
14909
14955
  type: "module",
14910
14956
  repository: "tscircuit/pcb-viewer",
@@ -14928,12 +14974,13 @@ var package_default = {
14928
14974
  "@semantic-release/npm": "^9.0.1",
14929
14975
  "@semantic-release/release-notes-generator": "^10.0.3",
14930
14976
  "@swc/core": "^1.4.12",
14931
- "@tscircuit/circuit-json-util": "^0.0.90",
14977
+ "@tscircuit/circuit-json-util": "^0.0.99",
14932
14978
  "@tscircuit/eagle-xml-converter": "^1.0.0",
14933
14979
  "@types/bun": "latest",
14934
14980
  "@types/color": "^3.0.6",
14935
14981
  "@types/node": "18.7.23",
14936
14982
  "@types/react": "19",
14983
+ "format-si-unit": "^0.0.7",
14937
14984
  next: "^14.1.4",
14938
14985
  "pixi.js": "^8.6.6",
14939
14986
  react: "19.1.0",
@@ -14957,8 +15004,8 @@ var package_default = {
14957
15004
  "@tscircuit/alphabet": "^0.0.23",
14958
15005
  "@tscircuit/math-utils": "^0.0.36",
14959
15006
  "@vitejs/plugin-react": "^5.0.2",
14960
- "circuit-json": "^0.0.421",
14961
- "circuit-to-canvas": "^0.0.110",
15007
+ "circuit-json": "^0.0.450",
15008
+ "circuit-to-canvas": "^0.0.112",
14962
15009
  color: "^4.2.3",
14963
15010
  "react-supergrid": "^1.0.10",
14964
15011
  "react-toastify": "^10.0.5",
@@ -15732,13 +15779,7 @@ var ToolbarOverlay = ({ children, elements }) => {
15732
15779
  window.removeEventListener("disarm-bounds-tool", disarmBounds);
15733
15780
  };
15734
15781
  }, []);
15735
- const pcbBoard = elements?.find((el) => el.type === "pcb_board");
15736
- const numLayers = pcbBoard?.num_layers || 2;
15737
- const availableLayers = numLayers <= 2 ? ["top", "bottom"] : [
15738
- "top",
15739
- ...Array.from({ length: numLayers - 2 }, (_, i) => `inner${i + 1}`),
15740
- "bottom"
15741
- ];
15782
+ const availableLayers = getCopperLayerRefsFromElements(elements ?? []);
15742
15783
  const processedLayers = availableLayers;
15743
15784
  const hasRunInitialMouseCheck = useRef14(false);
15744
15785
  const hotkeyBoundaryRef = useRef14(null);
@@ -15758,6 +15799,10 @@ var ToolbarOverlay = ({ children, elements }) => {
15758
15799
  "7": availableLayers[6] ? () => selectLayer(availableLayers[6]) : () => {
15759
15800
  },
15760
15801
  "8": availableLayers[7] ? () => selectLayer(availableLayers[7]) : () => {
15802
+ },
15803
+ "9": availableLayers[8] ? () => selectLayer(availableLayers[8]) : () => {
15804
+ },
15805
+ "0": availableLayers[9] ? () => selectLayer(availableLayers[9]) : () => {
15761
15806
  }
15762
15807
  };
15763
15808
  useHotKey("1", hotKeyCallbacks["1"], hotkeyBoundaryRef);
@@ -15768,6 +15813,8 @@ var ToolbarOverlay = ({ children, elements }) => {
15768
15813
  useHotKey("6", hotKeyCallbacks["6"], hotkeyBoundaryRef);
15769
15814
  useHotKey("7", hotKeyCallbacks["7"], hotkeyBoundaryRef);
15770
15815
  useHotKey("8", hotKeyCallbacks["8"], hotkeyBoundaryRef);
15816
+ useHotKey("9", hotKeyCallbacks["9"], hotkeyBoundaryRef);
15817
+ useHotKey("0", hotKeyCallbacks["0"], hotkeyBoundaryRef);
15771
15818
  useLayoutEffect2(() => {
15772
15819
  if (hasRunInitialMouseCheck.current) return;
15773
15820
  hasRunInitialMouseCheck.current = true;