gehrisandro/tailwind-merge-php
Merge Tailwind CSS class strings in PHP with automatic conflict resolution (last class wins), ported from tailwind-merge. Supports Tailwind v3.0–v3.4, configurable and cacheable. Requires PHP 8.1+.
illuminate/support dependency (v1.0.0+) ensures zero Laravel-specific bloat, improving portability while maintaining Laravel compatibility.bg-{tenantId} + hover:bg-secondary).// app/Providers/AppServiceProvider.php
Blade::directive('merge', function ($expression) {
return "<?php echo TailwindMerge::instance()->merge($expression); ?>";
});
Usage in Blade:
<div class="{{ merge(['text-red-500', 'text-blue-500']) }}">Merged!</div>
// Livewire component
public function render()
{
$mergedClasses = TailwindMerge::instance()->merge(
'bg-white dark:bg-gray-800',
$this->user->prefersDarkMode ? 'bg-gray-900' : ''
);
return view('livewire.component', ['classes' => $mergedClasses]);
}
| Risk Area | Mitigation Strategy |
|---|---|
| Custom Tailwind Configs | Package provides configuration overrides for non-standard setups (e.g., custom font sizes, arbitrary values). Test thoroughly with your tailwind.config.js. |
| Performance Overhead | Optional PSR-16 caching reduces latency in high-frequency merges (e.g., Livewire). Benchmark with your workload. |
| Arbitrary Value Support | Handles [...] syntax but may require configuration tweaks for edge cases (e.g., custom CSS variables). |
| Dark Mode/State Conflicts | Test with dark:, hover:, focus:, etc., to ensure expected behavior. |
| Backward Compatibility | Actively maintained (last release: 2026-03-21). Monitor for Tailwind CSS v4+ support. |
| Dependency Bloat | Lightweight (~10KB) with no Laravel-specific dependencies post-v1.0.0. |
| Laravel Component | Integration Strategy |
|---|---|
| Blade Templates | Use Blade directives or helper functions for inline merging. |
| Livewire/Alpine.js | Merge classes server-side before rendering to avoid client-side flicker. |
| Inertia.js | Resolve conflicts in Laravel backend before sending props to Vue/React. |
| APIs/PDFs/Emails | Merge classes during HTML generation (e.g., in Laravel Mailables or PDF libraries). |
| Shared Components | Centralize merging in component base classes or service containers. |
| Dynamic Theming | Use tenant/user-specific configurations to merge theme classes at runtime. |
!important, etc.).TailwindMerge::instance()->merge().| Compatibility Factor | Notes |
|---|---|
| PHP Version | Requires PHP 8.1+. Compatible with Laravel 8+ (Laravel 9+ recommended). |
| Tailwind CSS | Supports v3.0–v3.4. Test with your tailwind.config.js for custom classes. |
| PSR Standards | Uses PSR-16 caching (optional) and follows PSR-4 autoloading. |
| Laravel Ecosystem | No Laravel dependencies post-v1.0.0; works in any PHP 8.1+ project. |
| JavaScript Alternatives | Replaces client-side solutions (e.g., tailwind-merge JS) with server-side logic. |
TailwindMerge in static Blade files.class="p-4 px-6" → class="{{ merge('p-4 px-6') }}".render() method before returning view.// app/Services/TailwindMerger.php
class TailwindMerger {
public function merge(...$classes) {
return TailwindMerge::instance()->merge(...$classes);
}
}
| Maintenance Aspect | Considerations |
|---|---|
| Package Updates | Monitor for Tailwind CSS v4+ support and PHP version updates. |
| Configuration Drift | Re-test with new Tailwind releases if custom configurations are used. |
| Cache Management | Clear cache when Tailwind config or package updates (PSR-16 cache). |
| Dependency Risks | Low risk: no Laravel dependencies post-v1.0.0; only PHP 8.1+ required. |
| Support Area | Strategy |
|---|---|
| Debugging Conflicts | Use TailwindMerge::instance()->debugMerge() (if available) or log inputs/outputs. |
| Custom Configurations | Refer to [original config docs](https://github.com/d |
How can I help you explore Laravel packages today?