@tscircuit/core 0.0.1030 → 0.0.1032

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
@@ -65593,6 +65593,7 @@ declare class PcbNoteDimension extends PrimitiveComponent<typeof pcbNoteDimensio
65593
65593
  };
65594
65594
  private _resolvePoint;
65595
65595
  doInitialPcbPrimitiveRender(): void;
65596
+ doInitialPcbLayout(): void;
65596
65597
  getPcbSize(): {
65597
65598
  width: number;
65598
65599
  height: number;
package/dist/index.js CHANGED
@@ -9996,13 +9996,31 @@ var NormalComponent3 = class extends PrimitiveComponent2 {
9996
9996
  if (!this.pcb_component_id) return;
9997
9997
  const { db } = this.root;
9998
9998
  const props = this._parsedProps;
9999
- const hasExplicitPcbPosition = props.pcbX !== void 0 || props.pcbY !== void 0;
9999
+ const rawProps = this.props;
10000
+ const pcbLeftEdgeX = props.pcbLeftEdgeX ?? rawProps.pcbLeftEdgeX;
10001
+ const pcbRightEdgeX = props.pcbRightEdgeX ?? rawProps.pcbRightEdgeX;
10002
+ const pcbTopEdgeY = props.pcbTopEdgeY ?? rawProps.pcbTopEdgeY;
10003
+ const pcbBottomEdgeY = props.pcbBottomEdgeY ?? rawProps.pcbBottomEdgeY;
10004
+ const hasExplicitPcbPosition = props.pcbX !== void 0 || props.pcbY !== void 0 || pcbLeftEdgeX !== void 0 || pcbRightEdgeX !== void 0 || pcbTopEdgeY !== void 0 || pcbBottomEdgeY !== void 0;
10000
10005
  if (!hasExplicitPcbPosition) return;
10006
+ if (pcbLeftEdgeX !== void 0 && pcbRightEdgeX !== void 0) {
10007
+ throw new Error(
10008
+ `${this.componentName} cannot set both pcbLeftEdgeX and pcbRightEdgeX`
10009
+ );
10010
+ }
10011
+ if (pcbTopEdgeY !== void 0 && pcbBottomEdgeY !== void 0) {
10012
+ throw new Error(
10013
+ `${this.componentName} cannot set both pcbTopEdgeY and pcbBottomEdgeY`
10014
+ );
10015
+ }
10016
+ const pcbComponent = db.pcb_component.get(this.pcb_component_id);
10017
+ const componentWidth = pcbComponent?.width ?? 0;
10018
+ const componentHeight = pcbComponent?.height ?? 0;
10001
10019
  const parentGroup = this.getGroup();
10002
10020
  const positionedRelativeToGroupId = parentGroup?.pcb_group_id ?? void 0;
10003
10021
  const positionedRelativeToBoardId = positionedRelativeToGroupId ? void 0 : this._getBoard()?.pcb_board_id ?? void 0;
10004
- const resolvedPcbX = this._resolvedPcbCalcOffsetX ?? (props.pcbX !== void 0 ? this._resolvePcbCoordinate(props.pcbX, "pcbX") : void 0);
10005
- const resolvedPcbY = this._resolvedPcbCalcOffsetY ?? (props.pcbY !== void 0 ? this._resolvePcbCoordinate(props.pcbY, "pcbY") : void 0);
10022
+ const resolvedPcbX = this._resolvedPcbCalcOffsetX ?? (props.pcbX !== void 0 ? this._resolvePcbCoordinate(props.pcbX, "pcbX") : pcbLeftEdgeX !== void 0 ? this._resolvePcbCoordinate(pcbLeftEdgeX, "pcbX") + componentWidth / 2 : pcbRightEdgeX !== void 0 ? this._resolvePcbCoordinate(pcbRightEdgeX, "pcbX") - componentWidth / 2 : void 0);
10023
+ const resolvedPcbY = this._resolvedPcbCalcOffsetY ?? (props.pcbY !== void 0 ? this._resolvePcbCoordinate(props.pcbY, "pcbY") : pcbTopEdgeY !== void 0 ? this._resolvePcbCoordinate(pcbTopEdgeY, "pcbY") - componentHeight / 2 : pcbBottomEdgeY !== void 0 ? this._resolvePcbCoordinate(pcbBottomEdgeY, "pcbY") + componentHeight / 2 : void 0);
10006
10024
  db.pcb_component.update(this.pcb_component_id, {
10007
10025
  position_mode: "relative_to_group_anchor",
10008
10026
  positioned_relative_to_pcb_group_id: positionedRelativeToGroupId,
@@ -10031,7 +10049,8 @@ var NormalComponent3 = class extends PrimitiveComponent2 {
10031
10049
  * and should not be moved by automatic packing/layout algorithms
10032
10050
  */
10033
10051
  isRelativelyPositioned() {
10034
- return this._parsedProps.pcbX !== void 0 || this._parsedProps.pcbY !== void 0;
10052
+ const rawProps = this.props;
10053
+ return this._parsedProps.pcbX !== void 0 || this._parsedProps.pcbY !== void 0 || this._parsedProps.pcbLeftEdgeX !== void 0 || this._parsedProps.pcbRightEdgeX !== void 0 || this._parsedProps.pcbTopEdgeY !== void 0 || this._parsedProps.pcbBottomEdgeY !== void 0 || rawProps.pcbLeftEdgeX !== void 0 || rawProps.pcbRightEdgeX !== void 0 || rawProps.pcbTopEdgeY !== void 0 || rawProps.pcbBottomEdgeY !== void 0;
10035
10054
  }
10036
10055
  };
10037
10056
 
@@ -11210,8 +11229,8 @@ function Group_doInitialPcbCalcPlacementResolution(group) {
11210
11229
  const inDegree = /* @__PURE__ */ new Map();
11211
11230
  const dependents = /* @__PURE__ */ new Map();
11212
11231
  for (const component of allNormalComponents) {
11232
+ if (!shouldResolvePlacementInCalcPhase(component)) continue;
11213
11233
  const refs = getComponentRefsForCalcPlacement(component);
11214
- if (refs.size === 0) continue;
11215
11234
  if (!component.name) {
11216
11235
  throw new Error(
11217
11236
  `Invalid pcb position expression for ${component.getString()}: component-relative calc requires the component to have a name`
@@ -11271,6 +11290,23 @@ function Group_doInitialPcbCalcPlacementResolution(group) {
11271
11290
  if (!pcbComponent) return;
11272
11291
  const rawPcbX = component._parsedProps.pcbX;
11273
11292
  const rawPcbY = component._parsedProps.pcbY;
11293
+ const rawComponentProps = component.props;
11294
+ const rawPcbLeftEdgeX = component._parsedProps.pcbLeftEdgeX ?? rawComponentProps.pcbLeftEdgeX;
11295
+ const rawPcbRightEdgeX = component._parsedProps.pcbRightEdgeX ?? rawComponentProps.pcbRightEdgeX;
11296
+ const rawPcbTopEdgeY = component._parsedProps.pcbTopEdgeY ?? rawComponentProps.pcbTopEdgeY;
11297
+ const rawPcbBottomEdgeY = component._parsedProps.pcbBottomEdgeY ?? rawComponentProps.pcbBottomEdgeY;
11298
+ if (rawPcbLeftEdgeX !== void 0 && rawPcbRightEdgeX !== void 0) {
11299
+ throw new Error(
11300
+ `${component.componentName} cannot set both pcbLeftEdgeX and pcbRightEdgeX`
11301
+ );
11302
+ }
11303
+ if (rawPcbTopEdgeY !== void 0 && rawPcbBottomEdgeY !== void 0) {
11304
+ throw new Error(
11305
+ `${component.componentName} cannot set both pcbTopEdgeY and pcbBottomEdgeY`
11306
+ );
11307
+ }
11308
+ const componentWidth = pcbComponent.width ?? 0;
11309
+ const componentHeight = pcbComponent.height ?? 0;
11274
11310
  const nextCenter = {
11275
11311
  x: pcbComponent.center.x,
11276
11312
  y: pcbComponent.center.y
@@ -11282,6 +11318,30 @@ function Group_doInitialPcbCalcPlacementResolution(group) {
11282
11318
  });
11283
11319
  component._resolvedPcbCalcOffsetX = resolvedPcbX;
11284
11320
  nextCenter.x = resolvedPcbX;
11321
+ } else if (rawPcbLeftEdgeX !== void 0) {
11322
+ const resolvedPcbLeftEdgeX = component.resolvePcbCoordinate(
11323
+ rawPcbLeftEdgeX,
11324
+ "pcbX",
11325
+ {
11326
+ allowComponentVariables: true,
11327
+ componentVariables: componentVars
11328
+ }
11329
+ );
11330
+ const resolvedPcbX = resolvedPcbLeftEdgeX + componentWidth / 2;
11331
+ component._resolvedPcbCalcOffsetX = resolvedPcbX;
11332
+ nextCenter.x = resolvedPcbX;
11333
+ } else if (rawPcbRightEdgeX !== void 0) {
11334
+ const resolvedPcbRightEdgeX = component.resolvePcbCoordinate(
11335
+ rawPcbRightEdgeX,
11336
+ "pcbX",
11337
+ {
11338
+ allowComponentVariables: true,
11339
+ componentVariables: componentVars
11340
+ }
11341
+ );
11342
+ const resolvedPcbX = resolvedPcbRightEdgeX - componentWidth / 2;
11343
+ component._resolvedPcbCalcOffsetX = resolvedPcbX;
11344
+ nextCenter.x = resolvedPcbX;
11285
11345
  }
11286
11346
  if (rawPcbY !== void 0) {
11287
11347
  const resolvedPcbY = component.resolvePcbCoordinate(rawPcbY, "pcbY", {
@@ -11290,11 +11350,49 @@ function Group_doInitialPcbCalcPlacementResolution(group) {
11290
11350
  });
11291
11351
  component._resolvedPcbCalcOffsetY = resolvedPcbY;
11292
11352
  nextCenter.y = resolvedPcbY;
11353
+ } else if (rawPcbTopEdgeY !== void 0) {
11354
+ const resolvedPcbTopEdgeY = component.resolvePcbCoordinate(
11355
+ rawPcbTopEdgeY,
11356
+ "pcbY",
11357
+ {
11358
+ allowComponentVariables: true,
11359
+ componentVariables: componentVars
11360
+ }
11361
+ );
11362
+ const resolvedPcbY = resolvedPcbTopEdgeY - componentHeight / 2;
11363
+ component._resolvedPcbCalcOffsetY = resolvedPcbY;
11364
+ nextCenter.y = resolvedPcbY;
11365
+ } else if (rawPcbBottomEdgeY !== void 0) {
11366
+ const resolvedPcbBottomEdgeY = component.resolvePcbCoordinate(
11367
+ rawPcbBottomEdgeY,
11368
+ "pcbY",
11369
+ {
11370
+ allowComponentVariables: true,
11371
+ componentVariables: componentVars
11372
+ }
11373
+ );
11374
+ const resolvedPcbY = resolvedPcbBottomEdgeY + componentHeight / 2;
11375
+ component._resolvedPcbCalcOffsetY = resolvedPcbY;
11376
+ nextCenter.y = resolvedPcbY;
11293
11377
  }
11294
11378
  component._repositionOnPcb(nextCenter);
11295
11379
  updateVarsForNamedComponent(component, componentVars);
11296
11380
  }
11297
11381
  }
11382
+ function shouldResolvePlacementInCalcPhase(component) {
11383
+ const parsedProps = component._parsedProps;
11384
+ const rawProps = component.props;
11385
+ const pcbX = parsedProps.pcbX;
11386
+ const pcbY = parsedProps.pcbY;
11387
+ const pcbLeftEdgeX = parsedProps.pcbLeftEdgeX ?? rawProps.pcbLeftEdgeX;
11388
+ const pcbRightEdgeX = parsedProps.pcbRightEdgeX ?? rawProps.pcbRightEdgeX;
11389
+ const pcbTopEdgeY = parsedProps.pcbTopEdgeY ?? rawProps.pcbTopEdgeY;
11390
+ const pcbBottomEdgeY = parsedProps.pcbBottomEdgeY ?? rawProps.pcbBottomEdgeY;
11391
+ if (pcbLeftEdgeX !== void 0 || pcbRightEdgeX !== void 0 || pcbTopEdgeY !== void 0 || pcbBottomEdgeY !== void 0) {
11392
+ return true;
11393
+ }
11394
+ return typeof pcbX === "string" || typeof pcbY === "string";
11395
+ }
11298
11396
  function collectNormalComponentsInSubcircuit(group) {
11299
11397
  const components = [];
11300
11398
  const walk = (node) => {
@@ -11314,6 +11412,11 @@ function getComponentRefsForCalcPlacement(component) {
11314
11412
  const refs = /* @__PURE__ */ new Set();
11315
11413
  const rawPcbX = component._parsedProps.pcbX;
11316
11414
  const rawPcbY = component._parsedProps.pcbY;
11415
+ const rawComponentProps = component.props;
11416
+ const rawPcbLeftEdgeX = component._parsedProps.pcbLeftEdgeX ?? rawComponentProps.pcbLeftEdgeX;
11417
+ const rawPcbRightEdgeX = component._parsedProps.pcbRightEdgeX ?? rawComponentProps.pcbRightEdgeX;
11418
+ const rawPcbTopEdgeY = component._parsedProps.pcbTopEdgeY ?? rawComponentProps.pcbTopEdgeY;
11419
+ const rawPcbBottomEdgeY = component._parsedProps.pcbBottomEdgeY ?? rawComponentProps.pcbBottomEdgeY;
11317
11420
  const addRefs = (rawValue) => {
11318
11421
  if (typeof rawValue !== "string") return;
11319
11422
  const identifiers = extractCalcIdentifiers(rawValue);
@@ -11325,6 +11428,10 @@ function getComponentRefsForCalcPlacement(component) {
11325
11428
  };
11326
11429
  addRefs(rawPcbX);
11327
11430
  addRefs(rawPcbY);
11431
+ addRefs(rawPcbLeftEdgeX);
11432
+ addRefs(rawPcbRightEdgeX);
11433
+ addRefs(rawPcbTopEdgeY);
11434
+ addRefs(rawPcbBottomEdgeY);
11328
11435
  return refs;
11329
11436
  }
11330
11437
  function parseComponentReferenceToken(token) {
@@ -12424,7 +12531,7 @@ import { identity as identity4 } from "transformation-matrix";
12424
12531
  var package_default = {
12425
12532
  name: "@tscircuit/core",
12426
12533
  type: "module",
12427
- version: "0.0.1029",
12534
+ version: "0.0.1031",
12428
12535
  types: "dist/index.d.ts",
12429
12536
  main: "dist/index.js",
12430
12537
  module: "dist/index.js",
@@ -16036,6 +16143,7 @@ var Group = class extends NormalComponent3 {
16036
16143
  }
16037
16144
  _getPcbLayoutMode() {
16038
16145
  const props = this._parsedProps;
16146
+ const rawProps = this.props;
16039
16147
  if (this._isInflatedFromCircuitJson) return "none";
16040
16148
  if (props.pcbRelative) return "none";
16041
16149
  if (props.pcbLayout?.matchAdapt) return "match-adapt";
@@ -16049,7 +16157,7 @@ var Group = class extends NormalComponent3 {
16049
16157
  if (props.matchAdapt) return "match-adapt";
16050
16158
  if (props.flex) return "flex";
16051
16159
  if (props.grid) return "grid";
16052
- const groupHasCoords = props.pcbX !== void 0 || props.pcbY !== void 0;
16160
+ const groupHasCoords = props.pcbX !== void 0 || props.pcbY !== void 0 || props.pcbLeftEdgeX !== void 0 || props.pcbRightEdgeX !== void 0 || props.pcbTopEdgeY !== void 0 || props.pcbBottomEdgeY !== void 0 || rawProps.pcbLeftEdgeX !== void 0 || rawProps.pcbRightEdgeX !== void 0 || rawProps.pcbTopEdgeY !== void 0 || rawProps.pcbBottomEdgeY !== void 0;
16053
16161
  const hasManualEdits = (props.manualEdits?.pcb_placements?.length ?? 0) > 0;
16054
16162
  const unpositionedDirectChildrenCount = this.children.reduce(
16055
16163
  (count, child) => {
@@ -16057,7 +16165,8 @@ var Group = class extends NormalComponent3 {
16057
16165
  return count;
16058
16166
  }
16059
16167
  const childProps = child._parsedProps;
16060
- const hasCoords = childProps?.pcbX !== void 0 || childProps?.pcbY !== void 0;
16168
+ const rawChildProps = child.props;
16169
+ const hasCoords = childProps?.pcbX !== void 0 || childProps?.pcbY !== void 0 || childProps?.pcbLeftEdgeX !== void 0 || childProps?.pcbRightEdgeX !== void 0 || childProps?.pcbTopEdgeY !== void 0 || childProps?.pcbBottomEdgeY !== void 0 || rawChildProps?.pcbLeftEdgeX !== void 0 || rawChildProps?.pcbRightEdgeX !== void 0 || rawChildProps?.pcbTopEdgeY !== void 0 || rawChildProps?.pcbBottomEdgeY !== void 0;
16061
16170
  return count + (hasCoords ? 0 : 1);
16062
16171
  },
16063
16172
  0
@@ -19940,6 +20049,17 @@ var PcbNoteDimension = class extends PrimitiveComponent2 {
19940
20049
  this.renderError(`PcbNoteDimension could not find selector "${input}"`);
19941
20050
  return applyToPoint16(transform, { x: 0, y: 0 });
19942
20051
  }
20052
+ const targetPcbComponentId = target.pcb_component_id;
20053
+ const root = this.root;
20054
+ if (targetPcbComponentId && root) {
20055
+ const pcbComponent = root.db.pcb_component.get(targetPcbComponentId);
20056
+ if (pcbComponent?.center) {
20057
+ return {
20058
+ x: pcbComponent.center.x,
20059
+ y: pcbComponent.center.y
20060
+ };
20061
+ }
20062
+ }
19943
20063
  return target._getGlobalPcbPositionBeforeLayout();
19944
20064
  }
19945
20065
  const numericX = typeof input.x === "string" ? parseFloat(input.x) : input.x;
@@ -19971,6 +20091,19 @@ var PcbNoteDimension = class extends PrimitiveComponent2 {
19971
20091
  });
19972
20092
  this.pcb_note_dimension_id = pcb_note_dimension.pcb_note_dimension_id;
19973
20093
  }
20094
+ doInitialPcbLayout() {
20095
+ const root = this.root;
20096
+ if (!root || root.pcbDisabled) return;
20097
+ if (!this.pcb_note_dimension_id) return;
20098
+ const { db } = root;
20099
+ const transform = this._computePcbGlobalTransformBeforeLayout();
20100
+ const from = this._resolvePoint(this._parsedProps.from, transform);
20101
+ const to = this._resolvePoint(this._parsedProps.to, transform);
20102
+ db.pcb_note_dimension.update(this.pcb_note_dimension_id, {
20103
+ from,
20104
+ to
20105
+ });
20106
+ }
19974
20107
  getPcbSize() {
19975
20108
  const transform = this._computePcbGlobalTransformBeforeLayout();
19976
20109
  const from = this._resolvePoint(this._parsedProps.from, transform);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/core",
3
3
  "type": "module",
4
- "version": "0.0.1030",
4
+ "version": "0.0.1032",
5
5
  "types": "dist/index.d.ts",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",