Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
701dcb4
feat: draw wire feature
AM-Mehrabii Jul 11, 2026
6769951
feat: draw bus tool
AM-Mehrabii Jul 11, 2026
1199e77
feat: draw bus entry tool
AM-Mehrabii Jul 11, 2026
11b8dec
feat: draw no connect tool
AM-Mehrabii Jul 11, 2026
d8c1c23
feat: draw net label tool
AM-Mehrabii Jul 11, 2026
004d42a
feat: add schematic placement tools and pin-to-pin trace routing
AM-Mehrabii Jul 12, 2026
26439fd
chore: include dist for git-based installs
AM-Mehrabii Jul 14, 2026
ccb2dac
merge upstream main into feat/wire-drawing-gnd-placement
AM-Mehrabii Jul 14, 2026
ff355b1
fix: rebuild dist after upstream merge
AM-Mehrabii Jul 14, 2026
da30b57
chore: trim redundant comments in draw-tool changes
AM-Mehrabii Jul 14, 2026
58fdafd
chore: apply biome format to draw-tool files
AM-Mehrabii Jul 14, 2026
407269a
feat: drag schematic ports and keep traces orthogonal after component…
AM-Mehrabii Aug 2, 2026
46f737d
feat: clamp drags away from reserved regions and allow orthogonal tra…
AM-Mehrabii Aug 2, 2026
2a09bad
fix: drag traces via SVG wire hitbox in select mode
AM-Mehrabii Aug 2, 2026
11be9bc
fix: enable port/trace drag in select without pan stealing clicks
AM-Mehrabii Aug 2, 2026
4a6388d
fix: make select-mode port/trace drag actually move SVG pins and wires
AM-Mehrabii Aug 2, 2026
bd67836
fix: stop destroying net-label wires on component drag
AM-Mehrabii Aug 2, 2026
af24e1f
fix: Altium-style editing — fixed IC pins, reshape wires while connected
AM-Mehrabii Aug 2, 2026
efaa134
feat: drag net-label ports and keep wires orthogonal on move
AM-Mehrabii Aug 10, 2026
a8831c6
fix: drag whole wire runs instead of tearing them at split points
AM-Mehrabii Aug 10, 2026
3e0a8c7
fix: keep the canvas from panning when a net-label port is grabbed
AM-Mehrabii Aug 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 209 additions & 0 deletions dist/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
import * as react from 'react';
import { ReactNode } from 'react';
import { ColorOverrides } from 'circuit-to-svg';
import { BaseManualEditEvent, ManualEditEvent } from '@tscircuit/props';
import { CircuitJson } from 'circuit-json';

interface EditSchematicWireAddEvent extends BaseManualEditEvent {
edit_event_type: "edit_schematic_wire_add";
from_schematic_port_id: string;
to_schematic_port_id: string;
route: Array<{
x: number;
y: number;
}>;
}
interface EditSchematicBusAddEvent extends BaseManualEditEvent {
edit_event_type: "edit_schematic_bus_add";
route: Array<{
x: number;
y: number;
}>;
}
interface EditSchematicBusEntryAddEvent extends BaseManualEditEvent {
edit_event_type: "edit_schematic_bus_entry_add";
anchor: {
x: number;
y: number;
};
}
interface EditSchematicNoConnectAddEvent extends BaseManualEditEvent {
edit_event_type: "edit_schematic_no_connect_add";
center: {
x: number;
y: number;
};
schematic_port_id?: string;
}
interface EditSchematicNetLabelAddEvent extends BaseManualEditEvent {
edit_event_type: "edit_schematic_net_label_add";
position: {
x: number;
y: number;
};
net_name: string;
schematic_port_id?: string;
anchor_side?: "left" | "right" | "top" | "bottom";
}
interface EditSchematicGlobalLabelAddEvent extends BaseManualEditEvent {
edit_event_type: "edit_schematic_global_label_add";
position: {
x: number;
y: number;
};
net_name: string;
schematic_port_id?: string;
anchor_side?: "left" | "right" | "top" | "bottom";
}
interface EditSchematicPowerPortAddEvent extends BaseManualEditEvent {
edit_event_type: "edit_schematic_power_port_add";
position: {
x: number;
y: number;
};
net_name: string;
schematic_port_id?: string;
anchor_side?: "left" | "right" | "top" | "bottom";
}
interface EditSchematicGroundPortAddEvent extends BaseManualEditEvent {
edit_event_type: "edit_schematic_ground_port_add";
position: {
x: number;
y: number;
};
net_name: string;
schematic_port_id?: string;
anchor_side?: "left" | "right" | "top" | "bottom";
}
interface EditSchematicTextNoteAddEvent extends BaseManualEditEvent {
edit_event_type: "edit_schematic_text_note_add";
position: {
x: number;
y: number;
};
text: string;
anchor?: "left" | "right" | "center";
font_size?: number;
color?: string;
}
interface EditSchematicHierSheetAddEvent extends BaseManualEditEvent {
edit_event_type: "edit_schematic_hier_sheet_add";
box: {
x: number;
y: number;
width: number;
height: number;
};
sheet_name: string;
target_sheet_id: string;
sheet_name_pos: {
x: number;
y: number;
};
file_name_pos: {
x: number;
y: number;
};
}
type PlacementComponentKind = "resistor" | "capacitor" | "inductor";
interface EditSchematicComponentAddEvent extends BaseManualEditEvent {
edit_event_type: "edit_schematic_component_add";
position: {
x: number;
y: number;
};
component_kind: PlacementComponentKind;
rotation?: number;
}

