sketch = function () {
var line = d3.line();
let range = 256;
let dim = 25;
let border = { top: 20, bottom: 20, left: 20, right: 20 };
const svg = d3
.create("svg")
.attr("width", dim)
.attr("height", dim)
.attr(
"viewBox",
"0 0 " +
(range + border.left + border.right) +
" " +
(range + border.top + border.bottom)
)
.on("mouseover", (d, i, o) => {
const transition_t_w = 2;
const transition_d_w = 10;
svg
.selectAll("path")
.attr("stroke-dasharray", (d, i, o) => {
let path_len = o[i].getTotalLength();
return path_len + " " + path_len;
})
.attr("stroke-dashoffset", (d, i, o) => {
let path_len = o[i].getTotalLength();
return path_len;
})
.call((paths) =>
paths
.transition()
.delay((d, i, nl) => {
let o = Array.from(nl);
let val = o
.slice(0, i)
.reduce((prev, cur) => prev + cur.getTotalLength(), 0);
return val * transition_t_w + transition_d_w * (i - 1);
})
.duration((d, i, o) => o[i].getTotalLength() * transition_t_w)
.attr("stroke-dashoffset", 0)
.end()
.then((d, i, o) => {
console.log("Transition Over");
})
);
});
let paths = svg.selectAll("path");
return Object.assign(svg.node(), {
update(data) {
paths = paths
.data(data.drawing, (d) => d.key_id)
.join(
(enter) =>
enter
.append("path")
.attr("transform", `translate(${border.left} ${border.top})`)
.attr("d", (d, i) => line(d[0].map((_, i) => [d[0][i], d[1][i]])))
.attr("fill", "none")
.attr("stroke", "black")
.attr("stroke-width", "10px")
.attr("stroke-dasharray", (d, i, o) => {
let path_len = o[i].getTotalLength();
return path_len + " " + path_len;
})
.attr("stroke-dashoffset", (d, i, o) => {
let path_len = o[i].getTotalLength();
return path_len;
}),
(update) =>
update
.attr("d", (d, i) => line(d[0].map((_, i) => [d[0][i], d[1][i]])))
.attr("stroke-dasharray", (d, i, o) => {
let path_len = o[i].getTotalLength();
return path_len + " " + path_len;
})
.attr("stroke-dashoffset", (d, i, o) => {
let path_len = o[i].getTotalLength();
return path_len;
}),
(exit) => exit.remove()
)
.call((paths) =>
paths
.transition()
.delay((d, i, o) => {
let val = o
.slice(0, i)
.reduce((prev, cur) => prev + cur.getTotalLength(), 0);
return val * transition_t + transition_d * (i - 1);
})
.duration((d, i, o) => o[i].getTotalLength() * transition_t)
.attr("stroke-dashoffset", 0)
.end()
.then((d, i, o) => {
console.log("Transition Over");
})
);
}
});
}