tales-from-a-dev/twig-tailwind-extra
Twig extension that adds Tailwind helpers to your templates. Includes a tailwind_merge() filter powered by tailwind-merge-php to intelligently combine Tailwind CSS class strings and resolve conflicts. Requires PHP 8.1+, Twig 3+, Tailwind 4+.
Installation
composer require tales-from-a-dev/twig-tailwind-extra
Register the Twig extension in your Laravel app’s config/app.php under providers:
TalesFromADev\TwigTailwindExtra\TwigTailwindExtraServiceProvider::class,
Publish Config (Optional)
php artisan vendor:publish --provider="TalesFromADev\TwigTailwindExtra\TwigTailwindExtraServiceProvider"
Edit config/twig-tailwind-extra.php to define your Tailwind config path (default: tailwind.config.js).
First Use Case
In a Twig template, leverage the tailwind() function to generate utility classes dynamically:
<div class="{{ tailwind('bg-blue-500 hover:bg-blue-700 text-white') }}">
Hover me!
</div>
Leverage the updated tailwind-merge-php (v0.3) for smart class merging and conflict resolution:
{# Merges conflicting classes automatically #}
<div class="{{ tailwind('bg-blue-500 hover:bg-blue-700 text-white p-4 p-6') }}">
Conflicts resolved!
</div>
{# Responsive + conditional #}
<div class="{{ tailwind(
is_active ? 'bg-green-500' : 'bg-gray-300',
'md:p-6 lg:p-8'
) }}">
Dynamic + responsive
</div>
Extend Tailwind with custom directives in tailwind.config.js:
// tailwind.config.js
module.exports = {
corePlugins: {
extend: {
'tailwind-extra': {
'custom-shadow': '0 4px 6px -1px rgba(0, 0, 0, 0.1)',
'gradient-custom': 'linear-gradient(90deg, #ff6b6b, #4ecdc4)',
},
},
},
};
Use in Twig:
<div class="{{ tailwind('shadow-custom-shadow') }}">Custom shadow</div>
<div class="{{ tailwind('bg-gradient-custom') }}">Custom gradient</div>
Wrap Twig templates in Blade for seamless use:
// resources/views/layouts/app.blade.php
<!DOCTYPE html>
<html>
<body>
@include('twig::partials.header')
@twig('content', ['data' => $data]) // Render Twig template
</body>
</html>
Pass variables to Twig for dynamic theming:
// Controller
return view('twig::theme', [
'theme' => 'dark',
]);
// Twig template
<div class="{{ tailwind(theme == 'dark' ? 'bg-gray-800 text-white' : 'bg-white text-black') }}">
Themed content
</div>
Class Output: Enable Twig’s debug mode to inspect merged classes:
// config/twig-tailwind-extra.php
'debug' => env('APP_DEBUG', false),
Outputs raw Tailwind classes for verification.
Merge Conflicts: Use tailwind-merge-php v0.3’s improved conflict resolution. Test edge cases like:
{{ tailwind('p-4 p-6') }} {# Resolves to `p-6` #}
tailwind.config.js: Ensure the path in config/twig-tailwind-extra.php is correct. Default assumes the file is in the project root.tailwind.config.js setup.// app/Providers/AppServiceProvider.php
public function boot()
{
$twig = app('twig');
$twig->addFunction(new \Twig\TwigFunction('tailwindGradient', [$this, 'generateGradient']));
}
public function generateGradient($from, $to)
{
return "bg-gradient-to-r from-{$from} to-{$to}";
}
Usage in Twig:
<div class="{{ tailwindGradient('blue-500', 'purple-500') }}">Gradient</div>
lazy option to defer class generation:
{{ tailwind('bg-blue-500', { 'lazy': true }) }}
tales-from-a-dev/twig-tailwind-extra and tales-from-a-dev/tailwind-merge-php are compatible (v0.3+).safelist in tailwind.config.js for critical classes.p-4 p-6) to verify resolution.How can I help you explore Laravel packages today?