Repository: symfony/ux
Pull request #2344 (2024-11-06 02:40:57)

[TwigComponent] Improve ComponentFactory performances
ComponentFactory Quick Optimization

Minor change with.. mid impact
(on large number of renders)

smnandre: false positive for fabbot 
norkunas: When running let's say frankenphp, this will always stay in memory?
Kocal: Thanks for this optimization!

However I'm thinking, not now but maybe for a next PR, but do you think things can be more improved if this "find mounts methods" process was done during a cache warmer and persisted in cache? 
I don't speak about storing `ReflectionMethod` in cache (I don't think it is possible), but storing that if `$component::class` **has** `mount` method or not: 
```diff
    private function mount(object $component, array &$data): void
    {
        if ($component instanceof AnonymousComponent) {
            $component->mount($data);

            return;
        }

+       if (!self::$hasMountMethod[$component::class]) {
+           return;
+       }

        if (!\array_key_exists($component::class, self::$mountMethods)) {
            try {
                $mountMethod = self::$mountMethods[$component::class] = (new \ReflectionClass($component))->getMethod('mount');
            } catch (\ReflectionException) {
                self::$mountMethods[$component::class] = false;

                return;
            }
        }
```
WDYT?
smnandre: > However I'm thinking, not now but maybe for a next PR [...]  WDYT?

Absolutely! 

I'm moving step by step, a bit in the blind. The biggest change is yet to come (this week hopefully). This is why i'm only doing work on private/internal methods for now.

Once we have the results i'm targetting, a clean will be very welcome (required?)..  We will then see how to name these classes / methods, and how we can rearrange the whole thing

👍 


smnandre: > When running let's say frankenphp, this will always stay in memory?

Would it be a problem ? Genuine question here :) 
norkunas: Depends on how much memory it will use. ResetInterface could be used to cleanup after request
smnandre: Updated!

Patch:
diff --git a/src/Autocomplete/doc/index.rst b/src/Autocomplete/doc/index.rst
index d9dd23c4..35baf134 100644
--- a/src/Autocomplete/doc/index.rst
+++ b/src/Autocomplete/doc/index.rst
@@ -272,7 +272,6 @@ to the options above, you can also pass:
 ``preload`` (default: ``focus``)
     Set to ``focus`` to call the ``load`` function when control receives focus.
     Set to ``true`` to call the ``load`` upon control initialization (with an empty search).
-    Set to ``false`` not to call the ``load`` function when control receives focus.
 
 ``extra_options`` (default ``[]``)
     Allow you to pass extra options for Ajax-based autocomplete fields.
diff --git a/src/Icons/src/Command/ImportIconCommand.php b/src/Icons/src/Command/ImportIconCommand.php
index 06b23545..f1c8a08b 100644
--- a/src/Icons/src/Command/ImportIconCommand.php
+++ b/src/Icons/src/Command/ImportIconCommand.php
@@ -18,6 +18,7 @@ use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
 use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\UX\Icons\Exception\IconNotFoundException;
 use Symfony\UX\Icons\Iconify;
 use Symfony\UX\Icons\Registry\LocalSvgIconRegistry;
 
@@ -40,7 +41,11 @@ final class ImportIconCommand extends Command
     protected function configure(): void
     {
         $this
-            ->addArgument('names', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'Icon name from ux.symfony.com/icons (e.g. "mdi:home")')
+            ->addArgument(
+                'names',
+                InputArgument::IS_ARRAY | InputArgument::REQUIRED,
+                'Icon name from ux.symfony.com/icons (e.g. "mdi:home")',
+            )
         ;
     }
 
@@ -49,9 +54,7 @@ final class ImportIconCommand extends Command
         $io = new SymfonyStyle($input, $output);
         $names = $input->getArgument('names');
         $result = Command::SUCCESS;
-        $importedIcons = 0;
 
-        $prefixIcons = [];
         foreach ($names as $name) {
             if (!preg_match('#^([\w-]+):([\w-]+)$#', $name, $matches)) {
                 $io->error(\sprintf('Invalid icon name "%s".', $name));
@@ -60,63 +63,35 @@ final class ImportIconCommand extends Command
                 continue;
             }
 
-            [, $prefix, $name] = $matches;
-            $prefixIcons[$prefix] ??= [];
-            $prefixIcons[$prefix][$name] = $name;
-        }
+            [$fullName, $prefix, $name] = $matches;
+
+            $io->comment(\sprintf('Importing %s...', $fullName));
 
-        foreach ($prefixIcons as $prefix => $icons) {
-            if (!$this->iconify->hasIconSet($prefix)) {
-                $io->error(\sprintf('Icon set "%s" not found.', $prefix));
+            try {
+                $iconSvg = $this->iconify->fetchIcon($prefix, $name)->toHtml();
+            } catch (IconNotFoundException $e) {
+                $io->error($e->getMessage());
                 $result = Command::FAILURE;
 
                 continue;
             }
 
-            $metadata = $this->iconify->metadataFor($prefix);
-            $io->newLine();
-            $io->writeln(\sprintf(' Icon set: %s (License: %s)', $metadata['name'], $metadata['license']['title']));
-
-            foreach ($this->iconify->chunk($prefix, array_keys($icons)) as $iconNames) {
-                $cursor = new Cursor($output);
-                foreach ($iconNames as $name) {
-                    $io->writeln(\sprintf('  Importing %s:%s ...', $prefix, $name));
-                }
-                $cursor->moveUp(\count($iconNames));
-
-                try {
-                    $batchResults = $this->iconify->fetchIcons($prefix, $iconNames);
-                } catch (\InvalidArgumentException $e) {
-                    // At this point no exception should be thrown
-                    $io->error($e->getMessage());
-
-                    return Command::FAILURE;
-                }
-
-                foreach ($iconNames as $name) {
-                    $cursor->clearLineAfter();
-
-                    // If the icon is not found, the value will be null
-                    if (null === $icon = $batchResults[$name] ?? null) {
-                        $io->writeln(\sprintf(' <fg=red;options=bold>✗</> Not Found <fg=bright-white;bg=black>%s:</><fg=bright-red;bg=black>%s</>', $prefix, $name));
-
-                        continue;
-                    }
-
-                    ++$importedIcons;
-                    $this->registry->add(\sprintf('%s/%s', $prefix, $name), (string) $icon);
-                    $io->writeln(\sprintf(' <fg=bright-green;options=bold>✓</> Imported <fg=bright-white;bg=black>%s:</><fg=bright-magenta;bg=black;options>%s</>', $prefix, $name));
-                }
-            }
-        }
+            $cursor = new Cursor($output);
+            $cursor->moveUp(2);
+
+            $this->registry->add(\sprintf('%s/%s', $prefix, $name), $iconSvg);
 
-        if ($importedIcons === $totalIcons = \count($names)) {
-            $io->success(\sprintf('Imported %d/%d icons.', $importedIcons, $totalIcons));
-        } elseif ($importedIcons > 0) {
-            $io->warning(\sprintf('Imported %d/%d icons.', $importedIcons, $totalIcons));
-        } else {
-            $io->error(\sprintf('Imported %d/%d icons.', $importedIcons, $totalIcons));
-            $result = Command::FAILURE;
+            $license = $this->iconify->metadataFor($prefix)['license'];
+
+            $io->text(\sprintf(
+                " <fg=bright-green;options=bold>✓</> Imported <fg=bright-white;bg=black>%s:</><fg=bright-magenta;bg=black;options>%s</> (License: <href=%s>%s</>). Render with: <comment>{{ ux_icon('%s') }}</comment>",
+                $prefix,
+                $name,
+                $license['url'] ?? '#',
+                $license['title'],
+                $fullName,
+            ));
+            $io->newLine();
         }
 
         return $result;
diff --git a/src/Icons/src/Command/LockIconsCommand.php b/src/Icons/src/Command/LockIconsCommand.php
index 69fab8e9..c3b3d2fa 100644
--- a/src/Icons/src/Command/LockIconsCommand.php
+++ b/src/Icons/src/Command/LockIconsCommand.php
@@ -37,8 +37,6 @@ final class LockIconsCommand extends Command
         private Iconify $iconify,
         private LocalSvgIconRegistry $registry,
         private IconFinder $iconFinder,
-        private readonly array $iconAliases = [],
-        private readonly array $iconSetAliases = [],
     ) {
         parent::__construct();
     }
@@ -61,25 +59,19 @@ final class LockIconsCommand extends Command
         $count = 0;
 
         $io->comment('Scanning project for icons...');
-        $finderIcons = $this->iconFinder->icons();
 
