chart = html`${style}
<svg class="covid" width="${width}" height="${height}">
<defs>
<clipPath id="${clip.id}">
<path d="
M ${x.range()[0]} ${y.range()[0]}
H ${x.range()[1]}
V ${y.range()[1]}
H ${x.range()[0]} Z
" />
</clipArea>
</defs>
<g transform="translate(${x.range()[0]}, ${y(threshold)})">
<text dy="1em" style="text-transform: uppercase; fill: gray;">
Days since ${threshold} cases
</text>
<path
d="M 0 0 H ${x.range()[1]}"
stroke="gray"
/>
</g>
<g style="text-transform: uppercase; fill: gray;">
<text x="${x.range()[0]}" y="${y.range()[1]}">Doubles every…</text>
${curves.map(
({ x0, T, data }) => svg`<g>
<path
d="${lineTrunc(data)}"
stroke-dasharray="2,2"
stroke="gray"
clip-path="${clip}"
/>
<text
x="${x(expSolveForX(x0, T)(y.domain()[1]))}"
y="${y.range()[1]}"
text-anchor="middle"
>
${T} days
</text>
</g>`
)}
</g>
<g clip-path="${clip}">
${series.filter(hasOffset).map(
({ key, latest, color, data, highlight, offset }) => svg`<g
opacity="${highlight ? 1 : .1}"
transform="translate(${-(x(offset) - x(0))}, 0)"
>
<path
d="${line(data.map(d => [d.i, d.value]))}"
stroke="white"
stroke-width="4"
/>
<path
d="${line(data.map(d => [d.i, d.value]))}"
stroke="${color}"
stroke-width="1.5"
/>
<text
x="${x(data.length - 1)}"
y="${y(latest)}"
fill="${color}"
dx=".2em"
dy=".3em"
font-weight="bold"
>
${key}
</text>
</g>`
)}
</g>
</svg>`