diff --git a/lib/components/SchematicViewer.tsx b/lib/components/SchematicViewer.tsx index ab4fd20..bdcf845 100644 --- a/lib/components/SchematicViewer.tsx +++ b/lib/components/SchematicViewer.tsx @@ -289,6 +289,38 @@ export const SchematicViewer = ({ return match?.[1] ?? "transparent" }, [svgString]) + const traceHoverStyles = useMemo(() => { + if (!svgString) return "" + + const keys = Array.from( + new Set( + Array.from( + svgString.matchAll(/data-subcircuit-connectivity-map-key="([^"]+)"/g), + ).map((match) => match[1]), + ), + ) + + const escapeAttr = (value: string) => + value.replaceAll("\\", "\\\\").replaceAll('"', '\\"') + + const rules = [ + `svg g.trace:hover, svg g.trace-overlays:hover { filter: none !important; }`, + `svg g.trace:hover path, svg g.trace-overlays:hover path { stroke: #60a5fa !important; }`, + `svg g.trace:hover .trace-crossing-outline, svg g.trace-overlays:hover .trace-crossing-outline { opacity: 0 !important; }`, + ] + + for (const key of keys) { + const k = escapeAttr(key) + rules.push( + `svg:has(g.trace[data-subcircuit-connectivity-map-key="${k}"]:hover) g.trace[data-subcircuit-connectivity-map-key="${k}"], svg:has(g.trace-overlays[data-subcircuit-connectivity-map-key="${k}"]:hover) g.trace-overlays[data-subcircuit-connectivity-map-key="${k}"] { filter: none !important; }`, + `svg:has(g.trace[data-subcircuit-connectivity-map-key="${k}"]:hover) g.trace[data-subcircuit-connectivity-map-key="${k}"] path, svg:has(g.trace-overlays[data-subcircuit-connectivity-map-key="${k}"]:hover) g.trace-overlays[data-subcircuit-connectivity-map-key="${k}"] path { stroke: #60a5fa !important; }`, + `svg:has(g.trace[data-subcircuit-connectivity-map-key="${k}"]:hover) g.trace-overlays[data-subcircuit-connectivity-map-key="${k}"] .trace-crossing-outline, svg:has(g.trace-overlays[data-subcircuit-connectivity-map-key="${k}"]:hover) g.trace-overlays[data-subcircuit-connectivity-map-key="${k}"] .trace-crossing-outline { opacity: 0 !important; }`, + ) + } + + return rules.join("\n") + }, [svgString]) + const realToSvgProjection = useMemo(() => { if (!svgString) return identity() const transformString = svgString.match( @@ -542,6 +574,7 @@ export const SchematicViewer = ({ hasRun={hasSpiceSimRun} /> )} + {traceHoverStyles && } {onSchematicComponentClicked && schematicComponentIds.map((componentId) => (