## \[NEW\] Release notes v158 ⚙️

### October 2026

### Improvements 💪

#### Safer Access to the Back Office 🔐

When accessing the Back Office through the usual public website entry point, you will now be automatically redirected to the dedicated **Content Editing URL**.

For example:

- **www.veolia.com/user** → dedicated Site Factory Content Editing URL
- **veolia.co.uk/user** → dedicated Site Factory Content Editing URL

**This redirection is expected and is the new secure way to access the Back Office.**

   ![htaccess access](/sites/g/files/dvc2391/files/styles/default/public/image/2026/10/Capture%20d%27%C3%A9cran%202026-10-23%20160317.png.webp?itok=NOT5khd2)   



**How to log in:**

1. Access the usual **/user** URL of your website.
2. You will automatically be redirected to the dedicated **Content Editing URL**.
3. A first authentication pop-up will appear. Enter the **.htaccess access information provided by the Site Factory team**.
4. Once this security step is completed, the regular Site Factory login page will appear.
5. Enter your **personal Back Office username and password** on this second login screen.

**Important:** The credentials requested in the first pop-up are **not your personal Site Factory login credentials**. This first authentication corresponds to the additional **.htaccess security layer**. Your personal credentials must only be entered on the Site Factory login page that appears afterwards.

**What this means for webmasters:** You can continue using the usual **/user** entry point of your website. The redirection to the dedicated Content Editing environment is automatic, but the login process now includes an additional security step before you reach the standard Back Office login page.

This change is part of the ongoing improvements to the Site Factory Content Editing environment and provides a more secure and consistent access experience across websites.

### Bug Fixes 🩹

#### Location Point Map Display Restored 📍

Resolved an issue where entering a valid address on a **Location** page did not always generate the corresponding geographic coordinates, preventing the location marker from appearing on the map.

New Location pages now automatically generate their coordinates when saved and display the corresponding map marker correctly.

   ![display of the location point](/sites/g/files/dvc2391/files/styles/default/public/image/2026/10/187e4799-5d57-423f-894a-c9d7c46901e3.png.webp?itok=lAKz8prq)   



**What this means for webmasters:** You can continue creating Location pages using the address as usual. If an older Location is still missing its map marker, open and save the Location again to regenerate its coordinates.

#### Webform Pop-up Display Restored 🪟

Corrected a display issue where some **webform pop-ups** appeared transparent, allowing the page content behind the form to remain visible.

Webform pop-ups now display with the correct background and remain clearly separated from the content behind them.

The fix also preserves the expected display and behaviour of **Collapsible Container** components.

   ![Webform Pop-up Display Restored](/sites/g/files/dvc2391/files/styles/default/public/image/2026/10/4c009ab3-27c1-4aeb-8133-57825c306db3.png.webp?itok=yrDN1WAf)   



#### Hero Carousel Translations Display Correctly 🌍

Corrected an issue where translated **Hero Carousels** could continue displaying the original-language image instead of the translated media.

Hero Carousels now display the correct translated content, including **images, titles and descriptions**, according to the language selected on the page.

   ![Hero carosel image translation](/sites/g/files/dvc2391/files/styles/default/public/image/2026/10/2d569d1c-17a7-43b0-bdd2-32651201b321.png.webp?itok=sC7eprKG)   



**What this means for webmasters:** Translated pages now consistently display the corresponding translated Hero Carousel content, while the original-language version remains unchanged.



 

 

 



 

 

 

 





 



 

  Show more  



 





## \[NEW\] Release notes v157 💻

### September 2026

### Improvements 💪

#### New Left Toolbar Positioning 🧭

The Back-Office navigation toolbar is now positioned on the **left side of the screen** instead of the top, optimizing screen real estate and improving quick access to administrative tools.

   ![New_Toolbar Display](/sites/g/files/dvc2391/files/styles/default/public/image/2026/09/image-20260910-113915.png.webp?itok=z4K8EVd0)   



**What this means for webmasters:** Provides a cleaner, wider editing canvas for complex components, making full-width previewing more accurate during content creation.

#### Webform Address Autocomplete 🏙️

Form fields configured with location or address fields now feature **real-time autocomplete suggestions** as users type.  
Only the following address fields should be made visible: **address, city, postal code and country.** Country should be a **Text field** and **not a select field**.

   ![Webform-Address_Autocomplete](/sites/g/files/dvc2391/files/styles/default/public/image/2026/09/Screenshot%202026-09-18%2016.33.38.png.webp?itok=NMLxFsmm)   



**How it works:** Entering an address prefix (e.g., typing *"auber..."*) dynamically presents a dropdown menu with the full string (e.g., *"Aubervilliers"*) for immediate selection.

**What this means for webmasters:** Reduces form drop-off rates and input errors on lead generation and contact forms.

### Bug Fixes 🩹

#### Location Point Map Display Restored 📍

Resolved a rendering error on location listing pages where map markers failed to align correctly with geographic coordinates.

#### **Container Title Rendering Fix 🗂️**

Corrected a display bug where titles assigned to generic container blocks were hidden in preview or front-end rendering.



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v156 💻

### August 2026

### Improvements 💪

#### A new access experience for content editing 🔐

You may notice a few changes when accessing the **Site Factory back office**. In particular, the URL may change during the access process and an additional pop-up may appear.

**This is expected and does not indicate an issue with the website or the back office.**

   ![a visualization of the new url changes ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/08/Screenshot%202026-08-28%2011.23.12.png.webp?itok=2GQSwG1q)   



   ![a new shield is added for protection ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/08/Screenshot%202026-08-28%2011.22.25.png.webp?itok=WYLL44w0)   



**What this means for webmasters**  
The visible change is mainly in the way you access the content-editing environment. We wanted to highlight it in advance so that the new URL and additional pop-up do not come as a surprise the next time you access the back office.

#### Decorative images are now easier to manage for accessibility ♿

Images can now be marked as **Decorative images** directly from the media settings.

When an image is marked as decorative, its alternative text is ignored on the front end so that assistive technologies such as screen readers can skip it. The **Alternative Text** field remains mandatory in the back office.

   ![Decorative images tickable button ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/08/decorative%20images.png.webp?itok=7qRgiKXM)   



**What this means for webmasters**  
You can now correctly distinguish informative images from purely decorative ones and improve the accessibility of your pages without having to use workarounds.

**How to use it**

1. Create or edit an **Image media**.
2. Complete the **Alternative Text** field as usual.
3. Enable **Decorative image** when the image does not provide meaningful information to visitors.
4. Save the media.

The image will then be treated as decorative on the front end.

#### Hero banners can now be hidden on listing pages 🖼️

A new **Hide hero banner** option is now available in the **Hero Banner** section of the Page content type.

When enabled, the default hero banner is hidden and the content below it moves directly below the breadcrumbs. The option is disabled by default, so existing pages continue to display their hero banner as usual.

The page title remains available in the page structure for SEO and accessibility purposes.

   ![tickable button to hide hero banner ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/08/Screenshot%202026-08-28%2009.57.05.png.webp?itok=yFoLXQOK)   



**What this means for webmasters**  
You now have more flexibility when building Blog, News and Press Releases listing pages. For example, you can use another component such as a Hero Carousel at the top of the page without displaying two hero elements.

**How to use it**

1. Create or edit the relevant listing page.
2. Open the **Hero Banner** section.
3. Enable **Hide hero banner**.
4. Save the page.

The default hero banner will no longer be displayed on the front end.

Hero Carousel headings have also been adjusted to maintain a cleaner heading hierarchy and improve accessibility.

### Bug Fixes 🩹

#### Pop-ins can now be saved without affecting site availability 🪟

An issue that could make a website temporarily inaccessible after saving a homepage pop-in has been fixed.

**What this means for webmasters**  
Webmasters can now create or update pop-ins without affecting access to the website or its back office.

#### Media actions remain accessible with long author names 🗂️

The **Media** administration page now handles long author names more effectively.

Previously, a long name in the **Author** column could expand the table and partially hide the **Edit** action on the right-hand side.

**What this means for webmasters**  
Media management remains easier to use regardless of the length of an author's name, with the Operations and Edit controls remaining visible and accessible.



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v155 💻

### August 2026

### Improvements 💪

#### Metatag CSV now supports multilingual content 🌍

Metatag CSV exports now include a **Language** column and the correct URL for each existing translation.

**What this means for webmasters**  
You can update multilingual metatags through CSV more easily, without manually adding language information or correcting translated URLs.

**How to use it**

1. Go to **Configuration → Search and metadata → Metatags**.
2. Open **Meta Export**.
3. Select the relevant **Entity type**, **Bundle**, **Language(s)** and **Metatag types**.
4. Click **Download** to generate the CSV file.
5. Update the required metatag values directly in the CSV.
6. Return to the Metatags section and open **Meta Import**.
7. Upload the updated CSV file to apply your changes.

**You can also follow the video below for a quick visual walkthrough.**

   ![metatags export/import](/sites/g/files/dvc2391/files/styles/default/public/image/2026/08/202608171429.gif?itok=OfQMsoL1)   



#### Heading styles updates📐

**Heading styles updates 📐**  
Heading styles from **H1 to H4** have been refined across Site Factory, creating a more balanced, readable and consistent hierarchy throughout pages.

**What this means for webmasters**  
Headings are easier to use correctly, with clearer distinctions between sections and subsections and less need to choose a heading level based only on its visual size. This improves readability, visual consistency and accessibility, while also helping search engines and AI-powered search better understand page structure, supporting stronger **SEO and GEO practices**.

   ![new heading sizes](/sites/g/files/dvc2391/files/styles/default/public/image/2026/08/image%20%288%29.png.webp?itok=LPq1mibB)   



   ![heading sizes before and after](/sites/g/files/dvc2391/files/styles/default/public/image/2026/08/Capture%20d%E2%80%99e%CC%81cran%202026-08-19%20a%CC%80%2012.16.39.png.webp?itok=OZaZ4tpN)   



















#### Social media links are now available on maintenance pages 🔗

Social media icons and redirect links can now be configured directly from the **Maintenance Mode** settings.

**What this means for webmasters**

Even when your website is temporarily unavailable, visitors can still easily reach your official social media channels and stay connected with your latest content. Webmasters can add several platforms, including Facebook, Instagram, LinkedIn, TikTok, X, YouTube and others. Only the social networks that have been configured will appear on the maintenance page.

   ![social media links in maintenance page](/sites/g/files/dvc2391/files/styles/default/public/image/2026/08/Image%20Aug%2017%2C%202026%2C%2003_18_52%20PM.png.webp?itok=HosBs2XY)   



1. Navigate to /admin/config/development/maintenance.
2. Enable **Put the site into Maintenance Mode**.
3. In the **Social Media Links** section:
    - Select a social media platform from the **Social Media Icon** dropdown.
    - Enter the corresponding **external URL** in the **Social Media Link** field.
    - Repeat the process for each social media account you want to display.
4. Click **Save configuration** and verify that the changes have been saved successfully.

**See the video below and see how to configure the settings**

   ![how to put social media links in maintenance page](/sites/g/files/dvc2391/files/styles/default/public/image/2026/08/202608171429%20%281%29.gif?itok=tPCY0EZr)   



### Bug Fixes 🩹

#### Carousel controls are now easier to see 🎠

Navigation arrows and pagination dots in **Content Carousels** and **Technology Push** components now adapt better to light and dark backgrounds.

Active dots are also more clearly highlighted, improving visibility and accessibility across different themes.

**What this means for webmasters**  
Carousels remain easier to navigate and more readable, whatever background colour is used.

   ![Content carousel](/sites/g/files/dvc2391/files/styles/default/public/image/2026/08/Capture%20d%E2%80%99e%CC%81cran%202026-08-19%20a%CC%80%2012.23.38.png.webp?itok=GKdleAlz)   



#### Videos now display correctly inside Content with Aside 🎥

Videos placed inside a **Content Carousel** within **Content with Aside** now display correctly across screen sizes, including on mobile.

Webmasters no longer need to use custom embed code or manual fixes to keep videos properly sized and visible in this layout.

   ![videos on content with aside ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/08/Enregistrement%20de%20l%E2%80%99e%CC%81cran%202026-08-19%20a%CC%80%2012.34.41.gif?itok=L_MP2-Oe)   



#### UI elements display more consistently 🎨

Several visual issues have been corrected across the site, including spacing around **Map components**, navigation icon colours on **Search pages**, and **Breadcrumb** colours on mobile.

