3846 Commits

Author SHA1 Message Date
Hugo Alliaume
21b1bb6133 feature #3409 [Toolkit] Embrace html_attr_type from twig/html-extra:^3.24 to correctly merge trigger's attributes (Kocal)
This PR was merged into the 2.x branch.

Discussion
----------

[Toolkit] Embrace `html_attr_type` from `twig/html-extra:^3.24` to correctly merge trigger's attributes

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | yes <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

Related to #3408

Commits
-------

725c1156c2 [Toolkit] Embrace `html_attr_type` from `twig/html-extra:^3.24` to correctly merge trigger's attributes
2026-03-23 22:30:53 +01:00
Hugo Alliaume
725c1156c2 [Toolkit] Embrace html_attr_type from twig/html-extra:^3.24 to correctly merge trigger's attributes
Related to #3408
2026-03-23 22:15:37 +01:00
Hugo Alliaume
ddb8ecb7eb feature #3408 [TwigComponent] Add support for AttributeValueInterface from twig/html-extra:^3.24.0 in ComponentAttributes (Kocal)
This PR was merged into the 2.x branch.

Discussion
----------

[TwigComponent] Add support for `AttributeValueInterface` from `twig/html-extra:^3.24.0` in `ComponentAttributes`

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | yes <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

Close https://github.com/twigphp/Twig/issues/4790, replace https://github.com/twigphp/Twig/pull/4791.

This PR update `ComponentAttributes` to support `AttributeValueInterface` from Twig 3.24 with `html_attr_type` and HTML attributes merging strategy.

This helps resolve situations where merging HTML attributes needs to be more sophisticated than a simple `array_merge`.

For example in UX Toolkit, we have an issue where it's not possible to use a single `<twig:Button>` with `Dialog` and `Tooltip` triggers, both triggers define a `trigger_attrs` with some attributes that may conflict. Here a simplified version:
```twig
{%- set dialog_trigger_attrs = {
    'data-action': 'click->dialog#open',
} -%}
{%- set tooltip_trigger_attrs = {
    'data-action': 'mouseenter->tooltip#show mouseleave->tooltip#hide focus->tooltip#show blur->tooltip#hide',
} -%}

<twig:Button
    {{ ...dialog_trigger_attrs }}
    {{ ...tooltip_trigger_attrs }}
/>
```

Here, only `data-action="mouseenter->tooltip#show mouseleave->tooltip#hide focus->tooltip#show blur->tooltip#hide"` will be rendered, the value from `dialog_trigger_attrs` is purely ignored.

By supporting the HTML attributes merging strategy introduced in Twig HTML Extra 3.24, we can use the new Twig filter `html_attr_type`:
```twig
{%- set dialog_trigger_attrs = {
    'data-action': 'click->dialog#open'|html_attr_type('sst'),
} -%}
{%- set tooltip_trigger_attrs = {
    'data-action': 'mouseenter->tooltip#show mouseleave->tooltip#hide focus->tooltip#show blur->tooltip#hide'|html_attr_type('sst'),
} -%}
```

Combined to `html_attr_merge` filter (that return an array where some values are an instance of `Twig\Extra\Html\HtmlAttr\AttributeValueInterface`), the following example will correctly render `data-action="click->dialog#open mouseenter->tooltip#show mouseleave->tooltip#hide focus->tooltip#show blur->tooltip#hide"`:
```twig
<twig:Button
    {{ ...{}|html_attr_merge(dialog_trigger_attrs, tooltip_trigger_attrs) }}
/>
```

Commits
-------

bd2410fb79 [TwigComponent] Add support for `AttributeValueInterface` from `twig/html-extra:^3.24.0` in `ComponentAttributes`
2026-03-23 20:53:55 +01:00
Hugo Alliaume
bd2410fb79 [TwigComponent] Add support for AttributeValueInterface from twig/html-extra:^3.24.0 in ComponentAttributes
Close https://github.com/twigphp/Twig/issues/4790, replace https://github.com/twigphp/Twig/pull/4791.

