
# Kompatibilitet og opgradering

Denne side samler det, du skal vide, før du opgraderer eller er afhængig af præcist output: runtimekravene, hvilken TailwindCSS-udgivelse porteringen følger, hvor TailwindPHP bevidst adskiller sig fra TailwindCSS, og noter til hver udgivelse. Hele historikken findes i [CHANGELOG.md](https://github.com/inline0/tailwindphp/blob/main/CHANGELOG.md).

## Krav

- **PHP 8.2 eller nyere.** Testpakken køres på PHP 8.2, 8.3 og 8.4.
- **Udvidelserne `ctype` og `mbstring`.** Compileren kalder `ctype_*` og `mb_chr()`. Begge følger med de fleste PHP-builds og de officielle Docker-images, men `composer.json` angiver dem endnu ikke ([#11](https://github.com/inline0/tailwindphp/issues/11)), så pakken installeres uden dem, men fejler ved kørsel.
- **Valgfrit: `pcntl`** gør, at CLIs `--watch`-tilstand kan afslutte korrekt ved `SIGINT`/`SIGTERM`. Overvågningstilstanden virker stadig uden den.

Ingen Node.js, ingen FFI og ingen native binære filer indgår.

## Hvilken TailwindCSS-udgivelse der følges

Udgivelse 1.7.0 følger **TailwindCSS v4.3.3**. Upstream-repositoriet er fastlåst som git-undermodul i `reference/tailwindcss`, dets testsuiter udtrækkes fra den fastlåste checkout, og 4,427-testene køres ved hvert push (se [Ydeevne og test](https://tailwindphp.inline0.dev/da/docs/advanced/performance)). De porterede plugins følger `@tailwindcss/typography` og `@tailwindcss/forms`, og klasseværktøjerne følger clsx, tailwind-merge og CVA, alle fastlåst på samme måde.

## Kendte forskelle fra TailwindCSS

### Serialiseringsdetaljer

Genereret CSS matcher referencetestsuiterne. Nogle få serialiseringsdetaljer adskiller sig fra det, TailwindCSS CLI udskriver, men ingen af dem ændrer kaskaden:

- Leverandørpræfikser: Når referencen udsender både den forfattede `-webkit-*`-linje og en genereret linje, udsender TailwindPHP én linje.
- Nedgraderede pseudo-elementer (`::file-selector-button`, `::-webkit-datetime-edit-*`) forbliver i deres forfattede selektorlister i stedet for at blive opdelt i én regel pr. pseudo-element.
- Forfattede strenge med enkelte anførselstegn forbliver med enkelte anførselstegn (`'Segoe UI'`) i stedet for at blive normaliseret til dobbelte anførselstegn.
- Longhand-egenskaber, der optræder sammen, kombineres ikke til en shorthand (Tailwinds eget output har aldrig brug for det).
- `.p-0` bevarer `padding: 0px`, hvor referencen CLI udsender `padding: 0`, fordi det udtrukne testkorpus fastlåser formen `0px`. Minificeringen forkorter den til `0`.

### Ikke inkluderet

TailwindPHP er en CSS-compiler. Den udelader redigeringsværktøjerne fra Tailwind-økosystemet (IntelliSense, autofuldførelse, sortering af klasser) og kildekort, så CLI ikke har nogen `--map`-mulighed.

### Indholdsscanning

`tw::generate()` og `TailwindCompiler::generate()` læser kun klassenavne fra attributterne `class` og `className`. Brug [`tw::extractCandidatesFromStrings()`](https://tailwindphp.inline0.dev/da/docs/api#twextractcandidatesfromstrings) eller `@source inline("…")` til klassenavne i strengene PHP eller JavaScript. Stiformer af `@source` ignoreres af API og understøttes kun delvist af CLI (se nedenfor).

### Kendte problemer i den aktuelle udgivelse

| Område | Adfærd i dag | Problem |
|---|---|---|
| CLI `@source` | Stier og globs anvendes ikke; inputfilens mappe scannes i stedet, og `@source not` udelukker intet. Se [Hvad CLI scanner](https://tailwindphp.inline0.dev/da/docs/cli#what-the-cli-scans) | [#8](https://github.com/inline0/tailwindphp/issues/8) |
| CLI `--optimize` | Minificerer ligesom `--minify` | [#9](https://github.com/inline0/tailwindphp/issues/9) |
| Lange tilvalg i CLI | `--input file.css` (adskilt med mellemrum) ignoreres; brug `--input=file.css` eller `-i file.css` | [#13](https://github.com/inline0/tailwindphp/issues/13) |
| Pluginvarianter | Varianterne `addVariant()`/`matchVariant()` og typografiens elementmodifikatorer (`prose-headings:` …) kompileres uden deres selektor | [#10](https://github.com/inline0/tailwindphp/issues/10) |
| `@apply`-mixins | `@apply --my-mixin;` droppes i stedet for at blive sendt videre | [#12](https://github.com/inline0/tailwindphp/issues/12) |
| Referenceimporter | Outputtet er tomt, når en referenceimport kommer før importen af værktøjer; `@import "tailwindcss" reference` har ingen effekt | [#14](https://github.com/inline0/tailwindphp/issues/14) |

## Opgraderingsnoter

### 1.7.0

- **Outputtet ændres byte for byte** sammenlignet med 1.6.x, men er funktionelt ækvivalent med referencen TailwindCSS v4.3.3. Blandt de synlige ændringer:
  - Mellemrumsmultiplikatorer: `p-1` udsender `padding: var(--spacing)` i stedet for en `calc()`, og en multiplikator på `0` udsender en almindelig nul-længde.
  - Brøker foldes til procenter: `w-1/2` udsender `width: 50%`.
  - Farver: lysstyrken i `oklch()`/`oklab()` serialiseres som en procent (`oklch(62.3% .214 259.815)`), `white` og `black` forkortes til `#fff` og `#000`.
  - CSS2-pseudo-elementer serialiseres med ét kolon (`:before`, `:after`, `:first-letter`, `:first-line`).
  - Indlejrede `@media`/`@supports`/`@container`-regler udflades på stedet i kildens rækkefølge i stedet for at blive flyttet til sidst; deklarationer omordnes, som lightningcss gør, og overskyggede dublerede deklarationer fjernes.
- **Caches med output som nøgle skal genopbygges én gang.** Filcachen i `tw::generate()` medtager ikke TailwindPHP-versionen i sin nøgle, så kør `tw::clearCache()` (eller mappen, du angav som `cache`) efter opgradering. [Compilerens tilstandscache](https://tailwindphp.inline0.dev/da/docs/advanced/caching#compiler-state-cache) invaliderer sig selv.
- **Nyt:** `@variant` i forfatter-CSS, CSS-mixins i `@apply`, `@media reference` og `@import "…" reference`, hele `--value()`/`--modifier()`-motoren til funktionel `@utility`, strengere validering af `@utility`-navne og tilvalget `polyfills` i `tw::compile()`.

### 1.6.1

- **Nyt:** værktøjet `container` (`width: 100%` plus én `max-width` pr. breakpoint).
- Sammensatte `--tw-*`-variabler (translate, scale, rotate, skew, filtre og andre) registreres nu med `@property`, så stylesheets får disse `@property`-regler, og transformationer som `translate-x-7` træder i kraft i browseren.

### 1.6.0

- **Nyt:** den vedvarende cache for compilerens tilstand (`stateCacheFile` på `tw::compile()` og `TailwindCompiler`, `StateCache\compileCssCached()`) samt de opdelte funktioner `parseCssState()`/`finalizeCssState()`/`compileParsed()`. Eksisterende kald fungerer præcis som før.

### 1.5.0

- Underklasser af `TailwindCompiler`, der tilsidesætter `generate()` eller `css()`, skal tilføje den valgfrie parameter `bool $minify = false`; PHP afviser tilsidesættelser, der udelader en valgfri parameter fra forælderen.
- Minificeret output kommer fra serializeren, så de minificerede bytes afviger en smule fra 1.4.x (caches med minificeret output som nøgle skal genopbygges én gang).
- **Nyt:** `generateExact()` og `cssExact()` til CSS pr. side fra én langlivet compiler.
