Frontend News from September 16, 2025

Breaking Change

♿️ Listing controls area (via Deferred Template Updates)

Listing controls area updated across all 3G templates (Load more button, Pagination, Go to top link, Items total). The update improves accessibility across these controls with new ARIA attributes, better keyboard focus handling, more semantic markup, and simplified CSS structure.

The change is scheduled for release on October 2, 2025. If you are an addon developer, please review the changes described below now and adjust your addons accordingly. On the release date, these improvements will be rolled out to the majority of customers. E-shops using Deferred Template Updates will have time until October 16, 2025 to modify their customizations and accept the update.

You can preview the changes by running the command shoptet.helpers.enableUpdatePreview('a11y_pagination') in the browser console.

HTML structure changes

We have completely revised the entire section in the footer of item listings (except for the customer section). The previous component wrapped by the .pagination-wrapper is replaced by a component wrapped by .listingControls.


<div class="listingControls" aria-labelledby="listingControlsHeading">
  <h3 id="listingControlsHeading" class="sr-only">Listing controls</h3>

  <div class="loadMore" data-context="products">
    <button class="loadMore__button loadMore__button--products btn btn-secondary js-loadMore__button--products" type="button" aria-controls="products" data-url="/do-domacnosti/strana-4/">Load 9 more </button>
  </div>

  <nav class="pagination" aria-labelledby="paginationTitle paginationStatus">
    <h4 id="paginationTitle" class="sr-only">Pagination</h4>
    <p id="paginationStatus" hidden>You are on page 3 of 4.</p>

    <ul class="pagination__list">
      <li><a class="pagination__link pagination__link--first" href="/do-domacnosti/" aria-label="1, first page">1</a></li>
      <li><a class="pagination__link pagination__link--prev btn btn-secondary" href="/do-domacnosti/strana-2/" aria-label="Previous, page 2"></a></li>
      <li><strong class="pagination__currentPage" aria-current="page">3</strong></li>
      <li><a class="pagination__link pagination__link--next btn btn-secondary" href="/do-domacnosti/strana-4/" aria-label="Next, page 4"></a></li>
      <li><a class="pagination__link pagination__link--last" href="/do-domacnosti/strana-4/" aria-label="4, last page">4</a></li>
    </ul>
  </nav>

  <div class="itemsTotal"><strong>36</strong> items total</div>

  <div class="goToTop">
    <a class="goToTop__button btn btn-secondary" href="#productsListHeading" aria-label="Top of the item list">Top</a>
  </div>
</div>
Area heading

A hidden heading for the listing controls area was added (with class sr-only), using <h3> or <h4> depending on the page structure.

Load more

We switched to a semantic button with consistent, localized labeling. For products and search results, the label includes how many items will be loaded. For discussions and ratings, the label is “Show next results.” This clarifies intent and improves accessibility.

Pagination

Pagination uses a semantic navigation landmark with an off-screen name and status. Items are structured as a list. The current page is indicated with aria-current="page". This provides reliable announcements for screen readers (position and link purpose) and predictable keyboard navigation.

Go to top

The link points to the hidden heading above each listing and behaves as a regular anchor (no JavaScript). This ensures predictable behavior and good keyboard compatibility.

Items total

In Classic and Disco, Items total is now present on mobile only. In other 3G templates, it remains visible as before. This keeps summary information consistent on small screens.

Hidden headings above listings

We added headings for screen readers (with class sr-only) above each listing (products, search results, discussions, ratings, glossary terms, and articles). These headings act as anchor targets for the “Go to top” link and improve navigation for screen reader users.

Example of the heading for products on a category page. ID changes based on the content and location of the listing.

<h2 id="productsListHeading" class="sr-only" tabindex="-1">Výpis produktů</h2>

CSS Changes

Button appearance in listing controls

Buttons are styled per template as secondary (less prominent) buttons.

JavaScript changes

Scripts handling new item loading via the Load more button and the pagination were updated for accessibility (announcer & focus) and consistency.

While new items are loading, a page overlay with a spinner is displayed across all listings (including search results). A screen reader announcement indicates the loading state; once items are loaded, focus moves to the first newly loaded item.

Newly inserted items are revealed with a light fade-in animation, managed by shoptet.animations.fadeIn(elements), which toggles the .fade-in and .start classes.

Scrolling & offsets

We moved from custom JavaScript scroll to browser-native scrolling with a CSS offset. New CSS tokens handle the effective offset for a fixed header and temporary messages. This solution allows the browser to properly align targets using scroll-padding-top, including anchor links (which work without JavaScript) and respects prefers-reduced-motion.

New tokens and CSS

We have added these tokens and CSS.


:root {
  --scroll-offset: var(--scroll-offset-override, var(--scroll-offset-runtime, 0px));
  --scroll-extra-offset: 0px;
}

html {
  scroll-behavior: smooth;
  scroll-padding-top: max(var(--scroll-offset, 0px), var(--scroll-extra-offset));
}

@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }
}

Changes to the scrollToEl function

The legacy global scrollToEl has been deprecated and replaced with shoptet.scroll.scrollToEl(el). See the function definition: https://github.com/shoptet/templates-assets/blob/master/00/js/modules/scroll.js. The new shoptet.scroll.scrollToEl(el) computes and temporarily sets --scroll-extra-offset when a message is present, then restores it after scrolling.

Please replace any usage of window.scrollToEl($el) with shoptet.scroll.scrollToEl(el).
If you are using our JavaScript but not our CSS, set scroll-padding-top and scroll-behavior to html and custom properties as mentioned above.


New Features

Script for Dual Currency Display in Bulgaria

We have introduced a script for double currency for Bulgaria. You can read the details here: Script for Dual Currency Display in Bulgaria (BGN + EUR).


Improvements

Trailing slash redirect

The URL without the trailing slash is now redirected as a permanent, not temporary redirect.

♿️ Skip link for the sidebar

We added a skip link that enables skipping the sidebar, which helps navigation.

♿️ Removal of text transformation in the checkout

We removed the text transform “soft validator”, for example, the first capital letter.


Bugfixes

Zoom effect

We have fixed a zoom effect on the product detail image, which was caused by smaller image dimensions.

Discussion replies nesting

We have fixed the margin for nested replies in the discussions.

Carousel arrows – Samba template

We have fixed the navigation arrow position in the carousel on Samba.

Carrier logo in Samba checkout

We have fixed the misalignment of the carrier logo in the Samba template.

Back to the button – Step template

We have fixed the back to the shop in the Step template in the cart.

Tango template availability and stock color

We have unified the color of the stock and availability in the Tango template.

Techno template H1 deduplication

We have removed the duplicate of H1 in the product detail.


Upcoming Improvements

Please note: the above outlook for 14 days is subject to change due to unexpected events or changes in priorities – we do not commit to delivering these outputs and outcomes. Thank you for your understanding.

Post navigation