This PR update `ComponentAttributes` to support `AttributeValueInterface` from Twig 3.24 with `html_attr_type` and HTML attributes merging strategy.

This helps resolve situations where merging HTML attributes needs to be more sophisticated than a simple `array_merge`.

For example in UX Toolkit, we have an issue where it's not possible to use a single `<twig:Button>` with `Dialog` and `Tooltip` triggers, both triggers define a `trigger_attrs` with some attributes that may conflict. Here a simplified version:
```
{%- set dialog_trigger_attrs = {
    'data-action': 'click->dialog#open',
} -%}
{%- set tooltip_trigger_attrs = {
    'data-action': 'mouseenter->tooltip#show mouseleave->tooltip#hide focus->tooltip#show blur->tooltip#hide',
} -%}

<twig:Button
    {{ ...dialog_trigger_attrs }}
    {{ ...tooltip_trigger_attrs }}
/>
```

Here, only `data-action="mouseenter->tooltip#show mouseleave->tooltip#hide focus->tooltip#show blur->tooltip#hide"` will be rendered, the value from `dialog_trigger_attrs` is purely ignored.

By supporting the HTML attributes merging strategy introduced in Twig HTML Extra 3.24, we can use the new Twig filter `html_attr_type`:
```twig
{%- set dialog_trigger_attrs = {
    'data-action': 'click->dialog#open'|html_attr_type('sst'),
} -%}
{%- set tooltip_trigger_attrs = {
    'data-action': 'mouseenter->tooltip#show mouseleave->tooltip#hide focus->tooltip#show blur->tooltip#hide'|html_attr_type('sst'),
} -%}
```

Combined to `html_attr_merge` (that return an array where some values are an instance of `Twig\Extra\Html\HtmlAttr\AttributeValueInterface`), the following example will correctly render `data-action="click->dialog#open mouseenter->tooltip#show mouseleave->tooltip#hide focus->tooltip#show blur->tooltip#hide"`:
```twig
<twig:Button
    {{ ...{}|html_attr_merge(dialog_trigger_attrs, tooltip_trigger_attrs) }}
/>
```
2026-03-23 13:55:11 +01:00
github-actions[bot]
476c007559 Update versions to 2.34.0 2026-03-22 22:21:50 +00:00
Hugo Alliaume
5528da369d bug #3404 [Native] Fix invalid priority for DevServerListener (zairigimad)
This PR was squashed before being merged into the 2.x branch.

Discussion
----------

[Native] Fix invalid priority for DevServerListener

| Q              | A
| -------------- | ---
| Bug fix?       | yes
| New feature?   | no
| Deprecations?  | no
| Documentation? | no
| Issues         | #3405
| License        | MIT

It fixes the devServerListener for local developement

Commits
-------

1af8fa0d11 [Native] Fix invalid priority for DevServerListener
v2.34.0
2026-03-22 23:15:14 +01:00
Imad Zairig
1af8fa0d11 [Native] Fix invalid priority for DevServerListener 2026-03-22 23:15:09 +01:00
Hugo Alliaume
251eb855d4 minor #3402 [Apps] Add Native demo (Kocal)
This PR was merged into the 2.x branch.

Discussion
----------

[Apps] Add Native demo

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

Enhanced version of https://github.com/Kocal/sf-ux-native-lab, screenshots from https://ux.symfony.com/native will have to be modified

Commits
-------

412cecc9de [Apps] Add Native demo
2026-03-22 09:37:56 +01:00
Hugo Alliaume
412cecc9de [Apps] Add Native demo 2026-03-22 09:31:38 +01:00
Hugo Alliaume
d5694e25c1 bug #3401 [Autocomplete][Chartjs][Cropperjs][Dropzone][LazyImage][LiveComponent][Map][Notify][React][StimulusBundle][Svelte][Swup][TogglePassword][Turbo][Typed][Vue][Translator] Update package.json to 2.33.0 (Kocal)
This PR was merged into the 2.x branch.

