Preskoči na vsebino

Različice

variants() je PHP različica CVA (Class Variance Authority). Deklarativno konfiguracijo — osnovo, poimenovane osi različic in privzete vrednosti — spremeni v klicno funkcijo, ki lastnosti preslika v niz razredov. Uporabite jo, kadar ima komponenta kombinirane slogovne razsežnosti, kot sta velikost in namen.

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() vrne callable; pokličite jo z matriko lastnosti (ali brez nje), da dobite razrešeni niz.

Konfiguracija

Ključ Vrsta Namen
base string Razredi, uporabljeni pri vsakem izhodu.
variants array Poimenovane osi, vsaka preslika imena vrednosti v nize razredov.
compoundVariants array Nizi razredov, uporabljeni samo ob kombinaciji več vrednosti različic.
defaultVariants array Vrednost za vsako os, uporabljena, kadar lastnost ni podana.

Vsi ključi so neobvezni. Če ni podanega variants, rezultat vrne base in vse razrede po meri:

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

Vrednost različice je lahko preslikana v null, kar ne prispeva ničesar — uporabno kot izrecna možnost »brez vrednosti« na osi.

Klicanje rezultata

Posredujte eno matriko lastnosti, kot pri CVA. Ključi ustrezajo imenom osi različic; za izpuščene osi se uporabijo privzete vrednosti 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'

Ključ class (in njegov vzdevek className) je dodan na konec izhoda. Samo dodajanje ne razreši sporov — za to glejte spodnji vzorec za komponente.

compoundVariants

Vsak vnos v compoundVariants je matrika pogojev različic ter class (ali className) dodatnih razredov. Razredi se uporabijo samo, kadar se vsi pogoji ujemajo z razrešenimi lastnostmi (vključno s privzetimi vrednostmi). Vrednost pogoja je lahko posamezen niz ali matrika nizov, ki se ujema s katero koli od več vrednosti.

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'

Vzorec za komponente

variants() samo doda class; če želite klicateljem omogočiti, da resnično preglasijo privzete vrednosti različic, ovijte izhod v cn(), da se spori razrešijo v korist klicatelja.

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

Predpomnilnik static $styles enkrat sestavi konfiguracijo različic in jo znova uporabi pri nadaljnjih klicih.

compose()

compose() združi več komponent različic v eno. Sestavljena klicna funkcija vsako lastnost posreduje vsem komponentam, zbere njihove izhode in doda morebitne 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'

Tako ostanejo osi za večkratno uporabo (razmiki, višina, postavitev) v ločenih definicijah, nato pa jih združite za posamezno komponento.

Uvozi

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

Oba sta v glavnem imenskem prostoru TailwindPHP in sta vključena v paket — gre za PHP različico CVA avtorja Joeja Bella.