biscuitboard 1.0.18 → 1.0.19

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/npm.cjs CHANGED
@@ -776,6 +776,33 @@ __export(npm_exports, {
776
776
  BOOSTERPACK_MIDDLE_VIA_CLUSTER_CENTER_X: () => BOOSTERPACK_MIDDLE_VIA_CLUSTER_CENTER_X,
777
777
  BOOSTERPACK_MIDDLE_VIA_CLUSTER_HEIGHT: () => BOOSTERPACK_MIDDLE_VIA_CLUSTER_HEIGHT,
778
778
  BOOSTERPACK_MIDDLE_VIA_CLUSTER_WIDTH: () => BOOSTERPACK_MIDDLE_VIA_CLUSTER_WIDTH,
779
+ BREADBOARD_08MM_BOTTOM_BANK_ROWS: () => BREADBOARD_08MM_BOTTOM_BANK_ROWS,
780
+ BREADBOARD_08MM_BREAKOUT_LANE_SPACING: () => BREADBOARD_08MM_BREAKOUT_LANE_SPACING,
781
+ BREADBOARD_08MM_BREAKOUT_PAD_DIAMETER: () => BREADBOARD_08MM_BREAKOUT_PAD_DIAMETER,
782
+ BREADBOARD_08MM_BREAKOUT_TRACE_WIDTH: () => BREADBOARD_08MM_BREAKOUT_TRACE_WIDTH,
783
+ BREADBOARD_08MM_BREAKOUT_WEAVE_OFFSET: () => BREADBOARD_08MM_BREAKOUT_WEAVE_OFFSET,
784
+ BREADBOARD_08MM_CORNER_VIA_ARM_WIDTH: () => BREADBOARD_08MM_CORNER_VIA_ARM_WIDTH,
785
+ BREADBOARD_08MM_CORNER_VIA_ARM_X_INNER_OFFSET: () => BREADBOARD_08MM_CORNER_VIA_ARM_X_INNER_OFFSET,
786
+ BREADBOARD_08MM_CORNER_VIA_LONG_SIDE_COLUMNS: () => BREADBOARD_08MM_CORNER_VIA_LONG_SIDE_COLUMNS,
787
+ BREADBOARD_08MM_CORNER_VIA_SPACING: () => BREADBOARD_08MM_CORNER_VIA_SPACING,
788
+ BREADBOARD_08MM_CORNER_VIA_X_INNER_OFFSET: () => BREADBOARD_08MM_CORNER_VIA_X_INNER_OFFSET,
789
+ BREADBOARD_08MM_CORNER_VIA_X_OUTER_OFFSET: () => BREADBOARD_08MM_CORNER_VIA_X_OUTER_OFFSET,
790
+ BREADBOARD_08MM_CORNER_VIA_X_OUTWARD_SHIFT: () => BREADBOARD_08MM_CORNER_VIA_X_OUTWARD_SHIFT,
791
+ BREADBOARD_08MM_CORNER_VIA_Y_INNER_OFFSET: () => BREADBOARD_08MM_CORNER_VIA_Y_INNER_OFFSET,
792
+ BREADBOARD_08MM_CORNER_VIA_Y_OUTER_OFFSET: () => BREADBOARD_08MM_CORNER_VIA_Y_OUTER_OFFSET,
793
+ BREADBOARD_08MM_EDGE_HUG_COLUMN_COUNT: () => BREADBOARD_08MM_EDGE_HUG_COLUMN_COUNT,
794
+ BREADBOARD_08MM_EDGE_HUG_Y_SHIFT: () => BREADBOARD_08MM_EDGE_HUG_Y_SHIFT,
795
+ BREADBOARD_08MM_MIN_VIA_EDGE_SPACING: () => BREADBOARD_08MM_MIN_VIA_EDGE_SPACING,
796
+ BREADBOARD_08MM_ROW_BREAKOUTS: () => BREADBOARD_08MM_ROW_BREAKOUTS,
797
+ BREADBOARD_08MM_ROW_BREAKOUT_LENGTH: () => BREADBOARD_08MM_ROW_BREAKOUT_LENGTH,
798
+ BREADBOARD_08MM_ROW_CONNECTIONS: () => BREADBOARD_08MM_ROW_CONNECTIONS,
799
+ BREADBOARD_08MM_ROW_TRACE_WIDTH: () => BREADBOARD_08MM_ROW_TRACE_WIDTH,
800
+ BREADBOARD_08MM_TOP_BANK_ROWS: () => BREADBOARD_08MM_TOP_BANK_ROWS,
801
+ BREADBOARD_08MM_TOP_RIGHT_LONG_SIDE_COLUMNS: () => BREADBOARD_08MM_TOP_RIGHT_LONG_SIDE_COLUMNS,
802
+ BREADBOARD_08MM_VIA_BREAKOUT_LENGTH: () => BREADBOARD_08MM_VIA_BREAKOUT_LENGTH,
803
+ BREADBOARD_08MM_VIA_HOLE_DIAMETER: () => BREADBOARD_08MM_VIA_HOLE_DIAMETER,
804
+ BREADBOARD_08MM_VIA_PAD_DIAMETER: () => BREADBOARD_08MM_VIA_PAD_DIAMETER,
805
+ BREADBOARD_08MM_VIA_POSITIONS: () => BREADBOARD_08MM_VIA_POSITIONS,
779
806
  BREADBOARD_CLAD_HEIGHT: () => BREADBOARD_CLAD_HEIGHT,
780
807
  BREADBOARD_CLAD_VIA_HOLE_DIAMETER: () => BREADBOARD_CLAD_VIA_HOLE_DIAMETER,
781
808
  BREADBOARD_CLAD_VIA_PAD_DIAMETER: () => BREADBOARD_CLAD_VIA_PAD_DIAMETER,
@@ -806,6 +833,7 @@ __export(npm_exports, {
806
833
  BoosterPackLeftHeader: () => BoosterPackLeftHeader,
807
834
  BoosterPackRightHeader: () => BoosterPackRightHeader,
808
835
  BreadboardClad: () => BreadboardClad,
836
+ BreadboardClad08mmVias: () => BreadboardClad08mmVias,
809
837
  BreadboardTerminalHeaders: () => BreadboardTerminalHeaders,
810
838
  CLAD_32X32_EDGE_CONNECTOR_OPENING: () => CLAD_32X32_EDGE_CONNECTOR_OPENING,
811
839
  CLAD_32X32_HEIGHT: () => CLAD_32X32_HEIGHT,
@@ -15894,9 +15922,513 @@ var BreadboardClad = ({
15894
15922
  }
15895
15923
  );
15896
15924
 
15897
- // lib/Clad32x32.tsx
15925
+ // lib/breadboard-clad-0.8mm-vias.tsx
15898
15926
  var import_react5 = require("react");
15899
15927
  var import_jsx_runtime5 = require("react/jsx-runtime");
15928
+ var BREADBOARD_08MM_VIA_HOLE_DIAMETER = 0.8;
15929
+ var BREADBOARD_08MM_VIA_PAD_DIAMETER = 0.9;
15930
+ var BREADBOARD_08MM_MIN_VIA_EDGE_SPACING = 2;
15931
+ var BREADBOARD_08MM_BREAKOUT_TRACE_WIDTH = 0.15;
15932
+ var BREADBOARD_08MM_ROW_TRACE_WIDTH = 0.3;
15933
+ var BREADBOARD_08MM_BREAKOUT_PAD_DIAMETER = 0.3;
15934
+ var BREADBOARD_08MM_CORNER_VIA_SPACING = 3;
15935
+ var BREADBOARD_08MM_CORNER_VIA_ARM_WIDTH = 3;
15936
+ var BREADBOARD_08MM_CORNER_VIA_ARM_X_INNER_OFFSET = 25;
15937
+ var BREADBOARD_08MM_CORNER_VIA_LONG_SIDE_COLUMNS = 5;
15938
+ var BREADBOARD_08MM_TOP_RIGHT_LONG_SIDE_COLUMNS = 6;
15939
+ var BREADBOARD_08MM_CORNER_VIA_X_OUTER_OFFSET = 31;
15940
+ var BREADBOARD_08MM_CORNER_VIA_X_INNER_OFFSET = BREADBOARD_08MM_CORNER_VIA_X_OUTER_OFFSET - (BREADBOARD_08MM_CORNER_VIA_LONG_SIDE_COLUMNS - 1) * BREADBOARD_08MM_CORNER_VIA_SPACING;
15941
+ var BREADBOARD_08MM_CORNER_VIA_Y_INNER_OFFSET = 19;
15942
+ var BREADBOARD_08MM_CORNER_VIA_Y_OUTER_OFFSET = 25;
15943
+ var BREADBOARD_08MM_CORNER_VIA_X_OUTWARD_SHIFT = 3;
15944
+ var BREADBOARD_08MM_EDGE_HUG_COLUMN_COUNT = 2;
15945
+ var BREADBOARD_08MM_EDGE_HUG_Y_SHIFT = BREADBOARD_08MM_CORNER_VIA_SPACING;
15946
+ var BREADBOARD_08MM_BREAKOUT_WEAVE_OFFSET = 0.8;
15947
+ var BREADBOARD_08MM_BREAKOUT_LANE_SPACING = 0.4;
15948
+ var BREADBOARD_08MM_VIA_BREAKOUT_LENGTH = 1;
15949
+ var BREADBOARD_08MM_ROW_BREAKOUT_LENGTH = 1.2;
15950
+ var BREADBOARD_08MM_CLAD_EDGE_CLEARANCE = 0.2;
15951
+ var BREADBOARD_08MM_CLAD_EDGE_CLEARANCE_VALIDATION_TOLERANCE = 1e-3;
15952
+ var BREADBOARD_08MM_BOTTOM_BEHIND_VIA_LANE_START_OFFSET = 1.2;
15953
+ var BREADBOARD_08MM_BOTTOM_BEHIND_VIA_LANE_SPACING = 0.4;
15954
+ var BREADBOARD_08MM_TOP_BANK_ROWS = [
15955
+ "A",
15956
+ "B",
15957
+ "C",
15958
+ "D",
15959
+ "E"
15960
+ ];
15961
+ var BREADBOARD_08MM_BOTTOM_BANK_ROWS = [
15962
+ "F",
15963
+ "G",
15964
+ "H",
15965
+ "I",
15966
+ "J"
15967
+ ];
15968
+ var roundCoordinate4 = (value) => Math.round(value * 1e6) / 1e6;
15969
+ var createPitchedRange2 = (start, end) => Array.from(
15970
+ {
15971
+ length: Math.round((end - start) / BREADBOARD_08MM_CORNER_VIA_SPACING) + 1
15972
+ },
15973
+ (_, index) => roundCoordinate4(start + index * BREADBOARD_08MM_CORNER_VIA_SPACING)
15974
+ );
15975
+ var cornerViaAxisX2 = createPitchedRange2(
15976
+ BREADBOARD_08MM_CORNER_VIA_X_INNER_OFFSET,
15977
+ BREADBOARD_08MM_CORNER_VIA_X_OUTER_OFFSET
15978
+ );
15979
+ var cornerViaArmAxisX2 = createPitchedRange2(
15980
+ BREADBOARD_08MM_CORNER_VIA_ARM_X_INNER_OFFSET,
15981
+ BREADBOARD_08MM_CORNER_VIA_ARM_X_INNER_OFFSET + BREADBOARD_08MM_CORNER_VIA_ARM_WIDTH
15982
+ );
15983
+ var cornerViaArmAxisY2 = createPitchedRange2(
15984
+ BREADBOARD_08MM_CORNER_VIA_Y_INNER_OFFSET,
15985
+ BREADBOARD_08MM_CORNER_VIA_Y_INNER_OFFSET + BREADBOARD_08MM_CORNER_VIA_ARM_WIDTH
15986
+ );
15987
+ var createCornerViaPositions2 = (corner, xSign, ySign) => {
15988
+ const xOutwardShift = xSign === -1 || ySign === -1 ? BREADBOARD_08MM_CORNER_VIA_X_OUTWARD_SHIFT : 0;
15989
+ const toBoardPoint = (point) => ({
15990
+ x: roundCoordinate4(point.x * xSign),
15991
+ y: roundCoordinate4(point.y * ySign)
15992
+ });
15993
+ const cornerLongSideAxisX = corner === "top_right" ? [
15994
+ ...cornerViaAxisX2,
15995
+ BREADBOARD_08MM_CORNER_VIA_X_OUTER_OFFSET + BREADBOARD_08MM_CORNER_VIA_SPACING
15996
+ ] : cornerViaAxisX2;
15997
+ const shiftedCornerViaAxisX = cornerLongSideAxisX.map(
15998
+ (x) => roundCoordinate4(x + xOutwardShift)
15999
+ );
16000
+ const shiftedCornerViaArmAxisX = cornerViaArmAxisX2.map(
16001
+ (x) => roundCoordinate4(x + xOutwardShift)
16002
+ );
16003
+ const verticalExtensionY = BREADBOARD_08MM_CORNER_VIA_Y_OUTER_OFFSET;
16004
+ const localVias = [
16005
+ ...shiftedCornerViaAxisX.flatMap(
16006
+ (x, xIndex) => cornerViaArmAxisY2.map((y, yIndex) => ({
16007
+ nameSuffix: `H${xIndex + 1}_${yIndex === 0 ? "INNER" : "OUTER"}`,
16008
+ arm: "horizontal",
16009
+ x,
16010
+ y: y + (xIndex < BREADBOARD_08MM_EDGE_HUG_COLUMN_COUNT ? BREADBOARD_08MM_EDGE_HUG_Y_SHIFT : 0)
16011
+ }))
16012
+ ),
16013
+ ...shiftedCornerViaArmAxisX.map((x, xIndex) => ({
16014
+ nameSuffix: `V3_${xIndex === 0 ? "INNER" : "OUTER"}`,
16015
+ arm: "vertical",
16016
+ x,
16017
+ y: verticalExtensionY
16018
+ }))
16019
+ ];
16020
+ const createBreakout = (via, openAreaEdge, layer) => {
16021
+ const innerX = shiftedCornerViaAxisX[0];
16022
+ const openCenterX = innerX - BREADBOARD_08MM_VIA_BREAKOUT_LENGTH;
16023
+ const openRowsY = BREADBOARD_08MM_CORNER_VIA_Y_INNER_OFFSET - BREADBOARD_08MM_VIA_BREAKOUT_LENGTH;
16024
+ const columnIndex = Math.round(
16025
+ (via.x - innerX) / BREADBOARD_08MM_CORNER_VIA_SPACING
16026
+ );
16027
+ if (layer === "top") {
16028
+ if (openAreaEdge === "toward_breadboard_rows") {
16029
+ if (via.y === BREADBOARD_08MM_CORNER_VIA_Y_INNER_OFFSET) {
16030
+ return {
16031
+ openAreaEdge,
16032
+ style: "direct",
16033
+ route: [],
16034
+ end: { x: via.x, y: openRowsY }
16035
+ };
16036
+ }
16037
+ const rowWeaveDirection = columnIndex % 2 === 0 ? -1 : 1;
16038
+ const weaveDirection = via.y === BREADBOARD_08MM_CORNER_VIA_Y_OUTER_OFFSET ? -rowWeaveDirection : rowWeaveDirection;
16039
+ const weaveX = via.x + weaveDirection * BREADBOARD_08MM_BREAKOUT_WEAVE_OFFSET;
16040
+ return {
16041
+ openAreaEdge,
16042
+ style: "woven",
16043
+ route: [
16044
+ {
16045
+ x: weaveX,
16046
+ y: via.y - BREADBOARD_08MM_BREAKOUT_WEAVE_OFFSET
16047
+ }
16048
+ ],
16049
+ end: { x: weaveX, y: openRowsY }
16050
+ };
16051
+ }
16052
+ if (columnIndex === 0) {
16053
+ return {
16054
+ openAreaEdge,
16055
+ style: "direct",
16056
+ route: [],
16057
+ end: { x: openCenterX, y: via.y }
16058
+ };
16059
+ }
16060
+ const weaveY = via.y - BREADBOARD_08MM_BREAKOUT_WEAVE_OFFSET;
16061
+ return {
16062
+ openAreaEdge,
16063
+ style: "woven",
16064
+ route: [
16065
+ {
16066
+ x: via.x - BREADBOARD_08MM_BREAKOUT_WEAVE_OFFSET,
16067
+ y: weaveY
16068
+ }
16069
+ ],
16070
+ end: { x: openCenterX, y: weaveY }
16071
+ };
16072
+ }
16073
+ if (openAreaEdge === "toward_board_center") {
16074
+ if (via.arm === "vertical") {
16075
+ const verticalArmIndex = shiftedCornerViaArmAxisX.indexOf(via.x);
16076
+ const behindViaLaneY = via.y + BREADBOARD_08MM_BOTTOM_BEHIND_VIA_LANE_START_OFFSET + verticalArmIndex * BREADBOARD_08MM_BOTTOM_BEHIND_VIA_LANE_SPACING;
16077
+ return {
16078
+ openAreaEdge,
16079
+ style: "woven",
16080
+ route: [
16081
+ {
16082
+ x: via.x - BREADBOARD_08MM_BREAKOUT_WEAVE_OFFSET,
16083
+ y: behindViaLaneY
16084
+ }
16085
+ ],
16086
+ end: { x: openCenterX, y: behindViaLaneY }
16087
+ };
16088
+ }
16089
+ if (columnIndex === 0) {
16090
+ return {
16091
+ openAreaEdge,
16092
+ style: "direct",
16093
+ route: [],
16094
+ end: { x: openCenterX, y: via.y }
16095
+ };
16096
+ }
16097
+ const laneOffset = 0.7 + (columnIndex - 1) * BREADBOARD_08MM_BREAKOUT_LANE_SPACING;
16098
+ const laneY = via.y - laneOffset;
16099
+ return {
16100
+ openAreaEdge,
16101
+ style: "woven",
16102
+ route: [
16103
+ {
16104
+ x: via.x - BREADBOARD_08MM_BREAKOUT_WEAVE_OFFSET,
16105
+ y: laneY
16106
+ }
16107
+ ],
16108
+ end: { x: openCenterX, y: laneY }
16109
+ };
16110
+ }
16111
+ const wrapLaneX = openCenterX - (via.y === BREADBOARD_08MM_CORNER_VIA_Y_OUTER_OFFSET ? columnIndex === 0 ? 1.6 : 2 : 0.4);
16112
+ const outerRowWeaveY = via.y + BREADBOARD_08MM_BREAKOUT_WEAVE_OFFSET;
16113
+ const route = via.y === BREADBOARD_08MM_CORNER_VIA_Y_OUTER_OFFSET && columnIndex > 0 ? [
16114
+ {
16115
+ x: via.x - BREADBOARD_08MM_BREAKOUT_WEAVE_OFFSET,
16116
+ y: outerRowWeaveY
16117
+ },
16118
+ {
16119
+ x: wrapLaneX,
16120
+ y: outerRowWeaveY
16121
+ }
16122
+ ] : [{ x: wrapLaneX, y: via.y }];
16123
+ return {
16124
+ openAreaEdge,
16125
+ style: "woven",
16126
+ route,
16127
+ end: { x: wrapLaneX, y: openRowsY }
16128
+ };
16129
+ };
16130
+ const toBoardBreakout = (breakout) => ({
16131
+ openAreaEdge: breakout.openAreaEdge,
16132
+ style: breakout.style,
16133
+ route: breakout.route.map(toBoardPoint),
16134
+ end: toBoardPoint(breakout.end)
16135
+ });
16136
+ return localVias.map((via) => {
16137
+ const boardCenterDistance = via.x - shiftedCornerViaAxisX[0];
16138
+ const breadboardRowsDistance = via.y - BREADBOARD_08MM_CORNER_VIA_Y_INNER_OFFSET;
16139
+ const topOpenAreaEdge = boardCenterDistance < breadboardRowsDistance ? "toward_board_center" : "toward_breadboard_rows";
16140
+ const bottomOpenAreaEdge = topOpenAreaEdge === "toward_board_center" ? "toward_breadboard_rows" : "toward_board_center";
16141
+ return {
16142
+ name: `V_${corner.toUpperCase()}_${via.nameSuffix}`,
16143
+ corner,
16144
+ arm: via.arm,
16145
+ ...toBoardPoint(via),
16146
+ topBreakout: toBoardBreakout(createBreakout(via, topOpenAreaEdge, "top")),
16147
+ bottomBreakout: toBoardBreakout(
16148
+ createBreakout(via, bottomOpenAreaEdge, "bottom")
16149
+ )
16150
+ };
16151
+ });
16152
+ };
16153
+ var BREADBOARD_08MM_VIA_POSITIONS = [
16154
+ ["top_left", -1, 1],
16155
+ ["top_right", 1, 1],
16156
+ ["bottom_left", -1, -1],
16157
+ ["bottom_right", 1, -1]
16158
+ ].flatMap(
16159
+ ([corner, xSign, ySign]) => createCornerViaPositions2(corner, xSign, ySign)
16160
+ );
16161
+ var createBankRowConnections = (rows, column) => rows.slice(0, -1).map((row, index) => ({
16162
+ from: `${row}${column}`,
16163
+ to: `${rows[index + 1]}${column}`,
16164
+ column
16165
+ }));
16166
+ var BREADBOARD_08MM_ROW_CONNECTIONS = Array.from(
16167
+ { length: BREADBOARD_COLUMN_COUNT },
16168
+ (_, index) => index + 1
16169
+ ).flatMap((column) => [
16170
+ ...createBankRowConnections(BREADBOARD_08MM_TOP_BANK_ROWS, column),
16171
+ ...createBankRowConnections(BREADBOARD_08MM_BOTTOM_BANK_ROWS, column)
16172
+ ]);
16173
+ var createRowBreakout = (terminalLabel, column, y, yDirection) => {
16174
+ const x = BREADBOARD_COLUMN_XS[column - 1];
16175
+ return {
16176
+ name: `ROW_${terminalLabel}_BREAKOUT`,
16177
+ terminalLabel,
16178
+ column,
16179
+ start: { x, y },
16180
+ end: {
16181
+ x,
16182
+ y: roundCoordinate4(y + yDirection * BREADBOARD_08MM_ROW_BREAKOUT_LENGTH)
16183
+ }
16184
+ };
16185
+ };
16186
+ var BREADBOARD_08MM_ROW_BREAKOUTS = Array.from(
16187
+ { length: BREADBOARD_COLUMN_COUNT },
16188
+ (_, index) => index + 1
16189
+ ).flatMap((column) => [
16190
+ createRowBreakout(`A${column}`, column, BREADBOARD_TERMINAL_ROW_YS.A, 1),
16191
+ createRowBreakout(`E${column}`, column, BREADBOARD_TERMINAL_ROW_YS.E, -1),
16192
+ createRowBreakout(`F${column}`, column, BREADBOARD_TERMINAL_ROW_YS.F, 1),
16193
+ createRowBreakout(`J${column}`, column, BREADBOARD_TERMINAL_ROW_YS.J, -1)
16194
+ ]);
16195
+ var viaBreakoutPinLabels = Object.fromEntries(
16196
+ BREADBOARD_08MM_VIA_POSITIONS.flatMap((via, index) => [
16197
+ [`pin${index * 2 + 1}`, `${via.name}_TOP`],
16198
+ [`pin${index * 2 + 2}`, `${via.name}_BOTTOM`]
16199
+ ])
16200
+ );
16201
+ var rowBreakoutPinLabels = Object.fromEntries(
16202
+ BREADBOARD_08MM_ROW_BREAKOUTS.map((breakout, index) => [
16203
+ `pin${index + 1}`,
16204
+ breakout.name
16205
+ ])
16206
+ );
16207
+ var Breadboard08mmViaBreakoutFootprint = () => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("footprint", { children: BREADBOARD_08MM_VIA_POSITIONS.map((via, index) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_react5.Fragment, { children: [
16208
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16209
+ "smtpad",
16210
+ {
16211
+ portHints: [`pin${index * 2 + 1}`],
16212
+ shape: "circle",
16213
+ radius: `${BREADBOARD_08MM_BREAKOUT_PAD_DIAMETER / 2}mm`,
16214
+ layer: "top",
16215
+ pcbX: via.topBreakout.end.x,
16216
+ pcbY: via.topBreakout.end.y
16217
+ }
16218
+ ),
16219
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16220
+ "smtpad",
16221
+ {
16222
+ portHints: [`pin${index * 2 + 2}`],
16223
+ shape: "circle",
16224
+ radius: `${BREADBOARD_08MM_BREAKOUT_PAD_DIAMETER / 2}mm`,
16225
+ layer: "bottom",
16226
+ pcbX: via.bottomBreakout.end.x,
16227
+ pcbY: via.bottomBreakout.end.y
16228
+ }
16229
+ )
16230
+ ] }, `via-breakout-pad-${via.name}`)) });
16231
+ var Breadboard08mmRowBreakoutFootprint = () => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("footprint", { children: BREADBOARD_08MM_ROW_BREAKOUTS.map((breakout, index) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react5.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16232
+ "smtpad",
16233
+ {
16234
+ portHints: [`pin${index + 1}`],
16235
+ shape: "circle",
16236
+ radius: `${BREADBOARD_08MM_BREAKOUT_PAD_DIAMETER / 2}mm`,
16237
+ pcbX: breakout.end.x,
16238
+ pcbY: breakout.end.y
16239
+ }
16240
+ ) }, `row-breakout-pad-${breakout.name}`)) });
16241
+ var BreadboardClad08mmVias = ({
16242
+ children,
16243
+ autorouter,
16244
+ autorouterOptions,
16245
+ minTraceWidth,
16246
+ nominalTraceWidth = BREADBOARD_08MM_BREAKOUT_TRACE_WIDTH
16247
+ }) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
16248
+ "board",
16249
+ {
16250
+ name: "BreadboardClad08mmVias",
16251
+ title: "Pre-routed breadboard clad with separate 0.8 mm corner vias",
16252
+ width: `${BREADBOARD_CLAD_WIDTH}mm`,
16253
+ height: `${BREADBOARD_CLAD_HEIGHT}mm`,
16254
+ borderRadius: "2mm",
16255
+ layers: 2,
16256
+ minTraceWidth: `${minTraceWidth ?? 0.15}mm`,
16257
+ minBoardEdgeClearance: `${BREADBOARD_08MM_CLAD_EDGE_CLEARANCE - BREADBOARD_08MM_CLAD_EDGE_CLEARANCE_VALIDATION_TOLERANCE}mm`,
16258
+ minViaHoleDiameter: `${BREADBOARD_08MM_VIA_HOLE_DIAMETER}mm`,
16259
+ minViaPadDiameter: `${BREADBOARD_08MM_VIA_PAD_DIAMETER}mm`,
16260
+ minViaHoleEdgeToViaHoleEdgeClearance: `${BREADBOARD_08MM_MIN_VIA_EDGE_SPACING}mm`,
16261
+ pcbStyle: {
16262
+ viaHoleDiameter: `${BREADBOARD_08MM_VIA_HOLE_DIAMETER}mm`,
16263
+ viaPadDiameter: `${BREADBOARD_08MM_VIA_PAD_DIAMETER}mm`
16264
+ },
16265
+ autorouter: autorouter ?? createPrefabricatedViaAutorouter({
16266
+ width: BREADBOARD_CLAD_WIDTH,
16267
+ height: BREADBOARD_CLAD_HEIGHT,
16268
+ edgeClearance: BREADBOARD_08MM_CLAD_EDGE_CLEARANCE,
16269
+ options: autorouterOptions,
16270
+ minimumTraceWidth: minTraceWidth,
16271
+ nominalTraceWidth
16272
+ }),
16273
+ children: [
16274
+ BISCUIT_BOARD_MOUNTING_HOLE_POSITIONS.map((hole) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react5.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16275
+ "hole",
16276
+ {
16277
+ pcbX: hole.x,
16278
+ pcbY: hole.y,
16279
+ diameter: `${BREADBOARD_MOUNTING_HOLE_DIAMETER}mm`
16280
+ }
16281
+ ) }, `breadboard-08mm-mounting-hole-${hole.x}-${hole.y}`)),
16282
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(BreadboardTerminalHeaders, { name: "J_TERMINALS" }),
16283
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16284
+ "pinheader",
16285
+ {
16286
+ name: "J_VIA_BREAKOUTS",
16287
+ pinCount: BREADBOARD_08MM_VIA_POSITIONS.length * 2,
16288
+ pinLabels: viaBreakoutPinLabels,
16289
+ manufacturerPartNumber: "GENERIC-BREADBOARD-08MM-VIA-BREAKOUTS",
16290
+ footprint: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Breadboard08mmViaBreakoutFootprint, {}),
16291
+ gender: "unpopulated",
16292
+ showSilkscreenPinLabels: false,
16293
+ obstructsWithinBounds: false,
16294
+ pcbX: 0,
16295
+ pcbY: 0,
16296
+ shouldBeOnEdgeOfBoard: false,
16297
+ pcbStyle: { silkscreenTextVisibility: "hidden" }
16298
+ }
16299
+ ),
16300
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16301
+ "pinheader",
16302
+ {
16303
+ name: "J_ROW_BREAKOUTS",
16304
+ pinCount: BREADBOARD_08MM_ROW_BREAKOUTS.length,
16305
+ pinLabels: rowBreakoutPinLabels,
16306
+ manufacturerPartNumber: "GENERIC-BREADBOARD-ROW-BREAKOUTS",
16307
+ footprint: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Breadboard08mmRowBreakoutFootprint, {}),
16308
+ gender: "unpopulated",
16309
+ showSilkscreenPinLabels: false,
16310
+ obstructsWithinBounds: false,
16311
+ pcbX: 0,
16312
+ pcbY: 0,
16313
+ shouldBeOnEdgeOfBoard: false,
16314
+ pcbStyle: { silkscreenTextVisibility: "hidden" }
16315
+ }
16316
+ ),
16317
+ [1, 5, 10, 15, 20, BREADBOARD_COLUMN_COUNT].map((column) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react5.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16318
+ "silkscreentext",
16319
+ {
16320
+ text: `${column}`,
16321
+ pcbX: BREADBOARD_COLUMN_XS[column - 1],
16322
+ pcbY: 17.2,
16323
+ fontSize: "0.55mm"
16324
+ }
16325
+ ) }, `breadboard-08mm-column-label-${column}`)),
16326
+ BREADBOARD_08MM_VIA_POSITIONS.map((via) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react5.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16327
+ "trace",
16328
+ {
16329
+ name: `${via.name}_DUAL_LAYER_BREAKOUT`,
16330
+ from: `.J_VIA_BREAKOUTS > .${via.name}_TOP`,
16331
+ to: `.J_VIA_BREAKOUTS > .${via.name}_BOTTOM`,
16332
+ pcbPath: [
16333
+ `.J_VIA_BREAKOUTS > .${via.name}_TOP`,
16334
+ ...via.topBreakout.route.toReversed(),
16335
+ { x: via.x, y: via.y },
16336
+ {
16337
+ x: via.x,
16338
+ y: via.y,
16339
+ via: true,
16340
+ fromLayer: "top",
16341
+ toLayer: "bottom"
16342
+ },
16343
+ { x: via.x, y: via.y },
16344
+ ...via.bottomBreakout.route,
16345
+ `.J_VIA_BREAKOUTS > .${via.name}_BOTTOM`
16346
+ ],
16347
+ width: `${BREADBOARD_08MM_BREAKOUT_TRACE_WIDTH}mm`
16348
+ }
16349
+ ) }, via.name)),
16350
+ BREADBOARD_08MM_ROW_CONNECTIONS.map((connection) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react5.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16351
+ "trace",
16352
+ {
16353
+ name: `ROW_${connection.from}_${connection.to}`,
16354
+ from: `.J_TERMINALS > .${connection.from}`,
16355
+ to: `.J_TERMINALS > .${connection.to}`,
16356
+ width: `${BREADBOARD_08MM_ROW_TRACE_WIDTH}mm`
16357
+ }
16358
+ ) }, `${connection.from}-${connection.to}`)),
16359
+ BREADBOARD_08MM_ROW_BREAKOUTS.map((breakout) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react5.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16360
+ "trace",
16361
+ {
16362
+ name: breakout.name,
16363
+ from: `.J_TERMINALS > .${breakout.terminalLabel}`,
16364
+ to: `.J_ROW_BREAKOUTS > .${breakout.name}`,
16365
+ width: `${BREADBOARD_08MM_ROW_TRACE_WIDTH}mm`
16366
+ }
16367
+ ) }, breakout.name)),
16368
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16369
+ "silkscreentext",
16370
+ {
16371
+ text: "0.8MM VIA BREADBOARD",
16372
+ pcbX: 33.5,
16373
+ pcbY: 0,
16374
+ pcbRotation: 90,
16375
+ fontSize: "0.65mm"
16376
+ }
16377
+ ),
16378
+ BREADBOARD_08MM_TOP_BANK_ROWS.map((row) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react5.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16379
+ "silkscreentext",
16380
+ {
16381
+ text: row,
16382
+ pcbX: -28.3,
16383
+ pcbY: BREADBOARD_TERMINAL_ROW_YS[row],
16384
+ fontSize: "0.55mm"
16385
+ }
16386
+ ) }, `top-row-label-${row}`)),
16387
+ BREADBOARD_08MM_BOTTOM_BANK_ROWS.map((row) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react5.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16388
+ "silkscreentext",
16389
+ {
16390
+ text: row,
16391
+ pcbX: -28.3,
16392
+ pcbY: BREADBOARD_TERMINAL_ROW_YS[row],
16393
+ fontSize: "0.55mm"
16394
+ }
16395
+ ) }, `bottom-row-label-${row}`)),
16396
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16397
+ "pcbnotedimension",
16398
+ {
16399
+ from: {
16400
+ x: -BREADBOARD_CLAD_WIDTH / 2,
16401
+ y: BREADBOARD_CLAD_HEIGHT / 2 + 2.5
16402
+ },
16403
+ to: {
16404
+ x: BREADBOARD_CLAD_WIDTH / 2,
16405
+ y: BREADBOARD_CLAD_HEIGHT / 2 + 2.5
16406
+ },
16407
+ text: `${BREADBOARD_CLAD_WIDTH}mm`
16408
+ }
16409
+ ),
16410
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16411
+ "pcbnotedimension",
16412
+ {
16413
+ from: {
16414
+ x: BREADBOARD_CLAD_WIDTH / 2 + 2.5,
16415
+ y: -BREADBOARD_CLAD_HEIGHT / 2
16416
+ },
16417
+ to: {
16418
+ x: BREADBOARD_CLAD_WIDTH / 2 + 2.5,
16419
+ y: BREADBOARD_CLAD_HEIGHT / 2
16420
+ },
16421
+ text: `${BREADBOARD_CLAD_HEIGHT}mm`
16422
+ }
16423
+ ),
16424
+ children
16425
+ ]
16426
+ }
16427
+ );
16428
+
16429
+ // lib/Clad32x32.tsx
16430
+ var import_react6 = require("react");
16431
+ var import_jsx_runtime6 = require("react/jsx-runtime");
15900
16432
  var CLAD_32X32_WIDTH = 32;
