π Automated CSS-in-JS to Tailwind CSS Migration Tool
Transform your React applications from Material-UI makeStyles/useStyles to Tailwind CSS automatically. Built for large-scale migrations with intelligent handling of complex scenarios.
- π Automatic Conversion: Converts CSS-in-JS styles to equivalent Tailwind classes
- π§ Smart Preservation: Keeps unmigrated styles intact when full conversion isn't possible
- π± Responsive Support: Handles Material-UI breakpoints and responsive styles
- π¨ Theme Mapping: Maps Material-UI theme values to Tailwind equivalents
- π§ Import Cleanup: Removes unused imports when migration is complete
- π Detailed Reports: Comprehensive migration reports with statistics and warnings
- π§ͺ Test Mode: Preview changes before applying them
# Preview changes without modifying files
npx mttwm migrate --pattern "src/**/*.tsx" --dry-runIf you see errors for unknown theme properties, create a config file:
// mttwm.config.js (create in your project root)
export default {
customThemeMapping: {
'theme.custom.primary': 'bg-blue-500',
'theme.custom.secondary': 'text-gray-600',
// Add more mappings as needed
}
};# Apply the actual migration
npx mttwm migrate --pattern "src/**/*.tsx"# Use directly without installation
npx mttwm migrate --pattern "src/**/*.tsx" --dry-run# Install globally for repeated use
npm install -g mttwm
mttwm migrate --pattern "src/**/*.tsx" --dry-run# Clone the repository
git clone https://github.com/shameondev/MaterialMigrator.git
cd MaterialMigrator
# Install dependencies and build
npm install
npm run build
npm link
# In your project directory:
npm link mttwm# Test migration on specific files (dry run)
mttwm migrate path/to/component.tsx --dry-run
# Test migration with patterns (dry run)
mttwm migrate --pattern "src/**/*.tsx" --dry-run
# Apply migration to specific files
mttwm migrate path/to/component.tsx
# Apply migration with patterns
mttwm migrate --pattern "src/**/*.tsx"
# Generate detailed report
mttwm migrate --pattern "src/**/*.tsx" --generate-reportπ For detailed integration instructions, see INTEGRATION.md
- π npm package: mttwm - Install with
npm install -g mttwm - π Changelog: CHANGELOG.md - See all release notes and version history
- π·οΈ Releases: GitHub Releases - Download specific versions
The single command for all migration operations:
# Preview migration (dry run) - specific files
mttwm migrate src/component.tsx --dry-run
# Preview migration (dry run) - using patterns
mttwm migrate --pattern "src/**/*.tsx" --dry-run
# Apply migration - specific files
mttwm migrate src/component.tsx
# Apply migration - using patterns with options
mttwm migrate --pattern "src/components/**/*.tsx" --pattern "src/views/**/*.tsx"
# Exclude patterns and preserve originals
mttwm migrate --pattern "src/**/*.tsx" --exclude "**/*.test.tsx" --preserve-original
# Generate detailed report
mttwm migrate --pattern "src/**/*.tsx" --generate-report --verbose- Basic CSS properties (padding, margin, colors, etc.)
- Flexbox and Grid layouts
- Typography styles
- Border and border-radius
- Background colors and basic backgrounds
- Material-UI theme references
- Responsive breakpoints
- Pseudo-selectors (hover, focus, etc.)
- Complex calc() expressions
- CSS custom properties/variables
- Advanced transforms and filters
- Complex background images
- Keyframe animations
- Complex nested selectors
- CSS masks and clip-path
- Multiple background layers
- Advanced CSS functions
The tool uses intelligent preservation logic:
-
Full Migration: When ALL styles in a
useStyleshook can be converted- Removes
makeStylesimport and call - Removes
const classes = useStyles(); - Replaces all
className={classes.styleName}with Tailwind classes - Cleans up unused imports
- Removes
-
Partial Preservation: When some styles cannot be converted
- Keeps original
makeStylesanduseStylesintact - Preserves all
className={classes.styleName}usages - No modifications to ensure code continues working
- Keeps original
The project includes comprehensive test files covering various scenarios:
1-simple-styles.test.tsx- Basic CSS properties2-theme-references.test.tsx- Material-UI theme usage3-responsive-styles.test.tsx- Breakpoint handling4-dynamic-styles.test.tsx- Dynamic/conditional styles5-pseudo-selectors.test.tsx- Hover, focus states6-complex-styles.test.tsx- Complex CSS that requires manual review
The CLI currently has built-in theme mappings for common Material-UI patterns. For custom theme properties, you have these options:
Create a mttwm.config.js file in your project root:
// mttwm.config.js
export default {
customThemeMapping: {
'theme.custom.secondary': 'text-blue-600',
'theme.custom.primary': 'bg-red-500',
'theme.custom.main': 'text-primary',
'theme.superCustom.bg': 'bg-gray-100',
'theme.custom.spacing.large': 'p-8',
},
customPropertyMapping: {
'boxShadow': (value) => `shadow-custom-${value}`,
},
verbose: true,
maxWarningsPerFile: 100,
};Then run:
npx mttwm migrate --pattern "src/**/*.tsx" --dry-runThe tool will automatically load your config file and show:
π Loaded config from /path/to/your/project/mttwm.config.js
The tool automatically handles common patterns:
npx mttwm migrate src/**/*.tsx --dry-runBuilt-in conversions:
theme.palette.primary.mainβ CSS variablestheme.spacing(n)β Tailwind spacing classestheme.breakpoints.up("md")β responsive prefixestheme.custom.*β CSS variables
For advanced customization, use the tool programmatically:
// migrate-script.js
import { MigrationTool } from 'mttwm';
const config = {
projectRoot: process.cwd(),
writeFiles: false, // dry run
include: ['src/**/*.tsx'],
exclude: ['node_modules/**'],
customThemeMapping: {
'theme.custom.primaryColor': 'text-blue-600',
'theme.custom.main': 'text-primary',
'theme.custom.spacing.large': 'p-8',
'theme.palette.primary.main': 'text-blue-500',
},
customPropertyMapping: {
'boxShadow': (value) => `shadow-custom-${value}`,
}
};
const tool = new MigrationTool(config);
const files = ['src/components/Button.tsx'];
await tool.test(files); // or tool.migrate(files)node migrate-script.jsStep 1: Run migration with --dry-run
npx mttwm migrate --pattern "src/**/*.tsx" --dry-runStep 2: Create mttwm.config.js for unknown properties When you see errors like this:
β Unknown theme property: theme.custom.secondary
π§ Create a config file to map this property:
1. Create mttwm.config.js in your project root:
// mttwm.config.js
export default {
customThemeMapping: {
'theme.custom.secondary': 'your-tailwind-class-here'
}
};
2. Run the migration again:
npx mttwm migrate --pattern "src/**/*.tsx" --dry-run
Create the config file with your mappings:
// mttwm.config.js
export default {
customThemeMapping: {
// Background colors
'theme.custom.primary': 'bg-blue-500',
'theme.custom.secondary': 'bg-gray-100',
'theme.superCustom.background': 'bg-white',
// Text colors
'theme.custom.textPrimary': 'text-gray-900',
'theme.custom.textSecondary': 'text-gray-600',
// Border styles
'theme.custom.borderColor': 'border-gray-300',
'theme.custom.borderRadius': 'rounded-lg',
// Spacing (if needed)
'theme.custom.spacing': 'p-4',
},
verbose: true
};Step 3: Apply the migration
npx mttwm migrate --pattern "src/**/*.tsx"The tool handles both optional chaining and regular syntax:
theme.custom?.mainβ requires config mappingtheme.custom.mainβ requires config mapping- Both use the same
'theme.custom.main': 'bg-blue-500'mapping
- β
Built-in properties:
theme.palette.*,theme.spacing.*,theme.breakpoints.*β work automatically - βοΈ Custom properties:
theme.custom.*,theme.superCustom.*β require config mapping in mttwm.config.js
Generate detailed JSON reports with:
mttwm migrate --pattern "src/**/*.tsx" --generate-reportThe report includes:
- Conversion statistics per file
- List of warnings and unconvertible styles
- Before/after code samples
- Migration success rates
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Run tests (
npm test) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Built for large-scale React application migrations
- Inspired by the need for automated CSS-in-JS to Tailwind transitions
- Designed with safety and reliability in mind for production codebases