function interactiveRender(x, y) {
return (index, scales, values, dimensions, context, next) => {
const g = next(index, scales, values, dimensions, context);
const line = d3.select(g).append("line");
const circle = d3.select(g).append("circle").attr("r", 3);
d3.select(context.ownerSVGElement)
.style("pointer-events", "all")
.on(
"pointerout",
(event) =>
event.target === context.ownerSVGElement &&
(line.style("stroke", "none"), circle.style("fill", "none"))
)
.on("pointermove", (event) => {
const [x0, y0] = d3.pointer(event);
const u = scales.x.invert(x0);
const v = scales.y.invert(y0);
const { t } = segmentProject(x[0], y[0], x[1], y[1], u, v);
circle.style("fill", "white").attr("cx", x0).attr("cy", y0);
line
.style("stroke", "white")
.attr("x1", x0)
.attr("y1", y0)
.attr("x2", scales.x(t * x[0] + (1 - t) * x[1]))
.attr("y2", scales.y(t * y[0] + (1 - t) * y[1]));
});
return g;
};
}