15901
16433
  var CLAD_32X32_HEIGHT = 32;
15902
16434
  var CLAD_32X32_MOUNTING_HOLE_DIAMETER = 2;
@@ -15917,22 +16449,22 @@ var CLAD_32X32_MOUNTING_HOLE_POSITIONS = [
15917
16449
  ];
15918
16450
  var CLAD_32X32_EDGE_CLEARANCE = 0.2;
15919
16451
  var CLAD_32X32_EDGE_CLEARANCE_VALIDATION_TOLERANCE = 1e-3;
15920
- var roundCoordinate4 = (value) => Math.round(value * 1e6) / 1e6;
15921
- var createPitchedRange2 = (start, end) => Array.from(
16452
+ var roundCoordinate5 = (value) => Math.round(value * 1e6) / 1e6;
16453
+ var createPitchedRange3 = (start, end) => Array.from(
15922
16454
  {
15923
16455
  length: Math.round((end - start) / CLAD_32X32_VIA_SPACING) + 1
15924
16456
  },
15925
- (_, index) => roundCoordinate4(start + index * CLAD_32X32_VIA_SPACING)
16457
+ (_, index) => roundCoordinate5(start + index * CLAD_32X32_VIA_SPACING)
15926
16458
  );
15927
- var cornerAxis = createPitchedRange2(
16459
+ var cornerAxis = createPitchedRange3(
15928
16460
  CLAD_32X32_VIA_ARM_INNER_OFFSET,
15929
16461
  CLAD_32X32_VIA_ARM_OUTER_OFFSET
15930
16462
  );
15931
- var armAxis = createPitchedRange2(
16463
+ var armAxis = createPitchedRange3(
15932
16464
  CLAD_32X32_VIA_ARM_INNER_OFFSET,
15933
16465
  CLAD_32X32_VIA_ARM_INNER_OFFSET + CLAD_32X32_VIA_ARM_WIDTH
15934
16466
  );
15935
- var createCornerViaPositions2 = (xSign, ySign) => {
16467
+ var createCornerViaPositions3 = (xSign, ySign) => {
15936
16468
  const horizontalArm = cornerAxis.flatMap(
15937
16469
  (x) => armAxis.map((y) => ({ x: x * xSign, y: y * ySign }))
15938
16470
  );
@@ -15953,7 +16485,7 @@ var CLAD_32X32_VIA_POSITIONS = [
15953
16485
  [-1, 1],
15954
16486
  [1, -1],
15955
16487
  [1, 1]
15956
- ].flatMap(([xSign, ySign]) => createCornerViaPositions2(xSign, ySign));
16488
+ ].flatMap(([xSign, ySign]) => createCornerViaPositions3(xSign, ySign));
15957
16489
  var Clad32x32 = ({
15958
16490
  children,
15959
16491
  autorouter,
@@ -15961,7 +16493,7 @@ var Clad32x32 = ({
15961
16493
  minTraceWidth,
15962
16494
  nominalTraceWidth = 0.2,
15963
16495
  routingDisabled = false
15964
- }) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
16496
+ }) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
15965
16497
  "board",
15966
16498
  {
15967
16499
  name: "Clad32x32",
@@ -15984,7 +16516,7 @@ var Clad32x32 = ({
15984
16516
  }),
15985
16517
  routingDisabled,
15986
16518
  children: [
15987
- CLAD_32X32_MOUNTING_HOLE_POSITIONS.map((hole) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react5.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16519
+ CLAD_32X32_MOUNTING_HOLE_POSITIONS.map((hole) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react6.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
15988
16520
  "hole",
15989
16521
  {
15990
16522
  pcbX: hole.x,
@@ -15992,7 +16524,7 @@ var Clad32x32 = ({
15992
16524
  diameter: `${CLAD_32X32_MOUNTING_HOLE_DIAMETER}mm`
15993
16525
  }
15994
16526
  ) }, `clad-32x32-mounting-hole-${hole.x}-${hole.y}`)),
15995
- CLAD_32X32_VIA_POSITIONS.map((via) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react5.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16527
+ CLAD_32X32_VIA_POSITIONS.map((via) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react6.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
15996
16528
  "via",
15997
16529
  {
15998
16530
  netIsAssignable: true,
@@ -16004,7 +16536,7 @@ var Clad32x32 = ({
16004
16536
  outerDiameter: `${CLAD_32X32_VIA_PAD_DIAMETER}mm`
16005
16537
  }
16006
16538
  ) }, `clad-32x32-prefab-via-${via.x}-${via.y}`)),
16007
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16539
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
16008
16540
  "pcbnotedimension",
16009
16541
  {
16010
16542
  from: { x: -CLAD_32X32_WIDTH / 2, y: CLAD_32X32_HEIGHT / 2 + 2.5 },
@@ -16012,7 +16544,7 @@ var Clad32x32 = ({
16012
16544
  text: `${CLAD_32X32_WIDTH}mm`
16013
16545
  }
16014
16546
  ),
16015
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
16547
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
16016
16548
  "pcbnotedimension",
16017
16549
  {
16018
16550
  from: { x: CLAD_32X32_WIDTH / 2 + 2.5, y: -CLAD_32X32_HEIGHT / 2 },
@@ -16026,8 +16558,8 @@ var Clad32x32 = ({
16026
16558
  );
16027
16559
 
16028
16560
  // lib/feather-clad.tsx
16029
- var import_react6 = require("react");
16030
- var import_jsx_runtime6 = require("react/jsx-runtime");
16561
+ var import_react7 = require("react");
16562
+ var import_jsx_runtime7 = require("react/jsx-runtime");
16031
16563
  var FEATHER_CLAD_WIDTH = 22.86;
16032
16564
  var FEATHER_CLAD_HEIGHT = 50.8;
16033
16565
  var FEATHER_HEADER_PITCH = 2.54;
@@ -16103,7 +16635,7 @@ var FEATHER_PIN_NAMES = Array.from(
16103
16635
  { length: 28 },
16104
16636
  (_, index) => `pin${index + 1}`
16105
16637
  );
16106
- var FeatherPinHeaderFootprint = () => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("footprint", { insertionDirection: "from_below", children: FEATHER_HEADER_POSITIONS.map((position, index) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react6.Fragment, { children: index === 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
16638
+ var FeatherPinHeaderFootprint = () => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("footprint", { insertionDirection: "from_below", children: FEATHER_HEADER_POSITIONS.map((position, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react7.Fragment, { children: index === 0 ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16107
16639
  "platedhole",
16108
16640
  {
16109
16641
  portHints: [`pin${index + 1}`],
@@ -16114,7 +16646,7 @@ var FeatherPinHeaderFootprint = () => /* @__PURE__ */ (0, import_jsx_runtime6.js
16114
16646
  pcbX: position.x,
16115
16647
  pcbY: position.y
16116
16648
  }
16117
- ) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
16649
+ ) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16118
16650
  "platedhole",
16119
16651
  {
16120
16652
  portHints: [`pin${index + 1}`],
@@ -16125,12 +16657,12 @@ var FeatherPinHeaderFootprint = () => /* @__PURE__ */ (0, import_jsx_runtime6.js
16125
16657
  pcbY: position.y
16126
16658
  }
16127
16659
  ) }, `feather-header-${position.x}-${position.y}`)) });
16128
- var FeatherPinHeaders = (props) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
16660
+ var FeatherPinHeaders = (props) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16129
16661
  "connector",
16130
16662
  {
16131
16663
  pinLabels: FEATHER_PIN_LABELS,
16132
16664
  manufacturerPartNumber: "GENERIC-FEATHER-1X16-PLUS-1X12-MALE-2.54MM-DOWN",
16133
- footprint: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FeatherPinHeaderFootprint, {}),
16665
+ footprint: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(FeatherPinHeaderFootprint, {}),
16134
16666
  noSchematicRepresentation: true,
16135
16667
  ...props
16136
16668
  }
@@ -16144,7 +16676,7 @@ var FeatherCladWithPinHeaders = ({
16144
16676
  routingDisabled = false,
16145
16677
  markHeadersNoConnect = false,
16146
16678
  showUsbLabel = true
16147
- }) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
16679
+ }) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
16148
16680
  "board",
16149
16681
  {
16150
16682
  name: "FeatherCladWithPinHeaders",
@@ -16167,14 +16699,14 @@ var FeatherCladWithPinHeaders = ({
16167
16699
  }),
16168
16700
  routingDisabled,
16169
16701
  children: [
16170
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
16702
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16171
16703
  FeatherPinHeaders,
16172
16704
  {
16173
16705
  name: "J_FEATHER",
16174
16706
  noConnect: markHeadersNoConnect ? FEATHER_PIN_NAMES : void 0
16175
16707
  }
16176
16708
  ),
16177
- FEATHER_MOUNTING_HOLE_POSITIONS.map((hole) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react6.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
16709
+ FEATHER_MOUNTING_HOLE_POSITIONS.map((hole) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react7.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16178
16710
  "hole",
16179
16711
  {
16180
16712
  pcbX: hole.x,
@@ -16182,7 +16714,7 @@ var FeatherCladWithPinHeaders = ({
16182
16714
  diameter: `${FEATHER_MOUNTING_HOLE_DIAMETER}mm`
16183
16715
  }
16184
16716
  ) }, `feather-mounting-hole-${hole.x}-${hole.y}`)),
16185
- showUsbLabel && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
16717
+ showUsbLabel && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16186
16718
  "silkscreentext",
16187
16719
  {
16188
16720
  text: "UP",
@@ -16191,7 +16723,7 @@ var FeatherCladWithPinHeaders = ({
16191
16723
  fontSize: "0.7mm"
16192
16724
  }
16193
16725
  ),
16194
- FEATHER_CLAD_VIA_POSITIONS.map((via) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react6.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
16726
+ FEATHER_CLAD_VIA_POSITIONS.map((via) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react7.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16195
16727
  "via",
16196
16728
  {
16197
16729
  netIsAssignable: true,
@@ -16203,7 +16735,7 @@ var FeatherCladWithPinHeaders = ({
16203
16735
  outerDiameter: `${FEATHER_CLAD_VIA_PAD_DIAMETER}mm`
16204
16736
  }
16205
16737
  ) }, `feather-prefab-via-${via.x}-${via.y}`)),
16206
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
16738
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16207
16739
  "pcbnotedimension",
16208
16740
  {
16209
16741
  from: {
@@ -16217,7 +16749,7 @@ var FeatherCladWithPinHeaders = ({
16217
16749
  text: `${FEATHER_CLAD_WIDTH}mm`
16218
16750
  }
16219
16751
  ),
16220
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
16752
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16221
16753
  "pcbnotedimension",
16222
16754
  {
16223
16755
  from: {
@@ -16237,8 +16769,8 @@ var FeatherCladWithPinHeaders = ({
16237
16769
  );
16238
16770
 
16239
16771
  // lib/xiao-clad.tsx
16240
- var import_react7 = require("react");
16241
- var import_jsx_runtime7 = require("react/jsx-runtime");
16772
+ var import_react8 = require("react");
16773
+ var import_jsx_runtime8 = require("react/jsx-runtime");
16242
16774
  var XIAO_CLAD_WIDTH = 17.8;
16243
16775
  var XIAO_CLAD_HEIGHT = 21;
16244
16776
  var XIAO_HEADER_PITCH = 2.54;
@@ -16284,7 +16816,7 @@ var XIAO_PIN_NAMES = Array.from(
16284
16816
  { length: 14 },
16285
16817
  (_, index) => `pin${index + 1}`
16286
16818
  );
16287
- var XiaoPinHeaderFootprint = () => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("footprint", { insertionDirection: "from_below", children: XIAO_HEADER_POSITIONS.map((position, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react7.Fragment, { children: index === 0 ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16819
+ var XiaoPinHeaderFootprint = () => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("footprint", { insertionDirection: "from_below", children: XIAO_HEADER_POSITIONS.map((position, index) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react8.Fragment, { children: index === 0 ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16288
16820
  "platedhole",
16289
16821
  {
16290
16822
  portHints: [`pin${index + 1}`],
@@ -16295,7 +16827,7 @@ var XiaoPinHeaderFootprint = () => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16295
16827
  pcbX: position.x,
16296
16828
  pcbY: position.y
16297
16829
  }
16298
- ) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16830
+ ) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16299
16831
  "platedhole",
16300
16832
  {
16301
16833
  portHints: [`pin${index + 1}`],
@@ -16306,12 +16838,12 @@ var XiaoPinHeaderFootprint = () => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16306
16838
  pcbY: position.y
16307
16839
  }
16308
16840
  ) }, `xiao-header-${position.x}-${position.y}`)) });
16309
- var XiaoPinHeaders = (props) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16841
+ var XiaoPinHeaders = (props) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16310
16842
  "connector",
16311
16843
  {
16312
16844
  pinLabels: XIAO_PIN_LABELS,
16313
16845
  manufacturerPartNumber: "GENERIC-XIAO-2X7-MALE-2.54MM-DOWN",
16314
- footprint: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(XiaoPinHeaderFootprint, {}),
16846
+ footprint: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(XiaoPinHeaderFootprint, {}),
16315
16847
  noSchematicRepresentation: true,
16316
16848
  ...props
16317
16849
  }
@@ -16328,7 +16860,7 @@ var XiaoCladLayout = ({
16328
16860
  nominalTraceWidth = 0.2,
16329
16861
  routingDisabled = false,
16330
16862
  showUsbLabel = true
16331
- }) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
16863
+ }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
16332
16864
  "board",
16333
16865
  {
16334
16866
  name: boardName,
@@ -16353,7 +16885,7 @@ var XiaoCladLayout = ({
16353
16885
  children: [
16354
16886
  pinHeaders,
16355
16887
  edgeFeatures,
16356
- showUsbLabel && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16888
+ showUsbLabel && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16357
16889
  "silkscreentext",
16358
16890
  {
16359
16891
  text: "UP",
@@ -16362,7 +16894,7 @@ var XiaoCladLayout = ({
16362
16894
  fontSize: "0.7mm"
16363
16895
  }
16364
16896
  ),
16365
- XIAO_CLAD_VIA_POSITIONS.map((via) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react7.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16897
+ XIAO_CLAD_VIA_POSITIONS.map((via) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react8.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16366
16898
  "via",
16367
16899
  {
16368
16900
  netIsAssignable: true,
@@ -16374,7 +16906,7 @@ var XiaoCladLayout = ({
16374
16906
  outerDiameter: `${XIAO_CLAD_VIA_PAD_DIAMETER}mm`
16375
16907
  }
16376
16908
  ) }, `xiao-prefab-via-${via.x}-${via.y}`)),
16377
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16909
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16378
16910
  "pcbnotedimension",
16379
16911
  {
16380
16912
  from: { x: -XIAO_CLAD_WIDTH / 2, y: XIAO_CLAD_HEIGHT / 2 + 2 },
@@ -16382,7 +16914,7 @@ var XiaoCladLayout = ({
16382
16914
  text: `${XIAO_CLAD_WIDTH}mm`
16383
16915
  }
16384
16916
  ),
16385
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16917
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16386
16918
  "pcbnotedimension",
16387
16919
  {
16388
16920
  from: { x: XIAO_CLAD_WIDTH / 2 + 2, y: -XIAO_CLAD_HEIGHT / 2 },
@@ -16397,13 +16929,13 @@ var XiaoCladLayout = ({
16397
16929
  var XiaoCladWithPinHeaders = ({
16398
16930
  markHeadersNoConnect = false,
16399
16931
  ...props
16400
- }) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16932
+ }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16401
16933
  XiaoCladLayout,
16402
16934
  {
16403
16935
  ...props,
16404
16936
  boardName: "XiaoCladWithPinHeaders",
16405
16937
  boardTitle: "XIAO form-factor copper clad with pin headers",
16406
- pinHeaders: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
16938
+ pinHeaders: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16407
16939
  XiaoPinHeaders,
16408
16940
  {
16409
16941
  name: "J_XIAO",
@@ -16414,8 +16946,8 @@ var XiaoCladWithPinHeaders = ({
16414
16946
  );
16415
16947
 
16416
16948
  // lib/xiao-clad-with-perforated-pin-headers.tsx
16417
- var import_react8 = require("react");
16418
- var import_jsx_runtime8 = require("react/jsx-runtime");
16949
+ var import_react9 = require("react");
16950
+ var import_jsx_runtime9 = require("react/jsx-runtime");
16419
16951
  var XIAO_PERFORATED_HEADER_PAD_WIDTH = 2.13;
16420
16952
  var XIAO_PERFORATED_HEADER_PAD_HEIGHT = 2;
16421
16953
  var XIAO_PERFORATION_HOLE_DIAMETER = 0.7;
@@ -16425,13 +16957,13 @@ var XIAO_PERFORATION_POSITIONS = XIAO_HEADER_POSITIONS.map(
16425
16957
  y: position.y
16426
16958
  })
16427
16959
  );
16428
- var XiaoPerforatedPinHeaderFootprint = () => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("footprint", { insertionDirection: "from_below", children: XIAO_HEADER_POSITIONS.map((headerPosition, index) => {
16960
+ var XiaoPerforatedPinHeaderFootprint = () => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("footprint", { insertionDirection: "from_below", children: XIAO_HEADER_POSITIONS.map((headerPosition, index) => {
16429
16961
  const side = Math.sign(headerPosition.x);
16430
16962
  const padCenterX = side * (XIAO_CLAD_WIDTH / 2 - XIAO_PERFORATED_HEADER_PAD_WIDTH / 2);
16431
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16432
- import_react8.Fragment,
16963
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
16964
+ import_react9.Fragment,
16433
16965
  {
16434
- children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16966
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
16435
16967
  "platedhole",
16436
16968
  {
16437
16969
  portHints: [`pin${index + 1}`],
@@ -16448,12 +16980,12 @@ var XiaoPerforatedPinHeaderFootprint = () => /* @__PURE__ */ (0, import_jsx_runt
16448
16980
  `xiao-perforated-header-${headerPosition.x}-${headerPosition.y}`
16449
16981
  );
16450
16982
  }) });
16451
- var XiaoPerforatedPinHeaders = (props) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16983
+ var XiaoPerforatedPinHeaders = (props) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
16452
16984
  "connector",
16453
16985
  {
16454
16986
  pinLabels: XIAO_PIN_LABELS,
16455
16987
  manufacturerPartNumber: "GENERIC-XIAO-2X7-MALE-2.54MM-DOWN-PERFORATED",
16456
- footprint: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(XiaoPerforatedPinHeaderFootprint, {}),
16988
+ footprint: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(XiaoPerforatedPinHeaderFootprint, {}),
16457
16989
  noSchematicRepresentation: true,
16458
16990
  ...props
16459
16991
  }
@@ -16461,20 +16993,20 @@ var XiaoPerforatedPinHeaders = (props) => /* @__PURE__ */ (0, import_jsx_runtime
16461
16993
  var XiaoCladWithPerforatedPinHeaders = ({
16462
16994
  markHeadersNoConnect = false,
16463
16995
  ...props
16464
- }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
16996
+ }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
16465
16997
  XiaoCladLayout,
16466
16998
  {
16467
16999
  ...props,
16468
17000
  boardName: "XiaoCladWithPerforatedPinHeaders",
16469
17001
  boardTitle: "XIAO form-factor copper clad with perforated pin-header sides",
16470
- pinHeaders: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
17002
+ pinHeaders: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
16471
17003
  XiaoPerforatedPinHeaders,
16472
17004
  {
16473
17005
  name: "J_XIAO",
16474
17006
  noConnect: markHeadersNoConnect ? XIAO_PIN_NAMES : void 0
16475
17007
  }
16476
17008
  ),
16477
- edgeFeatures: XIAO_PERFORATION_POSITIONS.map((position) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react8.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
17009
+ edgeFeatures: XIAO_PERFORATION_POSITIONS.map((position) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react9.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
16478
17010
  "cutout",
16479
17011
  {
16480
17012
  shape: "circle",
@@ -16531,6 +17063,33 @@ var XiaoCladWithPerforatedPinHeaders = ({
16531
17063
  BOOSTERPACK_MIDDLE_VIA_CLUSTER_CENTER_X,
16532
17064
  BOOSTERPACK_MIDDLE_VIA_CLUSTER_HEIGHT,
16533
17065
  BOOSTERPACK_MIDDLE_VIA_CLUSTER_WIDTH,
17066
+ BREADBOARD_08MM_BOTTOM_BANK_ROWS,
17067
+ BREADBOARD_08MM_BREAKOUT_LANE_SPACING,
17068
+ BREADBOARD_08MM_BREAKOUT_PAD_DIAMETER,
17069
+ BREADBOARD_08MM_BREAKOUT_TRACE_WIDTH,
17070
+ BREADBOARD_08MM_BREAKOUT_WEAVE_OFFSET,
17071
+ BREADBOARD_08MM_CORNER_VIA_ARM_WIDTH,
17072
+ BREADBOARD_08MM_CORNER_VIA_ARM_X_INNER_OFFSET,
17073
+ BREADBOARD_08MM_CORNER_VIA_LONG_SIDE_COLUMNS,
17074
+ BREADBOARD_08MM_CORNER_VIA_SPACING,
17075
+ BREADBOARD_08MM_CORNER_VIA_X_INNER_OFFSET,
17076
+ BREADBOARD_08MM_CORNER_VIA_X_OUTER_OFFSET,
17077
+ BREADBOARD_08MM_CORNER_VIA_X_OUTWARD_SHIFT,
17078
+ BREADBOARD_08MM_CORNER_VIA_Y_INNER_OFFSET,
17079
+ BREADBOARD_08MM_CORNER_VIA_Y_OUTER_OFFSET,
17080
+ BREADBOARD_08MM_EDGE_HUG_COLUMN_COUNT,
17081
+ BREADBOARD_08MM_EDGE_HUG_Y_SHIFT,
17082
+ BREADBOARD_08MM_MIN_VIA_EDGE_SPACING,
17083
+ BREADBOARD_08MM_ROW_BREAKOUTS,
17084
+ BREADBOARD_08MM_ROW_BREAKOUT_LENGTH,
17085
+ BREADBOARD_08MM_ROW_CONNECTIONS,
17086
+ BREADBOARD_08MM_ROW_TRACE_WIDTH,
17087
+ BREADBOARD_08MM_TOP_BANK_ROWS,
17088
+ BREADBOARD_08MM_TOP_RIGHT_LONG_SIDE_COLUMNS,
17089
+ BREADBOARD_08MM_VIA_BREAKOUT_LENGTH,
17090
+ BREADBOARD_08MM_VIA_HOLE_DIAMETER,
17091
+ BREADBOARD_08MM_VIA_PAD_DIAMETER,
17092
+ BREADBOARD_08MM_VIA_POSITIONS,
16534
17093
  BREADBOARD_CLAD_HEIGHT,
16535
17094
  BREADBOARD_CLAD_VIA_HOLE_DIAMETER,
16536
17095
  BREADBOARD_CLAD_VIA_PAD_DIAMETER,
@@ -16561,6 +17120,7 @@ var XiaoCladWithPerforatedPinHeaders = ({
16561
17120
  BoosterPackLeftHeader,
16562
17121
  BoosterPackRightHeader,
16563
17122
  BreadboardClad,
17123
+ BreadboardClad08mmVias,
16564
17124
  BreadboardTerminalHeaders,
16565
17125
  CLAD_32X32_EDGE_CONNECTOR_OPENING,
16566
17126
  CLAD_32X32_HEIGHT,