Core
SERIXA compiles design tokens into static CSS. Apps never load cdn.tailwindcss.com or a runtime Tailwind compiler.
Widgets
→ Theme tokens / DefaultTheme class maps
→ SERIXA Theme Compiler (Serixa\Styling)
→ Optimized CSS
→ public/assets/serixa.cssframework/src/Styling/)| Class | Role |
|---|---|
StyleProperty | One CSS declaration |
StyleSelector | Rule selector |
StyleRule | Selector + properties |
ThemeCompiler | Tokens → CSS variables + .sx-* recipes |
CssOptimizer | Deduplicate selectors / merge properties |
CssWriter | Serialize and write CSS |
StyleCompiler | Full project pipeline |
StyleSheet | Register /assets/serixa.css + build() |
ThemeManifest | Build metadata (selectors, tokens, sizes) |
Serixa\Assets\StyleSheet remains as a thin compatibility façade.
ThemeCompiler emits:
:root / .dark CSS variables from design tokens Example: --sx-color-primary: #0284c7
Example: button.primary → .sx-btn-primary { background: var(--sx-color-primary); … }
Duplicate selectors are merged; later properties win.
vendor/bin/serixa build
# website:
composer build # → php bin/build-assets.phpSteps:
.sx-* recipes)framework/assets/css/serixa.css) for DefaultTheme mapsresources/css/app.csspublic/assets/serixa.css (+ BC alias public/assets/app.css)serixa.js runtimemanifest.json + theme-manifest.jsonuse Serixa\Styling\StyleSheet;
use Serixa\Runtime\ClientRuntime;
StyleSheet::register($document->assets()); // /assets/serixa.css
ClientRuntime::register($document->assets());Widget APIs (Button::make()->primary(), layout fill(), etc.) are unchanged. Only the styling backend compiles offline.
Token classes live under Serixa\Token\ (ColorToken, SpacingToken, RadiusToken, …). DefaultTheme maps tokens to utility classes for widgets; ThemeCompiler maps the same semantics to CSS variables and .sx-* recipes.
No internet is required at build or runtime. Rebuild the optional utility foundation with Node only when maintainers change safelists (tools/css/); apps consume the committed files.