Към съдържанието

Варианти

variants() е PHP порт на CVA (Class Variance Authority). Преобразува декларативна конфигурация — базов клас, именувани оси на варианти и стойности по подразбиране — във функция, която преобразува props в низ с класове. Използвайте го, когато компонентът има измерения на стила като размер и предназначение, които се комбинират.

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() връща callable; извикайте я с масив props (или без аргументи), за да получите разрешения низ.

Конфигурация

Ключ Тип Предназначение
base string Класове, прилагани към всеки резултат.
variants array Именувани оси, всяка от които съпоставя имена на стойности с низове с класове.
compoundVariants array Низове с класове, прилагани само при комбиниране на няколко стойности на варианти.
defaultVariants array Стойност за всяка ос, използвана при пропуснат prop.

Всички ключове са незадължителни. Без variants резултатът връща base плюс всички потребителски класове:

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

Стойност на вариант може да се съпостави с null, за да не добавя нищо — полезно като изрична опция за „нулиране“ по дадена ос.

Извикване на резултата

Подайте един масив props, както при CVA. Ключовете съответстват на имената на осите на вариантите; пропуснатите оси използват 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 (и неговият псевдоним className) се добавя в края на изхода. Самото добавяне не разрешава конфликти — вижте по-долу шаблона за компонент.

compoundVariants

Всеки запис в compoundVariants е масив от условия за варианти плюс class (или className) от допълнителни класове. Класовете се прилагат само когато всички условия съвпадат с разрешените props (включително стойностите по подразбиране). Стойността на условието може да е един низ или масив от низове, който съвпада с една от няколко стойности.

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'

Шаблон за компонент

variants() само добавя class; за да позволите на извикващия код действително да замества стойностите на вариантите по подразбиране, обвийте резултата в cn(), така че конфликтите да се разрешават в негова полза.

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 изгражда конфигурацията на вариантите веднъж и я използва повторно при следващи извиквания.

compose()

compose() обединява няколко компонента с варианти в един. Съставната функция препраща всеки prop към всеки компонент, събира резултатите им и добавя всички 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'

Това позволява повторно използваемите оси (отстъпи, релеф, оформление) да се дефинират отделно и да се комбинират за всеки компонент.

Импортиране

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

И двете са в основното пространство от имена TailwindPHP и са включени в пакета — PHP порт на CVA от Joe Bell.