
# Klasside utiliidid

Mallides `class`-atribuutide loomine tähendab stringide ühendamist, klasside tingimuslikku vahetamist ja hilisemate utiliitide varasematega konflikti sattumise vältimist (`p-2` ja `p-4` ei tohiks mõlemad alles jääda). JavaScript on see töö jagatud kahe vahel: [clsx](https://github.com/lukeed/clsx) ja [tailwind-merge](https://github.com/dcastil/tailwind-merge). TailwindPHP sisaldab mõlema PHP teisendusi, nii et saad sama käitumise ilma Node.js tööriistaahela ja lisapakettideta Composer.

Spektri katavad kolm funktsiooni: `cn()` loob ja lahendab konfliktid, `merge()` lahendab ainult konfliktid ning `join()` üksnes ühendab.

## cn()

Soovitatav utiliit. Esmalt loob see tingimuslikke klasse clsx-i stiilis, seejärel lahendab Tailwind-konfliktid tailwind-merge abil — seega jääb kehtima viimane konfliktne utiliit.

```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'
```

### Lubatud argumendid

`cn()` aktsepteerib suvalise arvu argumente. Iga argument tasandatakse ja filtreeritakse clsx-i semantika järgi:

| Argument | Käitumine |
|----------|----------|
| `string` | Lisatakse muutmata kujul. |
| `int` / `float` | Teisendatakse stringiks ja lisatakse. |
| Järjestikune massiiv | Iga elementi töödeldakse rekursiivselt. |
| `key => bool`-massiiv | Iga võtmepaar lisatakse, kui selle väärtus on tõene. |
| `null`, `false`, `0`, `''` | Eiratakse. |

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

### Komponendi muster

`cn()` muudab komponendi ülekirjutatavaks: ühenda komponendi enda klassid kutsuja edastatutega ning konfliktid lahendatakse kutsuja kasuks.

```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>
```

Deklaratiivsete, mitmeteljeliste komponendistiilide jaoks kasuta `cn()` koos [variants()](https://tailwindphp.inline0.dev/et/docs/class-utilities/variants)-ga.

## merge()

Ainult konfliktide lahendamine — tingimuslikku loomist ei toimu. Edasta klassistringid; sama atribuuti mõjutavate klasside korral kirjutavad hilisemad klassid varasemad üle. Kasuta seda siis, kui sisend koosneb juba lihtsatest stringidest.

```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()` on clsx-i peale ehitatud `merge()`, seega kasuta `merge()` otse ainult siis, kui sa ei vaja tingimuslikku massiivisüntaksit.

## join()

Lihtne ühendamine konfliktide lahendamiseta. Tõeväärtuseta väärtused jäetakse välja, kuid kõik omavahel konfliktis olevad utiliidid säilivad. Kasuta seda siis, kui tead, et konflikte pole ja soovid kõige väiksemat kulu.

```php
use function TailwindPHP\join;

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

## Millist peaksin kasutama?

| Funktsioon | Loob (tingimused, massiivid) | Lahendab konfliktid | Kasuta siis, kui |
|----------|:---:|:---:|----------|
| `cn()`    | jah | jah | Vaikevalik — lood klassistringe, mis võivad konflikti sattuda. |
| `merge()` | ei  | jah | Sisend on lihtsad stringid; vajad ainult konfliktide lahendamist. |
| `join()`  | jah | ei  | Tead, et konflikte pole, ja soovid teha võimalikult vähe tööd. |

## Impordid

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

Kõik kolm asuvad peamises `TailwindPHP` nimeruumis ja sisalduvad paketis. Need on clsx-i (autor Luke Edwards) ja tailwind-merge (autor Dany Castillo) PHP teisendused.