Webmasters now benefit from a cleaner and more consistent display across layouts and screen sizes.

   ![UI element display](/sites/g/files/dvc2391/files/styles/default/public/image/2026/08/Capture%20d%E2%80%99e%CC%81cran%202026-08-19%20a%CC%80%2013.28.48.png.webp?itok=7PHeQeU5)   





 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v154 ⚙️

### July 2026

### Improvements 💪

#### Content editing pages load more efficiently ⚡

Several processes that were running unnecessarily on administration pages have been reduced.

The most visible change is in the **Metatags** section. **Basic tags** load directly with the page, while advanced, schema and other metatag groups are available through the **Load all** button.

The administration toolbar now displays up to three menu levels. Deeper settings remain available by opening their parent administration pages.

**What this means for webmasters**  
Content creation and editing pages require less initial processing. You can complete the required meta title and description immediately, then load the remaining metatag options only when you need them.

   ![meta tags improvement ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/07/Screenrecording2026-07-1614.23.45-ezgif.com-video-to-gif-converter_0.gif?itok=wEFiHukd)   



### Bug Fixes 🩹

#### Activity Card text stays readable on dark backgrounds 🎨

Activity Cards placed inside a **Container → Grid** layout now use the appropriate text colour for their background.

Light text is displayed on dark backgrounds, while dark text is used on light backgrounds. This corrects cases where text became difficult to read after applying colours such as navy blue.

**What this means for webmasters**  
You can use dark and light Activity Card themes in nested layouts without compromising readability or having to change the page structure.

   ![colour enhancement of the activity card making it more visible ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/07/Screenshot%202026-07-16%2014.35.32.png.webp?itok=B6Cr5-1B)   



#### Bullet points stay visible inside Accordions 📋

Bulleted lists inside Accordion items now display correctly, including when the Accordion is placed inside a **Container with Aside**.

Bullet markers also follow the configured text colour, helping lists remain visible across different themes and background colours.

**What this means for webmasters**  
You can structure Accordion content with bulleted lists without worrying about the markers disappearing in nested layouts.

   ![A bulletpoint list showing the efficiency of the added elements](/sites/g/files/dvc2391/files/styles/default/public/image/2026/07/Screenshot%202026-07-16%2014.38.18.png.webp?itok=VDLq_4TS)   



### Good to know 🧭

#### Page language is not selected by geographical location 🌍

Site Factory does not automatically select a regional translation based on the visitor’s physical location.

Browser-language detection can be used when a visitor opens a language-neutral URL, such as the main website address. However, a language code already included in the URL always takes priority.

For example, a visitor opening a URL containing **/en-au** will remain on the Australian version, regardless of their browser language.

#### Translations need to be updated separately 🔄

Once a page translation has been created, it becomes largely independent from the original page.

Components, formatting changes and newly added content blocks are not automatically copied to the other translations.

Webmasters should therefore review and update every relevant language version when changing the structure or content of a multilingual page.

#### Translate menu links instead of duplicating them 🧭

For multilingual navigation, create the menu link once in the source language and add the other language versions through the **Translate** tab.

Recommended workflow:

- Go to **Structure → Menus**.
- Open the required menu.
- Edit the source menu item.
- Select **Translate**.
- Add and save the target-language version.

Creating separate menu links for each language can lead to duplicated entries and disconnected navigation structures.



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v153 ⚙️

### **June 2026**

### Improvements 💪

#### Export pages in the right language 🌐

Page export has been improved to better support multilingual websites.

Previously, when exporting a page from a translated URL, the export could still use the page’s default language. For example, exporting from an English URL could return French content if French was the default language of the page.

Now, exports follow the active URL language. Webmasters can export one specific language, or use the **Include all translations** option when they need a multilingual export.

The import workflow has also been improved with an **All languages** option, making it easier to import all translations at once when needed.

   ![import translations in back office landing page](/sites/g/files/dvc2391/files/styles/default/public/image/2026/06/36a731fb-7e7e-43d9-81c7-aeb4b989a50a.png.webp?itok=dZ10Nlde)   



**What this means for webmasters**  
It is now easier and safer to reuse multilingual content between VSF sites, especially when exporting and importing pages in English, French or other available languages.

#### Headings are now more consistent with the Design System 🔤

Heading styles have been updated across the VSF platform to match the latest Veolia Design System specifications.

This update applies to **H1, H2, H3 and H4** styles, including font sizes and line heights.

   ![H enhancement visuals display](/sites/g/files/dvc2391/files/styles/default/public/image/2026/06/fe2cddba-f708-42e9-90c7-8ae0141623cf.png.webp?itok=JL43PHNA)   



**What this means for webmasters**  
Pages should feel more visually consistent across sites, with headings that better follow the official design rules.

#### Back-office pages should feel faster ⚡

The Veolia Platform Dashboard module has been optimised to reduce unnecessary menu loading on admin pages.

This improves back-office performance while keeping the existing Rich Menu warning behaviour unchanged.

**What this means for webmasters**  
Admin pages such as appearance, menu, block or content configuration pages should load more efficiently, making daily back-office work smoother.

### Bug Fixes 🩹

#### Global background colours now keep content readable 🎨

Several contrast issues linked to the Global Background Colour feature have been fixed.

Breadcrumbs, breadcrumb separators, sticky bar descriptions and location listing links now display more correctly when a dark or custom background colour is applied.

   ![Background with readable text displayig two options](/sites/g/files/dvc2391/files/styles/default/public/image/2026/06/Screenshot%202026-06-29%2016.43.11.png.webp?itok=oTILvKGu)   



**What this means for webmasters**  
Pages using custom backgrounds should remain easier to read, with fewer cases of invisible or low-contrast text.

#### Veolia Chat now behaves correctly inside collapsible sections 💬

An issue was fixed where the Veolia Chat component could appear while a collapsible container was still closed.

The Chat component is now hidden when the container is collapsed and appears correctly when visitors select **Show More**.

   ![Collapsible container with veolia chat in it always shows the chat component in collapsed version regardless of other components on the top](/sites/g/files/dvc2391/files/styles/default/public/image/2026/06/20260603-0628-05.5255176-ezgif.com-crop.gif?itok=grx2klRz)   



**What this means for webmasters**  
Veolia Chat can be used more reliably in collapsible content areas without appearing before the visitor expands the section.

### Good to know 🧭

#### Place the floating Veolia Chat at page root level

If you use the floating Veolia Chat, it should be placed at the root level of the page, not inside another component or container.

This helps avoid layout issues such as overlaps with navigation, breadcrumbs or the scroll-to-top button.

**What this means for webmasters**  
When using the floating Chat mode, place it directly at page level to ensure the component displays correctly.

#### Use paths without language prefixes for block visibility

When configuring block visibility on multilingual pages, the path should be entered without the language code.

**Use:**

/groupe/veolia-en-bref

**Instead of:**

/fr/groupe/veolia-en-bref

Drupal handles language prefixes dynamically during visibility checks.

**What this means for webmasters**  
Block visibility rules should be easier to configure correctly across multilingual pages.



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v151 + v152 🚀

### **June 2026**

### Improvements 💪

#### Homepage pages get more creative freedom 🏠

Webmasters can now add the **Embed component** directly to Homepage pages.

This opens up new possibilities for richer Homepage layouts, allowing you to add external content such as videos, iframes, integration snippets, or other embedded elements without needing complex workarounds.

The Embed component behaves like other content blocks. It can be added, saved, duplicated, reordered, collapsed, expanded, or removed.

**What this means for webmasters**  
Your Homepage can now be more dynamic, more flexible, and better adapted to local communication needs.

   ![embed integration](/sites/g/files/dvc2391/files/styles/default/public/image/2026/06/Enregistrement%20de%20l%E2%80%99%C3%A9cran%202026-06-02%20%C3%A0%2009.31.17.gif?itok=M8u7UFB6)   



#### Webforms get a cleaner, more modern look ✨

The Contact Us webform is being redesigned to provide a cleaner and more modern experience, aligned with the Veolia Design System.

This update improves visual consistency and helps make forms easier to read, easier to complete, and more pleasant for visitors.

**What this means for webmasters**  
Webforms will feel more polished and more consistent with the rest of the platform, helping create a better first impression when visitors submit a request.

#### Long forms can now feel easier to complete 🧭

Webforms can now be structured into several steps using the existing Drupal Webform wizard functionality.

Instead of showing all fields at once, longer forms can guide visitors step by step through the journey.

**For example, a form can be divided into steps such as:**

- Client type
- Project details
- Contact information
- Final validation before submission

**What this means for webmasters**  
Long forms can now feel lighter, clearer, and less overwhelming for visitors, helping improve the overall user journey.

   ![Form layout ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/06/4098f736-44d6-4a54-8903-408cff15e52d.png.webp?itok=c3w9RmRv)   



#### Better tracking possibilities for webforms 📊

New **DataLayer** capabilities are now available for webforms.

This makes it easier to connect form interactions with Google Tag Manager and follow key actions such as submissions, conversions, or specific user interactions.

Site-specific configurations are preserved, so webmaster settings are not overwritten during deployments.

**What this means for webmasters**  
Marketing and analytics teams can better understand how forms are used, what visitors do, and how webforms contribute to performance goals.

#### Hero Carousel visuals feel more polished 🎨

The Hero Carousel overlay has been refined to improve readability and visual quality.

On desktop, the overlay now uses a gradient treatment. On mobile, the opacity has been adjusted to improve the balance between image visibility and text readability.

**What this means for webmasters**  
Hero Carousel sections now look cleaner, more modern, and easier to read across devices, especially on high-impact landing pages.

   ![Hero carousel exemple](/sites/g/files/dvc2391/files/styles/default/public/image/2026/06/Enregistrement%20de%20l%E2%80%99e%CC%81cran%202026-06-04%20a%CC%80%2014.20.42.gif?itok=2ci3klQJ)   



#### Back to top is now available on mobile 📱

The **Back to top** button has been redesigned and is now available on desktop, tablet, and mobile.

The existing behavior remains the same, but the button is now accessible across all screen sizes.

   ![Scroll up button](/sites/g/files/dvc2391/files/styles/default/public/image/2026/06/Screenrecording2026-06-0514.22.13-ezgif.com-video-to-gif-converter.gif?itok=Y95jJ1HK)   



**What this means for webmasters**  
Visitors browsing long pages on mobile can return to the top more easily, creating a smoother and more comfortable navigation experience.

#### Maintenance pages are clearer and easier to manage 🛠️

Maintenance pages now include improved configurable and translatable fields.

Webmasters can manage the maintenance title, main message, and optional social media sentence more easily.

**What this means for webmasters**  
When a site is temporarily unavailable, visitors can receive clearer and more reassuring information in the right language.

### Bug Fixes 🩹

#### Hero Carousel titles now display correctly 🔤

An issue was fixed where some characters in Hero Carousel headings could be cut off at the bottom.

This mainly affected letters with descenders, such as **g**, **y**, and **j**.

**What this means for webmasters**  
Hero Carousel titles now display properly and look cleaner across desktop, tablet, and mobile views.

#### Webform warnings have been resolved ✅

Warnings detected on specific webforms have been investigated and resolved.

The issue was linked to a missing parenthesis in one of the configured webform conditions. After correction, the form behavior was confirmed as working correctly.

**What this means for webmasters**  
Webforms using conditional handlers should continue working as expected.

#### Language configuration issue has been corrected 🌐

An issue was reported where an unexpected language appeared in the editing interface when adding links to text.

The issue was linked to browser-to-Drupal language mappings and has now been corrected.

**What this means for webmasters**  
The editing interface should now display the correct language configuration, making multilingual editing clearer and less confusing.



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v150 🚀

### **May 2026**

### Improvements 💪

#### More precise control over Sticky Bars

Webmasters can now configure visibility rules for each Sticky Bar individually.  
Previously, Sticky Bar visibility was managed globally. This meant that all enabled Sticky Bars followed the same page visibility rules.  
Sticky Bars can now each have their own page visibility configuration.

   ![Sticky bar tutorial ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/05/Sticky%20bar%20tutorial%20.gif?itok=UGb8wxyz)   



**For example:**

- The **Contact Sticky Bar** can appear on the homepage.
- The **Your needs Sticky Bar** can appear only on a specific page.
- Other Sticky Bars can stay disabled or continue using the global configuration.

By default, each Sticky Bar still uses the global settings. However, when visibility is configured directly on an individual Sticky Bar, this local setting takes priority.

**Where to configure it**  
Go to: **Structure → Sticky Bar definitions**  
Then edit the Sticky Bar you want to configure.

