canvas = {
const context = DOM.context2d(width, height);
context.canvas.style = "width: 100%; height: auto;";
return Object.assign(context.canvas, {
update(mouse) {
let {left: cx, top: cy} = context.canvas.getBoundingClientRect();
let {x: mx, y: my} = mouse;
mx -= cx;
my -= cy;
context.clearRect(0, 0, width, height);
for (let i = 0, n = circles.length; i < n; ++i) {
const {x, y, r} = circles[i];
context.save();
context.translate(x, y);
context.beginPath();
context.arc(0, 0, r, 0, 2 * Math.PI);
context.fillStyle = d3.schemePastel2[i % 8];
context.fill();
const dx = mx - x, dy = my - y, l = Math.sqrt(dx ** 2 + dy ** 2);
context.beginPath();
if (l < r * 2 / 3) context.arc(dx, dy, r / 3, 0, 2 * Math.PI);
else context.arc(dx / l * r * 2 / 3, dy / l * r * 2 / 3, r / 3, 0, 2 * Math.PI);
context.fillStyle = "#333";
context.fill();
context.restore();
}
}
});
}