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

MomentoQué se ve
Render de servidorEl <svg> completo, con su geometría y su aria-hidden. Sin animación: no hay WAAPI en Node.
Después de hidratarEl 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.