Skip to content

Changelog

DmfGuppyTheme

Every released version of DmfGuppyTheme, newest first.

Theme 18 releases latest 2.8.3RepositoryDocumentation

Compatibility

  • Remove page/product-detail/buy-widget-form.html.twig. It extended @Storefront/storefront/page/product-detail/buy-widget-form.html.twig, which Shopware 6.7 no longer ships, so nothing rendered it. A child theme that overrides the page_product_detail_buy_* blocks was already without effect.

  • Remove the unused selectQuantityThreshold variable from component/buy-widget/buy-widget-form.html.twig. Core has not read it since 6.7.0.

  • A child theme that styles .quantity-field-wrapper > div or .quantity-field-wrapper > label needs a check: the wrapper is now a <fieldset>, and the label is a <legend> placed before the group.

Fixed

  • Fix the left corners of the quantity minus button on the product detail page. The visually hidden <label> was the first child of .input-group, which made the minus button :not(:first-child), and Bootstrap's .input-group > :not(:first-child) rule sets both left radii to 0. GUPPY-102 worked around that with an !important rule that used $input-border-radius, which only looks right while buttons and inputs share a radius; a child theme with its own $btn-border-radius (for example pill buttons) got a different radius on each side of the group. The hidden text now sits outside the group, so the minus button is the first child again and takes its radius from .btn like the plus button. The workaround in scss/component/quantity-selector.scss is removed.

  • Change the quantity wrapper in component/buy-widget/buy-widget-form.html.twig from a <div> to a <fieldset> and the hidden <label> to a <legend> with the component.product.quantitySelect.legend snippet, as in Shopware core. The label had no for attribute and never named the input (the input carries its own aria-label), so a screen reader now announces the group name once instead of nothing.

  • Use a 7/5 column split for the gallery and buy box (cms-block-gallery-buybox) on lg and keep 8/4 from xxl.

Added

  • Add GARAN label block to the buy-widget (buy_widget_garan_label).

Fixed

  • Remove the imageCount <= 5 check that hid the image gallery thumbnail arrows. DmfSplideSlider now hides slider arrows whenever the slides fit, which covers the same case and also adapts to the actual width (GUPPY-329).

Added

  • Remove the USP banner from the theme. It now lives in the DmfUspBanner plugin, which stores it in its own entity per sales channel and per language — the usp tab held one set of texts for every sales channel sharing the theme and had no language dimension at all, so a shop running two languages could only ever show one of them. Gone from the theme: the usp configuration tab with its twelve guppy-usp-* fields, layout/_includes/usp-banner.html.twig, scss/layout/usp-banner.scss, js/usp-banner.plugin.js and the uspBanner.* snippets in all seven locales. The plugin renders into layout_header_top_bar, so the banner still shares the top bar row with the language and currency switchers.

  • Add guppy-topbar-background-color under Header > Header, which is the former guppy-usp-background-color renamed. It always coloured .top-bar-main-wrapper rather than the banner, so it belongs to the top bar and stays in the theme. A live USP banner paints the strip in its own colour and wins over this value while it is shown.

  • Remove the eight disabled guppy-footer-social-media-* fields. They have held nothing since 2.7.12 moved the links to sales channel custom fields, and a disabled field carrying a helpText that explains where the setting went is documentation in the wrong place.

Compatibility

  • The top bar text colour is no longer configurable. guppy-usp-text-color drove both the banner text and the top bar's own text, and only the background was worth keeping at theme level, so .top-bar-main-wrapper now takes $body-color — the same variable its buttons already used.

  • Migration1790121600RemoveRetiredThemeConfigKeys strips the retired guppy-usp-* and guppy-footer-social-media-* keys from config_values on every theme. Shopware merges theme.config_values with theme.json when it renders the theme manager, so a key the file no longer declares has no tab or block to render in and surfaces under "Allgemein" as a loose field. Removing the fields alone would have left exactly the mess that 2.7.12 kept the social media placeholders around to avoid. The social media values were already copied onto the sales channels by Migration1787788800MoveSocialMediaLinksToSalesChannel, which runs first, so nothing is lost there. The USP texts have no such destination — the theme cannot write into a plugin that may not be installed — so a shop that wants to keep its banner has to re-enter the copy in the plugin before updating, or read it back out of a database backup.

