Simplificando a escrita de classes condicionais do CSS com a biblioteca clsx

Publicado:

A biblioteca clsx facilita a escrita de classes condicionais do CSS e deixa o resultado mais fácil de ler, editar e formatar (pelo Prettier).

Claro que não fica perfeito, afinal muitos condicionais adicionam complexidade a qualquer tipo de código.

Entretanto, o simples fato dessa lib permitir que cada condicional fique em uma linha separada já é uma grande vantagem (aqui - e sempre - eu formatei automaticamente, com o Prettier).

Veja, abaixo, um exemplo de uso real.

Essa lib ainda traz outro benefício que pode parecer pequeno e passar despercebido inicialmente, mas é muito relevante: com ela, não precisamos tomar conta dos espaços em branco que ficam ao redor de cada classe como ao usar template literals.

Por exemplo, um erro que pode acontecer é esse:

<button class={`some-class${shadow ? "other-class" : ""}`}>the button</button>

Faltou um espaço entre some-class e other-class quando a variável shadow é verdadeira. Isso fará com que os estilos não sejam aplicados corretamente.

Nesse caso é fácil de ver, mas isso fica mais complicado à medida que mais condicionais são adicionadas.

ps.: A existências de muitas classes condicionais no mesmo componente podem indicar que aquele componente tá fazendo coisa demais e talvez devesse ser refatorado, mas isso é assunto pra outra postagem.

Exemplos

Note que as classes são as mesmas… eu escrevi os dois botões, começando sem clsx e depois migrando pra lib.

Sem clsx:

<button
  class={`font-bold px-10 py-2 rounded-[10px] hover:bg-opacity-60 ${
    outline ? "btn-outline border-2 border-black" : "bg-[#160033] text-white"
  } ${shadow ? "drop-shadow-md" : ""}`}
>
  {t("startProject")}
</button>

Com clsx:

<button
  class={clsx(
    "font-bold px-10 py-2 rounded-[10px] hover:bg-opacity-60",
    outline ? "btn-outline border-2 border-black" : "bg-[#160033] text-white",
    shadow ? "drop-shadow-md" : ""
  )}
>
  {t("startProject")}
</button>