¡Hola!

Recientemente cambié mi flujo de trabajo para trabajar con la web, y para mostrar los detalles, quería insertar un gráfico. Estaba utilizando Excalidraw, y la ventaja es que puedes exportarlo como SVG? .

Limitaciones encontradas 🚧

Al intentar importar el SVG directamente en el contenido de la entrada, me encontré con ciertos problemas. Más que problemas, eran limitaciones como las siguientes:

  • La necesidad de definir un fondo.
  • Limitado a un único perfil de color. No se puede tener uno para el modo claro y otro para el modo oscuro.
  • No se pueden modificar los estilos, ya que se insertaba como una etiqueta <img>, que no admite estilos heredados (información útil disponible aquí).

Creando el shortcode 🥾

Con la información del último punto en la sección anterior, podemos crear nuestro propio shortcode. Así que decidí aplicar eso y extender un poco más el comportamiento. Aquí tienes un ejemplo utilizando el siguiente fragmento:

{{< svg "static/images/blog/004/example.svg" >}}

La primera limitación que veo en mi implementación es el ancho, que en este ejemplo se ve claramente enorme y no es necesario, así que necesito hacer que el ancho sea un parámetro opcional.

Pasamos de este shortcode que no permitía establecer el ancho (estaba predefinido como 100% en los estilos):

{{$svg := .Get 0}}
<div class="svg-fill-background">
    {{ $svg | readFile | safeHTML }}
</div>

Al siguiente, donde sí podemos indicar opcionalmente el porcentaje de ancho, y el cambio se puede ver a continuación (podríamos extender esto a más propiedades, pero no es necesario por ahora):

{{$svg := .Get 0}}
{{$width := .Get 1 | default "100%"}}

<div class="svg-fill-background" style="width: {{$width}}; margin: 0 auto">
    {{ $svg | readFile | safeHTML }}
</div>
{{< svg "static/images/blog/004/example.svg" "40%">}}

Modo claro y modo oscuro 🌗

Si cambias la web entre los dos modos, puedes ver cómo el gráfico cambia de color. En realidad, funciona siendo un único gráfico SVG que se colorea con CSS? .

body .svg-fill-background svg {
    background: var(--code-bg);
    max-width: 100%;
    height: 100%;

    path {
        stroke: var(--primary)
    }

    text {
        fill: var(--content)
    }
}

Podeis revisar como han quedado al final los cambios en la PR que preparé en el repositorio de mi Github.

¡Salud!