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);
const dotTextDate = dot.append("text")
.attr("font-family", "sans-serif")
.attr("font-size", 18)
.attr("text-anchor", "middle")
.attr("y", -8);
const dotTextValue = dot.append("text")
.attr("font-family", "sans-serif")
.attr("font-size", 18)
.attr("text-anchor", "middle")
.attr("y", 8);
function moved() {
d3.event.preventDefault();
const mouse = d3.mouse(this);
const xm = x.invert(mouse[0]);
const ym = y.invert(mouse[1]);
const i1 = d3.bisectLeft(data.dates, xm, 1);
const i0 = i1 - 1;
const i = xm - data.dates[i0] > data.dates[i1] - xm ? i1 : i0;
const s = d3.least(data.series, d => Math.abs(d.values[i] - ym));
path.attr("stroke", d => d === s ? null : "#ddd").filter(d => d === s).raise();
dot.attr("transform", `translate(${x(data.dates[i])},${y(s.values[i])})`);
dotTextDate
.text(`${formatTime(data.dates[i])}`);
dotTextValue
.text(`${s.values[i]}%`)
d3.select("#mobility-title").text(s.type);
}
function entered() {
path.style("mix-blend-mode", null).attr("stroke", "#ddd");
dot.attr("display", null);
}
function left() {
path.style("mix-blend-mode", "multiply").attr("stroke", null);
dot.attr("display", "none");
d3.select("#mobility-title").text("");
}
}