SSR
glyphflow renderiza en servidor sin window ni document reales. El icono llega pintado en el HTML; la animación arranca cuando el navegador hidrata.
Qué pasa en cada lado
| Momento | Qué se ve |
|---|---|
| Render de servidor | El <svg> completo, con su geometría y su aria-hidden. Sin animación: no hay WAAPI en Node. |
| Después de hidratar | El mismo SVG, ya vivo. El trigger empieza a funcionar. |
No necesitas configurar nada
Ni afterNextRender, ni un guard de isPlatformBrowser, ni importar el componente de forma diferida. Funciona con la config de SSR que ya tengas.
Cómo se verifica
Con un smoke test que corre en Node genuino, no en jsdom — y eso es el punto: jsdom define window, así que un test ahí no probaría nada. El script arranca fallando a propósito si detecta window:
if (typeof window !== 'undefined') {
throw new Error(
'This smoke test must run without a global `window` — if it exists, it proves nothing.',
);
}Luego renderiza con renderApplication de @angular/platform-server y exige dos cosas del HTML resultante: que haya un <svg>, y que traiga el aria-hidden="true" del icono decorativo. Corre en CI en cada commit (npm run test:ssr).
La segunda comprobación no es de adorno. Un render que "no truena" pero devuelve HTML vacío pasa cualquier prueba que solo mire si hubo excepción — por eso el test afirma sobre el contenido, no sobre la ausencia de error.
Morph en servidor
<gf-icon-morph> cae por el mismo camino que el primer render del cliente: pinta el icono estático. Morphear "desde nada" no existe, y en el servidor tampoco hay un valor anterior del cual salir. Se ve el icono correcto; la transición espera al navegador.