{% sw_extends '@Storefront/storefront/base.html.twig' %}
{% block base_stylesheets %}
{{ parent() }}
{% endblock %}
{% block base_body %}
{# PayOne does not set controllerName and controllerAction -> fix that for easier styling #}
{% if activeRoute starts with 'frontend.account.payone.card' %}
{% set controllerName = 'payone' %}
{% set controllerAction = activeRoute|split('.')|last %}
{% endif %}
{% if activeRoute starts with 'frontend.beefclub.membership' %}
{% set controllerName = 'accountprofile' %}
{% set controllerAction = activeRoute|split('.')|last %}
{% endif %}
{% set doncarneConfig = config("DonCarneTheme.config") %}
{{ parent() }}
{% endblock %}
{% block base_header_inner %}
{% sw_include '@Storefront/storefront/layout/header/top-bar.html.twig' %}
{{ parent() }}
{% endblock %}
{% block base_footer %}
{% sw_include '@Storefront/solution360/newsletter.html.twig' %}
{{ parent() }}
{% endblock %}
{% block base_offcanvas_navigation %}
{% if page.header.navigation %}
{# always start with is root #}
<div class="d-none js-navigation-offcanvas-initial-content is-root">
{% block base_offcanvas_navigation_inner %}
{% sw_include '@Storefront/storefront/layout/navigation/offcanvas/navigation.html.twig' with { navigation: page.header.navigation } %}
{% endblock %}
</div>
{% endif %}
{% endblock %}
{% block base_script_hmr_mode %}
{{ parent() }}
{# Custom CSS - Nach allen anderen Styles laden #}
<style>
/* Wishlist Button transparent machen */
.product-wishlist.wishlist-inline .product-wishlist-action-circle {
background-color: transparent !important;
}
.product-wishlist.wishlist-inline .product-wishlist-action-circle:hover,
.product-wishlist.wishlist-inline .product-wishlist-action-circle:focus,
.product-wishlist.wishlist-inline .product-wishlist-action-circle:active {
background-color: transparent !important;
}
.product-wishlist.wishlist-inline .product-card__wishlist-btn {
background-color: transparent !important;
border: none !important;
}
.product-wishlist.wishlist-inline .product-wishlist-btn {
background-color: transparent !important;
border: none !important;
}
/* ====================================================================== */
/* PRODUKTKARTEN: PREIS UND BOOKMARK AM UNTEREN RAND FIXIEREN */
/* ====================================================================== */
/* Listing-Row als Flexbox-Container */
.cms-element-product-listing .cms-listing-row,
.cms-listing-row {
display: flex !important;
flex-wrap: wrap !important;
}
/* Listing-Spalte (Grid-Container) auf volle Höhe */
.cms-listing-col {
display: flex !important;
flex-direction: column !important;
}
/* Product-Box (ist gleichzeitig .card) auf volle Höhe der Spalte */
.product-box.card {
display: flex !important;
flex-direction: column !important;
height: 100% !important;
}
/* Produkt-Bild: Feste Höhe, nicht mitwachsen lassen */
.product-box.card .product-image-wrapper,
.product-box.card .card-img-top {
flex-shrink: 0 !important;
flex-grow: 0 !important;
}
/* Mobile Zweispalten-Ansicht: Bilder auf 181px Höhe setzen (überschreibt all.css 140px) */
@media (max-width: 767.98px) {
html.mobile-two-column-view .cms-listing-col .product-box .product-image,
html.mobile-two-column-view .cms-listing-col .product-box .product-image.is-standard {
height: 181px !important;
object-fit: cover !important;
}
}
/* Card-Body innerhalb Product-Box auf volle Höhe setzen und als Flex-Container */
.product-box.card > .card-body {
display: flex !important;
flex-direction: column !important;
height: 100% !important;
flex: 1 !important;
}
/* Product-Info innerhalb Product-Box als Flex-Container mit voller Höhe */
.product-box.card .product-info {
display: flex !important;
flex-direction: column !important;
flex: 1 !important;
height: 100% !important;
}
/* Preis-Wishlist-Wrapper am unteren Rand fixieren */
.product-box.card .product-price-wishlist-wrapper {
margin-top: auto !important;
padding-bottom: 0 !important;
}
/* Preis: 10px Abstand zum unteren Rand */
.product-box.card .product-price-wishlist-wrapper .product-price-wrapper {
padding-bottom: 10px !important;
}
/* Bookmark: 15px Abstand zum unteren Rand */
.product-box.card .product-price-wishlist-wrapper .product-wishlist.wishlist-inline {
padding-bottom: 15px !important;
}
.product-card__wishlist-btn {
bottom: 15px;
}
/* ====================================================================== */
/* USP-LISTING: EINHEITLICHE HÖHE */
/* ====================================================================== */
/* USP-Listing auf einheitliche min-height setzen, damit alle Karten gleich hoch sind */
@media (min-width: 992px) {
.product-detail__usps-listing {
min-height: 96px !important;
}
}
.payment-method-label .payment-method-description, .payment-method-label .shipping-method-description, .shipping-method-label .payment-method-description, .shipping-method-label .shipping-method-description {
width: 75%;
}
/* ====================================================================== */
/* CHECKOUT: PSEUDO-BUTTON-LOOK FÜR ZAHLUNGS- UND VERSANDARTEN */
/* ====================================================================== */
.payment-method,
.shipping-method {
margin-bottom: 12px;
}
.payment-method .payment-form-group,
.shipping-method .shipping-form-group {
margin-bottom: 0;
}
.payment-method .payment-method-radio,
.shipping-method .shipping-method-radio {
border-radius: 8px;
padding: 16px;
background-color: #e8e8e8;
border: 2px solid transparent;
transition: all 0.2s ease-in-out;
cursor: pointer;
}
/* Radio Button Position korrigieren */
.payment-method .payment-method-radio input[type="radio"],
.shipping-method .shipping-method-radio input[type="radio"] {
left: 0rem !important;
margin-right: 0.5rem;
}
.payment-method .payment-method-radio:hover,
.shipping-method .shipping-method-radio:hover {
background-color: #dcdcdc;
border-color: #c2ba9c;
}
/* Aktive/ausgewählte Option - Hintergrund */
.payment-method .payment-method-radio:has(input[type="radio"]:checked),
.shipping-method .shipping-method-radio:has(input[type="radio"]:checked) {
background-color: #f0ede4;
border-color: #A89968;
}
.payment-method .payment-method-radio:has(input[type="radio"]:checked):hover,
.shipping-method .shipping-method-radio:has(input[type="radio"]:checked):hover {
background-color: #ebe7db;
}
/* Aktive Option - Goldene Farbe für Titel */
.payment-method .payment-method-radio input[type="radio"]:checked ~ label .payment-method-description strong,
.shipping-method .shipping-method-radio input[type="radio"]:checked ~ label .shipping-method-description strong {
color: #A89968;
}
.payment-method .payment-method-label,
.shipping-method .shipping-method-label {
cursor: pointer;
margin-bottom: 0;
width: 100%;
}
.payment-method .payment-method-description strong,
.shipping-method .shipping-method-description strong {
transition: color 0.2s ease-in-out;
}
/* Logos wieder an die richtige Position */
.payment-method-image,
.shipping-method-image {
margin-right: 0.75rem;
}
/* "Termin wählen" Button verbessern */
.delivery-calendar-toggle {
display: inline-flex !important;
align-items: center !important;
gap: 6px !important;
padding: 6px 12px !important;
border: 1px solid #A89968 !important;
border-radius: 6px !important;
background: #f0ede4 !important;
text-decoration: none !important;
color: #A89968 !important;
font-size: 13px !important;
font-weight: 600 !important;
cursor: pointer !important;
transition: all 0.2s ease !important;
flex-shrink: 0 !important;
white-space: nowrap !important;
margin-top: 6px !important;
}
.delivery-calendar-toggle:hover {
background: #A89968 !important;
color: #282828 !important;
border-color: #A89968 !important;
text-decoration: none !important;
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.delivery-calendar-toggle span:first-child {
font-size: 16px !important;
line-height: 1 !important;
}
</style>
{# Accessibility Fixes #}
{% sw_include '@Storefront/storefront/layout/header/accessibility-fix.html.twig' %}
{# Customer Group Information #}
{% if page.extensions.customerGroupInfo is defined %}
{% set customerGroupData = page.extensions.customerGroupInfo.all() %}
<div id="customerGroupInfo"
class="d-none"
data-customer-group-id="{{ customerGroupData.id|default('')|e('html_attr') }}"
data-customer-group-name="{{ customerGroupData.name|default('')|e('html_attr') }}"
data-is-logged-in="{{ customerGroupData.isLoggedIn|default(false) ? 'true' : 'false' }}">
</div>
<script>
(function() {
var customerGroupInfo = document.getElementById('customerGroupInfo');
if (customerGroupInfo) {
window.customerGroupInfo = {
id: customerGroupInfo.getAttribute('data-customer-group-id'),
name: customerGroupInfo.getAttribute('data-customer-group-name'),
isLoggedIn: customerGroupInfo.getAttribute('data-is-logged-in') === 'true'
};
// Setze Cookie mit Kundengruppen-Information
if (window.customerGroupInfo.isLoggedIn && window.customerGroupInfo.id) {
document.cookie = 'customer_group_id=' + window.customerGroupInfo.id + '; path=/; Secure; SameSite=Lax';
document.cookie = 'customer_group_name=' + encodeURIComponent(window.customerGroupInfo.name) + '; path=/; Secure; SameSite=Lax';
} else {
// Lösche Cookies wenn nicht eingeloggt
document.cookie = 'customer_group_id=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC; Secure; SameSite=Lax';
document.cookie = 'customer_group_name=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC; Secure; SameSite=Lax';
}
}
})();
</script>
{% endif %}
{# SCG Shopping Cart Goals - Flyout Fix #}
<script>
{% verbatim %}
(function() {
// Warte bis PluginManager verfügbar ist
if (!window.PluginManager) {
document.addEventListener('DOMContentLoaded', initSCGFix);
return;
}
initSCGFix();
function initSCGFix() {
// SCG Plugin mit Selector registrieren
setTimeout(function() {
if (window.PluginManager.getPlugin('SCGPlugin')) {
const SCGPluginClass = window.PluginManager.getPlugin('SCGPlugin').get('class');
// Override mit Selector
window.PluginManager.deregister('SCGPlugin');
window.PluginManager.register('SCGPlugin', SCGPluginClass, '[data-scg-plugin]');
// Initialisiere auf allen vorhandenen Elementen
document.querySelectorAll('[data-scg-plugin]').forEach(function(el) {
window.PluginManager.initializePlugin('SCGPlugin', el);
});
}
}, 100);
// Observer für dynamisch geladene SCG-Elemente
const observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
mutation.addedNodes.forEach(function(node) {
if (node.nodeType === 1) {
// Prüfe ob Node selbst data-scg-plugin hat
if (node.getAttribute && node.getAttribute('data-scg-plugin') !== null) {
setTimeout(function() {
if (window.PluginManager.getPlugin('SCGPlugin')) {
window.PluginManager.initializePlugin('SCGPlugin', node);
}
}, 50);
}
// Prüfe ob Kind-Elemente data-scg-plugin haben
else if (node.querySelectorAll) {
const scgElements = node.querySelectorAll('[data-scg-plugin]');
if (scgElements.length > 0) {
setTimeout(function() {
scgElements.forEach(function(el) {
if (window.PluginManager.getPlugin('SCGPlugin')) {
window.PluginManager.initializePlugin('SCGPlugin', el);
}
});
}, 50);
}
}
}
});
});
});
// Beobachte Body für Änderungen
observer.observe(document.body, {
childList: true,
subtree: true
});
}
})();
{% endverbatim %}
</script>
{% endblock %}