chart = {
const svg = d3.select(DOM.svg(width, height));
svg.append("g")
.attr("transform", `translate(${width - margin.right},0)`)
.call(d3.axisLeft(y)
.ticks(d3.timeFriday)
.tickFormat(d => d.toLocaleString(undefined, {day: "numeric"})))
.call(g => g.select(".domain").remove());
svg.append("g")
.attr("transform", `translate(${margin.left},0)`)
.call(d3.axisRight(y)
.ticks(d3.timeMonth)
.tickSize(width - margin.left - margin.right)
.tickFormat(d => d.toLocaleString(undefined, {month: "long"})))
.call(g => g.select(".domain").remove())
.call(g => g.selectAll(".tick line").attr("stroke", "#ccc"))
.call(g => g.selectAll(".tick text").attr("x", null).attr("dy", "-0.6em"));
svg.append("g")
.selectAll("path")
.data(series)
.join("path")
.attr("fill", d => z(d.sum))
.attr("d", area)
.append("title")
.text(d => d.key);
yield svg.node();
svg.append("g")
.attr("font-size", 10)
.attr("font-family", "sans-serif")
.attr("text-anchor", "middle")
.selectAll("text")
.data(series
.map(d => {
const i = d3.scan(d, (b, a) => (a[1] - a[0]) - (b[1] - b[0]));
return {
key: d.key,
date: data[i].date,
value: d[i][1] - d[i][0],
center: (d[i][0] + d[i][1]) / 2
};
})
.filter(d => d.value > 1e6)
.sort((a, b) => b.value - a.value)
)
.join("text")
.attr("x", d => x(d.center))
.attr("y", d => y(d.date))
.attr("dy", "0.35em")
.text(d => d.key)
.each(labelRemover());
}