interface HierSheetTarget {
id: string;
title: string;
}

interface Props$1 {
circuitJson: CircuitJson;
containerStyle?: React.CSSProperties;
editEvents?: ManualEditEvent[];
onEditEvent?: (event: ManualEditEvent) => void;
defaultEditMode?: boolean;
debugGrid?: boolean;
editingEnabled?: boolean;
debug?: boolean;
clickToInteractEnabled?: boolean;
colorOverrides?: ColorOverrides;
spiceSimulationEnabled?: boolean;
disableGroups?: boolean;
/** Fade unrelated nets/chips when hovering a wire or net label. Default true. */
netHoverHighlightEnabled?: boolean;
/** Stroke colour for the wire under the cursor. */
traceHoverColor?: string;
css?: string;
className?: string;
onSchematicComponentClicked?: (options: {
schematicComponentId: string;
event: MouseEvent;
}) => void;
showSchematicPorts?: boolean;
onSchematicPortClicked?: (options: {
schematicPortId: string;
event: MouseEvent;
}) => void;
/** Called when the active schematic sheet changes (multi-sheet circuits). */
onSchematicSheetChange?: (schematicSheetId: string) => void;
toolMode?: "select" | "draw_wire" | "draw_bus" | "draw_bus_entry" | "draw_no_connect" | "draw_net_label" | "draw_global_label" | "draw_hier_sheet" | "draw_power_port" | "draw_ground_port" | "draw_text_note" | "draw_trace" | "draw_component";
onWireAdded?: (event: EditSchematicWireAddEvent) => void;
onBusAdded?: (event: EditSchematicBusAddEvent) => void;
onBusEntryAdded?: (event: EditSchematicBusEntryAddEvent) => void;
onNoConnectAdded?: (event: EditSchematicNoConnectAddEvent) => void;
onNetLabelAdded?: (event: EditSchematicNetLabelAddEvent) => void;
onGlobalLabelAdded?: (event: EditSchematicGlobalLabelAddEvent) => void;
onHierSheetAdded?: (event: EditSchematicHierSheetAddEvent) => void;
onPowerPortAdded?: (event: EditSchematicPowerPortAddEvent) => void;
onGroundPortAdded?: (event: EditSchematicGroundPortAddEvent) => void;
onTextNoteAdded?: (event: EditSchematicTextNoteAddEvent) => void;
onComponentAdded?: (event: EditSchematicComponentAddEvent) => void;
placementComponentKind?: PlacementComponentKind;
hierSheetTargets?: HierSheetTarget[];
/** Host sheet id excluded from hier-sheet placement targets. */
activeSheetId?: string;
allowComponentEdit?: boolean;
/**
* Screen-space rectangles the host reserves (e.g. the sheet title block).
* Component and port drags are clamped so their bboxes never enter these
* regions. Called on every mouse-move; keep it lightweight.
*/
getBlockedScreenRegions?: () => DOMRect[] | undefined;
allowCanvasPan?: boolean;
}
declare const SchematicViewer: ({ circuitJson, containerStyle, editEvents: unappliedEditEvents, onEditEvent, defaultEditMode, debugGrid, editingEnabled, debug, clickToInteractEnabled, colorOverrides, spiceSimulationEnabled, disableGroups, netHoverHighlightEnabled, traceHoverColor, onSchematicComponentClicked, showSchematicPorts, onSchematicPortClicked, onSchematicSheetChange, css, className, toolMode, onWireAdded, onBusAdded, onBusEntryAdded, onNoConnectAdded, onNetLabelAdded, onGlobalLabelAdded, onHierSheetAdded, onPowerPortAdded, onGroundPortAdded, onTextNoteAdded, onComponentAdded, placementComponentKind, hierSheetTargets, activeSheetId, allowComponentEdit, getBlockedScreenRegions, allowCanvasPan, }: Props$1) => react.JSX.Element;

interface BoundingBoxBounds {
minX: number;
maxX: number;
minY: number;
maxY: number;
}
declare const MouseTracker: ({ children }: {
children: ReactNode;
}) => react.JSX.Element;

interface UseMouseEventsOverBoundingBoxOptions {
bounds: BoundingBoxBounds | null;
onClick?: (event: MouseEvent) => void;
}
declare const useMouseEventsOverBoundingBox: (options: UseMouseEventsOverBoundingBoxOptions) => {
hovering: boolean;
};

interface Props {
circuitJson: CircuitJson;
containerStyle?: React.CSSProperties;
colorOverrides?: ColorOverrides;
width?: number;
height?: number;
className?: string;
}
declare const AnalogSimulationViewer: ({ circuitJson: inputCircuitJson, containerStyle, colorOverrides, width, height, className, }: Props) => react.JSX.Element;

export { AnalogSimulationViewer, type EditSchematicBusAddEvent, type EditSchematicBusEntryAddEvent, type EditSchematicComponentAddEvent, type EditSchematicGlobalLabelAddEvent, type EditSchematicGroundPortAddEvent, type EditSchematicHierSheetAddEvent, type EditSchematicNetLabelAddEvent, type EditSchematicNoConnectAddEvent, type EditSchematicPowerPortAddEvent, type EditSchematicTextNoteAddEvent, type EditSchematicWireAddEvent, MouseTracker, type PlacementComponentKind, SchematicViewer, useMouseEventsOverBoundingBox };
Loading