@tscircuit/core 0.0.1971 → 0.0.1972

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
@@ -504,7 +504,34 @@ interface SchematicBoxComponentDimensions {
504
504
  schHeight: number;
505
505
  }
506
506
 
507
+ interface Point3 {
508
+ x: number;
509
+ y: number;
510
+ z: number;
511
+ }
512
+ interface Bend {
513
+ id: string;
514
+ nx: number;
515
+ ny: number;
516
+ start: number;
517
+ end: number;
518
+ angle: number;
519
+ radius: number;
520
+ axisMin: number;
521
+ axisMax: number;
522
+ }
523
+ /** Points/directions in board-local Circuit JSON: +Z up, mm. */
524
+ interface PcbFold {
525
+ bends: Bend[];
526
+ point(point: Point3, flatAnchor?: Point3): Point3;
527
+ inversePoint(point: Point3, flatAnchor: Point3): Point3;
528
+ inverseDirection(direction: Point3, flatAnchor: Point3): Point3;
529
+ direction(direction: Point3, flatAnchor: Point3): Point3;
530
+ assertRigid(points: Point3[], label: string): void;
531
+ }
532
+
507
533
  interface BoardI {
534
+ pcbFold?: PcbFold;
508
535
  componentName: string;
509
536
  boardThickness: number;
510
537
  _connectedSchematicPortPairs: Set<string>;
@@ -4672,6 +4699,7 @@ declare class BoardCastellatedHole extends PlatedHole {
4672
4699
  }
4673
4700
 
4674
4701
  declare class Board extends Group<typeof boardProps> implements BoardI, SubcircuitI {
4702
+ pcbFold: PcbFold | undefined;
4675
4703
  pcb_board_id: string | null;
4676
4704
  source_board_id: string | null;
4677
4705
  _drcChecksComplete: boolean;
@@ -4683,6 +4711,7 @@ declare class Board extends Group<typeof boardProps> implements BoardI, Subcircu
4683
4711
  } | null;
4684
4712
  readonly _castellatedHoles: BoardCastellatedHole[];
4685
4713
  constructor(props: z.input<typeof boardProps>);
4714
+ doInitialPcbFlexRender(): void;
4686
4715
  get isSubcircuit(): boolean;
4687
4716
  get isGroup(): boolean;
4688
4717
  get config(): {
@@ -95013,7 +95042,7 @@ declare class FabricationNotePath extends PrimitiveComponent<typeof fabricationN
95013
95042
  pcbSx: zod.ZodOptional<zod.ZodType<_tscircuit_props.PcbSx, zod.ZodTypeDef, _tscircuit_props.PcbSx>>;
95014
95043
  pcbRelative: zod.ZodOptional<zod.ZodBoolean>;
95015
95044
  relative: zod.ZodOptional<zod.ZodBoolean>;
95016
- }, "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY" | "pcbRotation"> & {
95045
+ }, "pcbRotation" | "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY"> & {
95017
95046
  route: zod.ZodArray<zod.ZodObject<{
95018
95047
  x: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
95019
95048
  y: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
@@ -95365,7 +95394,7 @@ declare class FabricationNoteDimension extends PrimitiveComponent<typeof fabrica
95365
95394
  pcbSx: zod.ZodOptional<zod.ZodType<_tscircuit_props.PcbSx, zod.ZodTypeDef, _tscircuit_props.PcbSx>>;
95366
95395
  pcbRelative: zod.ZodOptional<zod.ZodBoolean>;
95367
95396
  relative: zod.ZodOptional<zod.ZodBoolean>;
95368
- }, "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY" | "pcbRotation"> & {
95397
+ }, "pcbRotation" | "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY"> & {
95369
95398
  from: zod.ZodUnion<[zod.ZodString, zod.ZodObject<{
95370
95399
  x: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
95371
95400
  y: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
@@ -95567,7 +95596,7 @@ declare class PcbNoteLine extends PrimitiveComponent<typeof pcbNoteLineProps> {
95567
95596
  pcbSx: zod.ZodOptional<zod.ZodType<_tscircuit_props.PcbSx, zod.ZodTypeDef, _tscircuit_props.PcbSx>>;
95568
95597
  pcbRelative: zod.ZodOptional<zod.ZodBoolean>;
95569
95598
  relative: zod.ZodOptional<zod.ZodBoolean>;
95570
- }, "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY" | "pcbRotation"> & {
95599
+ }, "pcbRotation" | "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY"> & {
95571
95600
  x1: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
95572
95601
  y1: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
95573
95602
  x2: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
@@ -96063,7 +96092,7 @@ declare class PcbNotePath extends PrimitiveComponent<typeof pcbNotePathProps> {
96063
96092
  pcbSx: zod.ZodOptional<zod.ZodType<_tscircuit_props.PcbSx, zod.ZodTypeDef, _tscircuit_props.PcbSx>>;
96064
96093
  pcbRelative: zod.ZodOptional<zod.ZodBoolean>;
96065
96094
  relative: zod.ZodOptional<zod.ZodBoolean>;
96066
- }, "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY" | "pcbRotation"> & {
96095
+ }, "pcbRotation" | "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY"> & {
96067
96096
  route: zod.ZodArray<zod.ZodObject<{
96068
96097
  x: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
96069
96098
  y: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
@@ -96248,7 +96277,7 @@ declare class PcbNoteDimension extends PrimitiveComponent<typeof pcbNoteDimensio
96248
96277
  pcbSx: zod.ZodOptional<zod.ZodType<_tscircuit_props.PcbSx, zod.ZodTypeDef, _tscircuit_props.PcbSx>>;
96249
96278
  pcbRelative: zod.ZodOptional<zod.ZodBoolean>;
96250
96279
  relative: zod.ZodOptional<zod.ZodBoolean>;
96251
- }, "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY" | "pcbRotation"> & {
96280
+ }, "pcbRotation" | "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY"> & {
96252
96281
  from: zod.ZodUnion<[zod.ZodString, zod.ZodObject<{
96253
96282
  x: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
96254
96283
  y: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
@@ -98194,7 +98223,6 @@ declare const baseBreakoutPointProps: zod.ZodObject<Omit<{
98194
98223
  pcbRightEdgeX?: string | number | undefined;
98195
98224
  pcbTopEdgeY?: string | number | undefined;
98196
98225
  pcbBottomEdgeY?: string | number | undefined;
98197
- relative?: boolean | undefined;
98198
98226
  pcbOffsetX?: number | undefined;
98199
98227
  pcbOffsetY?: number | undefined;
98200
98228
  pcbPositionAnchor?: string | undefined;
@@ -98218,6 +98246,7 @@ declare const baseBreakoutPointProps: zod.ZodObject<Omit<{
98218
98246
  } | undefined;
98219
98247
  pcbSx?: _tscircuit_props.PcbSx | undefined;
98220
98248
  pcbRelative?: boolean | undefined;
98249
+ relative?: boolean | undefined;
98221
98250
  }, {
98222
98251
  pcbX?: string | number | undefined;
98223
98252
  pcbY?: string | number | undefined;
@@ -98225,7 +98254,6 @@ declare const baseBreakoutPointProps: zod.ZodObject<Omit<{
98225
98254
  pcbRightEdgeX?: string | number | undefined;
98226
98255
  pcbTopEdgeY?: string | number | undefined;
98227
98256
  pcbBottomEdgeY?: string | number | undefined;
98228
- relative?: boolean | undefined;
98229
98257
  pcbOffsetX?: string | number | undefined;
98230
98258
  pcbOffsetY?: string | number | undefined;
98231
98259
  pcbPositionAnchor?: string | undefined;
@@ -98249,6 +98277,7 @@ declare const baseBreakoutPointProps: zod.ZodObject<Omit<{
98249
98277
  } | undefined;
98250
98278
  pcbSx?: _tscircuit_props.PcbSx | undefined;
98251
98279
  pcbRelative?: boolean | undefined;
98280
+ relative?: boolean | undefined;
98252
98281
  }>;
98253
98282
  /**
98254
98283
  * Base class for both user-facing `BreakoutPoint` (which requires a
@@ -100032,7 +100061,7 @@ declare class CourtyardOutline extends PrimitiveComponent<typeof courtyardOutlin
100032
100061
  pcbSx: zod.ZodOptional<zod.ZodType<_tscircuit_props.PcbSx, zod.ZodTypeDef, _tscircuit_props.PcbSx>>;
100033
100062
  pcbRelative: zod.ZodOptional<zod.ZodBoolean>;
100034
100063
  relative: zod.ZodOptional<zod.ZodBoolean>;
100035
- }, "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY" | "pcbRotation"> & {
100064
+ }, "pcbRotation" | "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY"> & {
100036
100065
  outline: zod.ZodArray<zod.ZodObject<{
100037
100066
  x: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
100038
100067
  y: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
@@ -100535,7 +100564,7 @@ declare class SilkscreenPath extends PrimitiveComponent<typeof silkscreenPathPro
100535
100564
  pcbSx: zod.ZodOptional<zod.ZodType<_tscircuit_props.PcbSx, zod.ZodTypeDef, _tscircuit_props.PcbSx>>;
100536
100565
  pcbRelative: zod.ZodOptional<zod.ZodBoolean>;
100537
100566
  relative: zod.ZodOptional<zod.ZodBoolean>;
100538
- }, "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY" | "pcbRotation"> & {
100567
+ }, "pcbRotation" | "pcbX" | "pcbY" | "pcbLeftEdgeX" | "pcbRightEdgeX" | "pcbTopEdgeY" | "pcbBottomEdgeY" | "pcbOffsetX" | "pcbOffsetY"> & {
100539
100568
  route: zod.ZodArray<zod.ZodObject<{
100540
100569
  x: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
100541
100570
  y: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
@@ -101090,7 +101119,7 @@ declare class SilkscreenLine extends PrimitiveComponent<typeof silkscreenLinePro
101090
101119
  pcbSx: zod.ZodOptional<zod.ZodType<_tscircuit_props.PcbSx, zod.ZodTypeDef, _tscircuit_props.PcbSx>>;
101091
101120
  pcbRelative: zod.ZodOptional<zod.ZodBoolean>;
101092
101121
  relative: zod.ZodOptional<zod.ZodBoolean>;
101093
- }, "pcbX" | "pcbY" | "pcbOffsetX" | "pcbOffsetY" | "pcbRotation"> & {
101122
+ }, "pcbRotation" | "pcbX" | "pcbY" | "pcbOffsetX" | "pcbOffsetY"> & {
101094
101123
  strokeWidth: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
101095
101124
  x1: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
101096
101125
  y1: zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>;
@@ -108209,6 +108238,7 @@ declare class PcbTrace extends PrimitiveComponent<typeof pcbTraceProps> {
108209
108238
 
108210
108239
  declare const pcbViaProps: z.ZodObject<{
108211
108240
  symbol: z.ZodOptional<z.ZodType<_tscircuit_props.SymbolProp, z.ZodTypeDef, _tscircuit_props.SymbolProp>>;
108241
+ name: z.ZodOptional<z.ZodString>;
108212
108242
  fromLayer: z.ZodOptional<z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6", "inner7", "inner8"]>, z.ZodObject<{
108213
108243
  name: z.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6", "inner7", "inner8"]>;
108214
108244
  }, "strip", z.ZodTypeAny, {
@@ -108246,21 +108276,20 @@ declare const pcbViaProps: z.ZodObject<{
108246
108276
  name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8";
108247
108277
  }>>;
108248
108278
  connectsTo: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
108249
- name: z.ZodOptional<z.ZodString>;
108250
108279
  holeDiameter: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108251
108280
  footprint: z.ZodOptional<z.ZodType<_tscircuit_props.FootprintProp, z.ZodTypeDef, _tscircuit_props.FootprintProp>>;
108252
108281
  schX: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108253
108282
  schY: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108283
+ tented: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodEnum<["both_sides", "top_and_bottom_tented", "top_tented", "bottom_tented", "exposed"]>]>, "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed", boolean | "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed" | "both_sides">>;
108284
+ pcbRotation: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108254
108285
  pcbX: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>]>>;
108255
108286
  pcbY: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>]>>;
108256
108287
  pcbLeftEdgeX: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>]>>;
108257
108288
  pcbRightEdgeX: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>]>>;
108258
108289
  pcbTopEdgeY: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>]>>;
108259
108290
  pcbBottomEdgeY: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>]>>;
108260
- relative: z.ZodOptional<z.ZodBoolean>;
108261
108291
  pcbOffsetX: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108262
108292
  pcbOffsetY: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108263
- pcbRotation: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108264
108293
  pcbPositionAnchor: z.ZodOptional<z.ZodString>;
108265
108294
  pcbPositionMode: z.ZodOptional<z.ZodEnum<["relative_to_group_anchor", "auto", "relative_to_board_anchor", "relative_to_component_anchor"]>>;
108266
108295
  shouldBeOnEdgeOfBoard: z.ZodOptional<z.ZodBoolean>;
@@ -108305,6 +108334,8 @@ declare const pcbViaProps: z.ZodObject<{
108305
108334
  silkscreenTextVisibility?: "hidden" | "visible" | "inherit" | undefined;
108306
108335
  }>>;
108307
108336
  pcbSx: z.ZodOptional<z.ZodType<_tscircuit_props.PcbSx, z.ZodTypeDef, _tscircuit_props.PcbSx>>;
108337
+ pcbRelative: z.ZodOptional<z.ZodBoolean>;
108338
+ relative: z.ZodOptional<z.ZodBoolean>;
108308
108339
  schMarginTop: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108309
108340
  schMarginRight: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108310
108341
  schMarginBottom: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
@@ -108323,8 +108354,6 @@ declare const pcbViaProps: z.ZodObject<{
108323
108354
  defaultCapacitorOrientation?: "none" | "vertical" | undefined;
108324
108355
  }>>;
108325
108356
  schRelative: z.ZodOptional<z.ZodBoolean>;
108326
- pcbRelative: z.ZodOptional<z.ZodBoolean>;
108327
- tented: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodEnum<["both_sides", "top_and_bottom_tented", "top_tented", "bottom_tented", "exposed"]>]>, "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed", boolean | "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed" | "both_sides">>;
108328
108357
  isTented: z.ZodOptional<z.ZodBoolean>;
108329
108358
  tentedOnTop: z.ZodOptional<z.ZodBoolean>;
108330
108359
  tentedOnBottom: z.ZodOptional<z.ZodBoolean>;
@@ -108332,26 +108361,26 @@ declare const pcbViaProps: z.ZodObject<{
108332
108361
  netIsAssignable: z.ZodOptional<z.ZodBoolean>;
108333
108362
  }, "strip", z.ZodTypeAny, {
108334
108363
  symbol?: _tscircuit_props.SymbolProp | undefined;
108364
+ name?: string | undefined;
108335
108365
  fromLayer?: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8" | undefined;
108336
108366
  toLayer?: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8" | undefined;
108337
108367
  layers?: ("top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8")[] | undefined;
108338
108368
  layer?: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8" | undefined;
108339
108369
  connectsTo?: string | string[] | undefined;
108340
- name?: string | undefined;
108341
108370
  holeDiameter?: number | undefined;
108342
108371
  footprint?: _tscircuit_props.FootprintProp | undefined;
108343
108372
  schX?: number | undefined;
108344
108373
  schY?: number | undefined;
108374
+ tented?: "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed" | undefined;
108375
+ pcbRotation?: number | undefined;
108345
108376
  pcbX?: string | number | undefined;
108346
108377
  pcbY?: string | number | undefined;
108347
108378
  pcbLeftEdgeX?: string | number | undefined;
108348
108379
  pcbRightEdgeX?: string | number | undefined;
108349
108380
  pcbTopEdgeY?: string | number | undefined;
108350
108381
  pcbBottomEdgeY?: string | number | undefined;
108351
- relative?: boolean | undefined;
108352
108382
  pcbOffsetX?: number | undefined;
108353
108383
  pcbOffsetY?: number | undefined;
108354
- pcbRotation?: number | undefined;
108355
108384
  pcbPositionAnchor?: string | undefined;
108356
108385
  pcbPositionMode?: "auto" | "relative_to_group_anchor" | "relative_to_board_anchor" | "relative_to_component_anchor" | undefined;
108357
108386
  shouldBeOnEdgeOfBoard?: boolean | undefined;
@@ -108372,6 +108401,8 @@ declare const pcbViaProps: z.ZodObject<{
108372
108401
  silkscreenTextVisibility?: "hidden" | "visible" | "inherit" | undefined;
108373
108402
  } | undefined;
108374
108403
  pcbSx?: _tscircuit_props.PcbSx | undefined;
108404
+ pcbRelative?: boolean | undefined;
108405
+ relative?: boolean | undefined;
108375
108406
  schMarginTop?: number | undefined;
108376
108407
  schMarginRight?: number | undefined;
108377
108408
  schMarginBottom?: number | undefined;
@@ -108384,8 +108415,6 @@ declare const pcbViaProps: z.ZodObject<{
108384
108415
  defaultCapacitorOrientation?: "none" | "vertical" | undefined;
108385
108416
  } | undefined;
108386
108417
  schRelative?: boolean | undefined;
108387
- pcbRelative?: boolean | undefined;
108388
- tented?: "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed" | undefined;
108389
108418
  isTented?: boolean | undefined;
108390
108419
  tentedOnTop?: boolean | undefined;
108391
108420
  tentedOnBottom?: boolean | undefined;
@@ -108393,6 +108422,7 @@ declare const pcbViaProps: z.ZodObject<{
108393
108422
  netIsAssignable?: boolean | undefined;
108394
108423
  }, {
108395
108424
  symbol?: _tscircuit_props.SymbolProp | undefined;
108425
+ name?: string | undefined;
108396
108426
  fromLayer?: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8" | {
108397
108427
  name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8";
108398
108428
  } | undefined;
@@ -108406,21 +108436,20 @@ declare const pcbViaProps: z.ZodObject<{
108406
108436
  name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8";
108407
108437
  } | undefined;
108408
108438
  connectsTo?: string | string[] | undefined;
108409
- name?: string | undefined;
108410
108439
  holeDiameter?: string | number | undefined;
108411
108440
  footprint?: _tscircuit_props.FootprintProp | undefined;
108412
108441
  schX?: string | number | undefined;
108413
108442
  schY?: string | number | undefined;
108443
+ tented?: boolean | "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed" | "both_sides" | undefined;
108444
+ pcbRotation?: string | number | undefined;
108414
108445
  pcbX?: string | number | undefined;
108415
108446
  pcbY?: string | number | undefined;
108416
108447
  pcbLeftEdgeX?: string | number | undefined;
108417
108448
  pcbRightEdgeX?: string | number | undefined;
108418
108449
  pcbTopEdgeY?: string | number | undefined;
108419
108450
  pcbBottomEdgeY?: string | number | undefined;
108420
- relative?: boolean | undefined;
108421
108451
  pcbOffsetX?: string | number | undefined;
108422
108452
  pcbOffsetY?: string | number | undefined;
108423
- pcbRotation?: string | number | undefined;
108424
108453
  pcbPositionAnchor?: string | undefined;
108425
108454
  pcbPositionMode?: "auto" | "relative_to_group_anchor" | "relative_to_board_anchor" | "relative_to_component_anchor" | undefined;
108426
108455
  shouldBeOnEdgeOfBoard?: boolean | undefined;
@@ -108441,6 +108470,8 @@ declare const pcbViaProps: z.ZodObject<{
108441
108470
  silkscreenTextVisibility?: "hidden" | "visible" | "inherit" | undefined;
108442
108471
  } | undefined;
108443
108472
  pcbSx?: _tscircuit_props.PcbSx | undefined;
108473
+ pcbRelative?: boolean | undefined;
108474
+ relative?: boolean | undefined;
108444
108475
  schMarginTop?: string | number | undefined;
108445
108476
  schMarginRight?: string | number | undefined;
108446
108477
  schMarginBottom?: string | number | undefined;
@@ -108453,8 +108484,6 @@ declare const pcbViaProps: z.ZodObject<{
108453
108484
  defaultCapacitorOrientation?: "none" | "vertical" | undefined;
108454
108485
  } | undefined;
108455
108486
  schRelative?: boolean | undefined;
108456
- pcbRelative?: boolean | undefined;
108457
- tented?: boolean | "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed" | "both_sides" | undefined;
108458
108487
  isTented?: boolean | undefined;
108459
108488
  tentedOnTop?: boolean | undefined;
108460
108489
  tentedOnBottom?: boolean | undefined;
@@ -108469,6 +108498,7 @@ declare class PcbVia extends PrimitiveComponent<typeof pcbViaProps> {
108469
108498
  componentName: string;
108470
108499
  zodProps: z.ZodObject<{
108471
108500
  symbol: z.ZodOptional<z.ZodType<_tscircuit_props.SymbolProp, z.ZodTypeDef, _tscircuit_props.SymbolProp>>;
108501
+ name: z.ZodOptional<z.ZodString>;
108472
108502
  fromLayer: z.ZodOptional<z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6", "inner7", "inner8"]>, z.ZodObject<{
108473
108503
  name: z.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6", "inner7", "inner8"]>;
108474
108504
  }, "strip", z.ZodTypeAny, {
@@ -108506,21 +108536,20 @@ declare class PcbVia extends PrimitiveComponent<typeof pcbViaProps> {
108506
108536
  name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8";
108507
108537
  }>>;
108508
108538
  connectsTo: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
108509
- name: z.ZodOptional<z.ZodString>;
108510
108539
  holeDiameter: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108511
108540
  footprint: z.ZodOptional<z.ZodType<_tscircuit_props.FootprintProp, z.ZodTypeDef, _tscircuit_props.FootprintProp>>;
108512
108541
  schX: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108513
108542
  schY: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108543
+ tented: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodEnum<["both_sides", "top_and_bottom_tented", "top_tented", "bottom_tented", "exposed"]>]>, "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed", boolean | "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed" | "both_sides">>;
108544
+ pcbRotation: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108514
108545
  pcbX: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>]>>;
108515
108546
  pcbY: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>]>>;
108516
108547
  pcbLeftEdgeX: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>]>>;
108517
108548
  pcbRightEdgeX: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>]>>;
108518
108549
  pcbTopEdgeY: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>]>>;
108519
108550
  pcbBottomEdgeY: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>]>>;
108520
- relative: z.ZodOptional<z.ZodBoolean>;
108521
108551
  pcbOffsetX: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108522
108552
  pcbOffsetY: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108523
- pcbRotation: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108524
108553
  pcbPositionAnchor: z.ZodOptional<z.ZodString>;
108525
108554
  pcbPositionMode: z.ZodOptional<z.ZodEnum<["relative_to_group_anchor", "auto", "relative_to_board_anchor", "relative_to_component_anchor"]>>;
108526
108555
  shouldBeOnEdgeOfBoard: z.ZodOptional<z.ZodBoolean>;
@@ -108565,6 +108594,8 @@ declare class PcbVia extends PrimitiveComponent<typeof pcbViaProps> {
108565
108594
  silkscreenTextVisibility?: "hidden" | "visible" | "inherit" | undefined;
108566
108595
  }>>;
108567
108596
  pcbSx: z.ZodOptional<z.ZodType<_tscircuit_props.PcbSx, z.ZodTypeDef, _tscircuit_props.PcbSx>>;
108597
+ pcbRelative: z.ZodOptional<z.ZodBoolean>;
108598
+ relative: z.ZodOptional<z.ZodBoolean>;
108568
108599
  schMarginTop: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108569
108600
  schMarginRight: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
108570
108601
  schMarginBottom: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>>;
@@ -108583,8 +108614,6 @@ declare class PcbVia extends PrimitiveComponent<typeof pcbViaProps> {
108583
108614
  defaultCapacitorOrientation?: "none" | "vertical" | undefined;
108584
108615
  }>>;
108585
108616
  schRelative: z.ZodOptional<z.ZodBoolean>;
108586
- pcbRelative: z.ZodOptional<z.ZodBoolean>;
108587
- tented: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodEnum<["both_sides", "top_and_bottom_tented", "top_tented", "bottom_tented", "exposed"]>]>, "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed", boolean | "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed" | "both_sides">>;
108588
108617
  isTented: z.ZodOptional<z.ZodBoolean>;
108589
108618
  tentedOnTop: z.ZodOptional<z.ZodBoolean>;
108590
108619
  tentedOnBottom: z.ZodOptional<z.ZodBoolean>;
@@ -108592,26 +108621,26 @@ declare class PcbVia extends PrimitiveComponent<typeof pcbViaProps> {
108592
108621
  netIsAssignable: z.ZodOptional<z.ZodBoolean>;
108593
108622
  }, "strip", z.ZodTypeAny, {
108594
108623
  symbol?: _tscircuit_props.SymbolProp | undefined;
108624
+ name?: string | undefined;
108595
108625
  fromLayer?: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8" | undefined;
108596
108626
  toLayer?: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8" | undefined;
108597
108627
  layers?: ("top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8")[] | undefined;
108598
108628
  layer?: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8" | undefined;
108599
108629
  connectsTo?: string | string[] | undefined;
108600
- name?: string | undefined;
108601
108630
  holeDiameter?: number | undefined;
108602
108631
  footprint?: _tscircuit_props.FootprintProp | undefined;
108603
108632
  schX?: number | undefined;
108604
108633
  schY?: number | undefined;
108634
+ tented?: "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed" | undefined;
108635
+ pcbRotation?: number | undefined;
108605
108636
  pcbX?: string | number | undefined;
108606
108637
  pcbY?: string | number | undefined;
108607
108638
  pcbLeftEdgeX?: string | number | undefined;
108608
108639
  pcbRightEdgeX?: string | number | undefined;
108609
108640
  pcbTopEdgeY?: string | number | undefined;
108610
108641
  pcbBottomEdgeY?: string | number | undefined;
108611
- relative?: boolean | undefined;
108612
108642
  pcbOffsetX?: number | undefined;
108613
108643
  pcbOffsetY?: number | undefined;
108614
- pcbRotation?: number | undefined;
108615
108644
  pcbPositionAnchor?: string | undefined;
108616
108645
  pcbPositionMode?: "auto" | "relative_to_group_anchor" | "relative_to_board_anchor" | "relative_to_component_anchor" | undefined;
108617
108646
  shouldBeOnEdgeOfBoard?: boolean | undefined;
@@ -108632,6 +108661,8 @@ declare class PcbVia extends PrimitiveComponent<typeof pcbViaProps> {
108632
108661
  silkscreenTextVisibility?: "hidden" | "visible" | "inherit" | undefined;
108633
108662
  } | undefined;
108634
108663
  pcbSx?: _tscircuit_props.PcbSx | undefined;
108664
+ pcbRelative?: boolean | undefined;
108665
+ relative?: boolean | undefined;
108635
108666
  schMarginTop?: number | undefined;
108636
108667
  schMarginRight?: number | undefined;
108637
108668
  schMarginBottom?: number | undefined;
@@ -108644,8 +108675,6 @@ declare class PcbVia extends PrimitiveComponent<typeof pcbViaProps> {
108644
108675
  defaultCapacitorOrientation?: "none" | "vertical" | undefined;
108645
108676
  } | undefined;
108646
108677
  schRelative?: boolean | undefined;
108647
- pcbRelative?: boolean | undefined;
108648
- tented?: "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed" | undefined;
108649
108678
  isTented?: boolean | undefined;
108650
108679
  tentedOnTop?: boolean | undefined;
108651
108680
  tentedOnBottom?: boolean | undefined;
@@ -108653,6 +108682,7 @@ declare class PcbVia extends PrimitiveComponent<typeof pcbViaProps> {
108653
108682
  netIsAssignable?: boolean | undefined;
108654
108683
  }, {
108655
108684
  symbol?: _tscircuit_props.SymbolProp | undefined;
108685
+ name?: string | undefined;
108656
108686
  fromLayer?: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8" | {
108657
108687
  name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8";
108658
108688
  } | undefined;
@@ -108666,21 +108696,20 @@ declare class PcbVia extends PrimitiveComponent<typeof pcbViaProps> {
108666
108696
  name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | "inner7" | "inner8";
108667
108697
  } | undefined;
108668
108698
  connectsTo?: string | string[] | undefined;
108669
- name?: string | undefined;
108670
108699
  holeDiameter?: string | number | undefined;
108671
108700
  footprint?: _tscircuit_props.FootprintProp | undefined;
108672
108701
  schX?: string | number | undefined;
108673
108702
  schY?: string | number | undefined;
108703
+ tented?: boolean | "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed" | "both_sides" | undefined;
108704
+ pcbRotation?: string | number | undefined;
108674
108705
  pcbX?: string | number | undefined;
108675
108706
  pcbY?: string | number | undefined;
108676
108707
  pcbLeftEdgeX?: string | number | undefined;
108677
108708
  pcbRightEdgeX?: string | number | undefined;
108678
108709
  pcbTopEdgeY?: string | number | undefined;
108679
108710
  pcbBottomEdgeY?: string | number | undefined;
108680
- relative?: boolean | undefined;
108681
108711
  pcbOffsetX?: string | number | undefined;
108682
108712
  pcbOffsetY?: string | number | undefined;
108683
- pcbRotation?: string | number | undefined;
108684
108713
  pcbPositionAnchor?: string | undefined;
108685
108714
  pcbPositionMode?: "auto" | "relative_to_group_anchor" | "relative_to_board_anchor" | "relative_to_component_anchor" | undefined;
108686
108715
  shouldBeOnEdgeOfBoard?: boolean | undefined;
@@ -108701,6 +108730,8 @@ declare class PcbVia extends PrimitiveComponent<typeof pcbViaProps> {
108701
108730
  silkscreenTextVisibility?: "hidden" | "visible" | "inherit" | undefined;
108702
108731
  } | undefined;
108703
108732
  pcbSx?: _tscircuit_props.PcbSx | undefined;
108733
+ pcbRelative?: boolean | undefined;
108734
+ relative?: boolean | undefined;
108704
108735
  schMarginTop?: string | number | undefined;
108705
108736
  schMarginRight?: string | number | undefined;
108706
108737
  schMarginBottom?: string | number | undefined;
@@ -108713,8 +108744,6 @@ declare class PcbVia extends PrimitiveComponent<typeof pcbViaProps> {
108713
108744
  defaultCapacitorOrientation?: "none" | "vertical" | undefined;
108714
108745
  } | undefined;
108715
108746
  schRelative?: boolean | undefined;
108716
- pcbRelative?: boolean | undefined;
108717
- tented?: boolean | "top_and_bottom_tented" | "top_tented" | "bottom_tented" | "exposed" | "both_sides" | undefined;
108718
108747
  isTented?: boolean | undefined;
108719
108748
  tentedOnTop?: boolean | undefined;
108720
108749
  tentedOnBottom?: boolean | undefined;
package/dist/index.js CHANGED
@@ -123,6 +123,207 @@ __export(components_exports, {
123
123
  VoltageSource: () => VoltageSource
124
124
  });
125
125
 
126
+ // lib/utils/cad/get-board-fold-context.ts
127
+ function getBoardFoldContext(pcbComponentOwner) {
128
+ const board = pcbComponentOwner._getBoard();
129
+ if (!board?.pcbFold || !board.pcb_board_id || !pcbComponentOwner.pcb_component_id)
130
+ return void 0;
131
+ const { db } = pcbComponentOwner.root;
132
+ const pcbBoard = db.pcb_board.get(board.pcb_board_id);
133
+ const pcbComponent = db.pcb_component.get(pcbComponentOwner.pcb_component_id);
134
+ return {
135
+ fold: board.pcbFold,
136
+ boardCenter: pcbBoard.center,
137
+ flatMount: pcbComponent.center
138
+ };
139
+ }
140
+
141
+ // node_modules/@tscircuit/flex-utils/dist/index.js
142
+ import earcut from "earcut";
143
+ var EPS = 1e-7;
144
+ function createPcbFold(records, thickness) {
145
+ if (!Number.isFinite(thickness) || thickness < 0)
146
+ throw new Error("Board thickness must be finite and nonnegative");
147
+ const bends = records.map((b) => {
148
+ const { start, end, bend_angle: degrees, bend_radius: radius } = b;
149
+ const values = [start?.x, start?.y, end?.x, end?.y, degrees, radius];
150
+ if (values.some((v) => !Number.isFinite(v)) || radius <= thickness / 2 || !["left", "right"].includes(b.bend_side)) {
151
+ throw new Error(
152
+ `Invalid PCB bend ${b.pcb_bend_id}: finite geometry and radius greater than half the board thickness are required`
153
+ );
154
+ }
155
+ const length8 = Math.hypot(end.x - start.x, end.y - start.y);
156
+ if (length8 < EPS || Math.abs(degrees) > 180)
157
+ throw new Error(
158
+ `Unsupported PCB bend ${b.pcb_bend_id}: distinct endpoints and angles within \xB1180 degrees are required`
159
+ );
160
+ const sign = b.bend_side === "right" ? 1 : -1;
161
+ const nx = sign * (end.y - start.y) / length8;
162
+ const ny = -sign * (end.x - start.x) / length8;
163
+ const angle = degrees * Math.PI / 180;
164
+ const width = radius * Math.abs(angle);
165
+ const center = start.x * nx + start.y * ny;
166
+ return {
167
+ id: b.pcb_bend_id,
168
+ nx,
169
+ ny,
170
+ start: center - width / 2,
171
+ end: center + width / 2,
172
+ angle,
173
+ radius,
174
+ axisMin: Math.min(
175
+ -ny * start.x + nx * start.y,
176
+ -ny * end.x + nx * end.y
177
+ ),
178
+ axisMax: Math.max(
179
+ -ny * start.x + nx * start.y,
180
+ -ny * end.x + nx * end.y
181
+ )
182
+ };
183
+ }).filter((b) => Math.abs(b.angle) > EPS);
184
+ const first = bends[0];
185
+ if (first && bends.some(
186
+ (b) => Math.abs(b.nx - first.nx) > EPS || Math.abs(b.ny - first.ny) > EPS
187
+ )) {
188
+ throw new Error(
189
+ "Folded PCB rendering currently requires parallel bends with the same moving direction"
190
+ );
191
+ }
192
+ bends.sort((a, b) => a.start - b.start);
193
+ for (let i = 1; i < bends.length; i++) {
194
+ if (bends[i].start < bends[i - 1].end - EPS)
195
+ throw new Error("Overlapping PCB bend zones are not supported");
196
+ }
197
+ const distalFirst = [...bends].reverse();
198
+ const transform = ({
199
+ p,
200
+ anchor,
201
+ direction
202
+ }) => {
203
+ let result = { ...p };
204
+ for (const b of distalFirst) {
205
+ const width = b.end - b.start;
206
+ const s = anchor.x * b.nx + anchor.y * b.ny - b.start;
207
+ const q = Math.max(0, Math.min(width, s));
208
+ const theta = b.angle * q / width;
209
+ const cos = Math.cos(theta), sin = Math.sin(theta);
210
+ const projected = result.x * b.nx + result.y * b.ny - (direction ? 0 : b.start);
211
+ const tangentX = result.x - (projected + (direction ? 0 : b.start)) * b.nx;
212
+ const tangentY = result.y - (projected + (direction ? 0 : b.start)) * b.ny;
213
+ const signedRadius = Math.sign(b.angle) * b.radius;
214
+ const tx = direction ? 0 : signedRadius * sin - q * cos;
215
+ const tz = direction ? 0 : signedRadius * (1 - cos) - q * sin;
216
+ const folded = projected * cos - result.z * sin + tx;
217
+ result = {
218
+ x: tangentX + (folded + (direction ? 0 : b.start)) * b.nx,
219
+ y: tangentY + (folded + (direction ? 0 : b.start)) * b.ny,
220
+ z: projected * sin + result.z * cos + tz
221
+ };
222
+ }
223
+ return result;
224
+ };
225
+ const inverse2 = ({
226
+ p,
227
+ anchor,
228
+ direction
229
+ }) => {
230
+ const origin = direction ? { x: 0, y: 0, z: 0 } : transform({
231
+ p: { x: 0, y: 0, z: 0 },
232
+ anchor,
233
+ direction: false
234
+ });
235
+ const d = { x: p.x - origin.x, y: p.y - origin.y, z: p.z - origin.z };
236
+ const axes2 = [
237
+ { x: 1, y: 0, z: 0 },
238
+ { x: 0, y: 1, z: 0 },
239
+ { x: 0, y: 0, z: 1 }
240
+ ].map((v) => transform({ p: v, anchor, direction: true }));
241
+ const dot = (v) => v.x * d.x + v.y * d.y + v.z * d.z;
242
+ return { x: dot(axes2[0]), y: dot(axes2[1]), z: dot(axes2[2]) };
243
+ };
244
+ return {
245
+ bends,
246
+ inversePoint: (p, anchor) => inverse2({ p, anchor, direction: false }),
247
+ inverseDirection: (p, anchor) => inverse2({ p, anchor, direction: true }),
248
+ point: (p, anchor = p) => transform({ p, anchor, direction: false }),
249
+ direction: (p, anchor) => transform({ p, anchor, direction: true }),
250
+ assertRigid(points, label) {
251
+ for (const b of bends) {
252
+ const ds = points.map((p) => p.x * b.nx + p.y * b.ny);
253
+ if (Math.max(...ds) > b.start + EPS && Math.min(...ds) < b.end - EPS)
254
+ throw new Error(`${label} intersects PCB bend zone ${b.id}`);
255
+ }
256
+ }
257
+ };
258
+ }
259
+ var axes = [
260
+ { x: 1, y: 0, z: 0 },
261
+ { x: 0, y: 1, z: 0 },
262
+ { x: 0, y: 0, z: 1 }
263
+ ];
264
+ function rotateVector(v, degrees) {
265
+ const [x, y, z18] = [degrees.x, degrees.y, degrees.z].map(
266
+ (a2) => a2 * Math.PI / 180
267
+ );
268
+ const a = {
269
+ x: Math.cos(z18) * v.x - Math.sin(z18) * v.y,
270
+ y: Math.sin(z18) * v.x + Math.cos(z18) * v.y,
271
+ z: v.z
272
+ };
273
+ const b = {
274
+ x: Math.cos(y) * a.x + Math.sin(y) * a.z,
275
+ y: a.y,
276
+ z: -Math.sin(y) * a.x + Math.cos(y) * a.z
277
+ };
278
+ return {
279
+ x: b.x,
280
+ y: Math.cos(x) * b.y - Math.sin(x) * b.z,
281
+ z: Math.sin(x) * b.y + Math.cos(x) * b.z
282
+ };
283
+ }
284
+ function rotationFromAxes([a, b, c]) {
285
+ const y = Math.asin(Math.max(-1, Math.min(1, c.x)));
286
+ const regular = Math.abs(c.x) < 1 - 1e-12;
287
+ return {
288
+ x: (regular ? Math.atan2(-c.y, c.z) : Math.atan2(b.z, b.y)) * 180 / Math.PI,
289
+ y: y * 180 / Math.PI,
290
+ z: (regular ? Math.atan2(-b.x, a.x) : 0) * 180 / Math.PI
291
+ };
292
+ }
293
+ function transformCadComponentPlacement({
294
+ cadComponentPlacement,
295
+ foldPcbs
296
+ }, context) {
297
+ if (cadComponentPlacement.is_on_folded_board === true === foldPcbs)
298
+ return cadComponentPlacement;
299
+ const { fold, boardCenter, flatMount } = context;
300
+ const anchor = {
301
+ x: flatMount.x - boardCenter.x,
302
+ y: flatMount.y - boardCenter.y,
303
+ z: 0
304
+ };
305
+ fold.assertRigid([anchor], "CAD mount");
306
+ const point6 = {
307
+ x: cadComponentPlacement.position.x - boardCenter.x,
308
+ y: cadComponentPlacement.position.y - boardCenter.y,
309
+ z: cadComponentPlacement.position.z
310
+ };
311
+ const direction = foldPcbs ? fold.direction : fold.inverseDirection;
312
+ const transformed = foldPcbs ? fold.point(point6, anchor) : fold.inversePoint(point6, anchor);
313
+ const rotation5 = cadComponentPlacement.rotation ?? context.defaultRotation ?? { x: 0, y: 0, z: 0 };
314
+ const basis = axes.map((v) => direction(rotateVector(v, rotation5), anchor));
315
+ return {
316
+ ...cadComponentPlacement,
317
+ position: {
318
+ x: transformed.x + boardCenter.x,
319
+ y: transformed.y + boardCenter.y,
320
+ z: transformed.z
321
+ },
322
+ rotation: rotationFromAxes(basis),
323
+ is_on_folded_board: foldPcbs
324
+ };
325
+ }
326
+
126
327
  // lib/components/base-components/NormalComponent/NormalComponent.ts
127
328
  import { fp } from "@tscircuit/footprinter";
128
329
  import { normalizeDegrees as normalizeDegrees5 } from "@tscircuit/math-utils";
@@ -13546,7 +13747,7 @@ var CadModel = class extends PrimitiveComponent2 {
13546
13747
  const transformed = this._addCachebustToModelUrl(props.stepUrl);
13547
13748
  if (transformed) urlProps.model_step_url = transformed;
13548
13749
  }
13549
- const cad = db.cad_component.insert({
13750
+ let cadComponentPlacement = {
13550
13751
  position: {
13551
13752
  x: bounds.center.x + Number(positionOffset.x),
13552
13753
  y: bounds.center.y + Number(positionOffset.y),
@@ -13558,7 +13759,17 @@ var CadModel = class extends PrimitiveComponent2 {
13558
13759
  z: normalizeDegrees4(
13559
13760
  layer === "bottom" ? -(accumulatedRotation + Number(rotationOffset.z)) : accumulatedRotation + Number(rotationOffset.z)
13560
13761
  )
13561
- },
13762
+ }
13763
+ };
13764
+ const boardFoldContext = getBoardFoldContext(parent);
13765
+ if (boardFoldContext) {
13766
+ cadComponentPlacement = transformCadComponentPlacement(
13767
+ { cadComponentPlacement, foldPcbs: true },
13768
+ boardFoldContext
13769
+ );
13770
+ }
13771
+ const cadComponent = db.cad_component.insert({
13772
+ ...cadComponentPlacement,
13562
13773
  pcb_component_id: parent.pcb_component_id,
13563
13774
  model_board_normal_direction: props.modelBoardNormalDirection,
13564
13775
  model_origin_alignment: "center_of_component_on_board_surface",
@@ -13570,7 +13781,7 @@ var CadModel = class extends PrimitiveComponent2 {
13570
13781
  show_as_translucent_model: props.showAsTranslucentModel ?? parent._parsedProps.showAsTranslucentModel,
13571
13782
  ...urlProps
13572
13783
  });
13573
- this.cad_component_id = cad.cad_component_id;
13784
+ this.cad_component_id = cadComponent.cad_component_id;
13574
13785
  }
13575
13786
  _findParentWithPcbComponent() {
13576
13787
  let p = this.parent;
@@ -16654,7 +16865,7 @@ var NormalComponent = class extends PrimitiveComponent2 {
16654
16865
  const totalRotation = pcbComponent?.position_mode === "packed" ? pcbComponent.rotation ?? preLayoutRotation : preLayoutRotation;
16655
16866
  const isBottomLayer = computedLayer === "bottom";
16656
16867
  if (!cadModel && !footprintIsFootprinterString) {
16657
- const cad_component = db.cad_component.insert({
16868
+ let cadComponentPlacement2 = {
16658
16869
  position: {
16659
16870
  x: bounds.center.x,
16660
16871
  y: bounds.center.y,
@@ -16664,7 +16875,17 @@ var NormalComponent = class extends PrimitiveComponent2 {
16664
16875
  x: 0,
16665
16876
  y: isBottomLayer ? 180 : 0,
16666
16877
  z: normalizeDegrees5(isBottomLayer ? -totalRotation : totalRotation)
16667
- },
16878
+ }
16879
+ };
16880
+ const boardFoldContext2 = getBoardFoldContext(this);
16881
+ if (boardFoldContext2) {
16882
+ cadComponentPlacement2 = transformCadComponentPlacement(
16883
+ { cadComponentPlacement: cadComponentPlacement2, foldPcbs: true },
16884
+ boardFoldContext2
16885
+ );
16886
+ }
16887
+ const cadComponent2 = db.cad_component.insert({
16888
+ ...cadComponentPlacement2,
16668
16889
  pcb_component_id: this.pcb_component_id,
16669
16890
  source_component_id: this.source_component_id,
16670
16891
  model_origin_alignment: "center_of_component_on_board_surface",
@@ -16672,7 +16893,7 @@ var NormalComponent = class extends PrimitiveComponent2 {
16672
16893
  show_as_bounding_box: true,
16673
16894
  show_as_translucent_model: this._parsedProps.showAsTranslucentModel
16674
16895
  });
16675
- this.cad_component_id = cad_component.cad_component_id;
16896
+ this.cad_component_id = cadComponent2.cad_component_id;
16676
16897
  return;
16677
16898
  }
16678
16899
  const rotationWithOffset = totalRotation + (rotationOffset.z ?? 0);
@@ -16681,8 +16902,7 @@ var NormalComponent = class extends PrimitiveComponent2 {
16681
16902
  if (!cadModel && footprintIsFootprinterString) {
16682
16903
  footprinterStringForCadComponent = footprintString;
16683
16904
  }
16684
- const cad_model = db.cad_component.insert({
16685
- // TODO z maybe depends on layer
16905
+ let cadComponentPlacement = {
16686
16906
  position: {
16687
16907
  x: bounds.center.x + positionOffset.x,
16688
16908
  y: bounds.center.y + positionOffset.y,
@@ -16692,7 +16912,18 @@ var NormalComponent = class extends PrimitiveComponent2 {
16692
16912
  x: rotationOffset.x,
16693
16913
  y: rotationOffset.y + (isBottomLayer ? 180 : 0),
16694
16914
  z: normalizeDegrees5(isBottomLayer ? -cadRotationZ : cadRotationZ)
16695
- },
16915
+ }
16916
+ };
16917
+ const boardFoldContext = getBoardFoldContext(this);
16918
+ if (boardFoldContext) {
16919
+ cadComponentPlacement = transformCadComponentPlacement(
16920
+ { cadComponentPlacement, foldPcbs: true },
16921
+ boardFoldContext
16922
+ );
16923
+ }
16924
+ const cadComponent = db.cad_component.insert({
16925
+ // TODO z maybe depends on layer
16926
+ ...cadComponentPlacement,
16696
16927
  pcb_component_id: this.pcb_component_id,
16697
16928
  source_component_id: this.source_component_id,
16698
16929
  model_stl_url: "stlUrl" in (cadModel ?? {}) ? this._addCachebustToModelUrl(cadModel.stlUrl) : void 0,
@@ -16715,7 +16946,7 @@ var NormalComponent = class extends PrimitiveComponent2 {
16715
16946
  footprinter_string: footprinterStringForCadComponent,
16716
16947
  show_as_translucent_model: this._parsedProps.showAsTranslucentModel
16717
16948
  });
16718
- this.cad_component_id = cad_model.cad_component_id;
16949
+ this.cad_component_id = cadComponent.cad_component_id;
16719
16950
  }
16720
16951
  _addCachebustToModelUrl(url) {
16721
16952
  if (!url || !url.includes("modelcdn.tscircuit.com")) return url;
@@ -40875,7 +41106,7 @@ function* repairPeripheralBusLengthsSteps(params) {
40875
41106
  }
40876
41107
 
40877
41108
  // node_modules/@tscircuit/fanout-solver/lib/route-split-perimeter-source-escapes.ts
40878
- var EPS = 1e-7;
41109
+ var EPS2 = 1e-7;
40879
41110
  function chamferSplitPerimeter(points, width) {
40880
41111
  const ps = points.filter((p, i) => !i || distance9(p, points[i - 1]) > 1e-9);
40881
41112
  return ps.flatMap((p, i) => {
@@ -40911,8 +41142,8 @@ function orderedPhysicalSubset(paths, params, center) {
40911
41142
  let mask = 0;
40912
41143
  paths.forEach((p, i) => {
40913
41144
  if (p.connectionIndex === connection.connectionIndex) return;
40914
- if (distance9(v.point, p.exitPoint) < d + c - EPS || distancePointToSegment(p.exitPoint, s.start, s.end) < d / 2 + w / 2 + c - EPS || p.segments.some(
40915
- (t) => distancePointToSegment(v.point, t.start, t.end) < d / 2 + w / 2 + c - EPS || !segmentsAreClear(s, t, c)
41145
+ if (distance9(v.point, p.exitPoint) < d + c - EPS2 || distancePointToSegment(p.exitPoint, s.start, s.end) < d / 2 + w / 2 + c - EPS2 || p.segments.some(
41146
+ (t) => distancePointToSegment(v.point, t.start, t.end) < d / 2 + w / 2 + c - EPS2 || !segmentsAreClear(s, t, c)
40916
41147
  ))
40917
41148
  mask |= 1 << i;
40918
41149
  });
@@ -41044,23 +41275,23 @@ function* routeSplitPerimeterSourceEscapesSteps(params) {
41044
41275
  const conn = byIndex.get(p.connectionIndex).connection;
41045
41276
  if (p.segments.some(
41046
41277
  (s) => [s.start, s.end].some(
41047
- (q) => q.x < bus.sharedBoundary.minX - EPS || q.x > bus.sharedBoundary.maxX + EPS || q.y < bus.sharedBoundary.minY - EPS || q.y > bus.sharedBoundary.maxY + EPS
41278
+ (q) => q.x < bus.sharedBoundary.minX - EPS2 || q.x > bus.sharedBoundary.maxX + EPS2 || q.y < bus.sharedBoundary.minY - EPS2 || q.y > bus.sharedBoundary.maxY + EPS2
41048
41279
  )
41049
41280
  ))
41050
41281
  return false;
41051
41282
  for (const o of srj.obstacles) {
41052
- if (o.layers.some((l) => p.via.spanLayers.includes(l)) && distancePointToObstacle(p.via.center, o) < d / 2 + c - EPS)
41283
+ if (o.layers.some((l) => p.via.spanLayers.includes(l)) && distancePointToObstacle(p.via.center, o) < d / 2 + c - EPS2)
41053
41284
  return false;
41054
41285
  if (o !== conn.sourceObstacle && p.segments.some(
41055
- (s) => o.layers.includes(s.layer) && distanceSegmentToObstacle(s, o) < w / 2 + c - EPS
41286
+ (s) => o.layers.includes(s.layer) && distanceSegmentToObstacle(s, o) < w / 2 + c - EPS2
41056
41287
  ))
41057
41288
  return false;
41058
41289
  }
41059
41290
  return others.every(
41060
- (q) => q.connectionIndex === p.connectionIndex || distance9(p.via.center, q.via.center) >= d + c - EPS && p.segments.every(
41061
- (s) => distancePointToSegment(q.via.center, s.start, s.end) >= d / 2 + w / 2 + c - EPS && q.segments.every((t) => segmentsAreClear(s, t, c))
41291
+ (q) => q.connectionIndex === p.connectionIndex || distance9(p.via.center, q.via.center) >= d + c - EPS2 && p.segments.every(
41292
+ (s) => distancePointToSegment(q.via.center, s.start, s.end) >= d / 2 + w / 2 + c - EPS2 && q.segments.every((t) => segmentsAreClear(s, t, c))
41062
41293
  ) && q.segments.every(
41063
- (s) => distancePointToSegment(p.via.center, s.start, s.end) >= d / 2 + w / 2 + c - EPS
41294
+ (s) => distancePointToSegment(p.via.center, s.start, s.end) >= d / 2 + w / 2 + c - EPS2
41064
41295
  )
41065
41296
  );
41066
41297
  };
@@ -41111,7 +41342,7 @@ function* routeSplitPerimeterSourceEscapesSteps(params) {
41111
41342
  const suffix = [p];
41112
41343
  let last = p.exitPoint.x;
41113
41344
  for (const q of byTarget.slice(byTarget.indexOf(p) + 1))
41114
- if (q.exitPoint.x > last + pitch - EPS) {
41345
+ if (q.exitPoint.x > last + pitch - EPS2) {
41115
41346
  suffix.push(q);
41116
41347
  last = q.exitPoint.x;
41117
41348
  }
@@ -41160,7 +41391,7 @@ function* routeSplitPerimeterSourceEscapesSteps(params) {
41160
41391
  x: conn.sourcePoint.x + sx * padPitch / 2,
41161
41392
  y: conn.sourcePoint.y + padPitch / 2
41162
41393
  };
41163
- if (point6.x < before + pitch - EPS || point6.x > after - pitch + EPS)
41394
+ if (point6.x < before + pitch - EPS2 || point6.x > after - pitch + EPS2)
41164
41395
  continue;
41165
41396
  const ps = [
41166
41397
  conn.sourcePoint,
@@ -41180,7 +41411,7 @@ function* routeSplitPerimeterSourceEscapesSteps(params) {
41180
41411
  ...fixed.map((p) => target(byIndex.get(p.connectionIndex).connection).y)
41181
41412
  );
41182
41413
  for (const p of paths.filter(
41183
- (p2) => Math.abs(p2.exitPoint.x - sourceBoundary.minX) < EPS && target(byIndex.get(p2.connectionIndex).connection).y < firstTarget
41414
+ (p2) => Math.abs(p2.exitPoint.x - sourceBoundary.minX) < EPS2 && target(byIndex.get(p2.connectionIndex).connection).y < firstTarget
41184
41415
  ).sort(
41185
41416
  (a, b) => target(byIndex.get(b.connectionIndex).connection).y - target(byIndex.get(a.connectionIndex).connection).y
41186
41417
  )) {
@@ -41518,7 +41749,7 @@ function* routeSplitPerimeterBusSteps(params) {
41518
41749
  const plans = [...remote, separator, inner, ...tops];
41519
41750
  if (plans.length !== bus.connections.length) return null;
41520
41751
  const lengths = plans.map((p) => p.length);
41521
- if (bus.maxLengthSkew !== void 0 && Math.max(...lengths) - Math.min(...lengths) > bus.maxLengthSkew + EPS2)
41752
+ if (bus.maxLengthSkew !== void 0 && Math.max(...lengths) - Math.min(...lengths) > bus.maxLengthSkew + EPS3)
41522
41753
  return null;
41523
41754
  if (!fanoutPlansAreClear({
41524
41755
  plans,
@@ -41533,16 +41764,16 @@ function* routeSplitPerimeterBusSteps(params) {
41533
41764
  for (const other of sourceEscapes) {
41534
41765
  if (p.connectionIndex === other.connectionIndex) continue;
41535
41766
  for (const s of p.segments) {
41536
- if (other.via.spanLayers.includes(s.layer) && distancePointToSegment(other.via.center, s.start, s.end) < other.via.diameter / 2 + s.width / 2 + c - EPS2)
41767
+ if (other.via.spanLayers.includes(s.layer) && distancePointToSegment(other.via.center, s.start, s.end) < other.via.diameter / 2 + s.width / 2 + c - EPS3)
41537
41768
  return null;
41538
41769
  for (const t of other.segments)
41539
- if (s.layer === t.layer && distanceSegmentToSegment(s.start, s.end, t.start, t.end) < (s.width + t.width) / 2 + c - EPS2)
41770
+ if (s.layer === t.layer && distanceSegmentToSegment(s.start, s.end, t.start, t.end) < (s.width + t.width) / 2 + c - EPS3)
41540
41771
  return null;
41541
41772
  }
41542
41773
  }
41543
41774
  return plans;
41544
41775
  }
41545
- var EPS2 = 1e-7;
41776
+ var EPS3 = 1e-7;
41546
41777
 
41547
41778
  // node_modules/@tscircuit/fanout-solver/lib/route-shallow-split-perimeter-bus.ts
41548
41779
  var EPSILON22 = 1e-7;
@@ -63788,7 +64019,7 @@ function Group_getRoutingPhasePlans(group) {
63788
64019
  var package_default = {
63789
64020
  name: "@tscircuit/core",
63790
64021
  type: "module",
63791
- version: "0.0.1970",
64022
+ version: "0.0.1971",
63792
64023
  types: "dist/index.d.ts",
63793
64024
  main: "dist/index.js",
63794
64025
  module: "dist/index.js",
@@ -63830,6 +64061,7 @@ var package_default = {
63830
64061
  "@tscircuit/copper-pour-solver": "^0.0.57",
63831
64062
  "@tscircuit/create-fdm-enclosure": "0.0.4",
63832
64063
  "@tscircuit/fanout-solver": "0.0.78",
64064
+ "@tscircuit/flex-utils": "https://jscdn.tscircuit.com/@tscircuit/flex-utils/0.0.5.tgz",
63833
64065
  "@tscircuit/footprinter": "^0.0.426",
63834
64066
  "@tscircuit/image-utils": "^0.0.8",
63835
64067
  "@tscircuit/implicit-copper-pour-solver": "github:tscircuit/implicit-copper-pour-solver#a5cbbda0cd65fd4707c5c1af25779837c25aba92",
@@ -63858,7 +64090,7 @@ var package_default = {
63858
64090
  "bun-match-svg": "0.0.12",
63859
64091
  "calculate-elbow": "^0.0.12",
63860
64092
  "chokidar-cli": "^3.0.0",
63861
- "circuit-json": "^0.0.499",
64093
+ "circuit-json": "^0.0.500",
63862
64094
  "circuit-json-to-bpc": "^0.0.13",
63863
64095
  "circuit-json-to-connectivity-map": "^0.0.30",
63864
64096
  "circuit-json-to-gltf": "^0.0.133",
@@ -63922,7 +64154,7 @@ var package_default = {
63922
64154
  overrides: {
63923
64155
  "@tscircuit/circuit-json-util": "^0.0.116",
63924
64156
  "@tscircuit/props": "^0.0.666",
63925
- "circuit-json": "^0.0.499"
64157
+ "circuit-json": "^0.0.500"
63926
64158
  }
63927
64159
  };
63928
64160
 
@@ -69362,6 +69594,7 @@ var getRoundedRectOutline = (width, height, radius) => {
69362
69594
  return outline;
69363
69595
  };
69364
69596
  var Board = class extends Group5 {
69597
+ pcbFold;
69365
69598
  pcb_board_id = null;
69366
69599
  source_board_id = null;
69367
69600
  _drcChecksComplete = false;
@@ -69380,6 +69613,13 @@ var Board = class extends Group5 {
69380
69613
  if (castellatedHole.trace) this.add(castellatedHole.trace);
69381
69614
  }
69382
69615
  }
69616
+ doInitialPcbFlexRender() {
69617
+ if (!this.pcb_board_id) return;
69618
+ const bends = this.root.db.pcb_bend.list().filter(
69619
+ (bend) => bend.pcb_board_id === this.pcb_board_id
69620
+ );
69621
+ this.pcbFold = bends.length ? createPcbFold(bends, this.boardThickness) : void 0;
69622
+ }
69383
69623
  get isSubcircuit() {
69384
69624
  return true;
69385
69625
  }
@@ -73358,7 +73598,7 @@ var placeBreakoutGates = ({
73358
73598
  ).length
73359
73599
  )
73360
73600
  );
73361
- const { vertical, axes } = makeGateAxes({
73601
+ const { vertical, axes: axes2 } = makeGateAxes({
73362
73602
  regions,
73363
73603
  connections,
73364
73604
  spacing: boundaryPointSpacing,
@@ -73373,7 +73613,7 @@ var placeBreakoutGates = ({
73373
73613
  layer,
73374
73614
  ...pointOnEdge(
73375
73615
  region,
73376
- axes[slotIndex] + layerOffsets[layer],
73616
+ axes2[slotIndex] + layerOffsets[layer],
73377
73617
  vertical
73378
73618
  )
73379
73619
  }))
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/core",
3
3
  "type": "module",
4
- "version": "0.0.1971",
4
+ "version": "0.0.1972",
5
5
  "types": "dist/index.d.ts",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -43,6 +43,7 @@
43
43
  "@tscircuit/copper-pour-solver": "^0.0.57",
44
44
  "@tscircuit/create-fdm-enclosure": "0.0.4",
45
45
  "@tscircuit/fanout-solver": "0.0.78",
46
+ "@tscircuit/flex-utils": "https://jscdn.tscircuit.com/@tscircuit/flex-utils/0.0.5.tgz",
46
47
  "@tscircuit/footprinter": "^0.0.426",
47
48
  "@tscircuit/image-utils": "^0.0.8",
48
49
  "@tscircuit/implicit-copper-pour-solver": "github:tscircuit/implicit-copper-pour-solver#a5cbbda0cd65fd4707c5c1af25779837c25aba92",
@@ -71,7 +72,7 @@
71
72
  "bun-match-svg": "0.0.12",
72
73
  "calculate-elbow": "^0.0.12",
73
74
  "chokidar-cli": "^3.0.0",
74
- "circuit-json": "^0.0.499",
75
+ "circuit-json": "^0.0.500",
75
76
  "circuit-json-to-bpc": "^0.0.13",
76
77
  "circuit-json-to-connectivity-map": "^0.0.30",
77
78
  "circuit-json-to-gltf": "^0.0.133",
@@ -135,6 +136,6 @@
135
136
  "overrides": {
136
137
  "@tscircuit/circuit-json-util": "^0.0.116",
137
138
  "@tscircuit/props": "^0.0.666",
138
- "circuit-json": "^0.0.499"
139
+ "circuit-json": "^0.0.500"
139
140
  }
140
141
  }