1<!doctype html> 2<html lang="de"> 3<head > 4 <meta charset="utf-8"/> 5<meta name="title" content="Warenkorb"/> 6<meta name="robots" content="NOINDEX, FOLLOW"/> 7<meta name="viewport" content="width=device-width, initial-scale=1"/> 8<title>Warenkorb</title> 9 <link rel="stylesheet" type="text/css" media="all" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/css/styles.css" /> 10<link rel="stylesheet" type="text/css" media="all" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/css/footer-widerruf-button.css" /> 11<link rel="stylesheet" type="text/css" media="all" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/Algolia_AlgoliaSearch/css/autocomplete.css" /> 12<link rel="stylesheet" type="text/css" media="all" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/Algolia_AlgoliaSearch/css/grid.css" /> 13<link rel="stylesheet" type="text/css" media="all" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/Algolia_AlgoliaSearch/css/algolia-reset.css" /> 14<link rel="stylesheet" type="text/css" media="all" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/Algolia_AlgoliaSearch/css/instantsearch.css" /> 15<link rel="stylesheet" type="text/css" media="all" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/Algolia_AlgoliaSearch/css/recommend.css" /> 16<link rel="stylesheet" type="text/css" media="all" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/Algolia_CustomAlgolia/css/custom-autocomplete.css" /> 17<link rel="stylesheet" type="text/css" media="all" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/Algolia_CustomAlgolia/css/custom-instant-page.css" /> 18<link rel="preload" as="font" crossorigin="anonymous" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/frontend/Hyva/custom/web/fonts/Roboto-Thin.ttf" /> 19<link rel="preload" as="font" crossorigin="anonymous" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/frontend/Hyva/custom/web/fonts/Roboto-Light.ttf" /> 20<link rel="preload" as="font" crossorigin="anonymous" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/frontend/Hyva/custom/web/fonts/Roboto-Regular.ttf" /> 21<link rel="preload" as="font" crossorigin="anonymous" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/frontend/Hyva/custom/web/fonts/Roboto-Medium.ttf" /> 22<link rel="preload" as="font" crossorigin="anonymous" href="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/frontend/Hyva/custom/web/fonts/Roboto-Bold.ttf" /> 23<link rel="icon" type="image/x-icon" href="https://www.laufshirt-bedrucken.de/media/favicon/default/faicon.png" /> 24<link rel="shortcut icon" type="image/x-icon" href="https://www.laufshirt-bedrucken.de/media/favicon/default/faicon.png" /> 25<style>div.description-box.size-instructions.halfwidth{display: none !important}</style>
26<script> 27 window.fwSettings={ 28 'widget_id':103000002553 29 }; 30 !function(){if("function"!=typeof window.FreshworksWidget){var n=function(){n.q.push(arguments)};n.q=[],window.FreshworksWidget=n}}() 31</script>
vendor: 2 bytes, line 31
31
32<script type='text/javascript' src='https://euc-widget.freshworks.com/widgets/103000002553.js' async defer></script>
vendor: 2 bytes, line 32
32
33<script src="https://public.analyze.shirtracer.gmbh/plugins/whatsapp/whatsapp.js"></script>
vendor: 2 bytes, line 33
33
34<script src="https://cloud.ccm19.de/app.js?apiKey=8cc2152652e82c0c4a5d1c4dd040ff6de7b8a865e2077f19&domain=6886025de7a25324db074702" referrerpolicy="origin"></script>
34 35<!-- Meta Pixel Code -->
36<script>
vendor: 408 bytes, lines 36-45
36 37!function(f,b,e,v,n,t,s) 38{if(f.fbq)return;n=f.fbq=function(){n.callMethod? 39n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 40if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 41n.queue=[];t=b.createElement(e);t.async=!0; 42t.src=v;s=b.getElementsByTagName(e)[0]; 43s.parentNode.insertBefore(t,s)}(window, document,'script', 44'https://connect.facebook.net/en_US/fbevents.js'); 45fbq('init', '
451063173096054465
vendor: 32 bytes, lines 45-46
45'); 46fbq('track', 'PageView');
47</script>
47 48<noscript><img height="1" width="1" style="display:none" 49src="https://www.facebook.com/tr?id=1063173096054465&ev=PageView&noscript=1" 50/></noscript> 51<!-- End Meta Pixel Code -->
51<script> 52 window.getWpGA4Cookie = function(name) { 53 match = document.cookie.match(new RegExp(name + '=([^;]+)')); 54 if (match) return decodeURIComponent(match[1].replace(/\+/g, ' ')) ; 55 }; 56 57 window.dataLayer = window.dataLayer || []; 58 var dl4Objects = [{"pageName":"Warenkorb","pageType":"cart","event":"view_cart","cart_total":"0.00","total":"0.00","currency":"EUR","ecommerce":{"items":[]}}]; 59 for (var i in dl4Objects) { 60 window.dataLayer.push({ecommerce: null}); 61 window.dataLayer.push(dl4Objects[i]); 62 } 63 var wpGA4Cookies = ['wp_ga4_user_id','wp_ga4_customerGroup']; 64 wpGA4Cookies.map(function(cookieName) { 65 var cookieValue = window.getWpGA4Cookie(cookieName); 66 if (cookieValue) { 67 var dl4Object = {}; 68 dl4Object[cookieName.replace('wp_ga4_', '')] = cookieValue; 69 window.dataLayer.push(dl4Object); 70 } 71 }); 72 </script>
72 73 74 <!-- Google Tag Manager -->
75<script>
vendor: 331 bytes, lines 75-79
75(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 76new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 77j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 78'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 79})(window,document,'script','dataLayer','
79GTM-T74P3V5K
vendor: 3 bytes, line 79
79');
79</script>
79 80<!-- End Google Tag Manager --> 81
82<script> 83 var BASE_URL = 'https://www.laufshirt-bedrucken.de/'; 84 var THEME_PATH = 'https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE'; 85 var COOKIE_CONFIG = { 86 "expires": null, 87 "path": "\u002F", 88 "domain": ".www.laufshirt\u002Dbedrucken.de", 89 "secure": true, 90 "lifetime": "86400", 91 "cookie_restriction_enabled": false }; 92 var CURRENT_STORE_CODE = 'dede'; 93 var CURRENT_WEBSITE_ID = '1'; 94 95 window.hyva = window.hyva || {} 96 97 window.cookie_consent_groups = window.cookie_consent_groups || {} 98 window.cookie_consent_groups['necessary'] = true; 99 100 window.cookie_consent_config = window.cookie_consent_config || {}; 101 window.cookie_consent_config['necessary'] = [].concat( 102 window.cookie_consent_config['necessary'] || [], 103 [ 104 'user_allowed_save_cookie', 105 'form_key', 106 'mage-messages', 107 'private_content_version', 108 'mage-cache-sessid', 109 'last_visited_store', 110 'section_data_ids' 111 ] 112 ); 113 //# sourceURL=hyva-variables.js 114</script>
vendor: 1 bytes, line 114
114
115<script> 116 (function( hyva, undefined ) { 117 118 function lifetimeToExpires(options, defaults) { 119 120 const lifetime = options.lifetime || defaults.lifetime; 121 122 if (lifetime) { 123 const date = new Date; 124 date.setTime(date.getTime() + lifetime * 1000); 125 return date; 126 } 127 128 return null; 129 } 130 131 function generateRandomString() { 132 133 const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 134 length = 16; 135 136 let formKey = '', 137 charactersLength = allowedCharacters.length; 138 139 for (let i = 0; i < length; i++) { 140 formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] 141 } 142 143 return formKey; 144 } 145 146 const sessionCookieMarker = {noLifetime: true} 147 148 const cookieTempStorage = {}; 149 150 const internalCookie = { 151 get(name) { 152 const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 153 return v ? v[2] : null; 154 }, 155 set(name, value, days, skipSetDomain) { 156 let expires, 157 path, 158 domain, 159 secure, 160 samesite; 161 162 const defaultCookieConfig = { 163 expires: null, 164 path: '/', 165 domain: null, 166 secure: false, 167 lifetime: null, 168 samesite: 'lax' 169 }; 170 171 const cookieConfig = window.COOKIE_CONFIG || {}; 172 173 expires = days && days !== sessionCookieMarker 174 ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) 175 : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; 176 177 path = cookieConfig.path || defaultCookieConfig.path; 178 domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); 179 secure = cookieConfig.secure || defaultCookieConfig.secure; 180 samesite = cookieConfig.samesite || defaultCookieConfig.samesite; 181 182 document.cookie = name + "=" + encodeURIComponent(value) + 183 (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + 184 (path ? '; path=' + path : '') + 185 (domain ? '; domain=' + domain : '') + 186 (secure ? '; secure' : '') + 187 (samesite ? '; samesite=' + samesite : 'lax'); 188 }, 189 isWebsiteAllowedToSaveCookie() { 190 const allowedCookies = this.get('user_allowed_save_cookie'); 191 if (allowedCookies) { 192 const allowedWebsites = JSON.parse(unescape(allowedCookies)); 193 194 return allowedWebsites[CURRENT_WEBSITE_ID] === 1; 195 } 196 return false; 197 }, 198 getGroupByCookieName(name) { 199 const cookieConsentConfig = window.cookie_consent_config || {}; 200 let group = null; 201 for (let prop in cookieConsentConfig) { 202 if (!cookieConsentConfig.hasOwnProperty(prop)) continue; 203 if (cookieConsentConfig[prop].includes(name)) { 204 group = prop; 205 break; 206 } 207 } 208 return group; 209 }, 210 isCookieAllowed(name) { 211 const cookieGroup = this.getGroupByCookieName(name); 212 return cookieGroup 213 ? window.cookie_consent_groups[cookieGroup] 214 : this.isWebsiteAllowedToSaveCookie(); 215 }, 216 saveTempStorageCookies() { 217 for (const [name, data] of Object.entries(cookieTempStorage)) { 218 if (this.isCookieAllowed(name)) { 219 this.set(name, data['value'], data['days'], data['skipSetDomain']); 220 delete cookieTempStorage[name]; 221 } 222 } 223 } 224 }; 225 226 hyva.getCookie = (name) => { 227 const cookieConfig = window.COOKIE_CONFIG || {}; 228 229 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 230 return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; 231 } 232 233 return internalCookie.get(name); 234 } 235 236 hyva.setCookie = (name, value, days, skipSetDomain) => { 237 const cookieConfig = window.COOKIE_CONFIG || {}; 238 239 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 240 cookieTempStorage[name] = {value, days, skipSetDomain}; 241 return; 242 } 243 return internalCookie.set(name, value, days, skipSetDomain); 244 } 245 246 247 hyva.setSessionCookie = (name, value, skipSetDomain) => { 248 return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) 249 } 250 251 hyva.getBrowserStorage = () => { 252 const browserStorage = window.localStorage || window.sessionStorage; 253 if (!browserStorage) { 254 console.warn('Browser Storage is unavailable'); 255 return false;
256 } 257 try { 258 browserStorage.setItem('storage_test', '1'); 259 browserStorage.removeItem('storage_test'); 260 } catch (error) { 261 console.warn('Browser Storage is not accessible', error); 262 return false; 263 } 264 return browserStorage; 265 } 266 267 hyva.postForm = (postParams) => { 268 const form = document.createElement("form"); 269 270 let data = postParams.data; 271 272 if (! postParams.skipUenc && ! data.uenc) { 273 data.uenc = btoa(window.location.href); 274 } 275 form.method = "POST"; 276 form.action = postParams.action; 277 278 Object.keys(postParams.data).map(key => { 279 const field = document.createElement("input"); 280 field.type = 'hidden' 281 field.value = postParams.data[key]; 282 field.name = key; 283 form.appendChild(field); 284 }); 285 286 const form_key = document.createElement("input"); 287 form_key.type = 'hidden'; 288 form_key.value = hyva.getFormKey(); 289 form_key.name="form_key"; 290 form.appendChild(form_key); 291 292 document.body.appendChild(form); 293 294 form.submit(); 295 } 296 297 hyva.getFormKey = function () { 298 let formKey = hyva.getCookie('form_key'); 299 300 if (!formKey) { 301 formKey = generateRandomString(); 302 hyva.setCookie('form_key', formKey); 303 } 304 305 return formKey; 306 } 307 308 hyva.formatPrice = (value, showSign, options = {}) => { 309 const groupSeparator = options.groupSeparator; 310 const decimalSeparator = options.decimalSeparator 311 delete options.groupSeparator; 312 delete options.decimalSeparator; 313 const formatter = new Intl.NumberFormat( 314 'de\u002DDE', 315 Object.assign({ 316 style: 'currency', 317 currency: 'EUR', 318 signDisplay: showSign ? 'always' : 'auto' 319 }, options) 320 ); 321 return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? 322 formatter.formatToParts(value).map(({type, value}) => { 323 switch (type) { 324 case 'currency': 325 return '\u20AC' || value; 326 case 'minusSign': 327 return '- '; 328 case 'plusSign': 329 return '+ '; 330 case 'group': 331 return groupSeparator !== undefined ? groupSeparator : value; 332 case 'decimal': 333 return decimalSeparator !== undefined ? decimalSeparator : value; 334 default : 335 return value; 336 } 337 }).reduce((string, part) => string + part) : 338 formatter.format(value); 339 } 340 341 const formatStr = function (str, nStart) { 342 const args = Array.from(arguments).slice(2); 343 344 return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { 345 const idx = parseInt(n) - nStart; 346 347 if (args[idx] === null || args[idx] === void 0) { 348 return m; 349 } 350 return p.length % 2 351 ? p.slice(0, -1).replace('%%', '%') + args[idx] 352 : p.replace('%%', '%') + n; 353 }) 354 } 355 356 hyva.str = function (string) { 357 const args = Array.from(arguments); 358 args.splice(1, 0, 1); 359 360 return formatStr.apply(undefined, args); 361 } 362 363 hyva.strf = function () { 364 const args = Array.from(arguments); 365 args.splice(1, 0, 0); 366 367 return formatStr.apply(undefined, args); 368 } 369 370 /** 371 * Take a html string as `content` parameter and 372 * extract an element from the DOM to replace in 373 * the current page under the same selector, 374 * defined by `targetSelector` 375 */ 376 hyva.replaceDomElement = (targetSelector, content) => { 377 // Parse the content and extract the DOM node using the `targetSelector` 378 const parser = new DOMParser(); 379 const doc = parser.parseFromString(content, 'text/html');
380 const contentNode = doc.querySelector(targetSelector); 381 382 // Bail if content or target can't be found 383 if (!contentNode || !document.querySelector(targetSelector)) { 384 return; 385 } 386 387 hyva.activateScripts(contentNode); 388 389 // Replace the old DOM node with the new content 390 document.querySelector(targetSelector).replaceWith(contentNode); 391 392 // Reload customerSectionData and display cookie-messages if present 393 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 394 hyva.initMessages(); 395 } 396 397 hyva.removeScripts = (contentNode) => { 398 const scripts = contentNode.getElementsByTagName('script'); 399 for (let i = 0; i < scripts.length; i++) { 400 scripts[i].parentNode.removeChild(scripts[i]); 401 } 402 const templates = contentNode.getElementsByTagName('template'); 403 for (let i = 0; i < templates.length; i++) { 404 const container = document.createElement('div'); 405 container.innerHTML = templates[i].innerHTML; 406 hyva.removeScripts(container); 407 templates[i].innerHTML = container.innerHTML; 408 } 409 } 410 411 hyva.activateScripts = (contentNode) => { 412 // Create new array from HTMLCollection to avoid mutation of collection while manipulating the DOM. 413 const scripts = Array.from(contentNode.getElementsByTagName('script')); 414 415 // Iterate over all script tags to duplicate+inject each into the head 416 for (const original of scripts) { 417 const script = document.createElement('script'); 418 original.type && (script.type = original.type); 419 script.innerHTML = original.innerHTML; 420 421 // Remove the original (non-executing) script from the contentNode 422 original.parentNode.removeChild(original) 423 424 // Add script to head 425 document.head.appendChild(script); 426 } 427 428 return contentNode; 429 } 430 431 const replace = {['+']: '-', ['/']: '_', ['=']: ','}; 432 hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); 433 434 let currentTrap; 435 436 const focusableElements = (rootElement) => { 437 const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]'; 438 return Array.from(rootElement.querySelectorAll(selector)) 439 .filter(el => { 440 return el.style.display !== 'none' 441 && !el.disabled 442 && el.tabIndex !== -1 443 && (el.offsetWidth || el.offsetHeight || el.getClientRects().length) 444 }) 445 } 446 447 const focusTrap = (e) => { 448 const isTabPressed = e.key === 'Tab' || e.keyCode === 9; 449 if (!isTabPressed) return; 450 451 const focusable = focusableElements(currentTrap) 452 const firstFocusableElement = focusable[0] 453 const lastFocusableElement = focusable[focusable.length - 1] 454 455 e.shiftKey 456 ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) 457 : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) 458 }; 459 460 hyva.releaseFocus = (rootElement) => { 461 if (currentTrap && (!rootElement || rootElement === currentTrap)) { 462 currentTrap.removeEventListener('keydown', focusTrap) 463 currentTrap = null 464 } 465 } 466 hyva.trapFocus = (rootElement) => { 467 if (!rootElement) return; 468 hyva.releaseFocus() 469 currentTrap = rootElement 470 rootElement.addEventListener('keydown', focusTrap) 471 const firstElement = focusableElements(rootElement)[0] 472 firstElement && firstElement.focus() 473 } 474 475 hyva.safeParseNumber = (rawValue) => { 476 const number = rawValue ? parseFloat(rawValue) : null; 477 478 return Array.isArray(number) || isNaN(number) ? rawValue : number; 479 } 480 481 const toCamelCase = s => s.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(''); 482 hyva.createBooleanObject = (name, value = false, additionalMethods = {}) => { 483 484 const camelCase = toCamelCase(name);
485 const key = '__hyva_bool_' + name 486 487 return new Proxy(Object.assign( 488 additionalMethods, 489 { 490 [key]: !!value, 491 [name]() {return !!this[key]}, 492 ['!' + name]() {return !this[key]}, // @deprecated This does not work with non-CSP Alpine 493 ['not' + camelCase]() {return !this[key]}, 494 ['toggle' + camelCase]() {this[key] = !this[key]}, 495 [`set${camelCase}True`]() {this[key] = true}, 496 [`set${camelCase}False`]() {this[key] = false}, 497 } 498 ), { 499 set(target, prop, value) { 500 return prop === name 501 ? (target[key] = !!value) 502 : Reflect.set(...arguments); 503 } 504 }) 505 } 506 507 hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true}) 508 window.addEventListener('alpine:init', () => Alpine.data('{}', () => ({})), {once: true}); 509 window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) 510 511 }( window.hyva = window.hyva || {} )); 512 //# sourceURL=hyva.js 513</script>
vendor: 1 bytes, line 513
513
514<script type="speculationrules"> 515{ 516 "tag": "Hyva Theme", 517 "prefetch": [{ 518 "source": "document", 519 "where": { 520 "and": [ 521 { "href_matches": "/*" }, 522 { "not": { 523 "href_matches": ["/customer/*","/search/*","/sales/*","/wishlist/*","/checkout/*","/paypal/*","/newsletter/*","/stores/store/redirect/*"] }}, 524 { "not": { 525 "selector_matches": [".no-preload", ".do-not-prerender", "[download]", "[rel~=nofollow]", "[target]"] 526 }} 527 ] 528 }, 529 "eagerness": "moderate" 530 }] 531} 532</script>
532 533
534<script> 535 const viewTransitionToGalleryPageStorage = 'view-transition-to-gallery-page-type'; 536 const setTransitionNameBetweenGallery = async (url, promise) => { 537 if (window.matchMedia('(prefers-reduced-motion)').matches) return; 538 539 const productGallery = document.getElementById('gallery-main'); 540 const productListItem = document.querySelector(`.product-item-photo[href="${url}"]`); 541 const targetElement = productListItem || productGallery; 542 543 if (targetElement) { 544 targetElement.style.viewTransitionName = 'view-transition-to-gallery'; 545 546 await promise; 547 targetElement.style.viewTransitionName = ''; 548 } 549 }; 550 551 const getViewTransitionToGalleryPageIsProduct = () => { 552 return document.body.classList.contains('catalog-product-view') ? 'product-page' : 'other' 553 } 554 555 window.addEventListener('pageswap', async (e) => { 556 if (!e.viewTransition) return; 557 const pageType = getViewTransitionToGalleryPageIsProduct(); 558 const target = new URL(e.activation.entry.url); 559 560 sessionStorage.setItem(viewTransitionToGalleryPageStorage, pageType); 561 setTransitionNameBetweenGallery(target.href, e.viewTransition.finished); 562 }); 563 564 window.addEventListener('pagereveal', async (e) => { 565 if (!e.viewTransition || (window.navigation && !window.navigation.activation.from)) return; 566 const previousPageType = sessionStorage.getItem(viewTransitionToGalleryPageStorage); 567 const pageType = getViewTransitionToGalleryPageIsProduct(); 568 sessionStorage.removeItem(viewTransitionToGalleryPageStorage); 569 570 if (previousPageType === pageType) return; 571 const target = new URL(window.navigation.activation.from.url); 572 setTransitionNameBetweenGallery(target.href, e.viewTransition.ready); 573 }); 574</script>
574 575 576
576<script>window.algoliaConfig = JSON.parse('\u007B\u0022instant\u0022\u003A\u007B\u0022enabled\u0022\u003Atrue,\u0022selector\u0022\u003A\u0022.columns\u0022,\u0022isAddToCartEnabled\u0022\u003Afalse,\u0022addToCartParams\u0022\u003A\u007B\u0022action\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fwww.laufshirt\u002Dbedrucken.de\u005C\u002Fcheckout\u005C\u002Fcart\u005C\u002Fadd\u005C\u002F\u0022,\u0022formKey\u0022\u003A\u0022HujNZleQ4X9NXZCR\u0022,\u0022redirectUrlParam\u0022\u003A\u0022uenc\u0022\u007D,\u0022infiniteScrollEnabled\u0022\u003Atrue,\u0022urlTrackedParameters\u0022\u003A\u005B\u0022query\u0022,\u0022attribute\u003A\u002A\u0022,\u0022index\u0022\u005D,\u0022isSearchBoxEnabled\u0022\u003Atrue,\u0022isVisualMerchEnabled\u0022\u003Afalse,\u0022categorySeparator\u0022\u003A\u0022\u0020\u005C\u002F\u005C\u002F\u005C\u002F\u0020\u0022,\u0022categoryPageIdAttribute\u0022\u003A\u0022categoryPageId\u0022,\u0022isCategoryNavigationEnabled\u0022\u003Afalse,\u0022hidePagination\u0022\u003Afalse,\u0022isDynamicFacetsEnabled\u0022\u003Afalse,\u0022redirects\u0022\u003A\u007B\u0022enabled\u0022\u003Afalse,\u0022onPageLoad\u0022\u003Atrue,\u0022onSearchAsYouType\u0022\u003Afalse,\u0022showSelectableRedirect\u0022\u003Atrue,\u0022openInNewWindow\u0022\u003Afalse\u007D\u007D,\u0022autocomplete\u0022\u003A\u007B\u0022enabled\u0022\u003Atrue,\u0022selector\u0022\u003A\u0022.algolia\u002Dsearch\u002Dinput\u0022,\u0022sections\u0022\u003A\u005B\u005D,\u0022nbOfProductsSuggestions\u0022\u003A4,\u0022nbOfCategoriesSuggestions\u0022\u003A3,\u0022nbOfQueriesSuggestions\u0022\u003A3,\u0022isDebugEnabled\u0022\u003Afalse,\u0022isNavigatorEnabled\u0022\u003Atrue,\u0022debounceMilliseconds\u0022\u003A300,\u0022minimumCharacters\u0022\u003A0,\u0022redirects\u0022\u003A\u007B\u0022enabled\u0022\u003Atrue,\u0022showSelectableRedirect\u0022\u003Atrue,\u0022showHitsWithRedirect\u0022\u003Afalse,\u0022openInNewWindow\u0022\u003Afalse\u007D\u007D,\u0022landingPage\u0022\u003A\u007B\u0022query\u0022\u003A\u0022\u0022,\u0022configuration\u0022\u003A\u0022\u005B\u005D\u0022\u007D,\u0022recommend\u0022\u003A\u007B\u0022enabledFBT\u0022\u003Afalse,\u0022enabledRelated\u0022\u003Afalse,\u0022enabledFBTInCart\u0022\u003Afalse,\u0022enabledRelatedInCart\u0022\u003Afalse,\u0022enabledLookingSimilar\u0022\u003A0,\u0022limitFBTProducts\u0022\u003A6,\u0022limitRelatedProducts\u0022\u003A6,\u0022limitTrendingItems\u0022\u003A6,\u0022limitLookingSimilar\u0022\u003A6,\u0022enabledTrendItems\u0022\u003A0,\u0022trendItemFacetName\u0022\u003Anull,\u0022trendItemFacetValue\u0022\u003Anull,\u0022isTrendItemsEnabledInPDP\u0022\u003A0,\u0022isTrendItemsEnabledInCartPage\u0022\u003A0,\u0022isAddToCartEnabledInFBT\u0022\u003Afalse,\u0022isAddToCartEnabledInRelatedProduct\u0022\u003Afalse,\u0022isAddToCartEnabledInTrendsItem\u0022\u003Afalse,\u0022isAddToCartEnabledInLookingSimilar\u0022\u003Afalse,\u0022FBTTitle\u0022\u003A\u0022Frequently\u0020bought\u0020together\u0022,\u0022relatedProductsTitle\u0022\u003A\u0022Related\u0020products\u0022,\u0022trendingItemsTitle\u0022\u003A\u0022Trending\u0020items\u0022,\u0022addToCartParams\u0022\u003A\u007B\u0022action\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fwww.laufshirt\u002Dbedrucken.de\u005C\u002Fcheckout\u005C\u002Fcart\u005C\u002Fadd\u005C\u002F\u0022,\u0022formKey\u0022\u003A\u0022HujNZleQ4X9NXZCR\u0022,\u0022redirectUrlParam\u0022\u003A\u0022uenc\u0022\u007D,\u0022isLookingSimilarEnabledInPDP\u0022\u003A0,\u0022isLookingSimilarEnabledInCartPage\u0022\u003A0,\u0022lookingSimilarTitle\u0022\u003A\u0022Looking\u0020Similar\u0022\u007D,\u0022extensionVersion\u0022\u003A\u00223.17.2\u0022,\u0022applicationId\u0022\u003A\u0022J515FLU351\u0022,\u0022indexName\u0022\u003A\u0022live_dede\u0022,\u0022baseIndexName\u0022\u003A\u0022live_dede\u0022,\u0022apiKey\u0022\u003A\u0022ZTY1NzliZTcwYTQ3MDI4ZDAzMzlmYjA1ZmYwYTQ2MGQ4NjczNjk2Yzk0NzgzOWFlNTgwNjE1ZjgxYzdjZjRiZHRhZ0ZpbHRlcnM9JnZhbGlkVW50aWw9MTc5MTA3MzI3OQ\u003D\u003D\u0022,\u0022attributeFilter\u0022\u003A\u005B\u005D,\u0022facets\u0022\u003A\u005B\u007B\u0022attribute\u0022\u003A\u0022price\u0022,\u0022type\u0022\u003A\u0022slider\u0022,\u0022label\u0022\u003A\u0022Preis\u0022,\u0022searchable\u0022\u003A\u00222\u0022,\u0022create_rule\u0022\u003A\u00222\u0022\u007D,\u007B\u0022attribute\u0022\u003A\u0022categories\u0022,\u0022type\u0022\u003A\u0022conjunctive\u0022,\u0022label\u0022\u003A\u0022Kategorien\u0022,\u0022searchable\u0022\u003A\u00222\u0022,\u0022create_rule\u0022\u003A\u00222\u0022\u007D,\u007B\u0022attribute\u0022\u003A\u0022color\u0022,\u0022type\u0022\u003A\u0022disjunctive\u0022,\u0022label\u0022\u003A\u0022Farben\u0022,\u0022searchable\u0022\u003A\u00221\u0022,\u0022create_rule\u0022\u003A\u00222\u0022\u007D\u005D,\u0022areCategoriesInFacets\u0022\u003Atrue,\u0022hitsPerPage\u0022\u003A9,\u0022sortingIndices\u0022\u003A\u005B\u005D,\u0022isSearchPage\u0022\u003Afalse,\u0022isCategoryPage\u0022\u003Afalse,\u0022isLandingPage\u0022\u003Afalse,\u0022removeBranding\u0022\u003Atrue,\u0022productId\u0022\u003Anull,\u0022priceKey\u0022\u003A\u0022.EUR.default\u0022,\u0022priceGroup\u0022\u003Anull,\u0022origFormatedVar\u0022\u003A\u0022price.EUR.default_original_formated\u0022,\u0022tierFormatedVar\u0022\u003A\u0022price.EUR.default_tier_formated\u0022,\u0022currencyCode\u0022\u003A\u0022EUR\u0022,\u0022currencySymbol\u0022\u003A\u0022\u005Cu20ac\u0022,\u0022priceFormat\u0022\u003A\u007B\u0022pattern\u0022\u003A\u0022\u0025s\u005Cu00a0\u005Cu20ac\u0022,\u0022precision\u0022\u003A\u00222\u0022,\u0022requiredPrecision\u0022\u003A\u00222\u0022,\u0022decimalSymbol\u0022\u003A\u0022,\u0022,\u0022groupSymbol\u0022\u003A\u0022.\u0022,\u0022groupLength\u0022\u003A3,\u0022integerRequired\u0022\u003Afalse,\u0022currencyCode\u0022\u003Anull,\u0022showMinus\u0022\u003A\u0022before_symbol\u0022,\u0022symbol\u0022\u003A\u0022\u005Cu20ac\u0022,\u0022minu
576sSign\u0022\u003A\u0022\u0022\u007D,\u0022maxValuesPerFacet\u0022\u003A10,\u0022autofocus\u0022\u003Atrue,\u0022resultPageUrl\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fwww.laufshirt\u002Dbedrucken.de\u005C\u002Fcatalogsearch\u005C\u002Fresult\u005C\u002F\u0022,\u0022request\u0022\u003A\u007B\u0022query\u0022\u003A\u0022\u0022,\u0022refinementKey\u0022\u003A\u0022\u0022,\u0022refinementValue\u0022\u003A\u0022\u0022,\u0022categoryId\u0022\u003A\u0022\u0022,\u0022landingPageId\u0022\u003A\u0022\u0022,\u0022path\u0022\u003A\u0022\u0022,\u0022level\u0022\u003A\u0022\u0022,\u0022parentCategory\u0022\u003A\u0022\u0022,\u0022childCategories\u0022\u003A\u005B\u005D,\u0022url\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fwww.laufshirt\u002Dbedrucken.de\u005C\u002Fcheckout\u005C\u002Fcart\u005C\u002Findex\u005C\u002F\u0022\u007D,\u0022showCatsNotIncludedInNavigation\u0022\u003Afalse,\u0022showSuggestionsOnNoResultsPage\u0022\u003Afalse,\u0022baseUrl\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fwww.laufshirt\u002Dbedrucken.de\u0022,\u0022popularQueries\u0022\u003A\u005B\u005D,\u0022useAdaptiveImage\u0022\u003Atrue,\u0022urls\u0022\u003A\u007B\u0022logo\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fwww.laufshirt\u002Dbedrucken.de\u005C\u002Fstatic\u005C\u002Fversion1789730667\u005C\u002Ffrontend\u005C\u002FHyva\u005C\u002Fcustom\u005C\u002Fde_DE\u005C\u002FAlgolia_AlgoliaSearch\u005C\u002Fjs\u005C\u002Fimages\u005C\u002Falgolia\u002Dlogo\u002Dblue.svg\u0022\u007D,\u0022cookieConfiguration\u0022\u003A\u007B\u0022customerTokenCookie\u0022\u003A\u0022_ALGOLIA_MAGENTO_AUTH\u0022,\u0022consentCookieName\u0022\u003A\u0022user_allowed_save_cookie\u0022,\u0022cookieAllowButtonSelector\u0022\u003A\u0022\u0023btn\u002Dcookie\u002Dallow\u0022,\u0022cookieRestrictionModeEnabled\u0022\u003Afalse,\u0022cookieDuration\u0022\u003A\u002215552000000\u0022\u007D,\u0022ccAnalytics\u0022\u003A\u007B\u0022enabled\u0022\u003Atrue,\u0022ISSelector\u0022\u003A\u0022.ais\u002DHits\u002Ditem\u0020a.result,\u0020.ais\u002DInfiniteHits\u002Ditem\u0020a.result,\u0020.ais\u002DInfiniteHits\u002Ditem\u0020.actions\u0020a\u0022,\u0022conversionAnalyticsMode\u0022\u003A\u0022disable\u0022,\u0022addToCartSelector\u0022\u003A\u0022.action.primary.tocart\u0022,\u0022orderedProductIds\u0022\u003A\u005B\u005D\u007D,\u0022isPersonalizationEnabled\u0022\u003Afalse,\u0022personalization\u0022\u003A\u007B\u0022enabled\u0022\u003Afalse,\u0022viewedEvents\u0022\u003A\u007B\u0022viewProduct\u0022\u003A\u007B\u0022eventName\u0022\u003A\u0022Viewed\u0020Product\u0022,\u0022enabled\u0022\u003Afalse,\u0022method\u0022\u003A\u0022viewedObjectIDs\u0022\u007D\u007D,\u0022clickedEvents\u0022\u003A\u007B\u0022productClicked\u0022\u003A\u007B\u0022eventName\u0022\u003A\u0022Product\u0020Clicked\u0022,\u0022enabled\u0022\u003Afalse,\u0022selector\u0022\u003A\u0022.ais\u002DHits\u002Ditem\u0020a.result,\u0020.ais\u002DInfiniteHits\u002Ditem\u0020a.result\u0022,\u0022method\u0022\u003A\u0022clickedObjectIDs\u0022\u007D,\u0022productRecommended\u0022\u003A\u007B\u0022eventName\u0022\u003A\u0022Recommended\u0020Product\u0020Clicked\u0022,\u0022enabled\u0022\u003Afalse,\u0022selector\u0022\u003A\u0022.products\u002Dupsell\u0020.product\u002Ditem\u0022,\u0022method\u0022\u003A\u0022clickedObjectIDs\u0022\u007D\u007D,\u0022filterClicked\u0022\u003A\u007B\u0022eventName\u0022\u003A\u0022Filter\u0020Clicked\u0022,\u0022enabled\u0022\u003Afalse,\u0022method\u0022\u003A\u0022clickedFilters\u0022\u007D\u007D,\u0022analytics\u0022\u003A\u007B\u0022enabled\u0022\u003Afalse,\u0022delay\u0022\u003A\u00223000\u0022,\u0022triggerOnUiInteraction\u0022\u003A\u00221\u0022,\u0022pushInitialSearch\u0022\u003A\u00220\u0022\u007D,\u0022now\u0022\u003A1790985600,\u0022queue\u0022\u003A\u007B\u0022isEnabled\u0022\u003Atrue,\u0022nbOfJobsToRun\u0022\u003A10,\u0022retryLimit\u0022\u003A3,\u0022nbOfElementsPerIndexingJob\u0022\u003A1000\u007D,\u0022isPreventBackendRenderingEnabled\u0022\u003Afalse,\u0022translations\u0022\u003A\u007B\u0022to\u0022\u003A\u0022bis\u0022,\u0022or\u0022\u003A\u0022oder\u0022,\u0022go\u0022\u003A\u0022Los\u0022,\u0022popularQueries\u0022\u003A\u0022Probieren\u0020Sie\u0020einen\u0020beliebten\u0020Suchbegriff\u0022,\u0022seeAll\u0022\u003A\u0022Alle\u0020Produkte\u0020ansehen\u0022,\u0022allDepartments\u0022\u003A\u0022allen\u0020Kategorien\u0022,\u0022seeIn\u0022\u003A\u0022Produkte\u0020anzeigen\u0020in\u0022,\u0022orIn\u0022\u003A\u0022oder\u0020in\u0022,\u0022noProducts\u0022\u003A\u0022Keine\u0020Produkte\u0020f\u005Cu00fcr\u0020diesen\u0020Suchbegriff\u0022,\u0022noResults\u0022\u003A\u0022Keine\u0020Ergebnisse\u0022,\u0022refine\u0022\u003A\u0022Verbessern\u0022,\u0022selectedFilters\u0022\u003A\u0022Ausgew\u005Cu00e4hlte\u0020Filter\u0022,\u0022clearAll\u0022\u003A\u0022Alles\u0020l\u005Cu00f6schen\u0022,\u0022previousPage\u0022\u003A\u0022Vorherige\u0020Seite\u0022,\u0022nextPage\u0022\u003A\u0022N\u005Cu00e4chste\u0020Seite\u0022,\u0022searchFor\u0022\u003A\u0022Suche\u0020nach\u0020Produkten\u0022,\u0022relevance\u0022\u003A\u0022Relevanz\u0022,\u0022categories\u0022\u003A\u0022Kategorien\u0022,\u0022products\u0022\u003A\u0022Artikel\u0022,\u0022suggestions\u0022\u003A\u0022Vorschl\u005Cu00e4ge\u
5760022,\u0022searchBy\u0022\u003A\u0022Suche\u0020von\u0022,\u0022redirectSearchPrompt\u0022\u003A\u0022Continue\u0020search\u0020for\u0022,\u0022searchForFacetValuesPlaceholder\u0022\u003A\u0022Suche\u0020nach\u0020weiteren\u0020...\u0022,\u0022showMore\u0022\u003A\u0022Zeige\u0020mehr\u0020Produkte\u0022,\u0022searchTitle\u0022\u003A\u0022Search\u0020results\u0020for\u0022,\u0022placeholder\u0022\u003A\u0022Suchen\u0022,\u0022addToCart\u0022\u003A\u0022In\u0020den\u0020Warenkorb\u0022\u007D\u007D')</script>
576 577 578</head> 579<body id="html-body" class="checkout-cart-index page-layout-1column"> 580<!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 580-581
580 581<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
581GTM-T74P3V5K
vendor: 85 bytes, lines 581-582
581" 582height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
583<!-- End Google Tag Manager (noscript) -->
583<script> 584 'use strict'; 585 586 (function () { 587 window.fbqCompatiilityGdprCookie = { 588 allowedCookies: null, 589 disallowedCookies: null, 590 isAllowedToRunScript: null, 591 facebookPixelCookieName: '_fbp', 592 listeners: [ 593 "cookiebar-action-accept-finish", 594 "cookiebar-action-allow-finish" 595 ], 596 597 /** 598 * @public 599 * @params {Object} config 600 * @returns {void} 601 */ 602 init(config) { 603 this.listeners.forEach(listener => { 604 window.addEventListener(listener, () => 605 this.sendFbq(config), 606 {once:true} 607 ); 608 }); 609 610 this.sendFbq(config); 611 }, 612 613 /** 614 * @private 615 * @params {Object} config 616 * @returns {void} 617 */ 618 sendFbq: function (config) { 619 this.disallowedCookies = hyva.getCookie('amcookie_disallowed') || ''; 620 this.allowedCookies = hyva.getCookie('amcookie_allowed') || ''; 621 this.isAllowedToRunScript = !!this.allowedCookies.length 622 && (!this.disallowedCookies || this.disallowedCookies.indexOf(this.facebookPixelCookieName) === -1) 623 624 if (this.isAllowedToRunScript) { 625 fbq(config.callMethod, config.arguments, config.advancedInfo ?? {}); 626 } 627 } 628 } 629 })(); 630</script>
630 631
631<script> 632 !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? 633 n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n; 634 n.push=n;n.loaded=!0;n.version='2.0';n.queue=[]; 635 t=b.createElement(e);t.async=!0;t.src=v;s=b.getElementsByTagName(e)[0]; 636 s.parentNode.insertBefore(t,s)}(window, 637 document,'script','https://connect.facebook.net/en_US/fbevents.js'); 638 </script>
638 639 <!-- Facebook Pixel Code --> 640 <noscript> 641 <img height="1" width="1" style="display:none" alt="Facebook Pixel" 642 src="https://www.facebook.com/tr?id=1063173096054465&ev=PageView&noscript=1" 643 /> 644 </noscript> 645 <!-- End Facebook Pixel Code --> 646
646<script>fbq('init', 1063173096054465, {})</script>
646 647
647<script> fbq('track', 'PageView') </script>
647 648 <input name="form_key" type="hidden" value="HujNZleQ4X9NXZCR" /> 649 <noscript> 650 <section 651 class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal" 652 aria-labelledby="messageGlobalNoScriptMessage" 653 > 654 <div class="container text-center"> 655 <p id="messageGlobalNoScriptMessage"> 656 <strong>JavaScript scheint in Ihrem Browser deaktiviert zu sein.</strong> 657 <span> 658 Um unsere Website in bester Weise zu erfahren, aktivieren Sie Javascript in Ihrem Browser. </span> 659 </p> 660 </div> 661 </section> 662 </noscript> 663 664
665<script> 666 document.body.addEventListener('touchstart', () => {}, {passive: true}) 667</script>
667 668<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 669 contentarea" 670 href="#contentarea"> 671 <span> 672 Zum Inhalt springen </span> 673</a>
674<script> 675 function initHeader () { 676 return { 677 cart: {}, 678 isCartOpen: false, 679 getData(data) { 680 if (data.cart) { this.cart = data.cart } 681 }, 682 isCartEmpty() { 683 return !this.cart.summary_count 684 }, 685 toggleCart(event) { 686 if (event.detail && event.detail.isOpen !== undefined) { 687 this.isCartOpen = event.detail.isOpen 688 if (!this.isCartOpen && this.$refs && this.$refs.cartButton) { 689 this.$refs.cartButton.focus() 690 } 691 } else { 692 this.isCartOpen = true 693 } 694 } 695 } 696 } 697 function initCompareHeader() { 698 return { 699 compareProducts: null, 700 itemCount: 0, 701 receiveCompareData(data) { 702 if (data['compare-products']) { 703 this.compareProducts = data['compare-products']; 704 this.itemCount = this.compareProducts.count; 705 } 706 } 707 } 708 } 709</script>
709 710<div id="header" 711 class="relative z-30 w-full border-b shadow bg-container-lighter border-container-lighter" 712 x-data="initHeader()" 713 @private-content-loaded.window="getData(event.detail.data)" 714> 715 <div class="container flex flex-wrap lg:flex-nowrap items-center justify-between w-full px-6 py-3 mx-auto mt-0"> 716 <!--Logo--> 717 <div class="logo-wrapper"> 718 <div class="burger-container"> 719 <div id="burger"> 720 <div class="bar topBar"></div> 721 <div class="bar ctrBar"></div> 722 <div class="bar btmBar"></div> 723 </div> 724 </div> 725 <a 726 class="logo" 727 href="https://www.laufshirt-bedrucken.de/" 728 title="de" 729 aria-label="store logo"> 730 <img class="logo-desktop" src="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/LaufshirtBedrucken_HyvaCheckout/images/logo/store-logo-de.svg" 731 title="de" 732 alt="de" 733 width="189" height="64" /> 734 <img class="logo-mobile" 735 title="de" 736 src="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/images/logo/logo-mobile-de.svg" 737 /> 738 </a> 739 740</div> 741 742 <!--Main Navigation--> 743 <nav 744 x-data="initMenuMobile_6ac04a7f575ba()" 745 @load.window="setActiveMenu($root)" 746 @keydown.window.escape="closeMenu()" 747 class="z-20 order-2 sm:order-1 lg:order-2 navigation hidden w-12 h-12" 748 aria-label="Site navigation" 749 role="navigation" 750> 751 <!-- mobile --> 752 <button 753 x-ref="mobileMenuTrigger" 754 @click="openMenu()" 755 :class="{'overflow-x-hidden overflow-y-auto fixed top-0 left-0 w-full' : open}" 756 type="button" 757 aria-label="Open menu" 758 aria-haspopup="menu" 759 :aria-expanded="open" 760 :hidden="open" 761 > 762 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="p-3" width="48" height="48" :class="{ 'hidden' : open, 'block': !open }" aria-hidden="true"> 763 <path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"/> 764</svg> 765 </button> 766 <div 767 x-ref="mobileMenuNavLinks" 768 class=" 769 fixed top-0 right-0 w-full h-full p-1 hidden 770 flex-col border-t border-container bg-container-lighter 771 overflow-y-auto overflow-x-hidden 772 " 773 :class="{ 'flex': open, 'hidden': !open }" 774 :aria-hidden="open ? 'false' : 'true'" 775 role="dialog" 776 aria-modal="true" 777 > 778 <ul 779 class="border-t flex flex-col gap-y-1 mt-16" 780 aria-label="Site navigation links" 781 > 782 <li 783 data-child-id="category-node-60-main" 784 class="level-0" 785 > 786 <div 787 class="flex items-center transition-transform duration-150 ease-in-out transform" 788 :class="{ 789 '-translate-x-full' : mobilePanelActiveId, 790 'translate-x-0' : !mobilePanelActiveId 791 }" 792 > 793 <a 794 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 795 bg-container-lighter border-container level-0 796 " 797 href="https://www.laufshirt-bedrucken.de/laufshirts/" 798 title="Laufshirts" 799 > 800 Laufshirts </a> 801 <button 802 @click="openSubcategory('category-node-60')" 803 class="absolute right-0 flex items-center justify-center w-11 h-11 mr-8 cursor-pointer 804 bg-container-lighter border-container" 805 aria-label="Open Laufshirts subcategories" 806 aria-haspopup="true" 807 :aria-expanded="mobilePanelActiveId === 'category-node-60'" 808 > 809 <div class="w-8 h-8 border rounded"> 810 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> 811 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 812</svg> 813 </div> 814 </button> 815 </div> 816 <div 817 data-child-id="category-node-60" 818 class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" 819 :class="{ 820 'hidden': mobilePanelActiveId !== 'category-node-60' 821 }" 822 > 823 <ul 824 class="mt-16 transition-transform duration-200 ease-in-out translate-x-full transform" 825 :class="{ 826 'translate-x-full' : mobilePanelActiveId !== 'category-node-60', 827 'translate-x-0' : mobilePanelActiveId === 'category-node-60', 828 }" 829 aria-label="Subcategories" 830 > 831 <li> 832 <button 833 type="button" 834 class="flex items-center px-8 py-4 border-b cursor-pointer bg-container border-container w-full border-t" 835 @click="backToMainCategories('category-node-60-main')" 836 aria-label="Back to main categories" 837 > 838 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 839 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 840</svg>
841 <span class="ml-4"> 842 Laufshirts </span> 843 </button> 844 </li> 845 <li> 846 <a 847 href="https://www.laufshirt-bedrucken.de/laufshirts/" 848 title="Laufshirts" 849 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 850 bg-container-lighter border-container 851 " 852 > 853 <span class="ml-10"> 854 Alle anzeigen </span> 855 </a> 856 </li> 857 <li> 858 <a 859 href="https://www.laufshirt-bedrucken.de/laufshirts/angebote/" 860 title="Angebote" 861 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 862 bg-container-lighter border-container 863 " 864 > 865 <span class="ml-10 text-base text-gray-700"> 866 Angebote </span> 867 </a> 868 </li> 869 <li> 870 <a 871 href="https://www.laufshirt-bedrucken.de/laufshirts/damen-laufshirts-bedrucken/" 872 title="Damen" 873 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 874 bg-container-lighter border-container 875 " 876 > 877 <span class="ml-10 text-base text-gray-700"> 878 Damen </span> 879 </a> 880 </li> 881 <li> 882 <a 883 href="https://www.laufshirt-bedrucken.de/laufshirts/herren-laufshirts-bedrucken/" 884 title="Herren" 885 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 886 bg-container-lighter border-container 887 " 888 > 889 <span class="ml-10 text-base text-gray-700"> 890 Herren </span> 891 </a> 892 </li> 893 <li> 894 <a 895 href="https://www.laufshirt-bedrucken.de/laufshirts/kinder-laufshirts-bedrucken/" 896 title="Kinder" 897 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 898 bg-container-lighter border-container 899 " 900 >
901 <span class="ml-10 text-base text-gray-700"> 902 Kinder </span> 903 </a> 904 </li> 905 </ul> 906 <button 907 @click="closeMenu()" 908 class="absolute flex justify-end w-16 self-end mb-1 transition-none" 909 aria-label="Close menu" 910 > 911 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> 912 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 913</svg> 914 </button> 915 </div> 916 </li> 917 <li 918 data-child-id="category-node-498-main" 919 class="level-0" 920 > 921 <div 922 class="flex items-center transition-transform duration-150 ease-in-out transform" 923 :class="{ 924 '-translate-x-full' : mobilePanelActiveId, 925 'translate-x-0' : !mobilePanelActiveId 926 }" 927 > 928 <a 929 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 930 bg-container-lighter border-container level-0 931 " 932 href="https://www.laufshirt-bedrucken.de/manner-20689/" 933 title="Männer" 934 > 935 Männer </a> 936 <button 937 @click="openSubcategory('category-node-498')" 938 class="absolute right-0 flex items-center justify-center w-11 h-11 mr-8 cursor-pointer 939 bg-container-lighter border-container" 940 aria-label="Open Männer subcategories" 941 aria-haspopup="true" 942 :aria-expanded="mobilePanelActiveId === 'category-node-498'" 943 > 944 <div class="w-8 h-8 border rounded"> 945 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> 946 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 947</svg> 948 </div> 949 </button> 950 </div> 951 <div 952 data-child-id="category-node-498" 953 class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" 954 :class="{ 955 'hidden': mobilePanelActiveId !== 'category-node-498' 956 }" 957 > 958 <ul 959 class="mt-16 transition-transform duration-200 ease-in-out translate-x-full transform" 960 :class="{ 961 'translate-x-full' : mobilePanelActiveId !== 'category-node-498', 962 'translate-x-0' : mobilePanelActiveId === 'category-node-498', 963 }" 964 aria-label="Subcategories" 965 > 966 <li> 967 <button 968 type="button" 969 class="flex items-center px-8 py-4 border-b cursor-pointer bg-container border-container w-full border-t" 970 @click="backToMainCategories('category-node-498-main')" 971 aria-label="Back to main categories" 972 > 973 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 974 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 975</svg>
976 <span class="ml-4"> 977 Männer </span> 978 </button> 979 </li> 980 <li> 981 <a 982 href="https://www.laufshirt-bedrucken.de/manner-20689/" 983 title="Männer" 984 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 985 bg-container-lighter border-container 986 " 987 > 988 <span class="ml-10"> 989 Alle anzeigen </span> 990 </a> 991 </li> 992 <li> 993 <a 994 href="https://www.laufshirt-bedrucken.de/manner-20689/mpullover-20690/" 995 title="MPullover" 996 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 997 bg-container-lighter border-container 998 " 999 > 1000 <span class="ml-10 text-base text-gray-700"> 1001 MPullover </span> 1002 </a> 1003 </li> 1004 </ul> 1005 <button 1006 @click="closeMenu()" 1007 class="absolute flex justify-end w-16 self-end mb-1 transition-none" 1008 aria-label="Close menu" 1009 > 1010 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> 1011 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 1012</svg> 1013 </button> 1014 </div> 1015 </li> 1016 <li 1017 data-child-id="category-node-86-main" 1018 class="level-0" 1019 > 1020 <div 1021 class="flex items-center transition-transform duration-150 ease-in-out transform" 1022 :class="{ 1023 '-translate-x-full' : mobilePanelActiveId, 1024 'translate-x-0' : !mobilePanelActiveId 1025 }" 1026 > 1027 <a 1028 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1029 bg-container-lighter border-container level-0 1030 " 1031 href="https://www.laufshirt-bedrucken.de/langarm-laufshirts/" 1032 title="Langarm Laufshirts" 1033 > 1034 Langarm Laufshirts </a> 1035 <button 1036 @click="openSubcategory('category-node-86')" 1037 class="absolute right-0 flex items-center justify-center w-11 h-11 mr-8 cursor-pointer 1038 bg-container-lighter border-container" 1039 aria-label="Open Langarm Laufshirts subcategories" 1040 aria-haspopup="true" 1041 :aria-expanded="mobilePanelActiveId === 'category-node-86'" 1042 > 1043 <div class="w-8 h-8 border rounded"> 1044 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> 1045 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1046</svg> 1047 </div> 1048 </button> 1049 </div> 1050 <div 1051 data-child-id="category-node-86" 1052 class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" 1053 :class="{ 1054 'hidden': mobilePanelActiveId !== 'category-node-86' 1055 }" 1056 > 1057 <ul 1058 class="mt-16 transition-transform duration-200 ease-in-out translate-x-full transform" 1059 :class="{ 1060 'translate-x-full' : mobilePanelActiveId !== 'category-node-86', 1061 'translate-x-0' : mobilePanelActiveId === 'category-node-86', 1062 }" 1063 aria-label="Subcategories" 1064 > 1065 <li> 1066 <button 1067 type="button" 1068 class="flex items-center px-8 py-4 border-b cursor-pointer bg-container border-container w-full border-t" 1069 @click="backToMainCategories('category-node-86-main')" 1070 aria-label="Back to main categories" 1071 > 1072 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 1073 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 1074</svg>
1075 <span class="ml-4"> 1076 Langarm Laufshirts </span> 1077 </button> 1078 </li> 1079 <li> 1080 <a 1081 href="https://www.laufshirt-bedrucken.de/langarm-laufshirts/" 1082 title="Langarm Laufshirts" 1083 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1084 bg-container-lighter border-container 1085 " 1086 > 1087 <span class="ml-10"> 1088 Alle anzeigen </span> 1089 </a> 1090 </li> 1091 <li> 1092 <a 1093 href="https://www.laufshirt-bedrucken.de/langarm-laufshirts/herren-langarm-laufshirts-bedrucken/" 1094 title="Herren" 1095 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1096 bg-container-lighter border-container 1097 " 1098 > 1099 <span class="ml-10 text-base text-gray-700"> 1100 Herren </span> 1101 </a> 1102 </li> 1103 <li> 1104 <a 1105 href="https://www.laufshirt-bedrucken.de/langarm-laufshirts/damen-langarm-laufshirts-bedrucken/" 1106 title="Damen" 1107 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1108 bg-container-lighter border-container 1109 " 1110 > 1111 <span class="ml-10 text-base text-gray-700"> 1112 Damen </span> 1113 </a> 1114 </li> 1115 <li> 1116 <a 1117 href="https://www.laufshirt-bedrucken.de/langarm-laufshirts/kinder-langarm-laufshirts-bedrucken/" 1118 title="Kinder" 1119 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1120 bg-container-lighter border-container 1121 " 1122 > 1123 <span class="ml-10 text-base text-gray-700"> 1124 Kinder </span> 1125 </a> 1126 </li> 1127 </ul> 1128 <button 1129 @click="closeMenu()" 1130 class="absolute flex justify-end w-16 self-end mb-1 transition-none" 1131 aria-label="Close menu" 1132 > 1133 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> 1134 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 1135</svg> 1136 </button> 1137 </div> 1138 </li> 1139 <li 1140 data-child-id="category-node-116-main" 1141 class="level-0" 1142 > 1143 <div 1144 class="flex items-center transition-transform duration-150 ease-in-out transform" 1145 :class="{
1146 '-translate-x-full' : mobilePanelActiveId, 1147 'translate-x-0' : !mobilePanelActiveId 1148 }" 1149 > 1150 <a 1151 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1152 bg-container-lighter border-container level-0 1153 " 1154 href="https://www.laufshirt-bedrucken.de/softshelljacken-16934/" 1155 title="Softshelljacken" 1156 > 1157 Softshelljacken </a> 1158 <button 1159 @click="openSubcategory('category-node-116')" 1160 class="absolute right-0 flex items-center justify-center w-11 h-11 mr-8 cursor-pointer 1161 bg-container-lighter border-container" 1162 aria-label="Open Softshelljacken subcategories" 1163 aria-haspopup="true" 1164 :aria-expanded="mobilePanelActiveId === 'category-node-116'" 1165 > 1166 <div class="w-8 h-8 border rounded"> 1167 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> 1168 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1169</svg> 1170 </div> 1171 </button> 1172 </div> 1173 <div 1174 data-child-id="category-node-116" 1175 class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" 1176 :class="{ 1177 'hidden': mobilePanelActiveId !== 'category-node-116' 1178 }" 1179 > 1180 <ul 1181 class="mt-16 transition-transform duration-200 ease-in-out translate-x-full transform" 1182 :class="{ 1183 'translate-x-full' : mobilePanelActiveId !== 'category-node-116', 1184 'translate-x-0' : mobilePanelActiveId === 'category-node-116', 1185 }" 1186 aria-label="Subcategories" 1187 > 1188 <li> 1189 <button 1190 type="button" 1191 class="flex items-center px-8 py-4 border-b cursor-pointer bg-container border-container w-full border-t" 1192 @click="backToMainCategories('category-node-116-main')" 1193 aria-label="Back to main categories" 1194 > 1195 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 1196 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 1197</svg> 1198 <span class="ml-4"> 1199 Softshelljacken </span> 1200 </button> 1201 </li> 1202 <li> 1203 <a 1204 href="https://www.laufshirt-bedrucken.de/softshelljacken-16934/" 1205 title="Softshelljacken" 1206 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1207 bg-container-lighter border-container 1208 " 1209 >
1210 <span class="ml-10"> 1211 Alle anzeigen </span> 1212 </a> 1213 </li> 1214 <li> 1215 <a 1216 href="https://www.laufshirt-bedrucken.de/softshelljacken-16934/herren-16937/" 1217 title="Herren Softshelljacken bedrucken" 1218 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1219 bg-container-lighter border-container 1220 " 1221 > 1222 <span class="ml-10 text-base text-gray-700"> 1223 Herren Softshelljacken bedrucken </span> 1224 </a> 1225 </li> 1226 <li> 1227 <a 1228 href="https://www.laufshirt-bedrucken.de/softshelljacken-16934/damen-16936/" 1229 title="Damen Softshelljacken bedrucken" 1230 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1231 bg-container-lighter border-container 1232 " 1233 > 1234 <span class="ml-10 text-base text-gray-700"> 1235 Damen Softshelljacken bedrucken </span> 1236 </a> 1237 </li> 1238 <li> 1239 <a 1240 href="https://www.laufshirt-bedrucken.de/softshelljacken-16934/kinder-16935/" 1241 title="Kinder Softshelljacken bedrucken" 1242 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1243 bg-container-lighter border-container 1244 " 1245 > 1246 <span class="ml-10 text-base text-gray-700"> 1247 Kinder Softshelljacken bedrucken </span> 1248 </a> 1249 </li> 1250 </ul> 1251 <button 1252 @click="closeMenu()" 1253 class="absolute flex justify-end w-16 self-end mb-1 transition-none" 1254 aria-label="Close menu" 1255 > 1256 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> 1257 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 1258</svg> 1259 </button> 1260 </div> 1261 </li> 1262 <li 1263 data-child-id="category-node-35-main" 1264 class="level-0" 1265 > 1266 <div 1267 class="flex items-center transition-transform duration-150 ease-in-out transform" 1268 :class="{
1269 '-translate-x-full' : mobilePanelActiveId, 1270 'translate-x-0' : !mobilePanelActiveId 1271 }" 1272 > 1273 <a 1274 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1275 bg-container-lighter border-container level-0 1276 " 1277 href="https://www.laufshirt-bedrucken.de/tanktops-und-singlets/" 1278 title="Tanktops und Singlets" 1279 > 1280 Tanktops und Singlets </a> 1281 <button 1282 @click="openSubcategory('category-node-35')" 1283 class="absolute right-0 flex items-center justify-center w-11 h-11 mr-8 cursor-pointer 1284 bg-container-lighter border-container" 1285 aria-label="Open Tanktops und Singlets subcategories" 1286 aria-haspopup="true" 1287 :aria-expanded="mobilePanelActiveId === 'category-node-35'" 1288 > 1289 <div class="w-8 h-8 border rounded"> 1290 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> 1291 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1292</svg> 1293 </div> 1294 </button> 1295 </div> 1296 <div 1297 data-child-id="category-node-35" 1298 class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" 1299 :class="{ 1300 'hidden': mobilePanelActiveId !== 'category-node-35' 1301 }" 1302 > 1303 <ul 1304 class="mt-16 transition-transform duration-200 ease-in-out translate-x-full transform" 1305 :class="{ 1306 'translate-x-full' : mobilePanelActiveId !== 'category-node-35', 1307 'translate-x-0' : mobilePanelActiveId === 'category-node-35', 1308 }" 1309 aria-label="Subcategories" 1310 > 1311 <li> 1312 <button 1313 type="button" 1314 class="flex items-center px-8 py-4 border-b cursor-pointer bg-container border-container w-full border-t" 1315 @click="backToMainCategories('category-node-35-main')" 1316 aria-label="Back to main categories" 1317 > 1318 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 1319 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 1320</svg> 1321 <span class="ml-4"> 1322 Tanktops und Singlets </span> 1323 </button> 1324 </li> 1325 <li> 1326 <a 1327 href="https://www.laufshirt-bedrucken.de/tanktops-und-singlets/" 1328 title="Tanktops und Singlets" 1329 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1330 bg-container-lighter border-container 1331 " 1332 >
1333 <span class="ml-10"> 1334 Alle anzeigen </span> 1335 </a> 1336 </li> 1337 <li> 1338 <a 1339 href="https://www.laufshirt-bedrucken.de/tanktops-und-singlets/herren-tanktops-und-singlets-bedrucken/" 1340 title="Herren" 1341 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1342 bg-container-lighter border-container 1343 " 1344 > 1345 <span class="ml-10 text-base text-gray-700"> 1346 Herren </span> 1347 </a> 1348 </li> 1349 <li> 1350 <a 1351 href="https://www.laufshirt-bedrucken.de/tanktops-und-singlets/damen-tanktops-und-singlets-bedrucken/" 1352 title="Damen" 1353 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1354 bg-container-lighter border-container 1355 " 1356 > 1357 <span class="ml-10 text-base text-gray-700"> 1358 Damen </span> 1359 </a> 1360 </li> 1361 <li> 1362 <a 1363 href="https://www.laufshirt-bedrucken.de/tanktops-und-singlets/kinder-tanktops-und-singlets-bedrucken/" 1364 title="Kinder" 1365 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1366 bg-container-lighter border-container 1367 " 1368 > 1369 <span class="ml-10 text-base text-gray-700"> 1370 Kinder </span> 1371 </a> 1372 </li> 1373 </ul> 1374 <button 1375 @click="closeMenu()" 1376 class="absolute flex justify-end w-16 self-end mb-1 transition-none" 1377 aria-label="Close menu" 1378 > 1379 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> 1380 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 1381</svg> 1382 </button> 1383 </div> 1384 </li> 1385 <li 1386 data-child-id="category-node-55-main" 1387 class="level-0" 1388 > 1389 <div 1390 class="flex items-center transition-transform duration-150 ease-in-out transform" 1391 :class="{ 1392 '-translate-x-full' : mobilePanelActiveId, 1393 'translate-x-0' : !mobilePanelActiveId 1394 }" 1395 > 1396 <a 1397 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1398 bg-container-lighter border-container level-0 1399 " 1400 href="https://www.laufshirt-bedrucken.de/accessoires/" 1401 title="Accessoires bedrucken" 1402 > 1403 Accessoires bedrucken </a> 1404 <button 1405 @click="openSubcategory('category-node-55')" 1406 class="absolute right-0 flex items-center justify-center w-11 h-11 mr-8 cursor-pointer 1407 bg-container-lighter border-container" 1408 aria-label="Open Accessoires bedrucken subcategories" 1409 aria-haspopup="true" 1410 :aria-expanded="mobilePanelActiveId === 'category-node-55'" 1411 > 1412 <div class="w-8 h-8 border rounded"> 1413 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> 1414 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1415</svg> 1416 </div> 1417 </button> 1418 </div> 1419 <div 1420 data-child-id="category-node-55" 1421 class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" 1422 :class="{ 1423 'hidden': mobilePanelActiveId !== 'category-node-55' 1424 }" 1425 > 1426 <ul 1427 class="mt-16 transition-transform duration-200 ease-in-out translate-x-full transform" 1428 :class="{ 1429 'translate-x-full' : mobilePanelActiveId !== 'category-node-55', 1430 'translate-x-0' : mobilePanelActiveId === 'category-node-55', 1431 }" 1432 aria-label="Subcategories" 1433 > 1434 <li> 1435 <button 1436 type="button" 1437 class="flex items-center px-8 py-4 border-b cursor-pointer bg-container border-container w-full border-t" 1438 @click="backToMainCategories('category-node-55-main')" 1439 aria-label="Back to main categories" 1440 > 1441 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 1442 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 1443</svg>
1444 <span class="ml-4"> 1445 Accessoires bedrucken </span> 1446 </button> 1447 </li> 1448 <li> 1449 <a 1450 href="https://www.laufshirt-bedrucken.de/accessoires/" 1451 title="Accessoires bedrucken" 1452 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1453 bg-container-lighter border-container 1454 " 1455 > 1456 <span class="ml-10"> 1457 Alle anzeigen </span> 1458 </a> 1459 </li> 1460 <li> 1461 <a 1462 href="https://www.laufshirt-bedrucken.de/accessoires/badelatschen-online-bedrucken-lassen/" 1463 title="Badelatschen" 1464 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1465 bg-container-lighter border-container 1466 " 1467 > 1468 <span class="ml-10 text-base text-gray-700"> 1469 Badelatschen </span> 1470 </a> 1471 </li> 1472 </ul> 1473 <button 1474 @click="closeMenu()" 1475 class="absolute flex justify-end w-16 self-end mb-1 transition-none" 1476 aria-label="Close menu" 1477 > 1478 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> 1479 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 1480</svg> 1481 </button> 1482 </div> 1483 </li> 1484 <li 1485 data-child-id="category-node-90-main" 1486 class="level-0" 1487 > 1488 <div 1489 class="flex items-center transition-transform duration-150 ease-in-out transform" 1490 :class="{ 1491 '-translate-x-full' : mobilePanelActiveId, 1492 'translate-x-0' : !mobilePanelActiveId 1493 }" 1494 > 1495 <a 1496 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1497 bg-container-lighter border-container level-0 1498 " 1499 href="https://www.laufshirt-bedrucken.de/marken-15945/" 1500 title="Marken" 1501 > 1502 Marken </a> 1503 <button 1504 @click="openSubcategory('category-node-90')" 1505 class="absolute right-0 flex items-center justify-center w-11 h-11 mr-8 cursor-pointer 1506 bg-container-lighter border-container" 1507 aria-label="Open Marken subcategories" 1508 aria-haspopup="true" 1509 :aria-expanded="mobilePanelActiveId === 'category-node-90'" 1510 > 1511 <div class="w-8 h-8 border rounded"> 1512 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> 1513 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1514</svg> 1515 </div> 1516 </button> 1517 </div> 1518 <div 1519 data-child-id="category-node-90" 1520 class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" 1521 :class="{ 1522 'hidden': mobilePanelActiveId !== 'category-node-90' 1523 }" 1524 > 1525 <ul 1526 class="mt-16 transition-transform duration-200 ease-in-out translate-x-full transform" 1527 :class="{ 1528 'translate-x-full' : mobilePanelActiveId !== 'category-node-90', 1529 'translate-x-0' : mobilePanelActiveId === 'category-node-90', 1530 }" 1531 aria-label="Subcategories" 1532 > 1533 <li> 1534 <button 1535 type="button" 1536 class="flex items-center px-8 py-4 border-b cursor-pointer bg-container border-container w-full border-t" 1537 @click="backToMainCategories('category-node-90-main')" 1538 aria-label="Back to main categories" 1539 > 1540 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 1541 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 1542</svg>
1543 <span class="ml-4"> 1544 Marken </span> 1545 </button> 1546 </li> 1547 <li> 1548 <a 1549 href="https://www.laufshirt-bedrucken.de/marken-15945/" 1550 title="Marken" 1551 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1552 bg-container-lighter border-container 1553 " 1554 > 1555 <span class="ml-10"> 1556 Alle anzeigen </span> 1557 </a> 1558 </li> 1559 <li> 1560 <a 1561 href="https://www.laufshirt-bedrucken.de/marken-15945/erima-18967/" 1562 title="erima" 1563 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1564 bg-container-lighter border-container 1565 " 1566 > 1567 <span class="ml-10 text-base text-gray-700"> 1568 erima </span> 1569 </a> 1570 </li> 1571 <li> 1572 <a 1573 href="https://www.laufshirt-bedrucken.de/marken-15945/puma-18139/" 1574 title="PUMA" 1575 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1576 bg-container-lighter border-container 1577 " 1578 > 1579 <span class="ml-10 text-base text-gray-700"> 1580 PUMA </span> 1581 </a> 1582 </li> 1583 <li> 1584 <a 1585 href="https://www.laufshirt-bedrucken.de/marken-15945/adidas-18140/" 1586 title="adidas" 1587 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1588 bg-container-lighter border-container 1589 " 1590 > 1591 <span class="ml-10 text-base text-gray-700"> 1592 adidas </span> 1593 </a> 1594 </li> 1595 <li> 1596 <a 1597 href="https://www.laufshirt-bedrucken.de/marken-15945/jako-15947/" 1598 title="JAKO" 1599 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1600 bg-container-lighter border-container 1601 " 1602 >
1603 <span class="ml-10 text-base text-gray-700"> 1604 JAKO </span> 1605 </a> 1606 </li> 1607 <li> 1608 <a 1609 href="https://www.laufshirt-bedrucken.de/marken-15945/nike-17999/" 1610 title="NIKE" 1611 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1612 bg-container-lighter border-container 1613 " 1614 > 1615 <span class="ml-10 text-base text-gray-700"> 1616 NIKE </span> 1617 </a> 1618 </li> 1619 <li> 1620 <a 1621 href="https://www.laufshirt-bedrucken.de/marken-15945/under-armour-15946/" 1622 title="Under Armour" 1623 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1624 bg-container-lighter border-container 1625 " 1626 > 1627 <span class="ml-10 text-base text-gray-700"> 1628 Under Armour </span> 1629 </a> 1630 </li> 1631 <li> 1632 <a 1633 href="https://www.laufshirt-bedrucken.de/marken-15945/build-your-brand-16209/" 1634 title="Build Your Brand" 1635 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1636 bg-container-lighter border-container 1637 " 1638 > 1639 <span class="ml-10 text-base text-gray-700"> 1640 Build Your Brand </span> 1641 </a> 1642 </li> 1643 <li> 1644 <a 1645 href="https://www.laufshirt-bedrucken.de/marken-15945/just-cool-16210/" 1646 title="Just Cool" 1647 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1648 bg-container-lighter border-container 1649 " 1650 > 1651 <span class="ml-10 text-base text-gray-700"> 1652 Just Cool </span> 1653 </a> 1654 </li> 1655 <li> 1656 <a 1657 href="https://www.laufshirt-bedrucken.de/marken-15945/gildan-16212/" 1658 title="Gildan" 1659 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1660 bg-container-lighter border-container 1661 " 1662 >
1663 <span class="ml-10 text-base text-gray-700"> 1664 Gildan </span> 1665 </a> 1666 </li> 1667 <li> 1668 <a 1669 href="https://www.laufshirt-bedrucken.de/marken-15945/cona-sports-16629/" 1670 title="CONA SPORTS" 1671 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1672 bg-container-lighter border-container 1673 " 1674 > 1675 <span class="ml-10 text-base text-gray-700"> 1676 CONA SPORTS </span> 1677 </a> 1678 </li> 1679 <li> 1680 <a 1681 href="https://www.laufshirt-bedrucken.de/marken-15945/james-nicholson-16211/" 1682 title="James & Nicholson" 1683 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1684 bg-container-lighter border-container 1685 " 1686 > 1687 <span class="ml-10 text-base text-gray-700"> 1688 James & Nicholson </span> 1689 </a> 1690 </li> 1691 <li> 1692 <a 1693 href="https://www.laufshirt-bedrucken.de/marken-15945/fruit-of-the-loom-16205/" 1694 title="Fruit of the Loom" 1695 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1696 bg-container-lighter border-container 1697 " 1698 > 1699 <span class="ml-10 text-base text-gray-700"> 1700 Fruit of the Loom </span> 1701 </a> 1702 </li> 1703 <li> 1704 <a 1705 href="https://www.laufshirt-bedrucken.de/marken-15945/halfar-16208/" 1706 title="Halfar" 1707 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1708 bg-container-lighter border-container 1709 " 1710 > 1711 <span class="ml-10 text-base text-gray-700"> 1712 Halfar </span> 1713 </a> 1714 </li> 1715 <li> 1716 <a 1717 href="https://www.laufshirt-bedrucken.de/marken-15945/kustom-kit-gamegear-16206/" 1718 title="Kustom Kit Gamegear" 1719 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1720 bg-container-lighter border-container 1721 " 1722 >
1723 <span class="ml-10 text-base text-gray-700"> 1724 Kustom Kit Gamegear </span> 1725 </a> 1726 </li> 1727 <li> 1728 <a 1729 href="https://www.laufshirt-bedrucken.de/marken-15945/mr-socks-19915/" 1730 title="Mr. Socks" 1731 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1732 bg-container-lighter border-container 1733 " 1734 > 1735 <span class="ml-10 text-base text-gray-700"> 1736 Mr. Socks </span> 1737 </a> 1738 </li> 1739 <li> 1740 <a 1741 href="https://www.laufshirt-bedrucken.de/marken-15945/quadra-18260/" 1742 title="Quadra" 1743 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1744 bg-container-lighter border-container 1745 " 1746 > 1747 <span class="ml-10 text-base text-gray-700"> 1748 Quadra </span> 1749 </a> 1750 </li> 1751 <li> 1752 <a 1753 href="https://www.laufshirt-bedrucken.de/marken-15945/beechfield-16207/" 1754 title="Beechfield" 1755 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1756 bg-container-lighter border-container 1757 " 1758 > 1759 <span class="ml-10 text-base text-gray-700"> 1760 Beechfield </span> 1761 </a> 1762 </li> 1763 <li> 1764 <a 1765 href="https://www.laufshirt-bedrucken.de/marken-15945/teejays-16990/" 1766 title="TeeJays" 1767 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1768 bg-container-lighter border-container 1769 " 1770 > 1771 <span class="ml-10 text-base text-gray-700"> 1772 TeeJays </span> 1773 </a> 1774 </li> 1775 <li> 1776 <a 1777 href="https://www.laufshirt-bedrucken.de/marken-15945/myrtle-beach-18261/" 1778 title="Myrtle Beach" 1779 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1780 bg-container-lighter border-container 1781 " 1782 >
1783 <span class="ml-10 text-base text-gray-700"> 1784 Myrtle Beach </span> 1785 </a> 1786 </li> 1787 <li> 1788 <a 1789 href="https://www.laufshirt-bedrucken.de/marken-15945/roly-16687/" 1790 title="Roly" 1791 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1792 bg-container-lighter border-container 1793 " 1794 > 1795 <span class="ml-10 text-base text-gray-700"> 1796 Roly </span> 1797 </a> 1798 </li> 1799 <li> 1800 <a 1801 href="https://www.laufshirt-bedrucken.de/marken-15945/russell-17249/" 1802 title="Russell" 1803 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1804 bg-container-lighter border-container 1805 " 1806 > 1807 <span class="ml-10 text-base text-gray-700"> 1808 Russell </span> 1809 </a> 1810 </li> 1811 <li> 1812 <a 1813 href="https://www.laufshirt-bedrucken.de/marken-15945/sol-s-18257/" 1814 title="Sol's" 1815 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1816 bg-container-lighter border-container 1817 " 1818 > 1819 <span class="ml-10 text-base text-gray-700"> 1820 Sol's </span> 1821 </a> 1822 </li> 1823 </ul> 1824 <button 1825 @click="closeMenu()" 1826 class="absolute flex justify-end w-16 self-end mb-1 transition-none" 1827 aria-label="Close menu" 1828 > 1829 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> 1830 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 1831</svg> 1832 </button> 1833 </div> 1834 </li> 1835 <li 1836 data-child-id="category-node-93-main" 1837 class="level-0" 1838 > 1839 <div 1840 class="flex items-center transition-transform duration-150 ease-in-out transform" 1841 :class="{ 1842 '-translate-x-full' : mobilePanelActiveId, 1843 'translate-x-0' : !mobilePanelActiveId 1844 }" 1845 > 1846 <a 1847 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1848 bg-container-lighter border-container level-0 1849 " 1850 href="https://www.laufshirt-bedrucken.de/s
1850horts-tights-16196/" 1851 title="Shorts & Tights" 1852 > 1853 Shorts & Tights </a> 1854 <button 1855 @click="openSubcategory('category-node-93')" 1856 class="absolute right-0 flex items-center justify-center w-11 h-11 mr-8 cursor-pointer 1857 bg-container-lighter border-container" 1858 aria-label="Open Shorts & Tights subcategories" 1859 aria-haspopup="true" 1860 :aria-expanded="mobilePanelActiveId === 'category-node-93'" 1861 > 1862 <div class="w-8 h-8 border rounded"> 1863 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> 1864 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1865</svg> 1866 </div> 1867 </button> 1868 </div> 1869 <div 1870 data-child-id="category-node-93" 1871 class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" 1872 :class="{ 1873 'hidden': mobilePanelActiveId !== 'category-node-93' 1874 }" 1875 > 1876 <ul 1877 class="mt-16 transition-transform duration-200 ease-in-out translate-x-full transform" 1878 :class="{ 1879 'translate-x-full' : mobilePanelActiveId !== 'category-node-93', 1880 'translate-x-0' : mobilePanelActiveId === 'category-node-93', 1881 }" 1882 aria-label="Subcategories" 1883 > 1884 <li> 1885 <button 1886 type="button" 1887 class="flex items-center px-8 py-4 border-b cursor-pointer bg-container border-container w-full border-t" 1888 @click="backToMainCategories('category-node-93-main')" 1889 aria-label="Back to main categories" 1890 > 1891 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 1892 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 1893</svg> 1894 <span class="ml-4"> 1895 Shorts & Tights </span> 1896 </button> 1897 </li> 1898 <li> 1899 <a 1900 href="https://www.laufshirt-bedrucken.de/shorts-tights-16196/" 1901 title="Shorts & Tights" 1902 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1903 bg-container-lighter border-container 1904 " 1905 > 1906 <span class="ml-10"> 1907 Alle anzeigen </span> 1908 </a> 1909 </li> 1910 <li> 1911 <a 1912 href="https://www.laufshirt-bedrucken.de/s
1912horts-tights-16196/damen-16199/" 1913 title="Damen Shorts & Tights bedrucken" 1914 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1915 bg-container-lighter border-container 1916 " 1917 > 1918 <span class="ml-10 text-base text-gray-700"> 1919 Damen Shorts & Tights bedrucken </span> 1920 </a> 1921 </li> 1922 <li> 1923 <a 1924 href="https://www.laufshirt-bedrucken.de/shorts-tights-16196/kinder-16503/" 1925 title="Kinder Shorts & Tights bedrucken" 1926 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1927 bg-container-lighter border-container 1928 " 1929 > 1930 <span class="ml-10 text-base text-gray-700"> 1931 Kinder Shorts & Tights bedrucken </span> 1932 </a> 1933 </li> 1934 <li> 1935 <a 1936 href="https://www.laufshirt-bedrucken.de/shorts-tights-16196/herren-16197/" 1937 title="Herren Shorts & Tights bedrucken" 1938 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1939 bg-container-lighter border-container 1940 " 1941 > 1942 <span class="ml-10 text-base text-gray-700"> 1943 Herren Shorts & Tights bedrucken </span> 1944 </a> 1945 </li> 1946 </ul> 1947 <button 1948 @click="closeMenu()" 1949 class="absolute flex justify-end w-16 self-end mb-1 transition-none" 1950 aria-label="Close menu" 1951 > 1952 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> 1953 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 1954</svg> 1955 </button> 1956 </div> 1957 </li> 1958 <li 1959 data-child-id="category-node-133-main" 1960 class="level-0" 1961 > 1962 <div 1963 class="flex items-center transition-transform duration-150 ease-in-out transform" 1964 :class="{ 1965 '-translate-x-full' : mobilePanelActiveId, 1966 'translate-x-0' : !mobilePanelActiveId 1967 }" 1968 > 1969 <a 1970 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 1971 bg-container-lighter border-container level-0 1972 " 1973 href="https://www.laufshirt-bedrucken.de/specials-18487/" 1974 title="Specials" 1975 > 1976 Specials </a> 1977 <button 1978 @click="openSubcategory('category-node-133')" 1979 class="absolute right-0 flex items-center justify-center w-11 h-11 mr-8 cursor-pointer 1980 bg-container-lighter border-container" 1981 aria-label="Open Specials subcategories" 1982 aria-haspopup="true" 1983 :aria-expanded="mobilePanelActiveId === 'category-node-133'" 1984 > 1985 <div class="w-8 h-8 border rounded"> 1986 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> 1987 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1988</svg> 1989 </div> 1990 </button> 1991 </div> 1992 <div 1993 data-child-id="category-node-133" 1994 class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" 1995 :class="{ 1996 'hidden': mobilePanelActiveId !== 'category-node-133' 1997 }" 1998 > 1999 <ul 2000 class="mt-16 transition-transform duration-200 ease-in-out translate-x-full transform" 2001 :class="{ 2002 'translate-x-full' : mobilePanelActiveId !== 'category-node-133', 2003 'translate-x-0' : mobilePanelActiveId === 'category-node-133', 2004 }" 2005 aria-label="Subcategories" 2006 > 2007 <li> 2008 <button 2009 type="button" 2010 class="flex items-center px-8 py-4 border-b cursor-pointer bg-container border-container w-full border-t" 2011 @click="backToMainCategories('category-node-133-main')" 2012 aria-label="Back to main categories" 2013 > 2014 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 2015 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 2016</svg>
2017 <span class="ml-4"> 2018 Specials </span> 2019 </button> 2020 </li> 2021 <li> 2022 <a 2023 href="https://www.laufshirt-bedrucken.de/specials-18487/" 2024 title="Specials" 2025 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 2026 bg-container-lighter border-container 2027 " 2028 > 2029 <span class="ml-10"> 2030 Alle anzeigen </span> 2031 </a> 2032 </li> 2033 <li> 2034 <a 2035 href="https://www.laufshirt-bedrucken.de/specials-18487/firmenlauf-18533/" 2036 title="Firmenlauf-Shirts bedrucken für Damen und Herren" 2037 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 2038 bg-container-lighter border-container 2039 " 2040 > 2041 <span class="ml-10 text-base text-gray-700"> 2042 Firmenlauf-Shirts bedrucken für Damen und Herren </span> 2043 </a> 2044 </li> 2045 <li> 2046 <a 2047 href="https://www.laufshirt-bedrucken.de/specials-18487/berufsbekleidung-physiotherapeuten-online-bedrucken-lassen-18488/" 2048 title="Physiotherapeuten Bekleidung - Team-Shirts & Hosen online bedrucken lassen" 2049 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 2050 bg-container-lighter border-container 2051 " 2052 > 2053 <span class="ml-10 text-base text-gray-700"> 2054 Physiotherapeuten Bekleidung - Team-Shirts & Hosen online bedrucken lassen </span> 2055 </a> 2056 </li> 2057 <li> 2058 <a 2059 href="https://www.laufshirt-bedrucken.de/specials-18487/dtf-transfer-online-bestellen/" 2060 title="DTF Transfer" 2061 class="flex items-center w-full px-8 py-4 border-b cursor-pointer 2062 bg-container-lighter border-container 2063 " 2064 > 2065 <span class="ml-10 text-base text-gray-700"> 2066 DTF Transfer </span> 2067 </a> 2068 </li> 2069 </ul> 2070 <button 2071 @click="closeMenu()" 2072 class="absolute flex justify-end w-16 self-end mb-1 transition-none" 2073 aria-label="Close menu" 2074 > 2075 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> 2076 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 2077</svg> 2078 </button> 2079 </div> 2080 </li> 2081 </ul> 2082 <button 2083 @click="closeMenu()" 2084 class="absolute flex justify-end w-16 self-end mb-1" 2085 aria-label="Close menu" 2086 type="button" 2087 > 2088 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> 2089 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 2090</svg> 2091 </button> 2092 </div> 2093</nav>
2094<script> 2095 'use strict'; 2096 2097 const initMenuMobile_6ac04a7f575ba = () => { 2098 return { 2099 mobilePanelActiveId: null, 2100 open: false, 2101 setActiveMenu(menuNode) { 2102 Array.from(menuNode.querySelectorAll('a')).filter(link => { 2103 return link.href === window.location.href.split('?')[0]; 2104 }).map(item => { 2105 item.classList.add('underline'); 2106 item.closest('li.level-0') && 2107 item.closest('li.level-0').querySelector('a.level-0').classList.add('underline'); 2108 }); 2109 }, 2110 openMenu() { 2111 this.open = true 2112 this.$nextTick(() => hyva.trapFocus(this.$refs['mobileMenuNavLinks'])); 2113 // Prevent from body scrolling while mobile menu opened 2114 document.body.style.position = 'fixed'; 2115 }, 2116 closeMenu() { 2117 document.body.style.position = ''; 2118 2119 if (this.open) { 2120 this.$nextTick(() => this.$refs['mobileMenuTrigger'].focus() || hyva.releaseFocus()); 2121 } 2122 2123 this.open = false 2124 this.mobilePanelActiveId = null 2125 }, 2126 openSubcategory(index) { 2127 const menuNodeRef = document.querySelector('[data-child-id=' + index + ']') 2128 this.mobilePanelActiveId = this.mobilePanelActiveId === index ? 0 : index 2129 this.$nextTick(() => hyva.trapFocus(menuNodeRef)) 2130 }, 2131 backToMainCategories(index) { 2132 const menuNodeRef = document.querySelector('[data-child-id=' + index + ']') 2133 this.mobilePanelActiveId = 0 2134 this.$nextTick(() => { 2135 hyva.trapFocus(this.$refs['mobileMenuNavLinks']) 2136 menuNodeRef.querySelector('a').focus() 2137 }) 2138 } 2139 } 2140 } 2141</script>
2141 2142<div x-data="initMenuDesktop_6ac04a7f5f21b()" 2143 class="z-20 order-2 sm:order-1 lg:order-2 navigation hidden" 2144> 2145 <!-- desktop --> 2146 <div x-ref="nav-desktop" 2147 @load.window="setActiveMenu($root)" 2148 class="hidden lg:block lg:px-8"> 2149 <nav 2150 class="relative" 2151 aria-label="Main menu" 2152 > 2153 <ul class="flex justify-start flex-wrap gap-x-7 py-4"> 2154 <li class="relative level-0 border-b-2 border-transparent hover:border-primary data-[active]:border-primary" 2155 @mouseenter="hoverPanelActiveId = 'category-node-60'" 2156 @mouseleave="hoverPanelActiveId = 0" 2157 @keyup.escape="hoverPanelActiveId = 0" 2158 > 2159 <span class="flex items-center text-md"> 2160 <a class="w-full text-base text-gray-700 level-0 py-2 px-0.5" 2161 href="https://www.laufshirt-bedrucken.de/laufshirts/" 2162 title="Laufshirts" 2163 @focus="hoverPanelActiveId = 0" 2164 > 2165 Laufshirts </a> 2166 <button 2167 type="button" 2168 data-sr-button-id="category-node-60" 2169 :aria-expanded="hoverPanelActiveId === 'category-node-60' ? 'true' : 'false'" 2170 @click="openMenuOnClick('category-node-60')" 2171 class="rounded p-1 text-gray-500" 2172 > 2173 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2174 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2175</svg> 2176 <span class="sr-only"> 2177 Show submenu for Laufshirts category </span> 2178 </button> 2179 </span> 2180 <ul 2181 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2182 :class="{ 2183 'hidden' : hoverPanelActiveId !== 'category-node-60', 2184 'block' : hoverPanelActiveId === 'category-node-60' 2185 }" 2186 > 2187 <li> 2188 <a href="https://www.laufshirt-bedrucken.de/laufshirts/angebote/" 2189 title="Angebote" 2190 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2191 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D60]').focus())" 2192 > 2193 <span class="text-base text-gray-700"> 2194 Angebote </span> 2195 </a> 2196 </li> 2197 <li> 2198 <a href="https://www.laufshirt-bedrucken.de/laufshirts/damen-laufshirts-bedrucken/" 2199 title="Damen" 2200 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2201 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D60]').focus())" 2202 >
2203 <span class="text-base text-gray-700"> 2204 Damen </span> 2205 </a> 2206 </li> 2207 <li> 2208 <a href="https://www.laufshirt-bedrucken.de/laufshirts/herren-laufshirts-bedrucken/" 2209 title="Herren" 2210 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2211 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D60]').focus())" 2212 > 2213 <span class="text-base text-gray-700"> 2214 Herren </span> 2215 </a> 2216 </li> 2217 <li> 2218 <a href="https://www.laufshirt-bedrucken.de/laufshirts/kinder-laufshirts-bedrucken/" 2219 title="Kinder" 2220 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2221 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D60]').focus())" 2222 > 2223 <span class="text-base text-gray-700"> 2224 Kinder </span> 2225 </a> 2226 </li> 2227 </ul> 2228 </li> 2229 <li class="relative level-0 border-b-2 border-transparent hover:border-primary data-[active]:border-primary" 2230 @mouseenter="hoverPanelActiveId = 'category-node-498'" 2231 @mouseleave="hoverPanelActiveId = 0" 2232 @keyup.escape="hoverPanelActiveId = 0" 2233 > 2234 <span class="flex items-center text-md"> 2235 <a class="w-full text-base text-gray-700 level-0 py-2 px-0.5" 2236 href="https://www.laufshirt-bedrucken.de/manner-20689/" 2237 title="Männer" 2238 @focus="hoverPanelActiveId = 0" 2239 > 2240 Männer </a> 2241 <button 2242 type="button" 2243 data-sr-button-id="category-node-498" 2244 :aria-expanded="hoverPanelActiveId === 'category-node-498' ? 'true' : 'false'" 2245 @click="openMenuOnClick('category-node-498')" 2246 class="rounded p-1 text-gray-500" 2247 > 2248 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2249 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2250</svg> 2251 <span class="sr-only"> 2252 Show submenu for Männer category </span> 2253 </button> 2254 </span> 2255 <ul 2256 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2257 :class="{ 2258 'hidden' : hoverPanelActiveId !== 'category-node-498', 2259 'block' : hoverPanelActiveId === 'category-node-498' 2260 }" 2261 > 2262 <li> 2263 <a href="https://www.laufshirt-bedrucken.de/manner-20689/mpullover-20690/" 2264 title="MPullover" 2265 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2266 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D498]').focus())" 2267 >
2268 <span class="text-base text-gray-700"> 2269 MPullover </span> 2270 </a> 2271 </li> 2272 </ul> 2273 </li> 2274 <li class="relative level-0 border-b-2 border-transparent hover:border-primary data-[active]:border-primary" 2275 @mouseenter="hoverPanelActiveId = 'category-node-86'" 2276 @mouseleave="hoverPanelActiveId = 0" 2277 @keyup.escape="hoverPanelActiveId = 0" 2278 > 2279 <span class="flex items-center text-md"> 2280 <a class="w-full text-base text-gray-700 level-0 py-2 px-0.5" 2281 href="https://www.laufshirt-bedrucken.de/langarm-laufshirts/" 2282 title="Langarm Laufshirts" 2283 @focus="hoverPanelActiveId = 0" 2284 > 2285 Langarm Laufshirts </a> 2286 <button 2287 type="button" 2288 data-sr-button-id="category-node-86" 2289 :aria-expanded="hoverPanelActiveId === 'category-node-86' ? 'true' : 'false'" 2290 @click="openMenuOnClick('category-node-86')" 2291 class="rounded p-1 text-gray-500" 2292 > 2293 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2294 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2295</svg> 2296 <span class="sr-only"> 2297 Show submenu for Langarm Laufshirts category </span> 2298 </button> 2299 </span> 2300 <ul 2301 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2302 :class="{ 2303 'hidden' : hoverPanelActiveId !== 'category-node-86', 2304 'block' : hoverPanelActiveId === 'category-node-86' 2305 }" 2306 > 2307 <li> 2308 <a href="https://www.laufshirt-bedrucken.de/langarm-laufshirts/herren-langarm-laufshirts-bedrucken/" 2309 title="Herren" 2310 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2311 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D86]').focus())" 2312 > 2313 <span class="text-base text-gray-700"> 2314 Herren </span> 2315 </a> 2316 </li> 2317 <li> 2318 <a href="https://www.laufshirt-bedrucken.de/langarm-laufshirts/damen-langarm-laufshirts-bedrucken/" 2319 title="Damen" 2320 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2321 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D86]').focus())" 2322 >
2323 <span class="text-base text-gray-700"> 2324 Damen </span> 2325 </a> 2326 </li> 2327 <li> 2328 <a href="https://www.laufshirt-bedrucken.de/langarm-laufshirts/kinder-langarm-laufshirts-bedrucken/" 2329 title="Kinder" 2330 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2331 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D86]').focus())" 2332 > 2333 <span class="text-base text-gray-700"> 2334 Kinder </span> 2335 </a> 2336 </li> 2337 </ul> 2338 </li> 2339 <li class="relative level-0 border-b-2 border-transparent hover:border-primary data-[active]:border-primary" 2340 @mouseenter="hoverPanelActiveId = 'category-node-116'" 2341 @mouseleave="hoverPanelActiveId = 0" 2342 @keyup.escape="hoverPanelActiveId = 0" 2343 > 2344 <span class="flex items-center text-md"> 2345 <a class="w-full text-base text-gray-700 level-0 py-2 px-0.5" 2346 href="https://www.laufshirt-bedrucken.de/softshelljacken-16934/" 2347 title="Softshelljacken" 2348 @focus="hoverPanelActiveId = 0" 2349 > 2350 Softshelljacken </a> 2351 <button 2352 type="button" 2353 data-sr-button-id="category-node-116" 2354 :aria-expanded="hoverPanelActiveId === 'category-node-116' ? 'true' : 'false'" 2355 @click="openMenuOnClick('category-node-116')" 2356 class="rounded p-1 text-gray-500" 2357 > 2358 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2359 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2360</svg> 2361 <span class="sr-only"> 2362 Show submenu for Softshelljacken category </span> 2363 </button> 2364 </span> 2365 <ul 2366 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2367 :class="{ 2368 'hidden' : hoverPanelActiveId !== 'category-node-116', 2369 'block' : hoverPanelActiveId === 'category-node-116' 2370 }" 2371 > 2372 <li> 2373 <a href="https://www.laufshirt-bedrucken.de/softshelljacken-16934/herren-16937/" 2374 title="Herren Softshelljacken bedrucken" 2375 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2376 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D116]').focus())" 2377 >
2378 <span class="text-base text-gray-700"> 2379 Herren Softshelljacken bedrucken </span> 2380 </a> 2381 </li> 2382 <li> 2383 <a href="https://www.laufshirt-bedrucken.de/softshelljacken-16934/damen-16936/" 2384 title="Damen Softshelljacken bedrucken" 2385 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2386 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D116]').focus())" 2387 > 2388 <span class="text-base text-gray-700"> 2389 Damen Softshelljacken bedrucken </span> 2390 </a> 2391 </li> 2392 <li> 2393 <a href="https://www.laufshirt-bedrucken.de/softshelljacken-16934/kinder-16935/" 2394 title="Kinder Softshelljacken bedrucken" 2395 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2396 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D116]').focus())" 2397 > 2398 <span class="text-base text-gray-700"> 2399 Kinder Softshelljacken bedrucken </span> 2400 </a> 2401 </li> 2402 </ul> 2403 </li> 2404 <li class="relative level-0 border-b-2 border-transparent hover:border-primary data-[active]:border-primary" 2405 @mouseenter="hoverPanelActiveId = 'category-node-35'" 2406 @mouseleave="hoverPanelActiveId = 0" 2407 @keyup.escape="hoverPanelActiveId = 0" 2408 > 2409 <span class="flex items-center text-md"> 2410 <a class="w-full text-base text-gray-700 level-0 py-2 px-0.5" 2411 href="https://www.laufshirt-bedrucken.de/tanktops-und-singlets/" 2412 title="Tanktops und Singlets" 2413 @focus="hoverPanelActiveId = 0" 2414 > 2415 Tanktops und Singlets </a> 2416 <button 2417 type="button" 2418 data-sr-button-id="category-node-35" 2419 :aria-expanded="hoverPanelActiveId === 'category-node-35' ? 'true' : 'false'" 2420 @click="openMenuOnClick('category-node-35')" 2421 class="rounded p-1 text-gray-500" 2422 > 2423 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2424 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2425</svg> 2426 <span class="sr-only"> 2427 Show submenu for Tanktops und Singlets category </span> 2428 </button> 2429 </span> 2430 <ul 2431 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2432 :class="{ 2433 'hidden' : hoverPanelActiveId !== 'category-node-35', 2434 'block' : hoverPanelActiveId === 'category-node-35' 2435 }" 2436 > 2437 <li> 2438 <a href="https://www.laufshirt-bedrucken.de/tanktops-und-singlets/herren-tanktops-und-singlets-bedrucken/" 2439 title="Herren" 2440 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2441 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D35]').focus())" 2442 >
2443 <span class="text-base text-gray-700"> 2444 Herren </span> 2445 </a> 2446 </li> 2447 <li> 2448 <a href="https://www.laufshirt-bedrucken.de/tanktops-und-singlets/damen-tanktops-und-singlets-bedrucken/" 2449 title="Damen" 2450 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2451 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D35]').focus())" 2452 > 2453 <span class="text-base text-gray-700"> 2454 Damen </span> 2455 </a> 2456 </li> 2457 <li> 2458 <a href="https://www.laufshirt-bedrucken.de/tanktops-und-singlets/kinder-tanktops-und-singlets-bedrucken/" 2459 title="Kinder" 2460 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2461 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D35]').focus())" 2462 > 2463 <span class="text-base text-gray-700"> 2464 Kinder </span> 2465 </a> 2466 </li> 2467 </ul> 2468 </li> 2469 <li class="relative level-0 border-b-2 border-transparent hover:border-primary data-[active]:border-primary" 2470 @mouseenter="hoverPanelActiveId = 'category-node-55'" 2471 @mouseleave="hoverPanelActiveId = 0" 2472 @keyup.escape="hoverPanelActiveId = 0" 2473 > 2474 <span class="flex items-center text-md"> 2475 <a class="w-full text-base text-gray-700 level-0 py-2 px-0.5" 2476 href="https://www.laufshirt-bedrucken.de/accessoires/" 2477 title="Accessoires bedrucken" 2478 @focus="hoverPanelActiveId = 0" 2479 > 2480 Accessoires bedrucken </a> 2481 <button 2482 type="button" 2483 data-sr-button-id="category-node-55" 2484 :aria-expanded="hoverPanelActiveId === 'category-node-55' ? 'true' : 'false'" 2485 @click="openMenuOnClick('category-node-55')" 2486 class="rounded p-1 text-gray-500" 2487 > 2488 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2489 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2490</svg> 2491 <span class="sr-only"> 2492 Show submenu for Accessoires bedrucken category </span> 2493 </button> 2494 </span> 2495 <ul 2496 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2497 :class="{ 2498 'hidden' : hoverPanelActiveId !== 'category-node-55', 2499 'block' : hoverPanelActiveId === 'category-node-55' 2500 }" 2501 > 2502 <li> 2503 <a href="https://www.laufshirt-bedrucken.de/accessoires/badelatschen-online-bedrucken-lassen/" 2504 title="Badelatschen" 2505 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2506 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D55]').focus())" 2507 >
2508 <span class="text-base text-gray-700"> 2509 Badelatschen </span> 2510 </a> 2511 </li> 2512 </ul> 2513 </li> 2514 <li class="relative level-0 border-b-2 border-transparent hover:border-primary data-[active]:border-primary" 2515 @mouseenter="hoverPanelActiveId = 'category-node-90'" 2516 @mouseleave="hoverPanelActiveId = 0" 2517 @keyup.escape="hoverPanelActiveId = 0" 2518 > 2519 <span class="flex items-center text-md"> 2520 <a class="w-full text-base text-gray-700 level-0 py-2 px-0.5" 2521 href="https://www.laufshirt-bedrucken.de/marken-15945/" 2522 title="Marken" 2523 @focus="hoverPanelActiveId = 0" 2524 > 2525 Marken </a> 2526 <button 2527 type="button" 2528 data-sr-button-id="category-node-90" 2529 :aria-expanded="hoverPanelActiveId === 'category-node-90' ? 'true' : 'false'" 2530 @click="openMenuOnClick('category-node-90')" 2531 class="rounded p-1 text-gray-500" 2532 > 2533 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2534 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2535</svg> 2536 <span class="sr-only"> 2537 Show submenu for Marken category </span> 2538 </button> 2539 </span> 2540 <ul 2541 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2542 :class="{ 2543 'hidden' : hoverPanelActiveId !== 'category-node-90', 2544 'block' : hoverPanelActiveId === 'category-node-90' 2545 }" 2546 > 2547 <li> 2548 <a href="https://www.laufshirt-bedrucken.de/marken-15945/erima-18967/" 2549 title="erima" 2550 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2551 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2552 > 2553 <span class="text-base text-gray-700"> 2554 erima </span> 2555 </a> 2556 </li> 2557 <li> 2558 <a href="https://www.laufshirt-bedrucken.de/marken-15945/puma-18139/" 2559 title="PUMA" 2560 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2561 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2562 >
2563 <span class="text-base text-gray-700"> 2564 PUMA </span> 2565 </a> 2566 </li> 2567 <li> 2568 <a href="https://www.laufshirt-bedrucken.de/marken-15945/adidas-18140/" 2569 title="adidas" 2570 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2571 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2572 > 2573 <span class="text-base text-gray-700"> 2574 adidas </span> 2575 </a> 2576 </li> 2577 <li> 2578 <a href="https://www.laufshirt-bedrucken.de/marken-15945/jako-15947/" 2579 title="JAKO" 2580 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2581 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2582 > 2583 <span class="text-base text-gray-700"> 2584 JAKO </span> 2585 </a> 2586 </li> 2587 <li> 2588 <a href="https://www.laufshirt-bedrucken.de/marken-15945/nike-17999/" 2589 title="NIKE" 2590 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2591 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2592 > 2593 <span class="text-base text-gray-700"> 2594 NIKE </span> 2595 </a> 2596 </li> 2597 <li> 2598 <a href="https://www.laufshirt-bedrucken.de/marken-15945/under-armour-15946/" 2599 title="Under Armour" 2600 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2601 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2602 > 2603 <span class="text-base text-gray-700"> 2604 Under Armour </span> 2605 </a> 2606 </li> 2607 <li> 2608 <a href="https://www.laufshirt-bedrucken.de/marken-15945/build-your-brand-16209/" 2609 title="Build Your Brand" 2610 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2611 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2612 >
2613 <span class="text-base text-gray-700"> 2614 Build Your Brand </span> 2615 </a> 2616 </li> 2617 <li> 2618 <a href="https://www.laufshirt-bedrucken.de/marken-15945/just-cool-16210/" 2619 title="Just Cool" 2620 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2621 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2622 > 2623 <span class="text-base text-gray-700"> 2624 Just Cool </span> 2625 </a> 2626 </li> 2627 <li> 2628 <a href="https://www.laufshirt-bedrucken.de/marken-15945/gildan-16212/" 2629 title="Gildan" 2630 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2631 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2632 > 2633 <span class="text-base text-gray-700"> 2634 Gildan </span> 2635 </a> 2636 </li> 2637 <li> 2638 <a href="https://www.laufshirt-bedrucken.de/marken-15945/cona-sports-16629/" 2639 title="CONA SPORTS" 2640 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2641 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2642 > 2643 <span class="text-base text-gray-700"> 2644 CONA SPORTS </span> 2645 </a> 2646 </li> 2647 <li> 2648 <a href="https://www.laufshirt-bedrucken.de/marken-15945/james-nicholson-16211/" 2649 title="James & Nicholson" 2650 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2651 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2652 > 2653 <span class="text-base text-gray-700"> 2654 James & Nicholson </span> 2655 </a> 2656 </li> 2657 <li> 2658 <a href="https://www.laufshirt-bedrucken.de/marken-15945/fruit-of-the-loom-16205/" 2659 title="Fruit of the Loom" 2660 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2661 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2662 >
2663 <span class="text-base text-gray-700"> 2664 Fruit of the Loom </span> 2665 </a> 2666 </li> 2667 <li> 2668 <a href="https://www.laufshirt-bedrucken.de/marken-15945/halfar-16208/" 2669 title="Halfar" 2670 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2671 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2672 > 2673 <span class="text-base text-gray-700"> 2674 Halfar </span> 2675 </a> 2676 </li> 2677 <li> 2678 <a href="https://www.laufshirt-bedrucken.de/marken-15945/kustom-kit-gamegear-16206/" 2679 title="Kustom Kit Gamegear" 2680 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2681 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2682 > 2683 <span class="text-base text-gray-700"> 2684 Kustom Kit Gamegear </span> 2685 </a> 2686 </li> 2687 <li> 2688 <a href="https://www.laufshirt-bedrucken.de/marken-15945/mr-socks-19915/" 2689 title="Mr. Socks" 2690 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2691 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2692 > 2693 <span class="text-base text-gray-700"> 2694 Mr. Socks </span> 2695 </a> 2696 </li> 2697 <li> 2698 <a href="https://www.laufshirt-bedrucken.de/marken-15945/quadra-18260/" 2699 title="Quadra" 2700 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2701 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2702 > 2703 <span class="text-base text-gray-700"> 2704 Quadra </span> 2705 </a> 2706 </li> 2707 <li> 2708 <a href="https://www.laufshirt-bedrucken.de/marken-15945/beechfield-16207/" 2709 title="Beechfield" 2710 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2711 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2712 >
2713 <span class="text-base text-gray-700"> 2714 Beechfield </span> 2715 </a> 2716 </li> 2717 <li> 2718 <a href="https://www.laufshirt-bedrucken.de/marken-15945/teejays-16990/" 2719 title="TeeJays" 2720 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2721 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2722 > 2723 <span class="text-base text-gray-700"> 2724 TeeJays </span> 2725 </a> 2726 </li> 2727 <li> 2728 <a href="https://www.laufshirt-bedrucken.de/marken-15945/myrtle-beach-18261/" 2729 title="Myrtle Beach" 2730 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2731 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2732 > 2733 <span class="text-base text-gray-700"> 2734 Myrtle Beach </span> 2735 </a> 2736 </li> 2737 <li> 2738 <a href="https://www.laufshirt-bedrucken.de/marken-15945/roly-16687/" 2739 title="Roly" 2740 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2741 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2742 > 2743 <span class="text-base text-gray-700"> 2744 Roly </span> 2745 </a> 2746 </li> 2747 <li> 2748 <a href="https://www.laufshirt-bedrucken.de/marken-15945/russell-17249/" 2749 title="Russell" 2750 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2751 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2752 > 2753 <span class="text-base text-gray-700"> 2754 Russell </span> 2755 </a> 2756 </li> 2757 <li> 2758 <a href="https://www.laufshirt-bedrucken.de/marken-15945/sol-s-18257/" 2759 title="Sol's" 2760 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2761 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D90]').focus())" 2762 >
2763 <span class="text-base text-gray-700"> 2764 Sol's </span> 2765 </a> 2766 </li> 2767 </ul> 2768 </li> 2769 <li class="relative level-0 border-b-2 border-transparent hover:border-primary data-[active]:border-primary" 2770 @mouseenter="hoverPanelActiveId = 'category-node-93'" 2771 @mouseleave="hoverPanelActiveId = 0" 2772 @keyup.escape="hoverPanelActiveId = 0" 2773 > 2774 <span class="flex items-center text-md"> 2775 <a class="w-full text-base text-gray-700 level-0 py-2 px-0.5" 2776 href="https://www.laufshirt-bedrucken.de/shorts-tights-16196/" 2777 title="Shorts & Tights" 2778 @focus="hoverPanelActiveId = 0" 2779 > 2780 Shorts & Tights </a> 2781 <button 2782 type="button" 2783 data-sr-button-id="category-node-93" 2784 :aria-expanded="hoverPanelActiveId === 'category-node-93' ? 'true' : 'false'" 2785 @click="openMenuOnClick('category-node-93')" 2786 class="rounded p-1 text-gray-500" 2787 > 2788 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2789 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2790</svg> 2791 <span class="sr-only"> 2792 Show submenu for Shorts & Tights category </span> 2793 </button> 2794 </span> 2795 <ul 2796 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2797 :class="{ 2798 'hidden' : hoverPanelActiveId !== 'category-node-93', 2799 'block' : hoverPanelActiveId === 'category-node-93' 2800 }" 2801 > 2802 <li> 2803 <a href="https://www.laufshirt-bedrucken.de/shorts-tights-16196/damen-16199/" 2804 title="Damen Shorts & Tights bedrucken" 2805 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2806 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D93]').focus())" 2807 > 2808 <span class="text-base text-gray-700"> 2809 Damen Shorts & Tights bedrucken </span> 2810 </a> 2811 </li> 2812 <li> 2813 <a href="https://www.laufshirt-bedrucken.de/shorts-tights-16196/kinder-16503/" 2814 title="Kinder Shorts & Tights bedrucken" 2815 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2816 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D93]').focus())" 2817 >
2818 <span class="text-base text-gray-700"> 2819 Kinder Shorts & Tights bedrucken </span> 2820 </a> 2821 </li> 2822 <li> 2823 <a href="https://www.laufshirt-bedrucken.de/shorts-tights-16196/herren-16197/" 2824 title="Herren Shorts & Tights bedrucken" 2825 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2826 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D93]').focus())" 2827 > 2828 <span class="text-base text-gray-700"> 2829 Herren Shorts & Tights bedrucken </span> 2830 </a> 2831 </li> 2832 </ul> 2833 </li> 2834 <li class="relative level-0 border-b-2 border-transparent hover:border-primary data-[active]:border-primary" 2835 @mouseenter="hoverPanelActiveId = 'category-node-133'" 2836 @mouseleave="hoverPanelActiveId = 0" 2837 @keyup.escape="hoverPanelActiveId = 0" 2838 > 2839 <span class="flex items-center text-md"> 2840 <a class="w-full text-base text-gray-700 level-0 py-2 px-0.5" 2841 href="https://www.laufshirt-bedrucken.de/specials-18487/" 2842 title="Specials" 2843 @focus="hoverPanelActiveId = 0" 2844 > 2845 Specials </a> 2846 <button 2847 type="button" 2848 data-sr-button-id="category-node-133" 2849 :aria-expanded="hoverPanelActiveId === 'category-node-133' ? 'true' : 'false'" 2850 @click="openMenuOnClick('category-node-133')" 2851 class="rounded p-1 text-gray-500" 2852 > 2853 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2854 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2855</svg> 2856 <span class="sr-only"> 2857 Show submenu for Specials category </span> 2858 </button> 2859 </span> 2860 <ul 2861 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2862 :class="{ 2863 'hidden' : hoverPanelActiveId !== 'category-node-133', 2864 'block' : hoverPanelActiveId === 'category-node-133' 2865 }" 2866 > 2867 <li> 2868 <a href="https://www.laufshirt-bedrucken.de/specials-18487/firmenlauf-18533/" 2869 title="Firmenlauf-Shirts bedrucken für Damen und Herren" 2870 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2871 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D133]').focus())" 2872 >
2873 <span class="text-base text-gray-700"> 2874 Firmenlauf-Shirts bedrucken für Damen und Herren </span> 2875 </a> 2876 </li> 2877 <li> 2878 <a href="https://www.laufshirt-bedrucken.de/specials-18487/berufsbekleidung-physiotherapeuten-online-bedrucken-lassen-18488/" 2879 title="Physiotherapeuten Bekleidung - Team-Shirts & Hosen online bedrucken lassen" 2880 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2881 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D133]').focus())" 2882 > 2883 <span class="text-base text-gray-700"> 2884 Physiotherapeuten Bekleidung - Team-Shirts & Hosen online bedrucken lassen </span> 2885 </a> 2886 </li> 2887 <li> 2888 <a href="https://www.laufshirt-bedrucken.de/specials-18487/dtf-transfer-online-bestellen/" 2889 title="DTF Transfer" 2890 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2891 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D133]').focus())" 2892 > 2893 <span class="text-base text-gray-700"> 2894 DTF Transfer </span> 2895 </a> 2896 </li> 2897 </ul> 2898 </li> 2899 </ul> 2900 </nav> 2901 </div> 2902</div>
2903<script> 2904 'use strict'; 2905 2906 const initMenuDesktop_6ac04a7f5f21b = () => { 2907 return { 2908 hoverPanelActiveId: null, 2909 setActiveMenu(menuNode) { 2910 Array.from(menuNode.querySelectorAll('a')).filter(link => { 2911 return link.href === window.location.href.split('?')[0]; 2912 }).map(item => { 2913 item.setAttribute('aria-current', 'page'); 2914 item.closest('li.level-0').setAttribute('data-active', 'true'); 2915 }); 2916 }, 2917 openMenuOnClick(menuNode) { 2918 if (menuNode === this.hoverPanelActiveId) { 2919 this.hoverPanelActiveId = 0; 2920 } else { 2921 this.hoverPanelActiveId = menuNode 2922 } 2923 } 2924 } 2925 } 2926</script>
2926 2927 2928 <div class="flex items-center gap-2 md:gap-1 order-3 md:-mr-1"> 2929 <!--Compare Icon--> 2930 <a id="compare-link" 2931 class="relative inline-block rounded p-1 hover:bg-primary/10 outline-offset-2 invisible" 2932 :class="{ 'invisible': !(itemCount > 0) }" 2933 href="https://www.laufshirt-bedrucken.de/catalog/product_compare/index/" 2934 title="Produkte vergleichen" 2935 x-data="initCompareHeader()" 2936 @private-content-loaded.window="receiveCompareData($event.detail.data)" 2937 :aria-label="` 2938 Produkte vergleichen, 2939 ${itemCount > 1 2940 ? hyva.str('\u00251\u0020Elemente', itemCount) 2941 : hyva.str('\u00251\u0020Artikel', itemCount) 2942 }`" 2943 > 2944 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="md:h-6 md:w-6" width="28" height="28" aria-hidden="true"> 2945 <path stroke-linecap="round" stroke-linejoin="round" d="M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3"/> 2946</svg> 2947 <span 2948 x-text="itemCount" 2949 class="absolute -top-1.5 -right-1.5 h-5 px-2 py-1 rounded-full bg-yellow-500 text-white 2950 text-xs font-semibold leading-none text-center uppercase tabular-nums" 2951 aria-hidden="true" 2952 ></span> 2953 </a> 2954 2955 <!-- Additional Header Elements --> 2956 2957 <!--Customer Icon & Dropdown--> 2958 2959<div 2960 class="relative inline-block" 2961 x-data="initCustomerMenu" 2962 x-bind="eventListeners" 2963> 2964 <button 2965 type="button" 2966 id="customer-menu" 2967 class="btn bg-transparent border-transparent p-1 text-gray-900" 2968 @click="toggleOpen" 2969 :aria-expanded="open" 2970 aria-label="Mein Konto" 2971 aria-haspopup="true" 2972 > 2973 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg> 2974 </button> 2975 <nav 2976 class="z-10 absolute right-0 w-40 sm:w-48 mt-2 lg:mt-3 -me-4 py-2 px-1 rounded-md shadow-lg bg-white overflow-auto" 2977 aria-labelledby="customer-menu" 2978 x-show="open" 2979 x-transition 2980 x-cloak 2981 > 2982 2983<a id="customer.header.sign.in.link" 2984 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" 2985 onclick="hyva.setCookie && hyva.setCookie( 2986 'login_redirect', 2987 window.location.href, 2988 1 2989 )" 2990 href="https://www.laufshirt-bedrucken.de/customer/account/index/" 2991 title="EINLOGGEN" 2992> 2993 EINLOGGEN</a> 2994 2995 <a id="customer.header.register.link" 2996 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" 2997 href="https://www.laufshirt-bedrucken.de/customer/account/create/" 2998 title="KONTO ERSTELLEN" 2999 > 3000 KONTO ERSTELLEN </a> 3001 </nav> 3002</div>
3003<script> 3004 function initCustomerMenu() { 3005 return hyva.createBooleanObject('open', false, { 3006 eventListeners: { 3007 ['@pageshow.window'](event) { 3008 if (event.persisted) { 3009 this.setOpenFalse() 3010 } 3011 }, 3012 ['@keyup.escape']() { 3013 this.setOpenFalse() 3014 }, 3015 ['@click.outside']() { 3016 this.setOpenFalse() 3017 } 3018 } 3019 }) 3020 } 3021 window.addEventListener('alpine:init', () => Alpine.data('initCustomerMenu', initCustomerMenu), {once: true}) 3022</script>
3022 3023 3024 3025 <!--Cart Icon--> 3026 <button 3027 id="menu-cart-icon" 3028 class="relative inline-block rounded p-1 hover:bg-primary/10 outline-offset-2" 3029 x-ref="cartButton" 3030 :aria-disabled="isCartEmpty()" 3031 :aria-label="` 3032 Toggle minicart, 3033 ${isCartEmpty() 3034 ? 'Warenkorb ist leer' 3035 : cart.summary_count > 1 3036 ? hyva.str('%1 Artikel', cart.summary_count) 3037 : hyva.str('%1 item', cart.summary_count) 3038 }`" 3039 @click.prevent="() => { 3040 $dispatch('toggle-cart', { isOpen: true }) 3041 }" 3042 @toggle-cart.window="toggleCart($event)" 3043 :aria-expanded="isCartOpen" 3044 aria-haspopup="dialog" 3045 > 3046 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="md:h-6 md:w-6" width="28" height="28" aria-hidden="true"> 3047 <path stroke-linecap="round" stroke-linejoin="round" d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"/> 3048</svg> 3049 <span 3050 x-text="cart.summary_count" 3051 x-show="!isCartEmpty()" 3052 x-cloak 3053 class="absolute -top-1.5 -right-1.5 h-5 px-2 py-1 rounded-full bg-primary text-white text-xs font-semibold leading-none text-center uppercase tabular-nums" 3054 aria-hidden="true" 3055 ></span> 3056 </button> 3057 </div> 3058 </div> 3059 3060
3061 <!--Cart Drawer--> 3062
3062<script> 3063 function initCartDrawer() { 3064 return { 3065 open: false, 3066 isLoading: false, 3067 cart: {}, 3068 maxItemsToDisplay: 10, 3069 itemsCount: 0, 3070 getData(data) { 3071 if (data.cart) { 3072 this.cart = data.cart; 3073 this.itemsCount = data.cart.items && data.cart.items.length || 0; 3074 this.setCartItems(); 3075 } 3076 this.isLoading = false; 3077 }, 3078 cartItems: [], 3079 getItemCountTitle() { 3080 return hyva.strf('\u00250\u0020of\u0020\u00251\u0020products\u0020in\u0020cart\u0020displayed', this.maxItemsToDisplay, this.itemsCount) 3081 }, 3082 setCartItems() { 3083 this.cartItems = this.cart.items && this.cart.items.sort((a, b) => b.item_id - a.item_id) || []; 3084 3085 if (this.maxItemsToDisplay > 0) { 3086 this.cartItems = this.cartItems.slice(0, parseInt(this.maxItemsToDisplay, 10)); 3087 } 3088 3089 this.$nextTick(() => { 3090 this.cartItems.forEach(item => this.getItemImages(item)); 3091 }); 3092 }, 3093 getItemImages(item) { 3094 const postUrl = BASE_URL + 'hyvacheckout/ajax/getItemsImages/'; 3095 const formKey = hyva.getFormKey(); 3096 3097 fetch(postUrl, { 3098 "headers": { 3099 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 3100 }, 3101 "body": "form_key=" + formKey + "&item_id=" + item.item_id, 3102 "method": "POST", 3103 "mode": "cors", 3104 "credentials": "include" 3105 }).then(response => { 3106 if (response.redirected) { 3107 window.location.href = response.url; 3108 } else if (response.ok) { 3109 return response.json(); 3110 } else { 3111 } 3112 }).then(result => { 3113 item.product_image.src = result.image; 3114 }); 3115 }, 3116 deleteItemFromCart(itemId) { 3117 this.isLoading = true; 3118 3119 const formKey = hyva.getFormKey(); 3120 const postUrl = BASE_URL + 'checkout/sidebar/removeItem/'; 3121 3122 fetch(postUrl, { 3123 "headers": { 3124 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 3125 }, 3126 "body": "form_key=" + formKey + "&item_id=" + itemId, 3127 "method": "POST", 3128 "mode": "cors", 3129 "credentials": "include" 3130 }).then(response => { 3131 if (response.redirected) { 3132 window.location.href = response.url; 3133 } else if (response.ok) { 3134 return response.json(); 3135 } else { 3136 window.dispatchMessages && window.dispatchMessages([{ 3137 type: 'warning', 3138 text: 'Could\u0020not\u0020remove\u0020item\u0020from\u0020quote.' 3139 }]); 3140 this.isLoading = false; 3141 } 3142 }).then(result => { 3143 window.dispatchMessages && window.dispatchMessages([{ 3144 type: result.success ? 'success' : 'error', 3145 text: result.success 3146 ? 'Sie\u0020haben\u0020den\u0020Artikel\u0020entfernt.' 3147 : result.error_message 3148 }], result.success ? 5000 : 0) 3149 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 3150 }); 3151 }, 3152 scrollLock(use = true) { 3153 document.body.style.overflow = use ? "hidden" : ""; 3154 }, 3155 toggleCartDrawer(event) { 3156 if (event.detail && event.detail.isOpen !== undefined) { 3157 if (event.detail.isOpen) { 3158 this.openCartDrawer(); 3159 } else { 3160 this.open = false;
3161 this.scrollLock(false); 3162 this.$refs && this.$refs.cartDialogContent && hyva.releaseFocus(this.$refs.cartDialogContent); 3163 } 3164 } else { 3165 this.openCartDrawer() 3166 } 3167 }, 3168 openCartDrawer() { 3169 this.open = true; 3170 this.scrollLock(true); 3171 this.$nextTick(() => { 3172 this.$refs && this.$refs.cartDialogContent && hyva.trapFocus(this.$refs.cartDialogContent) 3173 }) 3174 }, 3175 closeCartDrawer() { 3176 this.$dispatch('toggle-cart', { isOpen: false }) 3177 }, 3178 getSectionDataExtraActions() { 3179 if (!this.cart.extra_actions) { 3180 return ''; 3181 } 3182 3183 const contentNode = document.createElement('div'); 3184 contentNode.innerHTML = this.cart.extra_actions; 3185 3186 hyva.activateScripts(contentNode); 3187 3188 return contentNode.innerHTML; 3189 } 3190 } 3191 } 3192</script>
3192 3193<section x-cloak 3194 x-show="cart" 3195 id="cart-drawer" 3196 x-data="initCartDrawer()" 3197 @private-content-loaded.window="getData($event.detail.data)" 3198 @toggle-cart.window="toggleCartDrawer($event)" 3199 @keydown.escape="closeCartDrawer" 3200> 3201 <div role="dialog" 3202 aria-labelledby="cart-drawer-title" 3203 aria-modal="true" 3204 :aria-hidden="!open" 3205 class="fixed inset-y-0 right-0 z-30 flex max-w-full"> 3206 <div class="backdrop" 3207 x-show="open" 3208 x-transition:enter="ease-in-out duration-500" 3209 x-transition:enter-start="opacity-0" 3210 x-transition:enter-end="opacity-100" 3211 x-transition:leave="ease-in-out duration-500" 3212 x-transition:leave-start="opacity-100" 3213 x-transition:leave-end="opacity-0" 3214 role="button" 3215 @click="closeCartDrawer" 3216 aria-label="Close minicart"></div> 3217 <div class="minicart-container relative w-screen max-w-md shadow-2xl" 3218 x-show="open" 3219 x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" 3220 x-transition:enter-start="translate-x-full" 3221 x-transition:enter-end="translate-x-0" 3222 x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" 3223 x-transition:leave-start="translate-x-0" 3224 x-transition:leave-end="translate-x-full" 3225 x-ref="cartDialogContent" 3226 role="region" 3227 :tabindex="open ? 0 : -1" 3228 aria-label="Warenkorb" 3229 3230 > 3231 <div class="flex flex-col h-full max-h-screen bg-white shadow-xl"> 3232 3233 <header class="relative px-4 py-6 sm:px-6"> 3234 <p id="cart-drawer-title" class="text-lg font-medium leading-7 text-gray-900"> 3235 <strong>Warenkorb</strong> 3236 <span class="items-total text-xs" 3237 x-show="maxItemsToDisplay && maxItemsToDisplay < itemsCount" 3238 x-text="getItemCountTitle()"> 3239 </span> 3240 </p> 3241 </header> 3242 3243 3244 <template x-if="!itemsCount"> 3245 <div class="relative px-4 py-6 bg-white border-bs sm:px-6 border-container"> 3246 Warenkorb ist leer </div> 3247 </template> 3248 3249 <template x-if="itemsCount"> 3250 <div class="relative grid gap-6 sm:gap-8 px-1 py-3 sm:px-3 bg-white border-b border-container overflow-y-auto overscroll-y-contain"> 3251 <template x-for="item in cartItems"> 3252 <div class="flex items-start p-3 space-x-4 transition duration-150 ease-in-out rounded-lg hover:bg-gray-100"> 3253 <a :href="item.product_url" 3254 class="w-1/4" 3255 :aria-label="hyva.strf('Product\u0020\u0022\u00250\u0022', item.product_name)" 3256 > 3257 <img 3258 :src="item.product_image.src" 3259 :width="90" 3260 :height="120" 3261 loading="lazy" 3262 alt="" 3263 style="max-height: 9rem; object-fit:contain;" 3264 /> 3265 </a> 3266 <div class="w-3/4 space-y-2"> 3267 <div> 3268 <p class="text-lg"> 3269 <span x-html="item.qty"></span> x <span x-html="item.product_name"></span> 3270 </p> 3271 <p class="text-sm text-gray-500"><span x-html="item.product_sku"></span></p> 3272 </div> 3273 <template x-for="option in item.options"> 3274 <div class="flex"> 3275 <p class="font-semibold mr-3" x-text="option.label + ':'"></p> 3276 <p class="text-secondary" x-html="option.value"></p> 3277 </div> 3278 </template> 3279 <p class="text-lg"><span x-html="item.product_price"></span></p> 3280 <div class="pt-4"> 3281 <a :href="item.configure_url" 3282 x-show="item.product_type !== 'grouped' && item.is_visible_in_site_visibility" 3283 class="inline-flex p-2 mr-2 btn btn-primary " 3284 :aria-label="hyva.strf('Edit\u0020product\u
32840020\u0022\u00250\u0022', item.product_name)" 3285 > 3286 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" aria-hidden="true"> 3287 <path stroke-linecap="round" stroke-linejoin="round" d="M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z"/> 3288</svg> 3289 </a> 3290 <button type="button" 3291 class="inline-flex p-2 btn btn-primary " 3292 @click="deleteItemFromCart(item.item_id)" 3293 :aria-label="hyva.strf('Remove\u0020product\u0020\u0022\u00250\u0022\u0020from\u0020cart', item.product_name)" 3294 > 3295 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" aria-hidden="true"> 3296 <path stroke-linecap="round" stroke-linejoin="round" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/> 3297</svg> 3298 </button> 3299 </div> 3300 3301 </div> 3302 </div> 3303 </template> 3304 </div> 3305 </template> 3306 3307 <template x-if="itemsCount"> 3308 <div> 3309 3310 <div class="relative grid py-3 px-1 sm:px-3 bg-white text-center"> 3311 <div class="font-bold w-full p-3 space-x-4 transition duration-150 ease-in-out rounded-lg hover:bg-gray-100"> 3312 <p>Zwischensumme: <span x-html="cart.subtotal"></span></p> 3313 </div> 3314 <div class="w-full p-3 space-x-4 transition duration-150 ease-in-out rounded-lg hover:bg-gray-100 contents"> 3315 <a @click.prevent.stop="closeCartDrawer; $dispatch('toggle-authentication', 3316 {url: 'https://www.laufshirt-bedrucken.de/checkout/'});" 3317 href="https://www.laufshirt-bedrucken.de/checkout/" 3318 class="block btn btn-primary mx-4 " 3319 > 3320 Kasse </a> 3321 <span>oder</span> 3322 <a href="https://www.laufshirt-bedrucken.de/checkout/cart/" 3323 class="underline" 3324 > 3325 Warenkorb anzeigen und bearbeiten </a> 3326 </div> 3327 <div x-html="getSectionDataExtraActions()"></div> 3328 </div> 3329 </div> 3330 </template> 3331 3332 </div> 3333 3334 <button 3335 type="button" 3336 @click="closeCartDrawer" 3337 aria-label="Close minicart" 3338 class="absolute top-0 right-2 p-4 mt-2 text-gray-300 transition-colors hover:text-black" 3339 > 3340 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 3341 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 3342</svg> 3343 </button> 3344 </div> 3345 <div 3346 class="z-50 fixed inset-0 flex justify-center items-center bg-white/70 select-none" 3347 x-show="isLoading" 3348 x-cloak 3349 x-transition.opacity.duration.200ms 3350> 3351 <div class="flex items-center"> 3352 <svg xmlns="http://www.w3.org/2000/svg" width="54" height="54" viewBox="0 0 24 24" stroke="currentColor" fill="none" stroke-width="2" stroke-linecap="round" class="animate-spin" aria-hidden="true"> 3353 <circle style="opacity: .3;" cx="12" cy="12" r="10"/> 3354 <path fill="none" stroke-width="2" d="M12,2 a10,10 0 0,1 10,10"/> 3355</svg> 3356 <div class="ml-10 text-xl"> 3357 Wird geladen … </div> 3358 </div> 3359</div> 3360 </div> 3361 3362</section> 3363 3364 <!--Authentication Pop-Up--> 3365
3365<script> 3366 function initAuthentication() { 3367 return { 3368 open: false, 3369 close() { 3370 this.open = false; 3371 }, 3372 forceAuthentication: false, 3373 checkoutUrl: 'https://www.laufshirt-bedrucken.de/checkout/index/', 3374 errors: 0, 3375 hasCaptchaToken: 0, 3376 displayErrorMessage: false, 3377 errorMessages: [], 3378 setErrorMessages(message) { 3379 this.errorMessages = [message]; 3380 this.displayErrorMessage = true; 3381 }, 3382 submitForm() { 3383 // Do not rename $form, the variable is expected to be declared in the recaptcha output 3384 const $form = document.querySelector('#login-form'); 3385 3386 if (this.errors === 0) { 3387 this.dispatchLoginRequest($form); 3388 } 3389 }, 3390 onPrivateContentLoaded() { 3391 const data = this.$event.detail.data; 3392 const isLoggedIn = data.customer && data.customer.firstname; 3393 if (data.cart && !isLoggedIn) { 3394 this.forceAuthentication = !data.cart.isGuestCheckoutAllowed; 3395 } 3396 }, 3397 redirectIfAuthenticated() { 3398 const event = this.$event; 3399 this.open = this.forceAuthentication; 3400 3401 if (event.detail && event.detail.url) { 3402 this.checkoutUrl = event.detail.url; 3403 } 3404 if (!this.forceAuthentication) { 3405 window.location.href = this.checkoutUrl; 3406 } 3407 }, 3408 resetErrors() { 3409 this.errors = 0; 3410 }, 3411 dispatchLoginRequest(form) { 3412 this.isLoading = true; 3413 const username = this.$refs['customer-email'].value; 3414 const password = this.$refs['customer-password'].value; 3415 const formKey = hyva.getFormKey(); 3416 const bodyFields = { 3417 'username': username, 3418 'password': password, 3419 'formKey': formKey 3420 }; 3421 const fieldName = 'g\u002Drecaptcha\u002Dresponse'; 3422 const recaptchaField = fieldName && form[fieldName]; 3423 if (recaptchaField) { 3424 bodyFields[fieldName] = recaptchaField.value; 3425 } 3426 fetch('https://www.laufshirt-bedrucken.de/customer/ajax/login/', { 3427 method: 'POST', 3428 headers: { 3429 'Content-Type': 'application/json', 3430 'X-Requested-With': 'XMLHttpRequest' 3431 }, 3432 body: JSON.stringify(bodyFields) 3433 } 3434 ).then(response => { 3435 return response.json() 3436 } 3437 ).then(data => { 3438 this.isLoading = false; 3439 if (data.errors) { 3440 this.setErrorMessages(data.message); 3441 this.errors = 1; 3442 this.hasCaptchaToken = 0; 3443 } else { 3444 window.location.href = this.checkoutUrl; 3445 } 3446 }); 3447 }, 3448 eventListeners: { 3449 ['@private-content-loaded.window']() { 3450 this.onPrivateContentLoaded(); 3451 }, 3452 ['@toggle-authentication.window']() { 3453 this.redirectIfAuthenticated(); 3454 }, 3455 ['@pageshow.window'](event) { 3456 if (event.persisted) { 3457 this.close(); 3458 }; 3459 } 3460 } 3461 } 3462 } 3463 3464 window.addEventListener('alpine:init', () => Alpine.data('initAuthentication', initAuthentication), {once: true}) 3465</script>
3465 3466 3467<dialog 3468 id="authentication-popup" 3469 aria-labelledby="cart-drawer-title" 3470 class="open:flex flex-col transition ease-out duration-300 motion-reduce:duration-0 p-0" 3471 x-data="initAuthentication" 3472 x-bind="eventListeners" 3473 x-show="open" 3474 x-htmldialog="close" 3475 closeby="any" 3476 x-transition 3477> 3478 <div class="pt-8 px-8"> 3479 <div class="flex gap-2 justify-between items-center"> 3480 <p class="text-xl"> 3481 <strong>Kundenlogin</strong> 3482 </p> 3483 <button 3484 type="button" 3485 class="btn bg-transparent border-transparent p-2" 3486 @click="close" 3487 aria-label="Panel schließen" 3488 > 3489 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"/></svg> 3490 </button> 3491 </div> 3492 3493 <div class="message error" x-show="errors" x-cloak> 3494 <template x-for="(message, index) in errorMessages" :key="index"> 3495 <div> 3496 <template x-if="message"> 3497 <span x-html="message"></span> 3498 </template> 3499 </div> 3500 </template> 3501 </div> 3502 </div> 3503 3504 <div class="block-customer-login p-8"> 3505 <p id="authenticate-customer-login" class="text-lg mb-2"> 3506 <strong>Mit Ihrem Konto bestellen</strong> 3507 </p> 3508 3509 <form 3510 id="login-form" 3511 class="form form-login" 3512 method="post" 3513 @submit.prevent="submitForm" 3514 > 3515 <input name="context" type="hidden" value="checkout"> 3516 3517 <div class="flex flex-col gap-4"> 3518 <div class="field email required"> 3519 <label for="form-login-username"> 3520 <span>E-Mail</span> 3521 </label> 3522 <div class="control"> 3523 <input 3524 id="form-login-username" 3525 name="username" 3526 type="email" 3527 class="form-input w-full" 3528 required 3529 autocomplete="off" 3530 x-ref="customer-email" 3531 @change="resetErrors" 3532 > 3533 </div> 3534 </div> 3535 <div class="field password required"> 3536 <label for="form-login-password"> 3537 <span>Passwort</span> 3538 </label> 3539 <div class="control"> 3540 <input 3541 id="form-login-password" 3542 name="password" 3543 type="password" 3544 class="form-input w-full" 3545 required 3546 autocomplete="off" 3547 x-ref="customer-password" 3548 @change="resetErrors" 3549 > 3550 </div> 3551 </div> 3552 </div> 3553 3554 <div class="actions-toolbar"> 3555 <button 3556 type="submit" 3557 class="btn btn-primary" 3558 > 3559 EINLOGGEN </button> 3560 <a 3561 href="https://www.laufshirt-bedrucken.de/customer/account/forgotpassword/" 3562 class="underline hover:no-underline" 3563 > 3564 Passwort vergessen? </a> 3565 </div> 3566 </form> 3567 </div> 3568 <div class="block-new-customer p-8 border-t border-gray-300"> 3569 <p id="authenticate-new-customer" class="text-lg mb-2"> 3570 <strong>Als neuer Kunde bestellen</strong> 3571 </p> 3572 3573 <div class="block-content"> 3574 <p class="mb-1"> 3575 Das Erstellen eines Kontos hat viele Vorteile: </p> 3576 <ul class="list-disc pl-5"> 3577 <li> Bestell- und Versandstatus ansehen</li> 3578 <li> Bestellverlauf verfolgen</li> 3579 <li> Schneller bestellen</li> 3580 </ul> 3581 <div class="actions-toolbar mt-6 mb-2"> 3582 <a href="https://www.laufshirt-bedrucken.de/customer/account/create/" 3583 class="inline-flex btn btn-primary"> 3584 KONTO ERSTELLEN </a> 3585 </div> 3586 </div> 3587 </div> 3588</dialog> 3589</div> 3590 3591</header>
3591<main id="maincontent" class="page-main"> <!-- 3592DEPRECATED: This template will be removed in version 3.17 3593If you're overriding or referencing this file, please update your layout and customizations accordingly. 3594--><div id="contentarea" tabindex="-1"></div> 3595<div class="page messages">
3595<script> 3596 function initMessages() { 3597 "use strict"; 3598 return { 3599 messages: window.mageMessages || [], 3600 isEmpty() { 3601 return this.messages.reduce( 3602 function (isEmpty, message) { 3603 return isEmpty && message === undefined 3604 }, true 3605 ) 3606 }, 3607 hasMessages() { 3608 return !this.isEmpty(); 3609 }, 3610 hasMessage() { 3611 return !!this.message; 3612 }, 3613 removeMessage() { 3614 this.messages[this.index] = undefined; 3615 }, 3616 addMessages(messages, hideAfter) { 3617 messages.map((message) => { 3618 this.messages = this.messages.concat(message); 3619 if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) { 3620 hideAfter = window.defaultSuccessMessageTimeout; 3621 } 3622 if (hideAfter) { 3623 this.setHideTimeOut(this.messages.length -1, hideAfter); 3624 } 3625 }); 3626 }, 3627 setHideTimeOut(messageIndex, hideAfter) { 3628 setTimeout((messageIndex) => { 3629 this.messages[messageIndex] = undefined; 3630 }, hideAfter, messageIndex); 3631 }, 3632 eventListeners: { 3633 ['@messages-loaded.window'](event) { 3634 this.addMessages(event.detail.messages, event.detail.hideAfter) 3635 }, 3636 ['@private-content-loaded.window'](event) { 3637 const data = event.detail.data; 3638 if ( 3639 data.messages && 3640 data.messages.messages && 3641 data.messages.messages.length 3642 ) { 3643 this.addMessages(data.messages.messages); 3644 } 3645 }, 3646 ['@clear-messages.window']() { 3647 this.messages = []; 3648 }, 3649 ['@pageshow.window'](event) { 3650 if (event.persisted) { 3651 this.messages = []; 3652 }; 3653 } 3654 }, 3655 getMessageUiId() { 3656 return 'message-' + this.message.type; 3657 } 3658 } 3659 } 3660 3661 window.addEventListener('alpine:init', () => Alpine.data('initMessages', initMessages), {once: true}) 3662</script>
3662 3663<section id="messages" 3664 x-data="initMessages" 3665 x-bind="eventListeners" 3666 role="alert" 3667> 3668 <template x-if="hasMessages"> 3669 <div class="w-full"> 3670 <div class="messages container mx-auto py-3"> 3671 <template x-for="(message, index) in messages" :key="index"> 3672 <div> 3673 <template x-if="hasMessage"> 3674 <div class="message" 3675 :class="message.type" 3676 :ui-id="getMessageUiId" 3677 > 3678 <span x-html="message.text"></span> 3679 <button 3680 type="button" 3681 class="text-gray-600 hover:text-black" 3682 aria-label="Close message" 3683 @click.prevent="removeMessage" 3684 > 3685 <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"> 3686 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 3687</svg> 3688 </button> 3689 </div> 3690 </template> 3691 </div> 3692 </template> 3693 </div> 3694 </div> 3695 </template> 3696</section> 3697</div> <div class="container flex flex-col md:flex-row flex-wrap"> 3698 <h1 class="page-title text-3xl font-bold mb-6" 3699 data-ui-id="page-title-wrapper" 3700 > 3701 Dein warenkorb </h1> 3702 </div> 3703<div class="columns"><div class="column main"><style> 3704 :root { 3705 --theme-color: #86BD41; 3706 } 3707</style> 3708
3709<script> 3710 window.checkoutConfig = false; 3711 window.customerData = window.checkoutConfig.customerData; 3712 window.isCustomerLoggedIn = window.checkoutConfig.isCustomerLoggedIn; 3713</script>
3713 3714
3715<script> 3716 'use strict'; 3717 (function( hyva, undefined ) { 3718 3719 let controller = new AbortController(); 3720 3721 /** 3722 * Takes a form element and submits it through fetch, 3723 * then replaces the result into the document without 3724 * refreshing the page 3725 */ 3726 hyva.postCart = (form) => { 3727 if (!form.action) { 3728 return; 3729 } 3730 controller.abort(); 3731 controller = new AbortController(); 3732 3733 const action = form.action; 3734 const formData = new FormData(form); 3735 3736 if (!formData.uenc) { 3737 formData.append('uenc', hyva.getUenc()); 3738 } 3739 3740 formData.append('form_key', hyva.getFormKey()); 3741 3742 window.fetch(action, { 3743 method: 'POST', 3744 body: formData, 3745 signal: controller.signal 3746 }).then((result) => { 3747 return result.text() 3748 }).then((content) => { 3749 3750 hyva.replaceDomElement('#maincontent', content) 3751 3752 }).catch((error) => { 3753 if (error.name !== 'AbortError') { 3754 console.error(error); 3755 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 3756 [{ 3757 type: "error", 3758 text: "Es\u0020ist\u0020ein\u0020Fehler\u0020aufgetreten.\u0020Bitte\u0020versuchen\u0020Sie\u0020es\u0020erneut." 3759 }], 10000 3760 ); 3761 } 3762 }) 3763 } 3764 }( window.hyva = window.hyva || {} )); 3765</script>
3765 3766
3767<script> 3768 3769 function initCartForm(){ 3770 return { 3771 cartIsEmpty: !!window.checkoutConfig, 3772 checkCartShouldUpdate(data) { 3773 const cart = data.cart; 3774 3775 if (this.cartIsEmpty !== !!window.checkoutConfig) { 3776 this.cartIsEmpty = !!window.checkoutConfig; 3777 this.reloadCartContent(); 3778 return; 3779 } 3780 3781 if (cart) { 3782 if (!window.checkoutConfig) { 3783 if (cart.items.length) { 3784 this.reloadCartContent(); 3785 } 3786 return; 3787 } 3788 3789 const roundUp = (number) => { 3790 return Math.round(number * 100); 3791 } 3792 3793 const decimalNumbersAreEqual = (number1, number2) => { 3794 return roundUp(number1) === roundUp(number2); 3795 } 3796 3797 if (window.checkoutConfig && cart) { 3798 if (decimalNumbersAreEqual( 3799 cart.items.reduce((totalQty, cartItem) => totalQty + cartItem.qty, 0), 3800 window.checkoutConfig.quoteData.items_qty 3801 ) && 3802 decimalNumbersAreEqual( 3803 cart.subtotalAmount, 3804 window.checkoutConfig.totalsData.total_segments.find((segment) => segment.code === "subtotal").value 3805 ) 3806 ) { 3807 return; 3808 } 3809 } 3810 } 3811 this.reloadCartContent(); 3812 }, 3813 reloadCartContent() { 3814 window.fetch(window.location.href, { 3815 method: "GET" 3816 }).then((result) => { 3817 return result.text() 3818 3819 }).then((body) => { 3820 hyva.setCookie('mage-cache-sessid', '', -1, true); 3821 window.checkoutConfig = null; 3822 hyva.replaceDomElement('#maincontent', body) 3823 3824 }).catch((error) => { 3825 console.error(error); 3826 window.location.reload() 3827 }) 3828 }, 3829 onStorageChange(event) { 3830 if (event.key === 'private_content_version') { 3831 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 3832 } 3833 } 3834 } 3835 } 3836</script>
3836 3837<!-- TODO phase 2 --> 3838<!-- <div class="print-cart-button lg:w-2/3 text-right">--> 3839<!-- <button onclick="window.print()">--><!-- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">--> 3840<!-- <g clip-path="url(#clip0_1426_220)">--> 3841<!-- <path d="M19 8H5C3.34 8 2 9.34 2 11V15C2 16.1 2.9 17 4 17H6V19C6 20.1 6.9 21 8 21H16C17.1 21 18 20.1 18 19V17H20C21.1 17 22 16.1 22 15V11C22 9.34 20.66 8 19 8ZM15 19H9C8.45 19 8 18.55 8 18V14H16V18C16 18.55 15.55 19 15 19ZM19 12C18.45 12 18 11.55 18 11C18 10.45 18.45 10 19 10C19.55 10 20 10.45 20 11C20 11.55 19.55 12 19 12ZM17 3H7C6.45 3 6 3.45 6 4V6C6 6.55 6.45 7 7 7H17C17.55 7 18 6.55 18 6V4C18 3.45 17.55 3 17 3Z" fill="black"/>--> 3842<!-- </g>--> 3843<!-- <defs>--> 3844<!-- <clipPath id="clip0_1426_220">--> 3845<!-- <rect width="24" height="24" fill="white"/>--> 3846<!-- </clipPath>--> 3847<!-- </defs>--> 3848<!-- </svg>--> 3849<!-- <button>--> 3850<!-- </div>--> 3851<div x-data="initCartForm()" 3852 class="cart-form clearfix" 3853 @private-content-loaded.window="checkCartShouldUpdate($event.detail.data)" 3854 @storage.window="onStorageChange($event)" 3855> 3856 <div class="cart-empty"> 3857 <p>Du hast keine Artikel in deinem Warenkorb.</p> 3858 <p>Klicke <a href="https://www.laufshirt-bedrucken.de/"><b>hier</b></a> um weiter einzukaufen. </p> 3859 </div> 3860 </div> 3861</div></div></main><footer class="page-footer"><div class="footer content"><div class="bg-footer-main text-white body-font border-t border-container-darker shadow"> 3862 <div class="container py-8 my-8 mx-auto"> 3863 <div class="flex flex-wrap order-first gap-y-16"> 3864 <div class="w-full flex flex-wrap pr-4"> 3865 <div class="footer-items-block text-lg w-full flex gap-8 xl:col-span-2"> 3866 <div class="footer-item footer-logo-block"> 3867 <img src="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/LaufshirtBedrucken_HyvaCheckout/images/logo/footer-logo-de.svg" alt="Footer logo" width="245" height="100"/> 3868 <div class="socials my-6"> 3869 <ul class="flex"> 3870 <li> 3871 <a class="fa-stack" title="Facebook" href="https://www.facebook.com/LaufshirtBedrucken/" target="_blank"> 3872 <img title="Facebook" src="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/LaufshirtBedrucken_HyvaCheckout/images/social/facebook.svg" alt="Facebook" width="27" height="27" /> 3873 </a> 3874 </li> 3875 <li> 3876 <a class="fa-stack" title="Instagram" href="https://www.instagram.com/laufshirt_bedrucken/" target="_blank"> 3877 <img title="Instagram" src="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/LaufshirtBedrucken_HyvaCheckout/images/social/instagram.svg" alt="Instagram" width="27" height="27" /> 3878 </a> 3879 </li> 3880 </ul> 3881 </div> 3882 </div> 3883 <div class="footer-item"> 3884 <h2 class="text-md text-xl pb-2 leading-5 font-semibold tracking-wider uppercase"> 3885 Service </h2> 3886 <div class="block ves-menu mgm-widget ves-megamenu-mobile" id="footer-menu-31790986879765251605-menu"> 3887 <div class="navigation"> 3888 <ul id="footer-menu-31790986879765251605" class="ves-megamenu menu-hover accordion-menu ves-vertical ves-vertical-left" data-toggle-mobile-nav="false"> 3889 <li id=vesitem-266117909868791731938223 class=" nav-item level0 nav-0 submenu-left subhover dropdown level-top " ><a href="https://www.laufshirt-bedrucken.de/musterservice/" target="_self" class=" nav-anchor"><span>Musterservice</span></a></li><li id=vesitem-26621790986879571357018 class=" nav-item level0 nav-0 submenu-left subhover dropdown level-top " ><a href="https://www.laufshirt-bedrucken.de/b2b-textildruck-grossbestellungen/" target="_self" class=" nav-anchor"><span>Angebotsservice</span></a></li><li id=vesitem-266317909868791001836626 class=" nav-item level0 nav-0 submenu-left subhover dropdown level-top " ><a href="https://www.laufshirt-bedrucken.de/grafikservice/" target="_self" class=" nav-anchor"><span>Grafikservice</span></a></li><li id=vesitem-26641790986879828513627 class=" nav-item level0 nav-0 submenu-left subhover dropdown level-top " ><a href="https://www.laufshirt-bedrucken.de/mengenrabatte/" target="_self" class=" nav-anchor"><span>Mengenrabatte</span></a></li><li id=vesitem-266517909868791918872881 class=" nav-item level0 nav-0 submenu-left subhover dropdown level-top " ><a href="https://www.laufshirt-bedrucken.de/faq-bestellung/" target="_self" class=" nav-anchor"><span>FAQs</span></a></li> </ul> 3890 </div> 3891
3891<script type="text/javascript"> 3892 if(typeof(initedToggleMenu) == 'undefined') { 3893 var initedToggleMenu = false; 3894 } 3895 require(['jquery', 3896 'Ves_Megamenu/js/megamenuGeneral' 3897 ],function($){ 3898 $('.price-box.price-final_price', $("#footer-menu-31790986879765251605")).each(function(){ 3899 $(this).removeClass('price-box').addClass('price-box1'); 3900 $(this).attr('data-role','priceBox1'); 3901 }) 3902 if(typeof(playMegamenuJs) == 'function') { 3903 jQuery(document).ready(function($) { 3904 playMegamenuJs($, 'footer-menu-31790986879765251605', 1, 'hover', 0); 3905 3906 }); 3907 } else { 3908 jQuery(document).ready(function($) { 3909 jQuery('#footer-menu-31790986879765251605-menu .ves-megamenu .level0').hover(function() { 3910 var mParentTop = jQuery(this).parents('.ves-megamenu').offset().top; 3911 var mParentHeight = $(this).parent().height(); 3912 var mTop = $(this).height(); 3913 var mHeight = $(this).height(); 3914 var mParent = $(this).parent(); 3915 if (mHeight < mParentHeight) { 3916 mTop = $(this).offset().top - mParent.offset().top + mHeight; 3917 } 3918 $(this).children('.submenu').css({top:mTop}); 3919 }); 3920 jQuery('p').each(function() { 3921 var $this = $(this); 3922 if ($this.html().replace(/\s| /g, '').length == 0) 3923 $this.remove(); 3924 }); 3925 }); 3926 var toggle_nav = $("#footer-menu-31790986879765251605").attr("data-toggle-mobile-nav"); 3927 if(toggle_nav == true || toggle_nav == 'true' || toggle_nav==1){ 3928 if(!initedToggleMenu) { 3929 var menuToogle = function () { 3930 if ($('html').hasClass('nav-open')) { 3931 $('html').removeClass('nav-open'); 3932 setTimeout(function () { 3933 $('html').removeClass('nav-before-open'); 3934 }, 300); 3935 } else { 3936 $('body').append('<div class="ves-overlay ves-overlayfooter-menu-31790986879765251605"></div>'); 3937 $('html').addClass('nav-before-open'); 3938 setTimeout(function () { 3939 $('html').addClass('nav-open'); 3940 }, 42); 3941 } 3942 } 3943 $(document).on("click", ".action.nav-toggle", menuToogle); 3944 initedToggleMenu = true; 3945 } 3946 $(document).on("click", ".ves-overlayfooter-menu-31790986879765251605", function(){ 3947 $('#footer-menu-31790986879765251605').css("left",""); 3948 $('html').removeClass('ves-navopen'); 3949 setTimeout(function () { 3950 $('html').removeClass('ves-nav-before-open'); 3951 }, 300); 3952 $(this).remove(); 3953 return false; 3954 }); 3955 } 3956 3957 $("#footer-menu-31790986879765251605 .dynamic-items li").hover(function(){ 3958 $(this).parents(".dynamic-items").find("li").removeClass("dynamic-active"); 3959 $(this).addClass("dynamic-active"); 3960 var id = $(this).data("dynamic-id"); 3961 $("#footer-menu-31790986879765251605 ."+id).parent().find(".dynamic-item").removeClass("dynamic-active"); 3962 $("#footer-menu-31790986879765251605 ."+id).addClass("dynamic-active"); 3963 }); 3964 var mImg = ''; 3965 $("#footer-menu-31790986879765251605 img").hover(function(){ 3966 mImg = ''; 3967 mImg = $(this).attr('src'); 3968 if ($(this).data('hoverimg')){ 3969 $(this).attr('src',$(this).data('hoverimg')); 3970 } 3971 },function(){ 3972 $(this).attr('src',mImg); 3973 }); 3974 $("#footer-menu-31790986879765251605 li a").hover(function(){ 3975 $(this).css({ 3976 "background-color": $(this).data("hover-bgcolor"), 3977 "color": $(this).data("hover-color") 3978 }); 3979 }, function(){ 3980 $(this).css({ 3981 "background-color": $(this).data("bgcolor"), 3982 "color": $(this).data("color") 3983 }); 3984 }); 3985 $(window).on("resize load", function(){ 3986 3987 if($("#footer-menu-31790986879765251605").data("disable-bellow") && $("#footer-menu-31790986879765251605").data("disable-above")){ 3988 3989 if (($(window).width() <= $("#footer-menu-31790986879765251605").data("disable-bellow")) || ($(window).width() >= $("#footer-menu-31790986879765251605").data("disable-above"))){ 3990 $("#footer-menu-31790986879765251605-menu").hide(); 3991 }else{ 3992 $("#footer-menu-31790986879765251605-menu").show(); 3993 } 3994 3995 $("#footer-menu-31790986879765251605").find("li").each(function(index, element){ 3996 if (($(window).width() <= $(this).data("disable-bellow")) || ($(window).width() >= $(this).data("disable-above"))){ 3997 $(this).addClass("hidden"); 3998 } else if ($(this).hasClass("hidden")){ 3999 $(this).removeClass("hidden"); 4000 } 4001 }); 4002 4003 } else if($("#footer-menu-31790986879765251605").data("disable-bellow") && !$("#footer-menu-31790986879765251605").data("disable-above")) { 4004 if ($(window).width() <= $("#footer-menu-31790986879765251605").data("disable-bellow")){ 4005 $("#footer-menu-31790986879765251605-menu").hide(); 4006 }else{ 4007 $("#footer-menu-31790986879765251605-menu").show(); 4008 } 4009 4010 $("#footer-menu-31790986879765251605").find("li").each(function(index, element){ 4011 if ($(window).width() <= $(this).data("disable-bellow")){ 4012 $(this).addClass("hidden"); 4013 }else if ($(this).hasClass("hidden")){ 4014 $(this).removeClass("hidden"); 4015 } 4016 }); 4017 } else if($("#footer-menu-31790986879765251605").data("disable-above") && !$("#footer-menu-31790986879765251605").data("disable-bellow")) { 4018 if ($(window).width() >= $("#footer-menu-31790986879765251605").data("disable-above")){ 4019 $("#footer-menu-31790986879765251605-menu").hide(); 4020 }else{ 4021 $("#footer-menu-31790986879765251605-menu").show(); 4022 } 4023 4024 $("#footer-menu-31790986879765251605").find("li").each(function(index, element){ 4025 if($(window).width() >= $(this).data("disable-above")) { 4026 $(this).addClass("hidden"); 4027 } else if ($(this).hasClass("hidden")){ 4028 $(this).removeClass("hidden"); 4029 } 4030 }); 4031 } 4032 4033 if ($(window).width() >= 768 && $(window).width() <= 1024){ 4034 $("#footer-menu-31790986879765251605 .nav-anchor").off().click(function(){ 4035 var iParent = $(this).parent('.nav-item'); 4036 iParent.addClass("clicked"); 4037 if ($(iParent).children('.submenu').length == 1){ 4038 iParent.trigger('hover'); 4039 if (iParent.hasClass('submenu-alignleft') || iParent.hasClass('submenu-alignright')){ 4040 if ((iParent.offset().left + iParent.find('.submenu').eq(0).width()) > $(window).width()){ 4041 iParent.find('.submenu').eq(0).css('max-width','100%'); 4042 iParent.css('position','static'); 4043 } 4044 } 4045 return false;
4046 } 4047 }); 4048 }else{ 4049 $("#footer-menu-31790986879765251605").find('.submenu').css('max-width',''); 4050 $("#footer-menu-31790986879765251605").find('.submenu-alignleft').css('position','relative'); 4051 } 4052 if ($(window).width() <= 768){ 4053 $('.sections.nav-sections').removeAttr( "style" ) 4054 $("#footer-menu-31790986879765251605").addClass("nav-mobile"); 4055 4056 /* 4057 $("#footer-menu-31790986879765251605 .nav-anchor").off().click(function(){ 4058 4059 $("#footer-menu-31790986879765251605 .nav-item").removeClass("item-active"); 4060 var parent = $(this).parents(".nav-item").eq(0); 4061 $(this).toggleClass('item-active'); 4062 $(parent).find(".submenu").eq(0).slideToggle(); 4063 return false; 4064 }); 4065 */ 4066 4067 }else{ 4068 $("#footer-menu-31790986879765251605").find(".submenu").css({'display':''}); 4069 $("#footer-menu-31790986879765251605").find("div").removeClass("mbactive"); 4070 $("#footer-menu-31790986879765251605").removeClass("nav-mobile"); 4071 4072 /* 4073 $("#footer-menu-31790986879765251605 .nav-anchor").off().click(function(){ 4074 if("#" != $(this).attr("href")) 4075 window.location.url = $(this).attr("href"); 4076 return true; 4077 }); 4078 */ 4079 4080 } 4081 }).resize(); 4082 //Toggle mobile menu 4083 $('.ves-megamenu-mobile #footer-menu-31790986879765251605 .opener').on('click', function(e) { 4084 e.preventDefault(); 4085 $("#footer-menu-31790986879765251605 .nav-item").removeClass("item-active"); 4086 var parent = $(this).parents(".nav-item").eq(0); 4087 $(this).toggleClass('item-active'); 4088 $(parent).find(".submenu").eq(0).slideToggle(); 4089 $(parent).find(".submenu").eq(0).toggleClass('submenu-active'); 4090 return false; 4091 }); 4092 4093 4094 4095 } 4096 }); 4097 </script>
4097 4098</div> 4099 <a href="/vertrag-widerrufen" class="widerruf-footer-link" style="display:inline-flex;align-items:center;gap:8px;background-color:#6b7280;color:#fff;border-radius:10px;padding:8px 14px;margin-top:12px;text-decoration:none;font-size:15px;font-weight:400;transition:background-color 0.2s ease;"> 4100 <svg style="width:1em;height:1em;flex-shrink:0;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor"> 4101 <path fill-rule="evenodd" d="M8 3a5 5 0 1 1-4.546 2.914.5.5 0 0 0-.908-.417A6 6 0 1 0 8 2v1z"/> 4102 <path d="M8 4.466V.534a.25.25 0 0 0-.41-.192L5.23 2.308a.25.25 0 0 0 0 .384l2.36 1.966A.25.25 0 0 0 8 4.466z"/> 4103 <circle cx="8" cy="8" r="1.2"/> 4104 </svg> 4105 Vertrag widerrufen </a> 4106 </div> 4107 <div class="footer-item"> 4108 <h2 class="text-md text-xl pb-2 leading-5 font-semibold tracking-wider uppercase"> 4109 Über Uns </h2> 4110 <div class="block ves-menu mgm-widget ves-megamenu-mobile" id="footer-menu-4179098687950733874-menu"> 4111 <div class="navigation"> 4112 <ul id="footer-menu-4179098687950733874" class="ves-megamenu menu-hover accordion-menu ves-vertical ves-vertical-left" data-toggle-mobile-nav="false"> 4113 <li id=vesitem-269017909868791971847690 class=" nav-item level0 nav-0 submenu-left subhover dropdown level-top " ><a href="https://www.laufshirt-bedrucken.de/impressum/" target="_self" class=" nav-anchor"><span>Impressum</span></a></li><li id=vesitem-26911790986879878209208 class=" nav-item level0 nav-0 submenu-left subhover dropdown level-top " ><a href="https://www.laufshirt-bedrucken.de/agbs/" target="_self" class=" nav-anchor"><span>AGBs</span></a></li><li id=vesitem-26921790986879979022394 class=" nav-item level0 nav-0 submenu-left subhover dropdown level-top " ><a href="https://www.laufshirt-bedrucken.de/datenschutzerklarung/" target="_self" class=" nav-anchor"><span>Datenschutzerklärung</span></a></li><li id=vesitem-26931790986879176475179 class=" nav-item level0 nav-0 submenu-left subhover dropdown level-top " ><a href="https://www.laufshirt-bedrucken.de/widerrufsbelehrung/" target="_self" class=" nav-anchor"><span>Widerrufsbelehrung</span></a></li><li id=vesitem-26941790986879573553232 class=" nav-item level0 nav-0 submenu-left subhover dropdown level-top " ><a href="https://www.laufshirt-bedrucken.de/contact/" target="_self" class=" nav-anchor"><span>Kontakt</span></a></li><li id=vesitem-26961790986879646870806 class=" nav-item level0 nav-0 submenu-left subhover dropdown level-top " ><a href="https://www.laufshirt-bedrucken.de/ueber-uns/" target="_self" class=" nav-anchor"><span>Das sind wir</span></a></li> </ul> 4114 </div> 4115
4115<script type="text/javascript"> 4116 if(typeof(initedToggleMenu) == 'undefined') { 4117 var initedToggleMenu = false; 4118 } 4119 require(['jquery', 4120 'Ves_Megamenu/js/megamenuGeneral' 4121 ],function($){ 4122 $('.price-box.price-final_price', $("#footer-menu-4179098687950733874")).each(function(){ 4123 $(this).removeClass('price-box').addClass('price-box1'); 4124 $(this).attr('data-role','priceBox1'); 4125 }) 4126 if(typeof(playMegamenuJs) == 'function') { 4127 jQuery(document).ready(function($) { 4128 playMegamenuJs($, 'footer-menu-4179098687950733874', 1, 'hover', 0); 4129 4130 }); 4131 } else { 4132 jQuery(document).ready(function($) { 4133 jQuery('#footer-menu-4179098687950733874-menu .ves-megamenu .level0').hover(function() { 4134 var mParentTop = jQuery(this).parents('.ves-megamenu').offset().top; 4135 var mParentHeight = $(this).parent().height(); 4136 var mTop = $(this).height(); 4137 var mHeight = $(this).height(); 4138 var mParent = $(this).parent(); 4139 if (mHeight < mParentHeight) { 4140 mTop = $(this).offset().top - mParent.offset().top + mHeight; 4141 } 4142 $(this).children('.submenu').css({top:mTop}); 4143 }); 4144 jQuery('p').each(function() { 4145 var $this = $(this); 4146 if ($this.html().replace(/\s| /g, '').length == 0) 4147 $this.remove(); 4148 }); 4149 }); 4150 var toggle_nav = $("#footer-menu-4179098687950733874").attr("data-toggle-mobile-nav"); 4151 if(toggle_nav == true || toggle_nav == 'true' || toggle_nav==1){ 4152 if(!initedToggleMenu) { 4153 var menuToogle = function () { 4154 if ($('html').hasClass('nav-open')) { 4155 $('html').removeClass('nav-open'); 4156 setTimeout(function () { 4157 $('html').removeClass('nav-before-open'); 4158 }, 300); 4159 } else { 4160 $('body').append('<div class="ves-overlay ves-overlayfooter-menu-4179098687950733874"></div>'); 4161 $('html').addClass('nav-before-open'); 4162 setTimeout(function () { 4163 $('html').addClass('nav-open'); 4164 }, 42); 4165 } 4166 } 4167 $(document).on("click", ".action.nav-toggle", menuToogle); 4168 initedToggleMenu = true; 4169 } 4170 $(document).on("click", ".ves-overlayfooter-menu-4179098687950733874", function(){ 4171 $('#footer-menu-4179098687950733874').css("left",""); 4172 $('html').removeClass('ves-navopen'); 4173 setTimeout(function () { 4174 $('html').removeClass('ves-nav-before-open'); 4175 }, 300); 4176 $(this).remove(); 4177 return false; 4178 }); 4179 } 4180 4181 $("#footer-menu-4179098687950733874 .dynamic-items li").hover(function(){ 4182 $(this).parents(".dynamic-items").find("li").removeClass("dynamic-active"); 4183 $(this).addClass("dynamic-active"); 4184 var id = $(this).data("dynamic-id"); 4185 $("#footer-menu-4179098687950733874 ."+id).parent().find(".dynamic-item").removeClass("dynamic-active"); 4186 $("#footer-menu-4179098687950733874 ."+id).addClass("dynamic-active"); 4187 }); 4188 var mImg = ''; 4189 $("#footer-menu-4179098687950733874 img").hover(function(){ 4190 mImg = ''; 4191 mImg = $(this).attr('src'); 4192 if ($(this).data('hoverimg')){ 4193 $(this).attr('src',$(this).data('hoverimg')); 4194 } 4195 },function(){ 4196 $(this).attr('src',mImg); 4197 }); 4198 $("#footer-menu-4179098687950733874 li a").hover(function(){ 4199 $(this).css({ 4200 "background-color": $(this).data("hover-bgcolor"), 4201 "color": $(this).data("hover-color") 4202 }); 4203 }, function(){ 4204 $(this).css({ 4205 "background-color": $(this).data("bgcolor"), 4206 "color": $(this).data("color") 4207 }); 4208 }); 4209 $(window).on("resize load", function(){ 4210 4211 if($("#footer-menu-4179098687950733874").data("disable-bellow") && $("#footer-menu-4179098687950733874").data("disable-above")){ 4212 4213 if (($(window).width() <= $("#footer-menu-4179098687950733874").data("disable-bellow")) || ($(window).width() >= $("#footer-menu-4179098687950733874").data("disable-above"))){ 4214 $("#footer-menu-4179098687950733874-menu").hide(); 4215 }else{ 4216 $("#footer-menu-4179098687950733874-menu").show(); 4217 } 4218 4219 $("#footer-menu-4179098687950733874").find("li").each(function(index, element){ 4220 if (($(window).width() <= $(this).data("disable-bellow")) || ($(window).width() >= $(this).data("disable-above"))){ 4221 $(this).addClass("hidden"); 4222 } else if ($(this).hasClass("hidden")){ 4223 $(this).removeClass("hidden"); 4224 } 4225 }); 4226 4227 } else if($("#footer-menu-4179098687950733874").data("disable-bellow") && !$("#footer-menu-4179098687950733874").data("disable-above")) { 4228 if ($(window).width() <= $("#footer-menu-4179098687950733874").data("disable-bellow")){ 4229 $("#footer-menu-4179098687950733874-menu").hide(); 4230 }else{ 4231 $("#footer-menu-4179098687950733874-menu").show(); 4232 } 4233 4234 $("#footer-menu-4179098687950733874").find("li").each(function(index, element){ 4235 if ($(window).width() <= $(this).data("disable-bellow")){ 4236 $(this).addClass("hidden"); 4237 }else if ($(this).hasClass("hidden")){ 4238 $(this).removeClass("hidden"); 4239 } 4240 }); 4241 } else if($("#footer-menu-4179098687950733874").data("disable-above") && !$("#footer-menu-4179098687950733874").data("disable-bellow")) { 4242 if ($(window).width() >= $("#footer-menu-4179098687950733874").data("disable-above")){ 4243 $("#footer-menu-4179098687950733874-menu").hide(); 4244 }else{ 4245 $("#footer-menu-4179098687950733874-menu").show(); 4246 } 4247 4248 $("#footer-menu-4179098687950733874").find("li").each(function(index, element){ 4249 if($(window).width() >= $(this).data("disable-above")) { 4250 $(this).addClass("hidden"); 4251 } else if ($(this).hasClass("hidden")){ 4252 $(this).removeClass("hidden"); 4253 } 4254 }); 4255 } 4256 4257 if ($(window).width() >= 768 && $(window).width() <= 1024){ 4258 $("#footer-menu-4179098687950733874 .nav-anchor").off().click(function(){ 4259 var iParent = $(this).parent('.nav-item'); 4260 iParent.addClass("clicked"); 4261 if ($(iParent).children('.submenu').length == 1){ 4262 iParent.trigger('hover'); 4263 if (iParent.hasClass('submenu-alignleft') || iParent.hasClass('submenu-alignright')){ 4264 if ((iParent.offset().left + iParent.find('.submenu').eq(0).width()) > $(window).width()){ 4265 iParent.find('.submenu').eq(0).css('max-width','100%'); 4266 iParent.css('position','static'); 4267 } 4268 } 4269 return false;
4270 } 4271 }); 4272 }else{ 4273 $("#footer-menu-4179098687950733874").find('.submenu').css('max-width',''); 4274 $("#footer-menu-4179098687950733874").find('.submenu-alignleft').css('position','relative'); 4275 } 4276 if ($(window).width() <= 768){ 4277 $('.sections.nav-sections').removeAttr( "style" ) 4278 $("#footer-menu-4179098687950733874").addClass("nav-mobile"); 4279 4280 /* 4281 $("#footer-menu-4179098687950733874 .nav-anchor").off().click(function(){ 4282 4283 $("#footer-menu-4179098687950733874 .nav-item").removeClass("item-active"); 4284 var parent = $(this).parents(".nav-item").eq(0); 4285 $(this).toggleClass('item-active'); 4286 $(parent).find(".submenu").eq(0).slideToggle(); 4287 return false; 4288 }); 4289 */ 4290 4291 }else{ 4292 $("#footer-menu-4179098687950733874").find(".submenu").css({'display':''}); 4293 $("#footer-menu-4179098687950733874").find("div").removeClass("mbactive"); 4294 $("#footer-menu-4179098687950733874").removeClass("nav-mobile"); 4295 4296 /* 4297 $("#footer-menu-4179098687950733874 .nav-anchor").off().click(function(){ 4298 if("#" != $(this).attr("href")) 4299 window.location.url = $(this).attr("href"); 4300 return true; 4301 }); 4302 */ 4303 4304 } 4305 }).resize(); 4306 //Toggle mobile menu 4307 $('.ves-megamenu-mobile #footer-menu-4179098687950733874 .opener').on('click', function(e) { 4308 e.preventDefault(); 4309 $("#footer-menu-4179098687950733874 .nav-item").removeClass("item-active"); 4310 var parent = $(this).parents(".nav-item").eq(0); 4311 $(this).toggleClass('item-active'); 4312 $(parent).find(".submenu").eq(0).slideToggle(); 4313 $(parent).find(".submenu").eq(0).toggleClass('submenu-active'); 4314 return false; 4315 }); 4316 4317 4318 4319 } 4320 }); 4321 </script>
4321 4322</div> 4323 </div> 4324 <div class="footer-item payment-proven"> 4325 <h2 class="text-md text-xl pb-2 leading-5 font-semibold tracking-wider uppercase"> 4326 Zahlungsart </h2> 4327 <div class="mt-3 mb-6 payment-method"> 4328 <img src="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/LaufshirtBedrucken_HyvaCheckout/images/payment/footer-payment.svg" alt="Payments logo" width="270" height="100"/> 4329 </div> 4330 <div class="proven-expert"> 4331 <!-- ProvenExpert Bewertungssiegel --> 4332 <a style="text-decoration: none;" title="Kundenbewertungen & Erfahrungen zu Shirtracer GmbH. Mehr Infos anzeigen." href="https://www.provenexpert.com/shirtracer-gmbh/?utm_source=Widget&utm_medium=Widget&utm_campaign=Widget" target="_blank"> 4333 <img style="border: 0;" src="https://images.provenexpert.com/bb/94/8689cb433027b7d3173aac800813/widget_landscape_180_de_0.png" alt="Erfahrungen & Bewertungen zu Shirtracer GmbH" width="180" height="150" /> 4334 </a> 4335 <!-- ProvenExpert Bewertungssiegel --> 4336 </div> 4337 </div> 4338 </div> 4339</div> 4340 </div> 4341 </div> 4342 <div class="footer-copyright-block bg-container border-container max-h-3.5"> 4343 <div class="container py-1 max-w-full items-center justify-center"> 4344 <p> 4345 <div class="trustpilot-widget pt-1" data-locale="de-DE" data-template-id="5419b732fbfb950b10de65e5" data-businessunit-id="61bbbcef110c36119ee0c60a" data-style-height="24px" data-style-width="100%" data-theme="dark"> 4346 <a href="https://de.trustpilot.com/review/www.laufshirt-bedrucken.de" target="_blank" rel="noopener">Trustpilot</a> 4347</div> 4348<!--<svg role="img" viewBox="0 0 126 31" xmlns="http://www.w3.org/2000/svg" style="height: 1.5rem; width: 4.5rem; left: 0; top: 0; margin-left:-2rem">--> 4349<!-- <title id="trustpilotLogo-ccjirm1zrbf">Trustpilot</title>--> 4350<!-- </svg>--> 4351 4352<!-- TrustBox script -->
4352<script type="text/javascript" src="//widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js" async></script>
4352 <!-- End TrustBox script --> 4353 4354 4355 </p> 4356 </div> 4357 </div> 4358</div> 4359 4360</div></footer>
4361<script> 4362 'use strict'; 4363 4364 (function () { 4365 window.AmFB = { 4366 fbSectionName: 'amfacebook-pixel', 4367 options: { 4368 eventCode: '', 4369 url: 'https://www.laufshirt-bedrucken.de/amasty_fbpixel/pageView/processPageView/', 4370 eventsData: {}, 4371 isLogEnabled: '', 4372 loggingUrl: 'https://www.laufshirt-bedrucken.de/amasty_fbpixel/logEvent/log/' 4373 }, 4374 4375 /** 4376 * @private 4377 * @param {object} body 4378 * @param {string} param 4379 * @param {object} object 4380 * @returns {void} 4381 */ 4382 prepareObjectData: function (body, param, object) { 4383 for (const [key, value] of Object.entries(object)) { 4384 4385 if (typeof value === 'object') { 4386 this.prepareObjectData(body, param + `[${key}]`, value); 4387 } else { 4388 body.append(param + `[${key}]`, value); 4389 } 4390 4391 } 4392 }, 4393 4394 /** 4395 * @private 4396 * @returns {Promise} 4397 */ 4398 setDataToSection: function () { 4399 const body = new URLSearchParams({ 4400 form_key: hyva.getFormKey(), 4401 uenc: hyva.getUenc(), 4402 event_code: this.options.eventCode 4403 }); 4404 4405 this.prepareObjectData(body, 'event_data', this.options.eventsData); 4406 4407 return fetch(this.options.url, { 4408 method: 'POST', 4409 headers: { 4410 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' 4411 }, 4412 body: body 4413 }).catch(error => { 4414 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ 4415 { 4416 type: "error", 4417 text: error 4418 } 4419 ]); 4420 }); 4421 }, 4422 4423 /** 4424 * @private 4425 * @param {string} eventsData 4426 * @returns {void} 4427 */ 4428 logEventData: function (eventsData) { 4429 const body = new URLSearchParams({ 4430 form_key: hyva.getFormKey(), 4431 uenc: hyva.getUenc() 4432 }); 4433 4434 this.prepareObjectData(body, 'events', eventsData); 4435 4436 fetch(this.options.loggingUrl, { 4437 method: 'POST', 4438 headers: { 4439 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' 4440 }, 4441 body: body 4442 }).catch(error => { 4443 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ 4444 { 4445 type: "error", 4446 text: error 4447 } 4448 ]); 4449 }); 4450 }, 4451 4452 /** 4453 * @private 4454 * @param {Object} event 4455 * @returns {void} 4456 */ 4457 afterLoadSectionData: function (event) { 4458 const eventsData = event.detail?.data[this.fbSectionName]?.events; 4459 4460 !!eventsData && this.setFbqData(eventsData); 4461 }, 4462 4463 /** 4464 * @private 4465 * @param {array} eventsData 4466 * @returns {void} 4467 */ 4468 setFbqData: function(eventsData) { 4469 eventsData.forEach((data) => { 4470 const id = Object.keys(data)[0]; 4471 4472 !!id && fbq(data[id].event_action, id, data[id].event_type, data[id].event_data, {eventID: data[id].event_id}); 4473 }); 4474 4475 if (this.options.loggingUrl && this.options.isLogEnabled) { 4476 this.logEventData(eventsData); 4477 } 4478 }, 4479 4480 /** 4481 * @public 4482 * @returns {void} 4483 */ 4484 initFB: function () { 4485 window.addEventListener("private-content-loaded", (event) => this.afterLoadSectionData(event)); 4486 4487 if (this.options.eventCode && this.options.url) { 4488 this.setDataToSection().then(() => { 4489 this.reloadCustomerData(); 4490 }); 4491 } else { 4492 this.reloadCustomerData(); 4493 } 4494 }, 4495 4496 /** 4497 * @private 4498 * @returns {void} 4499 */ 4500 reloadCustomerData() { 4501 this.resetSessionCookie(); 4502 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 4503 }, 4504 4505 /** 4506 * @private 4507 * @returns {void} 4508 */ 4509 resetSessionCookie() { 4510 hyva.setCookie('mage-cache-sessid', '', -1, true); 4511 }, 4512 }; 4513 4514 window.AmFB.initFB(); 4515 })(); 4516</script>
vendor: 1 bytes, line 4516
4516
4517<script type="text/x-magento-init" nonce="NDQwZm9qcHZvanloeWVrZnh5cnNuN2h3ZXNrMjFmZHo="> 4518{"*":{"Mirasvit_Banner\/js\/loader":{"url":"https:\/\/www.laufshirt-bedrucken.de\/mst_banner\/placeholder\/loader\/","params":{"page_type":"checkout_cart_index","product_id":null,"category_id":null,"uri":"https:\/\/www.laufshirt-bedrucken.de\/checkout\/cart\/"}},"Mirasvit_Banner\/js\/analytics":{"url":"https:\/\/www.laufshirt-bedrucken.de\/mst_banner\/banner\/track\/","params":{"uri":"\/checkout\/cart\/"}}}}</script>
vendor: 1 bytes, line 4518
4518
4519<script type="text/javascript" async> 4520 var w = document.createElement("script"); 4521 w.type = "text/javascript"; 4522 w.src = "//widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js"; 4523 w.async = true; 4524 document.head.appendChild(w); 4525</script>
vendor: 1 bytes, line 4525
4525
4526<script type="text/javascript"> 4527 (function(w,d,s,r,n){w.TrustpilotObject=n;w[n]=w[n]||function(){(w[n].q=w[n].q||[]).push(arguments)}; 4528 a=d.createElement(s);a.async=1;a.src=r;a.type='text/java'+s;f=d.getElementsByTagName(s)[0]; 4529 f.parentNode.insertBefore(a,f)})(window,document,'script', 'https://invitejs.trustpilot.com/tp.min.js', 'tp'); 4530 tp('register','1GSDmQKDUT48SaHJ'); 4531</script>
vendor: 1 bytes, line 4531
4531
4532<script type="text/javascript"> 4533 function inIframe () { 4534 try { 4535 return window.self !== window.top; 4536 } catch (e) { 4537 return false; 4538 } 4539 } 4540 4541 function tryParseJson(str) { 4542 if (typeof str === 'string') { 4543 try { 4544 return JSON.parse(str); 4545 } catch (e) { 4546 return false; 4547 } 4548 } 4549 return false; 4550 } 4551 4552 if (inIframe()) { 4553 window.addEventListener('message', function(e) { 4554 var adminOrign = new URL(window.location).hostname; 4555 var eventOriginHostname = new URL(e.origin).hostname; 4556 if (!e.data || adminOrign !== eventOriginHostname) { 4557 return; 4558 } 4559 if (typeof TrustpilotPreview !== 'undefined') { 4560 if (typeof e.data === 'string' && e.data === 'submit') { 4561 TrustpilotPreview.sendTrustboxes(); 4562 } else { 4563 jsonData = tryParseJson(e.data); 4564 if (jsonData.trustbox) { 4565 TrustpilotPreview.setSettings(jsonData.trustbox); 4566 } else if (jsonData.customised) { 4567 TrustpilotPreview.updateActive(jsonData.customised); 4568 } 4569 } 4570 } else { 4571 var settings = tryParseJson(e.data); 4572 if (settings) { 4573 var p = document.createElement("script"); 4574 p.type = "text/javascript"; 4575 p.onload = function () { 4576 const iFrame = e.source.parent.document.getElementById('configuration_iframe').contentWindow; 4577 TrustpilotPreview.init(['//ecommplugins-scripts.trustpilot.com/v2.1/css/preview.min.css'], settings, iFrame, e.source); 4578 }; 4579 p.src = '//ecommplugins-scripts.trustpilot.com/v2.1/js/preview.min.js'; 4580 document.head.appendChild(p); 4581 } 4582 } 4583 }); 4584 } 4585</script>
4585<script type="text/javascript" async> 4586 const trustpilot_trustbox_settings = {"trustboxes":[]}; 4587 if (trustpilot_trustbox_settings) { 4588 document.addEventListener('DOMContentLoaded', function() { 4589 tp('trustBox', trustpilot_trustbox_settings); 4590 }); 4591 } 4592</script>
4592<script type="text/javascript"> 4593 require([ 4594 'jquery'], function ($) { 4595 $(document).ready(function(){ 4596 if(jQuery(".megamenuowl-play").length > 0 ) { 4597 require([ 4598 'jquery', 4599 "Ves_All/lib/bootstrap/js/bootstrap.min", 4600 'megamenuowlcarousel' 4601 ], function ($) { 4602 var owlItems = []; 4603 jQuery(".megamenuowl-play").each( function(){ 4604 var owlCarousel = jQuery(this).find(".owl-carousel"); 4605 var owlId = jQuery(owlCarousel).attr("id"); 4606 jQuery(this).addClass("hasOwl"); 4607 var config = []; 4608 owlItems[jQuery(owlCarousel).attr("id")] = true; 4609 if(typeof(jQuery(owlCarousel).data('nav'))!='underfined'){ 4610 config['nav'] = jQuery(owlCarousel).data('nav'); 4611 } 4612 if(typeof(jQuery(owlCarousel).data('dot'))!='underfined'){ 4613 config['dot'] = jQuery(owlCarousel).data('dot'); 4614 } 4615 if(typeof(jQuery(owlCarousel).data('autoplay'))!='underfined'){ 4616 config['autoplay'] = jQuery(owlCarousel).data('autoplay'); 4617 } 4618 if(jQuery(owlCarousel).data('autoplay-timeout')){ 4619 config['autoplayTimeout'] = jQuery(owlCarousel).data('autoplay-timeout'); 4620 } 4621 if(jQuery(owlCarousel).data('autoplay-pauonhover')){ 4622 config['autoplayHoverPause'] = jQuery(owlCarousel).data('autoplay-pauonhover'); 4623 } 4624 if(typeof(jQuery(owlCarousel).data('rtl'))!='underfined'){ 4625 config['rtl'] = jQuery(owlCarousel).data('rtl'); 4626 } 4627 if(jQuery(owlCarousel).data('items')){ 4628 4629 config['items'] = jQuery(owlCarousel).data('items'); 4630 } 4631 if(typeof(jQuery(owlCarousel).data('loop'))!='underfined'){ 4632 config['loop'] = jQuery(owlCarousel).data('loop'); 4633 } 4634 if(typeof(jQuery(owlCarousel).data('mousedrag'))!='underfined'){ 4635 config['mouseDrag'] = jQuery(owlCarousel).data('mousedrag'); 4636 } 4637 if(typeof(jQuery(owlCarousel).data('pulldrag'))!='underfined'){ 4638 config['pullDrag'] = jQuery(owlCarousel).data('pulldrag'); 4639 } 4640 if(typeof(jQuery(owlCarousel).data('freedrag'))!='underfined'){ 4641 config['freeDrag'] = jQuery(owlCarousel).data('freedrag'); 4642 } 4643 if(typeof(jQuery(owlCarousel).data('stagepadding'))!='underfined'){ 4644 config['stagePadding'] = jQuery(owlCarousel).data('stagepadding'); 4645 } 4646 if(typeof(jQuery(owlCarousel).data('lazyload'))!='underfined'){ 4647 config['lazyLoad'] = jQuery(owlCarousel).data('lazyload'); 4648 } 4649 if(jQuery(owlCarousel).data('margin')){ 4650 config['margin'] = jQuery(owlCarousel).data('margin'); 4651 } 4652 var mobile_items = 1; 4653 if(jQuery(owlCarousel).data('mobile-items')){ 4654 mobile_items = jQuery(owlCarousel).data('mobile-items'); 4655 } 4656 var tablet_small_items = 3; 4657 if(jQuery(owlCarousel).data('tablet-small-items')){ 4658 tablet_small_items = jQuery(owlCarousel).data('tablet-small-items'); 4659 } 4660 var tablet_items = 3; 4661 if(jQuery(owlCarousel).data('tablet-items')){ 4662 tablet_items = jQuery(owlCarousel).data('tablet-items'); 4663 } 4664 var portrait_items = 4; 4665 if(jQuery(owlCarousel).data('portrait-items')){ 4666 portrait_items = jQuery(owlCarousel).data('portrait-items'); 4667 } 4668 var large_items = 5; 4669 if(jQuery(owlCarousel).data('large-items')){ 4670 large_items = jQuery(owlCarousel).data('large-items'); 4671 } 4672 var large_max_items = 6; 4673 if(jQuery(owlCarousel).data('large-max-items')){ 4674 large_max_items = jQuery(owlCarousel).data('large-max-items'); 4675 } 4676 config['responsive'] = { 4677 0 : {items: mobile_items}, 4678 480 : {items: tablet_small_items}, 4679 640 : {items: tablet_items}, 4680 768 : {items: portrait_items}, 4681 980 : {items: large_items}, 4682 1200 : {items: large_max_items} 4683 }; 4684 jQuery(owlCarousel).owlCarousel(config); 4685 jQuery(".owl-left").click(function(){ 4686 var owlCarousel = jQuery("#"+jQuery(this).data("owlid")); 4687 owlCarousel.trigger('prev.owl.carousel'); 4688 return false; 4689 }); 4690 jQuery(".owl-right").click(function(){ 4691 var owlCarousel = jQuery("#"+jQuery(this).data("owlid")); 4692 owlCarousel.trigger('next.owl.carousel'); 4693 return false;
4694 }); 4695 }); 4696 }); 4697} 4698}) 4699}); 4700 4701</script>
vendor: 1 bytes, line 4701
4701
4702<script> 4703 let SnapSlider = class { 4704 constructor(el, { 4705 labelSepparator = 'von', 4706 autoPager, 4707 groupPager 4708 } = {}) { 4709 this.el = el; 4710 this.track = this.el.querySelector("[data-track]"); 4711 if (!this.track) { 4712 console.warn( 4713 "No Slider track defined, reverting back to CSS slider.\nPlease create a wrapper for your slides with the attribute data-track", 4714 this.el 4715 ); 4716 return; 4717 } 4718 this.initialLoad = true; 4719 this.slides = []; 4720 this.inViewObserver; 4721 this.mutationObserver; 4722 this.resizeObserver; 4723 this.pager = this.el.querySelector("[data-pager]"); 4724 this.navBtns = Array.from( 4725 this.el.querySelectorAll("[data-next], [data-prev]") 4726 ); 4727 this.slideLabelSepparator = this.el.dataset.slideLabelSepparator || labelSepparator; 4728 this.useAutoPager = autoPager || this.el.hasAttribute("data-auto-pager") || false; 4729 this.useGroupPager = groupPager || this.el.hasAttribute("data-group-pager") || false; 4730 this.sliderLabel = this.el.hasAttribute("aria-label") && this.el.getAttribute("aria-label").toLowerCase().trim().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, ""); 4731 this.sliderId = this.el.id || this.sliderLabel || "slider"; 4732 this.markerIdName = "data-target-id"; 4733 this.pagerClasses = this.el.dataset.pagerClass || "snap-pager"; 4734 this.markerClasses = this.el.dataset.markerClass || "snap-marker"; 4735 this.init(); 4736 } 4737 init() { 4738 this.setupSlides(); 4739 this.setupNav(); 4740 if (this.useAutoPager) { 4741 this.createPager(); 4742 } else { 4743 this.setupPager(); 4744 } 4745 this.setupObservers(); 4746 this.setupMutationObserver(); 4747 this.setupResizeObserver(); 4748 this.el.addEventListener("click", this.eventHandler.bind(this)); 4749 this.el.addEventListener("keydown", this.eventHandler.bind(this)); 4750 } 4751 destroy() { 4752 this.inViewObserver?.disconnect(); 4753 this.mutationObserver?.disconnect(); 4754 this.resizeObserver?.disconnect(); 4755 this.el.removeEventListener("click", this.eventHandler.bind(this)); 4756 this.el.removeEventListener("keydown", this.eventHandler.bind(this)); 4757 } 4758 roundUpIfGreaterThan(number, min = 8) { 4759 const decimalPart = number - Math.floor(number); 4760 return decimalPart >= min ? Math.ceil(number) : Math.floor(number); 4761 } 4762 getInViewItems() { 4763 const inViewSlides = this.track.querySelectorAll("[data-in-view]"); 4764 const firstInViewSlide = inViewSlides[0] || null; 4765 const lastInViewSlide = inViewSlides[inViewSlides.length - 1] || null; 4766 const isAtStart = firstInViewSlide === this.slides[0]; 4767 const isAtEnd = lastInViewSlide === this.slides[this.slides.length - 1]; 4768 return { 4769 inViewSlides, 4770 totalInViewSlides: inViewSlides.length, 4771 firstInViewSlide, 4772 lastInViewSlide, 4773 isAtStart, 4774 isAtEnd, 4775 hasNoOverflow: isAtStart && isAtEnd 4776 }; 4777 } 4778 groupPagerMarkers() { 4779 if (this.slides.length === 0 || !this.pager || !this.useGroupPager) return; 4780 const totalVisibleSlides = this.roundUpIfGreaterThan( 4781 this.track.offsetWidth / this.slides[0].offsetWidth 4782 ); 4783 const markers = Array.from(this.pager.querySelectorAll("a, button")); 4784 markers.forEach((marker, index) => { 4785 marker.style.display = index % totalVisibleSlides === 0 ? null : "none"; 4786 }); 4787 } 4788 handleInView(entries) { 4789 entries.forEach((entry) => { 4790 const marker = this.pager && (this.pager.querySelector(`[href="#${entry.target.id}"]`) || this.pager.querySelector( 4791 `[${this.markerIdName}="${entry.target.id}"]` 4792 )); 4793 entry.target.toggleAttribute("data-in-view", entry.isIntersecting); 4794 entry.target.toggleAttribute("inert", !entry.isIntersecting); 4795 marker?.setAttribute("aria-current", entry.isIntersecting); 4796 marker?.setAttribute("tabindex", entry.isIntersecting ? "0" : "-1"); 4797 }); 4798 const { 4799 isAtStart, 4800 isAtEnd, 4801 hasNoOverflow 4802 } = this.getInViewItems(); 4803 this.navBtns.forEach((btn) => { 4804 if (btn.hasAttribute("data-next")) { 4805 btn.style.visibility = hasNoOverflow ? "hidden" : null; 4806 isAtEnd ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 4807 } 4808 if (btn.hasAttribute("data-prev")) { 4809 btn.style.visibility = hasNoOverflow ? "hidden" : null; 4810 isAtStart ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 4811 } 4812 }); 4813 if (this.pager) { 4814 this.pager.style.visibility = hasNoOverflow ? "hidden" : null; 4815 } 4816 if (!this.initialLoad) { 4817 this.el.dispatchEvent( 4818 new CustomEvent("slideChange", { 4819 detail: this.getInViewItems() 4820 }) 4821 ); 4822 } else { 4823 this.initialLoad = false;
4824 } 4825 if (document.activeElement.parentElement.hasAttribute("data-pager")) { 4826 const activeItems = this.pager.querySelectorAll('[tabindex="0"]'); 4827 if (activeItems.length) { 4828 activeItems[0].focus({ preventScroll: true }); 4829 } 4830 } 4831 } 4832 getSlides() { 4833 if (!this.track) return []; 4834 return Array.from(this.track.children).filter( 4835 (child) => child.tagName.toLowerCase() !== "template" && child.tagName.toLowerCase() !== "style" && child.tagName.toLowerCase() !== "script" 4836 ); 4837 } 4838 refreshSlides() { 4839 this.initialLoad = true; 4840 this.slides = this.getSlides(); 4841 this.setupSlides(); 4842 if (this.useAutoPager) { 4843 this.createPager(); 4844 } else { 4845 this.setupPager(); 4846 } 4847 this.groupPagerMarkers(); 4848 this.setupObservers(); 4849 } 4850 setupSlides() { 4851 this.slides = this.getSlides(); 4852 this.slides.forEach((slide, index) => { 4853 const totalSlides = this.slides.length; 4854 const currentSlide = index + 1; 4855 const existingLabel = slide.getAttribute("aria-label") || ""; 4856 const isImage = slide.tagName.toLowerCase() === "img" || slide.tagName.toLowerCase() === "picture"; 4857 const slideLabelTag = isImage ? "alt" : "aria-label"; 4858 const hasAutoLabel = existingLabel.startsWith( 4859 `${currentSlide} ${this.slideLabelSepparator} ` 4860 ); 4861 if (!slide.hasAttribute("id")) { 4862 slide.setAttribute( 4863 "id", 4864 `${this.sliderId}-item-${currentSlide}` 4865 ); 4866 } 4867 if (!slide.hasAttribute(slideLabelTag) || slide.getAttribute(slideLabelTag) === "" || hasAutoLabel) { 4868 slide.setAttribute( 4869 slideLabelTag, 4870 `${currentSlide} ${this.slideLabelSepparator} ${totalSlides}` 4871 ); 4872 } 4873 if (slide.tagName.toLowerCase() === "div" && !slide.hasAttribute("role")) { 4874 slide.setAttribute("role", "group"); 4875 } 4876 if (this.pager && !isImage) { 4877 slide.setAttribute("role", "tabpanel"); 4878 } 4879 if (slide.getAttribute("role") === "group") { 4880 slide.setAttribute("aria-roledescription", "item"); 4881 } 4882 }); 4883 if (!this.el.hasAttribute("role") && this.el.tagName !== "SECTION") { 4884 this.el.setAttribute("role", "region"); 4885 } 4886 if (!this.el.hasAttribute("aria-roledescription")) { 4887 this.el.setAttribute("aria-roledescription", "carousel"); 4888 } 4889 this.track.setAttribute("tabindex", 0); 4890 this.track.setAttribute("aria-live", "polite"); 4891 } 4892 setupNav() { 4893 this.navBtns.forEach((btn) => { 4894 btn.setAttribute("disabled", ""); 4895 btn.removeAttribute("hidden"); 4896 btn.classList.remove("invisible"); 4897 btn.style.visibility = null; 4898 }); 4899 } 4900 createPager() { 4901 const newPager = document.createElement("nav"); 4902 newPager.setAttribute("data-pager", ""); 4903 newPager.setAttribute("role", "tablist"); 4904 newPager.classList.add(...this.pagerClasses.split(" ")); 4905 this.slides.forEach((slide, index) => { 4906 const marker = document.createElement("button"); 4907 const slideId = slide.id || `${this.sliderId}-item-${index + 1}`; 4908 marker.setAttribute(this.markerIdName, slideId); 4909 marker.classList.add(...this.markerClasses.split(" ")); 4910 this.setupPagerMarker(marker, index); 4911 newPager.appendChild(marker); 4912 if (slide.tagName.toLowerCase() !== "img" && slide.tagName.toLowerCase() !== "picture") { 4913 slide.removeAttribute("aria-roledescription"); 4914 slide.setAttribute("role", "tabpanel"); 4915 } 4916 }); 4917 if (this.pager) { 4918 this.pager.setAttribute("role", "tablist"); 4919 this.pager.replaceChildren(...newPager.children); 4920 } else { 4921 this.track.after(newPager); 4922 this.pager = this.el.querySelector("[data-pager]"); 4923 } 4924 } 4925 setupPager() { 4926 if (!this.pager) return; 4927 this.pager.setAttribute("role", "tablist"); 4928 const items = Array.from(this.pager.querySelectorAll("a, button"));
4929 items.forEach((marker, index) => this.setupPagerMarker(marker, index)); 4930 } 4931 setupPagerMarker(marker, index) { 4932 const markerId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName); 4933 const slideId = markerId || `${this.sliderId}-item-${index + 1}`; 4934 if (!markerId) { 4935 marker.setAttribute(this.markerIdName, slideId); 4936 } 4937 marker.setAttribute("role", "tab"); 4938 marker.setAttribute("aria-controls", slideId); 4939 marker.setAttribute("aria-posinset", index + 1); 4940 marker.setAttribute("aria-setsize", this.slides.length); 4941 marker.setAttribute("tabindex", "-1"); 4942 if (!marker.hasAttribute("aria-label")) { 4943 marker.setAttribute("aria-label", `Slide ${index + 1}`); 4944 } 4945 } 4946 setupObservers() { 4947 if (this.inViewObserver) { 4948 this.inViewObserver.disconnect(); 4949 } 4950 this.inViewObserver = new IntersectionObserver( 4951 this.handleInView.bind(this), { 4952 root: this.track, 4953 threshold: 0.8 4954 } 4955 ); 4956 this.slides.forEach((slide) => this.inViewObserver.observe(slide)); 4957 } 4958 setupMutationObserver() { 4959 this.mutationObserver = new MutationObserver( 4960 this.refreshSlides.bind(this) 4961 ); 4962 this.mutationObserver.observe(this.track, { 4963 childList: true, 4964 subtree: false 4965 }); 4966 } 4967 setupResizeObserver() { 4968 this.resizeObserver = new ResizeObserver( 4969 this.groupPagerMarkers.bind(this) 4970 ); 4971 this.resizeObserver.observe(this.el); 4972 } 4973 goToSlideDir(dir = "next") { 4974 const { 4975 firstInViewSlide, 4976 lastInViewSlide 4977 } = this.getInViewItems(); 4978 const isPrev = dir === "prev"; 4979 let targetSlide = isPrev ? firstInViewSlide?.previousElementSibling : lastInViewSlide?.nextElementSibling; 4980 if (!targetSlide) return; 4981 if (targetSlide.tagName.toLowerCase() === "template") { 4982 targetSlide = isPrev ? targetSlide?.previousElementSibling : targetSlide?.nextElementSibling; 4983 } 4984 targetSlide.scrollIntoView({ block: "nearest", inline: isPrev ? "end" : "start" }); 4985 } 4986 pagerToSlide(event) { 4987 if (!event.target.closest("[data-pager]")) return; 4988 const marker = event.target.closest("a, button"); 4989 if (!marker) return; 4990 event.preventDefault(); 4991 const slideId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName); 4992 const targetSlide = this.track.querySelector(`#${slideId}`); 4993 targetSlide?.scrollIntoView({ block: "nearest", inline: "start" }); 4994 } 4995 eventHandler(event) { 4996 const target = event.target.closest( 4997 "[data-next], [data-prev], [data-pager]" 4998 ); 4999 if (!target) return; 5000 if (event.type === "click") { 5001 if (target.hasAttribute("data-next")) { 5002 this.goToSlideDir("next"); 5003 } else if (target.hasAttribute("data-prev")) { 5004 this.goToSlideDir("prev"); 5005 } else if (target.closest("[data-pager]")) { 5006 this.pagerToSlide(event); 5007 } 5008 } 5009 if (event.type === "keydown" && target.closest("[data-pager]")) { 5010 if (event.key === "ArrowRight") { 5011 this.goToSlideDir("next"); 5012 } else if (event.key === "ArrowLeft") { 5013 this.goToSlideDir("prev"); 5014 } 5015 } 5016 } 5017 }; 5018 5019 (() => { 5020 function alpineSnapSlider(Alpine) { 5021 Alpine.directive("snap-slider", (el, { 5022 modifiers 5023 }, { 5024 cleanup 5025 }) => { 5026 const autoPager = modifiers.includes("auto-pager");
5027 const groupPager = modifiers.includes("group-pager"); 5028 const slider = new SnapSlider(el, { 5029 autoPager, 5030 groupPager 5031 }); 5032 cleanup(() => { 5033 slider.destroy(); 5034 }); 5035 }); 5036 } 5037 5038 document.addEventListener("alpine:init", () => { 5039 window.Alpine.plugin(alpineSnapSlider); 5040 }); 5041 })(); 5042 //# sourceURL=alpine-snap-slider.js 5043</script>
vendor: 1 bytes, line 5043
5043
5044<script> 5045 (() => { 5046 // src/dialog.js 5047 function dialog_default(Alpine) { 5048 Alpine.directive("htmldialog", fylgjaAlpineDialog); 5049 function fylgjaAlpineDialog(el, { expression, modifiers }, { evaluateLater, cleanup }) { 5050 const evaluate = expression.length ? evaluateLater(expression) : () => {}; 5051 const canEvaluate = expression.length > 0; 5052 const lockPageScroll = modifiers.includes("noscroll"); 5053 const closeBy = el.getAttribute("closeby") || modifierValue(modifiers, "closeby", "closerequest"); 5054 el.style.display = null; 5055 el.style.length === 0 && el.removeAttribute("style"); 5056 if (el._x_isShown) { 5057 open(); 5058 } 5059 const closeBySupported = (() => { 5060 return "closedBy" in HTMLDialogElement.prototype; 5061 })(); 5062 function scrollLock(use = true) { 5063 document.body.style.overflow = use ? "hidden" : ""; 5064 } 5065 function dialogSubmit(event) { 5066 if (event.target.getAttribute("method") === "dialog" || event.submitter?.getAttribute("formmethod") === "dialog") { 5067 event.preventDefault(); 5068 evaluate(); 5069 } 5070 } 5071 function escapeDialog(event) { 5072 if (event.key !== "Escape") return; 5073 event.preventDefault(); 5074 if (closeBy === "none") return; 5075 evaluate(); 5076 } 5077 function handleCloseByEvent(event) { 5078 if (event.target !== el) return; 5079 const rect = el.getBoundingClientRect(); 5080 const isInDialog = rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width; 5081 if (!isInDialog) { 5082 if (closeBy === "any") { 5083 if (closeBySupported) { 5084 event.preventDefault(); 5085 } 5086 evaluate(); 5087 } 5088 } 5089 } 5090 function handleCloseEvent() { 5091 evaluate(); 5092 } 5093 function open() { 5094 if (el.hasAttribute("open")) return; 5095 el.showModal(); 5096 scrollLock(lockPageScroll); 5097 } 5098 function close() { 5099 if (!el.hasAttribute("open")) return; 5100 el.close(); 5101 scrollLock(false); 5102 } 5103 el._x_doShow = () => open(); 5104 el._x_doHide = () => close(); 5105 el.addEventListener("keydown", escapeDialog); 5106 el.addEventListener("submit", dialogSubmit); 5107 el.addEventListener("click", handleCloseByEvent); 5108 el.addEventListener("cancel", handleCloseEvent); 5109 cleanup(() => { 5110 el.removeEventListener("keydown", escapeDialog); 5111 el.removeEventListener("submit", dialogSubmit); 5112 el.removeEventListener("click", handleCloseByEvent); 5113 el.removeEventListener("cancel", handleCloseEvent); 5114 scrollLock(false); 5115 }); 5116 } 5117 } 5118 function modifierValue(modifiers, key, fallback) { 5119 if (modifiers.indexOf(key) === -1) return fallback; 5120 const rawValue = modifiers[modifiers.indexOf(key) + 1]; 5121 if (!rawValue) return fallback; 5122 if (key === "closeby") { 5123 const allowedValues = ["auto", "none", "closerequest", "any"]; 5124 const options = allowedValues.join(", "); 5125 if (!allowedValues.includes(rawValue)) { 5126 console.warn( 5127 `"${rawValue}" is not one of the allowed values for closeby: ${options}` 5128 ); 5129 return fallback; 5130 } 5131 } 5132 return rawValue; 5133 } 5134 5135 // src/cdn.js 5136 document.addEventListener("alpine:init", () => { 5137 window.Alpine.plugin(dialog_default); 5138 }); 5139 })(); 5140 //# sourceURL=alpine-htmldialog.js 5141</script>
vendor: 1 bytes, line 5141
5141
5142<script> 5143 (() => { 5144 function src_default(Alpine) { 5145 Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { 5146 let evaluate = evaluateLater(expression); 5147 let options = { 5148 rootMargin: getRootMargin(modifiers), 5149 threshold: getThreshold(modifiers) 5150 }; 5151 let observer = new IntersectionObserver((entries) => { 5152 entries.forEach((entry) => { 5153 if (entry.isIntersecting === (value === "leave")) 5154 return; 5155 evaluate(); 5156 modifiers.includes("once") && observer.disconnect(); 5157 }); 5158 }, options); 5159 observer.observe(el); 5160 cleanup(() => { 5161 observer.disconnect(); 5162 }); 5163 })); 5164 } 5165 function getThreshold(modifiers) { 5166 if (modifiers.includes("full")) 5167 return 0.99; 5168 if (modifiers.includes("half")) 5169 return 0.5; 5170 if (!modifiers.includes("threshold")) 5171 return 0; 5172 let threshold = modifiers[modifiers.indexOf("threshold") + 1]; 5173 if (threshold === "100") 5174 return 1; 5175 if (threshold === "0") 5176 return 0; 5177 return Number(`.${threshold}`); 5178 } 5179 function getLengthValue(rawValue) { 5180 let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); 5181 return match ? match[1] + (match[2] || "px") : void 0; 5182 } 5183 function getRootMargin(modifiers) { 5184 const key = "margin"; 5185 const fallback = "0px 0px 0px 0px"; 5186 const index = modifiers.indexOf(key); 5187 if (index === -1) 5188 return fallback; 5189 let values = []; 5190 for (let i = 1; i < 5; i++) { 5191 values.push(getLengthValue(modifiers[index + i] || "")); 5192 } 5193 values = values.filter((v) => v !== void 0); 5194 return values.length ? values.join(" ").trim() : fallback; 5195 } 5196 5197 document.addEventListener("alpine:init", () => { 5198 window.Alpine.plugin(src_default); 5199 }); 5200 })(); 5201 //# sourceURL=alpine-intersect.js 5202</script>
vendor: 1 bytes, line 5202
5202
5203<script> 5204 for (const [selector, deferUntil] of Object.entries({".product-slider section[x-data]:not([x-data] [x-data])":"intersect",".product-info [x-data]:not([x-data] [x-data])":"intersect","#filters-content [x-data]:not([x-data] [x-data])":"intersect","#review_form":"intersect","section[x-data^=initRecentlyViewedProductsComponent]":"intersect","div[x-data^=initBundleOptions]":"intersect","#product_addtocart_form [x-data]:not([x-data] [x-data])":"intersect","#notice-cookie-block":"idle"})) { 5205 document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); 5206 } 5207 //# sourceURL=alpine-defer-rules.js 5208</script>
vendor: 1 bytes, line 5208
5208
5209<script> 5210 (() => { 5211 const hasAlpine = new Promise(resolve => { 5212 window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); 5213 }); 5214 5215 const hasInteract = new Promise(resolve => { 5216 (events => { 5217 const onInteract = () => { 5218 resolve(); 5219 events.forEach(type => window.removeEventListener(type, onInteract)); 5220 } 5221 events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) 5222 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 5223 }); 5224 5225 const onIntersect = (el) => { 5226 return new Promise(resolve => { 5227 const observer = new IntersectionObserver(entries => { 5228 for (const entry of entries) { 5229 if (entry.isIntersecting) { 5230 observer.disconnect() 5231 resolve(); 5232 } 5233 } 5234 }, {}); 5235 observer.observe(el); 5236 }); 5237 } 5238 5239 function runComponent(el) { 5240 hasAlpine.then(() => { 5241 el.removeAttribute('x-ignore'); 5242 queueMicrotask(() => Alpine.initTree(el)); 5243 }); 5244 } 5245 5246 function initDeferredComponents() { 5247 document.querySelectorAll('[x-data][x-defer]').forEach(el => { 5248 el.setAttribute('x-ignore', ''); 5249 const deferUntil = (el.getAttribute('x-defer') || '').trim(); 5250 switch (deferUntil) { 5251 case 'interact': 5252 hasInteract.then(() => runComponent(el)); 5253 break; 5254 case 'intersect': 5255 onIntersect(el).then(() => runComponent(el)) 5256 break; 5257 case 'idle': 5258 window.requestIdleCallback 5259 ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) 5260 : setTimeout(() => runComponent(el), 4000); 5261 break; 5262 case 'eager': 5263 runComponent(el); 5264 break; 5265 default: 5266 if (deferUntil.startsWith('event:') && deferUntil.length > 6) { 5267 window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); 5268 } 5269 } 5270 }); 5271 } 5272 5273 window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); 5274 })(); 5275 //# sourceURL=alpine-defer.js 5276</script>
5276 5277
5278<script type="module" 5279 src="https://www.laufshirt-bedrucken.de/static/version1789730667/frontend/Hyva/custom/de_DE/Hyva_Theme/js/alpine3.min.js" 5280 defer 5281 crossorigin 5282></script>
vendor: 1 bytes, line 5282
5282
5283<script> 5284 function dispatchMessages(messages, hideAfter) { 5285 const messagesEvent = new CustomEvent("messages-loaded", { 5286 detail: { 5287 messages: messages, 5288 hideAfter: hideAfter 5289 } 5290 }); 5291 window.dispatchEvent(messagesEvent); 5292 } 5293 5294 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 5295 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 5296 } 5297 5298 (function( hyva, undefined ) { 5299 5300 hyva.initFormKey = () => { 5301 const inputSelector = 'input[name="form_key"]', 5302 formKey = hyva.getFormKey(); 5303 5304 Array.from(document.querySelectorAll(inputSelector)).map(function (input) { 5305 input.value = formKey 5306 }); 5307 } 5308 5309 hyva.initMessages = () => { 5310 try { 5311 const messages = hyva.getCookie('mage-messages'); 5312 window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; 5313 5314 dispatchMessages(window.mageMessages); 5315 5316 // empty `mage-messages` cookie 5317 const skipSetDomain = true; 5318 hyva.setCookie('mage-messages','', -1, skipSetDomain); 5319 5320 } catch (error) { 5321 console.warn('Error parsing Cookie Messages:', error); 5322 } 5323 } 5324 5325 window.addEventListener('DOMContentLoaded', hyva.initFormKey); 5326 hyva.alpineInitialized(hyva.initMessages) 5327 5328 }( window.hyva = window.hyva || {} )); 5329 //# sourceURL=hyva-cookies.js 5330</script>
vendor: 1 bytes, line 5330
5330
5331<script> 5332 { 5333 const private_content_key = 'mage-cache-storage'; 5334 const private_content_expire_key = 'mage-cache-timeout'; 5335 const private_content_version_key = 'private_content_version'; 5336 const section_data_ids_key = 'section_data_ids'; 5337 const mage_cache_session_id_key = 'mage-cache-sessid'; 5338 const last_visited_store_key = 'last_visited_store'; 5339 5340 const ttl = 86400; 5341 5342 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 5343 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 5344 } 5345 5346 function loadSectionData () { 5347 const browserStorage = hyva.getBrowserStorage(); 5348 if (!browserStorage) { 5349 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 5350 [{ 5351 type: "warning", 5352 text: "Please enable LocalStorage in your browser." 5353 }] 5354 ); 5355 return; 5356 } 5357 try { 5358 let isInvalid = false; 5359 5360 if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { 5361 isInvalid = true; 5362 } 5363 hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); 5364 5365 if (!hyva.getCookie(mage_cache_session_id_key)) { 5366 isInvalid = true; 5367 browserStorage.removeItem(private_content_key); 5368 const skipSetDomain = true; 5369 const days = false; 5370 hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) 5371 } 5372 5373 const cookieVersion = hyva.getCookie(private_content_version_key); 5374 const storageVersion = browserStorage.getItem(private_content_version_key); 5375 5376 if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { 5377 isInvalid = true; 5378 } 5379 5380 const privateContentExpires = browserStorage.getItem(private_content_expire_key); 5381 if (privateContentExpires && new Date(privateContentExpires) < new Date()) { 5382 browserStorage.removeItem(private_content_key); 5383 } 5384 5385 if (isInvalid && cookieVersion) { 5386 fetchPrivateContent([]); 5387 } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { 5388 const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); 5389 if ( 5390 privateContent && 5391 privateContentExpires && 5392 privateContent.cart && 5393 privateContent.customer 5394 ) { 5395 dispatchPrivateContent(privateContent); 5396 } else { 5397 fetchPrivateContent([]); 5398 } 5399 } else { 5400 if (document.getElementById('default-section-data')) { 5401 const privateContent = JSON.parse(document.getElementById('default-section-data').innerText.trim()); 5402 dispatchPrivateContent(privateContent); 5403 } else { 5404 dispatchPrivateContent({}); 5405 } 5406 } 5407 5408 } catch (error) { 5409 console.warn('Error retrieving Private Content:', error); 5410 } 5411 } 5412 5413 hyva.alpineInitialized(loadSectionData) 5414 window.addEventListener('reload-customer-section-data', loadSectionData); 5415 5416 window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data); 5417 5418 function dispatchPrivateContent(data) { 5419 5420 const privateContentEvent = new CustomEvent("private-content-loaded", { 5421 detail: { 5422 data: window.processSectionDataBeforeDispatch(data) 5423 } 5424 }); 5425 window.dispatchEvent(privateContentEvent); 5426 } 5427 5428 function fetchPrivateContent(sections) { 5429 fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { 5430 method: 'GET', 5431 headers: { 5432 'Content-Type': 'application/json', 5433 'X-Requested-With': 'XMLHttpRequest' 5434 } 5435 }) 5436 .then(response => response.ok && response.json()) 5437 .then( 5438 data => { 5439 if (data) { 5440 try { 5441 const browserStorage = hyva.getBrowserStorage(); 5442 5443 // merge new data preserving non-invalidated sections 5444 const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; 5445 5446 if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { 5447 delete oldSectionData['checkout-data']; 5448 } 5449 const newSectionData = Object.assign(oldSectionData, data); 5450 5451 dispatchPrivateContent(newSectionData); 5452 5453 // don't persist messages, they've been dispatched already 5454 if (newSectionData.messages && newSectionData.messages.messages ) { 5455 newSectionData.messages.messages = []; 5456 } 5457 5458 browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); 5459 5460 const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); 5461 browserStorage.setItem(private_content_expire_key, expiresAt); 5462 5463 const newCookieVersion = hyva.getCookie(private_content_version_key); 5464 browserStorage.setItem(private_content_version_key, newCookieVersion); 5465 5466 // We don't need the section_data_ids in Hyvä, but we store them for compatibility 5467 // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout 5468 hyva.setCookie( 5469 section_data_ids_key, 5470 JSON.stringify( 5471 Object.keys(data).reduce((sectionDataIds, sectionKey) => { 5472 sectionDataIds[sectionKey] = data[sectionKey]['data_id']; 5473 return sectionDataIds; 5474 }, {}) 5475 ), 5476 false, 5477 true 5478 ); 5479 } catch (error) { 5480 console.warn("Couldn't store privateContent", error); 5481 } 5482 } 5483 } 5484 ); 5485 } 5486 } 5487 //# sourceURL=hyva-private-content.js 5488</script>
vendor: 1 bytes, line 5488
5488
5489<script> 5490 (() => { 5491 document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); 5492 })() 5493</script>
vendor: 1 bytes, line 5493
5493
5494<script> 5495 (events => { 5496 const dispatchUserInteractionEvent = () => { 5497 events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) 5498 window.dispatchEvent(new Event('init-external-scripts')) 5499 }; 5500 events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) 5501 })(['touchstart', 'mousemove', 'wheel', 'scroll', 'keydown']); 5502 //# sourceURL=hyva-init-external-scripts.js 5503</script>
5503 5504<div id=wa-button></div>
5505<script> 5506 (function () { 5507 const modals = []; 5508 const excludedFromFocusTrapping = new Set(); 5509 5510 function trapFocusInNextModalWithOverlay() { 5511 for (let idx = modals.length -1; idx >= 0; idx--) { 5512 const nextOnStack = modals[idx]; 5513 const nextDialogElement = nextOnStack.instance.$refs[nextOnStack.name]; 5514 if (! isOverlayDisabled(nextDialogElement)) { 5515 hyva.trapFocus(nextDialogElement); 5516 break; 5517 } 5518 } 5519 } 5520 5521 function focusables(dialogElement) { 5522 const selector = 'button, [href], input, textarea, select, details, [tabindex]:not([tabindex="-1"])'; 5523 return Array.from(dialogElement.querySelectorAll(selector)) 5524 .filter(el => !el.hasAttribute('disabled')); 5525 } 5526 5527 function firstVisible(elements) { 5528 const a = Array.from(elements); 5529 for (let i = 0; i < a.length; i++) { 5530 if (a[i].offsetWidth || a[i].offsetHeight || a[i].getClientRects().length) return a[i]; 5531 } 5532 return null; 5533 } 5534 5535 function isInViewport(element) { 5536 const rect = element && element.getBoundingClientRect(); 5537 return rect && 5538 rect.top >= 0 && 5539 rect.left >= 0 && 5540 rect.right <= window.innerWidth && 5541 rect.bottom <= window.innerHeight; 5542 } 5543 5544 function setFocusAfterTransition(dialogElement, duration) { 5545 const nested = Array.from(dialogElement.querySelectorAll('[role="dialog"]')); 5546 const candidates = Array.from(dialogElement.querySelectorAll('[x-focus-first]')); 5547 next: for (let candidate of candidates) { 5548 for (let child of nested) { 5549 if (child.contains(candidate)) continue next; 5550 } 5551 setTimeout(() => candidate.focus(), 50); 5552 break; 5553 } 5554 window.setTimeout(() => { 5555 const focusElement = firstVisible(dialogElement.querySelectorAll('[x-focus-first]')) || 5556 focusables(dialogElement)[0] || 5557 null; 5558 focusElement && isInViewport(focusElement) && focusElement.focus(); 5559 }, Math.max(1, duration)); 5560 } 5561 5562 function determineTrigger($refs, dialog, trigger) { 5563 if (typeof trigger === 'undefined' && typeof dialog === 'object' && dialog.target instanceof HTMLElement) { 5564 return dialog.target; 5565 } 5566 if (typeof dialog === 'string' && typeof trigger === 'object' && trigger.target instanceof HTMLElement) { 5567 return trigger.target; 5568 } 5569 if (typeof trigger === 'string') { 5570 try { 5571 return $refs[trigger] || document.querySelector(trigger) 5572 } catch (e) {} 5573 } 5574 if (trigger instanceof Element) { 5575 return trigger; 5576 } 5577 5578 return null; 5579 } 5580 5581 function isOverlayDisabled(dialog) { 5582 return dialog && dialog.hasAttribute('x-no-overlay') 5583 } 5584 5585 function areRemainingModalsWithoutOverlay(modals) 5586 { 5587 const overflowDisabled = modals.map(modal => modal.instance.$refs[modal.name]).filter(isOverlayDisabled); 5588 5589 return overflowDisabled.length === modals.length; 5590 } 5591 5592 window.hyva.modal = function(options = {}) { 5593 if (this.$el && this.$el.dataset && this.$el.dataset.options) { 5594 try { 5595 options = Object.assign(options, JSON.parse(this.$el.dataset.options || '{}')); 5596 } catch (e) { 5597 throw new Error('Cannot read the dialog options from the data-options attribute: not valid JSON'); 5598 } 5599 } 5600 5601 const config = Object.assign({ 5602 dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300', 5603 transitionEnterStart: 'opacity-0', 5604 transitionEnterEnd: 'opacity-100', 5605 transitionLeave: 'transition ease-in duration-300', 5606 transitionLeaveStart: 'opacity-100', 5607 transitionLeaveEnd: 'opacity-0', 5608 }, options); 5609 let lastHide = 0; 5610 5611 return { 5612 opened: {}, 5613 show(dialog, trigger) { 5614 const focusTargetAfterHide = determineTrigger(this.$refs, dialog, trigger); 5615 const name = typeof dialog === 'string' ? dialog : config.dialog; 5616 const dialogElement = this.$refs[name]; 5617 if (! dialogElement) { 5618 return; 5619 } 5620 const useOverlay = ! dialogElement.hasAttribute('x-no-overlay'); 5621 5622 dialogElement.scrollTop = 0; 5623 5624 if (this.opened[name]) { 5625 return; 5626 } 5627 5628 if (focusTargetAfterHide) { 5629 focusTargetAfterHide.setAttribute('aria-expanded', 'true'); 5630 } 5631 5632 this.opened[name] = true; 5633 useOverlay && this.$nextTick(() => hyva.trapFocus(dialogElement)); 5634 setFocusAfterTransition(dialogElement, config.duration); 5635 5636 const frame = {name, instance: this, focusTarget: focu
5636sTargetAfterHide, time: Date.now()}; 5637 5638 modals.push(frame); 5639 if (useOverlay) { 5640 document.body.classList.add('overflow-hidden'); 5641 } 5642 return new Promise(resolve => frame.resolve = resolve); 5643 }, 5644 cancel() { 5645 this.hide(false); 5646 }, 5647 ok() { 5648 this.hide(true); 5649 }, 5650 hide(value) { 5651 if (Date.now() - lastHide < config.duration) { 5652 return; 5653 } 5654 lastHide = Date.now(); 5655 5656 const modal = modals.pop() || {}; 5657 if (! modal.instance) { 5658 return; 5659 } 5660 5661 const name = modal.name; 5662 this.opened[name] = false; 5663 hyva.releaseFocus(modal.instance.$refs[modal.name]) 5664 trapFocusInNextModalWithOverlay(); 5665 5666 const nextFocusAfterHide = modal.focusTarget; 5667 nextFocusAfterHide && setTimeout(() => { 5668 nextFocusAfterHide.setAttribute('aria-expanded', 'false'); 5669 nextFocusAfterHide.focus() 5670 }, config.duration); 5671 5672 if (modals.length === 0 || areRemainingModalsWithoutOverlay(modals)) { 5673 document.body.classList.remove('overflow-hidden'); 5674 } 5675 5676 modal.resolve(value); 5677 }, 5678 overlay(dialog) { 5679 dialog = this.$el.dataset.dialogRefName || dialog; 5680 const name = typeof dialog === 'string' ? dialog : config.dialog; 5681 return { 5682 ['x-show']() { 5683 return this.opened[name] 5684 }, 5685 ['x-transition:enter']: config.transitionEnter, 5686 ['x-transition:enter-start']: config.transitionEnterStart, 5687 ['x-transition:enter-end']: config.transitionEnterEnd, 5688 ['x-transition:leave']: config.transitionLeave, 5689 ['x-transition:leave-start']: config.transitionLeaveStart, 5690 ['x-transition:leave-end']: config.transitionLeaveEnd, 5691 ['@hyva-modal-show.window'](event) { 5692 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide) 5693 } 5694 }; 5695 }, 5696 showDialogOnInit() { 5697 const parent = this.$el.closest('[data-dialog-ref-name]'); 5698 if (parent && parent.dataset.dialogRefName) { 5699 this.$dispatch('hyva-modal-show', {dialog: parent.dataset.dialogRefName}) 5700 } 5701 } 5702 }; 5703 } 5704 5705 window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length -1] 5706 5707 window.hyva.modal.pop = function () { 5708 if (modals.length > 0) { 5709 const modal = modals[modals.length -1]; 5710 modal.instance.hide(); 5711 } 5712 } 5713 5714 window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) { 5715 typeof selectors === 'string' || selectors instanceof String 5716 ? excludedFromFocusTrapping.add(selectors) 5717 : selectors.map(selector => excludedFromFocusTrapping.add(selector)); 5718 } 5719 5720 window.hyva.modal.eventListeners = { 5721 keydown: event => { 5722 if (event.key === 'Escape') { 5723 window.hyva.modal.pop(); 5724 } 5725 }, 5726 click: event => { 5727 if (modals.length > 0) { 5728 const modal = modals[modals.length -1]; 5729 const dialog = modal.instance.$refs[modal.name]; 5730 if (modal.time + 50 < Date.now() && // if last click processing is more than 50ms ago 5731 ! isOverlayDisabled(dialog) && // if dialog has overlay 5732 ! dialog.contains(event.target)) { // if click is outside of dialog 5733 modal.instance.hide(); 5734 } 5735 } 5736 } 5737 }; 5738 5739 document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown); 5740 5741 document.addEventListener('click', window.hyva.modal.eventListeners.click); 5742 })(); 5743 window.addEventListener('alpine:init', () => { 5744 Alpine.data('hyvaModal', window.hyva.modal); 5745 }, {once: true}); 5746</script>
vendor: 1 bytes, line 5746
5746
5747<script> 5748 function initConfigurableOptions(productId, optionConfig) { 5749 5750 function findPathParam(key) { 5751 const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL; 5752 const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/'); 5753 const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3); 5754 for (let i = 0; i < pathParts.length; i += 2) { 5755 if (pathParts[i] === key && pathParts.length > i) { 5756 return pathParts[i + 1]; 5757 } 5758 } 5759 } 5760 5761 return { 5762 optionConfig, 5763 productId, 5764 itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'), 5765 allowedAttributeOptions: [], 5766 selectedValues: [], 5767 init() { 5768 this.findAllowedAttributeOptions(); 5769 this.$nextTick(() => { 5770 if (typeof this.optionConfig.defaultValues === 'object') { 5771 for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) { 5772 this.changeOption(attributeId, value + ''); 5773 } 5774 } 5775 this.preselectQuerystringItems(); 5776 this.preselectLocationHashItems(); 5777 }); 5778 }, 5779 productIndex: 0, 5780 productIndexForPrice: 0, 5781 optionIsActive(attributeId, optionId) { 5782 return !!this.getAllowedAttributeOptions(attributeId).find( 5783 option => option.id === optionId 5784 ) 5785 }, 5786 optionIsEnabled(attributeId, optionId) { 5787 for (const productId in this.optionConfig.index) { 5788 if (this.optionConfig.index[productId][attributeId] === optionId) { 5789 return true; 5790 } 5791 } 5792 return false; 5793 }, 5794 findSimpleIndex() { 5795 this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues); 5796 this.productIndexForPrice = this.findCheapestProductForPartialSelection(this.selectedValues); 5797 }, 5798 calculateSimpleIndexForPartialSelection(selectedValues) { 5799 if (selectedValues.length === 0) return 0; 5800 return this.findProductIdsForPartialSelection(selectedValues)[0]; 5801 }, 5802 calculateSimpleIndexForFullSelection(selectedValues) { 5803 if (! this.isFullSelection(selectedValues)) return false; 5804 5805 const productIndexes = this.optionConfig.index; 5806 return Object.keys(productIndexes).find(productIndex => { 5807 const productCandidateOptions = productIndexes[productIndex]; 5808 5809 for (const productOption in productCandidateOptions) { 5810 if ( 5811 !selectedValues[productOption] || 5812 selectedValues[productOption] !== productCandidateOptions[productOption] 5813 ) { 5814 return false; 5815 } 5816 } 5817 return productIndex; 5818 }); 5819 }, 5820 findAllowedAttributeOptions() { 5821 this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues); 5822 }, 5823 calculateAllowedAttributeOptions(selectedValues) { 5824 const allAttributes = this.optionConfig.attributes; 5825 const allAttributesSorted = Object.values(allAttributes).sort((a,b) => { 5826 return a.position - b.position 5827 }); 5828 5829 const newAllowedAttributeOptions = []; 5830 5831 allAttributesSorted.forEach(attribute => { 5832 const selectionWithoutAttr = Object.assign({}, this.removeAttrFromSelection(selectedValues, attribute.id)); 5833 const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr); 5834 newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => { 5835 return !!option.products.find(product => { 5836 return availableIndexes.includes(product); 5837 }) 5838 }); 5839 }); 5840 return newAllowedAttributeOptions; 5841 }, 5842 calculateAvailableProductIndexes(selectedOptions) { 5843 if (Object.keys(selectedOptions).length === 0) { 5844 if (Object.values(this.optionConfig.salable || {}).length) { 5845 return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i) 5846 } 5847 return Object.keys(this.optionConfig.index); 5848 } 5849 5850 const selectedIds = Object.keys(selectedOptions); 5851 if (Object.values(this.optionConfig.salable || {}).length) { 5852 const selectedOptionIndexes = selectedIds.map(attrId => { 5853 const optionValue = selectedOptions[attrId]; 5854 return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || [] 5855 }) 5856 return selectedOptionIndexes.reduce((acc, optionIndexes) => { 5857 return acc.filter(index => optionIndexes.includes(index)); 5858 }); 5859 } else { 5860 const productIndexes = this.optionConfig.index; 5861 return Object.keys(productIndexes).filter(index => { 5862 for (const attrId of selectedIds) { 5863 if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false 5864 } 5865 return true 5866 }); 5867 } 5868 }, 5869 findAttributeByOptionId(optionId) { 5870 for (const attributeId in this.optionConfig.attributes) { 5871 const attributeOptions = this.optionConfig.attributes[attributeId].options || []; 5872 if (attributeOptions.find(option => option.id === optionId)) { 5873 return attributeId; 5874 } 5875 } 5876 }, 5877 getAllowedAttributeOptions(attributeId) { 5878 return this.allowedAttributeOptions[attributeId] || [] 5879 }, 5880 getAllAttributeOptions(attributeId) { 5881 return ( 5882 this.optionConfig.attributes[attributeId] && 5883 this.optionConfig.attributes[attributeId].options 5884 ) || [] 5885 }, 5886 getProductIdsForOption(option) { 5887 const attributeId = this.findAttributeByOptionId(option.id); 5888 const allOptions = this.optionConfig.attributes[attributeId]; 5889 const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id); 5890 return opt && opt.products 5891 ? opt.products 5892 : []; 5893 }, 5894 findProductIdsForPartialSelection(optionSelection) { 5895 const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => { 5896 const newCandidates = this.getProductIdsForOption({id: optionId}); 5897 return candidates === null 5898 ? newCandidates 5899 : candidates.filter(productId => newCandidates.includes(productId)); 5900 }, null); 5901 return candidateProducts || []; 5902 },
5903 findCheapestProductForPartialSelection(optionSelection) { 5904 const candidateProducts = this.findProductIdsForPartialSelection(optionSelection); 5905 return candidateProducts.reduce((cheapest, simpleIdx) => { 5906 // in the first iteration we start with simpleIdx as the currently cheapest product 5907 if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx; 5908 const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount; 5909 return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount 5910 ? simpleIdx 5911 : cheapest; 5912 }, 0) 5913 }, 5914 findProductIdToUseForOptionPrice(option) { 5915 // try to find a product for a complete selection 5916 const attributeId = this.findAttributeByOptionId(option.id); 5917 const optionSelection = Object.assign({}, this.selectedValues, {[attributeId]: option.id}); 5918 const matchingSimpleIndex = this.calculateSimpleIndexForFullSelection(optionSelection); 5919 // if there is no complete selection, use the cheapest product for the option 5920 return matchingSimpleIndex || this.findCheapestProductForPartialSelection(optionSelection); 5921 }, 5922 getAttributeOptionLabel(option) { 5923 const optionProduct = this.findProductIdToUseForOptionPrice(option); 5924 5925 if ((! optionProduct) || (optionProduct === this.productIndexForPrice)) { 5926 return option.label; 5927 } 5928 5929 const currentPrice = this.getOptionPriceAdjustmentBasePrice(); 5930 5931 if (this.optionConfig.optionPrices[optionProduct]) { 5932 const optionPrice = this.optionConfig.optionPrices[optionProduct].finalPrice.amount; 5933 if (optionPrice !== currentPrice){ 5934 return option.label + ' ' + hyva.formatPrice(optionPrice - currentPrice, true); 5935 } 5936 } 5937 return option.label; 5938 }, 5939 getOptionPriceAdjustmentBasePrice() { 5940 if (this.optionConfig.optionPrices[this.productIndexForPrice]) { 5941 return this.optionConfig.optionPrices[this.productIndexForPrice].finalPrice.amount 5942 } 5943 return this.optionConfig.prices.finalPrice.amount; // default price if no option selection 5944 }, 5945 clearOptionIfActive(optionId, value) { 5946 if (this.selectedValues[optionId] === value) { 5947 this.blurLabel() 5948 this.changeOption(optionId, '') 5949 } 5950 }, 5951 removeAttrFromSelection(selectedValues, attributeId) { 5952 attributeId = parseInt(attributeId); 5953 return selectedValues.reduce((newSelection, val, attr) => { 5954 if (attr !== attributeId) { 5955 newSelection[attr] = val; 5956 } 5957 return newSelection; 5958 }, []); 5959 }, 5960 changeOption(attributeId, value) { 5961 if (value === '') { 5962 this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId) 5963 } else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) { 5964 this.selectedValues[attributeId] = value; 5965 } 5966 this.findSimpleIndex(); 5967 this.findAllowedAttributeOptions(); 5968 this.updatePrices(); 5969 this.updateGallery(); 5970 5971 const candidates = this.findProductIdsForPartialSelection(this.selectedValues); 5972 5973 window.dispatchEvent( 5974 new CustomEvent( 5975 'configurable-selection-changed', 5976 { 5977 detail: { 5978 productId: this.productId, 5979 optionId: attributeId, 5980 value: value, 5981 productIndex: this.productIndex, 5982 selectedValues: this.selectedValues, 5983 candidates: candidates, 5984 skuCandidates: Object.values(candidates).map(id =>
5984 this.optionConfig.sku?.[id] ?? null).filter(Boolean), 5985 } 5986 } 5987 ) 5988 ); 5989 }, 5990 calculateIsMinimalPrice() { 5991 return ! this.isFullSelection(this.selectedValues); 5992 }, 5993 isFullSelection(selectedValues) { 5994 return Object.values(selectedValues).length === Object.keys(this.optionConfig.attributes).length; 5995 }, 5996 updatePrices() { 5997 const value = this.optionConfig.optionPrices[this.productIndexForPrice] || this.optionConfig.prices; 5998 window.dispatchEvent( 5999 new CustomEvent( 6000 "update-prices-" + this.productId, 6001 { 6002 detail: Object.assign( 6003 value, 6004 { isMinimalPrice: this.calculateIsMinimalPrice() } 6005 ) 6006 } 6007 ) 6008 ); 6009 }, 6010 updateGallery () { 6011 if (this.productIndex) { 6012 const images = this.optionConfig.images[this.productIndex]; 6013 images && window.dispatchEvent(new CustomEvent( 6014 "update-gallery", 6015 { detail: this.sortImagesByPosition(images) } 6016 )); 6017 } else { 6018 window.dispatchEvent(new Event("reset-gallery")); 6019 } 6020 }, 6021 sortImagesByPosition(images) { 6022 return images.sort((x, y) => { 6023 return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1) 6024 }); 6025 }, 6026 onGetCartData(data) { 6027 }, 6028 preselectCartItems(data) { 6029 // pre-select options based on cart data for current (quote) itemId 6030 const cart = data && data.cart; 6031 if (cart && cart.items) { 6032 const cartItem = cart.items.find((item) => { 6033 return ( 6034 item.item_id === this.itemId 6035 && item.product_id === this.productId 6036 ) 6037 }); 6038 if (cartItem && cartItem.options && cartItem.options.length) { 6039 cartItem.options.map(option => { 6040 this.changeOption(option.option_id, option.option_value); 6041 }) 6042 } 6043 } 6044 }, 6045 preselectQuerystringItems() { 6046 // pre-select option like ?size=167 6047 const urlQueryParams = new URLSearchParams(window.location.search.replace('?','')); 6048 this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code)); 6049 }, 6050 preselectLocationHashItems() { 6051 // pre-select option like #144=167 6052 const urlHashParams = new URLSearchParams(window.location.hash.replace('#','')); 6053 this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id)); 6054 }, 6055 preselectItemsBasedOnLocation(getLocationValue) { 6056 Object.values(this.optionConfig.attributes).map(attribute => { 6057 const v = getLocationValue(attribute); 6058 v && this.changeOption(attribute.id, v) 6059 }); 6060 } 6061 } 6062 } 6063</script>
vendor: 1 bytes, line 6063
6063
6064<script> 6065 function initSwatchOptions(swatchConfig) { 6066 return { 6067 swatchConfig, 6068 getAttributeSwatchData(attributeId) { 6069 const swatchConfig = Object.assign({}, this.swatchConfig[attributeId]); 6070 swatchConfig['details'] = JSON.parse(swatchConfig['additional_data']); 6071 6072 return swatchConfig; 6073 }, 6074 mapSwatchTypeNumberToTypeCode(typeNumber) { 6075 switch ("" + typeNumber) { 6076 case "1": 6077 return "color" 6078 case "2": 6079 return "image" 6080 case "3": 6081 return "empty" 6082 case "0": 6083 default: 6084 return "text" 6085 } 6086 }, 6087 getTypeOfFirstOption(attributeId) { 6088 for (const optionId in this.swatchConfig[attributeId]) { 6089 const option = this.swatchConfig[attributeId][optionId]; 6090 if (typeof option.type !== 'undefined') { 6091 return this.mapSwatchTypeNumberToTypeCode(option.type); 6092 } 6093 } 6094 }, 6095 getVisualSwatchType(attributeId, targetOptionId) { 6096 // If a type configuration is present for the given option id, use it 6097 const config = this.swatchConfig[attributeId]; 6098 if (config[targetOptionId] && typeof config[targetOptionId].type !== 'undefined') { 6099 return this.mapSwatchTypeNumberToTypeCode(config[targetOptionId].type); 6100 } 6101 6102 // Otherwise - if no config is present for the target option - use the type of the first option 6103 // with a type property from the attribute, thus assuming its the same type as the target option. 6104 // (This edge case condition can occur on single swatch products if some options are not salable) 6105 return this.getTypeOfFirstOption(attributeId); 6106 }, 6107 getSwatchType(attributeId, optionId) { 6108 // Deserialize the attribute details the first time they are used 6109 if (this.swatchConfig[attributeId] && ! this.swatchConfig[attributeId].details) { 6110 this.swatchConfig[attributeId] = this.getAttributeSwatchData(attributeId); 6111 } 6112 const type = this.swatchConfig[attributeId] && 6113 this.swatchConfig[attributeId].details && 6114 this.swatchConfig[attributeId].details.swatch_input_type || 6115 "empty"; 6116 return type === 'visual' ? this.getVisualSwatchType(attributeId, optionId) : type; 6117 }, 6118 isTextSwatch(attributeId, optionId) { 6119 return this.getSwatchType(attributeId, optionId) === 'text'; 6120 }, 6121 isVisualSwatch(attributeId, optionId) { 6122 const type = this.getSwatchType(attributeId, optionId); 6123 6124 return ['image', 'color'].includes(type); 6125 }, 6126 getSwatchBackgroundStyle(attributeId, optionId) { 6127 const config = this.getSwatchConfig(attributeId, optionId); 6128 const type = this.getSwatchType(attributeId, optionId); 6129 6130 if (type === "color") { 6131 return 'background-color:' + config.value; 6132 } else if (type === "image") { 6133 return "background: #fff url('" + config.value + "') no-repeat center"; 6134 } else { 6135 return ''; 6136 } 6137 }, 6138 getSwatchText(attributeId, optionId) { 6139 const config = this.getSwatchConfig(attributeId, optionId); 6140 return config.label || config.value || this.getOptionLabelFromOptionConfig(attributeId, optionId); 6141 }, 6142 getOptionLabelFromOptionConfig(attributeId, optionId) { 6143 // Fallback if no value is present in swatchConfig data 6144 // Reference issue https://gitlab.hyva.io/hyva-themes/magento2-default-theme/-/issues/190 6145 const option = this.getAllAttributeOptions(attributeId).filter(option => option.id === optionId); 6146 return option && option[0] && option[0].label ||''; 6147 }, 6148 getSwatchConfig(attributeId, optionId) { 6149 return this.swatchConfig[attributeId] && this.swatchConfig[attributeId][optionId] 6150 ? this.swatchConfig[attributeId][optionId] 6151 : false;
6152 }, 6153 activeTooltipItem: false, 6154 tooltipPositionElement: false, 6155 isTooltipVisible() { 6156 return this.activeTooltipItem && 6157 this.getSwatchConfig( 6158 this.activeTooltipItem.attribute, 6159 this.activeTooltipItem.item 6160 ); 6161 }, 6162 isFirstItemCol() { 6163 return this.activeTooltipItem.index === 0; 6164 }, 6165 getTooltipImageStyle(attributeId, optionId) { 6166 const config = this.getSwatchConfig(attributeId, optionId); 6167 const type = this.getSwatchType(attributeId, optionId); 6168 6169 if (type === "color") { 6170 return 'background-color:' + config.value + '; width: 110px; height: 90px;'; 6171 } else if (type === "image") { 6172 return "background: #ffffff url('" + config.thumb + 6173 "') center center no-repeat; width: 110px; height: 90px;"; 6174 } else { 6175 return 'display:none'; 6176 } 6177 }, 6178 getTooltipPosition() { 6179 return this.tooltipPositionElement ? 6180 `top: ${this.tooltipPositionElement.offsetTop}px;` + 6181 `left: ${ 6182 this.tooltipPositionElement.offsetLeft - ( 6183 this.tooltipPositionElement.closest('.snap') && 6184 this.tooltipPositionElement.closest('.snap').scrollLeft || 6185 0 6186 ) 6187 }px;` : '' 6188 }, 6189 getTooltipLabel() { 6190 return this.getSwatchConfig(this.activeTooltipItem.attribute, this.activeTooltipItem.item).label 6191 }, 6192 focusedLabel: false, 6193 focusLabel(optionId) { 6194 this.focusedLabel = optionId; 6195 }, 6196 blurLabel() { 6197 this.focusedLabel = false; 6198 } 6199 } 6200 } 6201</script>
6201 6202 6203<!-- Wrapping template -->
6204<script type="text/template" id="instant_wrapper_template"> 6205 {{#findAutocomplete}} 6206 <div id="algolia-autocomplete-container"></div> 6207 {{/findAutocomplete}} 6208 6209 <div id="algolia_instant_selector" 6210 class=" with-facets column main pdc"> 6211 <div class="row"> 6212 <div class="col-md-3" id="algolia-left-container"> 6213 <div id="refine-toggle" class="visible-xs visible-sm"> 6214 + Verbessern </div> 6215 <div class="hidden-xs hidden-sm" id="instant-search-facets-container"> 6216 <div id="clear-refinements"></div> 6217 <div id="current-refinements"></div> 6218 </div> 6219 </div> 6220 6221 <div class="col-md-9" id="algolia-right-container"> 6222 <div class="row"> 6223 <div class="col-md-12"> 6224 <div> 6225 {{#second_bar}} 6226 <div id="instant-search-bar"></div> 6227 {{/second_bar}} 6228 </div> 6229 </div> 6230 </div> 6231 <div class="row"> 6232 <div class="col-md-12"> 6233 <div itemscope itemtype="http://schema.org/ItemList" class="hits"> 6234 <div class="algolia-infos"> 6235 <div class="pull-left" id="algolia-stats"></div> 6236 <div class="pull-right"> 6237 <div class="sort-by-label pull-left"> 6238 SORTIEREN NACH 6239 </div> 6240 <div class="pull-left" id="algolia-sorts"></div> 6241 </div> 6242 <div class="algolia-clearfix"></div> 6243 </div> 6244 <div id="algolia-banner"></div> 6245 <div id="instant-empty-results-container"></div> 6246 <div id="instant-search-results-container" class="products list items product-items"></div> 6247 </div> 6248 </div> 6249 <div class="algolia-clearfix"></div> 6250 </div> 6251 6252 <div class="text-center"> 6253 <div id="instant-search-pagination-container"></div> 6254 </div> 6255 </div> 6256 </div> 6257 </div> 6258</script>
6258 6259
6260<script type="text/template" id="instant-hit-template"> 6261 <li class="item product product-item"> 6262 <div class="product-item-info" data-container="product-grid"> 6263 <a href="{{{url}}}" 6264 class="product photo product-item-photo result" 6265 data-objectid="{{objectID}}" 6266 data-indexname="{{__indexName}}" 6267 data-position="{{__position}}" 6268 data-queryid="{{__queryID}}" 6269 tabindex="-1" 6270 > 6271 <span class="product-image-container" style="width: 276px;"> 6272 <span class="product-image-wrapper" style="padding-bottom: 125%;"> 6273 <picture> 6274 <source type="image/png" srcset="{{{image_url}}}"> 6275 <img class="product-image-photo" src="{{{image_url}}}" loading="lazy" width="276" height="345" alt="{{{name}}}" decoding="async"> 6276 </picture> 6277 </span> 6278 </span> 6279 </a> 6280 6281 <div class="product details product-item-details"> 6282 <div class="top-details"> 6283 <strong class="product name product-item-name"> 6284 <a class="product-item-link" href="{{{url}}}"> 6285 {{{ _highlightResult.name.value }}} 6286 </a> 6287 </strong> 6288 <div class="details-wrapper"> 6289 <div class="brand"> 6290 <span>{{{manufacturer}}}</span> 6291 </div> 6292 6293 <div class="sizes-wrapper"> 6294 <div class="product-sizes"> 6295 {{#product_sizes}} 6296 <span>{{.}}</span> 6297 {{/product_sizes}} 6298 </div> 6299 </div> 6300 <div class="price-discount"> 6301 {{#discount_percent}} 6302 <span>- {{discount_percent}} %</span> 6303 {{/discount_percent}} 6304 </div> 6305 <div class="price-uvp"> 6306 {{#uvp_price}} 6307 <span>{{uvp_price}}</span> 6308 {{/uvp_price}} 6309 </div> 6310 <div class="price-final"> 6311 {{#final_price}} 6312 <span>{{final_price}}</span> 6313 {{/final_price}} 6314 </div> 6315 </div> 6316 </div> 6317 <div class="actions"> 6318 <a href="{{{url}}}" class="action primary">Jetzt Gestalten</a> 6319 </div> 6320 </div> 6321 6322 {{#shirtplatform_id}} 6323 <div class="product-colors"> 6324 <div class="colors-wrapper"> 6325 {{#availableColors}} 6326 <ul> 6327 {{#colors}} 6328 <li> 6329 <a href="{{productUrl}}?colorId={{options}}" rel="nofollow" class="product-color" style="background: {{value}}; width: 24px; height: 24px;"></a> 6330 </li> 6331 {{#showExpandControl}} 6332 <li class="expand-control"> 6333 <a href="#" class="expand-colors"> 6334 <span class="count">+{{remainingColorsCount}}</span> 6335 </a> 6336 </li> 6337 {{/showExpandControl}} 6338 {{/colors}} 6339 </ul> 6340 {{/availableColors}} 6341 </div> 6342 </div> 6343 {{/shirtplatform_id}} 6344 6345 {{#brand_logo_url}} 6346 <div class="brand-logo"> 6347 <picture> 6348 <source type="image/png" srcset="{{{brand_logo_url}}}"> 6349 <img src="{{{brand_logo_url}}}" alt="{{{manufacturer}}}" width="72" loading="lazy"> 6350 </picture> 6351 </div> 6352 {{/brand_logo_url}} 6353 6354 <div class="product-attributes"> 6355 {{#usp_1}} 6356 <div class="attribute-item">{{{usp_1}}}</div> 6357 {{/usp_1}} 6358 {{#usp_2}} 6359 <div class="attribute-item">{{{usp_2}}}</div> 6360 {{/usp_2}} 6361 </div> 6362 </div> 6363 </li> 6364</script>
vendor: 1 bytes, line 6364
6364
6365<script type="text/template" id="instant-stats-template"> 6366 {{#hasOneResult}}<strong>1</strong> Ergebnis found{{/hasOneResult}} 6367 6368 {{#hasManyResults}} 6369 {{^hasNoResults}}{{first}}-{{last}} von{{/hasNoResults}} 6370 <strong> 6371 <span itemprop="numberOfItems">{{nbHits}}</span> 6372 Ergebnisse gefunden </strong> 6373 {{/hasManyResults}} 6374 6375 {{^hasNoResults}} 6376 in {{seconds}} Sekunden {{/hasNoResults}} 6377</script>
vendor: 1 bytes, line 6377
6377
6378<script type="text/template" id="refinements-lists-item-template"> 6379 <label class="{{cssClasses.label}} {{#isRefined}}checked{{/isRefined}}"> 6380 <input class="{{cssClasses.checkbox}}" {{#isRefined}}checked{{/isRefined}} type="checkbox" value="{{value}}" /> 6381 {{label}} 6382 <span class="{{cssClasses.count}}">{{count}}</span> 6383 </label> 6384</script>
vendor: 1 bytes, line 6384
6384
6385<script type="text/json" id="default-section-data"> 6386 {"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"cart":[],"directory-data":{"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":"Vorarlberg"},"95":{"code":"WI","name":"Wien"}}},"BE":{"name":"Belgien","regions":{"577":{"code":"VAN","name":"Antwerpen"},"578":{"code":"WBR","name":"Brabant wallon"},"579":{"code":"BRU","name":"Brussels-Capital Region"},"580":{"code":"WHT","name":"Hainaut"},"582":{"code":"WLG","name":"Li\u00e8ge"},"581":{"code":"VLI","name":"Limburg"},"583":{"code":"WLX","name":"Luxembourg"},"584":{"code":"WNA","name":"Namur"},"585":{"code":"VOV","name":"Oost-Vlaanderen"},"586":{"code":"VBR","name":"Vlaams-Brabant"},"587":{"code":"VWV","name":"West-Vlaanderen"}}},"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"}}},"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":{"908":{"code":"DK-84","name":"Hovedstaden"},"909":{"code":"DK-82","name":"Midtjylland"},"910":{"code":"DK-81","name":"Nordjylland"},"911":{"code":"DK-85","name":"Sj\u00e6lland"},"912":{"code":"DK-83","name":"Syddanmark"}}},"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"}
6386,"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":"1","name":"Ain"},"183":{"code":"2","name":"Aisne"},"184":{"code":"3","name":"Allier"},"185":{"code":"4","name":"Alpes-de-Haute-Provence"},"187":{"code":"6","name":"Alpes-Maritimes"},"188":{"code":"7","name":"Ard\u00e8che"},"189":{"code":"8","name":"Ardennes"},"190":{"code":"9","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":"5","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"}
6386,"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":{"950":{"code":"GR-69","name":"\u00c1gion \u00d3ros"},"937":{"code":"GR-A","name":"Anatolik\u00ed Makedon\u00eda kai Thr\u00e1ki"},"938":{"code":"GR-I","name":"Attik\u00ed"},"939":{"code":"GR-G","name":"Dytik\u00ed Ell\u00e1da"},"940":{"code":"GR-C","name":"Dytik\u00ed Makedon\u00eda"},"941":{"code":"GR-F","name":"Ion\u00eda N\u00edsia"},"942":{"code":"GR-D","name":"\u00cdpeiros"},"943":{"code":"GR-B","name":"Kentrik\u00ed Makedon\u00eda"},"944":{"code":"GR-M","name":"Kr\u00edti"},"945":{"code":"GR-L","name":"N\u00f3tio Aiga\u00edo"},"946":{"code":"GR-J","name":"Pelop\u00f3nnisos"},"947":{"code":"GR-H","name":"Stere\u00e1 Ell\u00e1da"},"948":{"code":"GR-E","name":"Thessal\u00eda"},"949":{"code":"GR-K","name":"V\u00f3reio Aiga\u00edo"}}},"HR":{"name":"Kroatien","regions":{"518":{"code":"HR-07","name":"Bjelovarsko-bilogorska \u017eupanija"},"523":{"code":"HR-12","name":"Brodsko-posavska \u017eupanija"},"530":{"code":"HR-19","name":"Dubrova\u010dko-neretvanska \u017eupanija"},"532":{"code":"HR-21","name":"Grad Zagreb"},"529":{"code":"HR-18","name":"Istarska \u017eupanija"},"515":{"code":"HR-04","name":"Karlova\u010dka \u017eupanija"},"517":{"code":"HR-06","name":"Koprivni\u010dko-kri\u017eeva\u010dka \u017eupanija"},"513":{"code":"HR-02","name":"Krapinsko-zagorska \u017eupanija"},"520":{"code":"HR-09","name":"Li\u010dko-senjska \u017eupanija"},"531":{"code":"HR-20","name":"Me\u0111imurska \u017eupanija"},"525":{"code":"HR-14","name":"Osje\u010dko-baranjska \u017eupanija"},"522":{"code":"HR-11","name":"Po\u017ee\u0161ko-slavonska \u017eupanija"},"519":{"code":"HR-08","name":"Primorsko-goranska \u017eupanija"},"526":{"code":"HR-15","name":"\u0160ibensko-kninska \u017eupanija"},"514":{"code":"HR-03","name":"Sisa\u010dko-moslava\u010dka \u017eupanija"},"528":{"code":"HR-17","name":"Splitsko-dalmatinska \u017eupanija"},"516":{"code":"HR-05","name":"Vara\u017edinska \u017eupanija"},"521":{"code":"HR-10","name":"Viroviti\u010dko-podravska \u017eupanija"},"527":{"code":"HR-16","name":"Vukovarsko-srijemska \u017eupanija"},"524":{"code":"HR-13","name":"Zadarska \u017eupanija"},"512":{"code":"HR-01","name":"Zagreba\u010dka \u017eupanija"}}},"IT":{"name":"Italien","regions":{"654":{"code":"AG","name":"Agrigento"},"655":{"code":"AL","name":"Alessandria"},"656":{"code":"AN","name":"Ancona"},"657":{"code":"AO","name":"Aosta"},"659":{"code":"AR","name":"Arezzo"},"660":{"code":"AP","name":"Ascoli-Piceno"},"661":{"code":"AT","name":"Asti"},"662":{"code":"AV","name":"Avellino"},"663":{"code":"BA","name":"Bari"},"664":{"code":"BT","name":"Barletta-Andria-Trani"},"665":{"code":"BL","name":"Belluno"},"666":{"code":"BN","name":"Benevento"},"667":{"code":"BG","name":"Bergamo"},"668":{"code":"BI","name":"Biella"},"669":{"code":"BO","name":"Bologna"},"670":{"code":"BZ","name":"Bolzano"},"671":{"code":"BS","name":"Brescia"},"672":{"code":"BR","name":"Brindisi"},"673":{"code":"CA","name":"Cagliari"},"674":{"code":"CL","name":"Caltanissetta"},"675":{"code":"CB","name":"Campobasso"},"676":{"code":"CI","name":"Carbonia Iglesias"},"677":{"code":"CE","name":"Caserta"},"678":{"code":"CT","name":"Catania"},"679":{"code":"CZ","name":"Catanzaro"},"680":{"code":"CH","name":"Chieti"},"681":{"code":"CO","name":"Como"},"682":{"code":"CS","name":"Cosenza"},"683":{"code":"CR","name":"Cremona"},"684":{"code":"KR","name":"Crotone"},"685":{"code":"CN","name":"Cuneo"},"686":{"code":"EN","name":"Enna"},"687":{"code":"FM","name":"Fermo"},"688":{"code":"FE","name":"Ferrara"},"689":{"code":"FI","name":"Firenze"},"690":{"code":"FG","name":"Foggia"},"691":{"code":"FC","name":"Forli-Cesena"},"692":{"code":"FR","name":"Frosinone"},"693":{"code":"GE","name":"Genova"},"694":{"code":"GO","name":"Gorizia"},"695":{"code":"GR","name":"Grosseto"},"696":{"code":"IM","name":"Imperia"},"697":{"code":"IS","name":"Isernia"},"658":{"code":"AQ","name":"L'Aquila"},"698":{"code":"SP","name":"La-Spezia"},"699":{"code":"LT","name":"Latina"},"700":{"code":"LE","name":"Lecce"},"701":{"code":"LC","name":"Lecco"},"702":{"code":"LI","name":"Livorno"},"703":{"code":"LO","name":"Lodi"},"704":{"code":"LU","name":"Lucca"},"705":{"code":"MC","name":"Macerata"},"706":{"code":"MN","name":"Mantova"},"707":{"code":"MS","name":"Massa-Carrara"},"708":{"code":"MT","name":"Matera"},"709":{"code":"VS","name":"Medio Campidano"},"710":{"code":"ME","name":"Messina"},"711":{"code":"MI","name":"Milano"},"712":{"code":"MO","name":"Modena"},"713":{"code":"MB","name":"Monza-Brianza"},"714":{"code":"NA","name":"Napoli"},"715":{"code":"NO","name":"Novara"},"716":{"code":"NU","name":"Nuoro"},"717":{"code":"OG","name":"Ogliastra"},"718":{"code":"OT","name":"Olbia Tempio"},"719":{"code":"OR","name":"Oristano"},"720":{"code":"PD","name":"Padova"},"721":{"code":"PA","name":"Palermo"},"722":{"code":"PR","name":"Parma"},"723":{"code":"PV","name":"Pavia"},"724":{"code":"PG","name":"Perugia"},"725":{"code":"PU","name":"Pesaro-Urbino"},"726":{"code":"PE","name":"Pescara"},"727":{"code":"PC","name":"Piacenza"},"728":{"code":"PI","name":"Pisa"},"729":{"code":"PT","name":"Pistoia"},"730":{"code":"PN","name":"Pordenone"},"731":{"code":"PZ","name":"Potenza"},"732":{"code":"PO","name":"Prato"},"733":{"code":"RG","name":"Ragusa"},"734":{"code":"RA","name":"Ravenna"},"735":{"code":"RC","name":"Reggio-Calabria"},"736":{"code":"RE","name":"Reggio-Emilia"},"737":{"code":"RI","name":"Rieti"},"738":{"code":"RN","name":"Rimini"},"739":{"code":"RM","name":"Roma"},"740":{"code":"RO","name":"Rovigo"},"741":{"code":"SA","name":"Salerno"},"742":{"code":"SS","name":"Sassari"},"743":{"code":"SV","name":"Savona"},"744":{"code":"SI","name":"Siena"},"745":{"code":"SR","name":"Siracusa"},"746":{"code":"SO","name":"Sondrio"},"747":{"code":"TA","name":"Taranto"},"748":{"code":"TE","name":"Teramo"},"749":{"code":"TR","name":"Terni"},"750":{"code":"TO","name":"Torino"},"751":{"code":"TP","name":"Trapani"},"752":{"code":"TN","name":"Trento"},"753":{"code":"TV","name":"Treviso"},"754":{"code":"TS","name":"Trieste"},"755":{"code":"UD","name":"Udine"},"756":{"code":"VA","name":"Varese"},"757":{"code":"VE","name":"Venezia"},"758":{"code":"VB","name":"Verbania"},"759":{"code":"VC","name":"Vercelli"},"760":{"code":"VR","name":"Verona"}
6386,"761":{"code":"VV","name":"Vibo-Valentia"},"762":{"code":"VI","name":"Vicenza"},"763":{"code":"VT","name":"Viterbo"}}},"LU":{"name":"Luxemburg"},"NL":{"name":"Niederlande"},"PT":{"name":"Portugal","regions":{"1013":{"code":"PT-01","name":"Aveiro"},"1014":{"code":"PT-02","name":"Beja"},"1015":{"code":"PT-03","name":"Braga"},"1016":{"code":"PT-04","name":"Bragan\u00e7a"},"1017":{"code":"PT-05","name":"Castelo Branco"},"1018":{"code":"PT-06","name":"Coimbra"},"1019":{"code":"PT-07","name":"\u00c9vora"},"1020":{"code":"PT-08","name":"Faro"},"1021":{"code":"PT-09","name":"Guarda"},"1022":{"code":"PT-10","name":"Leiria"},"1023":{"code":"PT-11","name":"Lisboa"},"1024":{"code":"PT-12","name":"Portalegre"},"1025":{"code":"PT-13","name":"Porto"},"1032":{"code":"PT-30","name":"Regi\u00e3o Aut\u00f3noma da Madeira"},"1031":{"code":"PT-20","name":"Regi\u00e3o Aut\u00f3noma dos A\u00e7ores"},"1026":{"code":"PT-14","name":"Santar\u00e9m"},"1027":{"code":"PT-15","name":"Set\u00fabal"},"1028":{"code":"PT-16","name":"Viana do Castelo"},"1029":{"code":"PT-17","name":"Vila Real"},"1030":{"code":"PT-18","name":"Viseu"}}},"SE":{"name":"Schweden","regions":{"1043":{"code":"SE-K","name":"Blekinge l\u00e4n"},"1044":{"code":"SE-W","name":"Dalarnas l\u00e4n"},"1046":{"code":"SE-X","name":"G\u00e4vleborgs l\u00e4n"},"1045":{"code":"SE-I","name":"Gotlands l\u00e4n"},"1047":{"code":"SE-N","name":"Hallands l\u00e4n"},"1048":{"code":"SE-Z","name":"J\u00e4mtlands l\u00e4n"},"1049":{"code":"SE-F","name":"J\u00f6nk\u00f6pings l\u00e4n"},"1050":{"code":"SE-H","name":"Kalmar l\u00e4n"},"1051":{"code":"SE-G","name":"Kronobergs l\u00e4n"},"1052":{"code":"SE-BD","name":"Norrbottens l\u00e4n"},"1062":{"code":"SE-T","name":"\u00d6rebro l\u00e4n"},"1063":{"code":"SE-E","name":"\u00d6sterg\u00f6tlands l\u00e4n"},"1053":{"code":"SE-M","name":"Sk\u00e5ne l\u00e4n"},"1055":{"code":"SE-D","name":"S\u00f6dermanlands l\u00e4n"},"1054":{"code":"SE-AB","name":"Stockholms l\u00e4n"},"1056":{"code":"SE-C","name":"Uppsala l\u00e4n"},"1057":{"code":"SE-S","name":"V\u00e4rmlands l\u00e4n"},"1058":{"code":"SE-AC","name":"V\u00e4sterbottens l\u00e4n"},"1059":{"code":"SE-Y","name":"V\u00e4sternorrlands l\u00e4n"},"1060":{"code":"SE-U","name":"V\u00e4stmanlands l\u00e4n"},"1061":{"code":"SE-O","name":"V\u00e4stra G\u00f6talands l\u00e4n"}}},"SK":{"name":"Slowakei"},"data_id":1790986879},"captcha":[],"instant-purchase":[],"loggedAsCustomer":[],"persistent":[],"review":[],"payments":[],"wishlist":{"items":[]},"amfacebook-pixel":[],"hyva_checkout":[],"wp_ga4":[],"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[],"paypal-buyer-country":[],"magepal-gtm-jsdatalayer":[]}</script>
6386 6387</div>
6387<script> 6388 require(['jquery','weltpixel_ga4_persistentLayer','weltpixel_ga4_gtm', 'Magento_Customer/js/customer-data'], 6389 function ($, wpGa4PersDl ,wpGa4gtm, customerData) { 6390 $( document ).ajaxComplete(function( event, xhr, settings ) { 6391 if (settings.url.search('/customer\/section\/load/') > 0) { 6392 var response = xhr.responseJSON; 6393 if (response.wp_ga4) { 6394 var dataLayerData = $.parseJSON(response.wp_ga4.datalayer); 6395 for (index in dataLayerData) { 6396 window.dataLayer.push({ecommerce: null}); 6397 window.dataLayer.push(dataLayerData[index]); 6398 } 6399 } 6400 } 6401 }); 6402 var wpPersDlOptions = {'storageExpiryTime' : 30 }; 6403 var wpGtmOptions = { 6404 'enabled' : 0, 6405 'persDataLayer' : wpGa4PersDl 6406 }; 6407 wpGa4PersDl.init(wpPersDlOptions); 6408 wpGa4gtm.trackPromotion(wpGtmOptions); 6409 }); 6410 </script>
vendor: 1 bytes, line 6410
6410
6411<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a447c939dcfcf97d',t:'MTc5MDk4Njg3OQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
6411</body> 6412</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.