Pular para o conteúdo

Utilitários de classes

Criar atributos class em templates significa combinar strings, alternar classes conforme condições e impedir que utilitários posteriores entrem em conflito com os anteriores (p-2 e p-4 não devem coexistir). Em JavaScript, esse trabalho é dividido entre clsx e tailwind-merge. TailwindPHP inclui PHP implementações de ambos, para que você tenha o mesmo comportamento sem cadeia de ferramentas Node.js e sem pacotes Composer adicionais.

Três funções cobrem todos os casos: cn() cria e resolve conflitos, merge() apenas resolve conflitos e join() apenas concatena.

cn()

O utilitário recomendado. Primeiro, executa a criação condicional no estilo clsx e, em seguida, resolve conflitos Tailwind com tailwind-merge — assim, o último utilitário conflitante prevalece.

PHP
use function TailwindPHP\cn;

// Conflicts are resolved — px-4 overrides px-2
cn('px-2 py-1', 'px-4');
// => 'py-1 px-4'

// Conditional classes via a key => bool array
cn('btn', ['btn-primary' => true, 'btn-disabled' => false]);
// => 'btn btn-primary'

Argumentos aceitos

cn() aceita qualquer número de argumentos. Cada um é nivelado e filtrado seguindo a semântica de clsx:

Argumento Comportamento
string Adicionado como está.
int / float Convertidos em strings e adicionados.
Array sequencial Cada elemento é processado recursivamente.
Array key => bool Cada chave é adicionada quando seu valor é verdadeiro.
null, false, 0, '' Ignorados.
PHP
cn('flex', ['items-center' => true], ['p-4', ['gap-2']], null);
// => 'flex items-center p-4 gap-2'

Padrão de componente

cn() permite sobrescrever um componente: combine as classes do próprio componente com as fornecidas por quem o chama, e os conflitos serão resolvidos a favor de quem o chama.

PHP
use function TailwindPHP\cn;

function Card(array $props = []): string {
    $class = cn(
        'rounded-lg border bg-card text-card-foreground shadow-sm',
        $props['class'] ?? null
    );
    return "<div class=\"{$class}\">" . ($props['children'] ?? '') . "</div>";
}

Card(['class' => 'p-6', 'children' => 'Content']);
// <div class="rounded-lg border bg-card text-card-foreground shadow-sm p-6">Content</div>

Para estilos declarativos de componentes com múltiplos eixos, combine cn() com variants().

merge()

Apenas resolução de conflitos — sem criação condicional. Passe strings de classe; as classes posteriores sobrescrevem as anteriores quando visam a mesma propriedade. Use quando sua entrada já consistir em strings simples.

PHP
use function TailwindPHP\merge;

merge('px-2 py-1 bg-red-500', 'px-4 bg-blue-500');
// => 'py-1 px-4 bg-blue-500'

// Conflict resolution is variant-aware
merge('hover:bg-red-500', 'hover:bg-blue-500');
// => 'hover:bg-blue-500'

cn() é merge() construído sobre clsx; portanto, use merge() diretamente apenas quando não precisar da sintaxe condicional de arrays.

join()

Concatenação simples, sem resolução de conflitos. Valores falsos são descartados, mas todos os utilitários conflitantes são mantidos. Use quando souber que não há conflitos e quiser a opção mais econômica.

PHP
use function TailwindPHP\join;

join('foo', 'bar', null, 'baz');
// => 'foo bar baz'

Qual devo usar?

Função Cria (condições, arrays) Resolve conflitos Use quando
cn() sim sim Opção padrão — ao criar strings de classe que podem entrar em conflito.
merge() não sim A entrada consiste em strings simples; você só precisa resolver conflitos.
join() sim não Você sabe que não há conflitos e quer fazer o mínimo possível.

Importações

PHP
use function TailwindPHP\cn;
use function TailwindPHP\merge;
use function TailwindPHP\join;

As três ficam no namespace principal TailwindPHP e são incluídas no pacote. São implementações PHP de clsx (de Luke Edwards) e tailwind-merge (de Dany Castillo).