المتغيرات
إن variants() نسخة PHP من CVA (Class Variance Authority). تحوّل إعدادًا تعريفيًا — أساسًا ومحاور متغيرات مسماة وقيمًا افتراضية — إلى دالة قابلة للاستدعاء تحوّل الخصائص إلى سلسلة أصناف. استخدمها عندما يكون للمكوّن أبعاد نمطية مثل الحجم والغرض تتضافر معًا.
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؛ استدعها بمصفوفة خصائص (أو دون وسيطات) للحصول على السلسلة المحسومة.
الإعداد
| المفتاح | النوع | الغرض |
|---|---|---|
base |
string |
الأصناف المطبقة على كل المخرجات. |
variants |
array |
محاور مسماة، يربط كل منها أسماء القيم بسلاسل الأصناف. |
compoundVariants |
array |
سلاسل أصناف تُطبّق فقط عند اجتماع عدة قيم للمتغيرات. |
defaultVariants |
array |
قيمة لكل محور تُستخدم عند إغفال خاصية. |
كل المفاتيح اختيارية. عند عدم تحديد variants، تعيد النتيجة base وأي أصناف مخصصة:
$x = variants(['base' => 'box']);
$x(); // => 'box'
$x(['class' => 'p-4']); // => 'box p-4'
يمكن ربط قيمة المتغير بـ null كي لا تضيف شيئًا — وهذا مفيد كخيار صريح «بلا قيمة» ضمن أحد المحاور.
استدعاء النتيجة
مرّر مصفوفة خصائص واحدة على نمط CVA. تطابق المفاتيح أسماء محاور المتغيرات؛ وتعود المحاور المُغفلة إلى defaultVariants.
$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) للأصناف الإضافية. لا تُطبّق الأصناف إلا عند تطابق كل الشروط مع الخصائص المحسومة، بما فيها القيم الافتراضية. يمكن أن تكون قيمة الشرط سلسلة نصية واحدة أو مصفوفة سلاسل نصية لمطابقة أي قيمة من عدة قيم.
$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() كي تُحسم التعارضات لصالح المستدعي.
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() عدة مكونات متغيرة في مكوّن واحد. تمرر الدالة المركبة كل خاصية إلى كل مكوّن، وتجمع مخرجاتها، ثم تلحق أي class/className.
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'
يُبقي هذا المحاور القابلة لإعادة الاستخدام (التباعد والارتفاع والتخطيط) في تعريفات منفصلة، ثم يجمعها لكل مكوّن.
الاستيرادات
use function TailwindPHP\variants;
use function TailwindPHP\compose;
كلاهما موجود في مساحة الأسماء الرئيسية TailwindPHP ومضمن مع الحزمة — نسخة PHP من CVA من Joe Bell.