|
|
@@ -39,7 +39,9 @@ function HorizontalTreeNode({ node, onSelect, selectedId, level, highlightLeafNa
|
|
|
const inHighlight = nodeHasHighlightedLeaf(node, highlightLeafNames);
|
|
|
const isLeafHighlighted = highlightLeafNames && highlightLeafNames.has(node.name);
|
|
|
const isInSubtreeHighlight = subtreeHighlightNodeIds?.has(String(node.id)) ?? false;
|
|
|
+ const isSourceNode = sourceNodeIds?.has(String(node.id)) ?? false;
|
|
|
const isPatternNode = patternNodeIds?.has(String(node.id)) ?? false;
|
|
|
+ const isAssociatedNode = isSourceNode || isPatternNode;
|
|
|
const isSelected =
|
|
|
selectedId !== null &&
|
|
|
selectedId !== undefined &&
|
|
|
@@ -68,7 +70,7 @@ function HorizontalTreeNode({ node, onSelect, selectedId, level, highlightLeafNa
|
|
|
"flex items-center px-3 py-1.5 rounded-md border shadow-[0_1px_2px_rgba(0,0,0,0.05)] cursor-pointer whitespace-nowrap transition-all z-10 h-[34px] bg-white border-slate-200",
|
|
|
isSelected
|
|
|
? "ring-2 ring-orange-400 ring-offset-2 border-orange-400 shadow-[0_0_0_2px_rgba(251,146,60,0.16)]"
|
|
|
- : isPatternNode
|
|
|
+ : isAssociatedNode
|
|
|
? "ring-2 ring-sky-400 ring-offset-1 border-sky-300 shadow-[0_0_0_2px_rgba(56,189,248,0.16)]"
|
|
|
: isInSubtreeHighlight
|
|
|
? "border-sky-300 border-dashed bg-white shadow-none"
|
|
|
@@ -84,29 +86,29 @@ function HorizontalTreeNode({ node, onSelect, selectedId, level, highlightLeafNa
|
|
|
</div>
|
|
|
<div className="relative flex items-center gap-2 ml-2">
|
|
|
<span
|
|
|
- onMouseEnter={(e) => metrics.patternCount > 0 && setHoveredMetric({ key: 'pattern', count: metrics.patternCount, colorClass: 'bg-amber-500 border-amber-500 text-white', x: e.currentTarget.getBoundingClientRect().left + e.currentTarget.getBoundingClientRect().width / 2, y: e.currentTarget.getBoundingClientRect().top - 8 })}
|
|
|
+ onMouseEnter={(e) => metrics.patternCount > 0 && setHoveredMetric({ key: 'pattern', count: metrics.patternCount, colorClass: 'bg-blue-500 border-blue-500 text-white', x: e.currentTarget.getBoundingClientRect().left + e.currentTarget.getBoundingClientRect().width / 2, y: e.currentTarget.getBoundingClientRect().top - 8 })}
|
|
|
onMouseLeave={() => setHoveredMetric((prev) => (prev?.key === 'pattern' ? null : prev))}
|
|
|
- className={cn("w-2.5 h-2.5 rounded-full", metrics.patternCount > 0 ? "bg-amber-500 opacity-100" : "opacity-0")}
|
|
|
+ className={cn("w-2.5 h-2.5 rounded-full", metrics.patternCount > 0 ? "bg-blue-500 opacity-100" : "opacity-0")}
|
|
|
/>
|
|
|
<span
|
|
|
- onMouseEnter={(e) => metrics.reqCount > 0 && setHoveredMetric({ key: 'req', count: metrics.reqCount, colorClass: 'bg-indigo-500 border-indigo-500 text-white', x: e.currentTarget.getBoundingClientRect().left + e.currentTarget.getBoundingClientRect().width / 2, y: e.currentTarget.getBoundingClientRect().top - 8 })}
|
|
|
+ onMouseEnter={(e) => metrics.reqCount > 0 && setHoveredMetric({ key: 'req', count: metrics.reqCount, colorClass: 'bg-cyan-500 border-cyan-500 text-white', x: e.currentTarget.getBoundingClientRect().left + e.currentTarget.getBoundingClientRect().width / 2, y: e.currentTarget.getBoundingClientRect().top - 8 })}
|
|
|
onMouseLeave={() => setHoveredMetric((prev) => (prev?.key === 'req' ? null : prev))}
|
|
|
- className={cn("w-2.5 h-2.5 rounded-full", metrics.reqCount > 0 ? "bg-indigo-500" : "opacity-0")}
|
|
|
+ className={cn("w-2.5 h-2.5 rounded-full", metrics.reqCount > 0 ? "bg-cyan-500" : "opacity-0")}
|
|
|
/>
|
|
|
<span
|
|
|
- onMouseEnter={(e) => metrics.procCount > 0 && setHoveredMetric({ key: 'proc', count: metrics.procCount, colorClass: 'bg-purple-500 border-purple-500 text-white', x: e.currentTarget.getBoundingClientRect().left + e.currentTarget.getBoundingClientRect().width / 2, y: e.currentTarget.getBoundingClientRect().top - 8 })}
|
|
|
+ onMouseEnter={(e) => metrics.procCount > 0 && setHoveredMetric({ key: 'proc', count: metrics.procCount, colorClass: 'bg-green-500 border-green-500 text-white', x: e.currentTarget.getBoundingClientRect().left + e.currentTarget.getBoundingClientRect().width / 2, y: e.currentTarget.getBoundingClientRect().top - 8 })}
|
|
|
onMouseLeave={() => setHoveredMetric((prev) => (prev?.key === 'proc' ? null : prev))}
|
|
|
- className={cn("w-2.5 h-2.5 rounded-full", metrics.procCount > 0 ? "bg-purple-500" : "opacity-0")}
|
|
|
+ className={cn("w-2.5 h-2.5 rounded-full", metrics.procCount > 0 ? "bg-green-500" : "opacity-0")}
|
|
|
/>
|
|
|
<span
|
|
|
- onMouseEnter={(e) => metrics.capCount > 0 && setHoveredMetric({ key: 'cap', count: metrics.capCount, colorClass: 'bg-rose-500 border-rose-500 text-white', x: e.currentTarget.getBoundingClientRect().left + e.currentTarget.getBoundingClientRect().width / 2, y: e.currentTarget.getBoundingClientRect().top - 8 })}
|
|
|
+ onMouseEnter={(e) => metrics.capCount > 0 && setHoveredMetric({ key: 'cap', count: metrics.capCount, colorClass: 'bg-amber-400 border-amber-400 text-white', x: e.currentTarget.getBoundingClientRect().left + e.currentTarget.getBoundingClientRect().width / 2, y: e.currentTarget.getBoundingClientRect().top - 8 })}
|
|
|
onMouseLeave={() => setHoveredMetric((prev) => (prev?.key === 'cap' ? null : prev))}
|
|
|
- className={cn("w-2.5 h-2.5 rounded-full", metrics.capCount > 0 ? "bg-rose-500" : "opacity-0")}
|
|
|
+ className={cn("w-2.5 h-2.5 rounded-full", metrics.capCount > 0 ? "bg-amber-400" : "opacity-0")}
|
|
|
/>
|
|
|
<span
|
|
|
- onMouseEnter={(e) => metrics.toolCount > 0 && setHoveredMetric({ key: 'tool', count: metrics.toolCount, colorClass: 'bg-green-500 border-green-500 text-white', x: e.currentTarget.getBoundingClientRect().left + e.currentTarget.getBoundingClientRect().width / 2, y: e.currentTarget.getBoundingClientRect().top - 8 })}
|
|
|
+ onMouseEnter={(e) => metrics.toolCount > 0 && setHoveredMetric({ key: 'tool', count: metrics.toolCount, colorClass: 'bg-orange-500 border-orange-500 text-white', x: e.currentTarget.getBoundingClientRect().left + e.currentTarget.getBoundingClientRect().width / 2, y: e.currentTarget.getBoundingClientRect().top - 8 })}
|
|
|
onMouseLeave={() => setHoveredMetric((prev) => (prev?.key === 'tool' ? null : prev))}
|
|
|
- className={cn("w-2.5 h-2.5 rounded-full", metrics.toolCount > 0 ? "bg-green-500" : "opacity-0")}
|
|
|
+ className={cn("w-2.5 h-2.5 rounded-full", metrics.toolCount > 0 ? "bg-orange-500" : "opacity-0")}
|
|
|
/>
|
|
|
</div>
|
|
|
|