chart = {
const svg = d3.create("svg")
.attr("class", "chart-container")
.attr("viewBox", [0, 0, width, height])
.attr("font-family", "sans-serif")
.attr("font-size", 10)
.attr("stroke-miterlimit", 1)
.style("padding-top", "20px")
.style("border-radius", "10px")
.style("background", "rgb(44, 44, 44)")
const gradient = DOM.uid();
svg.append("linearGradient")
.attr("id", gradient.id)
.attr("gradientUnits", "userSpaceOnUse")
.attr("x1", 0)
.attr("y1", 0)
.attr("x2", 0)
.attr("y2", height)
.selectAll("stop")
.data([
{offset: 0, color: "steelblue"},
{offset: 1, color: "red"}
])
.join("stop")
.attr("offset", d => d.offset)
.attr("stop-color", d => d.color);
svg.append("g")
.call(xAxis)
.selectAll("text")
.attr("color", "gray")
.attr("font-size", 12);
svg.append("g")
.call(yAxis)
.selectAll("text")
.attr("color", "gray")
.attr("font-size", 18);
svg.append("path")
.attr("fill", "none")
.attr("stroke", gradient)
.attr("stroke-width", 5)
.attr("d", line(data));
if (!mutable lookup) mutable lookup = new Date(data[0].date);
const bar = svg
.append("line")
.attr("stroke", "#ccc")
.attr("stroke-width", 1.5)
.attr("y2", height)
.attr("x1", x(mutable lookup))
.attr("x2", x(mutable lookup));
const legend = svg
.append("text")
.style("font", "30px sans-serif")
.attr("fill", "#ccc")
.attr("x", 10)
.attr("y", 100);
const legendSaldo = svg
.append("text")
.style("font", "30px sans-serif")
.attr("fill", "#ccc")
.attr("x", 10)
.attr("y", 130);
svg.append("line")
.attr("stroke", "gray")
.attr("stroke-width", 5)
.attr("x1", x.range()[0])
.attr("x2", x.range()[1])
.attr("y1", y(model(dateNumScale(x.domain()[0]))))
.attr("y2", y(model(dateNumScale(x.domain()[1]))));
const formatTime = d3.utcFormat("%m/%Y");
function update(date) {
const i = bisect.right(data, date);
if (i < data.length && i > 0) {
legend.attr("x", (i > data.length/2)? x(mutable lookup)-110 : x(mutable lookup))
legendSaldo.attr("x", (i > data.length/2)? x(mutable lookup)-125 : x(mutable lookup))
legend.text(`${formatTime(data[i].date)}`)
legendSaldo.text(`saldo: ${data[i].saldo}`)
}
mutable lookup = new Date(date);
bar.attr("x1", x(mutable lookup)).attr("x2", x(mutable lookup));
}
svg.on("mousemove click touchmove", function() {
const m = d3.mouse(this);
update(x.invert(m[0]));
});
update(mutable lookup);
return svg.node();
}