diff --git a/admin.html b/admin.html index fe5db7f..57b1964 100644 --- a/admin.html +++ b/admin.html @@ -1560,11 +1560,15 @@ function renderIntelGraph() { .attr('fill', d => SECTOR_COLOR[d.sector] || '#888') .attr('stroke', 'transparent') .attr('stroke-width', 2) - .on('mouseenter', function () { - d3.select(this).attr('stroke', 'rgba(255,255,255,0.85)'); + .on('mouseenter', function (ev, d) { + if (d.id !== graphSelectedId) { + d3.select(this).attr('stroke', 'rgba(255,255,255,0.6)'); + } }) - .on('mouseleave', function () { - d3.select(this).attr('stroke', 'transparent'); + .on('mouseleave', function (ev, d) { + if (d.id !== graphSelectedId) { + d3.select(this).attr('stroke', 'transparent'); + } }) .on('click', (ev, d) => { ev.stopPropagation(); @@ -1599,6 +1603,8 @@ function renderIntelGraph() { .force('link', d3.forceLink(edgesCopy).id(d => d.id).distance(80)) .force('charge', d3.forceManyBody().strength(-300)) .force('center', d3.forceCenter(width / 2, height / 2)) + .force('x', d3.forceX(width / 2).strength(0.07)) + .force('y', d3.forceY(height / 2).strength(0.07)) .force('collide', d3.forceCollide(d => graphNodeRadius(d) + 4)); sim.on('tick', () => { @@ -1665,6 +1671,10 @@ function applyGraphFilters() { .style('display', d => visibleIds.has(d.id) ? null : 'none') .style('opacity', d => (lit && !lit.has(d.id)) ? 0.15 : 1); + nodeSel.select('circle') + .attr('stroke', d => d.id === graphSelectedId ? '#ffffff' : 'transparent') + .attr('stroke-width', d => d.id === graphSelectedId ? 2.5 : 2); + linkSel .style('display', e => { if (filter !== 'all' && e.type !== filter) return 'none';