Přejít k obsahu

Varianty

variants() je port PHP knihovny CVA (Class Variance Authority). Deklarativní konfigurace — základní třídy, pojmenované osy variant a výchozí hodnoty — se převede na funkci, která z vlastností komponenty vytvoří řetězec tříd. Použijte jej u komponent, jejichž styly se kombinují podle vlastností, jako jsou velikost a záměr.

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() vrací callable; zavolejte ji s polem vlastností komponenty (nebo bez něj) a získáte výsledný řetězec.

Konfigurace

Klíč Typ Účel
base string Třídy použité ve všech výstupech.
variants array Pojmenované osy, z nichž každá mapuje názvy hodnot na řetězce tříd.
compoundVariants array Řetězce tříd použité pouze při kombinaci několika hodnot variant.
defaultVariants array Hodnota pro každou osu, pokud příslušná vlastnost není zadána.

Všechny klíče jsou volitelné. Pokud není zadáno variants, výsledek obsahuje base a případné vlastní třídy:

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

Hodnota varianty může být namapována na null, což nepřidá žádnou třídu — hodí se jako výslovná možnost „zrušit nastavení“ v ose.

Volání výsledné funkce

Předejte jedno pole vlastností ve stylu CVA. Klíče odpovídají názvům os variant; vynechané osy převezmou výchozí hodnotu defaultVariants.

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'

Klíč class (a jeho alias className) se přidává na konec výstupu. Samotné přidání neřeší konflikty — viz vzor pro komponenty níže.

compoundVariants

Každá položka v compoundVariants obsahuje pole podmínek variant a class (nebo className) dalších tříd. Třídy se použijí pouze tehdy, když se všechny podmínky shodují s vyřešenými vlastnostmi komponenty včetně výchozích hodnot. Hodnota podmínky může být jeden řetězec nebo pole řetězců; shoda s kteroukoli hodnotou stačí.

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'

Vzor pro komponenty

variants() pouze přidává class; chcete-li volajícím umožnit skutečně přepsat výchozí varianty, obalte výstup funkcí cn(), aby se konflikty vyřešily ve prospěch volajícího.

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']);

Mezipaměť static $styles jednou sestaví konfiguraci variant a znovu ji používá při dalších voláních.

compose()

compose() sloučí několik komponent variant do jedné. Složená funkce předá každou vlastnost všem komponentám, shromáždí jejich výstupy a přidá případné 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'

Díky tomu lze opakovaně použitelné osy (mezery, výškové odsazení, rozvržení) definovat odděleně a kombinovat je pro jednotlivé komponenty.

Importy

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

Obě funkce jsou v hlavním jmenném prostoru TailwindPHP a jsou součástí balíčku — jde o port PHP knihovny CVA od Joea Bella.