Siirry sisältöön

Variantit

variants() on PHP-porttaus CVA:sta (Class Variance Authority). Se muuntaa määriteltävissä olevan asetuksen — pohjaluokan, nimetyt varianttiakselit ja oletusarvot — kutsuttavaksi funktioksi, joka muuntaa props-arvot luokkajonoksi. Käytä sitä, kun komponentin tyylissä on yhdisteltäviä ulottuvuuksia, kuten koko ja tarkoitus.

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() palauttaa arvon callable; kutsu sitä props-taulukolla (tai ilman argumentteja), niin saat ratkaistun merkkijonon.

Asetukset

Avain Tyyppi Tarkoitus
base string Luokat, jotka lisätään jokaiseen tulokseen.
variants array Nimetyt akselit, joista kukin yhdistää arvonimet luokkajonoihin.
compoundVariants array Luokkajonot, jotka lisätään vain useiden varianttiarvojen yhdistyessä.
defaultVariants array Akselikohtainen arvo, jota käytetään, kun prop-arvo puuttuu.

Kaikki avaimet ovat valinnaisia. Jos variants puuttuu, tulokseen palautetaan base sekä mahdolliset omat luokat:

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

Varianttiarvoksi voi määrittää null, jolloin se ei lisää mitään — tästä on hyötyä, kun haluat akselille selvän "unset"-vaihtoehdon.

Tuloksen kutsuminen

Anna yksi props-taulukko CVA:n tapaan. Avainten tulee vastata varianttiakselien nimiä; pois jätetyissä akseleissa käytetään arvoa 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'

class-avain (ja sen alias className) lisätään tulosteen loppuun. Pelkkä lisääminen ei ratkaise ristiriitoja — katso alta komponenttimalli.

compoundVariants

Jokainen compoundVariants-alkio sisältää varianttiehtojen taulukon sekä ylimääräisiä luokkia sisältävän class- tai className-arvon. Luokat lisätään vain, kun kaikki ehdot vastaavat ratkaistuja props-arvoja, myös oletusarvoja. Ehtoarvo voi olla yksi merkkijono tai useiden vaihtoehtojen tarkistamiseen käytettävä merkkijonotaulukko.

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'

Komponenttimalli

variants() lisää vain arvon class; jos haluat, että kutsujat voivat todella ohittaa varianttien oletusarvot, kääri tulos cn()-funktiolla, jolloin ristiriidat ratkaistaan kutsujan eduksi.

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

static $styles-välimuisti muodostaa varianttiasetuksen kerran ja käyttää sitä uudelleen kutsujen välillä.

compose()

compose() yhdistää useita varianttikomponentteja yhdeksi. Yhdistettyä funktiota voi kutsua kaikilla prop-arvoilla, ja se välittää ne jokaiselle komponentille, kerää tulosteet ja lisää loppuun mahdolliset arvot 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'

Näin uudelleenkäytettävät akselit (välistys, korkeusasettelu ja asettelu) pysyvät erillisissä määrityksissä ja ne voidaan yhdistää komponenttikohtaisesti.

Tuonnit

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

Molemmat ovat paketin mukana toimitetussa TailwindPHP-nimiavaruudessa — kyseessä on PHP-porttaus CVA:sta (Joe Bell).