@tscircuit/schematic-viewer 2.0.72 → 2.0.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +22 -12
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -920,7 +920,7 @@ import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
|
|
|
920
920
|
// package.json
|
|
921
921
|
var package_default = {
|
|
922
922
|
name: "@tscircuit/schematic-viewer",
|
|
923
|
-
version: "2.0.
|
|
923
|
+
version: "2.0.73",
|
|
924
924
|
main: "dist/index.js",
|
|
925
925
|
type: "module",
|
|
926
926
|
scripts: {
|
|
@@ -947,7 +947,7 @@ var package_default = {
|
|
|
947
947
|
"react-dom": "^19.1.0",
|
|
948
948
|
"react-reconciler": "^0.31.0",
|
|
949
949
|
semver: "^7.7.2",
|
|
950
|
-
tscircuit: "^0.0.
|
|
950
|
+
tscircuit: "^0.0.2112",
|
|
951
951
|
tsup: "^8.3.5",
|
|
952
952
|
vite: "^6.0.3"
|
|
953
953
|
},
|
|
@@ -2360,9 +2360,21 @@ import {
|
|
|
2360
2360
|
convertCircuitJsonToSchematicSimulationSvg,
|
|
2361
2361
|
convertCircuitJsonToSimulationGraphSvg
|
|
2362
2362
|
} from "circuit-to-svg";
|
|
2363
|
-
import { useEffect as useEffect12,
|
|
2364
|
-
import { useMouseMatrixTransform as useMouseMatrixTransform2 } from "use-mouse-matrix-transform";
|
|
2363
|
+
import { useEffect as useEffect12, useMemo as useMemo5, useRef as useRef9, useState as useState8 } from "react";
|
|
2365
2364
|
import { toString as transformToString2 } from "transformation-matrix";
|
|
2365
|
+
import { useMouseMatrixTransform as useMouseMatrixTransform2 } from "use-mouse-matrix-transform";
|
|
2366
|
+
|
|
2367
|
+
// lib/utils/get-analog-simulation-background-color.ts
|
|
2368
|
+
import { colorMap } from "circuit-to-svg";
|
|
2369
|
+
var getRootSvgBackgroundColor = (simulationSvg) => {
|
|
2370
|
+
const rootStyleMatch = simulationSvg.match(
|
|
2371
|
+
/<svg\b[^>]*\bstyle=(?:"([^"]*)"|'([^']*)')/i
|
|
2372
|
+
);
|
|
2373
|
+
const rootStyle = rootStyleMatch?.[1] ?? rootStyleMatch?.[2];
|
|
2374
|
+
return rootStyle?.match(/(?:^|;)\s*background-color\s*:\s*([^;]+)/i)?.[1]?.trim();
|
|
2375
|
+
};
|
|
2376
|
+
var getGraphBackgroundColor = (simulationSvg) => simulationSvg.match(/\.background\s*\{[^}]*\bfill\s*:\s*([^;}]+)/i)?.[1]?.trim();
|
|
2377
|
+
var getAnalogSimulationBackgroundColor = (simulationSvg, colorOverrides) => getRootSvgBackgroundColor(simulationSvg) ?? getGraphBackgroundColor(simulationSvg) ?? colorOverrides?.schematic?.background ?? colorMap.schematic.background;
|
|
2366
2378
|
|
|
2367
2379
|
// lib/components/AnalogSimulationSelector.tsx
|
|
2368
2380
|
import * as DropdownMenu3 from "@radix-ui/react-dropdown-menu";
|
|
@@ -2546,7 +2558,8 @@ var AnalogSimulationSelector = ({
|
|
|
2546
2558
|
// lib/components/AnalogSimulationViewer.tsx
|
|
2547
2559
|
import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
2548
2560
|
var DEFAULT_RENDER_WIDTH = 1200;
|
|
2549
|
-
var
|
|
2561
|
+
var DEFAULT_COMBINED_RENDER_ASPECT_RATIO = 1;
|
|
2562
|
+
var DEFAULT_GRAPH_ONLY_RENDER_ASPECT_RATIO = 2;
|
|
2550
2563
|
var AnalogSimulationViewer = ({
|
|
2551
2564
|
circuitJson: inputCircuitJson,
|
|
2552
2565
|
containerStyle,
|
|
@@ -2578,7 +2591,8 @@ var AnalogSimulationViewer = ({
|
|
|
2578
2591
|
}
|
|
2579
2592
|
}
|
|
2580
2593
|
});
|
|
2581
|
-
const
|
|
2594
|
+
const defaultRenderAspectRatio = hideSchematic ? DEFAULT_GRAPH_ONLY_RENDER_ASPECT_RATIO : DEFAULT_COMBINED_RENDER_ASPECT_RATIO;
|
|
2595
|
+
const renderAspectRatio = width && height ? width / height : defaultRenderAspectRatio;
|
|
2582
2596
|
const effectiveWidth = width || (height ? height * renderAspectRatio : containerWidth) || DEFAULT_RENDER_WIDTH;
|
|
2583
2597
|
const effectiveHeight = height || effectiveWidth / renderAspectRatio;
|
|
2584
2598
|
useEffect12(() => {
|
|
@@ -2666,12 +2680,8 @@ var AnalogSimulationViewer = ({
|
|
|
2666
2680
|
}
|
|
2667
2681
|
}, [simulationSvg]);
|
|
2668
2682
|
const containerBackgroundColor = useMemo5(() => {
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
/<svg[^>]*style="[^"]*background-color:\s*([^;\"]+)/i
|
|
2672
|
-
);
|
|
2673
|
-
return match?.[1] ?? "transparent";
|
|
2674
|
-
}, [simulationSvg]);
|
|
2683
|
+
return getAnalogSimulationBackgroundColor(simulationSvg, colorOverrides);
|
|
2684
|
+
}, [simulationSvg, colorOverrides]);
|
|
2675
2685
|
const handleMouseDown = (_e) => {
|
|
2676
2686
|
setIsDragging(true);
|
|
2677
2687
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/components/SchematicViewer.tsx","../lib/hooks/useChangeSchematicComponentLocationsInSvg.ts","../lib/utils/get-component-offset-due-to-events.ts","../lib/hooks/useChangeSchematicTracesForMovedComponents.ts","../lib/hooks/useSchematicGroupsOverlay.ts","../lib/hooks/useSchematicNetHover.ts","../lib/utils/debug.ts","../lib/hooks/use-resize-handling.ts","../lib/hooks/useComponentDragging.ts","../lib/utils/z-index-map.ts","../lib/components/EditIcon.tsx","../lib/components/GridIcon.tsx","../lib/components/ViewMenu.tsx","../package.json","../lib/components/ViewMenuIcon.tsx","../lib/hooks/useLocalStorage.ts","../lib/components/MouseTracker.tsx","../lib/components/SchematicComponentMouseTarget.tsx","../lib/hooks/useMouseEventsOverBoundingBox.ts","../lib/components/SchematicPortMouseTarget.tsx","../lib/components/SchematicSheetSelector.tsx","../lib/components/AnalogSimulationViewer.tsx","../lib/components/AnalogSimulationSelector.tsx"],"sourcesContent":["import {\n convertCircuitJsonToSchematicSvg,\n type ColorOverrides,\n} from \"circuit-to-svg\"\nimport { su } from \"@tscircuit/soup-util\"\nimport { useChangeSchematicComponentLocationsInSvg } from \"lib/hooks/useChangeSchematicComponentLocationsInSvg\"\nimport { useChangeSchematicTracesForMovedComponents } from \"lib/hooks/useChangeSchematicTracesForMovedComponents\"\nimport { useSchematicGroupsOverlay } from \"lib/hooks/useSchematicGroupsOverlay\"\nimport { useSchematicNetHover } from \"lib/hooks/useSchematicNetHover\"\nimport { enableDebug } from \"lib/utils/debug\"\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport {\n fromString,\n identity,\n toString as transformToString,\n} from \"transformation-matrix\"\nimport { useMouseMatrixTransform } from \"use-mouse-matrix-transform\"\nimport { useResizeHandling } from \"../hooks/use-resize-handling\"\nimport { useComponentDragging } from \"../hooks/useComponentDragging\"\nimport type { ManualEditEvent } from \"../types/edit-events\"\nimport { EditIcon } from \"./EditIcon\"\nimport { GridIcon } from \"./GridIcon\"\nimport { ViewMenu } from \"./ViewMenu\"\nimport type { CircuitJson, SchematicSheet } from \"circuit-json\"\nimport { zIndexMap } from \"../utils/z-index-map\"\nimport {\n getStoredBoolean,\n setStoredBoolean,\n getStoredString,\n setStoredString,\n STORAGE_KEYS,\n} from \"lib/hooks/useLocalStorage\"\nimport { MouseTracker } from \"./MouseTracker\"\nimport { SchematicComponentMouseTarget } from \"./SchematicComponentMouseTarget\"\nimport { SchematicPortMouseTarget } from \"./SchematicPortMouseTarget\"\nimport { SchematicSheetSelector } from \"./SchematicSheetSelector\"\n\ninterface Props {\n circuitJson: CircuitJson\n containerStyle?: React.CSSProperties\n editEvents?: ManualEditEvent[]\n onEditEvent?: (event: ManualEditEvent) => void\n defaultEditMode?: boolean\n debugGrid?: boolean\n editingEnabled?: boolean\n debug?: boolean\n clickToInteractEnabled?: boolean\n colorOverrides?: ColorOverrides\n disableGroups?: boolean\n /** Fade unrelated nets/chips when hovering a wire or net label. Default true. */\n netHoverHighlightEnabled?: boolean\n css?: string\n className?: string\n onSchematicComponentClicked?: (options: {\n schematicComponentId: string\n event: MouseEvent\n }) => void\n showSchematicPorts?: boolean\n onSchematicPortClicked?: (options: {\n schematicPortId: string\n event: MouseEvent\n }) => void\n /** Called when the active schematic sheet changes (multi-sheet circuits). */\n onSchematicSheetChange?: (schematicSheetId: string) => void\n}\n\nexport const SchematicViewer = ({\n circuitJson,\n containerStyle,\n editEvents: unappliedEditEvents = [],\n onEditEvent,\n defaultEditMode = false,\n debugGrid = false,\n editingEnabled = false,\n debug = false,\n clickToInteractEnabled = false,\n colorOverrides,\n disableGroups = false,\n netHoverHighlightEnabled = true,\n onSchematicComponentClicked,\n showSchematicPorts = false,\n onSchematicPortClicked,\n onSchematicSheetChange,\n css,\n className,\n}: Props) => {\n if (debug) {\n enableDebug()\n }\n\n const getCircuitHash = (circuitJson: CircuitJson) => {\n return `${circuitJson?.length || 0}_${(circuitJson as any)?.editCount || 0}`\n }\n\n const circuitJsonKey = useMemo(\n () => getCircuitHash(circuitJson),\n [circuitJson],\n )\n\n // Schematic sheets present in the circuit, sorted by sheet_index. A circuit\n // may have zero (single implicit sheet), one, or many sheets.\n const schematicSheets = useMemo<SchematicSheet[]>(() => {\n try {\n return (circuitJson as any[])\n .filter((elm) => elm?.type === \"schematic_sheet\")\n .slice()\n .sort((a, b) => (a.sheet_index ?? 0) - (b.sheet_index ?? 0))\n } catch (err) {\n console.error(\"Failed to derive schematic sheets\", err)\n return []\n }\n }, [circuitJsonKey])\n\n const hasMultipleSheets = schematicSheets.length > 1\n const defaultSheetId = schematicSheets[0]?.schematic_sheet_id\n\n const [selectedSheetId, setSelectedSheetId] = useState<string | undefined>(\n () => {\n // Restore the last-viewed sheet from localStorage so it survives reloads.\n const stored = getStoredString(STORAGE_KEYS.SELECTED_SCHEMATIC_SHEET)\n if (\n stored &&\n schematicSheets.some((s) => s.schematic_sheet_id === stored)\n ) {\n return stored\n }\n return defaultSheetId\n },\n )\n\n // Keep the selection valid as the circuit changes: fall back to the default\n // sheet if the previously-selected sheet no longer exists.\n useEffect(() => {\n const stillExists =\n selectedSheetId !== undefined &&\n schematicSheets.some((s) => s.schematic_sheet_id === selectedSheetId)\n if (!stillExists) {\n setSelectedSheetId(defaultSheetId)\n }\n }, [circuitJsonKey])\n\n // The sheet that should actually be rendered. When there is a single sheet\n // (or none) we leave this undefined so circuit-to-svg uses its default and\n // behavior is unchanged for single-sheet circuits.\n const activeSheetId = hasMultipleSheets\n ? (selectedSheetId ?? defaultSheetId)\n : undefined\n\n const handleSelectSheet = useCallback(\n (sheetId: string) => {\n setSelectedSheetId(sheetId)\n setStoredString(STORAGE_KEYS.SELECTED_SCHEMATIC_SHEET, sheetId)\n onSchematicSheetChange?.(sheetId)\n },\n [onSchematicSheetChange],\n )\n\n const [editModeEnabled, setEditModeEnabled] = useState(defaultEditMode)\n const [snapToGrid, setSnapToGrid] = useState(true)\n const [showGridInternal, setShowGridInternal] = useState(false)\n const showGrid = debugGrid || showGridInternal\n const [isInteractionEnabled, setIsInteractionEnabled] = useState<boolean>(\n !clickToInteractEnabled,\n )\n const [showViewMenu, setShowViewMenu] = useState(false)\n const [showSchematicGroups, setShowSchematicGroups] = useState(() => {\n if (disableGroups) return false\n return getStoredBoolean(\"schematic_viewer_show_groups\", false)\n })\n const [isHoveringClickableComponent, setIsHoveringClickableComponent] =\n useState(false)\n const hoveringComponentsRef = useRef<Set<string>>(new Set())\n\n const handleComponentHoverChange = useCallback(\n (componentId: string, isHovering: boolean) => {\n if (isHovering) {\n hoveringComponentsRef.current.add(componentId)\n } else {\n hoveringComponentsRef.current.delete(componentId)\n }\n setIsHoveringClickableComponent(hoveringComponentsRef.current.size > 0)\n },\n [],\n )\n\n const [isHoveringClickablePort, setIsHoveringClickablePort] = useState(false)\n const hoveringPortsRef = useRef<Set<string>>(new Set())\n\n const handlePortHoverChange = useCallback(\n (portId: string, isHovering: boolean) => {\n if (isHovering) {\n hoveringPortsRef.current.add(portId)\n } else {\n hoveringPortsRef.current.delete(portId)\n }\n setIsHoveringClickablePort(hoveringPortsRef.current.size > 0)\n },\n [],\n )\n\n const svgDivRef = useRef<HTMLDivElement>(null)\n const touchStartRef = useRef<{ x: number; y: number } | null>(null)\n\n const schematicComponentIds = useMemo(() => {\n try {\n const components = su(circuitJson).schematic_component?.list() ?? []\n return components\n .filter(\n (component) =>\n !activeSheetId || component.schematic_sheet_id === activeSheetId,\n )\n .map((component) => component.schematic_component_id as string)\n } catch (err) {\n console.error(\"Failed to derive schematic component ids\", err)\n return []\n }\n }, [circuitJsonKey, circuitJson, activeSheetId])\n\n const schematicPortsInfo = useMemo(() => {\n if (!showSchematicPorts) return []\n try {\n const ports = (su(circuitJson).schematic_port?.list() ?? []).filter(\n (port) => !activeSheetId || port.schematic_sheet_id === activeSheetId,\n )\n return ports.map((port) => {\n const sourcePort = su(circuitJson).source_port.get(port.source_port_id)\n const sourceComponent = sourcePort?.source_component_id\n ? su(circuitJson).source_component.get(sourcePort.source_component_id)\n : null\n const componentName = sourceComponent?.name ?? \"?\"\n const pinLabel =\n port.display_pin_label ??\n (sourcePort as any)?.pin_number ??\n (sourcePort as any)?.name ??\n \"?\"\n return {\n portId: port.source_port_id as string,\n label: `${componentName}.${pinLabel}`,\n }\n })\n } catch (err) {\n console.error(\"Failed to derive schematic port info\", err)\n return []\n }\n }, [circuitJsonKey, circuitJson, showSchematicPorts, activeSheetId])\n\n const handleTouchStart = (e: React.TouchEvent) => {\n const touch = e.touches[0]\n touchStartRef.current = {\n x: touch.clientX,\n y: touch.clientY,\n }\n }\n\n const handleTouchEnd = (e: React.TouchEvent) => {\n const touch = e.changedTouches[0]\n const start = touchStartRef.current\n if (!start) return\n\n const deltaX = Math.abs(touch.clientX - start.x)\n const deltaY = Math.abs(touch.clientY - start.y)\n\n if (deltaX < 10 && deltaY < 10) {\n e.preventDefault()\n setIsInteractionEnabled(true)\n }\n\n touchStartRef.current = null\n }\n\n const [internalEditEvents, setInternalEditEvents] = useState<\n ManualEditEvent[]\n >([])\n const circuitJsonRef = useRef<CircuitJson>(circuitJson)\n\n useEffect(() => {\n const circuitHash = getCircuitHash(circuitJson)\n const circuitHashRef = getCircuitHash(circuitJsonRef.current)\n\n if (circuitHash !== circuitHashRef) {\n setInternalEditEvents([])\n circuitJsonRef.current = circuitJson\n }\n }, [circuitJson])\n\n const {\n ref: containerRef,\n cancelDrag,\n transform: svgToScreenProjection,\n } = useMouseMatrixTransform({\n onSetTransform(transform) {\n if (!svgDivRef.current) return\n svgDivRef.current.style.transform = transformToString(transform)\n },\n // @ts-ignore disabled is a valid prop but not typed\n enabled: isInteractionEnabled,\n })\n\n const { containerWidth, containerHeight } = useResizeHandling(containerRef)\n const svgString = useMemo(() => {\n if (!containerWidth || !containerHeight) return \"\"\n\n return convertCircuitJsonToSchematicSvg(circuitJson as any, {\n width: containerWidth,\n height: containerHeight || 720,\n drawPorts: showSchematicPorts,\n schematicSheetId: activeSheetId,\n grid: !showGrid\n ? undefined\n : {\n cellSize: 1,\n labelCells: true,\n },\n colorOverrides,\n css,\n className,\n })\n }, [\n circuitJsonKey,\n containerWidth,\n containerHeight,\n showGrid,\n showSchematicPorts,\n activeSheetId,\n ])\n\n const containerBackgroundColor = useMemo(() => {\n const match = svgString.match(\n /<svg[^>]*style=\"[^\"]*background-color:\\s*([^;\\\"]+)/i,\n )\n return match?.[1] ?? \"transparent\"\n }, [svgString])\n\n const realToSvgProjection = useMemo(() => {\n if (!svgString) return identity()\n const transformString = svgString.match(\n /data-real-to-screen-transform=\"([^\"]+)\"/,\n )?.[1]!\n\n try {\n return fromString(transformString)\n } catch (e) {\n console.error(e)\n return identity()\n }\n }, [svgString])\n\n const handleEditEvent = (event: ManualEditEvent) => {\n setInternalEditEvents((prev) => [...prev, event])\n if (onEditEvent) {\n onEditEvent(event)\n }\n }\n\n const editEventsWithUnappliedEditEvents = useMemo(() => {\n return [...unappliedEditEvents, ...internalEditEvents]\n }, [unappliedEditEvents, internalEditEvents])\n\n const {\n handleMouseDown,\n handleTouchStart: handleComponentTouchStart,\n isDragging,\n activeEditEvent,\n } = useComponentDragging({\n onEditEvent: handleEditEvent,\n cancelDrag,\n realToSvgProjection,\n svgToScreenProjection,\n circuitJson,\n editEvents: editEventsWithUnappliedEditEvents,\n enabled: editModeEnabled && isInteractionEnabled,\n snapToGrid,\n })\n\n useChangeSchematicComponentLocationsInSvg({\n svgDivRef,\n editEvents: editEventsWithUnappliedEditEvents,\n realToSvgProjection,\n svgToScreenProjection,\n activeEditEvent,\n })\n\n useChangeSchematicTracesForMovedComponents({\n svgDivRef,\n circuitJson,\n activeEditEvent,\n editEvents: editEventsWithUnappliedEditEvents,\n })\n\n // Add group overlays when enabled. The key includes the active sheet so\n // overlays are recomputed against the freshly-rendered sheet's SVG.\n useSchematicGroupsOverlay({\n svgDivRef,\n circuitJson,\n circuitJsonKey: `${circuitJsonKey}_${activeSheetId ?? \"\"}`,\n showGroups: showSchematicGroups && !disableGroups,\n })\n\n // Fade unrelated nets/chips when hovering a wire or net label (JS-driven; the\n // base SVG carries no interaction).\n useSchematicNetHover({\n svgDivRef,\n circuitJson,\n circuitJsonKey: `${circuitJsonKey}_${activeSheetId ?? \"\"}`,\n enabled: netHoverHighlightEnabled,\n })\n\n // keep the latest touch handler without re-rendering the svg div\n const handleComponentTouchStartRef = useRef(handleComponentTouchStart)\n useEffect(() => {\n handleComponentTouchStartRef.current = handleComponentTouchStart\n }, [handleComponentTouchStart])\n\n const svgDiv = useMemo(\n () => (\n <div\n ref={svgDivRef}\n style={{\n pointerEvents: clickToInteractEnabled\n ? isInteractionEnabled\n ? \"auto\"\n : \"none\"\n : \"auto\",\n transformOrigin: \"0 0\",\n }}\n className={\n onSchematicComponentClicked\n ? \"schematic-component-clickable\"\n : undefined\n }\n onTouchStart={(e) => {\n if (editModeEnabled && isInteractionEnabled) {\n handleComponentTouchStartRef.current(e)\n }\n }}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>\n dangerouslySetInnerHTML={{ __html: svgString }}\n />\n ),\n [svgString, isInteractionEnabled, clickToInteractEnabled, editModeEnabled],\n )\n\n return (\n <MouseTracker>\n {netHoverHighlightEnabled && (\n <style>\n {`.sch-net-faded { opacity: 0.35; }\n svg :is(g.trace, g.trace-overlays, g[data-schematic-component-id], [data-schematic-net-label-id]) { transition: opacity 0.12s ease-in-out; }`}\n </style>\n )}\n {onSchematicComponentClicked && (\n <style>\n {`.schematic-component-clickable [data-schematic-component-id]:hover { cursor: pointer !important; }`}\n </style>\n )}\n {onSchematicPortClicked && (\n <style>\n {`[data-schematic-port-id]:hover { cursor: pointer !important; }`}\n </style>\n )}\n <div\n ref={containerRef}\n style={{\n position: \"relative\",\n backgroundColor: containerBackgroundColor,\n overflow: \"hidden\",\n cursor: isDragging\n ? \"grabbing\"\n : clickToInteractEnabled && !isInteractionEnabled\n ? \"pointer\"\n : isHoveringClickableComponent && onSchematicComponentClicked\n ? \"pointer\"\n : isHoveringClickablePort && onSchematicPortClicked\n ? \"pointer\"\n : \"grab\",\n minHeight: \"300px\",\n ...containerStyle,\n }}\n onMouseDown={(e) => {\n if (clickToInteractEnabled && !isInteractionEnabled) {\n e.preventDefault()\n e.stopPropagation()\n return\n }\n handleMouseDown(e)\n }}\n onMouseDownCapture={(e) => {\n if (clickToInteractEnabled && !isInteractionEnabled) {\n e.preventDefault()\n e.stopPropagation()\n return\n }\n }}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n >\n {!isInteractionEnabled && clickToInteractEnabled && (\n <div\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n setIsInteractionEnabled(true)\n }}\n style={{\n position: \"absolute\",\n inset: 0,\n cursor: \"pointer\",\n zIndex: zIndexMap.clickToInteractOverlay,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n pointerEvents: \"all\",\n touchAction: \"pan-x pan-y pinch-zoom\",\n }}\n >\n <div\n style={{\n backgroundColor: \"rgba(0, 0, 0, 0.8)\",\n color: \"white\",\n padding: \"12px 24px\",\n borderRadius: \"8px\",\n fontSize: \"16px\",\n fontFamily: \"sans-serif\",\n pointerEvents: \"none\",\n }}\n >\n {typeof window !== \"undefined\" &&\n (\"ontouchstart\" in window || navigator.maxTouchPoints > 0)\n ? \"Touch to Interact\"\n : \"Click to Interact\"}\n </div>\n </div>\n )}\n {editingEnabled && (\n <EditIcon\n active={editModeEnabled}\n onClick={() => setEditModeEnabled(!editModeEnabled)}\n />\n )}\n {editingEnabled && editModeEnabled && (\n <GridIcon\n active={snapToGrid}\n onClick={() => setSnapToGrid(!snapToGrid)}\n />\n )}\n <ViewMenu\n circuitJson={circuitJson}\n circuitJsonKey={circuitJsonKey}\n open={showViewMenu}\n onOpenChange={setShowViewMenu}\n showGroups={showSchematicGroups}\n onToggleGroups={(value) => {\n if (!disableGroups) {\n setShowSchematicGroups(value)\n setStoredBoolean(\"schematic_viewer_show_groups\", value)\n }\n }}\n showGrid={showGrid}\n onToggleGrid={setShowGridInternal}\n />\n <SchematicSheetSelector\n sheets={schematicSheets}\n selectedSheetId={activeSheetId}\n onSelectSheet={handleSelectSheet}\n />\n {onSchematicComponentClicked &&\n schematicComponentIds.map((componentId) => (\n <SchematicComponentMouseTarget\n key={componentId}\n componentId={componentId}\n svgDivRef={svgDivRef}\n containerRef={containerRef}\n showOutline={true}\n circuitJsonKey={circuitJsonKey}\n onHoverChange={handleComponentHoverChange}\n onComponentClick={(id, event) => {\n onSchematicComponentClicked?.({\n schematicComponentId: id,\n event,\n })\n }}\n />\n ))}\n {svgDiv}\n {showSchematicPorts &&\n schematicPortsInfo.map(({ portId, label }) => (\n <SchematicPortMouseTarget\n key={portId}\n portId={portId}\n portLabel={label}\n svgDivRef={svgDivRef}\n containerRef={containerRef}\n showOutline={true}\n circuitJsonKey={circuitJsonKey}\n onHoverChange={handlePortHoverChange}\n onPortClick={\n onSchematicPortClicked\n ? (id, event) => {\n onSchematicPortClicked?.({\n schematicPortId: id,\n event,\n })\n }\n : undefined\n }\n />\n ))}\n </div>\n </MouseTracker>\n )\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type {\n ManualEditEvent,\n EditSchematicComponentLocationEventWithElement,\n} from \"lib/types/edit-events\"\nimport { type Matrix, compose, applyToPoint } from \"transformation-matrix\"\nimport { useEffect, useRef } from \"react\"\nimport { getComponentOffsetDueToEvents } from \"lib/utils/get-component-offset-due-to-events\"\nimport type { CircuitJson } from \"circuit-json\"\n\n/**\n * This hook automatically applies the edit events to the schematic components\n * inside the svg div.\n *\n * Schematic components are \"<g>\" elements with a \"data-circuit-json-type\"\n * attribute equal to \"schematic_component\", these elements also have a\n * data-schematic-component-id attribute equal to the schematic_component_id\n */\nexport const useChangeSchematicComponentLocationsInSvg = ({\n svgDivRef,\n realToSvgProjection,\n svgToScreenProjection,\n activeEditEvent,\n editEvents,\n}: {\n svgDivRef: React.RefObject<HTMLDivElement | null>\n realToSvgProjection: Matrix\n svgToScreenProjection: Matrix\n activeEditEvent: EditSchematicComponentLocationEventWithElement | null\n editEvents: ManualEditEvent[]\n}) => {\n // Keep track of the last known SVG content\n const lastSvgContentRef = useRef<string | null>(null)\n\n useEffect(() => {\n const svg = svgDivRef.current\n if (!svg) return\n\n // Create a MutationObserver to watch for changes in the div's content\n const observer = new MutationObserver((mutations) => {\n // Check if the SVG content has changed\n const currentSvgContent = svg.innerHTML\n if (currentSvgContent !== lastSvgContentRef.current) {\n lastSvgContentRef.current = currentSvgContent\n\n // Apply the transforms\n applyTransforms()\n }\n })\n\n // Function to apply transforms to components\n const applyTransforms = () => {\n const componentsThatHaveBeenMoved = new Set<string>()\n for (const event of editEvents) {\n if (\n \"edit_event_type\" in event &&\n event.edit_event_type === \"edit_schematic_component_location\"\n ) {\n componentsThatHaveBeenMoved.add(event.schematic_component_id)\n }\n }\n if (activeEditEvent) {\n componentsThatHaveBeenMoved.add(activeEditEvent.schematic_component_id)\n }\n\n // Reset all transforms\n const allComponents = svg.querySelectorAll(\n '[data-circuit-json-type=\"schematic_component\"]',\n )\n\n for (const component of Array.from(allComponents)) {\n const schematic_component_id = component.getAttribute(\n \"data-schematic-component-id\",\n )!\n\n const offsetMm = getComponentOffsetDueToEvents({\n editEvents: [\n ...editEvents,\n ...(activeEditEvent ? [activeEditEvent] : []),\n ],\n schematic_component_id,\n })\n\n const offsetPx = {\n x: offsetMm.x * realToSvgProjection.a,\n y: offsetMm.y * realToSvgProjection.d,\n }\n\n const style: any = (component as any).style\n style.transform = `translate(${offsetPx.x}px, ${offsetPx.y}px)`\n if (\n activeEditEvent?.schematic_component_id === schematic_component_id\n ) {\n style.outline = \"solid 2px rgba(255,0,0,0.5)\"\n style.outlineOffset = \"5px\"\n } else if (style.outline) {\n style.outline = \"\"\n }\n }\n }\n\n // Start observing the div for changes\n observer.observe(svg, {\n childList: true, // Watch for changes to the child elements\n subtree: false, // Watch for changes in the entire subtree\n characterData: false, // Watch for changes to text content\n })\n\n // Apply transforms immediately on mount or when editEvents change\n applyTransforms()\n\n // Cleanup function\n return () => {\n observer.disconnect()\n }\n }, [svgDivRef, editEvents, activeEditEvent]) // Dependencies remain the same\n}\n","import type {\n EditSchematicComponentLocationEvent,\n EditSchematicComponentLocationEventWithElement,\n ManualEditEvent,\n} from \"lib/types/edit-events\"\n\n/**\n * Returns the total offset of a component due to a set of edit events in\n * mm\n */\nexport const getComponentOffsetDueToEvents = ({\n editEvents,\n schematic_component_id,\n}: {\n editEvents: ManualEditEvent[]\n schematic_component_id: string\n}) => {\n const editEventsForComponent: EditSchematicComponentLocationEvent[] =\n editEvents\n .filter(\n (event) =>\n \"schematic_component_id\" in event &&\n event.schematic_component_id === schematic_component_id,\n )\n .filter(\n (event) =>\n \"edit_event_type\" in event &&\n event.edit_event_type === \"edit_schematic_component_location\",\n )\n\n const totalOffsetX = editEventsForComponent.reduce((acc, event) => {\n return acc + event.new_center.x - event.original_center.x\n }, 0)\n\n const totalOffsetY = editEventsForComponent.reduce((acc, event) => {\n return acc + event.new_center.y - event.original_center.y\n }, 0)\n\n return {\n x: totalOffsetX,\n y: totalOffsetY,\n }\n}\n","import { useEffect, useRef } from \"react\"\nimport { su } from \"@tscircuit/soup-util\"\nimport type { ManualEditEvent } from \"../types/edit-events\"\nimport type { CircuitJson } from \"circuit-json\"\n\n/**\n * This hook makes traces dashed when their connected components are being moved\n */\nexport const useChangeSchematicTracesForMovedComponents = ({\n svgDivRef,\n circuitJson,\n activeEditEvent,\n editEvents,\n}: {\n svgDivRef: React.RefObject<HTMLDivElement | null>\n circuitJson: CircuitJson\n activeEditEvent: ManualEditEvent | null\n editEvents: ManualEditEvent[]\n}) => {\n // Keep track of the last known SVG content\n const lastSvgContentRef = useRef<string | null>(null)\n\n useEffect(() => {\n const svg = svgDivRef.current\n if (!svg) return\n\n const updateTraceStyles = () => {\n // Reset all traces to solid\n const allTraces = svg.querySelectorAll(\n '[data-circuit-json-type=\"schematic_trace\"] path',\n )\n\n // Reset all traces to solid\n for (const trace of Array.from(allTraces)) {\n trace.setAttribute(\"stroke-dasharray\", \"0\")\n ;(trace as any).style.animation = \"\"\n }\n\n // If there's an active edit event, make connected traces dashed\n for (const editEvent of [\n ...editEvents,\n ...(activeEditEvent ? [activeEditEvent] : []),\n ]) {\n if (\n \"schematic_component_id\" in editEvent &&\n editEvent.edit_event_type === \"edit_schematic_component_location\"\n ) {\n const sch_component = su(circuitJson).schematic_component.get(\n editEvent.schematic_component_id,\n )\n if (!sch_component) return\n\n const src_ports = su(circuitJson).source_port.list({\n source_component_id: sch_component.source_component_id,\n })\n const src_port_ids = new Set(src_ports.map((sp) => sp.source_port_id))\n const src_traces = su(circuitJson)\n .source_trace.list()\n .filter((st) =>\n st.connected_source_port_ids?.some((spi: string) =>\n src_port_ids.has(spi),\n ),\n )\n const src_trace_ids = new Set(\n src_traces.map((st) => st.source_trace_id),\n )\n const schematic_traces = su(circuitJson)\n .schematic_trace.list()\n .filter((st) => src_trace_ids.has(st.source_trace_id!))\n\n // Make the connected traces dashed\n schematic_traces.forEach((trace) => {\n const traceElements = svg.querySelectorAll(\n `[data-schematic-trace-id=\"${trace.schematic_trace_id}\"] path`,\n )\n for (const traceElement of Array.from(traceElements)) {\n if (traceElement.getAttribute(\"class\")?.includes(\"invisible\"))\n continue\n traceElement.setAttribute(\"stroke-dasharray\", \"20,20\")\n ;(traceElement as any).style.animation =\n \"dash-animation 350ms linear infinite, pulse-animation 900ms linear infinite\"\n\n if (!svg.querySelector(\"style#dash-animation\")) {\n const style = document.createElement(\"style\")\n style.id = \"dash-animation\"\n style.textContent = `\n @keyframes dash-animation {\n to {\n stroke-dashoffset: -40;\n }\n }\n @keyframes pulse-animation {\n 0% { opacity: 0.6; }\n 50% { opacity: 0.2; }\n 100% { opacity: 0.6; }\n }\n `\n svg.appendChild(style)\n }\n }\n })\n }\n }\n }\n\n // Apply styles immediately\n updateTraceStyles()\n\n // Cleanup function\n const observer = new MutationObserver(updateTraceStyles)\n observer.observe(svg, {\n childList: true, // Watch for changes to the child elements\n subtree: false, // Watch for changes in the entire subtree\n characterData: false, // Watch for changes to text content\n })\n\n return () => {\n observer.disconnect()\n }\n }, [svgDivRef, activeEditEvent, circuitJson, editEvents])\n}\n","import { useEffect } from \"react\"\nimport { su } from \"@tscircuit/soup-util\"\nimport type { CircuitJson } from \"circuit-json\"\n\ninterface UseSchematicGroupsOverlayOptions {\n svgDivRef: React.RefObject<HTMLDivElement | null>\n circuitJson: CircuitJson\n circuitJsonKey: string\n showGroups: boolean\n}\n\nconst GROUP_COLORS = [\n \"#8B0000\", // Dark Red\n \"#2F4F4F\", // Dark Slate Gray\n \"#191970\", // Midnight Blue\n \"#006400\", // Dark Green\n \"#FF4500\", // Dark Orange\n \"#800080\", // Purple\n \"#2E8B57\", // Sea Green\n \"#B8860B\", // Dark Goldenrod\n \"#C71585\", // Medium Violet Red\n \"#008B8B\", // Dark Cyan\n]\n\nexport const useSchematicGroupsOverlay = (\n options: UseSchematicGroupsOverlayOptions,\n) => {\n const { svgDivRef, circuitJson, circuitJsonKey, showGroups } = options\n\n useEffect(() => {\n // Always clean up existing overlays first\n if (svgDivRef.current) {\n const existingOverlays = svgDivRef.current.querySelectorAll(\n \".schematic-group-overlay\",\n )\n existingOverlays.forEach((overlay) => overlay.remove())\n }\n\n if (\n !svgDivRef.current ||\n !showGroups ||\n !circuitJson ||\n circuitJson.length === 0\n ) {\n return\n }\n\n // Small delay to ensure SVG is rendered when groups are enabled from localStorage\n const timeoutId = setTimeout(() => {\n if (!svgDivRef.current) return\n\n const svg = svgDivRef.current.querySelector(\"svg\")\n if (!svg) {\n return\n }\n\n const existingOverlays = svg.querySelectorAll(\".schematic-group-overlay\")\n existingOverlays.forEach((overlay) => overlay.remove())\n\n try {\n const sourceGroups =\n su(circuitJson)\n .source_group?.list()\n .filter((x) => !!!x.is_subcircuit) || []\n const schematicComponents =\n su(circuitJson).schematic_component?.list() || []\n\n const sourceGroupHierarchy = new Map<string, string[]>()\n sourceGroups.forEach((group) => {\n const groupWithParent = group as any\n if (groupWithParent.parent_source_group_id) {\n const children =\n sourceGroupHierarchy.get(\n groupWithParent.parent_source_group_id,\n ) || []\n children.push(group.source_group_id)\n sourceGroupHierarchy.set(\n groupWithParent.parent_source_group_id,\n children,\n )\n }\n })\n\n const getAllDescendantSourceGroups = (\n sourceGroupId: string,\n ): string[] => {\n const descendants: string[] = []\n const children = sourceGroupHierarchy.get(sourceGroupId) || []\n for (const child of children) {\n descendants.push(child)\n descendants.push(...getAllDescendantSourceGroups(child))\n }\n return descendants\n }\n\n const getGroupDepthLevel = (sourceGroupId: string): number => {\n const groupWithParent = sourceGroups.find(\n (g) => g.source_group_id === sourceGroupId,\n ) as any\n if (!groupWithParent?.parent_source_group_id) {\n return 0\n }\n return 1 + getGroupDepthLevel(groupWithParent.parent_source_group_id)\n }\n\n const hasMeaningfulGroups =\n sourceGroups.length > 0 &&\n sourceGroups.some((group) => group.name && group.name.trim() !== \"\")\n\n let groupsToRender: Array<{\n id: string\n name: string\n components: any[]\n color: string\n depthLevel: number\n hasChildren: boolean\n sourceGroupId?: string\n }> = []\n\n if (hasMeaningfulGroups) {\n const groupMap = new Map<string, any[]>()\n\n for (const comp of schematicComponents) {\n const sourceComp = su(circuitJson).source_component.get(\n comp.source_component_id!,\n )\n if (sourceComp?.source_group_id) {\n if (!groupMap.has(sourceComp.source_group_id)) {\n groupMap.set(sourceComp.source_group_id, [])\n }\n groupMap.get(sourceComp.source_group_id)!.push(comp)\n }\n }\n\n sourceGroups.forEach((group, index) => {\n let groupComponents = groupMap.get(group.source_group_id) || []\n\n const descendantGroups = getAllDescendantSourceGroups(\n group.source_group_id,\n )\n for (const descendantGroupId of descendantGroups) {\n const descendantComponents = groupMap.get(descendantGroupId) || []\n groupComponents = [...groupComponents, ...descendantComponents]\n }\n\n if (groupComponents.length > 0) {\n const depthLevel = getGroupDepthLevel(group.source_group_id)\n const hasChildren =\n getAllDescendantSourceGroups(group.source_group_id).length > 0\n\n if (group.name?.startsWith(\"unnamed_board\")) return\n groupsToRender.push({\n id: group.source_group_id,\n name: group.name || `Group ${index + 1}`,\n components: groupComponents,\n color: GROUP_COLORS[index % GROUP_COLORS.length],\n depthLevel,\n hasChildren,\n sourceGroupId: group.source_group_id,\n })\n }\n })\n }\n // else {\n // const componentTypeGroups = new Map<string, any[]>()\n\n // for (const comp of schematicComponents) {\n // const sourceComp = su(circuitJson).source_component.get(comp.source_component_id)\n // if (sourceComp) {\n // const componentType = sourceComp.ftype || \"other\"\n // if (!componentTypeGroups.has(componentType)) {\n // componentTypeGroups.set(componentType, [])\n // }\n // componentTypeGroups.get(componentType)!.push(comp)\n // }\n // }\n // // groupsToRender = Array.from(componentTypeGroups.entries()).map(\n // // ([type, components], index) => ({\n // // id: `type_${type}`,\n // // name: `${type.charAt(0).toUpperCase() + type.slice(1)}s`,\n // // components,\n // // color: GROUP_COLORS[index % GROUP_COLORS.length],\n // // depthLevel: 0,\n // // hasChildren: false,\n // // }),\n // // )\n // }\n\n const viewBox = svg.viewBox.baseVal\n const svgRect = svg.getBoundingClientRect()\n const scale =\n Math.min(\n svgRect.width / viewBox.width,\n svgRect.height / viewBox.height,\n ) || 1\n\n groupsToRender.sort((a, b) => a.depthLevel - b.depthLevel)\n\n groupsToRender.forEach((group) => {\n if (group.components.length === 0) return\n\n const groupBounds = calculateGroupBounds(group.components, svg)\n if (!groupBounds) return\n\n const basePadding = Math.max(\n 8,\n Math.min(25, 15 / Math.max(scale, 0.3)),\n )\n const hierarchyPadding = group.hasChildren ? basePadding * 0.6 : 0\n const totalPadding = basePadding + hierarchyPadding\n\n const baseStrokeWidth = Math.max(1, 2 / Math.max(scale, 0.5))\n const strokeWidth =\n group.depthLevel === 0 ? baseStrokeWidth : baseStrokeWidth * 0.7\n\n const baseDashSize = Math.max(4, 8 / Math.max(scale, 0.5))\n const dashMultiplier = group.hasChildren ? 1.3 : 1\n const dashSize = baseDashSize * dashMultiplier\n const gapSize = dashSize * 0.5\n\n const groupOverlay = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"rect\",\n )\n groupOverlay.setAttribute(\"class\", \"schematic-group-overlay\")\n groupOverlay.setAttribute(\n \"x\",\n (groupBounds.minX - totalPadding).toString(),\n )\n groupOverlay.setAttribute(\n \"y\",\n (groupBounds.minY - totalPadding).toString(),\n )\n groupOverlay.setAttribute(\n \"width\",\n (groupBounds.maxX - groupBounds.minX + totalPadding * 2).toString(),\n )\n groupOverlay.setAttribute(\n \"height\",\n (groupBounds.maxY - groupBounds.minY + totalPadding * 2).toString(),\n )\n groupOverlay.setAttribute(\"fill\", \"none\")\n groupOverlay.setAttribute(\"stroke\", group.color)\n groupOverlay.setAttribute(\"stroke-width\", strokeWidth.toString())\n groupOverlay.setAttribute(\n \"stroke-dasharray\",\n `${dashSize},${gapSize}`,\n )\n groupOverlay.setAttribute(\"opacity\", \"0.8\")\n groupOverlay.setAttribute(\"rx\", \"0\")\n groupOverlay.setAttribute(\"ry\", \"0\")\n\n const baseFontSize = Math.max(\n 6,\n Math.min(20, 14 / Math.max(scale, 0.2)),\n )\n const fontSizeReduction =\n group.depthLevel === 0 || group.depthLevel === 1\n ? 0\n : group.depthLevel * 0.2\n const fontSize = baseFontSize * (1 - fontSizeReduction)\n\n const labelPadding = Math.max(1, fontSize * 0.2)\n const labelText = group.name\n\n const tempText = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"text\",\n )\n tempText.setAttribute(\"font-size\", fontSize.toString())\n tempText.setAttribute(\"font-family\", \"Arial, sans-serif\")\n tempText.textContent = labelText\n svg.appendChild(tempText)\n const textBBox = tempText.getBBox()\n svg.removeChild(tempText)\n\n const labelWidth = textBBox.width + labelPadding * 2\n const labelHeight = fontSize + labelPadding * 2\n const labelX = groupBounds.minX - totalPadding\n const labelY = groupBounds.minY - totalPadding - labelHeight\n\n const labelBg = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"rect\",\n )\n labelBg.setAttribute(\"class\", \"schematic-group-overlay\")\n labelBg.setAttribute(\"x\", labelX.toString())\n labelBg.setAttribute(\"y\", (labelY - labelHeight).toString())\n labelBg.setAttribute(\"width\", labelWidth.toString())\n labelBg.setAttribute(\"height\", labelHeight.toString())\n labelBg.setAttribute(\"fill\", \"transparent\")\n labelBg.setAttribute(\"rx\", \"0\")\n labelBg.setAttribute(\"ry\", \"0\")\n\n const groupLabel = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"text\",\n )\n groupLabel.setAttribute(\"class\", \"schematic-group-overlay\")\n groupLabel.setAttribute(\"x\", (labelX + labelPadding).toString())\n groupLabel.setAttribute(\n \"y\",\n (labelY + labelHeight - labelPadding).toString(),\n )\n groupLabel.setAttribute(\"fill\", group.color)\n groupLabel.setAttribute(\"font-size\", fontSize.toString())\n groupLabel.setAttribute(\"font-family\", \"Arial, sans-serif\")\n groupLabel.setAttribute(\n \"font-weight\",\n group.depthLevel === 0 ? \"600\" : \"500\",\n )\n groupLabel.setAttribute(\"stroke\", group.color)\n groupLabel.setAttribute(\n \"stroke-width\",\n Math.max(0.2, fontSize * 0.02).toString(),\n )\n groupLabel.textContent = labelText\n\n svg.appendChild(groupOverlay)\n svg.appendChild(labelBg)\n svg.appendChild(groupLabel)\n })\n } catch (error) {\n console.error(\"Error creating group overlays:\", error)\n }\n }, 10) // Small delay to ensure SVG is ready\n\n return () => clearTimeout(timeoutId)\n }, [svgDivRef, circuitJsonKey, showGroups])\n}\n\nfunction calculateGroupBounds(components: any[], svg: SVGElement) {\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity\n\n for (const component of components) {\n let componentElement = svg.querySelector(\n `g[data-schematic-component-id=\"${component.schematic_component_id}\"]`,\n )\n\n if (!componentElement) {\n componentElement = svg.querySelector(\n `[data-schematic-component-id=\"${component.schematic_component_id}\"]`,\n )\n }\n\n if (componentElement) {\n const bbox = (componentElement as SVGGraphicsElement).getBBox()\n minX = Math.min(minX, bbox.x)\n minY = Math.min(minY, bbox.y)\n maxX = Math.max(maxX, bbox.x + bbox.width)\n maxY = Math.max(maxY, bbox.y + bbox.height)\n }\n }\n\n if (minX === Infinity) {\n return null\n }\n\n const bounds = { minX, minY, maxX, maxY }\n return bounds\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type { CircuitJson } from \"circuit-json\"\nimport { useEffect } from \"react\"\n\nconst FADED_CLASS = \"sch-net-faded\"\n\nconst TRACE_SELECTOR =\n \"g.trace[data-subcircuit-connectivity-map-key], g.trace-overlays[data-subcircuit-connectivity-map-key]\"\n\nconst NET_LABEL_SELECTOR = \"[data-schematic-net-label-id]\"\n\n/**\n * Net highlighting on hover, done entirely in JS (the base SVG carries no\n * interaction). Hovering a wire or a net label fades every element that is NOT\n * part of that net — other nets' traces/labels and chips not connected to the\n * net — so the hovered net stands out by contrast rather than by recoloring.\n *\n * Identifies elements by the attributes circuit-to-svg emits:\n * - traces: g.trace[data-subcircuit-connectivity-map-key] (+ g.trace-overlays)\n * - components: g[data-schematic-component-id]\n * - net labels: [data-schematic-net-label-id] (per element, no wrapping group)\n *\n * Faded elements get the `sch-net-faded` class (styled by SchematicViewer).\n */\nexport const useSchematicNetHover = ({\n svgDivRef,\n circuitJson,\n circuitJsonKey,\n enabled,\n}: {\n svgDivRef: React.RefObject<HTMLDivElement | null>\n circuitJson: CircuitJson\n circuitJsonKey: string\n enabled: boolean\n}) => {\n useEffect(() => {\n const svgDiv = svgDivRef.current\n if (!enabled || !svgDiv) return\n\n const { componentIdToKeys, netLabelIdToKey } = buildNetRegistry(circuitJson)\n\n // Every net element and the net key(s) it belongs to, plus each hover\n // trigger's net key. Rebuilt from the SVG whenever it re-renders; the\n // listeners below read them by closure.\n let netElements: Array<{ el: Element; keys: Set<string> }> = []\n const triggerNetKeys = new Map<Element, string>()\n let hoveredNetKey: string | null = null\n\n const collectNetElements = () => {\n for (const { el } of netElements) el.classList.remove(FADED_CLASS)\n netElements = []\n triggerNetKeys.clear()\n hoveredNetKey = null\n\n const svg = svgDiv.querySelector(\"svg\")\n if (!svg) return\n\n for (const el of Array.from(svg.querySelectorAll(TRACE_SELECTOR))) {\n const key = el.getAttribute(\"data-subcircuit-connectivity-map-key\")\n const keys = new Set<string>()\n if (key) {\n keys.add(key)\n triggerNetKeys.set(el, key)\n }\n netElements.push({ el, keys })\n }\n for (const el of Array.from(\n svg.querySelectorAll(\"g[data-schematic-component-id]\"),\n )) {\n const id = el.getAttribute(\"data-schematic-component-id\")!\n netElements.push({ el, keys: componentIdToKeys.get(id) ?? new Set() })\n }\n for (const el of Array.from(svg.querySelectorAll(NET_LABEL_SELECTOR))) {\n const key = netLabelIdToKey.get(\n el.getAttribute(\"data-schematic-net-label-id\")!,\n )\n const keys = new Set<string>()\n if (key) {\n keys.add(key)\n triggerNetKeys.set(el, key)\n }\n netElements.push({ el, keys })\n }\n }\n\n // Fade everything not on `key` (null clears the fade).\n const highlightNet = (key: string | null) => {\n if (key === hoveredNetKey) return\n hoveredNetKey = key\n for (const { el, keys } of netElements) {\n el.classList.toggle(FADED_CLASS, key !== null && !keys.has(key))\n }\n }\n\n const handleMouseOver = (e: Event) => {\n const target = e.target\n if (!(target instanceof Element)) {\n highlightNet(null)\n return\n }\n const trigger = target.closest(`${TRACE_SELECTOR}, ${NET_LABEL_SELECTOR}`)\n if (!trigger) {\n highlightNet(null)\n return\n }\n highlightNet(triggerNetKeys.get(trigger) ?? null)\n }\n const handleMouseLeave = () => highlightNet(null)\n\n collectNetElements()\n svgDiv.addEventListener(\"mouseover\", handleMouseOver)\n svgDiv.addEventListener(\"mouseleave\", handleMouseLeave)\n\n // dangerouslySetInnerHTML replaces the <svg> node when the svg string\n // re-renders, so recollect against the fresh DOM. The listeners stay on the\n // stable svgDiv, so they don't need re-attaching.\n const observer = new MutationObserver(collectNetElements)\n observer.observe(svgDiv, { childList: true })\n\n return () => {\n observer.disconnect()\n svgDiv.removeEventListener(\"mouseover\", handleMouseOver)\n svgDiv.removeEventListener(\"mouseleave\", handleMouseLeave)\n for (const { el } of netElements) el.classList.remove(FADED_CLASS)\n }\n // Keyed on circuitJsonKey (content hash) rather than the circuitJson\n // reference, matching the other post-render SVG hooks.\n }, [svgDivRef, circuitJsonKey, enabled])\n}\n\n/**\n * Derives, from the circuit JSON, the net membership needed to relate DOM\n * elements to nets:\n * - componentIdToKeys: which connectivity nets each schematic component touches\n * - netLabelIdToKey: a schematic_net_label_id -> its connectivity key\n */\nfunction buildNetRegistry(circuitJson: CircuitJson) {\n const cju = su(circuitJson)\n\n // source_component_id -> schematic_component_id\n const srcCompToSchComp = new Map<string, string>()\n for (const c of cju.schematic_component.list()) {\n if (c.source_component_id) {\n srcCompToSchComp.set(c.source_component_id, c.schematic_component_id)\n }\n }\n\n // schematic_component_id -> the connectivity nets its ports belong to (a chip\n // sits on several nets). The connectivity key lives on source_trace.\n const componentIdToKeys = new Map<string, Set<string>>()\n for (const sourceTrace of cju.source_trace.list()) {\n const key = sourceTrace.subcircuit_connectivity_map_key\n if (!key) continue\n for (const portId of sourceTrace.connected_source_port_ids ?? []) {\n const schCompId = srcCompToSchComp.get(\n cju.source_port.get(portId)?.source_component_id ?? \"\",\n )\n if (!schCompId) continue\n if (!componentIdToKeys.has(schCompId)) {\n componentIdToKeys.set(schCompId, new Set())\n }\n componentIdToKeys.get(schCompId)!.add(key)\n }\n }\n\n // schematic_net_label_id -> connectivity key, resolved via its source_net\n // (same key the net's traces use). Falls back to source_net_id, which already\n // *is* the key for auto-emitted labels on unrouted nets (no source_net).\n const netLabelIdToKey = new Map<string, string>()\n for (const label of cju.schematic_net_label.list()) {\n if (!label.source_net_id) continue\n const key =\n cju.source_net.get(label.source_net_id)\n ?.subcircuit_connectivity_map_key ?? label.source_net_id\n netLabelIdToKey.set(label.schematic_net_label_id, key)\n }\n\n return { componentIdToKeys, netLabelIdToKey }\n}\n","import Debug from \"debug\"\n\nexport const debug = Debug(\"schematic-viewer\")\n\nexport const enableDebug = () => {\n Debug.enable(\"schematic-viewer*\")\n}\n\nexport default debug\n","import { useEffect, useState } from \"react\"\n\nexport const useResizeHandling = (\n containerRef: React.RefObject<HTMLElement>,\n) => {\n const [containerWidth, setContainerWidth] = useState(0)\n const [containerHeight, setContainerHeight] = useState(0)\n\n useEffect(() => {\n if (!containerRef.current) return\n\n const updateDimensions = () => {\n const rect = containerRef.current?.getBoundingClientRect()\n setContainerWidth(rect?.width || 0)\n setContainerHeight(rect?.height || 0)\n }\n\n // Set initial dimensions\n updateDimensions()\n\n // Add resize listener\n const resizeObserver = new ResizeObserver(updateDimensions)\n resizeObserver.observe(containerRef.current)\n\n // Fallback to window resize\n window.addEventListener(\"resize\", updateDimensions)\n\n return () => {\n resizeObserver.disconnect()\n window.removeEventListener(\"resize\", updateDimensions)\n }\n }, [])\n\n return { containerWidth, containerHeight }\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport Debug from \"lib/utils/debug\"\nimport { getComponentOffsetDueToEvents } from \"lib/utils/get-component-offset-due-to-events\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport { type Matrix, compose } from \"transformation-matrix\"\nimport type {\n EditSchematicComponentLocationEventWithElement,\n ManualEditEvent,\n} from \"../types/edit-events\"\n\nconst debug = Debug.extend(\"useComponentDragging\")\n\nexport const useComponentDragging = ({\n onEditEvent,\n editEvents = [],\n circuitJson,\n cancelDrag,\n svgToScreenProjection,\n realToSvgProjection,\n enabled = false,\n snapToGrid = false,\n}: {\n circuitJson: any[]\n editEvents: ManualEditEvent[]\n /** The projection returned from use-mouse-matrix-transform, indicating zoom on svg */\n svgToScreenProjection: Matrix\n /** The projection returned from circuit-to-svg, mm to svg */\n realToSvgProjection: Matrix\n onEditEvent?: (event: ManualEditEvent) => void\n cancelDrag?: () => void\n enabled?: boolean\n snapToGrid?: boolean\n}): {\n handleMouseDown: (e: React.MouseEvent) => void\n handleTouchStart: (e: React.TouchEvent) => void\n isDragging: boolean\n activeEditEvent: EditSchematicComponentLocationEventWithElement | null\n} => {\n const [activeEditEvent, setActiveEditEvent] =\n useState<EditSchematicComponentLocationEventWithElement | null>(null)\n const realToScreenProjection = compose(\n realToSvgProjection,\n svgToScreenProjection,\n )\n\n /**\n * Drag start position in screen space\n */\n const dragStartPosRef = useRef<{\n x: number\n y: number\n } | null>(null)\n\n const activeEditEventRef =\n useRef<EditSchematicComponentLocationEventWithElement | null>(null)\n\n // Store the latest positions of components being tracked\n const componentPositionsRef = useRef<Map<string, { x: number; y: number }>>(\n new Map(),\n )\n\n // Update position map with the latest positions from edit events\n useEffect(() => {\n // Process completed edit events to track latest positions\n editEvents.forEach((event) => {\n if (\n \"edit_event_type\" in event &&\n event.edit_event_type === \"edit_schematic_component_location\" &&\n !event.in_progress\n ) {\n componentPositionsRef.current.set(event.schematic_component_id, {\n ...event.new_center,\n })\n }\n })\n }, [editEvents])\n\n const startDrag = useCallback(\n (clientX: number, clientY: number, target: Element) => {\n if (!enabled) return false\n\n const componentGroup = target.closest(\n '[data-circuit-json-type=\"schematic_component\"]',\n )\n if (!componentGroup) return false\n\n const schematic_component_id = componentGroup.getAttribute(\n \"data-schematic-component-id\",\n )\n if (!schematic_component_id) return false\n\n if (cancelDrag) cancelDrag()\n\n const schematic_component = su(circuitJson).schematic_component.get(\n schematic_component_id,\n )\n if (!schematic_component) return false\n\n dragStartPosRef.current = { x: clientX, y: clientY }\n\n let current_position: { x: number; y: number }\n const trackedPosition = componentPositionsRef.current.get(\n schematic_component_id,\n )\n\n if (trackedPosition) {\n current_position = { ...trackedPosition }\n } else {\n const editEventOffset = getComponentOffsetDueToEvents({\n editEvents,\n schematic_component_id: schematic_component_id,\n })\n\n current_position = {\n x: schematic_component.center.x + editEventOffset.x,\n y: schematic_component.center.y + editEventOffset.y,\n }\n\n componentPositionsRef.current.set(schematic_component_id, {\n ...current_position,\n })\n }\n\n const newEditEvent: EditSchematicComponentLocationEventWithElement = {\n edit_event_id: Math.random().toString(36).substr(2, 9),\n edit_event_type: \"edit_schematic_component_location\",\n schematic_component_id: schematic_component_id,\n original_center: current_position,\n new_center: { ...current_position },\n in_progress: true,\n created_at: Date.now(),\n _element: componentGroup as any,\n }\n\n activeEditEventRef.current = newEditEvent\n setActiveEditEvent(newEditEvent)\n return true\n },\n [cancelDrag, enabled, circuitJson, editEvents],\n )\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n startDrag(e.clientX, e.clientY, e.target as Element)\n },\n [startDrag],\n )\n\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n if (e.touches.length !== 1) return\n const touch = e.touches[0]\n if (startDrag(touch.clientX, touch.clientY, e.target as Element)) {\n e.preventDefault()\n }\n },\n [startDrag],\n )\n\n const updateDragPosition = useCallback(\n (clientX: number, clientY: number) => {\n if (!activeEditEventRef.current || !dragStartPosRef.current) return\n\n const screenDelta = {\n x: clientX - dragStartPosRef.current.x,\n y: clientY - dragStartPosRef.current.y,\n }\n\n const mmDelta = {\n x: screenDelta.x / realToScreenProjection.a,\n y: screenDelta.y / realToScreenProjection.d,\n }\n\n let newCenter = {\n x: activeEditEventRef.current.original_center.x + mmDelta.x,\n y: activeEditEventRef.current.original_center.y + mmDelta.y,\n }\n if (snapToGrid) {\n const snap = (v: number) => Math.round(v * 10) / 10\n newCenter = { x: snap(newCenter.x), y: snap(newCenter.y) }\n }\n\n const newEditEvent = {\n ...activeEditEventRef.current,\n new_center: newCenter,\n }\n\n activeEditEventRef.current = newEditEvent\n setActiveEditEvent(newEditEvent)\n },\n [realToScreenProjection, snapToGrid],\n )\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => updateDragPosition(e.clientX, e.clientY),\n [updateDragPosition],\n )\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n if (e.touches.length !== 1 || !activeEditEventRef.current) return\n e.preventDefault()\n const touch = e.touches[0]\n updateDragPosition(touch.clientX, touch.clientY)\n },\n [updateDragPosition],\n )\n\n const endDrag = useCallback(() => {\n if (!activeEditEventRef.current) return\n const finalEvent = {\n ...activeEditEventRef.current,\n in_progress: false,\n }\n\n componentPositionsRef.current.set(finalEvent.schematic_component_id, {\n ...finalEvent.new_center,\n })\n\n debug(\"endDrag calling onEditEvent with new edit event\", {\n newEditEvent: finalEvent,\n })\n if (onEditEvent) onEditEvent(finalEvent)\n activeEditEventRef.current = null\n dragStartPosRef.current = null\n setActiveEditEvent(null)\n }, [onEditEvent])\n\n const handleMouseUp = useCallback(() => endDrag(), [endDrag])\n const handleTouchEnd = useCallback(() => endDrag(), [endDrag])\n\n useEffect(() => {\n window.addEventListener(\"mousemove\", handleMouseMove)\n window.addEventListener(\"mouseup\", handleMouseUp)\n window.addEventListener(\"touchmove\", handleTouchMove, { passive: false })\n window.addEventListener(\"touchend\", handleTouchEnd)\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove)\n window.removeEventListener(\"mouseup\", handleMouseUp)\n window.removeEventListener(\"touchmove\", handleTouchMove)\n window.removeEventListener(\"touchend\", handleTouchEnd)\n }\n }, [handleMouseMove, handleMouseUp, handleTouchMove, handleTouchEnd])\n\n return {\n handleMouseDown,\n handleTouchStart,\n isDragging: !!activeEditEventRef.current,\n activeEditEvent: activeEditEvent,\n }\n}\n","export const zIndexMap = {\n schematicEditIcon: 50,\n schematicGridIcon: 49,\n viewMenuIcon: 48,\n viewMenu: 55,\n viewMenuBackdrop: 54,\n clickToInteractOverlay: 100,\n schematicComponentHoverOutline: 47,\n schematicPortHoverOutline: 48,\n}\n","import { zIndexMap } from \"../utils/z-index-map\"\n\nexport const EditIcon = ({\n onClick,\n active,\n}: { onClick: () => void; active: boolean }) => {\n const handleInteraction = (e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault()\n onClick()\n }\n\n return (\n <div\n onClick={handleInteraction}\n onTouchEnd={handleInteraction}\n title={active ? \"Disable edit mode\" : \"Enable edit mode\"}\n style={{\n position: \"absolute\",\n top: \"16px\",\n right: \"64px\",\n backgroundColor: active ? \"#4CAF50\" : \"#fff\",\n color: active ? \"#fff\" : \"#000\",\n padding: \"8px\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n zIndex: zIndexMap.schematicEditIcon,\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 >\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n </div>\n )\n}\n","import { zIndexMap } from \"../utils/z-index-map\"\n\nexport const GridIcon = ({\n onClick,\n active,\n}: { onClick: () => void; active: boolean }) => {\n const handleInteraction = (e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault()\n onClick()\n }\n\n return (\n <div\n onClick={handleInteraction}\n onTouchEnd={handleInteraction}\n title={active ? \"Hide grid\" : \"Show grid\"}\n style={{\n position: \"absolute\",\n top: \"56px\",\n right: \"64px\",\n backgroundColor: active ? \"#4CAF50\" : \"#fff\",\n color: active ? \"#fff\" : \"#000\",\n padding: \"8px\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n zIndex: zIndexMap.schematicGridIcon,\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 >\n <path d=\"M3 3h7v7H3zM14 3h7v7h-7zM3 14h7v7H3zM14 14h7v7h-7z\" />\n </svg>\n </div>\n )\n}\n","import { useMemo } from \"react\"\nimport { su } from \"@tscircuit/soup-util\"\nimport type { CircuitJson } from \"circuit-json\"\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport { zIndexMap } from \"../utils/z-index-map\"\nimport packageJson from \"../../package.json\"\nimport { ViewMenuIcon } from \"./ViewMenuIcon\"\n\ninterface ViewMenuProps {\n circuitJson: CircuitJson\n circuitJsonKey: string\n open: boolean\n onOpenChange: (open: boolean) => void\n showGroups: boolean\n onToggleGroups: (show: boolean) => void\n showGrid: boolean\n onToggleGrid: (show: boolean) => void\n}\n\nconst FONT_FAMILY =\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n\nconst contentStyles: React.CSSProperties = {\n backgroundColor: \"#ffffff\",\n color: \"#111111\",\n borderRadius: 8,\n boxShadow: \"0 6px 24px rgba(0,0,0,0.12), 0 1px 3px rgba(0,0,0,0.08)\",\n border: \"1px solid #e5e7eb\",\n padding: 4,\n minWidth: 224,\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n outline: \"none\",\n zIndex: zIndexMap.viewMenu,\n}\n\nconst itemStyles: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"7px 10px 7px 8px\",\n borderRadius: 6,\n cursor: \"pointer\",\n outline: \"none\",\n userSelect: \"none\",\n color: \"#111111\",\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n}\n\nconst iconSlotStyles: React.CSSProperties = {\n width: 16,\n height: 16,\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#111111\",\n}\n\nconst separatorStyles: React.CSSProperties = {\n height: 1,\n backgroundColor: \"#ececec\",\n margin: \"4px 0\",\n}\n\nconst HIGHLIGHT_CSS = `\n.sv-vm-item[data-highlighted]:not([data-disabled]),\n.sv-vm-item:hover:not([data-disabled]) { background-color: #f1f3f5; }\n.sv-vm-item[data-disabled] { opacity: 0.45; cursor: not-allowed; }\n`\n\nconst CheckIcon = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n)\n\nexport const ViewMenu = ({\n circuitJson,\n circuitJsonKey,\n open,\n onOpenChange,\n showGroups,\n onToggleGroups,\n showGrid,\n onToggleGrid,\n}: ViewMenuProps) => {\n const hasGroups = useMemo(() => {\n if (!circuitJson || circuitJson.length === 0) return false\n\n try {\n // Check if there are explicit groups\n const sourceGroups = su(circuitJson).source_group?.list() || []\n if (sourceGroups.length > 0) return true\n\n // Check if we can create virtual groups by component type\n const schematicComponents =\n su(circuitJson).schematic_component?.list() || []\n if (schematicComponents.length > 1) {\n const componentTypes = new Set()\n for (const comp of schematicComponents) {\n const sourceComp = su(circuitJson).source_component.get(\n comp.source_component_id!,\n )\n if (sourceComp?.ftype) {\n componentTypes.add(sourceComp.ftype)\n }\n }\n return componentTypes.size > 1 // Only show if there are multiple types\n }\n\n return false\n } catch (error) {\n console.error(\"Error checking for groups:\", error)\n return false\n }\n }, [circuitJsonKey])\n\n return (\n <DropdownMenu.Root open={open} onOpenChange={onOpenChange} modal={false}>\n <DropdownMenu.Trigger asChild>\n <ViewMenuIcon active={open} />\n </DropdownMenu.Trigger>\n\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n style={contentStyles}\n side=\"bottom\"\n align=\"end\"\n sideOffset={8}\n collisionPadding={10}\n >\n <style>{HIGHLIGHT_CSS}</style>\n\n {/* View toggles */}\n <DropdownMenu.Item\n className=\"sv-vm-item\"\n style={itemStyles}\n disabled={!hasGroups}\n title={hasGroups ? undefined : \"No groups found in this schematic\"}\n // Toggle on pointerup (reliable on touch); keep the menu open by\n // preventing Radix's click-based onSelect (which also closes it).\n onSelect={(e) => e.preventDefault()}\n onPointerUp={() => {\n if (hasGroups) onToggleGroups(!showGroups)\n }}\n >\n <span style={iconSlotStyles}>{showGroups && <CheckIcon />}</span>\n <span>View Schematic Groups</span>\n </DropdownMenu.Item>\n\n <DropdownMenu.Item\n className=\"sv-vm-item\"\n style={itemStyles}\n onSelect={(e) => e.preventDefault()}\n onPointerUp={() => onToggleGrid(!showGrid)}\n >\n <span style={iconSlotStyles}>{showGrid && <CheckIcon />}</span>\n <span>Show Grid</span>\n </DropdownMenu.Item>\n\n <DropdownMenu.Separator style={separatorStyles} />\n\n {/* Version */}\n <div\n style={{\n padding: \"4px 8px\",\n fontSize: 12,\n color: \"#9ca3af\",\n textAlign: \"center\",\n fontFamily: FONT_FAMILY,\n }}\n >\n v{String(packageJson?.version)}\n </div>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n )\n}\n","{\n \"name\": \"@tscircuit/schematic-viewer\",\n \"version\": \"2.0.71\",\n \"main\": \"dist/index.js\",\n \"type\": \"module\",\n \"scripts\": {\n \"start\": \"cosmos\",\n \"build\": \"tsup-node ./lib/index.ts --dts --format esm --sourcemap\",\n \"build:site\": \"cosmos-export\",\n \"vercel-build\": \"bun run build:site\",\n \"format\": \"biome format --write .\",\n \"format:check\": \"biome format .\"\n },\n \"files\": [\n \"dist\"\n ],\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.9.4\",\n \"@types/bun\": \"latest\",\n \"@types/debug\": \"^4.1.12\",\n \"@types/react\": \"^19.0.1\",\n \"@types/react-dom\": \"^19.0.2\",\n \"@vitejs/plugin-react\": \"^4.3.4\",\n \"react\": \"^19.1.0\",\n \"react-cosmos\": \"^6.2.1\",\n \"react-cosmos-plugin-vite\": \"^6.2.0\",\n \"react-dom\": \"^19.1.0\",\n \"react-reconciler\": \"^0.31.0\",\n \"semver\": \"^7.7.2\",\n \"tscircuit\": \"^0.0.2012\",\n \"tsup\": \"^8.3.5\",\n \"vite\": \"^6.0.3\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5.0.0\",\n \"tscircuit\": \"*\"\n },\n \"dependencies\": {\n \"@radix-ui/react-dropdown-menu\": \"^2.1.16\",\n \"debug\": \"^4.4.0\",\n \"performance-now\": \"^2.1.0\",\n \"use-mouse-matrix-transform\": \"^1.2.2\"\n }\n}\n","import { zIndexMap } from \"../utils/z-index-map\"\n\ninterface ViewMenuIconProps extends React.ComponentPropsWithRef<\"button\"> {\n active?: boolean\n}\n\nexport const ViewMenuIcon = ({\n active = false,\n ...props\n}: ViewMenuIconProps) => {\n return (\n <button\n type=\"button\"\n title={active ? \"Hide view menu\" : \"Show view menu\"}\n {...props}\n style={{\n position: \"absolute\",\n top: \"16px\",\n right: \"16px\",\n backgroundColor: active ? \"#4CAF50\" : \"#fff\",\n color: active ? \"#fff\" : \"#000\",\n padding: \"8px\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n outline: \"none\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n zIndex: zIndexMap.viewMenuIcon,\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 >\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n </svg>\n </button>\n )\n}\n","import { useCallback } from \"react\"\n\nexport const STORAGE_KEYS = {\n IS_SHOWING_SCHEMATIC_GROUPS: \"schematic_viewer_show_groups\",\n SELECTED_SCHEMATIC_SHEET: \"schematic_viewer_selected_sheet\",\n} as const\n\nexport const getStoredBoolean = (\n key: string,\n defaultValue: boolean,\n): boolean => {\n if (typeof window === \"undefined\") return defaultValue\n try {\n const stored = localStorage.getItem(key)\n return stored !== null ? JSON.parse(stored) : defaultValue\n } catch {\n return defaultValue\n }\n}\n\nexport const setStoredBoolean = (key: string, value: boolean): void => {\n if (typeof window === \"undefined\") return\n try {\n localStorage.setItem(key, JSON.stringify(value))\n } catch {}\n}\n\nexport const getStoredString = (key: string): string | null => {\n if (typeof window === \"undefined\") return null\n try {\n return localStorage.getItem(key)\n } catch {\n return null\n }\n}\n\nexport const setStoredString = (key: string, value: string): void => {\n if (typeof window === \"undefined\") return\n try {\n localStorage.setItem(key, value)\n } catch {}\n}\n\nexport const useLocalStorage = () => {\n const getBoolean = useCallback(\n (key: string, defaultValue: boolean): boolean => {\n return getStoredBoolean(key, defaultValue)\n },\n [],\n )\n\n const setBoolean = useCallback((key: string, value: boolean): void => {\n setStoredBoolean(key, value)\n }, [])\n\n return {\n getBoolean,\n setBoolean,\n }\n}\n\nexport const useLocalStorageValue = (key: string, defaultValue: boolean) => {\n const { getBoolean, setBoolean } = useLocalStorage()\n\n const getValue = useCallback(() => {\n return getBoolean(key, defaultValue)\n }, [getBoolean, key, defaultValue])\n\n const setValue = useCallback(\n (value: boolean) => {\n setBoolean(key, value)\n },\n [setBoolean, key],\n )\n\n return {\n getValue,\n setValue,\n }\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\"\n\nexport interface BoundingBoxBounds {\n minX: number\n maxX: number\n minY: number\n maxY: number\n}\n\ninterface BoundingBoxRegistration {\n bounds: BoundingBoxBounds | null\n onClick?: ((event: MouseEvent) => void) | undefined\n}\n\nexport interface MouseTrackerContextValue {\n registerBoundingBox: (\n id: string,\n registration: BoundingBoxRegistration,\n ) => void\n updateBoundingBox: (id: string, registration: BoundingBoxRegistration) => void\n unregisterBoundingBox: (id: string) => void\n subscribe: (listener: () => void) => () => void\n isHovering: (id: string) => boolean\n}\n\nexport const MouseTrackerContext =\n createContext<MouseTrackerContextValue | null>(null)\n\nconst DRAG_THRESHOLD_PX = 5\n\nconst boundsAreEqual = (\n a: BoundingBoxBounds | null | undefined,\n b: BoundingBoxBounds | null | undefined,\n) => {\n if (!a && !b) return true\n if (!a || !b) return false\n return (\n a.minX === b.minX &&\n a.maxX === b.maxX &&\n a.minY === b.minY &&\n a.maxY === b.maxY\n )\n}\n\nexport const MouseTracker = ({ children }: { children: ReactNode }) => {\n const existingContext = useContext(MouseTrackerContext)\n\n if (existingContext) {\n return <>{children}</>\n }\n\n const storeRef = useRef({\n pointer: null as { x: number; y: number } | null,\n boundingBoxes: new Map<string, BoundingBoxRegistration>(),\n hoveringIds: new Set<string>(),\n subscribers: new Set<() => void>(),\n mouseDownPosition: null as { x: number; y: number } | null,\n })\n\n const notifySubscribers = useCallback(() => {\n for (const callback of storeRef.current.subscribers) {\n callback()\n }\n }, [])\n\n const updateHovering = useCallback(() => {\n const pointer = storeRef.current.pointer\n const newHovering = new Set<string>()\n\n if (pointer) {\n for (const [id, registration] of storeRef.current.boundingBoxes) {\n const bounds = registration.bounds\n if (!bounds) continue\n if (\n pointer.x >= bounds.minX &&\n pointer.x <= bounds.maxX &&\n pointer.y >= bounds.minY &&\n pointer.y <= bounds.maxY\n ) {\n newHovering.add(id)\n }\n }\n }\n\n const prevHovering = storeRef.current.hoveringIds\n if (\n newHovering.size === prevHovering.size &&\n [...newHovering].every((id) => prevHovering.has(id))\n ) {\n return\n }\n\n storeRef.current.hoveringIds = newHovering\n notifySubscribers()\n }, [notifySubscribers])\n\n const registerBoundingBox = useCallback(\n (id: string, registration: BoundingBoxRegistration) => {\n storeRef.current.boundingBoxes.set(id, registration)\n updateHovering()\n },\n [updateHovering],\n )\n\n const updateBoundingBox = useCallback(\n (id: string, registration: BoundingBoxRegistration) => {\n const existing = storeRef.current.boundingBoxes.get(id)\n if (\n existing &&\n boundsAreEqual(existing.bounds, registration.bounds) &&\n existing.onClick === registration.onClick\n ) {\n return\n }\n storeRef.current.boundingBoxes.set(id, registration)\n updateHovering()\n },\n [updateHovering],\n )\n\n const unregisterBoundingBox = useCallback(\n (id: string) => {\n const removed = storeRef.current.boundingBoxes.delete(id)\n if (removed) {\n updateHovering()\n }\n },\n [updateHovering],\n )\n\n const subscribe = useCallback((listener: () => void) => {\n storeRef.current.subscribers.add(listener)\n return () => {\n storeRef.current.subscribers.delete(listener)\n }\n }, [])\n\n const isHovering = useCallback((id: string) => {\n return storeRef.current.hoveringIds.has(id)\n }, [])\n\n useEffect(() => {\n const handlePointerPosition = (event: PointerEvent | MouseEvent) => {\n const { clientX, clientY } = event\n const pointer = storeRef.current.pointer\n if (pointer && pointer.x === clientX && pointer.y === clientY) {\n return\n }\n storeRef.current.pointer = { x: clientX, y: clientY }\n updateHovering()\n }\n\n const handlePointerLeave = () => {\n if (storeRef.current.pointer === null) return\n storeRef.current.pointer = null\n storeRef.current.mouseDownPosition = null\n updateHovering()\n }\n\n const handleMouseDown = (event: MouseEvent) => {\n storeRef.current.mouseDownPosition = {\n x: event.clientX,\n y: event.clientY,\n }\n }\n\n const handleClick = (event: MouseEvent) => {\n const { clientX, clientY } = event\n const mouseDownPos = storeRef.current.mouseDownPosition\n\n // Check if this was a drag (movement > threshold)\n if (mouseDownPos) {\n const distance = Math.sqrt(\n Math.pow(clientX - mouseDownPos.x, 2) +\n Math.pow(clientY - mouseDownPos.y, 2),\n )\n if (distance > DRAG_THRESHOLD_PX) {\n // This was a drag, not a click - don't trigger onClick\n storeRef.current.mouseDownPosition = null\n return\n }\n }\n\n storeRef.current.mouseDownPosition = null\n\n for (const registration of storeRef.current.boundingBoxes.values()) {\n const bounds = registration.bounds\n if (!bounds) continue\n if (\n clientX >= bounds.minX &&\n clientX <= bounds.maxX &&\n clientY >= bounds.minY &&\n clientY <= bounds.maxY\n ) {\n registration.onClick?.(event)\n }\n }\n }\n\n window.addEventListener(\"pointermove\", handlePointerPosition, {\n passive: true,\n })\n window.addEventListener(\"pointerdown\", handlePointerPosition, {\n passive: true,\n })\n window.addEventListener(\"pointerup\", handlePointerPosition, {\n passive: true,\n })\n window.addEventListener(\"pointerleave\", handlePointerLeave)\n window.addEventListener(\"pointercancel\", handlePointerLeave)\n window.addEventListener(\"blur\", handlePointerLeave)\n window.addEventListener(\"mousedown\", handleMouseDown, { passive: true })\n window.addEventListener(\"click\", handleClick, { passive: true })\n\n return () => {\n window.removeEventListener(\"pointermove\", handlePointerPosition)\n window.removeEventListener(\"pointerdown\", handlePointerPosition)\n window.removeEventListener(\"pointerup\", handlePointerPosition)\n window.removeEventListener(\"pointerleave\", handlePointerLeave)\n window.removeEventListener(\"pointercancel\", handlePointerLeave)\n window.removeEventListener(\"blur\", handlePointerLeave)\n window.removeEventListener(\"mousedown\", handleMouseDown)\n window.removeEventListener(\"click\", handleClick)\n }\n }, [updateHovering])\n\n const value = useMemo<MouseTrackerContextValue>(\n () => ({\n registerBoundingBox,\n updateBoundingBox,\n unregisterBoundingBox,\n subscribe,\n isHovering,\n }),\n [\n registerBoundingBox,\n updateBoundingBox,\n unregisterBoundingBox,\n subscribe,\n isHovering,\n ],\n )\n\n return (\n <MouseTrackerContext.Provider value={value}>\n {children}\n </MouseTrackerContext.Provider>\n )\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\"\nimport { useMouseEventsOverBoundingBox } from \"../hooks/useMouseEventsOverBoundingBox\"\nimport type { BoundingBoxBounds } from \"./MouseTracker\"\nimport { zIndexMap } from \"../utils/z-index-map\"\n\ninterface RelativeRect {\n left: number\n top: number\n width: number\n height: number\n}\n\ninterface Measurement {\n bounds: BoundingBoxBounds\n rect: RelativeRect\n}\n\nconst areMeasurementsEqual = (a: Measurement | null, b: Measurement | null) => {\n if (!a && !b) return true\n if (!a || !b) return false\n return (\n Math.abs(a.bounds.minX - b.bounds.minX) < 0.5 &&\n Math.abs(a.bounds.maxX - b.bounds.maxX) < 0.5 &&\n Math.abs(a.bounds.minY - b.bounds.minY) < 0.5 &&\n Math.abs(a.bounds.maxY - b.bounds.maxY) < 0.5 &&\n Math.abs(a.rect.left - b.rect.left) < 0.5 &&\n Math.abs(a.rect.top - b.rect.top) < 0.5 &&\n Math.abs(a.rect.width - b.rect.width) < 0.5 &&\n Math.abs(a.rect.height - b.rect.height) < 0.5\n )\n}\n\ninterface Props {\n componentId: string\n svgDivRef: React.RefObject<HTMLDivElement | null>\n containerRef: React.RefObject<HTMLDivElement | null>\n onComponentClick?: (componentId: string, event: MouseEvent) => void\n onHoverChange?: (componentId: string, isHovering: boolean) => void\n showOutline: boolean\n circuitJsonKey: string\n}\n\nexport const SchematicComponentMouseTarget = ({\n componentId,\n svgDivRef,\n containerRef,\n onComponentClick,\n onHoverChange,\n showOutline,\n circuitJsonKey,\n}: Props) => {\n const [measurement, setMeasurement] = useState<Measurement | null>(null)\n const frameRef = useRef<number | null>(null)\n\n const measure = useCallback(() => {\n frameRef.current = null\n const svgDiv = svgDivRef.current\n const container = containerRef.current\n if (!svgDiv || !container) {\n setMeasurement((prev) => (prev ? null : prev))\n return\n }\n const element = svgDiv.querySelector<SVGGraphicsElement | HTMLElement>(\n `[data-schematic-component-id=\"${componentId}\"]`,\n )\n if (!element) {\n setMeasurement((prev) => (prev ? null : prev))\n return\n }\n\n const elementRect = element.getBoundingClientRect()\n const containerRect = container.getBoundingClientRect()\n\n const nextMeasurement: Measurement = {\n bounds: {\n minX: elementRect.left,\n maxX: elementRect.right,\n minY: elementRect.top,\n maxY: elementRect.bottom,\n },\n rect: {\n left: elementRect.left - containerRect.left,\n top: elementRect.top - containerRect.top,\n width: elementRect.width,\n height: elementRect.height,\n },\n }\n\n setMeasurement((prev) =>\n areMeasurementsEqual(prev, nextMeasurement) ? prev : nextMeasurement,\n )\n }, [componentId, containerRef, svgDivRef])\n\n const scheduleMeasure = useCallback(() => {\n if (frameRef.current !== null) return\n frameRef.current = window.requestAnimationFrame(measure)\n }, [measure])\n\n useEffect(() => {\n scheduleMeasure()\n }, [scheduleMeasure, circuitJsonKey])\n\n useEffect(() => {\n scheduleMeasure()\n const svgDiv = svgDivRef.current\n const container = containerRef.current\n if (!svgDiv || !container) return\n\n const resizeObserver =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(() => {\n scheduleMeasure()\n })\n : null\n resizeObserver?.observe(container)\n resizeObserver?.observe(svgDiv)\n\n const mutationObserver =\n typeof MutationObserver !== \"undefined\"\n ? new MutationObserver(() => {\n scheduleMeasure()\n })\n : null\n mutationObserver?.observe(svgDiv, {\n attributes: true,\n attributeFilter: [\"style\", \"transform\"],\n subtree: true,\n childList: true,\n })\n\n window.addEventListener(\"scroll\", scheduleMeasure, true)\n window.addEventListener(\"resize\", scheduleMeasure)\n\n return () => {\n resizeObserver?.disconnect()\n mutationObserver?.disconnect()\n window.removeEventListener(\"scroll\", scheduleMeasure, true)\n window.removeEventListener(\"resize\", scheduleMeasure)\n if (frameRef.current !== null) {\n cancelAnimationFrame(frameRef.current)\n frameRef.current = null\n }\n }\n }, [scheduleMeasure, svgDivRef, containerRef])\n\n const handleClick = useCallback(\n (event: MouseEvent) => {\n if (onComponentClick) {\n onComponentClick(componentId, event)\n }\n },\n [componentId, onComponentClick],\n )\n\n const bounds = measurement?.bounds ?? null\n\n const { hovering } = useMouseEventsOverBoundingBox({\n bounds,\n onClick: onComponentClick ? handleClick : undefined,\n })\n\n // Notify parent of hover state changes\n useEffect(() => {\n if (onHoverChange) {\n onHoverChange(componentId, hovering)\n }\n }, [hovering, componentId, onHoverChange])\n\n if (!measurement || !hovering || !showOutline) {\n return null\n }\n\n const rect = measurement.rect\n\n return (\n <div\n style={{\n position: \"absolute\",\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n border: \"1.5px solid rgba(51, 153, 255, 0.9)\",\n pointerEvents: \"none\",\n zIndex: zIndexMap.schematicComponentHoverOutline,\n }}\n />\n )\n}\n","import {\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from \"react\"\nimport {\n MouseTrackerContext,\n type BoundingBoxBounds,\n} from \"../components/MouseTracker\"\n\ninterface UseMouseEventsOverBoundingBoxOptions {\n bounds: BoundingBoxBounds | null\n onClick?: (event: MouseEvent) => void\n}\n\nexport const useMouseEventsOverBoundingBox = (\n options: UseMouseEventsOverBoundingBoxOptions,\n) => {\n const context = useContext(MouseTrackerContext)\n\n if (!context) {\n throw new Error(\n \"useMouseEventsOverBoundingBox must be used within a MouseTracker\",\n )\n }\n\n const id = useId()\n const latestOptionsRef = useRef(options)\n latestOptionsRef.current = options\n\n const handleClick = useMemo(\n () => (event: MouseEvent) => {\n latestOptionsRef.current.onClick?.(event)\n },\n [],\n )\n\n useEffect(() => {\n context.registerBoundingBox(id, {\n bounds: latestOptionsRef.current.bounds,\n onClick: latestOptionsRef.current.onClick ? handleClick : undefined,\n })\n return () => {\n context.unregisterBoundingBox(id)\n }\n }, [context, handleClick, id])\n\n useEffect(() => {\n context.updateBoundingBox(id, {\n bounds: latestOptionsRef.current.bounds,\n onClick: latestOptionsRef.current.onClick ? handleClick : undefined,\n })\n }, [\n context,\n handleClick,\n id,\n options.bounds?.minX,\n options.bounds?.maxX,\n options.bounds?.minY,\n options.bounds?.maxY,\n options.onClick,\n ])\n\n const hovering = useSyncExternalStore(\n context.subscribe,\n () => context.isHovering(id),\n () => false,\n )\n\n return { hovering }\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\"\nimport { useMouseEventsOverBoundingBox } from \"../hooks/useMouseEventsOverBoundingBox\"\nimport type { BoundingBoxBounds } from \"./MouseTracker\"\nimport { zIndexMap } from \"../utils/z-index-map\"\n\ninterface RelativeRect {\n left: number\n top: number\n width: number\n height: number\n}\n\ninterface Measurement {\n bounds: BoundingBoxBounds\n rect: RelativeRect\n}\n\nconst areMeasurementsEqual = (a: Measurement | null, b: Measurement | null) => {\n if (!a && !b) return true\n if (!a || !b) return false\n return (\n Math.abs(a.bounds.minX - b.bounds.minX) < 0.5 &&\n Math.abs(a.bounds.maxX - b.bounds.maxX) < 0.5 &&\n Math.abs(a.bounds.minY - b.bounds.minY) < 0.5 &&\n Math.abs(a.bounds.maxY - b.bounds.maxY) < 0.5 &&\n Math.abs(a.rect.left - b.rect.left) < 0.5 &&\n Math.abs(a.rect.top - b.rect.top) < 0.5 &&\n Math.abs(a.rect.width - b.rect.width) < 0.5 &&\n Math.abs(a.rect.height - b.rect.height) < 0.5\n )\n}\n\ninterface Props {\n portId: string\n portLabel?: string\n svgDivRef: React.RefObject<HTMLDivElement | null>\n containerRef: React.RefObject<HTMLDivElement | null>\n onPortClick?: (portId: string, event: MouseEvent) => void\n onHoverChange?: (portId: string, isHovering: boolean) => void\n showOutline: boolean\n circuitJsonKey: string\n}\n\nexport const SchematicPortMouseTarget = ({\n portId,\n portLabel,\n svgDivRef,\n containerRef,\n onPortClick,\n onHoverChange,\n showOutline,\n circuitJsonKey,\n}: Props) => {\n const [measurement, setMeasurement] = useState<Measurement | null>(null)\n const frameRef = useRef<number | null>(null)\n\n const measure = useCallback(() => {\n frameRef.current = null\n const svgDiv = svgDivRef.current\n const container = containerRef.current\n if (!svgDiv || !container) {\n setMeasurement((prev) => (prev ? null : prev))\n return\n }\n const element = svgDiv.querySelector<SVGGraphicsElement | HTMLElement>(\n `[data-schematic-port-id=\"${portId}\"]`,\n )\n if (!element) {\n setMeasurement((prev) => (prev ? null : prev))\n return\n }\n\n const elementRect = element.getBoundingClientRect()\n const containerRect = container.getBoundingClientRect()\n\n // Add some padding around the port for easier interaction\n const padding = 4\n\n const nextMeasurement: Measurement = {\n bounds: {\n minX: elementRect.left - padding,\n maxX: elementRect.right + padding,\n minY: elementRect.top - padding,\n maxY: elementRect.bottom + padding,\n },\n rect: {\n left: elementRect.left - containerRect.left - padding,\n top: elementRect.top - containerRect.top - padding,\n width: elementRect.width + padding * 2,\n height: elementRect.height + padding * 2,\n },\n }\n\n setMeasurement((prev) =>\n areMeasurementsEqual(prev, nextMeasurement) ? prev : nextMeasurement,\n )\n }, [portId, containerRef, svgDivRef])\n\n const scheduleMeasure = useCallback(() => {\n if (frameRef.current !== null) return\n frameRef.current = window.requestAnimationFrame(measure)\n }, [measure])\n\n useEffect(() => {\n scheduleMeasure()\n }, [scheduleMeasure, circuitJsonKey])\n\n useEffect(() => {\n scheduleMeasure()\n const svgDiv = svgDivRef.current\n const container = containerRef.current\n if (!svgDiv || !container) return\n\n const resizeObserver =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(() => {\n scheduleMeasure()\n })\n : null\n resizeObserver?.observe(container)\n resizeObserver?.observe(svgDiv)\n\n const mutationObserver =\n typeof MutationObserver !== \"undefined\"\n ? new MutationObserver(() => {\n scheduleMeasure()\n })\n : null\n mutationObserver?.observe(svgDiv, {\n attributes: true,\n attributeFilter: [\"style\", \"transform\"],\n subtree: true,\n childList: true,\n })\n\n window.addEventListener(\"scroll\", scheduleMeasure, true)\n window.addEventListener(\"resize\", scheduleMeasure)\n\n return () => {\n resizeObserver?.disconnect()\n mutationObserver?.disconnect()\n window.removeEventListener(\"scroll\", scheduleMeasure, true)\n window.removeEventListener(\"resize\", scheduleMeasure)\n if (frameRef.current !== null) {\n cancelAnimationFrame(frameRef.current)\n frameRef.current = null\n }\n }\n }, [scheduleMeasure, svgDivRef, containerRef])\n\n const handleClick = useCallback(\n (event: MouseEvent) => {\n if (onPortClick) {\n onPortClick(portId, event)\n }\n },\n [portId, onPortClick],\n )\n\n const bounds = measurement?.bounds ?? null\n\n const { hovering } = useMouseEventsOverBoundingBox({\n bounds,\n onClick: onPortClick ? handleClick : undefined,\n })\n\n // Notify parent of hover state changes\n useEffect(() => {\n if (onHoverChange) {\n onHoverChange(portId, hovering)\n }\n }, [hovering, portId, onHoverChange])\n\n if (!measurement || !showOutline) {\n return null\n }\n\n const rect = measurement.rect\n\n return (\n <>\n <div\n style={{\n position: \"absolute\",\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n border: hovering\n ? \"1.5px solid rgba(255, 153, 51, 0.9)\"\n : \"1.5px solid rgba(255, 153, 51, 0.3)\",\n backgroundColor: hovering\n ? \"rgba(255, 153, 51, 0.15)\"\n : \"rgba(255, 153, 51, 0.05)\",\n borderRadius: \"50%\",\n pointerEvents: \"none\",\n zIndex: zIndexMap.schematicPortHoverOutline,\n transition: \"border-color 0.15s, background-color 0.15s\",\n }}\n />\n {hovering && portLabel && (\n <div\n style={{\n position: \"absolute\",\n left: rect.left + rect.width / 2,\n top: rect.top - 24,\n transform: \"translateX(-50%)\",\n backgroundColor: \"rgba(0, 0, 0, 0.85)\",\n color: \"white\",\n padding: \"4px 8px\",\n borderRadius: \"4px\",\n fontSize: \"12px\",\n fontFamily: \"monospace\",\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n zIndex: zIndexMap.schematicPortHoverOutline + 1,\n }}\n >\n {portLabel}\n </div>\n )}\n </>\n )\n}\n","import { useState } from \"react\"\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport type { SchematicSheet } from \"circuit-json\"\nimport { zIndexMap } from \"../utils/z-index-map\"\n\ninterface SchematicSheetSelectorProps {\n sheets: SchematicSheet[]\n selectedSheetId: string | undefined\n onSelectSheet: (schematicSheetId: string) => void\n}\n\nconst FONT_FAMILY =\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n\nconst contentStyles: React.CSSProperties = {\n backgroundColor: \"#ffffff\",\n color: \"#111111\",\n borderRadius: 8,\n boxShadow: \"0 6px 24px rgba(0,0,0,0.12), 0 1px 3px rgba(0,0,0,0.08)\",\n border: \"1px solid #e5e7eb\",\n padding: 4,\n minWidth: 200,\n maxWidth: 320,\n maxHeight: 320,\n overflowY: \"auto\",\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n outline: \"none\",\n zIndex: zIndexMap.viewMenu,\n}\n\nconst itemStyles: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"7px 10px 7px 8px\",\n borderRadius: 6,\n cursor: \"pointer\",\n outline: \"none\",\n userSelect: \"none\",\n color: \"#111111\",\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n}\n\nconst iconSlotStyles: React.CSSProperties = {\n width: 16,\n height: 16,\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#111111\",\n}\n\nconst ellipsisStyles: React.CSSProperties = {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n}\n\nconst MENU_CSS = `\n.sv-sheet-item[data-highlighted], .sv-sheet-item:hover { background-color: #f1f3f5; }\n.sv-sheet-chevron { transition: transform 0.2s ease; }\n[data-state=\"open\"] > .sv-sheet-chevron { transform: rotate(180deg); }\n`\n\nconst CheckIcon = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n)\n\nconst ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ opacity: 0.6, flexShrink: 0 }}\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n)\n\n/**\n * A standalone toolbar dropdown for switching the active schematic sheet.\n * Rendered only when the circuit has more than one sheet.\n */\nexport const SchematicSheetSelector = ({\n sheets,\n selectedSheetId,\n onSelectSheet,\n}: SchematicSheetSelectorProps) => {\n const [open, setOpen] = useState(false)\n\n if (sheets.length <= 1) return null\n\n const selectedSheet = sheets.find(\n (s) => s.schematic_sheet_id === selectedSheetId,\n )\n const selectedLabel = selectedSheet?.name ?? \"Select sheet\"\n\n return (\n <>\n <style>{MENU_CSS}</style>\n <DropdownMenu.Root open={open} onOpenChange={setOpen} modal={false}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n title={selectedLabel}\n onPointerDown={(e) => e.stopPropagation()}\n style={{\n position: \"absolute\",\n top: \"16px\",\n left: \"16px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n maxWidth: \"220px\",\n padding: \"8px 12px\",\n backgroundColor: \"#ffffff\",\n color: \"#000000\",\n border: \"none\",\n outline: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n fontSize: \"13px\",\n fontFamily: FONT_FAMILY,\n zIndex: zIndexMap.viewMenuIcon,\n }}\n >\n <span style={{ color: \"#888888\", flexShrink: 0 }}>Sheet:</span>\n <span style={{ ...ellipsisStyles, minWidth: 0 }}>\n {selectedLabel}\n </span>\n <ChevronDownIcon className=\"sv-sheet-chevron\" />\n </button>\n </DropdownMenu.Trigger>\n\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n style={contentStyles}\n side=\"bottom\"\n align=\"start\"\n sideOffset={8}\n collisionPadding={10}\n >\n {sheets.map((sheet) => {\n const selected = sheet.schematic_sheet_id === selectedSheetId\n return (\n <DropdownMenu.Item\n key={sheet.schematic_sheet_id}\n className=\"sv-sheet-item\"\n style={itemStyles}\n title={sheet.name}\n // Select on pointerup (fires reliably on touch); Radix's own\n // onSelect fires on `click`, which is unreliable on mobile.\n onSelect={(e) => e.preventDefault()}\n onPointerUp={() => {\n onSelectSheet(sheet.schematic_sheet_id)\n setOpen(false)\n }}\n >\n <span style={iconSlotStyles}>\n {selected && <CheckIcon />}\n </span>\n <span style={{ ...ellipsisStyles, minWidth: 0 }}>\n {sheet.name}\n </span>\n </DropdownMenu.Item>\n )\n })}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </>\n )\n}\n","import {\n convertCircuitJsonToSchematicSimulationSvg,\n convertCircuitJsonToSimulationGraphSvg,\n type ColorOverrides,\n} from \"circuit-to-svg\"\nimport { useEffect, useState, useMemo, useRef } from \"react\"\nimport { useResizeHandling } from \"../hooks/use-resize-handling\"\nimport { useMouseMatrixTransform } from \"use-mouse-matrix-transform\"\nimport { toString as transformToString } from \"transformation-matrix\"\nimport type { CircuitJson } from \"circuit-json\"\nimport { AnalogSimulationSelector } from \"./AnalogSimulationSelector\"\n\nconst DEFAULT_RENDER_WIDTH = 1200\nconst DEFAULT_RENDER_ASPECT_RATIO = 1\n\ninterface Props {\n circuitJson: CircuitJson\n containerStyle?: React.CSSProperties\n colorOverrides?: ColorOverrides\n width?: number\n height?: number\n className?: string\n /** Whether to hide the schematic and render only the simulation graph. Defaults to false. */\n hideSchematic?: boolean\n /** Called when the active simulation changes. */\n onSimulationChange?: (simulationExperimentId: string) => void\n}\n\nexport const AnalogSimulationViewer = ({\n circuitJson: inputCircuitJson,\n containerStyle,\n colorOverrides,\n width,\n height,\n className,\n hideSchematic = false,\n onSimulationChange,\n}: Props) => {\n const [circuitJson, setCircuitJson] = useState<CircuitJson | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [svgObjectUrl, setSvgObjectUrl] = useState<string | null>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const imgRef = useRef<HTMLImageElement>(null)\n\n const { containerWidth } = useResizeHandling(\n containerRef as React.RefObject<HTMLElement>,\n )\n\n const [isDragging, setIsDragging] = useState(false)\n\n const {\n ref: transformRef,\n cancelDrag: _cancelDrag,\n transform: _svgToScreenProjection,\n } = useMouseMatrixTransform({\n onSetTransform(transform) {\n if (imgRef.current) {\n imgRef.current.style.transform = transformToString(transform)\n }\n },\n })\n\n const renderAspectRatio =\n width && height ? width / height : DEFAULT_RENDER_ASPECT_RATIO\n const effectiveWidth =\n width ||\n (height ? height * renderAspectRatio : containerWidth) ||\n DEFAULT_RENDER_WIDTH\n const effectiveHeight = height || effectiveWidth / renderAspectRatio\n\n // Set CircuitJSON from props\n useEffect(() => {\n setIsLoading(true)\n setError(null)\n setCircuitJson(inputCircuitJson)\n setIsLoading(false)\n }, [inputCircuitJson])\n\n const simulationExperiments = useMemo(() => {\n if (!circuitJson) return []\n return circuitJson.filter(\n (element) => element.type === \"simulation_experiment\",\n )\n }, [circuitJson])\n const [selectedSimulationExperimentId, setSelectedSimulationExperimentId] =\n useState<string | null>(null)\n const simulationExperimentId =\n (selectedSimulationExperimentId &&\n simulationExperiments.some(\n (simulation) =>\n simulation.simulation_experiment_id === selectedSimulationExperimentId,\n )\n ? selectedSimulationExperimentId\n : simulationExperiments[0]?.simulation_experiment_id) ?? null\n\n useEffect(() => {\n if (simulationExperimentId !== selectedSimulationExperimentId) {\n setSelectedSimulationExperimentId(simulationExperimentId)\n }\n }, [simulationExperimentId, selectedSimulationExperimentId])\n\n const handleSelectSimulation = (nextSimulationExperimentId: string) => {\n setSelectedSimulationExperimentId(nextSimulationExperimentId)\n onSimulationChange?.(nextSimulationExperimentId)\n }\n\n // Find simulation graph IDs from circuit JSON\n const simulationVoltageGraphIds = useMemo(() => {\n if (!circuitJson) return []\n return circuitJson.flatMap((element) =>\n element.type === \"simulation_transient_voltage_graph\" &&\n element.simulation_experiment_id === simulationExperimentId\n ? [element.simulation_transient_voltage_graph_id]\n : [],\n )\n }, [circuitJson, simulationExperimentId])\n\n const simulationCurrentGraphIds = useMemo(() => {\n if (!circuitJson) return []\n return circuitJson.flatMap((element) =>\n element.type === \"simulation_transient_current_graph\" &&\n element.simulation_experiment_id === simulationExperimentId\n ? [element.simulation_transient_current_graph_id]\n : [],\n )\n }, [circuitJson, simulationExperimentId])\n\n // Generate the simulation SVG from CircuitJSON\n const simulationSvg = useMemo(() => {\n if (\n !circuitJson ||\n !effectiveWidth ||\n !effectiveHeight ||\n !simulationExperimentId\n )\n return \"\"\n\n try {\n const simulationOptions = {\n circuitJson,\n simulation_experiment_id: simulationExperimentId,\n simulation_transient_current_graph_ids: simulationCurrentGraphIds,\n simulation_transient_voltage_graph_ids: simulationVoltageGraphIds,\n width: effectiveWidth,\n height: effectiveHeight,\n }\n\n return hideSchematic\n ? convertCircuitJsonToSimulationGraphSvg(simulationOptions)\n : convertCircuitJsonToSchematicSimulationSvg({\n ...simulationOptions,\n schematicOptions: { colorOverrides },\n })\n } catch (error) {\n console.error(\"Failed to generate simulation SVG:\", error)\n return \"\"\n }\n }, [\n circuitJson,\n effectiveWidth,\n effectiveHeight,\n colorOverrides,\n hideSchematic,\n simulationExperimentId,\n simulationCurrentGraphIds,\n simulationVoltageGraphIds,\n ])\n\n // Create/revoke object URL whenever the SVG changes\n useEffect(() => {\n if (!simulationSvg) {\n setSvgObjectUrl(null)\n return\n }\n\n try {\n const blob = new Blob([simulationSvg], { type: \"image/svg+xml\" })\n const url = URL.createObjectURL(blob)\n setSvgObjectUrl(url)\n return () => {\n URL.revokeObjectURL(url)\n }\n } catch (error) {\n console.error(\"Failed to create SVG object URL:\", error)\n setSvgObjectUrl(null)\n }\n }, [simulationSvg])\n\n const containerBackgroundColor = useMemo(() => {\n if (!simulationSvg) return \"transparent\"\n const match = simulationSvg.match(\n /<svg[^>]*style=\"[^\"]*background-color:\\s*([^;\\\"]+)/i,\n )\n return match?.[1] ?? \"transparent\"\n }, [simulationSvg])\n\n const handleMouseDown = (_e: React.MouseEvent) => {\n setIsDragging(true)\n }\n\n const handleTouchStart = (_e: React.TouchEvent) => {\n setIsDragging(true)\n }\n\n useEffect(() => {\n const handleMouseUp = () => {\n setIsDragging(false)\n }\n\n const handleTouchEnd = () => {\n setIsDragging(false)\n }\n\n window.addEventListener(\"mouseup\", handleMouseUp)\n window.addEventListener(\"touchend\", handleTouchEnd)\n\n return () => {\n window.removeEventListener(\"mouseup\", handleMouseUp)\n window.removeEventListener(\"touchend\", handleTouchEnd)\n }\n }, [])\n\n if (isLoading) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"#f5f5f5\",\n minHeight: \"300px\",\n fontFamily: \"sans-serif\",\n fontSize: \"16px\",\n color: \"#666\",\n ...containerStyle,\n }}\n className={className}\n >\n Loading circuit...\n </div>\n )\n }\n\n if (error) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"#fef2f2\",\n minHeight: \"300px\",\n fontFamily: \"sans-serif\",\n fontSize: \"16px\",\n color: \"#dc2626\",\n ...containerStyle,\n }}\n className={className}\n >\n <div style={{ textAlign: \"center\", padding: \"20px\" }}>\n <div style={{ fontWeight: \"bold\", marginBottom: \"8px\" }}>\n Circuit Conversion Error\n </div>\n <div style={{ fontSize: \"14px\" }}>{error}</div>\n </div>\n </div>\n )\n }\n\n if (!simulationSvg) {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"#f8fafc\",\n minHeight: \"300px\",\n fontFamily: \"sans-serif\",\n gap: \"12px\",\n ...containerStyle,\n }}\n className={className}\n >\n <div style={{ fontSize: \"16px\", color: \"#475569\", fontWeight: 500 }}>\n No Simulation Found\n </div>\n <div style={{ fontSize: \"14px\", color: \"#64748b\" }}>\n Use{\" \"}\n <code\n style={{\n backgroundColor: \"#e2e8f0\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n }}\n >\n {\"<analogsimulation />\"}\n </code>{\" \"}\n to create simulations\n </div>\n </div>\n )\n }\n\n return (\n <div\n ref={(node) => {\n containerRef.current = node\n transformRef.current = node\n }}\n style={{\n position: \"relative\",\n backgroundColor: containerBackgroundColor,\n overflow: \"hidden\",\n minHeight: \"300px\",\n cursor: isDragging ? \"grabbing\" : \"grab\",\n ...containerStyle,\n }}\n className={className}\n onMouseDown={handleMouseDown}\n onTouchStart={handleTouchStart}\n >\n <AnalogSimulationSelector\n simulations={simulationExperiments}\n selectedSimulationExperimentId={simulationExperimentId}\n onSelectSimulation={handleSelectSimulation}\n />\n {svgObjectUrl ? (\n <img\n ref={imgRef}\n src={svgObjectUrl}\n alt=\"Circuit Simulation\"\n style={{\n transformOrigin: \"0 0\",\n width: \"100%\",\n height: \"100%\",\n display: \"block\",\n objectFit: \"contain\",\n }}\n />\n ) : (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n minHeight: \"300px\",\n color: \"#666\",\n fontFamily: \"sans-serif\",\n }}\n >\n Failed to render SVG\n </div>\n )}\n </div>\n )\n}\n","import * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport type { SimulationExperiment } from \"circuit-json\"\nimport { useState } from \"react\"\nimport { zIndexMap } from \"../utils/z-index-map\"\n\ninterface AnalogSimulationSelectorProps {\n simulations: SimulationExperiment[]\n selectedSimulationExperimentId: string | null\n onSelectSimulation: (simulationExperimentId: string) => void\n}\n\nconst FONT_FAMILY =\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n\nconst contentStyles: React.CSSProperties = {\n backgroundColor: \"#ffffff\",\n color: \"#111111\",\n borderRadius: 8,\n boxShadow: \"0 6px 24px rgba(0,0,0,0.12), 0 1px 3px rgba(0,0,0,0.08)\",\n border: \"1px solid #e5e7eb\",\n padding: 4,\n minWidth: 220,\n maxWidth: 360,\n maxHeight: 320,\n overflowY: \"auto\",\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n outline: \"none\",\n zIndex: zIndexMap.viewMenu,\n}\n\nconst itemStyles: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"7px 10px 7px 8px\",\n borderRadius: 6,\n cursor: \"pointer\",\n outline: \"none\",\n userSelect: \"none\",\n color: \"#111111\",\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n}\n\nconst iconSlotStyles: React.CSSProperties = {\n width: 16,\n height: 16,\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#111111\",\n}\n\nconst ellipsisStyles: React.CSSProperties = {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n}\n\nconst MENU_CSS = `\n.sv-simulation-item[data-highlighted], .sv-simulation-item:hover { background-color: #f1f3f5; }\n.sv-simulation-chevron { transition: transform 0.2s ease; }\n[data-state=\"open\"] > .sv-simulation-chevron { transform: rotate(180deg); }\n`\n\nconst CheckIcon = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n)\n\nconst ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ opacity: 0.6, flexShrink: 0 }}\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n)\n\nconst getSimulationLabels = (simulations: SimulationExperiment[]) => {\n const nameCounts = new Map<string, number>()\n return simulations.map((simulation) => {\n const count = (nameCounts.get(simulation.name) ?? 0) + 1\n nameCounts.set(simulation.name, count)\n return {\n simulation,\n label: count === 1 ? simulation.name : `${simulation.name} (${count})`,\n }\n })\n}\n\n/** A toolbar dropdown for switching between analog simulation experiments. */\nexport const AnalogSimulationSelector = ({\n simulations,\n selectedSimulationExperimentId,\n onSelectSimulation,\n}: AnalogSimulationSelectorProps) => {\n const [open, setOpen] = useState(false)\n\n if (simulations.length <= 1) return null\n\n const simulationLabels = getSimulationLabels(simulations)\n const selectedSimulation = simulationLabels.find(\n ({ simulation }) =>\n simulation.simulation_experiment_id === selectedSimulationExperimentId,\n )\n const selectedLabel = selectedSimulation?.label ?? \"Select simulation\"\n\n return (\n <>\n <style>{MENU_CSS}</style>\n <DropdownMenu.Root open={open} onOpenChange={setOpen} modal={false}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n title={selectedLabel}\n onPointerDown={(event) => event.stopPropagation()}\n style={{\n position: \"absolute\",\n top: \"16px\",\n left: \"16px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n maxWidth: \"280px\",\n padding: \"8px 12px\",\n backgroundColor: \"#ffffff\",\n color: \"#000000\",\n border: \"none\",\n outline: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n fontSize: \"13px\",\n fontFamily: FONT_FAMILY,\n zIndex: zIndexMap.viewMenuIcon,\n }}\n >\n <span style={{ color: \"#888888\", flexShrink: 0 }}>Simulation:</span>\n <span style={{ ...ellipsisStyles, minWidth: 0 }}>\n {selectedLabel}\n </span>\n <ChevronDownIcon className=\"sv-simulation-chevron\" />\n </button>\n </DropdownMenu.Trigger>\n\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n style={contentStyles}\n side=\"bottom\"\n align=\"start\"\n sideOffset={8}\n collisionPadding={10}\n >\n {simulationLabels.map(({ simulation, label }) => {\n const selected =\n simulation.simulation_experiment_id ===\n selectedSimulationExperimentId\n return (\n <DropdownMenu.Item\n key={simulation.simulation_experiment_id}\n className=\"sv-simulation-item\"\n style={itemStyles}\n title={label}\n onSelect={(event) => event.preventDefault()}\n onPointerUp={() => {\n onSelectSimulation(simulation.simulation_experiment_id)\n setOpen(false)\n }}\n >\n <span style={iconSlotStyles}>\n {selected && <CheckIcon />}\n </span>\n <span style={{ ...ellipsisStyles, minWidth: 0 }}>\n {label}\n </span>\n </DropdownMenu.Item>\n )\n })}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </>\n )\n}\n"],"mappings":"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","names":["su","useEffect","useRef","su","useEffect","su","su","useEffect","useCallback","useEffect","useMemo","useRef","useState","useEffect","su","useEffect","useRef","useState","compose","debug","su","jsx","su","jsx","jsxs","jsx","jsxs","su","useCallback","useCallback","useEffect","useMemo","useRef","jsx","useCallback","useEffect","useRef","useState","useContext","useEffect","useMemo","useRef","useContext","useRef","useMemo","useEffect","jsx","useState","useRef","useCallback","useEffect","useCallback","useEffect","useRef","useState","Fragment","jsx","jsxs","areMeasurementsEqual","useState","useRef","useCallback","useEffect","useState","DropdownMenu","Fragment","jsx","jsxs","FONT_FAMILY","contentStyles","itemStyles","iconSlotStyles","CheckIcon","useState","jsx","jsxs","debug","circuitJson","useMemo","useState","useEffect","useCallback","useRef","su","useEffect","useState","useMemo","useRef","useMouseMatrixTransform","transformToString","DropdownMenu","useState","Fragment","jsx","jsxs","FONT_FAMILY","contentStyles","itemStyles","iconSlotStyles","ellipsisStyles","MENU_CSS","CheckIcon","ChevronDownIcon","useState","jsx","jsxs","useState","useRef","useMouseMatrixTransform","transformToString","useEffect","useMemo","error"]}
|
|
1
|
+
{"version":3,"sources":["../lib/components/SchematicViewer.tsx","../lib/hooks/useChangeSchematicComponentLocationsInSvg.ts","../lib/utils/get-component-offset-due-to-events.ts","../lib/hooks/useChangeSchematicTracesForMovedComponents.ts","../lib/hooks/useSchematicGroupsOverlay.ts","../lib/hooks/useSchematicNetHover.ts","../lib/utils/debug.ts","../lib/hooks/use-resize-handling.ts","../lib/hooks/useComponentDragging.ts","../lib/utils/z-index-map.ts","../lib/components/EditIcon.tsx","../lib/components/GridIcon.tsx","../lib/components/ViewMenu.tsx","../package.json","../lib/components/ViewMenuIcon.tsx","../lib/hooks/useLocalStorage.ts","../lib/components/MouseTracker.tsx","../lib/components/SchematicComponentMouseTarget.tsx","../lib/hooks/useMouseEventsOverBoundingBox.ts","../lib/components/SchematicPortMouseTarget.tsx","../lib/components/SchematicSheetSelector.tsx","../lib/components/AnalogSimulationViewer.tsx","../lib/utils/get-analog-simulation-background-color.ts","../lib/components/AnalogSimulationSelector.tsx"],"sourcesContent":["import {\n convertCircuitJsonToSchematicSvg,\n type ColorOverrides,\n} from \"circuit-to-svg\"\nimport { su } from \"@tscircuit/soup-util\"\nimport { useChangeSchematicComponentLocationsInSvg } from \"lib/hooks/useChangeSchematicComponentLocationsInSvg\"\nimport { useChangeSchematicTracesForMovedComponents } from \"lib/hooks/useChangeSchematicTracesForMovedComponents\"\nimport { useSchematicGroupsOverlay } from \"lib/hooks/useSchematicGroupsOverlay\"\nimport { useSchematicNetHover } from \"lib/hooks/useSchematicNetHover\"\nimport { enableDebug } from \"lib/utils/debug\"\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport {\n fromString,\n identity,\n toString as transformToString,\n} from \"transformation-matrix\"\nimport { useMouseMatrixTransform } from \"use-mouse-matrix-transform\"\nimport { useResizeHandling } from \"../hooks/use-resize-handling\"\nimport { useComponentDragging } from \"../hooks/useComponentDragging\"\nimport type { ManualEditEvent } from \"../types/edit-events\"\nimport { EditIcon } from \"./EditIcon\"\nimport { GridIcon } from \"./GridIcon\"\nimport { ViewMenu } from \"./ViewMenu\"\nimport type { CircuitJson, SchematicSheet } from \"circuit-json\"\nimport { zIndexMap } from \"../utils/z-index-map\"\nimport {\n getStoredBoolean,\n setStoredBoolean,\n getStoredString,\n setStoredString,\n STORAGE_KEYS,\n} from \"lib/hooks/useLocalStorage\"\nimport { MouseTracker } from \"./MouseTracker\"\nimport { SchematicComponentMouseTarget } from \"./SchematicComponentMouseTarget\"\nimport { SchematicPortMouseTarget } from \"./SchematicPortMouseTarget\"\nimport { SchematicSheetSelector } from \"./SchematicSheetSelector\"\n\ninterface Props {\n circuitJson: CircuitJson\n containerStyle?: React.CSSProperties\n editEvents?: ManualEditEvent[]\n onEditEvent?: (event: ManualEditEvent) => void\n defaultEditMode?: boolean\n debugGrid?: boolean\n editingEnabled?: boolean\n debug?: boolean\n clickToInteractEnabled?: boolean\n colorOverrides?: ColorOverrides\n disableGroups?: boolean\n /** Fade unrelated nets/chips when hovering a wire or net label. Default true. */\n netHoverHighlightEnabled?: boolean\n css?: string\n className?: string\n onSchematicComponentClicked?: (options: {\n schematicComponentId: string\n event: MouseEvent\n }) => void\n showSchematicPorts?: boolean\n onSchematicPortClicked?: (options: {\n schematicPortId: string\n event: MouseEvent\n }) => void\n /** Called when the active schematic sheet changes (multi-sheet circuits). */\n onSchematicSheetChange?: (schematicSheetId: string) => void\n}\n\nexport const SchematicViewer = ({\n circuitJson,\n containerStyle,\n editEvents: unappliedEditEvents = [],\n onEditEvent,\n defaultEditMode = false,\n debugGrid = false,\n editingEnabled = false,\n debug = false,\n clickToInteractEnabled = false,\n colorOverrides,\n disableGroups = false,\n netHoverHighlightEnabled = true,\n onSchematicComponentClicked,\n showSchematicPorts = false,\n onSchematicPortClicked,\n onSchematicSheetChange,\n css,\n className,\n}: Props) => {\n if (debug) {\n enableDebug()\n }\n\n const getCircuitHash = (circuitJson: CircuitJson) => {\n return `${circuitJson?.length || 0}_${(circuitJson as any)?.editCount || 0}`\n }\n\n const circuitJsonKey = useMemo(\n () => getCircuitHash(circuitJson),\n [circuitJson],\n )\n\n // Schematic sheets present in the circuit, sorted by sheet_index. A circuit\n // may have zero (single implicit sheet), one, or many sheets.\n const schematicSheets = useMemo<SchematicSheet[]>(() => {\n try {\n return (circuitJson as any[])\n .filter((elm) => elm?.type === \"schematic_sheet\")\n .slice()\n .sort((a, b) => (a.sheet_index ?? 0) - (b.sheet_index ?? 0))\n } catch (err) {\n console.error(\"Failed to derive schematic sheets\", err)\n return []\n }\n }, [circuitJsonKey])\n\n const hasMultipleSheets = schematicSheets.length > 1\n const defaultSheetId = schematicSheets[0]?.schematic_sheet_id\n\n const [selectedSheetId, setSelectedSheetId] = useState<string | undefined>(\n () => {\n // Restore the last-viewed sheet from localStorage so it survives reloads.\n const stored = getStoredString(STORAGE_KEYS.SELECTED_SCHEMATIC_SHEET)\n if (\n stored &&\n schematicSheets.some((s) => s.schematic_sheet_id === stored)\n ) {\n return stored\n }\n return defaultSheetId\n },\n )\n\n // Keep the selection valid as the circuit changes: fall back to the default\n // sheet if the previously-selected sheet no longer exists.\n useEffect(() => {\n const stillExists =\n selectedSheetId !== undefined &&\n schematicSheets.some((s) => s.schematic_sheet_id === selectedSheetId)\n if (!stillExists) {\n setSelectedSheetId(defaultSheetId)\n }\n }, [circuitJsonKey])\n\n // The sheet that should actually be rendered. When there is a single sheet\n // (or none) we leave this undefined so circuit-to-svg uses its default and\n // behavior is unchanged for single-sheet circuits.\n const activeSheetId = hasMultipleSheets\n ? (selectedSheetId ?? defaultSheetId)\n : undefined\n\n const handleSelectSheet = useCallback(\n (sheetId: string) => {\n setSelectedSheetId(sheetId)\n setStoredString(STORAGE_KEYS.SELECTED_SCHEMATIC_SHEET, sheetId)\n onSchematicSheetChange?.(sheetId)\n },\n [onSchematicSheetChange],\n )\n\n const [editModeEnabled, setEditModeEnabled] = useState(defaultEditMode)\n const [snapToGrid, setSnapToGrid] = useState(true)\n const [showGridInternal, setShowGridInternal] = useState(false)\n const showGrid = debugGrid || showGridInternal\n const [isInteractionEnabled, setIsInteractionEnabled] = useState<boolean>(\n !clickToInteractEnabled,\n )\n const [showViewMenu, setShowViewMenu] = useState(false)\n const [showSchematicGroups, setShowSchematicGroups] = useState(() => {\n if (disableGroups) return false\n return getStoredBoolean(\"schematic_viewer_show_groups\", false)\n })\n const [isHoveringClickableComponent, setIsHoveringClickableComponent] =\n useState(false)\n const hoveringComponentsRef = useRef<Set<string>>(new Set())\n\n const handleComponentHoverChange = useCallback(\n (componentId: string, isHovering: boolean) => {\n if (isHovering) {\n hoveringComponentsRef.current.add(componentId)\n } else {\n hoveringComponentsRef.current.delete(componentId)\n }\n setIsHoveringClickableComponent(hoveringComponentsRef.current.size > 0)\n },\n [],\n )\n\n const [isHoveringClickablePort, setIsHoveringClickablePort] = useState(false)\n const hoveringPortsRef = useRef<Set<string>>(new Set())\n\n const handlePortHoverChange = useCallback(\n (portId: string, isHovering: boolean) => {\n if (isHovering) {\n hoveringPortsRef.current.add(portId)\n } else {\n hoveringPortsRef.current.delete(portId)\n }\n setIsHoveringClickablePort(hoveringPortsRef.current.size > 0)\n },\n [],\n )\n\n const svgDivRef = useRef<HTMLDivElement>(null)\n const touchStartRef = useRef<{ x: number; y: number } | null>(null)\n\n const schematicComponentIds = useMemo(() => {\n try {\n const components = su(circuitJson).schematic_component?.list() ?? []\n return components\n .filter(\n (component) =>\n !activeSheetId || component.schematic_sheet_id === activeSheetId,\n )\n .map((component) => component.schematic_component_id as string)\n } catch (err) {\n console.error(\"Failed to derive schematic component ids\", err)\n return []\n }\n }, [circuitJsonKey, circuitJson, activeSheetId])\n\n const schematicPortsInfo = useMemo(() => {\n if (!showSchematicPorts) return []\n try {\n const ports = (su(circuitJson).schematic_port?.list() ?? []).filter(\n (port) => !activeSheetId || port.schematic_sheet_id === activeSheetId,\n )\n return ports.map((port) => {\n const sourcePort = su(circuitJson).source_port.get(port.source_port_id)\n const sourceComponent = sourcePort?.source_component_id\n ? su(circuitJson).source_component.get(sourcePort.source_component_id)\n : null\n const componentName = sourceComponent?.name ?? \"?\"\n const pinLabel =\n port.display_pin_label ??\n (sourcePort as any)?.pin_number ??\n (sourcePort as any)?.name ??\n \"?\"\n return {\n portId: port.source_port_id as string,\n label: `${componentName}.${pinLabel}`,\n }\n })\n } catch (err) {\n console.error(\"Failed to derive schematic port info\", err)\n return []\n }\n }, [circuitJsonKey, circuitJson, showSchematicPorts, activeSheetId])\n\n const handleTouchStart = (e: React.TouchEvent) => {\n const touch = e.touches[0]\n touchStartRef.current = {\n x: touch.clientX,\n y: touch.clientY,\n }\n }\n\n const handleTouchEnd = (e: React.TouchEvent) => {\n const touch = e.changedTouches[0]\n const start = touchStartRef.current\n if (!start) return\n\n const deltaX = Math.abs(touch.clientX - start.x)\n const deltaY = Math.abs(touch.clientY - start.y)\n\n if (deltaX < 10 && deltaY < 10) {\n e.preventDefault()\n setIsInteractionEnabled(true)\n }\n\n touchStartRef.current = null\n }\n\n const [internalEditEvents, setInternalEditEvents] = useState<\n ManualEditEvent[]\n >([])\n const circuitJsonRef = useRef<CircuitJson>(circuitJson)\n\n useEffect(() => {\n const circuitHash = getCircuitHash(circuitJson)\n const circuitHashRef = getCircuitHash(circuitJsonRef.current)\n\n if (circuitHash !== circuitHashRef) {\n setInternalEditEvents([])\n circuitJsonRef.current = circuitJson\n }\n }, [circuitJson])\n\n const {\n ref: containerRef,\n cancelDrag,\n transform: svgToScreenProjection,\n } = useMouseMatrixTransform({\n onSetTransform(transform) {\n if (!svgDivRef.current) return\n svgDivRef.current.style.transform = transformToString(transform)\n },\n // @ts-ignore disabled is a valid prop but not typed\n enabled: isInteractionEnabled,\n })\n\n const { containerWidth, containerHeight } = useResizeHandling(containerRef)\n const svgString = useMemo(() => {\n if (!containerWidth || !containerHeight) return \"\"\n\n return convertCircuitJsonToSchematicSvg(circuitJson as any, {\n width: containerWidth,\n height: containerHeight || 720,\n drawPorts: showSchematicPorts,\n schematicSheetId: activeSheetId,\n grid: !showGrid\n ? undefined\n : {\n cellSize: 1,\n labelCells: true,\n },\n colorOverrides,\n css,\n className,\n })\n }, [\n circuitJsonKey,\n containerWidth,\n containerHeight,\n showGrid,\n showSchematicPorts,\n activeSheetId,\n ])\n\n const containerBackgroundColor = useMemo(() => {\n const match = svgString.match(\n /<svg[^>]*style=\"[^\"]*background-color:\\s*([^;\\\"]+)/i,\n )\n return match?.[1] ?? \"transparent\"\n }, [svgString])\n\n const realToSvgProjection = useMemo(() => {\n if (!svgString) return identity()\n const transformString = svgString.match(\n /data-real-to-screen-transform=\"([^\"]+)\"/,\n )?.[1]!\n\n try {\n return fromString(transformString)\n } catch (e) {\n console.error(e)\n return identity()\n }\n }, [svgString])\n\n const handleEditEvent = (event: ManualEditEvent) => {\n setInternalEditEvents((prev) => [...prev, event])\n if (onEditEvent) {\n onEditEvent(event)\n }\n }\n\n const editEventsWithUnappliedEditEvents = useMemo(() => {\n return [...unappliedEditEvents, ...internalEditEvents]\n }, [unappliedEditEvents, internalEditEvents])\n\n const {\n handleMouseDown,\n handleTouchStart: handleComponentTouchStart,\n isDragging,\n activeEditEvent,\n } = useComponentDragging({\n onEditEvent: handleEditEvent,\n cancelDrag,\n realToSvgProjection,\n svgToScreenProjection,\n circuitJson,\n editEvents: editEventsWithUnappliedEditEvents,\n enabled: editModeEnabled && isInteractionEnabled,\n snapToGrid,\n })\n\n useChangeSchematicComponentLocationsInSvg({\n svgDivRef,\n editEvents: editEventsWithUnappliedEditEvents,\n realToSvgProjection,\n svgToScreenProjection,\n activeEditEvent,\n })\n\n useChangeSchematicTracesForMovedComponents({\n svgDivRef,\n circuitJson,\n activeEditEvent,\n editEvents: editEventsWithUnappliedEditEvents,\n })\n\n // Add group overlays when enabled. The key includes the active sheet so\n // overlays are recomputed against the freshly-rendered sheet's SVG.\n useSchematicGroupsOverlay({\n svgDivRef,\n circuitJson,\n circuitJsonKey: `${circuitJsonKey}_${activeSheetId ?? \"\"}`,\n showGroups: showSchematicGroups && !disableGroups,\n })\n\n // Fade unrelated nets/chips when hovering a wire or net label (JS-driven; the\n // base SVG carries no interaction).\n useSchematicNetHover({\n svgDivRef,\n circuitJson,\n circuitJsonKey: `${circuitJsonKey}_${activeSheetId ?? \"\"}`,\n enabled: netHoverHighlightEnabled,\n })\n\n // keep the latest touch handler without re-rendering the svg div\n const handleComponentTouchStartRef = useRef(handleComponentTouchStart)\n useEffect(() => {\n handleComponentTouchStartRef.current = handleComponentTouchStart\n }, [handleComponentTouchStart])\n\n const svgDiv = useMemo(\n () => (\n <div\n ref={svgDivRef}\n style={{\n pointerEvents: clickToInteractEnabled\n ? isInteractionEnabled\n ? \"auto\"\n : \"none\"\n : \"auto\",\n transformOrigin: \"0 0\",\n }}\n className={\n onSchematicComponentClicked\n ? \"schematic-component-clickable\"\n : undefined\n }\n onTouchStart={(e) => {\n if (editModeEnabled && isInteractionEnabled) {\n handleComponentTouchStartRef.current(e)\n }\n }}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>\n dangerouslySetInnerHTML={{ __html: svgString }}\n />\n ),\n [svgString, isInteractionEnabled, clickToInteractEnabled, editModeEnabled],\n )\n\n return (\n <MouseTracker>\n {netHoverHighlightEnabled && (\n <style>\n {`.sch-net-faded { opacity: 0.35; }\n svg :is(g.trace, g.trace-overlays, g[data-schematic-component-id], [data-schematic-net-label-id]) { transition: opacity 0.12s ease-in-out; }`}\n </style>\n )}\n {onSchematicComponentClicked && (\n <style>\n {`.schematic-component-clickable [data-schematic-component-id]:hover { cursor: pointer !important; }`}\n </style>\n )}\n {onSchematicPortClicked && (\n <style>\n {`[data-schematic-port-id]:hover { cursor: pointer !important; }`}\n </style>\n )}\n <div\n ref={containerRef}\n style={{\n position: \"relative\",\n backgroundColor: containerBackgroundColor,\n overflow: \"hidden\",\n cursor: isDragging\n ? \"grabbing\"\n : clickToInteractEnabled && !isInteractionEnabled\n ? \"pointer\"\n : isHoveringClickableComponent && onSchematicComponentClicked\n ? \"pointer\"\n : isHoveringClickablePort && onSchematicPortClicked\n ? \"pointer\"\n : \"grab\",\n minHeight: \"300px\",\n ...containerStyle,\n }}\n onMouseDown={(e) => {\n if (clickToInteractEnabled && !isInteractionEnabled) {\n e.preventDefault()\n e.stopPropagation()\n return\n }\n handleMouseDown(e)\n }}\n onMouseDownCapture={(e) => {\n if (clickToInteractEnabled && !isInteractionEnabled) {\n e.preventDefault()\n e.stopPropagation()\n return\n }\n }}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n >\n {!isInteractionEnabled && clickToInteractEnabled && (\n <div\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n setIsInteractionEnabled(true)\n }}\n style={{\n position: \"absolute\",\n inset: 0,\n cursor: \"pointer\",\n zIndex: zIndexMap.clickToInteractOverlay,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n pointerEvents: \"all\",\n touchAction: \"pan-x pan-y pinch-zoom\",\n }}\n >\n <div\n style={{\n backgroundColor: \"rgba(0, 0, 0, 0.8)\",\n color: \"white\",\n padding: \"12px 24px\",\n borderRadius: \"8px\",\n fontSize: \"16px\",\n fontFamily: \"sans-serif\",\n pointerEvents: \"none\",\n }}\n >\n {typeof window !== \"undefined\" &&\n (\"ontouchstart\" in window || navigator.maxTouchPoints > 0)\n ? \"Touch to Interact\"\n : \"Click to Interact\"}\n </div>\n </div>\n )}\n {editingEnabled && (\n <EditIcon\n active={editModeEnabled}\n onClick={() => setEditModeEnabled(!editModeEnabled)}\n />\n )}\n {editingEnabled && editModeEnabled && (\n <GridIcon\n active={snapToGrid}\n onClick={() => setSnapToGrid(!snapToGrid)}\n />\n )}\n <ViewMenu\n circuitJson={circuitJson}\n circuitJsonKey={circuitJsonKey}\n open={showViewMenu}\n onOpenChange={setShowViewMenu}\n showGroups={showSchematicGroups}\n onToggleGroups={(value) => {\n if (!disableGroups) {\n setShowSchematicGroups(value)\n setStoredBoolean(\"schematic_viewer_show_groups\", value)\n }\n }}\n showGrid={showGrid}\n onToggleGrid={setShowGridInternal}\n />\n <SchematicSheetSelector\n sheets={schematicSheets}\n selectedSheetId={activeSheetId}\n onSelectSheet={handleSelectSheet}\n />\n {onSchematicComponentClicked &&\n schematicComponentIds.map((componentId) => (\n <SchematicComponentMouseTarget\n key={componentId}\n componentId={componentId}\n svgDivRef={svgDivRef}\n containerRef={containerRef}\n showOutline={true}\n circuitJsonKey={circuitJsonKey}\n onHoverChange={handleComponentHoverChange}\n onComponentClick={(id, event) => {\n onSchematicComponentClicked?.({\n schematicComponentId: id,\n event,\n })\n }}\n />\n ))}\n {svgDiv}\n {showSchematicPorts &&\n schematicPortsInfo.map(({ portId, label }) => (\n <SchematicPortMouseTarget\n key={portId}\n portId={portId}\n portLabel={label}\n svgDivRef={svgDivRef}\n containerRef={containerRef}\n showOutline={true}\n circuitJsonKey={circuitJsonKey}\n onHoverChange={handlePortHoverChange}\n onPortClick={\n onSchematicPortClicked\n ? (id, event) => {\n onSchematicPortClicked?.({\n schematicPortId: id,\n event,\n })\n }\n : undefined\n }\n />\n ))}\n </div>\n </MouseTracker>\n )\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type {\n ManualEditEvent,\n EditSchematicComponentLocationEventWithElement,\n} from \"lib/types/edit-events\"\nimport { type Matrix, compose, applyToPoint } from \"transformation-matrix\"\nimport { useEffect, useRef } from \"react\"\nimport { getComponentOffsetDueToEvents } from \"lib/utils/get-component-offset-due-to-events\"\nimport type { CircuitJson } from \"circuit-json\"\n\n/**\n * This hook automatically applies the edit events to the schematic components\n * inside the svg div.\n *\n * Schematic components are \"<g>\" elements with a \"data-circuit-json-type\"\n * attribute equal to \"schematic_component\", these elements also have a\n * data-schematic-component-id attribute equal to the schematic_component_id\n */\nexport const useChangeSchematicComponentLocationsInSvg = ({\n svgDivRef,\n realToSvgProjection,\n svgToScreenProjection,\n activeEditEvent,\n editEvents,\n}: {\n svgDivRef: React.RefObject<HTMLDivElement | null>\n realToSvgProjection: Matrix\n svgToScreenProjection: Matrix\n activeEditEvent: EditSchematicComponentLocationEventWithElement | null\n editEvents: ManualEditEvent[]\n}) => {\n // Keep track of the last known SVG content\n const lastSvgContentRef = useRef<string | null>(null)\n\n useEffect(() => {\n const svg = svgDivRef.current\n if (!svg) return\n\n // Create a MutationObserver to watch for changes in the div's content\n const observer = new MutationObserver((mutations) => {\n // Check if the SVG content has changed\n const currentSvgContent = svg.innerHTML\n if (currentSvgContent !== lastSvgContentRef.current) {\n lastSvgContentRef.current = currentSvgContent\n\n // Apply the transforms\n applyTransforms()\n }\n })\n\n // Function to apply transforms to components\n const applyTransforms = () => {\n const componentsThatHaveBeenMoved = new Set<string>()\n for (const event of editEvents) {\n if (\n \"edit_event_type\" in event &&\n event.edit_event_type === \"edit_schematic_component_location\"\n ) {\n componentsThatHaveBeenMoved.add(event.schematic_component_id)\n }\n }\n if (activeEditEvent) {\n componentsThatHaveBeenMoved.add(activeEditEvent.schematic_component_id)\n }\n\n // Reset all transforms\n const allComponents = svg.querySelectorAll(\n '[data-circuit-json-type=\"schematic_component\"]',\n )\n\n for (const component of Array.from(allComponents)) {\n const schematic_component_id = component.getAttribute(\n \"data-schematic-component-id\",\n )!\n\n const offsetMm = getComponentOffsetDueToEvents({\n editEvents: [\n ...editEvents,\n ...(activeEditEvent ? [activeEditEvent] : []),\n ],\n schematic_component_id,\n })\n\n const offsetPx = {\n x: offsetMm.x * realToSvgProjection.a,\n y: offsetMm.y * realToSvgProjection.d,\n }\n\n const style: any = (component as any).style\n style.transform = `translate(${offsetPx.x}px, ${offsetPx.y}px)`\n if (\n activeEditEvent?.schematic_component_id === schematic_component_id\n ) {\n style.outline = \"solid 2px rgba(255,0,0,0.5)\"\n style.outlineOffset = \"5px\"\n } else if (style.outline) {\n style.outline = \"\"\n }\n }\n }\n\n // Start observing the div for changes\n observer.observe(svg, {\n childList: true, // Watch for changes to the child elements\n subtree: false, // Watch for changes in the entire subtree\n characterData: false, // Watch for changes to text content\n })\n\n // Apply transforms immediately on mount or when editEvents change\n applyTransforms()\n\n // Cleanup function\n return () => {\n observer.disconnect()\n }\n }, [svgDivRef, editEvents, activeEditEvent]) // Dependencies remain the same\n}\n","import type {\n EditSchematicComponentLocationEvent,\n EditSchematicComponentLocationEventWithElement,\n ManualEditEvent,\n} from \"lib/types/edit-events\"\n\n/**\n * Returns the total offset of a component due to a set of edit events in\n * mm\n */\nexport const getComponentOffsetDueToEvents = ({\n editEvents,\n schematic_component_id,\n}: {\n editEvents: ManualEditEvent[]\n schematic_component_id: string\n}) => {\n const editEventsForComponent: EditSchematicComponentLocationEvent[] =\n editEvents\n .filter(\n (event) =>\n \"schematic_component_id\" in event &&\n event.schematic_component_id === schematic_component_id,\n )\n .filter(\n (event) =>\n \"edit_event_type\" in event &&\n event.edit_event_type === \"edit_schematic_component_location\",\n )\n\n const totalOffsetX = editEventsForComponent.reduce((acc, event) => {\n return acc + event.new_center.x - event.original_center.x\n }, 0)\n\n const totalOffsetY = editEventsForComponent.reduce((acc, event) => {\n return acc + event.new_center.y - event.original_center.y\n }, 0)\n\n return {\n x: totalOffsetX,\n y: totalOffsetY,\n }\n}\n","import { useEffect, useRef } from \"react\"\nimport { su } from \"@tscircuit/soup-util\"\nimport type { ManualEditEvent } from \"../types/edit-events\"\nimport type { CircuitJson } from \"circuit-json\"\n\n/**\n * This hook makes traces dashed when their connected components are being moved\n */\nexport const useChangeSchematicTracesForMovedComponents = ({\n svgDivRef,\n circuitJson,\n activeEditEvent,\n editEvents,\n}: {\n svgDivRef: React.RefObject<HTMLDivElement | null>\n circuitJson: CircuitJson\n activeEditEvent: ManualEditEvent | null\n editEvents: ManualEditEvent[]\n}) => {\n // Keep track of the last known SVG content\n const lastSvgContentRef = useRef<string | null>(null)\n\n useEffect(() => {\n const svg = svgDivRef.current\n if (!svg) return\n\n const updateTraceStyles = () => {\n // Reset all traces to solid\n const allTraces = svg.querySelectorAll(\n '[data-circuit-json-type=\"schematic_trace\"] path',\n )\n\n // Reset all traces to solid\n for (const trace of Array.from(allTraces)) {\n trace.setAttribute(\"stroke-dasharray\", \"0\")\n ;(trace as any).style.animation = \"\"\n }\n\n // If there's an active edit event, make connected traces dashed\n for (const editEvent of [\n ...editEvents,\n ...(activeEditEvent ? [activeEditEvent] : []),\n ]) {\n if (\n \"schematic_component_id\" in editEvent &&\n editEvent.edit_event_type === \"edit_schematic_component_location\"\n ) {\n const sch_component = su(circuitJson).schematic_component.get(\n editEvent.schematic_component_id,\n )\n if (!sch_component) return\n\n const src_ports = su(circuitJson).source_port.list({\n source_component_id: sch_component.source_component_id,\n })\n const src_port_ids = new Set(src_ports.map((sp) => sp.source_port_id))\n const src_traces = su(circuitJson)\n .source_trace.list()\n .filter((st) =>\n st.connected_source_port_ids?.some((spi: string) =>\n src_port_ids.has(spi),\n ),\n )\n const src_trace_ids = new Set(\n src_traces.map((st) => st.source_trace_id),\n )\n const schematic_traces = su(circuitJson)\n .schematic_trace.list()\n .filter((st) => src_trace_ids.has(st.source_trace_id!))\n\n // Make the connected traces dashed\n schematic_traces.forEach((trace) => {\n const traceElements = svg.querySelectorAll(\n `[data-schematic-trace-id=\"${trace.schematic_trace_id}\"] path`,\n )\n for (const traceElement of Array.from(traceElements)) {\n if (traceElement.getAttribute(\"class\")?.includes(\"invisible\"))\n continue\n traceElement.setAttribute(\"stroke-dasharray\", \"20,20\")\n ;(traceElement as any).style.animation =\n \"dash-animation 350ms linear infinite, pulse-animation 900ms linear infinite\"\n\n if (!svg.querySelector(\"style#dash-animation\")) {\n const style = document.createElement(\"style\")\n style.id = \"dash-animation\"\n style.textContent = `\n @keyframes dash-animation {\n to {\n stroke-dashoffset: -40;\n }\n }\n @keyframes pulse-animation {\n 0% { opacity: 0.6; }\n 50% { opacity: 0.2; }\n 100% { opacity: 0.6; }\n }\n `\n svg.appendChild(style)\n }\n }\n })\n }\n }\n }\n\n // Apply styles immediately\n updateTraceStyles()\n\n // Cleanup function\n const observer = new MutationObserver(updateTraceStyles)\n observer.observe(svg, {\n childList: true, // Watch for changes to the child elements\n subtree: false, // Watch for changes in the entire subtree\n characterData: false, // Watch for changes to text content\n })\n\n return () => {\n observer.disconnect()\n }\n }, [svgDivRef, activeEditEvent, circuitJson, editEvents])\n}\n","import { useEffect } from \"react\"\nimport { su } from \"@tscircuit/soup-util\"\nimport type { CircuitJson } from \"circuit-json\"\n\ninterface UseSchematicGroupsOverlayOptions {\n svgDivRef: React.RefObject<HTMLDivElement | null>\n circuitJson: CircuitJson\n circuitJsonKey: string\n showGroups: boolean\n}\n\nconst GROUP_COLORS = [\n \"#8B0000\", // Dark Red\n \"#2F4F4F\", // Dark Slate Gray\n \"#191970\", // Midnight Blue\n \"#006400\", // Dark Green\n \"#FF4500\", // Dark Orange\n \"#800080\", // Purple\n \"#2E8B57\", // Sea Green\n \"#B8860B\", // Dark Goldenrod\n \"#C71585\", // Medium Violet Red\n \"#008B8B\", // Dark Cyan\n]\n\nexport const useSchematicGroupsOverlay = (\n options: UseSchematicGroupsOverlayOptions,\n) => {\n const { svgDivRef, circuitJson, circuitJsonKey, showGroups } = options\n\n useEffect(() => {\n // Always clean up existing overlays first\n if (svgDivRef.current) {\n const existingOverlays = svgDivRef.current.querySelectorAll(\n \".schematic-group-overlay\",\n )\n existingOverlays.forEach((overlay) => overlay.remove())\n }\n\n if (\n !svgDivRef.current ||\n !showGroups ||\n !circuitJson ||\n circuitJson.length === 0\n ) {\n return\n }\n\n // Small delay to ensure SVG is rendered when groups are enabled from localStorage\n const timeoutId = setTimeout(() => {\n if (!svgDivRef.current) return\n\n const svg = svgDivRef.current.querySelector(\"svg\")\n if (!svg) {\n return\n }\n\n const existingOverlays = svg.querySelectorAll(\".schematic-group-overlay\")\n existingOverlays.forEach((overlay) => overlay.remove())\n\n try {\n const sourceGroups =\n su(circuitJson)\n .source_group?.list()\n .filter((x) => !!!x.is_subcircuit) || []\n const schematicComponents =\n su(circuitJson).schematic_component?.list() || []\n\n const sourceGroupHierarchy = new Map<string, string[]>()\n sourceGroups.forEach((group) => {\n const groupWithParent = group as any\n if (groupWithParent.parent_source_group_id) {\n const children =\n sourceGroupHierarchy.get(\n groupWithParent.parent_source_group_id,\n ) || []\n children.push(group.source_group_id)\n sourceGroupHierarchy.set(\n groupWithParent.parent_source_group_id,\n children,\n )\n }\n })\n\n const getAllDescendantSourceGroups = (\n sourceGroupId: string,\n ): string[] => {\n const descendants: string[] = []\n const children = sourceGroupHierarchy.get(sourceGroupId) || []\n for (const child of children) {\n descendants.push(child)\n descendants.push(...getAllDescendantSourceGroups(child))\n }\n return descendants\n }\n\n const getGroupDepthLevel = (sourceGroupId: string): number => {\n const groupWithParent = sourceGroups.find(\n (g) => g.source_group_id === sourceGroupId,\n ) as any\n if (!groupWithParent?.parent_source_group_id) {\n return 0\n }\n return 1 + getGroupDepthLevel(groupWithParent.parent_source_group_id)\n }\n\n const hasMeaningfulGroups =\n sourceGroups.length > 0 &&\n sourceGroups.some((group) => group.name && group.name.trim() !== \"\")\n\n let groupsToRender: Array<{\n id: string\n name: string\n components: any[]\n color: string\n depthLevel: number\n hasChildren: boolean\n sourceGroupId?: string\n }> = []\n\n if (hasMeaningfulGroups) {\n const groupMap = new Map<string, any[]>()\n\n for (const comp of schematicComponents) {\n const sourceComp = su(circuitJson).source_component.get(\n comp.source_component_id!,\n )\n if (sourceComp?.source_group_id) {\n if (!groupMap.has(sourceComp.source_group_id)) {\n groupMap.set(sourceComp.source_group_id, [])\n }\n groupMap.get(sourceComp.source_group_id)!.push(comp)\n }\n }\n\n sourceGroups.forEach((group, index) => {\n let groupComponents = groupMap.get(group.source_group_id) || []\n\n const descendantGroups = getAllDescendantSourceGroups(\n group.source_group_id,\n )\n for (const descendantGroupId of descendantGroups) {\n const descendantComponents = groupMap.get(descendantGroupId) || []\n groupComponents = [...groupComponents, ...descendantComponents]\n }\n\n if (groupComponents.length > 0) {\n const depthLevel = getGroupDepthLevel(group.source_group_id)\n const hasChildren =\n getAllDescendantSourceGroups(group.source_group_id).length > 0\n\n if (group.name?.startsWith(\"unnamed_board\")) return\n groupsToRender.push({\n id: group.source_group_id,\n name: group.name || `Group ${index + 1}`,\n components: groupComponents,\n color: GROUP_COLORS[index % GROUP_COLORS.length],\n depthLevel,\n hasChildren,\n sourceGroupId: group.source_group_id,\n })\n }\n })\n }\n // else {\n // const componentTypeGroups = new Map<string, any[]>()\n\n // for (const comp of schematicComponents) {\n // const sourceComp = su(circuitJson).source_component.get(comp.source_component_id)\n // if (sourceComp) {\n // const componentType = sourceComp.ftype || \"other\"\n // if (!componentTypeGroups.has(componentType)) {\n // componentTypeGroups.set(componentType, [])\n // }\n // componentTypeGroups.get(componentType)!.push(comp)\n // }\n // }\n // // groupsToRender = Array.from(componentTypeGroups.entries()).map(\n // // ([type, components], index) => ({\n // // id: `type_${type}`,\n // // name: `${type.charAt(0).toUpperCase() + type.slice(1)}s`,\n // // components,\n // // color: GROUP_COLORS[index % GROUP_COLORS.length],\n // // depthLevel: 0,\n // // hasChildren: false,\n // // }),\n // // )\n // }\n\n const viewBox = svg.viewBox.baseVal\n const svgRect = svg.getBoundingClientRect()\n const scale =\n Math.min(\n svgRect.width / viewBox.width,\n svgRect.height / viewBox.height,\n ) || 1\n\n groupsToRender.sort((a, b) => a.depthLevel - b.depthLevel)\n\n groupsToRender.forEach((group) => {\n if (group.components.length === 0) return\n\n const groupBounds = calculateGroupBounds(group.components, svg)\n if (!groupBounds) return\n\n const basePadding = Math.max(\n 8,\n Math.min(25, 15 / Math.max(scale, 0.3)),\n )\n const hierarchyPadding = group.hasChildren ? basePadding * 0.6 : 0\n const totalPadding = basePadding + hierarchyPadding\n\n const baseStrokeWidth = Math.max(1, 2 / Math.max(scale, 0.5))\n const strokeWidth =\n group.depthLevel === 0 ? baseStrokeWidth : baseStrokeWidth * 0.7\n\n const baseDashSize = Math.max(4, 8 / Math.max(scale, 0.5))\n const dashMultiplier = group.hasChildren ? 1.3 : 1\n const dashSize = baseDashSize * dashMultiplier\n const gapSize = dashSize * 0.5\n\n const groupOverlay = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"rect\",\n )\n groupOverlay.setAttribute(\"class\", \"schematic-group-overlay\")\n groupOverlay.setAttribute(\n \"x\",\n (groupBounds.minX - totalPadding).toString(),\n )\n groupOverlay.setAttribute(\n \"y\",\n (groupBounds.minY - totalPadding).toString(),\n )\n groupOverlay.setAttribute(\n \"width\",\n (groupBounds.maxX - groupBounds.minX + totalPadding * 2).toString(),\n )\n groupOverlay.setAttribute(\n \"height\",\n (groupBounds.maxY - groupBounds.minY + totalPadding * 2).toString(),\n )\n groupOverlay.setAttribute(\"fill\", \"none\")\n groupOverlay.setAttribute(\"stroke\", group.color)\n groupOverlay.setAttribute(\"stroke-width\", strokeWidth.toString())\n groupOverlay.setAttribute(\n \"stroke-dasharray\",\n `${dashSize},${gapSize}`,\n )\n groupOverlay.setAttribute(\"opacity\", \"0.8\")\n groupOverlay.setAttribute(\"rx\", \"0\")\n groupOverlay.setAttribute(\"ry\", \"0\")\n\n const baseFontSize = Math.max(\n 6,\n Math.min(20, 14 / Math.max(scale, 0.2)),\n )\n const fontSizeReduction =\n group.depthLevel === 0 || group.depthLevel === 1\n ? 0\n : group.depthLevel * 0.2\n const fontSize = baseFontSize * (1 - fontSizeReduction)\n\n const labelPadding = Math.max(1, fontSize * 0.2)\n const labelText = group.name\n\n const tempText = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"text\",\n )\n tempText.setAttribute(\"font-size\", fontSize.toString())\n tempText.setAttribute(\"font-family\", \"Arial, sans-serif\")\n tempText.textContent = labelText\n svg.appendChild(tempText)\n const textBBox = tempText.getBBox()\n svg.removeChild(tempText)\n\n const labelWidth = textBBox.width + labelPadding * 2\n const labelHeight = fontSize + labelPadding * 2\n const labelX = groupBounds.minX - totalPadding\n const labelY = groupBounds.minY - totalPadding - labelHeight\n\n const labelBg = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"rect\",\n )\n labelBg.setAttribute(\"class\", \"schematic-group-overlay\")\n labelBg.setAttribute(\"x\", labelX.toString())\n labelBg.setAttribute(\"y\", (labelY - labelHeight).toString())\n labelBg.setAttribute(\"width\", labelWidth.toString())\n labelBg.setAttribute(\"height\", labelHeight.toString())\n labelBg.setAttribute(\"fill\", \"transparent\")\n labelBg.setAttribute(\"rx\", \"0\")\n labelBg.setAttribute(\"ry\", \"0\")\n\n const groupLabel = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"text\",\n )\n groupLabel.setAttribute(\"class\", \"schematic-group-overlay\")\n groupLabel.setAttribute(\"x\", (labelX + labelPadding).toString())\n groupLabel.setAttribute(\n \"y\",\n (labelY + labelHeight - labelPadding).toString(),\n )\n groupLabel.setAttribute(\"fill\", group.color)\n groupLabel.setAttribute(\"font-size\", fontSize.toString())\n groupLabel.setAttribute(\"font-family\", \"Arial, sans-serif\")\n groupLabel.setAttribute(\n \"font-weight\",\n group.depthLevel === 0 ? \"600\" : \"500\",\n )\n groupLabel.setAttribute(\"stroke\", group.color)\n groupLabel.setAttribute(\n \"stroke-width\",\n Math.max(0.2, fontSize * 0.02).toString(),\n )\n groupLabel.textContent = labelText\n\n svg.appendChild(groupOverlay)\n svg.appendChild(labelBg)\n svg.appendChild(groupLabel)\n })\n } catch (error) {\n console.error(\"Error creating group overlays:\", error)\n }\n }, 10) // Small delay to ensure SVG is ready\n\n return () => clearTimeout(timeoutId)\n }, [svgDivRef, circuitJsonKey, showGroups])\n}\n\nfunction calculateGroupBounds(components: any[], svg: SVGElement) {\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity\n\n for (const component of components) {\n let componentElement = svg.querySelector(\n `g[data-schematic-component-id=\"${component.schematic_component_id}\"]`,\n )\n\n if (!componentElement) {\n componentElement = svg.querySelector(\n `[data-schematic-component-id=\"${component.schematic_component_id}\"]`,\n )\n }\n\n if (componentElement) {\n const bbox = (componentElement as SVGGraphicsElement).getBBox()\n minX = Math.min(minX, bbox.x)\n minY = Math.min(minY, bbox.y)\n maxX = Math.max(maxX, bbox.x + bbox.width)\n maxY = Math.max(maxY, bbox.y + bbox.height)\n }\n }\n\n if (minX === Infinity) {\n return null\n }\n\n const bounds = { minX, minY, maxX, maxY }\n return bounds\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type { CircuitJson } from \"circuit-json\"\nimport { useEffect } from \"react\"\n\nconst FADED_CLASS = \"sch-net-faded\"\n\nconst TRACE_SELECTOR =\n \"g.trace[data-subcircuit-connectivity-map-key], g.trace-overlays[data-subcircuit-connectivity-map-key]\"\n\nconst NET_LABEL_SELECTOR = \"[data-schematic-net-label-id]\"\n\n/**\n * Net highlighting on hover, done entirely in JS (the base SVG carries no\n * interaction). Hovering a wire or a net label fades every element that is NOT\n * part of that net — other nets' traces/labels and chips not connected to the\n * net — so the hovered net stands out by contrast rather than by recoloring.\n *\n * Identifies elements by the attributes circuit-to-svg emits:\n * - traces: g.trace[data-subcircuit-connectivity-map-key] (+ g.trace-overlays)\n * - components: g[data-schematic-component-id]\n * - net labels: [data-schematic-net-label-id] (per element, no wrapping group)\n *\n * Faded elements get the `sch-net-faded` class (styled by SchematicViewer).\n */\nexport const useSchematicNetHover = ({\n svgDivRef,\n circuitJson,\n circuitJsonKey,\n enabled,\n}: {\n svgDivRef: React.RefObject<HTMLDivElement | null>\n circuitJson: CircuitJson\n circuitJsonKey: string\n enabled: boolean\n}) => {\n useEffect(() => {\n const svgDiv = svgDivRef.current\n if (!enabled || !svgDiv) return\n\n const { componentIdToKeys, netLabelIdToKey } = buildNetRegistry(circuitJson)\n\n // Every net element and the net key(s) it belongs to, plus each hover\n // trigger's net key. Rebuilt from the SVG whenever it re-renders; the\n // listeners below read them by closure.\n let netElements: Array<{ el: Element; keys: Set<string> }> = []\n const triggerNetKeys = new Map<Element, string>()\n let hoveredNetKey: string | null = null\n\n const collectNetElements = () => {\n for (const { el } of netElements) el.classList.remove(FADED_CLASS)\n netElements = []\n triggerNetKeys.clear()\n hoveredNetKey = null\n\n const svg = svgDiv.querySelector(\"svg\")\n if (!svg) return\n\n for (const el of Array.from(svg.querySelectorAll(TRACE_SELECTOR))) {\n const key = el.getAttribute(\"data-subcircuit-connectivity-map-key\")\n const keys = new Set<string>()\n if (key) {\n keys.add(key)\n triggerNetKeys.set(el, key)\n }\n netElements.push({ el, keys })\n }\n for (const el of Array.from(\n svg.querySelectorAll(\"g[data-schematic-component-id]\"),\n )) {\n const id = el.getAttribute(\"data-schematic-component-id\")!\n netElements.push({ el, keys: componentIdToKeys.get(id) ?? new Set() })\n }\n for (const el of Array.from(svg.querySelectorAll(NET_LABEL_SELECTOR))) {\n const key = netLabelIdToKey.get(\n el.getAttribute(\"data-schematic-net-label-id\")!,\n )\n const keys = new Set<string>()\n if (key) {\n keys.add(key)\n triggerNetKeys.set(el, key)\n }\n netElements.push({ el, keys })\n }\n }\n\n // Fade everything not on `key` (null clears the fade).\n const highlightNet = (key: string | null) => {\n if (key === hoveredNetKey) return\n hoveredNetKey = key\n for (const { el, keys } of netElements) {\n el.classList.toggle(FADED_CLASS, key !== null && !keys.has(key))\n }\n }\n\n const handleMouseOver = (e: Event) => {\n const target = e.target\n if (!(target instanceof Element)) {\n highlightNet(null)\n return\n }\n const trigger = target.closest(`${TRACE_SELECTOR}, ${NET_LABEL_SELECTOR}`)\n if (!trigger) {\n highlightNet(null)\n return\n }\n highlightNet(triggerNetKeys.get(trigger) ?? null)\n }\n const handleMouseLeave = () => highlightNet(null)\n\n collectNetElements()\n svgDiv.addEventListener(\"mouseover\", handleMouseOver)\n svgDiv.addEventListener(\"mouseleave\", handleMouseLeave)\n\n // dangerouslySetInnerHTML replaces the <svg> node when the svg string\n // re-renders, so recollect against the fresh DOM. The listeners stay on the\n // stable svgDiv, so they don't need re-attaching.\n const observer = new MutationObserver(collectNetElements)\n observer.observe(svgDiv, { childList: true })\n\n return () => {\n observer.disconnect()\n svgDiv.removeEventListener(\"mouseover\", handleMouseOver)\n svgDiv.removeEventListener(\"mouseleave\", handleMouseLeave)\n for (const { el } of netElements) el.classList.remove(FADED_CLASS)\n }\n // Keyed on circuitJsonKey (content hash) rather than the circuitJson\n // reference, matching the other post-render SVG hooks.\n }, [svgDivRef, circuitJsonKey, enabled])\n}\n\n/**\n * Derives, from the circuit JSON, the net membership needed to relate DOM\n * elements to nets:\n * - componentIdToKeys: which connectivity nets each schematic component touches\n * - netLabelIdToKey: a schematic_net_label_id -> its connectivity key\n */\nfunction buildNetRegistry(circuitJson: CircuitJson) {\n const cju = su(circuitJson)\n\n // source_component_id -> schematic_component_id\n const srcCompToSchComp = new Map<string, string>()\n for (const c of cju.schematic_component.list()) {\n if (c.source_component_id) {\n srcCompToSchComp.set(c.source_component_id, c.schematic_component_id)\n }\n }\n\n // schematic_component_id -> the connectivity nets its ports belong to (a chip\n // sits on several nets). The connectivity key lives on source_trace.\n const componentIdToKeys = new Map<string, Set<string>>()\n for (const sourceTrace of cju.source_trace.list()) {\n const key = sourceTrace.subcircuit_connectivity_map_key\n if (!key) continue\n for (const portId of sourceTrace.connected_source_port_ids ?? []) {\n const schCompId = srcCompToSchComp.get(\n cju.source_port.get(portId)?.source_component_id ?? \"\",\n )\n if (!schCompId) continue\n if (!componentIdToKeys.has(schCompId)) {\n componentIdToKeys.set(schCompId, new Set())\n }\n componentIdToKeys.get(schCompId)!.add(key)\n }\n }\n\n // schematic_net_label_id -> connectivity key, resolved via its source_net\n // (same key the net's traces use). Falls back to source_net_id, which already\n // *is* the key for auto-emitted labels on unrouted nets (no source_net).\n const netLabelIdToKey = new Map<string, string>()\n for (const label of cju.schematic_net_label.list()) {\n if (!label.source_net_id) continue\n const key =\n cju.source_net.get(label.source_net_id)\n ?.subcircuit_connectivity_map_key ?? label.source_net_id\n netLabelIdToKey.set(label.schematic_net_label_id, key)\n }\n\n return { componentIdToKeys, netLabelIdToKey }\n}\n","import Debug from \"debug\"\n\nexport const debug = Debug(\"schematic-viewer\")\n\nexport const enableDebug = () => {\n Debug.enable(\"schematic-viewer*\")\n}\n\nexport default debug\n","import { useEffect, useState } from \"react\"\n\nexport const useResizeHandling = (\n containerRef: React.RefObject<HTMLElement>,\n) => {\n const [containerWidth, setContainerWidth] = useState(0)\n const [containerHeight, setContainerHeight] = useState(0)\n\n useEffect(() => {\n if (!containerRef.current) return\n\n const updateDimensions = () => {\n const rect = containerRef.current?.getBoundingClientRect()\n setContainerWidth(rect?.width || 0)\n setContainerHeight(rect?.height || 0)\n }\n\n // Set initial dimensions\n updateDimensions()\n\n // Add resize listener\n const resizeObserver = new ResizeObserver(updateDimensions)\n resizeObserver.observe(containerRef.current)\n\n // Fallback to window resize\n window.addEventListener(\"resize\", updateDimensions)\n\n return () => {\n resizeObserver.disconnect()\n window.removeEventListener(\"resize\", updateDimensions)\n }\n }, [])\n\n return { containerWidth, containerHeight }\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport Debug from \"lib/utils/debug\"\nimport { getComponentOffsetDueToEvents } from \"lib/utils/get-component-offset-due-to-events\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport { type Matrix, compose } from \"transformation-matrix\"\nimport type {\n EditSchematicComponentLocationEventWithElement,\n ManualEditEvent,\n} from \"../types/edit-events\"\n\nconst debug = Debug.extend(\"useComponentDragging\")\n\nexport const useComponentDragging = ({\n onEditEvent,\n editEvents = [],\n circuitJson,\n cancelDrag,\n svgToScreenProjection,\n realToSvgProjection,\n enabled = false,\n snapToGrid = false,\n}: {\n circuitJson: any[]\n editEvents: ManualEditEvent[]\n /** The projection returned from use-mouse-matrix-transform, indicating zoom on svg */\n svgToScreenProjection: Matrix\n /** The projection returned from circuit-to-svg, mm to svg */\n realToSvgProjection: Matrix\n onEditEvent?: (event: ManualEditEvent) => void\n cancelDrag?: () => void\n enabled?: boolean\n snapToGrid?: boolean\n}): {\n handleMouseDown: (e: React.MouseEvent) => void\n handleTouchStart: (e: React.TouchEvent) => void\n isDragging: boolean\n activeEditEvent: EditSchematicComponentLocationEventWithElement | null\n} => {\n const [activeEditEvent, setActiveEditEvent] =\n useState<EditSchematicComponentLocationEventWithElement | null>(null)\n const realToScreenProjection = compose(\n realToSvgProjection,\n svgToScreenProjection,\n )\n\n /**\n * Drag start position in screen space\n */\n const dragStartPosRef = useRef<{\n x: number\n y: number\n } | null>(null)\n\n const activeEditEventRef =\n useRef<EditSchematicComponentLocationEventWithElement | null>(null)\n\n // Store the latest positions of components being tracked\n const componentPositionsRef = useRef<Map<string, { x: number; y: number }>>(\n new Map(),\n )\n\n // Update position map with the latest positions from edit events\n useEffect(() => {\n // Process completed edit events to track latest positions\n editEvents.forEach((event) => {\n if (\n \"edit_event_type\" in event &&\n event.edit_event_type === \"edit_schematic_component_location\" &&\n !event.in_progress\n ) {\n componentPositionsRef.current.set(event.schematic_component_id, {\n ...event.new_center,\n })\n }\n })\n }, [editEvents])\n\n const startDrag = useCallback(\n (clientX: number, clientY: number, target: Element) => {\n if (!enabled) return false\n\n const componentGroup = target.closest(\n '[data-circuit-json-type=\"schematic_component\"]',\n )\n if (!componentGroup) return false\n\n const schematic_component_id = componentGroup.getAttribute(\n \"data-schematic-component-id\",\n )\n if (!schematic_component_id) return false\n\n if (cancelDrag) cancelDrag()\n\n const schematic_component = su(circuitJson).schematic_component.get(\n schematic_component_id,\n )\n if (!schematic_component) return false\n\n dragStartPosRef.current = { x: clientX, y: clientY }\n\n let current_position: { x: number; y: number }\n const trackedPosition = componentPositionsRef.current.get(\n schematic_component_id,\n )\n\n if (trackedPosition) {\n current_position = { ...trackedPosition }\n } else {\n const editEventOffset = getComponentOffsetDueToEvents({\n editEvents,\n schematic_component_id: schematic_component_id,\n })\n\n current_position = {\n x: schematic_component.center.x + editEventOffset.x,\n y: schematic_component.center.y + editEventOffset.y,\n }\n\n componentPositionsRef.current.set(schematic_component_id, {\n ...current_position,\n })\n }\n\n const newEditEvent: EditSchematicComponentLocationEventWithElement = {\n edit_event_id: Math.random().toString(36).substr(2, 9),\n edit_event_type: \"edit_schematic_component_location\",\n schematic_component_id: schematic_component_id,\n original_center: current_position,\n new_center: { ...current_position },\n in_progress: true,\n created_at: Date.now(),\n _element: componentGroup as any,\n }\n\n activeEditEventRef.current = newEditEvent\n setActiveEditEvent(newEditEvent)\n return true\n },\n [cancelDrag, enabled, circuitJson, editEvents],\n )\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n startDrag(e.clientX, e.clientY, e.target as Element)\n },\n [startDrag],\n )\n\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n if (e.touches.length !== 1) return\n const touch = e.touches[0]\n if (startDrag(touch.clientX, touch.clientY, e.target as Element)) {\n e.preventDefault()\n }\n },\n [startDrag],\n )\n\n const updateDragPosition = useCallback(\n (clientX: number, clientY: number) => {\n if (!activeEditEventRef.current || !dragStartPosRef.current) return\n\n const screenDelta = {\n x: clientX - dragStartPosRef.current.x,\n y: clientY - dragStartPosRef.current.y,\n }\n\n const mmDelta = {\n x: screenDelta.x / realToScreenProjection.a,\n y: screenDelta.y / realToScreenProjection.d,\n }\n\n let newCenter = {\n x: activeEditEventRef.current.original_center.x + mmDelta.x,\n y: activeEditEventRef.current.original_center.y + mmDelta.y,\n }\n if (snapToGrid) {\n const snap = (v: number) => Math.round(v * 10) / 10\n newCenter = { x: snap(newCenter.x), y: snap(newCenter.y) }\n }\n\n const newEditEvent = {\n ...activeEditEventRef.current,\n new_center: newCenter,\n }\n\n activeEditEventRef.current = newEditEvent\n setActiveEditEvent(newEditEvent)\n },\n [realToScreenProjection, snapToGrid],\n )\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => updateDragPosition(e.clientX, e.clientY),\n [updateDragPosition],\n )\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n if (e.touches.length !== 1 || !activeEditEventRef.current) return\n e.preventDefault()\n const touch = e.touches[0]\n updateDragPosition(touch.clientX, touch.clientY)\n },\n [updateDragPosition],\n )\n\n const endDrag = useCallback(() => {\n if (!activeEditEventRef.current) return\n const finalEvent = {\n ...activeEditEventRef.current,\n in_progress: false,\n }\n\n componentPositionsRef.current.set(finalEvent.schematic_component_id, {\n ...finalEvent.new_center,\n })\n\n debug(\"endDrag calling onEditEvent with new edit event\", {\n newEditEvent: finalEvent,\n })\n if (onEditEvent) onEditEvent(finalEvent)\n activeEditEventRef.current = null\n dragStartPosRef.current = null\n setActiveEditEvent(null)\n }, [onEditEvent])\n\n const handleMouseUp = useCallback(() => endDrag(), [endDrag])\n const handleTouchEnd = useCallback(() => endDrag(), [endDrag])\n\n useEffect(() => {\n window.addEventListener(\"mousemove\", handleMouseMove)\n window.addEventListener(\"mouseup\", handleMouseUp)\n window.addEventListener(\"touchmove\", handleTouchMove, { passive: false })\n window.addEventListener(\"touchend\", handleTouchEnd)\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove)\n window.removeEventListener(\"mouseup\", handleMouseUp)\n window.removeEventListener(\"touchmove\", handleTouchMove)\n window.removeEventListener(\"touchend\", handleTouchEnd)\n }\n }, [handleMouseMove, handleMouseUp, handleTouchMove, handleTouchEnd])\n\n return {\n handleMouseDown,\n handleTouchStart,\n isDragging: !!activeEditEventRef.current,\n activeEditEvent: activeEditEvent,\n }\n}\n","export const zIndexMap = {\n schematicEditIcon: 50,\n schematicGridIcon: 49,\n viewMenuIcon: 48,\n viewMenu: 55,\n viewMenuBackdrop: 54,\n clickToInteractOverlay: 100,\n schematicComponentHoverOutline: 47,\n schematicPortHoverOutline: 48,\n}\n","import { zIndexMap } from \"../utils/z-index-map\"\n\nexport const EditIcon = ({\n onClick,\n active,\n}: { onClick: () => void; active: boolean }) => {\n const handleInteraction = (e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault()\n onClick()\n }\n\n return (\n <div\n onClick={handleInteraction}\n onTouchEnd={handleInteraction}\n title={active ? \"Disable edit mode\" : \"Enable edit mode\"}\n style={{\n position: \"absolute\",\n top: \"16px\",\n right: \"64px\",\n backgroundColor: active ? \"#4CAF50\" : \"#fff\",\n color: active ? \"#fff\" : \"#000\",\n padding: \"8px\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n zIndex: zIndexMap.schematicEditIcon,\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 >\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n </div>\n )\n}\n","import { zIndexMap } from \"../utils/z-index-map\"\n\nexport const GridIcon = ({\n onClick,\n active,\n}: { onClick: () => void; active: boolean }) => {\n const handleInteraction = (e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault()\n onClick()\n }\n\n return (\n <div\n onClick={handleInteraction}\n onTouchEnd={handleInteraction}\n title={active ? \"Hide grid\" : \"Show grid\"}\n style={{\n position: \"absolute\",\n top: \"56px\",\n right: \"64px\",\n backgroundColor: active ? \"#4CAF50\" : \"#fff\",\n color: active ? \"#fff\" : \"#000\",\n padding: \"8px\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n zIndex: zIndexMap.schematicGridIcon,\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 >\n <path d=\"M3 3h7v7H3zM14 3h7v7h-7zM3 14h7v7H3zM14 14h7v7h-7z\" />\n </svg>\n </div>\n )\n}\n","import { useMemo } from \"react\"\nimport { su } from \"@tscircuit/soup-util\"\nimport type { CircuitJson } from \"circuit-json\"\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport { zIndexMap } from \"../utils/z-index-map\"\nimport packageJson from \"../../package.json\"\nimport { ViewMenuIcon } from \"./ViewMenuIcon\"\n\ninterface ViewMenuProps {\n circuitJson: CircuitJson\n circuitJsonKey: string\n open: boolean\n onOpenChange: (open: boolean) => void\n showGroups: boolean\n onToggleGroups: (show: boolean) => void\n showGrid: boolean\n onToggleGrid: (show: boolean) => void\n}\n\nconst FONT_FAMILY =\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n\nconst contentStyles: React.CSSProperties = {\n backgroundColor: \"#ffffff\",\n color: \"#111111\",\n borderRadius: 8,\n boxShadow: \"0 6px 24px rgba(0,0,0,0.12), 0 1px 3px rgba(0,0,0,0.08)\",\n border: \"1px solid #e5e7eb\",\n padding: 4,\n minWidth: 224,\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n outline: \"none\",\n zIndex: zIndexMap.viewMenu,\n}\n\nconst itemStyles: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"7px 10px 7px 8px\",\n borderRadius: 6,\n cursor: \"pointer\",\n outline: \"none\",\n userSelect: \"none\",\n color: \"#111111\",\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n}\n\nconst iconSlotStyles: React.CSSProperties = {\n width: 16,\n height: 16,\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#111111\",\n}\n\nconst separatorStyles: React.CSSProperties = {\n height: 1,\n backgroundColor: \"#ececec\",\n margin: \"4px 0\",\n}\n\nconst HIGHLIGHT_CSS = `\n.sv-vm-item[data-highlighted]:not([data-disabled]),\n.sv-vm-item:hover:not([data-disabled]) { background-color: #f1f3f5; }\n.sv-vm-item[data-disabled] { opacity: 0.45; cursor: not-allowed; }\n`\n\nconst CheckIcon = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n)\n\nexport const ViewMenu = ({\n circuitJson,\n circuitJsonKey,\n open,\n onOpenChange,\n showGroups,\n onToggleGroups,\n showGrid,\n onToggleGrid,\n}: ViewMenuProps) => {\n const hasGroups = useMemo(() => {\n if (!circuitJson || circuitJson.length === 0) return false\n\n try {\n // Check if there are explicit groups\n const sourceGroups = su(circuitJson).source_group?.list() || []\n if (sourceGroups.length > 0) return true\n\n // Check if we can create virtual groups by component type\n const schematicComponents =\n su(circuitJson).schematic_component?.list() || []\n if (schematicComponents.length > 1) {\n const componentTypes = new Set()\n for (const comp of schematicComponents) {\n const sourceComp = su(circuitJson).source_component.get(\n comp.source_component_id!,\n )\n if (sourceComp?.ftype) {\n componentTypes.add(sourceComp.ftype)\n }\n }\n return componentTypes.size > 1 // Only show if there are multiple types\n }\n\n return false\n } catch (error) {\n console.error(\"Error checking for groups:\", error)\n return false\n }\n }, [circuitJsonKey])\n\n return (\n <DropdownMenu.Root open={open} onOpenChange={onOpenChange} modal={false}>\n <DropdownMenu.Trigger asChild>\n <ViewMenuIcon active={open} />\n </DropdownMenu.Trigger>\n\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n style={contentStyles}\n side=\"bottom\"\n align=\"end\"\n sideOffset={8}\n collisionPadding={10}\n >\n <style>{HIGHLIGHT_CSS}</style>\n\n {/* View toggles */}\n <DropdownMenu.Item\n className=\"sv-vm-item\"\n style={itemStyles}\n disabled={!hasGroups}\n title={hasGroups ? undefined : \"No groups found in this schematic\"}\n // Toggle on pointerup (reliable on touch); keep the menu open by\n // preventing Radix's click-based onSelect (which also closes it).\n onSelect={(e) => e.preventDefault()}\n onPointerUp={() => {\n if (hasGroups) onToggleGroups(!showGroups)\n }}\n >\n <span style={iconSlotStyles}>{showGroups && <CheckIcon />}</span>\n <span>View Schematic Groups</span>\n </DropdownMenu.Item>\n\n <DropdownMenu.Item\n className=\"sv-vm-item\"\n style={itemStyles}\n onSelect={(e) => e.preventDefault()}\n onPointerUp={() => onToggleGrid(!showGrid)}\n >\n <span style={iconSlotStyles}>{showGrid && <CheckIcon />}</span>\n <span>Show Grid</span>\n </DropdownMenu.Item>\n\n <DropdownMenu.Separator style={separatorStyles} />\n\n {/* Version */}\n <div\n style={{\n padding: \"4px 8px\",\n fontSize: 12,\n color: \"#9ca3af\",\n textAlign: \"center\",\n fontFamily: FONT_FAMILY,\n }}\n >\n v{String(packageJson?.version)}\n </div>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n )\n}\n","{\n \"name\": \"@tscircuit/schematic-viewer\",\n \"version\": \"2.0.73\",\n \"main\": \"dist/index.js\",\n \"type\": \"module\",\n \"scripts\": {\n \"start\": \"cosmos\",\n \"build\": \"tsup-node ./lib/index.ts --dts --format esm --sourcemap\",\n \"build:site\": \"cosmos-export\",\n \"vercel-build\": \"bun run build:site\",\n \"format\": \"biome format --write .\",\n \"format:check\": \"biome format .\"\n },\n \"files\": [\n \"dist\"\n ],\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.9.4\",\n \"@types/bun\": \"latest\",\n \"@types/debug\": \"^4.1.12\",\n \"@types/react\": \"^19.0.1\",\n \"@types/react-dom\": \"^19.0.2\",\n \"@vitejs/plugin-react\": \"^4.3.4\",\n \"react\": \"^19.1.0\",\n \"react-cosmos\": \"^6.2.1\",\n \"react-cosmos-plugin-vite\": \"^6.2.0\",\n \"react-dom\": \"^19.1.0\",\n \"react-reconciler\": \"^0.31.0\",\n \"semver\": \"^7.7.2\",\n \"tscircuit\": \"^0.0.2112\",\n \"tsup\": \"^8.3.5\",\n \"vite\": \"^6.0.3\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5.0.0\",\n \"tscircuit\": \"*\"\n },\n \"dependencies\": {\n \"@radix-ui/react-dropdown-menu\": \"^2.1.16\",\n \"debug\": \"^4.4.0\",\n \"performance-now\": \"^2.1.0\",\n \"use-mouse-matrix-transform\": \"^1.2.2\"\n }\n}\n","import { zIndexMap } from \"../utils/z-index-map\"\n\ninterface ViewMenuIconProps extends React.ComponentPropsWithRef<\"button\"> {\n active?: boolean\n}\n\nexport const ViewMenuIcon = ({\n active = false,\n ...props\n}: ViewMenuIconProps) => {\n return (\n <button\n type=\"button\"\n title={active ? \"Hide view menu\" : \"Show view menu\"}\n {...props}\n style={{\n position: \"absolute\",\n top: \"16px\",\n right: \"16px\",\n backgroundColor: active ? \"#4CAF50\" : \"#fff\",\n color: active ? \"#fff\" : \"#000\",\n padding: \"8px\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n outline: \"none\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n zIndex: zIndexMap.viewMenuIcon,\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 >\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n </svg>\n </button>\n )\n}\n","import { useCallback } from \"react\"\n\nexport const STORAGE_KEYS = {\n IS_SHOWING_SCHEMATIC_GROUPS: \"schematic_viewer_show_groups\",\n SELECTED_SCHEMATIC_SHEET: \"schematic_viewer_selected_sheet\",\n} as const\n\nexport const getStoredBoolean = (\n key: string,\n defaultValue: boolean,\n): boolean => {\n if (typeof window === \"undefined\") return defaultValue\n try {\n const stored = localStorage.getItem(key)\n return stored !== null ? JSON.parse(stored) : defaultValue\n } catch {\n return defaultValue\n }\n}\n\nexport const setStoredBoolean = (key: string, value: boolean): void => {\n if (typeof window === \"undefined\") return\n try {\n localStorage.setItem(key, JSON.stringify(value))\n } catch {}\n}\n\nexport const getStoredString = (key: string): string | null => {\n if (typeof window === \"undefined\") return null\n try {\n return localStorage.getItem(key)\n } catch {\n return null\n }\n}\n\nexport const setStoredString = (key: string, value: string): void => {\n if (typeof window === \"undefined\") return\n try {\n localStorage.setItem(key, value)\n } catch {}\n}\n\nexport const useLocalStorage = () => {\n const getBoolean = useCallback(\n (key: string, defaultValue: boolean): boolean => {\n return getStoredBoolean(key, defaultValue)\n },\n [],\n )\n\n const setBoolean = useCallback((key: string, value: boolean): void => {\n setStoredBoolean(key, value)\n }, [])\n\n return {\n getBoolean,\n setBoolean,\n }\n}\n\nexport const useLocalStorageValue = (key: string, defaultValue: boolean) => {\n const { getBoolean, setBoolean } = useLocalStorage()\n\n const getValue = useCallback(() => {\n return getBoolean(key, defaultValue)\n }, [getBoolean, key, defaultValue])\n\n const setValue = useCallback(\n (value: boolean) => {\n setBoolean(key, value)\n },\n [setBoolean, key],\n )\n\n return {\n getValue,\n setValue,\n }\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\"\n\nexport interface BoundingBoxBounds {\n minX: number\n maxX: number\n minY: number\n maxY: number\n}\n\ninterface BoundingBoxRegistration {\n bounds: BoundingBoxBounds | null\n onClick?: ((event: MouseEvent) => void) | undefined\n}\n\nexport interface MouseTrackerContextValue {\n registerBoundingBox: (\n id: string,\n registration: BoundingBoxRegistration,\n ) => void\n updateBoundingBox: (id: string, registration: BoundingBoxRegistration) => void\n unregisterBoundingBox: (id: string) => void\n subscribe: (listener: () => void) => () => void\n isHovering: (id: string) => boolean\n}\n\nexport const MouseTrackerContext =\n createContext<MouseTrackerContextValue | null>(null)\n\nconst DRAG_THRESHOLD_PX = 5\n\nconst boundsAreEqual = (\n a: BoundingBoxBounds | null | undefined,\n b: BoundingBoxBounds | null | undefined,\n) => {\n if (!a && !b) return true\n if (!a || !b) return false\n return (\n a.minX === b.minX &&\n a.maxX === b.maxX &&\n a.minY === b.minY &&\n a.maxY === b.maxY\n )\n}\n\nexport const MouseTracker = ({ children }: { children: ReactNode }) => {\n const existingContext = useContext(MouseTrackerContext)\n\n if (existingContext) {\n return <>{children}</>\n }\n\n const storeRef = useRef({\n pointer: null as { x: number; y: number } | null,\n boundingBoxes: new Map<string, BoundingBoxRegistration>(),\n hoveringIds: new Set<string>(),\n subscribers: new Set<() => void>(),\n mouseDownPosition: null as { x: number; y: number } | null,\n })\n\n const notifySubscribers = useCallback(() => {\n for (const callback of storeRef.current.subscribers) {\n callback()\n }\n }, [])\n\n const updateHovering = useCallback(() => {\n const pointer = storeRef.current.pointer\n const newHovering = new Set<string>()\n\n if (pointer) {\n for (const [id, registration] of storeRef.current.boundingBoxes) {\n const bounds = registration.bounds\n if (!bounds) continue\n if (\n pointer.x >= bounds.minX &&\n pointer.x <= bounds.maxX &&\n pointer.y >= bounds.minY &&\n pointer.y <= bounds.maxY\n ) {\n newHovering.add(id)\n }\n }\n }\n\n const prevHovering = storeRef.current.hoveringIds\n if (\n newHovering.size === prevHovering.size &&\n [...newHovering].every((id) => prevHovering.has(id))\n ) {\n return\n }\n\n storeRef.current.hoveringIds = newHovering\n notifySubscribers()\n }, [notifySubscribers])\n\n const registerBoundingBox = useCallback(\n (id: string, registration: BoundingBoxRegistration) => {\n storeRef.current.boundingBoxes.set(id, registration)\n updateHovering()\n },\n [updateHovering],\n )\n\n const updateBoundingBox = useCallback(\n (id: string, registration: BoundingBoxRegistration) => {\n const existing = storeRef.current.boundingBoxes.get(id)\n if (\n existing &&\n boundsAreEqual(existing.bounds, registration.bounds) &&\n existing.onClick === registration.onClick\n ) {\n return\n }\n storeRef.current.boundingBoxes.set(id, registration)\n updateHovering()\n },\n [updateHovering],\n )\n\n const unregisterBoundingBox = useCallback(\n (id: string) => {\n const removed = storeRef.current.boundingBoxes.delete(id)\n if (removed) {\n updateHovering()\n }\n },\n [updateHovering],\n )\n\n const subscribe = useCallback((listener: () => void) => {\n storeRef.current.subscribers.add(listener)\n return () => {\n storeRef.current.subscribers.delete(listener)\n }\n }, [])\n\n const isHovering = useCallback((id: string) => {\n return storeRef.current.hoveringIds.has(id)\n }, [])\n\n useEffect(() => {\n const handlePointerPosition = (event: PointerEvent | MouseEvent) => {\n const { clientX, clientY } = event\n const pointer = storeRef.current.pointer\n if (pointer && pointer.x === clientX && pointer.y === clientY) {\n return\n }\n storeRef.current.pointer = { x: clientX, y: clientY }\n updateHovering()\n }\n\n const handlePointerLeave = () => {\n if (storeRef.current.pointer === null) return\n storeRef.current.pointer = null\n storeRef.current.mouseDownPosition = null\n updateHovering()\n }\n\n const handleMouseDown = (event: MouseEvent) => {\n storeRef.current.mouseDownPosition = {\n x: event.clientX,\n y: event.clientY,\n }\n }\n\n const handleClick = (event: MouseEvent) => {\n const { clientX, clientY } = event\n const mouseDownPos = storeRef.current.mouseDownPosition\n\n // Check if this was a drag (movement > threshold)\n if (mouseDownPos) {\n const distance = Math.sqrt(\n Math.pow(clientX - mouseDownPos.x, 2) +\n Math.pow(clientY - mouseDownPos.y, 2),\n )\n if (distance > DRAG_THRESHOLD_PX) {\n // This was a drag, not a click - don't trigger onClick\n storeRef.current.mouseDownPosition = null\n return\n }\n }\n\n storeRef.current.mouseDownPosition = null\n\n for (const registration of storeRef.current.boundingBoxes.values()) {\n const bounds = registration.bounds\n if (!bounds) continue\n if (\n clientX >= bounds.minX &&\n clientX <= bounds.maxX &&\n clientY >= bounds.minY &&\n clientY <= bounds.maxY\n ) {\n registration.onClick?.(event)\n }\n }\n }\n\n window.addEventListener(\"pointermove\", handlePointerPosition, {\n passive: true,\n })\n window.addEventListener(\"pointerdown\", handlePointerPosition, {\n passive: true,\n })\n window.addEventListener(\"pointerup\", handlePointerPosition, {\n passive: true,\n })\n window.addEventListener(\"pointerleave\", handlePointerLeave)\n window.addEventListener(\"pointercancel\", handlePointerLeave)\n window.addEventListener(\"blur\", handlePointerLeave)\n window.addEventListener(\"mousedown\", handleMouseDown, { passive: true })\n window.addEventListener(\"click\", handleClick, { passive: true })\n\n return () => {\n window.removeEventListener(\"pointermove\", handlePointerPosition)\n window.removeEventListener(\"pointerdown\", handlePointerPosition)\n window.removeEventListener(\"pointerup\", handlePointerPosition)\n window.removeEventListener(\"pointerleave\", handlePointerLeave)\n window.removeEventListener(\"pointercancel\", handlePointerLeave)\n window.removeEventListener(\"blur\", handlePointerLeave)\n window.removeEventListener(\"mousedown\", handleMouseDown)\n window.removeEventListener(\"click\", handleClick)\n }\n }, [updateHovering])\n\n const value = useMemo<MouseTrackerContextValue>(\n () => ({\n registerBoundingBox,\n updateBoundingBox,\n unregisterBoundingBox,\n subscribe,\n isHovering,\n }),\n [\n registerBoundingBox,\n updateBoundingBox,\n unregisterBoundingBox,\n subscribe,\n isHovering,\n ],\n )\n\n return (\n <MouseTrackerContext.Provider value={value}>\n {children}\n </MouseTrackerContext.Provider>\n )\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\"\nimport { useMouseEventsOverBoundingBox } from \"../hooks/useMouseEventsOverBoundingBox\"\nimport type { BoundingBoxBounds } from \"./MouseTracker\"\nimport { zIndexMap } from \"../utils/z-index-map\"\n\ninterface RelativeRect {\n left: number\n top: number\n width: number\n height: number\n}\n\ninterface Measurement {\n bounds: BoundingBoxBounds\n rect: RelativeRect\n}\n\nconst areMeasurementsEqual = (a: Measurement | null, b: Measurement | null) => {\n if (!a && !b) return true\n if (!a || !b) return false\n return (\n Math.abs(a.bounds.minX - b.bounds.minX) < 0.5 &&\n Math.abs(a.bounds.maxX - b.bounds.maxX) < 0.5 &&\n Math.abs(a.bounds.minY - b.bounds.minY) < 0.5 &&\n Math.abs(a.bounds.maxY - b.bounds.maxY) < 0.5 &&\n Math.abs(a.rect.left - b.rect.left) < 0.5 &&\n Math.abs(a.rect.top - b.rect.top) < 0.5 &&\n Math.abs(a.rect.width - b.rect.width) < 0.5 &&\n Math.abs(a.rect.height - b.rect.height) < 0.5\n )\n}\n\ninterface Props {\n componentId: string\n svgDivRef: React.RefObject<HTMLDivElement | null>\n containerRef: React.RefObject<HTMLDivElement | null>\n onComponentClick?: (componentId: string, event: MouseEvent) => void\n onHoverChange?: (componentId: string, isHovering: boolean) => void\n showOutline: boolean\n circuitJsonKey: string\n}\n\nexport const SchematicComponentMouseTarget = ({\n componentId,\n svgDivRef,\n containerRef,\n onComponentClick,\n onHoverChange,\n showOutline,\n circuitJsonKey,\n}: Props) => {\n const [measurement, setMeasurement] = useState<Measurement | null>(null)\n const frameRef = useRef<number | null>(null)\n\n const measure = useCallback(() => {\n frameRef.current = null\n const svgDiv = svgDivRef.current\n const container = containerRef.current\n if (!svgDiv || !container) {\n setMeasurement((prev) => (prev ? null : prev))\n return\n }\n const element = svgDiv.querySelector<SVGGraphicsElement | HTMLElement>(\n `[data-schematic-component-id=\"${componentId}\"]`,\n )\n if (!element) {\n setMeasurement((prev) => (prev ? null : prev))\n return\n }\n\n const elementRect = element.getBoundingClientRect()\n const containerRect = container.getBoundingClientRect()\n\n const nextMeasurement: Measurement = {\n bounds: {\n minX: elementRect.left,\n maxX: elementRect.right,\n minY: elementRect.top,\n maxY: elementRect.bottom,\n },\n rect: {\n left: elementRect.left - containerRect.left,\n top: elementRect.top - containerRect.top,\n width: elementRect.width,\n height: elementRect.height,\n },\n }\n\n setMeasurement((prev) =>\n areMeasurementsEqual(prev, nextMeasurement) ? prev : nextMeasurement,\n )\n }, [componentId, containerRef, svgDivRef])\n\n const scheduleMeasure = useCallback(() => {\n if (frameRef.current !== null) return\n frameRef.current = window.requestAnimationFrame(measure)\n }, [measure])\n\n useEffect(() => {\n scheduleMeasure()\n }, [scheduleMeasure, circuitJsonKey])\n\n useEffect(() => {\n scheduleMeasure()\n const svgDiv = svgDivRef.current\n const container = containerRef.current\n if (!svgDiv || !container) return\n\n const resizeObserver =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(() => {\n scheduleMeasure()\n })\n : null\n resizeObserver?.observe(container)\n resizeObserver?.observe(svgDiv)\n\n const mutationObserver =\n typeof MutationObserver !== \"undefined\"\n ? new MutationObserver(() => {\n scheduleMeasure()\n })\n : null\n mutationObserver?.observe(svgDiv, {\n attributes: true,\n attributeFilter: [\"style\", \"transform\"],\n subtree: true,\n childList: true,\n })\n\n window.addEventListener(\"scroll\", scheduleMeasure, true)\n window.addEventListener(\"resize\", scheduleMeasure)\n\n return () => {\n resizeObserver?.disconnect()\n mutationObserver?.disconnect()\n window.removeEventListener(\"scroll\", scheduleMeasure, true)\n window.removeEventListener(\"resize\", scheduleMeasure)\n if (frameRef.current !== null) {\n cancelAnimationFrame(frameRef.current)\n frameRef.current = null\n }\n }\n }, [scheduleMeasure, svgDivRef, containerRef])\n\n const handleClick = useCallback(\n (event: MouseEvent) => {\n if (onComponentClick) {\n onComponentClick(componentId, event)\n }\n },\n [componentId, onComponentClick],\n )\n\n const bounds = measurement?.bounds ?? null\n\n const { hovering } = useMouseEventsOverBoundingBox({\n bounds,\n onClick: onComponentClick ? handleClick : undefined,\n })\n\n // Notify parent of hover state changes\n useEffect(() => {\n if (onHoverChange) {\n onHoverChange(componentId, hovering)\n }\n }, [hovering, componentId, onHoverChange])\n\n if (!measurement || !hovering || !showOutline) {\n return null\n }\n\n const rect = measurement.rect\n\n return (\n <div\n style={{\n position: \"absolute\",\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n border: \"1.5px solid rgba(51, 153, 255, 0.9)\",\n pointerEvents: \"none\",\n zIndex: zIndexMap.schematicComponentHoverOutline,\n }}\n />\n )\n}\n","import {\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from \"react\"\nimport {\n MouseTrackerContext,\n type BoundingBoxBounds,\n} from \"../components/MouseTracker\"\n\ninterface UseMouseEventsOverBoundingBoxOptions {\n bounds: BoundingBoxBounds | null\n onClick?: (event: MouseEvent) => void\n}\n\nexport const useMouseEventsOverBoundingBox = (\n options: UseMouseEventsOverBoundingBoxOptions,\n) => {\n const context = useContext(MouseTrackerContext)\n\n if (!context) {\n throw new Error(\n \"useMouseEventsOverBoundingBox must be used within a MouseTracker\",\n )\n }\n\n const id = useId()\n const latestOptionsRef = useRef(options)\n latestOptionsRef.current = options\n\n const handleClick = useMemo(\n () => (event: MouseEvent) => {\n latestOptionsRef.current.onClick?.(event)\n },\n [],\n )\n\n useEffect(() => {\n context.registerBoundingBox(id, {\n bounds: latestOptionsRef.current.bounds,\n onClick: latestOptionsRef.current.onClick ? handleClick : undefined,\n })\n return () => {\n context.unregisterBoundingBox(id)\n }\n }, [context, handleClick, id])\n\n useEffect(() => {\n context.updateBoundingBox(id, {\n bounds: latestOptionsRef.current.bounds,\n onClick: latestOptionsRef.current.onClick ? handleClick : undefined,\n })\n }, [\n context,\n handleClick,\n id,\n options.bounds?.minX,\n options.bounds?.maxX,\n options.bounds?.minY,\n options.bounds?.maxY,\n options.onClick,\n ])\n\n const hovering = useSyncExternalStore(\n context.subscribe,\n () => context.isHovering(id),\n () => false,\n )\n\n return { hovering }\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\"\nimport { useMouseEventsOverBoundingBox } from \"../hooks/useMouseEventsOverBoundingBox\"\nimport type { BoundingBoxBounds } from \"./MouseTracker\"\nimport { zIndexMap } from \"../utils/z-index-map\"\n\ninterface RelativeRect {\n left: number\n top: number\n width: number\n height: number\n}\n\ninterface Measurement {\n bounds: BoundingBoxBounds\n rect: RelativeRect\n}\n\nconst areMeasurementsEqual = (a: Measurement | null, b: Measurement | null) => {\n if (!a && !b) return true\n if (!a || !b) return false\n return (\n Math.abs(a.bounds.minX - b.bounds.minX) < 0.5 &&\n Math.abs(a.bounds.maxX - b.bounds.maxX) < 0.5 &&\n Math.abs(a.bounds.minY - b.bounds.minY) < 0.5 &&\n Math.abs(a.bounds.maxY - b.bounds.maxY) < 0.5 &&\n Math.abs(a.rect.left - b.rect.left) < 0.5 &&\n Math.abs(a.rect.top - b.rect.top) < 0.5 &&\n Math.abs(a.rect.width - b.rect.width) < 0.5 &&\n Math.abs(a.rect.height - b.rect.height) < 0.5\n )\n}\n\ninterface Props {\n portId: string\n portLabel?: string\n svgDivRef: React.RefObject<HTMLDivElement | null>\n containerRef: React.RefObject<HTMLDivElement | null>\n onPortClick?: (portId: string, event: MouseEvent) => void\n onHoverChange?: (portId: string, isHovering: boolean) => void\n showOutline: boolean\n circuitJsonKey: string\n}\n\nexport const SchematicPortMouseTarget = ({\n portId,\n portLabel,\n svgDivRef,\n containerRef,\n onPortClick,\n onHoverChange,\n showOutline,\n circuitJsonKey,\n}: Props) => {\n const [measurement, setMeasurement] = useState<Measurement | null>(null)\n const frameRef = useRef<number | null>(null)\n\n const measure = useCallback(() => {\n frameRef.current = null\n const svgDiv = svgDivRef.current\n const container = containerRef.current\n if (!svgDiv || !container) {\n setMeasurement((prev) => (prev ? null : prev))\n return\n }\n const element = svgDiv.querySelector<SVGGraphicsElement | HTMLElement>(\n `[data-schematic-port-id=\"${portId}\"]`,\n )\n if (!element) {\n setMeasurement((prev) => (prev ? null : prev))\n return\n }\n\n const elementRect = element.getBoundingClientRect()\n const containerRect = container.getBoundingClientRect()\n\n // Add some padding around the port for easier interaction\n const padding = 4\n\n const nextMeasurement: Measurement = {\n bounds: {\n minX: elementRect.left - padding,\n maxX: elementRect.right + padding,\n minY: elementRect.top - padding,\n maxY: elementRect.bottom + padding,\n },\n rect: {\n left: elementRect.left - containerRect.left - padding,\n top: elementRect.top - containerRect.top - padding,\n width: elementRect.width + padding * 2,\n height: elementRect.height + padding * 2,\n },\n }\n\n setMeasurement((prev) =>\n areMeasurementsEqual(prev, nextMeasurement) ? prev : nextMeasurement,\n )\n }, [portId, containerRef, svgDivRef])\n\n const scheduleMeasure = useCallback(() => {\n if (frameRef.current !== null) return\n frameRef.current = window.requestAnimationFrame(measure)\n }, [measure])\n\n useEffect(() => {\n scheduleMeasure()\n }, [scheduleMeasure, circuitJsonKey])\n\n useEffect(() => {\n scheduleMeasure()\n const svgDiv = svgDivRef.current\n const container = containerRef.current\n if (!svgDiv || !container) return\n\n const resizeObserver =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(() => {\n scheduleMeasure()\n })\n : null\n resizeObserver?.observe(container)\n resizeObserver?.observe(svgDiv)\n\n const mutationObserver =\n typeof MutationObserver !== \"undefined\"\n ? new MutationObserver(() => {\n scheduleMeasure()\n })\n : null\n mutationObserver?.observe(svgDiv, {\n attributes: true,\n attributeFilter: [\"style\", \"transform\"],\n subtree: true,\n childList: true,\n })\n\n window.addEventListener(\"scroll\", scheduleMeasure, true)\n window.addEventListener(\"resize\", scheduleMeasure)\n\n return () => {\n resizeObserver?.disconnect()\n mutationObserver?.disconnect()\n window.removeEventListener(\"scroll\", scheduleMeasure, true)\n window.removeEventListener(\"resize\", scheduleMeasure)\n if (frameRef.current !== null) {\n cancelAnimationFrame(frameRef.current)\n frameRef.current = null\n }\n }\n }, [scheduleMeasure, svgDivRef, containerRef])\n\n const handleClick = useCallback(\n (event: MouseEvent) => {\n if (onPortClick) {\n onPortClick(portId, event)\n }\n },\n [portId, onPortClick],\n )\n\n const bounds = measurement?.bounds ?? null\n\n const { hovering } = useMouseEventsOverBoundingBox({\n bounds,\n onClick: onPortClick ? handleClick : undefined,\n })\n\n // Notify parent of hover state changes\n useEffect(() => {\n if (onHoverChange) {\n onHoverChange(portId, hovering)\n }\n }, [hovering, portId, onHoverChange])\n\n if (!measurement || !showOutline) {\n return null\n }\n\n const rect = measurement.rect\n\n return (\n <>\n <div\n style={{\n position: \"absolute\",\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n border: hovering\n ? \"1.5px solid rgba(255, 153, 51, 0.9)\"\n : \"1.5px solid rgba(255, 153, 51, 0.3)\",\n backgroundColor: hovering\n ? \"rgba(255, 153, 51, 0.15)\"\n : \"rgba(255, 153, 51, 0.05)\",\n borderRadius: \"50%\",\n pointerEvents: \"none\",\n zIndex: zIndexMap.schematicPortHoverOutline,\n transition: \"border-color 0.15s, background-color 0.15s\",\n }}\n />\n {hovering && portLabel && (\n <div\n style={{\n position: \"absolute\",\n left: rect.left + rect.width / 2,\n top: rect.top - 24,\n transform: \"translateX(-50%)\",\n backgroundColor: \"rgba(0, 0, 0, 0.85)\",\n color: \"white\",\n padding: \"4px 8px\",\n borderRadius: \"4px\",\n fontSize: \"12px\",\n fontFamily: \"monospace\",\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n zIndex: zIndexMap.schematicPortHoverOutline + 1,\n }}\n >\n {portLabel}\n </div>\n )}\n </>\n )\n}\n","import { useState } from \"react\"\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport type { SchematicSheet } from \"circuit-json\"\nimport { zIndexMap } from \"../utils/z-index-map\"\n\ninterface SchematicSheetSelectorProps {\n sheets: SchematicSheet[]\n selectedSheetId: string | undefined\n onSelectSheet: (schematicSheetId: string) => void\n}\n\nconst FONT_FAMILY =\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n\nconst contentStyles: React.CSSProperties = {\n backgroundColor: \"#ffffff\",\n color: \"#111111\",\n borderRadius: 8,\n boxShadow: \"0 6px 24px rgba(0,0,0,0.12), 0 1px 3px rgba(0,0,0,0.08)\",\n border: \"1px solid #e5e7eb\",\n padding: 4,\n minWidth: 200,\n maxWidth: 320,\n maxHeight: 320,\n overflowY: \"auto\",\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n outline: \"none\",\n zIndex: zIndexMap.viewMenu,\n}\n\nconst itemStyles: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"7px 10px 7px 8px\",\n borderRadius: 6,\n cursor: \"pointer\",\n outline: \"none\",\n userSelect: \"none\",\n color: \"#111111\",\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n}\n\nconst iconSlotStyles: React.CSSProperties = {\n width: 16,\n height: 16,\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#111111\",\n}\n\nconst ellipsisStyles: React.CSSProperties = {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n}\n\nconst MENU_CSS = `\n.sv-sheet-item[data-highlighted], .sv-sheet-item:hover { background-color: #f1f3f5; }\n.sv-sheet-chevron { transition: transform 0.2s ease; }\n[data-state=\"open\"] > .sv-sheet-chevron { transform: rotate(180deg); }\n`\n\nconst CheckIcon = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n)\n\nconst ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ opacity: 0.6, flexShrink: 0 }}\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n)\n\n/**\n * A standalone toolbar dropdown for switching the active schematic sheet.\n * Rendered only when the circuit has more than one sheet.\n */\nexport const SchematicSheetSelector = ({\n sheets,\n selectedSheetId,\n onSelectSheet,\n}: SchematicSheetSelectorProps) => {\n const [open, setOpen] = useState(false)\n\n if (sheets.length <= 1) return null\n\n const selectedSheet = sheets.find(\n (s) => s.schematic_sheet_id === selectedSheetId,\n )\n const selectedLabel = selectedSheet?.name ?? \"Select sheet\"\n\n return (\n <>\n <style>{MENU_CSS}</style>\n <DropdownMenu.Root open={open} onOpenChange={setOpen} modal={false}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n title={selectedLabel}\n onPointerDown={(e) => e.stopPropagation()}\n style={{\n position: \"absolute\",\n top: \"16px\",\n left: \"16px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n maxWidth: \"220px\",\n padding: \"8px 12px\",\n backgroundColor: \"#ffffff\",\n color: \"#000000\",\n border: \"none\",\n outline: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n fontSize: \"13px\",\n fontFamily: FONT_FAMILY,\n zIndex: zIndexMap.viewMenuIcon,\n }}\n >\n <span style={{ color: \"#888888\", flexShrink: 0 }}>Sheet:</span>\n <span style={{ ...ellipsisStyles, minWidth: 0 }}>\n {selectedLabel}\n </span>\n <ChevronDownIcon className=\"sv-sheet-chevron\" />\n </button>\n </DropdownMenu.Trigger>\n\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n style={contentStyles}\n side=\"bottom\"\n align=\"start\"\n sideOffset={8}\n collisionPadding={10}\n >\n {sheets.map((sheet) => {\n const selected = sheet.schematic_sheet_id === selectedSheetId\n return (\n <DropdownMenu.Item\n key={sheet.schematic_sheet_id}\n className=\"sv-sheet-item\"\n style={itemStyles}\n title={sheet.name}\n // Select on pointerup (fires reliably on touch); Radix's own\n // onSelect fires on `click`, which is unreliable on mobile.\n onSelect={(e) => e.preventDefault()}\n onPointerUp={() => {\n onSelectSheet(sheet.schematic_sheet_id)\n setOpen(false)\n }}\n >\n <span style={iconSlotStyles}>\n {selected && <CheckIcon />}\n </span>\n <span style={{ ...ellipsisStyles, minWidth: 0 }}>\n {sheet.name}\n </span>\n </DropdownMenu.Item>\n )\n })}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </>\n )\n}\n","import type { CircuitJson } from \"circuit-json\"\nimport {\n type ColorOverrides,\n convertCircuitJsonToSchematicSimulationSvg,\n convertCircuitJsonToSimulationGraphSvg,\n} from \"circuit-to-svg\"\nimport { useEffect, useMemo, useRef, useState } from \"react\"\nimport { toString as transformToString } from \"transformation-matrix\"\nimport { useMouseMatrixTransform } from \"use-mouse-matrix-transform\"\nimport { useResizeHandling } from \"../hooks/use-resize-handling\"\nimport { getAnalogSimulationBackgroundColor } from \"../utils/get-analog-simulation-background-color\"\nimport { AnalogSimulationSelector } from \"./AnalogSimulationSelector\"\n\nconst DEFAULT_RENDER_WIDTH = 1200\nconst DEFAULT_COMBINED_RENDER_ASPECT_RATIO = 1\nconst DEFAULT_GRAPH_ONLY_RENDER_ASPECT_RATIO = 2\n\ninterface Props {\n circuitJson: CircuitJson\n containerStyle?: React.CSSProperties\n colorOverrides?: ColorOverrides\n width?: number\n height?: number\n className?: string\n /** Whether to hide the schematic and render only the simulation graph. Defaults to false. */\n hideSchematic?: boolean\n /** Called when the active simulation changes. */\n onSimulationChange?: (simulationExperimentId: string) => void\n}\n\nexport const AnalogSimulationViewer = ({\n circuitJson: inputCircuitJson,\n containerStyle,\n colorOverrides,\n width,\n height,\n className,\n hideSchematic = false,\n onSimulationChange,\n}: Props) => {\n const [circuitJson, setCircuitJson] = useState<CircuitJson | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [svgObjectUrl, setSvgObjectUrl] = useState<string | null>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const imgRef = useRef<HTMLImageElement>(null)\n\n const { containerWidth } = useResizeHandling(\n containerRef as React.RefObject<HTMLElement>,\n )\n\n const [isDragging, setIsDragging] = useState(false)\n\n const {\n ref: transformRef,\n cancelDrag: _cancelDrag,\n transform: _svgToScreenProjection,\n } = useMouseMatrixTransform({\n onSetTransform(transform) {\n if (imgRef.current) {\n imgRef.current.style.transform = transformToString(transform)\n }\n },\n })\n\n const defaultRenderAspectRatio = hideSchematic\n ? DEFAULT_GRAPH_ONLY_RENDER_ASPECT_RATIO\n : DEFAULT_COMBINED_RENDER_ASPECT_RATIO\n const renderAspectRatio =\n width && height ? width / height : defaultRenderAspectRatio\n const effectiveWidth =\n width ||\n (height ? height * renderAspectRatio : containerWidth) ||\n DEFAULT_RENDER_WIDTH\n const effectiveHeight = height || effectiveWidth / renderAspectRatio\n\n // Set CircuitJSON from props\n useEffect(() => {\n setIsLoading(true)\n setError(null)\n setCircuitJson(inputCircuitJson)\n setIsLoading(false)\n }, [inputCircuitJson])\n\n const simulationExperiments = useMemo(() => {\n if (!circuitJson) return []\n return circuitJson.filter(\n (element) => element.type === \"simulation_experiment\",\n )\n }, [circuitJson])\n const [selectedSimulationExperimentId, setSelectedSimulationExperimentId] =\n useState<string | null>(null)\n const simulationExperimentId =\n (selectedSimulationExperimentId &&\n simulationExperiments.some(\n (simulation) =>\n simulation.simulation_experiment_id === selectedSimulationExperimentId,\n )\n ? selectedSimulationExperimentId\n : simulationExperiments[0]?.simulation_experiment_id) ?? null\n\n useEffect(() => {\n if (simulationExperimentId !== selectedSimulationExperimentId) {\n setSelectedSimulationExperimentId(simulationExperimentId)\n }\n }, [simulationExperimentId, selectedSimulationExperimentId])\n\n const handleSelectSimulation = (nextSimulationExperimentId: string) => {\n setSelectedSimulationExperimentId(nextSimulationExperimentId)\n onSimulationChange?.(nextSimulationExperimentId)\n }\n\n // Find simulation graph IDs from circuit JSON\n const simulationVoltageGraphIds = useMemo(() => {\n if (!circuitJson) return []\n return circuitJson.flatMap((element) =>\n element.type === \"simulation_transient_voltage_graph\" &&\n element.simulation_experiment_id === simulationExperimentId\n ? [element.simulation_transient_voltage_graph_id]\n : [],\n )\n }, [circuitJson, simulationExperimentId])\n\n const simulationCurrentGraphIds = useMemo(() => {\n if (!circuitJson) return []\n return circuitJson.flatMap((element) =>\n element.type === \"simulation_transient_current_graph\" &&\n element.simulation_experiment_id === simulationExperimentId\n ? [element.simulation_transient_current_graph_id]\n : [],\n )\n }, [circuitJson, simulationExperimentId])\n\n // Generate the simulation SVG from CircuitJSON\n const simulationSvg = useMemo(() => {\n if (\n !circuitJson ||\n !effectiveWidth ||\n !effectiveHeight ||\n !simulationExperimentId\n )\n return \"\"\n\n try {\n const simulationOptions = {\n circuitJson,\n simulation_experiment_id: simulationExperimentId,\n simulation_transient_current_graph_ids: simulationCurrentGraphIds,\n simulation_transient_voltage_graph_ids: simulationVoltageGraphIds,\n width: effectiveWidth,\n height: effectiveHeight,\n }\n\n return hideSchematic\n ? convertCircuitJsonToSimulationGraphSvg(simulationOptions)\n : convertCircuitJsonToSchematicSimulationSvg({\n ...simulationOptions,\n schematicOptions: { colorOverrides },\n })\n } catch (error) {\n console.error(\"Failed to generate simulation SVG:\", error)\n return \"\"\n }\n }, [\n circuitJson,\n effectiveWidth,\n effectiveHeight,\n colorOverrides,\n hideSchematic,\n simulationExperimentId,\n simulationCurrentGraphIds,\n simulationVoltageGraphIds,\n ])\n\n // Create/revoke object URL whenever the SVG changes\n useEffect(() => {\n if (!simulationSvg) {\n setSvgObjectUrl(null)\n return\n }\n\n try {\n const blob = new Blob([simulationSvg], { type: \"image/svg+xml\" })\n const url = URL.createObjectURL(blob)\n setSvgObjectUrl(url)\n return () => {\n URL.revokeObjectURL(url)\n }\n } catch (error) {\n console.error(\"Failed to create SVG object URL:\", error)\n setSvgObjectUrl(null)\n }\n }, [simulationSvg])\n\n const containerBackgroundColor = useMemo(() => {\n return getAnalogSimulationBackgroundColor(simulationSvg, colorOverrides)\n }, [simulationSvg, colorOverrides])\n\n const handleMouseDown = (_e: React.MouseEvent) => {\n setIsDragging(true)\n }\n\n const handleTouchStart = (_e: React.TouchEvent) => {\n setIsDragging(true)\n }\n\n useEffect(() => {\n const handleMouseUp = () => {\n setIsDragging(false)\n }\n\n const handleTouchEnd = () => {\n setIsDragging(false)\n }\n\n window.addEventListener(\"mouseup\", handleMouseUp)\n window.addEventListener(\"touchend\", handleTouchEnd)\n\n return () => {\n window.removeEventListener(\"mouseup\", handleMouseUp)\n window.removeEventListener(\"touchend\", handleTouchEnd)\n }\n }, [])\n\n if (isLoading) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"#f5f5f5\",\n minHeight: \"300px\",\n fontFamily: \"sans-serif\",\n fontSize: \"16px\",\n color: \"#666\",\n ...containerStyle,\n }}\n className={className}\n >\n Loading circuit...\n </div>\n )\n }\n\n if (error) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"#fef2f2\",\n minHeight: \"300px\",\n fontFamily: \"sans-serif\",\n fontSize: \"16px\",\n color: \"#dc2626\",\n ...containerStyle,\n }}\n className={className}\n >\n <div style={{ textAlign: \"center\", padding: \"20px\" }}>\n <div style={{ fontWeight: \"bold\", marginBottom: \"8px\" }}>\n Circuit Conversion Error\n </div>\n <div style={{ fontSize: \"14px\" }}>{error}</div>\n </div>\n </div>\n )\n }\n\n if (!simulationSvg) {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"#f8fafc\",\n minHeight: \"300px\",\n fontFamily: \"sans-serif\",\n gap: \"12px\",\n ...containerStyle,\n }}\n className={className}\n >\n <div style={{ fontSize: \"16px\", color: \"#475569\", fontWeight: 500 }}>\n No Simulation Found\n </div>\n <div style={{ fontSize: \"14px\", color: \"#64748b\" }}>\n Use{\" \"}\n <code\n style={{\n backgroundColor: \"#e2e8f0\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n }}\n >\n {\"<analogsimulation />\"}\n </code>{\" \"}\n to create simulations\n </div>\n </div>\n )\n }\n\n return (\n <div\n ref={(node) => {\n containerRef.current = node\n transformRef.current = node\n }}\n style={{\n position: \"relative\",\n backgroundColor: containerBackgroundColor,\n overflow: \"hidden\",\n minHeight: \"300px\",\n cursor: isDragging ? \"grabbing\" : \"grab\",\n ...containerStyle,\n }}\n className={className}\n onMouseDown={handleMouseDown}\n onTouchStart={handleTouchStart}\n >\n <AnalogSimulationSelector\n simulations={simulationExperiments}\n selectedSimulationExperimentId={simulationExperimentId}\n onSelectSimulation={handleSelectSimulation}\n />\n {svgObjectUrl ? (\n <img\n ref={imgRef}\n src={svgObjectUrl}\n alt=\"Circuit Simulation\"\n style={{\n transformOrigin: \"0 0\",\n width: \"100%\",\n height: \"100%\",\n display: \"block\",\n objectFit: \"contain\",\n }}\n />\n ) : (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n minHeight: \"300px\",\n color: \"#666\",\n fontFamily: \"sans-serif\",\n }}\n >\n Failed to render SVG\n </div>\n )}\n </div>\n )\n}\n","import { type ColorOverrides, colorMap } from \"circuit-to-svg\"\n\nconst getRootSvgBackgroundColor = (simulationSvg: string) => {\n const rootStyleMatch = simulationSvg.match(\n /<svg\\b[^>]*\\bstyle=(?:\"([^\"]*)\"|'([^']*)')/i,\n )\n const rootStyle = rootStyleMatch?.[1] ?? rootStyleMatch?.[2]\n return rootStyle\n ?.match(/(?:^|;)\\s*background-color\\s*:\\s*([^;]+)/i)?.[1]\n ?.trim()\n}\n\nconst getGraphBackgroundColor = (simulationSvg: string) =>\n simulationSvg\n .match(/\\.background\\s*\\{[^}]*\\bfill\\s*:\\s*([^;}]+)/i)?.[1]\n ?.trim()\n\nexport const getAnalogSimulationBackgroundColor = (\n simulationSvg: string,\n colorOverrides?: ColorOverrides,\n) =>\n getRootSvgBackgroundColor(simulationSvg) ??\n getGraphBackgroundColor(simulationSvg) ??\n colorOverrides?.schematic?.background ??\n colorMap.schematic.background\n","import * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport type { SimulationExperiment } from \"circuit-json\"\nimport { useState } from \"react\"\nimport { zIndexMap } from \"../utils/z-index-map\"\n\ninterface AnalogSimulationSelectorProps {\n simulations: SimulationExperiment[]\n selectedSimulationExperimentId: string | null\n onSelectSimulation: (simulationExperimentId: string) => void\n}\n\nconst FONT_FAMILY =\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'\n\nconst contentStyles: React.CSSProperties = {\n backgroundColor: \"#ffffff\",\n color: \"#111111\",\n borderRadius: 8,\n boxShadow: \"0 6px 24px rgba(0,0,0,0.12), 0 1px 3px rgba(0,0,0,0.08)\",\n border: \"1px solid #e5e7eb\",\n padding: 4,\n minWidth: 220,\n maxWidth: 360,\n maxHeight: 320,\n overflowY: \"auto\",\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n outline: \"none\",\n zIndex: zIndexMap.viewMenu,\n}\n\nconst itemStyles: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"7px 10px 7px 8px\",\n borderRadius: 6,\n cursor: \"pointer\",\n outline: \"none\",\n userSelect: \"none\",\n color: \"#111111\",\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n}\n\nconst iconSlotStyles: React.CSSProperties = {\n width: 16,\n height: 16,\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#111111\",\n}\n\nconst ellipsisStyles: React.CSSProperties = {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n}\n\nconst MENU_CSS = `\n.sv-simulation-item[data-highlighted], .sv-simulation-item:hover { background-color: #f1f3f5; }\n.sv-simulation-chevron { transition: transform 0.2s ease; }\n[data-state=\"open\"] > .sv-simulation-chevron { transform: rotate(180deg); }\n`\n\nconst CheckIcon = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n)\n\nconst ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ opacity: 0.6, flexShrink: 0 }}\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n)\n\nconst getSimulationLabels = (simulations: SimulationExperiment[]) => {\n const nameCounts = new Map<string, number>()\n return simulations.map((simulation) => {\n const count = (nameCounts.get(simulation.name) ?? 0) + 1\n nameCounts.set(simulation.name, count)\n return {\n simulation,\n label: count === 1 ? simulation.name : `${simulation.name} (${count})`,\n }\n })\n}\n\n/** A toolbar dropdown for switching between analog simulation experiments. */\nexport const AnalogSimulationSelector = ({\n simulations,\n selectedSimulationExperimentId,\n onSelectSimulation,\n}: AnalogSimulationSelectorProps) => {\n const [open, setOpen] = useState(false)\n\n if (simulations.length <= 1) return null\n\n const simulationLabels = getSimulationLabels(simulations)\n const selectedSimulation = simulationLabels.find(\n ({ simulation }) =>\n simulation.simulation_experiment_id === selectedSimulationExperimentId,\n )\n const selectedLabel = selectedSimulation?.label ?? \"Select simulation\"\n\n return (\n <>\n <style>{MENU_CSS}</style>\n <DropdownMenu.Root open={open} onOpenChange={setOpen} modal={false}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n title={selectedLabel}\n onPointerDown={(event) => event.stopPropagation()}\n style={{\n position: \"absolute\",\n top: \"16px\",\n left: \"16px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n maxWidth: \"280px\",\n padding: \"8px 12px\",\n backgroundColor: \"#ffffff\",\n color: \"#000000\",\n border: \"none\",\n outline: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n fontSize: \"13px\",\n fontFamily: FONT_FAMILY,\n zIndex: zIndexMap.viewMenuIcon,\n }}\n >\n <span style={{ color: \"#888888\", flexShrink: 0 }}>Simulation:</span>\n <span style={{ ...ellipsisStyles, minWidth: 0 }}>\n {selectedLabel}\n </span>\n <ChevronDownIcon className=\"sv-simulation-chevron\" />\n </button>\n </DropdownMenu.Trigger>\n\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n style={contentStyles}\n side=\"bottom\"\n align=\"start\"\n sideOffset={8}\n collisionPadding={10}\n >\n {simulationLabels.map(({ simulation, label }) => {\n const selected =\n simulation.simulation_experiment_id ===\n selectedSimulationExperimentId\n return (\n <DropdownMenu.Item\n key={simulation.simulation_experiment_id}\n className=\"sv-simulation-item\"\n style={itemStyles}\n title={label}\n onSelect={(event) => event.preventDefault()}\n onPointerUp={() => {\n onSelectSimulation(simulation.simulation_experiment_id)\n setOpen(false)\n }}\n >\n <span style={iconSlotStyles}>\n {selected && <CheckIcon />}\n </span>\n <span style={{ ...ellipsisStyles, minWidth: 0 }}>\n {label}\n </span>\n </DropdownMenu.Item>\n )\n })}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </>\n )\n}\n"],"mappings":"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","names":["su","useEffect","useRef","su","useEffect","su","su","useEffect","useCallback","useEffect","useMemo","useRef","useState","useEffect","su","useEffect","useRef","useState","compose","debug","su","jsx","su","jsx","jsxs","jsx","jsxs","su","useCallback","useCallback","useEffect","useMemo","useRef","jsx","useCallback","useEffect","useRef","useState","useContext","useEffect","useMemo","useRef","useContext","useRef","useMemo","useEffect","jsx","useState","useRef","useCallback","useEffect","useCallback","useEffect","useRef","useState","Fragment","jsx","jsxs","areMeasurementsEqual","useState","useRef","useCallback","useEffect","useState","DropdownMenu","Fragment","jsx","jsxs","FONT_FAMILY","contentStyles","itemStyles","iconSlotStyles","CheckIcon","useState","jsx","jsxs","debug","circuitJson","useMemo","useState","useEffect","useCallback","useRef","su","useEffect","useMemo","useRef","useState","transformToString","useMouseMatrixTransform","DropdownMenu","useState","Fragment","jsx","jsxs","FONT_FAMILY","contentStyles","itemStyles","iconSlotStyles","ellipsisStyles","MENU_CSS","CheckIcon","ChevronDownIcon","useState","jsx","jsxs","useState","useRef","useMouseMatrixTransform","transformToString","useEffect","useMemo","error"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tscircuit/schematic-viewer",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.74",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"react-dom": "^19.1.0",
|
|
28
28
|
"react-reconciler": "^0.31.0",
|
|
29
29
|
"semver": "^7.7.2",
|
|
30
|
-
"tscircuit": "^0.0.
|
|
30
|
+
"tscircuit": "^0.0.2112",
|
|
31
31
|
"tsup": "^8.3.5",
|
|
32
32
|
"vite": "^6.0.3"
|
|
33
33
|
},
|