function labels(svg) {
let label = svg
.append("g")
.style("font", "bold 12px var(--sans-serif)")
.style("font-variant-numeric", "tabular-nums")
.attr("text-anchor", "end")
.selectAll("text");
return ([date, data], transition) =>
(label = label
.data(data.slice(0, n), (d) => d.name)
.join(
(enter) =>
enter
.append("text")
.attr(
"transform",
(d) =>
`translate(${x((prev.get(d) || d).value)},${y(
(prev.get(d) || d).rank
)})`
)
.attr("y", y.bandwidth() / 2)
.attr("x", -6)
.attr("dy", "-0.25em")
.text((d) => d.name)
.call((text) =>
text
.append("tspan")
.attr("fill-opacity", 0.7)
.attr("font-weight", "normal")
.attr("x", -6)
.attr("dy", "1.15em")
),
(update) => update,
(exit) =>
exit
.transition(transition)
.remove()
.attr(
"transform",
(d) =>
`translate(${x((next.get(d) || d).value)},${y(
(next.get(d) || d).rank
)})`
)
.call(
(g) =>
g.select("tspan").textTween((d) => {
const i = d3.interpolateNumber(
d.value,
(next.get(d) || d).value
);
return function (t) {
return formatNumber(i(t));
};
})
)
)
.call((bar) =>
bar
.transition(transition)
.attr("transform", (d) => `translate(${x(d.value)},${y(d.rank)})`)
.call(
(g) =>
g.select("tspan").textTween((d) => {
const i = d3.interpolateNumber(
(prev.get(d) || d).value,
d.value
);
return function (t) {
return formatNumber(i(t));
};
})
)
));
}