Discussion
----------

[Autocomplete][Chartjs][Cropperjs][Dropzone][LazyImage][LiveComponent][Map][Notify][React][StimulusBundle][Svelte][Swup][TogglePassword][Turbo][Typed][Vue][Translator] Update package.json to `2.33.0`

| Q              | A
| -------------- | ---
| Bug fix?       | yes
| New feature?   | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

The job that release npm packages failed https://github.com/symfony/ux/actions/runs/23216748609/job/67479440402

it should be fixed by https://github.com/symfony/ux/pull/3400

note that the packages were nicely published with 2.33.0 version, it's only the `git push` on UX that failed

Commits
-------

8bbad8d9db [Autocomplete][Chartjs][Cropperjs][Dropzone][LazyImage][LiveComponent][Map][Notify][React][StimulusBundle][Svelte][Swup][TogglePassword][Translator][Turbo][Typed][Vue] Update package.json to `2.33.0`
2026-03-21 23:31:36 +01:00
Hugo Alliaume
e58c82d73f feature #3347 [Cropperjs] Add image rotation in php side (MrYamous)
This PR was merged into the 2.x branch.

Discussion
----------

[Cropperjs] Add image rotation in php side

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | yes
| Deprecations?  | yes
| Documentation? | no
| Issues         | Fix #2930
| License        | MIT

I tweaked a bit the BC layer in comparison to discussion in issue cause to be honest I didn't understand how it was supposed to be done in the described way 😅
I hope it will be fine

Commits
-------

e1b7d70860 [Cropperjs] Add image rotation in php side
2026-03-21 23:30:00 +01:00
Hugo Alliaume
8bbad8d9db [Autocomplete][Chartjs][Cropperjs][Dropzone][LazyImage][LiveComponent][Map][Notify][React][StimulusBundle][Svelte][Swup][TogglePassword][Translator][Turbo][Typed][Vue] Update package.json to 2.33.0
The job that release npm packages failed https://github.com/symfony/ux/actions/runs/23216748609/job/67479440402

it should be fixed by https://github.com/symfony/ux/pull/3400
2026-03-21 23:29:11 +01:00
Hugo Alliaume
43ca53e64b bug #3400 [CI] Update permissions to allow pushing changes to the repository during NPM release (Kocal)
This PR was merged into the 2.x branch.

Discussion
----------

[CI] Update permissions to allow pushing changes to the repository during NPM release

| Q              | A
| -------------- | ---
| Bug fix?       | yes
| New feature?   | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

https://github.com/symfony/ux/actions/runs/23216748609/job/67479440402

Hopefully it will works 🤞

Commits
-------

c9ecdfd592 [CI] Update permissions to allow pushing changes to the repository during NPM release
2026-03-21 23:25:22 +01:00
MrYamous
e1b7d70860 [Cropperjs] Add image rotation in php side 2026-03-21 23:25:04 +01:00
Hugo Alliaume
c9ecdfd592 [CI] Update permissions to allow pushing changes to the repository during NPM release
https://github.com/symfony/ux/actions/runs/23216748609/job/67479440402
2026-03-21 23:18:56 +01:00
Hugo Alliaume
de06ea9af3 minor #3399 [E2E] Test over Symfony 8.0 (Kocal)
This PR was squashed before being merged into the 2.x branch.

Discussion
----------

[E2E] Test over Symfony 8.0

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

<!--
Replace this notice by a description of your feature/bugfix.
This will help reviewers and should be a good start for the documentation.