Added

  • Ship storefront snippets for fr-FR, es-ES, it-IT, pl-PL and nl-NL under src/Resources/snippet/<xx_YY>/guppy.<xx-YY>.json, alongside the existing de-DE and en-GB files. Shops running these languages previously resolved every Guppy theme string through the en-GB fallback, or rendered a bare key where en-GB did not carry it either. The translations are machine-generated first drafts and have not been reviewed by native speakers; de-DE remains the reference locale that all others are checked against (GUPPY-325).

  • Add composer snippet-parity-check (src/Scripts/snippet-parity-check.mjs), which verifies that every locale carries exactly the keys of guppy.de-DE.json. It also flags dropped %placeholders%, invalid JSON, and a filename Shopware would refuse to register. Drift is worth catching mechanically because its symptom is inconsistent and easy to miss in review. Translator::trans() walks the catalogue fallback chain - the bare language catalogue (fr for fr-FR), then the en_GB / en fallbacks Shopware configures - and when no catalogue in that chain holds the key, Symfony's MessageCatalogue::get() returns the key itself. A key missing from one locale therefore renders either as another language's text or as a bare key such as uspBanner.containerAriaLabel in the markup, depending on which files still carry it. The script is plain Node against the JSON files - no Shopware install and no composer install needed. VERBOSE=1 lists every key per locale (GUPPY-325).

  • Run that check in CI via the check:snippets job in .gitlab-ci.yml, on every push (GUPPY-325).

Fixed

  • Fix two en-GB snippet keys that never resolved. usp-banner.* was renamed to uspBanner.* to match layout/_includes/usp-banner.html.twig, and productDetail.productDetailContact.contaktLinkText to contactLinkText to match component/buy-widget/buy-widget.html.twig. Both keys existed only in guppy.de-DE.json, and de-DE is not in the en-GB fallback chain, so the storefront rendered the literal keys: uspBanner.containerAriaLabel and the five other USP banner strings ended up in the banner's aria-label, its visually hidden heading and its four slider control labels, and productDetail.productDetailContact.contactLinkText in the contact link on the product detail page. Both were pre-existing (GUPPY-325).

Added

  • Move the footer social media links from the theme configuration to sales channel custom fields (guppy_social_media_links, related to sales_channel). Theme configuration is stored per theme, so every sales channel sharing a theme also shared one set of links. Custom fields on sales_channel live in sales_channel_translation, keyed by (sales_channel_id, language_id), so the links are now maintained per sales channel and per language - edit them under Sales Channels > [channel] > Custom fields and use the language switch in the smart bar to set a different link per language (MEIS-42).

Compatibility

  • Migration1787788800MoveSocialMediaLinksToSalesChannel copies the links already held in the theme configuration onto every sales channel in the system default language, so the storefront keeps rendering what it rendered before. It only fills custom fields that carry no value yet and never touches non-default-language rows, so it is safe on shops that have already set links by hand. Run cache:clear before plugin:update: src/Migration/ is absent from an already-compiled container and createMigrationCollection() reads the compiled container, so a stale cache skips the migration silently while the update still reports success (MEIS-42).

  • The eight guppy-footer-social-media-* fields stay in theme.json but are disabled via custom.disabled and carry a helpText pointing at the new location. Deleting them outright would have stranded the stored values under "Allgemein" in the theme manager, because Shopware merges theme.config_values with theme.json and a key missing from the file has no tab or block to render in (MEIS-42).

Changed

  • Restyle the active filter chips in the listing filter panel. The chips and the "reset all" button are rendered by Shopware's listing JS plugin, so their classes are now set through the activeFilterLabelClasses / resetAllFilterButtonClasses plugin options in component/product/listing.html.twig instead of being styled around: filter-active btn btn-sm and filter-reset-all btn btn-sm btn-link (previously btn and btn btn-outline-danger).

  • Give the chips a 32px minimum height and width instead of the 40px they inherited from .btn.btn-sm, tighten their padding to 2px 12px, and centre the items in .filter-panel-active-container. The .filter-active rule is now .filter-active.btn so it matches the specificity of the .btn.btn-sm rule in component/button.scss it needs to override.

