Ugrás a tartalomhoz

Architektúra

Az TailwindPHP 1:1 arányú port. A kódbázis az TailwindCSS saját felépítését követi – azonos fájlnevek, azonos szervezés –, és külön kezeli azokat a részeket, amelyeket nem lehet közvetlenül átültetni (az PHP nem rendelkezik Rust-del és V8-del) az src/_tailwindphp/ alatt. Ez az oldal bemutatja a fordítási folyamatot, a forráskód elrendezését, az lightningcss újraimplementálását és az eltérések dokumentálására használt konvenciót.

A folyamat

Az CSS előállítása egymást követő szakaszokból áll. Nincs külön összeállítási lépés; az tw::generate() minden meghívása lefuttatja a teljes folyamatot.

Kód
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

Feldolgozás. Az css-parser.php beolvassa az CSS bemenetet – @import, @theme, @utility, @layer, nyers szabályok – és ast.php csomópontokból (stílusszabályok, at-szabályok, deklarációk) álló absztrakt szintaxisfát készít belőle. Ebben a szakaszban oldja fel és helyettesíti a virtuális modulokhoz tartozó @import direktívákat (tailwindcss, tailwindcss/preflight, …) és a fájlútvonalakat.

A dizáj nrendszer felépítése. Az theme.php feloldja a téma értékeit (színek, térközök, töréspontok) a feldolgozott @theme blokkok és az alapértelmezések alapján. Az design-system.php a központi nyilvántartás, amely összekapcsolja a témát az utilities.php és variants.php által definiált segédosztály- és változatkeresésekkel.

A tartalom átvizsgálása. Az candidate.php kinyeri a megadott tartalomból (HTML, sablonok) az osztálynevekre jelölt elemeket, majd részeikre bontja őket: alaposztály, változatok, módosítók, tetszőleges értékek és fontos jelölő.

Fordítás. Az compile.php dizájnrendszerbeli kereséssel, a változatok és módosítók alkalmazásával AST-csomópontokká alakítja az egyes jelölteket. Azokat a jelölteket elveti, amelyek nem valós segédosztályra oldódnak fel.

Szerializálás és optimalizálás. Az ast.php toCss() végigjárja a fát (a segédfüggvények az walk.php alatt találhatók), és előállítja az CSS karakterláncot. A _tailwindphp/LightningCss.php alatt az lightningcss-nek megfelelő átalakítások futnak le, hogy a kimenet megfeleljen annak, amit az TailwindCSS a Rust utófeldolgozási lépése után állít elő.

Minimalizálás. Ha az minify engedélyezve van, az toCss() szerializálás közben minimalizált CSS kimenetet állít elő. Az önálló tw::minify() karakterlánc-átalakítást az _tailwindphp/CssMinifier.php végzi. Lásd: Gyorsítótárazás és minimalizálás.

Forráskód elrendezése

src/ a TailwindCSS mintáját követi. Az egyetlen szerkezeti változás: TailwindCSS utilities.ts eleme 6,000+ soros, ezért a karbantarthatóság érdekében src/utilities/ részre van bontva, kategóriánként egy fájllal.

Kód
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

A lightningcss megfelelője

A TailwindCSS a CSS utófeldolgozását – beágyazás, média lekérdezések kezelése, értékek egyszerűsítése – a lightningcss végzi, amely Rust nyelven írt elemző, átalakító és tömörítő. A PHP nem tud Rust könyvtárat betölteni, ezért a src/_tailwindphp/LightningCss.php újra megvalósítja azokat az átalakításokat, amelyekre TailwindPHP ténylegesen támaszkodik; a tesztcsomag által lefedett esetekben bájtról bájtra azonos kimenetet ad.

Az igazolt átalakítások:

Átalakítás Működés
Beágyazások kilapítása Feloldja a & szelektorokat a referencia :is(…) szabályai szerint, majd kilapítja a beágyazott szabályokat (handleNesting() a ast.php nyelven, a TailwindCSS lépés portja); a transformNesting alacsonyabb szintre alakítja az első deklarációt hordozó szint alatti beágyazásokat
Feltételes at-szabályok kilapítása Helyben kilapítja a beágyazott @media, @supports, @container és @starting-style szabályokat, megőrzi a forrás sorrendjét, és csak az azonos feltételű, közvetlenül szomszédos testvéreket vonja össze
Deklarációk rendezése A deklarációkat a lightningcss deklarációkezelő lánca szerint rendezi, így a tulajdonságok a referencia sorrendjében jelennek meg (reorderDeclarations)
calc() egyszerűsítése Egyszerűsíti a calc() kifejezéseket (simplifyCalcExpressions)
Kezdő nullák eltávolítása 0.5 → .5 (normalizeLeadingZeros)
Transzformációs függvények szóközei Egységesíti a szóközöket a transzformációs függvényeken belül (normalizeTransformFunctions)
Rácsértékek normalizálása Szóközöket tesz a / köré a span értékekben; a csupasz egész számokat px értékké alakítja a grid-template-* esetén (normalizeGridValues)
Színek normalizálása Normalizálja a szintaxist, és color-mix() értékét oklab() formára számítja ki (normalizeColors, evaluateColorMix)
URL idézőjelezése url(./x.jpg) → url("./x.jpg") (normalizeUrlQuoting)
Gyártóspecifikus előtagok A Autoprefixer megfelelő előtagolás (addVendorPrefixes)

Ez a fájl szándékosan a _tailwindphp/ alá van elkülönítve, és @port-deviation:replacement jelölést kapott – külső függőséget helyettesít, nem a TailwindCSS forrásának portja.

Porteltérések jelölései

Minden implementációs fájl dokumentációs blokkjában @port-deviation:* jelölések mutatják meg, hol és miért tér el a PHP implementáció a TypeScript eredetitől. Így a PHP és a TailwindCSS forrását összehasonlító olvasónak nem kell azon töprengenie, hogy szándékos-e az eltérés.

Jelölés Jelentés
@port-deviation:none Közvetlen, 1:1 port, jelentős eltérések nélkül
@port-deviation:async A PHP aszinkron kód helyett szinkron kódot használ
@port-deviation:storage Eltérő adatszerkezetek (PHP tömb a JS Map/Set helyett)
@port-deviation:types PHPDoc-megjegyzések TypeScript típusok helyett
@port-deviation:sourcemaps A forrástérkép-követés kimaradt
@port-deviation:enum PHP konstansok TypeScript felsorolások helyett
@port-deviation:errors Eltérő hibakezelési megközelítés
@port-deviation:replacement PHP implementáció váltja fel a külső könyvtárat (e.g. lightningcss)
@port-deviation:helper PHP-specifikus, az eredetiben nem szereplő segédfüggvény
@port-deviation:performance PHP-specifikus optimalizálás, amely megőrzi a kimenet azonosságát
@port-deviation:omitted Teljes modul vagy funkció kimaradt a portból (nem tartozik a hatókörbe)

A @port-deviation:performance jelölésekről és a paritás biztosításáról lásd a Teljesítmény és tesztelés oldalt.