La idea en una frase
Cada gráfica recibe props y devuelve SVG. El servidor la renderiza a HTML y el navegador la muestra sin ejecutar ni una línea de JavaScript.
d3 solo hace matemática (escalas, formas, layouts). Nada de d3-selection, ResizeObserver ni ResponsiveContainer: lo responsivo sale de viewBox + w-full h-auto.
Qué no hay
Sin estado interno, sin handlers en el núcleo, sin medición del DOM. Cada forma lleva <title> nativo y data-chart-tip con el mismo texto: sin JS hay tooltip accesible, con JS el portal lo enriquece.
Si no hay datos, se renderiza ChartEmpty homogéneo: nunca SVG roto ni NaN (todo input pasa por toNumber, cartesianos usan domainWithZero).
Cuándo envolver en portal
Solo si quieres tooltip rico con posición y estilos. El portal es el único use client del paquete: delegación de mouseover sobre [data-chart-tip] + createPortal a document.body.
Sin portal la gráfica se ve idéntica; solo pierdes el tooltip flotante.