Compatibility

  • Verified against Shopware 6.7.13.0. layout/breadcrumb.html.twig is unchanged upstream between 6.7.11.1 and 6.7.13.0 and every overridden block still exists.

  • Support Shopware's BREADCRUMB_REWORK feature flag in layout/breadcrumb.html.twig, page/content/index.html.twig and page/content/product-detail.html.twig. The flag is off by default in 6.7, so the legacy sw_breadcrumb_full path is unchanged; when the flag (or v6.8.0.0) is active the override reads page.breadcrumb / breadcrumbCollection and resolves category URLs via seoUrl('frontend.navigation.page', ...).

  • Read seoUrl and shouldOpenInNewTab off the category entity instead of the category_url() / category_linknewtab() Twig functions. CategoryUrlExtension registers no functions once the v6.8.0.0 flag is active, and Twig resolves function names at compile time, so the breadcrumb template raised a SyntaxError under that flag even though the legacy branch was unreachable. Behaviour is unchanged: for a SalesChannelCategoryEntity those functions returned exactly getSeoUrl() and shouldOpenInNewTab().

  • Iterate searchResult.entities instead of searchResult in the product listing override. Shopware 6.7.13 gated EntitySearchResult::getIterator() behind a v6.8.0.0 deprecation, so direct iteration emitted a deprecation notice on every listing render and raised a hard error under that flag.

  • Forward referrerCategoryId through the product card detail links in card/box-standard.html.twig, so core.listing.buildBreadcrumbByReferrerCategory can build the product breadcrumb from the referring category.

Fixed

  • Fix duplicated breadcrumb separators when BREADCRUMB_REWORK is active - a trailing chevron on category pages and a doubled chevron before the product name on the detail page. The separator no longer depends on the deprecated upstream breadcrumbKeys variable and layout_breadcrumb_placeholder block.

  • Mark the decorative breadcrumb separators aria-hidden="true".

  • Evaluate switch theme config variables through the existing bool() helper instead of > 0. Shopware's theme compiler dumps switch fields as the integers 0 / 1, and 0 is truthy in Sass, so the bare truthy checks would have forced the badge outline, card border, product card protective frame and the product detail contact/buybox borders permanently on whenever a merchant switched them off. bool() also tolerates a null value, which > 0 raised an "Undefined operation" Sass error on (STARCKE-140).

Added

  • Add an out of stock badge for product cards, shown when a product's "Closeout" option is enabled and its stock has dropped below the minimum purchase quantity. Toggle via the new "Show out of stock badge" switch in theme.json (tab: Badges, block badgesOutOfStockConfiguration), with configurable background, text, and outline colours.

Fixed

  • Fix USP banner Splide initialisation to use window.DmfSplide (MEIS-34).

Fixed

  • Fix crash in ExtendedQuantitySelectorPlugin when the +/- buttons are hidden (STARCKE-140).

Fixed

  • Fix CMS section config becoming stale after page save (MEIS-34).

Compatibility

  • Verified against Shopware 6.7.11.1. Storefront/admin builds, theme compile and guppy:theme:sync-check all pass. No breaking changes: the 6.7.11.0 storefront additions (component system, Vite dev-server, theme config as native CSS custom properties, single-file theme.json references, global JS event system, PluginManager.callPluginMethod) are additive and opt-in.

Fixed

  • Add $table-color: $sw-text-color to abstract/variables/bootstrap.scss (section 15. TABLES) to track the new upstream Skin variable introduced in Shopware 6.7.11. No visual change — value matches the existing Guppy text colour; restores sync-check parity.

Fixed

  • Resolve icon theme lookup via request attributes (theme-name / theme-base-name) instead of the shopware.theme Twig global. The global no longer exposes theme.name / theme.parentTheme in Shopware 6.7, which silently broke theme and parent-theme icon resolution in utilities/icon.html.twig.

Fixed

  • Render the Shopware 6.7.10 "Vertrag widerrufen" (revocation request) button in the guppy-default footer variant. The variant fully overrides layout_footer_navigation_hotline_content, which dropped the new core layout_footer_navigation_revocation_button block. The block is now re-exposed via parent() and the cmsPath it depends on is restored in scope.

  • Scope the broad .footer-main-guppy-default link styling to a:not(.btn) so button-anchors (e.g. the revocation button) keep their native .btn padding and colour instead of being styled as text links.

Fixed

  • Add hyphens: auto to the product name in product boxes (GE-73).

Fixed

  • Fix right-click on trackpad opening the context menu and navigating on product cards (GUPPY-291).

  • Restore the d-grid wrapper and remove an invalid parent() call in the buy button label block.

