@tscircuit/core 0.0.1272 → 0.0.1274

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.
Files changed (3) hide show
  1. package/dist/index.d.ts +179 -31
  2. package/dist/index.js +125 -55
  3. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -236,9 +236,9 @@ interface IIsolatedCircuit {
236
236
  interface IRootCircuit extends IIsolatedCircuit {
237
237
  }
238
238
 
239
- declare const orderedRenderPhases: readonly ["ReactSubtreesRender", "RenderIsolatedSubcircuits", "InflateSubcircuitCircuitJson", "SourceNameDuplicateComponentRemoval", "PcbFootprintStringRender", "FetchPartFootprint", "InitializePortsFromChildren", "CreateNetsFromProps", "AssignFallbackProps", "CreateTracesFromProps", "CreateTracesFromNetLabels", "CreateTraceHintsFromProps", "SourceGroupRender", "AssignNameToUnnamedComponents", "SourceRender", "SourceComponentPropertyValidation", "SourceParentAttachment", "PortMatching", "OptimizeSelectorCache", "SourceTraceRender", "SourceAddConnectivityMapKey", "SourceDesignRuleChecks", "SimulationRender", "SchematicComponentRender", "SchematicPortRender", "SymbolContainerRender", "SchematicPrimitiveRender", "SchematicSymbolResize", "SchematicComponentSizeCalculation", "SchematicLayout", "SchematicSectionRender", "SchematicTraceRender", "SchematicReplaceNetLabelsWithSymbols", "PanelBoardLayout", "ValidatePcbCoordinates", "PcbComponentRender", "PcbPrimitiveRender", "PcbFootprintLayout", "PcbPortRender", "PcbPortAttachment", "PcbComponentSizeCalculation", "PcbComponentAnchorAlignment", "PcbCalcPlacementResolution", "PcbLayout", "PcbBoardAutoSize", "PanelLayout", "PcbTraceHintRender", "PcbManualTraceRender", "PcbTraceRender", "PcbRouteNetIslands", "PcbCopperPourRender", "PcbDesignRuleChecks", "SilkscreenOverlapAdjustment", "CadModelRender", "PartsEngineRender", "SupplierFootprintMismatchWarning", "SimulationSpiceEngineRender"];
239
+ declare const orderedRenderPhases: readonly ["ReactSubtreesRender", "RenderIsolatedSubcircuits", "InflateSubcircuitCircuitJson", "SourceNameDuplicateComponentRemoval", "PcbFootprintStringRender", "FetchPartFootprint", "InitializePortsFromChildren", "CreateNetsFromProps", "AssignFallbackProps", "CreateTracesFromProps", "CreateTracesFromNetLabels", "CreateTraceHintsFromProps", "CreateAutoplacedBreakoutPoints", "SourceGroupRender", "AssignNameToUnnamedComponents", "SourceRender", "SourceComponentPropertyValidation", "SourceParentAttachment", "PortMatching", "OptimizeSelectorCache", "SourceTraceRender", "SourceAddConnectivityMapKey", "SourceDesignRuleChecks", "SimulationRender", "SchematicComponentRender", "SchematicPortRender", "SymbolContainerRender", "SchematicPrimitiveRender", "SchematicSymbolResize", "SchematicComponentSizeCalculation", "SchematicLayout", "SchematicSectionRender", "SchematicTraceRender", "SchematicReplaceNetLabelsWithSymbols", "PanelBoardLayout", "ValidatePcbCoordinates", "PcbComponentRender", "PcbPrimitiveRender", "PcbFootprintLayout", "PcbPortRender", "PcbPortAttachment", "PcbComponentSizeCalculation", "PcbComponentAnchorAlignment", "PcbCalcPlacementResolution", "PcbLayout", "PcbBoardAutoSize", "PanelLayout", "PcbTraceHintRender", "PcbManualTraceRender", "PcbTraceRender", "PcbRouteNetIslands", "PcbCopperPourRender", "PcbDesignRuleChecks", "SilkscreenOverlapAdjustment", "CadModelRender", "PartsEngineRender", "SupplierFootprintMismatchWarning", "SimulationSpiceEngineRender"];
240
240
  type RenderPhase = (typeof orderedRenderPhases)[number];
241
- declare const renderPhaseIndexMap: Map<"ReactSubtreesRender" | "RenderIsolatedSubcircuits" | "InflateSubcircuitCircuitJson" | "SourceNameDuplicateComponentRemoval" | "PcbFootprintStringRender" | "FetchPartFootprint" | "InitializePortsFromChildren" | "CreateNetsFromProps" | "AssignFallbackProps" | "CreateTracesFromProps" | "CreateTracesFromNetLabels" | "CreateTraceHintsFromProps" | "SourceGroupRender" | "AssignNameToUnnamedComponents" | "SourceRender" | "SourceComponentPropertyValidation" | "SourceParentAttachment" | "PortMatching" | "OptimizeSelectorCache" | "SourceTraceRender" | "SourceAddConnectivityMapKey" | "SourceDesignRuleChecks" | "SimulationRender" | "SchematicComponentRender" | "SchematicPortRender" | "SymbolContainerRender" | "SchematicPrimitiveRender" | "SchematicSymbolResize" | "SchematicComponentSizeCalculation" | "SchematicLayout" | "SchematicSectionRender" | "SchematicTraceRender" | "SchematicReplaceNetLabelsWithSymbols" | "PanelBoardLayout" | "ValidatePcbCoordinates" | "PcbComponentRender" | "PcbPrimitiveRender" | "PcbFootprintLayout" | "PcbPortRender" | "PcbPortAttachment" | "PcbComponentSizeCalculation" | "PcbComponentAnchorAlignment" | "PcbCalcPlacementResolution" | "PcbLayout" | "PcbBoardAutoSize" | "PanelLayout" | "PcbTraceHintRender" | "PcbManualTraceRender" | "PcbTraceRender" | "PcbRouteNetIslands" | "PcbCopperPourRender" | "PcbDesignRuleChecks" | "SilkscreenOverlapAdjustment" | "CadModelRender" | "PartsEngineRender" | "SupplierFootprintMismatchWarning" | "SimulationSpiceEngineRender", number>;
241
+ declare const renderPhaseIndexMap: Map<"ReactSubtreesRender" | "RenderIsolatedSubcircuits" | "InflateSubcircuitCircuitJson" | "SourceNameDuplicateComponentRemoval" | "PcbFootprintStringRender" | "FetchPartFootprint" | "InitializePortsFromChildren" | "CreateNetsFromProps" | "AssignFallbackProps" | "CreateTracesFromProps" | "CreateTracesFromNetLabels" | "CreateTraceHintsFromProps" | "CreateAutoplacedBreakoutPoints" | "SourceGroupRender" | "AssignNameToUnnamedComponents" | "SourceRender" | "SourceComponentPropertyValidation" | "SourceParentAttachment" | "PortMatching" | "OptimizeSelectorCache" | "SourceTraceRender" | "SourceAddConnectivityMapKey" | "SourceDesignRuleChecks" | "SimulationRender" | "SchematicComponentRender" | "SchematicPortRender" | "SymbolContainerRender" | "SchematicPrimitiveRender" | "SchematicSymbolResize" | "SchematicComponentSizeCalculation" | "SchematicLayout" | "SchematicSectionRender" | "SchematicTraceRender" | "SchematicReplaceNetLabelsWithSymbols" | "PanelBoardLayout" | "ValidatePcbCoordinates" | "PcbComponentRender" | "PcbPrimitiveRender" | "PcbFootprintLayout" | "PcbPortRender" | "PcbPortAttachment" | "PcbComponentSizeCalculation" | "PcbComponentAnchorAlignment" | "PcbCalcPlacementResolution" | "PcbLayout" | "PcbBoardAutoSize" | "PanelLayout" | "PcbTraceHintRender" | "PcbManualTraceRender" | "PcbTraceRender" | "PcbRouteNetIslands" | "PcbCopperPourRender" | "PcbDesignRuleChecks" | "SilkscreenOverlapAdjustment" | "CadModelRender" | "PartsEngineRender" | "SupplierFootprintMismatchWarning" | "SimulationSpiceEngineRender", number>;
242
242
  type RenderPhaseFn<K extends RenderPhase = RenderPhase> = `doInitial${K}` | `update${K}` | `remove${K}`;
243
243
  type RenderPhaseStates = Record<RenderPhase, {
244
244
  initialized: boolean;
@@ -73055,14 +73055,190 @@ declare class Footprint extends PrimitiveComponent<typeof footprintProps> {
73055
73055
 
73056
73056
  declare class Breakout extends Group<typeof breakoutProps> {
73057
73057
  constructor(props: z.input<typeof breakoutProps>);
73058
+ /**
73059
+ * Find ports inside this breakout group that are connected to traces
73060
+ * crossing the breakout boundary, and create auto-placed BreakoutPoint
73061
+ * children for them. Positions are not set here — they will be determined
73062
+ * after PcbLayout.
73063
+ */
73064
+ doInitialCreateAutoplacedBreakoutPoints(): void;
73058
73065
  doInitialPcbPrimitiveRender(): void;
73059
73066
  }
73060
73067
 
73061
- declare class BreakoutPoint extends PrimitiveComponent<typeof breakoutPointProps> {
73068
+ /**
73069
+ * Shared base props for breakout points — layout props without rotation/layer.
73070
+ * Subclasses extend this schema with additional fields (e.g. `connection`).
73071
+ */
73072
+ declare const baseBreakoutPointProps: zod.ZodObject<Omit<{
73073
+ pcbX: zod.ZodOptional<zod.ZodUnion<[zod.ZodString, zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>]>>;
73074
+ pcbY: zod.ZodOptional<zod.ZodUnion<[zod.ZodString, zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>]>>;
73075
+ pcbLeftEdgeX: zod.ZodOptional<zod.ZodUnion<[zod.ZodString, zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>]>>;
73076
+ pcbRightEdgeX: zod.ZodOptional<zod.ZodUnion<[zod.ZodString, zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>]>>;
73077
+ pcbTopEdgeY: zod.ZodOptional<zod.ZodUnion<[zod.ZodString, zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>]>>;
73078
+ pcbBottomEdgeY: zod.ZodOptional<zod.ZodUnion<[zod.ZodString, zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>]>>;
73079
+ pcbOffsetX: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
73080
+ pcbOffsetY: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
73081
+ pcbRotation: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
73082
+ pcbPositionAnchor: zod.ZodOptional<zod.ZodString>;
73083
+ pcbPositionMode: zod.ZodOptional<zod.ZodEnum<["relative_to_group_anchor", "auto", "relative_to_board_anchor", "relative_to_component_anchor"]>>;
73084
+ shouldBeOnEdgeOfBoard: zod.ZodOptional<zod.ZodBoolean>;
73085
+ layer: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6"]>, zod.ZodObject<{
73086
+ name: zod.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6"]>;
73087
+ }, "strip", zod.ZodTypeAny, {
73088
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
73089
+ }, {
73090
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
73091
+ }>]>, "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6", "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | {
73092
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
73093
+ }>>;
73094
+ pcbMarginTop: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
73095
+ pcbMarginRight: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
73096
+ pcbMarginBottom: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
73097
+ pcbMarginLeft: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
73098
+ pcbMarginX: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
73099
+ pcbMarginY: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
73100
+ pcbStyle: zod.ZodOptional<zod.ZodObject<{
73101
+ silkscreenFontSize: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
73102
+ viaPadDiameter: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
73103
+ viaHoleDiameter: zod.ZodOptional<zod.ZodEffects<zod.ZodUnion<[zod.ZodString, zod.ZodNumber]>, number, string | number>>;
73104
+ silkscreenTextPosition: zod.ZodOptional<zod.ZodUnion<[zod.ZodEnum<["centered", "outside", "none"]>, zod.ZodObject<{
73105
+ offsetX: zod.ZodNumber;
73106
+ offsetY: zod.ZodNumber;
73107
+ }, "strip", zod.ZodTypeAny, {
73108
+ offsetX: number;
73109
+ offsetY: number;
73110
+ }, {
73111
+ offsetX: number;
73112
+ offsetY: number;
73113
+ }>]>>;
73114
+ silkscreenTextVisibility: zod.ZodOptional<zod.ZodEnum<["hidden", "visible", "inherit"]>>;
73115
+ }, "strip", zod.ZodTypeAny, {
73116
+ silkscreenFontSize?: number | undefined;
73117
+ viaPadDiameter?: number | undefined;
73118
+ viaHoleDiameter?: number | undefined;
73119
+ silkscreenTextPosition?: "centered" | "outside" | "none" | {
73120
+ offsetX: number;
73121
+ offsetY: number;
73122
+ } | undefined;
73123
+ silkscreenTextVisibility?: "hidden" | "visible" | "inherit" | undefined;
73124
+ }, {
73125
+ silkscreenFontSize?: string | number | undefined;
73126
+ viaPadDiameter?: string | number | undefined;
73127
+ viaHoleDiameter?: string | number | undefined;
73128
+ silkscreenTextPosition?: "centered" | "outside" | "none" | {
73129
+ offsetX: number;
73130
+ offsetY: number;
73131
+ } | undefined;
73132
+ silkscreenTextVisibility?: "hidden" | "visible" | "inherit" | undefined;
73133
+ }>>;
73134
+ pcbSx: zod.ZodOptional<ZodType<_tscircuit_props.PcbSx, zod.ZodTypeDef, _tscircuit_props.PcbSx>>;
73135
+ pcbRelative: zod.ZodOptional<zod.ZodBoolean>;
73136
+ relative: zod.ZodOptional<zod.ZodBoolean>;
73137
+ }, "layer" | "pcbRotation">, "strip", zod.ZodTypeAny, {
73138
+ pcbX?: string | number | undefined;
73139
+ pcbY?: string | number | undefined;
73140
+ pcbLeftEdgeX?: string | number | undefined;
73141
+ pcbRightEdgeX?: string | number | undefined;
73142
+ pcbTopEdgeY?: string | number | undefined;
73143
+ pcbBottomEdgeY?: string | number | undefined;
73144
+ relative?: boolean | undefined;
73145
+ pcbOffsetX?: number | undefined;
73146
+ pcbOffsetY?: number | undefined;
73147
+ pcbPositionAnchor?: string | undefined;
73148
+ pcbPositionMode?: "auto" | "relative_to_group_anchor" | "relative_to_board_anchor" | "relative_to_component_anchor" | undefined;
73149
+ shouldBeOnEdgeOfBoard?: boolean | undefined;
73150
+ pcbMarginTop?: number | undefined;
73151
+ pcbMarginRight?: number | undefined;
73152
+ pcbMarginBottom?: number | undefined;
73153
+ pcbMarginLeft?: number | undefined;
73154
+ pcbMarginX?: number | undefined;
73155
+ pcbMarginY?: number | undefined;
73156
+ pcbStyle?: {
73157
+ silkscreenFontSize?: number | undefined;
73158
+ viaPadDiameter?: number | undefined;
73159
+ viaHoleDiameter?: number | undefined;
73160
+ silkscreenTextPosition?: "centered" | "outside" | "none" | {
73161
+ offsetX: number;
73162
+ offsetY: number;
73163
+ } | undefined;
73164
+ silkscreenTextVisibility?: "hidden" | "visible" | "inherit" | undefined;
73165
+ } | undefined;
73166
+ pcbSx?: _tscircuit_props.PcbSx | undefined;
73167
+ pcbRelative?: boolean | undefined;
73168
+ }, {
73169
+ pcbX?: string | number | undefined;
73170
+ pcbY?: string | number | undefined;
73171
+ pcbLeftEdgeX?: string | number | undefined;
73172
+ pcbRightEdgeX?: string | number | undefined;
73173
+ pcbTopEdgeY?: string | number | undefined;
73174
+ pcbBottomEdgeY?: string | number | undefined;
73175
+ relative?: boolean | undefined;
73176
+ pcbOffsetX?: string | number | undefined;
73177
+ pcbOffsetY?: string | number | undefined;
73178
+ pcbPositionAnchor?: string | undefined;
73179
+ pcbPositionMode?: "auto" | "relative_to_group_anchor" | "relative_to_board_anchor" | "relative_to_component_anchor" | undefined;
73180
+ shouldBeOnEdgeOfBoard?: boolean | undefined;
73181
+ pcbMarginTop?: string | number | undefined;
73182
+ pcbMarginRight?: string | number | undefined;
73183
+ pcbMarginBottom?: string | number | undefined;
73184
+ pcbMarginLeft?: string | number | undefined;
73185
+ pcbMarginX?: string | number | undefined;
73186
+ pcbMarginY?: string | number | undefined;
73187
+ pcbStyle?: {
73188
+ silkscreenFontSize?: string | number | undefined;
73189
+ viaPadDiameter?: string | number | undefined;
73190
+ viaHoleDiameter?: string | number | undefined;
73191
+ silkscreenTextPosition?: "centered" | "outside" | "none" | {
73192
+ offsetX: number;
73193
+ offsetY: number;
73194
+ } | undefined;
73195
+ silkscreenTextVisibility?: "hidden" | "visible" | "inherit" | undefined;
73196
+ } | undefined;
73197
+ pcbSx?: _tscircuit_props.PcbSx | undefined;
73198
+ pcbRelative?: boolean | undefined;
73199
+ }>;
73200
+ /**
73201
+ * Base class for both user-facing `BreakoutPoint` (which requires a
73202
+ * `connection` prop) and the internal `AutoplacedBreakoutPoint` (which
73203
+ * receives its `matchedPort` programmatically).
73204
+ */
73205
+ declare class BaseBreakoutPoint<TProps extends ZodType = typeof baseBreakoutPointProps> extends PrimitiveComponent<TProps> {
73062
73206
  pcb_breakout_point_id: string | null;
73063
73207
  matchedPort: Port | null;
73064
73208
  matchedNet: Net | null;
73065
73209
  isPcbPrimitive: boolean;
73210
+ _getSourceTraceIdForPort(port: Port): string | undefined;
73211
+ _getSourceNetIdForPort(port: Port): string | undefined;
73212
+ _renderPcbBreakoutPoint(): void;
73213
+ _getPcbCircuitJsonBounds(): {
73214
+ center: {
73215
+ x: number;
73216
+ y: number;
73217
+ };
73218
+ bounds: {
73219
+ left: number;
73220
+ top: number;
73221
+ right: number;
73222
+ bottom: number;
73223
+ };
73224
+ width: number;
73225
+ height: number;
73226
+ };
73227
+ _setPositionFromLayout(newCenter: {
73228
+ x: number;
73229
+ y: number;
73230
+ }): void;
73231
+ _moveCircuitJsonElements({ deltaX, deltaY, }: {
73232
+ deltaX: number;
73233
+ deltaY: number;
73234
+ }): void;
73235
+ getPcbSize(): {
73236
+ width: number;
73237
+ height: number;
73238
+ };
73239
+ }
73240
+
73241
+ declare class BreakoutPoint extends BaseBreakoutPoint<typeof breakoutPointProps> {
73066
73242
  get config(): {
73067
73243
  componentName: string;
73068
73244
  zodProps: zod.ZodObject<Omit<{
@@ -73199,35 +73375,7 @@ declare class BreakoutPoint extends PrimitiveComponent<typeof breakoutPointProps
73199
73375
  }>;
73200
73376
  };
73201
73377
  _matchConnection(): void;
73202
- _getSourceTraceIdForPort(port: Port): string | undefined;
73203
- _getSourceNetIdForPort(port: Port): string | undefined;
73204
73378
  doInitialPcbPrimitiveRender(): void;
73205
- _getPcbCircuitJsonBounds(): {
73206
- center: {
73207
- x: number;
73208
- y: number;
73209
- };
73210
- bounds: {
73211
- left: number;
73212
- top: number;
73213
- right: number;
73214
- bottom: number;
73215
- };
73216
- width: number;
73217
- height: number;
73218
- };
73219
- _setPositionFromLayout(newCenter: {
73220
- x: number;
73221
- y: number;
73222
- }): void;
73223
- _moveCircuitJsonElements({ deltaX, deltaY, }: {
73224
- deltaX: number;
73225
- deltaY: number;
73226
- }): void;
73227
- getPcbSize(): {
73228
- width: number;
73229
- height: number;
73230
- };
73231
73379
  }
73232
73380
 
73233
73381
  declare class Hole extends PrimitiveComponent<typeof holeProps> {
package/dist/index.js CHANGED
@@ -329,6 +329,7 @@ var orderedRenderPhases = [
329
329
  "CreateTracesFromProps",
330
330
  "CreateTracesFromNetLabels",
331
331
  "CreateTraceHintsFromProps",
332
+ "CreateAutoplacedBreakoutPoints",
332
333
  "SourceGroupRender",
333
334
  "AssignNameToUnnamedComponents",
334
335
  "SourceRender",
@@ -21805,7 +21806,7 @@ import { identity as identity5 } from "transformation-matrix";
21805
21806
  var package_default = {
21806
21807
  name: "@tscircuit/core",
21807
21808
  type: "module",
21808
- version: "0.0.1271",
21809
+ version: "0.0.1273",
21809
21810
  types: "dist/index.d.ts",
21810
21811
  main: "dist/index.js",
21811
21812
  module: "dist/index.js",
@@ -24802,63 +24803,18 @@ var PcbNoteDimension = class extends PrimitiveComponent2 {
24802
24803
 
24803
24804
  // lib/components/primitive-components/Breakout/Breakout.ts
24804
24805
  import "@tscircuit/props";
24805
- var Breakout = class extends Group5 {
24806
- constructor(props) {
24807
- super({
24808
- ...props,
24809
- // @ts-ignore
24810
- subcircuit: true
24811
- });
24812
- }
24813
- doInitialPcbPrimitiveRender() {
24814
- super.doInitialPcbPrimitiveRender();
24815
- if (this.root?.pcbDisabled) return;
24816
- const { db } = this.root;
24817
- const props = this._parsedProps;
24818
- if (!this.pcb_group_id) return;
24819
- const pcb_group = db.pcb_group.get(this.pcb_group_id);
24820
- const padLeft = props.paddingLeft ?? props.padding ?? 0;
24821
- const padRight = props.paddingRight ?? props.padding ?? 0;
24822
- const padTop = props.paddingTop ?? props.padding ?? 0;
24823
- const padBottom = props.paddingBottom ?? props.padding ?? 0;
24824
- db.pcb_group.update(this.pcb_group_id, {
24825
- width: (pcb_group.width ?? 0) + padLeft + padRight,
24826
- height: (pcb_group.height ?? 0) + padTop + padBottom,
24827
- center: {
24828
- x: pcb_group.center.x + (padRight - padLeft) / 2,
24829
- y: pcb_group.center.y + (padTop - padBottom) / 2
24830
- }
24831
- });
24832
- }
24833
- };
24834
24806
 
24835
- // lib/components/primitive-components/BreakoutPoint.ts
24836
- import { breakoutPointProps } from "@tscircuit/props";
24837
- var BreakoutPoint = class extends PrimitiveComponent2 {
24807
+ // lib/components/primitive-components/BaseBreakoutPoint.ts
24808
+ import { pcbLayoutProps } from "@tscircuit/props";
24809
+ var baseBreakoutPointProps = pcbLayoutProps.omit({
24810
+ pcbRotation: true,
24811
+ layer: true
24812
+ });
24813
+ var BaseBreakoutPoint = class extends PrimitiveComponent2 {
24838
24814
  pcb_breakout_point_id = null;
24839
24815
  matchedPort = null;
24840
24816
  matchedNet = null;
24841
24817
  isPcbPrimitive = true;
24842
- get config() {
24843
- return {
24844
- componentName: "BreakoutPoint",
24845
- zodProps: breakoutPointProps
24846
- };
24847
- }
24848
- _matchConnection() {
24849
- const { connection } = this._parsedProps;
24850
- const subcircuit = this.getSubcircuit();
24851
- if (!subcircuit) return;
24852
- this.matchedPort = subcircuit.selectOne(connection, {
24853
- type: "port"
24854
- });
24855
- if (!this.matchedPort) {
24856
- this.matchedNet = subcircuit.selectOne(connection, { type: "net" });
24857
- }
24858
- if (!this.matchedPort && !this.matchedNet) {
24859
- this.renderError(`Could not find connection target "${connection}"`);
24860
- }
24861
- }
24862
24818
  _getSourceTraceIdForPort(port) {
24863
24819
  const { db } = this.root;
24864
24820
  const trace = db.source_trace.list().find((st) => st.connected_source_port_ids.includes(port.source_port_id));
@@ -24869,10 +24825,10 @@ var BreakoutPoint = class extends PrimitiveComponent2 {
24869
24825
  const trace = db.source_trace.list().find((st) => st.connected_source_port_ids.includes(port.source_port_id));
24870
24826
  return trace?.connected_source_net_ids[0];
24871
24827
  }
24872
- doInitialPcbPrimitiveRender() {
24828
+ _renderPcbBreakoutPoint() {
24829
+ if (this.pcb_breakout_point_id) return;
24873
24830
  if (this.root?.pcbDisabled) return;
24874
24831
  const { db } = this.root;
24875
- this._matchConnection();
24876
24832
  const position = this._getGlobalPcbPositionBeforeLayout();
24877
24833
  const group = this.parent?.getGroup();
24878
24834
  const subcircuit = this.getSubcircuit();
@@ -24930,6 +24886,120 @@ var BreakoutPoint = class extends PrimitiveComponent2 {
24930
24886
  }
24931
24887
  };
24932
24888
 
24889
+ // lib/components/primitive-components/AutoplacedBreakoutPoint.ts
24890
+ var AutoplacedBreakoutPoint = class extends BaseBreakoutPoint {
24891
+ get config() {
24892
+ return {
24893
+ componentName: "AutoplacedBreakoutPoint",
24894
+ zodProps: baseBreakoutPointProps
24895
+ };
24896
+ }
24897
+ doInitialPcbPrimitiveRender() {
24898
+ this._renderPcbBreakoutPoint();
24899
+ }
24900
+ };
24901
+
24902
+ // lib/components/primitive-components/BreakoutPoint.ts
24903
+ import { breakoutPointProps } from "@tscircuit/props";
24904
+ var BreakoutPoint = class extends BaseBreakoutPoint {
24905
+ get config() {
24906
+ return {
24907
+ componentName: "BreakoutPoint",
24908
+ zodProps: breakoutPointProps
24909
+ };
24910
+ }
24911
+ _matchConnection() {
24912
+ if (this.matchedPort) return;
24913
+ const { connection } = this._parsedProps;
24914
+ const subcircuit = this.getSubcircuit();
24915
+ if (!subcircuit) return;
24916
+ this.matchedPort = subcircuit.selectOne(connection, {
24917
+ type: "port"
24918
+ });
24919
+ if (!this.matchedPort) {
24920
+ this.matchedNet = subcircuit.selectOne(connection, { type: "net" });
24921
+ }
24922
+ if (!this.matchedPort && !this.matchedNet) {
24923
+ this.renderError(`Could not find connection target "${connection}"`);
24924
+ }
24925
+ }
24926
+ doInitialPcbPrimitiveRender() {
24927
+ this._matchConnection();
24928
+ this._renderPcbBreakoutPoint();
24929
+ }
24930
+ };
24931
+
24932
+ // lib/components/primitive-components/Breakout/Breakout.ts
24933
+ var Breakout = class extends Group5 {
24934
+ constructor(props) {
24935
+ super({
24936
+ ...props,
24937
+ // @ts-ignore
24938
+ subcircuit: true
24939
+ });
24940
+ }
24941
+ /**
24942
+ * Find ports inside this breakout group that are connected to traces
24943
+ * crossing the breakout boundary, and create auto-placed BreakoutPoint
24944
+ * children for them. Positions are not set here — they will be determined
24945
+ * after PcbLayout.
24946
+ */
24947
+ doInitialCreateAutoplacedBreakoutPoints() {
24948
+ const portsInBreakout = this.selectAll("port");
24949
+ const breakoutPortSet = new Set(portsInBreakout);
24950
+ const manualBreakoutPoints = this.children.filter(
24951
+ (c) => c instanceof BreakoutPoint
24952
+ );
24953
+ const manuallyMappedPorts = new Set(
24954
+ manualBreakoutPoints.map((bp) => {
24955
+ bp._matchConnection();
24956
+ return bp.matchedPort;
24957
+ }).filter(Boolean)
24958
+ );
24959
+ const board = this.parent;
24960
+ if (!board) return;
24961
+ const allTraces = board.children.filter(
24962
+ (c) => c instanceof Trace3
24963
+ );
24964
+ const autoPlacedPorts = /* @__PURE__ */ new Set();
24965
+ for (const trace of allTraces) {
24966
+ const result = trace._findConnectedPorts();
24967
+ if (!result.allPortsFound || !result.ports) continue;
24968
+ for (const port of result.ports) {
24969
+ const isInside = breakoutPortSet.has(port);
24970
+ const hasOutsidePort = result.ports.some((p) => !breakoutPortSet.has(p));
24971
+ if (!isInside || !hasOutsidePort) continue;
24972
+ if (manuallyMappedPorts.has(port)) continue;
24973
+ if (autoPlacedPorts.has(port)) continue;
24974
+ autoPlacedPorts.add(port);
24975
+ const breakoutPoint = new AutoplacedBreakoutPoint({});
24976
+ breakoutPoint.matchedPort = port;
24977
+ this.add(breakoutPoint);
24978
+ }
24979
+ }
24980
+ }
24981
+ doInitialPcbPrimitiveRender() {
24982
+ super.doInitialPcbPrimitiveRender();
24983
+ if (this.root?.pcbDisabled) return;
24984
+ const { db } = this.root;
24985
+ const props = this._parsedProps;
24986
+ if (!this.pcb_group_id) return;
24987
+ const pcb_group = db.pcb_group.get(this.pcb_group_id);
24988
+ const padLeft = props.paddingLeft ?? props.padding ?? 0;
24989
+ const padRight = props.paddingRight ?? props.padding ?? 0;
24990
+ const padTop = props.paddingTop ?? props.padding ?? 0;
24991
+ const padBottom = props.paddingBottom ?? props.padding ?? 0;
24992
+ db.pcb_group.update(this.pcb_group_id, {
24993
+ width: (pcb_group.width ?? 0) + padLeft + padRight,
24994
+ height: (pcb_group.height ?? 0) + padTop + padBottom,
24995
+ center: {
24996
+ x: pcb_group.center.x + (padRight - padLeft) / 2,
24997
+ y: pcb_group.center.y + (padTop - padBottom) / 2
24998
+ }
24999
+ });
25000
+ }
25001
+ };
25002
+
24933
25003
  // lib/components/primitive-components/NetLabel.ts
24934
25004
  import { netLabelProps } from "@tscircuit/props";
24935
25005
  import {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/core",
3
3
  "type": "module",
4
- "version": "0.0.1272",
4
+ "version": "0.0.1274",
5
5
  "types": "dist/index.d.ts",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",