Repository: symfony/ux
Pull request #2792 (2025-05-29 09:54:22)

[Map] Add option to configure attribution and zoom control
| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes <!-- please update src/**/CHANGELOG.md files -->
| Docs?         | yes <!-- required for new features -->
| Issues        | Fix #... <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead -->
| License       | MIT

<!--
Replace this notice by a description of your feature/bugfix.
This will help reviewers and should be a good start for the documentation.

Additionally (see https://symfony.com/releases):
 - Always add tests and ensure they pass.
 - For new features, provide some code snippets to help understand usage.
 - Features and deprecations must be submitted against branch main.
 - Update/add documentation as required (we can help!)
 - Changelog entry should follow https://symfony.com/doc/current/contributing/code/conventions.html#writing-a-changelog-entry
 - Never break backward compatibility (see https://symfony.com/bc).
-->

Add option to configure attribution and zoom control for leaflet

github-actions[bot]: <h1>📊 Packages dist files size difference</h1>

Thanks for the PR! Here is the difference in size of the packages dist files between the base branch and the PR.
Please review the changes and make sure they are expected.

<table>
    <thead><tr><th>File</th><th>Before (Size / Gzip)</th><th>After (Size / Gzip)</th></tr></thead>
    <tbody><tr><td colspan="3"><a href="https://github.com/insiders/ux/tree/leaflet-options/src/Map/src/Bridge/Leaflet/assets/dist"><b>Map (Bridge Leaflet)</b></a></td></tr><tr>
                <td><a href="https://github.com/insiders/ux/blob/leaflet-options/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.d.ts"><code>map_controller.d.ts</code></a></td>
            <td>
                    <code>2.04 kB</code>
                    / <code>672 B</code> 
                </td><td><em>Removed</em></td></tr><tr>
                <td><a href="https://github.com/insiders/ux/blob/leaflet-options/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js"><code>map_controller.js</code></a></td>
            <td>
                    <code>9.71 kB</code>
                    / <code>2.59 kB</code> 
                </td><td><em>Removed</em></td></tr></tbody>
</table>

<!-- Sticky Pull Request Comment -->
Kocal: This week-end :) 

Patch:
diff --git a/src/Map/src/Bridge/Leaflet/CHANGELOG.md b/src/Map/src/Bridge/Leaflet/CHANGELOG.md
index 62c9e93e..a9e17804 100644
--- a/src/Map/src/Bridge/Leaflet/CHANGELOG.md
+++ b/src/Map/src/Bridge/Leaflet/CHANGELOG.md
@@ -1,5 +1,12 @@
 # CHANGELOG
 
+## 2.27
+
+-  Add `attributionControl` and `attributionControlOptions` to `LeafletOptions`,
+   to configure [attribution control](https://leafletjs.com/reference.html#map-attributioncontrol) and its options
+-  Add `zoomControl` and `zoomControlOptions` to `LeafletOptions`,
+   to configure [zoom control](https://leafletjs.com/reference.html#map-zoomcontrol) and its options
+
 ## 2.26
 
 -  Using `new LeafletOptions(tileLayer: false)` will now disable the default `TileLayer`.
diff --git a/src/Map/src/Bridge/Leaflet/README.md b/src/Map/src/Bridge/Leaflet/README.md
index a6d0501e..e6e17320 100644
--- a/src/Map/src/Bridge/Leaflet/README.md
+++ b/src/Map/src/Bridge/Leaflet/README.md
@@ -33,7 +33,10 @@ You can use the `LeafletOptions` class to configure your `Map`::
 
 ```php
 use Symfony\UX\Map\Bridge\Leaflet\LeafletOptions;
+use Symfony\UX\Map\Bridge\Leaflet\Option\AttributionControlOptions;
+use Symfony\UX\Map\Bridge\Leaflet\Option\ControlPosition;
 use Symfony\UX\Map\Bridge\Leaflet\Option\TileLayer;
+use Symfony\UX\Map\Bridge\Leaflet\Option\ZoomControlOptions;
 use Symfony\UX\Map\Point;
 use Symfony\UX\Map\Map;
 
@@ -50,6 +53,10 @@ $leafletOptions = (new LeafletOptions())
             'maxZoom' => 10,
         ]
     ))
+    ->attributionControl(false)
+    ->attributionControlOptions(new AttributionControlOptions(ControlPosition::BOTTOM_LEFT))
+    ->zoomControl(false)
+    ->zoomControlOptions(new ZoomControlOptions(ControlPosition::TOP_LEFT))
 ;
 
 // Add the custom options to the map
diff --git a/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.d.ts b/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.d.ts
index f0d9085f..c7c80e91 100644
--- a/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.d.ts
+++ b/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.d.ts
@@ -2,8 +2,19 @@ import AbstractMapController from '@symfony/ux-map';
 import type { Icon, InfoWindowWithoutPositionDefinition, MarkerDefinition, Point, PolygonDefinition, PolylineDefinition } from '@symfony/ux-map';
 import 'leaflet/dist/leaflet.min.css';
 import * as L from 'leaflet';
-import type { MapOptions as LeafletMapOptions, MarkerOptions, PolylineOptions as PolygonOptions, PolylineOptions, PopupOptions } from 'leaflet';
-type MapOptions = Pick<LeafletMapOptions, 'center' | 'zoom'> & {
+import type { ControlPosition, MapOptions as LeafletMapOptions, MarkerOptions, PolylineOptions as PolygonOptions, PolylineOptions, PopupOptions } from 'leaflet';
+type MapOptions = Pick<LeafletMapOptions, 'center' | 'zoom' | 'attributionControl' | 'zoomControl'> & {
+    attributionControlOptions?: {
+        position: ControlPosition;
+        prefix: string | false;
+    };
+    zoomControlOptions?: {
+        position: ControlPosition;
+        zoomInText: string;
+        zoomInTitle: string;
+        zoomOutText: string;
+        zoomOutTitle: string;
+    };
     tileLayer: {
         url: string;
         attribution: string;
diff --git a/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js b/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js
index 5529e713..747d858e 100644
--- a/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js
+++ b/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js
@@ -144,6 +144,8 @@ class map_controller extends default_1 {
             ...options,
             center: center === null ? undefined : center,
             zoom: zoom === null ? undefined : zoom,
+            attributionControl: false,
+            zoomControl: false,
         });
         if (options.tileLayer) {
             L.tileLayer(options.tileLayer.url, {
@@ -151,6 +153,12 @@ class map_controller extends default_1 {
                 ...options.tileLayer.options,
             }).addTo(map);
         }
+        if (typeof options.attributionControlOptions !== 'undefined') {
+            L.control.attribution({ ...options.attributionControlOptions }).addTo(map);
+        }
+        if (typeof options.zoomControlOptions !== 'undefined') {
+            L.control.zoom({ ...options.zoomControlOptions }).addTo(map);
+        }
         return map;
     }
     doCreateMarker({ definition }) {
diff --git a/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts b/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts
index dbc733b9..21845d0f 100644
--- a/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts
+++ b/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts
@@ -10,6 +10,7 @@ import type {
 import 'leaflet/dist/leaflet.min.css';
 import * as L from 'leaflet';
 import type {
+    ControlPosition,
     LatLngBoundsExpression,
     MapOptions as LeafletMapOptions,
     MarkerOptions,
@@ -18,7 +19,15 @@ import type {
     PopupOptions,
 } from 'leaflet';
 
-type MapOptions = Pick<LeafletMapOptions, 'center' | 'zoom'> & {
+type MapOptions = Pick<LeafletMapOptions, 'center' | 'zoom' | 'attributionControl' | 'zoomControl'> & {
+    attributionControlOptions?: { position: ControlPosition; prefix: string | false };
+    zoomControlOptions?: {
+        position: ControlPosition;
+        zoomInText: string;
+        zoomInTitle: string;
+        zoomOutText: string;
+        zoomOutTitle: string;
+    };
     tileLayer: { url: string; attribution: string; options: Record<string, unknown> } | false;
 };
 
@@ -79,6 +88,8 @@ export default class extends AbstractMapController<
             ...options,
             center: center === null ? undefined : center,
             zoom: zoom === null ? undefined : zoom,
+            attributionControl: false,
+            zoomControl: false,
         });
 
         if (options.tileLayer) {
@@ -88,6 +99,14 @@ export default class extends AbstractMapController<
             }).addTo(map);
         }
 
+        if (typeof options.attributionControlOptions !== 'undefined') {
+            L.control.attribution({ ...options.attributionControlOptions }).addTo(map);
+        }
+
+        if (typeof options.zoomControlOptions !== 'undefined') {
+            L.control.zoom({ ...options.zoomControlOptions }).addTo(map);
+        }
+
         return map;
     }
 
diff --git a/src/Map/src/Bridge/Leaflet/src/LeafletOptions.php b/src/Map/src/Bridge/Leaflet/src/LeafletOptions.php
index 4edcdca2..2b55d8e5 100644
--- a/src/Map/src/Bridge/Leaflet/src/LeafletOptions.php
+++ b/src/Map/src/Bridge/Leaflet/src/LeafletOptions.php
@@ -11,7 +11,9 @@
 
 namespace Symfony\UX\Map\Bridge\Leaflet;
 
+use Symfony\UX\Map\Bridge\Leaflet\Option\AttributionControlOptions;
 use Symfony\UX\Map\Bridge\Leaflet\Option\TileLayer;
+use Symfony\UX\Map\Bridge\Leaflet\Option\ZoomControlOptions;
 use Symfony\UX\Map\MapOptionsInterface;
 
 /**
@@ -24,6 +26,10 @@ final class LeafletOptions implements MapOptionsInterface
             url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
             attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',
         ),
+        private bool $attributionControl = true,
+        private AttributionControlOptions $attributionControlOptions = new AttributionControlOptions(),
+        private bool $zoomControl = true,
+        private ZoomControlOptions $zoomControlOptions = new ZoomControlOptions(),
     ) {
     }
 
@@ -34,14 +40,58 @@ final class LeafletOptions implements MapOptionsInterface
         return $this;
     }
 
+    public function attributionControl(bool $enable = true): self
+    {
+        $this->attributionControl = $enable;
+
+        return $this;
+    }
+
+    public function attributionControlOptions(AttributionControlOptions $attributionControlOptions): self
+    {
+        $this->attributionControl = true;
+        $this->attributionControlOptions = $attributionControlOptions;
+
+        return $this;
+    }
+
+    public function zoomControl(bool $enable = true): self
+    {
+        $this->zoomControl = $enable;
+
+        return $this;
+    }
+
+    public function zoomControlOptions(ZoomControlOptions $zoomControlOptions): self
+    {
+        $this->zoomControl = true;
+        $this->zoomControlOptions = $zoomControlOptions;
+
+        return $this;
+    }
+
     /**
      * @internal
      */
     public static function fromArray(array $array): MapOptionsInterface
     {
-        return new self(
-            tileLayer: $array['tileLayer'] ? TileLayer::fromArray($array['tileLayer']) : false,
-        );
+        $array += ['attributionControl' => false, 'zoomControl' => false, 'tileLayer' => false];
+
+        if ($array['tileLayer']) {
+            $array['tileLayer'] = TileLayer::fromArray($array['tileLayer']);
+        }
+
+        if (isset($array['attributionControlOptions'])) {
+            $array['attributionControl'] = true;
+            $array['attributionControlOptions'] = AttributionControlOptions::fromArray($array['attributionControlOptions']);
+        }
+
+        if (isset($array['zoomControlOptions'])) {
+            $array['zoomControl'] = true;
+            $array['zoomControlOptions'] = ZoomControlOptions::fromArray($array['zoomControlOptions']);
+        }
+
+        return new self(...$array);
     }
 
     /**
@@ -49,8 +99,18 @@ final class LeafletOptions implements MapOptionsInterface
      */
     public function toArray(): array
     {
-        return [
+        $array = [
             'tileLayer' => $this->tileLayer ? $this->tileLayer->toArray() : false,
         ];
+
+        if ($this->attributionControl) {
+            $array['attributionControlOptions'] = $this->attributionControlOptions->toArray();
+        }
+
+        if ($this->zoomControl) {
+            $array['zoomControlOptions'] = $this->zoomControlOptions->toArray();
+        }
+
+        return $array;
     }
 }
diff --git a/src/Map/src/Bridge/Leaflet/src/Option/AttributionControlOptions.php b/src/Map/src/Bridge/Leaflet/src/Option/AttributionControlOptions.php
new file mode 100644
index 00000000..6c594727
--- /dev/null
+++ b/src/Map/src/Bridge/Leaflet/src/Option/AttributionControlOptions.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\UX\Map\Bridge\Leaflet\Option;
+
+/**
+ * Options for the rendering of the attribution control.
+ *
+ * @see https://leafletjs.com/reference.html#control-zoom
+ */
+final class AttributionControlOptions
+{
+    public function __construct(
+        private readonly ControlPosition $position = ControlPosition::BOTTOM_RIGHT,
+        private readonly string|false $prefix = 'Leaflet',
+    ) {
+    }
+
+    /**
+     * @internal
+     */
+    public static function fromArray(array $array): self
+    {
+        return new self(
+            position: ControlPosition::from($array['position']),
+            prefix: $array['prefix'],
+        );
+    }
+
+    /**
+     * @internal
+     */
+    public function toArray(): array
+    {
+        return [
+            'position' => $this->position->value,
+            'prefix' => $this->prefix,
+        ];
+    }
+}
diff --git a/src/Map/src/Bridge/Leaflet/src/Option/ControlPosition.php b/src/Map/src/Bridge/Leaflet/src/Option/ControlPosition.php
new file mode 100644
index 00000000..ae9ecda2
--- /dev/null
+++ b/src/Map/src/Bridge/Leaflet/src/Option/ControlPosition.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\UX\Map\Bridge\Leaflet\Option;
+
+/**
+ * @see https://leafletjs.com/reference.html#control-position
+ */
+enum ControlPosition: string
+{
+    case TOP_LEFT = 'topleft';
+    case TOP_RIGHT = 'topright';
+    case BOTTOM_LEFT = 'bottomleft';
+    case BOTTOM_RIGHT = 'bottomright';
+}
diff --git a/src/Map/src/Bridge/Leaflet/src/Option/ZoomControlOptions.php b/src/Map/src/Bridge/Leaflet/src/Option/ZoomControlOptions.php
new file mode 100644
index 00000000..f2f916f8
--- /dev/null
+++ b/src/Map/src/Bridge/Leaflet/src/Option/ZoomControlOptions.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\UX\Map\Bridge\Leaflet\Option;
+
+/**
+ * Options for the rendering of the zoom control.
+ *
+ * @see https://leafletjs.com/reference.html#control-zoom
+ */
+final class ZoomControlOptions
+{
+    public function __construct(
+        private readonly ControlPosition $position = ControlPosition::TOP_LEFT,
+        private readonly string $zoomInText = '<span aria-hidden="true">+</span>',
+        private readonly string $zoomInTitle = 'Zoom in',
+        private readonly string $zoomOutText = '<span aria-hidden="true">&#x2212;</span>',
+        private readonly string $zoomOutTitle = 'Zoom out',
+    ) {
+    }
+
+    /**
+     * @internal
+     */
+    public static function fromArray(array $array): self
+    {
+        if (isset($array['position'])) {
+            $array['position'] = ControlPosition::from($array['position']);
+        }
+
+        return new self(...$array);
+    }
+
+    /**
+     * @internal
+     */
+    public function toArray(): array
+    {
+        return [
+            'position' => $this->position->value,
+            'zoomInText' => $this->zoomInText,
+            'zoomInTitle' => $this->zoomInTitle,
+            'zoomOutText' => $this->zoomOutText,
+            'zoomOutTitle' => $this->zoomOutTitle,
+        ];
+    }
+}


Test patch:
diff --git a/src/Map/src/Bridge/Leaflet/tests/LeafletOptionsTest.php b/src/Map/src/Bridge/Leaflet/tests/LeafletOptionsTest.php
index 55591336..14a5822f 100644
--- a/src/Map/src/Bridge/Leaflet/tests/LeafletOptionsTest.php
+++ b/src/Map/src/Bridge/Leaflet/tests/LeafletOptionsTest.php
@@ -27,6 +27,17 @@ class LeafletOptionsTest extends TestCase
                 'attribution' => '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',
                 'options' => [],
             ],
+            'attributionControlOptions' => [
+                'position' => 'bottomright',
+                'prefix' => 'Leaflet',
+            ],
+            'zoomControlOptions' => [
+                'position' => 'topleft',
+                'zoomInText' => '<span aria-hidden="true">+</span>',
+                'zoomInTitle' => 'Zoom in',
+                'zoomOutText' => '<span aria-hidden="true">&#x2212;</span>',
+                'zoomOutTitle' => 'Zoom out',
+            ],
         ], $leafletOptions->toArray());
 
         self::assertEquals($leafletOptions, LeafletOptions::fromArray($leafletOptions->toArray()));
@@ -58,6 +69,17 @@ class LeafletOptionsTest extends TestCase
                     'zoomOffset' => 0,
                 ],
             ],
+            'attributionControlOptions' => [
+                'position' => 'bottomright',
+                'prefix' => 'Leaflet',
+            ],
+            'zoomControlOptions' => [
+                'position' => 'topleft',
+                'zoomInText' => '<span aria-hidden="true">+</span>',
+                'zoomInTitle' => 'Zoom in',
+                'zoomOutText' => '<span aria-hidden="true">&#x2212;</span>',
+                'zoomOutTitle' => 'Zoom out',
+            ],
         ], $leafletOptions->toArray());
 
         self::assertEquals($leafletOptions, LeafletOptions::fromArray($leafletOptions->toArray()));
@@ -69,6 +91,35 @@ class LeafletOptionsTest extends TestCase
 
         self::assertSame([
             'tileLayer' => false,
+            'attributionControlOptions' => [
+                'position' => 'bottomright',
+                'prefix' => 'Leaflet',
+            ],
+            'zoomControlOptions' => [
+                'position' => 'topleft',
+                'zoomInText' => '<span aria-hidden="true">+</span>',
+                'zoomInTitle' => 'Zoom in',
+                'zoomOutText' => '<span aria-hidden="true">&#x2212;</span>',
+                'zoomOutTitle' => 'Zoom out',
+            ],
+        ], $leafletOptions->toArray());
+
+        self::assertEquals($leafletOptions, LeafletOptions::fromArray($leafletOptions->toArray()));
+    }
+
+    public function testWithoutControls(): void
+    {
+        $leafletOptions = new LeafletOptions(
+            attributionControl: false,
+            zoomControl: false,
+        );
+
+        self::assertSame([
+            'tileLayer' => [
+                'url' => 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
+                'attribution' => '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',
+                'options' => [],
+            ],
         ], $leafletOptions->toArray());
 
         self::assertEquals($leafletOptions, LeafletOptions::fromArray($leafletOptions->toArray()));
diff --git a/src/Map/src/Bridge/Leaflet/tests/Option/AttributionControlOptionsTest.php b/src/Map/src/Bridge/Leaflet/tests/Option/AttributionControlOptionsTest.php
new file mode 100644
index 00000000..05b914de
--- /dev/null
+++ b/src/Map/src/Bridge/Leaflet/tests/Option/AttributionControlOptionsTest.php
@@ -0,0 +1,42 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\UX\Map\Bridge\Leaflet\Tests\Option;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\UX\Map\Bridge\Leaflet\Option\AttributionControlOptions;
+use Symfony\UX\Map\Bridge\Leaflet\Option\ControlPosition;
+
+class AttributionControlOptionsTest extends TestCase
+{
+    public function testToArray(): void
+    {
+        $options = new AttributionControlOptions();
+
+        self::assertSame([
+            'position' => ControlPosition::BOTTOM_RIGHT->value,
+            'prefix' => 'Leaflet',
+        ], $options->toArray());
+    }
+
+    public function testToArrayWithDifferentConfiguration(): void
+    {
+        $options = new AttributionControlOptions(
+            position: ControlPosition::BOTTOM_LEFT,
+            prefix: 'Leaflet prefix',
+        );
+
+        self::assertSame([
+            'position' => ControlPosition::BOTTOM_LEFT->value,
+            'prefix' => 'Leaflet prefix',
+        ], $options->toArray());
+    }
+}
diff --git a/src/Map/src/Bridge/Leaflet/tests/Option/ZoomControlOptionsTest.php b/src/Map/src/Bridge/Leaflet/tests/Option/ZoomControlOptionsTest.php
new file mode 100644
index 00000000..e21ac360
--- /dev/null
+++ b/src/Map/src/Bridge/Leaflet/tests/Option/ZoomControlOptionsTest.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\UX\Map\Bridge\Leaflet\Tests\Option;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\UX\Map\Bridge\Leaflet\Option\ControlPosition;
+use Symfony\UX\Map\Bridge\Leaflet\Option\ZoomControlOptions;
+
+class ZoomControlOptionsTest extends TestCase
+{
+    public function testToArray(): void
+    {
+        $options = new ZoomControlOptions(
+            position: ControlPosition::TOP_LEFT,
+        );
+
+        self::assertSame([
+            'position' => ControlPosition::TOP_LEFT->value,
+            'zoomInText' => '<span aria-hidden="true">+</span>',
+            'zoomInTitle' => 'Zoom in',
+            'zoomOutText' => '<span aria-hidden="true">&#x2212;</span>',
+            'zoomOutTitle' => 'Zoom out',
+        ], $options->toArray());
+    }
+}
diff --git a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set markers with icons__1.txt b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set markers with icons__1.txt
index 4aa53a32..a30fe285 100644
--- a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set markers with icons__1.txt
+++ b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set markers with icons__1.txt
@@ -6,7 +6,7 @@
   data-symfony--ux-leaflet-map--map-center-value="{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522}"
   data-symfony--ux-leaflet-map--map-zoom-value="12"
   data-symfony--ux-leaflet-map--map-fit-bounds-to-markers-value="false"
-  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;@provider&quot;:&quot;leaflet&quot;}"
+  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;attributionControlOptions&quot;:{&quot;position&quot;:&quot;bottomright&quot;,&quot;prefix&quot;:&quot;Leaflet&quot;},&quot;zoomControlOptions&quot;:{&quot;position&quot;:&quot;topleft&quot;,&quot;zoomInText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;+&lt;\/span&gt;&quot;,&quot;zoomInTitle&quot;:&quot;Zoom in&quot;,&quot;zoomOutText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;&amp;#x2212;&lt;\/span&gt;&quot;,&quot;zoomOutTitle&quot;:&quot;Zoom out&quot;},&quot;@provider&quot;:&quot;leaflet&quot;}"
   data-symfony--ux-leaflet-map--map-markers-value="[{&quot;position&quot;:{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522},&quot;title&quot;:&quot;Paris&quot;,&quot;infoWindow&quot;:null,&quot;icon&quot;:{&quot;type&quot;:&quot;url&quot;,&quot;width&quot;:32,&quot;height&quot;:32,&quot;url&quot;:&quot;https:\/\/cdn.jsdelivr.net\/npm\/bootstrap-icons@1.11.3\/icons\/geo-alt.svg&quot;},&quot;extra&quot;:[],&quot;id&quot;:null,&quot;@id&quot;:&quot;217fa57668ad8e64&quot;},{&quot;position&quot;:{&quot;lat&quot;:45.764,&quot;lng&quot;:4.8357},&quot;title&quot;:&quot;Lyon&quot;,&quot;infoWindow&quot;:null,&quot;icon&quot;:{&quot;type&quot;:&quot;ux-icon&quot;,&quot;width&quot;:32,&quot;height&quot;:32,&quot;name&quot;:&quot;fa:map-marker&quot;,&quot;_generated_html&quot;:&quot;&lt;svg xmlns=\&quot;http:\/\/www.w3.org\/2000\/svg\&quot; width=\&quot;24\&quot; height=\&quot;24\&quot;&gt;...&lt;\/svg&gt;&quot;},&quot;extra&quot;:[],&quot;id&quot;:null,&quot;@id&quot;:&quot;255b208136900fc0&quot;},{&quot;position&quot;:{&quot;lat&quot;:45.8566,&quot;lng&quot;:2.3522},&quot;title&quot;:&quot;Dijon&quot;,&quot;infoWindow&quot;:null,&quot;icon&quot;:{&quot;type&quot;:&quot;svg&quot;,&quot;width&quot;:24,&quot;height&quot;:24,&quot;html&quot;:&quot;&lt;svg xmlns=\&quot;http:\/\/www.w3.org\/2000\/svg\&quot; width=\&quot;24\&quot; height=\&quot;24\&quot;&gt;...&lt;\/svg&gt;&quot;},&quot;extra&quot;:[],&quot;id&quot;:null,&quot;@id&quot;:&quot;1a410e92214f770c&quot;}]"
   data-symfony--ux-leaflet-map--map-polygons-value="[]"
   data-symfony--ux-leaflet-map--map-polylines-value="[]"
diff --git a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set simple map__1.txt b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set simple map__1.txt
index 2a39e666..0e99279f 100644
--- a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set simple map__1.txt
+++ b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set simple map__1.txt
@@ -6,7 +6,7 @@
   data-symfony--ux-leaflet-map--map-center-value="{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522}"
   data-symfony--ux-leaflet-map--map-zoom-value="12"
   data-symfony--ux-leaflet-map--map-fit-bounds-to-markers-value="false"
-  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;@provider&quot;:&quot;leaflet&quot;}"
+  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;attributionControlOptions&quot;:{&quot;position&quot;:&quot;bottomright&quot;,&quot;prefix&quot;:&quot;Leaflet&quot;},&quot;zoomControlOptions&quot;:{&quot;position&quot;:&quot;topleft&quot;,&quot;zoomInText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;+&lt;\/span&gt;&quot;,&quot;zoomInTitle&quot;:&quot;Zoom in&quot;,&quot;zoomOutText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;&amp;#x2212;&lt;\/span&gt;&quot;,&quot;zoomOutTitle&quot;:&quot;Zoom out&quot;},&quot;@provider&quot;:&quot;leaflet&quot;}"
   data-symfony--ux-leaflet-map--map-markers-value="[]"
   data-symfony--ux-leaflet-map--map-polygons-value="[]"
   data-symfony--ux-leaflet-map--map-polylines-value="[]"
diff --git a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with all markers removed__1.txt b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with all markers removed__1.txt
index 2a39e666..0e99279f 100644
--- a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with all markers removed__1.txt
+++ b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with all markers removed__1.txt
@@ -6,7 +6,7 @@
   data-symfony--ux-leaflet-map--map-center-value="{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522}"
   data-symfony--ux-leaflet-map--map-zoom-value="12"
   data-symfony--ux-leaflet-map--map-fit-bounds-to-markers-value="false"
-  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;@provider&quot;:&quot;leaflet&quot;}"
+  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;attributionControlOptions&quot;:{&quot;position&quot;:&quot;bottomright&quot;,&quot;prefix&quot;:&quot;Leaflet&quot;},&quot;zoomControlOptions&quot;:{&quot;position&quot;:&quot;topleft&quot;,&quot;zoomInText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;+&lt;\/span&gt;&quot;,&quot;zoomInTitle&quot;:&quot;Zoom in&quot;,&quot;zoomOutText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;&amp;#x2212;&lt;\/span&gt;&quot;,&quot;zoomOutTitle&quot;:&quot;Zoom out&quot;},&quot;@provider&quot;:&quot;leaflet&quot;}"
   data-symfony--ux-leaflet-map--map-markers-value="[]"
   data-symfony--ux-leaflet-map--map-polygons-value="[]"
   data-symfony--ux-leaflet-map--map-polylines-value="[]"
diff --git a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with custom attributes__1.txt b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with custom attributes__1.txt
index 0c4ece6a..b4b78c96 100644
--- a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with custom attributes__1.txt
+++ b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with custom attributes__1.txt
@@ -6,7 +6,7 @@
   data-symfony--ux-leaflet-map--map-center-value="{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522}"
   data-symfony--ux-leaflet-map--map-zoom-value="12"
   data-symfony--ux-leaflet-map--map-fit-bounds-to-markers-value="false"
-  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;@provider&quot;:&quot;leaflet&quot;}"
+  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;attributionControlOptions&quot;:{&quot;position&quot;:&quot;bottomright&quot;,&quot;prefix&quot;:&quot;Leaflet&quot;},&quot;zoomControlOptions&quot;:{&quot;position&quot;:&quot;topleft&quot;,&quot;zoomInText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;+&lt;\/span&gt;&quot;,&quot;zoomInTitle&quot;:&quot;Zoom in&quot;,&quot;zoomOutText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;&amp;#x2212;&lt;\/span&gt;&quot;,&quot;zoomOutTitle&quot;:&quot;Zoom out&quot;},&quot;@provider&quot;:&quot;leaflet&quot;}"
   data-symfony--ux-leaflet-map--map-markers-value="[]"
   data-symfony--ux-leaflet-map--map-polygons-value="[]"
   data-symfony--ux-leaflet-map--map-polylines-value="[]"
diff --git a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with marker remove and new ones added__1.txt b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with marker remove and new ones added__1.txt
index 04afe48e..65e01c12 100644
--- a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with marker remove and new ones added__1.txt
+++ b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with marker remove and new ones added__1.txt
@@ -6,7 +6,7 @@
   data-symfony--ux-leaflet-map--map-center-value="{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522}"
   data-symfony--ux-leaflet-map--map-zoom-value="12"
   data-symfony--ux-leaflet-map--map-fit-bounds-to-markers-value="false"
-  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;@provider&quot;:&quot;leaflet&quot;}"
+  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;attributionControlOptions&quot;:{&quot;position&quot;:&quot;bottomright&quot;,&quot;prefix&quot;:&quot;Leaflet&quot;},&quot;zoomControlOptions&quot;:{&quot;position&quot;:&quot;topleft&quot;,&quot;zoomInText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;+&lt;\/span&gt;&quot;,&quot;zoomInTitle&quot;:&quot;Zoom in&quot;,&quot;zoomOutText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;&amp;#x2212;&lt;\/span&gt;&quot;,&quot;zoomOutTitle&quot;:&quot;Zoom out&quot;},&quot;@provider&quot;:&quot;leaflet&quot;}"
   data-symfony--ux-leaflet-map--map-markers-value="[{&quot;position&quot;:{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522},&quot;title&quot;:&quot;Paris&quot;,&quot;infoWindow&quot;:null,&quot;icon&quot;:null,&quot;extra&quot;:[],&quot;id&quot;:&quot;marker1&quot;,&quot;@id&quot;:&quot;872feba9ebf3905d&quot;},{&quot;position&quot;:{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522},&quot;title&quot;:&quot;Lyon&quot;,&quot;infoWindow&quot;:{&quot;headerContent&quot;:null,&quot;content&quot;:&quot;Lyon&quot;,&quot;position&quot;:null,&quot;opened&quot;:false,&quot;autoClose&quot;:true,&quot;extra&quot;:[]},&quot;icon&quot;:null,&quot;extra&quot;:[],&quot;id&quot;:&quot;marker2&quot;,&quot;@id&quot;:&quot;6028bf5e41f644ab&quot;}]"
   data-symfony--ux-leaflet-map--map-polygons-value="[]"
   data-symfony--ux-leaflet-map--map-polylines-value="[]"
diff --git a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with markers and infoWindows__1.txt b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with markers and infoWindows__1.txt
index 64f60cc8..d8bc48d5 100644
--- a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with markers and infoWindows__1.txt
+++ b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with markers and infoWindows__1.txt
@@ -6,7 +6,7 @@
   data-symfony--ux-leaflet-map--map-center-value="{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522}"
   data-symfony--ux-leaflet-map--map-zoom-value="12"
   data-symfony--ux-leaflet-map--map-fit-bounds-to-markers-value="false"
-  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;@provider&quot;:&quot;leaflet&quot;}"
+  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;attributionControlOptions&quot;:{&quot;position&quot;:&quot;bottomright&quot;,&quot;prefix&quot;:&quot;Leaflet&quot;},&quot;zoomControlOptions&quot;:{&quot;position&quot;:&quot;topleft&quot;,&quot;zoomInText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;+&lt;\/span&gt;&quot;,&quot;zoomInTitle&quot;:&quot;Zoom in&quot;,&quot;zoomOutText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;&amp;#x2212;&lt;\/span&gt;&quot;,&quot;zoomOutTitle&quot;:&quot;Zoom out&quot;},&quot;@provider&quot;:&quot;leaflet&quot;}"
   data-symfony--ux-leaflet-map--map-markers-value="[{&quot;position&quot;:{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522},&quot;title&quot;:&quot;Paris&quot;,&quot;infoWindow&quot;:null,&quot;icon&quot;:null,&quot;extra&quot;:[],&quot;id&quot;:&quot;marker1&quot;,&quot;@id&quot;:&quot;872feba9ebf3905d&quot;},{&quot;position&quot;:{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522},&quot;title&quot;:&quot;Lyon&quot;,&quot;infoWindow&quot;:{&quot;headerContent&quot;:null,&quot;content&quot;:&quot;Lyon&quot;,&quot;position&quot;:null,&quot;opened&quot;:false,&quot;autoClose&quot;:true,&quot;extra&quot;:[]},&quot;icon&quot;:null,&quot;extra&quot;:[],&quot;id&quot;:null,&quot;@id&quot;:&quot;bce206d73dc5c164&quot;}]"
   data-symfony--ux-leaflet-map--map-polygons-value="[]"
   data-symfony--ux-leaflet-map--map-polylines-value="[]"
diff --git a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with polygons and infoWindows__1.txt b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with polygons and infoWindows__1.txt
index e5439223..7b6ae68b 100644
--- a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with polygons and infoWindows__1.txt
+++ b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with polygons and infoWindows__1.txt
@@ -6,7 +6,7 @@
   data-symfony--ux-leaflet-map--map-center-value="{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522}"
   data-symfony--ux-leaflet-map--map-zoom-value="12"
   data-symfony--ux-leaflet-map--map-fit-bounds-to-markers-value="false"
-  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;@provider&quot;:&quot;leaflet&quot;}"
+  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;attributionControlOptions&quot;:{&quot;position&quot;:&quot;bottomright&quot;,&quot;prefix&quot;:&quot;Leaflet&quot;},&quot;zoomControlOptions&quot;:{&quot;position&quot;:&quot;topleft&quot;,&quot;zoomInText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;+&lt;\/span&gt;&quot;,&quot;zoomInTitle&quot;:&quot;Zoom in&quot;,&quot;zoomOutText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;&amp;#x2212;&lt;\/span&gt;&quot;,&quot;zoomOutTitle&quot;:&quot;Zoom out&quot;},&quot;@provider&quot;:&quot;leaflet&quot;}"
   data-symfony--ux-leaflet-map--map-markers-value="[]"
   data-symfony--ux-leaflet-map--map-polygons-value="[{&quot;points&quot;:[{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522},{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522},{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522}],&quot;title&quot;:null,&quot;infoWindow&quot;:null,&quot;extra&quot;:[],&quot;id&quot;:&quot;polygon1&quot;,&quot;@id&quot;:&quot;35bfa920335b849d&quot;},{&quot;points&quot;:[{&quot;lat&quot;:1.1,&quot;lng&quot;:2.2},{&quot;lat&quot;:3.3,&quot;lng&quot;:4.4},{&quot;lat&quot;:5.5,&quot;lng&quot;:6.6}],&quot;title&quot;:null,&quot;infoWindow&quot;:{&quot;headerContent&quot;:null,&quot;content&quot;:&quot;Polygon&quot;,&quot;position&quot;:null,&quot;opened&quot;:false,&quot;autoClose&quot;:true,&quot;extra&quot;:[]},&quot;extra&quot;:[],&quot;id&quot;:&quot;polygon2&quot;,&quot;@id&quot;:&quot;7be1fe9f10489d73&quot;}]"
   data-symfony--ux-leaflet-map--map-polylines-value="[]"
diff --git a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with polylines and infoWindows__1.txt b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with polylines and infoWindows__1.txt
index be6a8953..eebd0579 100644
--- a/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with polylines and infoWindows__1.txt
+++ b/src/Map/src/Bridge/Leaflet/tests/__snapshots__/LeafletRendererTest__testRenderMap with data set with polylines and infoWindows__1.txt
@@ -6,7 +6,7 @@
   data-symfony--ux-leaflet-map--map-center-value="{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522}"
   data-symfony--ux-leaflet-map--map-zoom-value="12"
   data-symfony--ux-leaflet-map--map-fit-bounds-to-markers-value="false"
-  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;@provider&quot;:&quot;leaflet&quot;}"
+  data-symfony--ux-leaflet-map--map-options-value="{&quot;tileLayer&quot;:{&quot;url&quot;:&quot;https:\/\/tile.openstreetmap.org\/{z}\/{x}\/{y}.png&quot;,&quot;attribution&quot;:&quot;\u00a9 &lt;a href=\&quot;https:\/\/www.openstreetmap.org\/copyright\&quot;&gt;OpenStreetMap&lt;\/a&gt;&quot;,&quot;options&quot;:[]},&quot;attributionControlOptions&quot;:{&quot;position&quot;:&quot;bottomright&quot;,&quot;prefix&quot;:&quot;Leaflet&quot;},&quot;zoomControlOptions&quot;:{&quot;position&quot;:&quot;topleft&quot;,&quot;zoomInText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;+&lt;\/span&gt;&quot;,&quot;zoomInTitle&quot;:&quot;Zoom in&quot;,&quot;zoomOutText&quot;:&quot;&lt;span aria-hidden=\&quot;true\&quot;&gt;&amp;#x2212;&lt;\/span&gt;&quot;,&quot;zoomOutTitle&quot;:&quot;Zoom out&quot;},&quot;@provider&quot;:&quot;leaflet&quot;}"
   data-symfony--ux-leaflet-map--map-markers-value="[]"
   data-symfony--ux-leaflet-map--map-polygons-value="[]"
   data-symfony--ux-leaflet-map--map-polylines-value="[{&quot;points&quot;:[{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522},{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522},{&quot;lat&quot;:48.8566,&quot;lng&quot;:2.3522}],&quot;title&quot;:null,&quot;infoWindow&quot;:null,&quot;extra&quot;:[],&quot;id&quot;:&quot;polyline1&quot;,&quot;@id&quot;:&quot;823f6ee5acdb5db3&quot;},{&quot;points&quot;:[{&quot;lat&quot;:1.1,&quot;lng&quot;:2.2},{&quot;lat&quot;:3.3,&quot;lng&quot;:4.4},{&quot;lat&quot;:5.5,&quot;lng&quot;:6.6}],&quot;title&quot;:null,&quot;infoWindow&quot;:{&quot;headerContent&quot;:null,&quot;content&quot;:&quot;Polyline&quot;,&quot;position&quot;:null,&quot;opened&quot;:false,&quot;autoClose&quot;:true,&quot;extra&quot;:[]},&quot;extra&quot;:[],&quot;id&quot;:&quot;polyline2&quot;,&quot;@id&quot;:&quot;77fb0e390b5e91f1&quot;}]"