function svgScaffold(conf) {
const colorScale = colorScaleFactory(data);
const yScale = yScaleFactory(data, conf);
const range = colorScale.range();
const radius = verticalRhythm / 3;
return svg`
<svg width="${conf.w}px" height="${conf.h}px" viewBox="0 0 ${conf.w} ${
conf.h
}" style="background-color: #ffffff; font-family: ${font}; font-size: ${fontSize}; font-variant-numeric: tabular-nums; shape-rendering: crispEdges">
<defs>
<linearGradient id="stringencyGrad">
${gradientStops.map(
stop =>
svg`<stop offset="${stop}%" stop-color="${colorScale(
gradientPositionScale(100 - stop)
)}" />`
)}
</linearGradient>
</defs>
<g id="legend" fill="${textColor}">
<text x="0" y="12">${colorScale.domain()[1]}%</text>
<g transform="translate(40)">
<rect width="${6 * verticalRhythm}" height="14" fill="url('#stringencyGrad')" />
</g>
<text x="165" y="12">${colorScale.domain()[0]}%</text>
<g transform="translate(200)" shape-rendering="geometricPrecision">
<circle transform="translate(${radius} ${14 -
radius})" fill="${colorScale.unknown()}" r="${radius}" />
<text x="${radius * 2 + 5}" y="12">keine Angaben</text>
</g>
</g>
<g id="end-values" fill="#6e6e7e">
${countryList.map(country => {
const val = data.find(
el => el[yDatumName] === country && mostCurrentDate - el[xDatumName] === 0
)[valueName];
return svg`
<text text-anchor="end" x="${conf.w}" y="${yScale(country) +
yScale.bandwidth() -
2}">${formatVeryRound(val)}%</text>
`;
})}
</g>
</svg>`;
}