enabel/ux
Enabel UX is a Symfony bundle offering reusable Twig components and utilities for building consistent, maintainable user interfaces. Install it with Composer to streamline common UI patterns across Symfony applications and reduce repetitive template code. Documentation included.
🔥 The Bootstrap layout no longer loads anything from a CDN (#30)
[@EnabelUx](https://github.com/EnabelUx)/layout/bootstrap/base.html.twig used to put the Enabel theme 3.0.2 CSS and bootstrap.bundle.min.js from jsDelivr in its stylesheets and javascripts blocks, then render importmap('app'). Applications import Bootstrap and the theme from their own entrypoint, so pages that did not override those blocks (typically login and reset password) loaded the theme twice, Bootstrap JS twice (double event handlers on dropdowns and collapses), and, through the theme 3.0.2, sent visitors' IP addresses to Google Fonts.
The stylesheets block is now empty and javascripts only renders importmap('app'). Both blocks still exist, so templates overriding them are unaffected.
⬆️ Enabel Bootstrap Theme 4 is accepted (^3.0.2 || ^4.0). Version 4 self-hosts its fonts and no longer bundles Font Awesome and flag-icons. No template of this bundle uses either.
Make sure assets/app.js imports Bootstrap and the theme:
import 'bootstrap';
import '[@enabel](https://github.com/enabel)/enabel-bootstrap-theme/dist/css/enabel-bootstrap-theme.min.css';
The CDN script also defined a global window.bootstrap. Inline scripts relying on it must import from bootstrap instead (import { Toast } from 'bootstrap').
If you move to the theme 4, import Font Awesome and flag-icons yourself when your templates use fa-* or fi fi-* classes. importmap:update ignores version constraints and will pull the theme 4: add those imports first.
Full Changelog: https://github.com/Enabel/ux/compare/v2.5.0...v2.6.0
✨ Enabel:Ux:LocaleSwitcher gains labelFormat and header (#29)
Apps carrying three or more locales could not afford the full own-language name in the navbar — English / Français / Nederlands eats the space the menu items need — while the only alternative, showLocaleName: false, left a bare flag with no textual cue.
labelFormat — name (default, unchanged), code (EN) or none (flag only).header — optional dropdown-header at the top of the menu, e.g. 'Change language'. Translate at the call site; defaults to null.{{ component('Enabel:Ux:LocaleSwitcher', {
locales: enabled_locales,
labelFormat: 'code',
header: 'navigation.language.change'|trans,
}) }}
Flags are no longer letterboxed inside their own border. They were forced into a 1.5rem square, but the cif:* set has no single aspect ratio (cif:nl is 2:1, cif:gb is 3:2), so the flag shrank and centred while the rounding and border framed empty space. Flags now render in a fixed 4:3 box (1.5rem × 1.125rem) with preserveAspectRatio="xMidYMid slice", and carry the locale's own-language name as title.
Note both width and height are set explicitly: a host application's ux_icons.default_icon_attributes (commonly width/height: 1em) otherwise wins and forces the square back.
showLocaleName keeps working — labelFormat is derived from it, so a call site passing false still resolves to none, and an explicit labelFormat always wins. The property is now marked [@deprecated](https://github.com/deprecated); prefer labelFormat.
The only visual change for callers passing nothing is the corrected flag styling. The label still defaults to the own-language name.
The LocaleSwitcher docs documented the parameter as show_locale_name; the component has always read showLocaleName.
Full Changelog: https://github.com/Enabel/ux/compare/v2.4.1...v2.5.0
🐛 Enabel:Ux:ErrorPage default symbol restored to brand colours and correct cropping (#28)
The symbol shipped since v2.3.0 was traced with potrace, which flattened the three Enabel petals into a single fill="#000000" and kept a 200x200 viewBox in which the glyph only covered 64% × 59% of the box. Rendered through the theme's .bg img { width: 550px; height: 550px } with xMidYMid meet, that showed a grey blob centred in the corner instead of the brand mark bleeding off the top-left edge — and it looked inconsistent next to the default logo, which is a full-colour PNG.
Each petal now carries its brand value (grey #58575A, yellow #F9B500, red #D81A1A) and the viewBox is cropped onto the glyph bounding box (36 41 129 118). Same 3 paths, no geometry change; the data: URI stays an SVG and is now 1434 bytes instead of 1578.
Consumers that worked around this by passing an explicit symbol="…" to Enabel:Ux:ErrorPage can drop the override.
Full Changelog: https://github.com/Enabel/ux/compare/v2.4.0...v2.4.1
Full Changelog: https://github.com/Enabel/ux/compare/v2.3.0...v2.4.0
Full Changelog: https://github.com/Enabel/ux/compare/v2.2.0...v2.3.0
Full Changelog: https://github.com/Enabel/ux/compare/v2.1.0...v2.2.0
Full Changelog: https://github.com/Enabel/ux/compare/v2.0.3...v2.1.0
Fix event bubbling for data-target=modal links
image support in MenuItem component — display an avatar/photo instead of an icon, with a white border for visual consistencysrc/Component/Navigation/MenuItem.phptemplates/navigation/menu_item.html.twigFull Changelog: https://github.com/Enabel/ux/compare/v2.0.0...v2.0.1
Full Changelog: https://github.com/Enabel/ux/compare/v1.2.0...v2.0.0
Full Changelog: https://github.com/Enabel/ux/compare/v1.1.1...v1.2.0
Full Changelog: https://github.com/Enabel/ux/compare/v1.1.0...v1.1.1
Full Changelog: https://github.com/Enabel/ux/compare/v1.0.3...v1.1.0
Full Changelog: https://github.com/Enabel/ux/compare/v1.0.2...v1.0.3
Full Changelog: https://github.com/Enabel/ux/compare/v1.0.1...v1.0.2
Full Changelog: https://github.com/Enabel/ux/compare/v1.0.0...v1.0.1
Full Changelog: https://github.com/Enabel/ux/commits/v1.0.0
How can I help you explore Laravel packages today?