function hover(svg, path) {
if ("ontouchstart" in document)
svg
.style("-webkit-tap-highlight-color", "transparent")
.on("touchmove", moved)
.on("touchstart", entered)
.on("touchend", left);
else
svg
.on("mousemove", moved)
.on("mouseenter", entered)
.on("mouseleave", left);
const dot = svg.append("g").attr("display", "none");
dot.append("circle").attr("r", 2.5);
dot
.append("text")
.style("font", "10px sans-serif")
.attr("text-anchor", "middle")
.attr("y", -8);
function moved() {
d3.event.preventDefault();
const ym = y.invert(d3.event.layerY + offsetY);
const xm = x.invert(d3.event.layerX + offsetX);
const i1 = d3.bisectLeft(data.dates, xm, 1);
const i0 = i1 - 1;
const i = xm - data.dates[i0] > data.dates[i1] - xm ? i1 : i0;
let filtData = data.series.filter(x => x.values[i] !== undefined);
const s = filtData.reduce((a, b) =>
Math.abs(a.values[i] - ym) < Math.abs(b.values[i] - ym) ? a : b
);
debugger;
path.attr("stroke", d =>
d.name === filter ? "red" : d === s ? "blue" : "#ddd"
);
dot.attr("transform", `translate(${x(data.dates[i])},${y(s.values[i])})`);
dot.select("text").text(s.name);
}
function entered() {
path.style("mix-blend-mode", null).attr("stroke", "#ddd");
dot.attr("display", null);
return "";
}
function left() {
let paths = path._groups[0];
path.attr("stroke", d => (d.name === filter ? "red" : "#ddd"));
dot.attr("display", "none");
}
}