@tscircuit/core 0.0.147 → 0.0.148

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
@@ -115,24 +115,10 @@ type SchematicBoxPortPositionWithMetadata = {
115
115
  trueIndex: number;
116
116
  pinNumber: number;
117
117
  side: "left" | "right" | "top" | "bottom";
118
- distanceFromEdge: number;
118
+ distanceFromOrthogonalEdge: number;
119
119
  x: number;
120
120
  y: number;
121
121
  };
122
- /**
123
- * Get the dimensions of a schematic box based on the provided parameters.
124
- *
125
- * A schematic box is a rectangular box with a set of pins on the sides.
126
- *
127
- * The user can customize the position of the pins and the spacing between them,
128
- * this makes computing the box fairly complicated.
129
- *
130
- * A note on the internals:
131
- * * A "true port" refers to a pin/port before it's remapped by the user to a
132
- * different position. True Pin 1 is guaranteed to be in the top-left corner
133
- * * We basically iterate over each side and compute how far we are from the
134
- * edge for that side by adding margins together
135
- */
136
122
  interface SchematicBoxDimensions {
137
123
  pinCount: number;
138
124
  getPortPositionByPinNumber(pinNumber: number): SchematicBoxPortPositionWithMetadata | null;
package/dist/index.js CHANGED
@@ -1791,7 +1791,7 @@ var Port = class extends PrimitiveComponent {
1791
1791
  center: portCenter,
1792
1792
  source_port_id: this.source_port_id,
1793
1793
  facing_direction: this.facingDirection,
1794
- distance_from_component_edge: localPortInfo?.distanceFromEdge,
1794
+ distance_from_component_edge: 0.4,
1795
1795
  side_of_component: localPortInfo?.side,
1796
1796
  pin_number: props.pinNumber,
1797
1797
  true_ccw_index: localPortInfo?.trueIndex
@@ -2072,7 +2072,7 @@ function isExplicitPinMappingArrangement(arrangement) {
2072
2072
  return arrangement.leftSide !== void 0;
2073
2073
  }
2074
2074
  var getAllDimensionsForSchematicBox = (params) => {
2075
- const componentMargin = params.schPinSpacing;
2075
+ const portDistanceFromEdge = params.portDistanceFromEdge ?? 0.4;
2076
2076
  let sidePinCounts = params.schPortArrangement ? getSizeOfSidesFromPortArrangement(params.schPortArrangement) : null;
2077
2077
  const sideLengths = {
2078
2078
  left: 0,
@@ -2083,7 +2083,7 @@ var getAllDimensionsForSchematicBox = (params) => {
2083
2083
  let pinCount = params.pinCount ?? null;
2084
2084
  if (pinCount === null) {
2085
2085
  if (sidePinCounts) {
2086
- pinCount = sidePinCounts.leftSize + sidePinCounts.rightSize + sidePinCounts.topSize + sidePinCounts.bottomSize;
2086
+ pinCount = sidePinCounts.leftSize + sidePinCounts.rightSize + sidePinCounts.topSize;
2087
2087
  } else {
2088
2088
  throw new Error("Could not determine pin count for the schematic box");
2089
2089
  }
@@ -2105,137 +2105,139 @@ var getAllDimensionsForSchematicBox = (params) => {
2105
2105
  bottomSize: 0
2106
2106
  };
2107
2107
  }
2108
- const schWidth = params.schWidth ?? Math.max(sidePinCounts.topSize, sidePinCounts.bottomSize) * params.schPinSpacing + 2 * componentMargin;
2109
- const schHeight = params.schHeight ?? Math.max(sidePinCounts.leftSize, sidePinCounts.rightSize) * params.schPinSpacing + 2 * componentMargin;
2110
- const distributePorts = (sideSize, sideLength, totalMargin) => {
2111
- if (sideSize <= 1) return 0;
2112
- return (sideLength - totalMargin) / (sideSize - 1);
2113
- };
2114
2108
  const orderedTruePorts = [];
2109
+ let currentDistanceFromEdge = 0;
2115
2110
  let truePinIndex = 0;
2116
- const processSide = (side, pins, direction) => {
2117
- const isVertical = side === "left" || side === "right";
2118
- const sideLength = isVertical ? schHeight : schWidth;
2119
- let totalMargin = 0;
2120
- for (const pin of pins) {
2121
- const pinStyle = params.schPinStyle?.[`pin${pin}`] ?? params.schPinStyle?.[pin];
2122
- if (pinStyle) {
2123
- if (isVertical) {
2124
- totalMargin += (pinStyle.topMargin ?? 0) + (pinStyle.bottomMargin ?? 0);
2125
- } else {
2126
- totalMargin += (pinStyle.leftMargin ?? 0) + (pinStyle.rightMargin ?? 0);
2127
- }
2128
- }
2111
+ for (let sideIndex = 0; sideIndex < sidePinCounts.leftSize; sideIndex++) {
2112
+ const pinNumber = params.schPortArrangement && isExplicitPinMappingArrangement(params.schPortArrangement) ? params.schPortArrangement?.leftSide?.pins[sideIndex] : truePinIndex + 1;
2113
+ const pinStyle = params.schPinStyle?.[`pin${pinNumber}`] ?? params.schPinStyle?.[pinNumber];
2114
+ if (pinStyle?.topMargin) {
2115
+ currentDistanceFromEdge += pinStyle.topMargin;
2116
+ }
2117
+ orderedTruePorts.push({
2118
+ trueIndex: truePinIndex,
2119
+ pinNumber,
2120
+ side: "left",
2121
+ distanceFromOrthogonalEdge: currentDistanceFromEdge
2122
+ });
2123
+ if (pinStyle?.bottomMargin) {
2124
+ currentDistanceFromEdge += pinStyle.bottomMargin;
2129
2125
  }
2130
- const spacing = distributePorts(
2131
- pins.length,
2132
- sideLength - 2 * componentMargin,
2133
- totalMargin
2134
- );
2135
- let currentDistanceFromEdge = componentMargin;
2136
- pins.forEach((pinNumber, index) => {
2137
- const pinStyle = params.schPinStyle?.[`pin${pinNumber}`] ?? params.schPinStyle?.[pinNumber];
2138
- if (pinStyle) {
2139
- if (isVertical) {
2140
- if (side === "left") {
2141
- currentDistanceFromEdge += direction === "top-to-bottom" ? pinStyle.topMargin ?? 0 : pinStyle.bottomMargin ?? 0;
2142
- } else {
2143
- currentDistanceFromEdge += direction === "top-to-bottom" ? pinStyle.bottomMargin ?? 0 : pinStyle.topMargin ?? 0;
2144
- }
2145
- } else {
2146
- if (side === "top") {
2147
- currentDistanceFromEdge += direction === "left-to-right" ? pinStyle.leftMargin ?? 0 : pinStyle.rightMargin ?? 0;
2148
- } else {
2149
- currentDistanceFromEdge += direction === "left-to-right" ? pinStyle.rightMargin ?? 0 : pinStyle.leftMargin ?? 0;
2150
- }
2151
- }
2152
- }
2153
- orderedTruePorts.push({
2154
- trueIndex: truePinIndex,
2155
- pinNumber,
2156
- side,
2157
- distanceFromEdge: currentDistanceFromEdge,
2158
- x: 0,
2159
- y: 0
2160
- });
2161
- if (pinStyle) {
2162
- if (isVertical) {
2163
- if (side === "left") {
2164
- currentDistanceFromEdge += direction === "top-to-bottom" ? pinStyle.bottomMargin ?? 0 : pinStyle.topMargin ?? 0;
2165
- } else {
2166
- currentDistanceFromEdge += direction === "top-to-bottom" ? pinStyle.topMargin ?? 0 : pinStyle.bottomMargin ?? 0;
2167
- }
2168
- } else {
2169
- if (side === "top") {
2170
- currentDistanceFromEdge += direction === "left-to-right" ? pinStyle.rightMargin ?? 0 : pinStyle.leftMargin ?? 0;
2171
- } else {
2172
- currentDistanceFromEdge += direction === "left-to-right" ? pinStyle.leftMargin ?? 0 : pinStyle.rightMargin ?? 0;
2173
- }
2174
- }
2175
- }
2176
- currentDistanceFromEdge += spacing;
2177
- truePinIndex++;
2126
+ const isLastPinOnSide = sideIndex === sidePinCounts.leftSize - 1;
2127
+ if (!isLastPinOnSide) {
2128
+ currentDistanceFromEdge += params.schPinSpacing;
2129
+ } else {
2130
+ sideLengths.left = currentDistanceFromEdge;
2131
+ }
2132
+ truePinIndex++;
2133
+ }
2134
+ currentDistanceFromEdge = 0;
2135
+ for (let sideIndex = 0; sideIndex < sidePinCounts.bottomSize; sideIndex++) {
2136
+ const pinNumber = params.schPortArrangement && isExplicitPinMappingArrangement(params.schPortArrangement) ? params.schPortArrangement.bottomSide?.pins[sideIndex] : truePinIndex + 1;
2137
+ const pinStyle = params.schPinStyle?.[`pin${pinNumber}`] ?? params.schPinStyle?.[pinNumber];
2138
+ if (pinStyle?.leftMargin) {
2139
+ currentDistanceFromEdge += pinStyle.leftMargin;
2140
+ }
2141
+ orderedTruePorts.push({
2142
+ trueIndex: truePinIndex,
2143
+ pinNumber,
2144
+ side: "bottom",
2145
+ distanceFromOrthogonalEdge: currentDistanceFromEdge
2178
2146
  });
2179
- sideLengths[side] = sideLength;
2180
- };
2181
- if (params.schPortArrangement && isExplicitPinMappingArrangement(params.schPortArrangement)) {
2182
- if (params.schPortArrangement.leftSide) {
2183
- processSide(
2184
- "left",
2185
- params.schPortArrangement.leftSide.pins,
2186
- params.schPortArrangement.leftSide.direction ?? "top-to-bottom"
2187
- );
2147
+ if (pinStyle?.rightMargin) {
2148
+ currentDistanceFromEdge += pinStyle.rightMargin;
2188
2149
  }
2189
- if (params.schPortArrangement.rightSide) {
2190
- processSide(
2191
- "right",
2192
- params.schPortArrangement.rightSide.pins,
2193
- params.schPortArrangement.rightSide.direction ?? "bottom-to-top"
2194
- );
2150
+ const isLastPinOnSide = sideIndex === sidePinCounts.bottomSize - 1;
2151
+ if (!isLastPinOnSide) {
2152
+ currentDistanceFromEdge += params.schPinSpacing;
2153
+ } else {
2154
+ sideLengths.bottom = currentDistanceFromEdge;
2155
+ }
2156
+ truePinIndex++;
2157
+ }
2158
+ currentDistanceFromEdge = 0;
2159
+ for (let sideIndex = 0; sideIndex < sidePinCounts.rightSize; sideIndex++) {
2160
+ const pinNumber = params.schPortArrangement && isExplicitPinMappingArrangement(params.schPortArrangement) ? params.schPortArrangement.rightSide?.pins[sideIndex] : truePinIndex + 1;
2161
+ const pinStyle = params.schPinStyle?.[`pin${pinNumber}`] ?? params.schPinStyle?.[pinNumber];
2162
+ if (pinStyle?.bottomMargin) {
2163
+ currentDistanceFromEdge += pinStyle.bottomMargin;
2164
+ }
2165
+ orderedTruePorts.push({
2166
+ trueIndex: truePinIndex,
2167
+ pinNumber,
2168
+ side: "right",
2169
+ distanceFromOrthogonalEdge: currentDistanceFromEdge
2170
+ });
2171
+ if (pinStyle?.topMargin) {
2172
+ currentDistanceFromEdge += pinStyle.topMargin;
2195
2173
  }
2196
- if (params.schPortArrangement.topSide) {
2197
- processSide(
2198
- "top",
2199
- params.schPortArrangement.topSide.pins,
2200
- params.schPortArrangement.topSide.direction ?? "left-to-right"
2201
- );
2174
+ const isLastPinOnSide = sideIndex === sidePinCounts.rightSize - 1;
2175
+ if (!isLastPinOnSide) {
2176
+ currentDistanceFromEdge += params.schPinSpacing;
2177
+ } else {
2178
+ sideLengths.right = currentDistanceFromEdge;
2179
+ }
2180
+ truePinIndex++;
2181
+ }
2182
+ currentDistanceFromEdge = 0;
2183
+ for (let sideIndex = 0; sideIndex < sidePinCounts.topSize; sideIndex++) {
2184
+ const pinNumber = params.schPortArrangement && isExplicitPinMappingArrangement(params.schPortArrangement) ? params.schPortArrangement.topSide?.pins[sideIndex] : truePinIndex + 1;
2185
+ const pinStyle = params.schPinStyle?.[`pin${pinNumber}`] ?? params.schPinStyle?.[pinNumber];
2186
+ if (pinStyle?.rightMargin) {
2187
+ currentDistanceFromEdge += pinStyle.rightMargin;
2188
+ }
2189
+ orderedTruePorts.push({
2190
+ trueIndex: truePinIndex,
2191
+ pinNumber,
2192
+ side: "top",
2193
+ distanceFromOrthogonalEdge: currentDistanceFromEdge
2194
+ });
2195
+ if (pinStyle?.leftMargin) {
2196
+ currentDistanceFromEdge += pinStyle.leftMargin;
2202
2197
  }
2203
- if (params.schPortArrangement.bottomSide) {
2204
- processSide(
2205
- "bottom",
2206
- params.schPortArrangement.bottomSide.pins,
2207
- params.schPortArrangement.bottomSide.direction ?? "left-to-right"
2208
- );
2198
+ const isLastPinOnSide = sideIndex === sidePinCounts.topSize - 1;
2199
+ if (!isLastPinOnSide) {
2200
+ currentDistanceFromEdge += params.schPinSpacing;
2201
+ } else {
2202
+ sideLengths.top = currentDistanceFromEdge;
2209
2203
  }
2210
- } else {
2211
- const leftSide = Array.from(
2212
- { length: sidePinCounts.leftSize },
2213
- (_, i) => i + 1
2214
- );
2215
- const rightSide = Array.from(
2216
- { length: sidePinCounts.rightSize },
2217
- (_, i) => i + sidePinCounts.leftSize + 1
2218
- );
2219
- const topSide = Array.from(
2220
- { length: sidePinCounts.topSize },
2221
- (_, i) => i + sidePinCounts.leftSize + sidePinCounts.rightSize + 1
2204
+ truePinIndex++;
2205
+ }
2206
+ let schWidth = params.schWidth;
2207
+ if (!schWidth) {
2208
+ schWidth = Math.max(
2209
+ sideLengths.top + params.schPinSpacing * 2,
2210
+ sideLengths.bottom + params.schPinSpacing * 2
2222
2211
  );
2223
- const bottomSide = Array.from(
2224
- {
2225
- length: pinCount - sidePinCounts.leftSize - sidePinCounts.rightSize - sidePinCounts.topSize
2226
- },
2227
- (_, i) => i + sidePinCounts.leftSize + sidePinCounts.rightSize + sidePinCounts.topSize + 1
2212
+ }
2213
+ let schHeight = params.schHeight;
2214
+ if (!schHeight) {
2215
+ schHeight = Math.max(
2216
+ sideLengths.left + params.schPinSpacing * 2,
2217
+ sideLengths.right + params.schPinSpacing * 2
2228
2218
  );
2229
- processSide("left", leftSide, "top-to-bottom");
2230
- processSide("right", rightSide, "top-to-bottom");
2231
- processSide("top", topSide, "left-to-right");
2232
- processSide("bottom", bottomSide, "left-to-right");
2233
2219
  }
2234
2220
  const trueEdgePositions = {
2235
- left: { x: -schWidth / 2 - 0.2, y: schHeight / 2 },
2236
- bottom: { x: -schWidth / 2, y: schHeight / 2 + 0.2 },
2237
- right: { x: schWidth / 2 + 0.2, y: -schHeight / 2 },
2238
- top: { x: schWidth / 2, y: -schHeight / 2 - 0.2 }
2221
+ // Top left corner
2222
+ left: {
2223
+ x: -schWidth / 2 - portDistanceFromEdge,
2224
+ y: sideLengths.left / 2
2225
+ },
2226
+ // bottom left corner
2227
+ bottom: {
2228
+ x: -sideLengths.bottom / 2,
2229
+ y: -schHeight / 2 - portDistanceFromEdge
2230
+ },
2231
+ // bottom right corner
2232
+ right: {
2233
+ x: schWidth / 2 + portDistanceFromEdge,
2234
+ y: -sideLengths.right / 2
2235
+ },
2236
+ // top right corner
2237
+ top: {
2238
+ x: sideLengths.top / 2,
2239
+ y: schHeight / 2 + portDistanceFromEdge
2240
+ }
2239
2241
  };
2240
2242
  const trueEdgeTraversalDirections = {
2241
2243
  left: { x: 0, y: -1 },
@@ -2244,13 +2246,13 @@ var getAllDimensionsForSchematicBox = (params) => {
2244
2246
  bottom: { x: 1, y: 0 }
2245
2247
  };
2246
2248
  const truePortsWithPositions = orderedTruePorts.map((p) => {
2247
- const { distanceFromEdge, side } = p;
2249
+ const { distanceFromOrthogonalEdge, side } = p;
2248
2250
  const edgePos = trueEdgePositions[side];
2249
2251
  const edgeDir = trueEdgeTraversalDirections[side];
2250
2252
  return {
2251
- ...p,
2252
- x: edgePos.x + distanceFromEdge * edgeDir.x,
2253
- y: edgePos.y + distanceFromEdge * edgeDir.y
2253
+ x: edgePos.x + distanceFromOrthogonalEdge * edgeDir.x,
2254
+ y: edgePos.y + distanceFromOrthogonalEdge * edgeDir.y,
2255
+ ...p
2254
2256
  };
2255
2257
  });
2256
2258
  return {
@@ -3300,38 +3302,6 @@ function getClosest(point, candidates) {
3300
3302
  return closest;
3301
3303
  }
3302
3304
 
3303
- // lib/utils/projectPointInDirection.ts
3304
- var projectPointInDirection = (point, direction, distance) => {
3305
- switch (direction) {
3306
- case "up":
3307
- return { x: point.x, y: point.y + distance };
3308
- case "down":
3309
- return { x: point.x, y: point.y - distance };
3310
- case "left":
3311
- return { x: point.x + distance, y: point.y };
3312
- case "right":
3313
- return { x: point.x - distance, y: point.y };
3314
- default:
3315
- throw new Error(`Unknown direction "${direction}"`);
3316
- }
3317
- };
3318
-
3319
- // lib/utils/projectPointInOppositeDirection.ts
3320
- var projectPointInOppositeDirection = (point, direction, distance) => {
3321
- switch (direction) {
3322
- case "up":
3323
- return { x: point.x, y: point.y + distance };
3324
- case "down":
3325
- return { x: point.x, y: point.y - distance };
3326
- case "left":
3327
- return { x: point.x + distance, y: point.y };
3328
- case "right":
3329
- return { x: point.x - distance, y: point.y };
3330
- default:
3331
- throw new Error(`Unknown direction "${direction}"`);
3332
- }
3333
- };
3334
-
3335
3305
  // lib/utils/try-now.ts
3336
3306
  function tryNow(fn) {
3337
3307
  try {
@@ -3750,7 +3720,7 @@ searched component ${targetComponent.getString()}, which has ports: ${targetComp
3750
3720
  const { db } = this.root;
3751
3721
  const { _parsedProps: props, parent } = this;
3752
3722
  if (!parent) throw new Error("Trace has no parent");
3753
- const { allPortsFound, portsWithSelectors: ports } = this._findConnectedPorts();
3723
+ const { allPortsFound, portsWithSelectors: connectedPorts } = this._findConnectedPorts();
3754
3724
  if (!allPortsFound) return;
3755
3725
  const obstacles = [];
3756
3726
  const connection = {
@@ -3779,7 +3749,7 @@ searched component ${targetComponent.getString()}, which has ports: ${targetComp
3779
3749
  });
3780
3750
  }
3781
3751
  }
3782
- const portsWithPosition = ports.map(({ port }) => ({
3752
+ const portsWithPosition = connectedPorts.map(({ port }) => ({
3783
3753
  port,
3784
3754
  position: port._getGlobalSchematicPositionAfterLayout(),
3785
3755
  schematic_port_id: port.schematic_port_id ?? void 0,
@@ -3811,8 +3781,7 @@ searched component ${targetComponent.getString()}, which has ports: ${targetComp
3811
3781
  });
3812
3782
  const results = autorouter.solveAndMapToTraces();
3813
3783
  if (results.length === 0) return;
3814
- const [result] = results;
3815
- const { route } = result;
3784
+ const [{ route }] = results;
3816
3785
  const edges = [];
3817
3786
  for (let i = 0; i < route.length - 1; i++) {
3818
3787
  edges.push({
@@ -3820,29 +3789,6 @@ searched component ${targetComponent.getString()}, which has ports: ${targetComp
3820
3789
  to: route[i + 1]
3821
3790
  });
3822
3791
  }
3823
- const STUB_LENGTH = 0.15;
3824
- edges.unshift({
3825
- from: {
3826
- ...projectPointInDirection(
3827
- route[0],
3828
- portsWithPosition[0].facingDirection,
3829
- STUB_LENGTH
3830
- )
3831
- },
3832
- to: route[0],
3833
- from_schematic_port_id: portsWithPosition[0].schematic_port_id
3834
- });
3835
- edges.push({
3836
- from: route[route.length - 1],
3837
- to: {
3838
- ...projectPointInOppositeDirection(
3839
- route[route.length - 1],
3840
- portsWithPosition[1].facingDirection,
3841
- STUB_LENGTH
3842
- )
3843
- },
3844
- from_schematic_port_id: portsWithPosition[1].schematic_port_id
3845
- });
3846
3792
  const trace = db.schematic_trace.insert({
3847
3793
  source_trace_id: this.source_trace_id,
3848
3794
  edges
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/core",
3
3
  "type": "module",
4
- "version": "0.0.147",
4
+ "version": "0.0.148",
5
5
  "types": "dist/index.d.ts",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -45,7 +45,7 @@
45
45
  "@tscircuit/soup-util": "^0.0.33",
46
46
  "circuit-json": "^0.0.93",
47
47
  "circuit-json-to-connectivity-map": "^0.0.17",
48
- "circuit-to-svg": "^0.0.57",
48
+ "circuit-to-svg": "^0.0.58",
49
49
  "nanoid": "^5.0.7",
50
50
  "performance-now": "^2.1.0",
51
51
  "react": "^18.3.1",