Pular para o conteúdo

Variants

variants() é uma implementação PHP de CVA (Class Variance Authority). Ela transforma uma configuração declarativa — uma base, eixos de variantes nomeados e valores padrão — em uma função que mapeia propriedades para uma string de classe. Use quando um componente tiver dimensões de estilo, como tamanho e intenção, que se combinam.

PHP
use function TailwindPHP\variants;

$button = variants([
    'base' => 'btn font-semibold border rounded',
    'variants' => [
        'intent' => [
            'primary'   => 'bg-blue-500 text-white',
            'secondary' => 'bg-gray-200 text-gray-800',
        ],
        'size' => [
            'sm' => 'text-sm px-2 py-1',
            'md' => 'text-base px-4 py-2',
        ],
    ],
    'defaultVariants' => [
        'intent' => 'primary',
        'size'   => 'md',
    ],
]);

$button();
// => 'btn font-semibold border rounded bg-blue-500 text-white text-base px-4 py-2'

variants() retorna um callable; chame-o com um array de propriedades (ou sem argumentos) para obter a string resolvida.

Configuração

Chave Tipo Finalidade
base string Classes aplicadas a todas as saídas.
variants array Eixos nomeados, cada um mapeando nomes de valores para strings de classe.
compoundVariants array Strings de classe aplicadas apenas quando vários valores de variantes se combinam.
defaultVariants array Valor por eixo usado quando uma propriedade é omitida.

Todas as chaves são opcionais. Sem variants, o resultado retorna base e quaisquer classes personalizadas:

PHP
$x = variants(['base' => 'box']);
$x();                          // => 'box'
$x(['class' => 'p-4']);        // => 'box p-4'

Um valor de variante pode ser mapeado para null para não acrescentar nada — útil como opção explícita de “não definido” em um eixo.

Chamando o resultado

Passe um único array de propriedades, no estilo CVA. As chaves correspondem aos nomes dos eixos de variantes; os eixos omitidos usam defaultVariants como valor padrão.

PHP
$button(['intent' => 'secondary']);
// => 'btn font-semibold border rounded bg-gray-200 text-gray-800 text-base px-4 py-2'

$button(['size' => 'sm', 'class' => 'mt-4']);
// => 'btn font-semibold border rounded bg-blue-500 text-white text-sm px-2 py-1 mt-4'

A chave class (e seu alias className) é acrescentada ao final da saída. Acrescentar por si só não resolve conflitos — veja abaixo o padrão de componente.

compoundVariants

Cada entrada em compoundVariants é um array de condições de variantes mais um class (ou className) de classes adicionais. As classes só se aplicam quando todas as condições correspondem às propriedades resolvidas (incluindo os valores padrão). O valor de uma condição pode ser uma string ou um array de strings para corresponder a qualquer um de vários valores.

PHP
$button = variants([
    'base' => 'btn',
    'variants' => [
        'intent' => [
            'primary' => 'bg-blue-500',
            'warning' => 'bg-yellow-500',
            'danger'  => 'bg-red-500',
        ],
        'size' => ['sm' => 'text-sm', 'md' => 'text-base'],
    ],
    'compoundVariants' => [
        // Applies only when intent=primary AND size=md
        ['intent' => 'primary', 'size' => 'md', 'class' => 'uppercase'],
        // Applies when intent is warning OR danger
        ['intent' => ['warning', 'danger'], 'class' => '!border-red-500'],
    ],
    'defaultVariants' => ['intent' => 'primary', 'size' => 'md'],
]);

$button();
// => 'btn bg-blue-500 text-base uppercase'

$button(['intent' => 'danger']);
// => 'btn bg-red-500 text-base !border-red-500'

Padrão de componente

variants() apenas acrescenta class; para permitir que quem chama sobrescreva de fato os valores padrão das variantes, envolva a saída em cn() para que os conflitos sejam resolvidos a favor de quem chama.

PHP
use function TailwindPHP\variants;
use function TailwindPHP\cn;

function Button(array $props = []): string {
    static $styles = null;
    $styles ??= variants([
        'base' => 'inline-flex items-center justify-center rounded-md font-medium',
        'variants' => [
            'variant' => [
                'default' => 'bg-primary text-primary-foreground hover:bg-primary/90',
                'outline' => 'border border-input bg-background hover:bg-accent',
                'ghost'   => 'hover:bg-accent hover:text-accent-foreground',
            ],
            'size' => [
                'default' => 'h-10 px-4 py-2',
                'sm'      => 'h-9 px-3',
                'lg'      => 'h-11 px-8',
            ],
        ],
        'defaultVariants' => ['variant' => 'default', 'size' => 'default'],
    ]);

    // cn() merges variant output with custom classes, resolving conflicts
    $class = cn($styles($props), $props['class'] ?? null);
    $text  = $props['children'] ?? 'Button';
    return "<button class=\"{$class}\">{$text}</button>";
}

// The custom px-8 wins over the variant's px-3 via cn()
Button(['variant' => 'outline', 'size' => 'sm', 'class' => 'mt-4 px-8']);

O cache static $styles cria a configuração de variantes uma vez e a reutiliza nas chamadas.

compose()

compose() combina vários componentes de variantes em um só. A função composta encaminha cada propriedade a todos os componentes, reúne as saídas e acrescenta quaisquer class/className.

PHP
use function TailwindPHP\variants;
use function TailwindPHP\compose;

$box   = variants(['variants' => ['shadow' => ['sm' => 'shadow-sm', 'md' => 'shadow-md']]]);
$stack = variants(['variants' => ['gap' => ['1' => 'gap-1', '2' => 'gap-2']]]);
$card  = compose($box, $stack);

$card(['shadow' => 'md', 'gap' => '2']);
// => 'shadow-md gap-2'

Isso mantém eixos reutilizáveis (espaçamento, elevação, layout) em definições separadas, que são combinadas para cada componente.

Importações

PHP
use function TailwindPHP\variants;
use function TailwindPHP\compose;

Ambos ficam no namespace principal TailwindPHP e são incluídos no pacote — uma implementação PHP de CVA, de Joe Bell.