@poupe/tailwindcss v0.4.0
@poupe/tailwindcss
TailwindCSS v4 plugin for Material Design 3 themes with automatic dark mode, elevation shadows, scrim overlays, and component utilities.
Table of Contents
- Features
- Installation
- Usage
- Color System
- Shadow System
- Scrim Utilities
- Surface Components
- Dark Mode
- Configuration Options
- API Reference
- Integration with Poupe Ecosystem
- Requirements
- License
Features
- 🎨 Material Design 3 color system with automatic dark themes
- 🌓 Built-in dark mode support (class or media query)
- ✨ Elevation shadows with z-level utilities (z1-z5)
- 🎭 Scrim overlays with Material Design z-index layering
- 🛠️ Surface component utilities with proper contrast
- 📦 Lightweight, tree-shakable API
- 🧩 CSS variables for external customization
Installation
# npm
npm install -D @poupe/tailwindcss tailwindcss@4
# yarn
yarn add -D @poupe/tailwindcss tailwindcss@4
# pnpm
pnpm add -D @poupe/tailwindcss tailwindcss@4Usage
Basic Configuration
tailwind.config.ts:
import { themePlugin } from '@poupe/tailwindcss'
export default {
plugins: [
themePlugin({
colors: {
primary: '#1976d2',
secondary: '#9c27b0',
}
}),
],
}Flat Plugin API
More concise configuration:
import flatPlugin from '@poupe/tailwindcss'
export default {
plugins: [
flatPlugin({
primary: '#6750A4',
secondary: '#958DA5',
error: '#B3261E',
// Custom shades: [color, harmonize, ...shades]
neutral: ['#E4E1F6', true, 50, 100, 200, 300, 400, 500,
600, 700, 800, 900]
}),
],
}CSS @plugin
Direct CSS integration:
@import 'tailwindcss';
@plugin '@poupe/tailwindcss' {
primary: #6750A4;
secondary: #958DA5;
}CSS Assets
The package provides two pre-built CSS files that extend TailwindCSS v4:
style.css
Minimal theme-agnostic utilities and components:
- Surface component utilities
- Shadow system utilities (z1-z5)
- Scrim overlay utilities
- Material Design z-index system
- No color values - bring your own theme
Usage with TailwindCSS:
/* Import together with TailwindCSS base */
@import 'tailwindcss';
@import '@poupe/tailwindcss'; /* or '@poupe/tailwindcss/style.css' */default.css
Complete example with Material Design 3 theme:
- Full set of Material Design 3 CSS custom properties
- Default color values for all theme colors
- Complete shadow and elevation system
- All surface and scrim utilities
- Fixed color surface combinations
- Ready-to-use example theme
Usage:
/* Import together with TailwindCSS base */
@import 'tailwindcss';
@import '@poupe/tailwindcss/default.css';
/* Override any variables as needed */Note: These CSS files contain TailwindCSS v4 directives (@theme, @utility) and must be used together with TailwindCSS base styles.
Shadow utilities:
<div class="shadow-z1">Level 1</div>
<div class="shadow-z2">Level 2 (default)</div>
<div class="shadow-z3">Level 3</div>
<div class="shadow-z4">Level 4</div>
<div class="shadow-z5">Level 5</div>
<div class="inset-shadow">Inset Shadow</div>Scrim Utilities
Modal backdrop overlays with Material Design z-index layering:
<!-- Semantic z-index levels -->
<div class="scrim-modal">Modal backdrop</div>
<div class="scrim-drawer">Drawer backdrop</div>
<div class="scrim-elevated">High priority overlay</div>
<!-- With opacity modifiers -->
<div class="scrim-modal/50">Modal with 50% opacity</div>
<div class="scrim-drawer/75">Drawer with 75% opacity</div>
<div class="scrim-content/25">Content overlay with 25% opacity</div>
<!-- Arbitrary z-index values with opacity -->
<div class="scrim-[1250]">Custom z-index</div>
<div class="scrim-[1250]/40">Custom z-index with 40% opacity</div>
<div class="scrim-[var(--custom-z)]/60">CSS variable with 60% opacity</div>Material Design z-index scale:
--md-z-navigation-persistent: 1000; /* Mobile stepper, bottom nav */
--md-z-navigation-floating: 1050; /* FAB, speed dial */
--md-z-navigation-top: 1100; /* App bar, top navigation */
--md-z-drawer: 1200; /* Navigation drawer */
--md-z-modal: 1300; /* Modal dialogs */
--md-z-snackbar: 1400; /* Snackbars, toasts */
--md-z-tooltip: 1500; /* Tooltips */Scrim variants (simplified naming):
scrim-base(950) - Basic overlay, below navigationscrim-content(975) - Content overlayscrim-drawer(1250) - Drawer overlaysscrim-modal(1275) - Modal preparationscrim-elevated(1350) - High-priority overlaysscrim-system(1450) - System-level scrims
Opacity Support
All scrim utilities support Tailwind's opacity modifier syntax:
- Default opacity: 32% (when no modifier is used)
- Custom opacity:
scrim-modal/50,scrim-drawer/75, etc. - Arbitrary z-index with opacity:
scrim-[100]/25
Technical Implementation:
- Uses
--md-scrim-rgbvariable (following the same pattern as--md-shadow-rgb) - TailwindCSS v4
--modifier([percentage])for capturing modifier values - CSS custom properties enable dynamic opacity:
var(--md-scrim-opacity, 32%) - Automatic theme switching for scrim colors in dark/light modes
- Bridge pattern converts v4 syntax to v3 matchUtilities for broad compatibility
Programmatic Theme Generation
Generate CSS themes programmatically:
import { makeThemeFromPartialOptions, formatTheme } from
'@poupe/tailwindcss'
const theme = makeThemeFromPartialOptions({
colors: {
primary: { value: '#6750A4' },
secondary: { value: '#958DA5' },
},
})
const css = formatTheme(theme, 'class', ' ')
console.log(css.join('\n'))Color System
Comprehensive color palette with Tailwind CSS and CSS named colors:
- Tailwind Colors: Modern palette (slate, gray/grey, zinc, neutral, stone, red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink, rose)
- CSS Named Colors: Complete CSS specification fallback (149 colors)
- Color Priority: Tailwind colors take precedence over CSS named colors
- Material Design 3: Semantic colors with automatic dark themes
- Color Shades: Automatic shade variants (50-900)
- CSS Variables: All colors accessible as
--md-*
:root {
--md-primary: 103, 80, 164;
--md-primary-50: 244, 242, 250;
--md-primary-500: 103, 80, 164;
--md-primary-900: 30, 27, 38;
}Color Resolution
Colors are resolved with priority order:
import { withKnownColor } from '@poupe/tailwindcss'
// Tailwind colors (highest priority)
withKnownColor('blue') // '#3b82f6' (Tailwind blue)
withKnownColor('red') // '#ef4444' (Tailwind red)
withKnownColor('gray') // '#6b7280' (Tailwind gray)
withKnownColor('grey') // '#6b7280' (British spelling alias)
// CSS named colors (fallback)
withKnownColor('crimson') // '#dc143c' (CSS named color)
withKnownColor('navy') // '#000080' (CSS named color)
// Unknown colors (unchanged)
withKnownColor('#custom') // '#custom' (unchanged)Color Customization
Various color definition formats:
flatPlugin({
primary: '#6750A4', // Basic color
secondary: ['#958DA5', false], // No harmonization
neutral: [50, 100, 200, 300, 400, 500], // Custom shades
tertiary: ['#B58392', true, 50, 500], // Harmonize + shades
})Shadow System
Material Design 3 elevation system with 5 z-levels:
- z1: Subtle elevation
- z2/DEFAULT: Standard floating elements
- z3: Prominent UI elements
- z4: Important modal windows
- z5: Critical/focused elements
Shadow utilities use --md-shadow-rgb variable for customization, while scrim utilities use --md-scrim-rgb:
--shadow-z1: 0 1px 4px 0 rgba(var(--md-shadow-rgb), 0.37);
--shadow-z2: 0 2px 2px 0 rgba(var(--md-shadow-rgb), 0.20),
0 6px 10px 0 rgba(var(--md-shadow-rgb), 0.30);<div class="shadow-z1">Level 1</div>
<div class="drop-shadow-z3">Drop shadow</div>
<div class="inset-shadow">Inset effect</div>Surface Components
Component utilities with background + text color and proper contrast:
<div class="surface-primary">Primary Surface</div>
<div class="surface-secondary">Secondary Surface</div>
<div class="surface-secondary-container">Secondary Container</div>
<div class="surface-container-lowest">Lowest</div>
<div class="surface-container-low">Low</div>
<div class="surface-container">Standard</div>
<div class="surface-container-high">High</div>
<div class="surface-container-highest">Highest</div>
<!-- Fixed color combinations -->
<div class="surface-primary-fixed">Fixed background with on-fixed text</div>
<div class="surface-primary-fixed-variant">Fixed background with variant text</div>
<div class="surface-primary-fixed-dim">Dim fixed background with on-fixed text</div>
<div class="surface-primary-fixed-dim-variant">Dim fixed with variant text</div>Dark Mode
Automatic dark mode variants using .dark class (default):
<html class="dark"><!-- Dark mode active --></html>Customize dark mode strategy:
themePlugin({
darkMode: 'class', // Default: .dark class
// darkMode: 'media', // Use @media (prefers-color-scheme)
// darkSuffix: '-dark', // Custom dark selector
})Configuration Options
themePlugin() - structured options:
{
themePrefix: 'md-',
surfacePrefix: 'surface-',
omitTheme: false,
darkSuffix: '',
shades: [50,100,200,300,400,500,600,700,800,900],
colors: { primary: { value: '#6750A4' } }
}flatPlugin() - flat color properties:
{
themePrefix: 'md-',
surfacePrefix: 'surface-',
primary: '#6750A4', // Direct color definition
secondary: ['#958DA5', false], // [color, harmonize]
neutral: [50, 100, 200, 500] // Custom shades
}API Reference
// Main exports
import flatPlugin, {
themePlugin,
makeThemeFromPartialOptions,
formatTheme,
colorFormatter
} from '@poupe/tailwindcss'
// Color system
import { defaultColors, withKnownColor } from
'@poupe/tailwindcss/theme'
// Theme utilities
import { makeTheme, makeShadows, makeShades } from
'@poupe/tailwindcss/theme'
// Color formatters: 'rgb' | 'hsl' | 'hex' | 'numbers'
const formatter = colorFormatter('rgb')Ecosystem
- @poupe/theme-builder - MD3 token generation
- @poupe/vue - Vue components
- @poupe/nuxt - Nuxt integration
Requirements
- Node.js >=20, TailwindCSS ^4.1
License
MIT
9 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago