Symfony UX in 2025: A Year of Maturity and Innovation
2025 has been a pivotal year for Symfony UX. From the graduation of Map to stable status, to the introduction of Toolkit, major API improvements in Translator, and the deprecation of legacy packages, let's dive into what made this year special for the JavaScript initiative of Symfony.
TwigComponent: Stability and Polish
TwigComponent continued its evolution with several improvements:
- Anonymous components can now use directory names as component names
- Security fix CVE-2025-47946: unsanitized HTML attribute injection via
ComponentAttributes - Option to disable components dump in development
- Improved parser exceptions for better debugging
- Fixed
loadTemplatedeprecation for Twig >= 3.21
LiveComponent: URL Binding and Validation
LiveComponent received significant enhancements around URL binding and form handling. However, these changes also introduced some unintended breaking changes that required multiple patch releases to fix. On the bright side, the test suite has been significantly reinforced with E2E tests.
LiveProp as Path Parameters
The most exciting addition is the ability to map LiveProp to routing path parameters:
#[AsLiveComponent]
#[Route('/posts/{slug}')]
class PostComponent
{
#[LiveProp(writable: true, url: new UrlMapping(mapPath: true))]
public string $slug;
}Validation Modifiers
New validation modifiers for data-model inputs: min_length, max_length, min_value, max_value.
Other Changes
- UID support for hydration
- More reliable
keyattribute with child components - TypeInfo integration replacing deprecated
PropertyTypeExtractorInterface::getTypes()— this also caused some unintended BC breaks (#2922, #3043) - Property name in modifier callback
Translator: A Complete API Overhaul
The Translator package underwent a major API refactoring, moving from generated constants to string-based translation keys:
// Before (generated constants)
import { MESSAGE_WELCOME } from './translations';
trans(MESSAGE_WELCOME);
// After (string-based keys)
import { trans } from '@symfony/ux-translator';
trans('message.welcome');New Configuration Options
ux_translator:
dump_typescript: true # Enable/disable TypeScript generation
keys_patterns: # Filter dumped translations
- 'app.*'
- 'forms.*'See PRs: dump_typescript option, keys_patterns option.
Toolkit: A New Beginning
2025 saw the introduction of UX Toolkit, a collection of copy-paste UI components built with Twig Components and TailwindCSS, inspired by shadcn/ui.
Unlike traditional component libraries, Toolkit provides components as "recipes" that you copy directly into your project, giving you full ownership and customization freedom.
Available components in the Shadcn kit: Accordion, Alert, AlertDialog, AspectRatio, Avatar, Badge, Breadcrumb, Button, ButtonGroup, Card, Checkbox, Dialog, Empty, Field, Input, InputGroup, Item, Kbd, Label, Pagination, Progress, Select, Separator, Skeleton, Spinner, Switch, Table, Textarea, Tooltip.
Map: From Experimental to Stable
UX Map graduated to stable in July 2025 (v2.28.0).
Key Features Added
- Clustering support for marker grouping
- Marker Icon customization
- Circle and Rectangle shapes
- minZoom/maxZoom options
- Multipolygon support
- Batch removal methods:
Map::removeAll*() - Attribution and zoom controls
fitBoundsToMarkersoptionextradata on Map for custom metadata- Fix race conditions when loading Google Maps API with multiple maps
Deprecation
The title option was deprecated from Polygon, Polyline, Rectangle and Circle in favor of infoWindow.
Turbo: New Twig Extensions
Turbo received some useful additions:
- Twig Extensions for
<meta>tags: easily add Turbo-related meta tags - Pass EventSource options to
turbo_stream_listen - Stream format with request listener
- Support for MercureBundle ^0.4.1 and Mercure ^0.7.0
StimulusBundle
- Support for
symfony/stimulus-bridge4 - Faster lazy loading + debug events
lazy:loading/lazy:loaded - Optimized AssetMapper
excluded_patterns: changed from**/controllers.jsonto*/controllers.jsonfor better performance
Performance Improvements
2025 brought significant performance optimizations across multiple packages:
TwigComponent
- Cache component properties metadata
- Optimize TwigPreLexer
- Improve
BlockStackperformance - Improve
ComponentFactoryperformance - Store mount methods in compiler pass
- Cache template class resolution
- Cache
PropertyAccessor::isWritable()calls - Performance improvements when using
{% props %}
LiveComponent
Translator
Icons
Package Deprecations
Four packages were deprecated in 2025 and will be removed in Symfony UX 3.0:
| Package | Version | Alternative |
|---|---|---|
| ux-swup | v2.26.0 | Turbo |
| ux-typed | v2.26.0 | typed.js + Stimulus |
| ux-lazy-image | v2.26.0 | Native loading="lazy" |
| ux-toggle-password | v2.29.0 | Custom Stimulus controller |
Infrastructure
- Symfony 8 support for all packages
- PHP 8.5 compatibility
- NPM publishing for advanced users
Internal Tooling (for contributors)
- Build: Rollup → tsup, Yarn → PNPM, Biome.js → oxfmt/oxlint (maybe we'll change everything again in 2026? It's the JavaScript ecosystem after all 😝)
- Testing: E2E app with Playwright + Vitest for unit tests, support for grouped peer dependency versions testing, Encore app CI job
- Code quality: PHP-CS-Fixer & Twig-CS-Fixer via Fabbot
- Other: Website moved to external repository
Conclusion
2025 has been a year of consolidation for Symfony UX. The deprecation of legacy packages, combined with the introduction of Toolkit and the stabilization of Map, shows the ecosystem's commitment to modern, maintainable solutions.
If you're still using deprecated packages, now is the time to plan your migration!