@tscircuit/core 0.0.438 → 0.0.440

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.d.ts CHANGED
@@ -1056,6 +1056,9 @@ declare class Group<Props extends z.ZodType<any, any, any> = typeof groupProps>
1056
1056
  doInitialSchematicLayout(): void;
1057
1057
  _doInitialSchematicLayoutMatchAdapt(): void;
1058
1058
  _doInitialSchematicLayoutGrid(): void;
1059
+ _getPcbLayoutMode(): "grid" | "flex" | "match-adapt" | "none";
1060
+ doInitialPcbLayout(): void;
1061
+ _doInitialPcbLayoutGrid(): void;
1059
1062
  _determineSideFromPosition(port: SchematicPort, component: SchematicComponent): "left" | "right" | "top" | "bottom";
1060
1063
  _calculateSchematicBounds(boxes: Array<{
1061
1064
  centerX: number;
package/dist/index.js CHANGED
@@ -6991,6 +6991,117 @@ function Group_doInitialSchematicLayoutGrid(group) {
6991
6991
  }
6992
6992
  }
6993
6993
 
6994
+ // lib/components/primitive-components/Group/Group_doInitialPcbLayoutGrid.ts
6995
+ import { translate as translate5 } from "transformation-matrix";
6996
+ import {
6997
+ transformPCBElements,
6998
+ getPrimaryId
6999
+ } from "@tscircuit/circuit-json-util";
7000
+ function Group_doInitialPcbLayoutGrid(group) {
7001
+ const { db } = group.root;
7002
+ const props = group._parsedProps;
7003
+ const pcbChildren = group.children.filter(
7004
+ (child) => child.pcb_component_id
7005
+ );
7006
+ if (pcbChildren.length === 0) return;
7007
+ let maxCellWidth = 0;
7008
+ let maxCellHeight = 0;
7009
+ for (const child of pcbChildren) {
7010
+ const pcbComp = db.pcb_component.get(child.pcb_component_id);
7011
+ if (pcbComp) {
7012
+ maxCellWidth = Math.max(maxCellWidth, pcbComp.width);
7013
+ maxCellHeight = Math.max(maxCellHeight, pcbComp.height);
7014
+ }
7015
+ }
7016
+ if (maxCellWidth === 0 && pcbChildren.length > 0) maxCellWidth = 1;
7017
+ if (maxCellHeight === 0 && pcbChildren.length > 0) maxCellHeight = 1;
7018
+ let gridColsOption = props.gridCols;
7019
+ let gridRowsOption = void 0;
7020
+ let gridGapOption = props.gridGap;
7021
+ if (props.pcbLayout?.grid) {
7022
+ gridColsOption = props.pcbLayout.grid.cols ?? gridColsOption;
7023
+ gridRowsOption = props.pcbLayout.grid.rows;
7024
+ gridGapOption = props.pcbLayout.grid.gap ?? gridGapOption;
7025
+ }
7026
+ let numCols;
7027
+ let numRows;
7028
+ if (gridColsOption !== void 0 && gridRowsOption !== void 0) {
7029
+ numCols = gridColsOption;
7030
+ numRows = gridRowsOption;
7031
+ } else if (gridColsOption !== void 0) {
7032
+ numCols = gridColsOption;
7033
+ numRows = Math.ceil(pcbChildren.length / numCols);
7034
+ } else if (gridRowsOption !== void 0) {
7035
+ numRows = gridRowsOption;
7036
+ numCols = Math.ceil(pcbChildren.length / numRows);
7037
+ } else {
7038
+ numCols = Math.ceil(Math.sqrt(pcbChildren.length));
7039
+ numRows = Math.ceil(pcbChildren.length / numCols);
7040
+ }
7041
+ if (numCols === 0 && pcbChildren.length > 0) numCols = 1;
7042
+ if (numRows === 0 && pcbChildren.length > 0) numRows = pcbChildren.length;
7043
+ let gridGapX;
7044
+ let gridGapY;
7045
+ if (typeof gridGapOption === "number") {
7046
+ gridGapX = gridGapOption;
7047
+ gridGapY = gridGapOption;
7048
+ } else if (typeof gridGapOption === "object" && gridGapOption !== null) {
7049
+ gridGapX = gridGapOption.x;
7050
+ gridGapY = gridGapOption.y;
7051
+ } else {
7052
+ gridGapX = 1;
7053
+ gridGapY = 1;
7054
+ }
7055
+ const totalGridWidth = numCols * maxCellWidth + Math.max(0, numCols - 1) * gridGapX;
7056
+ const totalGridHeight = numRows * maxCellHeight + Math.max(0, numRows - 1) * gridGapY;
7057
+ const groupCenter = group._getGlobalPcbPositionBeforeLayout();
7058
+ const firstCellCenterX = groupCenter.x - totalGridWidth / 2 + maxCellWidth / 2;
7059
+ const firstCellCenterY = groupCenter.y + totalGridHeight / 2 - maxCellHeight / 2;
7060
+ for (let i = 0; i < pcbChildren.length; i++) {
7061
+ const child = pcbChildren[i];
7062
+ if (!child.pcb_component_id) continue;
7063
+ const row = Math.floor(i / numCols);
7064
+ const col = i % numCols;
7065
+ if (row >= numRows || col >= numCols) {
7066
+ console.warn(
7067
+ `PCB grid layout: Child ${child.getString()} at index ${i} (row ${row}, col ${col}) exceeds grid dimensions (${numRows}x${numCols}). Skipping placement.`
7068
+ );
7069
+ continue;
7070
+ }
7071
+ const targetCellCenterX = firstCellCenterX + col * (maxCellWidth + gridGapX);
7072
+ const targetCellCenterY = firstCellCenterY - row * (maxCellHeight + gridGapY);
7073
+ const pcbComp = db.pcb_component.get(child.pcb_component_id);
7074
+ if (pcbComp) {
7075
+ const oldCenter = pcbComp.center;
7076
+ const newCenter = { x: targetCellCenterX, y: targetCellCenterY };
7077
+ const deltaX = newCenter.x - oldCenter.x;
7078
+ const deltaY = newCenter.y - oldCenter.y;
7079
+ const mat = translate5(deltaX, deltaY);
7080
+ const related = db.toArray().filter((e) => e.pcb_component_id === child.pcb_component_id);
7081
+ const moved = transformPCBElements(related, mat);
7082
+ for (const elm of moved) {
7083
+ const idProp = getPrimaryId(elm);
7084
+ db[elm.type].update(elm[idProp], elm);
7085
+ }
7086
+ db.pcb_component.update(child.pcb_component_id, {
7087
+ center: newCenter
7088
+ });
7089
+ child.setProps({
7090
+ ...child.props,
7091
+ pcbX: (child.props.pcbX ?? 0) + deltaX,
7092
+ pcbY: (child.props.pcbY ?? 0) + deltaY
7093
+ });
7094
+ }
7095
+ }
7096
+ if (group.pcb_group_id) {
7097
+ db.pcb_group.update(group.pcb_group_id, {
7098
+ width: totalGridWidth,
7099
+ height: totalGridHeight,
7100
+ center: groupCenter
7101
+ });
7102
+ }
7103
+ }
7104
+
6994
7105
  // lib/components/primitive-components/Group/Group.ts
6995
7106
  var Group = class extends NormalComponent {
6996
7107
  pcb_group_id = null;
@@ -7462,6 +7573,25 @@ var Group = class extends NormalComponent {
7462
7573
  _doInitialSchematicLayoutGrid() {
7463
7574
  Group_doInitialSchematicLayoutGrid(this);
7464
7575
  }
7576
+ _getPcbLayoutMode() {
7577
+ const props = this._parsedProps;
7578
+ if (props.pcbLayout?.matchAdapt) return "match-adapt";
7579
+ if (props.pcbLayout?.flex) return "flex";
7580
+ if (props.pcbLayout?.grid) return "grid";
7581
+ if (props.matchAdapt) return "match-adapt";
7582
+ if (props.flex) return "flex";
7583
+ if (props.grid) return "grid";
7584
+ return "none";
7585
+ }
7586
+ doInitialPcbLayout() {
7587
+ const pcbLayoutMode = this._getPcbLayoutMode();
7588
+ if (pcbLayoutMode === "grid") {
7589
+ this._doInitialPcbLayoutGrid();
7590
+ }
7591
+ }
7592
+ _doInitialPcbLayoutGrid() {
7593
+ Group_doInitialPcbLayoutGrid(this);
7594
+ }
7465
7595
  _determineSideFromPosition(port, component) {
7466
7596
  if (!port.center || !component.center) return "left";
7467
7597
  const dx = port.center.x - component.center.x;
@@ -8139,6 +8269,8 @@ var Resistor = class extends NormalComponent {
8139
8269
  this._createNetsFromProps([
8140
8270
  this.props.pullupFor,
8141
8271
  this.props.pullupTo,
8272
+ this.props.pulldownFor,
8273
+ this.props.pulldownTo,
8142
8274
  ...this._getNetsFromConnectionsProp()
8143
8275
  ]);
8144
8276
  }
@@ -8157,6 +8289,20 @@ var Resistor = class extends NormalComponent {
8157
8289
  })
8158
8290
  );
8159
8291
  }
8292
+ if (this.props.pulldownFor && this.props.pulldownTo) {
8293
+ this.add(
8294
+ new Trace2({
8295
+ from: `${this.getSubcircuitSelector()} > port.1`,
8296
+ to: this.props.pulldownFor
8297
+ })
8298
+ );
8299
+ this.add(
8300
+ new Trace2({
8301
+ from: `${this.getSubcircuitSelector()} > port.2`,
8302
+ to: this.props.pulldownTo
8303
+ })
8304
+ );
8305
+ }
8160
8306
  this._createTracesFromConnectionsProp();
8161
8307
  }
8162
8308
  doInitialSourceRender() {
@@ -9235,7 +9381,7 @@ import { identity as identity4 } from "transformation-matrix";
9235
9381
  var package_default = {
9236
9382
  name: "@tscircuit/core",
9237
9383
  type: "module",
9238
- version: "0.0.437",
9384
+ version: "0.0.439",
9239
9385
  types: "dist/index.d.ts",
9240
9386
  main: "dist/index.js",
9241
9387
  module: "dist/index.js",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/core",
3
3
  "type": "module",
4
- "version": "0.0.438",
4
+ "version": "0.0.440",
5
5
  "types": "dist/index.d.ts",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",