CINXE.COM
Paraflex Balkonschirme jetzt online kaufen | SunLiner
<!doctype html> <html lang="de"> <head > <meta charset="utf-8"/> <meta name="title" content="Paraflex Balkonschirme jetzt online kaufen | SunLiner"/> <meta name="description" content="Paraflex Balkonschirme online kaufen ☀ Beliebte Marken ☀ Top Qualität ☀ Versandkostenfrei ☀ Käuferschutz » Jetzt entdecken & shoppen!"/> <meta name="keywords" content="Balkonschirm, Balkonschirme, Wandschirm, Wandschirme"/> <meta name="robots" content="INDEX, FOLLOW"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Paraflex Balkonschirme jetzt online kaufen | SunLiner</title> <link rel="stylesheet" type="text/css" media="all" href="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/css/styles.css" /> <link rel="icon" type="image/x-icon" href="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/Magento_Theme/favicon.ico" /> <link rel="shortcut icon" type="image/x-icon" href="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/Magento_Theme/favicon.ico" /> <link rel="preload" as="font" crossorigin="anonymous" href="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/fonts/poppins-v9-latin-300.woff2" /> <link rel="preload" as="font" crossorigin="anonymous" href="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/fonts/poppins-v9-latin-regular.woff2" /> <link rel="preload" as="font" crossorigin="anonymous" href="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/fonts/poppins-v9-latin-600.woff2" /> <link rel="preload" as="font" crossorigin="anonymous" href="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/fonts/poppins-v9-latin-700.woff2" /> <link rel="canonical" href="https://www.sunliner.de/balkonschirme/manufacturer-paraflex.html" /> <meta name="google-site-verification" content="et2qDm5qWFEn291AlkVjbEPJITlhS-XS_OVv1by3jPE" /> <script nonce="bndjdXgyc2NzZjZxd3gydW5hbTF0eXN1bGp1a3Bhc2E="> window.YIREO_GOOGLETAGMANAGER2_ENABLED = true; (function (events) { const initYireoGoogleTagManager2 = function () { events.forEach(function (eventType) { window.removeEventListener(eventType, initYireoGoogleTagManager2); }); (function (w, d, s, l, i) { w[l] = w[l] || []; w[l].push({'gtm.start': new Date().getTime(), event: 'gtm.js'}); var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 'https://www.googletagmanager.com' + '/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'dataLayer', 'GTM-5KTXCV8'); } events.forEach(function (eventType) { window.addEventListener(eventType, initYireoGoogleTagManager2, {once: true, passive: true}) }) })(['load', 'keydown', 'mouseover', 'scroll', 'touchstart', 'wheel']); </script> <script> var BASE_URL = 'https://www.sunliner.de/'; var THEME_PATH = 'https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE'; var COOKIE_CONFIG = { "expires": null, "path": "\u002F", "domain": ".www.sunliner.de", "secure": true, "lifetime": "3600", "cookie_restriction_enabled": false }; var CURRENT_STORE_CODE = 'deutsch'; var CURRENT_WEBSITE_ID = '1'; window.hyva = window.hyva || {} window.cookie_consent_groups = window.cookie_consent_groups || {} window.cookie_consent_groups['necessary'] = true; window.cookie_consent_config = window.cookie_consent_config || {}; window.cookie_consent_config['necessary'] = [].concat( window.cookie_consent_config['necessary'] || [], [ 'user_allowed_save_cookie', 'form_key', 'mage-messages', 'private_content_version', 'mage-cache-sessid', 'last_visited_store', 'section_data_ids' ] ); </script> <script> 'use strict'; (function( hyva, undefined ) { function lifetimeToExpires(options, defaults) { const lifetime = options.lifetime || defaults.lifetime; if (lifetime) { const date = new Date; date.setTime(date.getTime() + lifetime * 1000); return date; } return null; } function generateRandomString() { const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', length = 16; let formKey = '', charactersLength = allowedCharacters.length; for (let i = 0; i < length; i++) { formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] } return formKey; } const sessionCookieMarker = {noLifetime: true} const cookieTempStorage = {}; const internalCookie = { get(name) { const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); return v ? v[2] : null; }, set(name, value, days, skipSetDomain) { let expires, path, domain, secure, samesite; const defaultCookieConfig = { expires: null, path: '/', domain: null, secure: false, lifetime: null, samesite: 'lax' }; const cookieConfig = window.COOKIE_CONFIG || {}; expires = days && days !== sessionCookieMarker ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; path = cookieConfig.path || defaultCookieConfig.path; domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); secure = cookieConfig.secure || defaultCookieConfig.secure; samesite = cookieConfig.samesite || defaultCookieConfig.samesite; document.cookie = name + "=" + encodeURIComponent(value) + (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + (path ? '; path=' + path : '') + (domain ? '; domain=' + domain : '') + (secure ? '; secure' : '') + (samesite ? '; samesite=' + samesite : 'lax'); }, isWebsiteAllowedToSaveCookie() { const allowedCookies = this.get('user_allowed_save_cookie'); if (allowedCookies) { const allowedWebsites = JSON.parse(unescape(allowedCookies)); return allowedWebsites[CURRENT_WEBSITE_ID] === 1; } return false; }, getGroupByCookieName(name) { const cookieConsentConfig = window.cookie_consent_config || {}; let group = null; for (let prop in cookieConsentConfig) { if (!cookieConsentConfig.hasOwnProperty(prop)) continue; if (cookieConsentConfig[prop].includes(name)) { group = prop; break; } } return group; }, isCookieAllowed(name) { const cookieGroup = this.getGroupByCookieName(name); return cookieGroup ? window.cookie_consent_groups[cookieGroup] : this.isWebsiteAllowedToSaveCookie(); }, saveTempStorageCookies() { for (const [name, data] of Object.entries(cookieTempStorage)) { if (this.isCookieAllowed(name)) { this.set(name, data['value'], data['days'], data['skipSetDomain']); delete cookieTempStorage[name]; } } } }; hyva.getCookie = (name) => { const cookieConfig = window.COOKIE_CONFIG || {}; if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; } return internalCookie.get(name); } hyva.setCookie = (name, value, days, skipSetDomain) => { const cookieConfig = window.COOKIE_CONFIG || {}; if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { cookieTempStorage[name] = {value, days, skipSetDomain}; return; } return internalCookie.set(name, value, days, skipSetDomain); } hyva.setSessionCookie = (name, value, skipSetDomain) => { return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) } hyva.getBrowserStorage = () => { const browserStorage = window.localStorage || window.sessionStorage; if (!browserStorage) { console.warn('Browser Storage is unavailable'); return false; } try { browserStorage.setItem('storage_test', '1'); browserStorage.removeItem('storage_test'); } catch (error) { console.warn('Browser Storage is not accessible', error); return false; } return browserStorage; } hyva.postForm = (postParams) => { const form = document.createElement("form"); let data = postParams.data; if (! postParams.skipUenc && ! data.uenc) { data.uenc = btoa(window.location.href); } form.method = "POST"; form.action = postParams.action; Object.keys(postParams.data).map(key => { const field = document.createElement("input"); field.type = 'hidden' field.value = postParams.data[key]; field.name = key; form.appendChild(field); }); const form_key = document.createElement("input"); form_key.type = 'hidden'; form_key.value = hyva.getFormKey(); form_key.name="form_key"; form.appendChild(form_key); document.body.appendChild(form); form.submit(); } hyva.getFormKey = function () { let formKey = hyva.getCookie('form_key'); if (!formKey) { formKey = generateRandomString(); hyva.setCookie('form_key', formKey); } return formKey; } hyva.formatPrice = (value, showSign, options = {}) => { const formatter = new Intl.NumberFormat( 'de\u002DDE', Object.assign({ style: 'currency', currency: 'EUR', signDisplay: showSign ? 'always' : 'auto' }, options) ); return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? formatter.formatToParts(value).map(({type, value}) => { switch (type) { case 'currency': return '\u20AC' || value; case 'minusSign': return '- '; case 'plusSign': return '+ '; default : return value; } }).reduce((string, part) => string + part) : formatter.format(value); } const formatStr = function (str, nStart) { const args = Array.from(arguments).slice(2); return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { const idx = parseInt(n) - nStart; if (args[idx] === null || args[idx] === void 0) { return m; } return p.length % 2 ? p.slice(0, -1).replace('%%', '%') + args[idx] : p.replace('%%', '%') + n; }) } hyva.str = function (string) { const args = Array.from(arguments); args.splice(1, 0, 1); return formatStr.apply(undefined, args); } hyva.strf = function () { const args = Array.from(arguments); args.splice(1, 0, 0); return formatStr.apply(undefined, args); } /** * Take a html string as `content` parameter and * extract an element from the DOM to replace in * the current page under the same selector, * defined by `targetSelector` */ hyva.replaceDomElement = (targetSelector, content) => { // Parse the content and extract the DOM node using the `targetSelector` const parser = new DOMParser(); const doc = parser.parseFromString(content, 'text/html'); const contentNode = doc.querySelector(targetSelector); // Bail if content can't be found if (!contentNode) { return; } hyva.activateScripts(contentNode) // Replace the old DOM node with the new content document.querySelector(targetSelector).replaceWith(contentNode); // Reload customerSectionData and display cookie-messages if present window.dispatchEvent(new CustomEvent("reload-customer-section-data")); hyva.initMessages(); } hyva.activateScripts = (contentNode) => { // Extract all the script tags from the content. // Script tags won't execute when inserted into a dom-element directly, // therefore we need to inject them to the head of the document. const tmpScripts = contentNode.getElementsByTagName('script'); if (tmpScripts.length > 0) { // Push all script tags into an array // (to prevent dom manipulation while iterating over dom nodes) const scripts = []; for (let i = 0; i < tmpScripts.length; i++) { scripts.push(tmpScripts[i]); } // Iterate over all script tags and duplicate+inject each into the head for (let i = 0; i < scripts.length; i++) { let script = document.createElement('script'); script.innerHTML = scripts[i].innerHTML; document.head.appendChild(script); // Remove the original (non-executing) node from the content scripts[i].parentNode.removeChild(scripts[i]); } } return contentNode; } const replace = {['+']: '-', ['/']: '_', ['=']: ','}; hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); let currentTrap; const focusableElements = (rootElement) => { const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]'; return Array.from(rootElement.querySelectorAll(selector)) .filter(el => { return el.style.display !== 'none' && !el.disabled && el.tabIndex !== -1 && (el.offsetWidth || el.offsetHeight || el.getClientRects().length) }) } const focusTrap = (e) => { const isTabPressed = e.key === 'Tab' || e.keyCode === 9; if (!isTabPressed) return; const focusable = focusableElements(currentTrap) const firstFocusableElement = focusable[0] const lastFocusableElement = focusable[focusable.length - 1] e.shiftKey ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) }; hyva.releaseFocus = (rootElement) => { if (currentTrap && (!rootElement || rootElement === currentTrap)) { currentTrap.removeEventListener('keydown', focusTrap) currentTrap = null } } hyva.trapFocus = (rootElement) => { if (!rootElement) return; hyva.releaseFocus() currentTrap = rootElement rootElement.addEventListener('keydown', focusTrap) const firstElement = focusableElements(rootElement)[0] firstElement && firstElement.focus() } hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true}) window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) }( window.hyva = window.hyva || {} )); </script> <script> if (!window.IntersectionObserver) { window.IntersectionObserver = function (callback) { this.observe = el => el && callback(this.takeRecords()); this.takeRecords = () => [{isIntersecting: true, intersectionRatio: 1}]; this.disconnect = () => {}; this.unobserve = () => {}; } } </script> <meta property="og:type" content="product.group"/> <meta property="og:title" content="Paraflex Balkonschirme jetzt online kaufen | SunLiner"/> <meta property="og:description" content="Paraflex Balkonschirme online kaufen ☀ Beliebte Marken ☀ Top Qualität ☀ Versandkostenfrei ☀ Käuferschutz » Jetzt entdecken &amp; shoppen!"/> <meta property="og:url" content="https://www.sunliner.de/balkonschirme/manufacturer-paraflex.html"/> <meta property="og:site_name" content="SunLiner"/> <script type="application/ld+json">{"@context":"http:\/\/schema.org","@type":"WebSite","url":"https:\/\/www.sunliner.de\/","name":"SunLiner"}</script><script type="application/ld+json">{"@context":"http:\/\/schema.org","@type":"LocalBusiness","@id":"https:\/\/www.sunliner.de\/","name":"SunLiner GmbH","telephone":"+49 541-2002731","email":"info@sunliner.de","faxNumber":"+49 541-2002732","address":{"@type":"PostalAddress","addressCountry":"","addressLocality":"Osnabr\u00fcck","addressRegion":"Niedersachsen","streetAddress":"Kiebitzheide 11-21","postalCode":"49084"},"sameAs":[["https:\/\/www.facebook.com\/Sunliner\/","https:\/\/twitter.com\/Schirmprofi"]],"image":"https:\/\/www.sunliner.de\/media\/seller_image\/","url":"https:\/\/www.sunliner.de\/"}</script><script type="application/ld+json">{"@context":"http:\/\/schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","item":{"@id":"https:\/\/www.sunliner.de\/balkonschirme\/manufacturer-paraflex.html","name":"Balkonschirme"},"position":1}]}</script> <script type="application/ld+json">{"@context":"http:\/\/schema.org\/","@type":"WebPage","url":"https:\/\/www.sunliner.de\/balkonschirme\/manufacturer-paraflex.html","mainEntity":{"@context":"http:\/\/schema.org","@type":"OfferCatalog","name":"Paraflex Balkonschirme","url":"https:\/\/www.sunliner.de\/balkonschirme\/manufacturer-paraflex.html","numberOfItems":0,"itemListElement":[]},"speakable":{"@type":"SpeakableSpecification","cssSelector":[".category-description"],"xpath":["\/html\/head\/title"]}}</script></head> <body id="html-body" class="page-with-filter page-products categorypath-balkonschirme category-balkonschirme catalog-category-view page-layout-1column"> <script> var foomanGaBaseUrl = '/catalog/category/view/id/211'; </script> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5KTXCV8" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <input name="form_key" type="hidden" value="1plvjgWg8pdWkJse" /> <noscript> <section class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal"> <div class="container text-center"> <p> <strong>JavaScript scheint in Ihrem Browser deaktiviert zu sein.</strong> <span> Um unsere Website in bester Weise zu erfahren, aktivieren Sie Javascript in Ihrem Browser. </span> </p> </div> </section> </noscript> <script> document.body.addEventListener('touchstart', () => {}, {passive: true}) </script> <script nonce="bndjdXgyc2NzZjZxd3gydW5hbTF0eXN1bGp1a3Bhc2E="> function yireoGoogleTagManager2Pusher(eventData, message) { window.YIREO_GOOGLETAGMANAGER2_PAST_EVENTS = window.YIREO_GOOGLETAGMANAGER2_PAST_EVENTS || []; const copyEventData = Object.assign({}, eventData); let metaData = {}; if (copyEventData.meta) { metaData = copyEventData.meta; delete copyEventData.meta; } const eventHash = btoa(encodeURIComponent(JSON.stringify(copyEventData))); if (window.YIREO_GOOGLETAGMANAGER2_PAST_EVENTS.includes(eventHash)) { yireoGoogleTagManager2Logger('Warning: Event already triggered', eventData); return; } if (metaData && metaData.allowed_pages && metaData.allowed_pages.length > 0 && false === metaData.allowed_pages.some(page => window.location.pathname.includes(page))) { yireoGoogleTagManager2Logger('Warning: Skipping event, not in allowed pages', window.location.pathname, eventData); return; } if (!message) { message = 'push (unknown) [unknown]'; } yireoGoogleTagManager2Logger(message, eventData); window.dataLayer = window.dataLayer || []; if (eventData.ecommerce) { window.dataLayer.push({ecommerce: null}); } window.dataLayer.push(eventData); window.YIREO_GOOGLETAGMANAGER2_PAST_EVENTS.push(eventHash); } </script> <script nonce="bndjdXgyc2NzZjZxd3gydW5hbTF0eXN1bGp1a3Bhc2E="> function yireoGoogleTagManager2Logger(...args) { const debug = window.YIREO_GOOGLETAGMANAGER2_DEBUG || false; if (false === debug) { return; } var color = 'gray'; if (args[0].toLowerCase().startsWith('push')) { color = 'green'; } if (args[0].toLowerCase().startsWith('warning')) { color = 'orange'; } var css = 'color:white; background-color:' + color + '; padding:1px;' console.log('%cYireo_GoogleTagManager2', css, ...args); } </script> <div class="page-wrapper"><header class="page-header"><a class="action skip sr-only focus:not-sr-only focus:absolute focus:z-40 focus:bg-white contentarea" href="#contentarea"> <span> Direkt zum Inhalt </span> </a> <div id="benefits_bar" class="h-7 bg-sunliner-orange-darker"> <div class="relative container max-w-1300 h-full"> <script> 'use strict'; function initBenefitsSliderComponent() { return { active: 0, itemCount: 3, slideshow: 0, slideInterval: 10000, init() { if (this.checkIsMobileResolution()) { this.startSlideshow(); } }, updateSlideshow(nextTick) { if (this.checkIsMobileResolution()) { this.startSlideshow(); } else if (this.slideshow !== 0) { window.clearInterval(this.slideshow); this.slideshow = 0; } nextTick(() => { this.calcActive(); }); }, checkIsMobileResolution() { return window.matchMedia('(max-width: 1023px)').matches; }, startSlideshow() { this.slideshow = window.setInterval(() => { this.slide() }, this.slideInterval); }, slide() { const slider = this.getSlider(); if (slider) { if (this.active >= (this.itemCount - 1)) { this.active = 0; } else { this.active++; } slider.scrollLeft = (slider.scrollWidth / this.itemCount) * this.active; } }, calcActive() { const slider = this.getSlider(); if (slider) { this.active = Math.ceil( Math.round( slider.scrollLeft / (slider.scrollWidth / this.itemCount) ) ); } }, getSlider() { return this.$root.querySelector('.js_slides'); } } } </script> <section class="w-full h-full" x-data="initBenefitsSliderComponent()" @resize.window.debounce="checkIsMobileResolution(); updateSlideshow($nextTick)" x-id="['benefits-desc', 'benefits-id']" role="group" aria-roledescription="Karussell" aria-label="Karussell Kundenvorteile" :aria-describedby="$id('benefits-desc')" > <span class="sr-only" :id="$id('benefits-desc')" tabindex="-1" > Mit der Tabulatortaste können Sie durch die Elemente des Karussells navigieren. Mit den Skip-Links können Sie das Karussell überspringen oder direkt zur Karussellnavigation wechseln. </span> <a href="#benefits-end" class="action skip sr-only focus:not-sr-only focus:absolute focus:z-30 focus:bg-white" > Clicken, um das Karussell zu überspringen </a> <div id="benefits" class="relative w-full overflow-x-hidden h-full font-semibold text-xs text-white"> <div class="relative flex flex-nowrap w-full overflow-auto js_slides snap h-full lg:justify-evenly items-center transition-all"> <div class="js_slide flex-none w-full lg:w-auto" role="group" :aria-hidden="(!checkIsMobileResolution() || (1 === (active + 1))) ? 'false' : 'true'" aria-label="Vorteil 1" :aria-describedby="`benefits-desc-1-${$id('benefits-id')}`" > <div class="flex justify-center items-center gap-x-1"> <a href="/newsletter-rabatt/" target="_self" rel="noopener" :id="`benefits-desc-1-${$id('benefits-id')}`" > 100,- Euro Newsletter Rabatt </a> </div> </div> <div class="js_slide flex-none w-full lg:w-auto" role="group" :aria-hidden="(!checkIsMobileResolution() || (2 === (active + 1))) ? 'false' : 'true'" aria-label="Vorteil 2" :aria-describedby="`benefits-desc-2-${$id('benefits-id')}`" > <div class="flex justify-center items-center gap-x-1"> <a href="/service/" target="_self" rel="noopener" :id="`benefits-desc-2-${$id('benefits-id')}`" > Kostenloser Versand in DE </a> </div> </div> <div class="js_slide flex-none w-full lg:w-auto" role="group" :aria-hidden="(!checkIsMobileResolution() || (3 === (active + 1))) ? 'false' : 'true'" aria-label="Vorteil 3" :aria-describedby="`benefits-desc-3-${$id('benefits-id')}`" > <div class="flex justify-center items-center gap-x-1"> <a href="/zahlung/" target="_self" rel="noopener" :id="`benefits-desc-3-${$id('benefits-id')}`" > 5 % Rabatt </a> </div> </div> </div> </div> <span id="benefits-end" tabindex="-1"></span> </section> <div class="absolute top-1 right-5 w-full max-w-max"> <div x-data="{ open: false }" class="relative"> <div @click.prevent="open = !open" @click.outside="open = false" @keydown.window.escape="open=false" aria-haspopup="true" aria-expanded="true" class="w-full flex justify-center items-center gap-x-1 py-0.5 cursor-pointer"> <div class="text-xs uppercase"> de </div> <i class="svgsprite flag-de"></i> <img x-show="!open" class="w-2 h-2" src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/arrow-brown-d.svg" alt=""> <img x-show="open" x-cloak class="w-2 h-2" src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/arrow-brown-u.svg" alt=""> </div> <nav x-cloak="" x-show="open" aria-orientation="vertical" aria-labelledby="options-menu" role="menu" class="absolute right-0 top-full z-50 mt-2 shadow-md max-w-max bg-white border border-sunliner-gray-light text-xs"> <i class="absolute top-[-14px] right-[8px] w-0 h-0 block z-50 border-[7px] border-transparent border-b-[#BBB]"></i> <i class="absolute top-[-12px] right-[9px] w-0 h-0 block z-[51] border-[6px] border-transparent border-b-white"></i> <a href="https://www.sunliner.de/stores/store/redirect/___store/en/am_category_id/211/uenc/aHR0cHM6Ly93d3cuc3VubGluZXIuZGUvZW4vYmFsa29uc2NoaXJtZS5odG1sP21hbnVmYWN0dXJlcj0xNDMz/___from_store/deutsch/" class="block p-2 text-sunliner-orange hover:text-sunliner-blue-light"> english </a> <a href="https://www.sunliner.de/stores/store/redirect/___store/fr/am_category_id/211/uenc/aHR0cHM6Ly93d3cuc3VubGluZXIuZGUvZnIvYmFsa29uc2NoaXJtZS5odG1sP21hbnVmYWN0dXJlcj0xNDMz/___from_store/deutsch/" class="block p-2 text-sunliner-orange hover:text-sunliner-blue-light"> Français </a> </nav> </div> </div> </div> </div> <script> function initHeader () { return { searchOpen: false, searchResultsOpen: false, isMobileForSearch: false, isMobileForNavigation: false, cart: {}, isCartOpen: false, getData(data) { if (data.cart) { this.cart = data.cart } }, isCartEmpty() { return !this.cart.summary_count }, toggleCart(event) { if (event.detail && event.detail.isOpen !== undefined) { this.isCartOpen = event.detail.isOpen if (!this.isCartOpen && this.$refs && this.$refs.cartButton) { this.$refs.cartButton.focus() } } else { this.isCartOpen = true } }, menu: initHeaderNavigation(), init() { this.cloakMobileMenu(); this.checkIsMobileResolutionForSearch(); this.checkIsMobileResolutionForNavigation(); this.positionSearchBar(); }, checkIsMobileResolutionForSearch() { this.isMobileForSearch = window.matchMedia('(max-width: 767px)').matches; }, checkIsMobileResolutionForNavigation() { this.isMobileForNavigation = window.matchMedia('(max-width: 1023px)').matches; }, positionSearchBar() { const searchForm = document.getElementById('search_mini_form').parentElement; const desktopSearchBar = document.getElementById('desktop_search_bar'); const mobileSearchBar = document.getElementById('mobile_search_bar'); if (this.isMobileForSearch) { if (desktopSearchBar.querySelector('#search_mini_form') !== null) { mobileSearchBar.appendChild(searchForm); } } else if (mobileSearchBar.childElementCount > 0) { desktopSearchBar.appendChild(searchForm); } }, cloakMobileMenu() { const menu = document.getElementById('menu'); menu.classList.remove('hidden'); menu.classList.replace('lg:block', 'block'); }, eventListeners: { ['@resize.window.debounce']() { this.init(); }, ['@visibilitychange.window.debounce']() { this.checkIsMobileResolutionForSearch(); this.checkIsMobileResolutionForNavigation(); }, ['@keydown.window.escape']() { this.searchOpen = false; }, ['@private-content-loaded.window'](event) { this.getData(event.detail.data); }, ['@search-results-open-updated.window.debounce.50'](event) { this.searchResultsOpen = event.detail.open; } } } } function initCompareHeader() { return { compareProducts: null, itemCompareCount: 0, receiveCompareData(data) { if (data['compare-products']) { this.compareProducts = data['compare-products']; this.itemCompareCount = this.compareProducts.count; } } } } function initWishlistHeader() { return { wishlistProducts: null, itemWishlistCount: 0, receiveWishlistData(data) { if (data['wishlist']) { this.wishlistProducts = data['wishlist']; this.itemWishlistCount = this.wishlistProducts.items.length; } } } } </script> <div id="header" class="z-30" :class="{ 'relative': !(isMobileForSearch && searchResultsOpen), 'fixed inset-0 overflow-y-scroll': (isMobileForSearch && searchResultsOpen) }" x-data="initHeader()" @private-content-loaded.window="getData(event.detail.data)" x-bind="eventListeners" > <div id="header_main_bar" class="container max-w-1300 pt-5 bg-white"> <div class="flex items-end justify-between w-full gap-y-0 gap-x-5 pb-8"> <!-- Logo & Hamburger --> <div class="md:mr-5 2xl:mr-10 flex md:shrink-0 gap-x-3"> <!-- Mobile Hamburger --> <button x-ref="mobileMenuTrigger" @click="menu.openMobileMenu()" type="button" class="lg:hidden z-[101] shrink-0 self-center xs:pt-2.5 text-sunliner-gray" aria-label="Menü öffnen" aria-haspopup="menu" :aria-expanded="menu.open" :hidden="menu.open" @keydown.window.escape="menu.open=false"> <img x-show="!menu.open" src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/menu.svg" alt="" width="24" height="18"/> </button> <button @click="menu.closeMobileMenu()" :class="{ 'absolute top-0 right-11 r-3.5': menu.open }" class="lg:hidden z-[101] shrink-0 text-sunliner-gray" aria-label="Menü schließen" type="button" @keydown.window.escape="menu.open=false" > <img x-show="menu.open" x-cloak src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/menu-close.svg" alt="" width="20" height="20"/> </button> <!-- Logo --> <a href="https://www.sunliner.de/" title="" aria-label="Zur Startseite gehen" > <img src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/sunliner-logo.svg" title="Sunliner Logo" alt="Sunliner Logo" class="h-full" width="168" height="63" /> </a> </div> <!-- Desktop Search --> <div id="desktop_search_bar" class="w-full hidden md:block"> <label class="sr-only" for="search" data-role="minisearch-label"> <span>Suche</span> </label> <div x-data="initMirasvitSearch()" @click.outside="closeSearch"> <form id="search_mini_form" action="https://www.sunliner.de/catalogsearch/result/" method="get" autocomplete="off" class="form minisearch flex justify-end items-end"> <input id="search" type="search" x-ref="searchInput" name="q" value="" placeholder="Hier den ganzen Shop durchsuchen..." maxlength="128" class="w-full h-8 border-0 border-b border-sunliner-gray-lighter text-sunliner-gray placeholder-sunliner-gray-lightest focus:outline-none focus:ring-0 focus:border-sunliner-orange transition appearance-none" x-on:keyup.debounce.300="doSearch($refs.searchInput.value)" x-on:click.debounce.150="openSearch" x-on:keydown.debounce.100="startSearch($refs.searchInput.value)" @input.debounce="toggleSearchButton" @search-open.window.debounce.10=" $el.focus() $el.select() " /> <button type="submit" title="Suche" :disabled="buttonDisabled" class="hidden z-[91] w-10 h-12 md:flex shrink-0 justify-center items-center bg-sunliner-gray-faint border-b border-sunliner-orange group" :class="{'hover:bg-sunliner-orange': !buttonDisabled}"> <i class="svgsprite search" :class="{'search': buttonDisabled, 'search-hoverable': !buttonDisabled}"></i> </button> </form> <div x-cloak x-show="isOpen" id="mirasvitSearchResults" class="absolute inset-x-0 z-[90] max-w-1300 w-full mx-auto p-5 md:pt-8 shadow-lg bg-white text-lg leading-normal transition appearance-none lg:text-xl"> <div class="flex flex-row justify-center items-center w-full h-full absolute select-none z-40" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"> <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --> <svg width="57" height="57" viewBox="0 0 57 57" xmlns="http://www.w3.org/2000/svg" stroke="#fff" class="stroke-current text-primary"> <g fill="none" fill-rule="evenodd"> <g transform="translate(1 1)" stroke-width="2"> <circle cx="5" cy="50" r="5"> <animate attributeName="cy" begin="0s" dur="2.2s" values="50;5;50;50" calcMode="linear" repeatCount="indefinite"/> <animate attributeName="cx" begin="0s" dur="2.2s" values="5;27;49;5" calcMode="linear" repeatCount="indefinite"/> </circle> <circle cx="27" cy="5" r="5"> <animate attributeName="cy" begin="0s" dur="2.2s" from="5" to="5" values="5;50;50;5" calcMode="linear" repeatCount="indefinite"/> <animate attributeName="cx" begin="0s" dur="2.2s" from="27" to="27" values="27;49;5;27" calcMode="linear" repeatCount="indefinite"/> </circle> <circle cx="49" cy="50" r="5"> <animate attributeName="cy" begin="0s" dur="2.2s" values="50;50;5;50" calcMode="linear" repeatCount="indefinite"/> <animate attributeName="cx" from="49" to="49" begin="0s" dur="2.2s" values="49;5;27;49" calcMode="linear" repeatCount="indefinite"/> </circle> </g> </g> </svg> <div class="ml-10 text-primary text-xl"> Laden... </div> </div> <template x-if="searchResults"> <div class="w-full"> <div class="container p-0 grid xs:grid-cols-1 lg:grid-cols-2 gap-5"> <template x-for="item in searchProducts"> <div class="group w-full p-2 outline outline-1 outline-sunliner-gray-lightest overflow-hidden transition duration-200 ease-out hover:shadow-cards hover:outline-sunliner-orange-lighter"> <a x-bind:href="`${item.url}`" class="w-full h-full flex gap-4"> <div class="self-center"> <img x-bind:src="`${item.imageUrl}`" class="p-0.5 border border-sunliner-gray-faint group-hover:border-sunliner-gray-lightest"/> </div> <div class="w-full flex flex-col gap-y-2"> <h4 x-html="item.name"></h4> <p class="max-h-16 text-sunliner-gray text-xs overflow-hidden" x-html="item.description"></p> <div class="self-end flex lg:flex-col xl:flex-row justify-between item-end"> <span class="" x-html="item.price"></span> </div> </div> </a> </div> </template> <template x-if="searchProducts == ''"> <p>No results found.</p> </template> </div> <div class="px-6 pt-6 w-full order-2 col-span-12"> <hr class="border-sunliner-gray-lighter"> <div class="flex items-center justify-center"> <a x-bind:href="numberResultsUrl"> <p class="mt-4 font-bold text-base lg:text-lg text-sunliner-gray hover:text-sunliner-orange" x-html="numberResults"></p> </a> </div> </div> </div> </template> <template x-if="noResults"> <div class="w-full bg-white"> <p class="w-full mb-0 p-2 bg-sunliner-orange-delivery text-lg leading-normal transition appearance-none lg:text-xl" x-html="noResultsText"> </p> </div> </template> </div> </div> <script> function initMirasvitSearch() { return { //initialize Variables hotSearch: false, searchResults: false, noResults: false, isLoading: false, isOpen: false, blockConfig: {"query":"","priceFormat":{"pattern":"%s\u00a0\u20ac","precision":2,"requiredPrecision":2,"decimalSymbol":",","groupSymbol":".","groupLength":3,"integerRequired":false},"minSearchLength":3,"url":"https:\/\/www.sunliner.de\/searchautocomplete\/ajax\/suggest\/","storeId":"1","delay":300,"isAjaxCartButton":false,"isShowCartButton":false,"isShowImage":true,"isShowPrice":true,"isShowSku":false,"isShowRating":true,"isShowDescription":true,"isShowStockStatus":false,"layout":"in-page","popularTitle":"Popular Suggestions","popularSearches":[],"isTypeaheadEnabled":true,"typeaheadUrl":"https:\/\/www.sunliner.de\/searchautocomplete\/ajax\/typeahead\/","minSuggestLength":2,"currency":"EUR","limit":32,"customerGroupId":0}, xhttp: false, noResultsText: '', numberResults: '', numberResultsUrl: '', buttonDisabled: true, searchProductsTotal: '', searchCategoriesTotal: '', searchPagesTotal: '', searchMirasvitKbArticleTotal: '', searchMirasvitBlogPostTotal: '', searchProducts: [], searchCategories: [], searchPages: [], searchMirasvitBlogPost: [], searchMirasvitKbArticle: [], searchMap: { 'magento_cms_page': 'Pages', 'magento_catalog_category': 'Categories', 'magento_catalog_product': 'Products', 'mirasvit_blog_post': 'MirasvitBlogPost', 'mirasvit_kb_article': 'MirasvitKbArticle' }, hotSearchClickEvent: function (ev) { var hotSearchClick = event.currentTarget.innerText; document.getElementById("search").value = hotSearchClick; this.doSearch(hotSearchClick); }, openSearch: function () { searchValue = document.getElementById("search").value.length; this.isOpen = searchValue !== 0; this.dispatchSearchEvent(this.isOpen); if (searchValue >= this.blockConfig.minSearchLength) { this.hideHotSearch(); } else { this.showHotSearch(); this.hideSearchResults(); } }, startSearch: function (e) { if (e) { this.isOpen = true; this.dispatchSearchEvent(true); } else { this.isOpen = false; } }, closeSearch: function () { this.isOpen = false; this.dispatchSearchEvent(false); }, showHotSearch: function () { this.hotSearch = true; }, hideHotSearch: function () { this.hotSearch = false; }, showSearchResults: function () { this.searchResults = true; this.dispatchSearchEvent(true); }, hideSearchResults: function () { this.searchResults = false; this.dispatchSearchEvent(false); }, showNoResults: function () { this.noResults = true; }, hideNoResults: function () { this.noResults = false; }, setNoResultsText(text) { if (!text) { return; } this.noResultsText = text; }, setNumberResults(text) { this.numberResults = text; }, setNumberResultsUrl(text) { this.numberResultsUrl = text; }, resetSearchData: function () { // Reinitialize Variables to avoid wrong search results. this.searchPagesTotal = 0; this.searchCategoriesTotal = 0; this.searchProductsTotal = 0; this.searchMirasvitKbArticleTotal = 0; this.searchMirasvitBlogPostTotal = 0; this.searchProducts = []; this.searchPages = []; this.searchCategories = []; this.searchMirasvitKbArticle = []; this.searchMirasvitBlogPost = []; }, dispatchSearchEvent: function (open) { window.dispatchEvent( new CustomEvent( 'search-results-open-updated', {detail: {open: open}} ) ); }, doSearch: function (query) { var self = this; // Min search length if (query.length < this.blockConfig.minSearchLength) { this.showHotSearch(); this.isLoading = false; this.hideSearchResults(); return; } else { this.hideHotSearch(); this.isLoading = true; this.showSearchResults(); } // AJAX for searchautocomplete/ajax/suggest/ if (this.xhttp) { try { this.xhttp.abort(); } catch { } } this.xhttp = new XMLHttpRequest(); var xhttp = this.xhttp; var queryEncoded = encodeURIComponent(query); var url = this.blockConfig.url.replace(/\/$/, "") + "/?q=" + queryEncoded + "&store_id=" + this.blockConfig.storeId + "&cat=false"; xhttp.open("GET", url, true); xhttp.setRequestHeader("Content-Type", "application/json"); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { // Response from ajax call in JSON. var response = JSON.parse(this.responseText); self.resetSearchData(); // Product Search Results for (index in response.indexes) { if (response.indexes[index].items.length > 0) { var res = response.indexes[index]; var map = null; if (self.searchMap[res.identifier]) { map = self.searchMap[res.identifier]; self['search' + map] = res.items; self['search' + map + 'Total'] = res.totalItems; } } } self.isLoading = false; self.hideNoResults(); self.setNumberResults(response.textAll); self.setNumberResultsUrl(response.urlAll); if (response.noResults) { self.setNoResultsText(response.textEmpty); self.hideSearchResults(); self.showNoResults(); } } }; xhttp.send(); }, toggleSearchButton: function() { this.buttonDisabled = this.$refs.searchInput < this.blockConfig.minSearchLength; } } } </script> </div> <!-- Hotline --> <div class="hidden lg:flex shrink-0 items-end gap-x-5 pb-1"> <div class="flex items-center gap-x-1.5"> <i class="shrink-0 svgsprite hotline-small"></i> <div class="w-full flex flex-col gap-y-1"> <span class="text-sm font-light tracking-wider leading-none"> Hotline: </span> <a href="tel:05412002731" class="min-w-max w-full text-lg font-bold leading-none text-sunliner-brown-lighter hover:text-sunliner-brown-lighter focus:text-sunliner-brown-lighter" aria-label="Hotline anrufen" > 0541 - 200 27 31 </a> </div> </div> <a class="shrink-0 w-14 mb-0.5" target="_blank" rel="noopener" href="https://www.trustedshops.de/bewertung/info_X69B028C7DECCB7B48277310B07990616.html" aria-label="Gehe zu Trusted Shops" > <img src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/ts.png" srcset="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/ts.png 1x, https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/ts-2x.png 2x" alt="Trusted Shops" width="55" height="55" aria-hidden="true"/> </a> </div> <!-- Icons --> <div class="xl:ml-5 2xl:ml-10 flex justify-end items-center gap-x-2 md:gap-x-5 xs:pb-2.5" @touchend.prevent.stop="$refs['mobile_search_label'].click()"> <!-- Mobile Search Icon--> <button id="menu-search-icon" class="md:hidden w-8 h-8 flex justify-center items-center fill-current" @click.prevent=" searchOpen = !searchOpen; $dispatch('search-open'); " aria-label="Suchformular umschalten" aria-haspopup="true" :aria-expanded="searchOpen" x-ref="mobile_search_label" :class=" searchOpen ? 'text-sunliner-orange' : 'text-sunliner-gray-darker' " > <label for="search" data-role="minisearch-label"> <img class="w-8 h-8" src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/search.svg" alt=""> </label> </button> <!-- Customer Icon --> <a href="https://www.sunliner.de/customer/account/" id="customer-menu" @touchend.prevent.stop="$el.click()" title="Login"> <svg class="w-8 h-9 block hover-orange text-sunliner-gray-darker" viewBox="0 0 32 36" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" fill="currentColor" aria-hidden="true"> <path d="M30.112 31.573c0 8.793-6.276 1.737-14.017 1.737S2.078 40.366 2.078 31.573c0-4.306-3.686-8.214-1.24-11.08 1.399-1.639 4.669-2.937 7.989-3.775 1.635 3.267 4.484 5.978 7.715 5.978 3.125 0 5.875-2.535 7.519-5.656 3.002.929 5.822 2.289 7.133 3.965 2.198 2.812-1.082 6.513-1.082 10.568zm-13.57-10.834c-5.053 0-9.173-6.628-9.173-11.649 0-5.02 4.097-9.09 9.15-9.09 5.054 0 9.15 4.07 9.15 9.09 0 5.021-4.073 11.649-9.127 11.649z"/> <clippath id="account"> <path d="M30.112 31.573c0 8.793-6.276 1.737-14.017 1.737S2.078 40.366 2.078 31.573c0-4.306-3.686-8.214-1.24-11.08 1.399-1.639 4.669-2.937 7.989-3.775 1.635 3.267 4.484 5.978 7.715 5.978 3.125 0 5.875-2.535 7.519-5.656 3.002.929 5.822 2.289 7.133 3.965 2.198 2.812-1.082 6.513-1.082 10.568zm-13.57-10.834c-5.053 0-9.173-6.628-9.173-11.649 0-5.02 4.097-9.09 9.15-9.09 5.054 0 9.15 4.07 9.15 9.09 0 5.021-4.073 11.649-9.127 11.649z" clip-rule="evenodd"/> </clippath> <g clip-path="url(#account)"> <rect height="100%" width="100%"></rect> </g> </svg> </a> <!-- Wishlist Icon --> <a id="wishlist-icon" class="hidden xs:flex justify-center items-center gap-x-1" href="https://www.sunliner.de/wishlist/" title="Wunschliste" x-data="initWishlistHeader()" @private-content-loaded.window="receiveWishlistData($event.detail.data)" @touchend.prevent.stop="$el.click()" :aria-label="` Wunschliste, ${itemWishlistCount > 1 ? hyva.str('\u00251\u0020Artikel', itemWishlistCount) : hyva.str('\u00251\u0020Eintrag', itemWishlistCount) }`" > <svg class="w-10 h-9 block hover-orange text-sunliner-gray-darker" aria-hidden="true" viewBox="0 0 37 35" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" fill="currentColor"> <path d="M18.5 0l6.098 11L37 13.369l-8.633 9.168L29.934 35 18.5 29.667 7.066 35l1.567-12.463L0 13.369 12.402 11 18.5 0"/> <clippath id="star"> <path d="M18.5 0l6.098 11L37 13.369l-8.633 9.168L29.934 35 18.5 29.667 7.066 35l1.567-12.463L0 13.369 12.402 11 18.5 0" clip-rule="evenodd"/> </clippath> <g clip-path="url(#star)"> <rect height="100%" width="100%"></rect> </g> </svg> <span x-text="itemWishlistCount" class="bg-sunliner-orange text-white text-center uppercase tabular-nums w-6 h-5 flex justify-center items-center" aria-hidden="true" ></span> </a> <!-- Compare Icon --> <a id="compare-link" class="justify-center items-center gap-x-1" :class="{ 'hidden': !(itemCompareCount > 0), 'hidden sm:flex': (itemCompareCount > 0) }" href="https://www.sunliner.de/catalog/product_compare/index/" title="Produkte vergleichen" x-data="initCompareHeader()" @private-content-loaded.window="receiveCompareData($event.detail.data)" @touchend.prevent.stop="$el.click()" :aria-label="` Produkte vergleichen, ${itemCompareCount > 1 ? hyva.str('\u00251\u0020Artikel', itemCompareCount) : hyva.str('\u00251\u0020Eintrag', itemCompareCount) }`" x-cloak > <svg class="w-9 h-9 block hover-orange text-sunliner-gray-darker" aria-hidden="true" viewBox="0 0 35 36" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" fill="currentColor"> <path d="M17.5.5a17.5 17.5 0 110 35 17.5 17.5 0 010-35zM11.45 13H9.14l3.27 4H3.75v2h8.66l-3.28 4h2.32l4.1-5-4.1-5zm11.15 4l3.27-4h-2.31l-4.1 5 4.1 5h2.31l-3.27-4h8.65v-2H22.6z"/> <clippath id="wish"> <path d="M17.5.5a17.5 17.5 0 110 35 17.5 17.5 0 010-35zM11.45 13H9.14l3.27 4H3.75v2h8.66l-3.28 4h2.32l4.1-5-4.1-5zm11.15 4l3.27-4h-2.31l-4.1 5 4.1 5h2.31l-3.27-4h8.65v-2H22.6z" clip-rule="evenodd"/> </clippath> <g clip-path="url(#wish)"> <rect height="100%" width="100%"></rect> </g> </svg> <span x-text="itemCompareCount" class="bg-sunliner-orange text-white text-center uppercase tabular-nums w-6 h-5 flex justify-center items-center" aria-hidden="true" ></span> </a> <!-- Cart Icon --> <button id="menu-cart-icon" class="relative flex justify-center items-center gap-x-1" x-ref="cartButton" :aria-disabled="isCartEmpty()" :aria-label="` Mini-Warenkorb umschalten, ${isCartEmpty() ? 'Warenkorb ist leer' : cart.summary_count > 1 ? hyva.str('%1 Artikel', cart.summary_count) : hyva.str('%1 Element', cart.summary_count) }`" @click.prevent.stop="() => { $dispatch('toggle-cart', { isOpen: true }) }" @toggle-cart.window="toggleCart($event)" :aria-expanded="isCartOpen" aria-haspopup="dialog" @touchend.prevent.stop="$refs['cartButton'].click()" > <svg class="w-8 h-9 block hover-orange text-sunliner-gray-darker" aria-hidden="true" viewBox="0 0 32 37" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" fill="currentColor"> <path d="M31.93 8.424l-10.637-2.82-1.673 6.222h7.043c4.647 0-.077 11.188-.077 11.188-.421.84-1.263 1.399-2.386 1.399H9.963L8.7 26.791v.139c0 .14.141.28.281.28H26.36v2.797H8.42a2.81 2.81 0 01-2.807-2.797c0-.419.141-.979.281-1.398l1.964-3.357-5.051-10.629H0V9.029h4.631l1.263 2.797h12.644l1.745-6.49L9.914 2.587l.008-.036c.688-2.56 6.173-3.32 12.25-1.697 6.074 1.622 10.441 5.01 9.758 7.57zM8.616 31.022c1.652 0 3.003 1.345 3.003 2.989S10.268 37 8.616 37c-1.651 0-3.003-1.345-3.003-2.989s1.352-2.989 3.003-2.989zm15.016 0c1.652 0 3.003 1.345 3.003 2.989S25.284 37 23.632 37c-1.652 0-3.003-1.345-3.003-2.989s1.351-2.989 3.003-2.989z" fill="#555"/> <clippath id="cart"> <path d="M31.93 8.424l-10.637-2.82-1.673 6.222h7.043c4.647 0-.077 11.188-.077 11.188-.421.84-1.263 1.399-2.386 1.399H9.963L8.7 26.791v.139c0 .14.141.28.281.28H26.36v2.797H8.42a2.81 2.81 0 01-2.807-2.797c0-.419.141-.979.281-1.398l1.964-3.357-5.051-10.629H0V9.029h4.631l1.263 2.797h12.644l1.745-6.49L9.914 2.587l.008-.036c.688-2.56 6.173-3.32 12.25-1.697 6.074 1.622 10.441 5.01 9.758 7.57zM8.616 31.022c1.652 0 3.003 1.345 3.003 2.989S10.268 37 8.616 37c-1.651 0-3.003-1.345-3.003-2.989s1.352-2.989 3.003-2.989zm15.016 0c1.652 0 3.003 1.345 3.003 2.989S25.284 37 23.632 37c-1.652 0-3.003-1.345-3.003-2.989s1.351-2.989 3.003-2.989z" clip-rule="evenodd"/> </clippath> <g clip-path="url(#cart)"> <rect height="100%" width="100%"></rect> </g> </svg> <span x-text="cart.summary_count" class="bg-sunliner-orange text-white text-center uppercase tabular-nums w-6 h-5 flex justify-center items-center" aria-hidden="true" > </span> </button> </div> </div> <!-- Mobile Search Placeholder--> <div id="mobile_search_bar" x-cloak x-show="searchOpen" class="z-10 md:hidden w-full mx-auto px-2 py-1.5" @click.outside="searchOpen = false" @keydown.escape=" searchOpen = false; $refs.mobile_search_label.focus(); " ></div> </div> <!-- Main Navigation --> <div id="navigation_bar" class="w-full bg-sunliner-orange-darker"> <div id="menu" class="fixed inset-0 lg:static hidden lg:block w-screen lg:max-w-1300 lg:w-full h-screen lg:h-auto z-[100] lg:m-auto lg:px-1.5 bg-white lg:bg-transparent" :class="{ 'overflow-y-scroll': menu.open }" @click.outside="menu.open = false" x-show="!isMobileForNavigation || menu.open" > <nav class="w-full text-base font-bold px-8 py-12 lg:p-0" aria-label="Hauptmenü" > <ul class="w-full lg:flex items-center divide-y divide-sunliner-gray-lightest lg:divide-y-0"> <li x-data="{ drop: false, canHover: window.matchMedia('(hover:hover)').matches }" class="nav-menu-item" :class="{'nav-menu-item-dropped' : drop}" @touchend.self.stop="drop = !drop" @touchstart.outside.passive="drop = false" @mouseenter="if (canHover) { drop = true }" @mouseleave="if (canHover) { drop = false }" @keydown.window.escape="drop = false" @keydown.enter.stop="drop = !drop" tabindex="0" aria-label="Sonnenschirme" > <span class="px-3.5 flex items-center gap-x-3" @touchend.stop="drop = !drop" aria-hidden="true" > <span>Sonnenschirme</span> <svg x-show="!drop" class="w-3 h-3 lg:w-1.5 lg:h-1.5 ml-auto lg:ml-0 fill-current" width="100%" height="100%" viewBox="0 0 9 5" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"> <g transform="matrix(1,0,0,1,-1575.68,-81.5688)"> <path d="M1580.19,85.29C1579.08,84.152 1577.97,83.013 1576.82,81.923C1576.35,81.481 1575.65,82.172 1576.11,82.63C1577.24,83.799 1578.41,84.924 1579.55,86.07C1579.95,86.465 1580.41,86.45 1580.82,86.07C1582.01,84.969 1583.14,83.809 1584.26,82.63C1584.45,82.43 1584.46,82.124 1584.26,81.923C1584.06,81.723 1583.75,81.734 1583.55,81.923C1582.4,83.013 1581.29,84.152 1580.19,85.29Z"/> </g> </svg> <svg x-show="drop" x-cloak class="w-3 h-3 lg:w-1.5 lg:h-1.5 ml-auto lg:ml-0 fill-current" width="100%" height="100%" viewBox="0 0 9 5" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"> <g transform="matrix(1,0,0,-1,-1575.68,86.5688)"> <path d="M1580.19,85.29C1579.08,84.152 1577.97,83.013 1576.82,81.923C1576.35,81.481 1575.65,82.172 1576.11,82.63C1577.24,83.799 1578.41,84.924 1579.55,86.07C1579.95,86.465 1580.41,86.45 1580.82,86.07C1582.01,84.969 1583.14,83.809 1584.26,82.63C1584.45,82.43 1584.46,82.124 1584.26,81.923C1584.06,81.723 1583.75,81.734 1583.55,81.923C1582.4,83.013 1581.29,84.152 1580.19,85.29Z"/> </g> </svg> </span> <div class="submenu-box lg:grid-cols-3 lg:w-187" x-show="drop" x-cloak> <div class="flex flex-col w-full"> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/allwetterschirme.html" title="Kategorie Allwetterschirme"> <span>Allwetterschirme</span> </a> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/ampelschirm.html" title="Kategorie Ampelschirme / Freiarmschirme"> <span>Ampelschirme / Freiarmschirme</span> </a> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/balkonschirme.html" title="Kategorie Balkonschirme"> <span>Balkonschirme</span> </a> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/gartenschirme.html" title="Kategorie Gartenschirme"> <span>Gartenschirme</span> </a> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/sonnenschirme-gastronomie-gewerbe.html" title="Kategorie Gastronomie & Gewerbe"> <span>Gastronomie & Gewerbe</span> </a> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/grossschirme.html" title="Kategorie Großschirme"> <span>Großschirme</span> </a> </div> <div class="flex flex-col w-full"> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/holzschirme.html" title="Kategorie Holzschirme"> <span>Holzschirme</span> </a> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/marktschirme.html" title="Kategorie Marktschirme"> <span>Marktschirme</span> </a> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/sonderloesungen.html" title="Kategorie Sonderlösungen"> <span>Sonderlösungen</span> </a> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/werbeschirme.html" title="Kategorie Werbeschirme"> <span>Werbeschirme</span> </a> </div> <div class="submenu-text"> <span class="w-full"> <img src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/grossschirme.png" alt="" width="140" loading="lazy"/> </span> <span class="w-full pl-1.5"> Sonnenschirme </span> <span class="w-full pl-1.5 font-normal leading-normal"> Wir sind der Spezialist für hochwertige Sonnenschirme. Stöbern Sie gerne durch unsere zahlreichen Kategorien oder kontaktieren Sie uns direkt - wir freuen, dass sie hier sind! </span> </div> </div> </li> <li x-data="{ drop: false, canHover: window.matchMedia('(hover:hover)').matches }" class="nav-menu-item" :class="{'nav-menu-item-dropped' : drop}" @touchend.self.stop="drop = !drop" @touchstart.outside.passive="drop = false" @mouseenter="if (canHover) { drop = true }" @mouseleave="if (canHover) { drop = false }" @keydown.window.escape="drop = false" @keydown.enter.stop="drop = !drop" tabindex="0" aria-label="Marken" > <span class="px-3.5 flex items-center gap-x-3" @touchend.stop="drop = !drop"> <span>Marken</span> <svg x-show="!drop" class="w-3 h-3 lg:w-1.5 lg:h-1.5 ml-auto lg:ml-0 fill-current" width="100%" height="100%" viewBox="0 0 9 5" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"> <g transform="matrix(1,0,0,1,-1575.68,-81.5688)"> <path d="M1580.19,85.29C1579.08,84.152 1577.97,83.013 1576.82,81.923C1576.35,81.481 1575.65,82.172 1576.11,82.63C1577.24,83.799 1578.41,84.924 1579.55,86.07C1579.95,86.465 1580.41,86.45 1580.82,86.07C1582.01,84.969 1583.14,83.809 1584.26,82.63C1584.45,82.43 1584.46,82.124 1584.26,81.923C1584.06,81.723 1583.75,81.734 1583.55,81.923C1582.4,83.013 1581.29,84.152 1580.19,85.29Z"/> </g> </svg> <svg x-show="drop" x-cloak class="w-3 h-3 lg:w-1.5 lg:h-1.5 ml-auto lg:ml-0 fill-current" width="100%" height="100%" viewBox="0 0 9 5" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"> <g transform="matrix(1,0,0,-1,-1575.68,86.5688)"> <path d="M1580.19,85.29C1579.08,84.152 1577.97,83.013 1576.82,81.923C1576.35,81.481 1575.65,82.172 1576.11,82.63C1577.24,83.799 1578.41,84.924 1579.55,86.07C1579.95,86.465 1580.41,86.45 1580.82,86.07C1582.01,84.969 1583.14,83.809 1584.26,82.63C1584.45,82.43 1584.46,82.124 1584.26,81.923C1584.06,81.723 1583.75,81.734 1583.55,81.923C1582.4,83.013 1581.29,84.152 1580.19,85.29Z"/> </g> </svg> </span> <div class="submenu-box lg:grid-cols-3 lg:w-187" x-show="drop" x-cloak> <div class="flex flex-col w-full"> <a class="submenu-item" title="Marke Bahama" href="https://www.sunliner.de/bahama_jumbrella.html" > Bahama </a> <a class="submenu-item" title="Marke Bikatec / Schneider" href="https://www.sunliner.de/bikatec.html" > Bikatec / Schneider </a> <a class="submenu-item" "Marke Fim Umbrella" href="https://www.sunliner.de/fim_umbrella.html" > Fim Umbrella </a> <a class="submenu-item" title="Marke Glatz" href="https://www.sunliner.de/glatz.html" > Glatz </a> <a class="submenu-item" title="Marke Heatsail" href="https://www.sunliner.de/heatsail.html" > Heatsail </a> <a class="submenu-item" "Marke Instashade" href="https://www.sunliner.de/instashade.html" > Instashade </a> <a class="submenu-item" title="Marke Jardinico" href="https://www.sunliner.de/jardinico_sonnenschirme.html" > Jardinico </a> <a class="submenu-item" title="Marke Leiner" href="https://www.sunliner.de/leiner.html" > Leiner </a> <a class="submenu-item" title="Marke Liro" href="https://www.sunliner.de/liro.html" > Liro </a> <a class="submenu-item" title="Marke May" href="https://www.sunliner.de/may.html" > May </a> <a class="submenu-item" title="Marke MDT-Tex" href="https://www.sunliner.de/MDT_Sonnenschirme.html" > MDT-Tex </a> </div> <div class="flex flex-col w-full"> <a class="submenu-item" title="Marke Paraflex" href="https://www.sunliner.de/paraflex.html" > Paraflex </a> <a class="submenu-item" title="Marke Prostor" href="https://www.sunliner.de/prostor.html" > Prostor </a> <a class="submenu-item" title="Marke Schneider" href="https://www.sunliner.de/schneider.html" > Schneider </a> <a class="submenu-item" title="Marke Scolaro" href="https://www.sunliner.de/scolaro.html" > Scolaro </a> <a class="submenu-item" title="Marke Shademaker" href="https://www.sunliner.de/shademaker.html" > Shademaker </a> <a class="submenu-item" title="Marke Suncomfort" href="https://www.sunliner.de/suncomfort_by_glatz.html" > Suncomfort </a> <a class="submenu-item" title="Marke Tuuci" href="https://www.sunliner.de/tuuci.html" > Tuuci </a> <a class="submenu-item" title="Marke Umbrosa" href="https://www.sunliner.de/umbrosa.html" > Umbrosa </a> <a class="submenu-item" title="Marke Weishäupl" href="https://www.sunliner.de/weishaeupl.html" > Weishäupl </a> <a class="submenu-item" title="Marke Zangenberg" href="https://www.sunliner.de/zangenberg.html" > Zangenberg </a> </div> <div class="submenu-text"> <span class="w-full"> <img src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/sunliner-logo.svg" alt="" width="140" loading="lazy"/> </span> <span class="w-full"> Eine Auswahl der besten Marken </span> <span class="w-full font-normal leading-normal"> Vielleicht ist es nicht Ihr erster Sonnenschirm, den Sie kaufen möchten!? Aber nun soll es der Richtige sein! Alle führenden Marken finden Sie bei uns. </span> </div> </div> </li> <li x-data="{ drop: false, canHover: window.matchMedia('(hover:hover)').matches }" class="nav-menu-item" :class="{'nav-menu-item-dropped' : drop}" @touchend.self.stop="drop = !drop" @touchstart.outside.passive="drop = false" @mouseenter="if (canHover) { drop = true }" @mouseleave="if (canHover) { drop = false }" @keydown.window.escape="drop = false" @keydown.enter.stop="drop = !drop" tabindex="0" aria-label="Zubehör & Ersatzteile" > <span class="px-3.5 flex items-center gap-x-3" @touchend.stop="drop = !drop"> <span>Zubehör & Ersatzteile</span> <svg x-show="!drop" class="w-3 h-3 lg:w-1.5 lg:h-1.5 ml-auto lg:ml-0 fill-current" width="100%" height="100%" viewBox="0 0 9 5" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"> <g transform="matrix(1,0,0,1,-1575.68,-81.5688)"> <path d="M1580.19,85.29C1579.08,84.152 1577.97,83.013 1576.82,81.923C1576.35,81.481 1575.65,82.172 1576.11,82.63C1577.24,83.799 1578.41,84.924 1579.55,86.07C1579.95,86.465 1580.41,86.45 1580.82,86.07C1582.01,84.969 1583.14,83.809 1584.26,82.63C1584.45,82.43 1584.46,82.124 1584.26,81.923C1584.06,81.723 1583.75,81.734 1583.55,81.923C1582.4,83.013 1581.29,84.152 1580.19,85.29Z"/> </g> </svg> <svg x-show="drop" x-cloak class="w-3 h-3 lg:w-1.5 lg:h-1.5 ml-auto lg:ml-0 fill-current" width="100%" height="100%" viewBox="0 0 9 5" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"> <g transform="matrix(1,0,0,-1,-1575.68,86.5688)"> <path d="M1580.19,85.29C1579.08,84.152 1577.97,83.013 1576.82,81.923C1576.35,81.481 1575.65,82.172 1576.11,82.63C1577.24,83.799 1578.41,84.924 1579.55,86.07C1579.95,86.465 1580.41,86.45 1580.82,86.07C1582.01,84.969 1583.14,83.809 1584.26,82.63C1584.45,82.43 1584.46,82.124 1584.26,81.923C1584.06,81.723 1583.75,81.734 1583.55,81.923C1582.4,83.013 1581.29,84.152 1580.19,85.29Z"/> </g> </svg> </span> <div class="submenu-box lg:grid-cols-2 lg:w-125" x-show="drop" x-cloak> <div class="flex flex-col w-full"> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/bodenhuelsen.html" title="Kategorie Bodenhülsen"> <span>Bodenhülsen</span> </a> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/ersatzbespannungen.html" title="Kategorie Ersatzbespannungen"> <span>Ersatzbespannungen</span> </a> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/schirmstaender-sockel.html" title="Kategorie Schirmständer & Sockel"> <span>Schirmständer & Sockel</span> </a> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/schutzhuellen.html" title="Kategorie Schutzhüllen"> <span>Schutzhüllen</span> </a> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/wandhalterungen.html" title="Kategorie Wandhalterungen"> <span>Wandhalterungen</span> </a> <a class="submenu-item widget block block-category-link-inline" href="https://www.sunliner.de/sonstige-verankerungen.html" title="Kategorie Sonstige Verankerungen"> <span>Sonstige Verankerungen</span> </a> </div> <div class="submenu-text"> <span class="w-full"> <img src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/nav-cms-spare.jpg" alt="" width="92" loading="lazy"/> </span> <span class="w-full pl-1"> Mit uns halten Sie Ihren Sonnenschutz intakt </span> <span class="w-full pl-1 font-normal leading-normal"> SunLiner Sonneschirme sind immer eine gute Investition. Nachhaltigkeit ist uns besonders wichtig. Hier finden Ersatzteile und -bespannungen für viele unserer Schirme. </span> </div> </div> </li> <li> <a class="nav-menu-item px-3.5 widget block block-category-link-inline" href="https://www.sunliner.de/outdoor-lifestyle.html" title="Kategorie Outdoor-Lifestyle"> <span>Outdoor-Lifestyle</span> </a> </li> <li> <a class="nav-menu-item px-3.5 widget block block-category-link-inline" href="https://www.sunliner.de/sonnenschirme-angebote.html" title="Kategorie Sale"> <span>% Sale</span> </a> </li> <li id="parasol_finder" class="lg:ml-auto"> <a class="nav-menu-item px-3.5 widget block block-category-link-inline" href="https://www.sunliner.de/sonnenschirm-finder.html" title="Sonnenschirm-Finder"> <span>Sonnenschirm-Finder</span> </a> </li> </ul> </nav> </div> </div> <script> function initHeaderNavigation() { return { open: false, openMobileMenu() { this.open = true this.$nextTick(() => hyva.trapFocus(this.$refs['mobileMenuNavLinks'])); // Prevent from body scrolling while mobile menu opened document.body.style.position = 'fixed'; }, closeMobileMenu() { document.body.style.position = ''; if (this.open) { this.$nextTick(() => this.$refs['mobileMenuTrigger'].focus() || hyva.releaseFocus()); } this.open = false }, } } </script> <!-- Cart Drawer --> <script> function initCartDrawer() { return { open: false, isLoading: false, cart: {}, maxItemsToDisplay: 10, itemsCount: 0, getData(data) { if (data.cart) { this.cart = data.cart; this.itemsCount = data.cart.items && data.cart.items.length || 0; this.setCartItems(); } this.isLoading = false; }, cartItems: [], getItemCountTitle() { return hyva.strf('\u00250\u0020von\u0020\u00251\u0020Produkten\u0020im\u0020Warenkorb\u0020angezeigt', this.maxItemsToDisplay, this.itemsCount) }, setCartItems() { this.cartItems = this.cart.items && this.cart.items.sort((a, b) => b.item_id - a.item_id) || []; if (this.maxItemsToDisplay > 0) { this.cartItems = this.cartItems.slice(0, parseInt(this.maxItemsToDisplay, 10)); } }, deleteItemFromCart(itemId) { this.isLoading = true; const formKey = hyva.getFormKey(); const postUrl = BASE_URL + 'checkout/sidebar/removeItem/'; fetch(postUrl, { "headers": { "content-type": "application/x-www-form-urlencoded; charset=UTF-8", }, "body": "form_key=" + formKey + "&item_id=" + itemId, "method": "POST", "mode": "cors", "credentials": "include" }).then(response => { if (response.redirected) { window.location.href = response.url; } else if (response.ok) { return response.json(); } else { window.dispatchMessages && window.dispatchMessages([{ type: 'warning', text: 'Der\u0020Artikel\u0020konnte\u0020nicht\u0020aus\u0020dem\u0020Warenkorb\u0020entfernt\u0020werden.' }]); this.isLoading = false; } }).then(result => { window.dispatchMessages && window.dispatchMessages([{ type: result.success ? 'success' : 'error', text: result.success ? 'Sie\u0020haben\u0020die\u0020Artikel\u0020entfernt.' : result.error_message }], result.success ? 5000 : 0) window.dispatchEvent(new CustomEvent('reload-customer-section-data')); }); }, scrollLock(use = true) { document.body.style.overflow = use ? "hidden" : ""; }, toggleCartDrawer(event) { if (event.detail && event.detail.isOpen !== undefined) { if (event.detail.isOpen) { this.openCartDrawer(); } else { this.open = false; this.scrollLock(false); this.$refs && this.$refs.cartDialogContent && hyva.releaseFocus(this.$refs.cartDialogContent); } } else { this.openCartDrawer() } }, openCartDrawer() { this.open = true; this.scrollLock(true); this.$nextTick(() => { this.$refs && this.$refs.cartDialogContent && hyva.trapFocus(this.$refs.cartDialogContent) }) }, closeCartDrawer() { this.$dispatch('toggle-cart', { isOpen: false }) }, getSectionDataExtraActions() { if (!this.cart.extra_actions) { return ''; } const contentNode = document.createElement('div'); contentNode.innerHTML = this.cart.extra_actions; hyva.activateScripts(contentNode); return contentNode.innerHTML; } } } </script> <section x-cloak x-show="cart" id="cart-drawer" x-data="initCartDrawer()" @private-content-loaded.window="getData($event.detail.data)" @toggle-cart.window="toggleCartDrawer($event)" @keydown.escape="closeCartDrawer" > <div role="dialog" aria-labelledby="cart-drawer-title" aria-modal="true" :aria-hidden="!open" class="fixed inset-y-0 right-0 z-[110] flex max-w-full"> <div class="backdrop" x-show="open" x-transition:enter="ease-in-out duration-500" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in-out duration-500" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" role="button" @click="closeCartDrawer" aria-label="Mini-Warenkorb schließen"></div> <div class="relative w-screen max-w-md shadow-2xl" x-show="open" x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" x-transition:enter-start="translate-x-full" x-transition:enter-end="translate-x-0" x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" x-transition:leave-start="translate-x-0" x-transition:leave-end="translate-x-full" x-ref="cartDialogContent" role="region" :tabindex="open ? 0 : -1" aria-label="Mein Warenkorb" > <div class="flex flex-col h-full max-h-screen bg-white shadow-xl py-6 space-y-6 divide-y divide-sunliner-gray-lightest overflow-y-auto"> <header class="px-4 sm:px-6"> <h2 id="cart-drawer-title" class="text-lg"> <span x-text="cart.summary_count" class="font-bold"></span> <span x-show="cart.summary_count === 1">Artikel</span> <span x-show="cart.summary_count > 1">Artikel</span> <span>im Warenkorb</span> </h2> </header> <template x-if="!itemsCount"> <div class="relative px-4 py-6 bg-white border-bs sm:px-6 border-container"> Warenkorb ist leer </div> </template> <template x-if="itemsCount"> <div class="relative grid gap-6 sm:gap-8 px-4 py-6 sm:px-6 overflow-y-auto overscroll-y-contain min-h-screen-50"> <template x-for="item in cartItems"> <div class="flex gap-x-4 transition duration-150 ease-in-out"> <a :href="item.product_url" class="w-1/4" :aria-label="hyva.strf('Produkt\u0020\u0022\u00250\u0022', item.product_name)" > <img :src="item.product_image.src" :width="item.product_image.width" :height="item.product_image.height" loading="lazy" alt="" /> </a> <div class="w-3/4 flex flex-col gap-y-2"> <div> <p class="text-xl"> <span x-html="item.qty"></span> x <a class="text-sunliner-orange hover:text-sunliner-blue-light" :href="item.product_url" :aria-label="hyva.strf('Produkt\u0020\u0022\u00250\u0022', item.product_name)" > <span x-html="item.product_name"></span> </a> </p> </div> <template x-for="option in item.options"> <div class="pt-2"> <p class="font-semibold" x-text="option.label + ':'"></p> <p x-html="option.value"></p> </div> </template> <p><span class="font-bold" x-html="item.product_price"></span></p> <div class="max-w-max "> <button type="button" class="p-2 flex items-center gap-x-2 text-sunliner-orange-darker hover:text-sunliner-blue-light" @click="deleteItemFromCart(item.item_id)" :aria-label="hyva.strf('Produkt\u0020\u0022\u00250\u0022\u0020aus\u0020dem\u0020Warenkorb\u0020entfernen', item.product_name)" > <svg class="w-5 h-5 fill-current" viewBox="0 0 11 15" aria-hidden="true" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2"> <path id="Form-32-Kopie" d="M10.002,14.5l-9.098,0l0,-8.049l9.098,0l0,8.049Zm-6.452,-6.778l-0.975,0l0,5.931l0.975,0l0,-5.931Zm4.875,0l-0.975,0l0,5.931l0.975,0l0,-5.931Zm-2.437,0l-0.975,0l0,5.931l0.975,0l0,-5.931Zm4.526,-2.119l-10.028,0l0,-2.542l2.535,0c0.085,-1.009 0.651,-2.561 2.385,-2.561c1.732,0 2.228,1.552 2.466,2.561l2.642,0l0,2.542Zm-3.343,-2.118c0,-0.004 -0.243,-2.145 -1.822,-2.138c-1.506,0.008 -1.52,2.138 -1.52,2.138l3.342,0Z"/> </svg> <span>Artikel entfernen</span> </button> </div> </div> </div> </template> </div> </template> <template x-if="itemsCount"> <div> <div class="relative grid gap-5 px-4 py-6 sm:px-6"> <div class="w-full transition duration-150 ease-in-out"> <p>Warenkorb-Zwischensumme: <span class="font-bold text-lg" x-html="cart.subtotal"></span></p> </div> <div class="w-full transition duration-150 ease-in-out"> <a @click.prevent.stop="closeCartDrawer; $dispatch('toggle-authentication', {url: 'https://www.sunliner.de/checkout/'});" href="https://www.sunliner.de/checkout/" class="w-full btn btn-primary py-3.5"> Zur Kasse gehen </a> </div> <div class="w-full transition duration-150 ease-in-out"> <a href="https://www.sunliner.de/checkout/cart/" class="w-full flex justify-center items-center text-sunliner-orange hover:text-sunliner-blue-light"> Warenkorb ansehen und bearbeiten </a> </div> <div x-html="getSectionDataExtraActions()"></div> </div> </div> </template> </div> <button type="button" @click="closeCartDrawer" aria-label="Mini-Warenkorb schließen" class="absolute top-0 right-2 p-4 mt-2 text-gray-300 transition-colors duration-150 ease-in-out text-sunliner-gray hover:text-sunliner-brown-darker z-50" > <svg class="w-5 h-5 stroke-current" width="100%" height="100%" viewBox="0 0 13 13" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"> <g transform="matrix(1,0,0,1,-1589.38,-188.558)"> <path d="M1601.07,189.871L1590.69,200.246" style="fill:none;stroke-width:1px;"/> <g transform="matrix(-1,0,0,1,3191.76,0)"> <path d="M1601.07,189.871L1590.69,200.246" style="fill:none;stroke-width:1px;"/> </g> </g> </svg> </button> </div> <div class="flex flex-row justify-center items-center w-full h-full fixed select-none z-50" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-cloak x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"> <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 57 57" stroke="currentColor" class="text-primary" width="57" height="57" role="img"> <g fill="none" fill-rule="evenodd"> <g transform="translate(1 1)" stroke-width="2"> <circle cx="5" cy="50" r="5"> <animate attributeName="cy" begin="0s" dur="2.2s" values="50;5;50;50" calcMode="linear" repeatCount="indefinite"/> <animate attributeName="cx" begin="0s" dur="2.2s" values="5;27;49;5" calcMode="linear" repeatCount="indefinite"/> </circle> <circle cx="27" cy="5" r="5"> <animate attributeName="cy" begin="0s" dur="2.2s" from="5" to="5" values="5;50;50;5" calcMode="linear" repeatCount="indefinite"/> <animate attributeName="cx" begin="0s" dur="2.2s" from="27" to="27" values="27;49;5;27" calcMode="linear" repeatCount="indefinite"/> </circle> <circle cx="49" cy="50" r="5"> <animate attributeName="cy" begin="0s" dur="2.2s" values="50;50;5;50" calcMode="linear" repeatCount="indefinite"/> <animate attributeName="cx" from="49" to="49" begin="0s" dur="2.2s" values="49;5;27;49" calcMode="linear" repeatCount="indefinite"/> </circle> </g> </g> <title>loader</title></svg> <div class="ml-10 text-primary text-xl"> Laden... </div> </div> </div> </section> <!-- Authentication Pop-Up --> <script> function initAuthentication() { return { open: false, forceAuthentication: false, checkoutUrl: 'https://www.sunliner.de/checkout/index/', errors: 0, hasCaptchaToken: 0, displayErrorMessage: false, errorMessages: [], setErrorMessages: function setErrorMessages(messages) { this.errorMessages = [messages]; this.displayErrorMessage = this.errorMessages.length; }, submitForm: function () { // Do not rename $form, the variable is expected to be declared in the recaptcha output const $form = document.querySelector('#login-form'); if (this.errors === 0) { this.dispatchLoginRequest($form); } }, onPrivateContentLoaded: function (data) { const isLoggedIn = data.customer && data.customer.firstname; if (data.cart && !isLoggedIn) { this.forceAuthentication = !data.cart.isGuestCheckoutAllowed; } }, redirectIfAuthenticated: function (event) { if (event.detail && event.detail.url) { this.checkoutUrl = event.detail.url; } if (!this.forceAuthentication) { window.location.href = this.checkoutUrl; } }, dispatchLoginRequest: function(form) { this.isLoading = true; const username = this.$refs['customer-email'].value; const password = this.$refs['customer-password'].value; const formKey = hyva.getFormKey(); const bodyFields = { 'username': username, 'password': password, 'formKey': formKey }; const fieldName = 'g\u002Drecaptcha\u002Dresponse'; const recaptchaField = fieldName && form[fieldName]; if (recaptchaField) { bodyFields[fieldName] = recaptchaField.value; } fetch('https://www.sunliner.de/customer/ajax/login/', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, body: JSON.stringify(bodyFields) } ).then(response => { return response.json() } ).then(data=> { this.isLoading = false; if (data.errors) { dispatchMessages([{ type: 'error', text: data.message }], 5000); this.errors = 1; this.hasCaptchaToken = 0; } else { window.location.href = this.checkoutUrl; } }); } } } </script> <section id="authentication-popup" x-data="initAuthentication()" @private-content-loaded.window="onPrivateContentLoaded($event.detail.data)" @toggle-authentication.window="open = forceAuthentication; redirectIfAuthenticated(event)" @keydown.window.escape="open = false" > <div class="backdrop" aria-hidden="true" x-cloak x-show="open" x-transition:enter="ease-in-out duration-500" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in-out duration-500" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" @click="open = false" ></div> <div role="dialog" aria-modal="true" @click.outside="open = false" class="inset-y-0 right-0 z-30 flex max-w-full fixed" x-cloak x-show="open" > <div class="relative w-screen max-w-md pt-16 bg-container-lighter" x-show="open" x-cloak="" x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" x-transition:enter-start="translate-x-full" x-transition:enter-end="translate-x-0" x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" x-transition:leave-start="translate-x-0" x-transition:leave-end="translate-x-full" > <div x-show="open" x-cloak="" x-transition:enter="ease-in-out duration-500" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in-out duration-500" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" class="absolute top-0 right-2 flex p-2 mt-2"> <button type="button" @click="open = false;" aria-label="Panel schließen" class="p-2 text-gray-300 transition duration-150 ease-in-out hover:text-black" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> <title>Panel schließen</title></svg> </button> </div> <template x-if="open"> <div class="flex flex-col h-full py-6 space-y-6 bg-white shadow-xl overflow-y-auto"> <div class="block-customer-login bg-container border border-container mx-4 p-4 shadow-sm"> <p id="authenticate-customer-login" class="text-lg leading-7 text-gray-900"> <strong class="font-medium">Auschecken über Ihr Konto</strong> </p> <form class="form form-login" method="post" @submit.prevent="submitForm();" id="login-form" > <div class="fieldset login"> <div class="field email required"> <label class="label" for="form-login-username" form="login-form" > <span>E-Mail-Adresse</span> </label> <div class="control"> <input name="username" id="form-login-username" x-ref="customer-email" @change="errors = 0" type="email" required autocomplete="off" class="form-input input-text" > </div> </div> <div class="field password required"> <label for="form-login-password" class="label" form="login-form"> <span>Passwort</span> </label> <div class="control"> <input name="password" id="form-login-password" type="password" class="form-input input-text" required x-ref="customer-password" autocomplete="off" @change="errors = 0" > </div> </div> <input name="context" type="hidden" value="checkout" /> <div class="actions-toolbar flex justify-between pt-6 pb-2 items-center"> <button type="submit" class="inline-flex btn btn-primary disabled:opacity-75" > Anmelden </button> <a href="https://www.sunliner.de/customer/account/forgotpassword/" > Passwort vergessen? </a> </div> </div> </form> </div> <div class="mx-4"> </div> <div class="block-new-customer bg-container border border-container mx-4 p-4 shadow-sm"> <p id="authenticate-new-customer" class="text-lg mb-2 leading-7 text-gray-900"> <strong class="font-medium">Als Neukunde auschecken</strong> </p> <div class="block-content"> <p class="mb-1"> Ein Konto zu erstellen hat viele Vorteile: </p> <ul class="list-disc pl-5"> <li> Bestellungen und Sendungen verfolgen</li> <li> Alte Bestellungen einsehen</li> <li> Schneller zur Kasse gehen</li> </ul> <div class="actions-toolbar flex justify-between mt-6 mb-2 items-center"> <a href="https://www.sunliner.de/customer/account/create/" class="inline-flex btn btn-primary"> Registrieren </a> </div> </div> </div> </div> </template> </div> </div> </section> </div> </header><div class="top-container"><!--Glossary-Skip--> <nav class="breadcrumbs max-w-1300 w-full mx-auto my-5 px-5" aria-label="Breadcrumb"> <div class=""> <ol class="flex items-center text-xs text-sunliner-gray"> <li class="flex items-center home"> <a href="https://www.sunliner.de/" title="Zur Homepage"> <i class="svgsprite breadcrumb"></i> </a> </li> <li class="flex items-center category211"> <span aria-hidden="true" class="px-2"> <img class="w-2 h-2" src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/arrow-orange-r.svg" alt="" width="8" height="8"> </span> <a href="" aria-current="page" >Balkonschirme</a> </li> </ol> </div> </nav> <!--/Glossary-Skip--></div><main id="maincontent" class="page-main"><div id="contentarea" tabindex="-1"></div> <div class="page messages"><script> function initMessages() { "use strict"; return { messages: window.mageMessages || [], isEmpty() { return this.messages.reduce( function (isEmpty, message) { return isEmpty && message === undefined }, true ) }, removeMessage(messageIndex) { this.messages[messageIndex] = undefined; }, addMessages(messages, hideAfter) { messages.map((message) => { this.messages = this.messages.concat(message); if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) { hideAfter = window.defaultSuccessMessageTimeout; } if (hideAfter) { this.setHideTimeOut(this.messages.length -1, hideAfter); } }); }, setHideTimeOut(messageIndex, hideAfter) { setTimeout((messageIndex) => { this.removeMessage(messageIndex); }, hideAfter, messageIndex); }, eventListeners: { ['@messages-loaded.window'](event) { this.addMessages(event.detail.messages, event.detail.hideAfter) }, ['@private-content-loaded.window'](event) { const data = event.detail.data; if ( data.messages && data.messages.messages && data.messages.messages.length ) { this.addMessages(data.messages.messages); } }, ['@clear-messages.window']() { this.messages = []; } } } } </script> <section id="messages" x-data="initMessages()" x-bind="eventListeners" aria-live="assertive" role="alert" > <template x-if="!isEmpty()"> <div class="w-full"> <div class="messages container mx-auto py-3"> <template x-for="(message, index) in messages" :key="index"> <div> <template x-if="message"> <div class="message" :class="message.type" :ui-id="'message-' + message.type" > <span x-html="message.text"></span> <button type="button" class="text-white hover:text-sunliner-gray-darker" aria-label="Nachricht schließen" @click.prevent="removeMessage(index)" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="18" height="18" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> </svg> </button> </div> </template> </div> </template> </div> </div> </template> </section> </div> <div class="container xl:max-w-1300 flex flex-col md:flex-row flex-wrap font-bold justify-center items-center mt-6 mb-5 lg:mt-8 px-2.5 md:px-5"> <h1 class="page-title" > <span class="base" data-ui-id="page-title-wrapper" >Paraflex Balkonschirme</span> </h1> </div> <div id="category-view-container" class="category-view container"> <div class="category-description w-full lg:w-4/5 lg:min-h-[128px] mx-auto my-2.5 lg:text-left"> <div data-content-type="row" data-appearance="contained" data-element="main"> <div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-element="inner" style="justify-content: flex-start; display: flex; flex-direction: column; background-position: left top; background-size: cover; background-repeat: no-repeat; background-attachment: scroll; border-style: none; border-width: 1px; border-radius: 0px; margin: 0px 0px 10px; padding: 10px;"> <div data-content-type="html" data-appearance="default" data-element="main" style="border-style: none; border-width: 1px; border-radius: 0px; margin: 0px; padding: 0px;"> <p style="text-align: center;">Entdecken Sie die Balkonschirme des Herstellers Paraflex.</p> </div> </div> </div> </div> </div><div class="columns"><div class="column main"><section id="filters" class="order-first"> <div x-data="initLayeredNavigation()" x-init="checkIsMobileResolution()" @resize.window.debounce="checkIsMobileResolution()" @visibilitychange.window.debounce="checkIsMobileResolution()" class="relative w-full mt-11 flex justify-center border-t-4 border-sunliner-orange-lighter" role="region" aria-label="Produktfilter" > <h2 id="filters-heading" class="absolute -top-6" > <button type="button" @click="blockOpen = !blockOpen" class="max-w-max h-10 px-7 py-2 flex justify-start items-center gap-x-3.5 bg-sunliner-orange-darker text-white" aria-controls="filters-content" :aria-expanded="blockOpen" :aria-disabled="!isMobile" :disabled="!isMobile ? '' : null" > <i class="svgsprite filters"></i> <span class="text-xl font-bold uppercase"> Filter </span> <span class="flex lg:hidden w-5 h-5" x-ref="LayeredNavigationMobileToggleIcon" > <img x-show="!blockOpen" class="w-5 h-5" src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/arrow-filled-white-d.svg" alt="" width="20" height="20" aria-hidden="true" focusable="false" > <img x-cloak x-show="blockOpen" class="w-5 h-5" src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/arrow-filled-white-u.svg" alt="" width="20" height="20" aria-hidden="true" focusable="false" > </span> </button> </h2> <div id="filters-content" class="hidden w-full h-full bg-sunliner-gray-lightest border-b-2 border-white lg:flex flex-col items-center pb-7" :class="{ 'hidden' : isMobile && !blockOpen }" > <div class="lg:hidden max-w-1300 w-full px-2.5"> <div id="am-shopby-container" class="amshopby-filter-current filter-current mt-11 lg:mt-0 lg:mb-6 flex flex-col justify-center items-center gap-y-7" data-am-js="shopby-container"> <div class="flex flex-wrap justify-center items-center gap-x-5 gap-y-2.5"> <span class="block-subtitle filter-current-subtitle" role="heading" aria-level="2" data-role="title"> Filtern nach </span> <ol class="amshopby-items items flex flex-wrap gap-x-5 gap-y-2.5"> <li class="item amshopby-item flex items-center gap-x-1.5 border border-sunliner-orange-lighter bg-sunliner-gray-faint px-3 py-1" data-am-js="shopby-item" data-container="manufacturer" data-value="1433"> <a class="amshopby-remove text-sunliner-gray-dark" href="https://www.sunliner.de/balkonschirme.html" title="Entfernen Marke Paraflex"> <svg class="w-4 h-4 stroke-current" width="100%" height="100%" viewBox="0 0 13 13" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"> <g transform="matrix(1,0,0,1,-1589.38,-188.558)"> <path d="M1601.07,189.871L1590.69,200.246" style="fill:none;stroke-width:1px;"/> <g transform="matrix(-1,0,0,1,3191.76,0)"> <path d="M1601.07,189.871L1590.69,200.246" style="fill:none;stroke-width:1px;"/> </g> </g> </svg> </a> <span class="amshopby-filter-name font-bold capitalize flex"> Marke: </span> <div class="amshopby-filter-value"> Paraflex </div> </li> </ol> </div> <div class="block-actions filter-actions text-sm text-red-600 hover:text-sunliner-orange"> <a href="https://www.sunliner.de/balkonschirme.html" class="action clear filter-clear"> <span>Alles löschen</span> </a> </div> </div> </div> <a href="#product-list" class="sr-only focus:not-sr-only bg-sunliner-blue-light text-white focus:!px-4 focus:!py-2 text-center block !max-w-max focus:!mx-auto focus:!mt-6" > Zur Produktliste springen </a> <div class="block-content filter-content max-w-1300 w-full px-2.5 lg:px-16 xl:px-2.5 pt-11 pb-7 flex gap-x-5 flex-col flex-nowrap justify-start items-center lg:flex-row lg:flex-wrap lg:justify-center lg:items-start"> <div x-data="{ open: false, id: $id('filter-option') }" x-defer="intersect" class="filter-option relative w-full lg:w-max bg-white shadow-filter mb-4" :class="{'lg:mb-2 lg:pb-2' : open}" :id="`${id}`" > <h3 :id="`${id}-title`"> <button type="button" @click="open = !open" class="filter-options-title flex justify-between cursor-pointer w-full h-min min-w-40 px-2 py-2 bg-white group" :class="{ 'bg-sunliner-orange-darker lg:bg-white' : open, 'hover:bg-sunliner-blue-light' : !open }" :aria-controls="`${id}-content`" :aria-expanded="open" > <span class="title font-light text-sm capitalize" :class="{ 'text-white lg:text-sunliner-orange-darker group-hover:text-sunliner-blue-light' : open, 'group-hover:text-white' : !open }"> Marke <span class="sr-only"> Filter</span> </span> <span class="py-1 px-1 text-sunliner-blue-light" :class="{ 'text-white lg:text-sunliner-brown-lighter' : open,'text-sunliner-blue-light group-hover:text-white' : !open }"> <svg x-show="!open" class="w-2.5 h-2.5 fill-current" aria-hidden="true" focusable="false" width="100%" height="100%" viewBox="0 0 10 6" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"> <g transform="matrix(1,0,0,-1,-1222.93,565.876)"> <path d="M1227.93,560.22L1232.76,565.532L1223.1,565.532L1227.93,560.22Z"/> </g> </svg> <svg x-cloak x-show="open" class="w-2.5 h-2.5 fill-current" aria-hidden="true" focusable="false" width="100%" height="100%" viewBox="0 0 10 6" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"> <g transform="matrix(1,0,0,1,-1222.93,-559.876)"> <path d="M1227.93,560.22L1232.76,565.532L1223.1,565.532L1227.93,560.22Z"/> </g> </svg> </span> </button> </h3> <!-- We can't use the original <template> here, because the @click.outside then prevents the filter button from opening --> <div x-cloak x-show="open" :id="`${id}-content`" class="filter-options-content static lg:absolute z-50 top-full left-0 lg:min-w-80 max-h-125 px-6 py-3.5 bg-white shadow-filter overflow-y-auto" @click.outside="open = false" > <form class="am-ranges" data-am-js="ranges" data-amshopby-filter="manufacturer" data-amshopby-filter-request-var="manufacturer" autocomplete="off"> <ol class="items am-filter-items-manufacturer -am-multiselect space-y-3" > <li class="item relative" data-label="Glatz AG"> <a class="am-filter-item-674496827ff13" data-am-js="filter-item-default" href="https://www.sunliner.de/balkonschirme/manufacturer-paraflex-glatz.html" > <span class="label text-sunliner-gray hover:text-sunliner-orange-darker">Glatz AG</span> <span class="count text-sunliner-gray-light">(5)</span> </a> <input class="invisible absolute top-0 left-0" name="amshopby[manufacturer][]" value="659" type="checkbox" style="" /> <span class="amshopby-choice"></span> </li> <li class="item relative" data-label="Jardinico"> <a class="am-filter-item-674496828009f" data-am-js="filter-item-default" href="https://www.sunliner.de/balkonschirme/manufacturer-paraflex-jardinico_sonnenschirme.html" > <span class="label text-sunliner-gray hover:text-sunliner-orange-darker">Jardinico</span> <span class="count text-sunliner-gray-light">(1)</span> </a> <input class="invisible absolute top-0 left-0" name="amshopby[manufacturer][]" value="1815" type="checkbox" style="" /> <span class="amshopby-choice"></span> </li> <li class="item relative" data-label="Prostor"> <a class="am-filter-item-674496828016a" data-am-js="filter-item-default" href="https://www.sunliner.de/balkonschirme/manufacturer-paraflex-prostor.html" > <span class="label text-sunliner-gray hover:text-sunliner-orange-darker">Prostor</span> <span class="count text-sunliner-gray-light">(1)</span> </a> <input class="invisible absolute top-0 left-0" name="amshopby[manufacturer][]" value="1518" type="checkbox" style="" /> <span class="amshopby-choice"></span> </li> <li class="item relative" data-label="Umbrosa"> <a class="am-filter-item-674496828021e" data-am-js="filter-item-default" href="https://www.sunliner.de/balkonschirme/manufacturer-paraflex-umbrosa.html" > <span class="label text-sunliner-gray hover:text-sunliner-orange-darker">Umbrosa</span> <span class="count text-sunliner-gray-light">(5)</span> </a> <input class="invisible absolute top-0 left-0" name="amshopby[manufacturer][]" value="699" type="checkbox" style="" /> <span class="amshopby-choice"></span> </li> <li class="item -empty-value relative" data-label="Paraflex"> <a class="am-filter-item-67449682802c8" data-am-js="filter-item-default" href="https://www.sunliner.de/balkonschirme.html" > <span class="label text-sunliner-gray hover:text-sunliner-orange-darker">Paraflex</span> <span class="count text-sunliner-gray-light">(0)</span> </a> <input class="invisible absolute top-0 left-0" name="amshopby[manufacturer][]" value="1433" type="checkbox" style="" checked /> <span class="amshopby-choice"></span> </li> </ol> </form> </div> </div> </div> <div class="hidden lg:block max-w-1300"> <div id="am-shopby-container" class="amshopby-filter-current filter-current mt-11 lg:mt-0 lg:mb-6 flex flex-col justify-center items-center gap-y-7" data-am-js="shopby-container"> <div class="flex flex-wrap justify-center items-center gap-x-5 gap-y-2.5"> <span class="block-subtitle filter-current-subtitle" role="heading" aria-level="2" data-role="title"> Filtern nach </span> <ol class="amshopby-items items flex flex-wrap gap-x-5 gap-y-2.5"> <li class="item amshopby-item flex items-center gap-x-1.5 border border-sunliner-orange-lighter bg-sunliner-gray-faint px-3 py-1" data-am-js="shopby-item" data-container="manufacturer" data-value="1433"> <a class="amshopby-remove text-sunliner-gray-dark" href="https://www.sunliner.de/balkonschirme.html" title="Entfernen Marke Paraflex"> <svg class="w-4 h-4 stroke-current" width="100%" height="100%" viewBox="0 0 13 13" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"> <g transform="matrix(1,0,0,1,-1589.38,-188.558)"> <path d="M1601.07,189.871L1590.69,200.246" style="fill:none;stroke-width:1px;"/> <g transform="matrix(-1,0,0,1,3191.76,0)"> <path d="M1601.07,189.871L1590.69,200.246" style="fill:none;stroke-width:1px;"/> </g> </g> </svg> </a> <span class="amshopby-filter-name font-bold capitalize flex"> Marke: </span> <div class="amshopby-filter-value"> Paraflex </div> </li> </ol> </div> <div class="block-actions filter-actions text-sm text-red-600 hover:text-sunliner-orange"> <a href="https://www.sunliner.de/balkonschirme.html" class="action clear filter-clear"> <span>Alles löschen</span> </a> </div> </div> </div> </div> </div> </section> <script> function initLayeredNavigation() { return { isMobile: false, blockOpen: false, checkIsMobileResolution() { const mobileElement = this.$refs.LayeredNavigationMobileToggleIcon; this.isMobile = mobileElement ? getComputedStyle(mobileElement).display !== "none" : window.matchMedia('(max-width: 1023px)').matches; // Fallback to `lg` breakpoint } } } </script> <script> if (window.require) { require(['jquery', 'domReady!'], function($){ if ($('.mfblogunveil').length) { require(['Magefan_Blog/js/lib/mfblogunveil'], function(){ $('.mfblogunveil').mfblogunveil(); }); } }); } else { /* e.g. hyva theme */ document.addEventListener("DOMContentLoaded", function(){ var items = document.getElementsByClassName('mfblogunveil'); var el, url; if (items.length) { for (var i=0; i<items.length;i++) { el = items[i]; url = el.getAttribute('data-original'); if (!url) { continue; } if ('IMG' == el.tagName) { el.src = url; } else { el.style.backgroundImage = "url('" + url + "')"; } } } }); } </script> <div id="amasty-shopby-product-list"> <div class="message info empty"> <div> Wir können keine Produkte entsprechend dieser Auswahl finden </div> </div> </div> <script type="text/x-magento-init"> { ".sidebar #narrow-by-list": { "accordion": { "multipleCollapsible": true, "active": [0] } } } </script> <script type="text/x-magento-init"> { ".products-grid, .products-list": { "amShopbySwatchesChoose": { "listSwatches": [{"manufacturer":"1433"}] } } } </script> <script type="text/x-magento-init"> { "#narrow-by-list": { "amShopbyFiltersSync": { } } } </script> <script> 'use strict'; function initBrandSliderComponent() { return { active: 0, itemCount: 21, getSlider() { return this.$root.querySelector('.js_slides'); }, pageSize: 1, pageFillers: 0, calcPageSize() { const slider = this.getSlider(); if (slider) { this.pageSize = Math.round(slider.clientWidth / slider.querySelector('.js_slide').clientWidth); this.pageFillers = ( this.pageSize * Math.ceil(this.itemCount / this.pageSize) ) - this.itemCount; } }, calcActive(event) { const slider = this.getSlider(); if (slider) { this.active = Math.ceil( Math.round( slider.scrollLeft / (slider.scrollWidth / this.itemCount) ) / this.pageSize ) * this.pageSize; } }, skipCarouselToNavigation(navSelector) { const element = document.getElementById(navSelector) if (element) { element.scrollIntoView({behavior: 'smooth', block: 'end'}); const button = element.querySelector('button:not([disabled])'); this.$nextTick(() => button && button.focus({preventScroll: true})) } } } } </script> <section class="w-full my-3" x-data="initBrandSliderComponent()" x-init="calcPageSize();" x-id="['slider-nav', 'slider-desc', 'slider-id']" x-on:resize.window.debounce="calcPageSize(); $nextTick( function() { calcActive() })" role="group" aria-roledescription="Karussell" aria-label="Karussell Top Marken" :aria-describedby="$id('slider-desc')" x-defer="intersect" > <div class="relative container max-w-screen xl:max-w-1300"> <div class="container mb-6 pt-6 pb-3 flex flex-col items-center md:flex-row border-b border-sunliner-gray-lightest"> <h3 class="text-1.5xl font-light"> Top Marken </h3 > </div> <span class="sr-only" :id="$id('slider-desc')" tabindex="-1" > Mit der Tabulatortaste können Sie durch die Elemente des Karussells navigieren. Mit den Skip-Links können Sie das Karussell überspringen oder direkt zur Karussellnavigation wechseln. </span> <a href="#-slider-end" class="action skip sr-only focus:not-sr-only focus:absolute focus:z-30 focus:bg-white" > Clicken, um das Karussell zu überspringen </a> <button x-show="itemCount > pageSize" type="button" class="action skip sr-only focus:not-sr-only focus:absolute focus:z-30 focus:bg-white" x-on:click.prevent="skipCarouselToNavigation($id('slider-nav'))" > Clicken, um zur Karussell-Navigation zu gelangen </button> <div class="relative w-full container overflow-x-hidden focus-within:ring-2 ring-offset-2 active:ring-0 ring-blue-500/50"> <div class="relative flex flex-nowrap w-full overflow-auto js_slides snap transition-all" id="top-marken" :class="{'justify-center' : itemCount < 2}" x-on:scroll.debounce="calcActive" > <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="1 > active && 1 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 1" :aria-describedby="`slide-desc-1-${$id('slider-id')}`"> <a href="https://www.sunliner.de/bahama_jumbrella.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-1-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/BAHAMA_LogoRGB_Kopie.png" alt="Bahama GmbH" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="2 > active && 2 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 2" :aria-describedby="`slide-desc-2-${$id('slider-id')}`"> <a href="https://www.sunliner.de/bambrella.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-2-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/manufacturers/files/b/a/bambrella-logo-mar-15.jpg" alt="Bambrella" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="3 > active && 3 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 3" :aria-describedby="`slide-desc-3-${$id('slider-id')}`"> <a href="https://www.sunliner.de/bikatec.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-3-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/manufacturers/files/b/i/bikatec.jpg" alt="BiKATEC" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="4 > active && 4 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 4" :aria-describedby="`slide-desc-4-${$id('slider-id')}`"> <a href="https://www.sunliner.de/fim_umbrella.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-4-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/manufacturers/files/l/o/logo-fim.jpeg" alt="FIM umbrella Sonnenschirme" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="5 > active && 5 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 5" :aria-describedby="`slide-desc-5-${$id('slider-id')}`"> <a href="https://www.sunliner.de/glatz.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-5-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/01_glatz_logo_pos_rgb_large.png" alt="Glatz Sonnenschirme" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="6 > active && 6 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 6" :aria-describedby="`slide-desc-6-${$id('slider-id')}`"> <a href="https://www.sunliner.de/heatsail.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-6-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/Heatsail-LOGO_horizontal-6.png" alt="HEATSAIL" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="7 > active && 7 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 7" :aria-describedby="`slide-desc-7-${$id('slider-id')}`"> <a href="https://www.sunliner.de/instashade.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-7-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/manufacturers/files/i/n/instashade_logo.jpg" alt="InstaShade" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="8 > active && 8 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 8" :aria-describedby="`slide-desc-8-${$id('slider-id')}`"> <a href="https://www.sunliner.de/jardinico_sonnenschirme.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-8-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/Jardinico_Logo.png" alt="Jardinico Sonnenschirme - Belgisches Design in Vollendung" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="9 > active && 9 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 9" :aria-describedby="`slide-desc-9-${$id('slider-id')}`"> <a href="https://www.sunliner.de/leiner.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-9-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/manufacturers/files/l/e/leiner_markisen.jpg" alt="Leiner Markisen" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="10 > active && 10 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 10" :aria-describedby="`slide-desc-10-${$id('slider-id')}`"> <a href="https://www.sunliner.de/lume.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-10-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/manufacturers/files/l/u/lume_logo.png" alt="Lume" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="11 > active && 11 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 11" :aria-describedby="`slide-desc-11-${$id('slider-id')}`"> <a href="https://www.sunliner.de/mdt_sonnenschirme.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-11-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/MDT_Logo_2_.png" alt="MDT-tex" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="12 > active && 12 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 12" :aria-describedby="`slide-desc-12-${$id('slider-id')}`"> <a href="https://www.sunliner.de/may.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-12-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/manufacturers/files/m/a/may-sonnenschirme_logo.gif" alt="May Sonnenschirme" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="13 > active && 13 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 13" :aria-describedby="`slide-desc-13-${$id('slider-id')}`"> <a href="https://www.sunliner.de/liro.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-13-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/Logo_Tranparent_300_p_pro_zoll_klein_2_5_x_4_cm_Hintergrund_wei_.png" alt="Nertes GmbH LiRo" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="14 > active && 14 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 14" :aria-describedby="`slide-desc-14-${$id('slider-id')}`"> <a href="https://www.sunliner.de/scolaro.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-14-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/Scolaro.png" alt="Scolaro Sonnenschirme" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="15 > active && 15 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 15" :aria-describedby="`slide-desc-15-${$id('slider-id')}`"> <a href="https://www.sunliner.de/shademaker.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-15-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/manufacturers/files/s/h/shademaker_logo_3.jpg" alt="Shademaker Sonnenschirme" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="16 > active && 16 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 16" :aria-describedby="`slide-desc-16-${$id('slider-id')}`"> <a href="https://www.sunliner.de/sunliner.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-16-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/manufacturers/files/s/u/sun_logo-2014_09_rz_2.jpg" alt="SunLiner" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="17 > active && 17 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 17" :aria-describedby="`slide-desc-17-${$id('slider-id')}`"> <a href="https://www.sunliner.de/suncomfort_by_glatz.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-17-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/Suncomfort_Logo.jpg" alt="Suncomfort" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="18 > active && 18 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 18" :aria-describedby="`slide-desc-18-${$id('slider-id')}`"> <a href="https://www.sunliner.de/tuuci.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-18-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/Tuuci_klein.jpg" alt="TUUCI® Sonnenschirme und Ampelschirme" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="19 > active && 19 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 19" :aria-describedby="`slide-desc-19-${$id('slider-id')}`"> <a href="https://www.sunliner.de/umbrosa.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-19-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/Umbrosa_Logo_1.png" alt="UMBROSA NV Sonnensegel" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="20 > active && 20 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 20" :aria-describedby="`slide-desc-20-${$id('slider-id')}`"> <a href="https://www.sunliner.de/weishaeupl.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-20-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/Weishaeupl_Logo_NEU.png" alt="Weishäupl Sonnenschirme" loading="lazy" width="130" height="90" /> </a> </div> <div class="js_slide flex-none w-full py-1 md:w-1/2 lg:w-1/3 xl:w-1/4" role="group" :aria-hidden="21 > active && 21 <= (active + pageSize) ? 'false' : 'true'" aria-label="Posten 21" :aria-describedby="`slide-desc-21-${$id('slider-id')}`"> <a href="https://www.sunliner.de/zangenberg.html" class="w-full h-full flex justify-center items-center bg-white" :id="`slide-desc-21-${$id('slider-id')}`" > <img class="pb-3 self-center" src="https://www.sunliner.de/media/amasty/shopby/option_images/manufacturers/files/z/a/zangenberg.png" alt="Zangenberg Sonnenschirme" loading="lazy" width="130" height="90" /> </a> </div> </div> </div> <template x-if="itemCount > pageSize"> <div class="w-full flex justify-center items-center p-4" :id="$id('slider-nav')" x-cloak > <button type="button" aria-label="Vorherige Folie" :disabled="active === 0" class="w-8 h-8 btn mx-2 xs:mx-4 p-0 text-sunliner-gray" :class="{ 'invisible' : active === 0 }" x-on:click="getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * (active-pageSize); active=active-pageSize;"> <img class="w-6 h-6" src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/arrow-gray-l.svg" alt="" aria-hidden="true" /> </button> <div class="flex flex-wrap justify-center items-center gap-y-2"> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(0 % pageSize)) }" :aria-current="active === 0" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (0 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 0; active=0;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 0, 'bg-sunliner-blue-light': active === 0, 'hidden': (pageSize !== 1 && !!(0 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 0; active=0;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(1 % pageSize)) }" :aria-current="active === 1" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (1 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 1; active=1;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 1, 'bg-sunliner-blue-light': active === 1, 'hidden': (pageSize !== 1 && !!(1 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 1; active=1;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(2 % pageSize)) }" :aria-current="active === 2" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (2 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 2; active=2;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 2, 'bg-sunliner-blue-light': active === 2, 'hidden': (pageSize !== 1 && !!(2 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 2; active=2;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(3 % pageSize)) }" :aria-current="active === 3" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (3 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 3; active=3;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 3, 'bg-sunliner-blue-light': active === 3, 'hidden': (pageSize !== 1 && !!(3 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 3; active=3;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(4 % pageSize)) }" :aria-current="active === 4" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (4 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 4; active=4;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 4, 'bg-sunliner-blue-light': active === 4, 'hidden': (pageSize !== 1 && !!(4 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 4; active=4;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(5 % pageSize)) }" :aria-current="active === 5" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (5 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 5; active=5;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 5, 'bg-sunliner-blue-light': active === 5, 'hidden': (pageSize !== 1 && !!(5 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 5; active=5;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(6 % pageSize)) }" :aria-current="active === 6" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (6 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 6; active=6;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 6, 'bg-sunliner-blue-light': active === 6, 'hidden': (pageSize !== 1 && !!(6 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 6; active=6;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(7 % pageSize)) }" :aria-current="active === 7" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (7 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 7; active=7;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 7, 'bg-sunliner-blue-light': active === 7, 'hidden': (pageSize !== 1 && !!(7 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 7; active=7;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(8 % pageSize)) }" :aria-current="active === 8" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (8 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 8; active=8;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 8, 'bg-sunliner-blue-light': active === 8, 'hidden': (pageSize !== 1 && !!(8 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 8; active=8;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(9 % pageSize)) }" :aria-current="active === 9" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (9 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 9; active=9;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 9, 'bg-sunliner-blue-light': active === 9, 'hidden': (pageSize !== 1 && !!(9 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 9; active=9;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(10 % pageSize)) }" :aria-current="active === 10" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (10 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 10; active=10;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 10, 'bg-sunliner-blue-light': active === 10, 'hidden': (pageSize !== 1 && !!(10 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 10; active=10;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(11 % pageSize)) }" :aria-current="active === 11" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (11 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 11; active=11;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 11, 'bg-sunliner-blue-light': active === 11, 'hidden': (pageSize !== 1 && !!(11 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 11; active=11;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(12 % pageSize)) }" :aria-current="active === 12" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (12 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 12; active=12;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 12, 'bg-sunliner-blue-light': active === 12, 'hidden': (pageSize !== 1 && !!(12 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 12; active=12;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(13 % pageSize)) }" :aria-current="active === 13" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (13 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 13; active=13;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 13, 'bg-sunliner-blue-light': active === 13, 'hidden': (pageSize !== 1 && !!(13 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 13; active=13;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(14 % pageSize)) }" :aria-current="active === 14" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (14 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 14; active=14;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 14, 'bg-sunliner-blue-light': active === 14, 'hidden': (pageSize !== 1 && !!(14 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 14; active=14;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(15 % pageSize)) }" :aria-current="active === 15" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (15 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 15; active=15;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 15, 'bg-sunliner-blue-light': active === 15, 'hidden': (pageSize !== 1 && !!(15 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 15; active=15;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(16 % pageSize)) }" :aria-current="active === 16" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (16 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 16; active=16;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 16, 'bg-sunliner-blue-light': active === 16, 'hidden': (pageSize !== 1 && !!(16 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 16; active=16;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(17 % pageSize)) }" :aria-current="active === 17" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (17 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 17; active=17;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 17, 'bg-sunliner-blue-light': active === 17, 'hidden': (pageSize !== 1 && !!(17 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 17; active=17;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(18 % pageSize)) }" :aria-current="active === 18" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (18 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 18; active=18;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 18, 'bg-sunliner-blue-light': active === 18, 'hidden': (pageSize !== 1 && !!(18 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 18; active=18;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(19 % pageSize)) }" :aria-current="active === 19" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (19 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 19; active=19;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 19, 'bg-sunliner-blue-light': active === 19, 'hidden': (pageSize !== 1 && !!(19 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 19; active=19;" > </span> <button type="button" :class="{ 'hidden': (pageSize !== 1 && !!(20 % pageSize)) }" :aria-current="active === 20" :aria-label="hyva.str('Folie\u0020anzeigen\u0020\u00251', (20 / pageSize) + 1)" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 20; active=20;" > <span class="shrink-0 block w-4 h-4 mx-1 hover:bg-sunliner-orange-lighter cursor-pointer" :class="{ 'bg-sunliner-gray-lightest': active !== 20, 'bg-sunliner-blue-light': active === 20, 'hidden': (pageSize !== 1 && !!(20 % pageSize)) }" x-on:click=" getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * 20; active=20;" > </span> </div> <button type="button" aria-label="Next Slide" :disabled="active >= itemCount-pageSize" class="w-8 h-8 btn mx-2 xs:mx-4 p-0 text-sunliner-gray-lighter" :class="{ 'invisible' : active >= itemCount-pageSize }" x-on:click="getSlider().scrollLeft = (getSlider().scrollWidth / itemCount) * (active+pageSize); active=active+pageSize"> <img class="w-6 h-6" src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/arrow-gray-r.svg" alt="" aria-hidden="true" /> </button> </div> </template> <span id="-slider-end" tabindex="-1"></span> </div> </section> <div data-am-js="js-init"> <script type="text/x-magento-init"> { "[data-am-js='filter-item-default']": { "amShopbyFilterItemDefault": { "collectFilters": 0, "clearUrl": "https://www.sunliner.de/balkonschirme.html" } }, "*": { "amShopbyResponsive": {} } } </script> </div> <section class="w-full container"> <div class="category-cms container xl:max-w-1300 flex justify-center"> <div class="w-full md:w-4/5"> </div> </div> <div class="amshopby-filters-bottom-cms container xl:max-w-1300 flex justify-center"> <div class="w-full md:w-4/5"> </div> </div> </section></div></div></main><footer class="page-footer"><div class="footer content"><footer class="container max-w-1300 pb-5 pt-10"> <div class="flex flex-col gap-y-9"> <div class="w-full grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-x-2 gap-y-6 xl:gap-x-5 pb-7"> <div class="flex flex-col gap-y-2.5"> <a class="mb-2" href="https://www.sunliner.de/"> <img src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/sunliner-logo.svg" alt="Sunliner Logo" width="168" height="63" loading="lazy"/> </a> <p class="text-white">Ihr zuverlässiger und professioneller Spezialist für Sonnenschirme</p> <p class="text-sunliner-gray text-xs">Besuchen Sie uns auch auf:</p> <div class="flex gap-x-3.5"> <a href="https://www.facebook.com/Sunliner/" target="_blank" class="svgsprite facebook"></a> <a href="https://www.twitter.com/Schirmprofi/" target="_blank" class="svgsprite twitter"></a> </div> </div> <div class="flex flex-col gap-y-2"> <div class="flex items-center gap-x-3 mb-2"> <i class="svgsprite payment"></i> <h3>Zahlung & Versand</h3> </div> <a href="https://www.sunliner.de/zahlung/" class="w-full grid grid-cols-2 sm:grid-cols-3 grid-rows-4 sm:grid-rows-3 gap-2 justify-center items-center payment-icons"> <span class="w-full h-full col-span-1 flex justify-center items-center px-2 py-2 bg-sunliner-gray-lightest hover:opacity-80"><i class="z-10 svgsprite visa"></i></span> <span class="w-full h-full col-span-1 flex justify-center items-center px-2 py-2 bg-sunliner-gray-lightest hover:opacity-80"><i class="z-10 svgsprite mastercard"></i></span> <span class="w-full h-full col-span-1 flex justify-center items-center px-2 py-2 bg-sunliner-gray-lightest hover:opacity-80"><i class="z-10 svgsprite amex"></i></span> <span class="w-full h-full col-span-1 flex justify-center items-center px-2 py-2 bg-sunliner-gray-lightest hover:opacity-80"><i class="z-10 svgsprite paypal"></i></span> <span class="w-full h-full col-span-1 flex justify-center items-center px-2 py-2 bg-sunliner-gray-lightest hover:opacity-80"><i class="z-10 svgsprite applepay"></i></span> <span class="w-full h-full col-span-1 flex justify-center items-center px-2 py-2 bg-sunliner-gray-lightest hover:opacity-80"><i class="z-10 svgsprite instant"></i></span> <span class="w-full h-full col-span-1 sm:col-span-2 flex justify-center items-center px-2 py-2 bg-sunliner-gray-lightest hover:opacity-80"><i class="z-10 svgsprite klarna"></i></span> <span class="w-full h-full col-span-1 flex justify-center items-center px-2 py-2 bg-sunliner-gray-lightest hover:opacity-80"><i class="z-10 svgsprite advance"></i></span> </a> <a href="https://www.sunliner.de/service/" class="flex items-center gap-x-2.5 xl:gap-x-10 p-4 text-white text-xs hover:bg-sunliner-orange hover:text-white"> <i class="svgsprite shipping"></i> <span class="max-w-xxs">Keine Versandkosten innerhalb Deutschlands</span> </a> </div> <div class="flex flex-col gap-y-4"> <div class="flex items-center gap-x-3"> <i class="svgsprite newsletter"></i> <h3>Sunliner Newsletter</h3> </div> <form class="subscribe flex flex-wrap" action="https://www.sunliner.de/newsletter/subscriber/new/" method="post" x-data="initNewsletterForm()" @submit.prevent="submitForm()" id="newsletter-validate-detail" aria-label="Newsletter abonnieren" > <div class="w-3/5 flex items-center border-b border-sunliner-orange-lighter"> <div class="w-full flex items-center gap-x-1"> <img class="w-5 h-3.5 text-sunliner-gray fill-current" src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/mail.svg" alt=""> <label for="newsletter-subscribe" class="m-0"> <span class="sr-only"> E-Mail-Adresse </span> <input name="email" type="email" required id="newsletter-subscribe" class="w-full p-0 bg-transparent border-none placeholder-sunliner-gray-lightest placeholder-opacity-25 text-sm text-sunliner-gray-lightest focus:outline-none focus:ring-0" placeholder="Ihre E-Mail Adresse" aria-describedby="footer-newsletter-heading" > <input name="form_key" type="hidden" value="1plvjgWg8pdWkJse" /> </label> </div> </div> <button class="btn btn-secondary w-2/5 -ml-px mb-0.5 py-1.5 font-light text-sm"> <span>Abonnieren</span> </button> <div> <template x-if="displayErrorMessage"> <p class="flex items-center text-red"> <span class="inline-block w-8 h-8 mr-3"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/> </svg> </span> <template x-for="errorMessage in errorMessages"> <span x-html="errorMessage"></span> </template> </p> </template> </div> </form> <div class="w-full"> </div> <span class="w-60 text-sunliner-gray text-xs leading-loose"> Sie können den Newsletter jederzeit wieder abbestellen </span> <script> function initNewsletterForm() { return { errors: 0, hasCaptchaToken: 0, displayErrorMessage: false, errorMessages: [], setErrorMessages(messages) { this.errorMessages = [messages] this.displayErrorMessage = this.errorMessages.length }, submitForm() { // Do not rename $form, the variable is expected to be declared in the recaptcha output const $form = document.querySelector('#newsletter-validate-detail'); if (this.errors === 0) { $form.submit(); } } } } </script> </div> <div class="flex flex-col gap-y-3"> <div class="flex items-center gap-x-3"> <i class="svgsprite hotline"></i> <h3>Hotline: 0541 - 200 27 31</h3> </div> <span class="text-sm ml-10">Servicezeiten:<br>Montag bis Freitag 08:30 bis 18:00 Uhr</span> <a class="group mt-2 ml-10 flex hover:text-white" href="https://api.whatsapp.com/message/PL2SIAUEFEESK1?autoload=1&app_absent=0" target="_blank"> <img class="w-14 z-10" src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/whatsapp-business.svg" alt="WhatsApp Logo" width="56" height="56" loading="lazy"/> <div class="w-full mt-px mb-0.5 -ml-7 flex items-center bg-sunliner-brown-lighter group-hover:bg-sunliner-orange"> <span class="ml-10 text-sm"> Kontaktieren Sie uns via ­ <span class="font-semibold text-lg leading-5">WhatsApp</span> </span> </div> </a> </div></div><div class="w-full grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-x-2 gap-y-6 xl:gap-x-5 pt-7 border-t border-sunliner-brown-lighter"><div class="justify-self-center mt-7"> <a href="https://www.CO2neutralwebsite.de/crt/dispcust/c/5554/l/4" target="_blank"> <img src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/images/co2.png" alt="" width="140" height="51" loading="lazy"/> </a> </div> <div class="flex flex-col gap-y-2"> <h3 class="mb-1.5 text-sunliner-orange">Ihr Einkauf bei uns</h3> <a href="https://www.sunliner.de/zahlung/">Zahlungsarten</a> <a href="https://www.sunliner.de/service/">Versand / Retoure</a> <a href="https://www.sunliner.de/widerruf/">Widerrufsbelehrung</a> </div><div class="flex flex-col gap-y-2"> <h3 class="mb-1.5 text-sunliner-orange">Weitere Informationen</h3> <a href="https://www.sunliner.de/blog/">Blog</a> <a href="https://www.sunliner.de/sonnenschirm-lexikon.html"> Sonnenschirm-Lexikon</a> <a href="https://www.sunliner.de/faq/">FAQ</a> <a href="https://www.sunliner.de/ueber-uns/">Über uns</a> <a href="https://www.sunliner.de/contact/">Kontakt</a> </div><div class="flex flex-col gap-y-2"> <h3 class="mb-1.5 text-sunliner-orange">Gesetzliche Angaben</h3> <a href="https://www.sunliner.de/datenschutzerklaerung/">Datenschutz</a> <a href="javascript: Cookiebot.renew()">Cookie-Einwilligung</a> <a href="https://www.sunliner.de/batteriegesetz/">Batteriegesetz</a> <a href="https://www.sunliner.de/agb/">AGB</a> <a href="https://www.sunliner.de/impressum/">Impressum</a> </div> </div> <div class="w-full flex flex-col justify-center text-sunliner-gray-light text-xxs text-center pt-6 lg:pt-0"> <span>Alle Preise inkl. der gesetzl. MwSt.</span> <span>Die durchgestrichenen Preise entsprechen dem bisherigen Preis bei Sunliner</span> <span>© 2024 SunLiner GmbH Alle Rechte vorbehalten</span> </div> </div> </footer> </div></footer> <script> function loadTrustedShopsWidget() { var _tsid = 'X69B028C7DECCB7B48277310B07990616'; _tsConfig = { 'yOffset': '120', /* offset from page bottom */ 'variant': 'reviews', /* text, default, small, reviews, custom, custom_reviews */ 'customElementId': '', /* required for variants custom and custom_reviews */ 'trustcardDirection': '', /* for custom variants: topRight, topLeft, bottomRight, bottomLeft */ 'customBadgeWidth': '', /* for custom variants: 40 - 90 (in pixels) */ 'customBadgeHeight': '', /* for custom variants: 40 - 90 (in pixels) */ 'disableResponsive': 'false', /* deactivate responsive behaviour */ 'disableTrustbadge': 'false', /* deactivate trustbadge */ 'trustCardTrigger': 'mouseenter', /* set to 'click' if you want the trustcard to be opened on click instead */ 'customCheckoutElementId': '' /* required for custom trustcard */ }; var _ts = document.createElement('script'); _ts.type = 'text/javascript'; _ts.charset = 'utf-8'; _ts.async = true; _ts.src = '//widgets.trustedshops.com/js/' + _tsid + '.js'; var __ts = document.getElementsByTagName('script')[0]; __ts.parentNode.insertBefore(_ts, __ts); } document.body.addEventListener('touchstart', loadTrustedShopsWidget, {once: true}); document.body.addEventListener('mouseover', loadTrustedShopsWidget, {once: true}); </script> <script src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/IMI_FriendlyCaptcha/js/vendor/friendly-challenge/widget.module.min.js" type="module" async></script> <script data-mfmofile="true"> document.addEventListener("DOMContentLoaded", function() { if (document.querySelectorAll('.mf-ytw-wrapper').length || document.querySelectorAll('[data-mf-ytw-youtube-link]').length) { !function (f, b, e, v, t, s) { if(f.mfytwcss)return; f.mfytwcss=1; t = b.createElement(e); t.rel = 'stylesheet'; t.type = 'text/css'; t.href = v; s = b.getElementsByTagName('HEAD')[0]; s.appendChild(t) }(window, document, 'link', 'https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/Magefan_YouTubeWidget/css/youtubewidget.css'); } if (document.querySelectorAll('.mf-ytw-wrapper').length) { !function (f, b, e, v, t, s) { if(f.mfytwjs)return; f.mfytwjs=1; t = b.createElement(e); t.type = 'text/javascript'; t.src = v; s = b.getElementsByTagName('HEAD')[0]; s.appendChild(t) }(window, document, 'script', 'https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/Magefan_YouTubeWidget/js/iframe.js'); } if (document.querySelectorAll('[data-mf-ytw-youtube-link]').length) { !function (f, b, e, v, t) { if(f.mflinkjs)return; f.mflinkjs=1; t = b.createElement(e); t.type = 'text/javascript'; t.src = v; s = b.getElementsByTagName('HEAD')[0]; s.appendChild(t) }(window, document, 'script', 'https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/Magefan_YouTubeWidget/js/link.js'); } }); </script> <!--Start of Tawk.to Script--> <script> var Tawk_API=Tawk_API||{}, Tawk_LoadStart=new Date(); function loadTawkChatWidget() { var s1=document.createElement("script"),s0=document.getElementsByTagName("script")[0]; s1.async=true; s1.src='https://embed.tawk.to/5da9f44ddf22d913399fe135/default'; s1.charset='UTF-8'; s1.setAttribute('crossorigin','*'); s0.parentNode.insertBefore(s1,s0); } document.body.addEventListener('touchstart', loadTawkChatWidget, {once: true}); document.body.addEventListener('mouseover', loadTawkChatWidget, {once: true}); </script> <!--End of Tawk.to Script--> <script> (() => { function src_default(Alpine) { Alpine.directive("intersect", (el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { let evaluate = evaluateLater(expression); let options = { rootMargin: getRootMargin(modifiers), threshold: getThreshhold(modifiers) }; let observer = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting === (value === "leave")) return; evaluate(); modifiers.includes("once") && observer.disconnect(); }); }, options); observer.observe(el); cleanup(() => { observer.disconnect(); }); }); } function getThreshhold(modifiers) { if (modifiers.includes("full")) return 0.99; if (modifiers.includes("half")) return 0.5; if (!modifiers.includes("threshold")) return 0; let threshold = modifiers[modifiers.indexOf("threshold") + 1]; if (threshold === "100") return 1; if (threshold === "0") return 0; return Number(`.${threshold}`); } function getLengthValue(rawValue) { let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); return match ? match[1] + (match[2] || "px") : void 0; } function getRootMargin(modifiers) { const key = "margin"; const fallback = "0px 0px 0px 0px"; const index = modifiers.indexOf(key); if (index === -1) return fallback; let values = []; for (let i = 1; i < 5; i++) { values.push(getLengthValue(modifiers[index + i] || "")); } values = values.filter((v) => v !== void 0); return values.length ? values.join(" ").trim() : fallback; } document.addEventListener("alpine:init", () => { window.Alpine.plugin(src_default); }); })(); </script> <script> for (const [selector, deferUntil] of Object.entries({".page-product-configurable #product_addtocart_form [x-data]":"intersect"})) { document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); } </script> <script> (function () { "use strict"; const hasAlpine = new Promise(resolve => { window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); }); const hasInteract = new Promise(resolve => { (events => { const onInteract = () => { resolve(); events.forEach(type => window.removeEventListener(type, onInteract)); } events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) }); const onIntersect = (el) => { return new Promise(resolve => { const observer = new IntersectionObserver(entries => { for (const entry of entries) { if (entry.isIntersecting) { observer.disconnect() resolve(); } } }, {}); observer.observe(el); }); } function runComponent(el) { hasAlpine.then(() => { el.removeAttribute('x-ignore'); queueMicrotask(() => Alpine.initTree(el)); }); } function initDeferredComponents() { document.querySelectorAll('[x-data][x-defer]').forEach(el => { el.setAttribute('x-ignore', ''); const deferUntil = (el.getAttribute('x-defer') || '').trim(); switch (deferUntil) { case 'interact': hasInteract.then(() => runComponent(el)); break; case 'intersect': onIntersect(el).then(() => runComponent(el)) break; case 'idle': window.requestIdleCallback ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) : setTimeout(() => runComponent(el), 4000); break; case 'eager': runComponent(el); break; default: if (deferUntil.startsWith('event:') && deferUntil.length > 6) { window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); } } }); } window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); })() </script> <script type="module" src="https://www.sunliner.de/static/version1732192677/frontend/sunliner/themeHyva/de_DE/Hyva_Theme/js/alpine3.min.js" defer crossorigin ></script> <script> 'use strict'; function dispatchMessages(messages, hideAfter) { const messagesEvent = new CustomEvent("messages-loaded", { detail: { messages: messages, hideAfter: hideAfter } }); window.dispatchEvent(messagesEvent); } if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); } (function( hyva, undefined ) { hyva.initFormKey = () => { const inputSelector = 'input[name="form_key"]', formKey = hyva.getFormKey(); Array.from(document.querySelectorAll(inputSelector)).map(function (input) { input.value = formKey }); } hyva.initMessages = () => { try { const messages = hyva.getCookie('mage-messages'); window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; dispatchMessages(window.mageMessages); // empty `mage-messages` cookie const skipSetDomain = true; hyva.setCookie('mage-messages','', -1, skipSetDomain); } catch (error) { console.warn('Error parsing Cookie Messages:', error); } } window.addEventListener('DOMContentLoaded', hyva.initFormKey); hyva.alpineInitialized(hyva.initMessages) }( window.hyva = window.hyva || {} )); </script> <script> 'use strict'; { const private_content_key = 'mage-cache-storage'; const private_content_expire_key = 'mage-cache-timeout'; const private_content_version_key = 'private_content_version'; const section_data_ids_key = 'section_data_ids'; const mage_cache_session_id_key = 'mage-cache-sessid'; const last_visited_store_key = 'last_visited_store'; const ttl = 3600; if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); } function loadSectionData () { const browserStorage = hyva.getBrowserStorage(); if (!browserStorage) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "warning", text: "Bitte aktivieren Sie LocalStorage in Ihrem Browser." }] ); return; } try { let isInvalid = false; if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { isInvalid = true; } hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); if (!hyva.getCookie(mage_cache_session_id_key)) { isInvalid = true; browserStorage.removeItem(private_content_key); const skipSetDomain = true; const days = false; hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) } const cookieVersion = hyva.getCookie(private_content_version_key); const storageVersion = browserStorage.getItem(private_content_version_key); if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { isInvalid = true; } const privateContentExpires = browserStorage.getItem(private_content_expire_key); if (privateContentExpires && new Date(privateContentExpires) < new Date()) { browserStorage.removeItem(private_content_key); } if (isInvalid && cookieVersion) { fetchPrivateContent([]); } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); if ( privateContent && privateContentExpires && privateContent.cart && privateContent.customer ) { dispatchPrivateContent(privateContent); } else { fetchPrivateContent([]); } } else { if (document.getElementById('default-section-data')) { const privateContent = JSON.parse(document.getElementById('default-section-data').innerText.trim()); dispatchPrivateContent(privateContent); } else { dispatchPrivateContent({}); } } } catch (error) { console.warn('Error retrieving Private Content:', error); } } hyva.alpineInitialized(loadSectionData) window.addEventListener('reload-customer-section-data', loadSectionData); function dispatchPrivateContent(data) { const privateContentEvent = new CustomEvent("private-content-loaded", { detail: { data: data } }); window.dispatchEvent(privateContentEvent); } function fetchPrivateContent(sections) { fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { method: 'GET', headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' } }) .then(response => response.json()) .then( data => { if (data) { try { const browserStorage = hyva.getBrowserStorage(); // merge new data preserving non-invalidated sections const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { delete oldSectionData['checkout-data']; } const newSectionData = Object.assign(oldSectionData, data); dispatchPrivateContent(newSectionData); // don't persist messages, they've been dispatched already if (newSectionData.messages && newSectionData.messages.messages ) { newSectionData.messages.messages = []; } browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); browserStorage.setItem(private_content_expire_key, expiresAt); const newCookieVersion = hyva.getCookie(private_content_version_key); browserStorage.setItem(private_content_version_key, newCookieVersion); // We don't need the section_data_ids in Hyvä, but we store them for compatibility // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout hyva.setCookie( section_data_ids_key, JSON.stringify( Object.keys(data).reduce((sectionDataIds, sectionKey) => { sectionDataIds[sectionKey] = data[sectionKey]['data_id']; return sectionDataIds; }, {}) ), false, true ); } catch (error) { console.warn("Couldn't store privateContent", error); } } } ); } } </script> <script> (() => { document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); })() </script> <script> (events => { const dispatchUserInteractionEvent = () => { events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) window.dispatchEvent(new Event('init-external-scripts')) }; events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) </script> <script> if (HTMLScriptElement.supports && HTMLScriptElement.supports('speculationrules')) { const specScript = document.createElement('script'); specScript.type = 'speculationrules'; specRules = { 'prerender': [{ 'where': { 'and': [ {'href_matches': '/*'}, {'not': {'href_matches': '/checkout/*'}}, {'not': {'href_matches': '/customer/*'}}, {'not': {'href_matches': '/download/*'}}, {'not': {'href_matches': '/newsletter/*'}}, {'not': {'href_matches': '/product_compare/*'}}, {'not': {'href_matches': '/quotation/*'}}, {'not': {'href_matches': '/sales/*'}}, {'not': {'href_matches': '/search/*'}}, {'not': {'href_matches': '/stores/*'}}, {'not': {'href_matches': '/vault/*'}}, {'not': {'href_matches': '/wishlist/*'}}, {'not': {'href_matches': '/*.pdf'}}, {'not': {'selector_matches': '.do-not-prerender'}}, {'not': {'selector_matches': '[rel=nofollow]'}}, {'not': {'selector_matches': '[target=_blank]'}}, {'not': {'selector_matches': '[target=_parent]'}}, {'not': {'selector_matches': '[target=_top]'}} ], }, 'eagerness': 'moderate' }] }; specScript.textContent = JSON.stringify(specRules); document.body.append(specScript); } </script> <script> function initConfigurableOptions(productId, optionConfig) { function findPathParam(key) { const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL; const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/'); const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3); for (let i = 0; i < pathParts.length; i += 2) { if (pathParts[i] === key && pathParts.length > i) { return pathParts[i + 1]; } } } return { optionConfig, productId, itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'), allowedAttributeOptions: [], selectedValues: [], init() { this.findAllowedAttributeOptions(); this.$nextTick(() => { if (typeof this.optionConfig.defaultValues === 'object') { for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) { this.changeOption(attributeId, value + ''); } } }); }, findSimpleIndex() { this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues); }, calculateSimpleIndexForPartialSelection(selectedValues) { if (selectedValues.length === 0) return 0; let productIndexIds = Object.keys(this.optionConfig.index); Object.keys(this.optionConfig.attributes).forEach((attribute) => { const productsWithAttributeMatch = selectedValues[attribute] ? productIndexIds.filter((productIndex) => { return this.optionConfig.index[productIndex][attribute] === this.selectedValues[attribute] }) : []; productIndexIds = productsWithAttributeMatch.length ? productsWithAttributeMatch : productIndexIds }) return productIndexIds[0]; }, calculateSimpleIndexForFullSelection(selectedValues) { const productIndexes = this.optionConfig.index; return Object.keys(productIndexes).find(productIndex => { const productCandidateOptions = productIndexes[productIndex]; for (const productOption in productCandidateOptions) { if ( ! selectedValues[productOption] || selectedValues[productOption] !== productCandidateOptions[productOption] ) { return false; } } return productIndex; }); }, productIndex: 0, findAllowedAttributeOptions() { this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues); }, calculateAllowedAttributeOptions(selectedValues) { const allAttributes = this.optionConfig.attributes; const allAttributesSorted = Object.values(allAttributes).sort((a,b) => { return a.position - b.position }); const newAllowedAttributeOptions = []; allAttributesSorted.forEach(attribute => { const selectionWithoutAttr = Object.assign({}, this.removeAttrFromSelection(selectedValues, attribute.id)); const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr); newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => { return !!option.products.find(product => { return availableIndexes.includes(product); }) }); }); return newAllowedAttributeOptions; }, calculateAvailableProductIndexes(selectedOptions) { if (Object.keys(selectedOptions).length === 0) { if (Object.values(this.optionConfig.salable || {}).length) { return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i) } return Object.keys(this.optionConfig.index); } const selectedIds = Object.keys(selectedOptions); if (Object.values(this.optionConfig.salable || {}).length) { const selectedOptionIndexes = selectedIds.map(attrId => { const optionValue = selectedOptions[attrId]; return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || [] }) return selectedOptionIndexes.reduce((acc, optionIndexes) => { return acc.filter(index => optionIndexes.includes(index)); }); } else { const productIndexes = this.optionConfig.index; return Object.keys(productIndexes).filter(index => { for (const attrId of selectedIds) { if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false } return true }); } }, findAttributeByOptionId(optionId) { for (const attributeId in this.optionConfig.attributes) { const attributeOptions = this.optionConfig.attributes[attributeId].options || []; if (attributeOptions.find(option => option.id === optionId)) { return attributeId; } } }, getAllowedAttributeOptions(attributeId) { return this.allowedAttributeOptions[attributeId] || [] }, getProductIdsForOption(option) { const attributeId = this.findAttributeByOptionId(option.id); const allOptions = this.optionConfig.attributes[attributeId]; const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id); return opt && opt.products ? opt.products : []; }, findProductIdsForPartialSelection(optionSelection) { const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => { const newCandidates = this.getProductIdsForOption({id: optionId}); return candidates === null ? newCandidates : candidates.filter(productId => newCandidates.includes(productId)); }, null); return candidateProducts || []; }, findCheapestProductForPartialSelection(optionSelection) { const candidateProducts = this.findProductIdsForPartialSelection(optionSelection); return candidateProducts.reduce((cheapest, simpleIdx) => { // in the first iteration we start with simpleIdx as the currently cheapest product if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx; const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount; return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount ? simpleIdx : cheapest; }, 0) }, findProductIdToUseForOptionPrice(option) { // try to find a product for a complete selection const attributeId = this.findAttributeByOptionId(option.id); const optionSelection = Object.assign({}, this.selectedValues, {[attributeId]: option.id}); const matchingSimpleIndex = this.calculateSimpleIndexForFullSelection(optionSelection); // if there is no complete selection, use the cheapest product for the option return matchingSimpleIndex || this.findCheapestProductForPartialSelection(optionSelection); }, getAttributeOptionLabel(option) { const optionProduct = this.findProductIdToUseForOptionPrice(option); if ((! optionProduct) || (optionProduct === this.productIndex)) { return option.label; } const currentPrice = this.getOptionPriceAdjustmentBasePrice(); if (this.optionConfig.optionPrices[optionProduct]) { const optionPrice = this.optionConfig.optionPrices[optionProduct].finalPrice.amount; if (optionPrice !== currentPrice){ return option.label + ' ' + hyva.formatPrice(optionPrice - currentPrice, true); } } return option.label; }, getOptionPriceAdjustmentBasePrice() { if (this.optionConfig.optionPrices[this.productIndex]) { return this.optionConfig.optionPrices[this.productIndex].finalPrice.amount } const cheapestForSelection = this.findCheapestProductForPartialSelection(this.selectedValues); return this.optionConfig.optionPrices[cheapestForSelection] ? this.optionConfig.optionPrices[cheapestForSelection].finalPrice.amount : this.optionConfig.prices.finalPrice.amount; // default price if no option selection }, clearOptionIfActive(optionId, value) { if (this.selectedValues[optionId] === value) { this.blurLabel() this.changeOption(optionId, '') } }, removeAttrFromSelection(selectedValues, attributeId) { attributeId = parseInt(attributeId); return selectedValues.reduce((newSelection, val, attr) => { if (attr !== attributeId) { newSelection[attr] = val; } return newSelection; }, []); }, changeOption(attributeId, value) { if (value === '') { this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId) } else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) { this.selectedValues[attributeId] = value; } this.findSimpleIndex(); this.findAllowedAttributeOptions(); this.updatePrices(); this.updateGallery(); window.dispatchEvent( new CustomEvent( 'configurable-selection-changed', { detail: { productId: this.productId, optionId: attributeId, value: value, productIndex: this.productIndex, selectedValues: this.selectedValues, candidates: this.findProductIdsForPartialSelection(this.selectedValues), } } ) ); }, calculateIsMinimalPrice() { return ( this.selectedValues.filter(value => !!value).length < Object.keys(this.optionConfig.attributes).length ); }, updatePrices() { const value = this.productIndex ? this.optionConfig.optionPrices[this.productIndex] : this.optionConfig.prices; window.dispatchEvent( new CustomEvent( "update-prices-" + this.productId, { detail: Object.assign( value, { isMinimalPrice: this.calculateIsMinimalPrice() } ) } ) ); }, updateGallery () { if (this.productIndex) { const images = this.optionConfig.images[this.productIndex]; images && window.dispatchEvent(new CustomEvent( "update-gallery", { detail: this.sortImagesByPosition(images) } )); } else { window.dispatchEvent(new Event("reset-gallery")); } }, sortImagesByPosition(images) { return images.sort((x, y) => { return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1) }); }, onGetCartData(data) { }, preselectCartItems(data) { // pre-select options based on cart data for current (quote) itemId const cart = data && data.cart; if (cart && cart.items) { const cartItem = cart.items.find((item) => { return ( item.item_id === this.itemId && item.product_id === this.productId ) }); if (cartItem && cartItem.options && cartItem.options.length) { cartItem.options.map(option => { this.changeOption(option.option_id, option.option_value); }) } } }, preselectQuerystringItems() { // pre-select option like ?size=167 const urlQueryParams = new URLSearchParams(window.location.search.replace('?','')); this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code)); }, preselectLocationHashItems() { // pre-select option like #144=167 const urlHashParams = new URLSearchParams(window.location.hash.replace('#','')); this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id)); }, preselectItemsBasedOnLocation(getLocationValue) { Object.values(this.optionConfig.attributes).map(attribute => { this.changeOption(attribute.id, getLocationValue(attribute)) }); } } } </script> <script> function initSwatchOptions(swatchConfig) { return { swatchConfig, getAttributeSwatchData(attributeId) { const swatchConfig = Object.assign({}, this.swatchConfig[attributeId]); swatchConfig['details'] = JSON.parse(swatchConfig['additional_data']); return swatchConfig; }, getAllAttributeOptions(attributeId) { return ( this.optionConfig.attributes[attributeId] && this.optionConfig.attributes[attributeId].options ) || [] }, optionIsActive(attributeId, optionId) { // return true if a product with this option is in stock return !!this.getAllowedAttributeOptions(attributeId).find( option => option.id === optionId ) }, optionIsEnabled(attributeId, optionId) { // return true if a product with this option is enabled for (const productId in this.optionConfig.index) { if (this.optionConfig.index[productId][attributeId] === optionId) { return true; } } return false; }, mapSwatchTypeNumberToTypeCode(typeNumber) { switch ("" + typeNumber) { case "1": return "color" case "2": return "image" case "3": return "empty" case "0": default: return "text" } }, getTypeOfFirstOption(attributeId) { for (const optionId in this.swatchConfig[attributeId]) { const option = this.swatchConfig[attributeId][optionId]; if (typeof option.type !== 'undefined') { return this.mapSwatchTypeNumberToTypeCode(option.type); } } }, getVisualSwatchType(attributeId, targetOptionId) { // If a type configuration is present for the given option id, use it const config = this.swatchConfig[attributeId]; if (config[targetOptionId] && typeof config[targetOptionId].type !== 'undefined') { return this.mapSwatchTypeNumberToTypeCode(config[targetOptionId].type); } // Otherwise - if no config is present for the target option - use the type of the first option // with a type property from the attribute, thus assuming its the same type as the target option. // (This edge case condition can occur on single swatch products if some options are not salable) return this.getTypeOfFirstOption(attributeId); }, getSwatchType(attributeId, optionId) { // Deserialize the attribute details the first time they are used if (this.swatchConfig[attributeId] && ! this.swatchConfig[attributeId].details) { this.swatchConfig[attributeId] = this.getAttributeSwatchData(attributeId); } const type = this.swatchConfig[attributeId] && this.swatchConfig[attributeId].details && this.swatchConfig[attributeId].details.swatch_input_type || "empty"; return type === 'visual' ? this.getVisualSwatchType(attributeId, optionId) : type; }, isTextSwatch(attributeId, optionId) { return this.getSwatchType(attributeId, optionId) === 'text'; }, isVisualSwatch(attributeId, optionId) { const type = this.getSwatchType(attributeId, optionId); return ['image', 'color'].includes(type); }, getSwatchBackgroundStyle(attributeId, optionId) { const config = this.getSwatchConfig(attributeId, optionId); const type = this.getSwatchType(attributeId, optionId); if (type === "color") { return 'background-color:' + config.value; } else if (type === "image") { return "background: #ffffff url('" + config.value + "') no-repeat center"; } else { return ''; } }, getSwatchText(attributeId, optionId) { const config = this.getSwatchConfig(attributeId, optionId); return config.label || config.value || this.getOptionLabelFromOptionConfig(attributeId, optionId); }, getOptionLabelFromOptionConfig(attributeId, optionId) { // Fallback if no value is present in swatchConfig data // Reference issue https://gitlab.hyva.io/hyva-themes/magento2-default-theme/-/issues/190 const option = this.getAllAttributeOptions(attributeId).filter(option => option.id === optionId); return option && option[0] && option[0].label ||''; }, getSwatchConfig(attributeId, optionId) { return this.swatchConfig[attributeId] && this.swatchConfig[attributeId][optionId] ? this.swatchConfig[attributeId][optionId] : false; }, activeTooltipItem: false, tooltipPositionElement: false, isTooltipVisible() { return this.activeTooltipItem && this.getSwatchConfig( this.activeTooltipItem.attribute, this.activeTooltipItem.item ); }, isFirstItemCol() { return this.activeTooltipItem.index === 0; }, getTooltipImageStyle(attributeId, optionId) { const config = this.getSwatchConfig(attributeId, optionId); const type = this.getSwatchType(attributeId, optionId); if (type === "color") { return 'background-color:' + config.value + '; width: 110px; height: 90px;'; } else if (type === "image") { return "background: #ffffff url('" + config.thumb + "') center center no-repeat; width: 110px; height: 90px;"; } else { return 'display:none'; } }, getTooltipPosition() { return this.tooltipPositionElement ? `top: ${this.tooltipPositionElement.offsetTop}px;` + `left: ${ this.tooltipPositionElement.offsetLeft - ( this.tooltipPositionElement.closest('.snap') && this.tooltipPositionElement.closest('.snap').scrollLeft || 0 ) }px;` : '' }, getTooltipLabel() { return this.getSwatchConfig(this.activeTooltipItem.attribute, this.activeTooltipItem.item).label }, focusedLabel: false, focusLabel(optionId) { this.focusedLabel = optionId; }, blurLabel() { this.focusedLabel = false; }, showSwatches: false, initShowSwatchesIntersect() { if ('IntersectionObserver' in window && !window.scrollY) { let io = new IntersectionObserver( entries => { entries.map(entry => { if (entry.isIntersecting) { this.showSwatches = true; io.unobserve(this.$root); } }) } ); io.observe(this.$root); } else { this.showSwatches = true } } } } </script> <div id="imi_friendly_captcha_newsletter" class="frc-captcha" data-sitekey="FCMG0RGUL8NQRS73" data-puzzle-endpoint="https://eu-api.friendlycaptcha.eu/api/v1/puzzle" data-lang="de" data-callback="captchaSolved_imi_friendly_captcha_newsletter" ></div> <script> 'use strict'; document.addEventListener('DOMContentLoaded', function () { function setButtonDisabled(disabled) { const button = Array.from(document.getElementById('imi_friendly_captcha_newsletter').closest('form').elements).find(el => el.type === 'submit'); if (!button) { return; } button.disabled = disabled; } setButtonDisabled(true); window.captchaSolved_imi_friendly_captcha_newsletter = function () { setButtonDisabled(false); } }); </script> <script> 'use strict'; document.getElementById('newsletter-validate-detail').append(document.getElementById('imi_friendly_captcha_newsletter')); </script> <script type="application/json" id="default-section-data"> {"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"cart":[],"directory-data":{"AE":{"name":"Vereinigte Arabische Emirate"},"AT":{"name":"\u00d6sterreich","regions":{"102":{"code":"BL","name":"Burgenland"},"99":{"code":"KN","name":"K\u00e4rnten"},"96":{"code":"NO","name":"Nieder\u00f6sterreich"},"97":{"code":"OO","name":"Ober\u00f6sterreich"},"98":{"code":"SB","name":"Salzburg"},"100":{"code":"ST","name":"Steiermark"},"101":{"code":"TI","name":"Tirol"},"103":{"code":"VB","name":"Voralberg"},"95":{"code":"WI","name":"Wien"}}},"BE":{"name":"Belgien"},"BG":{"name":"Bulgarien","regions":{"643":{"code":"BG-01","name":"Blagoevgrad"},"644":{"code":"BG-02","name":"Burgas"},"650":{"code":"BG-08","name":"Dobrich"},"649":{"code":"BG-07","name":"Gabrovo"},"668":{"code":"BG-26","name":"Haskovo"},"651":{"code":"BG-09","name":"Kardzhali"},"652":{"code":"BG-10","name":"Kyustendil"},"653":{"code":"BG-11","name":"Lovech"},"654":{"code":"BG-12","name":"Montana"},"655":{"code":"BG-13","name":"Pazardzhik"},"656":{"code":"BG-14","name":"Pernik"},"657":{"code":"BG-15","name":"Pleven"},"658":{"code":"BG-16","name":"Plovdiv"},"659":{"code":"BG-17","name":"Razgrad"},"660":{"code":"BG-18","name":"Ruse"},"669":{"code":"BG-27","name":"Shumen"},"661":{"code":"BG-19","name":"Silistra"},"662":{"code":"BG-20","name":"Sliven"},"663":{"code":"BG-21","name":"Smolyan"},"664":{"code":"BG-22","name":"Sofia City"},"665":{"code":"BG-23","name":"Sofia Province"},"666":{"code":"BG-24","name":"Stara Zagora"},"667":{"code":"BG-25","name":"Targovishte"},"645":{"code":"BG-03","name":"Varna"},"646":{"code":"BG-04","name":"Veliko Tarnovo"},"647":{"code":"BG-05","name":"Vidin"},"648":{"code":"BG-06","name":"Vratsa"},"670":{"code":"BG-28","name":"Yambol"}}},"CH":{"name":"Schweiz","regions":{"104":{"code":"AG","name":"Aargau"},"106":{"code":"AR","name":"Appenzell Ausserrhoden"},"105":{"code":"AI","name":"Appenzell Innerrhoden"},"108":{"code":"BL","name":"Basel-Landschaft"},"109":{"code":"BS","name":"Basel-Stadt"},"107":{"code":"BE","name":"Bern"},"110":{"code":"FR","name":"Friburg"},"111":{"code":"GE","name":"Geneva"},"112":{"code":"GL","name":"Glarus"},"113":{"code":"GR","name":"Graub\u00fcnden"},"114":{"code":"JU","name":"Jura"},"115":{"code":"LU","name":"Lucerne"},"116":{"code":"NE","name":"Neuch\u00e2tel"},"117":{"code":"NW","name":"Nidwalden"},"118":{"code":"OW","name":"Obwalden"},"120":{"code":"SH","name":"Schaffhausen"},"122":{"code":"SZ","name":"Schwyz"},"121":{"code":"SO","name":"Solothurn"},"119":{"code":"SG","name":"St. Gallen"},"123":{"code":"TG","name":"Thurgau"},"124":{"code":"TI","name":"Ticino"},"125":{"code":"UR","name":"Uri"},"126":{"code":"VD","name":"Vaud"},"127":{"code":"VS","name":"Wallis"},"128":{"code":"ZG","name":"Zug"},"129":{"code":"ZH","name":"Z\u00fcrich"}}},"CY":{"name":"Zypern"},"CZ":{"name":"Tschechien"},"DE":{"name":"Deutschland","regions":{"80":{"code":"BAW","name":"Baden-W\u00fcrttemberg"},"81":{"code":"BAY","name":"Bayern"},"82":{"code":"BER","name":"Berlin"},"83":{"code":"BRG","name":"Brandenburg"},"84":{"code":"BRE","name":"Bremen"},"85":{"code":"HAM","name":"Hamburg"},"86":{"code":"HES","name":"Hessen"},"87":{"code":"MEC","name":"Mecklenburg-Vorpommern"},"79":{"code":"NDS","name":"Niedersachsen"},"88":{"code":"NRW","name":"Nordrhein-Westfalen"},"89":{"code":"RHE","name":"Rheinland-Pfalz"},"90":{"code":"SAR","name":"Saarland"},"91":{"code":"SAS","name":"Sachsen"},"92":{"code":"SAC","name":"Sachsen-Anhalt"},"93":{"code":"SCN","name":"Schleswig-Holstein"},"94":{"code":"THE","name":"Th\u00fcringen"}}},"DK":{"name":"D\u00e4nemark","regions":{"861":{"code":"DK-84","name":"Hovedstaden"},"862":{"code":"DK-82","name":"Midtjylland"},"863":{"code":"DK-81","name":"Nordjylland"},"864":{"code":"DK-85","name":"Sj\u00e6lland"},"865":{"code":"DK-83","name":"Syddanmark"}}},"EE":{"name":"Estland","regions":{"340":{"code":"EE-37","name":"Harjumaa"},"341":{"code":"EE-39","name":"Hiiumaa"},"342":{"code":"EE-44","name":"Ida-Virumaa"},"344":{"code":"EE-51","name":"J\u00e4rvamaa"},"343":{"code":"EE-49","name":"J\u00f5gevamaa"},"346":{"code":"EE-59","name":"L\u00e4\u00e4ne-Virumaa"},"345":{"code":"EE-57","name":"L\u00e4\u00e4nemaa"},"348":{"code":"EE-67","name":"P\u00e4rnumaa"},"347":{"code":"EE-65","name":"P\u00f5lvamaa"},"349":{"code":"EE-70","name":"Raplamaa"},"350":{"code":"EE-74","name":"Saaremaa"},"351":{"code":"EE-78","name":"Tartumaa"},"352":{"code":"EE-82","name":"Valgamaa"},"353":{"code":"EE-84","name":"Viljandimaa"},"354":{"code":"EE-86","name":"V\u00f5rumaa"}}},"ES":{"name":"Spanien","regions":{"130":{"code":"A Coru\u0441a","name":"A Coru\u00f1a"},"131":{"code":"Alava","name":"Alava"},"132":{"code":"Albacete","name":"Albacete"},"133":{"code":"Alicante","name":"Alicante"},"134":{"code":"Almeria","name":"Almeria"},"135":{"code":"Asturias","name":"Asturias"},"136":{"code":"Avila","name":"Avila"},"137":{"code":"Badajoz","name":"Badajoz"},"138":{"code":"Baleares","name":"Baleares"},"139":{"code":"Barcelona","name":"Barcelona"},"140":{"code":"Burgos","name":"Burgos"},"141":{"code":"Caceres","name":"Caceres"},"142":{"code":"Cadiz","name":"Cadiz"},"143":{"code":"Cantabria","name":"Cantabria"},"144":{"code":"Castellon","name":"Castellon"},"145":{"code":"Ceuta","name":"Ceuta"},"146":{"code":"Ciudad Real","name":"Ciudad Real"},"147":{"code":"Cordoba","name":"Cordoba"},"148":{"code":"Cuenca","name":"Cuenca"},"149":{"code":"Girona","name":"Girona"},"150":{"code":"Granada","name":"Granada"},"151":{"code":"Guadalajara","name":"Guadalajara"},"152":{"code":"Guipuzcoa","name":"Guipuzcoa"},"153":{"code":"Huelva","name":"Huelva"},"154":{"code":"Huesca","name":"Huesca"},"155":{"code":"Jaen","name":"Jaen"},"156":{"code":"La Rioja","name":"La Rioja"},"157":{"code":"Las Palmas","name":"Las Palmas"},"158":{"code":"Leon","name":"Leon"},"159":{"code":"Lleida","name":"Lleida"},"160":{"code":"Lugo","name":"Lugo"},"161":{"code":"Madrid","name":"Madrid"},"162":{"code":"Malaga","name":"Malaga"},"163":{"code":"Melilla","name":"Melilla"},"164":{"code":"Murcia","name":"Murcia"},"165":{"code":"Navarra","name":"Navarra"},"166":{"code":"Ourense","name":"Ourense"},"167":{"code":"Palencia","name":"Palencia"},"168":{"code":"Pontevedra","name":"Pontevedra"},"169":{"code":"Salamanca","name":"Salamanca"},"170":{"code":"Santa Cruz de Tenerife","name":"Santa Cruz de Tenerife"},"171":{"code":"Segovia","name":"Segovia"},"172":{"code":"Sevilla","name":"Sevilla"},"173":{"code":"Soria","name":"Soria"},"174":{"code":"Tarragona","name":"Tarragona"},"175":{"code":"Teruel","name":"Teruel"},"176":{"code":"Toledo","name":"Toledo"},"177":{"code":"Valencia","name":"Valencia"},"178":{"code":"Valladolid","name":"Valladolid"},"179":{"code":"Vizcaya","name":"Vizcaya"},"180":{"code":"Zamora","name":"Zamora"},"181":{"code":"Zaragoza","name":"Zaragoza"}}},"FI":{"name":"Finnland","regions":{"339":{"code":"Ahvenanmaa","name":"Ahvenanmaa"},"333":{"code":"Etel\u00e4-Karjala","name":"Etel\u00e4-Karjala"},"326":{"code":"Etel\u00e4-Pohjanmaa","name":"Etel\u00e4-Pohjanmaa"},"325":{"code":"Etel\u00e4-Savo","name":"Etel\u00e4-Savo"},"337":{"code":"It\u00e4-Uusimaa","name":"It\u00e4-Uusimaa"},"322":{"code":"Kainuu","name":"Kainuu"},"335":{"code":"Kanta-H\u00e4me","name":"Kanta-H\u00e4me"},"330":{"code":"Keski-Pohjanmaa","name":"Keski-Pohjanmaa"},"331":{"code":"Keski-Suomi","name":"Keski-Suomi"},"338":{"code":"Kymenlaakso","name":"Kymenlaakso"},"320":{"code":"Lappi","name":"Lappi"},"334":{"code":"P\u00e4ij\u00e4t-H\u00e4me","name":"P\u00e4ij\u00e4t-H\u00e4me"},"328":{"code":"Pirkanmaa","name":"Pirkanmaa"},"327":{"code":"Pohjanmaa","name":"Pohjanmaa"},"323":{"code":"Pohjois-Karjala","name":"Pohjois-Karjala"},"321":{"code":"Pohjois-Pohjanmaa","name":"Pohjois-Pohjanmaa"},"324":{"code":"Pohjois-Savo","name":"Pohjois-Savo"},"329":{"code":"Satakunta","name":"Satakunta"},"336":{"code":"Uusimaa","name":"Uusimaa"},"332":{"code":"Varsinais-Suomi","name":"Varsinais-Suomi"}}},"FR":{"name":"Frankreich","regions":{"182":{"code":"01","name":"Ain"},"183":{"code":"02","name":"Aisne"},"184":{"code":"03","name":"Allier"},"185":{"code":"04","name":"Alpes-de-Haute-Provence"},"187":{"code":"06","name":"Alpes-Maritimes"},"188":{"code":"07","name":"Ard\u00e8che"},"189":{"code":"08","name":"Ardennes"},"190":{"code":"09","name":"Ari\u00e8ge"},"191":{"code":"10","name":"Aube"},"192":{"code":"11","name":"Aude"},"193":{"code":"12","name":"Aveyron"},"249":{"code":"67","name":"Bas-Rhin"},"194":{"code":"13","name":"Bouches-du-Rh\u00f4ne"},"195":{"code":"14","name":"Calvados"},"196":{"code":"15","name":"Cantal"},"197":{"code":"16","name":"Charente"},"198":{"code":"17","name":"Charente-Maritime"},"199":{"code":"18","name":"Cher"},"200":{"code":"19","name":"Corr\u00e8ze"},"201":{"code":"2A","name":"Corse-du-Sud"},"203":{"code":"21","name":"C\u00f4te-d'Or"},"204":{"code":"22","name":"C\u00f4tes-d'Armor"},"205":{"code":"23","name":"Creuse"},"261":{"code":"79","name":"Deux-S\u00e8vres"},"206":{"code":"24","name":"Dordogne"},"207":{"code":"25","name":"Doubs"},"208":{"code":"26","name":"Dr\u00f4me"},"273":{"code":"91","name":"Essonne"},"209":{"code":"27","name":"Eure"},"210":{"code":"28","name":"Eure-et-Loir"},"211":{"code":"29","name":"Finist\u00e8re"},"212":{"code":"30","name":"Gard"},"214":{"code":"32","name":"Gers"},"215":{"code":"33","name":"Gironde"},"250":{"code":"68","name":"Haut-Rhin"},"202":{"code":"2B","name":"Haute-Corse"},"213":{"code":"31","name":"Haute-Garonne"},"225":{"code":"43","name":"Haute-Loire"},"234":{"code":"52","name":"Haute-Marne"},"252":{"code":"70","name":"Haute-Sa\u00f4ne"},"256":{"code":"74","name":"Haute-Savoie"},"269":{"code":"87","name":"Haute-Vienne"},"186":{"code":"05","name":"Hautes-Alpes"},"247":{"code":"65","name":"Hautes-Pyr\u00e9n\u00e9es"},"274":{"code":"92","name":"Hauts-de-Seine"},"216":{"code":"34","name":"H\u00e9rault"},"217":{"code":"35","name":"Ille-et-Vilaine"},"218":{"code":"36","name":"Indre"},"219":{"code":"37","name":"Indre-et-Loire"},"220":{"code":"38","name":"Is\u00e8re"},"221":{"code":"39","name":"Jura"},"222":{"code":"40","name":"Landes"},"223":{"code":"41","name":"Loir-et-Cher"},"224":{"code":"42","name":"Loire"},"226":{"code":"44","name":"Loire-Atlantique"},"227":{"code":"45","name":"Loiret"},"228":{"code":"46","name":"Lot"},"229":{"code":"47","name":"Lot-et-Garonne"},"230":{"code":"48","name":"Loz\u00e8re"},"231":{"code":"49","name":"Maine-et-Loire"},"232":{"code":"50","name":"Manche"},"233":{"code":"51","name":"Marne"},"235":{"code":"53","name":"Mayenne"},"236":{"code":"54","name":"Meurthe-et-Moselle"},"237":{"code":"55","name":"Meuse"},"238":{"code":"56","name":"Morbihan"},"239":{"code":"57","name":"Moselle"},"240":{"code":"58","name":"Ni\u00e8vre"},"241":{"code":"59","name":"Nord"},"242":{"code":"60","name":"Oise"},"243":{"code":"61","name":"Orne"},"257":{"code":"75","name":"Paris"},"244":{"code":"62","name":"Pas-de-Calais"},"245":{"code":"63","name":"Puy-de-D\u00f4me"},"246":{"code":"64","name":"Pyr\u00e9n\u00e9es-Atlantiques"},"248":{"code":"66","name":"Pyr\u00e9n\u00e9es-Orientales"},"251":{"code":"69","name":"Rh\u00f4ne"},"253":{"code":"71","name":"Sa\u00f4ne-et-Loire"},"254":{"code":"72","name":"Sarthe"},"255":{"code":"73","name":"Savoie"},"259":{"code":"77","name":"Seine-et-Marne"},"258":{"code":"76","name":"Seine-Maritime"},"275":{"code":"93","name":"Seine-Saint-Denis"},"262":{"code":"80","name":"Somme"},"263":{"code":"81","name":"Tarn"},"264":{"code":"82","name":"Tarn-et-Garonne"},"272":{"code":"90","name":"Territoire-de-Belfort"},"277":{"code":"95","name":"Val-d'Oise"},"276":{"code":"94","name":"Val-de-Marne"},"265":{"code":"83","name":"Var"},"266":{"code":"84","name":"Vaucluse"},"267":{"code":"85","name":"Vend\u00e9e"},"268":{"code":"86","name":"Vienne"},"270":{"code":"88","name":"Vosges"},"271":{"code":"89","name":"Yonne"},"260":{"code":"78","name":"Yvelines"}}},"GR":{"name":"Griechenland","regions":{"903":{"code":"GR-69","name":"\u00c1gion \u00d3ros"},"890":{"code":"GR-A","name":"Anatolik\u00ed Makedon\u00eda kai Thr\u00e1ki"},"891":{"code":"GR-I","name":"Attik\u00ed"},"892":{"code":"GR-G","name":"Dytik\u00ed Ell\u00e1da"},"893":{"code":"GR-C","name":"Dytik\u00ed Makedon\u00eda"},"894":{"code":"GR-F","name":"Ion\u00eda N\u00edsia"},"895":{"code":"GR-D","name":"\u00cdpeiros"},"896":{"code":"GR-B","name":"Kentrik\u00ed Makedon\u00eda"},"897":{"code":"GR-M","name":"Kr\u00edti"},"898":{"code":"GR-L","name":"N\u00f3tio Aiga\u00edo"},"899":{"code":"GR-J","name":"Pelop\u00f3nnisos"},"900":{"code":"GR-H","name":"Stere\u00e1 Ell\u00e1da"},"901":{"code":"GR-E","name":"Thessal\u00eda"},"902":{"code":"GR-K","name":"V\u00f3reio Aiga\u00edo"}}},"HR":{"name":"Kroatien"},"HU":{"name":"Ungarn"},"IE":{"name":"Irland"},"IT":{"name":"Italien","regions":{"485":{"code":"AG","name":"Agrigento"},"671":{"code":"AG","name":"Agrigento"},"486":{"code":"AL","name":"Alessandria"},"672":{"code":"AL","name":"Alessandria"},"673":{"code":"AN","name":"Ancona"},"487":{"code":"AN","name":"Ancona"},"488":{"code":"AO","name":"Aosta"},"674":{"code":"AO","name":"Aosta"},"676":{"code":"AR","name":"Arezzo"},"489":{"code":"AR","name":"Arezzo"},"490":{"code":"AP","name":"Ascoli Piceno"},"677":{"code":"AP","name":"Ascoli-Piceno"},"678":{"code":"AT","name":"Asti"},"491":{"code":"AT","name":"Asti"},"679":{"code":"AV","name":"Avellino"},"492":{"code":"AV","name":"Avellino"},"680":{"code":"BA","name":"Bari"},"493":{"code":"BA","name":"Bari"},"494":{"code":"BT","name":"Barletta-Andria-Trani"},"681":{"code":"BT","name":"Barletta-Andria-Trani"},"682":{"code":"BL","name":"Belluno"},"495":{"code":"BL","name":"Belluno"},"496":{"code":"BN","name":"Benevento"},"683":{"code":"BN","name":"Benevento"},"684":{"code":"BG","name":"Bergamo"},"497":{"code":"BG","name":"Bergamo"},"498":{"code":"BI","name":"Biella"},"685":{"code":"BI","name":"Biella"},"686":{"code":"BO","name":"Bologna"},"499":{"code":"BO","name":"Bologna"},"500":{"code":"BZ","name":"Bolzano"},"687":{"code":"BZ","name":"Bolzano"},"688":{"code":"BS","name":"Brescia"},"501":{"code":"BS","name":"Brescia"},"502":{"code":"BR","name":"Brindisi"},"689":{"code":"BR","name":"Brindisi"},"503":{"code":"CA","name":"Cagliari"},"690":{"code":"CA","name":"Cagliari"},"691":{"code":"CL","name":"Caltanissetta"},"504":{"code":"CL","name":"Caltanissetta"},"505":{"code":"CB","name":"Campobasso"},"692":{"code":"CB","name":"Campobasso"},"693":{"code":"CI","name":"Carbonia Iglesias"},"506":{"code":"CI","name":"Carbonia-Iglesias"},"507":{"code":"CE","name":"Caserta"},"694":{"code":"CE","name":"Caserta"},"695":{"code":"CT","name":"Catania"},"508":{"code":"CT","name":"Catania"},"509":{"code":"CZ","name":"Catanzaro"},"696":{"code":"CZ","name":"Catanzaro"},"510":{"code":"CH","name":"Chieti"},"697":{"code":"CH","name":"Chieti"},"698":{"code":"CO","name":"Como"},"511":{"code":"CO","name":"Como"},"699":{"code":"CS","name":"Cosenza"},"512":{"code":"CS","name":"Cosenza"},"513":{"code":"CR","name":"Cremona"},"700":{"code":"CR","name":"Cremona"},"701":{"code":"KR","name":"Crotone"},"514":{"code":"KR","name":"Crotone"},"515":{"code":"CN","name":"Cuneo"},"702":{"code":"CN","name":"Cuneo"},"516":{"code":"EN","name":"Enna"},"703":{"code":"EN","name":"Enna"},"704":{"code":"FM","name":"Fermo"},"517":{"code":"FM","name":"Fermo"},"518":{"code":"FE","name":"Ferrara"},"705":{"code":"FE","name":"Ferrara"},"519":{"code":"FI","name":"Firenze"},"706":{"code":"FI","name":"Firenze"},"707":{"code":"FG","name":"Foggia"},"520":{"code":"FG","name":"Foggia"},"521":{"code":"FC","name":"Forl\u00ec-Cesena"},"708":{"code":"FC","name":"Forli-Cesena"},"709":{"code":"FR","name":"Frosinone"},"522":{"code":"FR","name":"Frosinone"},"523":{"code":"GE","name":"Genova"},"710":{"code":"GE","name":"Genova"},"711":{"code":"GO","name":"Gorizia"},"524":{"code":"GO","name":"Gorizia"},"525":{"code":"GR","name":"Grosseto"},"712":{"code":"GR","name":"Grosseto"},"526":{"code":"IM","name":"Imperia"},"713":{"code":"IM","name":"Imperia"},"527":{"code":"IS","name":"Isernia"},"714":{"code":"IS","name":"Isernia"},"675":{"code":"AQ","name":"L'Aquila"},"529":{"code":"AQ","name":"L'Aquila"},"528":{"code":"SP","name":"La Spezia"},"715":{"code":"SP","name":"La-Spezia"},"530":{"code":"LT","name":"Latina"},"716":{"code":"LT","name":"Latina"},"717":{"code":"LE","name":"Lecce"},"531":{"code":"LE","name":"Lecce"},"532":{"code":"LC","name":"Lecco"},"718":{"code":"LC","name":"Lecco"},"533":{"code":"LI","name":"Livorno"},"719":{"code":"LI","name":"Livorno"},"534":{"code":"LO","name":"Lodi"},"720":{"code":"LO","name":"Lodi"},"721":{"code":"LU","name":"Lucca"},"535":{"code":"LU","name":"Lucca"},"722":{"code":"MC","name":"Macerata"},"536":{"code":"MC","name":"Macerata"},"537":{"code":"MN","name":"Mantova"},"723":{"code":"MN","name":"Mantova"},"538":{"code":"MS","name":"Massa-Carrara"},"724":{"code":"MS","name":"Massa-Carrara"},"725":{"code":"MT","name":"Matera"},"539":{"code":"MT","name":"Matera"},"571":{"code":"VS","name":"Medio Campidano"},"726":{"code":"VS","name":"Medio Campidano"},"727":{"code":"ME","name":"Messina"},"540":{"code":"ME","name":"Messina"},"728":{"code":"MI","name":"Milano"},"541":{"code":"MI","name":"Milano"},"542":{"code":"MO","name":"Modena"},"729":{"code":"MO","name":"Modena"},"543":{"code":"MB","name":"Monza e Brianza"},"730":{"code":"MB","name":"Monza-Brianza"},"544":{"code":"NA","name":"Napoli"},"731":{"code":"NA","name":"Napoli"},"732":{"code":"NO","name":"Novara"},"545":{"code":"NO","name":"Novara"},"546":{"code":"NU","name":"Nuoro"},"733":{"code":"NU","name":"Nuoro"},"581":{"code":"OG","name":"Ogliastra"},"734":{"code":"OG","name":"Ogliastra"},"735":{"code":"OT","name":"Olbia Tempio"},"547":{"code":"OT","name":"Olbia-Tempio"},"736":{"code":"OR","name":"Oristano"},"548":{"code":"OR","name":"Oristano"},"549":{"code":"PD","name":"Padova"},"737":{"code":"PD","name":"Padova"},"550":{"code":"PA","name":"Palermo"},"738":{"code":"PA","name":"Palermo"},"551":{"code":"PR","name":"Parma"},"739":{"code":"PR","name":"Parma"},"552":{"code":"PV","name":"Pavia"},"740":{"code":"PV","name":"Pavia"},"741":{"code":"PG","name":"Perugia"},"553":{"code":"PG","name":"Perugia"},"554":{"code":"PU","name":"Pesaro e Urbino"},"742":{"code":"PU","name":"Pesaro-Urbino"},"743":{"code":"PE","name":"Pescara"},"555":{"code":"PE","name":"Pescara"},"556":{"code":"PC","name":"Piacenza"},"744":{"code":"PC","name":"Piacenza"},"557":{"code":"PI","name":"Pisa"},"745":{"code":"PI","name":"Pisa"},"746":{"code":"PT","name":"Pistoia"},"558":{"code":"PT","name":"Pistoia"},"747":{"code":"PN","name":"Pordenone"},"559":{"code":"PN","name":"Pordenone"},"748":{"code":"PZ","name":"Potenza"},"560":{"code":"PZ","name":"Potenza"},"561":{"code":"PO","name":"Prato"},"749":{"code":"PO","name":"Prato"},"562":{"code":"RG","name":"Ragusa"},"750":{"code":"RG","name":"Ragusa"},"563":{"code":"RA","name":"Ravenna"},"751":{"code":"RA","name":"Ravenna"},"564":{"code":"RC","name":"Reggio Calabria"},"565":{"code":"RE","name":"Reggio Emilia"},"752":{"code":"RC","name":"Reggio-Calabria"},"753":{"code":"RE","name":"Reggio-Emilia"},"566":{"code":"RI","name":"Rieti"},"754":{"code":"RI","name":"Rieti"},"567":{"code":"RN","name":"Rimini"},"755":{"code":"RN","name":"Rimini"},"568":{"code":"RM","name":"Roma"},"756":{"code":"RM","name":"Roma"},"569":{"code":"RO","name":"Rovigo"},"757":{"code":"RO","name":"Rovigo"},"570":{"code":"SA","name":"Salerno"},"758":{"code":"SA","name":"Salerno"},"572":{"code":"SS","name":"Sassari"},"759":{"code":"SS","name":"Sassari"},"573":{"code":"SV","name":"Savona"},"760":{"code":"SV","name":"Savona"},"574":{"code":"SI","name":"Siena"},"761":{"code":"SI","name":"Siena"},"575":{"code":"SR","name":"Siracusa"},"762":{"code":"SR","name":"Siracusa"},"576":{"code":"SO","name":"Sondrio"},"763":{"code":"SO","name":"Sondrio"},"577":{"code":"TA","name":"Taranto"},"764":{"code":"TA","name":"Taranto"},"578":{"code":"TE","name":"Teramo"},"765":{"code":"TE","name":"Teramo"},"579":{"code":"TR","name":"Terni"},"766":{"code":"TR","name":"Terni"},"580":{"code":"TO","name":"Torino"},"767":{"code":"TO","name":"Torino"},"582":{"code":"TP","name":"Trapani"},"768":{"code":"TP","name":"Trapani"},"583":{"code":"TN","name":"Trento"},"769":{"code":"TN","name":"Trento"},"584":{"code":"TV","name":"Treviso"},"770":{"code":"TV","name":"Treviso"},"585":{"code":"TS","name":"Trieste"},"771":{"code":"TS","name":"Trieste"},"586":{"code":"UD","name":"Udine"},"772":{"code":"UD","name":"Udine"},"587":{"code":"VA","name":"Varese"},"773":{"code":"VA","name":"Varese"},"588":{"code":"VE","name":"Venezia"},"774":{"code":"VE","name":"Venezia"},"775":{"code":"VB","name":"Verbania"},"589":{"code":"VB","name":"Verbano-Cusio-Ossola"},"590":{"code":"VC","name":"Vercelli"},"776":{"code":"VC","name":"Vercelli"},"591":{"code":"VR","name":"Verona"},"777":{"code":"VR","name":"Verona"},"592":{"code":"VV","name":"Vibo Valentia"},"778":{"code":"VV","name":"Vibo-Valentia"},"593":{"code":"VI","name":"Vicenza"},"779":{"code":"VI","name":"Vicenza"},"594":{"code":"VT","name":"Viterbo"},"780":{"code":"VT","name":"Viterbo"}}},"LT":{"name":"Litauen","regions":{"475":{"code":"LT-AL","name":"Alytaus Apskritis"},"476":{"code":"LT-KU","name":"Kauno Apskritis"},"477":{"code":"LT-KL","name":"Klaip\u0117dos Apskritis"},"478":{"code":"LT-MR","name":"Marijampol\u0117s Apskritis"},"479":{"code":"LT-PN","name":"Panev\u0117\u017eio Apskritis"},"480":{"code":"LT-SA","name":"\u0160iauli\u0173 Apskritis"},"481":{"code":"LT-TA","name":"Taurag\u0117s Apskritis"},"482":{"code":"LT-TE","name":"Tel\u0161i\u0173 Apskritis"},"483":{"code":"LT-UT","name":"Utenos Apskritis"},"484":{"code":"LT-VL","name":"Vilniaus Apskritis"}}},"LU":{"name":"Luxemburg"},"LV":{"name":"Lettland","regions":{"471":{"code":"\u0100da\u017eu novads","name":"\u0100da\u017eu novads"},"366":{"code":"Aglonas novads","name":"Aglonas novads"},"367":{"code":"LV-AI","name":"Aizkraukles novads"},"368":{"code":"Aizputes novads","name":"Aizputes novads"},"369":{"code":"Akn\u012bstes novads","name":"Akn\u012bstes novads"},"370":{"code":"Alojas novads","name":"Alojas novads"},"371":{"code":"Alsungas novads","name":"Alsungas novads"},"372":{"code":"LV-AL","name":"Al\u016bksnes novads"},"373":{"code":"Amatas novads","name":"Amatas novads"},"374":{"code":"Apes novads","name":"Apes novads"},"375":{"code":"Auces novads","name":"Auces novads"},"376":{"code":"Bab\u012btes novads","name":"Bab\u012btes novads"},"377":{"code":"Baldones novads","name":"Baldones novads"},"378":{"code":"Baltinavas novads","name":"Baltinavas novads"},"379":{"code":"LV-BL","name":"Balvu novads"},"380":{"code":"LV-BU","name":"Bauskas novads"},"381":{"code":"Bever\u012bnas novads","name":"Bever\u012bnas novads"},"382":{"code":"Broc\u0113nu novads","name":"Broc\u0113nu novads"},"383":{"code":"Burtnieku novads","name":"Burtnieku novads"},"384":{"code":"Carnikavas novads","name":"Carnikavas novads"},"387":{"code":"LV-CE","name":"C\u0113su novads"},"385":{"code":"Cesvaines novads","name":"Cesvaines novads"},"386":{"code":"Ciblas novads","name":"Ciblas novads"},"388":{"code":"Dagdas novads","name":"Dagdas novads"},"355":{"code":"LV-DGV","name":"Daugavpils"},"389":{"code":"LV-DA","name":"Daugavpils novads"},"390":{"code":"LV-DO","name":"Dobeles novads"},"391":{"code":"Dundagas novads","name":"Dundagas novads"},"392":{"code":"Durbes novads","name":"Durbes novads"},"393":{"code":"Engures novads","name":"Engures novads"},"472":{"code":"\u0112rg\u013cu novads","name":"\u0112rg\u013cu novads"},"394":{"code":"Garkalnes novads","name":"Garkalnes novads"},"395":{"code":"Grobi\u0146as novads","name":"Grobi\u0146as novads"},"396":{"code":"LV-GU","name":"Gulbenes novads"},"397":{"code":"Iecavas novads","name":"Iecavas novads"},"398":{"code":"Ik\u0161\u0137iles novads","name":"Ik\u0161\u0137iles novads"},"399":{"code":"Il\u016bkstes novads","name":"Il\u016bkstes novads"},"400":{"code":"In\u010dukalna novads","name":"In\u010dukalna novads"},"401":{"code":"Jaunjelgavas novads","name":"Jaunjelgavas novads"},"402":{"code":"Jaunpiebalgas novads","name":"Jaunpiebalgas novads"},"403":{"code":"Jaunpils novads","name":"Jaunpils novads"},"357":{"code":"J\u0113kabpils","name":"J\u0113kabpils"},"405":{"code":"LV-JK","name":"J\u0113kabpils novads"},"356":{"code":"LV-JEL","name":"Jelgava"},"404":{"code":"LV-JL","name":"Jelgavas novads"},"358":{"code":"LV-JUR","name":"J\u016brmala"},"406":{"code":"Kandavas novads","name":"Kandavas novads"},"412":{"code":"K\u0101rsavas novads","name":"K\u0101rsavas novads"},"473":{"code":"\u0136eguma novads","name":"\u0136eguma novads"},"474":{"code":"\u0136ekavas novads","name":"\u0136ekavas novads"},"407":{"code":"Kokneses novads","name":"Kokneses novads"},"410":{"code":"LV-KR","name":"Kr\u0101slavas novads"},"408":{"code":"Krimuldas novads","name":"Krimuldas novads"},"409":{"code":"Krustpils novads","name":"Krustpils novads"},"411":{"code":"LV-KU","name":"Kuld\u012bgas novads"},"413":{"code":"Lielv\u0101rdes novads","name":"Lielv\u0101rdes novads"},"359":{"code":"LV-LPX","name":"Liep\u0101ja"},"360":{"code":"LV-LE","name":"Liep\u0101jas novads"},"417":{"code":"L\u012bgatnes novads","name":"L\u012bgatnes novads"},"414":{"code":"LV-LM","name":"Limba\u017eu novads"},"418":{"code":"L\u012bv\u0101nu novads","name":"L\u012bv\u0101nu novads"},"415":{"code":"Lub\u0101nas novads","name":"Lub\u0101nas novads"},"416":{"code":"LV-LU","name":"Ludzas novads"},"419":{"code":"LV-MA","name":"Madonas novads"},"421":{"code":"M\u0101lpils novads","name":"M\u0101lpils novads"},"422":{"code":"M\u0101rupes novads","name":"M\u0101rupes novads"},"420":{"code":"Mazsalacas novads","name":"Mazsalacas novads"},"423":{"code":"Nauk\u0161\u0113nu novads","name":"Nauk\u0161\u0113nu novads"},"424":{"code":"Neretas novads","name":"Neretas novads"},"425":{"code":"N\u012bcas novads","name":"N\u012bcas novads"},"426":{"code":"LV-OG","name":"Ogres novads"},"427":{"code":"Olaines novads","name":"Olaines novads"},"428":{"code":"Ozolnieku novads","name":"Ozolnieku novads"},"432":{"code":"P\u0101rgaujas novads","name":"P\u0101rgaujas novads"},"433":{"code":"P\u0101vilostas novads","name":"P\u0101vilostas novads"},"434":{"code":"P\u013cavi\u0146u novads","name":"P\u013cavi\u0146u novads"},"429":{"code":"LV-PR","name":"Prei\u013cu novads"},"430":{"code":"Priekules novads","name":"Priekules novads"},"431":{"code":"Prieku\u013cu novads","name":"Prieku\u013cu novads"},"435":{"code":"Raunas novads","name":"Raunas novads"},"361":{"code":"LV-REZ","name":"R\u0113zekne"},"442":{"code":"LV-RE","name":"R\u0113zeknes novads"},"436":{"code":"Riebi\u0146u novads","name":"Riebi\u0146u novads"},"362":{"code":"LV-RIX","name":"R\u012bga"},"363":{"code":"LV-RI","name":"R\u012bgas novads"},"437":{"code":"Rojas novads","name":"Rojas novads"},"438":{"code":"Ropa\u017eu novads","name":"Ropa\u017eu novads"},"439":{"code":"Rucavas novads","name":"Rucavas novads"},"440":{"code":"Rug\u0101ju novads","name":"Rug\u0101ju novads"},"443":{"code":"R\u016bjienas novads","name":"R\u016bjienas novads"},"441":{"code":"Rund\u0101les novads","name":"Rund\u0101les novads"},"444":{"code":"Salacgr\u012bvas novads","name":"Salacgr\u012bvas novads"},"445":{"code":"Salas novads","name":"Salas novads"},"446":{"code":"Salaspils novads","name":"Salaspils novads"},"447":{"code":"LV-SA","name":"Saldus novads"},"448":{"code":"Saulkrastu novads","name":"Saulkrastu novads"},"455":{"code":"S\u0113jas novads","name":"S\u0113jas novads"},"449":{"code":"Siguldas novads","name":"Siguldas novads"},"451":{"code":"Skr\u012bveru novads","name":"Skr\u012bveru novads"},"450":{"code":"Skrundas novads","name":"Skrundas novads"},"452":{"code":"Smiltenes novads","name":"Smiltenes novads"},"453":{"code":"Stopi\u0146u novads","name":"Stopi\u0146u novads"},"454":{"code":"Stren\u010du novads","name":"Stren\u010du novads"},"456":{"code":"LV-TA","name":"Talsu novads"},"458":{"code":"T\u0113rvetes novads","name":"T\u0113rvetes novads"},"457":{"code":"LV-TU","name":"Tukuma novads"},"459":{"code":"Vai\u0146odes novads","name":"Vai\u0146odes novads"},"460":{"code":"LV-VK","name":"Valkas novads"},"364":{"code":"Valmiera","name":"Valmiera"},"461":{"code":"LV-VM","name":"Valmieras novads"},"462":{"code":"Varak\u013c\u0101nu novads","name":"Varak\u013c\u0101nu novads"},"469":{"code":"V\u0101rkavas novads","name":"V\u0101rkavas novads"},"463":{"code":"Vecpiebalgas novads","name":"Vecpiebalgas novads"},"464":{"code":"Vecumnieku novads","name":"Vecumnieku novads"},"365":{"code":"LV-VEN","name":"Ventspils"},"465":{"code":"LV-VE","name":"Ventspils novads"},"466":{"code":"Vies\u012btes novads","name":"Vies\u012btes novads"},"467":{"code":"Vi\u013cakas novads","name":"Vi\u013cakas novads"},"468":{"code":"Vi\u013c\u0101nu novads","name":"Vi\u013c\u0101nu novads"},"470":{"code":"Zilupes novads","name":"Zilupes novads"}}},"MT":{"name":"Malta"},"NL":{"name":"Niederlande"},"NO":{"name":"Norwegen"},"PL":{"name":"Polen","regions":{"627":{"code":"PL-02","name":"dolno\u015bl\u0105skie"},"628":{"code":"PL-04","name":"kujawsko-pomorskie"},"629":{"code":"PL-06","name":"lubelskie"},"630":{"code":"PL-08","name":"lubuskie"},"633":{"code":"PL-14","name":"mazowieckie"},"632":{"code":"PL-12","name":"ma\u0142opolskie"},"634":{"code":"PL-16","name":"opolskie"},"635":{"code":"PL-18","name":"podkarpackie"},"636":{"code":"PL-20","name":"podlaskie"},"637":{"code":"PL-22","name":"pomorskie"},"638":{"code":"PL-24","name":"\u015bl\u0105skie"},"639":{"code":"PL-26","name":"\u015bwi\u0119tokrzyskie"},"640":{"code":"PL-28","name":"warmi\u0144sko-mazurskie"},"641":{"code":"PL-30","name":"wielkopolskie"},"642":{"code":"PL-32","name":"zachodniopomorskie"},"631":{"code":"PL-10","name":"\u0142\u00f3dzkie"}}},"PT":{"name":"Portugal","regions":{"966":{"code":"PT-01","name":"Aveiro"},"967":{"code":"PT-02","name":"Beja"},"968":{"code":"PT-03","name":"Braga"},"969":{"code":"PT-04","name":"Bragan\u00e7a"},"970":{"code":"PT-05","name":"Castelo Branco"},"971":{"code":"PT-06","name":"Coimbra"},"972":{"code":"PT-07","name":"\u00c9vora"},"973":{"code":"PT-08","name":"Faro"},"974":{"code":"PT-09","name":"Guarda"},"975":{"code":"PT-10","name":"Leiria"},"976":{"code":"PT-11","name":"Lisboa"},"977":{"code":"PT-12","name":"Portalegre"},"978":{"code":"PT-13","name":"Porto"},"985":{"code":"PT-30","name":"Regi\u00e3o Aut\u00f3noma da Madeira"},"984":{"code":"PT-20","name":"Regi\u00e3o Aut\u00f3noma dos A\u00e7ores"},"979":{"code":"PT-14","name":"Santar\u00e9m"},"980":{"code":"PT-15","name":"Set\u00fabal"},"981":{"code":"PT-16","name":"Viana do Castelo"},"982":{"code":"PT-17","name":"Vila Real"},"983":{"code":"PT-18","name":"Viseu"}}},"RO":{"name":"Rum\u00e4nien","regions":{"278":{"code":"AB","name":"Alba"},"279":{"code":"AR","name":"Arad"},"280":{"code":"AG","name":"Arge\u015f"},"281":{"code":"BC","name":"Bac\u0103u"},"282":{"code":"BH","name":"Bihor"},"283":{"code":"BN","name":"Bistri\u0163a-N\u0103s\u0103ud"},"284":{"code":"BT","name":"Boto\u015fani"},"286":{"code":"BR","name":"Br\u0103ila"},"285":{"code":"BV","name":"Bra\u015fov"},"287":{"code":"B","name":"Bucure\u015fti"},"288":{"code":"BZ","name":"Buz\u0103u"},"290":{"code":"CL","name":"C\u0103l\u0103ra\u015fi"},"289":{"code":"CS","name":"Cara\u015f-Severin"},"291":{"code":"CJ","name":"Cluj"},"292":{"code":"CT","name":"Constan\u0163a"},"293":{"code":"CV","name":"Covasna"},"294":{"code":"DB","name":"D\u00e2mbovi\u0163a"},"295":{"code":"DJ","name":"Dolj"},"296":{"code":"GL","name":"Gala\u0163i"},"297":{"code":"GR","name":"Giurgiu"},"298":{"code":"GJ","name":"Gorj"},"299":{"code":"HR","name":"Harghita"},"300":{"code":"HD","name":"Hunedoara"},"301":{"code":"IL","name":"Ialomi\u0163a"},"302":{"code":"IS","name":"Ia\u015fi"},"303":{"code":"IF","name":"Ilfov"},"304":{"code":"MM","name":"Maramure\u015f"},"305":{"code":"MH","name":"Mehedin\u0163i"},"306":{"code":"MS","name":"Mure\u015f"},"307":{"code":"NT","name":"Neam\u0163"},"308":{"code":"OT","name":"Olt"},"309":{"code":"PH","name":"Prahova"},"311":{"code":"SJ","name":"S\u0103laj"},"310":{"code":"SM","name":"Satu-Mare"},"312":{"code":"SB","name":"Sibiu"},"313":{"code":"SV","name":"Suceava"},"314":{"code":"TR","name":"Teleorman"},"315":{"code":"TM","name":"Timi\u015f"},"316":{"code":"TL","name":"Tulcea"},"318":{"code":"VL","name":"V\u00e2lcea"},"317":{"code":"VS","name":"Vaslui"},"319":{"code":"VN","name":"Vrancea"}}},"RS":{"name":"Serbien"},"SE":{"name":"Schweden","regions":{"996":{"code":"SE-K","name":"Blekinge l\u00e4n"},"997":{"code":"SE-W","name":"Dalarnas l\u00e4n"},"999":{"code":"SE-X","name":"G\u00e4vleborgs l\u00e4n"},"998":{"code":"SE-I","name":"Gotlands l\u00e4n"},"1000":{"code":"SE-N","name":"Hallands l\u00e4n"},"1001":{"code":"SE-Z","name":"J\u00e4mtlands l\u00e4n"},"1002":{"code":"SE-F","name":"J\u00f6nk\u00f6pings l\u00e4n"},"1003":{"code":"SE-H","name":"Kalmar l\u00e4n"},"1004":{"code":"SE-G","name":"Kronobergs l\u00e4n"},"1005":{"code":"SE-BD","name":"Norrbottens l\u00e4n"},"1015":{"code":"SE-T","name":"\u00d6rebro l\u00e4n"},"1016":{"code":"SE-E","name":"\u00d6sterg\u00f6tlands l\u00e4n"},"1006":{"code":"SE-M","name":"Sk\u00e5ne l\u00e4n"},"1008":{"code":"SE-D","name":"S\u00f6dermanlands l\u00e4n"},"1007":{"code":"SE-AB","name":"Stockholms l\u00e4n"},"1009":{"code":"SE-C","name":"Uppsala l\u00e4n"},"1010":{"code":"SE-S","name":"V\u00e4rmlands l\u00e4n"},"1011":{"code":"SE-AC","name":"V\u00e4sterbottens l\u00e4n"},"1012":{"code":"SE-Y","name":"V\u00e4sternorrlands l\u00e4n"},"1013":{"code":"SE-U","name":"V\u00e4stmanlands l\u00e4n"},"1014":{"code":"SE-O","name":"V\u00e4stra G\u00f6talands l\u00e4n"}}},"SI":{"name":"Slowenien"},"SK":{"name":"Slowakei"},"data_id":1732548226},"instant-purchase":[],"loggedAsCustomer":[],"captcha":[],"persistent":[],"review":[],"wishlist":{"items":[]},"quote":[],"hyva_checkout":[],"gtm-checkout":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[]}</script> </div><script nonce="bndjdXgyc2NzZjZxd3gydW5hbTF0eXN1bGp1a3Bhc2E="> yireoGoogleTagManager2Pusher({"version":"3.9.7","page_type":"category","page_path":"https:\/\/www.sunliner.de\/balkonschirme\/manufacturer-paraflex.html","page_title":"Paraflex Balkonschirme jetzt online kaufen | SunLiner","virtual_page":"\/balkonschirme\/manufacturer-paraflex.html","breadcrumb":["Balkonschirme"],"user":{"has_transacted":false},"category_size":0,"products":[],"category_id":"211","category_name":"Balkonschirme"}, 'push (initial page) [data-layer.phtml]'); yireoGoogleTagManager2Pusher({"event":"view_item_list","ecommerce":{"items":[]}}, 'push (page-based event) [data-layer.phtml]'); </script> <script nonce="bndjdXgyc2NzZjZxd3gydW5hbTF0eXN1bGp1a3Bhc2E="> function yireoGoogleTagManager2FindParentElementWithName(element, parentTagName) { if (!element.parentElement) { return null; } if (element.parentElement.tagName.toLowerCase() === parentTagName) { return element.parentElement; } return yireoGoogleTagManager2FindParentElementWithName(element.parentElement, parentTagName); } const products = document.querySelectorAll('.products a.product'); if (products) { products.forEach(function(product) { product.addEventListener('click', function(event, s) { let parentElement = yireoGoogleTagManager2FindParentElementWithName(event.target, 'form'); const inputElement = parentElement.querySelector('input[name="product"]'); const productId = inputElement.value; const productData = window['YIREO_GOOGLETAGMANAGER2_PRODUCT_DATA_ID_' + productId] || {}; productData.item_id = productId; const eventData = { 'event': 'select_item', 'ecommerce': { 'items': [productData] } } yireoGoogleTagManager2Pusher(eventData, 'push (page event "select_item") [script-product-clicks.phtml]'); if (window['YIREO_GOOGLETAGMANAGER2_DEBUG_CLICKS'] && confirm("Press to continue with redirect") === false) { event.preventDefault(); } }); }) } </script> <script nonce="bndjdXgyc2NzZjZxd3gydW5hbTF0eXN1bGp1a3Bhc2E="> window.addEventListener('private-content-loaded', function(event) { window.dataLayer = window.dataLayer || []; var isEmpty = function (variable) { if (typeof variable === 'undefined') { return true; } if (Array.isArray(variable) && variable.length === 0) { return true; } return typeof variable === 'object' && Object.keys(variable).length === 0; } var getSectionNames = function () { return ['cart', 'customer']; } getSectionNames().forEach(function (sectionName) { if (!event.detail.data[sectionName].gtm) { return; } const attributes = event.detail.data[sectionName].gtm; if (!Object.keys(attributes).length > 0) { return; } yireoGoogleTagManager2Pusher(attributes, 'push (attributes) [script-additions.phtml]'); }); let attributes = {}; getSectionNames().forEach(function (sectionName) { if (!event.detail.data[sectionName].gtm_events) { return; } const gtmEvents = event.detail.data[sectionName].gtm_events; for (const [eventId, eventData] of Object.entries(gtmEvents)) { yireoGoogleTagManager2Logger('found event in section "' + sectionName + '"', eventData); const metaData = eventData.meta; yireoGoogleTagManager2Pusher(eventData, 'push (customerData "' + sectionName + '" event "' + eventId + '")'); if (!metaData || metaData.cacheable !== true) { yireoGoogleTagManager2Logger('removing event "' + eventId + '" from section "' + sectionName + '"') let mageCacheStorage = event.detail.data; if (mageCacheStorage !== null && typeof mageCacheStorage[sectionName] !== 'undefined' && typeof mageCacheStorage[sectionName].gtm_events !== 'undefined' && eventId in mageCacheStorage[sectionName].gtm_events) { delete mageCacheStorage[sectionName].gtm_events[eventId]; } window.localStorage.setItem('mage-cache-storage', JSON.stringify(mageCacheStorage)); } } }); if (false === isEmpty(attributes)) { yireoGoogleTagManager2Pusher(attributes, 'dataLayer (initial js) [script-additions.phtml]'); } }); </script> </body> </html>