diff --git a/modules/rfunds/components/folk-funds-app.ts b/modules/rfunds/components/folk-funds-app.ts index 7b38d1b..0ba70a8 100644 --- a/modules/rfunds/components/folk-funds-app.ts +++ b/modules/rfunds/components/folk-funds-app.ts @@ -591,6 +591,7 @@ class FolkFundsApp extends HTMLElement { +
`; } @@ -816,7 +817,33 @@ class FolkFundsApp extends HTMLElement { const group = (e.target as Element).closest(".flow-node") as SVGGElement | null; if (!group) return; const nodeId = group.dataset.nodeId; - if (nodeId) this.openEditor(nodeId); + if (!nodeId) return; + const node = this.nodes.find((n) => n.id === nodeId); + if (!node) return; + if (node.type === "outcome") this.openOutcomeModal(nodeId); + else if (node.type === "source") this.openSourceModal(nodeId); + else this.openEditor(nodeId); + }); + + // Hover: tooltip + edge highlighting + let hoveredNodeId: string | null = null; + nodeLayer.addEventListener("mouseover", (e: MouseEvent) => { + const group = (e.target as Element).closest(".flow-node") as SVGGElement | null; + if (!group) return; + const nodeId = group.dataset.nodeId; + if (nodeId && nodeId !== hoveredNodeId) { + hoveredNodeId = nodeId; + this.showNodeTooltip(nodeId, e); + this.highlightNodeEdges(nodeId); + } + }); + nodeLayer.addEventListener("mouseout", (e: MouseEvent) => { + const related = (e.relatedTarget as Element | null)?.closest?.(".flow-node"); + if (!related) { + hoveredNodeId = null; + this.hideNodeTooltip(); + this.unhighlightEdges(); + } }); } @@ -858,6 +885,7 @@ class FolkFundsApp extends HTMLElement { if (e.key === "Escape") { if (this.wiringActive) { this.cancelWiring(); return; } + this.closeModal(); this.closeEditor(); } else if (e.key === " ") { e.preventDefault(); this.toggleSimulation(); } @@ -937,7 +965,7 @@ class FolkFundsApp extends HTMLElement {