twig/html-extra
Twig HTML Extension adds handy helpers to Twig: a data_uri filter for RFC 2397 data URLs, an html_classes function to conditionally build CSS class strings, and an html_cva function for managing class variants via a Cva object.
Installation Add the package via Composer in your Laravel project:
composer require twig/html-extra
Register the extension in your Twig environment (e.g., in app/Providers/AppServiceProvider):
use Twig\Extra\Html\HtmlExtension;
public function boot()
{
$twig = $this->app['twig'];
$twig->addExtension(new HtmlExtension());
}
First Use Case
Use the data_uri filter to embed small files (e.g., icons) directly in HTML:
<img src="{{ 'path/to/image.png'|data_uri }}">
Outputs:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...">
Dynamic Class Handling
Use html_classes to conditionally apply classes:
<div class="{{ 'btn'|html_classes({'primary': isPrimary, 'disabled': isDisabled}) }}">
Click Me
</div>
Outputs:
<div class="btn primary">Click Me</div>
Class Variant Abstraction
Leverage html_cva for consistent variant patterns (e.g., buttons):
{% set button = 'btn'|html_cva({
'primary': 'bg-blue-500 text-white',
'secondary': 'bg-gray-200 text-gray-800',
'size': {
'sm': 'px-2 py-1 text-sm',
'md': 'px-4 py-2'
}
}) %}
<button class="{{ button('primary', 'md') }}">
Submit
</button>
Outputs:
<button class="btn bg-blue-500 text-white px-4 py-2">Submit</button>
Inline SVG/Data URIs Embed SVGs or small assets without extra HTTP requests:
<div style="background-image: url('{{ 'icon.svg'|data_uri }}')"></div>
twig facade or embedding Twig in Blade:
@twig('partials/_button.twig', {'text': 'Save'})
<input type="text" class="{{ 'form-input'|html_classes({'error': hasError}) }}">
html_cva with Tailwind’s utility classes for rapid theming.Data URI Size Limits
{{ 'file.png'|data_uri|length }} to check size.Twig Extension Registration
boot() in AppServiceProvider if needed.CVA Object Serialization
html_cva returns a Cva object. Always call it as a function (e.g., {{ button('variant') }}), not as a standalone object.{{ 'btn'|html_classes({...})|dump }} to inspect generated classes.{{ 'file.png'|data_uri|raw }} to verify base64 encoding.Custom Filters/Functions Extend the package by creating a custom Twig extension:
use Twig\TwigFunction;
$twig->addFunction(new TwigFunction('custom_html', function($input) {
return (new HtmlExtension())->getFunction('html_classes')($input);
}));
Laravel Mix/Webpack
Pre-process data_uri in assets for critical CSS/JS:
// webpack.mix.js
mix.postCss('resources/css/app.css', 'public/css', [
require('postcss-data-uri')({ extensions: ['svg'] })
]);
Performance
Cache data_uri results for static assets:
{% cache 'data_uri_icon' %}
{{ 'icon.svg'|data_uri }}
{% endcache %}
How can I help you explore Laravel packages today?