
# Помощни функции за класове

Създаването на атрибути `class` в шаблони означава свързване на низове, превключване на класове според условия и предотвратяване на конфликти на по-късни utilities с по-ранни (`p-2` и `p-4` не бива да остават едновременно). В JavaScript тази работа е разделена между [clsx](https://github.com/lukeed/clsx) и [tailwind-merge](https://github.com/dcastil/tailwind-merge). TailwindPHP включва PHP портове и на двете, така че получавате същото поведение без инструментална верига на Node.js и без допълнителни пакети Composer.

Три функции покриват целия спектър: `cn()` изгражда и разрешава конфликти, `merge()` разрешава само конфликти, а `join()` само свързва.

## cn()

Препоръчителната функция. Първо изгражда условно по начин, подобен на clsx, а след това разрешава конфликтите между Tailwind с tailwind-merge — така печели последният конфликтен utility.

```php
use function TailwindPHP\cn;

// Conflicts are resolved — px-4 overrides px-2
cn('px-2 py-1', 'px-4');
// => 'py-1 px-4'

// Conditional classes via a key => bool array
cn('btn', ['btn-primary' => true, 'btn-disabled' => false]);
// => 'btn btn-primary'
```

### Приети аргументи

`cn()` приема произволен брой аргументи. Всеки се преобразува и филтрира според семантиката на clsx:

| Аргумент | Поведение |
|----------|----------|
| `string` | Добавя се както е. |
| `int` / `float` | Преобразува се в низ и се добавя. |
| Последователен масив | Всеки елемент се обработва рекурсивно. |
| Масив `key => bool` | Всеки ключ се добавя, ако стойността му е истина. |
| `null`, `false`, `0`, `''` | Игнорират се. |

```php
cn('flex', ['items-center' => true], ['p-4', ['gap-2']], null);
// => 'flex items-center p-4 gap-2'
```

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

`cn()` позволява на потребителя да замества настройките на компонент: обединете собствените класове на компонента с подадените от извикващия код, а конфликтите се разрешават в полза на извикващия.

```php
use function TailwindPHP\cn;

function Card(array $props = []): string {
    $class = cn(
        'rounded-lg border bg-card text-card-foreground shadow-sm',
        $props['class'] ?? null
    );
    return "<div class=\"{$class}\">" . ($props['children'] ?? '') . "</div>";
}

Card(['class' => 'p-6', 'children' => 'Content']);
// <div class="rounded-lg border bg-card text-card-foreground shadow-sm p-6">Content</div>
```

За декларативни стилове на компоненти с няколко измерения комбинирайте `cn()` с [variants()](https://tailwindphp.inline0.dev/bg/docs/class-utilities/variants).

## merge()

Разрешаване само на конфликти — без условно изграждане. Подайте низове с класове; по-късните класове заменят по-ранните, когато засягат едно и също свойство. Използвайте го, когато входът ви вече се състои от обикновени низове.

```php
use function TailwindPHP\merge;

merge('px-2 py-1 bg-red-500', 'px-4 bg-blue-500');
// => 'py-1 px-4 bg-blue-500'

// Conflict resolution is variant-aware
merge('hover:bg-red-500', 'hover:bg-blue-500');
// => 'hover:bg-blue-500'
```

`cn()` е `merge()`, съставен върху clsx, затова използвайте директно `merge()` само когато не ви е нужен условният синтаксис с масив.

## join()

Просто свързване без разрешаване на конфликти. Стойностите, които се оценяват като false, се отхвърлят, но всички конфликтни utilities се запазват. Използвайте го, когато знаете, че няма конфликти и искате най-евтиния вариант.

```php
use function TailwindPHP\join;

join('foo', 'bar', null, 'baz');
// => 'foo bar baz'
```

## Кой вариант да използвам?

| Функция | Изгражда (условия, масиви) | Разрешава конфликти | Използвайте, когато |
|----------|:---:|:---:|----------|
| `cn()`    | да | да | Избор по подразбиране — изграждате низове с класове, в които може да има конфликти. |
| `merge()` | не  | да | Входът е от обикновени низове; трябва ви само разрешаване на конфликти. |
| `join()`  | да | не  | Знаете, че няма конфликти и искате минимална обработка. |

## Импортиране

```php
use function TailwindPHP\cn;
use function TailwindPHP\merge;
use function TailwindPHP\join;
```

И трите са в основното пространство от имена `TailwindPHP` и са включени в пакета. Те са PHP портове на clsx (от Luke Edwards) и tailwind-merge (от Dany Castillo).
