Ugrás a tartalomhoz

Változatok

A variants() a CVA (Class Variance Authority) PHP portja. A deklaratív konfigurációból — alaposztályokból, névvel ellátott változattengelyekből és alapértékekből — meghívható függvényt készít, amely a tulajdonságokból osztálykarakterláncot állít elő. Akkor használja, ha egy komponens stílusát többek között a méret és a rendeltetés együttesen határozza meg.

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'

A variants() egy callable értéket ad vissza; hívja meg egy tulajdonságokat tartalmazó tömbbel (vagy anélkül), hogy megkapja a feloldott karakterláncot.

Konfiguráció

Kulcs Típus Rendeltetés
base string Minden kimenethez hozzáadott osztályok.
variants array Névvel ellátott tengelyek, amelyek mindegyike értékneveket rendel osztálykarakterláncokhoz.
compoundVariants array Osztálykarakterláncok, amelyek csak több változatérték kombinációjakor kerülnek hozzáadásra.
defaultVariants array Tengelyenkénti érték, ha egy tulajdonság nincs megadva.

Minden kulcs opcionális. variants nélkül az eredmény base értéket adja vissza az egyéni osztályokkal együtt:

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

Egy változat értéke lehet null is, amely nem ad hozzá semmit — ez hasznos, ha egy tengelyen kifejezett „nincs beállítva” lehetőségre van szükség.

Az eredmény meghívása

Adjon át egyetlen, CVA-stílusú, tulajdonságokat tartalmazó tömböt. A kulcsok a változattengelyek neveinek felelnek meg; a kihagyott tengelyek értéke defaultVariants lesz.

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 class kulcs (és annak className aliasa) a kimenet végére kerül. Az egyszerű hozzáfűzés nem oldja fel az ütközéseket — lásd alább a komponensmintát.

compoundVariants

A compoundVariants minden eleme változatfeltételek tömbje, valamint a további osztályokat tartalmazó class (vagy className). Az osztályok csak akkor kerülnek hozzáadásra, ha minden feltétel megfelel a feloldott tulajdonságoknak, az alapértelmezéseket is beleértve. Egy feltétel értéke lehet egyetlen karakterlánc vagy karakterláncok tömbje, amellyel több lehetséges érték bármelyike megadható.

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'

Komponensminta

A variants() csak hozzáfűzi a class értéket; ha azt szeretné, hogy a hívók valóban felülírhassák a változatok alapértékeit, csomagolja a kimenetet a cn() függvénybe, így az ütközéseknél a hívó értékei érvényesülnek.

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

A static $styles gyorsítótára egyszer állítja össze a változatkonfigurációt, majd újra felhasználja a hívások során.

compose()

A compose() több változatkomponenst egyesít. Az összeállított függvény minden komponensnek továbbítja a tulajdonságokat, összegyűjti a kimeneteiket, majd hozzáfűz minden class/className értéket.

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'

Így az újrafelhasználható tengelyek (térközök, kiemelés, elrendezés) külön definíciókban maradnak, és komponensenként kombinálhatók.

Importok

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

Mindkettő a fő TailwindPHP névtérben található, és a csomag része — a CVA Joe Bell által készített PHP portja.