Additionally (see https://symfony.com/releases):
 - Always add tests and ensure they pass.
 - For new features, provide some code snippets to help understand usage.
 - Features and deprecations must be submitted against branch main.
 - Update/add documentation as required (we can help!)
 - Changelog entry should follow https://symfony.com/doc/current/contributing/code/conventions.html#writing-a-changelog-entry
 - Never break backward compatibility (see https://symfony.com/bc).
-->

Commits
-------

34ee8dc69e [E2E] Test over Symfony 8.0
2026-03-21 23:16:17 +01:00
Hugo Alliaume
34ee8dc69e [E2E] Test over Symfony 8.0 2026-03-21 23:16:13 +01:00
Hugo Alliaume
45995206e2 minor #3397 [CI] Add Dependabot (Kocal)
This PR was merged into the 2.x branch.

Discussion
----------

[CI] Add Dependabot

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

Related to https://github.com/symfony/ux/pull/3396

Commits
-------

3c9ed7f178 [CI] Add Dependabot
2026-03-21 09:55:37 +01:00
Hugo Alliaume
3c9ed7f178 [CI] Add Dependabot 2026-03-21 09:50:45 +01:00
Hugo Alliaume
f2a0f686ca minor #3396 [CI] Pin explicit versions of external actions (Kocal)
This PR was merged into the 2.x branch.

Discussion
----------

[CI] Pin explicit versions of external actions

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

Even though it makes maintenance a bit more complicated, pinning external action versions to commit hashes improves security by reducing the risk of supply-chain attacks.

I'll look into enabling Dependabot to open PRs that update (only) GitHub actions.

Commits
-------

a57da9a29e [CI] Pin explicit versions of external actions
2026-03-21 09:39:08 +01:00
Hugo Alliaume
a57da9a29e [CI] Pin explicit versions of external actions
Even though it makes maintenance a bit more complicated, pinning external action versions to commit hashes improves security by reducing the risk of supply-chain attacks.

I'll look into enabling Dependabot to open PRs that update (only) GitHub actions.
2026-03-21 09:34:39 +01:00
Hugo Alliaume
c2f9df826c minor #3391 Update tsdown & use @tsdown/css (Kocal)
This PR was merged into the 2.x branch.

Discussion
----------

 Update tsdown & use `@tsdown`/css

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

This update simplifies the tsdown configuration, we do not need our custom plugin to minify CSS anymore (replaced by `css.minify = true`), and same for our hooks that rename the built CSS (replaced by `css.fileName`) 😍

Commits
-------

13cb147add Update tsdown & use `@tsdown`/css
2026-03-21 09:18:09 +01:00
Hugo Alliaume
13cb147add Update tsdown & use @tsdown/css
This update simplifies the tsdown configuration, we do not need our custom plugin to minify CSS anymore (replaced by `css.minify = true`), and same for our hooks that rename the built CSS (replaced by `css.fileName`) 😍
2026-03-20 09:00:50 +01:00
Hugo Alliaume
b73abcb34a minor #3393 [CI] Rename JS code-quality-related jobs (Kocal)
This PR was merged into the 2.x branch.

Discussion
----------

[CI] Rename JS code-quality-related jobs

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

<!--
Replace this notice by a description of your feature/bugfix.
This will help reviewers and should be a good start for the documentation.

Additionally (see https://symfony.com/releases):
 - Always add tests and ensure they pass.
 - For new features, provide some code snippets to help understand usage.
 - Features and deprecations must be submitted against branch main.
 - Update/add documentation as required (we can help!)
 - Changelog entry should follow https://symfony.com/doc/current/contributing/code/conventions.html#writing-a-changelog-entry
 - Never break backward compatibility (see https://symfony.com/bc).
-->

Commits
-------

014ed8ae83 [CI] Rename JS code-quality-related jobs
2026-03-20 08:57:49 +01:00
Hugo Alliaume
014ed8ae83 [CI] Rename JS code-quality-related jobs 2026-03-20 08:54:38 +01:00
Hugo Alliaume
31b11e3a0c minor #3390 Update oxfmt and oxlint (Kocal)
This PR was merged into the 2.x branch.

Discussion
----------

 Update oxfmt and oxlint

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

<!--
Replace this notice by a description of your feature/bugfix.
This will help reviewers and should be a good start for the documentation.

Additionally (see https://symfony.com/releases):
 - Always add tests and ensure they pass.
 - For new features, provide some code snippets to help understand usage.
 - Features and deprecations must be submitted against branch main.
 - Update/add documentation as required (we can help!)
 - Changelog entry should follow https://symfony.com/doc/current/contributing/code/conventions.html#writing-a-changelog-entry
 - Never break backward compatibility (see https://symfony.com/bc).
-->

Commits
-------

0493b19a21 Update oxfmt and oxlint
2026-03-20 08:12:05 +01:00
Hugo Alliaume
0493b19a21 Update oxfmt and oxlint 2026-03-20 08:05:41 +01:00
Hugo Alliaume
5949ecca8d bug #3367 [LiveComponent] Allow empty values to bypass model validation modifiers (xDeSwa)
This PR was merged into the 2.x branch.

Discussion
----------

[LiveComponent] Allow empty values to bypass model validation modifiers

| Q              | A
| -------------- | ---
| Bug fix?       | yes
| New feature?   |no
| Deprecations?  | no
| Documentation? | no
| Issues         | Fix #3153
| License        | MIT

**The Problem:**
Currently, when using input validation modifiers like `min_length(3)` on a LiveComponent model (e.g., `<input type="search" data-model="min_length(3)|query" />`), the modifier acts as a strict gatekeeper. If a user types "abc", the model updates correctly. However, if the user clears the input (e.g., by clicking the native "X" clear button on a search input or deleting the text), the update is blocked because the length is `0`.

This creates a frustrating UX: the input appears empty on the screen, but the component fails to re-render or notify the server, leaving the page (and backend state) stuck with the previous search results.

**The Solution:**
This PR updates `LiveController` to bypass `min_length`, `max_length`, `min_value`, and `max_value` checks if the input value is completely empty (`''`, `null`, or `undefined`).

**Why this is the correct approach (The HTML5 Standard):**
This change aligns LiveComponent's frontend validation strictly with standard HTML5 form validation behavior. In HTML5, attributes like `minlength` and `min` do **not** apply to empty values. If a field is allowed to be empty, it passes validation. If a field *must not* be empty, developers are expected to use the `required` attribute.

By allowing empty strings to pass through these modifiers:
1. It restores the expected behavior for search/filter inputs, allowing the component to naturally reset to its initial/unfiltered state when cleared.
2. It solves complex state synchronization issues between parent/child components when passing models via `props:props`.
3. It prevents numeric inputs (`min_value`) from casting an empty string to `0` and incorrectly failing validation.

### **Demo**
![firefox_uET9s3ozhL](https://github.com/user-attachments/assets/faefd7ab-5c0a-4cfa-a708-e00cf08e4792)

Commits
-------

79205ce63d fix-input-validation-modifiers
2026-03-19 22:40:01 +01:00
Hugo Alliaume
517b0bef41 bug #3389 [React] Fix internal requirement of React 19 (devDependencies) (milanqtx)
This PR was merged into the 2.x branch.

Discussion
----------

[React] Fix internal requirement of React 19 (devDependencies)

| Q              | A
| -------------- | ---
| Bug fix?       | yes
| New feature?   | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | Fix #3313 <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

<!--
Replace this notice by a description of your feature/bugfix.
This will help reviewers and should be a good start for the documentation.

Additionally (see https://symfony.com/releases):
 - Always add tests and ensure they pass.
 - For new features, provide some code snippets to help understand usage.
 - Features and deprecations must be submitted against branch main.
 - Update/add documentation as required (we can help!)
 - Changelog entry should follow https://symfony.com/doc/current/contributing/code/conventions.html#writing-a-changelog-entry
 - Never break backward compatibility (see https://symfony.com/bc).
-->

Update react and react-dom devDependencies from ^18.0 to ^18.0 || ^19.0 to match the already-declared peerDependencies and prevent file: installs from forcing React 18 in user projects that require React 19.

Commits
-------

f55a2c39eb [React] Add React 19 support to devDependencies
2026-03-19 22:22:47 +01:00
Milan
f55a2c39eb [React] Add React 19 support to devDependencies
Update react and react-dom devDependencies from ^18.0 to ^18.0 || ^19.0
to match the already-declared peerDependencies and prevent file: installs
from forcing React 18 in user projects that require React 19.
2026-03-19 09:58:46 +01:00
Hugo Alliaume
3c01aed999 bug #3342 [Translator] Improve performance of dumper under certain condition (mkrauser)
This PR was merged into the 2.x branch.

Discussion
----------

[Translator] Improve performance of dumper under certain condition

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | no
| License        | MIT

This PR moves the fileAppend-Calls out of the foreach to drastically improve performance, close to 500x on my Machine and in my project (with lots of translations).

```
# current time in my project:
 [INFO] "Symfony\UX\Translator\CacheWarmer\TranslationsCacheWarmer" completed in 296866.54ms.

# with the patch:
 [INFO] "Symfony\UX\Translator\CacheWarmer\TranslationsCacheWarmer" completed in 624.45ms.
 ```

Commits
-------

38ff84d013 [Translator] Improve performance of dumper under certain condition
v2.33.0
2026-03-17 09:27:32 +01:00
Matthias Krauser
38ff84d013 [Translator] Improve performance of dumper under certain condition 2026-03-17 09:23:34 +01:00
Hugo Alliaume
21945331aa feature #3338 [Native] Init Hotwire Native (imad)
This PR was merged into the 2.x branch.

Discussion
----------

[Native] Init Hotwire Native

| Q              | A                                                                                                                        |
| -------------- | ------------------------------------------------------------------------------------------------------------------------ |
| Bug fix?       | no                                                                                                                   |
| New feature?   | yes|
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->                                                 |
| Documentation? | no <!-- required for new features, or documentation updates -->                                                      |
| Issues         |  #3339 |
| License        | MIT                                                                                                                      |

This PR introduce Hotwire Native Integration to complete the set of Hotwire Libraries,

Hotwire Native make it simple and easy to Transform any Symfony application based on Symfony UX into a mobile application, make in the application have real native transition and nanvigation , and native components like Native buttons , and bottom tab etc.

in the attached video a small demonstration of transformin a Symfony UX app to mobile app.

https://github.com/user-attachments/assets/0fe22816-6312-47fd-a160-1a9df8abb3df

Commits
-------

b55b0ba30b [Native] Create the component
2026-03-17 09:11:52 +01:00
imad
b55b0ba30b [Native] Create the component 2026-03-17 09:06:13 +01:00
xDeSwa
79205ce63d fix-input-validation-modifiers 2026-03-17 02:30:22 +03:00
Hugo Alliaume
0e6dbd3884 documentation #3385 Update README to reflect Svelte 4 support (BafS)
This PR was merged into the 2.x branch.

Discussion
----------

 Update README to reflect Svelte 4 support

Very much a detail, but better to keep the readme up-to-date

Commits
-------

983feaeb7f Update README to reflect Svelte 4 support
2026-03-16 22:25:03 +01:00
Fabien Salathe
983feaeb7f Update README to reflect Svelte 4 support 2026-03-16 15:04:03 +01:00
Hugo Alliaume
58933e1cda feature #3356 [Toolkit][Shadcn] Add Tabs recipe (DcgRG)
This PR was merged into the 2.x branch.

Discussion
----------

[Toolkit][Shadcn] Add Tabs recipe

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | yes
| Deprecations?  | no
| Documentation? | no
| Issues         |
| License        | MIT

Add the "Tabs" component from Shadcn

For test, I think i need help to make add it correctly for my first PR

Commits
-------

8b1a43f715 [Toolkit][Shadcn] Add Tabs recipe
2026-03-15 20:20:25 +01:00
DcgRG
8b1a43f715 [Toolkit][Shadcn] Add Tabs recipe 2026-03-15 20:08:45 +01:00
Hugo Alliaume
cf78dcab1a bug #3372 [LiveComponent][TwigComponent] Fix reflection issues for private properties from trait and parent class (kachnitel)
This PR was squashed before being merged into the 2.x branch.

Discussion
----------

[LiveComponent][TwigComponent] Fix reflection issues for private properties from trait and parent class

| Q              | A
| -------------- | ---
| Bug fix?       | yes
| New feature?   | no
| Deprecations?  | no
| Documentation? | no
| Issues         | <!-- none yet -->
| License        | MIT

## Problem

When a component class *extends* another class that uses a trait with `#[ExposeInTemplate]` or `#[LiveProp]` attributes on **private** properties, those attributes are invisible to the metadata scanners.

PHP's `ReflectionClass::getProperties()` called on a child class does not return private properties from traits used in *ancestor* classes — they are only returned when `getProperties()` is called on the exact class that declares `use TraitName`. This is standard PHP reflection behaviour.

This affects any inheritance pattern where a base component uses `ComponentWithFormTrait` (or any custom trait with private `#[ExposeInTemplate]` properties) and app-level components extend it without re-declaring the trait.

**Symptom in `ux-twig-component`:** `Variable "form" does not exist` in the child component's Twig template.

**Symptom in `ux-live-component`:** `#[LiveProp(fieldName: 'callable()')]` declared in a trait used by a parent class is not registered with the correct `fieldName` on the child component, causing frontend model key mismatches.

## Fix

### `ux-twig-component` — `ComponentProperties::loadClassMetadata()`

Replace the single `$refClass->getProperties()` call with a loop that walks up `getParentClass()`, calling `getProperties()` at each level. Results are deduplicated by property name (child-class declaration takes priority), giving a complete view of all `#[ExposeInTemplate]` properties across the full hierarchy.

### `ux-live-component` — `LiveComponentMetadataFactory::createPropMetadatas()`

Pass `$property->getDeclaringClass()->getName()` instead of `$class->getName()` to `createLivePropMetadata()`. When a property is declared in a trait used by a parent class, the type extractor must be given the declaring class — not the leaf child class — to resolve the type correctly.

`#[LiveAction]` and `#[LiveListener]` on parent class methods are **not** affected: `getMethods()` already walks the full inheritance chain, so those are discovered correctly on child components.

## Tests

Added ``@group` trait-inheritance` tests in both packages using a minimal fixture: a trait with a private `#[ExposeInTemplate]` property / `#[LiveProp(fieldName: callable)]`, a parent component that uses the trait, and a child component that extends the parent without re-declaring the trait.

Commits
-------

799736ff76 [LiveComponent][TwigComponent] Fix reflection issues for private properties from trait and parent class
2026-03-15 19:48:53 +01:00
Ondrej Vana
799736ff76 [LiveComponent][TwigComponent] Fix reflection issues for private properties from trait and parent class 2026-03-15 19:48:50 +01:00
Hugo Alliaume
5b5c8c8bf5 bug #3376 [Toolkit][Shadcn] Fix initial "open" state for AlertDialog and Dialog (Sylvain Gagnot)
This PR was merged into the 2.x branch.

Discussion
----------

[Toolkit][Shadcn] Fix initial "open" state for AlertDialog and Dialog

| Q              | A
| -------------- | ---
| Bug fix?       | yes
| New feature?   | no
| Deprecations?  | no
| Documentation? | no
| Issues         | Fix
| License        | MIT

Initilal open state don't work. It is not managed anywhere.
This PR use open attribute to open modal in stimulus dialog controller on connect function if openValue is set to true

Commits
-------

60e2a76cd0 [Toolkit][Shadcn] Fix initial "open" state for AlertDialog and Dialog
2026-03-15 16:05:29 +01:00
Sylvain Gagnot
60e2a76cd0 [Toolkit][Shadcn] Fix initial "open" state for AlertDialog and Dialog 2026-03-15 15:52:04 +01:00
Hugo Alliaume
17a007085a minor #3382 Update Vitest to ^4.1.0 (Kocal)
This PR was squashed before being merged into the 2.x branch.

Discussion
----------

 Update Vitest to ^4.1.0

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | no <!-- required for new features, or documentation updates -->
| Issues         | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

https://vitest.dev/guide/migration.html#vitest-4

Commits
-------

9465ed0623 Remove unused `@vitest`/browser
2d7255da6e Update Vitest to ^4.1.0
2026-03-15 09:08:04 +01:00
Hugo Alliaume
9e08337ada bug #3381 [TwigComponent] Fix profiling loaded in production (VincentChataignier)
This PR was merged into the 2.x branch.

Discussion
----------

[TwigComponent] Fix profiling loaded in production

| Q              | A
| -------------- | ---
| Bug fix?       | yes
| New feature?   | no
| Deprecations?  | no
| Documentation? | no
| Issues         | Fix #3380
| License        | MIT

### Summary

Fix profiler debug services being always loaded in production when no explicit `profiler` config is provided.

The `%kernel.debug%` TreeBuilder default was never resolved (TreeBuilder defaults bypass parameter resolution), resulting in a truthy string that always enabled the profiler.

Replace `booleanNode` + `defaultValue('%kernel.debug%')` with a tri-state `scalarNode` (`null`/`true`/`false`) and resolve `kernel.debug` at runtime in the extension.

### Test

- Add `testDataCollectorNotLoadedInProductionByDefault`, verifies profiler is NOT loaded in production with default config

Commits
-------

b943eedc54 [TwigComponent] Fix profiler loaded in production due to unresolved %kernel.debug% default
2026-03-15 09:04:08 +01:00
Hugo Alliaume
9465ed0623 Remove unused @vitest/browser 2026-03-15 09:01:16 +01:00
Hugo Alliaume
2d7255da6e Update Vitest to ^4.1.0 2026-03-15 08:57:29 +01:00
Vincent Chataignier
b943eedc54 [TwigComponent] Fix profiler loaded in production due to unresolved %kernel.debug% default 2026-03-15 08:51:25 +01:00
Hugo Alliaume
fa436680aa feature #3364 [LiveComponent] Add debug:live-component command (Mickaël BULIARD)
This PR was merged into the 2.x branch.

Discussion
----------

[LiveComponent] Add `debug:live-component` command

| Q              | A
| -------------- | ---
| Bug fix?       | no
| New feature?   | yes <!-- please update src/**/CHANGELOG.md files -->
| Deprecations?  | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md -->
| Documentation? | todo <!-- required for new features, or documentation updates -->
| Issues         | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License        | MIT

Hello,

In several applications, I am using multiple events to communicate between LiveComponents.
It sometimes take me a little time to find out mistakes concerning these events.

That's why I propose this small command for debug specific to LiveComponents.

This command is largely copied from `@StevenRenaux` TwigComponentDebugCommand.
As the previous one, it can be used for listing or to see details of one component :

1) Listing : list all registered LiveComponents. Can filter those listening to an event with `--listening` filter.
<img width="1200" height="121" alt="image" src="https://github.com/user-attachments/assets/7223cf6c-a0b2-4095-8478-f204e17423a7" />
<img width="1018" height="128" alt="image" src="https://github.com/user-attachments/assets/743fd9d3-97fe-49a5-b239-b7c41c5a8334" />

2) Details : providing a LiveComponent name, display its LiveProps and LiveListeners.
<img width="1018" height="239" alt="image" src="https://github.com/user-attachments/assets/3455b8a1-a835-4171-b549-ae03aff9595e" />

Commits
-------

50b4756bdd [LiveComponent] Add `debug:live-component` command
2026-03-13 21:12:23 +01:00
Mickaël BULIARD
50b4756bdd [LiveComponent] Add debug:live-component command 2026-03-13 21:08:11 +01:00