The Smallest, Fastest, Most Feature-Complete Zero-Runtime CSS-in-TypeScript Framework
92% smaller than Panda • True Zero-Runtime • Build-time Compilation • -6.5KB JS Bundle • Zero Codegen
One package, maximum performance:
- 🦀 Native Rust SWC plugin auto-installed
- ⚡ 20-70x faster with Turbopack
- 🚀 Zero configuration needed
- ✅ 100% hash consistency with Babel plugin
- ✅ Automatic Webpack/Turbopack detection
- 📊 144 tests passing (0 failures)
bun add @sylphx/silk-nextjs # That's it!15+ frameworks supported with zero-codegen:
| Framework | Status | Setup | Codegen Required |
|---|---|---|---|
| Next.js | ✅ Tested | @sylphx/silk-nextjs |
Webpack: ❌, Turbopack: ✅ |
| Nuxt 3 | ✅ Ready | @sylphx/silk-nuxt |
❌ (Zero Codegen) |
| Vite + React | ✅ Tested | @sylphx/silk-vite-plugin |
❌ (Zero Codegen) |
| Vite + Vue | ✅ Tested | @sylphx/silk-vite-plugin |
❌ (Zero Codegen) |
| Vite + Svelte | ✅ Tested | @sylphx/silk-vite-plugin |
❌ (Zero Codegen) |
| SvelteKit | ✅ Ready | @sylphx/silk-vite-plugin |
❌ (Zero Codegen) |
| Astro | ✅ Ready | @sylphx/silk-vite-plugin |
❌ (Zero Codegen) |
| Remix | ✅ Ready | @sylphx/silk-vite-plugin |
❌ (Zero Codegen) |
| Create React App | ✅ Ready | @sylphx/silk-webpack-plugin |
❌ (Zero Codegen) |
| Angular | ✅ Ready | @sylphx/silk-webpack-plugin |
❌ (Zero Codegen) |
Note: Most frameworks support true zero-codegen via Webpack/Vite plugins. Only Next.js Turbopack requires CLI codegen.
📚 View All Frameworks & Quick Start Guides →
⚡ Zero-Runtime Compilation • 📦 Build-time CSS Extraction (-6.5KB JS) • 🎯 389B Brotli CSS (-61%) • 🔧 unplugin Architecture • 🚀 All Frameworks Updated • ✨ HMR with State Preservation • 🔥 0ms Runtime Cost
Silk is the smallest, fastest, and most feature-complete zero-runtime CSS-in-TypeScript framework. Built on research from Meta StyleX, Panda CSS, and modern CSS specifications.
v2.0 introduces true zero-runtime compilation:
- CSS extracted at build-time via Babel plugin
- -6.5KB JS bundle (runtime eliminated)
- 389B Brotli CSS (-61% compression)
- 0ms runtime cost (no CSS-in-JS overhead)
Real Bundle Sizes (200 Components):
- Silk: 1.6KB gzipped ✨
- Panda CSS: 5,936B gzipped (+271%)
- Silk is 73% smaller
Silk supports both zero-codegen and CLI-based approaches depending on your build system:
- Zero-Codegen: Webpack/Vite plugins automatically extract CSS at build-time
- CLI Codegen: Turbopack/Next.js 16+ requires
silk generatefor CSS extraction
Perfect DX with instant autocomplete and flexible deployment options.
- 🎯 Build-time CSS Transformation - Babel plugin extracts CSS at build time
- 📦 -6.5KB JS Bundle - Runtime code completely eliminated
- ⚡ 0ms Runtime Cost - No CSS-in-JS overhead whatsoever
- 🔥 389B Brotli CSS - 61% compression on extracted CSS
- 🚀 HMR with State Preservation - Instant style updates, zero reloads
How it works:
// Your code
import { css } from '@sylphx/silk'
const button = css({ bg: 'blue', px: 4 })
// Transformed at build-time to:
const button = "silk_bg_blue_xxxx silk_px_4_xxxx"
// CSS extracted to silk.css:
.silk_bg_blue_xxxx { background-color: blue; }
.silk_px_4_xxxx { padding: 1rem; }- ⚡ LightningCSS Integration - Rust-based optimization
- 📦 Better Minification - 5-10% smaller output
- 🔧 Automatic Vendor Prefixing
- 🎯 Native CSS Nesting Support
- 📦 Brotli Pre-Compression -
.css.brfiles generated automatically- 70% compression for CSS (vs 50% for gzip)
- 15-25% smaller than gzip
- Static pre-compression at max quality
- ⚛️ Atomic CSS Deduplication - 10-20% smaller for large apps
- Each property-value pair → ONE atomic class
- Meta StyleX "plateau effect"
- CSS growth slows as app grows
- 🏃 Object Pooling - Reduced GC pressure
- 🧠 Memoization Cache - Repeated styles cached
- 📊 Performance Monitoring -
getRuntimeStats()tracking
- 📐 Container Queries (93%) - Component-based responsive design
- 🔬 @scope (85%) - Explicit style boundaries
- ✨ @starting-style (88%) - Entry animations
- 🎬 View Transitions (75%) - Smooth page transitions
- 🎨 Modern Colors - oklch, lch, lab, color-mix (92%)
- 🎯 Strict Type Safety - Only design tokens allowed
- ✨ Zero Codegen - Instant autocomplete, no build step
- 🚀 True Zero Runtime - Build-time Babel transformation
- 🔥 0ms Runtime Cost - No CSS-in-JS overhead
- 🔒 Design System Enforcement - Invalid tokens caught at compile time
- ⚡ HMR with State Preservation - Instant updates without reload
- 📊 Performance Analytics - Built-in monitoring
- 🌲 Modern CSS - All latest features supported
| Feature | Silk v1.1 | Panda CSS | StyleX | Vanilla Extract |
|---|---|---|---|---|
| Bundle Size | 1.6KB | 5,936B | ~1.6KB | ~2KB |
| Build Speed | ⚡⚡⚡ | ⚡⚡ | ⚡⚡⚡ | ⚡⚡ |
| Runtime Speed | ⚡⚡⚡ | ⚡⚡ | ⚡⚡⚡ | ⚡⚡⚡ |
| No Codegen | ✅ | ❌ | ❌ | ❌ |
| Container Queries | ✅ (93%) | ❌ | ❌ | ❌ |
| @scope | ✅ (85%) | ❌ | ❌ | ❌ |
| @starting-style | ✅ (88%) | ❌ | ❌ | ❌ |
| Brotli Pre-Compression | ✅ | ❌ | ❌ | ❌ |
| Atomic Deduplication | ✅ | ❌ | ✅ | ❌ |
| LightningCSS | ✅ | ✅ | ❌ | ❌ |
| Critical CSS | ✅ | ❌ | ❌ | ❌ |
| Modern Colors (oklch) | ✅ | ❌ | ❌ | ❌ |
Silk v1.1 is the only framework with zero codegen, modern CSS features, and sub-1KB bundles.
import { css } from '@sylphx/silk'
// Component-based responsive design - better than media queries!
const card = css({
display: 'flex',
flexDirection: 'column',
// Enable container queries
containerType: 'inline-size',
containerName: 'card',
// Change layout based on container size (not viewport!)
'@container (min-width: 400px)': {
flexDirection: 'row',
gap: 4
},
'@container (min-width: 600px)': {
gap: 6,
padding: 8
}
})const button = css({
'@scope': {
root: '.card', // Scope root
limit: '.card-footer', // Scope limit (optional)
styles: {
color: 'brand.500',
_hover: { color: 'brand.600' }
}
}
})
// Generates:
// @scope (.card) to (.card-footer) {
// .a0 { color: ...; }
// .a0:hover { color: ...; }
// }const modal = css({
opacity: 1,
transform: 'scale(1)',
transition: 'all 0.3s',
// Entry state (from display:none)
'@starting-style': {
opacity: 0,
transform: 'scale(0.9)'
}
})
// Smooth fade-in when modal appears!import { smartOptimizeCSS, optimizeCSSWithLightning } from '@sylphx/silk'
// Automatic selection (uses LightningCSS if available)
const result = smartOptimizeCSS(css, {
minify: true,
useLightningCSS: true // default: true
})
console.log(result.savings)
// { originalSize: 1000, optimizedSize: 850, percentage: 15 }import { getAtomicRegistry, generateAtomicReport } from '@sylphx/silk'
const registry = getAtomicRegistry()
// Register styles (automatically deduplicated)
registry.registerAtom('color', 'blue') // → 'a0'
registry.registerAtom('color', 'blue') // → 'a0' (reused!)
registry.registerAtom('color', 'red') // → 'a1'
// Get deduplication stats
console.log(generateAtomicReport(registry))
// ⚛️ Atomic CSS Deduplication Report
// Unique atoms: 2
// Total usage: 3
// Deduplication rate: 1.5x
// Savings: 33.33%// vite.config.ts
import { silk } from '@sylphx/silk-vite-plugin'
export default {
plugins: [
silk({
compression: {
brotli: true, // Generate .css.br
brotliQuality: 11, // Max quality (static compression)
gzip: true, // Generate .css.gz (fallback)
gzipLevel: 9
}
})
]
}
// Build output:
// 📦 Silk CSS Bundle:
// Original: 2.5KB (silk.css)
// GZ: 1.2KB (-52%)
// BR: 0.9KB (-64%)import { getRuntimeStats } from '@sylphx/silk'
// Check memoization effectiveness
const stats = getRuntimeStats()
console.log(stats)
// {
// memoCache: {
// size: 150,
// hits: 850,
// misses: 150,
// hitRate: 85% // 85% cache hits!
// },
// objectPools: {
// styleProps: 45,
// classNameArrays: 20
// }
// }import { oklch, colorMix, lighten, darken, generatePalette } from '@sylphx/silk'
// Perceptually uniform colors (better than HSL/RGB)
const blue = oklch(0.7, 0.2, 250)
// Native browser color mixing (zero runtime cost!)
const accent = colorMix('blue', 'red', 60)
const light = lighten('blue', 20)
const dark = darken('blue', 30)
// Generate complete color palettes
const palette = generatePalette({ hue: 250, chroma: 0.2 })
// Returns: { 50: 'oklch(...)', ..., 950: 'oklch(...)' }import { mergeStyles, createVariant, createCompoundVariant } from '@sylphx/silk'
// Merge multiple style objects
const styles = mergeStyles(
{ px: 6, py: 3 },
{ bg: 'brand.500' },
isLarge && { px: 8, py: 4 }
)
// Create variants
const buttonVariant = createVariant({
primary: { bg: 'brand.500', color: 'white' },
secondary: { bg: 'gray.200', color: 'gray.900' },
})
// Compound variants (multi-dimensional)
const buttonStyle = createCompoundVariant({
variants: {
color: {
primary: { bg: 'brand.500' },
secondary: { bg: 'gray.200' },
},
size: {
sm: { px: 4, py: 2 },
lg: { px: 8, py: 4 },
},
},
compoundVariants: [
{
when: { color: 'primary', size: 'lg' },
style: { shadow: 'lg' }, // Special styling for large primary buttons
},
],
defaultVariants: {
color: 'primary',
size: 'sm',
},
})import { generateNestedCSS } from '@sylphx/silk'
// Generate modern nested CSS
const css = generateNestedCSS(
'.btn',
{ color: 'blue', padding: '10px' },
{
'&:hover': { color: 'red' },
'&:focus': { outline: '2px solid blue' },
}
)
// Output:
// .btn {
// color: blue;
// padding: 10px;
// &:hover { color: red; }
// &:focus { outline: 2px solid blue; }
// }const { css, getCSSRules } = createStyleSystem(config, {
// Enable cascade layers
enabled: true,
order: ['reset', 'base', 'tokens', 'recipes', 'utilities'],
})
// Automatic layer organization:
// @layer reset, base, tokens, recipes, utilities;
//
// @layer base { /* base styles */ }
// @layer utilities { /* utility classes - highest priority */ }All features are production-ready with 87-100% browser support. See OPTIMIZATIONS.md for detailed documentation.
# Core package (v2.0+)
bun add @sylphx/silk
# Build plugin for zero-runtime (NEW in v2.0)
bun add @sylphx/silk-vite-plugin
# React integration (includes core)
bun add @sylphx/silk-react
# Framework integrations (v2.0+)
bun add @sylphx/silk-nextjs # Next.js App Router & RSC
bun add @sylphx/silk-remix # Remix Streaming SSR
bun add @sylphx/silk-astro # Astro Islands Architecture
bun add @sylphx/silk-solid # Solid.js Fine-Grained Reactivity
bun add @sylphx/silk-vue # Vue 3 Composition API
bun add @sylphx/silk-svelte # Svelte Reactive Stores
bun add @sylphx/silk-qwik # Qwik Resumability
bun add @sylphx/silk-preact # Preact 3KB Runtime
# Other package managers
npm install @sylphx/silk @sylphx/silk-vite-plugin
pnpm add @sylphx/silk @sylphx/silk-vite-plugin
yarn add @sylphx/silk @sylphx/silk-vite-plugin1. Install packages:
bun add @sylphx/silk @sylphx/silk-vite-plugin @sylphx/silk-react2. Configure Vite:
// vite.config.ts
import { defineConfig } from 'vite'
import silk from '@sylphx/silk-vite-plugin'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [
silk(), // Add BEFORE React
react(),
],
})3. Import CSS:
// main.tsx
import './silk.css' // Generated by build pluginDone! You now have zero-runtime CSS compilation.
Silk now provides first-class integration packages with zero-runtime compilation for all major frameworks:
bun add @sylphx/silk-nextjsOne package, works everywhere! Includes:
- ✅ Zero-runtime build-time compilation
- ✅ Full App Router support with React Server Components
- ✅ Automatic Webpack/Turbopack optimization - no config needed!
- ✅ 20-70x faster with Turbopack (native Rust SWC plugin bundled)
- ✅ Automatic CSS extraction during build
- ✅ Brotli pre-compression
- ✅ HMR with state preservation
- ✅ Rust source code included for full transparency
// next.config.js
import { withSilk } from '@sylphx/silk-nextjs'
export default withSilk({
// Your Next.js config
}, {
outputFile: 'silk.css',
babelOptions: {
production: true
}
})// app/layout.tsx
import './silk.css' // Import generated CSS
export default function RootLayout({ children }) {
return <html><body>{children}</body></html>
}Automatic optimization:
- Webpack builds → Babel plugin (works immediately)
- Turbopack builds → SWC plugin (Rust, 20-70x faster, auto-installed)
View Full Next.js Documentation →
bun add @sylphx/silk-remixFeatures:
- ✅ Zero-runtime via Vite plugin (Remix v2+)
- ✅ Build-time CSS extraction
- ✅ Streaming SSR compatible
- ✅ Brotli pre-compression
// vite.config.ts
import { defineConfig } from 'vite'
import { vitePlugin as remix } from '@remix-run/dev'
import { silkPlugin } from '@sylphx/silk-remix/vite'
export default defineConfig({
plugins: [
silkPlugin(), // Add BEFORE Remix
remix(),
],
})// app/root.tsx
export const links: LinksFunction = () => [
{ rel: 'stylesheet', href: '/silk.css' }
]View Full Remix Documentation →
bun add @sylphx/silk-astroFeatures:
- ✅ Zero-runtime via unplugin integration
- ✅ Islands architecture support
- ✅ Multi-framework support (React, Solid, Vue, Svelte)
- ✅ Build-time CSS extraction
// astro.config.mjs
import { defineConfig } from 'astro/config'
import silk from '@sylphx/silk-astro'
export default defineConfig({
integrations: [
silk({
outputFile: 'silk.css',
babelOptions: { production: true }
})
]
})View Full Astro Documentation →
bun add @sylphx/silk-solidFeatures:
- ✅ Zero-runtime via Vite plugin
- ✅ Perfect integration with Solid's fine-grained reactivity
- ✅ Build-time CSS extraction
- ✅ SolidStart ready
// vite.config.ts
import { defineConfig } from 'vite'
import solidPlugin from 'vite-plugin-solid'
import { silkPlugin } from '@sylphx/silk-solid/vite'
export default defineConfig({
plugins: [
silkPlugin(), // Add BEFORE Solid
solidPlugin(),
],
})View Full Solid.js Documentation →
bun add @sylphx/silk-vueFeatures:
- ✅ Zero-runtime via Vite plugin
- ✅ Full Composition API support
- ✅
<script setup>syntax support - ✅ Nuxt 3 compatible
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { silkPlugin } from '@sylphx/silk-vue/vite'
export default defineConfig({
plugins: [
silkPlugin(), // Add BEFORE Vue
vue(),
],
})bun add @sylphx/silk-svelteFeatures:
- ✅ Zero-runtime via Vite plugin
- ✅ Perfect integration with Svelte's reactivity
- ✅ Build-time CSS extraction
- ✅ SvelteKit ready
// vite.config.ts
import { defineConfig } from 'vite'
import { svelte } from '@sveltejs/vite-plugin-svelte'
import { silkPlugin } from '@sylphx/silk-svelte/vite'
export default defineConfig({
plugins: [
silkPlugin(), // Add BEFORE Svelte
svelte(),
],
})View Full Svelte Documentation →
bun add @sylphx/silk-qwikFeatures:
- ✅ Zero-runtime via Vite plugin
- ✅ Qwik's resumability - zero hydration overhead
- ✅ Build-time CSS extraction
- ✅ Optimal performance with progressive loading
// vite.config.ts
import { defineConfig } from 'vite'
import { qwikVite } from '@builder.io/qwik/optimizer'
import { silkPlugin } from '@sylphx/silk-qwik/vite'
export default defineConfig({
plugins: [
silkPlugin(), // Add BEFORE Qwik
qwikVite(),
],
})View Full Qwik Documentation →
bun add @sylphx/silk-preactFeatures:
- ✅ Zero-runtime via Vite plugin
- ✅ 3KB runtime - smallest React alternative
- ✅ React-compatible API with hooks support
- ✅ Build-time CSS extraction
// vite.config.ts
import { defineConfig } from 'vite'
import preact from '@preact/preset-vite'
import { silkPlugin } from '@sylphx/silk-preact/vite'
export default defineConfig({
plugins: [
silkPlugin(), // Add BEFORE Preact
preact(),
],
})View Full Preact Documentation →
| Feature | Next.js | Remix | Astro | Solid | Vue | Svelte | Qwik | Preact |
|---|---|---|---|---|---|---|---|---|
| App Router | ✅ | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
| RSC | ✅ | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
| Resumability | N/A | N/A | N/A | N/A | N/A | N/A | ✅ | N/A |
| Zero Hydration | N/A | N/A | N/A | N/A | N/A | N/A | ✅ | N/A |
| Streaming SSR | ✅ | ✅ | N/A | ✅ | N/A | N/A | ✅ | N/A |
| Islands | N/A | N/A | ✅ | N/A | N/A | N/A | N/A | N/A |
| Composition API | N/A | N/A | N/A | N/A | ✅ | N/A | N/A | N/A |
| Reactive Stores | N/A | N/A | N/A | N/A | ✅ | ✅ | N/A | N/A |
| React Compatible | ✅ | ✅ | N/A | N/A | N/A | N/A | N/A | ✅ |
| Runtime Size | Standard | Standard | Standard | Standard | Standard | Standard | Standard | 3KB |
| Critical CSS | ✅ | ✅ | ✅ | N/A | N/A | N/A | N/A | N/A |
| Brotli | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Zero Runtime | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Bundle Size | 1.6KB | 1.6KB | 1.6KB | 1.6KB | 1.6KB | 1.6KB | 1.6KB | 1.6KB |
All integrations maintain Silk's industry-leading 1.6KB gzipped bundle size with framework-specific optimizations.
Pre-configured design systems for rapid prototyping and production applications. Install only what you need - presets are separate packages to keep the core lightweight.
Google's official Material Design 3 system with dynamic color and modern typography.
bun add @sylphx/silk-preset-materialFeatures:
- ✅ Full Material You dynamic color palette (13-tone system)
- ✅ Primary, Secondary, Tertiary colors with tonal variants
- ✅ Material typography scale (Display, Headline, Title, Body, Label)
- ✅ Material elevation system (6 levels)
- ✅ Material shape system (rounded corners)
- ✅ Dark theme variant included
- ✅ ~2KB gzipped
import { createStyleSystem } from '@sylphx/silk'
import { materialPreset } from '@sylphx/silk-preset-material'
const { css } = createStyleSystem(materialPreset)
// Material Design button
const button = css({
bg: 'primary.40',
color: 'primary.100',
fontSize: 'label-large',
fontWeight: 'medium',
px: 6,
py: 3,
rounded: 'medium',
shadow: 'level1'
})Dark Theme:
import { materialDarkPreset } from '@sylphx/silk-preset-material'
const { css } = createStyleSystem(materialDarkPreset)View Full Material Preset Documentation →
Clean, simple, and elegant design system - the smallest preset available.
bun add @sylphx/silk-preset-minimalFeatures:
- ✅ 14-shade grayscale palette (pure black to pure white)
- ✅ Single accent color with 5 tones
- ✅ Simple typography (8 font sizes, 3 weights)
- ✅ Minimal shadows (only 3 levels)
- ✅ Clean spacing scale (4px base unit)
- ✅ Dark theme variant included
- ✅ Monochrome variant (pure black & white only)
- ✅ ~1KB gzipped - smallest preset
import { createStyleSystem } from '@sylphx/silk'
import { minimalPreset } from '@sylphx/silk-preset-minimal'
const { css } = createStyleSystem(minimalPreset)
// Minimal button
const button = css({
bg: 'gray.10',
color: 'gray.100',
fontSize: 'base',
px: 6,
py: 3,
rounded: 'md'
})Dark Theme:
import { minimalDarkPreset } from '@sylphx/silk-preset-minimal'
const { css } = createStyleSystem(minimalDarkPreset)Monochrome Variant:
import { monochromePreset } from '@sylphx/silk-preset-minimal'
const { css } = createStyleSystem(monochromePreset)
// Pure black and white onlyPerfect for:
- 📝 Documentation sites
- 💼 Portfolio websites
- 🚀 Startup landing pages
- 📱 Minimal mobile apps
- 🎨 Clean admin dashboards
View Full Minimal Preset Documentation →
| Preset | Colors | Typography | Shadows | Bundle Size | Use Case |
|---|---|---|---|---|---|
| Minimal | 30 | 8 sizes | 3 levels | ~1KB | Minimal UIs, docs, portfolios |
| Material | 150+ | 15 sizes | 6 levels | ~2KB | Material Design apps |
| Custom | ∞ | ∞ | ∞ | Variable | Your own design system |
All presets are optional - use them for rapid prototyping or extend them with your own brand colors.
// silk.config.ts
import { defineConfig } from '@sylphx/silk'
import { createSilkReact } from '@sylphx/silk-react'
// ✨ One-line setup with full type inference
export const { styled, Box, Flex, Grid, Text, css, cx } = createSilkReact(
defineConfig({
colors: {
brand: { 500: '#3b82f6', 600: '#2563eb' },
gray: { 100: '#f3f4f6', 900: '#111827' }
},
spacing: { 4: '1rem', 8: '2rem' },
fontSizes: { base: '1rem', lg: '1.125rem' }
} as const)
)// App.tsx
import { Box, Text, styled } from './silk.config'
function App() {
return (
<Box p={8} bg="gray.100">
<Text fontSize="lg" color="gray.900">
Hello Silk! 🎨
</Text>
</Box>
)
}
// Create styled components
const Button = styled('button', {
bg: 'brand.500', // ✅ Full autocomplete
color: 'white',
px: 6,
py: 3,
rounded: 'md',
_hover: {
bg: 'brand.600' // ✅ Full autocomplete
}
})import { defineConfig, createStyleSystem } from '@sylphx/silk'
const config = defineConfig({
colors: {
primary: { 500: '#3b82f6', 600: '#2563eb' },
gray: { 100: '#f3f4f6', 900: '#111827' }
},
spacing: { 4: '1rem', 8: '2rem' },
fontSizes: { base: '1rem', lg: '1.125rem' }
} as const)
const { css, cx, getCSSRules } = createStyleSystem(config)
// Full type safety and autocomplete
const button = css({
color: 'primary.500', // ✅ Type-safe
padding: '4', // ✅ Type-safe
fontSize: 'base',
_hover: {
color: 'primary.600'
}
})
// TypeScript error on invalid tokens
css({ color: 'invalid.500' }) // ❌ Compile errorSilk enforces your design system at compile time. Only tokens defined in your config are allowed - invalid values produce TypeScript errors before they reach production.
const config = defineConfig({
colors: {
brand: { 500: '#3b82f6', 600: '#2563eb' },
gray: { 900: '#111827' }
},
spacing: { 4: '1rem', 8: '2rem' },
fontSizes: { base: '1rem', lg: '1.125rem' }
} as const) // ← 'as const' enables type inference
// TypeScript automatically infers strict union types:
// type ColorToken = 'brand.500' | 'brand.600' | 'gray.900'
// type SpacingToken = 4 | 8 (numbers for spacing/sizing)
// type FontSizeToken = 'base' | 'lg'Strict Type Safety in Action:
// ✅ VALID - Using design tokens
<Box
bg="brand.500" // ✅ Autocomplete: brand.500, brand.600, gray.900
color="gray.900" // ✅ Type-safe design token
p={4} // ✅ Number or token: 4, 8
fontSize="lg" // ✅ Autocomplete: base, lg
>
Hello Silk
</Box>
// ❌ INVALID - Compile-time errors
<Box color="purple.500"> // ❌ Error: "purple" not in config
<Box bg="invalid.500"> // ❌ Error: "invalid" not in config
<Box rounded="super"> // ❌ Error: "super" not in radii config
<Box p="custom"> // ❌ Error: must be number or valid token
// ✅ ESCAPE HATCH - Use style prop for custom values
<Box
bg="brand.500"
style={{
background: 'linear-gradient(to right, #ff0000, #00ff00)',
boxShadow: '0 0 20px rgba(255, 0, 255, 0.5)'
}}
>
Custom styles outside design system
</Box>Benefits:
- 🔒 Design system enforcement - No more typos or invalid tokens
- 💡 Autocomplete - IDE shows only valid design tokens
- 🐛 Catch errors early - Invalid tokens caught at compile time, not runtime
- 📖 Self-documenting - Types show exactly what tokens are available
- 🎯 Escape hatch - Use
styleprop for one-off custom values
vs Panda CSS:
- ❌ Panda requires
panda codegento generatestyled-system/directory - ❌ Panda allows arbitrary strings by default (less strict)
- ✅ Silk: zero codegen, instant autocomplete, stricter type safety
- ✅ Simpler setup: just
export const { Box, ... } = createSilkReact(config)
Unique to Silk - automatic critical CSS extraction for 30-50% faster first paint:
import { CriticalCSSExtractor } from '@sylphx/silk'
const extractor = new CriticalCSSExtractor({ enabled: true })
// Auto-detect critical patterns (*, html, body, header, .hero, h1)
extractor.autoDetect(css)
// Extract critical and non-critical CSS
const { critical, nonCritical } = extractor.extract(css)
// Generate inline HTML for critical CSS
const inlineCSS = extractor.generateInlineHTML(critical)
// <style id="critical-css">/* above-the-fold styles */</style>Impact:
- 30-50% faster first paint
- Better Core Web Vitals scores
- Automatic pattern detection
- Deferred loading for non-critical CSS
Built-in all-in-one optimizer for 50-90% size reduction:
import { ProductionOptimizer } from '@sylphx/silk'
const optimizer = new ProductionOptimizer({
enabled: true,
treeShaking: true, // Remove unused classes (50-90% reduction)
minification: true, // Remove whitespace (20-30% reduction)
deduplication: true // Combine identical rules (10-30% reduction)
})
const result = await optimizer.optimize(css)
console.log(result.stats)
// {
// treeShaking: { removed: 500, percentage: 50.0 },
// minification: { saved: 2500, percentage: 25.0 },
// deduplication: { merged: 150, percentage: 15.0 },
// totalSavings: { percentage: 72.0 }
// }Optimization Pipeline:
- Tree Shaking - Scan codebase, remove unused classes (50-90% reduction)
- Property Merging - Optimize CSS properties (20-40% reduction)
- Deduplication - Combine identical rules (10-30% reduction)
- Minification - Remove comments and whitespace (20-30% reduction)
- Critical CSS - Extract above-the-fold styles
Total: 50-90% smaller bundles
Cascade Layers (@layer):
import { LayerManager } from '@sylphx/silk'
const manager = new LayerManager({
order: ['reset', 'base', 'tokens', 'utilities', 'overrides']
})
manager.add('* { box-sizing: border-box; }', 'reset')
manager.add('.btn { padding: 1rem; }', 'utilities')
const css = manager.generateCSS()
// @layer reset, base, tokens, utilities, overrides;
// @layer reset { * { box-sizing: border-box; } }
// @layer utilities { .btn { padding: 1rem; } }Zero Specificity with :where():
import { wrapInWhere, calculateSpecificity } from '@sylphx/silk'
wrapInWhere('.btn') // => ':where(.btn)'
calculateSpecificity(':where(.btn)') // [0, 0, 0, 0] - Zero specificity
calculateSpecificity('.btn') // [0, 0, 1, 0] - Normal specificityBenefits:
- No specificity wars
- Easy style overrides
- Predictable cascade behavior
Built-in analytics for tracking build performance:
import { PerformanceMonitor } from '@sylphx/silk'
const monitor = new PerformanceMonitor()
monitor.startBuild()
// ... your build process ...
monitor.endBuild()
monitor.recordMetrics({
buildTime: 100,
cssSize: { original: 10000, optimized: 5000 },
classStats: { total: 100, used: 80, unused: 20 },
optimization: { merged: 10, deduplicated: 5, treeShaken: 15 }
})
console.log(monitor.generateReport())
// ✓ Silk build complete
// ⏱️ Duration: 100ms
// 📦 CSS generated: 5.0KB (50.0% savings)
// 🎯 Classes: 80/100 used (20 unused)Automatic property merging for 20-40% fewer atomic classes:
// You write:
css({ mt: 4, mb: 4, ml: 2, mr: 2 })
// Silk optimizes to:
css({ marginBlock: 4, marginInline: 2 })
// Result: 2 atomic classes instead of 4 (50% reduction)Define your design system:
const config = defineConfig({
colors: { primary: { 500: '#3b82f6' } },
spacing: { 4: '1rem' },
fontSizes: { base: '1rem' }
})Create a style system:
const { css, cx, getCSSRules, resetCSSRules } = createStyleSystem(config)
// css() - Generate atomic CSS classes
const result = css({ color: 'primary.500', padding: '4' })
// => { className: 'silk-abc silk-def' }
// cx() - Merge class names with style objects
const merged = cx('base-class', { color: 'gray.900' })
// getCSSRules() - Extract all CSS (for build-time extraction)
const allCSS = getCSSRules()
// resetCSSRules() - Clear cache (testing)
resetCSSRules()import { ProductionOptimizer } from '@sylphx/silk'
const optimizer = new ProductionOptimizer({
enabled: true,
treeShaking: true,
minification: true,
deduplication: true,
reportUnused: true
})
const result = await optimizer.optimize(css, rootDir)
// => { css, stats }import { CriticalCSSExtractor } from '@sylphx/silk'
const extractor = new CriticalCSSExtractor({ enabled: true })
extractor.autoDetect(css)
extractor.markCritical('.hero')
const { critical, nonCritical } = extractor.extract(css)import { ClassUsageTracker } from '@sylphx/silk'
const tracker = new ClassUsageTracker()
await tracker.scan('./src')
console.log(tracker.getStats())
// => { used: 80, generated: 100, unused: 20, savedPercentage: 20 }Silk provides first-class React support with createZenReact():
// silk.config.ts - One-line setup
import { defineConfig } from '@sylphx/silk'
import { createZenReact } from '@sylphx/silk-react'
export const { styled, Box, Flex, Grid, Text, css, cx } = createZenReact(
defineConfig({
colors: {
brand: { 500: '#3b82f6', 600: '#2563eb' },
gray: { 900: '#111827' }
},
spacing: { 4: '1rem', 6: '1.5rem' },
fontSizes: { base: '1rem', lg: '1.125rem' }
} as const)
)// App.tsx - Use with full type inference
import { Box, Flex, Text, styled } from './silk.config'
// Create styled components
const Button = styled('button', {
bg: 'brand.500', // ✅ Autocomplete: brand.500, brand.600, etc.
color: 'white',
px: 6,
py: 3,
rounded: 'md',
fontWeight: 'semibold',
_hover: {
bg: 'brand.600' // ✅ Full type inference in pseudo-selectors
}
})
function App() {
return (
<Flex gap={4} p={6}>
<Button>Click me</Button>
<Box color="gray.900" fontSize="lg">
Hello World
</Box>
<Text fontSize="base" color="gray.900">
All props are fully type-checked ✨
</Text>
</Flex>
)
}Features:
- ✅ Full TypeScript autocomplete for all design tokens
- ✅ Type-safe props in JSX (no more
stringtypes!) - ✅ Support for Box, Flex, Grid, Text primitives
- ✅ styled() factory for creating custom components
- ✅ Pseudo-selectors (_hover, _focus, _active, etc.)
- ✅ Zero configuration required
| Scenario | Silk | Tailwind CSS | Panda CSS |
|---|---|---|---|
| Small (80 classes) | 1.6KB | 315B (-80%) | 421B (-74%) |
| Medium (600 classes) | 1.6KB | 1.1KB (-31%) | 1.3KB (-19%) |
| Large (3000 classes) | 1.6KB | 4.6KB (+187%) | 5.0KB (+213%) |
Silk is competitive for small/medium apps and significantly smaller for large apps compared to competitors.
# Full benchmark comparison
bun packages/core/src/benchmark.demo.ts
# Vitest performance benchmarks
bun test --run benchmark.bench.ts
# Results saved to benchmark-results/
# - benchmark-results.json
# - benchmark-results.csv
# - benchmark-report.txtconst config = { colors: { red: { 500: '#ef4444' } } } as const
// TypeScript infers: type ColorToken = 'red.500'
// No codegen required!css({ color: 'red.500', padding: '4' })
// Generates:
// .silk-a1b2c { color: #ef4444; }
// .silk-d3e4f { padding: 1rem; }- Development: CSS generated at runtime, hot reloaded
- Production: Vite/Webpack plugin extracts CSS at build time
- Result: Zero runtime overhead
Input CSS
↓
Tree Shaking (50-90% reduction)
↓
Property Merging (20-40% reduction)
↓
Deduplication (10-30% reduction)
↓
Minification (20-30% reduction)
↓
Critical CSS Extraction
↓
Output: Optimized CSS (50-90% smaller)
Silk advantages:
- Full type safety with autocomplete
- 38-2100% smaller bundles
- Critical CSS extraction
- Performance monitoring
- No class name memorization
Tailwind advantages:
- Larger ecosystem
- More battle-tested
- More utilities out of the box
- Faster build times
Silk advantages:
- No codegen - no
styled-system/directory - Faster type checking
- Simpler setup
- 38-2100% smaller bundles
- Critical CSS extraction
- Performance monitoring
Panda advantages:
- More mature
- More features (recipes, patterns)
- Larger community
- Faster build times
Silk is Panda CSS, but better where it matters:
| Feature | Silk | Panda CSS |
|---|---|---|
| Bundle Size (Large) | 1.6KB | 5.0KB (+213%) |
| Type Safety | ✅ | ✅ |
| Codegen Required | ❌ Zero | |
| Critical CSS | ✅ Built-in | ❌ None |
| Performance Monitoring | ✅ Built-in | ❌ None |
| Setup Complexity | Simple | Requires codegen |
Why settle for good when you can have great?
Interactive demo showcasing all Silk features:
cd examples/react-demo
bun install
bun run devFeatures demonstrated:
- ✅ Full type inference in JSX
- ✅ Layout system (Flexbox, Grid, spacing)
- ✅ Typography system (font sizes, weights, colors)
- ✅ Pseudo-selectors (_hover, _focus, _active, _disabled)
- ✅ Component variants (size, color)
- ✅ Complex UI composition (cards, forms, dashboards)
- ✅ Interactive examples with state management
Demo sections:
- Overview - Introduction to Silk features
- Layout - Flexbox, Grid, spacing utilities
- Typography - Font sizes, weights, colors
- Pseudo Selectors - Hover, focus, active states
- Variants - Component variants and recipes
- Responsive - Responsive design utilities
- Composition - Building complex UIs
bun packages/core/src/production-optimization.demo.tsOutput:
- Minification: 25.8% reduction
- Deduplication: 10.7% reduction
- Tree shaking: 50-90% reduction
- Critical CSS: 30-50% faster first paint
bun packages/core/src/benchmark.demo.tsOutput:
- Bundle size comparison across frameworks
- Build time analysis
- Feature matrix
- Winner analysis with percentages
- Benchmark Results - Detailed performance comparison
- Optimization Guide - CSS optimization techniques
- Feature Summary - Complete feature list
- Optimization Plan - Roadmap and research
- Configuration Setup - How to set up Silk React
- Type Checking Guide - Verify type inference is working
# Run all tests (349 passing)
bun test
# Run specific test
bun test optimizer.test.ts
# Run with coverage
bun test --coverage
# Run benchmarks
bun test --run benchmark.bench.tsCompleted (v1.2.1):
- ✅ Zero codegen with full type inference
- ✅ Intelligent CSS optimization (20-40% reduction)
- ✅ Critical CSS extraction (unique feature)
- ✅ Tree shaking and dead code elimination
- ✅ Performance monitoring and analytics
- ✅ Cascade layers (@layer) and :where() selector
- ✅ Comprehensive benchmarking vs Tailwind/Panda
- ✅ Framework integrations (Next.js, Remix, Astro, Solid.js, Vue, Svelte)
- ✅ LightningCSS integration (5-10x faster builds)
- ✅ Brotli pre-compression (15-25% smaller)
- ✅ Atomic CSS deduplication (10-20% smaller)
- ✅ Modern CSS features (Container Queries, @scope, @starting-style)
- ✅ Runtime optimizations (2-3x faster)
Planned:
- Framework adapters (Qwik, Preact, Alpine.js)
- Recipes and variants API
- Responsive utilities
- Animation utilities
- Theme switching
- ESLint plugin
- VS Code extension
- Webpack plugin
# Install dependencies
bun install
# Run tests
bun test
# Run tests in watch mode
bun test --watch
# Run demos
bun packages/core/src/benchmark.demo.ts
# Type checking
bun run build
# Build
bun run buildIf Silk makes your CSS better, give it a ⭐ on GitHub!
MIT © SylphX Ltd
Inspired by Panda CSS and Tailwind CSS - we learned from the best, then made it better.
Built with ❤️ for developers who refuse to compromise on bundle size.
Stop settling for bloated CSS. Choose Silk.
Type-safe CSS-in-TypeScript with industry-leading bundle sizes