-        if ($this->iconAliases) {
-            $io->comment('Adding icons aliases...');
-        }
-
-        foreach ([...array_values($this->iconAliases), ...array_values($finderIcons)] as $icon) {
+        foreach ($this->iconFinder->icons() as $icon) {
             if (2 !== \count($parts = explode(':', $icon))) {
                 continue;
             }
 
-            [$prefix, $name] = $parts;
-            $prefix = $this->iconSetAliases[$prefix] ?? $prefix;
-
-            if (!$force && $this->registry->has($prefix.':'.$name)) {
+            if (!$force && $this->registry->has($icon)) {
                 // icon already imported
                 continue;
             }
 
+            [$prefix, $name] = $parts;
+
             if (!$this->iconify->hasIconSet($prefix)) {
                 // not an icon set? example: "og:twitter"
                 if ($io->isVeryVerbose()) {
diff --git a/src/Icons/src/DependencyInjection/UXIconsExtension.php b/src/Icons/src/DependencyInjection/UXIconsExtension.php
index 81042277..618749ee 100644
--- a/src/Icons/src/DependencyInjection/UXIconsExtension.php
+++ b/src/Icons/src/DependencyInjection/UXIconsExtension.php
@@ -178,11 +178,6 @@ final class UXIconsExtension extends ConfigurableExtension implements Configurat
             }
         }
 
-        $container->getDefinition('.ux_icons.command.lock')
-            ->setArgument(3, $mergedConfig['aliases'])
-            ->setArgument(4, $iconSetAliases)
-        ;
-
         if (!$container->getParameter('kernel.debug')) {
             $container->removeDefinition('.ux_icons.command.import');
         }
diff --git a/src/Icons/src/Iconify.php b/src/Icons/src/Iconify.php
index 892aa6fc..757dacb2 100644
--- a/src/Icons/src/Iconify.php
+++ b/src/Icons/src/Iconify.php
@@ -27,27 +27,19 @@ final class Iconify
 {
     public const API_ENDPOINT = 'https://api.iconify.design';
 
-    // URL must be 500 chars max (iconify limit)
-    // -39 chars: https://api.iconify.design/XXX.json?icons=
-    // -safe margin
-    private const MAX_ICONS_QUERY_LENGTH = 400;
-
     private HttpClientInterface $http;
     private \ArrayObject $sets;
-    private int $maxIconsQueryLength;
 
     public function __construct(
         private CacheInterface $cache,
         string $endpoint = self::API_ENDPOINT,
         ?HttpClientInterface $http = null,
-        ?int $maxIconsQueryLength = null,
     ) {
         if (!class_exists(HttpClient::class)) {
             throw new \LogicException('You must install "symfony/http-client" to use Iconify. Try running "composer require symfony/http-client".');
         }
 
         $this->http = ScopingHttpClient::forBaseUri($http ?? HttpClient::create(), $endpoint);
-        $this->maxIconsQueryLength = min(self::MAX_ICONS_QUERY_LENGTH, $maxIconsQueryLength ?? self::MAX_ICONS_QUERY_LENGTH);
     }
 
     public function metadataFor(string $prefix): array
@@ -93,51 +85,6 @@ final class Iconify
         ]);
     }
 
-    public function fetchIcons(string $prefix, array $names): array
-    {
-        if (!isset($this->sets()[$prefix])) {
-            throw new IconNotFoundException(\sprintf('The icon set "%s" does not exist on iconify.design.', $prefix));
-        }
-
-        // Sort to enforce cache hits
-        sort($names);
-        $queryString = implode(',', $names);
-        if (!preg_match('#^[a-z0-9-,]+$#', $queryString)) {
-            throw new \InvalidArgumentException('Invalid icon names.'.$queryString);
-        }
-
-        if (self::MAX_ICONS_QUERY_LENGTH < \strlen($prefix.$queryString)) {
-            throw new \InvalidArgumentException('The query string is too long.');
-        }
-
-        $response = $this->http->request('GET', \sprintf('/%s.json', $prefix), [
-            'headers' => [
-                'Accept' => 'application/json',
-            ],
-            'query' => [
-                'icons' => strtolower($queryString),
-            ],
-        ]);
-
-        if (200 !== $response->getStatusCode()) {
-            throw new IconNotFoundException(\sprintf('The icon set "%s" does not exist on iconify.design.', $prefix));
-        }
-
-        $data = $response->toArray();
-
-        $icons = [];
-        foreach ($data['icons'] as $iconName => $iconData) {
-            $height = $iconData['height'] ?? $data['height'] ??= $this->sets()[$prefix]['height'] ?? null;
-            $width = $iconData['width'] ?? $data['width'] ??= $this->sets()[$prefix]['width'] ?? null;
-
-            $icons[$iconName] = new Icon($iconData['body'], [
-                'viewBox' => \sprintf('0 0 %d %d', $width ?? $height, $height ?? $width),
-            ]);
-        }
-
-        return $icons;
-    }
-
     public function hasIconSet(string $prefix): bool
     {
         return isset($this->sets()[$prefix]);
@@ -160,40 +107,6 @@ final class Iconify
         return new \ArrayObject($response->toArray());
     }
 
-    /**
-     * @return iterable<string[]>
-     */
-    public function chunk(string $prefix, array $names): iterable
-    {
-        if (100 < ($prefixLength = \strlen($prefix))) {
-            throw new \InvalidArgumentException(\sprintf('The icon prefix "%s" is too long.', $prefix));
-        }
-
-        $maxLength = $this->maxIconsQueryLength - $prefixLength;
-
-        $curBatch = [];
-        $curLength = 0;
-        foreach ($names as $name) {
-            if (100 < ($nameLength = \strlen($name))) {
-                throw new \InvalidArgumentException(\sprintf('The icon name "%s" is too long.', $name));
-            }
-            if ($curLength && ($maxLength < ($curLength + $nameLength + 1))) {
-                yield $curBatch;
-
-                $curBatch = [];
-                $curLength = 0;
-            }
-            $curLength += $nameLength + 1;
-            $curBatch[] = $name;
-        }
-
-        if ($curLength) {
-            yield $curBatch;
-        }
-
-        yield from [];
-    }
-
     private function sets(): \ArrayObject
     {
         return $this->sets ??= $this->cache->get('ux-iconify-sets', function () {
diff --git a/src/StimulusBundle/doc/index.rst b/src/StimulusBundle/doc/index.rst
index 4188b2f2..745c19bc 100644
--- a/src/StimulusBundle/doc/index.rst
+++ b/src/StimulusBundle/doc/index.rst
@@ -157,9 +157,8 @@ To make a third-party controller lazy, in ``assets/controllers.json``, set
 
 .. note::
 
-    If you write your controllers using TypeScript and you're using
-    StimulusBundle ≤ 2.21.0, make sure ``removeComments`` is not set
-    to ``true`` in your TypeScript config.
+    If you write your controllers using TypeScript, make sure
+    ``removeComments`` is not set to ``true`` in your TypeScript config.
 
 Stimulus Tools around the World
 -------------------------------
diff --git a/src/TwigComponent/src/BlockStack.php b/src/TwigComponent/src/BlockStack.php
index 1d4cb90b..f6a249e3 100644
--- a/src/TwigComponent/src/BlockStack.php
+++ b/src/TwigComponent/src/BlockStack.php
@@ -28,15 +28,9 @@ final class BlockStack
      */
     private array $stack;
 
-    /**
-     * @var array<class-string, int>
-     */
-    private static array $templateIndexStack = [];
-
     public function convert(array $blocks, int $targetEmbeddedTemplateIndex): array
     {
         $newBlocks = [];
-        $hostEmbeddedTemplateIndex = null;
         foreach ($blocks as $blockName => $block) {
             // Keep already converted outer blocks untouched
             if (str_starts_with($blockName, self::OUTER_BLOCK_PREFIX)) {
@@ -47,7 +41,7 @@ final class BlockStack
             // Determine the location of the block where it is defined in the host Template.
             // Each component has its own embedded template. That template's index uniquely
             // identifies the block definition.
-            $hostEmbeddedTemplateIndex ??= $this->findHostEmbeddedTemplateIndex();
+            $hostEmbeddedTemplateIndex = $this->findHostEmbeddedTemplateIndex();
 
             // Change the name of outer blocks to something unique so blocks of nested components aren't overridden,
             // which otherwise might cause a recursion loop when nesting components.
@@ -75,10 +69,12 @@ final class BlockStack
     {
         $backtrace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS | \DEBUG_BACKTRACE_PROVIDE_OBJECT);
 
+        $componentTemplateClassName = null;
+
         foreach ($backtrace as $trace) {
             if (isset($trace['object']) && $trace['object'] instanceof Template) {
                 $classname = $trace['object']::class;
-                $templateIndex = self::getTemplateIndexFromTemplateClassname($classname);
+                $templateIndex = $this->getTemplateIndexFromTemplateClassname($classname);
                 if ($templateIndex) {
                     // If there's no template index, then we're in a component template
                     // and we need to go up until we find the embedded template
@@ -97,7 +93,7 @@ final class BlockStack
 
         foreach ($backtrace as $trace) {
             if (isset($trace['object']) && $trace['object'] instanceof Template) {
-                return self::getTemplateIndexFromTemplateClassname($trace['object']::class);
+                return $this->getTemplateIndexFromTemplateClassname($trace['object']::class);
             }
         }
     }
@@ -112,7 +108,7 @@ final class BlockStack
         foreach ($backtrace as $trace) {
             if (isset($trace['object']) && $trace['object'] instanceof Template) {
                 $classname = $trace['object']::class;
-                $templateIndex = self::getTemplateIndexFromTemplateClassname($classname);
+                $templateIndex = $this->getTemplateIndexFromTemplateClassname($classname);
                 if (null === $renderer) {
                     if ($templateIndex) {
                         // This class is an embedded template.
@@ -143,8 +139,8 @@ final class BlockStack
         return 0;
     }
 
-    private static function getTemplateIndexFromTemplateClassname(string $classname): int
+    private function getTemplateIndexFromTemplateClassname(string $classname): int
     {
-        return self::$templateIndexStack[$classname] ??= (int) substr($classname, strrpos($classname, '___') + 3);
+        return (int) substr($classname, strrpos($classname, '___') + 3);
     }
 }
diff --git a/src/TwigComponent/src/Command/TwigComponentDebugCommand.php b/src/TwigComponent/src/Command/TwigComponentDebugCommand.php
index 84313802..4b43216a 100644
--- a/src/TwigComponent/src/Command/TwigComponentDebugCommand.php
+++ b/src/TwigComponent/src/Command/TwigComponentDebugCommand.php
@@ -182,12 +182,12 @@ EOF
             ->name('*.html.twig')
         ;
         foreach ($finderTemplates as $template) {
-            $component = str_replace(\DIRECTORY_SEPARATOR, ':', $template->getRelativePathname());
+            $component = str_replace('/', ':', $template->getRelativePathname());
             $component = substr($component, 0, -10); // remove file extension ".html.twig"
             $path = $template->getPath();
 
             if ($template->getRelativePath()) {
-                $path = rtrim(substr($template->getPath(), 0, -1 * \strlen($template->getRelativePath())), \DIRECTORY_SEPARATOR);
+                $path = \rtrim(\substr($template->getPath(), 0, -1 * \strlen($template->getRelativePath())), '/');
             }
 
             if (isset($dirs[$path]) && FilesystemLoader::MAIN_NAMESPACE !== $dirs[$path]) {
diff --git a/src/TwigComponent/src/ComponentFactory.php b/src/TwigComponent/src/ComponentFactory.php
index d797c399..c191bc1b 100644
--- a/src/TwigComponent/src/ComponentFactory.php
+++ b/src/TwigComponent/src/ComponentFactory.php
@@ -14,6 +14,7 @@ namespace Symfony\UX\TwigComponent;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use Symfony\Component\DependencyInjection\ServiceLocator;
 use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
+use Symfony\Contracts\Service\ResetInterface;
 use Symfony\UX\TwigComponent\Attribute\AsTwigComponent;
 use Symfony\UX\TwigComponent\Event\PostMountEvent;
 use Symfony\UX\TwigComponent\Event\PreMountEvent;
@@ -23,8 +24,12 @@ use Symfony\UX\TwigComponent\Event\PreMountEvent;
  *
  * @internal
  */
-final class ComponentFactory
+final class ComponentFactory implements ResetInterface
 {
+    private static $mountMethods = [];
+    private static $preMountMethods = [];
+    private static $postMountMethods = [];
+
     /**
      * @param array<string, array>        $config
      * @param array<class-string, string> $classMap
@@ -141,37 +146,40 @@ final class ComponentFactory
 
     private function mount(object $component, array &$data): void
     {
-        try {
-            $method = (new \ReflectionClass($component))->getMethod('mount');
-        } catch (\ReflectionException) {
-            // no hydrate method
-            return;
-        }
-
         if ($component instanceof AnonymousComponent) {
             $component->mount($data);
 
             return;
         }
 
-        $parameters = [];
+        if (null === (self::$mountMethods[$component::class] ?? null)) {
+            try {
+                $mountMethod = self::$mountMethods[$component::class] = (new \ReflectionClass($component))->getMethod('mount');
+            } catch (\ReflectionException) {
+                self::$mountMethods[$component::class] = false;
 
-        foreach ($method->getParameters() as $refParameter) {
-            $name = $refParameter->getName();
+                return;
+            }
+        }
 
-            if (\array_key_exists($name, $data)) {
-                $parameters[] = $data[$name];
+        if (false === $mountMethod ??= self::$mountMethods[$component::class]) {
+            return;
+        }
 
+        $parameters = [];
+        foreach ($mountMethod->getParameters() as $refParameter) {
+            if (\array_key_exists($name = $refParameter->getName(), $data)) {
+                $parameters[] = $data[$name];
                 // remove the data element so it isn't used to set the property directly.
                 unset($data[$name]);
             } elseif ($refParameter->isDefaultValueAvailable()) {
                 $parameters[] = $refParameter->getDefaultValue();
             } else {
-                throw new \LogicException(\sprintf('%s::mount() has a required $%s parameter. Make sure this is passed or make give a default value.', $component::class, $refParameter->getName()));
+                throw new \LogicException(\sprintf('%s::mount() has a required $%s parameter. Make sure to pass it or give it a default value.', $component::class, $name));
             }
         }
 
-        $component->mount(...$parameters);
+        $mountMethod->invoke($component, ...$parameters);
     }
 
     private function preMount(object $component, array $data, ComponentMetadata $componentMetadata): array
@@ -180,10 +188,9 @@ final class ComponentFactory
         $this->eventDispatcher->dispatch($event);
         $data = $event->getData();
 
-        foreach (AsTwigComponent::preMountMethods($component) as $method) {
-            $newData = $component->{$method->name}($data);
-
-            if (null !== $newData) {
+        $methods = self::$preMountMethods[$component::class] ??= AsTwigComponent::preMountMethods($component::class);
+        foreach ($methods as $method) {
+            if (null !== $newData = $method->invoke($component, $data)) {
                 $data = $newData;
             }
         }
@@ -199,19 +206,17 @@ final class ComponentFactory
         $event = new PostMountEvent($component, $data, $componentMetadata);
         $this->eventDispatcher->dispatch($event);
         $data = $event->getData();
-        $extraMetadata = $event->getExtraMetadata();
 
-        foreach (AsTwigComponent::postMountMethods($component) as $method) {
-            $newData = $component->{$method->name}($data);
-
-            if (null !== $newData) {
+        $methods = self::$postMountMethods[$component::class] ??= AsTwigComponent::postMountMethods($component::class);
+        foreach ($methods as $method) {
+            if (null !== $newData = $method->invoke($component, $data)) {
                 $data = $newData;
             }
         }
 
         return [
             'data' => $data,
-            'extraMetadata' => $extraMetadata,
+            'extraMetadata' => $event->getExtraMetadata(),
         ];
     }
 
@@ -248,4 +253,11 @@ final class ComponentFactory
 
         throw new \InvalidArgumentException($message);
     }
+
+    public function reset(): void
+    {
+        self::$mountMethods = [];
+        self::$preMountMethods = [];
+        self::$postMountMethods = [];
+    }
 }
diff --git a/src/TwigComponent/src/DependencyInjection/TwigComponentExtension.php b/src/TwigComponent/src/DependencyInjection/TwigComponentExtension.php
index 0ee72306..19432f63 100644
--- a/src/TwigComponent/src/DependencyInjection/TwigComponentExtension.php
+++ b/src/TwigComponent/src/DependencyInjection/TwigComponentExtension.php
@@ -92,6 +92,7 @@ final class TwigComponentExtension extends Extension implements ConfigurationInt
                 new Reference('event_dispatcher'),
                 new AbstractArgument(\sprintf('Added in %s.', TwigComponentPass::class)),
             ])
+            ->addTag('kernel.reset', ['method' => 'reset'])
         ;
 
         $container->register('ux.twig_component.component_stack', ComponentStack::class);
diff --git a/ux.symfony.com/composer.lock b/ux.symfony.com/composer.lock
index 079768f8..64824239 100644
--- a/ux.symfony.com/composer.lock
+++ b/ux.symfony.com/composer.lock
@@ -1741,16 +1741,16 @@
         },
         {
             "name": "lcobucci/jwt",
-            "version": "5.4.1",
+            "version": "5.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/lcobucci/jwt.git",
-                "reference": "848815d2287abd5d3c285482f8e1f501b289a2e7"
+                "reference": "aac4fd512681fd5cb4b77d2105ab7ec700c72051"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/lcobucci/jwt/zipball/848815d2287abd5d3c285482f8e1f501b289a2e7",
-                "reference": "848815d2287abd5d3c285482f8e1f501b289a2e7",
+                "url": "https://api.github.com/repos/lcobucci/jwt/zipball/aac4fd512681fd5cb4b77d2105ab7ec700c72051",
+                "reference": "aac4fd512681fd5cb4b77d2105ab7ec700c72051",
                 "shasum": ""
             },
             "require": {
@@ -1798,7 +1798,7 @@
             ],
             "support": {
                 "issues": "https://github.com/lcobucci/jwt/issues",
-                "source": "https://github.com/lcobucci/jwt/tree/5.4.1"
+                "source": "https://github.com/lcobucci/jwt/tree/5.4.0"
             },
             "funding": [
                 {
@@ -1810,7 +1810,7 @@
                     "type": "patreon"
                 }
             ],
-            "time": "2024-11-06T06:16:04+00:00"
+            "time": "2024-10-08T22:06:45+00:00"
         },
         {
             "name": "league/commonmark",
@@ -2857,16 +2857,16 @@
         },
         {
             "name": "symfony/cache",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/cache.git",
-                "reference": "b9ef68c9130fcd3e2db0763e0d6fa866393f2df6"
+                "reference": "1354995a9e758e7141a90ed99248a0e21bee701d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/cache/zipball/b9ef68c9130fcd3e2db0763e0d6fa866393f2df6",
-                "reference": "b9ef68c9130fcd3e2db0763e0d6fa866393f2df6",
+                "url": "https://api.github.com/repos/symfony/cache/zipball/1354995a9e758e7141a90ed99248a0e21bee701d",
+                "reference": "1354995a9e758e7141a90ed99248a0e21bee701d",
                 "shasum": ""
             },
             "require": {
@@ -2935,7 +2935,7 @@
                 "psr6"
             ],
             "support": {
-                "source": "https://github.com/symfony/cache/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/cache/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -2951,7 +2951,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-05T15:35:02+00:00"
+            "time": "2024-10-25T15:40:01+00:00"
         },
         {
             "name": "symfony/cache-contracts",
@@ -3031,16 +3031,16 @@
         },
         {
             "name": "symfony/config",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/config.git",
-                "reference": "bcd3c4adf0144dee5011bb35454728c38adec055"
+                "reference": "75cfe49f73d6d43110690e55fb212d697ee598d9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/config/zipball/bcd3c4adf0144dee5011bb35454728c38adec055",
-                "reference": "bcd3c4adf0144dee5011bb35454728c38adec055",
+                "url": "https://api.github.com/repos/symfony/config/zipball/75cfe49f73d6d43110690e55fb212d697ee598d9",
+                "reference": "75cfe49f73d6d43110690e55fb212d697ee598d9",
                 "shasum": ""
             },
             "require": {
@@ -3086,7 +3086,7 @@
             "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/config/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/config/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -3102,20 +3102,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-04T11:36:24+00:00"
+            "time": "2024-10-25T15:15:23+00:00"
         },
         {
             "name": "symfony/console",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "3fda7e592a83a6f487cdce3146f6b3408e6f01de"
+                "reference": "de74db6d7c9f4ecabf7b4a1a20655e021b034001"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/3fda7e592a83a6f487cdce3146f6b3408e6f01de",
-                "reference": "3fda7e592a83a6f487cdce3146f6b3408e6f01de",
+                "url": "https://api.github.com/repos/symfony/console/zipball/de74db6d7c9f4ecabf7b4a1a20655e021b034001",
+                "reference": "de74db6d7c9f4ecabf7b4a1a20655e021b034001",
                 "shasum": ""
             },
             "require": {
@@ -3179,7 +3179,7 @@
                 "terminal"
             ],
             "support": {
-                "source": "https://github.com/symfony/console/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/console/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -3195,20 +3195,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-05T15:35:02+00:00"
+            "time": "2024-10-23T06:56:12+00:00"
         },
         {
             "name": "symfony/dependency-injection",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/dependency-injection.git",
-                "reference": "f5241adc1796c78f223e96fc3997ca0f4a836635"
+                "reference": "6d5c6520d1984bc67af228dd6519e03e58661d7f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f5241adc1796c78f223e96fc3997ca0f4a836635",
-                "reference": "f5241adc1796c78f223e96fc3997ca0f4a836635",
+                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6d5c6520d1984bc67af228dd6519e03e58661d7f",
+                "reference": "6d5c6520d1984bc67af228dd6519e03e58661d7f",
                 "shasum": ""
             },
             "require": {
@@ -3259,7 +3259,7 @@
             "description": "Allows you to standardize and centralize the way objects are constructed in your application",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/dependency-injection/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/dependency-injection/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -3275,7 +3275,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-06T08:41:34+00:00"
+            "time": "2024-10-25T15:15:23+00:00"
         },
         {
             "name": "symfony/deprecation-contracts",
@@ -3529,16 +3529,16 @@
         },
         {
             "name": "symfony/error-handler",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/error-handler.git",
-                "reference": "672b3dd1ef8b87119b446d67c58c106c43f965fe"
+                "reference": "ad57ca04868ca877e7919c56d20bdfa8024b54d6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/error-handler/zipball/672b3dd1ef8b87119b446d67c58c106c43f965fe",
-                "reference": "672b3dd1ef8b87119b446d67c58c106c43f965fe",
+                "url": "https://api.github.com/repos/symfony/error-handler/zipball/ad57ca04868ca877e7919c56d20bdfa8024b54d6",
+                "reference": "ad57ca04868ca877e7919c56d20bdfa8024b54d6",
                 "shasum": ""
             },
             "require": {
@@ -3584,7 +3584,7 @@
             "description": "Provides tools to manage errors and ease debugging PHP code",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/error-handler/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/error-handler/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -3600,7 +3600,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-05T15:35:02+00:00"
+            "time": "2024-10-14T08:54:27+00:00"
         },
         {
             "name": "symfony/event-dispatcher",
@@ -4119,16 +4119,16 @@
         },
         {
             "name": "symfony/framework-bundle",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/framework-bundle.git",
-                "reference": "7a46f7de39c92cdc29fd86beeb6f16ad1a3e5dd8"
+                "reference": "8a7df876a98d15c8b9f01b10397a76d5de548324"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/7a46f7de39c92cdc29fd86beeb6f16ad1a3e5dd8",
-                "reference": "7a46f7de39c92cdc29fd86beeb6f16ad1a3e5dd8",
+                "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/8a7df876a98d15c8b9f01b10397a76d5de548324",
+                "reference": "8a7df876a98d15c8b9f01b10397a76d5de548324",
                 "shasum": ""
             },
             "require": {
@@ -4249,7 +4249,7 @@
             "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/framework-bundle/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/framework-bundle/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -4265,20 +4265,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-05T09:05:33+00:00"
+            "time": "2024-10-25T15:15:23+00:00"
         },
         {
             "name": "symfony/http-client",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-client.git",
-                "reference": "730f1bb15938598419e92432e2156fc960dcf782"
+                "reference": "dee07290e432b1dde37dbb4ea1d67663f3cce0bc"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-client/zipball/730f1bb15938598419e92432e2156fc960dcf782",
-                "reference": "730f1bb15938598419e92432e2156fc960dcf782",
+                "url": "https://api.github.com/repos/symfony/http-client/zipball/dee07290e432b1dde37dbb4ea1d67663f3cce0bc",
+                "reference": "dee07290e432b1dde37dbb4ea1d67663f3cce0bc",
                 "shasum": ""
             },
             "require": {
@@ -4344,7 +4344,7 @@
                 "http"
             ],
             "support": {
-                "source": "https://github.com/symfony/http-client/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/http-client/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -4360,7 +4360,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-06T08:44:59+00:00"
+            "time": "2024-10-22T19:26:41+00:00"
         },
         {
             "name": "symfony/http-client-contracts",
@@ -4442,16 +4442,16 @@
         },
         {
             "name": "symfony/http-foundation",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-foundation.git",
-                "reference": "9a51d2afa16b17923ecbf0dfd51a71a56a3136d4"
+                "reference": "735b8519a8bcbf603d3af0430fb1be5c8822af13"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9a51d2afa16b17923ecbf0dfd51a71a56a3136d4",
-                "reference": "9a51d2afa16b17923ecbf0dfd51a71a56a3136d4",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/735b8519a8bcbf603d3af0430fb1be5c8822af13",
+                "reference": "735b8519a8bcbf603d3af0430fb1be5c8822af13",
                 "shasum": ""
             },
             "require": {
@@ -4500,7 +4500,7 @@
             "description": "Defines an object-oriented layer for the HTTP specification",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/http-foundation/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/http-foundation/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -4516,20 +4516,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-06T09:03:19+00:00"
+            "time": "2024-10-23T06:56:12+00:00"
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "70a5fd8f9614f8ed1f0a1640f00d59047e7619bb"
+                "reference": "1d5619199df507f9f03584ae9141924cc148050e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/70a5fd8f9614f8ed1f0a1640f00d59047e7619bb",
-                "reference": "70a5fd8f9614f8ed1f0a1640f00d59047e7619bb",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1d5619199df507f9f03584ae9141924cc148050e",
+                "reference": "1d5619199df507f9f03584ae9141924cc148050e",
                 "shasum": ""
             },
             "require": {
@@ -4614,7 +4614,7 @@
             "description": "Provides a structured process for converting a Request into a Response",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/http-kernel/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/http-kernel/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -4630,20 +4630,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-06T10:00:45+00:00"
+            "time": "2024-10-27T15:21:58+00:00"
         },
         {
             "name": "symfony/intl",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/intl.git",
-                "reference": "8069d355b4742a1dc98c92412215d4853fe28c29"
+                "reference": "e0c8d9c19b3a52f2d379319fd16298568ce9573d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/intl/zipball/8069d355b4742a1dc98c92412215d4853fe28c29",
-                "reference": "8069d355b4742a1dc98c92412215d4853fe28c29",
+                "url": "https://api.github.com/repos/symfony/intl/zipball/e0c8d9c19b3a52f2d379319fd16298568ce9573d",
+                "reference": "e0c8d9c19b3a52f2d379319fd16298568ce9573d",
                 "shasum": ""
             },
             "require": {
@@ -4700,7 +4700,7 @@
                 "localization"
             ],
             "support": {
-                "source": "https://github.com/symfony/intl/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/intl/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -4716,7 +4716,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-05T15:35:02+00:00"
+            "time": "2024-10-08T07:22:49+00:00"
         },
         {
             "name": "symfony/mercure",
@@ -4955,16 +4955,16 @@
         },
         {
             "name": "symfony/mime",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/mime.git",
-                "reference": "c73ca0f7f11fb609356b84d0d808053bf433880a"
+                "reference": "e57faea55d255c31b0899f0130c7d9da65fa2ec7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/mime/zipball/c73ca0f7f11fb609356b84d0d808053bf433880a",
-                "reference": "c73ca0f7f11fb609356b84d0d808053bf433880a",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/e57faea55d255c31b0899f0130c7d9da65fa2ec7",
+                "reference": "e57faea55d255c31b0899f0130c7d9da65fa2ec7",
                 "shasum": ""
             },
             "require": {
@@ -5019,7 +5019,7 @@
                 "mime-type"
             ],
             "support": {
-                "source": "https://github.com/symfony/mime/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/mime/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -5035,7 +5035,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-05T09:31:08+00:00"
+            "time": "2024-10-25T15:15:23+00:00"
         },
         {
             "name": "symfony/monolog-bridge",
@@ -5828,16 +5828,16 @@
         },
         {
             "name": "symfony/process",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "37f5c1fc0f83db4900ea961c5fc0180e2a279b6a"
+                "reference": "2ad775b9f17c8c9c1fe457750ce191e0f7c1fbff"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/37f5c1fc0f83db4900ea961c5fc0180e2a279b6a",
-                "reference": "37f5c1fc0f83db4900ea961c5fc0180e2a279b6a",
+                "url": "https://api.github.com/repos/symfony/process/zipball/2ad775b9f17c8c9c1fe457750ce191e0f7c1fbff",
+                "reference": "2ad775b9f17c8c9c1fe457750ce191e0f7c1fbff",
                 "shasum": ""
             },
             "require": {
@@ -5869,7 +5869,7 @@
             "description": "Executes commands in sub-processes",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/process/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/process/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -5885,7 +5885,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-06T09:25:18+00:00"
+            "time": "2024-09-26T08:57:56+00:00"
         },
         {
             "name": "symfony/property-access",
@@ -6049,16 +6049,16 @@
         },
         {
             "name": "symfony/routing",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/routing.git",
-                "reference": "0782e32f411cf1c4a1ab3f5c074a9b61f3df8e5a"
+                "reference": "b9f47730638e96d6ff26f84bd4a7e89073d15634"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/0782e32f411cf1c4a1ab3f5c074a9b61f3df8e5a",
-                "reference": "0782e32f411cf1c4a1ab3f5c074a9b61f3df8e5a",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/b9f47730638e96d6ff26f84bd4a7e89073d15634",
+                "reference": "b9f47730638e96d6ff26f84bd4a7e89073d15634",
                 "shasum": ""
             },
             "require": {
@@ -6110,7 +6110,7 @@
                 "url"
             ],
             "support": {
-                "source": "https://github.com/symfony/routing/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/routing/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -6126,20 +6126,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-06T08:41:34+00:00"
+            "time": "2024-10-03T12:20:01+00:00"
         },
         {
             "name": "symfony/runtime",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/runtime.git",
-                "reference": "46fd79dded7f7a6358dbf9e055ae545fc4bbb8ff"
+                "reference": "049a9f3bebe7d4d9572e3d4a86f0fb7fe24fb077"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/runtime/zipball/46fd79dded7f7a6358dbf9e055ae545fc4bbb8ff",
-                "reference": "46fd79dded7f7a6358dbf9e055ae545fc4bbb8ff",
+                "url": "https://api.github.com/repos/symfony/runtime/zipball/049a9f3bebe7d4d9572e3d4a86f0fb7fe24fb077",
+                "reference": "049a9f3bebe7d4d9572e3d4a86f0fb7fe24fb077",
                 "shasum": ""
             },
             "require": {
@@ -6189,7 +6189,7 @@
                 "runtime"
             ],
             "support": {
-                "source": "https://github.com/symfony/runtime/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/runtime/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -6205,20 +6205,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-05T16:46:43+00:00"
+            "time": "2024-09-25T14:21:43+00:00"
         },
         {
             "name": "symfony/serializer",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/serializer.git",
-                "reference": "96421e664c2c3077a1e0858a02e62a7a4d66ce79"
+                "reference": "56bcd41f8e8792b15ca363b730e26c7c536a7873"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/serializer/zipball/96421e664c2c3077a1e0858a02e62a7a4d66ce79",
-                "reference": "96421e664c2c3077a1e0858a02e62a7a4d66ce79",
+                "url": "https://api.github.com/repos/symfony/serializer/zipball/56bcd41f8e8792b15ca363b730e26c7c536a7873",
+                "reference": "56bcd41f8e8792b15ca363b730e26c7c536a7873",
                 "shasum": ""
             },
             "require": {
@@ -6288,7 +6288,7 @@
             "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/serializer/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/serializer/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -6304,7 +6304,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-10-25T18:10:29+00:00"
+            "time": "2024-10-22T19:37:21+00:00"
         },
         {
             "name": "symfony/service-contracts",
@@ -6395,12 +6395,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/stimulus-bundle.git",
-                "reference": "d9b83e7132451dfddfa8ef398b50cfa88e490c21"
+                "reference": "2dc5431fd4fd84662615b435af7a0a6affd94f2d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/d9b83e7132451dfddfa8ef398b50cfa88e490c21",
-                "reference": "d9b83e7132451dfddfa8ef398b50cfa88e490c21",
+                "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/2dc5431fd4fd84662615b435af7a0a6affd94f2d",
+                "reference": "2dc5431fd4fd84662615b435af7a0a6affd94f2d",
                 "shasum": ""
             },
             "require": {
@@ -6457,7 +6457,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-28T11:18:16+00:00"
         },
         {
             "name": "symfony/stopwatch",
@@ -6783,16 +6783,16 @@
         },
         {
             "name": "symfony/twig-bridge",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/twig-bridge.git",
-                "reference": "e34839ab413e1dc32bd2cb9f95186af1bacaee7e"
+                "reference": "a5d88e50935a998eb84495098f2d1e3aa75de627"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/e34839ab413e1dc32bd2cb9f95186af1bacaee7e",
-                "reference": "e34839ab413e1dc32bd2cb9f95186af1bacaee7e",
+                "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/a5d88e50935a998eb84495098f2d1e3aa75de627",
+                "reference": "a5d88e50935a998eb84495098f2d1e3aa75de627",
                 "shasum": ""
             },
             "require": {
@@ -6873,7 +6873,7 @@
             "description": "Provides integration for Twig with various Symfony components",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/twig-bridge/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/twig-bridge/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -6889,7 +6889,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-06T08:15:21+00:00"
+            "time": "2024-10-25T16:06:58+00:00"
         },
         {
             "name": "symfony/twig-bundle",
@@ -7137,12 +7137,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-autocomplete.git",
-                "reference": "899baeabb95b6d073324f74b82575f12c5dfebdb"
+                "reference": "c1681c9b8fc3aa09657e02b8842be69102918a89"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-autocomplete/zipball/899baeabb95b6d073324f74b82575f12c5dfebdb",
-                "reference": "899baeabb95b6d073324f74b82575f12c5dfebdb",
+                "url": "https://api.github.com/repos/symfony/ux-autocomplete/zipball/c1681c9b8fc3aa09657e02b8842be69102918a89",
+                "reference": "c1681c9b8fc3aa09657e02b8842be69102918a89",
                 "shasum": ""
             },
             "require": {
@@ -7220,7 +7220,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-24T09:16:33+00:00"
         },
         {
             "name": "symfony/ux-chartjs",
@@ -7228,12 +7228,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-chartjs.git",
-                "reference": "4c1039f35de42f398330439d612ecef361e818cc"
+                "reference": "70ff570d96812487c523afd5756df671ec5c5cee"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-chartjs/zipball/4c1039f35de42f398330439d612ecef361e818cc",
-                "reference": "4c1039f35de42f398330439d612ecef361e818cc",
+                "url": "https://api.github.com/repos/symfony/ux-chartjs/zipball/70ff570d96812487c523afd5756df671ec5c5cee",
+                "reference": "70ff570d96812487c523afd5756df671ec5c5cee",
                 "shasum": ""
             },
             "require": {
@@ -7285,7 +7285,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-chartjs/tree/2.x"
+                "source": "https://github.com/symfony/ux-chartjs/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -7301,7 +7301,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-15T10:36:49+00:00"
         },
         {
             "name": "symfony/ux-cropperjs",
@@ -7309,12 +7309,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-cropperjs.git",
-                "reference": "82e0a09708cd98cb447af80593a6dc958d516c97"
+                "reference": "fa8dd0f4fdac8f216206aa06d2e5d771fbb57b83"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-cropperjs/zipball/82e0a09708cd98cb447af80593a6dc958d516c97",
-                "reference": "82e0a09708cd98cb447af80593a6dc958d516c97",
+                "url": "https://api.github.com/repos/symfony/ux-cropperjs/zipball/fa8dd0f4fdac8f216206aa06d2e5d771fbb57b83",
+                "reference": "fa8dd0f4fdac8f216206aa06d2e5d771fbb57b83",
                 "shasum": ""
             },
             "require": {
@@ -7371,7 +7371,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-cropperjs/tree/2.x"
+                "source": "https://github.com/symfony/ux-cropperjs/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -7387,7 +7387,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-12T06:22:44+00:00"
         },
         {
             "name": "symfony/ux-dropzone",
@@ -7395,12 +7395,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-dropzone.git",
-                "reference": "57be8d1a2381099bddd5bd61e16278e7bcfc2d4b"
+                "reference": "ad7889144bb245665c894f63bd732f3927d8e4a1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-dropzone/zipball/57be8d1a2381099bddd5bd61e16278e7bcfc2d4b",
-                "reference": "57be8d1a2381099bddd5bd61e16278e7bcfc2d4b",
+                "url": "https://api.github.com/repos/symfony/ux-dropzone/zipball/ad7889144bb245665c894f63bd732f3927d8e4a1",
+                "reference": "ad7889144bb245665c894f63bd732f3927d8e4a1",
                 "shasum": ""
             },
             "require": {
@@ -7451,7 +7451,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-dropzone/tree/2.x"
+                "source": "https://github.com/symfony/ux-dropzone/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -7467,7 +7467,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-12T06:22:44+00:00"
         },
         {
             "name": "symfony/ux-icons",
@@ -7565,12 +7565,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-lazy-image.git",
-                "reference": "ce8f1bcaa32ed90651a87509ab506edfa7e56d39"
+                "reference": "6eddf3a6747fa108cd6115e55b51faa62ddfe977"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-lazy-image/zipball/ce8f1bcaa32ed90651a87509ab506edfa7e56d39",
-                "reference": "ce8f1bcaa32ed90651a87509ab506edfa7e56d39",
+                "url": "https://api.github.com/repos/symfony/ux-lazy-image/zipball/6eddf3a6747fa108cd6115e55b51faa62ddfe977",
+                "reference": "6eddf3a6747fa108cd6115e55b51faa62ddfe977",
                 "shasum": ""
             },
             "require": {
@@ -7621,7 +7621,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-lazy-image/tree/2.x"
+                "source": "https://github.com/symfony/ux-lazy-image/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -7637,7 +7637,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-12T06:22:44+00:00"
         },
         {
             "name": "symfony/ux-leaflet-map",
@@ -7645,12 +7645,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-leaflet-map.git",
-                "reference": "6feb25289443550f26e658300c1f1b89abbecdbb"
+                "reference": "7f2b9a96d8fe7435c462608dabedeab6deb66725"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-leaflet-map/zipball/6feb25289443550f26e658300c1f1b89abbecdbb",
-                "reference": "6feb25289443550f26e658300c1f1b89abbecdbb",
+                "url": "https://api.github.com/repos/symfony/ux-leaflet-map/zipball/7f2b9a96d8fe7435c462608dabedeab6deb66725",
+                "reference": "7f2b9a96d8fe7435c462608dabedeab6deb66725",
                 "shasum": ""
             },
             "require": {
@@ -7691,7 +7691,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-leaflet-map/tree/2.x"
+                "source": "https://github.com/symfony/ux-leaflet-map/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -7707,7 +7707,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-09-25T14:22:09+00:00"
         },
         {
             "name": "symfony/ux-live-component",
@@ -7715,12 +7715,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-live-component.git",
-                "reference": "ef73cff1bc8c1d5736f549733143bbf3c29cf54c"
+                "reference": "b1727573b4bff5821958306c6360668aac82f6d3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-live-component/zipball/ef73cff1bc8c1d5736f549733143bbf3c29cf54c",
-                "reference": "ef73cff1bc8c1d5736f549733143bbf3c29cf54c",
+                "url": "https://api.github.com/repos/symfony/ux-live-component/zipball/b1727573b4bff5821958306c6360668aac82f6d3",
+                "reference": "b1727573b4bff5821958306c6360668aac82f6d3",
                 "shasum": ""
             },
             "require": {
@@ -7802,7 +7802,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-31T16:39:49+00:00"
         },
         {
             "name": "symfony/ux-map",
@@ -7810,12 +7810,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-map.git",
-                "reference": "25185ff4b3157bac64af794f72debb7ed082ef74"
+                "reference": "ecbf1b35928040033841cab059b40a88643f8743"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-map/zipball/25185ff4b3157bac64af794f72debb7ed082ef74",
-                "reference": "25185ff4b3157bac64af794f72debb7ed082ef74",
+                "url": "https://api.github.com/repos/symfony/ux-map/zipball/ecbf1b35928040033841cab059b40a88643f8743",
+                "reference": "ecbf1b35928040033841cab059b40a88643f8743",
                 "shasum": ""
             },
             "require": {
@@ -7869,7 +7869,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-map/tree/2.x"
+                "source": "https://github.com/symfony/ux-map/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -7885,7 +7885,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-04T18:32:35+00:00"
+            "time": "2024-10-15T10:36:49+00:00"
         },
         {
             "name": "symfony/ux-notify",
@@ -7893,12 +7893,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-notify.git",
-                "reference": "88cdccb64a10fa56c4fb44c85eb19c8039cc8c5e"
+                "reference": "082283e52a85e18cf46c39d2974ccd7370853ab6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-notify/zipball/88cdccb64a10fa56c4fb44c85eb19c8039cc8c5e",
-                "reference": "88cdccb64a10fa56c4fb44c85eb19c8039cc8c5e",
+                "url": "https://api.github.com/repos/symfony/ux-notify/zipball/082283e52a85e18cf46c39d2974ccd7370853ab6",
+                "reference": "082283e52a85e18cf46c39d2974ccd7370853ab6",
                 "shasum": ""
             },
             "require": {
@@ -7952,7 +7952,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-notify/tree/2.x"
+                "source": "https://github.com/symfony/ux-notify/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -7968,7 +7968,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-12T06:22:44+00:00"
         },
         {
             "name": "symfony/ux-react",
@@ -7976,12 +7976,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-react.git",
-                "reference": "b44072846cd1700c5f61a69a55a3bb086d786fdb"
+                "reference": "1e8f097e73f6d561272b044cb3a7b5ab84eda3ce"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-react/zipball/b44072846cd1700c5f61a69a55a3bb086d786fdb",
-                "reference": "b44072846cd1700c5f61a69a55a3bb086d786fdb",
+                "url": "https://api.github.com/repos/symfony/ux-react/zipball/1e8f097e73f6d561272b044cb3a7b5ab84eda3ce",
+                "reference": "1e8f097e73f6d561272b044cb3a7b5ab84eda3ce",
                 "shasum": ""
             },
             "require": {
@@ -8029,7 +8029,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-react/tree/2.x"
+                "source": "https://github.com/symfony/ux-react/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -8045,7 +8045,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-22T14:52:13+00:00"
         },
         {
             "name": "symfony/ux-svelte",
@@ -8053,12 +8053,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-svelte.git",
-                "reference": "5c91954115f6708d9818dd8568ab534c89656980"
+                "reference": "4ee061583e39f5b2356a376ee213a8c49d0dda30"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-svelte/zipball/5c91954115f6708d9818dd8568ab534c89656980",
-                "reference": "5c91954115f6708d9818dd8568ab534c89656980",
+                "url": "https://api.github.com/repos/symfony/ux-svelte/zipball/4ee061583e39f5b2356a376ee213a8c49d0dda30",
+                "reference": "4ee061583e39f5b2356a376ee213a8c49d0dda30",
                 "shasum": ""
             },
             "require": {
@@ -8110,7 +8110,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-svelte/tree/2.x"
+                "source": "https://github.com/symfony/ux-svelte/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -8126,7 +8126,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-15T10:36:49+00:00"
         },
         {
             "name": "symfony/ux-swup",
@@ -8134,12 +8134,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-swup.git",
-                "reference": "0d43a8b8f2adbeed010ce8dc69a2a553f5efc5df"
+                "reference": "d3661dcfe2a0555bd97f799d6d0d3d31f3a7f462"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-swup/zipball/0d43a8b8f2adbeed010ce8dc69a2a553f5efc5df",
-                "reference": "0d43a8b8f2adbeed010ce8dc69a2a553f5efc5df",
+                "url": "https://api.github.com/repos/symfony/ux-swup/zipball/d3661dcfe2a0555bd97f799d6d0d3d31f3a7f462",
+                "reference": "d3661dcfe2a0555bd97f799d6d0d3d31f3a7f462",
                 "shasum": ""
             },
             "conflict": {
@@ -8178,7 +8178,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-swup/tree/2.x"
+                "source": "https://github.com/symfony/ux-swup/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -8194,7 +8194,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-12T06:22:44+00:00"
         },
         {
             "name": "symfony/ux-toggle-password",
@@ -8202,12 +8202,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-toggle-password.git",
-                "reference": "22aaa245e8439ac55267fc6c9d056f60663fff0f"
+                "reference": "48d4aa13c3286849c4d86e03df9c5b90917e4d15"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-toggle-password/zipball/22aaa245e8439ac55267fc6c9d056f60663fff0f",
-                "reference": "22aaa245e8439ac55267fc6c9d056f60663fff0f",
+                "url": "https://api.github.com/repos/symfony/ux-toggle-password/zipball/48d4aa13c3286849c4d86e03df9c5b90917e4d15",
+                "reference": "48d4aa13c3286849c4d86e03df9c5b90917e4d15",
                 "shasum": ""
             },
             "require": {
@@ -8259,7 +8259,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-toggle-password/tree/2.x"
+                "source": "https://github.com/symfony/ux-toggle-password/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -8275,7 +8275,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-12T06:22:44+00:00"
         },
         {
             "name": "symfony/ux-translator",
@@ -8283,12 +8283,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-translator.git",
-                "reference": "461f1a2aa1db6e525550b7ce4ccc4bc649938733"
+                "reference": "df523d5f90256a40bc7ceaabfe6664bd9856cb74"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-translator/zipball/461f1a2aa1db6e525550b7ce4ccc4bc649938733",
-                "reference": "461f1a2aa1db6e525550b7ce4ccc4bc649938733",
+                "url": "https://api.github.com/repos/symfony/ux-translator/zipball/df523d5f90256a40bc7ceaabfe6664bd9856cb74",
+                "reference": "df523d5f90256a40bc7ceaabfe6664bd9856cb74",
                 "shasum": ""
             },
             "require": {
@@ -8336,7 +8336,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-translator/tree/2.x"
+                "source": "https://github.com/symfony/ux-translator/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -8352,7 +8352,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-12T06:22:44+00:00"
         },
         {
             "name": "symfony/ux-turbo",
@@ -8360,12 +8360,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-turbo.git",
-                "reference": "418f639e3aab5b1b68cd92fad558db53ed90484f"
+                "reference": "add0a143c032a482c07c8d5e8776270973491abd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/418f639e3aab5b1b68cd92fad558db53ed90484f",
-                "reference": "418f639e3aab5b1b68cd92fad558db53ed90484f",
+                "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/add0a143c032a482c07c8d5e8776270973491abd",
+                "reference": "add0a143c032a482c07c8d5e8776270973491abd",
                 "shasum": ""
             },
             "require": {
@@ -8451,7 +8451,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-30T20:05:58+00:00"
         },
         {
             "name": "symfony/ux-twig-component",
@@ -8459,12 +8459,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-twig-component.git",
-                "reference": "cb2fc0f55ad66e961b3af3706bddbab5f4053aaa"
+                "reference": "da12467494cbf4adc91384f7ace7063e315b7445"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/cb2fc0f55ad66e961b3af3706bddbab5f4053aaa",
-                "reference": "cb2fc0f55ad66e961b3af3706bddbab5f4053aaa",
+                "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/da12467494cbf4adc91384f7ace7063e315b7445",
+                "reference": "da12467494cbf4adc91384f7ace7063e315b7445",
                 "shasum": ""
             },
             "require": {
@@ -8535,7 +8535,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-04T01:08:49+00:00"
+            "time": "2024-11-01T06:57:32+00:00"
         },
         {
             "name": "symfony/ux-typed",
@@ -8543,12 +8543,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-typed.git",
-                "reference": "14c2ee2d5ce0ff5b2a5b15e907be7171924b7907"
+                "reference": "6c79f083bbca3a3d0663387493874077e16a5dd7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-typed/zipball/14c2ee2d5ce0ff5b2a5b15e907be7171924b7907",
-                "reference": "14c2ee2d5ce0ff5b2a5b15e907be7171924b7907",
+                "url": "https://api.github.com/repos/symfony/ux-typed/zipball/6c79f083bbca3a3d0663387493874077e16a5dd7",
+                "reference": "6c79f083bbca3a3d0663387493874077e16a5dd7",
                 "shasum": ""
             },
             "conflict": {
@@ -8587,7 +8587,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-typed/tree/2.x"
+                "source": "https://github.com/symfony/ux-typed/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -8603,7 +8603,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-12T06:22:44+00:00"
         },
         {
             "name": "symfony/ux-vue",
@@ -8611,12 +8611,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/ux-vue.git",
-                "reference": "20150d5ad63dd3a692dd950b1a2bef3bfd2a3259"
+                "reference": "8acdb434eaf653ab9e8fd9a787becc3fd6d3a7eb"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/ux-vue/zipball/20150d5ad63dd3a692dd950b1a2bef3bfd2a3259",
-                "reference": "20150d5ad63dd3a692dd950b1a2bef3bfd2a3259",
+                "url": "https://api.github.com/repos/symfony/ux-vue/zipball/8acdb434eaf653ab9e8fd9a787becc3fd6d3a7eb",
+                "reference": "8acdb434eaf653ab9e8fd9a787becc3fd6d3a7eb",
                 "shasum": ""
             },
             "require": {
@@ -8668,7 +8668,7 @@
                 "symfony-ux"
             ],
             "support": {
-                "source": "https://github.com/symfony/ux-vue/tree/2.x"
+                "source": "https://github.com/symfony/ux-vue/tree/v2.21.0"
             },
             "funding": [
                 {
@@ -8684,20 +8684,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-02T19:57:29+00:00"
+            "time": "2024-10-15T10:36:49+00:00"
         },
         {
             "name": "symfony/validator",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/validator.git",
-                "reference": "20bf8bec7938be121e76dd9a80aac4c19ceb6318"
+                "reference": "8392b9bafbfed3c166a979ac0bd8a3186abb8e75"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/validator/zipball/20bf8bec7938be121e76dd9a80aac4c19ceb6318",
-                "reference": "20bf8bec7938be121e76dd9a80aac4c19ceb6318",
+                "url": "https://api.github.com/repos/symfony/validator/zipball/8392b9bafbfed3c166a979ac0bd8a3186abb8e75",
+                "reference": "8392b9bafbfed3c166a979ac0bd8a3186abb8e75",
                 "shasum": ""
             },
             "require": {
@@ -8765,7 +8765,7 @@
             "description": "Provides tools to validate values",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/validator/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/validator/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -8781,20 +8781,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-04T11:36:24+00:00"
+            "time": "2024-10-25T15:15:23+00:00"
         },
         {
             "name": "symfony/var-dumper",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/var-dumper.git",
-                "reference": "131a71f779b76fefc41465f1ccbe701a02b4389b"
+                "reference": "b86ce1b5bb196cfb3796856979167271d3989c7c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/131a71f779b76fefc41465f1ccbe701a02b4389b",
-                "reference": "131a71f779b76fefc41465f1ccbe701a02b4389b",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b86ce1b5bb196cfb3796856979167271d3989c7c",
+                "reference": "b86ce1b5bb196cfb3796856979167271d3989c7c",
                 "shasum": ""
             },
             "require": {
@@ -8848,7 +8848,7 @@
                 "dump"
             ],
             "support": {
-                "source": "https://github.com/symfony/var-dumper/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/var-dumper/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -8864,7 +8864,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-05T15:35:02+00:00"
+            "time": "2024-10-23T08:11:15+00:00"
         },
         {
             "name": "symfony/var-exporter",
@@ -11925,16 +11925,16 @@
         },
         {
             "name": "symfony/phpunit-bridge",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/phpunit-bridge.git",
-                "reference": "0228dd1180ee3ef6c85eeb51ddbe89e0eaef7d33"
+                "reference": "078398ebac9b707438286e8d689b30b5ef1e6602"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/0228dd1180ee3ef6c85eeb51ddbe89e0eaef7d33",
-                "reference": "0228dd1180ee3ef6c85eeb51ddbe89e0eaef7d33",
+                "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/078398ebac9b707438286e8d689b30b5ef1e6602",
+                "reference": "078398ebac9b707438286e8d689b30b5ef1e6602",
                 "shasum": ""
             },
             "require": {
@@ -11987,7 +11987,7 @@
             "description": "Provides utilities for PHPUnit, especially user deprecation notices management",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/phpunit-bridge/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/phpunit-bridge/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -12003,20 +12003,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-10-27T06:46:44+00:00"
+            "time": "2024-10-23T06:50:56+00:00"
         },
         {
             "name": "symfony/web-profiler-bundle",
-            "version": "v7.2.0-BETA2",
+            "version": "v7.2.0-BETA1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/web-profiler-bundle.git",
-                "reference": "d4e008e21cbbc03a992edeecf49c9bbfd3a4f837"
+                "reference": "1827c2cf600a760334b4fbbc610a9fe308a3f73a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/d4e008e21cbbc03a992edeecf49c9bbfd3a4f837",
-                "reference": "d4e008e21cbbc03a992edeecf49c9bbfd3a4f837",
+                "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/1827c2cf600a760334b4fbbc610a9fe308a3f73a",
+                "reference": "1827c2cf600a760334b4fbbc610a9fe308a3f73a",
                 "shasum": ""
             },
             "require": {
@@ -12069,7 +12069,7 @@
                 "dev"
             ],
             "support": {
-                "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.2.0-BETA2"
+                "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.2.0-BETA1"
             },
             "funding": [
                 {
@@ -12085,7 +12085,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-05T15:35:02+00:00"
+            "time": "2024-10-23T08:11:15+00:00"
         },
         {
             "name": "theseer/tokenizer",
@@ -12336,16 +12336,16 @@
         },
         {
             "name": "zenstruck/browser",
-            "version": "v1.9.1",
+            "version": "v1.9.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/zenstruck/browser.git",
-                "reference": "a1518531749b157347de60eef2a0a6f5fbd97b97"
+                "reference": "9603f3dab8377ae3b341e653a8e61e15734b6336"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/zenstruck/browser/zipball/a1518531749b157347de60eef2a0a6f5fbd97b97",
-                "reference": "a1518531749b157347de60eef2a0a6f5fbd97b97",
+                "url": "https://api.github.com/repos/zenstruck/browser/zipball/9603f3dab8377ae3b341e653a8e61e15734b6336",
+                "reference": "9603f3dab8377ae3b341e653a8e61e15734b6336",
                 "shasum": ""
             },
             "require": {
@@ -12398,7 +12398,7 @@
             ],
             "support": {
                 "issues": "https://github.com/zenstruck/browser/issues",
-                "source": "https://github.com/zenstruck/browser/tree/v1.9.1"
+                "source": "https://github.com/zenstruck/browser/tree/v1.9.0"
             },
             "funding": [
                 {
@@ -12406,7 +12406,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2024-11-05T12:21:53+00:00"
+            "time": "2024-10-20T23:04:59+00:00"
         },
         {
             "name": "zenstruck/callback",
@@ -12466,16 +12466,16 @@
         },
         {
             "name": "zenstruck/foundry",
-            "version": "v2.2.2",
+            "version": "v2.2.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/zenstruck/foundry.git",
-                "reference": "44eec45b620fd5419906c387512bd1acdf898647"
+                "reference": "4743a9da142b42d484ac7a99c1a7068aa66c7bec"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/zenstruck/foundry/zipball/44eec45b620fd5419906c387512bd1acdf898647",
-                "reference": "44eec45b620fd5419906c387512bd1acdf898647",
+                "url": "https://api.github.com/repos/zenstruck/foundry/zipball/4743a9da142b42d484ac7a99c1a7068aa66c7bec",
+                "reference": "4743a9da142b42d484ac7a99c1a7068aa66c7bec",
                 "shasum": ""
             },
             "require": {
@@ -12555,7 +12555,7 @@
             ],
             "support": {
                 "issues": "https://github.com/zenstruck/foundry/issues",
-                "source": "https://github.com/zenstruck/foundry/tree/v2.2.2"
+                "source": "https://github.com/zenstruck/foundry/tree/v2.2.1"
             },
             "funding": [
                 {
@@ -12563,7 +12563,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2024-11-05T16:39:17+00:00"
+            "time": "2024-10-31T12:10:58+00:00"
         }
     ],
     "aliases": [],
diff --git a/ux.symfony.com/templates/cookbook/index.html.twig b/ux.symfony.com/templates/cookbook/index.html.twig
index a15a4413..2a18a9f3 100644
--- a/ux.symfony.com/templates/cookbook/index.html.twig
+++ b/ux.symfony.com/templates/cookbook/index.html.twig
@@ -3,7 +3,7 @@
 {% set meta = {
     title: 'Cookbook',
     title_suffix: ' - Symfony UX',
-    description: 'Symfony UX Cookbook - Concrete examples to understantd all the concepts and components of Symfony UX.',
+    description: 'Symfony UX cookbook - Concrete exeample to understantd all the concepts and components of Symfony UX',
     canonical: url('app_cookbook'),
 } %}
 


Test patch:
diff --git a/bin/test_package.sh b/bin/test_package.sh
index d5fc420a..669e293c 100755
--- a/bin/test_package.sh
+++ b/bin/test_package.sh
@@ -47,19 +47,6 @@ processWorkspace() {
     fi
     
     echo -e "Processing workspace $workspace at location $location...\n"
-    
-    echo "Checking '$package_json_path' for peerDependencies and importmap dependencies to have the same version"
-    deps=$(jq -r '.peerDependencies | keys[]' "$package_json_path")
-    for library in $deps; do
-        version=$(jq -r ".peerDependencies.\"$library\"" "$package_json_path")
-        importmap_version=$(jq -r ".symfony.importmap.\"$library\"" "$package_json_path")
-
-        if [ "$version" != "$importmap_version" ]; then
-            echo " -> Version mismatch for $library: $version (peerDependencies) vs $importmap_version (importmap)"
-            echo " -> You need to match the version of the \"peerDependency\" with the version in the \"importmap\""
-            exit
-        fi
-    done
 
     echo "Checking '$package_json_path' for peerDependencies with multiple versions defined"
     deps_with_multiple_versions=$(jq -r '.peerDependencies | to_entries[] | select(.value | contains("||")) | .key' "$package_json_path")
@@ -81,9 +68,6 @@ processWorkspace() {
                     runTestSuite
                 fi
             done
-            
-            echo " -> Reverting version changes for $library"
-            yarn workspace "$workspace" add "$library@$versionValue" --peer
         done
     else
         echo -e " -> No peerDependencies found with multiple versions defined\n"
diff --git a/src/Icons/tests/Fixtures/TestKernel.php b/src/Icons/tests/Fixtures/TestKernel.php
index 2f573439..6a9d0f0b 100644
--- a/src/Icons/tests/Fixtures/TestKernel.php
+++ b/src/Icons/tests/Fixtures/TestKernel.php
@@ -60,10 +60,6 @@ final class TestKernel extends Kernel
 
         $container->extension('ux_icons', [
             'icon_dir' => '%kernel.project_dir%/tests/Fixtures/icons',
-            'aliases' => [
-                'foo' => 'lucide:circle',
-                'bar' => 'lu:circle-off',
-            ],
             'icon_sets' => [
                 'fla' => [
                     'path' => '%kernel.project_dir%/tests/Fixtures/images/flags',
diff --git a/src/Icons/tests/Integration/Command/ImportIconCommandTest.php b/src/Icons/tests/Integration/Command/ImportIconCommandTest.php
index 0935fb4d..b664ad45 100644
--- a/src/Icons/tests/Integration/Command/ImportIconCommandTest.php
+++ b/src/Icons/tests/Integration/Command/ImportIconCommandTest.php
@@ -23,7 +23,7 @@ final class ImportIconCommandTest extends KernelTestCase
     use InteractsWithConsole;
 
     private const ICON_DIR = __DIR__.'/../../Fixtures/icons';
-    private const ICONS = ['uiw/dashboard.svg', 'lucide/circle.svg'];
+    private const ICONS = ['uiw/dashboard.svg'];
 
     /**
      * @before
@@ -45,8 +45,8 @@ final class ImportIconCommandTest extends KernelTestCase
 
         $this->executeConsoleCommand('ux:icons:import uiw:dashboard')
             ->assertSuccessful()
-            ->assertOutputContains('Icon set: uiw icons (License: MIT)')
             ->assertOutputContains('Importing uiw:dashboard')
+            ->assertOutputContains("Imported uiw:dashboard (License: MIT). Render with: {{ ux_icon('uiw:dashboard') }}")
         ;
 
         $this->assertFileExists($expectedFile);
@@ -60,34 +60,13 @@ final class ImportIconCommandTest extends KernelTestCase
         ;
     }
 
-    public function testImportNonExistentIconSet(): void
-    {
-        $this->executeConsoleCommand('ux:icons:import something:invalid')
-            ->assertStatusCode(1)
-            ->assertOutputContains('[ERROR] Icon set "something" not found.')
-        ;
-    }
-
     public function testImportNonExistentIcon(): void
     {
-        $this->executeConsoleCommand('ux:icons:import lucide:not-existing-icon')
+        $this->executeConsoleCommand('ux:icons:import something:invalid')
             ->assertStatusCode(1)
-            ->assertOutputContains('Not Found lucide:not-existing-icon')
-            ->assertOutputContains('[ERROR] Imported 0/1 icons.')
-        ;
-
-        $this->assertFileDoesNotExist(self::ICON_DIR.'/not-existing-icon.svg');
-    }
-
-    public function testImportNonExistentIconWithExistentOne(): void
-    {
-        $this->executeConsoleCommand('ux:icons:import lucide:circle lucide:not-existing-icon')
-            ->assertStatusCode(0)
-            ->assertOutputContains('Imported lucide:circle')
-            ->assertOutputContains('Not Found lucide:not-existing-icon')
-            ->assertOutputContains('[WARNING] Imported 1/2 icons.')
+            ->assertOutputContains('[ERROR] The icon "something:invalid" does not exist on iconify.design.')
         ;
 
-        $this->assertFileDoesNotExist(self::ICON_DIR.'/not-existing-icon.svg');
+        $this->assertFileDoesNotExist(self::ICON_DIR.'/invalid.svg');
     }
 }
diff --git a/src/Icons/tests/Integration/Command/LockIconsCommandTest.php b/src/Icons/tests/Integration/Command/LockIconsCommandTest.php
index abcfc45f..f6b2e11f 100644
--- a/src/Icons/tests/Integration/Command/LockIconsCommandTest.php
+++ b/src/Icons/tests/Integration/Command/LockIconsCommandTest.php
@@ -25,8 +25,6 @@ final class LockIconsCommandTest extends KernelTestCase
     private const ICONS = [
         __DIR__.'/../../Fixtures/icons/iconamoon/3d-duotone.svg',
         __DIR__.'/../../Fixtures/icons/flag/eu-4x3.svg',
-        __DIR__.'/../../Fixtures/icons/lucide/circle.svg',
-        __DIR__.'/../../Fixtures/icons/lucide/circle-off.svg',
     ];
 
     /**
@@ -52,11 +50,9 @@ final class LockIconsCommandTest extends KernelTestCase
         $this->executeConsoleCommand('ux:icons:lock')
             ->assertSuccessful()
             ->assertOutputContains('Scanning project for icons...')
-            ->assertOutputContains('Imported lucide:circle')
-            ->assertOutputContains('Imported lucide:circle-off')
             ->assertOutputContains('Imported flag:eu-4x3')
             ->assertOutputContains('Imported iconamoon:3d-duotone')
-            ->assertOutputContains('Imported 4 icons')
+            ->assertOutputContains('Imported 2 icons')
         ;
 
         foreach (self::ICONS as $icon) {
@@ -74,21 +70,17 @@ final class LockIconsCommandTest extends KernelTestCase
         $this->executeConsoleCommand('ux:icons:lock')
             ->assertSuccessful()
             ->assertOutputContains('Scanning project for icons...')
-            ->assertOutputContains('Imported lucide:circle')
-            ->assertOutputContains('Imported lucide:circle-off')
             ->assertOutputContains('Imported flag:eu-4x3')
             ->assertOutputContains('Imported iconamoon:3d-duotone')
-            ->assertOutputContains('Imported 4 icons')
+            ->assertOutputContains('Imported 2 icons')
         ;
 
         $this->executeConsoleCommand('ux:icons:lock --force')
             ->assertSuccessful()
             ->assertOutputContains('Scanning project for icons...')
-            ->assertOutputContains('Imported lucide:circle')
-            ->assertOutputContains('Imported lucide:circle-off')
             ->assertOutputContains('Imported flag:eu-4x3')
             ->assertOutputContains('Imported iconamoon:3d-duotone')
-            ->assertOutputContains('Imported 4 icons')
+            ->assertOutputContains('Imported 2 icons')
         ;
     }
 }
diff --git a/src/Icons/tests/Unit/IconifyTest.php b/src/Icons/tests/Unit/IconifyTest.php
index c6edef0c..b9406836 100644
--- a/src/Icons/tests/Unit/IconifyTest.php
+++ b/src/Icons/tests/Unit/IconifyTest.php
@@ -16,7 +16,6 @@ use Symfony\Component\Cache\Adapter\NullAdapter;
 use Symfony\Component\HttpClient\MockHttpClient;
 use Symfony\Component\HttpClient\Response\JsonMockResponse;
 use Symfony\UX\Icons\Exception\IconNotFoundException;
-use Symfony\UX\Icons\Icon;
 use Symfony\UX\Icons\Iconify;
 
 /**
@@ -163,71 +162,6 @@ class IconifyTest extends TestCase
         $iconify->fetchIcon('bi', 'heart');
     }
 
-    public function testFetchIcons(): void
-    {
-        $iconify = new Iconify(
-            cache: new NullAdapter(),
-            endpoint: 'https://example.com',
-            http: new MockHttpClient([
-                new JsonMockResponse([
-                    'bi' => [],
-                ]),
-                new JsonMockResponse([
-                    'icons' => [
-                        'heart' => [
-                            'body' => '<path d="M0 0h24v24H0z" fill="none"/>',
-                            'height' => 17,
-                        ],
-                        'bar' => [
-                            'body' => '<path d="M0 0h24v24H0z" fill="none"/>',
-                            'height' => 17,
-                        ],
-                    ],
-                ]),
-            ]),
-        );
-
-        $icons = $iconify->fetchIcons('bi', ['heart', 'bar']);
-
-        $this->assertCount(2, $icons);
-        $this->assertSame(['heart', 'bar'], array_keys($icons));
-        $this->assertContainsOnlyInstancesOf(Icon::class, $icons);
-    }
-
-    public function testFetchIconsThrowsWithInvalidIconNames(): void
-    {
-        $iconify = new Iconify(
-            cache: new NullAdapter(),
-            endpoint: 'https://example.com',
-            http: new MockHttpClient([
-                new JsonMockResponse([
-                    'bi' => [],
-                ]),
-            ]),
-        );
-
-        $this->expectException(\InvalidArgumentException::class);
-
-        $iconify->fetchIcons('bi', ['à', 'foo']);
-    }
-
-    public function testFetchIconsThrowsWithTooManyIcons(): void
-    {
-        $iconify = new Iconify(
-            cache: new NullAdapter(),
-            endpoint: 'https://example.com',
-            http: new MockHttpClient([
-                new JsonMockResponse([
-                    'bi' => [],
-                ]),
-            ]),
-        );
-
-        $this->expectException(\InvalidArgumentException::class);
-
-        $iconify->fetchIcons('bi', array_fill(0, 50, '1234567890'));
-    }
-
     public function testGetMetadata(): void
     {
         $responseFile = __DIR__.'/../Fixtures/Iconify/collections.json';
@@ -238,85 +172,6 @@ class IconifyTest extends TestCase
         $this->assertSame('Font Awesome Solid', $metadata['name']);
     }
 
-    /**
-     * @dataProvider provideChunkCases
-     */
-    public function testChunk(int $maxQueryLength, string $prefix, array $names, array $chunks): void
-    {
-        $iconify = new Iconify(
-            new NullAdapter(),
-            'https://example.com',
-            new MockHttpClient([]),
-            $maxQueryLength,
-        );
-
-        $this->assertSame($chunks, iterator_to_array($iconify->chunk($prefix, $names)));
-    }
-
-    public static function provideChunkCases(): iterable
-    {
-        yield 'no icon should make no chunk' => [
-            10,
-            'ppppp',
-            [],
-            [],
-        ];
-
-        yield 'one icon should make one chunk' => [
-            10,
-            'ppppp',
-            ['aaaa1'],
-            [['aaaa1']],
-        ];
-
-        yield 'two icons that should make two chunck' => [
-            10,
-            'ppppp',
-            ['aa1', 'aa2'],
-            [['aa1'], ['aa2']],
-        ];
-
-        yield 'three icons that should make two chunck' => [
-            15,
-            'ppppp',
-            ['aaa1', 'aaa2', 'aaa3'],
-            [['aaa1', 'aaa2'], ['aaa3']],
-        ];
-
-        yield 'four icons that should make two chunck' => [
-            15,
-            'ppppp',
-            ['aaaaaaaa1', 'a2', 'a3', 'a4'],
-            [['aaaaaaaa1'], ['a2', 'a3', 'a4']],
-        ];
-    }
-
-    public function testChunkThrowWithIconPrefixTooLong(): void
-    {
-        $iconify = new Iconify(new NullAdapter(), 'https://example.com', new MockHttpClient([]));
-
-        $prefix = str_pad('p', 101, 'p');
-        $name = 'icon';
-
-        $this->expectExceptionMessage(\sprintf('The icon prefix "%s" is too long.', $prefix));
-
-        // We need to iterate over the iterator to trigger the exception
-        $result = iterator_to_array($iconify->chunk($prefix, [$name]));
-    }
-
-    public function testChunkThrowWithIconNameTooLong(): void
-    {
-        $iconify = new Iconify(new NullAdapter(), 'https://example.com', new MockHttpClient([]));
-
-        $prefix = 'prefix';
-        $name = str_pad('n', 101, 'n');
-
-        $this->expectExceptionMessage(\sprintf('The icon name "%s" is too long.', $name));
-
-        // We need to iterate over the iterator to trigger the exception
-        $result = iterator_to_array($iconify->chunk($prefix, [$name]));
-    }
-
     private function createHttpClient(mixed $data, int $code = 200): MockHttpClient
     {
         $mockResponse = new JsonMockResponse($data, ['http_code' => $code]);
diff --git a/src/TwigComponent/tests/Integration/ComponentFactoryTest.php b/src/TwigComponent/tests/Integration/ComponentFactoryTest.php
index 72064f47..bf5dd886 100644
--- a/src/TwigComponent/tests/Integration/ComponentFactoryTest.php
+++ b/src/TwigComponent/tests/Integration/ComponentFactoryTest.php
@@ -87,7 +87,7 @@ final class ComponentFactoryTest extends KernelTestCase
     public function testExceptionThrownIfRequiredMountParameterIsMissingFromPassedData(): void
     {
         $this->expectException(\LogicException::class);
-        $this->expectExceptionMessage('Symfony\UX\TwigComponent\Tests\Fixtures\Component\ComponentC::mount() has a required $propA parameter. Make sure this is passed or make give a default value.');
+        $this->expectExceptionMessage('Symfony\UX\TwigComponent\Tests\Fixtures\Component\ComponentC::mount() has a required $propA parameter. Make sure to pass it or give it a default value.');
 
         $this->createComponent('component_c');
     }