{"version":3,"file":"index.cjs","names":["resistorSchema","capacitorSchema","groundSchema","switchSchema","batterySchema","voltageSourceSchema","diodeSchema","transistorNpnSchema","ledSchema","icSchema","componentRegistry: Record<string, ComponentSchema>","schema: ComponentSchema","id: string","id","category: string","category","Port: React.FC<PortProps>","event: React.MouseEvent","BaseComponent: React.FC<BaseComponentProps>","id","Port","Brick: React.FC<BrickProps>","BaseComponent","componentId: string","portId: string","currentEl: Element | null","svgRoot: SVGSVGElement | null","WirePath: React.FC<WirePathProps>","from: Point","to: Point","CircuitCanvas: React.FC<CircuitCanvasProps>","clientX: number","clientY: number","e: React.MouseEvent | React.DragEvent","e: React.MouseEvent","id: string","event: React.MouseEvent","id","componentId: string","event: React.WheelEvent","portId: string","from: Point","to: Point","event: React.DragEvent","e: KeyboardEvent","WirePath","Brick","initialState?: Partial<CircuitState>","prevState: CircuitState","updater: (prev: CircuitState) => CircuitState","prefix: string","component: Omit<ComponentInstance, 'id'>","id","id: string","updates: Partial<ComponentInstance>","from: Wire['from']","to: Wire['to']","style?: Wire['style']","updates: Partial<Wire>","addToSelection: boolean","newPosition: Point","dx: number","dy: number","degrees: number","componentId: string","portId: string","toComponentId: string","toPortId: string","fromId: string","fromPortId: string","toId: string","actions: CircuitActions","wire: Wire | null","deps: any[]","componentId: string | null","portId: string | null","PropertyPanel: React.FC<PropertyPanelProps>","key: string","event: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>","value: any","ComponentPalette: React.FC<ComponentPaletteProps>","category","ComponentListItem: React.FC<ComponentListItemProps>","event: React.DragEvent","CircuitToolbar: React.FC<CircuitToolbarProps>","SimpleCircuitExample: React.FC","id: string","id","key: string","value: any","componentType: string","action: string","CircuitToolbar","ComponentPalette","CircuitCanvas","PropertyPanel","circuit: CircuitState","issues: ValidationIssue[]","InteractiveCircuitExample: React.FC","componentType: string","id","position: Point","action: string","id: string","key: string","value: any","componentId: string","portId: string","event: React.MouseEvent","CircuitToolbar","ComponentPalette","CircuitCanvas","PropertyPanel","VoltageRegulatorExample: React.FC","CircuitCanvas","TimerCircuitExample: React.FC","CircuitCanvas"],"sources":["../src/registry/components/resistor.json","../src/registry/components/capacitor.json","../src/registry/components/battery.json","../src/registry/components/ground.json","../src/registry/components/switch.json","../src/registry/components/voltage-source.json","../src/registry/components/diode.json","../src/registry/components/transistor-npn.json","../src/registry/components/led.json","../src/registry/components/ic.json","../src/registry/components/index.ts","../src/registry/index.ts","../src/core/Port.tsx","../src/core/BaseComponent.tsx","../src/core/Brick.tsx","../src/utils/getPortPosition.ts","../src/core/WirePath.tsx","../src/core/CircuitCanvas.tsx","../src/hooks/useCircuit.ts","../src/hooks/usePortPosition.ts","../src/ui/PropertyPanel.tsx","../src/ui/ComponentPalette.tsx","../src/ui/CircuitToolbar.tsx","../src/examples/SimpleCircuitExample.tsx","../src/utils/circuitValidation.ts","../src/examples/InteractiveCircuitExample.tsx","../src/examples/VoltageRegulatorExample.tsx","../src/examples/TimerCircuitExample.tsx","../src/index.ts"],"sourcesContent":["{\n  \"id\": \"resistor\",\n  \"name\": \"Resistor\",\n  \"category\": \"passive\",\n  \"description\": \"A passive two-terminal electrical component that implements electrical resistance\",\n  \"defaultWidth\": 80,\n  \"defaultHeight\": 30,\n  \"ports\": [\n    {\n      \"id\": \"left\",\n      \"x\": 0,\n      \"y\": 15,\n      \"type\": \"inout\"\n    },\n    {\n      \"id\": \"right\",\n      \"x\": 80,\n      \"y\": 15,\n      \"type\": \"inout\"\n    }\n  ],\n  \"properties\": [\n    {\n      \"key\": \"resistance\",\n      \"label\": \"Resistance\",\n      \"type\": \"number\",\n      \"unit\": \"Ω\",\n      \"default\": 1000,\n      \"min\": 0\n    },\n    {\n      \"key\": \"tolerance\",\n      \"label\": \"Tolerance\",\n      \"type\": \"number\",\n      \"unit\": \"%\",\n      \"default\": 5,\n      \"min\": 0,\n      \"max\": 20\n    }\n  ],\n  \"svgPath\": \"M10,15 h10 l5,-10 l10,20 l10,-20 l10,20 l10,-20 l5,10 h10\"\n}\n","{\n  \"id\": \"capacitor\",\n  \"name\": \"Capacitor\",\n  \"category\": \"passive\",\n  \"description\": \"A passive two-terminal electrical component that stores electrical energy in an electric field\",\n  \"defaultWidth\": 60,\n  \"defaultHeight\": 40,\n  \"ports\": [\n    {\n      \"id\": \"left\",\n      \"x\": 0,\n      \"y\": 20,\n      \"type\": \"inout\"\n    },\n    {\n      \"id\": \"right\",\n      \"x\": 60,\n      \"y\": 20,\n      \"type\": \"inout\"\n    }\n  ],\n  \"properties\": [\n    {\n      \"key\": \"capacitance\",\n      \"label\": \"Capacitance\",\n      \"type\": \"number\",\n      \"unit\": \"μF\",\n      \"default\": 10,\n      \"min\": 0\n    },\n    {\n      \"key\": \"voltageRating\",\n      \"label\": \"Voltage Rating\",\n      \"type\": \"number\",\n      \"unit\": \"V\",\n      \"default\": 50,\n      \"min\": 0\n    }\n  ],\n  \"svgPath\": \"M10,20 h15 M35,5 v30 M45,5 v30 M45,20 h15\"\n}\n","{\n  \"id\": \"battery\",\n  \"name\": \"Battery\",\n  \"category\": \"sources\",\n  \"description\": \"A source of electrical energy that can be used to power circuits\",\n  \"defaultWidth\": 60,\n  \"defaultHeight\": 40,\n  \"ports\": [\n    {\n      \"id\": \"positive\",\n      \"x\": 60,\n      \"y\": 20,\n      \"type\": \"output\"\n    },\n    {\n      \"id\": \"negative\",\n      \"x\": 0,\n      \"y\": 20,\n      \"type\": \"output\"\n    }\n  ],\n  \"properties\": [\n    {\n      \"key\": \"voltage\",\n      \"label\": \"Voltage\",\n      \"type\": \"number\",\n      \"unit\": \"V\",\n      \"default\": 9,\n      \"min\": 0\n    },\n    {\n      \"key\": \"internal_resistance\",\n      \"label\": \"Internal Resistance\",\n      \"type\": \"number\",\n      \"unit\": \"Ω\",\n      \"default\": 0.1,\n      \"min\": 0\n    }\n  ],\n  \"svgPath\": \"M10,20 h10 M20,5 v30 M30,10 v20 M40,5 v30 M40,20 h10\"\n}\n","{\n  \"id\": \"ground\",\n  \"name\": \"Ground\",\n  \"category\": \"basic\",\n  \"description\": \"A reference point in an electrical circuit from which voltages are measured\",\n  \"defaultWidth\": 30,\n  \"defaultHeight\": 30,\n  \"ports\": [\n    {\n      \"id\": \"terminal\",\n      \"x\": 15,\n      \"y\": 0,\n      \"type\": \"inout\"\n    }\n  ],\n  \"properties\": [],\n  \"svgPath\": \"M15,0 v15 M5,15 h20 M8,20 h14 M11,25 h8\"\n}\n","{\n  \"id\": \"switch\",\n  \"name\": \"Switch\",\n  \"category\": \"basic\",\n  \"description\": \"A component that can be open or closed to control current flow\",\n  \"defaultWidth\": 60,\n  \"defaultHeight\": 30,\n  \"ports\": [\n    {\n      \"id\": \"left\",\n      \"x\": 0,\n      \"y\": 15,\n      \"type\": \"inout\"\n    },\n    {\n      \"id\": \"right\",\n      \"x\": 60,\n      \"y\": 15,\n      \"type\": \"inout\"\n    }\n  ],\n  \"properties\": [\n    {\n      \"key\": \"state\",\n      \"label\": \"State\",\n      \"type\": \"select\",\n      \"options\": [\n        { \"value\": \"open\", \"label\": \"Open\" },\n        { \"value\": \"closed\", \"label\": \"Closed\" }\n      ],\n      \"default\": \"open\"\n    }\n  ],\n  \"svgPath\": \"M10,15 h10 M20,15 l20,-10 M40,15 h10\"\n}\n","{\n  \"id\": \"voltage-source\",\n  \"name\": \"Voltage Source\",\n  \"category\": \"sources\",\n  \"description\": \"An ideal voltage source with constant voltage\",\n  \"defaultWidth\": 50,\n  \"defaultHeight\": 50,\n  \"ports\": [\n    {\n      \"id\": \"positive\",\n      \"x\": 25,\n      \"y\": 0,\n      \"type\": \"output\"\n    },\n    {\n      \"id\": \"negative\",\n      \"x\": 25,\n      \"y\": 50,\n      \"type\": \"output\"\n    }\n  ],\n  \"properties\": [\n    {\n      \"key\": \"voltage\",\n      \"label\": \"Voltage\",\n      \"type\": \"number\",\n      \"unit\": \"V\",\n      \"default\": 5,\n      \"min\": 0\n    },\n    {\n      \"key\": \"frequency\",\n      \"label\": \"Frequency\",\n      \"type\": \"number\",\n      \"unit\": \"Hz\",\n      \"default\": 0,\n      \"min\": 0\n    },\n    {\n      \"key\": \"sourceType\",\n      \"label\": \"Source Type\",\n      \"type\": \"select\",\n      \"options\": [\n        { \"value\": \"dc\", \"label\": \"DC\" },\n        { \"value\": \"ac\", \"label\": \"AC\" }\n      ],\n      \"default\": \"dc\"\n    }\n  ],\n  \"svgPath\": \"M25,10 v10 M20,25 h10 M25,30 v10 M25,25 m-15,0 a15,15 0 1,0 30,0 a15,15 0 1,0 -30,0\"\n}\n","{\n  \"id\": \"diode\",\n  \"name\": \"Diode\",\n  \"category\": \"semiconductor\",\n  \"description\": \"A semiconductor device that allows current to flow in only one direction\",\n  \"defaultWidth\": 60,\n  \"defaultHeight\": 30,\n  \"ports\": [\n    {\n      \"id\": \"anode\",\n      \"x\": 0,\n      \"y\": 15,\n      \"type\": \"inout\"\n    },\n    {\n      \"id\": \"cathode\",\n      \"x\": 60,\n      \"y\": 15,\n      \"type\": \"inout\"\n    }\n  ],\n  \"properties\": [\n    {\n      \"key\": \"forwardVoltage\",\n      \"label\": \"Forward Voltage\",\n      \"type\": \"number\",\n      \"unit\": \"V\",\n      \"default\": 0.7,\n      \"min\": 0\n    },\n    {\n      \"key\": \"maxCurrent\",\n      \"label\": \"Max Current\",\n      \"type\": \"number\",\n      \"unit\": \"A\",\n      \"default\": 1,\n      \"min\": 0\n    }\n  ],\n  \"svgPath\": \"M10,15 h10 M20,5 l0,20 L40,15 L20,5 M40,5 v20 M40,15 h10\"\n}\n","{\n  \"id\": \"transistor-npn\",\n  \"name\": \"NPN Transistor\",\n  \"category\": \"semiconductor\",\n  \"description\": \"An NPN bipolar junction transistor for amplification and switching\",\n  \"defaultWidth\": 50,\n  \"defaultHeight\": 60,\n  \"ports\": [\n    {\n      \"id\": \"collector\",\n      \"x\": 25,\n      \"y\": 0,\n      \"type\": \"inout\"\n    },\n    {\n      \"id\": \"base\",\n      \"x\": 0,\n      \"y\": 30,\n      \"type\": \"input\"\n    },\n    {\n      \"id\": \"emitter\",\n      \"x\": 25,\n      \"y\": 60,\n      \"type\": \"inout\"\n    }\n  ],\n  \"properties\": [\n    {\n      \"key\": \"gain\",\n      \"label\": \"Current Gain (β)\",\n      \"type\": \"number\",\n      \"default\": 100,\n      \"min\": 1\n    }\n  ],\n  \"svgPath\": \"M25,0 v15 M25,45 v15 M0,30 h15 M15,15 v30 M15,30 l20,-10 l0,20 Z\"\n}\n","{\n  \"id\": \"led\",\n  \"name\": \"LED\",\n  \"category\": \"semiconductor\",\n  \"description\": \"Light-emitting diode that emits light when current flows through it\",\n  \"defaultWidth\": 60,\n  \"defaultHeight\": 40,\n  \"ports\": [\n    {\n      \"id\": \"anode\",\n      \"x\": 0,\n      \"y\": 20,\n      \"type\": \"inout\"\n    },\n    {\n      \"id\": \"cathode\",\n      \"x\": 60,\n      \"y\": 20,\n      \"type\": \"inout\"\n    }\n  ],\n  \"properties\": [\n    {\n      \"key\": \"color\",\n      \"label\": \"Color\",\n      \"type\": \"color\",\n      \"default\": \"#ff0000\"\n    },\n    {\n      \"key\": \"forwardVoltage\",\n      \"label\": \"Forward Voltage\",\n      \"type\": \"number\",\n      \"unit\": \"V\",\n      \"default\": 1.8,\n      \"min\": 0\n    },\n    {\n      \"key\": \"maxCurrent\",\n      \"label\": \"Max Current\",\n      \"type\": \"number\",\n      \"unit\": \"mA\",\n      \"default\": 20,\n      \"min\": 0\n    }\n  ],\n  \"svgPath\": \"M10,20 h10 M20,5 l0,30 L40,20 L20,5 M40,5 v30 M40,20 h10 M25,5 l5,-5 l5,10 l5,-5 M25,10 l5,-5 l5,10 l5,-5\"\n}\n","{\n  \"id\": \"ic\",\n  \"name\": \"Integrated Circuit\",\n  \"category\": \"advanced\",\n  \"description\": \"A general-purpose integrated circuit with configurable pins\",\n  \"defaultWidth\": 80,\n  \"defaultHeight\": 100,\n  \"ports\": [\n    {\n      \"id\": \"vcc\",\n      \"x\": 20,\n      \"y\": 0,\n      \"type\": \"input\",\n      \"label\": \"VCC\"\n    },\n    {\n      \"id\": \"gnd\",\n      \"x\": 60,\n      \"y\": 100,\n      \"type\": \"input\",\n      \"label\": \"GND\"\n    },\n    {\n      \"id\": \"in1\",\n      \"x\": 0,\n      \"y\": 20,\n      \"type\": \"input\",\n      \"label\": \"IN1\"\n    },\n    {\n      \"id\": \"in2\",\n      \"x\": 0,\n      \"y\": 40,\n      \"type\": \"input\",\n      \"label\": \"IN2\"\n    },\n    {\n      \"id\": \"in3\",\n      \"x\": 0,\n      \"y\": 60,\n      \"type\": \"input\",\n      \"label\": \"IN3\"\n    },\n    {\n      \"id\": \"in4\",\n      \"x\": 0,\n      \"y\": 80,\n      \"type\": \"input\",\n      \"label\": \"IN4\"\n    },\n    {\n      \"id\": \"out1\",\n      \"x\": 80,\n      \"y\": 20,\n      \"type\": \"output\",\n      \"label\": \"OUT1\"\n    },\n    {\n      \"id\": \"out2\",\n      \"x\": 80,\n      \"y\": 40,\n      \"type\": \"output\",\n      \"label\": \"OUT2\"\n    },\n    {\n      \"id\": \"out3\",\n      \"x\": 80,\n      \"y\": 60,\n      \"type\": \"output\",\n      \"label\": \"OUT3\"\n    },\n    {\n      \"id\": \"out4\",\n      \"x\": 80,\n      \"y\": 80,\n      \"type\": \"output\",\n      \"label\": \"OUT4\"\n    }\n  ],\n  \"properties\": [\n    {\n      \"key\": \"name\",\n      \"label\": \"IC Name\",\n      \"type\": \"text\",\n      \"default\": \"IC1\"\n    },\n    {\n      \"key\": \"type\",\n      \"label\": \"IC Type\",\n      \"type\": \"text\",\n      \"default\": \"Custom IC\"\n    }\n  ],\n  \"svgPath\": \"<svg width='80' height='100'><rect x='10' y='10' width='60' height='80' fill='none' stroke='black' stroke-width='2'/><text x='40' y='50' text-anchor='middle' font-family='monospace' font-size='12'>IC</text><circle cx='20' cy='10' r='3' fill='none' stroke='black'/></svg>\"\n}\n","/**\n * Component registry loader\n * \n * This module imports and registers all component schemas\n */\n\nimport { registerComponent } from '../index';\nimport { ComponentSchema } from '../../types';\n\n// Import component schemas\nimport resistorSchema from './resistor.json';\nimport capacitorSchema from './capacitor.json';\nimport batterySchema from './battery.json';\nimport groundSchema from './ground.json';\nimport switchSchema from './switch.json';\nimport voltageSourceSchema from './voltage-source.json';\nimport diodeSchema from './diode.json';\nimport transistorNpnSchema from './transistor-npn.json';\nimport ledSchema from './led.json';\nimport icSchema from './ic.json';\n\n// Register components\nconst registerBuiltInComponents = () => {\n  // Basic components\n  registerComponent(resistorSchema as ComponentSchema);\n  registerComponent(capacitorSchema as ComponentSchema);\n  registerComponent(groundSchema as ComponentSchema);\n  registerComponent(switchSchema as ComponentSchema);\n  \n  // Sources\n  registerComponent(batterySchema as ComponentSchema);\n  registerComponent(voltageSourceSchema as ComponentSchema);\n  \n  // Semiconductors\n  registerComponent(diodeSchema as ComponentSchema);\n  registerComponent(transistorNpnSchema as ComponentSchema);\n  registerComponent(ledSchema as ComponentSchema);\n  \n  // Advanced components\n  registerComponent(icSchema as ComponentSchema);\n  \n  // Add more component registrations here as they are created\n};\n\nexport default registerBuiltInComponents;\n","/**\n * Registry module for component schemas\n * \n * This module provides utilities for registering, retrieving, and managing component schemas.\n * The component registry is a central repository of all available component types that can\n * be used in circuits. Each component is defined by a schema that specifies its appearance,\n * ports, and configurable properties.\n * \n * @module Registry\n */\n\nimport { ComponentSchema } from '../types';\nimport registerBuiltInComponents from './components';\n\n// Internal registry storage\nconst componentRegistry: Record<string, ComponentSchema> = {};\n\n/**\n * Register a component schema in the registry\n * \n * This function adds a new component schema to the registry or updates an existing one.\n * Custom components can be registered to extend the library with new circuit elements.\n * \n * @param {ComponentSchema} schema - The component schema to register\n * \n * @example\n * // Register a custom LED component\n * registerComponent({\n *   id: 'custom-led',\n *   name: 'Custom LED',\n *   category: 'output',\n *   description: 'A light-emitting diode with customizable color',\n *   defaultWidth: 30,\n *   defaultHeight: 20,\n *   ports: [\n *     { id: 'anode', x: 0, y: 10, type: 'input' },\n *     { id: 'cathode', x: 30, y: 10, type: 'output' }\n *   ],\n *   properties: [\n *     { id: 'color', name: 'Color', type: 'color', default: '#ff0000' }\n *   ],\n *   svgPath: `<circle cx=\"15\" cy=\"10\" r=\"8\" fill=\"currentColor\" />`\n * });\n */\nexport function registerComponent(schema: ComponentSchema): void {\n  if (componentRegistry[schema.id]) {\n    console.warn(`Component with ID ${schema.id} already exists in registry. Overwriting.`);\n  }\n  componentRegistry[schema.id] = schema;\n}\n\n/**\n * Get a component schema from the registry by ID\n * \n * Retrieves a component's schema definition by its unique identifier.\n * Returns undefined if no component with the specified ID exists.\n * \n * @param {string} id - The unique identifier of the component\n * @returns {ComponentSchema | undefined} The component schema or undefined if not found\n * \n * @example\n * const resistorSchema = getComponentSchema('resistor');\n * if (resistorSchema) {\n *   console.log(`Resistor has ${resistorSchema.ports.length} ports`);\n * }\n */\nexport function getComponentSchema(id: string): ComponentSchema | undefined {\n  return componentRegistry[id];\n}\n\n/**\n * Get all component schemas in the registry\n */\nexport function getAllComponents(): ComponentSchema[] {\n  return Object.values(componentRegistry);\n}\n\n/**\n * Get component schemas by category\n */\nexport function getComponentsByCategory(category: string): ComponentSchema[] {\n  return Object.values(componentRegistry)\n    .filter(schema => schema.category === category);\n}\n\n// Register built-in components\nregisterBuiltInComponents();\n\nexport default componentRegistry;\n","/**\n * Port Component\n * \n * Renders a connection port on a circuit component\n */\n\nimport React from 'react';\nimport { PortSchema } from '../types';\n\nexport interface PortProps {\n  componentId: string;\n  port: PortSchema;\n  selected?: boolean;\n  onClick?: (portId: string, event: React.MouseEvent) => void;\n}\n\nconst Port: React.FC<PortProps> = ({\n  componentId,\n  port,\n  selected = false,\n  onClick\n}) => {\n  const handleClick = (event: React.MouseEvent) => {\n    event.stopPropagation(); // Prevent triggering component click\n    onClick?.(port.id, event);\n  };\n\n  return (\n    <circle\n      cx={port.x}\n      cy={port.y}\n      r={5}\n      fill={selected ? '#4f8ef7' : '#555'}\n      stroke=\"#000\"\n      strokeWidth={1}\n      data-component-id={componentId}\n      data-port-id={port.id}\n      data-port-type={port.type}\n      vectorEffect=\"non-scaling-stroke\"\n      onClick={handleClick}\n      style={{ cursor: 'pointer' }}\n    />\n  );\n};\n\nexport default Port;\n","/**\n * BaseComponent\n * \n * A core component that renders SVG for a circuit component based on its schema.\n */\n\nimport React from 'react';\nimport { ComponentSchema, ComponentInstance } from '../types';\nimport Port from './Port';\n\nexport interface BaseComponentProps {\n  schema: ComponentSchema;\n  component: ComponentInstance;\n  onClick?: (event: React.MouseEvent) => void;\n  onMouseDown?: (event: React.MouseEvent) => void;\n  onPortClick?: (componentId: string, portId: string, event: React.MouseEvent) => void;\n  selected?: boolean;\n}\n\nconst BaseComponent: React.FC<BaseComponentProps> = ({\n  schema,\n  component,\n  onClick,\n  onMouseDown,\n  onPortClick,\n  selected = false\n}) => {\n  const { id, position, size, rotation = 0 } = component;\n  \n  // Determine the size to use - from the component instance or defaults\n  const width = size?.width || schema.defaultWidth;\n  const height = size?.height || schema.defaultHeight;\n\n  // Create a transform for position and optional rotation\n  const transform = `translate(${position.x}, ${position.y})${\n    rotation ? ` rotate(${rotation} ${width / 2} ${height / 2})` : ''\n  }`;\n\n  // Style for the selection outline\n  const outlineStyle = selected\n    ? {\n        stroke: '#4f8ef7',\n        strokeWidth: 2,\n        strokeDasharray: 'none',\n        fill: 'none',\n        pointerEvents: 'none' as const,\n        vectorEffect: 'non-scaling-stroke' as const,\n      }\n    : undefined;\n\n  return (\n    <g\n      transform={transform}\n      onClick={onClick}\n      onMouseDown={onMouseDown}\n      data-component-id={id}\n      data-component-type={component.type}\n    >\n      {/* SVG content from the schema */}\n      <svg\n        width={width}\n        height={height}\n        viewBox={`0 0 ${schema.defaultWidth} ${schema.defaultHeight}`}\n        preserveAspectRatio=\"none\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        {/* If svgPath is a complete SVG element with tags */}\n        {schema.svgPath.startsWith('<svg') ? (\n          <g dangerouslySetInnerHTML={{ __html: schema.svgPath }} />\n        ) : (\n          // Otherwise treat it as a path data string\n          <path\n            d={schema.svgPath}\n            fill=\"none\"\n            stroke=\"black\"\n            strokeWidth={2}\n            vectorEffect=\"non-scaling-stroke\"\n          />\n        )}\n      </svg>\n\n      {/* Render ports */}\n      {schema.ports.map(port => (\n        <Port\n          key={port.id}\n          componentId={id}\n          port={port}\n          selected={false}\n          onClick={(portId, event) => onPortClick?.(id, portId, event)}\n        />\n      ))}\n\n      {/* Selection outline */}\n      {selected && (\n        <rect\n          x={0}\n          y={0}\n          width={width}\n          height={height}\n          {...outlineStyle}\n        />\n      )}\n    </g>\n  );\n};\n\nexport default BaseComponent;\n","/**\n * Brick Component\n * \n * A wrapper around BaseComponent that handles schema lookup and error states.\n */\n\nimport React from 'react';\nimport { ComponentInstance } from '../types';\nimport { getComponentSchema } from '../registry';\nimport BaseComponent from './BaseComponent';\n\nexport interface BrickProps {\n  component: ComponentInstance;\n  onClick?: (event: React.MouseEvent) => void;\n  onMouseDown?: (event: React.MouseEvent) => void;\n  onPortClick?: (componentId: string, portId: string, event: React.MouseEvent) => void;\n  selected?: boolean;\n}\n\nconst Brick: React.FC<BrickProps> = ({\n  component,\n  onClick,\n  onMouseDown,\n  onPortClick,\n  selected = false\n}) => {\n  const schema = getComponentSchema(component.type);\n  \n  // Handle missing schema with a placeholder component\n  if (!schema) {\n    console.warn(`No schema found for component type: ${component.type}`);\n    return (\n      <g \n        transform={`translate(${component.position.x}, ${component.position.y})`}\n        onClick={onClick}\n        onMouseDown={onMouseDown}\n        data-component-id={component.id}\n        data-component-type=\"unknown\"\n      >\n        <rect \n          width={100} \n          height={50} \n          fill=\"red\" \n          stroke=\"black\" \n          strokeWidth={1.5}\n          strokeDasharray=\"5,5\"\n          vectorEffect=\"non-scaling-stroke\"\n        />\n        <text \n          x={50} \n          y={25} \n          textAnchor=\"middle\" \n          dominantBaseline=\"middle\" \n          fill=\"white\"\n          fontFamily=\"sans-serif\"\n          fontSize=\"12px\"\n        >\n          Unknown: {component.type}\n        </text>\n      </g>\n    );\n  }\n  \n  // Render the component with its schema\n  return (\n    <BaseComponent \n      schema={schema}\n      component={component}\n      onClick={onClick}\n      onMouseDown={onMouseDown}\n      onPortClick={onPortClick}\n      selected={selected}\n    />\n  );\n};\n\nexport default Brick;\n","/**\n * Port position utility\n * \n * Provides functions to get the absolute position of ports in the DOM.\n * Compatible with infinite circuit canvas with panning and zooming.\n */\n\nimport { Point } from '../types';\n\n/**\n * Retrieves the absolute position of a port in the SVG coordinate system,\n * accounting for any viewport transformations (pan/zoom).\n * \n * @param componentId - The ID of the component\n * @param portId - The ID of the port on the component\n * @returns The position of the port or null if not found\n */\nexport function getPortPosition(componentId: string, portId: string): Point | null {\n  // Find the port element in the DOM\n  const portElement = document.querySelector(\n    `[data-component-id=\"${componentId}\"][data-port-id=\"${portId}\"]`\n  );\n\n  if (!portElement) {\n    console.warn(`Port not found: componentId=${componentId}, portId=${portId}`);\n    return null;\n  }\n\n  // Find the SVG root to calculate the relative position\n  let currentEl: Element | null = portElement;\n  let svgRoot: SVGSVGElement | null = null;\n  \n  while (currentEl) {\n    if (currentEl instanceof SVGSVGElement) {\n      svgRoot = currentEl;\n      break;\n    }\n    currentEl = currentEl.parentElement;\n  }\n  \n  if (!svgRoot) {\n    console.warn('SVG root not found for port');\n    return null;\n  }\n  \n  // Get the bounding client rect of the port element and SVG\n  const portRect = (portElement as SVGElement).getBoundingClientRect();\n  const svgRect = svgRoot.getBoundingClientRect();\n  \n  // Get the center point of the port in client coordinates\n  const clientX = portRect.left + portRect.width / 2;\n  const clientY = portRect.top + portRect.height / 2;\n  \n  // Create an SVG point in client coordinates\n  const svgPoint = svgRoot.createSVGPoint();\n  svgPoint.x = clientX;\n  svgPoint.y = clientY;\n  \n  // Get the current transformation matrix and its inverse\n  // This will automatically factor in any viewport transformations (pan/zoom)\n  const ctm = svgRoot.getScreenCTM();\n  if (!ctm) {\n    console.warn('Could not get screen CTM for SVG');\n    return null;\n  }\n  \n  const inverseCTM = ctm.inverse();\n  \n  // Transform the client coordinates to SVG user space\n  const transformedPoint = svgPoint.matrixTransform(inverseCTM);\n  \n  // Return the point in user space coordinates, which accounts for pan/zoom\n  return {\n    x: transformedPoint.x,\n    y: transformedPoint.y\n  };\n}\n\n/**\n * Hook version of getPortPosition for React components\n * Will be implemented in a separate usePortPosition.ts file\n */\n","/**\n * WirePath Component\n * \n * Renders a wire connection between two component ports.\n */\n\nimport React, { useEffect, useState, useRef } from 'react';\nimport { Wire, ComponentInstance, Point } from '../types';\nimport { getPortPosition } from '../utils/getPortPosition';\n\nexport interface WirePathProps {\n  wire: Wire;\n  components: ComponentInstance[];\n  selected?: boolean;\n  onClick?: (event: React.MouseEvent) => void;\n}\n\ninterface PortPosition {\n  x: number;\n  y: number;\n  found: boolean;\n}\n\nconst WirePath: React.FC<WirePathProps> = ({\n  wire,\n  components,\n  selected = false,\n  onClick\n}) => {\n  const [fromPos, setFromPos] = useState<PortPosition>({ x: 0, y: 0, found: false });\n  const [toPos, setToPos] = useState<PortPosition>({ x: 0, y: 0, found: false });\n  const pathRef = useRef<SVGPathElement>(null);\n\n  // Function to update port positions\n  const updatePortPositions = () => {\n    try {\n      const fromPosition = getPortPosition(wire.from.componentId, wire.from.portId);\n      if (fromPosition) {\n        setFromPos({ ...fromPosition, found: true });\n      }\n    } catch (error) {\n      console.warn(`Could not find source port for wire ${wire.id}:`, error);\n    }\n\n    try {\n      const toPosition = getPortPosition(wire.to.componentId, wire.to.portId);\n      if (toPosition) {\n        setToPos({ ...toPosition, found: true });\n      }\n    } catch (error) {\n      console.warn(`Could not find destination port for wire ${wire.id}:`, error);\n    }\n  };\n\n  // Setup a MutationObserver to watch for component position changes\n  useEffect(() => {\n    updatePortPositions();\n    \n    // Watch for changes in component attributes (like x, y, transform)\n    const observer = new MutationObserver((mutations) => {\n      let shouldUpdate = false;\n      \n      mutations.forEach((mutation) => {\n        if (mutation.type === 'attributes' && \n            (mutation.attributeName === 'transform' || \n             mutation.attributeName === 'x' || \n             mutation.attributeName === 'y')) {\n          shouldUpdate = true;\n        }\n      });\n      \n      if (shouldUpdate) {\n        updatePortPositions();\n      }\n    });\n    \n    // Find all relevant component SVG elements to observe\n    const fromComponent = document.querySelector(`[data-component-id=\"${wire.from.componentId}\"]`);\n    const toComponent = document.querySelector(`[data-component-id=\"${wire.to.componentId}\"]`);\n    \n    if (fromComponent) {\n      observer.observe(fromComponent, { attributes: true, attributeFilter: ['transform', 'x', 'y'] });\n    }\n    \n    if (toComponent) {\n      observer.observe(toComponent, { attributes: true, attributeFilter: ['transform', 'x', 'y'] });\n    }\n    \n    // Also set up a resize observer to update positions when the canvas resizes\n    const resizeObserver = new ResizeObserver(() => {\n      updatePortPositions();\n    });\n    \n    if (pathRef.current) {\n      const svgElement = pathRef.current.closest('svg');\n      if (svgElement) {\n        resizeObserver.observe(svgElement);\n      }\n    }\n    \n    return () => {\n      observer.disconnect();\n      resizeObserver.disconnect();\n    };\n  }, [wire, components]);\n\n  // Update positions when components array changes (new components added or removed)\n  useEffect(() => {\n    updatePortPositions();\n  }, [components.length]);\n\n  // Do not render the wire if either port was not found\n  if (!fromPos.found || !toPos.found) {\n    return null;\n  }\n\n  // Calculate a bezier curve path with proper spacing between components\n  const generatePath = (from: Point, to: Point): string => {\n    // Calculate distance between points\n    const dx = to.x - from.x;\n    const dy = to.y - from.y;\n    const distance = Math.sqrt(dx * dx + dy * dy);\n    \n    // For very short distances, use a straight line\n    if (distance < 20) {\n      return `M ${from.x} ${from.y} L ${to.x} ${to.y}`;\n    }\n    \n    // Calculate control points with optimized offset\n    const controlPointLength = Math.min(distance / 3, 60); // Reduced for smoother curves\n    \n    // Determine dominant axis and adjust control points to create natural curves\n    if (Math.abs(dx) > Math.abs(dy)) {\n      // Horizontal dominant\n      const cp1x = from.x + controlPointLength;\n      const cp1y = from.y;\n      const cp2x = to.x - controlPointLength;\n      const cp2y = to.y;\n      return `M ${from.x} ${from.y} C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${to.x} ${to.y}`;\n    } else {\n      // Vertical dominant\n      const cp1x = from.x;\n      const cp1y = from.y + controlPointLength;\n      const cp2x = to.x;\n      const cp2y = to.y - controlPointLength;\n      return `M ${from.x} ${from.y} C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${to.x} ${to.y}`;\n    }\n  };\n\n  // Wire style based on selected state and custom style\n  const wireStyle = {\n    stroke: selected ? '#4f8ef7' : (wire.style?.color || '#333'),\n    strokeWidth: selected ? 3 : (wire.style?.strokeWidth || 2),\n    strokeDasharray: wire.style?.dashArray || 'none',\n    fill: 'none',\n    vectorEffect: 'non-scaling-stroke' as const,\n  };\n\n  return (\n    <path\n      ref={pathRef}\n      d={generatePath(fromPos, toPos)}\n      className={`wire ${selected ? 'selected' : ''}`}\n      {...wireStyle}\n      onClick={onClick}\n      data-wire-id={wire.id}\n      data-from-component={wire.from.componentId}\n      data-from-port={wire.from.portId}\n      data-to-component={wire.to.componentId}\n      data-to-port={wire.to.portId}\n      style={{ cursor: 'pointer' }}\n    />\n  );\n};\n\nexport default WirePath;\n","/**\n * CircuitCanvas Component\n * \n * The main canvas component that renders circuit components and wires.\n * Supports infinite panning and zooming for a free-flowing design experience.\n * \n * @component\n * @example\n * <CircuitCanvas\n *   components={state.components}\n *   wires={state.wires}\n *   width={800}\n *   height={600}\n *   onComponentClick={handleComponentClick}\n *   showGrid={true}\n * />\n */\n\nimport React, { useRef, useState, useEffect, useCallback } from 'react';\nimport { ComponentInstance, Wire, Point } from '../types';\nimport Brick from './Brick';\nimport WirePath from './WirePath';\nimport { getPortPosition } from '../utils/getPortPosition';\nimport { getComponentSchema } from '../registry';\n\nexport interface CircuitCanvasProps {\n  /** Array of component instances to render on the canvas */\n  components: ComponentInstance[];\n  \n  /** Array of wires connecting components */\n  wires: Wire[];\n  \n  /** Width of the canvas. Can be a number (pixels) or string (e.g., '100%') */\n  width?: number | string;\n  \n  /** Height of the canvas. Can be a number (pixels) or string (e.g., '100%') */\n  height?: number | string;\n  \n  /** Callback when a component is clicked */\n  onComponentClick?: (id: string, event: React.MouseEvent) => void;\n  \n  /** Callback when a wire is clicked */\n  onWireClick?: (id: string, event: React.MouseEvent) => void;\n  \n  /** Callback when the canvas background is clicked */\n  onCanvasClick?: (event: React.MouseEvent) => void;\n  \n  /** Callback when a component is dragged to a new position */\n  onComponentDrag?: (id: string, newPosition: Point) => void;\n  \n  /** Callback when wire drawing starts from a port */\n  onWireDrawStart?: (componentId: string, portId: string) => void;\n  \n  /** Callback when wire drawing ends on a port. Return true to accept the connection. */\n  onWireDrawEnd?: (componentId: string, portId: string) => boolean;\n  \n  /** Callback when wire drawing is canceled */\n  onWireDrawCancel?: () => void;\n  \n  /** Object representing the current wire drawing state */\n  wireDrawing?: {\n    isDrawing: boolean;\n    fromComponentId: string | null;\n    fromPortId: string | null;\n  };\n  \n  /** Array of currently selected component IDs */\n  selectedComponentIds?: string[];\n  \n  /** Array of currently selected wire IDs */\n  selectedWireIds?: string[];\n  \n  /** Whether to show the grid on the canvas */\n  showGrid?: boolean;\n  \n  /** Size of the grid cells in pixels */\n  gridSize?: number;\n  \n  /** Whether to snap components to the grid */\n  snapToGrid?: boolean;\n  \n  /** Callback when a component is dropped onto the canvas */\n  onComponentDrop?: (componentType: string, position: Point) => void;\n  \n  /** Initial zoom level for the canvas (1.0 = 100%) */\n  initialZoom?: number;\n  \n  /** Minimum allowed zoom level */\n  minZoom?: number;\n  \n  /** Maximum allowed zoom level */\n  maxZoom?: number;\n}\n\nexport const CircuitCanvas: React.FC<CircuitCanvasProps> = ({\n  components,\n  wires,\n  width = '100%',\n  height = '100%',\n  onComponentClick,\n  onWireClick,\n  onCanvasClick,\n  onComponentDrag,\n  onWireDrawStart,\n  onWireDrawEnd,\n  onWireDrawCancel,\n  wireDrawing = {\n    isDrawing: false,\n    fromComponentId: null,\n    fromPortId: null\n  },\n  selectedComponentIds = [],\n  selectedWireIds = [],\n  showGrid = true,\n  gridSize = 20,\n  snapToGrid = false,\n  onComponentDrop,\n  initialZoom = 1.0,\n  minZoom = 0.25,\n  maxZoom = 3.0\n}) => {\n  const svgRef = useRef<SVGSVGElement>(null);\n  const [dragState, setDragState] = useState<{\n    isDragging: boolean;\n    componentId: string | null;\n    startPos: Point | null;\n    currentPos: Point | null;\n  }>({\n    isDragging: false,\n    componentId: null,\n    startPos: null,\n    currentPos: null\n  });\n  \n  const [currentMousePos, setCurrentMousePos] = useState<Point | null>(null);\n  const [sourcePortPos, setSourcePortPos] = useState<Point | null>(null);\n  \n  // Viewport state for infinite canvas\n  const [viewportTransform, setViewportTransform] = useState({\n    x: 0,\n    y: 0,\n    scale: initialZoom\n  });\n  \n  // For canvas panning\n  const [isPanning, setIsPanning] = useState(false);\n  const [panStartPos, setPanStartPos] = useState<Point | null>(null);\n  \n  // Ref to detect if mouse is down (for panning)\n  const isMouseDownRef = useRef(false);\n\n  // Effect to dispatch viewport-change event when transform changes\n  useEffect(() => {\n    if (!svgRef.current) return;\n    \n    // Create a custom event for viewport changes\n    const viewportChangeEvent = new CustomEvent('viewport-change', {\n      detail: viewportTransform,\n      bubbles: true\n    });\n    \n    // Dispatch the event\n    svgRef.current.dispatchEvent(viewportChangeEvent);\n  }, [viewportTransform]);\n\n  // Effect to update the source port position when wire drawing starts\n  useEffect(() => {\n    if (wireDrawing.isDrawing && wireDrawing.fromComponentId && wireDrawing.fromPortId) {\n      // Schedule a brief timeout to allow the DOM to update\n      const timer = setTimeout(() => {\n        const portPos = getPortPosition(wireDrawing.fromComponentId!, wireDrawing.fromPortId!);\n        if (portPos) {\n          setSourcePortPos(portPos);\n        }\n      }, 0);\n      \n      return () => clearTimeout(timer);\n    } else {\n      setSourcePortPos(null);\n    }\n  }, [wireDrawing]);\n\n  // Convert screen coordinates to SVG coordinates (accounting for pan and zoom)\n  const screenToSvgCoordinates = useCallback((clientX: number, clientY: number): Point => {\n    if (!svgRef.current) return { x: 0, y: 0 };\n    \n    const svgRect = svgRef.current.getBoundingClientRect();\n    const x = (clientX - svgRect.left - viewportTransform.x) / viewportTransform.scale;\n    const y = (clientY - svgRect.top - viewportTransform.y) / viewportTransform.scale;\n    \n    // Snap to grid if enabled\n    if (snapToGrid) {\n      return { \n        x: Math.round(x / gridSize) * gridSize,\n        y: Math.round(y / gridSize) * gridSize\n      };\n    }\n    \n    return { x, y };\n  }, [gridSize, snapToGrid, viewportTransform]);\n\n  // Get SVG coordinates from mouse event (accounting for pan and zoom)\n  const getSvgCoordinates = useCallback((e: React.MouseEvent | React.DragEvent): Point => {\n    return screenToSvgCoordinates(e.clientX, e.clientY);\n  }, [screenToSvgCoordinates]);\n\n  const handleCanvasClick = (e: React.MouseEvent) => {\n    // Only trigger if the click is directly on the canvas\n    if (e.target === e.currentTarget) {\n      // If we weren't panning, trigger the canvas click\n      if (!isPanning) {\n        onCanvasClick?.(e);\n        \n        // If we're drawing a wire, cancel it\n        if (wireDrawing.isDrawing) {\n          onWireDrawCancel?.();\n        }\n      }\n    }\n  };\n\n  const handleComponentClick = (id: string, event: React.MouseEvent) => {\n    // Only handle click if we're not dragging\n    if (!dragState.isDragging && !isPanning) {\n      onComponentClick?.(id, event);\n    }\n  };\n\n  const handleWireClick = (id: string, event: React.MouseEvent) => {\n    if (!isPanning) {\n      onWireClick?.(id, event);\n    }\n  };\n\n  const handleMouseDown = (componentId: string, event: React.MouseEvent) => {\n    // Start dragging - allow dragging of any clicked component\n    const startPos = getSvgCoordinates(event);\n    setDragState({\n      isDragging: true,\n      componentId,\n      startPos,\n      currentPos: startPos\n    });\n    \n    // Ensure the component is selected\n    if (!selectedComponentIds.includes(componentId) && onComponentClick) {\n      onComponentClick(componentId, event);\n    }\n    \n    event.stopPropagation();\n  };\n\n  // Handle mouse down on the canvas for panning\n  const handleCanvasMouseDown = (event: React.MouseEvent) => {\n    // Only start panning if we click the canvas background and it's a middle mouse button or space + left click\n    if (event.target === event.currentTarget && (event.button === 1 || (event.button === 0 && event.altKey))) {\n      setIsPanning(true);\n      setPanStartPos({ x: event.clientX, y: event.clientY });\n      isMouseDownRef.current = true;\n      \n      // Prevent default to avoid text selection\n      event.preventDefault();\n    }\n  };\n\n  const handleMouseMove = (event: React.MouseEvent) => {\n    // Handle pan movement\n    if (isPanning && panStartPos) {\n      const dx = event.clientX - panStartPos.x;\n      const dy = event.clientY - panStartPos.y;\n      \n      setViewportTransform(prev => ({\n        ...prev,\n        x: prev.x + dx,\n        y: prev.y + dy\n      }));\n      \n      setPanStartPos({ x: event.clientX, y: event.clientY });\n      return;\n    }\n    \n    // For regular interaction, convert coordinates\n    const currentPos = getSvgCoordinates(event);\n    setCurrentMousePos(currentPos);\n    \n    // Update drag position if dragging\n    if (dragState.isDragging && dragState.componentId) {\n      setDragState({ ...dragState, currentPos });\n      \n      // Find the component being dragged\n      const component = components.find(c => c.id === dragState.componentId);\n      if (component && dragState.startPos && currentPos) {\n        // Calculate the new position\n        const dx = currentPos.x - dragState.startPos.x;\n        const dy = currentPos.y - dragState.startPos.y;\n        const newPosition = {\n          x: component.position.x + dx,\n          y: component.position.y + dy\n        };\n        \n        // Snap to grid if needed (now controlled by snapToGrid prop)\n        if (snapToGrid) {\n          newPosition.x = Math.round(newPosition.x / gridSize) * gridSize;\n          newPosition.y = Math.round(newPosition.y / gridSize) * gridSize;\n        }\n        \n        // Call the onComponentDrag handler\n        onComponentDrag?.(dragState.componentId, newPosition);\n      }\n    }\n  };\n\n  const handleMouseUp = (event: React.MouseEvent) => {\n    // End dragging\n    if (dragState.isDragging) {\n      setDragState({\n        isDragging: false,\n        componentId: null,\n        startPos: null,\n        currentPos: null\n      });\n    }\n    \n    // End panning\n    if (isPanning) {\n      setIsPanning(false);\n      setPanStartPos(null);\n    }\n    \n    isMouseDownRef.current = false;\n  };\n  \n  // Handle mouse leaving the canvas\n  const handleMouseLeave = () => {\n    if (isPanning) {\n      setIsPanning(false);\n      setPanStartPos(null);\n    }\n    isMouseDownRef.current = false;\n  };\n  \n  // Handle wheel event for zooming\n  const handleWheel = (event: React.WheelEvent) => {\n    event.preventDefault();\n    \n    // Only zoom if ctrl key is pressed\n    if (event.ctrlKey || event.metaKey) {\n      const delta = event.deltaY > 0 ? -0.1 : 0.1;\n      const newScale = Math.max(minZoom, Math.min(maxZoom, viewportTransform.scale + delta));\n      \n      // Get mouse position relative to SVG\n      const svgRect = svgRef.current?.getBoundingClientRect();\n      if (!svgRect) return;\n      \n      const mouseX = event.clientX - svgRect.left;\n      const mouseY = event.clientY - svgRect.top;\n      \n      // Calculate new transform origin based on mouse position\n      setViewportTransform(prev => {\n        // Calculate the point in world coordinates\n        const worldX = (mouseX - prev.x) / prev.scale;\n        const worldY = (mouseY - prev.y) / prev.scale;\n        \n        // Calculate new transform (zoom around mouse position)\n        const newX = mouseX - worldX * newScale;\n        const newY = mouseY - worldY * newScale;\n        \n        return {\n          x: newX,\n          y: newY,\n          scale: newScale\n        };\n      });\n    } else {\n      // Pan horizontally with shift+wheel\n      if (event.shiftKey) {\n        setViewportTransform(prev => ({\n          ...prev,\n          x: prev.x - event.deltaY\n        }));\n      } else {\n        // Pan vertically with wheel\n        setViewportTransform(prev => ({\n          ...prev,\n          y: prev.y - event.deltaY\n        }));\n      }\n    }\n  };\n\n  const handlePortClick = (componentId: string, portId: string, event: React.MouseEvent) => {\n    // Ignore port clicks when panning\n    if (isPanning) return;\n    \n    event.stopPropagation();\n    \n    // If we're not drawing a wire, start drawing\n    if (!wireDrawing.isDrawing) {\n      onWireDrawStart?.(componentId, portId);\n    } else {\n      // If we are drawing a wire, end drawing and connect to this port\n      if (wireDrawing.fromComponentId && wireDrawing.fromPortId) {\n        onWireDrawEnd?.(componentId, portId);\n      }\n    }\n  };\n\n  // Generate a bezier curve path between two points - updated to match WirePath\n  const generateWirePath = (from: Point, to: Point): string => {\n    // Calculate distance between points\n    const dx = to.x - from.x;\n    const dy = to.y - from.y;\n    const distance = Math.sqrt(dx * dx + dy * dy);\n    \n    // For very short distances, use a straight line\n    if (distance < 20) {\n      return `M ${from.x} ${from.y} L ${to.x} ${to.y}`;\n    }\n    \n    // Calculate control points with optimized offset\n    const controlPointLength = Math.min(distance / 3, 60); // Reduced for smoother curves\n    \n    // Determine dominant axis and adjust control points to create natural curves\n    if (Math.abs(dx) > Math.abs(dy)) {\n      // Horizontal dominant\n      const cp1x = from.x + controlPointLength;\n      const cp1y = from.y;\n      const cp2x = to.x - controlPointLength;\n      const cp2y = to.y;\n      return `M ${from.x} ${from.y} C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${to.x} ${to.y}`;\n    } else {\n      // Vertical dominant\n      const cp1x = from.x;\n      const cp1y = from.y + controlPointLength;\n      const cp2x = to.x;\n      const cp2y = to.y - controlPointLength;\n      return `M ${from.x} ${from.y} C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${to.x} ${to.y}`;\n    }\n  };\n  \n  // Handle drag and drop events for component palette\n  const handleDragOver = (event: React.DragEvent) => {\n    // Prevent default to allow drop\n    event.preventDefault();\n    // Set the drop effect to copy\n    event.dataTransfer.dropEffect = 'copy';\n  };\n  \n  const handleDrop = (event: React.DragEvent) => {\n    event.preventDefault();\n    \n    // Get the component type from the drag data\n    const componentType = event.dataTransfer.getData('application/circuit-component');\n    if (!componentType || !onComponentDrop) return;\n    \n    // Get drop position in SVG coordinates (taking into account pan/zoom)\n    const position = getSvgCoordinates(event);\n    \n    // Create a new component at this position\n    onComponentDrop(componentType, position);\n  };\n\n  // Create keyboard shortcut handlers for common operations\n  useEffect(() => {\n    const handleKeyDown = (e: KeyboardEvent) => {\n      // Only process when the canvas is active\n      if (!svgRef.current) return;\n      \n      // Ignore if we're in an input field\n      if (e.target instanceof HTMLInputElement || \n          e.target instanceof HTMLTextAreaElement) {\n        return;\n      }\n      \n      // Handle space key for panning toggle\n      if (e.code === 'Space' && !isPanning && document.activeElement === document.body) {\n        e.preventDefault(); // Prevent page scroll\n      }\n      \n      // Reset view with key '0'\n      if (e.key === '0' && (e.ctrlKey || e.metaKey)) {\n        e.preventDefault();\n        setViewportTransform({\n          x: 0,\n          y: 0,\n          scale: 1.0\n        });\n      }\n      \n      // Zoom in with + or =\n      if ((e.key === '+' || e.key === '=') && (e.ctrlKey || e.metaKey)) {\n        e.preventDefault();\n        setViewportTransform(prev => ({\n          ...prev,\n          scale: Math.min(maxZoom, prev.scale + 0.1)\n        }));\n      }\n      \n      // Zoom out with -\n      if (e.key === '-' && (e.ctrlKey || e.metaKey)) {\n        e.preventDefault();\n        setViewportTransform(prev => ({\n          ...prev,\n          scale: Math.max(minZoom, prev.scale - 0.1)\n        }));\n      }\n      \n      // Arrow keys for panning when Alt is pressed\n      if (e.altKey && ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key)) {\n        e.preventDefault();\n        const panAmount = e.shiftKey ? 50 : 20; // Faster panning with Shift\n        \n        setViewportTransform(prev => {\n          let dx = 0, dy = 0;\n          if (e.key === 'ArrowLeft') dx = panAmount;\n          if (e.key === 'ArrowRight') dx = -panAmount;\n          if (e.key === 'ArrowUp') dy = panAmount;\n          if (e.key === 'ArrowDown') dy = -panAmount;\n          \n          return {\n            ...prev,\n            x: prev.x + dx,\n            y: prev.y + dy\n          };\n        });\n      }\n    };\n    \n    window.addEventListener('keydown', handleKeyDown);\n    return () => {\n      window.removeEventListener('keydown', handleKeyDown);\n    };\n  }, [isPanning, maxZoom, minZoom]);\n\n  // State for showing help message\n  const [showHelp, setShowHelp] = useState(true);\n  \n  // Hide help message after 15 seconds\n  useEffect(() => {\n    if (showHelp) {\n      const timer = setTimeout(() => {\n        setShowHelp(false);\n      }, 15000);\n      return () => clearTimeout(timer);\n    }\n  }, [showHelp]);\n\n  // Cursor style based on current interaction mode\n  const getCursorStyle = () => {\n    if (isPanning) return 'grabbing';\n    if (isMouseDownRef.current) return 'grabbing';\n    if (wireDrawing.isDrawing) return 'crosshair';\n    return 'default';\n  };\n\n  // Calculate grid pattern sizing based on zoom\n  const getGridSize = () => {\n    // Adjust grid density based on zoom level for better visualization\n    const scaledGridSize = gridSize * (1 + (1 - Math.min(viewportTransform.scale, 1)) * 2);\n    return scaledGridSize;\n  };\n\n  return (\n    <svg \n      ref={svgRef}\n      width={width}\n      height={height}\n      style={{ \n        backgroundColor: '#111111',\n        userSelect: 'none',\n        cursor: getCursorStyle(),\n        overflow: 'hidden'\n      }}\n      onClick={handleCanvasClick}\n      onMouseDown={handleCanvasMouseDown}\n      onMouseMove={handleMouseMove}\n      onMouseUp={handleMouseUp}\n      onMouseLeave={handleMouseLeave}\n      onWheel={handleWheel}\n      onDragOver={handleDragOver}\n      onDrop={handleDrop}\n      data-circuit-canvas\n    >\n      {/* Grid pattern */}\n      <defs>\n        <pattern\n          id=\"grid\"\n          width={getGridSize()}\n          height={getGridSize()}\n          patternUnits=\"userSpaceOnUse\"\n          patternTransform={`translate(${viewportTransform.x % getGridSize()},${viewportTransform.y % getGridSize()}) scale(${viewportTransform.scale})`}\n        >\n          <rect width={getGridSize()} height={getGridSize()} fill=\"#111111\" />\n          <circle cx={getGridSize()} cy={getGridSize()} r=\"0.5\" fill=\"#222222\" />\n        </pattern>\n        \n        <pattern\n          id=\"dots\"\n          width={getGridSize()}\n          height={getGridSize()}\n          patternUnits=\"userSpaceOnUse\"\n          patternTransform={`translate(${viewportTransform.x % getGridSize()},${viewportTransform.y % getGridSize()}) scale(${viewportTransform.scale})`}\n        >\n          <rect width={getGridSize()} height={getGridSize()} fill=\"#111111\" />\n          <circle cx={getGridSize()/2} cy={getGridSize()/2} r=\"0.7\" fill=\"#222222\" />\n        </pattern>\n        \n        {/* Pattern for infinite grid that adjusts with pan/zoom */}\n        <pattern\n          id=\"infinite-grid\"\n          width={getGridSize() * 5}\n          height={getGridSize() * 5}\n          patternUnits=\"userSpaceOnUse\"\n          patternTransform={`translate(${viewportTransform.x % (getGridSize() * 5)},${viewportTransform.y % (getGridSize() * 5)}) scale(${viewportTransform.scale})`}\n        >\n          <rect width={getGridSize() * 5} height={getGridSize() * 5} fill=\"#111111\" />\n          <path \n            d={`M 0 0 H ${getGridSize() * 5} M 0 ${getGridSize()} H ${getGridSize() * 5} M 0 ${getGridSize() * 2} H ${getGridSize() * 5} M 0 ${getGridSize() * 3} H ${getGridSize() * 5} M 0 ${getGridSize() * 4} H ${getGridSize() * 5} M 0 0 V ${getGridSize() * 5} M ${getGridSize()} 0 V ${getGridSize() * 5} M ${getGridSize() * 2} 0 V ${getGridSize() * 5} M ${getGridSize() * 3} 0 V ${getGridSize() * 5} M ${getGridSize() * 4} 0 V ${getGridSize() * 5}`}\n            stroke=\"#222222\"\n            strokeWidth=\"0.3\"\n          />\n          <path \n            d={`M 0 0 H ${getGridSize() * 5} M 0 ${getGridSize() * 5} H ${getGridSize() * 5} M 0 0 V ${getGridSize() * 5} M ${getGridSize() * 5} 0 V ${getGridSize() * 5}`}\n            stroke=\"#333333\"\n            strokeWidth=\"0.5\"\n          />\n        </pattern>\n      </defs>\n      {showGrid && <rect width=\"100%\" height=\"100%\" fill=\"url(#infinite-grid)\" />}\n\n      {/* Viewport transformation group */}\n      <g transform={`translate(${viewportTransform.x}, ${viewportTransform.y}) scale(${viewportTransform.scale})`}>\n        {/* Layers in correct order to ensure proper rendering */}\n        {/* 1. Wires layer (bottom) */}\n        <g className=\"circuit-wires\">\n          {wires.map(wire => (\n            <WirePath\n              key={wire.id}\n              wire={wire}\n              components={components}\n              selected={selectedWireIds.includes(wire.id)}\n              onClick={(e) => handleWireClick(wire.id, e)}\n            />\n          ))}\n          \n          {/* Wire currently being drawn */}\n          {wireDrawing.isDrawing && sourcePortPos && currentMousePos && (\n            <path\n              d={generateWirePath(sourcePortPos, currentMousePos)}\n              stroke=\"#4f8ef7\"\n              strokeWidth={2}\n              strokeDasharray=\"5,5\"\n              fill=\"none\"\n              className=\"wire-preview\"\n              style={{ pointerEvents: 'visible' }}\n            />\n          )}\n        </g>\n\n        {/* 2. Components layer (top) - ensures components are rendered on top of wires */}\n        <g className=\"circuit-components\">\n          {components.map(component => (\n            <Brick\n              key={component.id}\n              component={component}\n              selected={selectedComponentIds.includes(component.id)}\n              onClick={(e) => handleComponentClick(component.id, e)}\n              onMouseDown={(e) => handleMouseDown(component.id, e)}\n              onPortClick={handlePortClick}\n            />\n          ))}\n        </g>\n      </g>\n      \n      {/* Viewport information overlay (optional for debugging) */}\n      {process.env.NODE_ENV === 'development' && (\n        <text\n          x=\"10\"\n          y=\"20\"\n          fill=\"#666\"\n          fontSize=\"12\"\n          pointerEvents=\"none\"\n        >\n          {`Position: (${Math.round(viewportTransform.x)}, ${Math.round(viewportTransform.y)}) | Zoom: ${viewportTransform.scale.toFixed(2)}`}\n        </text>\n      )}\n      \n      {/* Minimap for navigation in infinite canvas (bottom-left) */}\n      <g className=\"circuit-minimap\" transform={`translate(10, ${typeof height === 'number' ? height - 120 : 'calc(100% - 120px)'})`}>\n        <rect\n          x=\"0\"\n          y=\"0\"\n          width=\"110\"\n          height=\"110\"\n          fill=\"#222\"\n          fillOpacity=\"0.7\"\n          stroke=\"#444\"\n          strokeWidth=\"1\"\n          rx=\"4\"\n        />\n        \n        {/* Viewport indicator */}\n        <rect\n          x={5}\n          y={5}\n          width={100}\n          height={100}\n          fill=\"none\"\n          stroke=\"#333\"\n          strokeWidth=\"1\"\n        />\n        \n        {/* Components representation */}\n        <g transform=\"scale(0.1) translate(50, 50)\">\n          {components.map(component => (\n            <circle \n              key={component.id}\n              cx={component.position.x}\n              cy={component.position.y}\n              r={15}\n              fill={selectedComponentIds.includes(component.id) ? \"#4f8ef7\" : \"#666\"}\n            />\n          ))}\n          \n          {/* Viewport window representation */}\n          <rect\n            x={-viewportTransform.x / viewportTransform.scale}\n            y={-viewportTransform.y / viewportTransform.scale}\n            width={typeof width === 'number' ? width / viewportTransform.scale : 1000 / viewportTransform.scale}\n            height={typeof height === 'number' ? height / viewportTransform.scale : 800 / viewportTransform.scale}\n            fill=\"none\"\n            stroke=\"#4f8ef7\"\n            strokeWidth=\"10\"\n            strokeDasharray=\"20,10\"\n          />\n        </g>\n        \n        {/* Toggle button */}\n        <rect\n          x=\"85\"\n          y=\"0\"\n          width=\"25\"\n          height=\"25\"\n          fill=\"#333\"\n          rx=\"4\"\n          style={{ cursor: 'pointer' }}\n          onClick={() => {\n            const minimapEl = document.querySelector('.circuit-minimap');\n            if (minimapEl) {\n              minimapEl.setAttribute('style', 'display: none');\n            }\n          }}\n        />\n        <text x=\"93\" y=\"17\" fill=\"#fff\" fontSize=\"16\" style={{ cursor: 'pointer' }}>\n          ×\n        </text>\n      </g>\n      \n      {/* Help message for infinite canvas */}\n      {showHelp && (\n        <g transform={`translate(${typeof width === 'number' ? width / 2 - 150 : '50%'}, 30)`}>\n          <rect\n            x=\"-10\"\n            y=\"-10\"\n            width=\"320\"\n            height=\"85\"\n            rx=\"8\"\n            fill=\"rgba(0, 0, 0, 0.7)\"\n            stroke=\"#4f8ef7\"\n            strokeWidth=\"1\"\n          />\n          <text x=\"0\" y=\"15\" fill=\"#fff\" fontSize=\"14\" fontWeight=\"bold\">\n            Infinite Canvas Controls:\n          </text>\n          <text x=\"0\" y=\"35\" fill=\"#eee\" fontSize=\"12\">\n            • Alt + drag/middle mouse: Pan canvas\n          </text>\n          <text x=\"0\" y=\"50\" fill=\"#eee\" fontSize=\"12\">\n            • Ctrl/⌘ + scroll: Zoom in/out\n          </text>\n          <text x=\"0\" y=\"65\" fill=\"#eee\" fontSize=\"12\">\n            • Ctrl/⌘ + 0: Reset view\n          </text>\n          <rect\n            x=\"290\"\n            y=\"-10\"\n            width=\"20\"\n            height=\"20\"\n            rx=\"4\"\n            fill=\"rgba(100, 100, 100, 0.5)\"\n            cursor=\"pointer\"\n            onClick={() => setShowHelp(false)}\n          />\n          <text x=\"296\" y=\"5\" fill=\"#fff\" fontSize=\"16\" cursor=\"pointer\" onClick={() => setShowHelp(false)}>\n            ×\n          </text>\n        </g>\n      )}\n      \n      {/* Mini controls overlay */}\n      <g \n        transform=\"translate(10, 10)\"\n        style={{ opacity: 0.7 }}\n        onMouseEnter={(e) => e.currentTarget.style.opacity = '1'}\n        onMouseLeave={(e) => e.currentTarget.style.opacity = '0.7'}\n      >\n        <rect\n          x=\"0\"\n          y=\"0\"\n          width=\"80\"\n          height=\"22\"\n          rx=\"4\"\n          fill=\"#222\"\n          fillOpacity=\"0.8\"\n        />\n        <g \n          transform=\"translate(10, 11)\"\n          cursor=\"pointer\"\n          onClick={() => setViewportTransform(prev => ({...prev, scale: Math.min(maxZoom, prev.scale + 0.1)}))}\n        >\n          <circle r=\"8\" fill=\"#333\" />\n          <path d=\"M-4,0 H4 M0,-4 V4\" stroke=\"#aaa\" strokeWidth=\"1.5\" />\n        </g>\n        <g \n          transform=\"translate(40, 11)\"\n          cursor=\"pointer\"\n          onClick={() => setViewportTransform(prev => ({...prev, scale: Math.max(minZoom, prev.scale - 0.1)}))}\n        >\n          <circle r=\"8\" fill=\"#333\" />\n          <path d=\"M-4,0 H4\" stroke=\"#aaa\" strokeWidth=\"1.5\" />\n        </g>\n        <g \n          transform=\"translate(70, 11)\"\n          cursor=\"pointer\"\n          onClick={() => setViewportTransform({x: 0, y: 0, scale: 1})}\n        >\n          <circle r=\"8\" fill=\"#333\" />\n          <path d=\"M-3,-3 L3,3 M-3,3 L3,-3\" stroke=\"#aaa\" strokeWidth=\"1.5\" />\n        </g>\n      </g>\n    </svg>\n  );\n};\n\nexport default CircuitCanvas;\n","/**\n * useCircuit Hook\n * \n * A React hook for managing circuit state and operations. Provides a complete\n * state management solution for circuit components and wires, with support for\n * selection, wire drawing, and undo/redo functionality.\n * \n * @returns {[CircuitState, CircuitActions]} A tuple containing the current circuit state and actions to modify it\n * \n * @example\n * const [state, actions] = useCircuit();\n * \n * // Add a new component\n * const resistorId = actions.addComponent({\n *   type: 'resistor',\n *   position: { x: 100, y: 100 },\n *   props: { resistance: 1000 }\n * });\n * \n * // Connect components with a wire\n * actions.addWire(\n *   { componentId: resistorId, portId: 'left' },\n *   { componentId: 'battery-1', portId: 'positive' }\n * );\n * \n * // Access current state\n * console.log(state.components, state.wires);\n */\n\nimport { useState, useCallback, useRef } from 'react';\nimport { ComponentInstance, Wire, CircuitState, Point } from '../types';\nimport { getComponentSchema } from '../registry';\n\nexport interface CircuitActions {\n  /** Adds a new component to the circuit and returns its generated ID */\n  addComponent: (component: Omit<ComponentInstance, 'id'>) => string;\n  \n  /** Updates properties of an existing component */\n  updateComponent: (id: string, updates: Partial<ComponentInstance>) => void;\n  \n  /** Removes a component from the circuit */\n  removeComponent: (id: string) => void;\n  \n  /** Adds a new wire between two ports and returns its generated ID */\n  addWire: (from: Wire['from'], to: Wire['to'], style?: Wire['style']) => string;\n  \n  /** Updates properties of an existing wire */\n  updateWire: (id: string, updates: Partial<Wire>) => void;\n  \n  /** Removes a wire from the circuit */\n  removeWire: (id: string) => void;\n  \n  /** Selects a component, optionally adding to the current selection */\n  selectComponent: (id: string, addToSelection?: boolean) => void;\n  \n  /** Selects a wire, optionally adding to the current selection */\n  selectWire: (id: string, addToSelection?: boolean) => void;\n  \n  /** Deselects all currently selected components and wires */\n  deselectAll: () => void;\n  \n  /** Returns an array of currently selected components */\n  getSelectedComponents: () => ComponentInstance[];\n  \n  /** Returns an array of currently selected wires */\n  getSelectedWires: () => Wire[];\n  \n  /** Moves a component to a new position */\n  moveComponent: (id: string, newPosition: Point) => void;\n  \n  /** Moves all currently selected components by a delta */\n  moveSelectedComponents: (dx: number, dy: number) => void;\n  \n  /** Starts the process of drawing a wire from a component port */\n  startWireDrawing: (componentId: string, portId: string) => void;\n  \n  /** Completes the wire drawing process, connecting to another port */\n  completeWireDrawing: (componentId: string, portId: string) => boolean;\n  \n  /** Cancels the wire drawing process */\n  cancelWireDrawing: () => void;\n  \n  /** Checks if a connection between two ports is valid */\n  isValidConnection: (fromId: string, fromPortId: string, toId: string, toPortId: string) => boolean;\n  \n  /** Rotates a component by the specified degrees */\n  rotateComponent: (id: string, degrees: number) => void;\n  \n  /** Rotates all currently selected components by the specified degrees */\n  rotateSelectedComponents: (degrees: number) => void;\n  \n  /** Undoes the last action */\n  undo: () => void;\n  \n  /** Redoes the last undone action */\n  redo: () => void;\n  \n  /** Checks if an undo action is possible */\n  canUndo: () => boolean;\n  \n  /** Checks if a redo action is possible */\n  canRedo: () => boolean;\n}\n\n/**\n * React hook for managing circuit state\n * \n * @param initialState - Optional initial state for the circuit\n * @returns A tuple containing the circuit state and action functions\n */\nexport function useCircuit(initialState?: Partial<CircuitState>): [CircuitState, CircuitActions] {\n  // History for undo/redo\n  const undoStack = useRef<CircuitState[]>([]);\n  const redoStack = useRef<CircuitState[]>([]);\n  \n  const [state, setState] = useState<CircuitState>({\n    components: initialState?.components || [],\n    wires: initialState?.wires || [],\n    selectedComponentIds: initialState?.selectedComponentIds || [],\n    selectedWireIds: initialState?.selectedWireIds || []\n  });\n\n  // Helper to save state for undo\n  const saveStateForUndo = useCallback((prevState: CircuitState) => {\n    undoStack.current.push(JSON.parse(JSON.stringify(prevState)));\n    // Clear redo stack when a new action is performed\n    redoStack.current = [];\n  }, []);\n  \n  // Wrapped setState with history tracking\n  const setStateWithHistory = useCallback((updater: (prev: CircuitState) => CircuitState) => {\n    setState(prev => {\n      // Save the current state for undoing\n      saveStateForUndo(prev);\n      // Apply the update\n      return updater(prev);\n    });\n  }, [saveStateForUndo]);\n\n  // Generate a unique ID for new components/wires\n  const generateId = useCallback((prefix: string): string => {\n    return `${prefix}-${Math.random().toString(36).substring(2, 11)}`;\n  }, []);\n\n  // Add a component\n  const addComponent = useCallback((component: Omit<ComponentInstance, 'id'>): string => {\n    const id = generateId('component');\n    setStateWithHistory(prev => ({\n      ...prev,\n      components: [...prev.components, { ...component, id }]\n    }));\n    return id;\n  }, [generateId, setStateWithHistory]);\n\n  // Update a component\n  const updateComponent = useCallback((id: string, updates: Partial<ComponentInstance>): void => {\n    setStateWithHistory(prev => ({\n      ...prev,\n      components: prev.components.map(c => \n        c.id === id ? { ...c, ...updates } : c\n      )\n    }));\n  }, [setStateWithHistory]);\n\n  // Remove a component\n  const removeComponent = useCallback((id: string): void => {\n    setStateWithHistory(prev => {\n      // Remove the component\n      const components = prev.components.filter(c => c.id !== id);\n      \n      // Remove any wires connected to this component\n      const wires = prev.wires.filter(w => \n        w.from.componentId !== id && w.to.componentId !== id\n      );\n      \n      // Remove from selection if selected\n      const selectedComponentIds = prev.selectedComponentIds.filter(selectedId => selectedId !== id);\n      \n      return { \n        ...prev, \n        components, \n        wires, \n        selectedComponentIds \n      };\n    });\n  }, [setStateWithHistory]);\n\n  // Add a wire\n  const addWire = useCallback((from: Wire['from'], to: Wire['to'], style?: Wire['style']): string => {\n    const id = generateId('wire');\n    setStateWithHistory(prev => ({\n      ...prev,\n      wires: [...prev.wires, { id, from, to, style }]\n    }));\n    return id;\n  }, [generateId, setStateWithHistory]);\n\n  // Update a wire\n  const updateWire = useCallback((id: string, updates: Partial<Wire>): void => {\n    setStateWithHistory(prev => ({\n      ...prev,\n      wires: prev.wires.map(w => \n        w.id === id ? { ...w, ...updates } : w\n      )\n    }));\n  }, [setStateWithHistory]);\n\n  // Remove a wire\n  const removeWire = useCallback((id: string): void => {\n    setStateWithHistory(prev => ({\n      ...prev,\n      wires: prev.wires.filter(w => w.id !== id),\n      selectedWireIds: prev.selectedWireIds.filter(wireId => wireId !== id)\n    }));\n  }, [setStateWithHistory]);\n\n  // Select a component\n  const selectComponent = useCallback((id: string, addToSelection: boolean = false): void => {\n    setState(prev => {\n      // If adding to selection, keep previous selections, otherwise start fresh\n      const selectedComponentIds = addToSelection \n        ? [...prev.selectedComponentIds, id]\n        : [id];\n      \n      return {\n        ...prev,\n        selectedComponentIds: [...new Set(selectedComponentIds)] // Deduplicate\n      };\n    });\n  }, []);\n\n  // Select a wire\n  const selectWire = useCallback((id: string, addToSelection: boolean = false): void => {\n    setState(prev => {\n      // If adding to selection, keep previous selections, otherwise start fresh\n      const selectedWireIds = addToSelection \n        ? [...prev.selectedWireIds, id]\n        : [id];\n      \n      return {\n        ...prev,\n        selectedWireIds: [...new Set(selectedWireIds)] // Deduplicate\n      };\n    });\n  }, []);\n\n  // Deselect all components and wires\n  const deselectAll = useCallback((): void => {\n    setState(prev => ({\n      ...prev,\n      selectedComponentIds: [],\n      selectedWireIds: []\n    }));\n  }, []);\n\n  // Get selected components\n  const getSelectedComponents = useCallback((): ComponentInstance[] => {\n    return state.components.filter(c => \n      state.selectedComponentIds.includes(c.id)\n    );\n  }, [state.components, state.selectedComponentIds]);\n\n  // Get selected wires\n  const getSelectedWires = useCallback((): Wire[] => {\n    return state.wires.filter(w => \n      state.selectedWireIds.includes(w.id)\n    );\n  }, [state.wires, state.selectedWireIds]);\n\n  // Move a component to a new position\n  const moveComponent = useCallback((id: string, newPosition: Point): void => {\n    setStateWithHistory(prev => ({\n      ...prev,\n      components: prev.components.map(c => \n        c.id === id ? { ...c, position: newPosition } : c\n      )\n    }));\n  }, [setStateWithHistory]);\n\n  // Move all selected components by a delta\n  const moveSelectedComponents = useCallback((dx: number, dy: number): void => {\n    setStateWithHistory(prev => ({\n      ...prev,\n      components: prev.components.map(c => {\n        if (prev.selectedComponentIds.includes(c.id)) {\n          return {\n            ...c,\n            position: {\n              x: c.position.x + dx,\n              y: c.position.y + dy\n            }\n          };\n        }\n        return c;\n      })\n    }));\n  }, [setStateWithHistory]);\n\n  // Rotate a component by the specified degrees\n  const rotateComponent = useCallback((id: string, degrees: number): void => {\n    setStateWithHistory(prev => ({\n      ...prev,\n      components: prev.components.map(c => {\n        if (c.id === id) {\n          // Calculate new rotation, normalizing between 0-359\n          const currentRotation = c.rotation || 0;\n          const newRotation = (currentRotation + degrees) % 360;\n          return {\n            ...c,\n            rotation: newRotation < 0 ? newRotation + 360 : newRotation\n          };\n        }\n        return c;\n      })\n    }));\n  }, [setStateWithHistory]);\n\n  // Rotate all selected components\n  const rotateSelectedComponents = useCallback((degrees: number): void => {\n    setStateWithHistory(prev => ({\n      ...prev,\n      components: prev.components.map(c => {\n        if (prev.selectedComponentIds.includes(c.id)) {\n          // Calculate new rotation, normalizing between 0-359\n          const currentRotation = c.rotation || 0;\n          const newRotation = (currentRotation + degrees) % 360;\n          return {\n            ...c,\n            rotation: newRotation < 0 ? newRotation + 360 : newRotation\n          };\n        }\n        return c;\n      })\n    }));\n  }, [setStateWithHistory]);\n\n  // Undo the last action\n  const undo = useCallback((): void => {\n    if (undoStack.current.length > 0) {\n      // Save current state to redo stack\n      redoStack.current.push(JSON.parse(JSON.stringify(state)));\n      \n      // Pop the last state from undo stack\n      const prevState = undoStack.current.pop()!;\n      \n      // Apply the previous state\n      setState(prevState);\n    }\n  }, [state]);\n\n  // Redo the last undone action\n  const redo = useCallback((): void => {\n    if (redoStack.current.length > 0) {\n      // Save current state to undo stack\n      undoStack.current.push(JSON.parse(JSON.stringify(state)));\n      \n      // Pop the last state from redo stack\n      const nextState = redoStack.current.pop()!;\n      \n      // Apply the next state\n      setState(nextState);\n    }\n  }, [state]);\n\n  // Check if undo is possible\n  const canUndo = useCallback((): boolean => {\n    return undoStack.current.length > 0;\n  }, []);\n\n  // Check if redo is possible\n  const canRedo = useCallback((): boolean => {\n    return redoStack.current.length > 0;\n  }, []);\n\n  // Wire drawing state\n  const [wireDrawingState, setWireDrawingState] = useState<{\n    isDrawing: boolean;\n    fromComponentId: string | null;\n    fromPortId: string | null;\n  }>({\n    isDrawing: false,\n    fromComponentId: null,\n    fromPortId: null\n  });\n\n  // Start drawing a wire from a component port\n  const startWireDrawing = useCallback((componentId: string, portId: string): void => {\n    setWireDrawingState({\n      isDrawing: true,\n      fromComponentId: componentId,\n      fromPortId: portId\n    });\n  }, []);\n\n  // Complete wire drawing by connecting to another port\n  const completeWireDrawing = useCallback((toComponentId: string, toPortId: string): boolean => {\n    const { isDrawing, fromComponentId, fromPortId } = wireDrawingState;\n    \n    if (!isDrawing || !fromComponentId || !fromPortId) {\n      return false;\n    }\n\n    // Check if this is a valid connection\n    const isValid = isValidConnection(\n      fromComponentId,\n      fromPortId,\n      toComponentId,\n      toPortId\n    );\n\n    if (isValid) {\n      // Create the wire\n      addWire(\n        { componentId: fromComponentId, portId: fromPortId },\n        { componentId: toComponentId, portId: toPortId }\n      );\n      \n      // Reset wire drawing state\n      setWireDrawingState({\n        isDrawing: false,\n        fromComponentId: null,\n        fromPortId: null\n      });\n      \n      return true;\n    }\n    \n    return false;\n  }, [wireDrawingState, addWire]);\n\n  // Cancel wire drawing\n  const cancelWireDrawing = useCallback((): void => {\n    setWireDrawingState({\n      isDrawing: false,\n      fromComponentId: null,\n      fromPortId: null\n    });\n  }, []);\n\n  // Check if a connection between two ports is valid\n  const isValidConnection = useCallback((\n    fromId: string, \n    fromPortId: string, \n    toId: string, \n    toPortId: string\n  ): boolean => {\n    // Don't allow connections to the same component\n    if (fromId === toId) {\n      return false;\n    }\n    \n    // Don't allow duplicate connections\n    const isDuplicate = state.wires.some(wire => \n      (wire.from.componentId === fromId && wire.from.portId === fromPortId &&\n       wire.to.componentId === toId && wire.to.portId === toPortId) ||\n      (wire.from.componentId === toId && wire.from.portId === toPortId &&\n       wire.to.componentId === fromId && wire.to.portId === fromPortId)\n    );\n    \n    if (isDuplicate) {\n      return false;\n    }\n    \n    // Get component schemas for port type checking\n    const fromComponent = state.components.find(c => c.id === fromId);\n    const toComponent = state.components.find(c => c.id === toId);\n    \n    if (!fromComponent || !toComponent) {\n      return false;\n    }\n    \n    const fromSchema = getComponentSchema(fromComponent.type);\n    const toSchema = getComponentSchema(toComponent.type);\n    \n    if (!fromSchema || !toSchema) {\n      return false;\n    }\n    \n    // Get port info\n    const fromPort = fromSchema.ports.find(p => p.id === fromPortId);\n    const toPort = toSchema.ports.find(p => p.id === toPortId);\n    \n    if (!fromPort || !toPort) {\n      return false;\n    }\n    \n    // Basic port compatibility check - outputs can connect to inputs\n    if (fromPort.type === 'output' && toPort.type === 'input') {\n      return true;\n    }\n    \n    // Inputs can connect to outputs\n    if (fromPort.type === 'input' && toPort.type === 'output') {\n      return true;\n    }\n    \n    // Bidirectional ports can connect to anything\n    if (fromPort.type === 'inout' || toPort.type === 'inout') {\n      return true;\n    }\n    \n    return false;\n  }, [state.components, state.wires]);\n\n  const actions: CircuitActions = {\n    addComponent,\n    updateComponent,\n    removeComponent,\n    addWire,\n    updateWire,\n    removeWire,\n    selectComponent,\n    selectWire,\n    deselectAll,\n    getSelectedComponents,\n    getSelectedWires,\n    moveComponent,\n    moveSelectedComponents,\n    startWireDrawing,\n    completeWireDrawing,\n    cancelWireDrawing,\n    isValidConnection,\n    rotateComponent,\n    rotateSelectedComponents,\n    undo,\n    redo,\n    canUndo,\n    canRedo\n  };\n\n  return [state, actions];\n}\n\nexport default useCircuit;\n","/**\n * usePortPosition Hook\n * \n * A React hook for tracking the position of component ports.\n * Compatible with infinite circuit canvas with panning and zooming.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { Point, Wire } from '../types';\nimport { getPortPosition } from '../utils/getPortPosition';\n\ninterface PortPositionState {\n  from: Point | null;\n  to: Point | null;\n  error: string | null;\n}\n\n/**\n * A hook to track the positions of ports connected by a wire\n * \n * @param wire - The wire connecting the ports\n * @param deps - Additional dependencies that should trigger position updates\n * @returns Object containing port positions and error state\n */\nexport function usePortPosition(\n  wire: Wire | null,\n  deps: any[] = []\n): PortPositionState {\n  const [state, setState] = useState<PortPositionState>({\n    from: null,\n    to: null,\n    error: null\n  });\n  \n  // Use callback to get port positions to avoid useEffect dependencies\n  const updatePositions = useCallback(() => {\n    if (!wire) {\n      setState({\n        from: null,\n        to: null,\n        error: 'No wire provided'\n      });\n      return;\n    }\n    \n    // Small delay to ensure DOM has been updated\n    setTimeout(() => {\n      try {\n        // Get source port position\n        const fromPos = getPortPosition(wire.from.componentId, wire.from.portId);\n        \n        // Get destination port position\n        const toPos = getPortPosition(wire.to.componentId, wire.to.portId);\n        \n        setState({\n          from: fromPos,\n          to: toPos,\n          error: (!fromPos || !toPos) \n            ? `Could not find ports for wire ${wire.id}`\n            : null\n        });\n      } catch (error) {\n        setState({\n          from: null,\n          to: null,\n          error: `Error getting port positions: ${error}`\n        });\n      }\n    }, 0);\n  }, [wire]);\n  \n  // Update positions when wire or dependencies change\n  useEffect(() => {\n    updatePositions();\n    \n    // Add event listeners for window resize and canvas transformations to update positions\n    window.addEventListener('resize', updatePositions);\n    \n    // Listen to custom event for viewport transformations\n    const handleViewportChange = () => {\n      updatePositions();\n    };\n    \n    // Find circuit canvas element to attach transformation event listeners\n    const canvas = document.querySelector('[data-circuit-canvas]');\n    if (canvas) {\n      // Listen to mouse wheel events for zoom changes\n      canvas.addEventListener('wheel', updatePositions, { passive: true });\n      \n      // Custom event for pan/zoom that can be dispatched by CircuitCanvas\n      canvas.addEventListener('viewport-change', handleViewportChange);\n    }\n    \n    return () => {\n      window.removeEventListener('resize', updatePositions);\n      \n      if (canvas) {\n        canvas.removeEventListener('wheel', updatePositions);\n        canvas.removeEventListener('viewport-change', handleViewportChange);\n      }\n    };\n  }, [wire, updatePositions, ...deps]);\n  \n  return state;\n}\n\n/**\n * Hook to track a single port position\n * \n * @param componentId - The component ID\n * @param portId - The port ID\n * @param deps - Additional dependencies that should trigger position updates\n * @returns The port position or null if not found\n */\nexport function useSinglePortPosition(\n  componentId: string | null,\n  portId: string | null,\n  deps: any[] = []\n): Point | null {\n  const [position, setPosition] = useState<Point | null>(null);\n  \n  const updatePosition = useCallback(() => {\n    if (!componentId || !portId) {\n      setPosition(null);\n      return;\n    }\n    \n    setTimeout(() => {\n      try {\n        const pos = getPortPosition(componentId, portId);\n        setPosition(pos);\n      } catch (error) {\n        console.warn(`Error getting port position: ${error}`);\n        setPosition(null);\n      }\n    }, 0);\n  }, [componentId, portId]);\n  \n  useEffect(() => {\n    updatePosition();\n    \n    // Add event listeners for window resize and canvas transformations\n    window.addEventListener('resize', updatePosition);\n    \n    // Listen to custom event for viewport transformations\n    const handleViewportChange = () => {\n      updatePosition();\n    };\n    \n    // Find circuit canvas element to attach transformation event listeners\n    const canvas = document.querySelector('[data-circuit-canvas]');\n    if (canvas) {\n      // Listen to mouse wheel events for zoom changes\n      canvas.addEventListener('wheel', updatePosition, { passive: true });\n      \n      // Custom event for pan/zoom that can be dispatched by CircuitCanvas\n      canvas.addEventListener('viewport-change', handleViewportChange);\n    }\n    \n    return () => {\n      window.removeEventListener('resize', updatePosition);\n      \n      if (canvas) {\n        canvas.removeEventListener('wheel', updatePosition);\n        canvas.removeEventListener('viewport-change', handleViewportChange);\n      }\n    };\n  }, [componentId, portId, updatePosition, ...deps]);\n  \n  return position;\n}\n\nexport default usePortPosition;\n","/**\n * PropertyPanel Component\n * \n * A component for editing the properties of a circuit component.\n */\n\nimport React from 'react';\nimport { ComponentInstance } from '../types';\nimport { getComponentSchema } from '../registry';\n\nexport interface PropertyPanelProps {\n  component: ComponentInstance | null;\n  onPropertyChange?: (id: string, key: string, value: any) => void;\n}\n\nconst PropertyPanel: React.FC<PropertyPanelProps> = ({\n  component,\n  onPropertyChange\n}) => {\n  if (!component) {\n    return (\n      <div className=\"property-panel-empty\" style={{\n        backgroundColor: '#1a202c',\n        borderRadius: '12px',\n        padding: '24px',\n        display: 'flex',\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'center',\n        color: '#a0aec0',\n        height: '100%',\n        boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',\n        border: '1px solidrgb(21, 25, 32)',\n        textAlign: 'center'\n      }}>\n        <svg \n          width=\"48\" \n          height=\"48\" \n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          style={{ opacity: 0.6, marginBottom: '16px' }}\n        >\n          <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"></rect>\n          <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"></rect>\n          <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\"></line>\n          <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\"></line>\n        </svg>\n        <p style={{ margin: '0', fontSize: '15px', fontWeight: 500 }}>No component selected</p>\n        <p style={{ margin: '8px 0 0 0', fontSize: '13px', opacity: 0.7 }}>\n          Select a component to edit its properties\n        </p>\n      </div>\n    );\n  }\n\n  const schema = getComponentSchema(component.type);\n  \n  if (!schema) {\n    return (\n      <div className=\"property-panel-error\" style={{\n        backgroundColor: '#1a202c',\n        borderRadius: '12px',\n        padding: '24px',\n        display: 'flex',\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'center',\n        color: '#f56565',\n        boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',\n        border: '1px solidrgb(21, 26, 34)',\n        textAlign: 'center'\n      }}>\n        <svg \n          width=\"48\" \n          height=\"48\" \n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          style={{ opacity: 0.8, marginBottom: '16px' }}\n        >\n          <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n          <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line>\n          <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\n        </svg>\n        <p style={{ margin: '0', fontSize: '15px', fontWeight: 500 }}>\n          Error: Unknown component type '{component.type}'\n        </p>\n        <p style={{ margin: '8px 0 0 0', fontSize: '13px', opacity: 0.8 }}>\n          This component type is not registered in the system\n        </p>\n      </div>\n    );\n  }\n\n  const handleChange = (\n    key: string,\n    event: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>\n  ) => {\n    const property = schema.properties.find(prop => prop.key === key);\n    if (!property) return;\n\n    let value: any = event.target.value;\n    \n    // Convert value based on property type\n    if (property.type === 'number') {\n      value = parseFloat(value);\n      \n      // Validate min/max if specified\n      if (property.min !== undefined && value < property.min) {\n        value = property.min;\n      }\n      if (property.max !== undefined && value > property.max) {\n        value = property.max;\n      }\n    } else if (property.type === 'boolean') {\n      value = (event.target as HTMLInputElement).checked;\n    }\n\n    onPropertyChange?.(component.id, key, value);\n  };\n\n  return (\n    <div className=\"property-panel\" style={{\n      backgroundColor: '#1a202c',\n      borderRadius: '12px',\n      boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n      overflow: 'hidden',\n      border: '1px solid #2d3748',\n      color: '#e2e8f0'\n    }}>\n      <div className=\"property-panel-header\" style={{\n        padding: '16px',\n        borderBottom: '1px solid #2d3748',\n        background: '#202938'\n      }}>\n        <h3 style={{\n          margin: '0 0 4px 0',\n          fontSize: '18px',\n          fontWeight: 600,\n          color: '#e2e8f0'\n        }}>{schema.name} Properties</h3>\n        <span className=\"component-id\" style={{\n          fontSize: '12px',\n          color: '#a0aec0',\n          opacity: 0.7\n        }}>ID: {component.id}</span>\n      </div>\n      \n      <div className=\"property-panel-content\" style={{\n        padding: '16px'\n      }}>\n        {schema.properties.map(property => {\n          const currentValue = component.props[property.key] ?? property.default;\n          const inputId = `prop-${component.id}-${property.key}`;\n          \n          return (\n            <div key={property.key} className=\"property-item\" style={{\n              marginBottom: '16px'\n            }}>\n              <label \n                htmlFor={inputId}\n                style={{\n                  display: 'block',\n                  marginBottom: '6px',\n                  fontSize: '14px',\n                  fontWeight: 500,\n                  color: '#cbd5e0',\n                }}\n              >\n                {property.label}\n                {property.unit && <span className=\"unit\" style={{\n                  marginLeft: '4px',\n                  color: '#a0aec0',\n                  fontSize: '12px'\n                }}>{property.unit}</span>}\n              </label>\n              \n              {property.type === 'number' && (\n                <input\n                  id={inputId}\n                  type=\"number\"\n                  value={currentValue}\n                  onChange={e => handleChange(property.key, e)}\n                  min={property.min}\n                  max={property.max}\n                  step=\"any\"\n                  style={{\n                    width: '100%',\n                    padding: '8px 12px',\n                    borderRadius: '6px',\n                    border: '1px solid #4a5568',\n                    backgroundColor: '#2d3748',\n                    color: '#e2e8f0',\n                    fontSize: '14px',\n                    outline: 'none',\n                    transition: 'all 0.2s ease',\n                    boxSizing: 'border-box'\n                  }}\n                  onFocus={(e) => {\n                    e.target.style.borderColor = '#63b3ed';\n                    e.target.style.boxShadow = '0 0 0 3px rgba(66, 153, 225, 0.25)';\n                  }}\n                  onBlur={(e) => {\n                    e.target.style.borderColor = '#4a5568';\n                    e.target.style.boxShadow = 'none';\n                  }}\n                />\n              )}\n              \n              {property.type === 'text' && (\n                <input\n                  id={inputId}\n                  type=\"text\"\n                  value={currentValue}\n                  onChange={e => handleChange(property.key, e)}\n                  style={{\n                    width: '100%',\n                    padding: '8px 12px',\n                    borderRadius: '6px',\n                    border: '1px solid #4a5568',\n                    backgroundColor: '#2d3748',\n                    color: '#e2e8f0',\n                    fontSize: '14px',\n                    outline: 'none',\n                    transition: 'all 0.2s ease',\n                    boxSizing: 'border-box'\n                  }}\n                  onFocus={(e) => {\n                    e.target.style.borderColor = '#63b3ed';\n                    e.target.style.boxShadow = '0 0 0 3px rgba(66, 153, 225, 0.25)';\n                  }}\n                  onBlur={(e) => {\n                    e.target.style.borderColor = '#4a5568';\n                    e.target.style.boxShadow = 'none';\n                  }}\n                />\n              )}\n              \n              {property.type === 'boolean' && (\n                <div style={{ display: 'flex', alignItems: 'center' }}>\n                  <input\n                    id={inputId}\n                    type=\"checkbox\"\n                    checked={currentValue}\n                    onChange={e => handleChange(property.key, e)}\n                    style={{\n                      width: '18px',\n                      height: '18px',\n                      cursor: 'pointer',\n                      accentColor: '#4299e1',\n                      borderRadius: '4px',\n                      marginRight: '8px'\n                    }}\n                  />\n                  <span style={{ fontSize: '14px', color: '#cbd5e0' }}>\n                    {currentValue ? 'Enabled' : 'Disabled'}\n                  </span>\n                </div>\n              )}\n              \n              {property.type === 'select' && property.options && (\n                <select\n                  id={inputId}\n                  value={currentValue}\n                  onChange={e => handleChange(property.key, e)}\n                  style={{\n                    width: '100%',\n                    padding: '8px 12px',\n                    borderRadius: '6px',\n                    border: '1px solid #4a5568',\n                    backgroundColor: '#2d3748',\n                    color: '#e2e8f0',\n                    fontSize: '14px',\n                    outline: 'none',\n                    transition: 'all 0.2s ease',\n                    cursor: 'pointer',\n                    appearance: 'none',\n                    backgroundImage: 'url(\"data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23a0aec0%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E\")',\n                    backgroundRepeat: 'no-repeat',\n                    backgroundPosition: 'right 12px top 50%',\n                    backgroundSize: '12px auto',\n                    paddingRight: '30px'\n                  }}\n                  onFocus={(e) => {\n                    e.target.style.borderColor = '#63b3ed';\n                    e.target.style.boxShadow = '0 0 0 3px rgba(66, 153, 225, 0.25)';\n                  }}\n                  onBlur={(e) => {\n                    e.target.style.borderColor = '#4a5568';\n                    e.target.style.boxShadow = 'none';\n                  }}\n                >\n                  {property.options.map(option => (\n                    <option key={option.value} value={option.value}>\n                      {option.label}\n                    </option>\n                  ))}\n                </select>\n              )}\n              \n              {property.type === 'color' && (\n                <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n                  <input\n                    id={inputId}\n                    type=\"color\"\n                    value={currentValue}\n                    onChange={e => handleChange(property.key, e)}\n                    style={{\n                      width: '36px',\n                      height: '36px',\n                      border: 'none',\n                      borderRadius: '6px',\n                      backgroundColor: 'transparent',\n                      cursor: 'pointer'\n                    }}\n                  />\n                  <input\n                    type=\"text\"\n                    value={currentValue}\n                    onChange={e => handleChange(property.key, e)}\n                    style={{\n                      flexGrow: 1,\n                      padding: '8px 12px',\n                      borderRadius: '6px',\n                      border: '1px solid #4a5568',\n                      backgroundColor: '#2d3748',\n                      color: '#e2e8f0',\n                      fontSize: '14px'\n                    }}\n                    onFocus={(e) => {\n                      e.target.style.borderColor = '#63b3ed';\n                      e.target.style.boxShadow = '0 0 0 3px rgba(66, 153, 225, 0.25)';\n                    }}\n                    onBlur={(e) => {\n                      e.target.style.borderColor = '#4a5568';\n                      e.target.style.boxShadow = 'none';\n                    }}\n                  />\n                </div>\n              )}\n            </div>\n          );\n        })}\n      </div>\n      \n      <div className=\"property-panel-position\" style={{\n        padding: '0 16px 16px',\n        borderTop: '1px solid #2d3748',\n        marginTop: '8px'\n      }}>\n        <h4 style={{\n          fontSize: '16px',\n          fontWeight: 500,\n          margin: '16px 0 12px',\n          color: '#cbd5e0'\n        }}>Position</h4>\n        <div className=\"position-inputs\" style={{\n          display: 'grid',\n          gridTemplateColumns: '1fr 1fr',\n          gap: '12px'\n        }}>\n          <div style={{ display: 'flex', flexDirection: 'column' }}>\n            <label style={{\n              fontSize: '14px',\n              fontWeight: 500,\n              marginBottom: '6px',\n              color: '#cbd5e0'\n            }}>\n              X:\n            </label>\n            <input\n              type=\"number\"\n              value={component.position.x}\n              onChange={e => onPropertyChange?.(\n                component.id,\n                'position',\n                { ...component.position, x: parseFloat(e.target.value) }\n              )}\n              style={{\n                width: '100%',\n                padding: '8px 12px',\n                borderRadius: '6px',\n                border: '1px solid #4a5568',\n                backgroundColor: '#2d3748',\n                color: '#e2e8f0',\n                fontSize: '14px',\n                outline: 'none',\n                transition: 'all 0.2s ease'\n              }}\n              onFocus={(e) => {\n                e.target.style.borderColor = '#63b3ed';\n                e.target.style.boxShadow = '0 0 0 3px rgba(66, 153, 225, 0.25)';\n              }}\n              onBlur={(e) => {\n                e.target.style.borderColor = '#4a5568';\n                e.target.style.boxShadow = 'none';\n              }}\n            />\n          </div>\n          <div style={{ display: 'flex', flexDirection: 'column' }}>\n            <label style={{\n              fontSize: '14px',\n              fontWeight: 500,\n              marginBottom: '6px',\n              color: '#cbd5e0'\n            }}>\n              Y:\n            </label>\n            <input\n              type=\"number\"\n              value={component.position.y}\n              onChange={e => onPropertyChange?.(\n                component.id,\n                'position',\n                { ...component.position, y: parseFloat(e.target.value) }\n              )}\n              style={{\n                width: '100%',\n                padding: '8px 12px',\n                borderRadius: '6px',\n                border: '1px solid #4a5568',\n                backgroundColor: '#2d3748',\n                color: '#e2e8f0',\n                fontSize: '14px',\n                outline: 'none',\n                transition: 'all 0.2s ease'\n              }}\n              onFocus={(e) => {\n                e.target.style.borderColor = '#63b3ed';\n                e.target.style.boxShadow = '0 0 0 3px rgba(66, 153, 225, 0.25)';\n              }}\n              onBlur={(e) => {\n                e.target.style.borderColor = '#4a5568';\n                e.target.style.boxShadow = 'none';\n              }}\n            />\n          </div>\n        </div>\n      </div>\n      \n      {component.rotation !== undefined && (\n        <div className=\"property-panel-rotation\" style={{\n          padding: '0 16px 16px',\n          borderTop: '1px solid #2d3748',\n        }}>\n          <h4 style={{\n            fontSize: '16px',\n            fontWeight: 500,\n            margin: '16px 0 12px',\n            color: '#cbd5e0'\n          }}>Rotation</h4>\n          <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n            <input\n              type=\"range\"\n              min=\"0\"\n              max=\"360\"\n              step=\"90\"\n              value={component.rotation}\n              onChange={e => onPropertyChange?.(\n                component.id,\n                'rotation',\n                parseFloat(e.target.value)\n              )}\n              style={{\n                flex: 1,\n                height: '6px',\n                borderRadius: '3px',\n                backgroundColor: '#4a5568',\n                appearance: 'none',\n                outline: 'none',\n                cursor: 'pointer',\n                accentColor: '#4299e1'\n              }}\n            />\n            <div style={{\n              padding: '6px 10px',\n              backgroundColor: '#2d3748',\n              borderRadius: '6px',\n              border: '1px solid #4a5568',\n              fontSize: '14px',\n              fontWeight: 500,\n              color: '#e2e8f0',\n              minWidth: '48px',\n              textAlign: 'center'\n            }}>\n              {component.rotation}°\n            </div>\n          </div>\n          <div style={{ \n            display: 'flex', \n            justifyContent: 'space-between', \n            marginTop: '8px'\n          }}>\n            {[0, 90, 180, 270, 360].map(angle => (\n              <button \n                key={angle} \n                onClick={() => onPropertyChange?.(\n                  component.id,\n                  'rotation',\n                  angle\n                )}\n                style={{\n                  background: component.rotation === angle ? '#4299e1' : '#2d3748',\n                  border: 'none',\n                  borderRadius: '4px',\n                  width: '32px',\n                  height: '24px',\n                  fontSize: '12px',\n                  color: component.rotation === angle ? '#fff' : '#cbd5e0',\n                  cursor: 'pointer',\n                  transition: 'all 0.2s ease',\n                  display: 'flex',\n                  alignItems: 'center',\n                  justifyContent: 'center'\n                }}\n                onMouseEnter={(e) => {\n                  if(component.rotation !== angle) {\n                    e.currentTarget.style.background = '#3a4a61';\n                  }\n                }}\n                onMouseLeave={(e) => {\n                  if(component.rotation !== angle) {\n                    e.currentTarget.style.background = '#2d3748';\n                  }\n                }}\n              >\n                {angle}°\n              </button>\n            ))}\n          </div>\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default PropertyPanel;\n","/**\n * ComponentPalette Component\n * \n * A component for selecting and adding circuit components to a canvas.\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { getAllComponents, getComponentsByCategory } from '../registry';\nimport { ComponentSchema } from '../types';\n\nexport interface ComponentPaletteProps {\n  onSelectComponent: (componentType: string) => void;\n  onDragComponent?: (componentType: string, event: React.DragEvent) => void;\n  className?: string;\n  style?: React.CSSProperties;\n}\n\nconst ComponentPalette: React.FC<ComponentPaletteProps> = ({\n  onSelectComponent,\n  onDragComponent,\n  className = '',\n  style = {}\n}) => {\n  const [searchTerm, setSearchTerm] = useState('');\n  const [activeCategory, setActiveCategory] = useState<string | null>(null);\n  \n  // Get all components and extract unique categories\n  const allComponents = getAllComponents();\n  const allCategories = Array.from(\n    new Set(allComponents.map(comp => comp.category))\n  ).sort();\n  \n  // Filter components based on search and category\n  const filteredComponents = activeCategory\n    ? getComponentsByCategory(activeCategory)\n    : allComponents;\n  \n  const searchFilteredComponents = searchTerm\n    ? filteredComponents.filter(comp => \n        comp.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n        comp.description.toLowerCase().includes(searchTerm.toLowerCase())\n      )\n    : filteredComponents;\n  \n  // Refs for scroll shadow effects\n  const tabsRef = useRef<HTMLDivElement>(null);\n  const listRef = useRef<HTMLDivElement>(null);\n  const [showTabsLeftShadow, setShowTabsLeftShadow] = useState(false);\n  const [showTabsRightShadow, setShowTabsRightShadow] = useState(false);\n  const [showListTopShadow, setShowListTopShadow] = useState(false);\n  const [showListBottomShadow, setShowListBottomShadow] = useState(false);\n\n  // Handle scroll shadows for tabs\n  const handleTabsScroll = () => {\n    if (tabsRef.current) {\n      const { scrollLeft, scrollWidth, clientWidth } = tabsRef.current;\n      setShowTabsLeftShadow(scrollLeft > 0);\n      setShowTabsRightShadow(scrollLeft < scrollWidth - clientWidth - 1);\n    }\n  };\n\n  // Handle scroll shadows for component list\n  const handleListScroll = () => {\n    if (listRef.current) {\n      const { scrollTop, scrollHeight, clientHeight } = listRef.current;\n      setShowListTopShadow(scrollTop > 0);\n      setShowListBottomShadow(scrollTop < scrollHeight - clientHeight - 1);\n    }\n  };\n\n  // Initialize scroll shadows\n  useEffect(() => {\n    handleTabsScroll();\n    handleListScroll();\n    \n    // Add resize event listener\n    window.addEventListener('resize', () => {\n      handleTabsScroll();\n      handleListScroll();\n    });\n    \n    return () => {\n      window.removeEventListener('resize', () => {\n        handleTabsScroll();\n        handleListScroll();\n      });\n    };\n  }, []);\n\n  return (\n    <div \n      className={`component-palette ${className}`} \n      style={{\n        display: 'flex',\n        flexDirection: 'column',\n        background: '#2d3748',\n        borderRadius: '12px',\n        boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n        overflow: 'hidden',\n        height: '100%',\n        border: '1px solid #1a202c',\n        ...style\n      }}\n    >\n      <div \n        className=\"palette-header\"\n        style={{\n          padding: '16px',\n          borderBottom: '1px solid #1a202c',\n          background: '#202938'\n        }}\n      >\n        <h3 style={{ \n          margin: '0 0 12px 0', \n          fontSize: '18px', \n          fontWeight: 600,\n          color: '#e2e8f0'\n        }}>\n          Components\n        </h3>\n        <div style={{ \n          position: 'relative', \n          display: 'flex',\n          alignItems: 'center'\n        }}>\n          <input\n            type=\"text\"\n            placeholder=\"Search components...\"\n            value={searchTerm}\n            onChange={e => setSearchTerm(e.target.value)}\n            style={{\n              width: '100%',\n              padding: '10px 12px 10px 36px',\n              fontSize: '14px',\n              border: '1px solid #4a5568',\n              borderRadius: '8px',\n              backgroundColor: '#1a202c',\n              color: '#e2e8f0',\n              transition: 'all 0.2s ease',\n              outline: 'none',\n              boxSizing: 'border-box',\n              boxShadow: 'inset 0 1px 2px rgba(0, 0, 0, 0.2)'\n            }}\n            onFocus={(e) => {\n              e.target.style.borderColor = '#63b3ed';\n              e.target.style.boxShadow = 'inset 0 1px 2px rgba(0, 0, 0, 0.2), 0 0 0 3px rgba(66, 153, 225, 0.25)';\n            }}\n            onBlur={(e) => {\n              e.target.style.borderColor = '#4a5568';\n              e.target.style.boxShadow = 'inset 0 1px 2px rgba(0, 0, 0, 0.2)';\n            }}\n          />\n          <svg \n            width=\"18\" \n            height=\"18\" \n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"#a0aec0\"\n            strokeWidth=\"2\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            style={{\n              position: 'absolute',\n              left: '12px',\n              pointerEvents: 'none'\n            }}\n          >\n            <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n            <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n          </svg>\n          {searchTerm && (\n            <button\n              onClick={() => setSearchTerm('')}\n              style={{\n                position: 'absolute',\n                right: '12px',\n                background: 'none',\n                border: 'none',\n                cursor: 'pointer',\n                padding: '0',\n                display: 'flex',\n                alignItems: 'center',\n                justifyContent: 'center'\n              }}\n            >\n              <svg \n                width=\"16\" \n                height=\"16\" \n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"#a0aec0\"\n                strokeWidth=\"2\"\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n              >\n                <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n                <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n              </svg>\n            </button>\n          )}\n        </div>\n      </div>\n      \n      <div style={{ position: 'relative' }}>\n        <div \n          ref={tabsRef}\n          className=\"category-tabs\"\n          style={{\n            display: 'flex',\n            overflowX: 'auto',\n            padding: '0 16px',\n            scrollbarWidth: 'none',\n            msOverflowStyle: 'none',\n            background: '#202938',\n            position: 'relative',\n            zIndex: 1\n          }}\n          onScroll={handleTabsScroll}\n        >\n          <div style={{ \n            display: 'flex', \n            padding: '8px 0',\n            gap: '8px'\n          }}>\n            <button \n              className={activeCategory === null ? 'active-category' : ''}\n              onClick={() => setActiveCategory(null)}\n              style={{\n                padding: '8px 16px',\n                borderRadius: '6px',\n                fontSize: '14px',\n                fontWeight: 500,\n                border: 'none',\n                background: activeCategory === null ? '#3182ce' : 'transparent',\n                color: activeCategory === null ? '#fff' : '#a0aec0',\n                cursor: 'pointer',\n                whiteSpace: 'nowrap',\n                transition: 'all 0.2s ease',\n                boxShadow: activeCategory === null ? '0 1px 3px rgba(0, 0, 0, 0.2)' : 'none'\n              }}\n              onMouseEnter={(e) => {\n                if (activeCategory !== null) {\n                  e.currentTarget.style.background = '#2d3748';\n                }\n              }}\n              onMouseLeave={(e) => {\n                if (activeCategory !== null) {\n                  e.currentTarget.style.background = 'transparent';\n                }\n              }}\n            >\n              All\n            </button>\n            {allCategories.map(category => (\n              <button\n                key={category}\n                className={activeCategory === category ? 'active-category' : ''}\n                onClick={() => setActiveCategory(category)}\n                style={{\n                  padding: '8px 16px',\n                  borderRadius: '6px',\n                  fontSize: '14px',\n                  fontWeight: 500,\n                  border: 'none',\n                  background: activeCategory === category ? '#3182ce' : 'transparent',\n                  color: activeCategory === category ? '#fff' : '#a0aec0',\n                  cursor: 'pointer',\n                  whiteSpace: 'nowrap',\n                  transition: 'all 0.2s ease',\n                  boxShadow: activeCategory === category ? '0 1px 3px rgba(0, 0, 0, 0.2)' : 'none'\n                }}\n                onMouseEnter={(e) => {\n                  if (activeCategory !== category) {\n                    e.currentTarget.style.background = '#2d3748';\n                  }\n                }}\n                onMouseLeave={(e) => {\n                  if (activeCategory !== category) {\n                    e.currentTarget.style.background = 'transparent';\n                  }\n                }}\n              >\n                {category.charAt(0).toUpperCase() + category.slice(1)}\n              </button>\n            ))}\n          </div>\n        </div>\n        \n        {/* Shadow effects for tab scroll */}\n        {showTabsLeftShadow && (\n          <div style={{\n            position: 'absolute',\n            top: 0,\n            left: 0,\n            width: '16px',\n            height: '100%',\n            background: 'linear-gradient(to right, rgba(32, 41, 56, 0.9), rgba(32, 41, 56, 0))',\n            zIndex: 2,\n            pointerEvents: 'none'\n          }}></div>\n        )}\n        {showTabsRightShadow && (\n          <div style={{\n            position: 'absolute',\n            top: 0,\n            right: 0,\n            width: '16px',\n            height: '100%',\n            background: 'linear-gradient(to left, rgba(32, 41, 56, 0.9), rgba(32, 41, 56, 0))',\n            zIndex: 2,\n            pointerEvents: 'none'\n          }}></div>\n        )}\n      </div>\n      \n      <div style={{ position: 'relative', flex: 1 }}>\n        <div \n          ref={listRef}\n          className=\"component-list\"\n          style={{\n            overflowY: 'auto',\n            height: '100%',\n            padding: '0 16px 16px',\n            position: 'relative',\n            zIndex: 1\n          }}\n          onScroll={handleListScroll}\n        >\n          {searchFilteredComponents.length === 0 ? (\n            <div style={{\n              display: 'flex',\n              flexDirection: 'column',\n              alignItems: 'center',\n              justifyContent: 'center',\n              padding: '32px 0',\n              color: '#718096',\n              textAlign: 'center',\n              margin: '16px 0'\n            }}>\n              <svg \n                width=\"40\" \n                height=\"40\" \n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"#cbd5e0\"\n                strokeWidth=\"2\"\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n                style={{ marginBottom: '12px', opacity: 0.7 }}\n              >\n                <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n                <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n              </svg>\n              <p style={{ margin: 0, fontSize: '14px', opacity: 0.8 }}>\n                No components found.\n              </p>\n            </div>\n          ) : (\n            <div style={{\n              padding: 0,\n              margin: '16px 0 0 0',\n              display: 'grid',\n              gap: '10px'\n            }}>\n              {searchFilteredComponents.map(component => (\n                <ComponentListItem\n                  key={component.id}\n                  component={component}\n                  onSelect={() => onSelectComponent(component.id)}\n                  onDrag={onDragComponent ? (e) => onDragComponent(component.id, e) : undefined}\n                />\n              ))}\n            </div>\n          )}\n        </div>\n        \n        {/* Shadow effects for list scroll */}\n        {showListTopShadow && (\n          <div style={{\n            position: 'absolute',\n            top: 0,\n            left: 0,\n            right: 0,\n            height: '12px',\n            background: 'linear-gradient(to bottom, rgba(45, 55, 72, 0.9), rgba(45, 55, 72, 0))',\n            zIndex: 2,\n            pointerEvents: 'none'\n          }}></div>\n        )}\n        {showListBottomShadow && (\n          <div style={{\n            position: 'absolute',\n            bottom: 0,\n            left: 0,\n            right: 0,\n            height: '12px',\n            background: 'linear-gradient(to top, rgba(45, 55, 72, 0.9), rgba(45, 55, 72, 0))',\n            zIndex: 2,\n            pointerEvents: 'none'\n          }}></div>\n        )}\n      </div>\n    </div>\n  );\n};\n\ninterface ComponentListItemProps {\n  component: ComponentSchema;\n  onSelect: () => void;\n  onDrag?: (event: React.DragEvent) => void;\n}\n\nconst ComponentListItem: React.FC<ComponentListItemProps> = ({ \n  component, \n  onSelect,\n  onDrag \n}) => {\n  const handleDragStart = (event: React.DragEvent) => {\n    // Set data to be dragged\n    event.dataTransfer.setData('application/circuit-component', component.id);\n    event.dataTransfer.effectAllowed = 'copy';\n    \n    // Create a custom drag image\n    const dragImg = document.createElement('div');\n    dragImg.innerHTML = `\n      <svg width=\"40\" height=\"40\" viewBox=\"0 0 ${component.defaultWidth} ${component.defaultHeight}\">\n        <path \n          d=\"${component.svgPath}\"\n          fill=\"none\"\n          stroke=\"#333\"\n          stroke-width=\"2\"\n        />\n      </svg>\n    `;\n    dragImg.style.position = 'absolute';\n    dragImg.style.top = '-1000px';\n    document.body.appendChild(dragImg);\n    \n    event.dataTransfer.setDragImage(dragImg, 20, 20);\n    \n    // Custom onDrag handler\n    onDrag?.(event);\n    \n    // Clean up after drag operation\n    setTimeout(() => {\n      document.body.removeChild(dragImg);\n    }, 0);\n  };\n  \n  return (\n    <li \n      className=\"component-item\"\n      onClick={onSelect}\n      title={component.description}\n      draggable={true}\n      onDragStart={handleDragStart}\n      style={{\n        display: 'flex',\n        alignItems: 'center',\n        padding: '10px 12px',\n        borderRadius: '8px',\n        background: '#1a202c',\n        border: '1px solidrgb(18, 22, 28)',\n        boxShadow: '0 1px 3px rgba(0, 0, 0, 0.2)',\n        cursor: 'pointer',\n        transition: 'all 0.2s ease',\n        gap: '12px'\n      }}\n      onMouseEnter={(e) => {\n        const target = e.currentTarget;\n        target.style.boxShadow = '0 4px 6px rgba(0, 0, 0, 0.3)';\n        target.style.transform = 'translateY(-1px)';\n        target.style.borderColor = '#4a5568';\n      }}\n      onMouseLeave={(e) => {\n        const target = e.currentTarget;\n        target.style.boxShadow = '0 1px 3px rgba(0, 0, 0, 0.2)';\n        target.style.transform = 'translateY(0)';\n        target.style.borderColor = '#2d3748';\n      }}\n    >\n      <div \n        className=\"component-icon\"\n        style={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          width: '48px',\n          height: '48px',\n          borderRadius: '6px',\n          background: '#2d3748',\n          color: '#a0aec0',\n          flexShrink: 0\n        }}\n      >\n        <svg \n          width=\"32\" \n          height=\"32\"\n          viewBox={`0 0 ${component.defaultWidth} ${component.defaultHeight}`}\n          preserveAspectRatio=\"xMidYMid meet\"\n        >\n          <path \n            d={component.svgPath}\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth={2}\n            vectorEffect=\"non-scaling-stroke\"\n          />\n        </svg>\n      </div>\n      <div \n        className=\"component-details\"\n        style={{\n          display: 'flex',\n          flexDirection: 'column',\n          overflow: 'hidden'\n        }}\n      >\n        <span \n          className=\"component-name\"\n          style={{\n            fontWeight: 500,\n            fontSize: '14px',\n            color: '#e2e8f0',\n            whiteSpace: 'nowrap',\n            overflow: 'hidden',\n            textOverflow: 'ellipsis',\n            opacity: 0.9\n          }}\n        >\n          {component.name}\n        </span>\n        <span \n          className=\"component-category\"\n          style={{\n            fontSize: '12px',\n            color: '#a0aec0',\n            marginTop: '2px',\n            opacity: 0.7\n          }}\n        >\n          {component.category}\n        </span>\n      </div>\n      <div \n        style={{\n          marginLeft: 'auto', \n          opacity: 0.4,\n          flexShrink: 0,\n          color: '#718096'\n        }}\n      >\n        <svg \n          width=\"16\" \n          height=\"16\" \n          viewBox=\"0 0 24 24\" \n          fill=\"none\" \n          stroke=\"currentColor\" \n          strokeWidth=\"2\" \n          strokeLinecap=\"round\" \n          strokeLinejoin=\"round\"\n        >\n          <polyline points=\"9 18 15 12 9 6\"></polyline>\n        </svg>\n      </div>\n    </li>\n  );\n};\n\nexport default ComponentPalette;\n","/**\n * CircuitToolbar Component\n * \n * A toolbar for circuit operations like delete, copy, etc.\n */\n\nimport React from 'react';\n\ntype ToolbarAction = \n  | 'delete'\n  | 'copy'\n  | 'paste'\n  | 'undo'\n  | 'redo'\n  | 'zoom-in'\n  | 'zoom-out'\n  | 'zoom-fit'\n  | 'grid-toggle'\n  | 'rotate-cw'\n  | 'rotate-ccw'\n  | 'validate';\n\nexport interface CircuitToolbarProps {\n  onAction: (action: ToolbarAction) => void;\n  hasSelection?: boolean;\n  canUndo?: boolean;\n  canRedo?: boolean;\n  showGrid?: boolean;\n  validationIssues?: number;\n}\n\nconst CircuitToolbar: React.FC<CircuitToolbarProps> = ({\n  onAction,\n  hasSelection = false,\n  canUndo = false,\n  canRedo = false,\n  showGrid = true,\n  validationIssues = 0\n}) => {\n  return (\n    <div className=\"circuit-toolbar\">\n      <div className=\"toolbar-group\">\n        <button\n          className=\"toolbar-button\"\n          onClick={() => onAction('delete')}\n          disabled={!hasSelection}\n          title=\"Delete selected elements\"\n        >\n          Delete\n        </button>\n        <button\n          className=\"toolbar-button\"\n          onClick={() => onAction('copy')}\n          disabled={!hasSelection}\n          title=\"Copy selected elements\"\n        >\n          Copy\n        </button>\n        <button\n          className=\"toolbar-button\"\n          onClick={() => onAction('paste')}\n          title=\"Paste elements\"\n        >\n          Paste\n        </button>\n      </div>\n      \n      <div className=\"toolbar-group\">\n        <button\n          className=\"toolbar-button\"\n          onClick={() => onAction('undo')}\n          disabled={!canUndo}\n          title=\"Undo last action\"\n        >\n          Undo\n        </button>\n        <button\n          className=\"toolbar-button\"\n          onClick={() => onAction('redo')}\n          disabled={!canRedo}\n          title=\"Redo last undone action\"\n        >\n          Redo\n        </button>\n      </div>\n      \n      <div className=\"toolbar-group\">\n        <button\n          className=\"toolbar-button\"\n          onClick={() => onAction('zoom-in')}\n          title=\"Zoom in\"\n        >\n          Zoom In\n        </button>\n        <button\n          className=\"toolbar-button\"\n          onClick={() => onAction('zoom-out')}\n          title=\"Zoom out\"\n        >\n          Zoom Out\n        </button>\n        <button\n          className=\"toolbar-button\"\n          onClick={() => onAction('zoom-fit')}\n          title=\"Fit circuit to view\"\n        >\n          Fit\n        </button>\n      </div>\n      \n      <div className=\"toolbar-group\">\n        <button\n          className=\"toolbar-button\"\n          onClick={() => onAction('rotate-cw')}\n          disabled={!hasSelection}\n          title=\"Rotate clockwise\"\n        >\n          Rotate CW\n        </button>\n        <button\n          className=\"toolbar-button\"\n          onClick={() => onAction('rotate-ccw')}\n          disabled={!hasSelection}\n          title=\"Rotate counter-clockwise\"\n        >\n          Rotate CCW\n        </button>\n      </div>\n      \n      <div className=\"toolbar-group\">\n        <button\n          className=\"toolbar-button\"\n          onClick={() => onAction('validate')}\n          title=\"Validate circuit\"\n          style={{ \n            color: validationIssues > 0 ? 'red' : 'inherit'\n          }}\n        >\n          Validate {validationIssues > 0 ? `(${validationIssues})` : ''}\n        </button>\n      </div>\n      \n      <div className=\"toolbar-group\">\n        <button\n          className=\"toolbar-button\"\n          onClick={() => onAction('grid-toggle')}\n          title={showGrid ? \"Hide grid\" : \"Show grid\"}\n        >\n          {showGrid ? \"Hide Grid\" : \"Show Grid\"}\n        </button>\n      </div>\n    </div>\n  );\n};\n\nexport default CircuitToolbar;\n","/**\n * SimpleCircuitExample Component\n * \n * A simple example of using the Circuit-Bricks library.\n */\n\nimport React, { useEffect } from 'react';\nimport { \n  CircuitCanvas, \n  useCircuit, \n  PropertyPanel, \n  ComponentPalette,\n  CircuitToolbar\n} from '../index';\n\nconst SimpleCircuitExample: React.FC = () => {\n  const [circuit, actions] = useCircuit();\n  const {\n    addComponent,\n    updateComponent,\n    removeComponent,\n    addWire,\n    updateWire,\n    removeWire,\n    selectComponent,\n    selectWire,\n    deselectAll\n  } = actions;\n\n  // Create a simple circuit on component mount\n  useEffect(() => {\n    // Add a battery\n    const batteryId = addComponent({\n      type: 'battery',\n      position: { x: 100, y: 200 },\n      props: { voltage: 9 }\n    });\n\n    // Add a resistor\n    const resistorId = addComponent({\n      type: 'resistor',\n      position: { x: 200, y: 200 },\n      props: { resistance: 220 }\n    });\n\n    // Add an LED\n    const diodeId = addComponent({\n      type: 'diode',\n      position: { x: 300, y: 200 },\n      props: { forwardVoltage: 1.8 }\n    });\n\n    // Add a ground\n    const groundId = addComponent({\n      type: 'ground',\n      position: { x: 200, y: 300 },\n      props: {}\n    });\n\n    // Connect the components with wires\n    addWire(\n      { componentId: batteryId, portId: 'positive' },\n      { componentId: resistorId, portId: 'left' }\n    );\n\n    addWire(\n      { componentId: resistorId, portId: 'right' },\n      { componentId: diodeId, portId: 'anode' }\n    );\n\n    addWire(\n      { componentId: diodeId, portId: 'cathode' },\n      { componentId: groundId, portId: 'terminal' }\n    );\n\n    addWire(\n      { componentId: batteryId, portId: 'negative' },\n      { componentId: groundId, portId: 'terminal' }\n    );\n  }, []);\n\n  // Handle component selection\n  const handleComponentClick = (id: string) => {\n    selectComponent(id);\n  };\n\n  // Handle wire selection\n  const handleWireClick = (id: string) => {\n    selectWire(id);\n  };\n\n  // Handle canvas click (deselect all)\n  const handleCanvasClick = () => {\n    deselectAll();\n  };\n\n  // Handle property changes\n  const handlePropertyChange = (id: string, key: string, value: any) => {\n    updateComponent(id, {\n      props: {\n        ...circuit.components.find(c => c.id === id)?.props,\n        [key]: value\n      }\n    });\n  };\n\n  // Handle component selection from palette\n  const handleSelectComponent = (componentType: string) => {\n    addComponent({\n      type: componentType,\n      position: { x: 200, y: 200 }, // Center of canvas, should be improved\n      props: {}\n    });\n  };\n\n  // Handle toolbar actions\n  const handleToolbarAction = (action: string) => {\n    switch (action) {\n      case 'delete':\n        // Delete selected components\n        circuit.selectedComponentIds.forEach(id => removeComponent(id));\n        // Delete selected wires\n        circuit.selectedWireIds.forEach(id => removeWire(id));\n        break;\n      \n      // Other actions would be implemented here\n      \n      default:\n        console.log(`Action not implemented: ${action}`);\n    }\n  };\n\n  // Get the currently selected component (first one if multiple)\n  const selectedComponent = circuit.selectedComponentIds.length > 0\n    ? circuit.components.find(c => c.id === circuit.selectedComponentIds[0]) || null\n    : null;\n\n  return (\n    <div className=\"circuit-example\">\n      <div className=\"circuit-toolbar-container\">\n        <CircuitToolbar\n          onAction={handleToolbarAction}\n          hasSelection={circuit.selectedComponentIds.length > 0 || circuit.selectedWireIds.length > 0}\n        />\n      </div>\n      \n      <div className=\"circuit-workspace\">\n        <div className=\"component-palette-container\">\n          <ComponentPalette onSelectComponent={handleSelectComponent} />\n        </div>\n        \n        <div className=\"circuit-canvas-container\">\n          <CircuitCanvas\n            components={circuit.components}\n            wires={circuit.wires}\n            selectedComponentIds={circuit.selectedComponentIds}\n            selectedWireIds={circuit.selectedWireIds}\n            onComponentClick={handleComponentClick}\n            onWireClick={handleWireClick}\n            onCanvasClick={handleCanvasClick}\n            width=\"800px\"\n            height=\"600px\"\n          />\n        </div>\n        \n        <div className=\"property-panel-container\">\n          <PropertyPanel\n            component={selectedComponent}\n            onPropertyChange={handlePropertyChange}\n          />\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default SimpleCircuitExample;\n","/**\n * Circuit validation utilities\n * \n * Functions to validate circuit connections and integrity.\n */\n\nimport { CircuitState, ComponentInstance, Wire } from '../types';\nimport { getComponentSchema } from '../registry';\n\ninterface ValidationIssue {\n  type: 'error' | 'warning';\n  message: string;\n  componentId?: string;\n  wireId?: string;\n}\n\n/**\n * Validate a circuit for common issues\n * \n * @param circuit - The circuit state to validate\n * @returns Array of validation issues\n */\nexport function validateCircuit(circuit: CircuitState): ValidationIssue[] {\n  const issues: ValidationIssue[] = [];\n  \n  // Check for missing components in wire connections\n  issues.push(...validateWireConnections(circuit));\n  \n  // Check for floating inputs/outputs\n  issues.push(...validateFloatingPorts(circuit));\n  \n  // Check for short circuits\n  issues.push(...validateShortCircuits(circuit));\n  \n  return issues;\n}\n\n/**\n * Validate wire connections to ensure they reference valid components\n */\nfunction validateWireConnections(circuit: CircuitState): ValidationIssue[] {\n  const issues: ValidationIssue[] = [];\n  const componentIds = new Set(circuit.components.map(c => c.id));\n  \n  for (const wire of circuit.wires) {\n    // Check source component exists\n    if (!componentIds.has(wire.from.componentId)) {\n      issues.push({\n        type: 'error',\n        message: `Wire connected to non-existent component ID: ${wire.from.componentId}`,\n        wireId: wire.id\n      });\n    }\n    \n    // Check destination component exists\n    if (!componentIds.has(wire.to.componentId)) {\n      issues.push({\n        type: 'error',\n        message: `Wire connected to non-existent component ID: ${wire.to.componentId}`,\n        wireId: wire.id\n      });\n    }\n    \n    // Validate port IDs\n    const sourceComponent = circuit.components.find(c => c.id === wire.from.componentId);\n    const destComponent = circuit.components.find(c => c.id === wire.to.componentId);\n    \n    if (sourceComponent) {\n      const schema = getComponentSchema(sourceComponent.type);\n      if (schema && !schema.ports.some(p => p.id === wire.from.portId)) {\n        issues.push({\n          type: 'error',\n          message: `Wire connected to non-existent port: ${wire.from.portId} on component ${sourceComponent.type}`,\n          wireId: wire.id\n        });\n      }\n    }\n    \n    if (destComponent) {\n      const schema = getComponentSchema(destComponent.type);\n      if (schema && !schema.ports.some(p => p.id === wire.to.portId)) {\n        issues.push({\n          type: 'error',\n          message: `Wire connected to non-existent port: ${wire.to.portId} on component ${destComponent.type}`,\n          wireId: wire.id\n        });\n      }\n    }\n  }\n  \n  return issues;\n}\n\n/**\n * Check for floating input/output ports that should be connected\n */\nfunction validateFloatingPorts(circuit: CircuitState): ValidationIssue[] {\n  const issues: ValidationIssue[] = [];\n  const connectedPorts = new Map<string, Set<string>>();\n  \n  // Build a map of all connected ports\n  for (const wire of circuit.wires) {\n    if (!connectedPorts.has(wire.from.componentId)) {\n      connectedPorts.set(wire.from.componentId, new Set());\n    }\n    if (!connectedPorts.has(wire.to.componentId)) {\n      connectedPorts.set(wire.to.componentId, new Set());\n    }\n    \n    connectedPorts.get(wire.from.componentId)!.add(wire.from.portId);\n    connectedPorts.get(wire.to.componentId)!.add(wire.to.portId);\n  }\n  \n  // Check each component for floating ports\n  for (const component of circuit.components) {\n    const schema = getComponentSchema(component.type);\n    if (!schema) continue;\n    \n    const componentConnectedPorts = connectedPorts.get(component.id) || new Set();\n    \n    for (const port of schema.ports) {\n      if (port.type === 'input' && !componentConnectedPorts.has(port.id)) {\n        issues.push({\n          type: 'warning',\n          message: `Floating input port: ${port.id} on ${schema.name} (${component.id})`,\n          componentId: component.id\n        });\n      }\n      \n      if (port.type === 'output' && !componentConnectedPorts.has(port.id)) {\n        issues.push({\n          type: 'warning',\n          message: `Floating output port: ${port.id} on ${schema.name} (${component.id})`,\n          componentId: component.id\n        });\n      }\n    }\n  }\n  \n  return issues;\n}\n\n/**\n * Check for short circuits (multiple outputs connected together)\n */\nfunction validateShortCircuits(circuit: CircuitState): ValidationIssue[] {\n  const issues: ValidationIssue[] = [];\n  const connectionGraph = new Map<string, Set<string>>();\n  \n  // Build a connection graph\n  for (const wire of circuit.wires) {\n    const fromKey = `${wire.from.componentId}-${wire.from.portId}`;\n    const toKey = `${wire.to.componentId}-${wire.to.portId}`;\n    \n    if (!connectionGraph.has(fromKey)) {\n      connectionGraph.set(fromKey, new Set());\n    }\n    if (!connectionGraph.has(toKey)) {\n      connectionGraph.set(toKey, new Set());\n    }\n    \n    connectionGraph.get(fromKey)!.add(toKey);\n    connectionGraph.get(toKey)!.add(fromKey);\n  }\n  \n  // Create a map of port types\n  const portTypes = new Map<string, string>();\n  for (const component of circuit.components) {\n    const schema = getComponentSchema(component.type);\n    if (!schema) continue;\n    \n    for (const port of schema.ports) {\n      portTypes.set(`${component.id}-${port.id}`, port.type);\n    }\n  }\n  \n  // Find connected output ports\n  const visited = new Set<string>();\n  const connectedComponents = [];\n  \n  // For each port\n  for (const [port, connections] of connectionGraph.entries()) {\n    if (visited.has(port)) continue;\n    \n    // Do a BFS to find all connected ports\n    const connectedPorts = new Set<string>();\n    const queue = [port];\n    visited.add(port);\n    \n    while (queue.length > 0) {\n      const currentPort = queue.shift()!;\n      connectedPorts.add(currentPort);\n      \n      for (const connectedPort of connectionGraph.get(currentPort) || []) {\n        if (!visited.has(connectedPort)) {\n          queue.push(connectedPort);\n          visited.add(connectedPort);\n        }\n      }\n    }\n    \n    // Count output ports in this connected component\n    const outputPorts = [...connectedPorts].filter(p => \n      portTypes.get(p) === 'output'\n    );\n    \n    if (outputPorts.length > 1) {\n      issues.push({\n        type: 'error',\n        message: `Short circuit detected: ${outputPorts.length} output ports connected together`,\n      });\n    }\n  }\n  \n  return issues;\n}\n\nexport default validateCircuit;\n","/**\n * InteractiveCircuitExample Component\n * \n * Example component showcasing interactive features of the circuit-bricks library.\n */\n\nimport React, { useRef, useEffect, useState } from 'react';\nimport { \n  CircuitCanvas, \n  useCircuit,\n  ComponentPalette,\n  PropertyPanel,\n  CircuitToolbar,\n  Point\n} from '../index';\nimport { validateCircuit } from '../utils/circuitValidation';\n\nconst InteractiveCircuitExample: React.FC = () => {\n  const containerRef = useRef<HTMLDivElement>(null);\n  \n  // Initialize the circuit state\n  const [state, {\n    addComponent,\n    updateComponent,\n    removeComponent,\n    addWire,\n    removeWire,\n    selectComponent,\n    selectWire,\n    deselectAll,\n    moveComponent,\n    startWireDrawing,\n    completeWireDrawing,\n    cancelWireDrawing,\n    isValidConnection,\n    rotateComponent,\n    rotateSelectedComponents,\n    undo,\n    redo,\n    canUndo,\n    canRedo\n  }] = useCircuit();\n  \n  // Wire drawing state\n  const [wireDrawing, setWireDrawing] = React.useState<{\n    isDrawing: boolean;\n    fromComponentId: string | null;\n    fromPortId: string | null;\n  }>({\n    isDrawing: false,\n    fromComponentId: null,\n    fromPortId: null\n  });\n  \n  // State for validation issues\n  const [validationIssues, setValidationIssues] = useState<number>(0);\n  \n  // Handler for selecting a component from the palette\n  const handleSelectComponent = (componentType: string) => {\n    // Calculate position in the middle of the canvas\n    const container = containerRef.current;\n    let posX = 200;\n    let posY = 200;\n    \n    if (container) {\n      const rect = container.getBoundingClientRect();\n      posX = rect.width / 2;\n      posY = rect.height / 2;\n    }\n    \n    // Add the component to the circuit\n    const id = addComponent({\n      type: componentType,\n      position: { x: posX, y: posY },\n      props: {}\n    });\n    \n    // Select the new component\n    selectComponent(id);\n  };\n  \n  // Handler for drag and drop\n  const handleComponentDrop = (componentType: string, position: Point) => {\n    // Add the component to the circuit at the drop position\n    const id = addComponent({\n      type: componentType,\n      position,\n      props: {}\n    });\n    \n    // Select the new component\n    selectComponent(id);\n  };\n  \n  // Handler for toolbar actions\n  const handleToolbarAction = (action: string) => {\n    switch (action) {\n      case 'delete':\n        // Delete selected components and wires\n        state.selectedComponentIds.forEach(id => removeComponent(id));\n        state.selectedWireIds.forEach(id => removeWire(id));\n        break;\n      case 'grid-toggle':\n        // Toggle grid visibility\n        break;\n      case 'undo':\n        undo();\n        break;\n      case 'redo':\n        redo();\n        break;\n      case 'rotate-cw':\n        rotateSelectedComponents(90);\n        break;\n      case 'rotate-ccw':\n        rotateSelectedComponents(-90);\n        break;\n      case 'validate':\n        // Use the validation utility\n        const issues = validateCircuit(state);\n        setValidationIssues(issues.length);\n        \n        if (issues.length > 0) {\n          // Display first few issues\n          const message = issues\n            .slice(0, 3)\n            .map(issue => `- ${issue.message}`)\n            .join('\\n');\n          \n          alert(`Circuit validation found ${issues.length} issues:\\n${message}${\n            issues.length > 3 ? '\\n\\n...and ' + (issues.length - 3) + ' more' : ''\n          }`);\n        } else {\n          alert('Circuit validation successful! No issues found.');\n        }\n        break;\n      default:\n        console.log(`Action not implemented: ${action}`);\n    }\n  };\n  \n  // Handler for component property changes\n  const handlePropertyChange = (id: string, key: string, value: any) => {\n    const component = state.components.find(c => c.id === id);\n    if (component) {\n      const updatedProps = { ...component.props, [key]: value };\n      updateComponent(id, { props: updatedProps });\n    }\n  };\n\n  // Handle starting to draw a wire\n  const handleWireDrawStart = (componentId: string, portId: string) => {\n    setWireDrawing({\n      isDrawing: true,\n      fromComponentId: componentId,\n      fromPortId: portId\n    });\n    startWireDrawing(componentId, portId);\n  };\n  \n  // Handle completing a wire\n  const handleWireDrawEnd = (componentId: string, portId: string) => {\n    if (wireDrawing.fromComponentId && wireDrawing.fromPortId) {\n      const success = completeWireDrawing(componentId, portId);\n      setWireDrawing({\n        isDrawing: false,\n        fromComponentId: null,\n        fromPortId: null\n      });\n      return success;\n    }\n    return false;\n  };\n  \n  // Handle canceling wire drawing\n  const handleWireDrawCancel = () => {\n    setWireDrawing({\n      isDrawing: false,\n      fromComponentId: null,\n      fromPortId: null\n    });\n    cancelWireDrawing();\n  };\n  \n  // Handle component clicks\n  const handleComponentClick = (id: string, event: React.MouseEvent) => {\n    // Use Shift key for multi-selection\n    const addToSelection = event.shiftKey;\n    selectComponent(id, addToSelection);\n  };\n  \n  // Handle wire clicks\n  const handleWireClick = (id: string, event: React.MouseEvent) => {\n    // Use Shift key for multi-selection\n    const addToSelection = event.shiftKey;\n    selectWire(id, addToSelection);\n  };\n  \n  // Handle canvas click (deselect all when clicking on empty space)\n  const handleCanvasClick = () => {\n    deselectAll();\n  };\n  \n  return (\n    <div className=\"interactive-circuit-example\">\n      <div className=\"circuit-container\" ref={containerRef}>\n        <CircuitToolbar\n          onAction={handleToolbarAction}\n          hasSelection={state.selectedComponentIds.length > 0 || state.selectedWireIds.length > 0}\n          showGrid={true}\n          canUndo={canUndo()}\n          canRedo={canRedo()}\n          validationIssues={validationIssues}\n        />\n        \n        <div className=\"circuit-content\">\n          <ComponentPalette onSelectComponent={handleSelectComponent} />\n          \n          <div className=\"circuit-canvas-container\">\n            <CircuitCanvas\n              components={state.components}\n              wires={state.wires}\n              selectedComponentIds={state.selectedComponentIds}\n              selectedWireIds={state.selectedWireIds}\n              showGrid={true}\n              onComponentClick={handleComponentClick}\n              onWireClick={handleWireClick}\n              onCanvasClick={handleCanvasClick}\n              onComponentDrag={moveComponent}\n              onWireDrawStart={handleWireDrawStart}\n              onWireDrawEnd={handleWireDrawEnd}\n              onWireDrawCancel={handleWireDrawCancel}\n              wireDrawing={wireDrawing}\n              onComponentDrop={handleComponentDrop}\n            />\n          </div>\n          \n          <PropertyPanel\n            component={state.selectedComponentIds.length === 1\n              ? state.components.find(c => c.id === state.selectedComponentIds[0]) || null\n              : null\n            }\n            onPropertyChange={handlePropertyChange}\n          />\n        </div>\n      </div>\n      \n      <style>\n        {`\n        .interactive-circuit-example {\n          display: flex;\n          flex-direction: column;\n          height: 100%;\n          width: 100%;\n        }\n        \n        .circuit-container {\n          display: flex;\n          flex-direction: column;\n          flex: 1;\n          border: 1px solid #e0e0e0;\n          border-radius: 4px;\n          overflow: hidden;\n        }\n        \n        .circuit-content {\n          display: flex;\n          flex: 1;\n          overflow: hidden;\n        }\n        \n        .circuit-canvas-container {\n          flex: 1;\n          position: relative;\n          overflow: hidden;\n        }\n        `}\n      </style>\n    </div>\n  );\n};\n\nexport default InteractiveCircuitExample;\n","// filepath: /Users/harshithpasupuleti/code/circuit-bricks/examples/VoltageRegulatorExample.tsx\nimport React from 'react';\nimport CircuitCanvas from '../core/CircuitCanvas';\nimport useCircuit from '../hooks/useCircuit';\n\n/**\n * Voltage Regulator Circuit Example\n * \n * This example demonstrates a simple 7805 voltage regulator circuit\n * with input and output capacitors.\n * \n * Components:\n * - Battery (9V)\n * - IC (7805 voltage regulator)\n * - Input capacitor (100µF)\n * - Output capacitor (10µF)\n * - Resistor (load)\n * - Ground\n * \n * @returns {JSX.Element} The rendered circuit example\n */\nconst VoltageRegulatorExample: React.FC = () => {\n  const [state, actions] = useCircuit();\n\n  // Initialize the circuit on mount\n  React.useEffect(() => {\n    // Add components\n    const batteryId = actions.addComponent({\n      type: 'battery',\n      position: { x: 100, y: 100 },\n      props: { voltage: 9 }\n    });\n\n    const regulatorId = actions.addComponent({\n      type: 'ic',\n      position: { x: 300, y: 100 },\n      props: { \n        name: '7805',\n        pins: 3,\n        width: 60,\n        height: 40\n      }\n    });\n\n    const inputCapId = actions.addComponent({\n      type: 'capacitor',\n      position: { x: 200, y: 150 },\n      props: { capacitance: 100, unit: 'µF' }\n    });\n\n    const outputCapId = actions.addComponent({\n      type: 'capacitor',\n      position: { x: 400, y: 150 },\n      props: { capacitance: 10, unit: 'µF' }\n    });\n\n    const loadResistorId = actions.addComponent({\n      type: 'resistor',\n      position: { x: 500, y: 100 },\n      props: { resistance: 1000 }\n    });\n\n    const groundId = actions.addComponent({\n      type: 'ground',\n      position: { x: 300, y: 200 },\n      props: {}\n    });\n\n    // Connect components with wires\n    actions.addWire(\n      { componentId: batteryId, portId: 'positive' },\n      { componentId: regulatorId, portId: 'input' }\n    );\n\n    actions.addWire(\n      { componentId: batteryId, portId: 'negative' },\n      { componentId: groundId, portId: 'input' }\n    );\n\n    actions.addWire(\n      { componentId: regulatorId, portId: 'input' },\n      { componentId: inputCapId, portId: 'positive' }\n    );\n\n    actions.addWire(\n      { componentId: inputCapId, portId: 'negative' },\n      { componentId: groundId, portId: 'input' }\n    );\n\n    actions.addWire(\n      { componentId: regulatorId, portId: 'ground' },\n      { componentId: groundId, portId: 'input' }\n    );\n\n    actions.addWire(\n      { componentId: regulatorId, portId: 'output' },\n      { componentId: outputCapId, portId: 'positive' }\n    );\n\n    actions.addWire(\n      { componentId: outputCapId, portId: 'negative' },\n      { componentId: groundId, portId: 'input' }\n    );\n\n    actions.addWire(\n      { componentId: regulatorId, portId: 'output' },\n      { componentId: loadResistorId, portId: 'left' }\n    );\n\n    actions.addWire(\n      { componentId: loadResistorId, portId: 'right' },\n      { componentId: groundId, portId: 'input' }\n    );\n  }, []);\n\n  return (\n    <div className=\"example-container\">\n      <h2>Voltage Regulator Circuit (7805)</h2>\n      <p>A simple 9V to 5V regulator with input and output capacitors</p>\n      <div className=\"circuit-container\">\n        <CircuitCanvas\n          components={state.components}\n          wires={state.wires}\n          width={700}\n          height={400}\n          showGrid={true}\n        />\n      </div>\n      <div className=\"description\">\n        <h3>Circuit Description</h3>\n        <p>\n          This circuit converts a 9V input to a regulated 5V output using the 7805 linear voltage regulator.\n          The input capacitor (100µF) helps smooth out input voltage fluctuations, while the\n          output capacitor (10µF) improves transient response. A 1kΩ resistor serves as the load.\n        </p>\n      </div>\n    </div>\n  );\n};\n\nexport default VoltageRegulatorExample;\n","import React from 'react';\nimport CircuitCanvas from '../core/CircuitCanvas';\nimport useCircuit from '../hooks/useCircuit';\n\n/**\n * 555 Timer Circuit Example\n * \n * This example demonstrates a 555 timer in astable multivibrator mode,\n * creating an LED blinker circuit.\n * \n * Components:\n * - Battery (9V)\n * - IC (555 timer)\n * - Resistors (timing resistors)\n * - Capacitor (timing capacitor)\n * - LED\n * - Ground\n * \n * @returns {JSX.Element} The rendered circuit example\n */\nconst TimerCircuitExample: React.FC = () => {\n  const [state, actions] = useCircuit();\n\n  // Initialize the circuit on mount\n  React.useEffect(() => {\n    // Add components\n    const batteryId = actions.addComponent({\n      type: 'battery',\n      position: { x: 100, y: 100 },\n      props: { voltage: 9 }\n    });\n\n    const timerICId = actions.addComponent({\n      type: 'ic',\n      position: { x: 300, y: 150 },\n      props: { \n        name: '555',\n        pins: 8,\n        width: 80,\n        height: 100\n      }\n    });\n\n    const resistor1Id = actions.addComponent({\n      type: 'resistor',\n      position: { x: 200, y: 50 },\n      props: { resistance: 10, unit: 'kΩ' }\n    });\n\n    const resistor2Id = actions.addComponent({\n      type: 'resistor',\n      position: { x: 400, y: 50 },\n      props: { resistance: 100, unit: 'kΩ' }\n    });\n\n    const capacitorId = actions.addComponent({\n      type: 'capacitor',\n      position: { x: 200, y: 250 },\n      props: { capacitance: 10, unit: 'µF' }\n    });\n\n    const ledId = actions.addComponent({\n      type: 'led',\n      position: { x: 500, y: 150 },\n      props: { color: '#ff0000' }\n    });\n\n    const resistor3Id = actions.addComponent({\n      type: 'resistor',\n      position: { x: 500, y: 250 },\n      props: { resistance: 330 }\n    });\n\n    const groundId = actions.addComponent({\n      type: 'ground',\n      position: { x: 300, y: 350 },\n      props: {}\n    });\n\n    // Connect components with wires\n    // Battery connections\n    actions.addWire(\n      { componentId: batteryId, portId: 'positive' },\n      { componentId: timerICId, portId: 'vcc' }\n    );\n\n    actions.addWire(\n      { componentId: batteryId, portId: 'negative' },\n      { componentId: groundId, portId: 'input' }\n    );\n\n    // Timer IC connections\n    actions.addWire(\n      { componentId: timerICId, portId: 'ground' },\n      { componentId: groundId, portId: 'input' }\n    );\n\n    actions.addWire(\n      { componentId: timerICId, portId: 'trigger' },\n      { componentId: capacitorId, portId: 'negative' }\n    );\n\n    actions.addWire(\n      { componentId: timerICId, portId: 'threshold' },\n      { componentId: capacitorId, portId: 'positive' }\n    );\n\n    actions.addWire(\n      { componentId: timerICId, portId: 'discharge' },\n      { componentId: resistor2Id, portId: 'left' }\n    );\n\n    actions.addWire(\n      { componentId: resistor1Id, portId: 'left' },\n      { componentId: batteryId, portId: 'positive' }\n    );\n\n    actions.addWire(\n      { componentId: resistor1Id, portId: 'right' },\n      { componentId: resistor2Id, portId: 'right' }\n    );\n\n    actions.addWire(\n      { componentId: resistor2Id, portId: 'right' },\n      { componentId: timerICId, portId: 'threshold' }\n    );\n\n    actions.addWire(\n      { componentId: capacitorId, portId: 'negative' },\n      { componentId: groundId, portId: 'input' }\n    );\n\n    // LED connections\n    actions.addWire(\n      { componentId: timerICId, portId: 'output' },\n      { componentId: ledId, portId: 'anode' }\n    );\n\n    actions.addWire(\n      { componentId: ledId, portId: 'cathode' },\n      { componentId: resistor3Id, portId: 'left' }\n    );\n\n    actions.addWire(\n      { componentId: resistor3Id, portId: 'right' },\n      { componentId: groundId, portId: 'input' }\n    );\n  }, []);\n\n  return (\n    <div className=\"example-container\">\n      <h2>555 Timer LED Blinker Circuit</h2>\n      <p>An astable multivibrator circuit using the 555 timer IC to blink an LED</p>\n      <div className=\"circuit-container\">\n        <CircuitCanvas\n          components={state.components}\n          wires={state.wires}\n          width={700}\n          height={500}\n          showGrid={true}\n        />\n      </div>\n      <div className=\"description\">\n        <h3>Circuit Description</h3>\n        <p>\n          This circuit uses a 555 timer IC configured as an astable multivibrator to generate\n          a continuous square wave output. The frequency is determined by the values of the two\n          resistors (10kΩ and 100kΩ) and the 10µF capacitor, resulting in a blinking LED.\n          The blinking rate can be adjusted by changing the resistor and capacitor values.\n        </p>\n        <p>\n          <strong>Formula:</strong> f ≈ 1.44 / ((R1 + 2 × R2) × C)\n        </p>\n      </div>\n    </div>\n  );\n};\n\nexport default TimerCircuitExample;\n","/**\n * Circuit-Bricks - A modular, Lego-style SVG circuit component system for React\n * \n * @package circuit-bricks\n * @version 0.1.0\n * @license MIT\n * @author Sphere Labs\n */\n\n// Export types\nexport * from './types';\n\n// Core components\nexport { default as CircuitCanvas } from './core/CircuitCanvas';\nexport { default as Brick } from './core/Brick';\nexport { default as BaseComponent } from './core/BaseComponent';\nexport { default as Port } from './core/Port';\nexport { default as WirePath } from './core/WirePath';\n\n// Hooks\nexport { default as useCircuit } from './hooks/useCircuit';\nexport { default as usePortPosition, useSinglePortPosition } from './hooks/usePortPosition';\n\n// UI Components\nexport { default as PropertyPanel } from './ui/PropertyPanel';\nexport { default as ComponentPalette } from './ui/ComponentPalette';\nexport { default as CircuitToolbar } from './ui/CircuitToolbar';\n\n// Examples\nexport { default as SimpleCircuitExample } from './examples/SimpleCircuitExample';\nexport { default as InteractiveCircuitExample } from './examples/InteractiveCircuitExample';\nexport { default as VoltageRegulatorExample } from './examples/VoltageRegulatorExample';\nexport { default as TimerCircuitExample } from './examples/TimerCircuitExample';\n\n// Utilities\nexport { validateCircuit } from './utils/circuitValidation';\nexport { getPortPosition } from './utils/getPortPosition';\n\n// Registry utilities\nexport {\n  registerComponent,\n  getComponentSchema,\n  getAllComponents,\n  getComponentsByCategory\n} from './registry';\n\n/**\n * Current package version\n * @public\n */\nexport const version = '0.1.0';"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;WACQ;aACE;iBACI;oBACG;qBACC;sBACC;cACR,CACP;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,GACD;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,CACF;mBACa,CACZ;CACE,OAAO;CACP,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,OAAO;AACR,GACD;CACE,OAAO;CACP,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,OAAO;CACP,OAAO;AACR,CACF;gBACU;uBAxCb;;;;;;;;;;AAyCC;;;;WCxCO;aACE;iBACI;oBACG;qBACC;sBACC;cACR,CACP;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,GACD;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,CACF;mBACa,CACZ;CACE,OAAO;CACP,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,OAAO;AACR,GACD;CACE,OAAO;CACP,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,OAAO;AACR,CACF;gBACU;wBAvCb;;;;;;;;;;AAwCC;;;;WCvCO;aACE;iBACI;oBACG;qBACC;sBACC;cACR,CACP;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,GACD;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,CACF;mBACa,CACZ;CACE,OAAO;CACP,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,OAAO;AACR,GACD;CACE,OAAO;CACP,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,OAAO;AACR,CACF;gBACU;sBAvCb;;;;;;;;;;AAwCC;;;;WCvCO;aACE;iBACI;oBACG;qBACC;sBACC;cACR,CACP;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,CACF;mBACa,CAAE;gBACL;qBAhBb;;;;;;;;;;AAiBC;;;;WChBO;aACE;iBACI;oBACG;qBACC;sBACC;cACR,CACP;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,GACD;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,CACF;mBACa,CACZ;CACE,OAAO;CACP,SAAS;CACT,QAAQ;CACR,WAAW,CACT;EAAE,SAAS;EAAQ,SAAS;CAAQ,GACpC;EAAE,SAAS;EAAU,SAAS;CAAU,CACzC;CACD,WAAW;AACZ,CACF;gBACU;qBAjCb;;;;;;;;;;AAkCC;;;;WCjCO;aACE;iBACI;oBACG;qBACC;sBACC;cACR,CACP;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,GACD;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,CACF;mBACa;CACZ;EACE,OAAO;EACP,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,WAAW;EACX,OAAO;CACR;CACD;EACE,OAAO;EACP,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,WAAW;EACX,OAAO;CACR;CACD;EACE,OAAO;EACP,SAAS;EACT,QAAQ;EACR,WAAW,CACT;GAAE,SAAS;GAAM,SAAS;EAAM,GAChC;GAAE,SAAS;GAAM,SAAS;EAAM,CACjC;EACD,WAAW;CACZ;AACF;gBACU;6BAjDb;;;;;;;;;;AAkDC;;;;WCjDO;aACE;iBACI;oBACG;qBACC;sBACC;cACR,CACP;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,GACD;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,CACF;mBACa,CACZ;CACE,OAAO;CACP,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,OAAO;AACR,GACD;CACE,OAAO;CACP,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,OAAO;AACR,CACF;gBACU;oBAvCb;;;;;;;;;;AAwCC;;;;WCvCO;aACE;iBACI;oBACG;qBACC;sBACC;cACR;CACP;EACE,MAAM;EACN,KAAK;EACL,KAAK;EACL,QAAQ;CACT;CACD;EACE,MAAM;EACN,KAAK;EACL,KAAK;EACL,QAAQ;CACT;CACD;EACE,MAAM;EACN,KAAK;EACL,KAAK;EACL,QAAQ;CACT;AACF;mBACa,CACZ;CACE,OAAO;CACP,SAAS;CACT,QAAQ;CACR,WAAW;CACX,OAAO;AACR,CACF;gBACU;6BApCb;;;;;;;;;;AAqCC;;;;WCpCO;aACE;iBACI;oBACG;qBACC;sBACC;cACR,CACP;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,GACD;CACE,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;AACT,CACF;mBACa;CACZ;EACE,OAAO;EACP,SAAS;EACT,QAAQ;EACR,WAAW;CACZ;CACD;EACE,OAAO;EACP,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,WAAW;EACX,OAAO;CACR;CACD;EACE,OAAO;EACP,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,WAAW;EACX,OAAO;CACR;AACF;gBACU;kBA7Cb;;;;;;;;;;AA8CC;;;;SC7CO;WACE;eACI;kBACG;mBACC;oBACC;YACR;CACP;EACE,MAAM;EACN,KAAK;EACL,KAAK;EACL,QAAQ;EACR,SAAS;CACV;CACD;EACE,MAAM;EACN,KAAK;EACL,KAAK;EACL,QAAQ;EACR,SAAS;CACV;CACD;EACE,MAAM;EACN,KAAK;EACL,KAAK;EACL,QAAQ;EACR,SAAS;CACV;CACD;EACE,MAAM;EACN,KAAK;EACL,KAAK;EACL,QAAQ;EACR,SAAS;CACV;CACD;EACE,MAAM;EACN,KAAK;EACL,KAAK;EACL,QAAQ;EACR,SAAS;CACV;CACD;EACE,MAAM;EACN,KAAK;EACL,KAAK;EACL,QAAQ;EACR,SAAS;CACV;CACD;EACE,MAAM;EACN,KAAK;EACL,KAAK;EACL,QAAQ;EACR,SAAS;CACV;CACD;EACE,MAAM;EACN,KAAK;EACL,KAAK;EACL,QAAQ;EACR,SAAS;CACV;CACD;EACE,MAAM;EACN,KAAK;EACL,KAAK;EACL,QAAQ;EACR,SAAS;CACV;CACD;EACE,MAAM;EACN,KAAK;EACL,KAAK;EACL,QAAQ;EACR,SAAS;CACV;AACF;iBACa,CACZ;CACE,OAAO;CACP,SAAS;C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"}