Architektúra
TailwindPHP je port 1:1. Štruktúra kódovej základne kopíruje štruktúru TailwindCSS — rovnaké názvy súborov, rovnaké usporiadanie — a oddeľuje časti, ktoré nemôžu byť priamym portom (PHP nemá Rust ani V8), do src/_tailwindphp/. Táto stránka opisuje postupnosť fáz kompilácie, usporiadanie zdrojových súborov, opätovnú implementáciu lightningcss a konvenciu na dokumentovanie odchýlok.
Proces spracovania
Generovanie CSS pozostáva zo série fáz. Samostatný krok zostavenia neexistuje — každé volanie tw::generate() spustí celý postup.
CSS input (@import "tailwindcss"; @theme { … })
│
▼
┌──────────────┐
│ Parse CSS │ css-parser.php → ast.php nodes
└──────┬───────┘
▼ design system (theme, utilities, variants)
┌──────────────┐
│ Scan content │ candidate.php — extract class names from HTML
└──────┬───────┘
▼ candidates
┌──────────────┐
│ Compile │ compile.php — candidate → AST, via design-system.php
└──────┬───────┘
▼ AST
┌──────────────┐
│ Optimize │ _tailwindphp/LightningCss.php — nesting, @media, calc()
└──────┬───────┘
▼
┌──────────────┐
│ Serialize │ ast.php toCss() (minified when requested)
└──────┬───────┘
▼
CSS output
Parsovanie. css-parser.php načíta vstup CSS — @import, @theme, @utility, @layer a surové pravidlá — do abstraktného syntaktického stromu zloženého z uzlov ast.php (pravidlá štýlov, pravidlá at, deklarácie). Direktívy @import pre virtuálne moduly (tailwindcss, tailwindcss/preflight, …) a cesty k súborom sa v tejto fáze vyriešia a nahradia.
Zostavenie dizajnového systému. theme.php odvodí hodnoty témy (farby, rozostupy, body zlomu) z naparsovaných blokov @theme a predvolených hodnôt. design-system.php je centrálny register, ktorý prepája tému s vyhľadávaním pomocných tried a variantov definovaným v utilities.php a variants.php.
Skenovanie obsahu. candidate.php extrahuje kandidátov na názvy tried z dodaného obsahu (HTML, šablóny) a rozloží každého z nich na časti — základnú pomocnú triedu, varianty, modifikátory, ľubovoľné hodnoty a príznak dôležitosti.
Kompilácia. compile.php zmení každého kandidáta na uzly AST tak, že ho vyhľadá v dizajnovom systéme a uplatní jeho varianty a modifikátory. Kandidáti, ktorí nezodpovedajú skutočnej pomocnej triede, sa zahodia.
Serializácia a optimalizácia. toCss() v ast.php prechádza strom (pomocné funkcie sú v walk.php) a vytvára reťazec CSS. Uplatnia sa transformácie zodpovedajúce lightningcss v _tailwindphp/LightningCss.php, aby sa výstup zhodoval s tým, čo vytvorí TailwindCSS po prechode následného spracovania Rust.
Minimalizácia. Keď je povolené minify, toCss() počas serializácie vytvára minimalizované CSS. Samostatný priechod reťazcom tw::minify() zabezpečuje _tailwindphp/CssMinifier.php. Pozrite si časť Ukladanie do vyrovnávacej pamäte a minimalizácia.
Usporiadanie zdrojových súborov
src/ kopíruje usporiadanie TailwindCSS. Jediná štrukturálna zmena: TailwindCSS má súbor utilities.ts s viac než 6,000 riadkami, preto je kvôli jednoduchšej údržbe rozdelený do src/utilities/, pričom každá kategória má vlastný súbor.
src/
├── _tailwindphp/ # PHP-specific — NOT part of the TailwindCSS port
│ ├── LightningCss.php # CSS transforms (lightningcss Rust library equivalent)
│ ├── CssMinifier.php # CSS minification
│ └── lib/ # Companion library ports (TailwindPHP\Lib\*)
│ ├── clsx/ # clsx port
│ ├── tailwind-merge/ # tailwind-merge port
│ └── cva/ # CVA port
│
├── plugin/ # Plugin system
│ └── plugins/
│ ├── typography-plugin.php # @tailwindcss/typography port
│ └── forms-plugin.php # @tailwindcss/forms port
│
├── utilities/ # Split from TailwindCSS utilities.ts (one file per category)
│ ├── accessibility.php # sr-only, forced-colors
│ ├── backgrounds.php # bg-*, gradient-*, from-*, via-*, to-*
│ ├── borders.php # border-*, rounded-*, divide-*, outline-*
│ ├── effects.php # shadow-*, opacity-*, mix-blend-*
│ ├── filters.php # blur-*, brightness-*, contrast-*, …
│ ├── flexbox.php # flex-*, grid-*, gap-*, justify-*, align-*
│ ├── interactivity.php # cursor-*, scroll-*, touch-*, select-*
│ ├── layout.php # display, position, z-*, overflow-*, …
│ ├── masks.php # mask-linear-*, mask-radial-*, mask-conic-*
│ ├── sizing.php # w-*, h-*, min-*, max-*, size-*
│ ├── spacing.php # m-*, p-*, space-*
│ ├── svg.php # fill-*, stroke-*
│ ├── tables.php # border-collapse, table-layout
│ ├── transforms.php # translate-*, rotate-*, scale-*, skew-*
│ ├── transitions.php # transition-*, duration-*, ease-*, delay-*
│ └── typography.php # font-*, text-*, leading-*, tracking-*
│
├── utils/ # Helper functions (ported from utils/)
│
├── index.php # Main entry — compile(), cn(), variants(), merge(), join()
├── ast.php # AST nodes and toCss()
├── candidate.php # Candidate parsing (class name → parts)
├── compile.php # Candidate to CSS compilation
├── css-functions.php # theme(), --theme(), --spacing(), --alpha()
├── css-parser.php # CSS parsing
├── design-system.php # Central registry for utilities/variants
├── plugin.php # Plugin system (PluginInterface, PluginAPI, PluginManager)
├── theme.php # Theme value resolution
├── utilities.php # Utility registration and lookup
├── value-parser.php # CSS value parsing
├── variants.php # Variant handling (hover, focus, responsive, …)
└── walk.php # AST traversal
Náhrada za lightningcss
TailwindCSS prenecháva následné spracovanie CSS — vnáranie, spracovanie mediálnych dotazov, zjednodušovanie hodnôt — nástroju lightningcss, parseru, transformátoru a minifikátoru napísanému v Rust. PHP nedokáže načítať knižnicu Rust, preto src/_tailwindphp/LightningCss.php opätovne implementuje transformácie, na ktoré sa TailwindPHP skutočne spolieha, a pre prípady pokryté testovacou sadou vytvára výstup identický po bajtoch.
Potvrdené transformácie zahŕňajú:
| Transformácia | Čo robí |
|---|---|
| Zjednodušenie vnárania | Vyrieši selektory & pomocou pravidiel :is(…) referenčnej implementácie a sploští vnorené pravidlá (handleNesting() v ast.php, port priechodu TailwindCSS); transformNesting zníži úroveň zostávajúceho vnárania pod prvou úrovňou s deklaráciami |
| Sploštenie podmienených pravidiel at | Sploští vnorené @media, @supports, @container a @starting-style na mieste, zachová poradie v zdroji a zlúči iba priamo susediacich súrodencov s rovnakými podmienkami |
| Usporiadanie deklarácií | Usporiada deklarácie podľa reťazca obsluhy deklarácií v lightningcss, takže vlastnosti budú vo výstupnom poradí referenčnej implementácie (reorderDeclarations) |
Zjednodušenie calc() |
Zjednoduší výrazy calc() (simplifyCalcExpressions) |
| Odstránenie úvodných núl | 0.5 → .5 (normalizeLeadingZeros) |
| Medzery vo transformačných funkciách | Normalizuje medzery vo vnútri transformačných funkcií (normalizeTransformFunctions) |
| Normalizácia hodnôt mriežky | Pridá medzery okolo / v hodnotách span; zmení celé čísla bez jednotky na px pre grid-template-* (normalizeGridValues) |
| Normalizácia farieb | Normalizuje zápis farieb a vyhodnotí color-mix() na oklab() (normalizeColors, evaluateColorMix) |
| Zápis URL v úvodzovkách | url(./x.jpg) → url("./x.jpg") (normalizeUrlQuoting) |
| Predpony dodávateľov | Predpony zodpovedajúce Autoprefixer (addVendorPrefixes) |
Tento súbor je zámerne umiestnený do karantény pod _tailwindphp/ a označený ako @port-deviation:replacement — zastupuje externú závislosť namiesto portovania zdrojového kódu TailwindCSS.
Značky odchýlok portu
Každý implementačný súbor obsahuje v dokumentačnom bloku značky @port-deviation:*, ktoré uvádzajú, kde a prečo sa implementácia PHP odchyľuje od originálu TypeScript. Cieľom je, aby čitateľ pri porovnávaní PHP so zdrojovým kódom TailwindCSS nemusel hádať, či je rozdiel zámerný.
| Značka | Význam |
|---|---|
@port-deviation:none |
Priamy port 1:1 bez významných odchýlok |
@port-deviation:async |
PHP používa synchrónny kód namiesto async/await |
@port-deviation:storage |
Odlišné dátové štruktúry (pole PHP namiesto JS Map/Set) |
@port-deviation:types |
Anotácie PHPDoc namiesto typov TypeScript |
@port-deviation:sourcemaps |
Sledovanie source mapy sa vynecháva |
@port-deviation:enum |
Konštanty PHP namiesto enumerácií TypeScript |
@port-deviation:errors |
Odlišný spôsob spracovania chýb |
@port-deviation:replacement |
Implementácia PHP nahrádza externú knižnicu (e.g lightningcss) |
@port-deviation:helper |
Pomocná funkcia špecifická pre PHP, ktorá v origináli nie je |
@port-deviation:performance |
Optimalizácia špecifická pre PHP, ktorá zachováva identický výstup |
@port-deviation:omitted |
Celý modul alebo funkcia neboli portované (mimo rozsahu) |
Informácie o značkách @port-deviation:performance a o tom, ako sa vynucuje zhoda, nájdete v časti Testovanie výkonu a testovanie.