@tscircuit/schematic-viewer 2.0.89 → 2.0.91
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 +27 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/components/SchematicViewer.tsx","../lib/hooks/useLocalStorage.ts","../lib/hooks/useSchematicGroupsOverlay.ts","../lib/hooks/useSchematicNetHover.ts","../lib/hooks/useSchematicSearch.ts","../lib/utils/get-schematic-search-results.ts","../lib/utils/get-search-result-transform.ts","../lib/utils/debug.ts","../lib/hooks/use-resize-handling.ts","../lib/hooks/useContextMenu.ts","../lib/utils/component-details.ts","../lib/utils/z-index-map.ts","../lib/components/MouseTracker.tsx","../lib/components/SchematicComponentDetailsTooltip.tsx","../lib/components/SchematicComponentMouseTarget.tsx","../lib/hooks/useMouseEventsOverBoundingBox.ts","../lib/components/SchematicPortMouseTarget.tsx","../lib/components/SchematicSearch.tsx","../lib/components/SchematicSearchIcons.tsx","../lib/components/SchematicSheetSelector.tsx","../lib/components/ViewMenu.tsx","../package.json","../lib/components/AnalogSimulationViewer.tsx","../lib/utils/get-analog-simulation-background-color.ts","../lib/components/AnalogSimulationSelector.tsx"],"sourcesContent":["import { su } from \"@tscircuit/soup-util\"\nimport type { CircuitJson, SchematicSheet } from \"circuit-json\"\nimport {\n type ColorOverrides,\n convertCircuitJsonToSchematicSvg,\n} from \"circuit-to-svg\"\nimport {\n STORAGE_KEYS,\n getStoredBoolean,\n getStoredString,\n setStoredBoolean,\n setStoredString,\n} from \"lib/hooks/useLocalStorage\"\nimport { useSchematicGroupsOverlay } from \"lib/hooks/useSchematicGroupsOverlay\"\nimport { useSchematicNetHover } from \"lib/hooks/useSchematicNetHover\"\nimport { useSchematicSearch } from \"lib/hooks/useSchematicSearch\"\nimport { enableDebug } from \"lib/utils/debug\"\nimport { useCallback, 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 { useContextMenu } from \"../hooks/useContextMenu\"\nimport { getSchematicComponentDetails } from \"../utils/component-details\"\nimport { zIndexMap } from \"../utils/z-index-map\"\nimport { MouseTracker } from \"./MouseTracker\"\nimport { SchematicComponentDetailsTooltip } from \"./SchematicComponentDetailsTooltip\"\nimport { SchematicComponentMouseTarget } from \"./SchematicComponentMouseTarget\"\nimport { SchematicPortMouseTarget } from \"./SchematicPortMouseTarget\"\nimport { SchematicSearch } from \"./SchematicSearch\"\nimport { SchematicSheetSelector } from \"./SchematicSheetSelector\"\nimport { ViewMenu } from \"./ViewMenu\"\n\ninterface Props {\n circuitJson: CircuitJson\n containerStyle?: React.CSSProperties\n debugGrid?: 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 /** Show component and net-label search. Default true. */\n searchEnabled?: boolean\n}\n\ninterface SelectedSchematicComponent {\n schematicComponentId: string\n anchorX: number\n anchorY: number\n}\n\nexport const SchematicViewer = ({\n circuitJson,\n containerStyle,\n debugGrid = false,\n debug = false,\n clickToInteractEnabled = false,\n colorOverrides,\n disableGroups = false,\n netHoverHighlightEnabled = true,\n onSchematicComponentClicked,\n showSchematicPorts,\n onSchematicPortClicked,\n onSchematicSheetChange,\n searchEnabled = true,\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 [showGridInternal, setShowGridInternal] = useState(false)\n const showGrid = debugGrid || showGridInternal\n const [isInteractionEnabled, setIsInteractionEnabled] = useState<boolean>(\n !clickToInteractEnabled,\n )\n const [showSchematicGroups, setShowSchematicGroups] = useState(() => {\n if (disableGroups) return false\n return getStoredBoolean(STORAGE_KEYS.IS_SHOWING_SCHEMATIC_GROUPS, false)\n })\n const [showSchematicPortsInternal, setShowSchematicPortsInternal] = useState(\n () =>\n showSchematicPorts ??\n getStoredBoolean(STORAGE_KEYS.IS_SHOWING_SCHEMATIC_PORTS, false),\n )\n\n useEffect(() => {\n if (showSchematicPorts !== undefined) {\n setShowSchematicPortsInternal(showSchematicPorts)\n }\n }, [showSchematicPorts])\n const [isHoveringClickableComponent, setIsHoveringClickableComponent] =\n useState(false)\n const hoveringComponentsRef = useRef<Set<string>>(new Set())\n const [selectedSchematicComponent, setSelectedSchematicComponent] =\n useState<SelectedSchematicComponent | null>(null)\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 const zoomScaleRef = useRef({ x: 1, y: 1 })\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 (!showSchematicPortsInternal) 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, showSchematicPortsInternal, 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 shouldPanSchematic = useCallback(\n (event: MouseEvent | TouchEvent | WheelEvent) => {\n if (\n event.target instanceof Element &&\n event.target.closest(\"[data-schematic-search]\")\n ) {\n return false\n }\n if (event.type !== \"mousedown\" || !(\"button\" in event)) return true\n return event.button !== 2 && !(event.button === 0 && event.ctrlKey)\n },\n [],\n )\n\n const {\n ref: containerRef,\n transform: svgToScreenProjection,\n setTransform: setSvgToScreenProjection,\n } = useMouseMatrixTransform({\n onSetTransform(transform) {\n const zoomChanged =\n transform.a !== zoomScaleRef.current.x ||\n transform.d !== zoomScaleRef.current.y\n zoomScaleRef.current = { x: transform.a, y: transform.d }\n if (zoomChanged) {\n setSelectedSchematicComponent(null)\n }\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 shouldDrag: shouldPanSchematic,\n })\n\n const {\n menuVisible,\n menuPos,\n menuRef,\n setMenuVisible,\n contextMenuEventHandlers,\n } = useContextMenu({ containerRef })\n\n const { containerWidth, containerHeight } = useResizeHandling(containerRef)\n const selectedComponentDetails = useMemo(\n () =>\n selectedSchematicComponent\n ? getSchematicComponentDetails(\n circuitJson,\n selectedSchematicComponent.schematicComponentId,\n )\n : null,\n [circuitJsonKey, circuitJson, selectedSchematicComponent],\n )\n\n const componentTooltipLayout = useMemo(() => {\n if (!selectedSchematicComponent || !containerWidth || !containerHeight) {\n return null\n }\n\n const margin = 12\n const gap = 14\n const width = Math.min(420, containerWidth - margin * 2)\n const maxHeight = Math.min(520, containerHeight - margin * 2)\n const { anchorX, anchorY } = selectedSchematicComponent\n\n const rightOfAnchor = anchorX + gap\n const leftOfAnchor = anchorX - width - gap\n const left =\n rightOfAnchor + width <= containerWidth - margin\n ? rightOfAnchor\n : leftOfAnchor >= margin\n ? leftOfAnchor\n : Math.max(\n margin,\n Math.min(anchorX - width / 2, containerWidth - width - margin),\n )\n const top = Math.max(\n margin,\n Math.min(anchorY - 24, containerHeight - maxHeight - margin),\n )\n\n return { left, top, width, maxHeight }\n }, [selectedSchematicComponent, containerWidth, containerHeight])\n\n const handleSchematicComponentClick = useCallback(\n (schematicComponentId: string, event: MouseEvent) => {\n if (\n event.target instanceof Element &&\n event.target.closest(\"[data-schematic-component-details-tooltip]\")\n ) {\n return\n }\n\n const containerRect = containerRef.current?.getBoundingClientRect()\n if (!containerRect) return\n\n setSelectedSchematicComponent({\n schematicComponentId,\n anchorX: event.clientX - containerRect.left,\n anchorY: event.clientY - containerRect.top,\n })\n onSchematicComponentClicked?.({\n schematicComponentId,\n event,\n })\n },\n [containerRef, onSchematicComponentClicked],\n )\n\n useEffect(() => {\n setSelectedSchematicComponent(null)\n }, [circuitJsonKey, activeSheetId])\n\n useEffect(() => {\n if (!selectedSchematicComponent) return\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setSelectedSchematicComponent(null)\n }\n }\n const handleDocumentMouseDown = (event: MouseEvent) => {\n if (\n event.target instanceof Element &&\n event.target.closest(\"[data-schematic-component-details-tooltip]\")\n ) {\n return\n }\n setSelectedSchematicComponent(null)\n }\n window.addEventListener(\"keydown\", handleKeyDown)\n document.addEventListener(\"mousedown\", handleDocumentMouseDown)\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown)\n document.removeEventListener(\"mousedown\", handleDocumentMouseDown)\n }\n }, [selectedSchematicComponent])\n\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: showSchematicPortsInternal,\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 showSchematicPortsInternal,\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 {\n searchQuery,\n setSearchQuery,\n searchResults,\n handleSearchResultSelect,\n handleCancelSearch,\n } = useSchematicSearch({\n circuitJson,\n circuitJsonKey,\n svgDivRef,\n containerRef,\n activeSheetId,\n hasMultipleSheets,\n handleSelectSheet,\n svgString,\n svgToScreenProjection,\n setSvgToScreenProjection,\n setIsInteractionEnabled,\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 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=\"schematic-component-clickable\"\n // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>\n dangerouslySetInnerHTML={{ __html: svgString }}\n />\n ),\n [svgString, isInteractionEnabled, clickToInteractEnabled],\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 {searchEnabled && (\n <style>\n {`.schematic-search-match text,\n text.schematic-search-match {\n fill: #ff00d4 !important;\n }\n .schematic-search-match [stroke]:not(text):not([stroke=\"none\"]),\n [stroke]:not(text):not([stroke=\"none\"]).schematic-search-match {\n stroke: #ff00d4 !important;\n }\n .schematic-viewer-toolbar {\n flex-direction: row;\n }\n @media (max-width: 640px) {\n .schematic-viewer-toolbar {\n flex-direction: column;\n }\n }`}\n </style>\n )}\n <style>\n {\n \".schematic-component-clickable [data-schematic-component-id]:hover { cursor: pointer !important; }\"\n }\n </style>\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:\n clickToInteractEnabled && !isInteractionEnabled\n ? \"pointer\"\n : isHoveringClickableComponent\n ? \"pointer\"\n : isHoveringClickablePort && onSchematicPortClicked\n ? \"pointer\"\n : \"grab\",\n minHeight: \"300px\",\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n WebkitTouchCallout: \"none\",\n ...containerStyle,\n }}\n onMouseDownCapture={(e) => {\n contextMenuEventHandlers.onMouseDown(e)\n if (clickToInteractEnabled && !isInteractionEnabled) {\n e.preventDefault()\n e.stopPropagation()\n return\n }\n }}\n onContextMenu={contextMenuEventHandlers.onContextMenu}\n onTouchStart={(event) => {\n handleTouchStart(event)\n contextMenuEventHandlers.onTouchStart(event)\n }}\n onTouchMove={contextMenuEventHandlers.onTouchMove}\n onTouchEnd={(event) => {\n handleTouchEnd(event)\n contextMenuEventHandlers.onTouchEnd()\n }}\n onTouchCancel={contextMenuEventHandlers.onTouchCancel}\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 {menuVisible && (\n <ViewMenu\n circuitJson={circuitJson}\n circuitJsonKey={circuitJsonKey}\n menuRef={menuRef}\n menuPos={menuPos}\n onOpenChange={setMenuVisible}\n showPorts={showSchematicPortsInternal}\n onTogglePorts={(value) => {\n setShowSchematicPortsInternal(value)\n setStoredBoolean(STORAGE_KEYS.IS_SHOWING_SCHEMATIC_PORTS, value)\n }}\n showGroups={showSchematicGroups}\n onToggleGroups={(value) => {\n if (!disableGroups) {\n setShowSchematicGroups(value)\n setStoredBoolean(\n STORAGE_KEYS.IS_SHOWING_SCHEMATIC_GROUPS,\n value,\n )\n }\n }}\n showGrid={showGrid}\n onToggleGrid={setShowGridInternal}\n />\n )}\n <div\n className=\"schematic-viewer-toolbar\"\n style={{\n position: \"absolute\",\n top: \"16px\",\n left: \"16px\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"8px\",\n zIndex: zIndexMap.schematicSearch,\n }}\n >\n <SchematicSheetSelector\n sheets={schematicSheets}\n selectedSheetId={activeSheetId}\n onSelectSheet={handleSelectSheet}\n />\n {searchEnabled && (\n <SchematicSearch\n query={searchQuery}\n onQueryChange={setSearchQuery}\n onCancel={handleCancelSearch}\n results={searchResults}\n onSelect={handleSearchResultSelect}\n viewerContainerRef={containerRef}\n />\n )}\n </div>\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={handleSchematicComponentClick}\n />\n ))}\n {svgDiv}\n {selectedComponentDetails && componentTooltipLayout && (\n <SchematicComponentDetailsTooltip\n sourceComponent={selectedComponentDetails.sourceComponent}\n footprinterString={selectedComponentDetails.footprinterString}\n footprintPreviewCircuitJson={\n selectedComponentDetails.footprintPreviewCircuitJson\n }\n footprintPreviewViewBox={\n selectedComponentDetails.footprintPreviewViewBox\n }\n {...componentTooltipLayout}\n />\n )}\n {showSchematicPortsInternal &&\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 { useCallback } from \"react\"\n\nexport const STORAGE_KEYS = {\n IS_SHOWING_SCHEMATIC_GROUPS: \"schematic_viewer_show_groups\",\n IS_SHOWING_SCHEMATIC_PORTS: \"schematic_viewer_show_ports\",\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 { 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 type { CircuitJson } from \"circuit-json\"\nimport type { RefObject } from \"react\"\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport { fromString, type Matrix } from \"transformation-matrix\"\nimport {\n getSchematicSearchResults,\n type SchematicSearchResult,\n} from \"../utils/get-schematic-search-results\"\nimport { getSearchResultTransform } from \"../utils/get-search-result-transform\"\n\nconst MIN_SEARCH_RESULT_ZOOM = 1.8\nconst SEARCH_FOCUS_ANIMATION_MS = 350\n\nexport const useSchematicSearch = ({\n circuitJson,\n circuitJsonKey,\n svgDivRef,\n containerRef,\n activeSheetId,\n hasMultipleSheets,\n handleSelectSheet,\n svgString,\n svgToScreenProjection,\n setSvgToScreenProjection,\n setIsInteractionEnabled,\n}: {\n circuitJson: CircuitJson\n circuitJsonKey: string\n svgDivRef: RefObject<HTMLDivElement | null>\n containerRef: RefObject<HTMLElement | null>\n activeSheetId?: string\n hasMultipleSheets: boolean\n handleSelectSheet: (schematicSheetId: string) => void\n svgString: string\n svgToScreenProjection: Matrix\n setSvgToScreenProjection: (transform: Matrix) => void\n setIsInteractionEnabled: (enabled: boolean) => void\n}) => {\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [pendingSearchResult, setPendingSearchResult] =\n useState<SchematicSearchResult | null>(null)\n const searchAnimationTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n )\n\n const searchResults = useMemo(\n () => getSchematicSearchResults(circuitJson, searchQuery),\n [circuitJson, circuitJsonKey, searchQuery],\n )\n\n const focusSearchResult = useCallback(\n (result: SchematicSearchResult) => {\n const svgRoot = svgDivRef.current\n const container = containerRef.current\n if (!svgRoot || !container) return false\n\n let attribute = \"data-schematic-net-label-id\"\n if (result.target.type === \"schematic_component\") {\n attribute = \"data-schematic-component-id\"\n }\n const target = Array.from(\n svgRoot.querySelectorAll<SVGGraphicsElement>(`[${attribute}]`),\n ).find((element) => element.getAttribute(attribute) === result.target.id)\n if (!target) return false\n\n const targetRect = target.getBoundingClientRect()\n const containerRect = container.getBoundingClientRect()\n if (!targetRect.width && !targetRect.height) return false\n\n if (searchAnimationTimerRef.current) {\n clearTimeout(searchAnimationTimerRef.current)\n }\n\n let visibleProjection = svgToScreenProjection\n const visibleTransform = getComputedStyle(svgRoot).transform\n if (visibleTransform && visibleTransform !== \"none\") {\n try {\n visibleProjection = fromString(visibleTransform)\n svgRoot.style.transition = \"none\"\n svgRoot.style.transform = visibleTransform\n void svgRoot.offsetWidth\n } catch {\n // The transform tracked by the viewer is the safe fallback.\n }\n }\n\n svgRoot.style.transition = `transform ${SEARCH_FOCUS_ANIMATION_MS}ms ease-in-out`\n void svgRoot.offsetWidth\n setSvgToScreenProjection(\n getSearchResultTransform({\n containerRect,\n targetRect,\n visibleProjection,\n minimumScale: MIN_SEARCH_RESULT_ZOOM,\n }),\n )\n searchAnimationTimerRef.current = setTimeout(() => {\n svgRoot.style.transition = \"\"\n }, SEARCH_FOCUS_ANIMATION_MS)\n\n svgRoot\n .querySelectorAll(\".schematic-search-match\")\n .forEach((element) =>\n element.classList.remove(\"schematic-search-match\"),\n )\n svgRoot.querySelectorAll(`[${attribute}]`).forEach((element) => {\n if (element.getAttribute(attribute) === result.target.id) {\n element.classList.add(\"schematic-search-match\")\n }\n })\n return true\n },\n [containerRef, setSvgToScreenProjection, svgDivRef, svgToScreenProjection],\n )\n\n const handleSearchResultSelect = useCallback(\n (result: SchematicSearchResult) => {\n setIsInteractionEnabled(true)\n if (\n result.schematicSheetId &&\n result.schematicSheetId !== activeSheetId &&\n hasMultipleSheets\n ) {\n handleSelectSheet(result.schematicSheetId)\n setPendingSearchResult(result)\n return\n }\n focusSearchResult(result)\n },\n [\n activeSheetId,\n focusSearchResult,\n handleSelectSheet,\n hasMultipleSheets,\n setIsInteractionEnabled,\n ],\n )\n\n const handleCancelSearch = useCallback(() => {\n setSearchQuery(\"\")\n setPendingSearchResult(null)\n if (searchAnimationTimerRef.current) {\n clearTimeout(searchAnimationTimerRef.current)\n searchAnimationTimerRef.current = null\n }\n if (svgDivRef.current) {\n svgDivRef.current.style.transition = \"\"\n svgDivRef.current\n .querySelectorAll(\".schematic-search-match\")\n .forEach((element) =>\n element.classList.remove(\"schematic-search-match\"),\n )\n }\n }, [svgDivRef])\n\n useEffect(() => {\n if (!pendingSearchResult || !svgString) return\n const frame = requestAnimationFrame(() => {\n if (focusSearchResult(pendingSearchResult)) {\n setPendingSearchResult(null)\n }\n })\n return () => cancelAnimationFrame(frame)\n }, [focusSearchResult, pendingSearchResult, svgString])\n\n useEffect(() => {\n if (searchQuery) return\n svgDivRef.current\n ?.querySelectorAll(\".schematic-search-match\")\n .forEach((element) => element.classList.remove(\"schematic-search-match\"))\n }, [searchQuery, svgDivRef])\n\n useEffect(\n () => () => {\n if (searchAnimationTimerRef.current) {\n clearTimeout(searchAnimationTimerRef.current)\n }\n },\n [],\n )\n\n return {\n searchQuery,\n setSearchQuery,\n searchResults,\n handleSearchResultSelect,\n handleCancelSearch,\n }\n}\n","import type {\n CircuitJson,\n SchematicComponent,\n SchematicNetLabel,\n SchematicPort,\n SourceComponentBase,\n SourcePort,\n SourceTrace,\n SchematicSheet,\n} from \"circuit-json\"\n\ntype SearchableSourceComponent = SourceComponentBase & {\n display_resistance?: string\n display_capacitance?: string\n display_inductance?: string\n display_frequency?: string\n symbol_display_value?: string\n}\n\nexport type SchematicSearchResult = {\n label: string\n detail?: string\n kind: \"component\" | \"net\"\n schematicSheetId?: string\n schematicSheetName?: string\n target:\n | { type: \"schematic_component\"; id: string }\n | { type: \"schematic_net_label\"; id: string }\n}\n\nconst normalize = (value: unknown) => String(value ?? \"\").toLocaleLowerCase()\n\nconst getTextMatchScore = (text: unknown, query: string) => {\n const normalizedText = normalize(text)\n if (normalizedText === query) return 0\n if (normalizedText.startsWith(query)) return 1\n if (normalizedText.includes(query)) return 2\n return Number.POSITIVE_INFINITY\n}\n\nconst humanizeComponentType = (ftype: unknown) => {\n if (!ftype) return undefined\n return String(ftype)\n .replace(/^simple_/, \"\")\n .replaceAll(\"_\", \" \")\n .replace(/\\b\\w/g, (character) => character.toLocaleUpperCase())\n}\n\nconst getComponentDetail = (\n sourceComponent: SearchableSourceComponent | undefined,\n schematicComponent: SchematicComponent,\n primaryLabel: string,\n) => {\n const componentType = humanizeComponentType(sourceComponent?.ftype)\n let componentDescription = componentType\n if (\n sourceComponent?.ftype === \"simple_chip\" &&\n sourceComponent.manufacturer_part_number\n ) {\n componentDescription = sourceComponent.manufacturer_part_number\n }\n const detailParts: string[] = []\n if (\n sourceComponent?.display_name === primaryLabel &&\n sourceComponent.name !== primaryLabel\n ) {\n detailParts.push(sourceComponent.name)\n }\n\n let componentValue = sourceComponent?.display_value\n if (!componentValue && sourceComponent) {\n for (const displayField of [\n \"display_resistance\",\n \"display_capacitance\",\n \"display_inductance\",\n \"display_frequency\",\n \"symbol_display_value\",\n ] as const) {\n if (displayField in sourceComponent) {\n const displayedMeasurement = sourceComponent[displayField]\n if (typeof displayedMeasurement === \"string\") {\n componentValue = displayedMeasurement\n break\n }\n }\n }\n }\n componentValue ??= schematicComponent.symbol_display_value\n\n if (componentDescription) {\n detailParts.push(componentDescription)\n }\n if (componentValue) {\n detailParts.push(componentValue)\n }\n if (\n !componentDescription &&\n !componentValue &&\n sourceComponent?.manufacturer_part_number\n ) {\n detailParts.push(sourceComponent.manufacturer_part_number)\n }\n\n if (detailParts.length === 0) return undefined\n return detailParts.join(\" · \")\n}\n\nconst isSourceComponent = (\n element: CircuitJson[number],\n): element is CircuitJson[number] & SearchableSourceComponent =>\n element.type === \"source_component\" && \"source_component_id\" in element\n\nconst isSourcePort = (element: CircuitJson[number]): element is SourcePort =>\n element.type === \"source_port\"\n\nconst isSourceTrace = (element: CircuitJson[number]): element is SourceTrace =>\n element.type === \"source_trace\"\n\nconst isSchematicComponent = (\n element: CircuitJson[number],\n): element is SchematicComponent => element.type === \"schematic_component\"\n\nconst isSchematicPort = (\n element: CircuitJson[number],\n): element is SchematicPort => element.type === \"schematic_port\"\n\nconst isSchematicNetLabel = (\n element: CircuitJson[number],\n): element is SchematicNetLabel => element.type === \"schematic_net_label\"\n\nconst isSchematicSheet = (\n element: CircuitJson[number],\n): element is SchematicSheet => element.type === \"schematic_sheet\"\n\nconst getSchematicSheetName = ({\n schematicSheets,\n schematicSheetId,\n}: {\n schematicSheets: SchematicSheet[]\n schematicSheetId?: string\n}) => {\n if (schematicSheets.length <= 1 || !schematicSheetId) return undefined\n return schematicSheets.find(\n (sheet) => sheet.schematic_sheet_id === schematicSheetId,\n )?.name\n}\n\nexport const getSchematicSearchResults = (\n circuitJson: CircuitJson,\n query: string,\n): SchematicSearchResult[] => {\n const normalizedQuery = normalize(query).trim()\n if (!normalizedQuery) return []\n\n const sourceComponents = new Map(\n circuitJson\n .filter(isSourceComponent)\n .map((element) => [element.source_component_id, element]),\n )\n const sourcePorts = new Map(\n circuitJson\n .filter(isSourcePort)\n .map((element) => [element.source_port_id, element]),\n )\n const schematicPorts = circuitJson.filter(isSchematicPort)\n const sourceTraces = circuitJson.filter(isSourceTrace)\n const schematicSheets = circuitJson.filter(isSchematicSheet)\n const results: SchematicSearchResult[] = []\n const resultScores = new Map<SchematicSearchResult, number>()\n\n for (const component of circuitJson.filter(isSchematicComponent)) {\n const sourceComponent = component.source_component_id\n ? sourceComponents.get(component.source_component_id)\n : undefined\n const primaryLabel =\n sourceComponent?.display_name ?? sourceComponent?.name ?? \"Component\"\n const componentScore = Math.min(\n getTextMatchScore(sourceComponent?.name, normalizedQuery),\n getTextMatchScore(sourceComponent?.display_name, normalizedQuery),\n getTextMatchScore(\n sourceComponent?.manufacturer_part_number,\n normalizedQuery,\n ),\n )\n\n if (Number.isFinite(componentScore)) {\n const result: SchematicSearchResult = {\n label: primaryLabel,\n detail: getComponentDetail(sourceComponent, component, primaryLabel),\n kind: \"component\",\n schematicSheetId: component.schematic_sheet_id,\n schematicSheetName: getSchematicSheetName({\n schematicSheets,\n schematicSheetId: component.schematic_sheet_id,\n }),\n target: {\n type: \"schematic_component\",\n id: component.schematic_component_id,\n },\n }\n results.push(result)\n resultScores.set(result, componentScore)\n }\n }\n\n for (const netLabel of circuitJson.filter(isSchematicNetLabel)) {\n if (!normalize(netLabel.text).includes(normalizedQuery)) continue\n const connectedPortIds = new Set<string>()\n for (const trace of sourceTraces.filter((sourceTrace) =>\n sourceTrace.connected_source_net_ids.includes(netLabel.source_net_id),\n )) {\n for (const portId of trace.connected_source_port_ids) {\n connectedPortIds.add(portId)\n }\n }\n const anchorPosition = netLabel.anchor_position ?? netLabel.center\n const nearestConnectedPort = schematicPorts\n .filter(\n (port) =>\n connectedPortIds.has(port.source_port_id) &&\n (!netLabel.schematic_sheet_id ||\n !port.schematic_sheet_id ||\n port.schematic_sheet_id === netLabel.schematic_sheet_id),\n )\n .map((port) => ({\n port,\n distance: Math.hypot(\n port.center.x - anchorPosition.x,\n port.center.y - anchorPosition.y,\n ),\n }))\n .filter(({ distance }) => distance <= 1)\n .sort((a, b) => a.distance - b.distance)[0]?.port\n const sourcePort = nearestConnectedPort\n ? sourcePorts.get(nearestConnectedPort.source_port_id)\n : undefined\n const connectedComponent = sourcePort?.source_component_id\n ? sourceComponents.get(sourcePort.source_component_id)\n : undefined\n const connectedPinName =\n sourcePort?.name ??\n (sourcePort?.pin_number !== undefined\n ? `pin${sourcePort.pin_number}`\n : nearestConnectedPort?.display_pin_label)\n const connectionLabel =\n connectedComponent?.name && connectedPinName\n ? `Connected to ${connectedComponent.name}.${connectedPinName}`\n : undefined\n const result: SchematicSearchResult = {\n label: netLabel.text,\n detail: connectionLabel,\n kind: \"net\",\n schematicSheetId: netLabel.schematic_sheet_id,\n schematicSheetName: getSchematicSheetName({\n schematicSheets,\n schematicSheetId: netLabel.schematic_sheet_id,\n }),\n target: {\n type: \"schematic_net_label\",\n id: netLabel.schematic_net_label_id,\n },\n }\n results.push(result)\n resultScores.set(result, getTextMatchScore(netLabel.text, normalizedQuery))\n }\n\n return results.sort((a, b) => {\n return (\n (resultScores.get(a) ?? Number.POSITIVE_INFINITY) -\n (resultScores.get(b) ?? Number.POSITIVE_INFINITY) ||\n a.label.localeCompare(b.label)\n )\n })\n}\n","import type { Matrix } from \"transformation-matrix\"\n\nexport const getSearchResultTransform = ({\n containerRect,\n targetRect,\n visibleProjection,\n minimumScale,\n}: {\n containerRect: Pick<DOMRect, \"left\" | \"top\" | \"width\" | \"height\">\n targetRect: Pick<DOMRect, \"left\" | \"top\" | \"width\" | \"height\">\n visibleProjection: Matrix\n minimumScale: number\n}): Matrix => {\n const currentScale = visibleProjection.a || 1\n const targetCenterInContainer = {\n x: targetRect.left + targetRect.width / 2 - containerRect.left,\n y: targetRect.top + targetRect.height / 2 - containerRect.top,\n }\n const targetCenterBeforeViewerTransform = {\n x: (targetCenterInContainer.x - visibleProjection.e) / currentScale,\n y: (targetCenterInContainer.y - visibleProjection.f) / currentScale,\n }\n const targetScale = Math.max(currentScale, minimumScale)\n\n return {\n a: targetScale,\n b: 0,\n c: 0,\n d: targetScale,\n e:\n containerRect.width / 2 -\n targetCenterBeforeViewerTransform.x * targetScale,\n f:\n containerRect.height / 2 -\n targetCenterBeforeViewerTransform.y * targetScale,\n }\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 { useCallback, useEffect, useRef, useState } from \"react\"\n\ninterface ContextMenuProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst LONG_PRESS_DURATION_MS = 600\nconst MOVEMENT_THRESHOLD_PX = 10\n\nexport const useContextMenu = ({ containerRef }: ContextMenuProps) => {\n const [menuVisible, setMenuVisible] = useState(false)\n const [menuPos, setMenuPos] = useState({ x: 0, y: 0 })\n const menuRef = useRef<HTMLDivElement>(null)\n const interactionOriginRef = useRef<{ x: number; y: number } | null>(null)\n const longPressTimeoutRef = useRef<number | null>(null)\n const ignoreContextMenuUntilRef = useRef(0)\n\n const clearLongPressTimeout = useCallback(() => {\n if (longPressTimeoutRef.current === null) return\n window.clearTimeout(longPressTimeoutRef.current)\n longPressTimeoutRef.current = null\n }, [])\n\n const handleContextMenu = useCallback((event: React.MouseEvent) => {\n event.preventDefault()\n\n if (Date.now() < ignoreContextMenuUntilRef.current) return\n\n const origin = interactionOriginRef.current\n if (!origin) return\n\n const movedTooFar =\n Math.abs(event.clientX - origin.x) > MOVEMENT_THRESHOLD_PX ||\n Math.abs(event.clientY - origin.y) > MOVEMENT_THRESHOLD_PX\n\n interactionOriginRef.current = null\n if (movedTooFar) return\n\n setMenuPos({ x: event.clientX, y: event.clientY })\n setMenuVisible(true)\n }, [])\n\n const handleTouchStart = useCallback(\n (event: React.TouchEvent) => {\n clearLongPressTimeout()\n\n if (event.touches.length !== 1) {\n interactionOriginRef.current = null\n return\n }\n\n const touch = event.touches[0]\n if (!touch) return\n\n interactionOriginRef.current = {\n x: touch.clientX,\n y: touch.clientY,\n }\n\n longPressTimeoutRef.current = window.setTimeout(() => {\n const container = containerRef.current\n if (!container || !interactionOriginRef.current) return\n\n const rect = container.getBoundingClientRect()\n setMenuPos({\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n })\n setMenuVisible(true)\n ignoreContextMenuUntilRef.current = Date.now() + 1_000\n interactionOriginRef.current = null\n }, LONG_PRESS_DURATION_MS)\n },\n [clearLongPressTimeout, containerRef],\n )\n\n const handleTouchMove = useCallback(\n (event: React.TouchEvent) => {\n const origin = interactionOriginRef.current\n if (!origin || event.touches.length !== 1) return\n\n const touch = event.touches[0]\n const movedTooFar =\n !touch ||\n Math.abs(touch.clientX - origin.x) > MOVEMENT_THRESHOLD_PX ||\n Math.abs(touch.clientY - origin.y) > MOVEMENT_THRESHOLD_PX\n\n if (movedTooFar) {\n interactionOriginRef.current = null\n clearLongPressTimeout()\n }\n },\n [clearLongPressTimeout],\n )\n\n const handleTouchEnd = useCallback(() => {\n clearLongPressTimeout()\n interactionOriginRef.current = null\n }, [clearLongPressTimeout])\n\n const handleClickAway = useCallback((event: MouseEvent | TouchEvent) => {\n const target = event.target as Node\n if (menuRef.current?.contains(target)) return\n\n const isInRadixPortal = (target as Element).closest?.(\n \"[data-radix-popper-content-wrapper], [data-radix-dropdown-menu-content]\",\n )\n if (isInRadixPortal) return\n\n setMenuVisible(false)\n }, [])\n\n useEffect(() => {\n if (!menuVisible) return\n\n document.addEventListener(\"mousedown\", handleClickAway)\n document.addEventListener(\"touchstart\", handleClickAway)\n return () => {\n document.removeEventListener(\"mousedown\", handleClickAway)\n document.removeEventListener(\"touchstart\", handleClickAway)\n }\n }, [handleClickAway, menuVisible])\n\n useEffect(() => clearLongPressTimeout, [clearLongPressTimeout])\n\n return {\n menuVisible,\n menuPos,\n menuRef,\n setMenuVisible,\n contextMenuEventHandlers: {\n onMouseDown: (event: React.MouseEvent) => {\n interactionOriginRef.current =\n event.button === 2 || (event.button === 0 && event.ctrlKey)\n ? { x: event.clientX, y: event.clientY }\n : null\n },\n onContextMenu: handleContextMenu,\n onTouchStart: handleTouchStart,\n onTouchMove: handleTouchMove,\n onTouchEnd: handleTouchEnd,\n onTouchCancel: handleTouchEnd,\n },\n }\n}\n","import {\n type PcbBounds,\n getPcbElementBounds,\n getPcbElementsWithinBounds,\n} from \"@tscircuit/circuit-json-util\"\nimport type {\n CadComponent,\n CircuitJson,\n PcbComponent,\n SchematicComponent,\n} from \"circuit-json\"\nimport { gzipSync, strToU8 } from \"fflate\"\n\nexport type { PcbBounds } from \"@tscircuit/circuit-json-util\"\n\nexport type SourceComponent = Extract<\n CircuitJson[number],\n { type: \"source_component\" }\n>\n\nexport interface SchematicComponentDetails {\n schematicComponent: SchematicComponent\n sourceComponent: SourceComponent\n pcbComponent?: PcbComponent\n footprinterString?: string\n footprintPreviewCircuitJson?: CircuitJson\n footprintPreviewViewBox?: PcbBounds\n}\n\nexport interface ComponentInfoEntry {\n key: string\n label: string\n value: string\n}\n\nexport interface SupplierPartNumberEntry {\n key: string\n label: \"jlcpcb\" | \"lcsc\"\n links: Array<{\n partNumber: string\n href: string\n }>\n}\n\nconst hiddenSourceComponentKeys = new Set([\n \"type\",\n \"source_component_id\",\n \"source_group_id\",\n \"subcircuit_id\",\n \"display_name\",\n \"ftype\",\n \"are_pins_interchangeable\",\n \"supplier_part_numbers\",\n])\n\nconst priorityKeys = [\n \"name\",\n \"resistance\",\n \"capacitance\",\n \"inductance\",\n \"frequency\",\n \"voltage\",\n \"current\",\n \"max_voltage_rating\",\n \"max_current_rating\",\n \"power_rating\",\n \"manufacturer_part_number\",\n]\n\nconst supplierPartNumberUrls = {\n jlcpcb: (partNumber: string) =>\n `https://jlcpcb.com/partdetail/${encodeURIComponent(partNumber)}`,\n lcsc: (partNumber: string) =>\n `https://www.lcsc.com/product-detail/${encodeURIComponent(partNumber)}.html`,\n}\n\nconst normalizeLcscPartNumber = (partNumber: string) => {\n const trimmedPartNumber = partNumber.trim()\n const numericPartNumber = /^c?(\\d+)$/i.exec(trimmedPartNumber)\n return numericPartNumber ? `C${numericPartNumber[1]}` : trimmedPartNumber\n}\n\nconst getKeyPriority = (key: string) => {\n const priority = priorityKeys.indexOf(key)\n return priority === -1 ? priorityKeys.length : priority\n}\n\nconst formatComponentValue = (\n sourceComponent: SourceComponent,\n key: string,\n value: unknown,\n) => {\n if (key === \"name\") return String(value)\n\n const displayValue = (sourceComponent as Record<string, unknown>)[\n `display_${key}`\n ]\n if (typeof displayValue === \"string\" && displayValue.trim()) {\n const propValue =\n key === \"resistance\" ? displayValue.replace(/Ω$/, \"\") : displayValue\n return JSON.stringify(propValue)\n }\n return JSON.stringify(value) ?? String(value)\n}\n\nexport const getSourceComponentInfoEntries = (\n sourceComponent: SourceComponent,\n): ComponentInfoEntry[] =>\n Object.entries(sourceComponent as Record<string, unknown>)\n .filter(([key, value]) => {\n if (hiddenSourceComponentKeys.has(key)) return false\n if (\n key.startsWith(\"display_\") &&\n key.slice(\"display_\".length) in sourceComponent\n ) {\n return false\n }\n return value !== undefined && value !== null && value !== \"\"\n })\n .sort(([keyA], [keyB]) => {\n const priorityDifference = getKeyPriority(keyA) - getKeyPriority(keyB)\n return priorityDifference || keyA.localeCompare(keyB)\n })\n .map(([key, value]) => ({\n key,\n label: key,\n value: formatComponentValue(sourceComponent, key, value),\n }))\n\nexport const getSupplierPartNumberEntries = (\n sourceComponent: SourceComponent,\n): SupplierPartNumberEntry[] => {\n const supplierPartNumbers = sourceComponent.supplier_part_numbers\n if (!supplierPartNumbers) return []\n\n return ([\"jlcpcb\", \"lcsc\"] as const).flatMap((supplier) => {\n const partNumbers = supplierPartNumbers[supplier]\n if (!Array.isArray(partNumbers)) return []\n\n const normalizedPartNumbers = [\n ...new Set(\n partNumbers\n .filter((partNumber): partNumber is string =>\n Boolean(typeof partNumber === \"string\" && partNumber.trim()),\n )\n .map(normalizeLcscPartNumber),\n ),\n ]\n if (!normalizedPartNumbers.length) return []\n\n return [\n {\n key: `supplier_part_numbers.${supplier}`,\n label: supplier,\n links: normalizedPartNumbers.map((partNumber) => ({\n partNumber,\n href: supplierPartNumberUrls[supplier](partNumber),\n })),\n },\n ]\n })\n}\n\nexport const getSchematicComponentDetails = (\n circuitJson: CircuitJson,\n schematicComponentId: string,\n): SchematicComponentDetails | null => {\n const schematicComponent = circuitJson.find(\n (element): element is SchematicComponent =>\n element.type === \"schematic_component\" &&\n element.schematic_component_id === schematicComponentId,\n )\n if (!schematicComponent) return null\n\n const sourceComponent = circuitJson.find(\n (element): element is SourceComponent =>\n element.type === \"source_component\" &&\n element.source_component_id === schematicComponent.source_component_id,\n )\n if (!sourceComponent) return null\n\n const pcbComponent = circuitJson.find(\n (element): element is PcbComponent =>\n element.type === \"pcb_component\" &&\n element.source_component_id === sourceComponent.source_component_id,\n )\n const cadComponent = circuitJson.find(\n (element): element is CadComponent =>\n element.type === \"cad_component\" &&\n element.source_component_id === sourceComponent.source_component_id &&\n (!pcbComponent ||\n element.pcb_component_id === pcbComponent.pcb_component_id),\n )\n\n // Newer Circuit JSON producers may put this directly on pcb_component;\n // current producers retain it on the associated cad_component.\n const footprinterString =\n (\n pcbComponent as\n | (PcbComponent & { footprinter_string?: string })\n | undefined\n )?.footprinter_string ?? cadComponent?.footprinter_string\n\n const footprintPreview = pcbComponent\n ? getPcbComponentPreview(circuitJson, pcbComponent.pcb_component_id)\n : null\n\n return {\n schematicComponent,\n sourceComponent,\n pcbComponent,\n footprinterString,\n footprintPreviewCircuitJson: footprintPreview?.circuitJson,\n footprintPreviewViewBox: footprintPreview?.viewBox,\n }\n}\n\nconst PCB_PREVIEW_PADDING_MM = 2\n\ninterface PcbComponentPreview {\n circuitJson: CircuitJson\n viewBox: PcbBounds\n}\n\n/**\n * Select the real PCB context around a component. Elements only need to\n * intersect the view box, so long traces and the board remain available for\n * rendering while svg.tscircuit.com clips the parts outside the preview.\n */\nexport const getPcbComponentPreview = (\n circuitJson: CircuitJson,\n pcbComponentId: string,\n): PcbComponentPreview | null => {\n const pcbComponent = circuitJson.find(\n (element): element is PcbComponent =>\n element.type === \"pcb_component\" &&\n element.pcb_component_id === pcbComponentId,\n )\n if (!pcbComponent) return null\n\n const componentBounds = getPcbElementBounds(pcbComponent)\n if (!componentBounds) return null\n\n const viewBox = {\n minX: componentBounds.minX - PCB_PREVIEW_PADDING_MM,\n minY: componentBounds.minY - PCB_PREVIEW_PADDING_MM,\n maxX: componentBounds.maxX + PCB_PREVIEW_PADDING_MM,\n maxY: componentBounds.maxY + PCB_PREVIEW_PADDING_MM,\n }\n\n return {\n circuitJson: getPcbElementsWithinBounds(circuitJson, viewBox),\n viewBox,\n }\n}\n\nconst bytesToBase64 = (bytes: Uint8Array) => {\n let binary = \"\"\n const chunkSize = 8192\n for (let index = 0; index < bytes.length; index += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize))\n }\n return btoa(binary)\n}\n\nexport const getFootprintPreviewUrl = (\n footprintPreviewCircuitJson: CircuitJson,\n viewBox: PcbBounds,\n) => {\n const encodedCircuitJson = bytesToBase64(\n gzipSync(strToU8(JSON.stringify(footprintPreviewCircuitJson))),\n )\n const url = new URL(\"https://svg.tscircuit.com/\")\n url.searchParams.set(\"svg_type\", \"pcb\")\n url.searchParams.set(\"circuit_json\", encodedCircuitJson)\n url.searchParams.set(\n \"viewbox\",\n [viewBox.minX, viewBox.minY, viewBox.maxX, viewBox.maxY].join(\",\"),\n )\n url.searchParams.set(\"background_color\", \"#f8fafc\")\n return url.toString()\n}\n","export const zIndexMap = {\n contextMenu: 110,\n viewMenu: 55,\n viewMenuIcon: 48,\n clickToInteractOverlay: 100,\n schematicComponentDetailsTooltip: 105,\n schematicComponentHoverOutline: 47,\n schematicPortHoverOutline: 48,\n schematicSearch: 101,\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 return <MouseTrackerProvider>{children}</MouseTrackerProvider>\n}\n\nconst MouseTrackerProvider = ({ children }: { children: ReactNode }) => {\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 type { CircuitJson } from \"circuit-json\"\nimport { useMemo } from \"react\"\nimport {\n type PcbBounds,\n type SourceComponent,\n getFootprintPreviewUrl,\n getSourceComponentInfoEntries,\n getSupplierPartNumberEntries,\n} from \"../utils/component-details\"\nimport { zIndexMap } from \"../utils/z-index-map\"\n\ninterface Props {\n sourceComponent: SourceComponent\n footprinterString?: string\n footprintPreviewCircuitJson?: CircuitJson\n footprintPreviewViewBox?: PcbBounds\n left: number\n top: number\n width: number\n maxHeight: number\n}\n\nconst detailLabelStyle: React.CSSProperties = {\n color: \"#64748b\",\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace',\n fontSize: \"12px\",\n lineHeight: 1.45,\n}\n\nexport const SchematicComponentDetailsTooltip = ({\n sourceComponent,\n footprinterString,\n footprintPreviewCircuitJson,\n footprintPreviewViewBox,\n left,\n top,\n width,\n maxHeight,\n}: Props) => {\n const infoEntries = useMemo(\n () => getSourceComponentInfoEntries(sourceComponent),\n [sourceComponent],\n )\n const supplierPartNumberEntries = useMemo(\n () => getSupplierPartNumberEntries(sourceComponent),\n [sourceComponent],\n )\n const footprintPreviewUrl = useMemo(\n () =>\n footprintPreviewCircuitJson?.length && footprintPreviewViewBox\n ? getFootprintPreviewUrl(\n footprintPreviewCircuitJson,\n footprintPreviewViewBox,\n )\n : undefined,\n [footprintPreviewCircuitJson, footprintPreviewViewBox],\n )\n return (\n <dialog\n open\n aria-label={`${sourceComponent.name} component details`}\n data-schematic-component-details-tooltip\n style={{\n position: \"absolute\",\n left,\n right: \"auto\",\n top,\n bottom: \"auto\",\n width,\n maxHeight,\n margin: 0,\n padding: 0,\n overflowY: \"auto\",\n boxSizing: \"border-box\",\n border: \"1px solid #cbd5e1\",\n borderRadius: \"4px\",\n backgroundColor: \"rgba(255, 255, 255, 0.98)\",\n boxShadow:\n \"0 20px 25px -5px rgba(15, 23, 42, 0.18), 0 8px 10px -6px rgba(15, 23, 42, 0.12)\",\n color: \"#0f172a\",\n fontFamily:\n 'Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n pointerEvents: \"auto\",\n userSelect: \"text\",\n WebkitUserSelect: \"text\",\n zIndex: zIndexMap.schematicComponentDetailsTooltip,\n }}\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => event.stopPropagation()}\n >\n <dl\n style={{\n display: \"grid\",\n gridTemplateColumns: \"minmax(110px, 0.8fr) minmax(0, 1.2fr)\",\n gap: \"6px 12px\",\n margin: 0,\n padding: \"8px\",\n }}\n >\n {infoEntries.map((entry) => (\n <div key={entry.key} style={{ display: \"contents\" }}>\n <dt style={detailLabelStyle}>{entry.label}</dt>\n <dd\n style={{\n minWidth: 0,\n margin: 0,\n color: \"#1e293b\",\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace',\n fontSize: \"12px\",\n lineHeight: 1.45,\n overflowWrap: \"anywhere\",\n }}\n >\n {entry.value}\n </dd>\n </div>\n ))}\n {supplierPartNumberEntries.map((entry) => (\n <div key={entry.key} style={{ display: \"contents\" }}>\n <dt style={detailLabelStyle}>{entry.label}</dt>\n <dd\n style={{\n minWidth: 0,\n margin: 0,\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace',\n fontSize: \"12px\",\n lineHeight: 1.45,\n overflowWrap: \"anywhere\",\n }}\n >\n {entry.links.map((link, index) => (\n <span key={link.href}>\n {index > 0 && \", \"}\n <a\n href={link.href}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n style={{ color: \"#2563eb\", textDecoration: \"underline\" }}\n >\n {link.partNumber}\n </a>\n </span>\n ))}\n </dd>\n </div>\n ))}\n {footprinterString && (\n <div style={{ display: \"contents\" }}>\n <dt style={detailLabelStyle}>footprint</dt>\n <dd\n style={{\n minWidth: 0,\n margin: 0,\n color: \"#1e293b\",\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace',\n fontSize: \"12px\",\n lineHeight: 1.45,\n overflowWrap: \"anywhere\",\n }}\n >\n {JSON.stringify(footprinterString)}\n </dd>\n </div>\n )}\n </dl>\n\n {footprintPreviewUrl && (\n <div style={{ padding: \"0 4px 4px\" }}>\n <div\n style={{\n height: \"210px\",\n overflow: \"hidden\",\n border: \"1px solid #e2e8f0\",\n borderRadius: \"2px\",\n background: \"#f8fafc\",\n }}\n >\n <img\n src={footprintPreviewUrl}\n alt={`${sourceComponent.name}${footprinterString ? ` ${footprinterString}` : \"\"} PCB footprint`}\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n style={{\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n }}\n />\n </div>\n </div>\n )}\n </dialog>\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 { useEffect, useRef, useState, type RefObject } from \"react\"\nimport type { SchematicSearchResult } from \"../utils/get-schematic-search-results\"\nimport { zIndexMap } from \"../utils/z-index-map\"\nimport {\n CloseIcon,\n ComponentIcon,\n EnterIcon,\n NetIcon,\n SearchIcon,\n} from \"./SchematicSearchIcons\"\n\nconst HighlightedSearchText = ({\n text,\n query,\n}: {\n text: string\n query: string\n}) => {\n const normalizedQuery = query.trim().toLocaleLowerCase()\n if (!normalizedQuery) return text\n\n const normalizedText = text.toLocaleLowerCase()\n const parts: React.ReactNode[] = []\n let cursor = 0\n let matchIndex = normalizedText.indexOf(normalizedQuery)\n\n while (matchIndex !== -1) {\n if (matchIndex > cursor) {\n parts.push(text.slice(cursor, matchIndex))\n }\n parts.push(\n <strong key={`${matchIndex}-${cursor}`} style={{ fontWeight: 700 }}>\n {text.slice(matchIndex, matchIndex + normalizedQuery.length)}\n </strong>,\n )\n cursor = matchIndex + normalizedQuery.length\n matchIndex = normalizedText.indexOf(normalizedQuery, cursor)\n }\n\n if (cursor < text.length) parts.push(text.slice(cursor))\n if (parts.length > 0) return parts\n return text\n}\n\nconst getShortcutLabel = () => {\n if (typeof navigator === \"undefined\") return \"Ctrl F\"\n if (/mac/i.test(navigator.platform)) return \"⌘ F\"\n return \"Ctrl F\"\n}\n\nexport const SchematicSearch = ({\n query,\n onQueryChange,\n onCancel,\n results,\n onSelect,\n viewerContainerRef,\n}: {\n query: string\n onQueryChange: (query: string) => void\n onCancel: () => void\n results: SchematicSearchResult[]\n onSelect: (result: SchematicSearchResult) => void\n viewerContainerRef: RefObject<HTMLElement | null>\n}) => {\n const [isOpen, setIsOpen] = useState(false)\n const [activeResultId, setActiveResultId] = useState<string | null>(null)\n const [hoveredResultId, setHoveredResultId] = useState<string | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const resultsListRef = useRef<HTMLDivElement>(null)\n const shortcutLabel = getShortcutLabel()\n\n useEffect(() => {\n setActiveResultId((currentId) => {\n if (results.some((result) => result.target.id === currentId)) {\n return currentId\n }\n return (\n results.find((result) => result.kind === \"component\")?.target.id ??\n results[0]?.target.id ??\n null\n )\n })\n }, [results])\n\n useEffect(() => {\n if (!activeResultId) return\n resultsListRef.current\n ?.querySelector(`[data-search-result-id=\"${activeResultId}\"]`)\n ?.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" })\n }, [activeResultId])\n\n useEffect(() => {\n const handleSearchShortcut = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && isOpen) {\n event.preventDefault()\n event.stopPropagation()\n event.stopImmediatePropagation()\n onCancel()\n setIsOpen(false)\n inputRef.current?.blur()\n return\n }\n if (event.code !== \"KeyF\" && event.key.toLocaleLowerCase() !== \"f\") {\n return\n }\n if (!event.metaKey && !event.ctrlKey) {\n return\n }\n if (!viewerContainerRef.current?.matches(\":hover\")) return\n\n event.preventDefault()\n event.stopPropagation()\n event.stopImmediatePropagation()\n setIsOpen(true)\n requestAnimationFrame(() => {\n inputRef.current?.focus()\n inputRef.current?.select()\n })\n }\n\n const shortcutWindows: Window[] = [window]\n try {\n if (window.parent !== window && window.parent.document) {\n shortcutWindows.push(window.parent)\n }\n } catch {\n // Cross-origin parents cannot be accessed; the local listener still works.\n }\n\n shortcutWindows.forEach((targetWindow) =>\n targetWindow.addEventListener(\"keydown\", handleSearchShortcut, {\n capture: true,\n }),\n )\n return () => {\n shortcutWindows.forEach((targetWindow) =>\n targetWindow.removeEventListener(\"keydown\", handleSearchShortcut, {\n capture: true,\n }),\n )\n }\n }, [isOpen, onCancel, viewerContainerRef])\n\n const cancelSearch = () => {\n onCancel()\n setIsOpen(false)\n inputRef.current?.blur()\n }\n\n const openSearch = (focusInput: boolean) => {\n setIsOpen(true)\n if (focusInput) {\n requestAnimationFrame(() => inputRef.current?.focus())\n }\n }\n\n const componentResults = results.filter(\n (result) => result.kind === \"component\",\n )\n const netResults = results.filter((result) => result.kind === \"net\")\n const orderedResults = [...componentResults, ...netResults]\n const activeResult =\n orderedResults.find((result) => result.target.id === activeResultId) ??\n orderedResults[0]\n const resultCountLabel =\n results.length === 1 ? \"1 result\" : `${results.length} results`\n let searchHeaderBorder = \"none\"\n if (query) searchHeaderBorder = \"1px solid #e8e8e8\"\n\n const handleSearchKeyDown = (event: React.KeyboardEvent) => {\n if (\n event.key === \"Enter\" &&\n event.target instanceof Element &&\n event.target.closest('[aria-label=\"Clear search\"]')\n ) {\n return\n }\n if (event.key === \"Escape\") {\n event.preventDefault()\n cancelSearch()\n return\n }\n if (\n orderedResults.length > 0 &&\n (event.key === \"ArrowDown\" || event.key === \"ArrowUp\")\n ) {\n event.preventDefault()\n let direction = -1\n if (event.key === \"ArrowDown\") direction = 1\n setActiveResultId((currentId) => {\n const currentIndex = orderedResults.findIndex(\n (result) => result.target.id === currentId,\n )\n let startIndex = currentIndex\n if (currentIndex === -1) {\n startIndex = 0\n if (direction === 1) startIndex = -1\n }\n const nextIndex =\n (startIndex + direction + orderedResults.length) %\n orderedResults.length\n return orderedResults[nextIndex]?.target.id ?? null\n })\n return\n }\n if (event.key === \"Enter\" && activeResult) {\n event.preventDefault()\n onSelect(activeResult)\n }\n }\n\n const renderResultSection = (\n title: string,\n sectionResults: SchematicSearchResult[],\n ) => {\n if (sectionResults.length === 0) return null\n return (\n <section>\n <div\n style={{\n padding: \"6px 12px 3px\",\n backgroundColor: \"#f7f7f8\",\n color: \"#777777\",\n fontSize: \"11px\",\n fontWeight: 600,\n letterSpacing: \"0.02em\",\n textTransform: \"lowercase\",\n }}\n >\n {title}\n </div>\n {sectionResults.map((result) => {\n const active = result.target.id === activeResult?.target.id\n const hovering = result.target.id === hoveredResultId\n let resultBackground = \"#ffffff\"\n if (hovering || active) resultBackground = \"#f1f3f5\"\n\n let resultIcon = <NetIcon size={15} strokeWidth={1.8} />\n if (result.kind === \"component\") {\n resultIcon = <ComponentIcon size={15} strokeWidth={1.8} />\n }\n const selectResult = () => {\n inputRef.current?.blur()\n setActiveResultId(result.target.id)\n onSelect(result)\n }\n return (\n <button\n type=\"button\"\n key={result.target.id}\n data-search-result-id={result.target.id}\n onPointerUp={(event) => {\n if (event.button === 0) selectResult()\n }}\n onClick={(event) => {\n if (event.detail === 0) selectResult()\n }}\n onMouseEnter={() => setHoveredResultId(result.target.id)}\n onMouseLeave={() => setHoveredResultId(null)}\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"9px\",\n padding: \"7px 12px\",\n border: \"none\",\n background: resultBackground,\n color: \"#222222\",\n cursor: \"pointer\",\n textAlign: \"left\",\n }}\n >\n <span\n style={{\n width: \"26px\",\n height: \"26px\",\n flexShrink: 0,\n display: \"grid\",\n placeItems: \"center\",\n border: \"1px solid #e5e5e5\",\n borderRadius: \"6px\",\n backgroundColor: \"#f7f7f7\",\n color: \"#666666\",\n }}\n >\n {resultIcon}\n </span>\n <span style={{ minWidth: 0, flex: 1 }}>\n <span\n style={{\n display: \"block\",\n overflow: \"hidden\",\n fontSize: \"13px\",\n fontWeight: 400,\n lineHeight: 1.25,\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n <HighlightedSearchText text={result.label} query={query} />\n </span>\n {result.detail && (\n <span\n style={{\n display: \"block\",\n overflow: \"hidden\",\n marginTop: \"2px\",\n color: \"#777777\",\n fontSize: \"11px\",\n lineHeight: 1.2,\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {result.detail}\n </span>\n )}\n {result.schematicSheetName && (\n <span\n style={{\n display: \"block\",\n overflow: \"hidden\",\n marginTop: \"2px\",\n color: \"#777777\",\n fontSize: \"11px\",\n lineHeight: 1.2,\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n Sheet: {result.schematicSheetName}\n </span>\n )}\n </span>\n {active && (\n <span\n title=\"Press Enter to open\"\n style={{\n flexShrink: 0,\n color: \"#666666\",\n fontSize: \"17px\",\n lineHeight: 1,\n }}\n >\n <EnterIcon size={14} strokeWidth={1.8} />\n </span>\n )}\n </button>\n )\n })}\n </section>\n )\n }\n\n return (\n <div\n data-schematic-search\n onPointerDown={(event) => event.stopPropagation()}\n onMouseDown={(event) => event.stopPropagation()}\n onTouchStart={(event) => event.stopPropagation()}\n onTouchEnd={(event) => event.stopPropagation()}\n style={{\n position: \"relative\",\n zIndex: zIndexMap.schematicSearch,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n }}\n >\n {!isOpen ? (\n <button\n type=\"button\"\n title=\"Search schematic\"\n aria-label=\"Search schematic\"\n onPointerDown={(event) => {\n event.stopPropagation()\n if (event.pointerType !== \"mouse\") openSearch(false)\n }}\n onPointerUp={(event) => {\n if (event.pointerType === \"mouse\" && event.button === 0) {\n openSearch(true)\n }\n }}\n onClick={(event) => {\n if (event.detail === 0) openSearch(true)\n }}\n style={{\n width: \"32px\",\n height: \"32px\",\n display: \"grid\",\n placeItems: \"center\",\n padding: 0,\n border: \"none\",\n borderRadius: \"4px\",\n backgroundColor: \"#ffffff\",\n color: \"#000000\",\n cursor: \"pointer\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n }}\n >\n <SearchIcon size={16} strokeWidth={2} />\n </button>\n ) : (\n <div\n onKeyDown={handleSearchKeyDown}\n style={{\n width: \"min(280px, calc(100vw - 32px))\",\n overflow: \"hidden\",\n border: \"none\",\n borderRadius: \"4px\",\n backgroundColor: \"#ffffff\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n height: \"32px\",\n boxSizing: \"border-box\",\n padding: \"0 12px\",\n borderBottom: searchHeaderBorder,\n }}\n >\n <SearchIcon size={15} strokeWidth={2} />\n <input\n ref={inputRef}\n value={query}\n aria-label=\"Search components and nets\"\n placeholder=\"Search...\"\n onPointerUp={(event) => event.currentTarget.focus()}\n onChange={(event) => onQueryChange(event.target.value)}\n style={{\n minWidth: 0,\n flex: 1,\n border: \"none\",\n outline: \"none\",\n fontSize: \"13px\",\n color: \"#222222\",\n background: \"transparent\",\n }}\n />\n {query && results.length > 0 ? (\n <span\n style={{\n flexShrink: 0,\n color: \"#888888\",\n fontSize: \"12px\",\n whiteSpace: \"nowrap\",\n }}\n >\n {resultCountLabel}\n </span>\n ) : (\n <kbd\n style={{\n flexShrink: 0,\n padding: \"2px 5px\",\n border: \"1px solid #dddddd\",\n borderRadius: \"4px\",\n backgroundColor: \"#f7f7f7\",\n color: \"#777777\",\n fontFamily: \"inherit\",\n fontSize: \"10px\",\n lineHeight: 1.2,\n }}\n >\n {shortcutLabel}\n </kbd>\n )}\n {isOpen && (\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n onPointerUp={(event) => {\n if (event.button === 0) cancelSearch()\n }}\n onClick={(event) => {\n if (event.detail === 0) cancelSearch()\n }}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"#777777\",\n cursor: \"pointer\",\n width: \"20px\",\n height: \"20px\",\n display: \"grid\",\n placeItems: \"center\",\n padding: 0,\n lineHeight: 1,\n }}\n >\n <CloseIcon size={16} strokeWidth={2} />\n </button>\n )}\n </div>\n {query && (\n <div\n ref={resultsListRef}\n style={{\n maxHeight: \"240px\",\n overflowX: \"hidden\",\n overflowY: \"auto\",\n overscrollBehavior: \"contain\",\n scrollBehavior: \"smooth\",\n touchAction: \"pan-y\",\n WebkitOverflowScrolling: \"touch\",\n }}\n onWheel={(event) => event.stopPropagation()}\n onTouchMove={(event) => event.stopPropagation()}\n >\n {results.length === 0 ? (\n <div\n style={{\n padding: \"12px\",\n color: \"#777777\",\n fontSize: \"13px\",\n }}\n >\n No matching components or nets\n </div>\n ) : (\n <>\n {renderResultSection(\"components\", componentResults)}\n {renderResultSection(\"nets\", netResults)}\n </>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface IconProps {\n size: number\n strokeWidth: number\n}\n\nconst Icon = ({\n children,\n size,\n strokeWidth,\n}: IconProps & { children: ReactNode }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n)\n\nexport const SearchIcon = (props: IconProps) => (\n <Icon {...props}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.34-4.34\" />\n </Icon>\n)\n\nexport const CloseIcon = (props: IconProps) => (\n <Icon {...props}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </Icon>\n)\n\nexport const ComponentIcon = (props: IconProps) => (\n <Icon {...props}>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n <rect x=\"8\" y=\"8\" width=\"8\" height=\"8\" rx=\"1\" />\n <path d=\"M7 2v2M12 2v2M17 2v2M7 20v2M12 20v2M17 20v2M2 7h2M2 12h2M2 17h2M20 7h2M20 12h2M20 17h2\" />\n </Icon>\n)\n\nexport const NetIcon = (props: IconProps) => (\n <Icon {...props}>\n <path d=\"M15 6a9 9 0 0 0-9 9V3\" />\n <circle cx=\"18\" cy=\"6\" r=\"3\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n </Icon>\n)\n\nexport const EnterIcon = (props: IconProps) => (\n <Icon {...props}>\n <path d=\"M20 4v7a4 4 0 0 1-4 4H4\" />\n <path d=\"m9 10-5 5 5 5\" />\n </Icon>\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 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 }}\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 * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport { su } from \"@tscircuit/soup-util\"\nimport type { CircuitJson } from \"circuit-json\"\nimport { useMemo } from \"react\"\nimport packageJson from \"../../package.json\"\nimport { zIndexMap } from \"../utils/z-index-map\"\n\ninterface ViewMenuProps {\n circuitJson: CircuitJson\n circuitJsonKey: string\n menuRef: React.RefObject<HTMLDivElement | null>\n menuPos: { x: number; y: number }\n onOpenChange: (open: boolean) => void\n showGroups: boolean\n onToggleGroups: (show: boolean) => void\n showGrid: boolean\n onToggleGrid: (show: boolean) => void\n showPorts: boolean\n onTogglePorts: (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: \"#262626\",\n color: \"#fafafa\",\n borderRadius: 6,\n boxShadow:\n \"0px 12px 48px -12px rgba(0, 0, 0, 0.5), 0px 8px 24px -8px rgba(0, 0, 0, 0.3)\",\n border: \"1px solid #333333\",\n padding: 4,\n minWidth: 208,\n fontSize: 14,\n fontWeight: 400,\n fontFamily: FONT_FAMILY,\n outline: \"none\",\n zIndex: zIndexMap.contextMenu,\n}\n\nconst itemStyles: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"6px 8px\",\n borderRadius: 6,\n cursor: \"default\",\n outline: \"none\",\n userSelect: \"none\",\n color: \"#fafafa\",\n fontSize: 14,\n fontWeight: 400,\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: \"#fafafa\",\n}\n\nconst separatorStyles: React.CSSProperties = {\n height: 1,\n backgroundColor: \"#ffffff1a\",\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: #404040; }\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 menuRef,\n menuPos,\n onOpenChange,\n showGroups,\n onToggleGroups,\n showGrid,\n onToggleGrid,\n showPorts,\n onTogglePorts,\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 const hasPorts = useMemo(() => {\n if (!circuitJson || circuitJson.length === 0) return false\n\n try {\n return (su(circuitJson).schematic_port?.list() || []).length > 0\n } catch (error) {\n console.error(\"Error checking for schematic ports:\", error)\n return false\n }\n }, [circuitJsonKey])\n\n return (\n <div\n ref={menuRef}\n style={{\n position: \"fixed\",\n left: menuPos.x,\n top: menuPos.y,\n width: 0,\n height: 0,\n }}\n >\n <DropdownMenu.Root open={true} onOpenChange={onOpenChange} modal={false}>\n <DropdownMenu.Trigger asChild>\n <div style={{ position: \"absolute\", width: 1, height: 1 }} />\n </DropdownMenu.Trigger>\n\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n style={contentStyles}\n align=\"start\"\n sideOffset={0}\n collisionPadding={10}\n avoidCollisions={true}\n >\n <style>{HIGHLIGHT_CSS}</style>\n\n <DropdownMenu.Item\n className=\"sv-vm-item\"\n style={itemStyles}\n disabled={!hasPorts}\n title={hasPorts ? undefined : \"No ports found in this schematic\"}\n onSelect={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n event.preventDefault()\n if (hasPorts) onTogglePorts(!showPorts)\n }}\n >\n <span style={iconSlotStyles}>{showPorts && <CheckIcon />}</span>\n <span>Show Schematic Ports</span>\n </DropdownMenu.Item>\n\n <DropdownMenu.Item\n className=\"sv-vm-item\"\n style={itemStyles}\n disabled={!hasGroups}\n title={\n hasGroups ? undefined : \"No groups found in this schematic\"\n }\n onSelect={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n event.preventDefault()\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={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n event.preventDefault()\n onToggleGrid(!showGrid)\n }}\n >\n <span style={iconSlotStyles}>{showGrid && <CheckIcon />}</span>\n <span>Show Grid</span>\n </DropdownMenu.Item>\n\n <DropdownMenu.Separator style={separatorStyles} />\n\n <div\n style={{\n padding: \"4px 8px 4px 32px\",\n fontSize: 11,\n opacity: 0.35,\n color: \"#a1a1aa\",\n letterSpacing: \"0.2px\",\n fontFamily: FONT_FAMILY,\n }}\n >\n @tscircuit/schematic-viewer@{String(packageJson?.version)}\n </div>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n )\n}\n","{\n \"name\": \"@tscircuit/schematic-viewer\",\n \"version\": \"2.0.88\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/tscircuit/schematic-viewer\"\n },\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/jsdom\": \"^21.1.7\",\n \"@types/react\": \"^19.0.1\",\n \"@types/react-dom\": \"^19.0.2\",\n \"@vitejs/plugin-react\": \"^4.3.4\",\n \"jsdom\": \"^26.0.0\",\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.2460\",\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 \"@tscircuit/circuit-json-util\": \"^0.0.108\",\n \"circuit-json\": \"^0.0.479\",\n \"circuit-to-svg\": \"^0.0.410\",\n \"debug\": \"^4.4.0\",\n \"fflate\": \"^0.8.3\",\n \"performance-now\": \"^2.1.0\",\n \"use-mouse-matrix-transform\": \"^1.2.2\"\n }\n}\n","import type { CircuitJson } from \"circuit-json\"\nimport {\n type AcSweepView,\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 /** Selects the AC result view. Defaults to magnitude. */\n acSweepView?: AcSweepView\n}\n\nexport const AnalogSimulationViewer = ({\n circuitJson: inputCircuitJson,\n containerStyle,\n colorOverrides,\n width,\n height,\n className,\n hideSchematic = false,\n onSimulationChange,\n acSweepView = \"magnitude\",\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 // 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 ac_sweep_view: acSweepView,\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 acSweepView,\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","su","useEffect","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useMemo","useRef","useState","useEffect","useState","useCallback","useEffect","useRef","useState","useCallback","useEffect","useMemo","useRef","useMemo","jsx","useMemo","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","useEffect","useRef","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","useRef","useEffect","useState","Fragment","jsx","jsxs","useState","DropdownMenu","su","useMemo","jsx","jsxs","FONT_FAMILY","contentStyles","itemStyles","iconSlotStyles","CheckIcon","useMemo","su","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"]}
|
|
1
|
+
{"version":3,"sources":["../lib/components/SchematicViewer.tsx","../lib/hooks/useLocalStorage.ts","../lib/hooks/useSchematicGroupsOverlay.ts","../lib/hooks/useSchematicNetHover.ts","../lib/hooks/useSchematicSearch.ts","../lib/utils/get-schematic-search-results.ts","../lib/utils/get-search-result-transform.ts","../lib/utils/debug.ts","../lib/hooks/use-resize-handling.ts","../lib/hooks/useContextMenu.ts","../lib/utils/component-details.ts","../lib/utils/z-index-map.ts","../lib/components/MouseTracker.tsx","../lib/components/SchematicComponentDetailsTooltip.tsx","../lib/components/SchematicComponentMouseTarget.tsx","../lib/hooks/useMouseEventsOverBoundingBox.ts","../lib/components/SchematicPortMouseTarget.tsx","../lib/components/SchematicSearch.tsx","../lib/components/SchematicSearchIcons.tsx","../lib/components/SchematicSheetSelector.tsx","../lib/components/ViewMenu.tsx","../package.json","../lib/components/AnalogSimulationViewer.tsx","../lib/utils/get-analog-simulation-background-color.ts","../lib/components/AnalogSimulationSelector.tsx"],"sourcesContent":["import { su } from \"@tscircuit/soup-util\"\nimport type { CircuitJson, SchematicSheet } from \"circuit-json\"\nimport {\n type ColorOverrides,\n convertCircuitJsonToSchematicSvg,\n} from \"circuit-to-svg\"\nimport {\n STORAGE_KEYS,\n getStoredBoolean,\n getStoredString,\n setStoredBoolean,\n setStoredString,\n} from \"lib/hooks/useLocalStorage\"\nimport { useSchematicGroupsOverlay } from \"lib/hooks/useSchematicGroupsOverlay\"\nimport { useSchematicNetHover } from \"lib/hooks/useSchematicNetHover\"\nimport { useSchematicSearch } from \"lib/hooks/useSchematicSearch\"\nimport { enableDebug } from \"lib/utils/debug\"\nimport { useCallback, 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 { useContextMenu } from \"../hooks/useContextMenu\"\nimport { getSchematicComponentDetails } from \"../utils/component-details\"\nimport { zIndexMap } from \"../utils/z-index-map\"\nimport { MouseTracker } from \"./MouseTracker\"\nimport { SchematicComponentDetailsTooltip } from \"./SchematicComponentDetailsTooltip\"\nimport { SchematicComponentMouseTarget } from \"./SchematicComponentMouseTarget\"\nimport { SchematicPortMouseTarget } from \"./SchematicPortMouseTarget\"\nimport { SchematicSearch } from \"./SchematicSearch\"\nimport { SchematicSheetSelector } from \"./SchematicSheetSelector\"\nimport { ViewMenu } from \"./ViewMenu\"\n\ninterface Props {\n circuitJson: CircuitJson\n containerStyle?: React.CSSProperties\n debugGrid?: 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 /** Show component and net-label search. Default true. */\n searchEnabled?: boolean\n}\n\ninterface SelectedSchematicComponent {\n schematicComponentId: string\n anchorX: number\n anchorY: number\n}\n\nexport const SchematicViewer = ({\n circuitJson,\n containerStyle,\n debugGrid = false,\n debug = false,\n clickToInteractEnabled = false,\n colorOverrides,\n disableGroups = false,\n netHoverHighlightEnabled = true,\n onSchematicComponentClicked,\n showSchematicPorts,\n onSchematicPortClicked,\n onSchematicSheetChange,\n searchEnabled = true,\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 [showGridInternal, setShowGridInternal] = useState(false)\n const [showWarnings, setShowWarnings] = useState(false)\n const showGrid = debugGrid || showGridInternal\n const [isInteractionEnabled, setIsInteractionEnabled] = useState<boolean>(\n !clickToInteractEnabled,\n )\n const [showSchematicGroups, setShowSchematicGroups] = useState(() => {\n if (disableGroups) return false\n return getStoredBoolean(STORAGE_KEYS.IS_SHOWING_SCHEMATIC_GROUPS, false)\n })\n const [showSchematicPortsInternal, setShowSchematicPortsInternal] = useState(\n () =>\n showSchematicPorts ??\n getStoredBoolean(STORAGE_KEYS.IS_SHOWING_SCHEMATIC_PORTS, false),\n )\n\n useEffect(() => {\n if (showSchematicPorts !== undefined) {\n setShowSchematicPortsInternal(showSchematicPorts)\n }\n }, [showSchematicPorts])\n const [isHoveringClickableComponent, setIsHoveringClickableComponent] =\n useState(false)\n const hoveringComponentsRef = useRef<Set<string>>(new Set())\n const [selectedSchematicComponent, setSelectedSchematicComponent] =\n useState<SelectedSchematicComponent | null>(null)\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 const zoomScaleRef = useRef({ x: 1, y: 1 })\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 (!showSchematicPortsInternal) 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, showSchematicPortsInternal, 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 shouldPanSchematic = useCallback(\n (event: MouseEvent | TouchEvent | WheelEvent) => {\n if (\n event.target instanceof Element &&\n event.target.closest(\"[data-schematic-search]\")\n ) {\n return false\n }\n if (event.type !== \"mousedown\" || !(\"button\" in event)) return true\n return event.button !== 2 && !(event.button === 0 && event.ctrlKey)\n },\n [],\n )\n\n const {\n ref: containerRef,\n transform: svgToScreenProjection,\n setTransform: setSvgToScreenProjection,\n } = useMouseMatrixTransform({\n onSetTransform(transform) {\n const zoomChanged =\n transform.a !== zoomScaleRef.current.x ||\n transform.d !== zoomScaleRef.current.y\n zoomScaleRef.current = { x: transform.a, y: transform.d }\n if (zoomChanged) {\n setSelectedSchematicComponent(null)\n }\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 shouldDrag: shouldPanSchematic,\n })\n\n const {\n menuVisible,\n menuPos,\n menuRef,\n setMenuVisible,\n contextMenuEventHandlers,\n } = useContextMenu({ containerRef })\n\n const { containerWidth, containerHeight } = useResizeHandling(containerRef)\n const selectedComponentDetails = useMemo(\n () =>\n selectedSchematicComponent\n ? getSchematicComponentDetails(\n circuitJson,\n selectedSchematicComponent.schematicComponentId,\n )\n : null,\n [circuitJsonKey, circuitJson, selectedSchematicComponent],\n )\n\n const componentTooltipLayout = useMemo(() => {\n if (!selectedSchematicComponent || !containerWidth || !containerHeight) {\n return null\n }\n\n const margin = 12\n const gap = 14\n const width = Math.min(420, containerWidth - margin * 2)\n const maxHeight = Math.min(520, containerHeight - margin * 2)\n const { anchorX, anchorY } = selectedSchematicComponent\n\n const rightOfAnchor = anchorX + gap\n const leftOfAnchor = anchorX - width - gap\n const left =\n rightOfAnchor + width <= containerWidth - margin\n ? rightOfAnchor\n : leftOfAnchor >= margin\n ? leftOfAnchor\n : Math.max(\n margin,\n Math.min(anchorX - width / 2, containerWidth - width - margin),\n )\n const top = Math.max(\n margin,\n Math.min(anchorY - 24, containerHeight - maxHeight - margin),\n )\n\n return { left, top, width, maxHeight }\n }, [selectedSchematicComponent, containerWidth, containerHeight])\n\n const handleSchematicComponentClick = useCallback(\n (schematicComponentId: string, event: MouseEvent) => {\n if (\n event.target instanceof Element &&\n event.target.closest(\"[data-schematic-component-details-tooltip]\")\n ) {\n return\n }\n\n const containerRect = containerRef.current?.getBoundingClientRect()\n if (!containerRect) return\n\n setSelectedSchematicComponent({\n schematicComponentId,\n anchorX: event.clientX - containerRect.left,\n anchorY: event.clientY - containerRect.top,\n })\n onSchematicComponentClicked?.({\n schematicComponentId,\n event,\n })\n },\n [containerRef, onSchematicComponentClicked],\n )\n\n useEffect(() => {\n setSelectedSchematicComponent(null)\n }, [circuitJsonKey, activeSheetId])\n\n useEffect(() => {\n if (!selectedSchematicComponent) return\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setSelectedSchematicComponent(null)\n }\n }\n const handleDocumentMouseDown = (event: MouseEvent) => {\n if (\n event.target instanceof Element &&\n event.target.closest(\"[data-schematic-component-details-tooltip]\")\n ) {\n return\n }\n setSelectedSchematicComponent(null)\n }\n window.addEventListener(\"keydown\", handleKeyDown)\n document.addEventListener(\"mousedown\", handleDocumentMouseDown)\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown)\n document.removeEventListener(\"mousedown\", handleDocumentMouseDown)\n }\n }, [selectedSchematicComponent])\n\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: showSchematicPortsInternal,\n shouldDrawWarnings: showWarnings,\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 showWarnings,\n showSchematicPortsInternal,\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 {\n searchQuery,\n setSearchQuery,\n searchResults,\n handleSearchResultSelect,\n handleCancelSearch,\n } = useSchematicSearch({\n circuitJson,\n circuitJsonKey,\n svgDivRef,\n containerRef,\n activeSheetId,\n hasMultipleSheets,\n handleSelectSheet,\n svgString,\n svgToScreenProjection,\n setSvgToScreenProjection,\n setIsInteractionEnabled,\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 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=\"schematic-component-clickable\"\n // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>\n dangerouslySetInnerHTML={{ __html: svgString }}\n />\n ),\n [svgString, isInteractionEnabled, clickToInteractEnabled],\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 {searchEnabled && (\n <style>\n {`.schematic-search-match text,\n text.schematic-search-match {\n fill: #ff00d4 !important;\n }\n .schematic-search-match [stroke]:not(text):not([stroke=\"none\"]),\n [stroke]:not(text):not([stroke=\"none\"]).schematic-search-match {\n stroke: #ff00d4 !important;\n }\n .schematic-viewer-toolbar {\n flex-direction: row;\n }\n @media (max-width: 640px) {\n .schematic-viewer-toolbar {\n flex-direction: column;\n }\n }`}\n </style>\n )}\n <style>\n {\n \".schematic-component-clickable [data-schematic-component-id]:hover { cursor: pointer !important; }\"\n }\n </style>\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:\n clickToInteractEnabled && !isInteractionEnabled\n ? \"pointer\"\n : isHoveringClickableComponent\n ? \"pointer\"\n : isHoveringClickablePort && onSchematicPortClicked\n ? \"pointer\"\n : \"grab\",\n minHeight: \"300px\",\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n WebkitTouchCallout: \"none\",\n ...containerStyle,\n }}\n onMouseDownCapture={(e) => {\n contextMenuEventHandlers.onMouseDown(e)\n if (clickToInteractEnabled && !isInteractionEnabled) {\n e.preventDefault()\n e.stopPropagation()\n return\n }\n }}\n onContextMenu={contextMenuEventHandlers.onContextMenu}\n onTouchStart={(event) => {\n handleTouchStart(event)\n contextMenuEventHandlers.onTouchStart(event)\n }}\n onTouchMove={contextMenuEventHandlers.onTouchMove}\n onTouchEnd={(event) => {\n handleTouchEnd(event)\n contextMenuEventHandlers.onTouchEnd()\n }}\n onTouchCancel={contextMenuEventHandlers.onTouchCancel}\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 {menuVisible && (\n <ViewMenu\n circuitJson={circuitJson}\n circuitJsonKey={circuitJsonKey}\n menuRef={menuRef}\n menuPos={menuPos}\n onOpenChange={setMenuVisible}\n showPorts={showSchematicPortsInternal}\n onTogglePorts={(value) => {\n setShowSchematicPortsInternal(value)\n setStoredBoolean(STORAGE_KEYS.IS_SHOWING_SCHEMATIC_PORTS, value)\n }}\n showGroups={showSchematicGroups}\n onToggleGroups={(value) => {\n if (!disableGroups) {\n setShowSchematicGroups(value)\n setStoredBoolean(\n STORAGE_KEYS.IS_SHOWING_SCHEMATIC_GROUPS,\n value,\n )\n }\n }}\n showWarnings={showWarnings}\n onToggleWarnings={setShowWarnings}\n showGrid={showGrid}\n onToggleGrid={setShowGridInternal}\n />\n )}\n <div\n className=\"schematic-viewer-toolbar\"\n style={{\n position: \"absolute\",\n top: \"16px\",\n left: \"16px\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"8px\",\n zIndex: zIndexMap.schematicSearch,\n }}\n >\n <SchematicSheetSelector\n sheets={schematicSheets}\n selectedSheetId={activeSheetId}\n onSelectSheet={handleSelectSheet}\n />\n {searchEnabled && (\n <SchematicSearch\n query={searchQuery}\n onQueryChange={setSearchQuery}\n onCancel={handleCancelSearch}\n results={searchResults}\n onSelect={handleSearchResultSelect}\n viewerContainerRef={containerRef}\n />\n )}\n </div>\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={handleSchematicComponentClick}\n />\n ))}\n {svgDiv}\n {selectedComponentDetails && componentTooltipLayout && (\n <SchematicComponentDetailsTooltip\n sourceComponent={selectedComponentDetails.sourceComponent}\n footprinterString={selectedComponentDetails.footprinterString}\n footprintPreviewCircuitJson={\n selectedComponentDetails.footprintPreviewCircuitJson\n }\n footprintPreviewViewBox={\n selectedComponentDetails.footprintPreviewViewBox\n }\n {...componentTooltipLayout}\n />\n )}\n {showSchematicPortsInternal &&\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 { useCallback } from \"react\"\n\nexport const STORAGE_KEYS = {\n IS_SHOWING_SCHEMATIC_GROUPS: \"schematic_viewer_show_groups\",\n IS_SHOWING_SCHEMATIC_PORTS: \"schematic_viewer_show_ports\",\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 { 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 type { CircuitJson } from \"circuit-json\"\nimport type { RefObject } from \"react\"\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport { fromString, type Matrix } from \"transformation-matrix\"\nimport {\n getSchematicSearchResults,\n type SchematicSearchResult,\n} from \"../utils/get-schematic-search-results\"\nimport { getSearchResultTransform } from \"../utils/get-search-result-transform\"\n\nconst MIN_SEARCH_RESULT_ZOOM = 1.8\nconst SEARCH_FOCUS_ANIMATION_MS = 350\n\nexport const useSchematicSearch = ({\n circuitJson,\n circuitJsonKey,\n svgDivRef,\n containerRef,\n activeSheetId,\n hasMultipleSheets,\n handleSelectSheet,\n svgString,\n svgToScreenProjection,\n setSvgToScreenProjection,\n setIsInteractionEnabled,\n}: {\n circuitJson: CircuitJson\n circuitJsonKey: string\n svgDivRef: RefObject<HTMLDivElement | null>\n containerRef: RefObject<HTMLElement | null>\n activeSheetId?: string\n hasMultipleSheets: boolean\n handleSelectSheet: (schematicSheetId: string) => void\n svgString: string\n svgToScreenProjection: Matrix\n setSvgToScreenProjection: (transform: Matrix) => void\n setIsInteractionEnabled: (enabled: boolean) => void\n}) => {\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [pendingSearchResult, setPendingSearchResult] =\n useState<SchematicSearchResult | null>(null)\n const searchAnimationTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n )\n\n const searchResults = useMemo(\n () => getSchematicSearchResults(circuitJson, searchQuery),\n [circuitJson, circuitJsonKey, searchQuery],\n )\n\n const focusSearchResult = useCallback(\n (result: SchematicSearchResult) => {\n const svgRoot = svgDivRef.current\n const container = containerRef.current\n if (!svgRoot || !container) return false\n\n let attribute = \"data-schematic-net-label-id\"\n if (result.target.type === \"schematic_component\") {\n attribute = \"data-schematic-component-id\"\n }\n const target = Array.from(\n svgRoot.querySelectorAll<SVGGraphicsElement>(`[${attribute}]`),\n ).find((element) => element.getAttribute(attribute) === result.target.id)\n if (!target) return false\n\n const targetRect = target.getBoundingClientRect()\n const containerRect = container.getBoundingClientRect()\n if (!targetRect.width && !targetRect.height) return false\n\n if (searchAnimationTimerRef.current) {\n clearTimeout(searchAnimationTimerRef.current)\n }\n\n let visibleProjection = svgToScreenProjection\n const visibleTransform = getComputedStyle(svgRoot).transform\n if (visibleTransform && visibleTransform !== \"none\") {\n try {\n visibleProjection = fromString(visibleTransform)\n svgRoot.style.transition = \"none\"\n svgRoot.style.transform = visibleTransform\n void svgRoot.offsetWidth\n } catch {\n // The transform tracked by the viewer is the safe fallback.\n }\n }\n\n svgRoot.style.transition = `transform ${SEARCH_FOCUS_ANIMATION_MS}ms ease-in-out`\n void svgRoot.offsetWidth\n setSvgToScreenProjection(\n getSearchResultTransform({\n containerRect,\n targetRect,\n visibleProjection,\n minimumScale: MIN_SEARCH_RESULT_ZOOM,\n }),\n )\n searchAnimationTimerRef.current = setTimeout(() => {\n svgRoot.style.transition = \"\"\n }, SEARCH_FOCUS_ANIMATION_MS)\n\n svgRoot\n .querySelectorAll(\".schematic-search-match\")\n .forEach((element) =>\n element.classList.remove(\"schematic-search-match\"),\n )\n svgRoot.querySelectorAll(`[${attribute}]`).forEach((element) => {\n if (element.getAttribute(attribute) === result.target.id) {\n element.classList.add(\"schematic-search-match\")\n }\n })\n return true\n },\n [containerRef, setSvgToScreenProjection, svgDivRef, svgToScreenProjection],\n )\n\n const handleSearchResultSelect = useCallback(\n (result: SchematicSearchResult) => {\n setIsInteractionEnabled(true)\n if (\n result.schematicSheetId &&\n result.schematicSheetId !== activeSheetId &&\n hasMultipleSheets\n ) {\n handleSelectSheet(result.schematicSheetId)\n setPendingSearchResult(result)\n return\n }\n focusSearchResult(result)\n },\n [\n activeSheetId,\n focusSearchResult,\n handleSelectSheet,\n hasMultipleSheets,\n setIsInteractionEnabled,\n ],\n )\n\n const handleCancelSearch = useCallback(() => {\n setSearchQuery(\"\")\n setPendingSearchResult(null)\n if (searchAnimationTimerRef.current) {\n clearTimeout(searchAnimationTimerRef.current)\n searchAnimationTimerRef.current = null\n }\n if (svgDivRef.current) {\n svgDivRef.current.style.transition = \"\"\n svgDivRef.current\n .querySelectorAll(\".schematic-search-match\")\n .forEach((element) =>\n element.classList.remove(\"schematic-search-match\"),\n )\n }\n }, [svgDivRef])\n\n useEffect(() => {\n if (!pendingSearchResult || !svgString) return\n const frame = requestAnimationFrame(() => {\n if (focusSearchResult(pendingSearchResult)) {\n setPendingSearchResult(null)\n }\n })\n return () => cancelAnimationFrame(frame)\n }, [focusSearchResult, pendingSearchResult, svgString])\n\n useEffect(() => {\n if (searchQuery) return\n svgDivRef.current\n ?.querySelectorAll(\".schematic-search-match\")\n .forEach((element) => element.classList.remove(\"schematic-search-match\"))\n }, [searchQuery, svgDivRef])\n\n useEffect(\n () => () => {\n if (searchAnimationTimerRef.current) {\n clearTimeout(searchAnimationTimerRef.current)\n }\n },\n [],\n )\n\n return {\n searchQuery,\n setSearchQuery,\n searchResults,\n handleSearchResultSelect,\n handleCancelSearch,\n }\n}\n","import type {\n CircuitJson,\n SchematicComponent,\n SchematicNetLabel,\n SchematicPort,\n SourceComponentBase,\n SourcePort,\n SourceTrace,\n SchematicSheet,\n} from \"circuit-json\"\n\ntype SearchableSourceComponent = SourceComponentBase & {\n display_resistance?: string\n display_capacitance?: string\n display_inductance?: string\n display_frequency?: string\n symbol_display_value?: string\n}\n\nexport type SchematicSearchResult = {\n label: string\n detail?: string\n kind: \"component\" | \"net\"\n schematicSheetId?: string\n schematicSheetName?: string\n target:\n | { type: \"schematic_component\"; id: string }\n | { type: \"schematic_net_label\"; id: string }\n}\n\nconst normalize = (value: unknown) => String(value ?? \"\").toLocaleLowerCase()\n\nconst getTextMatchScore = (text: unknown, query: string) => {\n const normalizedText = normalize(text)\n if (normalizedText === query) return 0\n if (normalizedText.startsWith(query)) return 1\n if (normalizedText.includes(query)) return 2\n return Number.POSITIVE_INFINITY\n}\n\nconst humanizeComponentType = (ftype: unknown) => {\n if (!ftype) return undefined\n return String(ftype)\n .replace(/^simple_/, \"\")\n .replaceAll(\"_\", \" \")\n .replace(/\\b\\w/g, (character) => character.toLocaleUpperCase())\n}\n\nconst getComponentDetail = (\n sourceComponent: SearchableSourceComponent | undefined,\n schematicComponent: SchematicComponent,\n primaryLabel: string,\n) => {\n const componentType = humanizeComponentType(sourceComponent?.ftype)\n let componentDescription = componentType\n if (\n sourceComponent?.ftype === \"simple_chip\" &&\n sourceComponent.manufacturer_part_number\n ) {\n componentDescription = sourceComponent.manufacturer_part_number\n }\n const detailParts: string[] = []\n if (\n sourceComponent?.display_name === primaryLabel &&\n sourceComponent.name !== primaryLabel\n ) {\n detailParts.push(sourceComponent.name)\n }\n\n let componentValue = sourceComponent?.display_value\n if (!componentValue && sourceComponent) {\n for (const displayField of [\n \"display_resistance\",\n \"display_capacitance\",\n \"display_inductance\",\n \"display_frequency\",\n \"symbol_display_value\",\n ] as const) {\n if (displayField in sourceComponent) {\n const displayedMeasurement = sourceComponent[displayField]\n if (typeof displayedMeasurement === \"string\") {\n componentValue = displayedMeasurement\n break\n }\n }\n }\n }\n componentValue ??= schematicComponent.symbol_display_value\n\n if (componentDescription) {\n detailParts.push(componentDescription)\n }\n if (componentValue) {\n detailParts.push(componentValue)\n }\n if (\n !componentDescription &&\n !componentValue &&\n sourceComponent?.manufacturer_part_number\n ) {\n detailParts.push(sourceComponent.manufacturer_part_number)\n }\n\n if (detailParts.length === 0) return undefined\n return detailParts.join(\" · \")\n}\n\nconst isSourceComponent = (\n element: CircuitJson[number],\n): element is CircuitJson[number] & SearchableSourceComponent =>\n element.type === \"source_component\" && \"source_component_id\" in element\n\nconst isSourcePort = (element: CircuitJson[number]): element is SourcePort =>\n element.type === \"source_port\"\n\nconst isSourceTrace = (element: CircuitJson[number]): element is SourceTrace =>\n element.type === \"source_trace\"\n\nconst isSchematicComponent = (\n element: CircuitJson[number],\n): element is SchematicComponent => element.type === \"schematic_component\"\n\nconst isSchematicPort = (\n element: CircuitJson[number],\n): element is SchematicPort => element.type === \"schematic_port\"\n\nconst isSchematicNetLabel = (\n element: CircuitJson[number],\n): element is SchematicNetLabel => element.type === \"schematic_net_label\"\n\nconst isSchematicSheet = (\n element: CircuitJson[number],\n): element is SchematicSheet => element.type === \"schematic_sheet\"\n\nconst getSchematicSheetName = ({\n schematicSheets,\n schematicSheetId,\n}: {\n schematicSheets: SchematicSheet[]\n schematicSheetId?: string\n}) => {\n if (schematicSheets.length <= 1 || !schematicSheetId) return undefined\n return schematicSheets.find(\n (sheet) => sheet.schematic_sheet_id === schematicSheetId,\n )?.name\n}\n\nexport const getSchematicSearchResults = (\n circuitJson: CircuitJson,\n query: string,\n): SchematicSearchResult[] => {\n const normalizedQuery = normalize(query).trim()\n if (!normalizedQuery) return []\n\n const sourceComponents = new Map(\n circuitJson\n .filter(isSourceComponent)\n .map((element) => [element.source_component_id, element]),\n )\n const sourcePorts = new Map(\n circuitJson\n .filter(isSourcePort)\n .map((element) => [element.source_port_id, element]),\n )\n const schematicPorts = circuitJson.filter(isSchematicPort)\n const sourceTraces = circuitJson.filter(isSourceTrace)\n const schematicSheets = circuitJson.filter(isSchematicSheet)\n const results: SchematicSearchResult[] = []\n const resultScores = new Map<SchematicSearchResult, number>()\n\n for (const component of circuitJson.filter(isSchematicComponent)) {\n const sourceComponent = component.source_component_id\n ? sourceComponents.get(component.source_component_id)\n : undefined\n const primaryLabel =\n sourceComponent?.display_name ?? sourceComponent?.name ?? \"Component\"\n const componentScore = Math.min(\n getTextMatchScore(sourceComponent?.name, normalizedQuery),\n getTextMatchScore(sourceComponent?.display_name, normalizedQuery),\n getTextMatchScore(\n sourceComponent?.manufacturer_part_number,\n normalizedQuery,\n ),\n )\n\n if (Number.isFinite(componentScore)) {\n const result: SchematicSearchResult = {\n label: primaryLabel,\n detail: getComponentDetail(sourceComponent, component, primaryLabel),\n kind: \"component\",\n schematicSheetId: component.schematic_sheet_id,\n schematicSheetName: getSchematicSheetName({\n schematicSheets,\n schematicSheetId: component.schematic_sheet_id,\n }),\n target: {\n type: \"schematic_component\",\n id: component.schematic_component_id,\n },\n }\n results.push(result)\n resultScores.set(result, componentScore)\n }\n }\n\n for (const netLabel of circuitJson.filter(isSchematicNetLabel)) {\n if (!normalize(netLabel.text).includes(normalizedQuery)) continue\n const connectedPortIds = new Set<string>()\n for (const trace of sourceTraces.filter((sourceTrace) =>\n sourceTrace.connected_source_net_ids.includes(netLabel.source_net_id),\n )) {\n for (const portId of trace.connected_source_port_ids) {\n connectedPortIds.add(portId)\n }\n }\n const anchorPosition = netLabel.anchor_position ?? netLabel.center\n const nearestConnectedPort = schematicPorts\n .filter(\n (port) =>\n connectedPortIds.has(port.source_port_id) &&\n (!netLabel.schematic_sheet_id ||\n !port.schematic_sheet_id ||\n port.schematic_sheet_id === netLabel.schematic_sheet_id),\n )\n .map((port) => ({\n port,\n distance: Math.hypot(\n port.center.x - anchorPosition.x,\n port.center.y - anchorPosition.y,\n ),\n }))\n .filter(({ distance }) => distance <= 1)\n .sort((a, b) => a.distance - b.distance)[0]?.port\n const sourcePort = nearestConnectedPort\n ? sourcePorts.get(nearestConnectedPort.source_port_id)\n : undefined\n const connectedComponent = sourcePort?.source_component_id\n ? sourceComponents.get(sourcePort.source_component_id)\n : undefined\n const connectedPinName =\n sourcePort?.name ??\n (sourcePort?.pin_number !== undefined\n ? `pin${sourcePort.pin_number}`\n : nearestConnectedPort?.display_pin_label)\n const connectionLabel =\n connectedComponent?.name && connectedPinName\n ? `Connected to ${connectedComponent.name}.${connectedPinName}`\n : undefined\n const result: SchematicSearchResult = {\n label: netLabel.text,\n detail: connectionLabel,\n kind: \"net\",\n schematicSheetId: netLabel.schematic_sheet_id,\n schematicSheetName: getSchematicSheetName({\n schematicSheets,\n schematicSheetId: netLabel.schematic_sheet_id,\n }),\n target: {\n type: \"schematic_net_label\",\n id: netLabel.schematic_net_label_id,\n },\n }\n results.push(result)\n resultScores.set(result, getTextMatchScore(netLabel.text, normalizedQuery))\n }\n\n return results.sort((a, b) => {\n return (\n (resultScores.get(a) ?? Number.POSITIVE_INFINITY) -\n (resultScores.get(b) ?? Number.POSITIVE_INFINITY) ||\n a.label.localeCompare(b.label)\n )\n })\n}\n","import type { Matrix } from \"transformation-matrix\"\n\nexport const getSearchResultTransform = ({\n containerRect,\n targetRect,\n visibleProjection,\n minimumScale,\n}: {\n containerRect: Pick<DOMRect, \"left\" | \"top\" | \"width\" | \"height\">\n targetRect: Pick<DOMRect, \"left\" | \"top\" | \"width\" | \"height\">\n visibleProjection: Matrix\n minimumScale: number\n}): Matrix => {\n const currentScale = visibleProjection.a || 1\n const targetCenterInContainer = {\n x: targetRect.left + targetRect.width / 2 - containerRect.left,\n y: targetRect.top + targetRect.height / 2 - containerRect.top,\n }\n const targetCenterBeforeViewerTransform = {\n x: (targetCenterInContainer.x - visibleProjection.e) / currentScale,\n y: (targetCenterInContainer.y - visibleProjection.f) / currentScale,\n }\n const targetScale = Math.max(currentScale, minimumScale)\n\n return {\n a: targetScale,\n b: 0,\n c: 0,\n d: targetScale,\n e:\n containerRect.width / 2 -\n targetCenterBeforeViewerTransform.x * targetScale,\n f:\n containerRect.height / 2 -\n targetCenterBeforeViewerTransform.y * targetScale,\n }\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 { useCallback, useEffect, useRef, useState } from \"react\"\n\ninterface ContextMenuProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst LONG_PRESS_DURATION_MS = 600\nconst MOVEMENT_THRESHOLD_PX = 10\n\nexport const useContextMenu = ({ containerRef }: ContextMenuProps) => {\n const [menuVisible, setMenuVisible] = useState(false)\n const [menuPos, setMenuPos] = useState({ x: 0, y: 0 })\n const menuRef = useRef<HTMLDivElement>(null)\n const interactionOriginRef = useRef<{ x: number; y: number } | null>(null)\n const longPressTimeoutRef = useRef<number | null>(null)\n const ignoreContextMenuUntilRef = useRef(0)\n\n const clearLongPressTimeout = useCallback(() => {\n if (longPressTimeoutRef.current === null) return\n window.clearTimeout(longPressTimeoutRef.current)\n longPressTimeoutRef.current = null\n }, [])\n\n const handleContextMenu = useCallback((event: React.MouseEvent) => {\n event.preventDefault()\n\n if (Date.now() < ignoreContextMenuUntilRef.current) return\n\n const origin = interactionOriginRef.current\n if (!origin) return\n\n const movedTooFar =\n Math.abs(event.clientX - origin.x) > MOVEMENT_THRESHOLD_PX ||\n Math.abs(event.clientY - origin.y) > MOVEMENT_THRESHOLD_PX\n\n interactionOriginRef.current = null\n if (movedTooFar) return\n\n setMenuPos({ x: event.clientX, y: event.clientY })\n setMenuVisible(true)\n }, [])\n\n const handleTouchStart = useCallback(\n (event: React.TouchEvent) => {\n clearLongPressTimeout()\n\n if (event.touches.length !== 1) {\n interactionOriginRef.current = null\n return\n }\n\n const touch = event.touches[0]\n if (!touch) return\n\n interactionOriginRef.current = {\n x: touch.clientX,\n y: touch.clientY,\n }\n\n longPressTimeoutRef.current = window.setTimeout(() => {\n const container = containerRef.current\n if (!container || !interactionOriginRef.current) return\n\n const rect = container.getBoundingClientRect()\n setMenuPos({\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n })\n setMenuVisible(true)\n ignoreContextMenuUntilRef.current = Date.now() + 1_000\n interactionOriginRef.current = null\n }, LONG_PRESS_DURATION_MS)\n },\n [clearLongPressTimeout, containerRef],\n )\n\n const handleTouchMove = useCallback(\n (event: React.TouchEvent) => {\n const origin = interactionOriginRef.current\n if (!origin || event.touches.length !== 1) return\n\n const touch = event.touches[0]\n const movedTooFar =\n !touch ||\n Math.abs(touch.clientX - origin.x) > MOVEMENT_THRESHOLD_PX ||\n Math.abs(touch.clientY - origin.y) > MOVEMENT_THRESHOLD_PX\n\n if (movedTooFar) {\n interactionOriginRef.current = null\n clearLongPressTimeout()\n }\n },\n [clearLongPressTimeout],\n )\n\n const handleTouchEnd = useCallback(() => {\n clearLongPressTimeout()\n interactionOriginRef.current = null\n }, [clearLongPressTimeout])\n\n const handleClickAway = useCallback((event: MouseEvent | TouchEvent) => {\n const target = event.target as Node\n if (menuRef.current?.contains(target)) return\n\n const isInRadixPortal = (target as Element).closest?.(\n \"[data-radix-popper-content-wrapper], [data-radix-dropdown-menu-content]\",\n )\n if (isInRadixPortal) return\n\n setMenuVisible(false)\n }, [])\n\n useEffect(() => {\n if (!menuVisible) return\n\n document.addEventListener(\"mousedown\", handleClickAway)\n document.addEventListener(\"touchstart\", handleClickAway)\n return () => {\n document.removeEventListener(\"mousedown\", handleClickAway)\n document.removeEventListener(\"touchstart\", handleClickAway)\n }\n }, [handleClickAway, menuVisible])\n\n useEffect(() => clearLongPressTimeout, [clearLongPressTimeout])\n\n return {\n menuVisible,\n menuPos,\n menuRef,\n setMenuVisible,\n contextMenuEventHandlers: {\n onMouseDown: (event: React.MouseEvent) => {\n interactionOriginRef.current =\n event.button === 2 || (event.button === 0 && event.ctrlKey)\n ? { x: event.clientX, y: event.clientY }\n : null\n },\n onContextMenu: handleContextMenu,\n onTouchStart: handleTouchStart,\n onTouchMove: handleTouchMove,\n onTouchEnd: handleTouchEnd,\n onTouchCancel: handleTouchEnd,\n },\n }\n}\n","import {\n type PcbBounds,\n getPcbElementBounds,\n getPcbElementsWithinBounds,\n} from \"@tscircuit/circuit-json-util\"\nimport type {\n CadComponent,\n CircuitJson,\n PcbComponent,\n SchematicComponent,\n} from \"circuit-json\"\nimport { gzipSync, strToU8 } from \"fflate\"\n\nexport type { PcbBounds } from \"@tscircuit/circuit-json-util\"\n\nexport type SourceComponent = Extract<\n CircuitJson[number],\n { type: \"source_component\" }\n>\n\nexport interface SchematicComponentDetails {\n schematicComponent: SchematicComponent\n sourceComponent: SourceComponent\n pcbComponent?: PcbComponent\n footprinterString?: string\n footprintPreviewCircuitJson?: CircuitJson\n footprintPreviewViewBox?: PcbBounds\n}\n\nexport interface ComponentInfoEntry {\n key: string\n label: string\n value: string\n}\n\nexport interface SupplierPartNumberEntry {\n key: string\n label: \"jlcpcb\" | \"lcsc\"\n links: Array<{\n partNumber: string\n href: string\n }>\n}\n\nconst hiddenSourceComponentKeys = new Set([\n \"type\",\n \"source_component_id\",\n \"source_group_id\",\n \"subcircuit_id\",\n \"display_name\",\n \"ftype\",\n \"are_pins_interchangeable\",\n \"supplier_part_numbers\",\n])\n\nconst priorityKeys = [\n \"name\",\n \"resistance\",\n \"capacitance\",\n \"inductance\",\n \"frequency\",\n \"voltage\",\n \"current\",\n \"max_voltage_rating\",\n \"max_current_rating\",\n \"power_rating\",\n \"manufacturer_part_number\",\n]\n\nconst supplierPartNumberUrls = {\n jlcpcb: (partNumber: string) =>\n `https://jlcpcb.com/partdetail/${encodeURIComponent(partNumber)}`,\n lcsc: (partNumber: string) =>\n `https://www.lcsc.com/product-detail/${encodeURIComponent(partNumber)}.html`,\n}\n\nconst normalizeLcscPartNumber = (partNumber: string) => {\n const trimmedPartNumber = partNumber.trim()\n const numericPartNumber = /^c?(\\d+)$/i.exec(trimmedPartNumber)\n return numericPartNumber ? `C${numericPartNumber[1]}` : trimmedPartNumber\n}\n\nconst getKeyPriority = (key: string) => {\n const priority = priorityKeys.indexOf(key)\n return priority === -1 ? priorityKeys.length : priority\n}\n\nconst formatComponentValue = (\n sourceComponent: SourceComponent,\n key: string,\n value: unknown,\n) => {\n if (key === \"name\") return String(value)\n\n const displayValue = (sourceComponent as Record<string, unknown>)[\n `display_${key}`\n ]\n if (typeof displayValue === \"string\" && displayValue.trim()) {\n const propValue =\n key === \"resistance\" ? displayValue.replace(/Ω$/, \"\") : displayValue\n return JSON.stringify(propValue)\n }\n return JSON.stringify(value) ?? String(value)\n}\n\nexport const getSourceComponentInfoEntries = (\n sourceComponent: SourceComponent,\n): ComponentInfoEntry[] =>\n Object.entries(sourceComponent as Record<string, unknown>)\n .filter(([key, value]) => {\n if (hiddenSourceComponentKeys.has(key)) return false\n if (\n key.startsWith(\"display_\") &&\n key.slice(\"display_\".length) in sourceComponent\n ) {\n return false\n }\n return value !== undefined && value !== null && value !== \"\"\n })\n .sort(([keyA], [keyB]) => {\n const priorityDifference = getKeyPriority(keyA) - getKeyPriority(keyB)\n return priorityDifference || keyA.localeCompare(keyB)\n })\n .map(([key, value]) => ({\n key,\n label: key,\n value: formatComponentValue(sourceComponent, key, value),\n }))\n\nexport const getSupplierPartNumberEntries = (\n sourceComponent: SourceComponent,\n): SupplierPartNumberEntry[] => {\n const supplierPartNumbers = sourceComponent.supplier_part_numbers\n if (!supplierPartNumbers) return []\n\n return ([\"jlcpcb\", \"lcsc\"] as const).flatMap((supplier) => {\n const partNumbers = supplierPartNumbers[supplier]\n if (!Array.isArray(partNumbers)) return []\n\n const normalizedPartNumbers = [\n ...new Set(\n partNumbers\n .filter((partNumber): partNumber is string =>\n Boolean(typeof partNumber === \"string\" && partNumber.trim()),\n )\n .map(normalizeLcscPartNumber),\n ),\n ]\n if (!normalizedPartNumbers.length) return []\n\n return [\n {\n key: `supplier_part_numbers.${supplier}`,\n label: supplier,\n links: normalizedPartNumbers.map((partNumber) => ({\n partNumber,\n href: supplierPartNumberUrls[supplier](partNumber),\n })),\n },\n ]\n })\n}\n\nexport const getSchematicComponentDetails = (\n circuitJson: CircuitJson,\n schematicComponentId: string,\n): SchematicComponentDetails | null => {\n const schematicComponent = circuitJson.find(\n (element): element is SchematicComponent =>\n element.type === \"schematic_component\" &&\n element.schematic_component_id === schematicComponentId,\n )\n if (!schematicComponent) return null\n\n const sourceComponent = circuitJson.find(\n (element): element is SourceComponent =>\n element.type === \"source_component\" &&\n element.source_component_id === schematicComponent.source_component_id,\n )\n if (!sourceComponent) return null\n\n const pcbComponent = circuitJson.find(\n (element): element is PcbComponent =>\n element.type === \"pcb_component\" &&\n element.source_component_id === sourceComponent.source_component_id,\n )\n const cadComponent = circuitJson.find(\n (element): element is CadComponent =>\n element.type === \"cad_component\" &&\n element.source_component_id === sourceComponent.source_component_id &&\n (!pcbComponent ||\n element.pcb_component_id === pcbComponent.pcb_component_id),\n )\n\n // Newer Circuit JSON producers may put this directly on pcb_component;\n // current producers retain it on the associated cad_component.\n const footprinterString =\n (\n pcbComponent as\n | (PcbComponent & { footprinter_string?: string })\n | undefined\n )?.footprinter_string ?? cadComponent?.footprinter_string\n\n const footprintPreview = pcbComponent\n ? getPcbComponentPreview(circuitJson, pcbComponent.pcb_component_id)\n : null\n\n return {\n schematicComponent,\n sourceComponent,\n pcbComponent,\n footprinterString,\n footprintPreviewCircuitJson: footprintPreview?.circuitJson,\n footprintPreviewViewBox: footprintPreview?.viewBox,\n }\n}\n\nconst PCB_PREVIEW_PADDING_MM = 2\n\ninterface PcbComponentPreview {\n circuitJson: CircuitJson\n viewBox: PcbBounds\n}\n\n/**\n * Select the real PCB context around a component. Elements only need to\n * intersect the view box, so long traces and the board remain available for\n * rendering while svg.tscircuit.com clips the parts outside the preview.\n */\nexport const getPcbComponentPreview = (\n circuitJson: CircuitJson,\n pcbComponentId: string,\n): PcbComponentPreview | null => {\n const pcbComponent = circuitJson.find(\n (element): element is PcbComponent =>\n element.type === \"pcb_component\" &&\n element.pcb_component_id === pcbComponentId,\n )\n if (!pcbComponent) return null\n\n const componentBounds = getPcbElementBounds(pcbComponent)\n if (!componentBounds) return null\n\n const viewBox = {\n minX: componentBounds.minX - PCB_PREVIEW_PADDING_MM,\n minY: componentBounds.minY - PCB_PREVIEW_PADDING_MM,\n maxX: componentBounds.maxX + PCB_PREVIEW_PADDING_MM,\n maxY: componentBounds.maxY + PCB_PREVIEW_PADDING_MM,\n }\n\n return {\n circuitJson: getPcbElementsWithinBounds(circuitJson, viewBox),\n viewBox,\n }\n}\n\nconst bytesToBase64 = (bytes: Uint8Array) => {\n let binary = \"\"\n const chunkSize = 8192\n for (let index = 0; index < bytes.length; index += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize))\n }\n return btoa(binary)\n}\n\nexport const getFootprintPreviewUrl = (\n footprintPreviewCircuitJson: CircuitJson,\n viewBox: PcbBounds,\n) => {\n const encodedCircuitJson = bytesToBase64(\n gzipSync(strToU8(JSON.stringify(footprintPreviewCircuitJson))),\n )\n const url = new URL(\"https://svg.tscircuit.com/\")\n url.searchParams.set(\"svg_type\", \"pcb\")\n url.searchParams.set(\"circuit_json\", encodedCircuitJson)\n url.searchParams.set(\n \"viewbox\",\n [viewBox.minX, viewBox.minY, viewBox.maxX, viewBox.maxY].join(\",\"),\n )\n url.searchParams.set(\"background_color\", \"#f8fafc\")\n return url.toString()\n}\n","export const zIndexMap = {\n contextMenu: 110,\n viewMenu: 55,\n viewMenuIcon: 48,\n clickToInteractOverlay: 100,\n schematicComponentDetailsTooltip: 105,\n schematicComponentHoverOutline: 47,\n schematicPortHoverOutline: 48,\n schematicSearch: 101,\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 return <MouseTrackerProvider>{children}</MouseTrackerProvider>\n}\n\nconst MouseTrackerProvider = ({ children }: { children: ReactNode }) => {\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 type { CircuitJson } from \"circuit-json\"\nimport { useMemo } from \"react\"\nimport {\n type PcbBounds,\n type SourceComponent,\n getFootprintPreviewUrl,\n getSourceComponentInfoEntries,\n getSupplierPartNumberEntries,\n} from \"../utils/component-details\"\nimport { zIndexMap } from \"../utils/z-index-map\"\n\ninterface Props {\n sourceComponent: SourceComponent\n footprinterString?: string\n footprintPreviewCircuitJson?: CircuitJson\n footprintPreviewViewBox?: PcbBounds\n left: number\n top: number\n width: number\n maxHeight: number\n}\n\nconst detailLabelStyle: React.CSSProperties = {\n color: \"#64748b\",\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace',\n fontSize: \"12px\",\n lineHeight: 1.45,\n}\n\nexport const SchematicComponentDetailsTooltip = ({\n sourceComponent,\n footprinterString,\n footprintPreviewCircuitJson,\n footprintPreviewViewBox,\n left,\n top,\n width,\n maxHeight,\n}: Props) => {\n const infoEntries = useMemo(\n () => getSourceComponentInfoEntries(sourceComponent),\n [sourceComponent],\n )\n const supplierPartNumberEntries = useMemo(\n () => getSupplierPartNumberEntries(sourceComponent),\n [sourceComponent],\n )\n const footprintPreviewUrl = useMemo(\n () =>\n footprintPreviewCircuitJson?.length && footprintPreviewViewBox\n ? getFootprintPreviewUrl(\n footprintPreviewCircuitJson,\n footprintPreviewViewBox,\n )\n : undefined,\n [footprintPreviewCircuitJson, footprintPreviewViewBox],\n )\n return (\n <dialog\n open\n aria-label={`${sourceComponent.name} component details`}\n data-schematic-component-details-tooltip\n style={{\n position: \"absolute\",\n left,\n right: \"auto\",\n top,\n bottom: \"auto\",\n width,\n maxHeight,\n margin: 0,\n padding: 0,\n overflowY: \"auto\",\n boxSizing: \"border-box\",\n border: \"1px solid #cbd5e1\",\n borderRadius: \"4px\",\n backgroundColor: \"rgba(255, 255, 255, 0.98)\",\n boxShadow:\n \"0 20px 25px -5px rgba(15, 23, 42, 0.18), 0 8px 10px -6px rgba(15, 23, 42, 0.12)\",\n color: \"#0f172a\",\n fontFamily:\n 'Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n pointerEvents: \"auto\",\n userSelect: \"text\",\n WebkitUserSelect: \"text\",\n zIndex: zIndexMap.schematicComponentDetailsTooltip,\n }}\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => event.stopPropagation()}\n >\n <dl\n style={{\n display: \"grid\",\n gridTemplateColumns: \"minmax(110px, 0.8fr) minmax(0, 1.2fr)\",\n gap: \"6px 12px\",\n margin: 0,\n padding: \"8px\",\n }}\n >\n {infoEntries.map((entry) => (\n <div key={entry.key} style={{ display: \"contents\" }}>\n <dt style={detailLabelStyle}>{entry.label}</dt>\n <dd\n style={{\n minWidth: 0,\n margin: 0,\n color: \"#1e293b\",\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace',\n fontSize: \"12px\",\n lineHeight: 1.45,\n overflowWrap: \"anywhere\",\n }}\n >\n {entry.value}\n </dd>\n </div>\n ))}\n {supplierPartNumberEntries.map((entry) => (\n <div key={entry.key} style={{ display: \"contents\" }}>\n <dt style={detailLabelStyle}>{entry.label}</dt>\n <dd\n style={{\n minWidth: 0,\n margin: 0,\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace',\n fontSize: \"12px\",\n lineHeight: 1.45,\n overflowWrap: \"anywhere\",\n }}\n >\n {entry.links.map((link, index) => (\n <span key={link.href}>\n {index > 0 && \", \"}\n <a\n href={link.href}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n style={{ color: \"#2563eb\", textDecoration: \"underline\" }}\n >\n {link.partNumber}\n </a>\n </span>\n ))}\n </dd>\n </div>\n ))}\n {footprinterString && (\n <div style={{ display: \"contents\" }}>\n <dt style={detailLabelStyle}>footprint</dt>\n <dd\n style={{\n minWidth: 0,\n margin: 0,\n color: \"#1e293b\",\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace',\n fontSize: \"12px\",\n lineHeight: 1.45,\n overflowWrap: \"anywhere\",\n }}\n >\n {JSON.stringify(footprinterString)}\n </dd>\n </div>\n )}\n </dl>\n\n {footprintPreviewUrl && (\n <div style={{ padding: \"0 4px 4px\" }}>\n <div\n style={{\n height: \"210px\",\n overflow: \"hidden\",\n border: \"1px solid #e2e8f0\",\n borderRadius: \"2px\",\n background: \"#f8fafc\",\n }}\n >\n <img\n src={footprintPreviewUrl}\n alt={`${sourceComponent.name}${footprinterString ? ` ${footprinterString}` : \"\"} PCB footprint`}\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n style={{\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n }}\n />\n </div>\n </div>\n )}\n </dialog>\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 { useEffect, useRef, useState, type RefObject } from \"react\"\nimport type { SchematicSearchResult } from \"../utils/get-schematic-search-results\"\nimport { zIndexMap } from \"../utils/z-index-map\"\nimport {\n CloseIcon,\n ComponentIcon,\n EnterIcon,\n NetIcon,\n SearchIcon,\n} from \"./SchematicSearchIcons\"\n\nconst HighlightedSearchText = ({\n text,\n query,\n}: {\n text: string\n query: string\n}) => {\n const normalizedQuery = query.trim().toLocaleLowerCase()\n if (!normalizedQuery) return text\n\n const normalizedText = text.toLocaleLowerCase()\n const parts: React.ReactNode[] = []\n let cursor = 0\n let matchIndex = normalizedText.indexOf(normalizedQuery)\n\n while (matchIndex !== -1) {\n if (matchIndex > cursor) {\n parts.push(text.slice(cursor, matchIndex))\n }\n parts.push(\n <strong key={`${matchIndex}-${cursor}`} style={{ fontWeight: 700 }}>\n {text.slice(matchIndex, matchIndex + normalizedQuery.length)}\n </strong>,\n )\n cursor = matchIndex + normalizedQuery.length\n matchIndex = normalizedText.indexOf(normalizedQuery, cursor)\n }\n\n if (cursor < text.length) parts.push(text.slice(cursor))\n if (parts.length > 0) return parts\n return text\n}\n\nconst getShortcutLabel = () => {\n if (typeof navigator === \"undefined\") return \"Ctrl F\"\n if (/mac/i.test(navigator.platform)) return \"⌘ F\"\n return \"Ctrl F\"\n}\n\nexport const SchematicSearch = ({\n query,\n onQueryChange,\n onCancel,\n results,\n onSelect,\n viewerContainerRef,\n}: {\n query: string\n onQueryChange: (query: string) => void\n onCancel: () => void\n results: SchematicSearchResult[]\n onSelect: (result: SchematicSearchResult) => void\n viewerContainerRef: RefObject<HTMLElement | null>\n}) => {\n const [isOpen, setIsOpen] = useState(false)\n const [activeResultId, setActiveResultId] = useState<string | null>(null)\n const [hoveredResultId, setHoveredResultId] = useState<string | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const resultsListRef = useRef<HTMLDivElement>(null)\n const shortcutLabel = getShortcutLabel()\n\n useEffect(() => {\n setActiveResultId((currentId) => {\n if (results.some((result) => result.target.id === currentId)) {\n return currentId\n }\n return (\n results.find((result) => result.kind === \"component\")?.target.id ??\n results[0]?.target.id ??\n null\n )\n })\n }, [results])\n\n useEffect(() => {\n if (!activeResultId) return\n resultsListRef.current\n ?.querySelector(`[data-search-result-id=\"${activeResultId}\"]`)\n ?.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" })\n }, [activeResultId])\n\n useEffect(() => {\n const handleSearchShortcut = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && isOpen) {\n event.preventDefault()\n event.stopPropagation()\n event.stopImmediatePropagation()\n onCancel()\n setIsOpen(false)\n inputRef.current?.blur()\n return\n }\n if (event.code !== \"KeyF\" && event.key.toLocaleLowerCase() !== \"f\") {\n return\n }\n if (!event.metaKey && !event.ctrlKey) {\n return\n }\n if (!viewerContainerRef.current?.matches(\":hover\")) return\n\n event.preventDefault()\n event.stopPropagation()\n event.stopImmediatePropagation()\n setIsOpen(true)\n requestAnimationFrame(() => {\n inputRef.current?.focus()\n inputRef.current?.select()\n })\n }\n\n const shortcutWindows: Window[] = [window]\n try {\n if (window.parent !== window && window.parent.document) {\n shortcutWindows.push(window.parent)\n }\n } catch {\n // Cross-origin parents cannot be accessed; the local listener still works.\n }\n\n shortcutWindows.forEach((targetWindow) =>\n targetWindow.addEventListener(\"keydown\", handleSearchShortcut, {\n capture: true,\n }),\n )\n return () => {\n shortcutWindows.forEach((targetWindow) =>\n targetWindow.removeEventListener(\"keydown\", handleSearchShortcut, {\n capture: true,\n }),\n )\n }\n }, [isOpen, onCancel, viewerContainerRef])\n\n const cancelSearch = () => {\n onCancel()\n setIsOpen(false)\n inputRef.current?.blur()\n }\n\n const openSearch = (focusInput: boolean) => {\n setIsOpen(true)\n if (focusInput) {\n requestAnimationFrame(() => inputRef.current?.focus())\n }\n }\n\n const componentResults = results.filter(\n (result) => result.kind === \"component\",\n )\n const netResults = results.filter((result) => result.kind === \"net\")\n const orderedResults = [...componentResults, ...netResults]\n const activeResult =\n orderedResults.find((result) => result.target.id === activeResultId) ??\n orderedResults[0]\n const resultCountLabel =\n results.length === 1 ? \"1 result\" : `${results.length} results`\n let searchHeaderBorder = \"none\"\n if (query) searchHeaderBorder = \"1px solid #e8e8e8\"\n\n const handleSearchKeyDown = (event: React.KeyboardEvent) => {\n if (\n event.key === \"Enter\" &&\n event.target instanceof Element &&\n event.target.closest('[aria-label=\"Clear search\"]')\n ) {\n return\n }\n if (event.key === \"Escape\") {\n event.preventDefault()\n cancelSearch()\n return\n }\n if (\n orderedResults.length > 0 &&\n (event.key === \"ArrowDown\" || event.key === \"ArrowUp\")\n ) {\n event.preventDefault()\n let direction = -1\n if (event.key === \"ArrowDown\") direction = 1\n setActiveResultId((currentId) => {\n const currentIndex = orderedResults.findIndex(\n (result) => result.target.id === currentId,\n )\n let startIndex = currentIndex\n if (currentIndex === -1) {\n startIndex = 0\n if (direction === 1) startIndex = -1\n }\n const nextIndex =\n (startIndex + direction + orderedResults.length) %\n orderedResults.length\n return orderedResults[nextIndex]?.target.id ?? null\n })\n return\n }\n if (event.key === \"Enter\" && activeResult) {\n event.preventDefault()\n onSelect(activeResult)\n }\n }\n\n const renderResultSection = (\n title: string,\n sectionResults: SchematicSearchResult[],\n ) => {\n if (sectionResults.length === 0) return null\n return (\n <section>\n <div\n style={{\n padding: \"6px 12px 3px\",\n backgroundColor: \"#f7f7f8\",\n color: \"#777777\",\n fontSize: \"11px\",\n fontWeight: 600,\n letterSpacing: \"0.02em\",\n textTransform: \"lowercase\",\n }}\n >\n {title}\n </div>\n {sectionResults.map((result) => {\n const active = result.target.id === activeResult?.target.id\n const hovering = result.target.id === hoveredResultId\n let resultBackground = \"#ffffff\"\n if (hovering || active) resultBackground = \"#f1f3f5\"\n\n let resultIcon = <NetIcon size={15} strokeWidth={1.8} />\n if (result.kind === \"component\") {\n resultIcon = <ComponentIcon size={15} strokeWidth={1.8} />\n }\n const selectResult = () => {\n inputRef.current?.blur()\n setActiveResultId(result.target.id)\n onSelect(result)\n }\n return (\n <button\n type=\"button\"\n key={result.target.id}\n data-search-result-id={result.target.id}\n onPointerUp={(event) => {\n if (event.button === 0) selectResult()\n }}\n onClick={(event) => {\n if (event.detail === 0) selectResult()\n }}\n onMouseEnter={() => setHoveredResultId(result.target.id)}\n onMouseLeave={() => setHoveredResultId(null)}\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"9px\",\n padding: \"7px 12px\",\n border: \"none\",\n background: resultBackground,\n color: \"#222222\",\n cursor: \"pointer\",\n textAlign: \"left\",\n }}\n >\n <span\n style={{\n width: \"26px\",\n height: \"26px\",\n flexShrink: 0,\n display: \"grid\",\n placeItems: \"center\",\n border: \"1px solid #e5e5e5\",\n borderRadius: \"6px\",\n backgroundColor: \"#f7f7f7\",\n color: \"#666666\",\n }}\n >\n {resultIcon}\n </span>\n <span style={{ minWidth: 0, flex: 1 }}>\n <span\n style={{\n display: \"block\",\n overflow: \"hidden\",\n fontSize: \"13px\",\n fontWeight: 400,\n lineHeight: 1.25,\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n <HighlightedSearchText text={result.label} query={query} />\n </span>\n {result.detail && (\n <span\n style={{\n display: \"block\",\n overflow: \"hidden\",\n marginTop: \"2px\",\n color: \"#777777\",\n fontSize: \"11px\",\n lineHeight: 1.2,\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {result.detail}\n </span>\n )}\n {result.schematicSheetName && (\n <span\n style={{\n display: \"block\",\n overflow: \"hidden\",\n marginTop: \"2px\",\n color: \"#777777\",\n fontSize: \"11px\",\n lineHeight: 1.2,\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n Sheet: {result.schematicSheetName}\n </span>\n )}\n </span>\n {active && (\n <span\n title=\"Press Enter to open\"\n style={{\n flexShrink: 0,\n color: \"#666666\",\n fontSize: \"17px\",\n lineHeight: 1,\n }}\n >\n <EnterIcon size={14} strokeWidth={1.8} />\n </span>\n )}\n </button>\n )\n })}\n </section>\n )\n }\n\n return (\n <div\n data-schematic-search\n onPointerDown={(event) => event.stopPropagation()}\n onMouseDown={(event) => event.stopPropagation()}\n onTouchStart={(event) => event.stopPropagation()}\n onTouchEnd={(event) => event.stopPropagation()}\n style={{\n position: \"relative\",\n zIndex: zIndexMap.schematicSearch,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n }}\n >\n {!isOpen ? (\n <button\n type=\"button\"\n title=\"Search schematic\"\n aria-label=\"Search schematic\"\n onPointerDown={(event) => {\n event.stopPropagation()\n if (event.pointerType !== \"mouse\") openSearch(false)\n }}\n onPointerUp={(event) => {\n if (event.pointerType === \"mouse\" && event.button === 0) {\n openSearch(true)\n }\n }}\n onClick={(event) => {\n if (event.detail === 0) openSearch(true)\n }}\n style={{\n width: \"32px\",\n height: \"32px\",\n display: \"grid\",\n placeItems: \"center\",\n padding: 0,\n border: \"none\",\n borderRadius: \"4px\",\n backgroundColor: \"#ffffff\",\n color: \"#000000\",\n cursor: \"pointer\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n }}\n >\n <SearchIcon size={16} strokeWidth={2} />\n </button>\n ) : (\n <div\n onKeyDown={handleSearchKeyDown}\n style={{\n width: \"min(280px, calc(100vw - 32px))\",\n overflow: \"hidden\",\n border: \"none\",\n borderRadius: \"4px\",\n backgroundColor: \"#ffffff\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n height: \"32px\",\n boxSizing: \"border-box\",\n padding: \"0 12px\",\n borderBottom: searchHeaderBorder,\n }}\n >\n <SearchIcon size={15} strokeWidth={2} />\n <input\n ref={inputRef}\n value={query}\n aria-label=\"Search components and nets\"\n placeholder=\"Search...\"\n onPointerUp={(event) => event.currentTarget.focus()}\n onChange={(event) => onQueryChange(event.target.value)}\n style={{\n minWidth: 0,\n flex: 1,\n border: \"none\",\n outline: \"none\",\n fontSize: \"13px\",\n color: \"#222222\",\n background: \"transparent\",\n }}\n />\n {query && results.length > 0 ? (\n <span\n style={{\n flexShrink: 0,\n color: \"#888888\",\n fontSize: \"12px\",\n whiteSpace: \"nowrap\",\n }}\n >\n {resultCountLabel}\n </span>\n ) : (\n <kbd\n style={{\n flexShrink: 0,\n padding: \"2px 5px\",\n border: \"1px solid #dddddd\",\n borderRadius: \"4px\",\n backgroundColor: \"#f7f7f7\",\n color: \"#777777\",\n fontFamily: \"inherit\",\n fontSize: \"10px\",\n lineHeight: 1.2,\n }}\n >\n {shortcutLabel}\n </kbd>\n )}\n {isOpen && (\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n onPointerUp={(event) => {\n if (event.button === 0) cancelSearch()\n }}\n onClick={(event) => {\n if (event.detail === 0) cancelSearch()\n }}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"#777777\",\n cursor: \"pointer\",\n width: \"20px\",\n height: \"20px\",\n display: \"grid\",\n placeItems: \"center\",\n padding: 0,\n lineHeight: 1,\n }}\n >\n <CloseIcon size={16} strokeWidth={2} />\n </button>\n )}\n </div>\n {query && (\n <div\n ref={resultsListRef}\n style={{\n maxHeight: \"240px\",\n overflowX: \"hidden\",\n overflowY: \"auto\",\n overscrollBehavior: \"contain\",\n scrollBehavior: \"smooth\",\n touchAction: \"pan-y\",\n WebkitOverflowScrolling: \"touch\",\n }}\n onWheel={(event) => event.stopPropagation()}\n onTouchMove={(event) => event.stopPropagation()}\n >\n {results.length === 0 ? (\n <div\n style={{\n padding: \"12px\",\n color: \"#777777\",\n fontSize: \"13px\",\n }}\n >\n No matching components or nets\n </div>\n ) : (\n <>\n {renderResultSection(\"components\", componentResults)}\n {renderResultSection(\"nets\", netResults)}\n </>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface IconProps {\n size: number\n strokeWidth: number\n}\n\nconst Icon = ({\n children,\n size,\n strokeWidth,\n}: IconProps & { children: ReactNode }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n)\n\nexport const SearchIcon = (props: IconProps) => (\n <Icon {...props}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.34-4.34\" />\n </Icon>\n)\n\nexport const CloseIcon = (props: IconProps) => (\n <Icon {...props}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </Icon>\n)\n\nexport const ComponentIcon = (props: IconProps) => (\n <Icon {...props}>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n <rect x=\"8\" y=\"8\" width=\"8\" height=\"8\" rx=\"1\" />\n <path d=\"M7 2v2M12 2v2M17 2v2M7 20v2M12 20v2M17 20v2M2 7h2M2 12h2M2 17h2M20 7h2M20 12h2M20 17h2\" />\n </Icon>\n)\n\nexport const NetIcon = (props: IconProps) => (\n <Icon {...props}>\n <path d=\"M15 6a9 9 0 0 0-9 9V3\" />\n <circle cx=\"18\" cy=\"6\" r=\"3\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n </Icon>\n)\n\nexport const EnterIcon = (props: IconProps) => (\n <Icon {...props}>\n <path d=\"M20 4v7a4 4 0 0 1-4 4H4\" />\n <path d=\"m9 10-5 5 5 5\" />\n </Icon>\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 display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n maxWidth: \"220px\",\n height: \"32px\",\n boxSizing: \"border-box\",\n padding: \"0 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 }}\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 * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport { su } from \"@tscircuit/soup-util\"\nimport type { CircuitJson } from \"circuit-json\"\nimport { useMemo } from \"react\"\nimport packageJson from \"../../package.json\"\nimport { zIndexMap } from \"../utils/z-index-map\"\n\ninterface ViewMenuProps {\n circuitJson: CircuitJson\n circuitJsonKey: string\n menuRef: React.RefObject<HTMLDivElement | null>\n menuPos: { x: number; y: number }\n onOpenChange: (open: boolean) => void\n showGroups: boolean\n onToggleGroups: (show: boolean) => void\n showGrid: boolean\n onToggleGrid: (show: boolean) => void\n showWarnings: boolean\n onToggleWarnings: (show: boolean) => void\n showPorts: boolean\n onTogglePorts: (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: \"#262626\",\n color: \"#fafafa\",\n borderRadius: 6,\n boxShadow:\n \"0px 12px 48px -12px rgba(0, 0, 0, 0.5), 0px 8px 24px -8px rgba(0, 0, 0, 0.3)\",\n border: \"1px solid #333333\",\n padding: 4,\n minWidth: 208,\n fontSize: 14,\n fontWeight: 400,\n fontFamily: FONT_FAMILY,\n outline: \"none\",\n zIndex: zIndexMap.contextMenu,\n}\n\nconst itemStyles: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"6px 8px\",\n borderRadius: 6,\n cursor: \"default\",\n outline: \"none\",\n userSelect: \"none\",\n color: \"#fafafa\",\n fontSize: 14,\n fontWeight: 400,\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: \"#fafafa\",\n}\n\nconst separatorStyles: React.CSSProperties = {\n height: 1,\n backgroundColor: \"#ffffff1a\",\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: #404040; }\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 menuRef,\n menuPos,\n onOpenChange,\n showGroups,\n onToggleGroups,\n showGrid,\n onToggleGrid,\n showPorts,\n onTogglePorts,\n showWarnings,\n onToggleWarnings,\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 const hasPorts = useMemo(() => {\n if (!circuitJson || circuitJson.length === 0) return false\n\n try {\n return (su(circuitJson).schematic_port?.list() || []).length > 0\n } catch (error) {\n console.error(\"Error checking for schematic ports:\", error)\n return false\n }\n }, [circuitJsonKey])\n\n return (\n <div\n ref={menuRef}\n style={{\n position: \"fixed\",\n left: menuPos.x,\n top: menuPos.y,\n width: 0,\n height: 0,\n }}\n >\n <DropdownMenu.Root open={true} onOpenChange={onOpenChange} modal={false}>\n <DropdownMenu.Trigger asChild>\n <div style={{ position: \"absolute\", width: 1, height: 1 }} />\n </DropdownMenu.Trigger>\n\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n style={contentStyles}\n align=\"start\"\n sideOffset={0}\n collisionPadding={10}\n avoidCollisions={true}\n >\n <style>{HIGHLIGHT_CSS}</style>\n\n <DropdownMenu.Item\n className=\"sv-vm-item\"\n style={itemStyles}\n disabled={!hasPorts}\n title={hasPorts ? undefined : \"No ports found in this schematic\"}\n onSelect={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n event.preventDefault()\n if (hasPorts) onTogglePorts(!showPorts)\n }}\n >\n <span style={iconSlotStyles}>{showPorts && <CheckIcon />}</span>\n <span>Show Schematic Ports</span>\n </DropdownMenu.Item>\n\n <DropdownMenu.Item\n className=\"sv-vm-item\"\n style={itemStyles}\n disabled={!hasGroups}\n title={\n hasGroups ? undefined : \"No groups found in this schematic\"\n }\n onSelect={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n event.preventDefault()\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={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n event.preventDefault()\n onToggleGrid(!showGrid)\n }}\n >\n <span style={iconSlotStyles}>{showGrid && <CheckIcon />}</span>\n <span>Show Grid</span>\n </DropdownMenu.Item>\n\n <DropdownMenu.CheckboxItem\n className=\"sv-vm-item\"\n style={itemStyles}\n checked={showWarnings}\n onCheckedChange={onToggleWarnings}\n onSelect={(event) => event.preventDefault()}\n >\n <span style={iconSlotStyles}>\n <DropdownMenu.ItemIndicator>\n <CheckIcon />\n </DropdownMenu.ItemIndicator>\n </span>\n <span>Show Warnings</span>\n </DropdownMenu.CheckboxItem>\n\n <DropdownMenu.Separator style={separatorStyles} />\n\n <div\n style={{\n padding: \"4px 8px 4px 32px\",\n fontSize: 11,\n opacity: 0.35,\n color: \"#a1a1aa\",\n letterSpacing: \"0.2px\",\n fontFamily: FONT_FAMILY,\n }}\n >\n @tscircuit/schematic-viewer@{String(packageJson?.version)}\n </div>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n )\n}\n","{\n \"name\": \"@tscircuit/schematic-viewer\",\n \"version\": \"2.0.90\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/tscircuit/schematic-viewer\"\n },\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/jsdom\": \"^21.1.7\",\n \"@types/react\": \"^19.0.1\",\n \"@types/react-dom\": \"^19.0.2\",\n \"@vitejs/plugin-react\": \"^4.3.4\",\n \"jsdom\": \"^26.0.0\",\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.2460\",\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 \"@tscircuit/circuit-json-util\": \"^0.0.108\",\n \"circuit-json\": \"^0.0.479\",\n \"circuit-to-svg\": \"^0.0.416\",\n \"debug\": \"^4.4.0\",\n \"fflate\": \"^0.8.3\",\n \"performance-now\": \"^2.1.0\",\n \"use-mouse-matrix-transform\": \"^1.2.2\"\n }\n}\n","import type { CircuitJson } from \"circuit-json\"\nimport {\n type AcSweepView,\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 /** Selects the AC result view. Defaults to magnitude. */\n acSweepView?: AcSweepView\n}\n\nexport const AnalogSimulationViewer = ({\n circuitJson: inputCircuitJson,\n containerStyle,\n colorOverrides,\n width,\n height,\n className,\n hideSchematic = false,\n onSimulationChange,\n acSweepView = \"magnitude\",\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 // 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 ac_sweep_view: acSweepView,\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 acSweepView,\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","su","useEffect","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useMemo","useRef","useState","useEffect","useState","useCallback","useEffect","useRef","useState","useCallback","useEffect","useMemo","useRef","useMemo","jsx","useMemo","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","useEffect","useRef","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","useRef","useEffect","useState","Fragment","jsx","jsxs","useState","DropdownMenu","su","useMemo","jsx","jsxs","FONT_FAMILY","contentStyles","itemStyles","iconSlotStyles","CheckIcon","useMemo","su","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"]}
|