Breaking

  • Removed checkout customization layer: deleted views/storefront/page/checkout/** overrides, all scss/page/checkout/* partials and js/custom-checkout.plugin.js. Storefront now falls back to upstream @Storefront checkout. Sites relying on the guppy-checkout (default / compact) theme variant must restore the templates from 2.6.x or adopt the upstream layout.

  • Removed guppy-checkout field from theme.json.

  • Removed login / register customization: views/storefront/component/account/{login,register}.html.twig, views/storefront/page/account/register/index.html.twig, scss/components/login.scss, scss/page/account/register.scss.

  • SCSS directory renamed scss/components/ → scss/component/ (Bootstrap singular convention). Update any project that imports Guppy partials directly.

  • SCSS partial renamed scss/component/forms.scss → scss/component/form.scss.

  • Flattened scss/skin/shopware/** tree into the regular scss/{base,component,layout,page}/** folders. The app/storefront/src/scss/skin/shopware/base.scss entry was removed from theme.json#style.

  • Removed Dmf\GuppyTheme\Command\GuppyUpgradeScanCommand and its service definition config/services/commands.xml.

Added

  • New CMS section sizing mode extra_wide_width with configurable guppy-container-width-extra-wide (default 2200px).

  • New CMS section custom fields rendered on cms-section-default and cms-section-sidebar:

    • sectionAnchorId → emits id="…" for anchor links.
    • sectionCustomMaxWidth → inline max-width override.
  • Admin: sw-cms-section-config extended with anchor ID input, custom max-width input, and the extra_wide_width sizing option (de-DE / en-GB snippets updated).

  • New console command bin/console guppy:theme:sync-check (with --fix / --verbose-all) wired to src/Scripts/theme-sync-check.mjs — detects drift between Guppy SCSS / theme.json and the upstream Shopware Storefront skin.

  • Storefront plugin registration migrated to dynamic imports (() => import(...)) in main.js for code-splitting.

  • Default Phosphor icons added: paper-clip.svg, push-pin.svg (16×16 grid). Existing icon set extended and normalised.

Changed

  • scss/abstract/variables/bootstrap.scss and custom.scss restructured with documentation header, table of contents and !default flags. Default values previously living in skin/shopware/abstract/variables/* merged into the canonical files.

  • New helper SCSS files: component/cms-block.scss, component/cms-element.scss, component/base-slider.scss, page/account/{address,profile}.scss, page/contact/contact.scss, page/newsletter/newsletter.scss.

Removed

  • @phosphor-icons/web runtime dependency (replaced by bundled SVGs).

  • Legacy skin/shopware SCSS layer (see Breaking changes).

Fixed

  • views/storefront/utilities/icon.html.twig now resolves the active theme through shopware.theme.name and shopware.theme.parentTheme instead of the hard-coded DmfGuppyTheme namespace — multi-theme installs no longer mis-route icon lookups.

  • views/storefront/component/product/card/action.html.twig: block renamed page_product_detail_product_buy_button → component_product_box_action_buy (correct Storefront block context).

  • views/storefront/page/account/order-history/order-item.html.twig: switched extend namespace from deprecated @Shopware to @Storefront.

  • box-standard.html.twig: added brand, price, headlineLevel, headlineClasses, searchTerm, childCount, routeArguments variables consumed by Storefront 6.7 child blocks (MEIS-34).

  • composer.json plugin description bumped from “Shopware 6.5” to “Shopware 6.7”.

Migration guide (child themes / projects importing Guppy SCSS directly)

Replace any @import paths that point at the legacy Guppy SCSS layout. Search the codebase for the patterns on the left and rewrite them to the value on the right:

Old import path New import path
~DmfGuppyTheme/.../scss/components/<file> ~DmfGuppyTheme/.../scss/component/<file>
~DmfGuppyTheme/.../scss/components/forms ~DmfGuppyTheme/.../scss/component/form
~DmfGuppyTheme/.../scss/skin/shopware/base (remove — content merged into scss/base/*)
~DmfGuppyTheme/.../scss/skin/shopware/component/<file> ~DmfGuppyTheme/.../scss/component/<file>
~DmfGuppyTheme/.../scss/skin/shopware/layout/<file> ~DmfGuppyTheme/.../scss/layout/<file>
~DmfGuppyTheme/.../scss/skin/shopware/page/<file> ~DmfGuppyTheme/.../scss/page/<file>
~DmfGuppyTheme/.../scss/skin/shopware/abstract/variables/<file> ~DmfGuppyTheme/.../scss/abstract/variables/<file>

Templates removed by this release (delete or replace with your own sw_extends):

Removed twig Storefront fallback
views/storefront/page/checkout/** @Storefront/storefront/page/checkout/**
views/storefront/component/account/{login,register}.html.twig @Storefront/storefront/component/account/*
views/storefront/page/account/register/index.html.twig @Storefront/storefront/page/account/register/index.html.twig

Theme config (theme.json):

  • Remove any custom snippets / templates that reference theme_config('guppy-checkout') — the key no longer exists.
  • The new key guppy-container-width-extra-wide (default 2200px) can be set if you want to use the new extra_wide_width section sizing mode.

Removed console command:

  • bin/console guppy:upgrade:scan no longer exists. Use bin/console guppy:theme:sync-check for the new (different-purpose) drift detector.