**Good to know**  
A help text has been added in the interface to explain the behavior:

> If the field is left empty, the Sticky Bar will continue using the global visibility settings.

More details are available in the [Sticky Bar guide](https://www.sf.userguide.veolia.com/site-configuration/sticky-bar).

#### Better hero banners for long News and Press Release titles

The **Business hero banner** style is now available for:

- News
- Press Releases

   ![Hero banner business](/sites/g/files/dvc2391/files/styles/default/public/image/2026/05/a9883bfd-5460-470d-9162-aaa45e2ef0f3.png.webp?itok=0plLK8DT)   



This is especially useful for editorial content with long titles.  
Until now, this hero banner style was only available on **Page** content. It can now also be used on **News** and **Press Releases** to give more space to the title and reduce the visual weight of the image.

**Why this is useful**  
Some News and Press Release titles are too long to display comfortably in the standard hero layout.  
The Business hero banner style helps by:

- Giving more room to the title.
- Making editorial messages easier to read.
- Reducing the importance of the image when the text is the priority.
- Improving the display of institutional or corporate content.

**Where to find it**  
When editing a **News** or **Press Release**, use the **Hero banner type** field and select **Business**.

**Note**  
The additional fields available on Page content with the Business hero banner, such as **Additional Info 1**, **Additional Info 2**, or **Stamp**, are not available for News and Press Releases.

#### Block visibility settings are preserved during configuration imports

Webmasters can now update the **Pages visibility** settings for specific blocks without losing their changes after a configuration import or release deployment.

This is useful when visibility rules have been configured for campaign pages, landing pages, lead generation pages, or any other page requiring a specific navigation setup.

This update applies to the following blocks:

- Secondary navigation
- Top header menu
- Veolia Site Core Language block
- Region switcher
- Main navigation
- Search exposed form
- Call to action and service buttons block

**What changed**  
Previously, page paths and visibility options configured manually under **Visibility → Pages** could be overwritten during a configuration import.  
With this update, the saved visibility values remain unchanged after configuration imports and deployments.

**What this means for webmasters**  
You can configure page-specific visibility rules with more confidence, knowing that the saved settings will not be automatically reset during future releases.

**Good to know**  
This improvement specifically concerns the preservation of the block configuration during imports.

#### Navigation blocks can now be hidden on specific pages

Navigation and interface blocks can now be hidden or displayed correctly on selected pages according to their configured visibility rules.

This is particularly useful for campaign pages, landing pages, and lead generation pages where visitors should remain focused on completing a specific action without navigating to other areas of the website.

For example, the top header, main navigation, and secondary navigation can be hidden on a lead generation page while the hero banner and page content remain visible.

**What changed**  
Previously, the visibility settings could remain correctly saved in the back office, but some blocks could still appear on the frontend.  
This has now been fixed, and the frontend correctly applies the visibility rules configured for the page.

**Where to configure it**  
Go to: **Structure → Block layout**  
Find the block you want to update, click **Configure**, then open **Visibility → Pages** and add the relevant page paths.

**What this means for webmasters**  
You can create pages with reduced or fully hidden navigation and be confident that the selected blocks will not be displayed to visitors on those pages.

### Bug Fixes 🩹

#### Business Case Listing maps now open in the right place

The **Business Case Listing** map now correctly uses the default position configured by webmasters.  
Previously, when latitude, longitude, and zoom level values were added in the component settings, the map did not always apply them when the page loaded.  
This has now been fixed.

   ![Business map ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/05/Business%20map%20.png.webp?itok=yl8WRPUM)   



**What this means for webmasters**  
When you configure a Business Case Listing component, the map will now correctly use the defined:

- Latitude
- Longitude
- Zoom level

This gives you better control over the first map view displayed to visitors.

#### Background pictograms now display correctly

An issue was reported where the pictogram used in the new **Background** feature was not visible on some pages.  
The pictogram was present, but in some cases it appeared behind the background layer instead of being displayed properly.  
This was especially visible on pages using the chat component.  
This has now been fixed.

   ![picto background ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/05/Screenshot%202026-05-05%2011.36.05.png.webp?itok=M3vIb8Hv)   



**What this means for webmasters**  
Background pictograms should now display correctly, including on pages where the chat component is enabled.  
The fix has been tested on desktop, mobile, and tablet views.

#### Clearer validation when required metatag fields are missing

Saving content is now clearer when required metatag fields are missing.  
Previously, if a required metatag field such as **Description** was empty inside a collapsed **Metatags** section, the page could fail to save without clearly showing where the problem was.  
The issue mainly affected required textarea fields.  
The collapsed Metatags section now automatically opens when a required field inside it needs attention.

**What this means for webmasters**  
When a required metatag field is empty:

- The Metatags section automatically opens.
- The invalid field is visible.
- The browser validation message appears correctly.

Existing behavior for fields such as **Page Title** remains unchanged.  
This should make content saving easier to understand and reduce time spent looking for hidden validation errors.

#### New site basic settings can be saved correctly

A previous issue related to broken **system.site** configuration on new sites has been checked and validated.  
Testing confirmed that basic site settings can now be updated and saved successfully on newly created sites.

**What this means for webmasters**  
Admins can edit and save basic site settings on new sites without encountering the previous configuration issue.

### Technical maintenance 🔧

#### Image upload and cropping remain stable after WebP plugin cleanup

The obsolete **veolia\_webp\_convert** plugin has been removed from the codebase because it is no longer needed after previous image handling improvements.  
The cleanup was tested to make sure image upload and cropping features continue to work correctly.

   ![Remove veolia_webp_convert plugin from codebase](/sites/g/files/dvc2391/files/styles/default/public/image/2026/05/5e669e16-62f3-4703-abce-2ad60ed96ee8.png.webp?itok=O-DzStEZ)   



**What this means for webmasters**  
There is no change in your editorial workflow.  
You can continue to upload, crop, and save images as usual.



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v148 &amp; v149 🛠️

### ***(April 2026)***

### Improvements 💪

#### 🎠 New Hero Carousel Component 

A brand-new Hero Carousel component has been introduced to enhance homepage storytelling and engagement.

   ![Slideshow movement screenrecording](/sites/g/files/dvc2391/files/styles/default/public/image/2026/04/download%20%284%29%20%281%29.gif?itok=0m20xZ48)   



**Key Features**

- Auto-rotating slides with progress indicator
- Play/Pause control + smart pause on interaction
- Fully responsive, immersive full-width design
- Configurable content (images, CTA, text, key stats)

**Impact**

- Stronger visual storytelling on key pages
- Increased engagement with dynamic content
- Fully aligned with VSF design system

#### ⏱️ Content Scheduling: Plan Your Publications

Editors can now schedule content publication and unpublication directly from the CMS.

   ![Scheduling a post screen gif](/sites/g/files/dvc2391/files/styles/crop_freeform/public/image/2026/04/download.gif?itok=Y6TY68QA)   



**Key Features**

- Publish/unpublish at specific date &amp; time
- Timezone-aware scheduling
- Works across most profiles (except Watertech)

**Impact**

- Perfect for campaigns &amp; timed content
- Reduces manual publishing effort
- Better content lifecycle control

### 🎨 Background Customization 

Webmasters can now customize page backgrounds at both global and page level.

   ![a screen recording of background enhancement ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/04/download%20%282%29.gif?itok=-uNe-TND)   



**Key Features**

- Choose predefined background colors
- Add pictograms with positioning (corners)
- Global settings + per-page override

**Impact**

- More flexible branding and visual identity
- Better control over page aesthetics

### 💬 Veolia Chat Integration

A new chatbot feature has been deployed across VSF, enabling interactive user support directly on veolia.com .

   ![Veolia Chatbot Screenshot](/sites/g/files/dvc2391/files/styles/default/public/image/2026/04/Screenshot%202026-04-09%2010.41.57.png.webp?itok=NXU4kcRx)   



**Key Features**

- Floating widget or embedded mode within content
- Configurable via paragraph component (assistant, prompts, behavior)
- Secure token-based integration with API
- Multilingual support (content + UI translations)
- Lazy-loaded for optimal performance

**Impact**

- Enhanced user engagement and support experience
- Scalable chatbot integration across all VSF sites
- Strong foundation for future AI-driven features

**⚠️** ***Note on Veolia Chat:***  
The feature is currently being tested on [**veolia.com**](http://veolia.com).  
We are actively working on controlling the volume of requests before a wider rollout.

---

### Bug Fixes 🩹

#### 🏠 Site Creation: Homepage Configuration Issue

An issue affecting newly created sites caused incorrect homepage configuration in basic site settings (veolia.gr).

**Resolution**  
The homepage setting logic has been corrected using an existing fix previously applied to similar cases.

**Impact**

- Homepage is now correctly set during site creation
- Site configuration behaves as expected
- Improved reliability of new site setup

### 💬 Veolia Chat: Stability &amp; UX Improvements

Several issues related to the chatbot feature have been addressed to ensure a smoother and more consistent experience across all sites.

**Fixes Included**

- Corrected chat position for RTL languages (now displayed on the left for Arabic)
- Fixed rendering issues in complex layouts (containers, collapsible, nested components)
- Improved mobile display behavior
- Added fallback handling when API/token retrieval fails
- Enforced validation for required fields (e.g. Assistant Name)
- Ensured chat loads only when globally enabled

**Impact**

- Consistent experience across all layouts and devices
- Improved accessibility for RTL languages
- More stable and reliable chatbot behavior
- Reduced risk of frontend errors

### 🚫 Video Preview Feature Deferred

A proposed video preview feature in media creation was reviewed.

**Resolution**

- Feature marked as outdated due to upcoming DAM migration (Wedia)

**Impact**

- Avoided redundant development effort
- Focus maintained on higher-value features



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v147 ⚙️

### *(March 2026)*


### Bug Fixes 🩹

#### 📝 Webforms: Configuration Restored

Following the [previous alert](https://chat.google.com/room/AAQAaBM16WY/DZrVJvzoI-s/DZrVJvzoI-s?cls=10) regarding the bug in the Webform Bulk Update feature, several webforms on veolia.com were found to display incorrect or generic fields due to configuration inconsistencies.

Resolution  
The affected forms have been restored to their configuration from the 29 October 2025 backup, ensuring the correct structure and fields are now displayed.

Impact

- Webform fields and layouts now appear as expected
- Submissions behave consistently again
- Users can interact with the forms without configuration-related issues

---

#### 🔗 Anchor Links: Scroll Position Corrected

When accessing a page directly through a URL containing an anchor (for example from newsletters or emails), the targeted section could appear partially hidden behind the sticky navigation header.

Resolution  
Anchor navigation now correctly accounts for the header offset, ensuring the targeted content is fully visible when the page loads.

Impact

- Anchor links now scroll to the correct position
- Targeted sections are fully visible upon page load
- Navigation behaviour is consistent across internal and external links

---

#### 🔁 Bulk Redirect Import: File Validation Clarified

An issue prevented certain bulk redirect files from being processed correctly in the back office.

Resolution  
Redirect import validation has been clarified and corrected to ensure files are processed successfully when using the proper format.

Impact

- Bulk redirect imports now function correctly
- Source paths must not include a leading “/”, as it is automatically added by the system
- Improved handling of language parameters for multilingual redirects

---

### Improvements 💪

#### 📄 New Collapsible Container Component

A new Collapsible Container component is now available across all sites.  
Editors can group content inside an expandable section that users can open or collapse using a “Show more / Show less” toggle.

This feature helps keep pages clean and easier to scan, while still allowing access to detailed information when needed.

👉 A step-by-step tutorial is available below to learn how to use this new component.

### Tutorial : How to use the Collapsible Container 

#### 1. Add the component

Open the page you want to edit and click Add Paragraph then select Collapsible Container.

This component acts as a wrapper that allows you to group multiple content elements.

#### 2. Configure the button labels

The component includes two required fields:

Expand Label  
Default value: Show more

This text appears when the content is collapsed.

Example alternatives:

- Read more
- View details
- Read full bio

Collapse Label  
Default value: Show less

This text appears once the content is expanded.

#### 3. Add the content inside the container Save and publish the page

Inside the Content Items field, add the elements you want to hide behind the expandable section.

The container supports all paragraph types available on the site, such as: Text, Images, Videos and other content components. Multiple elements can be added inside the same container.

Once the page is published, the content inside the container is partially hidden with a Show more button appears below the content.

### How the component behaves 

### Default state (collapsed)

When the page loads:

- The container displays only the first portion of the content
- Additional content is hidden using a maximum height limit
- A fade effect may appear at the bottom to indicate that more content is available

### Expanded state

When users click Show more:

- The container expands smoothly
- The full content becomes visible
- The button changes to Show less

Clicking Show less collapses the content again.

---

### 🔎 Broken Links Report: User Access Confirmed

Access to the Broken Links report has been reviewed to ensure web managers can monitor and resolve link issues efficiently.

Confirmation

- Site managers already have access to the report
- Users can independently review and validate broken links
- Supports ongoing content quality and link maintenance across websites

---

### 🛡️ Webforms: reCAPTCHA Monitoring

An intermittent issue affecting reCAPTCHA validation on webforms has been investigated.

Enhancements

- Monitoring has been implemented to detect potential reCAPTCHA errors in system logs
- Automated alerts are triggered if repeated errors occur
- This enables faster detection and response should the issue reappear

---

Thank you for your continued support and feedback. Stay tuned for the next release, already in development! 🌟

Site Factory



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v145 🔧

### *(January 202**6, 2025)*


### Improvements 💪

#### 📞 Clickable Phone Numbers on Contact Pages

On the contact pages of websites, phone numbers were not clickable. In the back office, the “**Notice for access”** field in the Address block did not generate clickable links on the front-end. This led to a **poor user experience (UX)** and reduced visibility of contact information.

   ![adress block ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/01/Design%20sans%20titre%20%288%29.jpg.webp?itok=UaR9eraM)   



✨ **Improvements:**  
 ✅ A new field, field\_location\_notice\_html, has been created, supporting HTML.  
 ✅ Phone numbers are now **clickable directly in the Address block**.  
 ✅ Webmasters can easily manage these links in the back office.  
 ✅ Data migration was completed **without any loss of existing content.**  
 ✅ UX is improved: users can see and call numbers immediately, without extra clicks.

**🧩 Good to know for webmasters:**

- On the editing page, go to the **Address Block** menu.
- In the **“Notice for access” field**, switch to the **source / HTML view.**
- Add an HTML anchor tag &lt;a&gt; around the phone number to make it clickable.  
     &lt;a href="+0123456789"&gt;tel: +01 234 56 789&lt;/a&gt;
- **Save your changes.** The number will now appear as a clickable link, allowing users to call directly from their device.

   ![adress block edition](/sites/g/files/dvc2391/files/styles/default/public/image/2026/01/202601211217.gif?itok=PPWWyPQi)   



#### 📊 GA4 – Tracking Cleanup &amp; Data Accuracy Improved (veolia.kr)

Some inconsistencies were identified in Google Analytics 4 data on [veolia.kr](http://veolia.kr):

- Backend (admin) pages such as content edit, media edit, login, and entity browser URLs were being tracked.
- The root page “/” was generating a high number of page views, even though it automatically redirects users to **/ko** or **/en**, resulting in inaccurate traffic distribution.

**✨ What’s been improved:**  
 ✅ Backend URLs can now be excluded from GA4 tracking using URL pattern rules.  
 ✅ The root page “/” has been added to the exclusion list to prevent tracking before redirection.  
 ✅ GA4 data is now cleaner and more reliable.  
 ✅ Page views are correctly attributed to **/ko** and **/en** homepages.

🧩 **Good to know for webmasters:**

- GA4 does not automatically exclude admin pages.
- If you notice unexpected URLs in GA, share the list with the SF team (admin) so exclusion patterns can be added.

   ![ GA4 tracking](/sites/g/files/dvc2391/files/styles/default/public/image/2026/01/image%20%288%29.png.webp?itok=6Lo9fUwk)   



### Bug Fixes 🩹

#### 📂 File Upload – Bulk Media Upload Restored

The file upload feature was temporarily unavailable, preventing users from selecting or dragging and dropping files for import. This issue has now been resolved, and files can be uploaded normally again, making bulk media management smooth and seamless.

**✨ What’s been improved:**  
 ✅ File upload now works as expected.  
 ✅ Files can be selected or dragged &amp; dropped.

   ![Bulk upload](/sites/g/files/dvc2391/files/styles/default/public/image/2026/01/202601201725.gif?itok=IZkoP3Qj)   



#### 📄 Content Push – White Space Fixed in Accordion

The Content Push component was showing unnecessary white space between the image and text when placed inside an Accordion, affecting the visual layout.

**✨ What’s been improved:**  
 ✅ Content Push now displays without white space when used inside an Accordion.  
 ✅ The image and text are properly aligned, making content visually consistent.

   ![accordion bug resolved ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/01/Design%20sans%20titre%20%289%29.jpg.webp?itok=KMl3Fw30)   



#### 📰 Press Release Pages – Empty Content Issue Fixed (Veolia UK)

Some hubpages (listing pages) of press releases on [veolia.co.uk](http://veolia.co.uk) were occasionally showing zero content, leaving the page blank for users.

   ![Empty content issue fixed](/sites/g/files/dvc2391/files/styles/default/public/image/2026/01/Design%20sans%20titre%20%2810%29.jpg.webp?itok=HHlc8GW0)   



**✨ What’s been improved:**  
 ✅ Press Release pages on Veolia UK now display content immediately if available.  
 ✅ When no content is present, a clear message is shown: “*No results found. Please adjust your filters or clear all filters to view available items.*”  
 ✅ The message is translatable and consistent across all listing pages.

   ![Empty content issue fixed with error message ](/sites/g/files/dvc2391/files/styles/default/public/image/2026/01/image%20%2812%29.png.webp?itok=hGPBTmc-)   



Thank you for your continued support and feedback. Stay tuned for the next release, already in development! 🌟

*Site Factory*

---



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v143 + 144 🔩

### *(December 2025)*

### **Bug Fixes 🩹**

#### **🗺️ Baidu Maps: Zoom &amp; Highlight Actions Restored** 

On sites using Baidu Maps, the map was not behaving consistently with Google Maps. The issues consisted of being unable to zoom or highlight the corresponding pin on the map, or even highlight the location in the listing. This behaviour did affect both test and live Chinese sites.

***✨ What’s been fixed:*** Baidu Maps now mirrors Google Maps behaviour.

✅ Clicking a list item zooms &amp; highlights the correct pin

✅ Clicking a pin highlights the item in the list

✅ No regressions on either map provider

✅ Consistent UX across all countries

#### **🖼️ Image Upload Validation: No More ImageMagick Errors**

On Foundation and Watertech sites, uploading non-image files (such as .txt or .pdf) in the theme settings caused an **ImageMagick fatal error** to appear in the DBLog:

*“ImageMagick error 1: no decode delegate for this image format…”*

This error occurred because the system attempted to process unsupported file types as images.

***✨ What’s been fixed:*** The logo and favicon upload fields now strictly accept image formats only: **svg, jpeg, jpg, png, gif.** Any other file type is **blocked before upload** with a clear validation error

- No ImageMagick or PHP errors are logged
- Security has been reinforced to prevent bypass attempts (e.g., renamed extensions)
- The fix applies consistently across all custom themes.

#### 🖼️ **Photo Cropping Restored**

An issue where manual photo cropping was not reflected on the front end has been resolved.

***✨ What’s been fixed:***

✅ Crop-freeform applied in the back office is now correctly displayed  
✅ The image style respects manual cropping  
✅ Employee photos render correctly on all relevant pages  
✅ No impact on images without manual cropping

#### 📄 **PDF Links Now Redirect Correctly After Updates**  
When a PDF document was replaced, **old file links could break**, returning a 404 instead of redirecting users to the latest version.

✨ **What’s fixed:**  
 ✅ Old PDF URLs now **automatically redirect (301)** to the updated file  
 ✅ No more broken links when documents are replaced  
 ✅ Redirection works consistently across all update scenarios  
 ✅ Existing redirects remain unaffected

***🧩 Step-by-step***

| **1-Upload a PDF**  - Go to **Content → Media** - Create a **Document** media - Upload your PDF and save | **2-Use the PDF link**  - Copy the file URL from the media - Paste it into a page, article, or component |
|---|---|
| **3-Replace the PDF**  - Edit the same **Document** media - Remove the existing file - Upload the new version - Save the media | **4-Wait for cron (important)**  - Cron runs automatically every ~30 minutes |
| **5-Verify the redirect**  - Open the **old PDF URL** in an incognito window. - You should be **automatically redirected (301)** to the new file |



####   
🎯 **CKEditor Full-Screen Mode Restored**  
 After the CKEditor upgrade, the **“Expand window” (full-screen)** option was no longer available, making long-form editing more difficult for content editors.

✨ **What’s fixed:**  
 To restore a smooth and comfortable editing experience:  
 ✅ The **full-screen (expand window)** button is back in the CKEditor toolbar  
 ✅ Additional tools (Find &amp; Replace, Select All, Emojis, Word &amp; Character count) are fully enabled  
 ✅ Toolbar layout is consistent and stable across all sites  
 ✅ No regression in standard (non-full-screen) editing mode  
  
**1️⃣ Open a Text Component in Edit Mode**

**What to do**

1. Log in to the back office
2. Create or edit a page
3. Add or edit a **Text** component

➡️ The CKEditor toolbar appears at the top of the text area.

**2️⃣ Use the “Expand Window” (Full-Screen Mode)**

**What you’ll see :** A **full-screen icon** in the **top-left of the toolbar.** This button was restored after the CKEditor update

**What it does:** Expands the editor to full screen and makes long content editing much easier

**3️⃣ Find &amp; Replace Text Instantly**

**What it does:** Quickly search for words and replace text across the whole content.

**5️⃣ Insert Emojis &amp; Check Word Count**

**Emoji** icon available in the toolbar. Useful for light content, internal pages, or announcements.

**Word &amp; character count** is displayed at the **bottom of the editor**

## **6️⃣ Select All &amp; Smart Text Transformations**

**Select All :** Quickly select all content with one click

**Text transformations :** Automatic smart formatting (quotes, dashes, etc.) Improves text consistency without manual effort

🧩 **Schema.org Fix: Correct** **dateModified** **Token**  
An issue was spotted in Drupal’s Schema.org markup: **dateModified** **was incorrectly showing the creation date**, resulting in duplicate “creation date” values in the structured data.

**✨ What’s fixed:**  
 **To ensure Google and other search engines read the right update date:**  
 **✅** **dateModified** **now uses the correct token:** **\[node:changed:html\_datetime\]**  
 **✅ Schema.org markup no longer repeats the creation date twice**  
 **✅** **datePublished** **remains unchanged and continues to display the correct creation date**  
 **✅ Consistent, accurate structured data across nodes for better SEO clarity**  
  
**🔐** **Draft Page Listing Fixed for Token Access:**

When draft pages were accessed via a **temporary access token**, listing views could fail to load and appear empty, even though content existed. This mainly affected pages which are using **Content Push Tag** listings.

### **✨ What’s fixed:**

✅ Listings now load correctly when the draft pages are accessed via a token

✅ Results shown via token access do match admin and published views

✅ No more empty or broken listings for reviewers

✅Legacy behaviour restored with no regression or logged-in users

---

### **Improvements** **💪**  


#### 🖼️ **Automatic Pictogram Import for Newly Created Sites**

New sites created in the Site Factory now automatically include the full set of default pictograms and business stamps. Previously, admins had to request a manual migration to load pictograms on newly created sites. This behaviour has now been fully automated.

***✨ What’s improved:***

#### ✅ When a new site is created, **all 65 default pictograms** (62 pictograms + 3 business stamps) are automatically uploaded to the site’s media library  
✅ Sites created through **full duplication** correctly inherit all pictograms from the source site without creating duplicates  
✅ No developer action or manual migration is required anymore (previous workaround removed)  
✅ Pictograms are available immediately and usable across components such as the **Hero Banner**  
  
🧩 **HP Solutions Items Can Now Be Deleted on VWT Sites**  
On **Veolia Water Technologies** websites, editors were unable to delete **HP Solutions media items**. The only available action was *“Copy to another place”*, which blocked proper content cleanup on:

- [www.veoliawatertechnologies.com](http://www.veoliawatertechnologies.com)
- [www.veoliawatertechnologies.pl](http://www.veoliawatertechnologies.pl)

This limitation was caused by a **content governance state issue on paragraphs**, preventing deletion actions from appearing.

✨ **What’s improved:**  
To restore expected back-office behaviour for VWT teams:

✅ The **“Delete” option** is now available for HP Solutions media items  
✅ Editors can fully manage (edit / remove) HP Solutions on both VWT Corporate and Poland sites  
✅ Paragraphs are now correctly set to the **Local Subscriber** governance state  
✅ A dedicated batch process ensures existing HP Solutions items are updated consistently across subscriber sites

This brings HP Solutions management back in line with standard editorial workflows and avoids unnecessary content duplication.

---

Thank you for your continued support and feedback. Stay tuned for the next release, already in development! 🌟

*Site Factory*

---



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v138 🔩

### *(August 2025)*

### Bug Fixes 🩹

#### 🛠️ Fatal error on site settings save (Watertech site)

Saving updates in the site settings page—for example, to add or update media in the service button or CTA section—resulted in PHP errors and critical log entries.

This has now been fixed. A successful save now provides confirmation, and changes are correctly saved without errors.

#### 🎨 CKEditor Color Palette Issue

The CKEditor color selection was no longer displaying the full set of predefined website colors (e.g. dark green, forest green, black 10/20/30). Only a limited number of colors appeared, even after clearing the Drupal and Site Factory caches.

   ![color bug in Drupal](/sites/g/files/dvc2391/files/styles/default/public/image/2025/10/image%20%281%29.png.webp?itok=Ln3IMLG0)   



This issue has now been fixed, and the complete color palette—matching Veolia’s brand guidelines—is once again available in the editor.

   ![colors in Drupal ](/sites/g/files/dvc2391/files/styles/default/public/image/2025/10/image.png.webp?itok=mwWuNWUy)   



#### 🌈 CKEditor text colors not displayed on front-end ( Only for [veolia.com](http://veolia.com) ) 

#### Following changes to the CKEditor color configuration, some text with custom colors appeared correctly in the editor but displayed as black on the front end, specifically on the [veolia.com](http://veolia.com) site

   ![ CKEditor color](/sites/g/files/dvc2391/files/styles/default/public/image/2025/10/unnamed%20%281%29.png.webp?itok=TMivMSC5)   



This issue has now been fixed, and the text colors defined in the editor are properly rendered on the front-end pages.

   ![CKEditor text colors bug fixed ](/sites/g/files/dvc2391/files/styles/default/public/image/2025/10/image%20%282%29.png.webp?itok=CTP2db3e)   



---



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v137 🔧

### *(July 2025)*

### Improvements 💪

#### 🆕 Veolia Experts Blog Project

A new **"Blog" content type** has been created to centralize all blog content, facilitate future upgrades, and integrate all components available in the standard "Page" type.

This new type supports a **full-width title**, works without a mandatory Hero Banner, and includes a **clickable hashtags/filters system** (for future enhancement).

Discover the blog pages with a fresh and consistent style and design.

   ![blog template ](/sites/g/files/dvc2391/files/styles/default/public/image/2025/08/unnamed%20%281%29.png.webp?itok=kI0hbjZo)   



#### 🌍 Single Content Sync – Multi-language Import Enabled

It is now possible to import content in a different language than the one it was originally exported in.

**Steps to Export:**

1. Log in to the site as Administrator or Site Manager.
2. Go to the content listing page: /admin/content.
3. For the content you want to export, click the **Edit** button dropdown and select **Export.**
4. Click Download as **a zip with all assets**.  
     **DO NOT** check the **Include all translations box**.
5. The zip file will be downloaded.

**Steps to Import:**

1. Log in to the site where you want to import the content.
2. Go to the content listing page and click on the **Import tab**: /admin/content/import.
3. Make sure a language dropdown appears above the Import button.
4. This dropdown only shows languages enabled in the site’s language switcher.Select the desired language, import the content, and verify the import was successful.

#### 🌐 Removal of hreflang Tags for Hidden Languages

Hreflang tags are no longer generated for languages that are hidden in the site’s language switcher. This helps avoid **SEO issues** related to inaccessible language versions.

   ![Removal of hreflang tags for hidden languages code screenshot](/sites/g/files/dvc2391/files/styles/default/public/image/2025/08/unnamed%20%282%29.png.webp?itok=topDTnDY)   




### Bug Fixes 🩹

#### 🖼️ Shared Banner Images Issue on Live and Draft KDC Pages (UK Only)

In the UK KDC Decommissioning pages, banner images were linked across live and draft pages, causing changes on one page to affect all others. This issue affected only the UK site and has now been addressed so that each page’s banner can be managed independently.


#### 🔠 Hyphenation Issue on Webform Checkboxes (UK Site)

Although text hyphenation is enabled on[ https://www.veolia.co.uk/](https://www.veolia.co.uk/), it was not applied to the text in the webform checkboxes. This has now been fixed, and hyphenation is correctly displayed in the webform checkboxes.


#### 🔔 Popin Block Display Issue Fixed

Previously, admin users saw the popin block appearing unexpectedly at the bottom of the back office.

Now, the popin block is only shown as a popup on the front-end pages for site visitors, and no longer appears on admin pages. Admins and content contributors can still manage the popin block without it displaying on the back office.

#### ❌ Bulk Deletion of Selected Items Fails

When trying to delete around 50 items at once using the “Delete selected entities/translations” option, the operation was failing. This issue has now been addressed to allow smooth deletion of multiple items in bulk.

   ![Bulk deletion of selected items fails](/sites/g/files/dvc2391/files/styles/default/public/image/2025/08/unnamed%20%283%29.png.webp?itok=GhKjAEm6)   



#### 🔧 Buttons Display Issue on Last Component

The “Duplicate” and “Copy to another place” buttons were not showing correctly on the last component of a page.

This display issue has been fixed, so these buttons now appear properly on all components.

   ![Buttons display issue on last component](/sites/g/files/dvc2391/files/styles/default/public/image/2025/08/unnamed%20%284%29.png.webp?itok=42ym4K50)   



#### 🔗 Multiple Choices Links Block Display Fixed

The values added in the Multiple Choices Links Block were not appearing correctly on the front-end, especially the second dropdown values. This issue has been fixed, and all dropdown values now display properly.

   ![Multiple choices links block display ](/sites/g/files/dvc2391/files/styles/default/public/image/2025/08/unnamed%20%285%29.png.webp?itok=L6YCfIz7)   



---



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v135 + v136 📢 

### *(July 2025)*

✅ Replacement of TheSans font by Noto Sans

✅ Update of social network icons

ℹ️ Note: The webp converter initially planned for this release has been postponed to a later version (end of July or next release in August) due to technical problems encountered during testing.

---









 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v133 🛠️

### *(Mai 2025)*

### Improvements 💪

#### Enable Import/Export access for Site Managers 🔓

Following the page template project, the Import/Export button is now accessible to Site Managers. The export issue on solution pages has been fixed. Zip files can now be prepared and shared easily between websites. This is currently only for the pilot websites in this project.

   ![importation gif ](/sites/g/files/dvc2391/files/styles/default/public/image/2025/08/unnamed.gif?itok=CtMm1cwT)   




#### Tab order updated in "Technologies" template for watertechnologies sites 🔄 

The tab order in the 'Technologies' template in the VWT RCP has been updated: the 'Product range' tab now appears before the 'Resources' tab.

   !["Technologies" template](/sites/g/files/dvc2391/files/styles/default/public/image/2025/08/unnamed_0.png.webp?itok=LMT58E62)   



---



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v132 ⚙️

### *(Avril 2025)*

### Improvements 💪

#### 💬 Webform popup integration enabled

Webforms can now be opened in popups via menu links or the text editor using predefined CSS classes. This improves flexibility and simplifies user interactions. Documentation has been updated accordingly.

   ![Webform popup](/sites/g/files/dvc2391/files/styles/default/public/image/2025/04/5.PNG.webp?itok=eZ1M1osW)   



#### To add a webform popup link in the menu:

First, go to **Admin** &gt; **Structure** &gt; **Menus** on your site. Then, select the menu that contains the link to the webform. After that, scroll down to the **Attributes** section in the menu link form. In the **Classes** field, add one of the following classes to set the popup width:

- For narrow: webform-dialog webform-dialog-narrow
- For normal: webform-dialog webform-dialog-normal
- For wide: webform-dialog webform-dialog-wide

   ![add a webform popup link in the menu](/sites/g/files/dvc2391/files/styles/default/public/image/2025/04/202504171458%20%285%29.gif?itok=tMBxX7G_)   



#### To add a webform popup link in the text editor:

Go to the page where you want to add the webform link. In edit mode, insert the link into the text. Open the **Advanced** section of the link options. Then, add the appropriate classes (e.g. webform-dialog webform-dialog-normal). finally, click **Save** to apply the changes.

   ![ add a webform popup link in the text editor](/sites/g/files/dvc2391/files/styles/default/public/image/2025/04/202504181021.gif?itok=MIQ5_D4r)   



### Bug Fixes 🩹

#### 🔗 Watertech – Links media creation fixed in media browser

The issue preventing the creation of Links media through the media browser has been resolved. Users can now add Links media without errors.

#### 🌐 Unable to display translated breadcrumb item

The issue preventing the 'Events' breadcrumb item from displaying in Chinese, despite being translated, has been fixed. The translation now appears correctly as expected.

#### ✔️ Dropdown menu display on Web-to-Lead Forms (VWT Sites)

The issue with the dropdown menu not displaying correctly on the French contact page of veoliawatertechnologies.com has been resolved. This bug, affecting all VWT websites using Salesforce Web-to-Lead, is now fixed and the form displays properly across all sites.

   ![Dropdown menu display on Web-to-Lead Forms](/sites/g/files/dvc2391/files/styles/default/public/image/2025/04/6.PNG.webp?itok=ThZu5rEo)   



---



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v131🔧

### *(Mars 2025)*

### Improvements 💪

#### 📈 SEO Improvements – mandatory fields for better optimization

To enhance SEO performance, several fields have been made mandatory across all content type:

- **Alternative Text** – The alternative text field is now required for all image media entities to improve accessibility and search engine indexing.
- **Meta Tags** – Title and description fields must now be filled in for all content types. Additionally, default values for these fields have been removed to encourage custom optimization.
- **Guidance for Users** – If you need further assistance, you can refer to [this article](https://oneintranet.veolia.com/home/ls/space/5291917060341760/site-factory-champions/article/2cb07b9c-8272-4a1c-af65-ba20de2b9bc0).
- **Clear Error Message****s** – If required metatag fields are missing, site managers will now receive clearer error messages to facilitate correction.

**Important Note**: This will not impact existing pages; you only need to add it for new pages or when updating an existing page.

   ![altenative text](/sites/g/files/dvc2391/files/styles/default/public/image/2025/04/1.PNG.webp?itok=fb30e-Km)   



   ![metatags](/sites/g/files/dvc2391/files/styles/default/public/image/2025/04/%5BNEW%5D%20-%20Release%20notes%20v131%20_%20-%20Google%20Docs.gif?itok=Wyz-H-K5)   



   ![error message metatags](/sites/g/files/dvc2391/files/styles/default/public/image/2025/04/2.PNG.webp?itok=ktPiKiyt)   




#### 🚫 Breadcrumb improvement – removal of dropdown menu

The dropdown menu in the breadcrumb navigation has been removed to **enhance SEO, accessibility, and crawlability**. This update ensures:

- **Better search engine crawling**
- **Improved user experience**
- **EnhancedaAccessibility**

   ![Breadcrumb improvement](/sites/g/files/dvc2391/files/styles/default/public/image/2025/04/3.PNG.webp?itok=dSWck50d)   




#### 💼 Business Case Content Type Now Available on All VWT Websites

The Business Case content type, previously exclusive to the RCP, is now accessible across all **VWT websites**.

### Bug Fixes 🩹

####   
 🎨 Webforms Update: Select Field with Choices.js Now Matches Theme

We've updated the Select field using Choices.js to ensure it aligns with our webform theme. 🚀

   ![Webforms](/sites/g/files/dvc2391/files/styles/default/public/image/2025/04/4.PNG.webp?itok=owMEL7L3)   



#### ⚠️ Draft Page Visibility Issue Resolved

An issue preventing webmasters from viewing draft pages due to a 404 error has been resolved. The problem was linked to language settings affecting draft accessibility. Adjustments have been made to ensure draft pages are always viewable by Administrators and Site Managers.

---



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v127 + v128 + v129🔧

#### *(February 2025)*

### Improvements 💪

#### Bilibili Video Integration (China only)🎥

You can now embed Bilibili videos on your sites, just like YouTube and Vimeo. The video remains hidden until the user gives consent via Didomi, and once accepted, the video is displayed automatically.

   ![screenshot](/sites/g/files/dvc2391/files/styles/default/public/image/2025/02/Screenshot%202025-02-26%2013.16.51.png.webp?itok=YJKpzdKI)   



#### New Taxonomies for Better Content Organization 🏷️ 

Two new taxonomies have been added, allowing for better categorization and filtering of content. This update makes it easier to organize and display articles based on selected tags.

These taxonomies are fully manageable from the admin panel, giving you more flexibility in structuring your content efficiently. Find the tutorial [here](https://www.sf.userguide.veolia.com/create-specific-list)!

   ![content push example GIF ](/sites/g/files/dvc2391/files/styles/default/public/image/2025/02/202502171509%20%2815%29.gif?itok=EvMNacd5)   



#### UI Color Updates Across Components🎨 

Several components, like Hero Banner, Content Push, and Media, now reflect the new color scheme, ensuring a unified experience. In some components, text and icon colors automatically adjust to the background to meet accessibility standards (e.g., the social media block on the homepage and HP medias). Ensure optimal readability by maintaining proper contrast ratios with[ this tool](https://app.contrast-finder.org/).

The same goes for the Didomi video settings page, which now features updated background color options to make color selection easier.

**Business Banner Stamps Update** 🖼️

The business banner stamps have been updated to adopt the new color scheme, improving accessibility and readability.

   ![business stamp GIF](/sites/g/files/dvc2391/files/styles/default/public/image/2025/02/202502171509%20%2813%29.gif?itok=ohV5DH-5)   



### Bug Fixes 🩹

#### Webform Details Foreground Color 🔤 

The foreground text color in Webform details now displays correctly with white text on both gray and white backgrounds.

   ![Webform image ](/sites/g/files/dvc2391/files/styles/default/public/image/2025/02/Screenshot%202025-02-26%2012.48.50.png.webp?itok=8q8JVUwq)   



#### Webform Attachment Field Font Color 📄 

The font color for the Attachment field is now consistently white across all background settings, improving clarity and readability.

#### Table Border Color in CKEditor 🔲 

The issue with inconsistent table border colors in CKEditor, which was working in Chrome but not in Firefox, has been fixed. Borders now display consistently across both browsers.

   ![edit table ](/sites/g/files/dvc2391/files/styles/default/public/image/2025/02/Screenshot%202025-02-26%2011.05.42.png.webp?itok=KHjWZ27q)   



Preview

   ![table preview](/sites/g/files/dvc2391/files/styles/default/public/image/2025/02/Screenshot%202025-02-26%2011.07.22.png.webp?itok=i-CTVuB-)   



---



 

 

 



 

 

 

 





 



 

  Show more  



 





## Release notes v125 + v126 🔧 

### *(Nov 27, 2024)*

### Improvements 💪

#### Region switcher redesign

🗺️ The map has been removed, streamlining the user experience and enhancing speed and simplicity.

👉 Cross-site sharing is now seamless, ensuring a unified and consistent experience across all platforms

### Bug fixes 🩹

#### Image upload and cropping fix

📷 Image upload now works on the first try, and the cropping tool is fully functional, streamlining the image management process.

#### Auto logout issue resolved

⏳The auto logout delay has been restored, returning to the original duration of several hours instead of just 10 minutes. There will be a notification pop if you are not active for all the tabs.

#### HP Solutions block functionality 🛠️ 

The issue preventing the addition of the HP Solutions block in the VWT Belgium website https://watertechbelgium.veolia.acsitefactory.com has been resolved, enabling seamless content addition within the "Homepage media container".

✅ Error-free integration ensures smooth content editing when selecting the HP Solutions block.


#### Hreflang and Translation Issues Resolved

An issue was reported on [www.industries.veolia.com](http://www.industries.veolia.com/) regarding hreflang tags and translation, which was impacting the site's SEO performance.

- Pages like /node/nid and /en/node/nid will no longer be indexed by search engines.
- The x-default hreflang tag will now point to the correct URL.
- /en/node URLs that were generating duplicate content will now be redirected to a "Page Not Found" page.

Thanks to these fixes, we achieve:  
🌐 Better compatibility for multilingual environments, ensuring proper language redirection and avoiding duplicate content.  
🔗 An optimized URL structure for better SEO performance, with clean and user-friendly links.  
➡️ Correctly configured hreflang tags, improving indexing and user experience across regions.

#### Password Reset Page UI

🖥️ The page now displays correctly across all devices and browsers.

🔒 UI issues on the password reset page have been fixed for a smoother user experience.


#### NEW- Media Duplication

📋 It is now possible to duplicate all types of media effortlessly.

🔄Duplication now works smoothly across all profiles.



 

 

 



 

 

 

 





 



 

  Show more  



 






/*
 * Veolia Site Factory Release Notes — VDS-aligned styling
 * Local scope: .vsf-rn-page / .vsf-rn-generated / .vsf-rn-card
 * Based on accessible VDS tokens: Noto Sans, red #EE0000, dark text
 * #1C1C1F, secondary text #55555A, neutral #F2F1F9/#E9E6F4.
 * The existing page header, breadcrumbs and content are not restyled.
 */
.vsf-rn-page {
  --vsf-red: var(--components-link-primary-link-primary-default, #EE0000);
  --vsf-red-hover: #C90000;
  --vsf-text: var(--semantic-foreground-text-text-title, #1C1C1F);
  --vsf-muted: var(--semantic-foreground-text-text-mention, #55555A);
  --vsf-border: #E9E6F4;
  --vsf-subtle: #F2F1F9;
  --vsf-surface: #FFFFFF;
  --vsf-sticky-top: 170px;
  font-family: 'Noto Sans', Arial, sans-serif;
  color: var(--vsf-text);
  background: transparent;
}
.vsf-rn-page .vsf-rn-generated,
.vsf-rn-page .vsf-rn-card,
.vsf-rn-page .vsf-rn-generated *,
.vsf-rn-page .vsf-rn-card * { box-sizing: border-box; }
.vsf-rn-page .vsf-rn-hidden-original { display: none !important; }
/* The large banner is intentionally not displayed. */
.vsf-rn-page .vsf-rn-hero { display: none !important; }

.vsf-rn-page .vsf-rn-layout {
  display: grid;
  grid-template-columns: 280px minmax(0, 1fr);
  gap: 24px;
  align-items: start;
  width: min(1200px, calc(100% - 40px));
  margin: 24px auto 64px;
}
.vsf-rn-page .vsf-rn-wrapper {
  width: min(1200px, calc(100% - 40px));
  margin-inline: auto;
}
.vsf-rn-page .vsf-rn-sidebar {
  position: sticky;
  top: var(--vsf-sticky-top);
  max-height: calc(100vh - var(--vsf-sticky-top) - 16px);
  min-height: 0;
  z-index: 8;
}
.vsf-rn-page .vsf-rn-sidebar-card {
  display: flex;
  flex-direction: column;
  min-height: 0;
  max-height: inherit;
  overflow: hidden;
  background: var(--vsf-surface);
  border: 1px solid var(--vsf-border);
  border-radius: 8px;
}
.vsf-rn-page .vsf-rn-sidebar-head {
  flex: 0 0 auto;
  padding: 20px 20px 16px;
  color: var(--vsf-text);
  background: var(--vsf-surface);
  border-bottom: 1px solid var(--vsf-border);
}
.vsf-rn-page .vsf-rn-sidebar-head strong {
  display: block;
  font-size: 18px;
  font-weight: 700;
  line-height: 26px;
}
.vsf-rn-page .vsf-rn-sidebar-head span {
  display: block;
  margin-top: 4px;
  color: var(--vsf-muted);
  font-size: 13px;
  line-height: 20px;
}
.vsf-rn-page .vsf-rn-sidebar-body {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
  overflow: hidden;
  padding: 16px;
}
.vsf-rn-page .vsf-rn-search { position: relative; flex: 0 0 auto; margin-bottom: 14px; }
.vsf-rn-page .vsf-rn-search input {
  display: block;
  width: 100%;
  min-height: 44px;
  padding: 10px 12px 10px 38px;
  color: var(--vsf-text);
  background: white;
  border: 1px solid #B8B8CB;
  border-radius: 4px;
  font: inherit;
  font-size: 14px;
  line-height: 22px;
}
.vsf-rn-page .vsf-rn-search input::placeholder { color: var(--vsf-muted); }
.vsf-rn-page .vsf-rn-search::before {
  content: "⌕";
  position: absolute;
  left: 12px;
  top: 50%;
  transform: translateY(-50%);
  color: var(--vsf-muted);
  font-size: 22px;
  pointer-events: none;
}
.vsf-rn-page .vsf-rn-filters {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 14px;
  flex: 0 0 auto;
}
.vsf-rn-page .vsf-rn-filter,
.vsf-rn-page .vsf-rn-action,
.vsf-rn-page .vsf-rn-toggle {
  appearance: none;
  border: 1px solid #9897A8;
  border-radius: 4px;
  background: white;
  color: var(--vsf-text);
  font-family: inherit;
  font-size: 13px;
  font-weight: 700;
  line-height: 20px;
  padding: 9px 12px;
  cursor: pointer;
  transition: background-color .16s ease, border-color .16s ease, color .16s ease;
}
.vsf-rn-page .vsf-rn-filter:hover,
.vsf-rn-page .vsf-rn-action:hover { background: var(--vsf-subtle); border-color: var(--vsf-text); }
.vsf-rn-page .vsf-rn-filter.is-active {
  background: var(--vsf-text);
  border-color: var(--vsf-text);
  color: #fff;
}
.vsf-rn-page .vsf-rn-action {
  width: 100%;
  margin-bottom: 16px;
  flex: 0 0 auto;
}
.vsf-rn-page .vsf-rn-timeline-title {
  flex: 0 0 auto;
  margin: 0 0 8px;
  font-size: 12px;
  line-height: 18px;
  font-weight: 700;
  color: var(--vsf-muted);
  letter-spacing: .03em;
  text-transform: uppercase;
}
.vsf-rn-page .vsf-rn-timeline {
  display: grid;
  align-content: start;
  gap: 4px;
  flex: 1 1 auto;
  min-height: 0;
  max-height: none;
  overflow-y: auto;
  overflow-x: hidden;
  padding-right: 4px;
  padding-bottom: 10px;
  scrollbar-color: #B8B8CB #F2F1F9;
  scrollbar-width: thin;
}
.vsf-rn-page .vsf-rn-timeline button {
  flex-shrink: 0;
  width: 100%;
  padding: 12px;
  text-align: left;
  font-family: inherit;
  background: white;
  border: 0;
  border-left: 3px solid transparent;
  border-radius: 0 4px 4px 0;
  color: var(--vsf-text);
  cursor: pointer;
}
.vsf-rn-page .vsf-rn-timeline button:hover { background: var(--vsf-subtle); }
.vsf-rn-page .vsf-rn-timeline button.is-active {
  border-left-color: var(--vsf-red);
  background: #F2F1F9;
}
.vsf-rn-page .vsf-rn-timeline button strong {
  display: block; font-size: 14px; font-weight: 700; line-height: 20px; color: var(--vsf-text);
}
.vsf-rn-page .vsf-rn-timeline button span {
  display: block; margin-top: 3px; font-size: 12px; line-height: 18px; color: var(--vsf-muted);
}
.vsf-rn-page .vsf-rn-content {
  min-width: 0;
  display: grid;
  align-content: start;
  gap: 18px;
}
.vsf-rn-page .vsf-rn-card {
  width: 100% !important;
  max-width: none !important;
  margin: 0 !important;
  padding: 0 !important;
  overflow: hidden;
  background: var(--vsf-surface);
  border: 1px solid var(--vsf-border);
  border-radius: 8px;
  box-shadow: none;
  scroll-margin-top: calc(var(--vsf-sticky-top) + 12px);
}
.vsf-rn-page .vsf-rn-card > .container__inner {
  width: 100% !important;
  max-width: none !important;
  margin: 0 !important;
  padding: 0 !important;
}
.vsf-rn-page .vsf-rn-card-header {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: start;
  gap: 18px;
  padding: 24px;
  background: #fff;
  border-bottom: 1px solid var(--vsf-border);
}
.vsf-rn-page .vsf-rn-meta { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 14px; }
.vsf-rn-page .vsf-rn-pill {
  display: inline-flex;
  align-items: center;
  min-height: 25px;
  padding: 4px 9px;
  border-radius: 4px;
  font-size: 12px;
  line-height: 17px;
  font-weight: 600;
  color: var(--vsf-muted);
  background: var(--vsf-subtle);
}
.vsf-rn-page .vsf-rn-pill--latest { background: #FFF0F0; color: #BB0000; }
.vsf-rn-page .vsf-rn-pill--date { background: var(--vsf-subtle); color: var(--vsf-text); }
.vsf-rn-page .vsf-rn-pill--count { background: var(--vsf-subtle); color: var(--vsf-muted); }
.vsf-rn-page .vsf-rn-title {
  margin: 0;
  font-family: 'Noto Sans', Arial, sans-serif;
  color: var(--vsf-text);
  font-size: clamp(22px, 2.3vw, 28px);
  font-weight: 700;
  line-height: 1.3;
  letter-spacing: normal;
}
.vsf-rn-page .vsf-rn-summary {
  margin: 8px 0 0;
  max-width: 72ch;
  font-size: 14px;
  line-height: 23px;
  color: var(--vsf-muted);
}
.vsf-rn-page .vsf-rn-toggle {
  min-height: 44px;
  min-width: 132px;
  background: var(--vsf-red);
  border-color: var(--vsf-red);
  color: white;
  font-size: 14px;
  white-space: nowrap;
}
.vsf-rn-page .vsf-rn-toggle:hover,
.vsf-rn-page .vsf-rn-card.is-open .vsf-rn-toggle:hover {
  background: var(--vsf-red-hover);
  border-color: var(--vsf-red-hover);
}
.vsf-rn-page .vsf-rn-card.is-open .vsf-rn-toggle {
  background: white; border-color: #9897A8; color: var(--vsf-text);
}
.vsf-rn-page .vsf-rn-card .collapsible-container { padding: 0 !important; }
.vsf-rn-page .vsf-rn-card .collapsible-container__content {
  max-height: 0; overflow: hidden; transition: max-height .32s ease;
}
.vsf-rn-page .vsf-rn-card.is-open .collapsible-container__content { overflow: visible; }
.vsf-rn-page .vsf-rn-card .collapsible-container__fade-overlay,
.vsf-rn-page .vsf-rn-card .collapsible-container__trigger { display: none !important; }
.vsf-rn-page .vsf-rn-card .wysiwyg,
.vsf-rn-page .vsf-rn-card .container--wysiwyg,
.vsf-rn-page .vsf-rn-card .container--paragraph,
.vsf-rn-page .vsf-rn-card .paragraph {
  max-width: 900px !important;
  margin-left: auto !important;
  margin-right: auto !important;
}
.vsf-rn-page .vsf-rn-card .wysiwyg {
  padding: 26px 28px 34px;
  color: var(--vsf-text);
  font-family: 'Noto Sans', Arial, sans-serif;
}
.vsf-rn-page .vsf-rn-card .wysiwyg h3 {
  margin: 28px 0 12px;
  font-size: 21px; line-height: 30px; color: var(--vsf-text); font-weight: 700;
}
.vsf-rn-page .vsf-rn-card .wysiwyg h4 {
  margin: 22px 0 12px;
  padding: 11px 15px;
  border-left: 3px solid var(--vsf-red);
  background: var(--vsf-subtle);
  border-radius: 0 4px 4px 0;
  color: var(--vsf-text);
  font-size: 17px; line-height: 26px; font-weight: 700;
}
.vsf-rn-page .vsf-rn-card .wysiwyg p,
.vsf-rn-page .vsf-rn-card .wysiwyg li {
  font-size: 15px; line-height: 1.7; color: var(--vsf-text);
}
.vsf-rn-page .vsf-rn-card .wysiwyg strong { color: var(--vsf-text); }
.vsf-rn-page .vsf-rn-card .wysiwyg a { color: var(--vsf-red); text-decoration: underline; text-underline-offset: 2px; }
.vsf-rn-page .vsf-rn-card .wysiwyg img {
  display: block; max-width: 100%; height: auto;
  margin: 20px auto;
  border-radius: 4px;
  box-shadow: none;
}
.vsf-rn-page .vsf-rn-filter:focus-visible,
.vsf-rn-page .vsf-rn-action:focus-visible,
.vsf-rn-page .vsf-rn-toggle:focus-visible,
.vsf-rn-page .vsf-rn-timeline button:focus-visible,
.vsf-rn-page .vsf-rn-search input:focus-visible {
  outline: 3px solid var(--vsf-red);
  outline-offset: 2px;
}
.vsf-rn-page .vsf-rn-empty {
  display: none; padding: 28px; text-align: center;
  border: 1px dashed #B8B8CB; border-radius: 8px;
  color: var(--vsf-muted); background: white;
}
.vsf-rn-page .vsf-rn-empty.is-visible { display: block; }
.vsf-rn-page .vsf-rn-card.is-hidden { display: none !important; }
@media (max-width: 1050px) {
  .vsf-rn-page .vsf-rn-layout { grid-template-columns: minmax(0, 1fr); }
  .vsf-rn-page .vsf-rn-sidebar { position: static; max-height: none; }
  .vsf-rn-page .vsf-rn-sidebar-card { max-height: none; }
  .vsf-rn-page .vsf-rn-sidebar-body { overflow: visible; }
  .vsf-rn-page .vsf-rn-timeline {
    display: flex; flex-direction: row; overflow-x: auto; overflow-y: hidden;
  }
  .vsf-rn-page .vsf-rn-timeline button { min-width: 180px; width: auto; }
}
@media (max-width: 720px) {
  .vsf-rn-page .vsf-rn-layout,
  .vsf-rn-page .vsf-rn-wrapper { width: calc(100% - 24px); }
  .vsf-rn-page .vsf-rn-layout { gap: 16px; margin-top: 16px; }
  .vsf-rn-page .vsf-rn-card-header { grid-template-columns: 1fr; padding: 20px 16px; }
  .vsf-rn-page .vsf-rn-toggle { width: 100%; }
  .vsf-rn-page .vsf-rn-card .wysiwyg { padding: 20px 16px 28px; }
}
@media (prefers-reduced-motion: reduce) {
  .vsf-rn-page .vsf-rn-card .collapsible-container__content,
  .vsf-rn-page .vsf-rn-filter,
  .vsf-rn-page .vsf-rn-action,
  .vsf-rn-page .vsf-rn-toggle { transition: none !important; }
}
 
/* Official VDS theme mappings, based on VeoliaSecureGPT(1).mhtml.
   The live Site Factory website need not load that theme: fallbacks
   keep the result consistent without importing third-party CSS. */
.vsf-rn-page {
 --vsf-red:var(--components-button-primary-button-primary-background-default,#EE0000);
 --vsf-red-hover:var(--components-button-primary-button-primary-foreground-hover,#EE0000);
 --vsf-ink:var(--semantic-foreground-text-text-title,#000);
 --vsf-body:var(--semantic-foreground-text-text-body,#1C1C1F);
 --vsf-muted:var(--semantic-foreground-text-text-mention,#55555A);
 --vsf-panel:var(--semantic-surface-surface-minimal,#fff);
 --vsf-tint:var(--semantic-surface-surface-subtle,#F2F1F9);
 --vsf-secondary:var(--components-button-secondary-button-secondary-background-default,#D5D3E3);
 --vsf-secondary-ink:var(--components-button-secondary-button-secondary-foreground-default,#1C1C1F);
 --vsf-line:#E9E6F4;
 color:var(--vsf-body);
 background:#fff!important;
}
/* Form and button controls; scoped to generated release UI only. */
.vsf-rn-page .vsf-rn-filter,
.vsf-rn-page .vsf-rn-action,
.vsf-rn-page .vsf-rn-toggle {
 display:inline-flex!important;
 justify-content:center!important;
 align-items:center!important;
 min-height:44px!important;
 padding:10px 16px!important;
 font:700 14px/22px 'Noto Sans',Arial,sans-serif!important;
 text-align:center!important;
 text-transform:none!important;
 letter-spacing:normal!important;
 border:1px solid transparent!important;
 border-radius:var(--components-button-button-radius-round,999px)!important;
 box-shadow:none!important;
 cursor:pointer;
 transition:color .15s ease,background-color .15s ease,border-color .15s ease!important;
}
/* Primary = Veolia brand red */
.vsf-rn-page .vsf-rn-toggle,
.vsf-rn-page .vsf-rn-filter.is-active {
 background:var(--vsf-red)!important;
 border-color:var(--vsf-red)!important;
 color:#fff!important;
}
.vsf-rn-page .vsf-rn-toggle:hover,
.vsf-rn-page .vsf-rn-filter.is-active:hover {
 background:#fff!important;
 border-color:var(--vsf-red)!important;
 color:var(--vsf-red)!important;
}
/* Secondary = neutral filled button */
.vsf-rn-page .vsf-rn-action,
.vsf-rn-page .vsf-rn-filter:not(.is-active),
.vsf-rn-page .vsf-rn-card.is-open .vsf-rn-toggle {
 background:var(--vsf-secondary)!important;
 border-color:var(--vsf-secondary)!important;
 color:var(--vsf-secondary-ink)!important;
}
.vsf-rn-page .vsf-rn-action:hover,
.vsf-rn-page .vsf-rn-filter:not(.is-active):hover,
.vsf-rn-page .vsf-rn-card.is-open .vsf-rn-toggle:hover {
 background:#fff!important;
 border-color:var(--vsf-ink)!important;
 color:var(--vsf-ink)!important;
}
.vsf-rn-page .vsf-rn-filters {gap:8px!important; margin-bottom:16px!important;}
.vsf-rn-page .vsf-rn-filter {flex:0 1 auto;min-height:38px!important;padding:8px 13px!important;font-size:13px!important;}
.vsf-rn-page .vsf-rn-action {width:100%;margin-bottom:20px!important;}
.vsf-rn-page .vsf-rn-search input {
 border:1px solid #9897A8!important;
 border-radius:8px!important;
 box-shadow:none!important;
 background:#fff!important;
 font-family:'Noto Sans',Arial,sans-serif!important;
}
.vsf-rn-page .vsf-rn-search input:focus {outline:2px solid var(--vsf-red)!important;outline-offset:2px!important;}
/* Crisp layout with generous inner white space; eliminate inherited Drupal grey sections. */
.vsf-rn-page .vsf-rn-layout {width:min(1200px,calc(100% - 36px));gap:24px;grid-template-columns:275px minmax(0,1fr);}
.vsf-rn-page .vsf-rn-sidebar-card,
.vsf-rn-page .vsf-rn-card {background:#fff!important;border:1px solid #E0DDEE!important;border-radius:12px!important;box-shadow:none!important;}
.vsf-rn-page .vsf-rn-sidebar-head,
.vsf-rn-page .vsf-rn-sidebar-body,
.vsf-rn-page .vsf-rn-card-header {background:#fff!important;}
.vsf-rn-page .vsf-rn-card .collapsible-container,
.vsf-rn-page .vsf-rn-card .collapsible-container__content,
.vsf-rn-page .vsf-rn-card .container__inner,
.vsf-rn-page .vsf-rn-card .container--container-paragraph,
.vsf-rn-page .vsf-rn-card .container--wysiwyg,
.vsf-rn-page .vsf-rn-card .wysiwyg {background-color:#fff!important;}
.vsf-rn-page .vsf-rn-card .wysiwyg {padding:28px 30px 36px!important;}
.vsf-rn-page .vsf-rn-card-header {padding:26px 28px!important;}
.vsf-rn-page .vsf-rn-title {font-size:clamp(22px,2.1vw,29px)!important;font-weight:700!important;line-height:1.32!important;color:var(--vsf-ink)!important;}
.vsf-rn-page .vsf-rn-summary {color:var(--vsf-muted)!important;}
.vsf-rn-page .vsf-rn-pill {background:var(--vsf-tint)!important;color:var(--vsf-body)!important;border-radius:6px!important;font-weight:600!important;}
.vsf-rn-page .vsf-rn-pill--latest {background:#FFEAEA!important;color:#B80000!important;}
.vsf-rn-page .vsf-rn-card .wysiwyg h3 {color:var(--vsf-ink)!important;}
.vsf-rn-page .vsf-rn-card .wysiwyg h4 {background:var(--vsf-tint)!important;border-left:4px solid var(--vsf-red)!important;border-radius:0 6px 6px 0!important;color:var(--vsf-body)!important;}
.vsf-rn-page .vsf-rn-card .wysiwyg p,
.vsf-rn-page .vsf-rn-card .wysiwyg li {color:var(--vsf-body)!important;}
.vsf-rn-page .vsf-rn-timeline button {border-radius:6px!important;}
.vsf-rn-page .vsf-rn-timeline button.is-active {background:var(--vsf-tint)!important;border-left:3px solid var(--vsf-red)!important;}
/* Drupal narrow-view / scrollbar safety. */
.vsf-rn-page .vsf-rn-layout,
.vsf-rn-page .vsf-rn-content,
.vsf-rn-page .vsf-rn-card {min-width:0!important;}
.vsf-rn-page .vsf-rn-card .wysiwyg img {max-width:100%!important;height:auto!important;}
.vsf-rn-page .vsf-rn-card .wysiwyg table {max-width:100%!important;display:block;overflow-x:auto;}
@media(max-width:1050px){.vsf-rn-page .vsf-rn-layout{grid-template-columns:minmax(0,1fr)!important;}}
@media(max-width:720px){.vsf-rn-page .vsf-rn-layout{width:calc(100% - 24px)!important;}.vsf-rn-page .vsf-rn-card-header{padding:20px 16px!important;}.vsf-rn-page .vsf-rn-card .wysiwyg{padding:20px 16px 28px!important;}.vsf-rn-page .vsf-rn-toggle{width:100%!important;}}
@media(prefers-reduced-motion:reduce){.vsf-rn-page .vsf-rn-toggle,.vsf-rn-page .vsf-rn-filter,.vsf-rn-page .vsf-rn-action{transition:none!important;}}
 
(function () {
  function ready(fn) {
    if (document.readyState !== "loading") fn();
    else document.addEventListener("DOMContentLoaded", fn);
  }

  ready(function () {
    var page =
      document.querySelector("article.readspeaker-content") ||
      document.querySelector("main") ||
      document.body;

    if (!page) return;

    function cleanPreviousVersions() {
      Array.prototype.slice.call(
        page.querySelectorAll(
          ".vsf-rn-generated, .vsf-release-intro, .vsf-release-toolbar, .vsf-release-shell, .vsf-release-empty, .vsf-release-card__head"
        )
      ).forEach(function (el) {
        if (!el.classList.contains("paragraph--type--par-collapsible-container")) {
          el.remove();
        }
      });

      Array.prototype.slice.call(
        document.querySelectorAll(".vsf-rn-card, .vsf-release-card")
      ).forEach(function (card) {
        card.classList.remove("vsf-rn-card", "vsf-release-card", "is-open", "is-hidden");
      });

      Array.prototype.slice.call(
        document.querySelectorAll(".vsf-rn-hidden-original, .vsf-release-original-heading")
      ).forEach(function (el) {
        el.classList.remove("vsf-rn-hidden-original", "vsf-release-original-heading");
      });

      page.removeAttribute("data-vsf-rn-enhanced");
      page.classList.remove("vsf-rn-page");
    }

    cleanPreviousVersions();

    if (page.dataset.vsfRnEnhanced === "true") return;
    page.dataset.vsfRnEnhanced = "true";
    page.classList.add("vsf-rn-page");

    var cards = Array.prototype.slice.call(
      page.querySelectorAll(".paragraph--type--par-collapsible-container")
    ).filter(function (card) {
      return card.querySelector("h2");
    });

    if (!cards.length) return;

    function updateStickyTop() {
      var fixedElements = Array.prototype.slice.call(document.body.querySelectorAll("*")).filter(function (el) {
        var style = window.getComputedStyle(el);
        var rect = el.getBoundingClientRect();

        return (
          el.offsetParent !== null &&
          (style.position === "fixed" || style.position === "sticky") &&
          rect.top <= 5 &&
          rect.height > 20 &&
          rect.height < 180 &&
          !el.closest(".vsf-rn-generated")
        );
      });

      var height = 24;

      fixedElements.forEach(function (el) {
        var rect = el.getBoundingClientRect();
        height += rect.height;
      });

      height = Math.min(Math.max(height, 110), 230);
      page.style.setProperty("--vsf-sticky-top", height + "px");
    }

    updateStickyTop();
    window.addEventListener("resize", updateStickyTop);
    /* Sticky offset recalculates on resize; scroll polling removed. */

    function getText(el) {
      return el ? el.textContent.replace(/\s+/g, " ").trim() : "";
    }

    function cleanTitle(value) {
      return String(value || "")
        .replace(/^\[NEW\]\s*/i, "")
        .replace(/\s+/g, " ")
        .trim();
    }

    function escapeHtml(value) {
      return String(value || "")
        .replace(/&/g, "&amp;")
        .replace(/, "&lt;")
        .replace(/>/g, "&gt;")
        .replace(/"/g, "&quot;")
        .replace(/'/g, "&#039;");
    }

    function detectCategories(value) {
      var lower = value.toLowerCase();
      var categories = [];

      if (lower.indexOf("improvement") !== -1) {
        categories.push({ key: "improvements", label: "Improvements" });
      }

      if (
        lower.indexOf("bug fix") !== -1 ||
        lower.indexOf("bug fixes") !== -1 ||
        lower.indexOf("fixed") !== -1
      ) {
        categories.push({ key: "bug-fixes", label: "Bug fixes" });
      }

      if (
        lower.indexOf("technical") !== -1 ||
        lower.indexOf("maintenance") !== -1 ||
        lower.indexOf("module") !== -1
      ) {
        categories.push({ key: "technical", label: "Technical" });
      }

      if (
        lower.indexOf("good to know") !== -1 ||
        lower.indexOf("tutorial") !== -1 ||
        lower.indexOf("reminder") !== -1
      ) {
        categories.push({ key: "guidance", label: "Guidance" });
      }

      if (!categories.length) {
        categories.push({ key: "updates", label: "Updates" });
      }

      return categories;
    }

    function setCardOpen(card, shouldOpen) {
      var content = card.querySelector(".collapsible-container__content");
      var button = card.querySelector(".vsf-rn-toggle");

      card.classList.toggle("is-open", shouldOpen);

      if (content) {
        content.style.maxHeight = shouldOpen ? content.scrollHeight + 160 + "px" : "0px";
      }

      if (button) {
        button.textContent = shouldOpen ? "Close release" : "View release";
        button.setAttribute("aria-expanded", shouldOpen ? "true" : "false");
      }
    }

    function refreshOpenCards() {
      cards.forEach(function (card) {
        if (card.classList.contains("is-open")) {
          setCardOpen(card, true);
        }
      });
    }

    var releaseData = cards.map(function (card, index) {
      var titleEl = card.querySelector("h2");
      var dateEl = card.querySelector("h3");
      var fullText = getText(card);
      var title = cleanTitle(getText(titleEl));
      var date = getText(dateEl);
      var categories = detectCategories(fullText);
      var updateCount = card.querySelectorAll("h4").length;

      if (titleEl) titleEl.classList.add("vsf-rn-hidden-original");
      if (dateEl) dateEl.classList.add("vsf-rn-hidden-original");

      card.classList.add("vsf-rn-card");
      card.dataset.vsfRnSearch = fullText.toLowerCase();
      card.dataset.vsfRnCategories = categories.map(function (cat) {
        return cat.key;
      }).join(",");

      var header = document.createElement("div");
      header.className = "vsf-rn-card-header vsf-rn-generated";

      header.innerHTML =
        '<div>' +
          '<div class="vsf-rn-meta">' +
            (index === 0 ? '<span class="vsf-rn-pill vsf-rn-pill--latest">Latest' : "") +
            '<span class="vsf-rn-pill vsf-rn-pill--date">' + escapeHtml(date || "Release note") + '' +
            '<span class="vsf-rn-pill vsf-rn-pill--count">' + updateCount + ' update' + (updateCount > 1 ? "s" : "") + '' +
            categories.map(function (cat) {
              return '<span class="vsf-rn-pill">' + escapeHtml(cat.label) + '';
            }).join("") +
          '

' + '## ' + escapeHtml(title) + '

' + 'Browse the changes and improvements included in this release.

' + '

' + 'View release'; var inner = card.querySelector(".container__inner") || card; var collapsible = card.querySelector(".collapsible-container"); if (collapsible) { inner.insertBefore(header, collapsible); } else { inner.insertBefore(header, inner.firstChild); } var button = header.querySelector(".vsf-rn-toggle"); button.addEventListener("click", function () { setCardOpen(card, !card.classList.contains("is-open")); }); return { card: card, title: title, date: date, categories: categories, updateCount: updateCount }; }); var hero = document.createElement("section"); hero.className = "vsf-rn-wrapper vsf-rn-hero vsf-rn-generated"; hero.innerHTML = 'Veolia Site Factory · Release Notes

' + '## Release updates, redesigned for faster reading.

' + 'Find platform changes, contributor improvements and technical fixes in a clearer release hub with a persistent release list.

' + '' + '**' + releaseData.length + '**release sections

' + '**' + escapeHtml(releaseData\[0\].title.replace(/^Release notes\\s\*/i, "")) + '**latest release

' + '**' + escapeHtml(releaseData\[0\].date || "Updated") + '**latest period

' + '

'; var layout = document.createElement("section"); layout.className = "vsf-rn-layout vsf-rn-generated"; var sidebar = document.createElement("aside"); sidebar.className = "vsf-rn-sidebar"; sidebar.innerHTML = '' + '' + '**Browse releases**' + 'Search, filter and jump directly to a release.' + '

' + '' + '' + '' + '

' + '' + 'All' + 'Improvements' + 'Bug fixes' + 'Technical' + 'Guidance' + '

' + 'Expand all releases' + 'Release list

' + '' + releaseData.map(function (item, index) { return '' + '**' + escapeHtml(item.title.replace(/^Release notes\\s\*/i, "")) + '**' + '' + escapeHtml(item.date || "Release note") + '' + ''; }).join("") + '

' + '

' + '

'; var content = document.createElement("div"); content.className = "vsf-rn-content"; var empty = document.createElement("div"); empty.className = "vsf-rn-empty"; empty.textContent = "No release note matches this search or filter."; var firstCard = cards[0]; /* Hero intentionally omitted for compact VDS page. */ firstCard.parentNode.insertBefore(layout, firstCard); layout.appendChild(sidebar); layout.appendChild(content); cards.forEach(function (card) { content.appendChild(card); }); content.appendChild(empty); var searchInput = sidebar.querySelector("#vsf-rn-search"); var filterButtons = Array.prototype.slice.call(sidebar.querySelectorAll("[data-filter]")); var jumpButtons = Array.prototype.slice.call(sidebar.querySelectorAll("[data-jump]")); var expandButton = sidebar.querySelector("[data-action='expand']"); var currentFilter = "all"; var allExpanded = false; function applyFilters() { var query = searchInput.value.toLowerCase().trim(); var visibleCount = 0; releaseData.forEach(function (item, index) { var matchesSearch = !query || item.card.dataset.vsfRnSearch.indexOf(query) !== -1; var matchesFilter = currentFilter === "all" || item.card.dataset.vsfRnCategories.indexOf(currentFilter) !== -1; var visible = matchesSearch &amp;&amp; matchesFilter; item.card.classList.toggle("is-hidden", !visible); jumpButtons[index].style.display = visible ? "" : "none"; if (visible) visibleCount++; }); empty.classList.toggle("is-visible", visibleCount === 0); refreshOpenCards(); } searchInput.addEventListener("input", applyFilters); filterButtons.forEach(function (button) { button.addEventListener("click", function () { filterButtons.forEach(function (btn) { btn.classList.remove("is-active"); }); button.classList.add("is-active"); currentFilter = button.dataset.filter; applyFilters(); }); }); jumpButtons.forEach(function (button) { button.addEventListener("click", function () { var index = Number(button.dataset.jump); var target = releaseData[index].card; jumpButtons.forEach(function (btn) { btn.classList.remove("is-active"); }); button.classList.add("is-active"); setCardOpen(target, true); target.scrollIntoView({ behavior: "smooth", block: "start" }); }); }); expandButton.addEventListener("click", function () { allExpanded = !allExpanded; releaseData.forEach(function (item) { if (!item.card.classList.contains("is-hidden")) { setCardOpen(item.card, allExpanded); } }); expandButton.textContent = allExpanded ? "Collapse all releases" : "Expand all releases"; }); setCardOpen(cards[0], true); window.addEventListener("resize", refreshOpenCards); Array.prototype.slice.call(page.querySelectorAll("img")).forEach(function (img) { img.addEventListener("load", refreshOpenCards); }); if ("ResizeObserver" in window) { var observer = new ResizeObserver(refreshOpenCards); cards.forEach(function (card) { var contentBlock = card.querySelector(".collapsible-container__content"); if (contentBlock) observer.observe(contentBlock); }); } }); })();