1<!doctype html> 2<html lang="nl"> 3<head > 4 <meta charset="utf-8"/> 5<meta name="title" content="Goedkope Voetbalshirts - Voetbalshirtskoning.nl"/> 6<meta name="description" content="VoetbalshirtsKoning - Het Betaalbare Alternatief âKids en Senior âVoor 22u besteld, morgen thuis âBarcelona, Real Madrid, Ajax en meer!"/> 7<meta name="robots" content="INDEX,FOLLOW"/> 8<meta name="viewport" content="width=device-width, initial-scale=1"/> 9<title>Goedkope Voetbalshirts - Voetbalshirtskoning.nl</title> 10 <link rel="stylesheet" type="text/css" media="all" href="https://www.voetbalshirtskoning.nl/static/version20261002143139/frontend/Vendic/voetbalshirtskoning/nl_NL/Anowave_Ec/css/ec.css" /> 11<link rel="stylesheet" type="text/css" media="all" href="https://www.voetbalshirtskoning.nl/static/version20261002143139/frontend/Vendic/voetbalshirtskoning/nl_NL/css/styles.css" />
12<script type="text/javascript" src="https://www.voetbalshirtskoning.nl/static/version20261002143139/frontend/Vendic/voetbalshirtskoning/nl_NL/Bol_CheckoutViaBol/js/view/button.js"></script>
vendor: 1 bytes, line 12
12
13<script type="text/javascript" src="https://www.voetbalshirtskoning.nl/static/version20261002143139/frontend/Vendic/voetbalshirtskoning/nl_NL/Smile_ElasticsuiteTracker/js/tracking.js"></script>
13 14<link rel="canonical" href="https://www.voetbalshirtskoning.nl" /> 15<link rel="icon" type="image/x-icon" href="https://www.voetbalshirtskoning.nl/media/favicon/default/favicon.ico" /> 16<link rel="shortcut icon" type="image/x-icon" href="https://www.voetbalshirtskoning.nl/media/favicon/default/favicon.ico" /> 17<meta name="google-site-verification" content="_d9RdZPEmSQINGH98is3As9B6nqoX4aZXjL_Nkc4Kus"> 18<!--50d90768e93ab6bcbeecf5fa8a520642--> 19<meta name="msvalidate.01" content="61E1B93E916FAE8A20E7DBA6C8E5E362"> 20 21<!-- Varify.io® code for Voetbalshirtkoning-->
22<script> 23 window.varify = window.varify || {}; 24 window.varify.iid = 2414; 25</script>
vendor: 2 bytes, line 25
25
26<script src="https://app.varify.io/varify.js"></script>
26 27 <meta property="twitter:card" content="summary_large_image" /> 28<meta property="twitter:title" content="Goedkope Voetbalshirts - Voetbalshirtskoning.nl" /> 29<meta property="twitter:description" content="VoetbalshirtsKoning - Het Betaalbare Alternatief âKids en Senior âVoor 22u besteld, morgen thuis âBarcelona, Real Madrid, Ajax en meer!" /> 30<meta property="twitter:url" content="https://www.voetbalshirtskoning.nl/" /> 31 32<meta property="og:type" content="website" /> 33<meta property="og:title" content="Goedkope Voetbalshirts - Voetbalshirtskoning.nl" /> 34<meta property="og:description" content="VoetbalshirtsKoning - Het Betaalbare Alternatief âKids en Senior âVoor 22u besteld, morgen thuis âBarcelona, Real Madrid, Ajax en meer!" /> 35<meta property="og:url" content="https://www.voetbalshirtskoning.nl/" /> 36<meta property="og:locale" content="nl_NL" />
37<script data-ommit="true" nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M=">var AEC = (function(){return {add: function(context, dataLayer){let element = context, qty = 1, variants = [], variant = [], variant_attribute_option = [], items = [];document.querySelectorAll('input[name=qty]:checked, [name=qty]').forEach(element => {qty = element.value;});qty = Math.abs(qty);if (isNaN(qty)){qty = 1;}function closestForm(element) {while (element) {if (element.tagName === 'FORM') {return element;}element = element.parentElement;}return null;}const form = closestForm(context);if (form && typeof form.checkValidity === 'function') {if (!form.checkValidity()) {return true;}}if (!AEC.gtm()){if (element.dataset.click){AEC.Time.track(dataLayer, AEC.Const.TIMING_CATEGORY_ADD_TO_CART, element.dataset.name, element.dataset.category);(click => {new Function(click)();})(element.dataset.click);}return true;}if(element.dataset.configurable){document.querySelectorAll('[name^="super_attribute"]').forEach(attribute => {if (attribute.matches('select')){var name = attribute.getAttribute('name'), id = name.substring(name.indexOf('[') + 1, name.lastIndexOf(']'));if (attribute.selectedIndex){var option = attribute.options[attribute.selectedIndex];if (option){variants.push({id: id,option: option.label,text: option.text});}}}if (attribute.matches('input') && -1 != attribute.type.indexOf('radio')){if (attribute.parentNode.classList.contains('swatch-option-selected') || attribute.checked){Object.entries(AEC.SUPER).forEach(([key, super_attribute]) => {if (-1 != attribute.name.indexOf("super_attribute[" + super_attribute.id + "]")){let variant = {id: super_attribute.id,text:super_attribute.label,option: attribute.value};variants.push(variant);}});}}});/** * Colour Swatch support */if (!variants.length){Object.entries(AEC.SUPER).forEach(([key, attribute]) => {var swatch = document.querySelectorAll('div[attribute-code="' + attribute.code + '"], div[data-attribute-code="' + attribute.code + '"]');swatch.forEach(element => {let variant = {id: attribute.id,text:'',option: null};var select = element.querySelector('select');if (select){if (select.selectedIndex){var option = select.options[select.selectedIndex];if (option){variant.text = option.text;variant.option = option.value;}}}else {var span = element.querySelector('span.swatch-attribute-selected-option');if (span){variant.text = span.innerHTML;variant.option = span.parentNode.dataset.optionSelected;}}variants.push(variant);});});}if (!variants.length){AEC.EventDispatcher.trigger('ec.variants', variants);}var SUPER_SELECTED = [];for (var i = 0, l = variants.length; i < l; i++){for (var a = 0, b = AEC.SUPER.length; a < b; a++){if (AEC.SUPER[a].id == variants[i].id){var text = variants[i].text;if (AEC.useDefaultValues){AEC.SUPER[a].options.forEach(option => {if (parseInt(option.value_index) == parseInt(variants[i].option)){if (option.hasOwnProperty('admin_label')){text = option.admin_label;}else if (option.hasOwnProperty('store_label')){text = option.store_label;}}});}variant.push([AEC.SUPER[a].label,text].join(AEC.Const.VARIANT_DELIMITER_ATT));let tier_price = Number.parseFloat(element.dataset.price).toFixed(2);Object.entries(AEC.CONFIGURABLE_SIMPLES).forEach(([key, simple]) => { if (simple.hasOwnProperty('configurations')) { Object.entries(simple.configurations).forEach(([key, configuration]) => {if (configuration.label === variants[i].option){let prices = [];Object.entries(simple.price_tier).forEach(([key, tier]) => {if (parseInt(qty) >= parseInt(tier.price_qty)){prices.push(Number.parseFloat(tier.price));}});if (prices.length){tier_price = prices.sort(function(a,b) { return a < b; }).pop();}}}); }});variant_attribute_option.push({attribute: variants[i].id,option: variants[i].option,price:tier_price});}}}if (!variant.length){if (element.dataset.click){AEC.Time.track(dataLayer, AEC.Const.TIMING_CATEGORY_ADD_TO_CART, element.dataset.name, element.dataset.category);(click => {new Function(click)();})(element.dataset.click);}return true;}}if (element.dataset.grouped){for (var u = 0, y = window.G.length; u < y; u++){let field = document.querySelector('[name="super_group[' + window.G[u].id + ']"]');if (field){(qty => {if (qty){let item = {'item_name': window.G[u].item_name,'item_id': window.G[u].item_id,'price': window.G[u].price,'category': window.G[u].category,'item_brand':window.G[u].item_brand,'quantity': qty};Object.assign(item, item, AEC.GA4.transformCategories(element.dataset.category));items.push(item);}})(Math.abs(field.value));}}}else{let price = Number.parseFloat(element.dataset.price);if (element.dataset.hasOwnProperty('selection')){let selection = parseInt(element.dataset.selection);
37Object.entries(AEC.CONFIGURABLE_SIMPLES).forEach(([key, simple]) => {if (key == selection){if (simple.hasOwnProperty('price_tier')){Object.entries(simple.configurations).forEach(([key, configuration]) => {let prices = [];Object.entries(simple.price_tier).forEach(([key, tier]) => {if (parseInt(qty) >= parseInt(tier.price_qty)){prices.push(Number.parseFloat(tier.price));}});if (prices.length){price = prices.sort(function(a,b) { return a < b; }).pop();}});}}});}let item = {'item_name': element.dataset.name,'item_id': 1 === parseInt(element.dataset.useSimple) ? element.dataset.simpleId : element.dataset.id,'price': price,'item_brand':element.dataset.brand,'item_variant':variant.join(AEC.Const.VARIANT_DELIMITER),'variants':variants,'category':element.dataset.category,'quantity': qty,'currency':AEC.currencyCode,'google_business_vertical':element.dataset.googleBusinessVertical,'index': 0};Object.assign(item, item, AEC.GA4.transformCategories(element.dataset.category));items.push(item);}let value_combined = 0;for (var i = 0, l = items.length; i < l; i++){value_combined += (Number.parseFloat(items[i].price) * Number.parseInt(items[i].quantity));(function(item){Object.entries(AEC.parseJSON(element.dataset.attributes)).forEach(([key, value]) => {item[key] = value;});let options = [];Object.entries(AEC.parseJSON(element.dataset.options)).forEach(([key, name]) => {let option = document.querySelector('[name="options[' + key + ']"]'), value = null;if (!option){option = document.querySelector('[name="options[' + key + '][]"]');}switch(true){case option instanceof HTMLInputElement: case option instanceof HTMLTextAreaElement: value = option.value;break;case option instanceof HTMLSelectElement: value = option.options[option.selectedIndex].text;break;}if (value){options.push({ name: name, value: value });}});if (options.length){item['options'] = options;}})(items[i]);}var data = {'event':'add_to_cart','eventLabel': element.dataset.name,'ecommerce': {'currency': AEC.currencyCode,'value':value_combined,'item_list_id': element.dataset.list,'item_list_name': element.dataset.list,'items': items,'options': variant_attribute_option},'currentStore': element.dataset.store};if (AEC.useDefaultValues){data['currentStore'] = AEC.storeName;}/** * Notify listeners */this.EventDispatcher.trigger('ec.add.data', data);/** * Track event */AEC.CookieConsent.queue(() => {AEC.Cookie.add(data).push(dataLayer);/** * Track time */AEC.Time.track(dataLayer, AEC.Const.TIMING_CATEGORY_ADD_TO_CART, element.dataset.name, element.dataset.category);}).process();/** * Save backreference */if (AEC.localStorage){(function(items){for (var i = 0, l = items.length; i < l; i++){AEC.Storage.reference().set({id: items[i].item_id,category: items[i].category});}})(items);}if (AEC.facebook){if ("function" === typeof fbq){(function(product, items, fbq){var content_ids = [], price = 0;for (var i = 0, l = items.length; i < l; i++){content_ids.push(items[i].item_id);price += parseFloat(items[i].price);}(function(callback){if (AEC.Const.COOKIE_DIRECTIVE){AEC.CookieConsent.queue(callback).process();}else {callback.apply(window,[]);}})((function(product, content_ids, price){return function(){if ('undefined' === typeof variants){variants = [];}fbq('track', 'AddToCart', {content_name: product,content_ids: content_ids,content_type: !variants.length ? 'product' : 'product_group',value: price,currency: AEC.currencyCode}, { eventID: AEC.UUID.generate({ event: 'AddToCart'})});};})(product, content_ids, price));})(element.dataset.name, items, fbq);}}if (AEC.tiktok){if ('undefined' !== typeof ttq){(function(product, items, ttq){var contents = [], price = 0;for (var i = 0, l = items.length; i < l; i++){contents.push({content_id: items[i].item_id,content_name: items[i].item_name,quantity: items[i].quantity,brand: items[i].item_brand,price: items[i].price});price += parseFloat(items[i].price);}(function(callback){if (AEC.Const.COOKIE_DIRECTIVE){AEC.CookieConsent.queue(callback).process();}else {callback.apply(window,[]);}})((function(product, content_ids, price){return function(){AEC.TikTok.event('AddToCart', {contents: contents,content_type:'product',value: price,currency: AEC.currencyCode,}, { event_id: AEC.UUID.generate({ event: 'AddToCart'})});};})(product, contents, price));})(element.dataset.name, items, ttq);}}if (element.dataset.click){(click => {new Function(click)();})(element.dataset.click);}return true;},addSwatch: function(context,dataLayer){var element = context;if (window.jQuery) { jQuery(document).on('ajax:addToCart', function(){var attributes = [];
37Object.entries(AEC.parseJSON(element.dataset.swatch)).forEach(([key, value]) => {attributes.push(value);});var option = document.querySelector('.swatch-option.selected');if (!option){let form = jQuery(element).parents('form:first');if (form){let selected = [];Object.entries(attributes).forEach(([key, value]) => {let e = form.find('input[name="super_attribute[' + value.attribute_id + ']"]');if (e.length > 0){if (e.get(0).dataset.hasOwnProperty('label')){let a = e.get(0).dataset.label;let b = value.attribute_label;selected.push([b,a].join(AEC.Const.VARIANT_DELIMITER_ATT));}else if(e.get(0).dataset.hasOwnProperty('attrName')){let a = e.get(0).value;let b = value.attribute_label;selected.push([b,a].join(AEC.Const.VARIANT_DELIMITER_ATT));}}});variant = [selected].join(AEC.Const.VARIANT_DELIMITER);}}else {variant = [[attributes[0].attribute_label, option.getAttribute('aria-label')].join(AEC.Const.VARIANT_DELIMITER_ATT)].join(AEC.Const.VARIANT_DELIMITER);}let item = {'item_name': element.dataset.name,'item_id': element.dataset.id,'price': element.dataset.price,'category': element.dataset.category,'item_brand':element.dataset.brand,'item_variant':variant,'item_list_name': element.dataset.list,'item_list_id': element.dataset.list,'quantity': 1,'index':element.dataset.position};Object.assign(item, item, AEC.GA4.transformCategories(element.dataset.category));/** * Track event */AEC.Cookie.add({'event': 'add_to_cart','currency':AEC.currencyCode,'eventLabel': element.dataset.name,'item_list_id': element.dataset.list,'item_list_name': element.dataset.list,'ecommerce': {'items': [item]},'currentStore': element.dataset.store}).push(dataLayer);/** * Track time */AEC.Time.track(dataLayer, AEC.Const.TIMING_CATEGORY_ADD_TO_CART, element.dataset.name, element.dataset.category);});}return true;},click: function(context,dataLayer){var element = context;if (!AEC.gtm()){AEC.Time.track(dataLayer, AEC.Const.TIMING_CATEGORY_PRODUCT_CLICK, element.dataset.name, element.dataset.category);return true;}var item = {'item_name': element.dataset.name,'item_id': element.dataset.id,'price': element.dataset.price,'item_brand':element.dataset.brand,'quantity': element.dataset.quantity,'index':element.dataset.position,'category':element.dataset.category,'currency':AEC.currencyCode};Object.entries(AEC.parseJSON(element.dataset.attributes)).forEach(([key, value]) => {item[key] = value;});Object.assign(item, item, AEC.GA4.augmentCategories(item));var data = {'event': 'select_item','eventLabel': element.dataset.name,'item_list_id': element.dataset.list, 'item_list_name': element.dataset.list,'ecommerce': {'items': [item]}, 'currentStore': element.dataset.store};/** * Push data */AEC.CookieConsent.queue(() => {AEC.Cookie.click(data).push(dataLayer);}).process();/** * Track time */AEC.Time.track(dataLayer, AEC.Const.TIMING_CATEGORY_PRODUCT_CLICK, element.dataset.name, element.dataset.category);if (element.dataset.click){(click => {new Function(click)();})(element.dataset.click);}return true;},remove: function(context, dataLayer, event){var element = context;if (!AEC.gtm()){AEC.Time.track(dataLayer, AEC.Const.TIMING_CATEGORY_REMOVE_FROM_CART, element.dataset.name, element.dataset.category);}var item = {'item_name': element.dataset.name,'item_id': element.dataset.id,'price': parseFloat(element.dataset.price),'category': element.dataset.category,'item_brand':element.dataset.brand,'quantity': element.dataset.quantity,'currency': AEC.currencyCode};Object.entries(AEC.parseJSON(element.dataset.attributes)).forEach(([key, value]) => {item[key] = value;});Object.assign(item, item, AEC.GA4.augmentCategories(item));var data = {'event': 'remove_from_cart','eventLabel': element.dataset.name,'ecommerce': {'item_list_id': element.dataset.list,'item_list_name': element.dataset.list,'items': [item]}};AEC.EventDispatcher.trigger('ec.remove.data', data);let executor = element =>{let params = {action:null};if (element.dataset.hasOwnProperty('post')){params = AEC.parseJSON(element.dataset.post);}else if (element.dataset.hasOwnProperty('postAction')){params = AEC.parseJSON(element.dataset.postAction);}async function getFormKey() {if ('cookieStore' in window) {const cookie = await cookieStore.get('form_key');return cookie?.value || null;}const cookies = Object.fromEntries(document.cookie.split('; ').map(cookie => {const [name, value] = cookie.split('=');
37return [decodeURIComponent(name), decodeURIComponent(value)];}));return cookies['form_key'] || null;}getFormKey().then(formKey => {let form = document.createElement("form");form.setAttribute('method', 'post');form.setAttribute('action', params.action);if (params.hasOwnProperty('data')){params.data['form_key'] = formKey;Object.entries(params.data).forEach(([name, value]) => {let input = document.createElement('input');input.setAttribute('type', 'text');input.setAttribute('name', name);input.setAttribute('value', value);form.append(input);});}document.querySelector("body").appendChild(form);form.submit();});};if (AEC.Message.confirm){if (typeof require !== "undefined" && typeof require === "function") {require(['Magento_Ui/js/modal/confirm'], function(confirmation) {confirmation({title: AEC.Message.confirmRemoveTitle,content: AEC.Message.confirmRemove,actions: {confirm: function(){/** * Track event */AEC.Cookie.remove(data).push(dataLayer);/** * Track time */AEC.Time.track(dataLayer, AEC.Const.TIMING_CATEGORY_REMOVE_FROM_CART, element.dataset.name);/** * Execute standard data-post */executor(element);},cancel: function(){return false;},always: function(){return false;}}});});}else {if (typeof Alpine !== "undefined") {return true;}}}else {/** * Track event */AEC.Cookie.remove(data).push(dataLayer);/** * Track time */AEC.Time.track(dataLayer, AEC.Const.TIMING_CATEGORY_REMOVE_FROM_CART, element.dataset.name);executor(element);}return false;},wishlist: function(context, dataLayer){var element = context;if (!AEC.gtm()){/** * Track time */AEC.Time.track(dataLayer, AEC.Const.TIMING_CATEGORY_PRODUCT_WISHLIST, element.dataset.name,'Wishlist');return true;}let attributes = JSON.parse(element.dataset.eventAttributes);/** * Track event */AEC.Cookie.wishlist({event: element.dataset.event,eventLabel: element.dataset.eventLabel,ecommerce: {items: attributes.items}}).push(dataLayer);return true;},wishlistRemove: function(context, dataLayer){var element = context;if (!AEC.gtm()){/** * Track time */AEC.Time.track(dataLayer, AEC.Const.TIMING_CATEGORY_PRODUCT_WISHLIST, element.dataset.name,'Wishlist');return true;}let attributes = JSON.parse(element.dataset.eventAttributes);/** * Track event */AEC.Cookie.wishlistRemove({event: element.dataset.event,eventLabel: element.dataset.eventLabel,ecommerce: {items: attributes.items}}).push(dataLayer);return true;},compare: function(context, dataLayer){var element = context;if (!AEC.gtm()){/** * Track time */AEC.Time.track(dataLayer, AEC.Const.TIMING_CATEGORY_PRODUCT_COMPARE, element.dataset.name,'Compare');return true;}let attributes = JSON.parse(element.dataset.eventAttributes);AEC.Cookie.compare({event: element.dataset.event,eventLabel: element.dataset.eventLabel,ecommerce: {items: attributes.items}}).push(dataLayer);return true;},Bind: (function(){return {apply: function(parameters){/** * Merge persistent storage */AEC.Persist.merge();/** * Push private data */AEC.Cookie.pushPrivate();document.addEventListener('DOMContentLoaded',() => {document.body.addEventListener('catalogCategoryAddToCartRedirect', () => {dataLayer.push({event: AEC.Const.CATALOG_CATEGORY_ADD_TO_CART_REDIRECT_EVENT});});});if (parameters){if (parameters.performance){if (window.performance){window.onload = function(){setTimeout(function(){ var time = performance.timing.loadEventEnd - performance.timing.responseEnd; var timePayload = { 'event':'performance', 'performance': { 'timingCategory':'Load times', 'timingVar':'load', 'timingValue': (time % 60000) } }; switch(window.google_tag_params.ecomm_pagetype) { case 'home': timePayload.performance.timingLabel = 'Home'; AEC.CookieConsent.queue(() => { dataLayer.push(timePayload); }).process(); break; case 'product': timePayload.performance.timingLabel = 'Product'; AEC.CookieConsent.queue(() => { dataLayer.push(timePayload); }).process(); break; case 'category': timePayload.performance.timingLabel = 'Category'; AEC.CookieConsent.queue(() => { dataLayer.push(timePayload); }).process(); break; } }, 0);};}}}return this;}};})(),Time: (function(){var T = {event: 'trackTime',timingCategory:'',timingVar:'',timingValue:-1,timingLabel:''};var time = new Date().getTime();return {track: function(dataLayer, category, variable, label){T.timingValue = (new Date().getTime()) - time;if (category){T.timingCategory = category;}if (variable){T.timingVar = variable;}if (label){T.timingLabel = label;}dataLayer.push(T);},trackContinue: function(dataLayer, category, variable, label){this.track(dataLayer, category, variable, label);time = new Date().getTime();}};})(),Persist:(function(){var DATA_KEY = 'persist'; var proto = 'undefined' != typeof Storage ? {push: function(key, entity){/** * Get data */var data = this.data();/** * Push data */data[key] = entity;/** * Save to local storage */localStorage.setItem(DATA_KEY, JSON.stringify(data));return this;},data: function(){var data = localStorage.getItem(DATA_KEY);if (null !== data){return JSON.parse(data);}return {};},merge: function(){var data = this.data();var push = {persist: {}};for (var i in data){push.persist[i] = data[i];}dataLayer.push(push);return this;},clear: function(){/** * Reset private local storage */localStorage.setItem(DATA_KEY,JSON.stringify({}));return this;}} : {push: function(){}, merge: function(){},clear: function(){}};/** * Constants */proto.CONST_KEY_PROMOTION = 'persist_promotion';return proto;})(),Checkout: (function(){return {init: false,data: {},tracked: {},getData: function(){return this.data;},getPayload: function(){if (this.data && this.data.hasOwnProperty('payload')){return this.data.payload;}return {error: 'Missing checkout payload data'};},step: function(previous, current, currentCode){if (!this.init){return this.fail('Step tracking requires a checkout page.');}if (this.data && this.data.hasOwnProperty('ecommerce')){this.data.ecommerce['step'] = ++current;/** * Notify listeners */AEC.EventDispatcher.trigger('ec.checkout.step.data', this.data);/** * Track checkout step */AEC.Cookie.checkout(this.data).push(dataLayer);}return this;},stepOption: function(step, option){if (!option){return this;}if (!this.init){return this.fail('Step option tracking requires a checkout page.');}if (!option.toString().length){return this;}
37var data = { 'event': 'checkoutOption', 'ecommerce': { 'checkout_option': { 'actionField': { 'step': step, 'option': option } } } };/** * Notify listeners */AEC.EventDispatcher.trigger('ec.checkout.step.option.data', data);/** * Track checkout option */AEC.CookieConsent.queue(() => {AEC.Cookie.checkoutOption(data).push(dataLayer);}).process();return this;},fail: function(message){console.log(message);return this;}};})(),Cookie: (function(){return {data: null,privateData: null,reset: function(){if (AEC.reset){dataLayer.push({ ecommerce: null });}return dataLayer;},push: function(dataLayer, consent){consent = typeof consent !== 'undefined' ? consent : true;if (this.data){this.reset().push(this.data);/** * Reset data to prevent further push */this.data = null;}return this;},pushPrivate: function(){var data = this.getPrivateData();if (data){dataLayer.push({privateData: data});}return this;},augment: function(products){/** * Parse data & apply local reference */var reference = AEC.Storage.reference().get();if (reference){for (var i = 0, l = products.length; i < l; i++){for (var a = 0, b = reference.length; a < b; a++){if (products[i].item_id.toString().toLowerCase() === reference[a].id.toString().toLowerCase()){products[i].category = reference[a].category;}}}}products.forEach(product => {if (product.hasOwnProperty('category')){let categories = product.category.split(/\//);if (categories.length){let index = 2;categories.forEach(category => {product['item_category' + index] = category;});}}});return products;},click: function(data){AEC.EventDispatcher.trigger('ec.cookie.click.data', data);this.data = data;return this;},add: function(data){AEC.EventDispatcher.trigger('ec.cookie.add.data', data);this.data = data;return this;},remove: function(data){AEC.EventDispatcher.trigger('ec.cookie.remove.item.data', data);this.data = data;if (AEC.localStorage){this.data.ecommerce.items = this.augment(this.data.ecommerce.items);}return this;},compare: function(data){AEC.EventDispatcher.trigger('ec.cookie.compare.data', data);this.data = data;return this;},wishlist: function(data){AEC.EventDispatcher.trigger('ec.cookie.wishlist.data', data);this.data = data;return this;},wishlistRemove: function(data){AEC.EventDispatcher.trigger('ec.cookie.wishlist.remove.data', data);this.data = data;return this;},update: function(data){AEC.EventDispatcher.trigger('ec.cookie.update.item.data', data);this.data = data;return this;},visitor: function(data){AEC.EventDispatcher.trigger('ec.cookie.visitor.data', data);this.data = (function(data, privateData){if (privateData){if (privateData.hasOwnProperty('visitor')){data.visitorId = privateData.visitor.visitorId;data.visitorLoginState = privateData.visitor.visitorLoginState;}}return data;})(data, AEC.Cookie.getPrivateData());return this;},detail: function(data){AEC.EventDispatcher.trigger('ec.cookie.detail.data', data);this.data = data;return this;},purchase: function(data){AEC.EventDispatcher.trigger('ec.cookie.purchase.data', data);this.data = data;if (AEC.localStorage){this.data.ecommerce.purchase.items = this.augment(this.data.ecommerce.purchase.items);}return this;},impressions: function(data){AEC.EventDispatcher.trigger('ec.cookie.impression.data', data);this.data = data;return this;},checkout: function(data){AEC.EventDispatcher.trigger('ec.cookie.checkout.step.data', data);this.data = data;if (AEC.localStorage){this.data.ecommerce.items = this.augment(this.data.ecommerce.items);}return this;},checkoutOption: function(data){AEC.EventDispatcher.trigger('ec.cookie.checkout.step.option.data', data);this.data = data;return this;},promotion: function(data){AEC.EventDispatcher.trigger('ec.cookie.promotion.data', data);this.data = data;return this;},promotionClick: function(data, element){AEC.EventDispatcher.trigger('ec.cookie.promotion.click', data, {element: element });this.data = data;return this;},remarketing: function(data){AEC.EventDispatcher.trigger('ec.cookie.remarketing.data', data);this.data = data;return this;},getPrivateData: function(){if (!this.privateData){var cookie = this.get('privateData');if (cookie){this.privateData = this.parse(cookie);}}return this.privateData;},set: function(name, value, days){if (!days){days = 30;} let date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); document.cookie = name + "=" + encodeURIComponent(value) + "; expires=" + date.toGMTString() + "; path=/; domain=" + AEC.Const.COOKIE_DOMAIN; return this;},get: function(name){var start = document.cookie.indexOf(name + "="), len = start + name.length + 1;if ((!start) && (name != document.cookie.substring(0, name.length))) { return null;}if (start == -1) {return null;}var end = document.cookie.indexOf(String.fromCharCode(59), len);if (end == -1) {end = document.cookie.length;}return decodeURIComponent(document.cookie.substring(len, end));},unset: function(name) { document.cookie = name + "=" + "; path=/; expires=" + (new Date(0)).toUTCString(); return this; },parse: function(json){var json = decodeURIComponent(json.replace(/\+/g, ' ')); return JSON.parse(json);}};})(),CookieConsent: (function(){return {scripts: [],chain: {},endpoints:{},cookies: {},consent: [],config: {},nonce: {},widget: {display: false,color: 'rgba(0,0,0,1)',colorEnd: 'rgba(0,0,0,1)'},queue: function(callback, event){event = typeof event !== 'undefined' ? event : AEC.Const.COOKIE_DIRECTIVE_CONSENT_GRANTED_EVENT;if (!this.chain.hasOwnProperty(event)){this.chain[event] = [];}switch(AEC.Const.COOKIE_DIRECTIVE_ENGINE){case 4:callback = (callback => {return function(){/** * Chnage to dispatch event only when Onetrust is loaded */if (false){if ('undefined' !== typeof OneTrust){OneTrust.OnConsentChanged(() => {callback.apply(this);});if (window.OnetrustActiveGroups){let groups = window.OptanonActiveGroups.split(',').filter(String);
37if (groups.includes('C0001','C0002','C0003','C0004','C0005')){callback.apply(this);}}}}else {callback.apply(this);}}})(callback);break;}this.chain[event].push(callback);return this;},dispatch: function(consent){/** * Essential cookies */AEC.Const.COOKIE_DIRECTIVE_CONSENT_GRANTED = true;/** * Push consent to dataLayer */dataLayer.push(consent);return this.process(consent.event);},process: function(event){event = typeof event !== 'undefined' ? event : AEC.Const.COOKIE_DIRECTIVE_CONSENT_GRANTED_EVENT;if (this.getConsent(event)){this.dequeue(event);}else if (AEC.Const.COOKIE_DIRECTIVE_OVERRIDE_DECLINE){this.dequeue(event);}else {if (4 === AEC.Const.COOKIE_DIRECTIVE_ENGINE){/** * Chnage to dispatch event only when Onetrust is loaded */if (false){(event => {window.addEventListener('onetrust_loaded', e => {if (this.getConsent(event)){this.dequeue(event);}});})(event);}else {this.dequeue(event);}}}return this;},dequeue: function(event){if (this.chain.hasOwnProperty(event)){try {let response;this.chain[event].forEach(fn => {response = fn.apply(this,[]);});}catch (e){console.debug(e);}this.chain[event] = [];}return this;},getConsent: function(event){switch(AEC.Const.COOKIE_DIRECTIVE_ENGINE){case 0:if (!AEC.Const.COOKIE_DIRECTIVE){return true;}break;case 1: if (1 == AEC.Cookie.get(event)){return true;}if (this.consent.includes(event)){return true;}break;case 4:if (window.OnetrustActiveGroups){let groups = window.OptanonActiveGroups.split(',').filter(String);if (groups.includes('C0001','C0002','C0003','C0004','C0005')){return true;}}break;default: return true;}return false;},updateConsent: function(){(segments => {let grant = [];for (var i = 0, l = segments.length; i < l;i++){if (1 == AEC.Cookie.get(segments[i])){grant.push(segments[i]);}}if (grant.length){AEC.CookieConsent.acceptGoogleConsent(grant).getWidget();grant.forEach(segment => {AEC.CookieConsent.acceptConsent(segment);});}})(AEC.Const.COOKIE_DIRECTIVE_SEGMENT_MODE_EVENTS);return this;},acceptGoogleConsent: function(segments){if ('function' === typeof gtag){const consentMode = true === AEC.Const.COOKIE_DIRECTIVE_SEGMENT_MODE ? {ad_storage: -1 !== segments.indexOf('cookieConsentMarketingGranted')? 'granted' : 'denied',security_storage:-1 !== segments.indexOf('cookieConsentGranted')? 'granted' : 'denied',functionality_storage:-1 !== segments.indexOf('cookieConsentGranted') ? 'granted' : 'denied',personalization_storage:-1 !== segments.indexOf('cookieConsentPreferencesGranted') ? 'granted' : 'denied',analytics_storage:-1 !== segments.indexOf('cookieConsentAnalyticsGranted')? 'granted' : 'denied',ad_user_data: -1 !== segments.indexOf('cookieConsentUserdata')? 'granted' : 'denied',ad_personalization: -1 !== segments.indexOf('cookieConsentPersonalization')? 'granted' : 'denied'} : {ad_storage: 'granted',security_storage:'granted',functionality_storage:'granted',personalization_storage:'granted',analytics_storage:'granted',ad_user_data:'granted',ad_personalization:'granted'};/** * Update consent */gtag('consent','update',consentMode);/** * Update localStorage */ localStorage.setItem('consentMode', JSON.stringify(consentMode)); /** * Dispatch custom event */ window.dispatchEvent(new CustomEvent("consent_accept", { detail: { consentMode: consentMode, segments: segments } }));}return this;},finish: function(){let segments = [];AEC.Const.COOKIE_DIRECTIVE_SEGMENT_MODE_EVENTS.forEach(segment => {if (this.getConsent(segment)){segments.push(segment);}});this.pickup({detail: {segments: segments}});},acceptConsent: function(event){return this.dispatch({ event:event });},declineConsent: function(event){return this.dispatch({ event:event });},declineGoogleConsent: function(){if ('function' === typeof gtag){const consentMode = {ad_storage: 'denied',security_storage:'denied',functionality_storage:'denied',personalization_storage:'denied',analytics_storage:'denied',ad_user_data:'denied',ad_personalization:'denied'};/** * Update consent */gtag('consent','update',consentMode);/** * Update localStorage */ localStorage.setItem('consentMode', JSON.stringify(consentMode));
37 /** * Dispatch custom event */ window.dispatchEvent(new CustomEvent("consent_decline",{ detail: { consentMode: consentMode } }));}return this;},setEndpoints: function(endpoints){this.endpoints = endpoints;return this;},getConsentDialog: function(dataLayer){if (1 == AEC.Cookie.get(AEC.Const.COOKIE_DIRECTIVE_CONSENT_DECLINE_EVENT)){AEC.CookieConsent.declineGoogleConsent([AEC.Const.COOKIE_DIRECTIVE_CONSENT_DECLINE_EVEN]).getWidget();return true;}if (1 != AEC.Cookie.get(AEC.Const.COOKIE_DIRECTIVE_CONSENT_GRANTED_EVENT)){this.renderConsentDialog(dataLayer);}else {AEC.CookieConsent.getWidget();}return this;},closeConsentDialog: function(directive){directive.remove();this.getWidget();return this;},renderConsentDialog: function(dataLayer){let template = document.querySelector('template[data-consent]');(endpoints => {var directive = (body => {body.insertAdjacentHTML('beforeend', template.innerHTML);return body.lastElementChild;})(document.body);let uuid = AEC.Cookie.get('cookieUuid');if (uuid){directive.querySelector('[data-consent-uuid').innerHTML = uuid;}let check_default = Number(directive.dataset.check);directive.querySelectorAll('input[type=checkbox][data-consent]').forEach(checkbox => {checkbox.checked = AEC.CookieConsent.getConsent(checkbox.dataset.consent) ? true : (!uuid && check_default ? true : false);});directive.querySelector('[data-consent-uuid-wrapper]').style.display = uuid ? 'block' : 'none';(directive => {let listener = event => {if (event.key === 'Escape') { AEC.CookieConsent.closeConsentDialog(directive).acquireProxyCookies(); }};document.addEventListener('keydown', event => {listener(event);document.removeEventListener('keydown', listener);});})(directive);directive.querySelectorAll('a.customize').forEach(element => {let customize = directive.querySelector('.ec-gtm-cookie-directive-customize');element.addEventListener('click', event => {if ('block' === customize.style.display){directive.querySelector('a.action.accept').style.display = 'none';customize.style.display = 'none';}else {directive.querySelector('a.action.accept').style.display = 'block';customize.style.display = 'block';}event.target.innerHTML = 'block' === customize.style.display ? event.target.dataset.hide : event.target.dataset.show;});});directive.querySelectorAll('a.ec-gtm-cookie-directive-note-toggle').forEach(element => {element.addEventListener('click', event => {if ('block' === event.target.nextElementSibling.style.display){event.target.nextElementSibling.style.display = 'none';}else {directive.querySelectorAll('.ec-gtm-cookie-directive-note').forEach(note => {note.previousElementSibling.innerHTML = note.previousElementSibling.dataset.show;note.style.display = 'none';});event.target.nextElementSibling.style.display = 'block';}event.target.innerHTML = 'block' === event.target.nextElementSibling.style.display ? event.target.dataset.hide : event.target.dataset.show;});});directive.querySelectorAll('a.accept').forEach(element => {element.addEventListener('click', event => {event.target.text = event.target.dataset.confirm;var grant = [...directive.querySelectorAll('[name="cookie[]"]:checked')].map(element => { return element.value });grant.unshift('cookieConsentGranted');AEC.CookieConsent.acceptGoogleConsent(grant);AEC.Request.post(endpoints.cookie, { cookie: grant }, response => {Object.keys(response).forEach(event => {AEC.CookieConsent.acceptConsent(event);});AEC.CookieConsent.closeConsentDialog(directive).acquireProxyCookies();});});});directive.querySelectorAll('a.accept-all').forEach(element => {element.addEventListener('click', event => {event.target.text = event.target.dataset.confirm;[...directive.querySelectorAll('[name="cookie[]"]')].forEach(element => {element.checked = true;});var grant = [...directive.querySelectorAll('[name="cookie[]"]:checked')].map(element => { return element.value });grant.unshift('cookieConsentGranted');AEC.CookieConsent.acceptGoogleConsent(grant);AEC.Request.post(endpoints.cookie, { cookie: grant }, response => {Object.keys(response).forEach(event => {AEC.CookieConsent.acceptConsent(event);});AEC.CookieConsent.closeConsentDialog(directive).acquireProxyCookies();});});});directive.querySelectorAll('a.decline').forEach(element => {element.addEventListener('click', event =>
37 {[...directive.querySelectorAll('[name="cookie[]"]')].forEach(element => {element.checked = false;});AEC.CookieConsent.declineGoogleConsent();AEC.Request.post(endpoints.cookie, { decline: true }, response => {Object.keys(response).forEach(event => {AEC.CookieConsent.declineConsent(event);});AEC.CookieConsent.closeConsentDialog(directive).acquireProxyCookies();});});});directive.querySelectorAll('a.close').forEach(element => {element.style.display = AEC.Const.COOKIE_DIRECTIVE_CONSENT_GRANTED ? 'block' : 'none';element.addEventListener('click', event => {AEC.CookieConsent.closeConsentDialog(directive).acquireProxyCookies();});});})(this.endpoints);return this;},acquireProxyCookies: function(){if (!this.config.acquire){return this;}const acquire = localStorage.getItem("acquire");if (!acquire){(context => {setTimeout(() => {const cookies = Object.fromEntries(document.cookie.split(';').map(s => s.trim()).filter(Boolean).map(pair => {const i = pair.indexOf('=');const k = i > -1 ? pair.slice(0, i) : pair;const v = i > -1 ? pair.slice(i + 1) : '';try { return [decodeURIComponent(k), decodeURIComponent(v)]; }catch { return [k, v]; }}));Object.entries(cookies).forEach(([name, value]) => {if (!context.cookies.hasOwnProperty(name)){context.cookies[name] = true;}});AEC.Request.post(context.endpoints.cookieConsent, { cookies: context.cookies }, response => {return true;});},1000);})(this);localStorage.setItem("acquire", true);}return this;},setProxy: function(){(context =>{new MutationObserver((mutations) => {mutations.forEach((mutation) => {[...mutation.addedNodes].forEach(node => {if (node.nodeType !== 1) {return;}if (node.matches('script') && node.dataset && node.dataset.hasOwnProperty('consent')) {context.scripts.push({script: node,parent: node.parentNode ? node.parentNode : document.head,segment: node.dataset.consent});[...node.attributes].forEach((attr) => {if (attr.name.startsWith('defer')) {node.removeAttribute(attr.name);}});node.remove();}});});}).observe(document.documentElement, { childList: true, subtree: true });})(this); return this;},setReflect: function(fn, strategy){(function() {const proto = Document.prototype;const descriptor = Object.getOwnPropertyDescriptor(proto, "cookie");if (!descriptor || !descriptor.set) {console.warn("Cookie setter not found on Document.prototype");return;}Object.defineProperty(proto, "cookie", {configurable: true,enumerable: descriptor.enumerable,get: function() {return descriptor.get.call(this);},set: function(value) {try {const name = value.split("=")[0];window.dispatchEvent(new CustomEvent("captured_cookie", {detail: { cookie: { name, value } }}));} catch (e) {console.warn("Cookie observer error:", e);}return descriptor.set.call(this, value);}});})();if (1 == strategy){const originalSetAttribute = HTMLScriptElement.prototype.setAttribute;Object.defineProperties(HTMLScriptElement.prototype,{src: {set: function(value) {if (!AEC.CookieConsent.getConsent(AEC.Const.COOKIE_DIRECTIVE_CONSENT_GRANTED_EVENT) && !this.dataset.hasOwnProperty('materialize') && -1 === value.indexOf(BASE_URL)){this.setAttribute('type', 'text/template');this.setAttribute('data-consent', AEC.Const.COOKIE_DIRECTIVE_CONSENT_GRANTED_EVENT);}this.setAttribute('src', value);},get: function() {return this.getAttribute('src');}},setAttribute: {value: function(name, value) {if (name === 'src') {if (!AEC.CookieConsent.getConsent(AEC.Const.COOKIE_DIRECTIVE_CONSENT_GRANTED_EVENT) && !this.dataset.hasOwnProperty('materialize') && -1 === value.indexOf(BASE_URL)){this.setAttribute('type', 'text/template');this.setAttribute('data-consent', AEC.Const.COOKIE_DIRECTIVE_CONSENT_GRANTED_EVENT);}}return originalSetAttribute.call(this, name, value);},writable: true,configurable: true}});}window.addEventListener('captured_cookie', event => {this.cookies[event.detail.cookie.name] = event.detail.cookie.value;});fn.apply(this,[this]);},setAsses: function(asses){asses = asses || [];if (asses.length){setTimeout(() => {let cookies = Object.fromEntries(document.cookie.split('; ').map(c => c.split('=')));let result = [];
37Object.entries(cookies).forEach(([name, value]) => {if(!asses.includes(name)){result.push(name);}});let debug = document.createElement('div');Object.assign(debug.style, {position: 'fixed',width: '85%',maxWidth: '600px',bottom: '30px',left: '20px',padding: '20px',borderRadius: '2px',color: 'rgba(0,0,0,1)',background: 'rgba(255, 198, 75, 0.95)',dropShadow: '0px 0px 2px',zIndex: 9999});if (result.length){result.unshift('');result.unshift('We have identified the following cookies that might be set prior to consent.');}else {result.push('No NON-ESSENTIAL cookies found.');}result.push('');result.push('<small>Once done, remember to disable Test mode in Stores -> Configuration -> Anowave -> Cookie Consent Mode V2 -> Test Mode OR delete <strong>asses</strong> cookie manually.</small>');debug.innerHTML = result.join('<br />');document.body.appendChild(debug);},1000);}return this;},pickup: function(event){document.querySelectorAll('script[data-consent]').forEach(script => {let segment = script.dataset.consent;if (-1 != event.detail.segments.indexOf(segment)){delete script.dataset.consent;this.materialize(script, this.nonce, event.detail.segments);}});this.scripts.forEach(script => {if (-1 != event.detail.segments.indexOf(script.segment)){this.materialize(script.script, this.nonce, event.detail.segments);}});return this;},materialize: function(script, nonce, segments){let tag = document.createElement('script');tag.type = "text/javascript";tag.innerHTML = script.innerHTML;tag.dataset.materialize = true;if (script.getAttribute('src')){tag.src = script.src;}tag.setAttribute('nonce', nonce);if (script.parentNode){script.parentNode.appendChild(tag);script.parentNode.removeChild(script);}else {document.body.appendChild(tag);}},setNonce: function(nonce){this.nonce = nonce;return this;},setWidget: function(config){config = config || {};this.config = config;this.setAsses(config.asses).setProxy().setNonce(config.nonce).setEndpoints(config.endpoints); (context => { let block = {}; window.addEventListener('consent_accept', event => {context.consent = event.detail.segments; context.pickup(event);new MutationObserver((mutations) => {mutations.forEach((mutation) => {[...mutation.addedNodes].forEach(node => {if (node.nodeType !== 1) {return;}if (node.matches('script') && -1 != node.type.indexOf('text/template')) { let segment = node.dataset.consent;if (-1 != event.detail.segments.indexOf(segment)){delete node.dataset.consent;context.materialize(node, this.nonce. event.detail.segments);}}});});}).observe(document.documentElement, { childList: true, subtree: true }); }); })(this); this.widget = {...this.widget, ...config.options };return this;}
37,getWidget: function(){if (this.widget.display){let svg = (node => {return (text => {let styles = {position: 'fixed', bottom: '10px', left: '10px','z-index': '9999', cursor: 'pointer' };let style = Object.entries(styles).map(([key, value]) => {return [key,value].join(':');});let svg = node('svg', { id: 'consentWidget', width:52, height: 50, style: style.join(';') });let gradient = node('linearGradient', { id: 'gradient', gradientTransform: 'rotate(90)'});let filter = node('filter', { id: 'shadow' });[node('feDropShadow', { dx: '0', dy: '0', stdDeviation: '0.7','flood-opacity': 0.5 }),].forEach(element => {filter.appendChild(element);}); let count = parseInt(text);[node('stop', { offset: '0%', 'stop-color': this.widget.color }),node('stop', { offset: '100%', 'stop-color': this.widget.colorEnd })].forEach(element => {gradient.appendChild(element);});if (0){svg.appendChild(filter);}svg.appendChild(gradient);let transform = 'scale(1.5 1.5) translate(0 10)';[node('path', { id: 'a', d: 'M22.6004 0H7.40039C3.50039 0 0.400391 3.1 0.400391 7C0.400391 10.9 3.50039 14 7.40039 14H22.6004C26.5004 14 29.6004 10.9 29.6004 7C29.6004 3.1 26.4004 0 22.6004 0ZM1.60039 7C1.60039 3.8 4.20039 1.2 7.40039 1.2H17.3004L14.2004 12.8H7.40039C4.20039 12.8 1.60039 10.2 1.60039 7Z', filter: 'url(#shadow)', fill: 'url(#gradient)', transform: transform }),node('path', { id: 'b', d: 'M24.6012 4.0001C24.8012 4.2001 24.8012 4.6001 24.6012 4.8001L22.5012 7.0001L24.7012 9.2001C24.9012 9.4001 24.9012 9.8001 24.7012 10.0001C24.5012 10.2001 24.1012 10.2001 23.9012 10.0001L21.7012 7.8001L19.5012 10.0001C19.3012 10.2001 18.9012 10.2001 18.7012 10.0001C18.5012 9.8001 18.5012 9.4001 18.7012 9.2001L20.8012 7.0001L18.6012 4.8001C18.4012 4.6001 18.4012 4.2001 18.6012 4.0001C18.8012 3.8001 19.2012 3.8001 19.4012 4.0001L21.6012 6.2001L23.8012 4.0001C24.0012 3.8001 24.4012 3.8001 24.6012 4.0001Z', fill: 'rgba(255,255,255,1)', transform: transform }),node('path', { id: 'c', d: 'M12.7 4.1002C12.9 4.3002 13 4.7002 12.8 4.9002L8.6 9.8002C8.5 9.9002 8.4 10.0002 8.3 10.0002C8.1 10.1002 7.8 10.1002 7.6 9.9002L5.4 7.7002C5.2 7.5002 5.2 7.
371002 5.4 6.9002C5.6 6.7002 6 6.7002 6.2 6.9002L8 8.6002L11.8 4.1002C12 3.9002 12.4 3.9002 12.7 4.1002Z', fill: 'url(#gradient)', transform: transform })].forEach(element => {svg.appendChild(element);});let loader = node('circle', { id: 'd', cx: 13, cy:25.5, r: 6, fill:'transparent', stroke:'url(#gradient)', 'stroke-width':2, 'stroke-dasharray':'60 40', 'stroke-dashoffset': 40, filter: 'url(#shadow)', style: 'display:none' });[node('animateTransform', { attributeName: "transform", attributeType:"XML", type:"rotate", dur:"1s", from:"0 13 25.5", to:"360 13 25.5", repeatCount:"indefinite" })].forEach(element => {loader.appendChild(element);});svg.appendChild(loader);return svg;});})((n, v) => { n = document.createElementNS("http://www.w3.org/2000/svg", n); for (var p in v) { n.setAttributeNS(null, p, v[p]); } return n;});let widget = svg();/** * Remove widget */this.deleteWidget();/** * Add widget */document.body.appendChild(widget);/** * Render widget */document.body.querySelectorAll('[id=consentWidget]').forEach(element => {element.addEventListener('click', event => {AEC.CookieConsent.renderConsentDialog(dataLayer);});});return widget;}return null;},deleteWidget: function(){document.body.querySelectorAll('[id=consentWidget]').forEach(element => {element.parentNode.removeChild(element);});return this;},loader: (function(){return {show: function(){document.querySelectorAll('[id=c]').forEach(e => { e.style.display = 'none' });document.querySelectorAll('[id=d]').forEach(e => { e.style.display = 'block' });},hide: function(){document.querySelectorAll('[id=c]').forEach(e => { e.style.display = 'block' });document.querySelectorAll('[id=d]').forEach(e => { e.style.display = 'none' });}}})()}})(),Storage: (function(){return {set: function(property, value){if ('undefined' !== typeof(Storage)){localStorage.setItem(property, JSON.stringify(value));}return this;},get: function(property){if ('undefined' !== typeof(Storage)){return JSON.parse(localStorage.getItem(property));}return null;},reference: function(){return (function(storage){return {set: function(reference){var current = storage.get('category.add') || [];var exists = (function(current, reference){for (var i = 0, l = current.length; i < l; i++){if (current[i].id.toString().toLowerCase() === reference.id.toString().toLowerCase()){/** * Update category */current[i].category = reference.category;return true;}}return false;})(current, reference);if (!exists){current.push(reference);}storage.set('category.add', current);return this;},get: function(){return storage.get('category.add');}}})(this);}}})(),gtm: function(){if ("undefined" === typeof google_tag_manager){/** * Log error to console */console.log('Unable to detect Google Tag Manager. Please verify if GTM install snippet is available.');return false;}return true;},parseJSON: function(content){if ('object' === typeof content){return content;}if ('string' === typeof content){try {return JSON.parse(content);}catch (e){}}return {};}, getPayloadSize: function(object){var objects = [object], size = 0; for (var index = 0; index < objects.length; index++) { switch (typeof objects[index]) { case 'boolean': size += 4; break; case 'number': size += 8; break; case 'string': size += 2 * objects[index].length; break; case 'object': if (Object.prototype.toString.call(objects[index]) != '[object Array]') { for (var key in objects[index]) size += 2 * key.length; } for (var key in objects[index]) { var processed = false; for (var search = 0; search < objects.length; search++) { if (objects[search] === objects[index][key]) { processed = true; break; } } if (!processed) objects.push(objects[index][key]); } } } return size;},getPayloadChunks: function(arr, len){var chunks = [],i = 0, n = arr.length;while (i < n) { chunks.push(arr.slice(i, i += len));};return chunks;},url: function(url){return [AEC.Const.URL, url].join('');},EventDispatcher: (function(){return {events: {}, on: function(event, callback) { var handlers = this.events[event] || []; handlers.push(callback); this.events[event] = handlers; }, trigger: function() { /** * Cast arguments to array */ let args = [...arguments]; /** * Get event */ let event = args ? args.shift() : null; /** * Get handlers */ let handlers = this.events[event] || []; /** * Get data */ let data = args ? args.shift() : {}; /** * Get options */ let options = args ? args.shift() : {}; /** * Quit if no handler */ if (!handlers || handlers.length < 1) { return; } console.log(event + '(' + handlers.length + ' listeners)');
37 handlers.forEach(function(handler) { handler(data, options); }); }}})(),Request: (function(){return {get: function(url, params, callback){this.execute('GET', [url,this.serialize(params)].join('?'), callback).send(null);},post: function(url, params, callback) {this.execute('POST', url, callback).send(this.serialize(params));},execute: function(method, url, callback){try {var request = new XMLHttpRequest();request.open(method, url, true);request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');request.setRequestHeader('X-Requested-With','XMLHttpRequest');request.addEventListener('load', () => {let response;if ('application/json' === request.getResponseHeader("Content-Type")){response = JSON.parse(request.responseText);}else{response = request.responseText;}if ('function' === typeof callback){callback(response);}});}catch (e){console.log(e.message);return null;}return request;},serialize: function(entity, prefix) { var query = []; Object.keys(entity).map(key => { var k = prefix ? prefix + "[" + key + "]" : key, value = entity[key]; query.push((value !== null && typeof value === "object") ? this.serialize(value, k) : encodeURIComponent(k) + "=" + encodeURIComponent(value)); }); return query.join("&"); }}})(),UUID: (() => {return {generate: event => {event = event || {};let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16);});if (-1 == ['AddToCart'].indexOf(event)){try {let current = AEC.Cookie.get('facebook_latest_uuid');if (current){current = JSON.parse(current);if (current.hasOwnProperty('uuid') && current.hasOwnProperty('event')){if (event.event === current.event){uuid = current.uuid;}}}}catch (e){}}event['uuid'] = uuid;/** * Set facebook uuid cookie */if (AEC.Const.COOKIE_DIRECTIVE){if (AEC.Const.COOKIE_DIRECTIVE_CONSENT_GRANTED){AEC.Cookie.set('facebook_latest_uuid', JSON.stringify(event));}}else {AEC.Cookie.set('facebook_latest_uuid', JSON.stringify(event));}return uuid;}}})(),Proxy: (() => {function proxyFactory(worker) { const handler = { get(target, method) { return function (...args) { return new Promise((resolve, reject) => { const id = Date.now() + Math.random().toString(36).substr(2); worker.onmessage = function (event) { const { id: responseId, result, error } = event.data; if (responseId === id) { if (error) { reject(new Error(error)); } else { resolve(result); } } }; worker.postMessage({ id, method, args }); }); }; } }; return new Proxy({}, handler); };return {get: worker => {return proxyFactory(new Worker(worker))}}})(),TikTok: (() => {return {event: (event, dataset, event_identifier) => {if ('undefined' !== typeof ttq){ttq.track(event, dataset, event_identifier);}}}})()}})();if ('undefined' !== typeof AEC && 'undefined' !== typeof AEC.EventDispatcher){AEC.GA4 = (() => {return {enabled: false,transformCategories: function(category){if (null === category){return {};}let map = {}, categories = category.toString().split('/');if (categories){map['item_category'] = categories.shift();if (categories.length){let index = 1;
37categories.forEach(category => {map['item_category' + (++index)] = category;});}}return map;},augmentCategories: function(product) {if (product.hasOwnProperty('category')){AEC.Cookie.augment([product]);}return this.transformCategories(product.category);},augmentItem: function(product){let map = {};map['google_business_vertical'] = 'retail';Object.entries(product).forEach(([key, value]) => {if (-1 === ['id','name','price','category','currency','variant','brand'].indexOf(key)){map[key] = value;}});return map;}}})();/** * Modify checkout step option payloasd */AEC.EventDispatcher.on('ec.checkout.step.option.data', data => {if (!AEC.GA4.enabled){return true;}switch(parseInt(data.ecommerce.checkout_option.actionField.step)){case AEC.Const.CHECKOUT_STEP_SHIPPING:data['event'] = 'add_shipping_info';if (AEC.GA4.quote.hasOwnProperty('coupon')){data.ecommerce['coupon'] = AEC.GA4.quote.coupon;}data.ecommerce['currency'] = AEC.GA4.currency;data.ecommerce['items'] = AEC.Checkout.getPayload().ecommerce.items;data.ecommerce['shipping_tier'] = data.ecommerce.checkout_option.actionField.option;(data => {let value = 0;data.ecommerce['items'].forEach(item => {value += Number(item.price) * Number(item.quantity);});data.ecommerce['value'] = value;})(data);delete data.ecommerce.checkout_option;break;case AEC.Const.CHECKOUT_STEP_PAYMENT:data['event'] = 'add_payment_info';if (AEC.GA4.quote.hasOwnProperty('coupon')){data.ecommerce['coupon'] = AEC.GA4.quote.coupon;}data.ecommerce['currency'] = AEC.GA4.currency;data.ecommerce['items'] = AEC.Checkout.getPayload().ecommerce.items;data.ecommerce['payment_type'] = data.ecommerce.checkout_option.actionField.option;(data => {let value = 0;data.ecommerce['items'].forEach(item => {value += Number(item.price) * Number(item.quantity);});data.ecommerce['value'] = value;})(data);delete data.ecommerce.checkout_option;break;}});}</script>
37<script data-ommit="true" nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M="> 38 39 window.dataLayer = window.dataLayer || []; 40 41 window.AEC = window.AEC || {}; 42 43 AEC.Const = {"URL":"https://www.voetbalshirtskoning.nl/","TIMING_CATEGORY_ADD_TO_CART":"Add To Cart Time","TIMING_CATEGORY_REMOVE_FROM_CART":"Remove From Cart Time","TIMING_CATEGORY_PRODUCT_CLICK":"Product Detail Click Time","TIMING_CATEGORY_CHECKOUT":"Checkout Time","TIMING_CATEGORY_CHECKOUT_STEP":"Checkout Step Tim","TIMING_CATEGORY_PRODUCT_WISHLIST":"Add to Wishlist Time","TIMING_CATEGORY_PRODUCT_COMPARE":"Add to Compare Time","VARIANT_DELIMITER":"-","VARIANT_DELIMITER_ATT":":","CHECKOUT_STEP_SHIPPING":1,"CHECKOUT_STEP_PAYMENT":2,"CHECKOUT_STEP_ORDER":3,"DIMENSION_SEARCH":18,"COOKIE_DIRECTIVE":false,"COOKIE_DIRECTIVE_ENGINE":0,"COOKIE_DIRECTIVE_SEGMENT_MODE":false,"COOKIE_DIRECTIVE_SEGMENT_MODE_EVENTS":["cookieConsentGranted"],"COOKIE_DIRECTIVE_CONSENT_GRANTED_EVENT":"cookieConsentGranted","COOKIE_DIRECTIVE_CONSENT_DECLINE_EVENT":"cookieConsentDeclined","COOKIE_DIRECTIVE_OVERRIDE_DECLINE":false,"COOKIE_DOMAIN":"www.voetbalshirtskoning.nl","CATALOG_CATEGORY_ADD_TO_CART_REDIRECT_EVENT":"catalogCategoryAddToCartRedirect"}; 44 45 AEC.Const.COOKIE_DIRECTIVE_CONSENT_GRANTED = AEC.CookieConsent.getConsent("cookieConsentGranted"); 46 47 Object.entries({"Message":{"confirm":true,"confirmRemoveTitle":"Weet u het zeker?","confirmRemove":"Weet u zeker dat u dit product wilt verwijderen uit uw winkelwagen?"},"storeName":"NL","currencyCode":"EUR","useDefaultValues":false,"facebook":false,"tiktok":false,"SUPER":[],"CONFIGURABLE_SIMPLES":[],"BUNDLE":{"bundles":[],"options":[]},"localStorage":"true","summary":false,"reset":false,"tax":1,"simples":false}).forEach(([key,value]) => { AEC[key] = value; });</script>
47
47<script data-ommit="true" nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M="> 48 49 (summary => 50 { 51 if (summary) 52 { 53 let getSummary = (event) => 54 { 55 AEC.Request.post("https:\/\/www.voetbalshirtskoning.nl\/datalayer\/index\/cart\/",{ event:event }, (response) => 56 { 57 dataLayer.push(response); 58 }); 59 }; 60 61 ['ec.cookie.remove.item.data','ec.cookie.update.item.data','ec.cookie.add.data'].forEach(event => 62 { 63 AEC.EventDispatcher.on(event, (event => 64 { 65 return () => 66 { 67 setTimeout(() => { getSummary(event); }, 2000); 68 }; 69 })(event)); 70 }); 71 } 72 })(AEC.summary);</script>
72<script data-ommit="true" nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M="> 73 74 if ('undefined' !== typeof AEC && AEC.GA4) 75 { 76 AEC.GA4.enabled = true; 77 78 AEC.GA4.conversion_event = "purchase"; 79 80 AEC.GA4.currency = "EUR"; 81 82 AEC.GA4.quote = []; 83 }</script>
83<script data-ommit="true" nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M="> 84 85 window.dataLayer = window.dataLayer || []; 86 87 var dataLayerTransport = (function() 88 { 89 var data = []; 90 91 return { 92 data:[], 93 push: function(data) 94 { 95 this.data.push(data); 96 97 return this; 98 }, 99 serialize: function() 100 { 101 return this.data; 102 } 103 } 104 })();</script>
104
104<script data-ommit="true" nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M="> 105 106 (endpoints => 107 { 108 let engines = 109 { 110 0: () => {}, 111 1: () => {}, 112 2: () => 113 { 114 window.addEventListener('CookiebotOnAccept', event => 115 { 116 return true; 117 }, 118 false); 119 }, 120 3: () => {}, 121 4: () => 122 { 123 (() => 124 { 125 let wait = 0, interval = 100; 126 127 let otc = () => 128 { 129 return 'undefined' !== typeof window.OneTrust; 130 }; 131 132 window.ot = setInterval(end => 133 { 134 wait += interval; 135 136 if (wait > end) 137 { 138 if (window.ot) 139 { 140 clearInterval(window.ot); 141 } 142 } 143 144 if (otc()) 145 { 146 window.dispatchEvent(new CustomEvent("onetrust_loaded", 147 { 148 detail: 149 { 150 groups: window.OptanonActiveGroups 151 } 152 })); 153 154 clearInterval(window.ot); 155 156 let uuid = AEC.Cookie.get('cookieUuid'); 157 158 let map = {"C0001":["cookieConsentGranted"],"C0002":["cookieConsentGranted","cookieConsentAnalyticsGranted"],"C0003":["cookieConsentGranted","cookieConsentPreferencesGranted"],"0":["cookieConsentGranted","cookieConsentUserdata","cookieConsentPersonalization","cookieConsentMarketingGranted"]}; 159 160 OneTrust.OnConsentChanged(() => 161 { 162 let groups = window.OptanonActiveGroups.split(',').filter(String); 163 164 let grant = [], consent = {}; 165 166 groups.forEach(group => 167 { 168 if (map.hasOwnProperty(group)) 169 { 170 map[group].forEach(signal => 171 { 172 consent[signal] = true; 173 }); 174 } 175 }); 176 177 Object.keys(consent).forEach(key => 178 { 179 grant.push(key); 180 }); 181 182 let params = 183 { 184 cookie: grant 185 }; 186 187 if (!grant.length) 188 { 189 params['decline'] = true; 190 } 191 192 AEC.Request.post(endpoints.cookie, params , response => 193 { 194 return true; 195 }); 196 197 return true; 198 }); 199 } 200 }, 201 interval); 202 203 })(2000); 204 }, 205 5: () => 206 { 207 let grant = []; 208 209 grant.push("cookieConsentGranted"); 210 211 let uuid = AEC.Cookie.get('cookieUuid'); 212 213 if (!uuid) 214 { 215 AEC.Request.post(endpoints.cookie, { cookie: grant }, response => 216 { 217 return true; 218 }); 219 } 220 return true; 221 }, 222 6: () => 223 { 224 return true; 225 } 226 }; 227 228 engines[AEC.Const.COOKIE_DIRECTIVE_ENGINE].apply(this,[]); 229 230 })({"type":"json","cookie":"https:\/\/www.voetbalshirtskoning.nl\/datalayer\/index\/cookie\/","cookieContent":"https:\/\/www.voetbalshirtskoning.nl\/datalayer\/index\/cookieContent\/","cookieConsent":"https:\/\/www.voetbalshirtskoning.nl\/datalayer\/index\/cookieConsent\/"});</script>
230
230<script data-ommit="true" nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M="> 231 232 /* Dynamic remarketing */ 233 window.google_tag_params = window.google_tag_params || {}; 234 235 /* Default pagetype */ 236 window.google_tag_params.ecomm_pagetype = "home"; 237 238 /* Grouped products collection */ 239 window.G = []; 240 241 /** 242 * Global revenue 243 */ 244 window.revenue = 0; 245 246 /** 247 * DoubleClick 248 */ 249 window.DoubleClick = 250 { 251 DoubleClickRevenue: 0, 252 DoubleClickTransaction: 0, 253 DoubleClickQuantity: 0 254 }; 255 256 AEC.Cookie.visitor({"pageType":"home","pageName":"Goedkope Voetbalshirts - Voetbalshirtskoning.nl","websiteCountry":"NL","websiteLanguage":"nl_NL","visitorLoginState":"Logged out","visitorLifetimeValue":0,"visitorExistingCustomer":"Nee","clientStatus":"Not client","visitorType":"NOT LOGGED IN","currentStore":"NL"}).push(dataLayer, false);</script>
256
256<script nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M=">(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 257new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 258j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.nonce='NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M=';j.src= 259'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 260})(window,document,'script','dataLayer','GTM-NH3PC7PC');</script>
260 261<!-- End Google Tag Manager --> 262
262<script data-ommit="true" nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M="> 263 264 </script>
264
264<script data-ommit="true" nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M=">AEC.Bind.apply({"performance":false})</script>
264<script type="application/ld+json">{"@context":"https:\/\/schema.org\/","@type":"WebSite","url":"https:\/\/www.voetbalshirtskoning.nl\/","potentialAction":{"@type":"SearchAction","target":"https:\/\/www.voetbalshirtskoning.nl\/catalogsearch\/result\/index\/?q={search_term_string}","query-input":"required name=search_term_string"},"name":"Voetbalshirtskoning.nl"}</script>
264<script type="application/ld+json">{"@context":"https:\/\/schema.org\/","@type":"Organization","image":"","name":"Voetbalshirtskoning.nl","url":"https:\/\/www.voetbalshirtskoning.nl\/","address":{"@type":"PostalAddress","addressCountry":"NL","addressLocality":"Deventer","addressRegion":"","postalCode":"7412AC","streetAddress":"Zwolseweg 75"},"email":"[email protected]","telephone":"0207861855"}</script>
264<script> 265 var BASE_URL = 'https://www.voetbalshirtskoning.nl/'; 266 var THEME_PATH = 'https://www.voetbalshirtskoning.nl/static/version20261002143139/frontend/Vendic/voetbalshirtskoning/nl_NL'; 267 var COOKIE_CONFIG = { 268 "expires": null, 269 "path": "\u002F", 270 "domain": ".www.voetbalshirtskoning.nl", 271 "secure": true, 272 "lifetime": "86400", 273 "cookie_restriction_enabled": false }; 274 var CURRENT_STORE_CODE = 'nl'; 275 var CURRENT_WEBSITE_ID = '1'; 276 277 window.hyva = window.hyva || {} 278 279 window.cookie_consent_groups = window.cookie_consent_groups || {} 280 window.cookie_consent_groups['necessary'] = true; 281 282 window.cookie_consent_config = window.cookie_consent_config || {}; 283 window.cookie_consent_config['necessary'] = [].concat( 284 window.cookie_consent_config['necessary'] || [], 285 [ 286 'user_allowed_save_cookie', 287 'form_key', 288 'mage-messages', 289 'private_content_version', 290 'mage-cache-sessid', 291 'last_visited_store', 292 'section_data_ids' 293 ] 294 );</script>
294<script> 295 'use strict'; 296 (function( hyva, undefined ) { 297 298 function lifetimeToExpires(options, defaults) { 299 300 const lifetime = options.lifetime || defaults.lifetime; 301 302 if (lifetime) { 303 const date = new Date; 304 date.setTime(date.getTime() + lifetime * 1000); 305 return date; 306 } 307 308 return null; 309 } 310 311 function generateRandomString() { 312 313 const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 314 length = 16; 315 316 let formKey = '', 317 charactersLength = allowedCharacters.length; 318 319 for (let i = 0; i < length; i++) { 320 formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] 321 } 322 323 return formKey; 324 } 325 326 const sessionCookieMarker = {noLifetime: true} 327 328 const cookieTempStorage = {}; 329 330 const internalCookie = { 331 get(name) { 332 const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 333 return v ? v[2] : null; 334 }, 335 set(name, value, days, skipSetDomain) { 336 let expires, 337 path, 338 domain, 339 secure, 340 samesite; 341 342 const defaultCookieConfig = { 343 expires: null, 344 path: '/', 345 domain: null, 346 secure: false, 347 lifetime: null, 348 samesite: 'lax' 349 }; 350 351 const cookieConfig = window.COOKIE_CONFIG || {}; 352 353 expires = days && days !== sessionCookieMarker 354 ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) 355 : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; 356 357 path = cookieConfig.path || defaultCookieConfig.path; 358 domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); 359 secure = cookieConfig.secure || defaultCookieConfig.secure; 360 samesite = cookieConfig.samesite || defaultCookieConfig.samesite; 361 362 document.cookie = name + "=" + encodeURIComponent(value) + 363 (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + 364 (path ? '; path=' + path : '') + 365 (domain ? '; domain=' + domain : '') + 366 (secure ? '; secure' : '') + 367 (samesite ? '; samesite=' + samesite : 'lax'); 368 }, 369 isWebsiteAllowedToSaveCookie() { 370 const allowedCookies = this.get('user_allowed_save_cookie'); 371 if (allowedCookies) { 372 const allowedWebsites = JSON.parse(unescape(allowedCookies)); 373 374 return allowedWebsites[CURRENT_WEBSITE_ID] === 1; 375 } 376 return false; 377 }, 378 getGroupByCookieName(name) { 379 const cookieConsentConfig = window.cookie_consent_config || {}; 380 let group = null; 381 for (let prop in cookieConsentConfig) { 382 if (!cookieConsentConfig.hasOwnProperty(prop)) continue; 383 if (cookieConsentConfig[prop].includes(name)) { 384 group = prop; 385 break; 386 } 387 } 388 return group; 389 }, 390 isCookieAllowed(name) { 391 const cookieGroup = this.getGroupByCookieName(name); 392 return cookieGroup 393 ? window.cookie_consent_groups[cookieGroup] 394 : this.isWebsiteAllowedToSaveCookie(); 395 }, 396 saveTempStorageCookies() { 397 for (const [name, data] of Object.entries(cookieTempStorage)) { 398 if (this.isCookieAllowed(name)) { 399 this.set(name, data['value'], data['days'], data['skipSetDomain']); 400 delete cookieTempStorage[name]; 401 } 402 } 403 } 404 }; 405 406 hyva.getCookie = (name) => { 407 const cookieConfig = window.COOKIE_CONFIG || {}; 408 409 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 410 return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; 411 } 412 413 return internalCookie.get(name); 414 } 415 416 hyva.setCookie = (name, value, days, skipSetDomain) => { 417 const cookieConfig = window.COOKIE_CONFIG || {}; 418 419 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 420 cookieTempStorage[name] = {value, days, skipSetDomain}; 421 return; 422 } 423 return internalCookie.set(name, value, days, skipSetDomain); 424 } 425 426 427 hyva.setSessionCookie = (name, value, skipSetDomain) => { 428 return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) 429 } 430 431 hyva.getBrowserStorage = () => { 432 const browserStorage = window.localStorage || window.sessionStorage; 433 if (!browserStorage) { 434 console.warn('Browser Storage is unavailable'); 435 return false;
436 } 437 try { 438 browserStorage.setItem('storage_test', '1'); 439 browserStorage.removeItem('storage_test'); 440 } catch (error) { 441 console.warn('Browser Storage is not accessible', error); 442 return false; 443 } 444 return browserStorage; 445 } 446 447 hyva.postForm = (postParams) => { 448 const form = document.createElement("form"); 449 450 let data = postParams.data; 451 452 if (! postParams.skipUenc && ! data.uenc) { 453 data.uenc = btoa(window.location.href); 454 } 455 form.method = "POST"; 456 form.action = postParams.action; 457 458 Object.keys(postParams.data).map(key => { 459 const field = document.createElement("input"); 460 field.type = 'hidden' 461 field.value = postParams.data[key]; 462 field.name = key; 463 form.appendChild(field); 464 }); 465 466 const form_key = document.createElement("input"); 467 form_key.type = 'hidden'; 468 form_key.value = hyva.getFormKey(); 469 form_key.name="form_key"; 470 form.appendChild(form_key); 471 472 document.body.appendChild(form); 473 474 form.submit(); 475 } 476 477 hyva.getFormKey = function () { 478 let formKey = hyva.getCookie('form_key'); 479 480 if (!formKey) { 481 formKey = generateRandomString(); 482 hyva.setCookie('form_key', formKey); 483 } 484 485 return formKey; 486 } 487 488 hyva.formatPrice = (value, showSign, options = {}) => { 489 const groupSeparator = options.groupSeparator; 490 const decimalSeparator = options.decimalSeparator 491 delete options.groupSeparator; 492 delete options.decimalSeparator; 493 const formatter = new Intl.NumberFormat( 494 'nl\u002DNL', 495 Object.assign({ 496 style: 'currency', 497 currency: 'EUR', 498 signDisplay: showSign ? 'always' : 'auto' 499 }, options) 500 ); 501 return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? 502 formatter.formatToParts(value).map(({type, value}) => { 503 switch (type) { 504 case 'currency': 505 return '\u20AC' || value; 506 case 'minusSign': 507 return '- '; 508 case 'plusSign': 509 return '+ '; 510 case 'group': 511 return groupSeparator !== undefined ? groupSeparator : value; 512 case 'decimal': 513 return decimalSeparator !== undefined ? decimalSeparator : value; 514 default : 515 return value; 516 } 517 }).reduce((string, part) => string + part) : 518 formatter.format(value); 519 } 520 521 const formatStr = function (str, nStart) { 522 const args = Array.from(arguments).slice(2); 523 524 return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { 525 const idx = parseInt(n) - nStart; 526 527 if (args[idx] === null || args[idx] === void 0) { 528 return m; 529 } 530 return p.length % 2 531 ? p.slice(0, -1).replace('%%', '%') + args[idx] 532 : p.replace('%%', '%') + n; 533 }) 534 } 535 536 hyva.str = function (string) { 537 const args = Array.from(arguments); 538 args.splice(1, 0, 1); 539 540 return formatStr.apply(undefined, args); 541 } 542 543 hyva.strf = function () { 544 const args = Array.from(arguments); 545 args.splice(1, 0, 0); 546 547 return formatStr.apply(undefined, args); 548 } 549 550 /** 551 * Take a html string as `content` parameter and 552 * extract an element from the DOM to replace in 553 * the current page under the same selector, 554 * defined by `targetSelector` 555 */ 556 hyva.replaceDomElement = (targetSelector, content) => { 557 558 const parser = new DOMParser(); 559 const doc = parser.parseFromString(content, 'text/html');
560 const contentNode = doc.querySelector(targetSelector); 561 562 563 if (!contentNode || !document.querySelector(targetSelector)) { 564 return; 565 } 566 567 hyva.activateScripts(contentNode); 568 document.querySelector(targetSelector).replaceWith(contentNode); 569 570 571 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 572 hyva.initMessages(); 573 } 574 575 hyva.removeScripts = (contentNode) => { 576 const scripts = contentNode.getElementsByTagName('script'); 577 for (let i = 0; i < scripts.length; i++) { 578 scripts[i].parentNode.removeChild(scripts[i]); 579 } 580 const templates = contentNode.getElementsByTagName('template'); 581 for (let i = 0; i < templates.length; i++) { 582 const container = document.createElement('div'); 583 container.innerHTML = templates[i].innerHTML; 584 hyva.removeScripts(container); 585 templates[i].innerHTML = container.innerHTML; 586 } 587 } 588 589 hyva.activateScripts = (contentNode) => { 590 const scripts = Array.from(contentNode.getElementsByTagName('script')); 591 592 593 for (const original of scripts) { 594 const script = document.createElement('script'); 595 original.type && (script.type = original.type); 596 script.innerHTML = original.innerHTML; 597 598 599 original.parentNode.removeChild(original) 600 601 602 document.head.appendChild(script); 603 } 604 605 return contentNode; 606 } 607 608 const replace = {['+']: '-', ['/']: '_', ['=']: ','}; 609 hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); 610 611 let currentTrap; 612 613 const focusableElements = (rootElement) => { 614 const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]'; 615 return Array.from(rootElement.querySelectorAll(selector)) 616 .filter(el => { 617 return el.style.display !== 'none' 618 && !el.disabled 619 && el.tabIndex !== -1 620 && (el.offsetWidth || el.offsetHeight || el.getClientRects().length) 621 }) 622 } 623 624 const focusTrap = (e) => { 625 const isTabPressed = e.key === 'Tab' || e.keyCode === 9; 626 if (!isTabPressed) return; 627 628 const focusable = focusableElements(currentTrap) 629 const firstFocusableElement = focusable[0] 630 const lastFocusableElement = focusable[focusable.length - 1] 631 632 e.shiftKey 633 ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) 634 : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) 635 }; 636 637 hyva.releaseFocus = (rootElement) => { 638 if (currentTrap && (!rootElement || rootElement === currentTrap)) { 639 currentTrap.removeEventListener('keydown', focusTrap) 640 currentTrap = null 641 } 642 } 643 hyva.trapFocus = (rootElement) => { 644 if (!rootElement) return; 645 hyva.releaseFocus() 646 currentTrap = rootElement 647 rootElement.addEventListener('keydown', focusTrap) 648 const firstElement = focusableElements(rootElement)[0] 649 firstElement && firstElement.focus() 650 } 651 652 hyva.safeParseNumber = (rawValue) => { 653 const number = rawValue ? parseFloat(rawValue) : null; 654 655 return Array.isArray(number) || isNaN(number) ? rawValue : number; 656 } 657 658 const toCamelCase = s => s.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(''); 659 hyva.createBooleanObject = (name, value = false, additionalMethods = {}) => { 660 661 const camelCase = toCamelCase(name); 662 const key = '__hyva_bool_' + name 663 664 return new Proxy(Object.assign( 665 additionalMethods, 666 { 667 [key]: !!value, 668 [name]() {return !!this[key]}, 669 ['!' + name]() {return !this[key]}, 670 ['not' + camelCase]() {return !this[key]}, 671 ['toggle' + camelCase]() {this[key] = !this[key]}, 672 [`set${camelCase}True`]() {this[key] = true}, 673 [`set${camelCase}False`]() {this[key] = false}, 674 } 675 ), { 676 set(target, prop, value) { 677 return prop === name 678 ? (target[key] = !!value) 679 : Reflect.set(...arguments); 680 } 681 }) 682 } 683 684 hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true}) 685 window.addEventListener('alpine:init', () => Alpine.data('{}', () => ({})), {once: true}); 686 window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) 687 688 }( window.hyva = window.hyva || {} ));</script>
688<script> 689 'use strict'; 690 (function(hyva, undefined) { 691 hyva.formatPrice = (value, showSign = false, options = {}) => { 692 value = Math.round(value * 100) / 100; 693 694 const formatter = new Intl.NumberFormat( 695 'nl\u002DNL', 696 Object.assign({ 697 style: 'currency', 698 currency: 'EUR', 699 signDisplay: showSign ? 'always' : 'auto' 700 }, options) 701 ); 702 703 let formattedPrice; 704 705 if (typeof Intl.NumberFormat.prototype.formatToParts === 'function') { 706 formattedPrice = formatter.formatToParts(value).map(({type, value}) => { 707 switch (type) { 708 case 'currency': return ''; 709 default: return value; 710 } 711 }).reduce((string, part) => string + part, ''); 712 } else { 713 formattedPrice = formatter.format(value); 714 } 715 716 return formattedPrice.trim(); 717 }; 718 }(window.hyva = window.hyva || {})); 719</script>
719<script> 720 if (!window.IntersectionObserver) { 721 window.IntersectionObserver = function (callback) { 722 this.observe = el => el && callback(this.takeRecords()); 723 this.takeRecords = () => [{isIntersecting: true, intersectionRatio: 1}]; 724 this.disconnect = () => {}; 725 this.unobserve = () => {}; 726 } 727 }</script>
727 728<link rel="alternate" hreflang="es" href="https://www.reydelfutbol.es/" /> 729<link rel="alternate" hreflang="fr" href="https://www.roidufoot.fr/" /> 730<link rel="alternate" hreflang="nl-be" href="https://www.voetbalshirtskoning.be/" /> 731<link rel="alternate" hreflang="nl-nl" href="https://www.voetbalshirtskoning.nl/" /><style> .ec-gtm-cookie-directive > div { background: #ffffff; color: #000000; -webkit-border-radius: 8px; -moz-border-radius: 8px; -ms-border-radius: 8px; -o-border-radius: 8px; border-radius: 8px; } .ec-gtm-cookie-directive > div > div > div { padding-left: 0px; } .ec-gtm-cookie-directive > div > div > div a.action.accept, .ec-gtm-cookie-directive > div > div > div a.action.accept-all { color: #8bc53f; } .ec-gtm-cookie-directive > div > div > div a.action.refuse, .ec-gtm-cookie-directive > div > div > div a.action.customize { color: #000000; } .ec-gtm-cookie-directive > div > div > div .ec-gtm-cookie-directive-note-toggle { color: #8bc53f; } .ec-gtm-cookie-directive-segments { background: #ffffff; } .ec-gtm-cookie-directive-segments > div input[type="checkbox"] + label:before { border:1px solid #000000; } .ec-gtm-cookie-directive .consent-logo { width: 0px; } </style></head> 732<body class="hide-mobile-arrows cms-home vendic-poscodenl-enabled cms-index-index page-layout-1column" id="html-body"> 733<!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 733-734
733 734<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
734GTM-NH3PC7PC
vendor: 85 bytes, lines 734-735
734" 735height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
736<!-- End Google Tag Manager (noscript) --><input name="form_key" type="hidden" value="kg814vNZzfNGE6fR" /><noscript> 737 <section class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal"> 738 <div class="container text-center"> 739 <p> 740 <strong>JavaScript lijkt te zijn uitgeschakeld in uw browser.</strong> 741 <span> 742 Voor de beste gebruikerservaring, zorg ervoor dat javascript ingeschakeld is voor uw browser. </span> 743 </p> 744 </div> 745 </section> 746 </noscript>
746<script> 747 document.body.addEventListener('touchstart', () => {}, {passive: true}) 748</script>
748<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 749 contentarea" 750 href="#contentarea"> 751 <span> 752 Ga naar de inhoud </span> 753</a>
753<script> 754 'use_strict'; 755 (() => { 756 function initKlaviyo() { 757 return new Promise((resolve, reject) => { 758 const script = document.createElement('script'); 759 script.src = 'https://static.klaviyo.com/onsite/js/klaviyo.js?company_id=Xkd5iU'; 760 script.type = 'text/javascript'; 761 script.async = true; 762 763 764 script.onload = () => resolve(); 765 script.onerror = () => reject(new Error('Script loading failed')); 766 767 document.head.append(script); 768 }); 769 } 770 771 function initKlaviyoCustomerTracking() { 772 const magentoCacheStorage = JSON.parse(window.localStorage.getItem('mage-cache-storage')); 773 const customer = magentoCacheStorage ? magentoCacheStorage.customer : null; 774 775 let _learnq = window._learnq || []; 776 777 if (!customer || !customer.email) { 778 return; 779 } 780 781 _learnq.push(['identify', { 782 '$email': customer.email, 783 '$first_name': customer.firstname ? customer.firstname : '', 784 '$last_name': customer.lastname ? customer.lastname : '' 785 }]); 786 }; 787 788 window.addEventListener('init-external-scripts', () => { 789 initKlaviyo().then(() => { 790 initKlaviyoCustomerTracking(); 791 window.dispatchEvent(new Event('klaviyo-initialized')); 792 }).catch((error) => { 793 console.error('Error loading Klaviyo script:', error); 794 }); 795 }, {once: true, passive: true}); 796 }) 797 ();</script>
797<script> 798 function initHeader () { 799 return { 800 searchOpen: false, 801 cart: {}, 802 getData(data) { 803 if (data.cart) { this.cart = data.cart } 804 } 805 } 806 } 807</script>
807 808<div id="header" 809 class="header-content-wrapper" 810 x-data="initHeader()" 811 @keydown.window.escape="searchOpen = false; document.getElementById('search-overlay').classList.add('hidden')" 812 @private-content-loaded.window="getData(event.detail.data)" 813> 814 <div class="header-content"> 815 <!--Mobile menu--> 816 <button x-data="initMenuMobileToggler()" id="mobile-menu-toggler" @click.stop="!isTouch && onClick()" @touchstart.prevent="isTouch = true; onClick()" class="mobile-menu-toggler pointer" aria-controls="mobile-menu" aria-expanded="false"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="28" height="28" role="img"> 817 <path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"/> 818<title>menu</title></svg> 819</button> <section id="mobile-menu" class="hidden mobile-menu" x-data="initMenuMobile()" x-init="$nextTick(() => { $root.classList.remove('hidden'); $watch('open', value => { value ? document.body.classList.add('overflow-hidden') : document.body.classList.remove('overflow-hidden'); value ? document.querySelector('main').setAttribute('aria-hidden', 'true') : document.querySelector('main').removeAttribute('aria-hidden'); }) })" @toggle-mobile-menu.window="open=true"><div role="dialog" aria-labelledby="mobile-menu-title" aria-modal="true" @click.outside="open=false" class="mobile-menu-inner-wrapper"><div class="backdrop" x-show="open" x-transition:enter="ease-in-out duration-500" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in-out duration-500" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" @click="open=false" aria-label="Close panel"></div><div class="mobile-menu-inner" x-show="open" x-transition:enter="transform transition ease-in-out duration-500" x-transition:enter-start="-translate-x-full" x-transition:enter-end="translate-x-0" x-transition:leave="transform transition ease-in-out duration-500" x-transition:leave-start="translate-x-0" x-transition:leave-end="-translate-x-full"><div class="flex items-center justify-center mobile-menu-top relative px-2 py-3 xxs:px-4 bg-container-lighter"><a x-ref="closeButton" class="flex items-center justify-center btn-icon absolute left-4" @click.prevent.stop="open=false" href="#" aria-label="Close mobile menu"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="p-2" width="40" height="40" role="img"> 820 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 821<title>x</title></svg> 822</a> <div class="logo-wrapper mx-auto md:m-0 max-md:w-auto"> 823 <a class="logo font-title" 824 href="https://www.voetbalshirtskoning.nl/" 825 title="Goedkope voetbalshirts - Voetbalshirtskoning.nl" 826 aria-label="store logo"> 827 <img class="max-h-8 md:max-h-full max-md:w-auto" src="https://www.voetbalshirtskoning.nl/img/anuN-is17UZ-InkLKMKEuB6fMqhgrmqt1lfz33jS8Hk/resize:fit:0:0/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9zdGF0aWMvdmVyc2lvbjIwMjYxMDAyMTQzMTM5L2Zyb250ZW5kL1ZlbmRpYy92b2V0YmFsc2hpcnRza29uaW5nL25sX05ML2ltYWdlcy9sb2dvLnN2Zw.svg" 828 title="Goedkope voetbalshirts - Voetbalshirtskoning.nl" 829 alt="Goedkope voetbalshirts - Voetbalshirtskoning.nl" 830 width="112" 831 width="32" 832 loading="lazy" 833 /> 834 </a> 835</div></div><h2 id="mobile-menu-title" class="sr-only">Mobile menu</h2><div class="mobile-menu-wrapper"><!--Do not remove empty container below, it's required for fetching menu html--><div id="mobile-menu-container" aria-live="polite"><template x-if="isLoading"><div class="mobile-menu-loader-wrapper"><svg class="animate-spin h-7 w-7 p-1" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg></div></template></div><div class="mobile-nav-additional"> </div></div></div></div></section>
835<script> 836 function initMenuMobileToggler() { 837 return { 838 isTouch: false, 839 onClick: function () { 840 this.$dispatch('toggle-mobile-menu', {}); 841 } 842 } 843 } 844 845 function initMenuMobile() { 846 return { 847 menuHeight: null, 848 level: 0, 849 open: false, 850 isLoading: false, 851 isMobileMenuLoaded: false, 852 init() { 853 var self = this; 854 855 const toggler = document.getElementById('mobile-menu-toggler'); 856 const menuInner = this.$root.querySelector('.mobile-menu-inner'); 857 858 this.$watch('open', function (value) { 859 if (!self.isMobileMenuLoaded) { 860 self.fetchMobileMenuHtml(); 861 } 862 863 toggler.setAttribute('aria-expanded', value.toString()); 864 865 if (value) { 866 self.$nextTick(() => { 867 hyva.trapFocus(menuInner); 868 self.$refs.closeButton.focus(); 869 }); 870 } else { 871 hyva.releaseFocus(menuInner); 872 self.$nextTick(() => { 873 toggler.focus(); 874 }); 875 } 876 }); 877 878 this.$root.addEventListener('keydown', function (e) { 879 if (e.key === 'Enter' || e.key === ' ') { 880 const target = e.target.closest('.back-link'); 881 if (target) { 882 target.click(); 883 e.preventDefault(); 884 } 885 } else if (e.key === 'Escape' && self.open) { 886 self.open = false; 887 } 888 }); 889 890 this.$root.addEventListener('click', function (e) { 891 if (self.open && !menuInner.contains(e.target)) { 892 self.open = false; 893 } 894 }); 895 }, 896 height: function () { 897 if (this.level === 0) { 898 return ''; 899 } 900 901 return this.menuHeight ? 'height: ' + this.menuHeight + 'px' : ''; 902 }, 903 showSubmenu: function (event, level) { 904 var menuItem = event.target.closest('.menu-item'); 905 906 if (menuItem.parentElement.querySelector('.menu-item.active')) { 907 menuItem.parentElement.querySelector('.menu-item.active').classList.remove('active'); 908 } 909 menuItem.classList.add('active'); 910 this.level = level; 911 912 this.menuHeight = menuItem.querySelector('.submenu.submenu-level-' + this.level).offsetHeight; 913 setTimeout(() => { 914 this.$refs.closeButton.focus(); 915 }, 200); 916 }, 917 918 back: function (event, level) { 919 var self = this, 920 menuItem = event.target.closest('.menu-item'); 921 922 this.level = level; 923 self.menuHeight = menuItem.closest('.mobile-nav').offsetHeight; 924 925 setTimeout(function () { 926 menuItem.parentElement.querySelector('.menu-item.active').classList.remove('active'); 927 self.$refs.closeButton.focus(); 928 }, 500); 929 }, 930 fetchMobileMenuHtml: function () { 931 let self = this, 932 getUrl = BASE_URL + 'theme-module/block/mobileMenu'; 933 934 this.isLoading = true; 935 936 fetch(getUrl, { 937 method: 'GET', 938 headers: { 939 'X-Requested-With': 'XMLHttpRequest' 940 } 941 }) 942 .then(response => response.json()) 943 .then(result => { 944 if (result.error) { 945 console.warn(result.errors); 946 } else if (result.menuHtml) { 947 document.getElementById('mobile-menu-container').innerHTML = result.menuHtml; 948 self.isMobileMenuLoaded = true; 949 setTimeout(() => { 950 self.$refs.closeButton.focus(); 951 }, 50); 952 } 953 self.isLoading = false;
954 }); 955 } 956 } 957 }</script>
957 958 <!--Logo--> 959 <div class="logo-wrapper mx-auto md:m-0 max-md:w-auto"> 960 <a class="logo font-title" 961 href="https://www.voetbalshirtskoning.nl/" 962 title="Goedkope voetbalshirts - Voetbalshirtskoning.nl" 963 aria-label="store logo"> 964 <img class="max-h-8 md:max-h-full max-md:w-auto" src="https://www.voetbalshirtskoning.nl/img/anuN-is17UZ-InkLKMKEuB6fMqhgrmqt1lfz33jS8Hk/resize:fit:0:0/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9zdGF0aWMvdmVyc2lvbjIwMjYxMDAyMTQzMTM5L2Zyb250ZW5kL1ZlbmRpYy92b2V0YmFsc2hpcnRza29uaW5nL25sX05ML2ltYWdlcy9sb2dvLnN2Zw.svg" 965 title="Goedkope voetbalshirts - Voetbalshirtskoning.nl" 966 alt="Goedkope voetbalshirts - Voetbalshirtskoning.nl" 967 width="200" 968 width="45" 969 /> 970 </a> 971</div> 972 <!--Search--> 973 <div class="hidden md:mx-auto md:px-4 md:static md:flex-1 md:max-w-[512px] md:shadow-none md:bg-transparent md:border-0" 974 id="search-content" 975 :class="{ 976 'block absolute z-10 w-full top-full left-0 bg-header shadow-sm': searchOpen, 977 'hidden': !searchOpen 978 }" 979 x-show="searchOpen" 980 @click.outside="searchOpen = false; document.getElementById('search-overlay').classList.add('hidden')" 981 @toggle-search.window="searchOpen=!searchOpen; document.getElementById('search-overlay').classList.toggle('hidden')" 982 > 983
983<script> 984 function initMiniSearchComponent() { 985 "use strict"; 986 987 return { 988 show:false, 989 formSelector: "#search_mini_form", 990 url: "https://www.voetbalshirtskoning.nl/search/ajax/suggest/", 991 destinationSelector: "#search_autocomplete", 992 templates: {"term":{"title":"Termen zoeken","template":"Hyva_SmileElasticsuite::core\/autocomplete\/term.phtml"},"product":{"title":"Producten","template":"Hyva_SmileElasticsuite::catalog\/autocomplete\/product.phtml"},"category":{"title":"Categorie\u00ebn","template":"Hyva_SmileElasticsuite::catalog\/autocomplete\/category.phtml"},"product_attribute":{"title":"Attributen","template":"Hyva_SmileElasticsuite::catalog\/autocomplete\/product_attribute.phtml","titleRenderer":"renderEsAutocompleteTitleAttribute"},"cms_page":{"title":"Cms page","template":"Hyva_SmileElasticsuite::cms-search\/autocomplete\/cms.phtml"}}, 993 priceFormat: {"pattern":"%s","precision":2,"requiredPrecision":2,"decimalSymbol":",","groupSymbol":".","groupLength":3,"integerRequired":false}, 994 minSearchLength: 1, 995 searchResultsByType: {}, 996 currentRequest: null, 997 searchRequest: '', 998 searchUrl: "https://www.voetbalshirtskoning.nl/catalogsearch/result/?q=", 999 showSearchOverlay: false, 1000 1001 /** 1002 * Get search results. 1003 */ 1004 getSearchResults: function () { 1005 let value = document.querySelector('#search').value.trim(); 1006 1007 if (value.length < parseInt(this.minSearchLength, 10)) { 1008 this.searchResultsByType = []; 1009 1010 return false; 1011 } 1012 1013 let url = this.url + '?' + new URLSearchParams({ 1014 q: document.querySelector('#search').value, 1015 _: Date.now() 1016 }).toString(); 1017 1018 if (this.currentRequest !== null) { 1019 this.currentRequest.abort(); 1020 } 1021 this.currentRequest = new AbortController(); 1022 1023 fetch(url, { 1024 method: 'GET', 1025 signal: this.currentRequest.signal, 1026 }).then((response) => { 1027 if (response.ok) { 1028 return response.json(); 1029 } 1030 }).then((data) => { 1031 this.show = data.length > 0; 1032 1033 this.searchResultsByType = data.reduce((acc, result) => { 1034 if (! acc[result.type]) acc[result.type] = []; 1035 acc[result.type].push(result); 1036 return acc; 1037 }, {}); 1038 1039 if (this.show) { 1040 document.getElementById('search-overlay').classList.remove('hidden'); 1041 1042 } 1043 }).catch((error) => {}); 1044 } 1045 } 1046 } 1047</script>
1047 1048<div id="search-content" x-show="true"> 1049 <div class="relative pb-3 pt-2 px-4 md:p-0 " 1050 x-data="initMiniSearchComponent()" 1051 :class="{ 'z-40': show || showSearchOverlay }" 1052 @click.outside="show = false; document.getElementById('search-overlay').classList.add('hidden')" 1053 @focusout="if ($event.relatedTarget && !$el.contains($event.relatedTarget)) show = false" 1054 @close-search-autocomplete.window="show = false" 1055 x-effect="document.getElementById('search-overlay').classList.toggle('hidden', !show && !showSearchOverlay)" 1056 > 1057 <form class="form minisearch" id="search_mini_form" action="https://www.voetbalshirtskoning.nl/catalogsearch/result/" method="get"> 1058 <div class="relative"> 1059 <label for="search" class="sr-only">Zoek</label> 1060 <input id="search" 1061 aria-label="Zoek" 1062 class="rounded-full py-[9px] bg-search-field shadow-none 1063 focus:!shadow-none w-full pr-11 text-[1rem] text-search-field 1064 placeholder:text-elements-black-400 !border-search-field md:text-[0.875rem]" 1065 x-on:input.debounce="getSearchResults()" 1066 x-on:focus="showSearchOverlay = true" 1067 x-on:blur="showSearchOverlay = false" 1068 x-model="searchRequest" 1069 x-ref="searchInput" 1070 type="text" 1071 autocapitalize="off" autocomplete="off" autocorrect="off" 1072 name="q" 1073 value="" 1074 placeholder="Waar ben je naar op zoek?" 1075 maxlength="128" 1076 data-testid="search-input" 1077 /> 1078 <button class="absolute right-1 top-0 flex w-10 h-10 items-center justify-center text-search-field-icon" 1079 data-testid="search-button" 1080 > 1081 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" role="img"> 1082 <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/> 1083<title>search</title></svg> 1084 </button> 1085 </div> 1086 <div id="search_autocomplete" class="search-autocomplete relative w-full" x-show="show" style="display:none;"> 1087 <div class="absolute bg-white z-50 w-full shadow-2xl rounded-sm px-4 pb-2 top-2"> 1088 <template x-for="searchResultByType in Object.values(searchResultsByType)"> 1089 <div> 1090 <template x-if="searchResultByType.hasOwnProperty(0) && templates[searchResultByType[0].type].title && templates[searchResultByType[0].type].titleRenderer === undefined"> 1091 <div class="font-semibold mt-4" x-text="templates[searchResultByType[0].type].title"></div> 1092 </template> 1093 <template x-if="searchResultByType.hasOwnProperty(0) && templates[searchResultByType[0].type].titleRenderer !== undefined"> 1094 <div class="font-bold pt-2 pl-2 text-center" x-text="window[templates[searchResultByType[0].type].titleRenderer](searchResultByType)"></div> 1095 </template> 1096 1097 <template x-for="searchResult in searchResultByType"> 1098 <div class="border-b border-primary last-of-type:border-b-0"> 1099 <template x-if="searchResult.type == 'term'"> 1100 <a class="search-autocomplete-category-link" 1101 x-bind:href="'https://www.voetbalshirtskoning.nl/catalogsearch/result/?q=' + searchResult.title" 1102 :title="searchResult.title"> 1103 <span class="text-sm" x-text="searchResult.title"></span> 1104 <span class="text-sm" x-text="'(' + searchResult.num_results + ')'"></span> 1105 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="16" height="16" role="img"> 1106 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1107<title>chevron-right</title></svg> 1108 </a> 1109</template> <template x-if="searchResult.type == 'product'"> 1110 <a class="w-full block py-4" :href="searchResult.url" :title="searchResult.title"> 1111 <div class="flex"> 1112 <div class="overflow-hidden rounded max-h-17 w-12 relative"> 1113 <img :src="searchResult.image" class="object-contain object-center inline-block max-w-full h-full" width="48" height="68"/> 1114 </div> 1115 <div class="flex-1 pl-4"> 1116 <div class="text-sm font-semibold mb-1" x-text="searchResult.title"></div> 1117 </div> 1118 </div> 1119 </a> 1120</template> <template x-if="searchResult.type == 'category'"> 1121 <a class="search-autocomplete-category-link" 1122 :href="searchResult.url" :title="searchResult.title">
1123 <span class="text-sm" x-text="searchResult.title"></span> 1124 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="16" height="16" role="img"> 1125 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1126<title>chevron-right</title></svg> 1127 </a> 1128</template> <template x-if="searchResult.type == 'product_attribute'"><a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title"><span class="text-sm" x-text="searchResult.title"></span> <span class="text-xs uppercase text-gray-500" x-text="searchResult.attribute_label" style="vertical-align: super;"></span></a></template>
1128<script> 1129 function renderEsAutocompleteTitleAttribute(data) 1130 { 1131 data = data.filter(function(item) { 1132 return item.type === 'product_attribute'; 1133 }).map(function(item) { 1134 return item['attribute_label'] 1135 }).reduce(function(prev, item) { 1136 if (item in prev) { 1137 prev[item]++; 1138 } else { 1139 prev[item] = 1; 1140 } 1141 return prev; 1142 }, {}); 1143 1144 data = Object.entries(data).sort(function(item1, item2) { 1145 return item2[1] - item1[1] 1146 }).map(function(item) {return item[0]}); 1147 1148 if (data.length > 2) { 1149 data = data.slice(0, 2); 1150 data.push('...'); 1151 } 1152 1153 return data.join(', '); 1154 }</script>
1154 <template x-if="searchResult.type == 'cms_page'"><a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title"><span class="text-sm" x-text="searchResult.title"></span></a></template> </div> 1155 </template> 1156 1157 <template x-if="searchResultByType[0].type === 'product'"> 1158 <div class="search-autocomplete-show-all-wrapper text-center"> 1159 <a :href="searchUrl + searchRequest" class="search-autocomplete-show-all"> 1160 Toon alle resultaten </a> 1161 </div> 1162 </template> 1163 </div> 1164 </template> 1165 </div> 1166 </div> 1167 </form> 1168 </div> 1169</div> </div> 1170 1171 <div class="hidden md:block mx-5 lg:mr-10 lg:ml-auto"> 1172 <p class="thuiswinkel-header-logo"><a href="https://www.thuiswinkel.org/leden/voetbalshirtskoning.nl/certificaat" target="_blank" rel="nofollow noopener"><img class="thuiswinkel-logo" src="https://www.voetbalshirtskoning.nl/img/JfaXKao-H5n1WgxWvlT2WQmLY6nQKEvF7KoSsXab5gM/resize:fit:0:0/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS93eXNpd3lnL1RodWlzd2lua2VsX1dhYXJib3JnX0tsZXVyX0hvcml6b250YWFsLnBuZw.png" alt="Thuiswinkel Waarborg" width="147" height="45" /></a></p> </div> 1173 1174 <div class="flex items-center order-3 gap-2 lg:gap-6"> 1175 <!--Search Icon--> 1176 <button id="menu-search-icon" 1177 class="inline-block no-underline btn-icon p-2" 1178 @click.prevent=" 1179 searchOpen = !searchOpen; 1180 document.getElementById('search-overlay').classList.toggle('hidden'); 1181 if (searchOpen) { 1182 const tmp = document.createElement('input'); 1183 tmp.style.cssText = 'position:absolute;opacity:0;height:0;font-size:16px;'; 1184 document.body.appendChild(tmp); 1185 tmp.focus(); 1186 $nextTick(() => { 1187 const searchInput = document.querySelector('#search'); 1188 if (searchInput) { searchInput.focus(); searchInput.select(); } 1189 tmp.remove(); 1190 }); 1191 } 1192 " 1193 > 1194 <span class="sr-only label"> 1195 Zoek </span> 1196 1197 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> 1198 <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/> 1199<title>search</title></svg> 1200 </button> 1201 1202 <!--Customer Icon & Dropdown--> 1203 <!-- BLOCK header.customer --><div class="elements-customer-menu relative inline-block md:ml-3 lg:ml-0"> 1204 <a 1205 href="https://www.voetbalshirtskoning.nl/customer/account/" 1206 id="customer-menu" 1207 class="block btn-icon p-2" 1208 aria-label="Aanmelden" 1209 title="Aanmelden" 1210 > 1211 <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"> 1212 <path stroke-linecap="round" stroke-linejoin="round" d="M5.121 17.804A13.937 13.937 0 0112 16c2.5 0 4.847.655 6.879 1.804M15 10a3 3 0 11-6 0 3 3 0 016 0zm6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 1213</svg> 1214 </a> 1215</div><!-- /BLOCK header.customer --> 1216 1217 <!--Cart Icon--> 1218 <a id="menu-cart-icon" 1219 class="relative inline-block no-underline btn-icon p-2" 1220 href="https://www.voetbalshirtskoning.nl/checkout/cart/index/" 1221 >
1222 <span class="sr-only label"> 1223 Cart </span> 1224 1225 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> 1226 <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"/> 1227<title>shopping-cart</title></svg> 1228 1229 <span x-text="cart.summary_count" 1230 class="minicart-summary-count" 1231 :class="{ 1232 'hidden': !cart.summary_count, 1233 'block': cart.summary_count }" 1234 ></span> 1235 </a> 1236 1237 <!--Cart Alert Popup--> 1238
1238<script> 1239 function initCartAlert() { 1240 return { 1241 visible: false, 1242 cart: {}, 1243 initialLoadProcessed: false, 1244 getData(data) { 1245 if (data.cart) { 1246 this.cart = data.cart; 1247 1248 if (!this.initialLoadProcessed) { 1249 this.initialLoadProcessed = true; 1250 this.checkShouldShow(); 1251 } 1252 } 1253 }, 1254 checkShouldShow() { 1255 if (sessionStorage.getItem('cart_alert_session')) { 1256 return; 1257 } 1258 1259 sessionStorage.setItem('cart_alert_session', '1'); 1260 1261 if (!this.cart.summary_count || this.cart.summary_count < 1) { 1262 return; 1263 } 1264 1265 document.body.classList.add('overflow-hidden'); 1266 this.visible = true; 1267 }, 1268 close() { 1269 document.body.classList.remove('overflow-hidden'); 1270 this.visible = false; 1271 } 1272 } 1273 } 1274</script>
1274 1275<div x-data="initCartAlert()" 1276 @private-content-loaded.window="getData($event.detail.data)" 1277 x-cloak 1278 x-show="visible" 1279> 1280 <div class="backdrop top-[64px] md:top-[68px] cursor-pointer" @click="close()"></div> 1281 <div class="fixed md:absolute border-t-2 md:border-0 border-[#00B700] z-50 1282 w-full max-md:left-0 max-md:right-0 max-md:bottom-0 md:right-1 1283 md:top-[62px] rounded bg-container-background pt-8 px-6 pb-12 1284 md:pb-0 md:px-3 md:pt-3 md:max-w-[448px]"> 1285 <div class="hidden md:block absolute bottom-full right-[50px] w-0 h-0 1286 border-l-8 border-l-transparent border-r-8 border-r-transparent 1287 border-b-[14px] border-b-[#F8FAFC]"></div> 1288 <div class="md:hidden absolute top-2 right-1.5 flex items-center 1289 justify-center w-[30px] h-[30px] rounded border 1290 border-[#E5E5E5] shadow" @click="close()"> 1291 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="h-4 w-4 text-[#444]" width="12" height="12" role="img"> 1292 <path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"/> 1293<title>x</title></svg> 1294 1295 </div> 1296 <h3 class="text-xl text-primary-title mb-2 font-bold">Hey, welkom terug!</h3> 1297 <p class="text-primary mb-6"> 1298 We hebben je producten bewaard van je vorige bezoek. </p> 1299 <div class="flex justify-between items-center gap-2.5 max-md:flex-col-reverse"> 1300 <button class="flex items-center gap-3 text-[#565454]" @click="close()"> 1301 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="24" viewBox="0 0 12 24" fill="none" class="h-6 w-3" role="img"> 1302 <path d="M9.54801 6.58023L8.48701 5.52023L2.70801 11.2972C2.61486 11.3898 2.54093 11.4999 2.49048 11.6211C2.44003 11.7424 2.41406 11.8724 2.41406 12.0037C2.41406 12.1351 2.44003 12.2651 2.49048 12.3863C2.54093 12.5076 2.61486 12.6177 2.70801 12.7102L8.48701 18.4902L9.54701 17.4302L4.12301 12.0052L9.54801 6.58023Z" fill="currentColor"/> 1303<title>chevron-left</title></svg> 1304 <span>Verder winkelen</span> 1305 </button> 1306 <div class="gotocart-btn-wrapper py-3 w-full md:max-w-[256px]"> 1307 <a href="https://www.voetbalshirtskoning.nl/checkout/cart/" 1308 class="btn btn-primary action p-3 gap-3 w-full font-bold" 1309 aria-label="Go to Cart Page" 1310 > 1311 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="h-6 w-6" width="24" height="24" role="img"> 1312 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"/> 1313<title>shopping-cart</title></svg> 1314 <span>Bekijk winkelwagen</span> 1315 </a> 1316 </div> 1317 </div> 1318 </div> 1319</div> 1320 </div> 1321 </div> 1322
1323 <!--Cart Drawer--> 1324 1325 <!--Main Navigation--> 1326 </div> 1327<div id="search-overlay" class="search-overlay hidden cursor-pointer" @click="$dispatch('toggle-search',{});"></div><div class="nav-sections navigation " 1328 x-data="initMenuDesktop_6ac34b2eb349c()" 1329> 1330 <div class="nav-sections-container"> 1331 <!-- desktop --> 1332 <div x-ref="nav-desktop" @load.window="setActiveMenu($root)"> 1333 <nav 1334 class="w-full duration-150 ease-in-out transform relative min-h-0 transition-display text-[15px] desktop-nav 1335 flex justify-start" 1336 > 1337 <div class="relative level-0 level-top group" 1338 @mouseleave="level = 0; menuHeight = null; maxMenuHeight = null;"> 1339 <span class="flex items-center"> 1340 <a class="level-top-link level-0" 1341 href="https://www.voetbalshirtskoning.nl/voetbaltenues/" 1342 title="Voetbaltenues" 1343 data-testid="desktop-menu-category-item-link" 1344 > 1345 <span class="py-1 block level-top-link-text"> 1346 Voetbaltenues </span> 1347 </a> 1348 </span> 1349 </div> 1350 <div class="relative level-0 level-top group" 1351 @mouseleave="level = 0; menuHeight = null; maxMenuHeight = null;"> 1352 <span class="flex items-center"> 1353 <a class="level-top-link level-0" 1354 href="https://www.voetbalshirtskoning.nl/voetbalshirts/" 1355 title="Voetbalshirts" 1356 data-testid="desktop-menu-category-item-link" 1357 > 1358 <span class="py-1 block level-top-link-text"> 1359 Voetbalshirts </span> 1360 </a> 1361 </span> 1362 </div> 1363 <div class="relative level-0 level-top group" 1364 @mouseleave="level = 0; menuHeight = null; maxMenuHeight = null;"> 1365 <span class="flex items-center"> 1366 <a class="level-top-link level-0" 1367 href="https://www.voetbalshirtskoning.nl/trainingspakken/" 1368 title="Trainingspakken" 1369 data-testid="desktop-menu-category-item-link" 1370 > 1371 <span class="py-1 block level-top-link-text"> 1372 Trainingspakken </span> 1373 </a> 1374 </span> 1375 </div> 1376 <div class="relative level-0 level-top group" 1377 @mouseleave="level = 0; menuHeight = null; maxMenuHeight = null;"> 1378 <span class="flex items-center"> 1379 <a class="level-top-link level-0" 1380 href="https://www.voetbalshirtskoning.nl/fanshop/" 1381 title="Fanshop" 1382 data-testid="desktop-menu-category-item-link" 1383 > 1384 <span class="py-1 block level-top-link-text"> 1385 Fanshop </span> 1386 </a> 1387 </span> 1388 </div> 1389 <div class="relative level-0 level-top group" 1390 @mouseleave="level = 0; menuHeight = null; maxMenuHeight = null;">
1391 <span class="flex items-center"> 1392 <a class="level-top-link level-0" 1393 href="https://www.voetbalshirtskoning.nl/voetbaldoelen/" 1394 title="Voetbaldoelen" 1395 data-testid="desktop-menu-category-item-link" 1396 > 1397 <span class="py-1 block level-top-link-text"> 1398 Voetbaldoelen </span> 1399 </a> 1400 </span> 1401 </div> 1402 <div class="relative level-0 level-top group" 1403 @mouseleave="level = 0; menuHeight = null; maxMenuHeight = null;"> 1404 <span class="flex items-center"> 1405 <a class="level-top-link level-0" 1406 href="https://www.voetbalshirtskoning.nl/voetbalsokken/" 1407 title="Voetbalsokken" 1408 data-testid="desktop-menu-category-item-link" 1409 > 1410 <span class="py-1 block level-top-link-text"> 1411 Voetbalsokken </span> 1412 </a> 1413 </span> 1414 </div> 1415 <div class="relative level-0 level-top group" 1416 @mouseleave="level = 0; menuHeight = null; maxMenuHeight = null;"> 1417 <span class="flex items-center"> 1418 <a class="level-top-link level-0" 1419 href="https://www.voetbalshirtskoning.nl/voetballen/" 1420 title="Voetballen" 1421 data-testid="desktop-menu-category-item-link" 1422 > 1423 <span class="py-1 block level-top-link-text"> 1424 Voetballen </span> 1425 </a> 1426 </span> 1427 </div> 1428 <div class="relative level-0 level-top group" 1429 @mouseleave="level = 0; menuHeight = null; maxMenuHeight = null;"> 1430 <span class="flex items-center"> 1431 <a class="level-top-link level-0" 1432 href="https://www.voetbalshirtskoning.nl/voetbalshirt-bedrukken/" 1433 title="Bedrukken" 1434 data-testid="desktop-menu-category-item-link" 1435 > 1436 <span class="py-1 block level-top-link-text"> 1437 Bedrukken </span> 1438 </a> 1439 </span> 1440 </div> 1441 <div class="relative level-0 level-top group" 1442 @mouseleave="level = 0; menuHeight = null; maxMenuHeight = null;"> 1443 <span class="flex items-center"> 1444 <a class="level-top-link level-0" 1445 href="https://www.voetbalshirtskoning.nl/voetbalshirts-outlet/" 1446 title="Sale" 1447 data-testid="desktop-menu-category-item-link" 1448 > 1449 <span class="py-1 block level-top-link-text"> 1450 Sale </span> 1451 </a> 1452 </span> 1453 </div> 1454 </nav> 1455 </div> 1456 </div> 1457</div>
1458<script> 1459 'use strict'; 1460 1461 const initMenuDesktop_6ac34b2eb349c = () => { 1462 return { 1463 1464 setActiveMenu(menuNode) { 1465 const clean = (url) => url.replace(/\/$/, '').replace(/\.html$/, ''); 1466 const currentUrl = clean(window.location.href.split('?')[0]); 1467 1468 let breadcrumbCategoryUrl = ''; 1469 let blogUrl = ''; 1470 1471 const breadcrumbItems = document.querySelectorAll('.breadcrumbs .item'); 1472 1473 breadcrumbItems.forEach((item) => { 1474 const link = item.querySelector('a'); 1475 const isProduct = item.classList.contains('product'); 1476 const isHome = item.classList.contains('home'); 1477 const isBlog = item.classList.contains('blog'); 1478 1479 if (link) { 1480 const href = clean(link.href); 1481 if (isBlog && !blogUrl) { 1482 blogUrl = href; 1483 } 1484 if (!isHome && !isProduct) { 1485 breadcrumbCategoryUrl = href; 1486 } 1487 } 1488 }); 1489 1490 if (blogUrl) { 1491 breadcrumbCategoryUrl = blogUrl; 1492 } 1493 1494 Array.from(menuNode.querySelectorAll('a')).forEach(link => { 1495 const href = clean(link.href); 1496 1497 if (href === currentUrl || (breadcrumbCategoryUrl && href === breadcrumbCategoryUrl)) { 1498 const topLevel = link.closest('.level-0'); 1499 if (topLevel) { 1500 const textSpan = topLevel.querySelector('.level-top-link-text'); 1501 if (textSpan) { 1502 textSpan.classList.add('!border-b-desktop-nav-item-hover'); 1503 } 1504 } 1505 } 1506 }); 1507 } 1508 } 1509 } 1510</script>
1510</header><main id="maincontent" class="page-main"><div id="contentarea" tabindex="-1"></div><div class="columns"><div class="column main"><div class="page messages">
1510<script> 1511 window.defaultSuccessMessageTimeout = 5000; 1512 function initMessages() { 1513 "use strict"; 1514 return { 1515 messages: window.mageMessages || [], 1516 isEmpty() { 1517 return this.messages.reduce( 1518 function (isEmpty, message) { 1519 return isEmpty && message === undefined 1520 }, true 1521 ) 1522 }, 1523 removeMessage(messageIndex) { 1524 this.messages[messageIndex] = undefined; 1525 }, 1526 addMessages(messages, hideAfter) { 1527 messages.map((message) => { 1528 this.messages = this.messages.concat(message); 1529 if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) { 1530 hideAfter = window.defaultSuccessMessageTimeout; 1531 } 1532 if (hideAfter) { 1533 this.setHideTimeOut(this.messages.length -1, hideAfter); 1534 } 1535 }); 1536 }, 1537 setHideTimeOut(messageIndex, hideAfter) { 1538 setTimeout((messageIndex) => { 1539 this.removeMessage(messageIndex); 1540 }, hideAfter, messageIndex); 1541 }, 1542 eventListeners: { 1543 ['@messages-loaded.window'](event) { 1544 this.addMessages(event.detail.messages, event.detail.hideAfter) 1545 }, 1546 ['@private-content-loaded.window'](event) { 1547 const data = event.detail.data; 1548 if ( 1549 data.messages && 1550 data.messages.messages && 1551 data.messages.messages.length 1552 ) { 1553 this.addMessages(data.messages.messages); 1554 } 1555 }, 1556 ['@clear-messages.window']() { 1557 this.messages = []; 1558 } 1559 } 1560 } 1561 } 1562</script>
1562 1563<section id="messages" 1564 x-data="initMessages()" 1565 x-bind="eventListeners" 1566 aria-live="assertive" 1567 role="alert" 1568> 1569 <template x-if="!isEmpty()"> 1570 <div class="w-full"> 1571 <div class="messages container mx-auto py-3"> 1572 <template x-for="(message, index) in messages" :key="index"> 1573 <div> 1574 <template x-if="message"> 1575 <div class="message flex items-center justify-between w-full py-3 px-4 bg-gray-600 text-white mb-2 font-normal gap-4" :class="message.type" 1576 :ui-id="'message-' + message.type" 1577 > 1578 <div class="flex items-center gap-2"> 1579 <span class="shrink-0"> 1580 <span x-show="message.type === 'success'"> 1581 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="24" height="24" role="img"> 1582 <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/> 1583<title>check-circle</title></svg> 1584 </span> 1585 <span x-show="message.type === 'error'"> 1586 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="24" height="24" role="img"> 1587 <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"/> 1588<title>x-circle</title></svg> 1589 </span> 1590 <span x-show="message.type === 'notice'"> 1591 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="text-[#C07600]" width="24" height="24" role="img"> 1592 <path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd"/> 1593<title>exclamation-triangle</title></svg> 1594 </span> 1595 </span> 1596 <span x-html="message.text"></span> 1597 </div> 1598 <button 1599 type="button" 1600 class="text-gray-600" 1601 aria-label="Close message" 1602 @click.prevent="removeMessage(index)" 1603 > 1604 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="stroke-current" width="18" height="18" aria-hidden="true"> 1605 <path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"/> 1606</svg> 1607 </button> 1608 </div> 1609 </template> 1610 </div> 1611 </template> 1612 </div> 1613 </div> 1614 </template> 1615</section></div><div> 1616 <h3 class="title-font text-xl my-4">Welkom bij Voetbalshirtskoning</h3> 1617 1618 <div class="grid grid-cols-2 sm:grid-cols-2 md:grid-cols-4 my-2 gap-4"> 1619 <a href="https://www.voetbalshirtskoning.nl/voetbaltenues/" 1620 class="relative"> 1621 <img class="w-full h-full object-cover hidden md:block" 1622 alt="Voetbaltenues" 1623 src="https://www.voetbalshirtskoning.nl/img/ednhmMuMHcN0xJp2pyzRW5dqV-dwBuDwfzOiMUKwLVQ/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS93eXNpd3lnL3ZvZXRiYWx0ZW51ZXNfMS5qcGc.jpg" 1624 width="300" 1625 height="300" 1626 loading="lazy" 1627 /> 1628 <img class="w-full h-full object-cover md:hidden" 1629 alt="Voetbaltenues" 1630 src="https://www.voetbalshirtskoning.nl/img/JlvmUwbns8YGS48ghv--KGSDP43b79LHEBT0CfYtM8w
1630/resize:fit:200:200/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS93eXNpd3lnL3ZvZXRiYWx0ZW51ZXNfMS5qcGc.jpg" 1631 width="200" 1632 height="200" 1633 loading="lazy" 1634 /> 1635 <div class="absolute bottom-0 w-full p-7 pt-11 bg-gradient-to-t to-transparent from-gray-800/75"> 1636 <div 1637 class="block text-white text-lg leading-7 font-bold text-center flex items-center gap-1" 1638 > 1639 <span>Voetbaltenues</span> 1640 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="16" height="16" role="img"> 1641 <path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"/> 1642<title>arrow-right</title></svg> 1643 </div> 1644 </div> 1645 </a> <a href="https://www.voetbalshirtskoning.nl/voetbalshirts/" 1646 class="relative"> 1647 <img class="w-full h-full object-cover hidden md:block" 1648 alt="Voetbalshirts" 1649 src="https://www.voetbalshirtskoning.nl/img/_mx-1sq5NJ5eOS2lWafnNo4sZ98SgEQ46BudGC6q7TQ/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS93eXNpd3lnL3ZvZXRiYWxzaGlydHMuanBn.jpg" 1650 width="300" 1651 height="300" 1652 loading="lazy" 1653 /> 1654 <img class="w-full h-full object-cover md:hidden" 1655 alt="Voetbalshirts" 1656 src="https://www.voetbalshirtskoning.nl/img/69kXj5JZcOIvZWlha3wAB3pdtXSm7YWbbuIpqV2ea_Y/resize:fit:200:200/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS93eXNpd3lnL3ZvZXRiYWxzaGlydHMuanBn.jpg" 1657 width="200" 1658 height="200" 1659 loading="lazy" 1660 /> 1661 <div class="absolute bottom-0 w-full p-7 pt-11 bg-gradient-to-t to-transparent from-gray-800/75"> 1662 <div 1663 class="block text-white text-lg leading-7 font-bold text-center flex items-center gap-1" 1664 > 1665 <span>Voetbalshirts</span> 1666 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="16" height="16" role="img"> 1667 <path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"/> 1668<title>arrow-right</title></svg> 1669 </div> 1670 </div> 1671 </a> <a href="https://www.voetbalshirtskoning.nl/trainingspakken/" 1672 class="relative"> 1673 <img class="w-full h-full object-cover hidden md:block" 1674 alt="Voetbal Trainingspak" 1675 src="https://www.voetbalshirtskoning.nl/img/YmfyQb-Re-iyaGIyHWTsuNNVEfZVSjd6xr53Vpet4WM/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS93eXNpd3lnL3RyYWluaW5nc3Bha2tlbi5qcGc.jpg" 1676 width="300" 1677 height="300" 1678 loading="lazy" 1679 /> 1680 <img class="w-full h-full object-cover md:hidden" 1681 alt="Voetbal Trainingspak" 1682 src="https://www.voetbalshirtskoning.nl/img/uFt7JLLy7am_1sajE6WySXVw84IHwEn4eC2dRKdfhEQ/resize:fit:200:200/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS93eXNpd3lnL3RyYWluaW5nc3Bha2tlbi5qcGc.jpg" 1683 width="200" 1684 height="200" 1685 loading="lazy" 1686 /> 1687 <div class="absolute bottom-0 w-full p-7 pt-11 bg-gradient-to-t to-transparent from-gray-800/75"> 1688 <div 1689 class="block text-white text-lg leading-7 font-bold text-center flex items-center gap-1" 1690 > 1691 <span>Trainingspakken</span> 1692 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="16" height="16" role="img"> 1693 <path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"/> 1694<title>arrow-right</title></svg> 1695 </div> 1696 </div> 1697 </a> <a href="https://www.voetbalshirtskoning.nl/voetbalshirts-outlet/" 1698 class="relative"> 1699 <img class="w-full h-full object-cover hidden md:block" 1700 alt="Voetbalshirts outlet" 1701 src="https://www.voetbalshirtskoning.nl/img/7hG-3Q5JR8pVDZq2boqmVZIrDGioNjuSEgp0TesLJM0/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS93eXNpd3lnL3ZvZXRiYWxzaGlydHMtb3V0bGV0LnBuZw.png" 1702 width="300" 1703 height="300" 1704 loading="lazy" 1705 /> 1706 <img class="w-full h-full object-cover md:hidden" 1707 alt="Voetbalshirts outlet" 1708 src="https://www.voetbalshirtskoning.nl/img/sTzkhmGwBYqGnGgVY3PHMic0Kq4w60ymY4BJcoawIbQ/resize:fit:200:200/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS93eXNpd3lnL3ZvZXRiYWxzaGlydHMtb3V0bGV0LnBuZw.png" 1709 width="200" 1710 height="200" 1711 loading="lazy" 1712 /> 1713 <div class="absolute bottom-0 w-full p-7 pt-11 bg-gradient-to-t to-transparent from-gray-800/75"> 1714 <div 1715 class="block text-white text-lg leading-7 font-bold text-center flex items-center gap-1" 1716 >
1717 <span>Sale</span> 1718 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="16" height="16" role="img"> 1719 <path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"/> 1720<title>arrow-right</title></svg> 1721 </div> 1722 </div> 1723 </a> </div> 1724</div>
1724<script> 1725 'use strict'; 1726 1727 function initSliderComponent() { 1728 return { 1729 active: 0, 1730 itemCount: 0, 1731 getSlider() { 1732 return this.$root.querySelector('.js_slides'); 1733 }, 1734 pageSize: 4, 1735 pageFillers: 0, 1736 isScrollPreviousButtonVisible: false, 1737 isScrollNextButtonVisible: false, 1738 calcPageSize() { 1739 const slider = this.getSlider(); 1740 if (slider) { 1741 this.itemCount = slider.querySelectorAll('.js_slide').length; 1742 this.pageSize = Math.round(slider.clientWidth / slider.querySelector('.js_slide').clientWidth); 1743 this.pageFillers = ( 1744 this.pageSize * Math.ceil(this.itemCount / this.pageSize) 1745 ) - this.itemCount; 1746 this.isScrollPreviousButtonVisible = slider.scrollLeft !== 0; 1747 this.isScrollNextButtonVisible = slider.scrollLeft + slider.clientWidth < slider.scrollWidth; 1748 } else { 1749 this.isScrollPreviousButtonVisible = false; 1750 this.isScrollNextButtonVisible = false; 1751 } 1752 }, 1753 calcActive() { 1754 const slider = this.getSlider(); 1755 if (slider) { 1756 const sliderItems = this.itemCount + this.pageFillers; 1757 const calculatedActiveSlide = slider.scrollLeft / (slider.scrollWidth / sliderItems); 1758 this.active = Math.round(calculatedActiveSlide / this.pageSize) * this.pageSize; 1759 this.isScrollPreviousButtonVisible = slider.scrollLeft !== 0; 1760 this.isScrollNextButtonVisible = slider.scrollLeft + slider.clientWidth < slider.scrollWidth; 1761 } else { 1762 this.isScrollPreviousButtonVisible = false; 1763 this.isScrollNextButtonVisible = false; 1764 } 1765 }, 1766 scrollPrevious() { 1767 this.scrollTo(this.active - this.pageSize); 1768 }, 1769 scrollNext() { 1770 this.scrollTo(this.active + this.pageSize); 1771 }, 1772 scrollTo(idx) { 1773 const slider = this.getSlider(); 1774 if (slider) { 1775 const slideWidth = slider.scrollWidth / (this.itemCount + this.pageFillers); 1776 slider.scrollLeft = Math.floor(slideWidth) * idx; 1777 this.active = idx; 1778 } 1779 } 1780 } 1781 } 1782 </script>
1782 1783 <section class=" mb-10 lg:mb-20 product-slider-wrapper" x-data="initSliderComponent()" x-init="calcPageSize();" @resize.window.debounce="calcPageSize(); $nextTick( function() { calcActive() })"> 1784 <div class="relative"> 1785 <h2 class="text-lg font-semibold mb-2 text-dark md:text-center py-6"> 1786 Populair </h2> 1787 <div class="relative w-full overflow-x-hidden products mode-grid mobile-mode-grid"> 1788 <div class="relative flex flex-nowrap overflow-auto transition-all js_slides snap" @scroll.debounce="calcActive"> 1789 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 1790 <div class="mx-1 product-item w-full" data-product-sku="P1003"> 1791 <form method="post" action="https://www.voetbalshirtskoning.nl/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~/product/17766/" data-testid="product-item" class="item product product-item group product_addtocart_form product-item flex flex-col w-full h-full 1792 " data-product-sku="P1003"> 1793 <input name="form_key" type="hidden" value="i9tjDByFy1Iir9hF"> <input type="hidden" name="product" value="17766"> 1794 <div class="product-item-info"> 1795 <div class="product-item-left"> 1796 1797 <a href="https://www.voetbalshirtskoning.nl/nederlands-elftal-voetbaltenue-eigen-naam-oranje-zwart.html" class="product photo product-item-photo block mx-auto" tabindex="-1" data-testid="salable-product-item"> 1798 <span class="block product-image-container product-image-container-"> 1799 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 1800 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 1801 rounded-lg product-image-photo" x-data="" @update-gallery-17766.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/wPhhpyXzgYcWWwmCTW6V4MGX6RStH0cooHaB8Xh9q8Q/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3Qvbi9lL25lZGVybGFuZHMtZWxmdGFsLXZvZXRiYWx0ZW51ZS10aHVpcy1laWdlbi1uYWFtLW9yYW5qZS16d2FydC1raW5kLXNlbmlvci5qcGc_d2lkdGg9MzAwJmhlaWdodD0zMDA.jpg" loading="lazy" width="300" height="300" alt="Nederlands Elftal Voetbaltenue - Eigen Naam - Oranje-Zwart - Kind en Volwassenen" title="Nederlands Elftal Voetbaltenue - Eigen Naam - Oranje-Zwart - Kind en Volwassenen"> 1802 </span> 1803</span> 1804 1805<style> 1806 .product-image-container- span.product-image-wrapper { 1807 padding-bottom: 100%; 1808 } 1809 1810 @media (min-width: 768px) { 1811 .product-image-container- .product-image-photo { 1812 height: 300px; 1813 } 1814 } 1815</style> </a> 1816 </div> 1817 <div class="product-item-right "> 1818 <div class="product-info flex flex-col grow"> 1819 <div class="product-details md:bg-white md:group-hover:-mt-12"> 1820 <div class="product name product-item-name"> 1821 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/nederlands-elftal-voetbaltenue-eigen-naam-oranje-zwart.html" data-testid="salable-product-name-link"> 1822 Nederlands Elftal Voetbaltenue - Eigen Naam - Oranje-Zwart - Kind en Volwassenen </a> 1823 </div> 1824 1825 <div class="product-reviews-summary"> 1826 <div class="rating-summary flex"> 1827 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 1828 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 1829<title>star</title></svg> 1830 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 1831 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 1832<title>star</title></svg> 1833 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 1834 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 1835<title>star</title></svg> 1836 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 1837 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 1838<title>star</title></svg> 1839 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 1840 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 1841<title>star</title></svg> 1842 </div> 1843 <div class="reviews-actions"> 1844 <a class="action view" href="https://www.voetbalshirtskoning.nl/nederlands-elftal-voetbaltenue-eigen-naam-oranje-zwart.html#reviews">4 Â <span>Reviews </span> 1845 </a> 1846 </div> 1847 </div> 1848 1849 1850 <div class="product-price-wrapper" x-data="initPriceBox__6ac34b468ffc3()" x-defer="intersect" @update-prices-17766.window="updatePrice($event.detail);"> 1851 <div class="price-box price-final_price" data-role="priceBox" data-product-id="17766" data-price-box="product-id-17766"><span class="normal-price">
1852 <span x-data x-id="['product\u002Dprice\u002D17766']" class="price-container price-final_price tax weee"> 1853 <span class="price-label">Voor</span> 1854 <span :id="$id('product\u002Dprice\u002D17766')" data-price-amount="39.95" data-price-type="finalPrice" class="price-wrapper "><span class="price">39,95</span></span> 1855 </span></span></div> </div> 1856 1857 </div> 1858 1859
1859<script> 1860 function initPriceBox__6ac34b468ffc3() 1861 { 1862 return { 1863 updatePrice(priceData) { 1864 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 1865 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 1866 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 1867 regularPriceLabel.classList.add('hidden'); 1868 } else { 1869 regularPriceLabel.classList.remove('hidden'); 1870 } 1871 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 1872 } 1873 } 1874 } 1875 </script>
1875 1876 1877 <div class="product-item-inner"> 1878 1879 <div class="addtocart-btn-wrapper md:h-0 md:group-hover:h-12"> 1880 <button class="btn btn-primary action tocart px-6 md:px-2" data-testid="add-to-cart-btn" aria-label="In winkelwagen"> 1881 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="h-5 w-5" width="20" height="20" role="img"> 1882 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path> 1883<title>shopping-cart</title></svg> 1884 <span>In winkelwagen</span> 1885 </button> 1886 </div> 1887 </div> 1888 </div> 1889 </div> 1890 </div> 1891 </form> </div> 1892 </div> 1893 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 1894 <div class="mx-1 product-item w-full" data-product-sku="spain-set-yamal"> 1895 <form method="post" action="https://www.voetbalshirtskoning.nl/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~/product/16831/" data-testid="product-item" class="item product product-item group product_addtocart_form product-item flex flex-col w-full h-full 1896 " data-product-sku="spain-set-yamal"> 1897 <input name="form_key" type="hidden" value="i9tjDByFy1Iir9hF"> <input type="hidden" name="product" value="16831"> 1898 <div class="product-item-info"> 1899 <div class="product-item-left"> 1900 1901 <a href="https://www.voetbalshirtskoning.nl/spanje-voetbaltenue-yamal-kind-en-volwassenen.html" class="product photo product-item-photo block mx-auto" tabindex="-1" data-testid="salable-product-item"> 1902 <span class="block product-image-container product-image-container-"> 1903 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 1904 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 1905 rounded-lg product-image-photo" x-data="" @update-gallery-16831.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/m6rPqt0S-qnRmBkcubA6zLeIRn4XnWzj-K13KCkIgks/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3Qvcy9wL3NwYW5qZS15YW1hbC12b2V0YmFsdGVudWUta2luZGVyZW4tdm9sd2Fzc2VuZW4uanBnP3dpZHRoPTMwMCZoZWlnaHQ9MzAw.jpg" loading="lazy" width="300" height="300" alt="Lamine Yamal Spanje Voetbaltenue - Kind en Volwassenen" title="Lamine Yamal Spanje Voetbaltenue - Kind en Volwassenen"> 1906 </span> 1907</span> 1908 1909<style> 1910 .product-image-container- span.product-image-wrapper { 1911 padding-bottom: 100%; 1912 } 1913 1914 @media (min-width: 768px) { 1915 .product-image-container- .product-image-photo { 1916 height: 300px; 1917 } 1918 } 1919</style> </a> 1920 </div> 1921 <div class="product-item-right "> 1922 <div class="product-info flex flex-col grow"> 1923 <div class="product-details md:bg-white md:group-hover:-mt-12"> 1924 <div class="product name product-item-name"> 1925 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/spanje-voetbaltenue-yamal-kind-en-volwassenen.html" data-testid="salable-product-name-link"> 1926 Lamine Yamal Spanje Voetbaltenue - Kind en Volwassenen </a> 1927 </div> 1928 1929 <div class="product-reviews-summary"> 1930 <div class="rating-summary flex"> 1931 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 1932 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 1933<title>star</title></svg> 1934 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 1935 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 1936<title>star</title></svg> 1937 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 1938 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 1939<title>star</title></svg> 1940 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 1941 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 1942<title>star</title></svg> 1943 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 1944 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 1945<title>star</title></svg> 1946 </div> 1947 <div class="reviews-actions"> 1948 <a class="action view" href="https://www.voetbalshirtskoning.nl/spanje-voetbaltenue-yamal-kind-en-volwassenen.html#reviews">5 Â <span>Reviews </span> 1949 </a> 1950 </div> 1951 </div> 1952 1953 1954 <div class="product-price-wrapper" x-data="initPriceBox__6ac34b469e228()" x-defer="intersect" @update-prices-16831.window="updatePrice($event.detail);"> 1955 <div class="price-box price-final_price" data-role="priceBox" data-product-id="16831" data-price-box="product-id-16831"><span class="normal-price">
1956 <span x-data x-id="['product\u002Dprice\u002D16831']" class="price-container price-final_price tax weee"> 1957 <span class="price-label">Voor</span> 1958 <span :id="$id('product\u002Dprice\u002D16831')" data-price-amount="39.95" data-price-type="finalPrice" class="price-wrapper "><span class="price">39,95</span></span> 1959 </span></span></div> </div> 1960 1961 </div> 1962 1963
1963<script> 1964 function initPriceBox__6ac34b469e228() 1965 { 1966 return { 1967 updatePrice(priceData) { 1968 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 1969 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 1970 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 1971 regularPriceLabel.classList.add('hidden'); 1972 } else { 1973 regularPriceLabel.classList.remove('hidden'); 1974 } 1975 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 1976 } 1977 } 1978 } 1979 </script>
1979 1980 1981 <div class="product-item-inner"> 1982 1983 <div class="addtocart-btn-wrapper md:h-0 md:group-hover:h-12"> 1984 <button class="btn btn-primary action tocart px-6 md:px-2" data-testid="add-to-cart-btn" aria-label="In winkelwagen"> 1985 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="h-5 w-5" width="20" height="20" role="img"> 1986 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path> 1987<title>shopping-cart</title></svg> 1988 <span>In winkelwagen</span> 1989 </button> 1990 </div> 1991 </div> 1992 </div> 1993 </div> 1994 </div> 1995 </form> </div> 1996 </div> 1997 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 1998 <div class="mx-1 product-item w-full" data-product-sku="portugal-kit-ronaldo-b"> 1999 <form method="post" action="https://www.voetbalshirtskoning.nl/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~/product/16187/" data-testid="product-item" class="item product product-item group product_addtocart_form product-item flex flex-col w-full h-full 2000 " data-product-sku="portugal-kit-ronaldo-b"> 2001 <input name="form_key" type="hidden" value="0VZcE6MvMuJt2fW3"> <input type="hidden" name="product" value="16187"> 2002 <div class="product-item-info"> 2003 <div class="product-item-left"> 2004 2005 <a href="https://www.voetbalshirtskoning.nl/portugal-voetbaltenue-ronaldo-thuis-kind-en-volwassenen.html" class="product photo product-item-photo block mx-auto" tabindex="-1" data-testid="salable-product-item"> 2006 <span class="block product-image-container product-image-container-"> 2007 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 2008 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 2009 rounded-lg product-image-photo" x-data="" @update-gallery-16187.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/utiYQEvR_OzTLONoOYWF4sPmgA7hvIgk6Ns0zbMOlso/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3QvcC9vL3BvcnR1Z2FsLXZvZXRiYWx0ZW51ZS1yb25hbGRvLWtpbmQtdm9sd2Fzc2VuZW4uanBnP3dpZHRoPTMwMCZoZWlnaHQ9MzAw.jpg" loading="lazy" width="300" height="300" alt="Ronaldo Portugal Voetbaltenue Thuis - Kind en Volwassenen" title="Ronaldo Portugal Voetbaltenue Thuis - Kind en Volwassenen"> 2010 </span> 2011</span> 2012 2013<style> 2014 .product-image-container- span.product-image-wrapper { 2015 padding-bottom: 100%; 2016 } 2017 2018 @media (min-width: 768px) { 2019 .product-image-container- .product-image-photo { 2020 height: 300px; 2021 } 2022 } 2023</style> </a> 2024 </div> 2025 <div class="product-item-right "> 2026 <div class="product-info flex flex-col grow"> 2027 <div class="product-details md:bg-white md:group-hover:-mt-12"> 2028 <div class="product name product-item-name"> 2029 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/portugal-voetbaltenue-ronaldo-thuis-kind-en-volwassenen.html" data-testid="salable-product-name-link"> 2030 Ronaldo Portugal Voetbaltenue Thuis - Kind en Volwassenen </a> 2031 </div> 2032 2033 <div class="product-reviews-summary"> 2034 <div class="rating-summary flex"> 2035 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 2036 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2037<title>star</title></svg> 2038 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 2039 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2040<title>star</title></svg> 2041 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 2042 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2043<title>star</title></svg> 2044 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 2045 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2046<title>star</title></svg> 2047 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="w-5 h-5"> 2048 <defs> 2049 <lineargradient id="partialFill16187"> 2050 <stop offset="0%" stop-color="#FF6600"></stop> 2051 <stop offset="95%" stop-color="#FF6600"></stop> 2052 <stop offset="95%" stop-color="#D1D5DB"></stop> 2053 <stop offset="100%" stop-color="#D1D5DB"></stop> 2054 </lineargradient> 2055 </defs> 2056 <g fill="url(#partialFill16187)"> 2057 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 2058 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 2059 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 2060 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2061 </g> 2062 </svg> 2063 </div> 2064 <div class="reviews-actions"> 2065 <a class="action view" href="https://www.voetbalshirtskoning.nl/portugal-voetbaltenue-ronaldo-thuis-kind-en-volwassenen.html#reviews">23 Â <span>Reviews </span> 2066 </a> 2067 </div> 2068 </div> 2069 2070 2071 <div class="product-price-wrapper" x-data="initPriceBox__6ac350e65ce90()" x-defer="intersect" @update-prices-16187.window="updatePrice($event.detail);"> 2072 <div class="price-box price-final_price" data-role="priceBox" data-product-id="16187" data-price-box="product-id-16187"><p class="minimal-price">
2073 <span x-data x-id="['from\u002D16187']" class="price-container price-final_price tax weee"> 2074 <span class="price-label">Voor</span> 2075 <span :id="$id('from\u002D16187')" data-price-amount="39.95" data-price-type="" class="price-wrapper "><span class="price">39,95</span></span> 2076 </span> </p></div> </div> 2077 2078 </div> 2079 2080
2080<script> 2081 function initPriceBox__6ac350e65ce90() 2082 { 2083 return { 2084 updatePrice(priceData) { 2085 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 2086 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 2087 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 2088 regularPriceLabel.classList.add('hidden'); 2089 } else { 2090 regularPriceLabel.classList.remove('hidden'); 2091 } 2092 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 2093 } 2094 } 2095 } 2096 </script>
2096 2097 2098 <div class="product-item-inner"> 2099 2100 <div class="addtocart-btn-wrapper md:h-0 md:group-hover:h-12"> 2101 <button class="btn btn-primary action tocart px-6 md:px-2" data-testid="add-to-cart-btn" aria-label="In winkelwagen"> 2102 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="h-5 w-5" width="20" height="20" role="img"> 2103 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path> 2104<title>shopping-cart</title></svg> 2105 <span>In winkelwagen</span> 2106 </button> 2107 </div> 2108 </div> 2109 </div> 2110 </div> 2111 </div> 2112 </form> </div> 2113 </div> 2114 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 2115 <div class="mx-1 product-item w-full" data-product-sku="nl-kit-blue-away-22-24"> 2116 <form method="post" action="https://www.voetbalshirtskoning.nl/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~/product/16038/" data-testid="product-item" class="item product product-item group product_addtocart_form product-item flex flex-col w-full h-full 2117 " enctype="multipart/form-data" data-product-sku="nl-kit-blue-away-22-24"> 2118 <input name="form_key" type="hidden" value="i9tjDByFy1Iir9hF"> <input type="hidden" name="product" value="16038"> 2119 <div class="product-item-info"> 2120 <div class="product-item-left"> 2121 2122 <a href="https://www.voetbalshirtskoning.nl/nederlands-elftal-voetbaltenue-uit-kind-en-volwassenen.html" class="product photo product-item-photo block mx-auto" tabindex="-1" data-testid="salable-product-item"> 2123 <span class="block product-image-container product-image-container-"> 2124 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 2125 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 2126 rounded-lg product-image-photo" x-data="" @update-gallery-16038.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/YRKaBGa7aa1Me0E1gUjihQwPg-u8UxV-ZRUracr-71k/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3Qvbi9lL25lZGVybGFuZHMtZWxmdGFsLXZvZXRiYWx0ZW51ZS11aXQta2luZC12b2x3YXNzZW5lbi5qcGc_d2lkdGg9MzAwJmhlaWdodD0zMDA.jpg" loading="lazy" width="300" height="300" alt="Nederlands Elftal Voetbaltenue Uit - Eigen Naam - Kind en Volwassenen" title="Nederlands Elftal Voetbaltenue Uit - Eigen Naam - Kind en Volwassenen"> 2127 </span> 2128</span> 2129 2130<style> 2131 .product-image-container- span.product-image-wrapper { 2132 padding-bottom: 100%; 2133 } 2134 2135 @media (min-width: 768px) { 2136 .product-image-container- .product-image-photo { 2137 height: 300px; 2138 } 2139 } 2140</style> </a> 2141 </div> 2142 <div class="product-item-right "> 2143 <div class="product-info flex flex-col grow"> 2144 <div class="product-details md:bg-white md:group-hover:-mt-12"> 2145 <div class="product name product-item-name"> 2146 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/nederlands-elftal-voetbaltenue-uit-kind-en-volwassenen.html" data-testid="salable-product-name-link"> 2147 Nederlands Elftal Voetbaltenue Uit - Eigen Naam - Kind en Volwassenen </a> 2148 </div> 2149 2150 <div class="product-reviews-summary"> 2151 <div class="rating-summary flex"> 2152 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 2153 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2154<title>star</title></svg> 2155 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 2156 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2157<title>star</title></svg> 2158 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 2159 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2160<title>star</title></svg> 2161 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 2162 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2163<title>star</title></svg> 2164 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="w-5 h-5"> 2165 <defs> 2166 <lineargradient id="partialFill16038"> 2167 <stop offset="0%" stop-color="#FF6600"></stop> 2168 <stop offset="75%" stop-color="#FF6600"></stop> 2169 <stop offset="75%" stop-color="#D1D5DB"></stop> 2170 <stop offset="100%" stop-color="#D1D5DB"></stop> 2171 </lineargradient> 2172 </defs> 2173 <g fill="url(#partialFill16038)"> 2174 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 2175 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 2176 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 2177 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2178 </g> 2179 </svg> 2180 </div> 2181 <div class="reviews-actions"> 2182 <a class="action view" href="https://www.voetbalshirtskoning.nl/nederlands-elftal-voetbaltenue-uit-kind-en-volwassenen.html#reviews">22 Â <span>Reviews </span> 2183 </a> 2184 </div> 2185 </div> 2186 2187 2188 <div class="product-price-wrapper" x-data="initPriceBox__6ac34b46b4af8()" x-defer="intersect" @update-prices-16038.window="updatePrice($event.detail);"> 2189 <div class="price-box price-final_price" data-role="priceBox" data-product-id="16038" data-price-box="product-id-16038"><p class="minimal-price">
2190 <span x-data x-id="['from\u002D16038']" class="price-container price-final_price tax weee"> 2191 <span class="price-label">Voor</span> 2192 <span :id="$id('from\u002D16038')" data-price-amount="39.95" data-price-type="" class="price-wrapper "><span class="price">39,95</span></span> 2193 </span> </p></div> </div> 2194 2195 </div> 2196 2197
2197<script> 2198 function initPriceBox__6ac34b46b4af8() 2199 { 2200 return { 2201 updatePrice(priceData) { 2202 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 2203 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 2204 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 2205 regularPriceLabel.classList.add('hidden'); 2206 } else { 2207 regularPriceLabel.classList.remove('hidden'); 2208 } 2209 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 2210 } 2211 } 2212 } 2213 </script>
2213 2214 2215 <div class="product-item-inner"> 2216 2217 <div class="addtocart-btn-wrapper md:h-0 md:group-hover:h-12"> 2218 <button class="btn btn-primary action tocart px-6 md:px-2" data-testid="add-to-cart-btn" aria-label="In winkelwagen"> 2219 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="h-5 w-5" width="20" height="20" role="img"> 2220 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path> 2221<title>shopping-cart</title></svg> 2222 <span>In winkelwagen</span> 2223 </button> 2224 </div> 2225 </div> 2226 </div> 2227 </div> 2228 </div> 2229 </form> </div> 2230 </div> 2231 </div> 2232 </div> 2233 <template x-if="itemCount > pageSize"> 2234 <div class="slider-nav"> 2235 <button aria-label="Vorige" tabindex="-1" class="slider-btn btn-prev" :class="{ 'opacity-0 pointer-events-none' : !isScrollPreviousButtonVisible }" @click="scrollPrevious"> 2236 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" width="20" height="20" role="img"> 2237 <path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd"></path> 2238<title>arrow-left</title></svg> 2239 </button> 2240 <button aria-label="Volgende" tabindex="-1" class="slider-btn btn-next" :class="{ 'opacity-0 pointer-events-none' : !isScrollNextButtonVisible }" @click="scrollNext"> 2241 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" width="20" height="20" role="img"> 2242 <path fill-rule="evenodd" d="M10.293 3.293a1 1 0 011.414 0l6 6a1 1 0 010 1.414l-6 6a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-4.293-4.293a1 1 0 010-1.414z" clip-rule="evenodd"></path> 2243<title>arrow-right</title></svg> 2244 </button> 2245 </div> 2246 </template> 2247 </div> 2248 </section>
2249<script> /* e.g. hyva theme */ document.addEventListener('DOMContentLoaded', function(){ var items = document.getElementsByClassName('mfblogunveil'); var el, url; if (items.length) { for (var i=0; i<items.length;i++) { el = items[i]; url = el.getAttribute('data-original'); if (!url) { continue; }; if ('IMG' == el.tagName) { el.src = url; } else { el.style.backgroundImage = "url('" + url + "')"; } } } }); </script>
2249<div class="new-products-wrapper">
2249<script> 2250 'use strict'; 2251 2252 function initSliderComponent() { 2253 return { 2254 active: 0, 2255 itemCount: 0, 2256 getSlider() { 2257 return this.$root.querySelector('.js_slides'); 2258 }, 2259 pageSize: 4, 2260 pageFillers: 0, 2261 isScrollPreviousButtonVisible: false, 2262 isScrollNextButtonVisible: false, 2263 calcPageSize() { 2264 const slider = this.getSlider(); 2265 if (slider) { 2266 this.itemCount = slider.querySelectorAll('.js_slide').length; 2267 this.pageSize = Math.round(slider.clientWidth / slider.querySelector('.js_slide').clientWidth); 2268 this.pageFillers = ( 2269 this.pageSize * Math.ceil(this.itemCount / this.pageSize) 2270 ) - this.itemCount; 2271 this.isScrollPreviousButtonVisible = slider.scrollLeft !== 0; 2272 this.isScrollNextButtonVisible = slider.scrollLeft + slider.clientWidth < slider.scrollWidth; 2273 } else { 2274 this.isScrollPreviousButtonVisible = false; 2275 this.isScrollNextButtonVisible = false; 2276 } 2277 }, 2278 calcActive() { 2279 const slider = this.getSlider(); 2280 if (slider) { 2281 const sliderItems = this.itemCount + this.pageFillers; 2282 const calculatedActiveSlide = slider.scrollLeft / (slider.scrollWidth / sliderItems); 2283 this.active = Math.round(calculatedActiveSlide / this.pageSize) * this.pageSize; 2284 this.isScrollPreviousButtonVisible = slider.scrollLeft !== 0; 2285 this.isScrollNextButtonVisible = slider.scrollLeft + slider.clientWidth < slider.scrollWidth; 2286 } else { 2287 this.isScrollPreviousButtonVisible = false; 2288 this.isScrollNextButtonVisible = false; 2289 } 2290 }, 2291 scrollPrevious() { 2292 this.scrollTo(this.active - this.pageSize); 2293 }, 2294 scrollNext() { 2295 this.scrollTo(this.active + this.pageSize); 2296 }, 2297 scrollTo(idx) { 2298 const slider = this.getSlider(); 2299 if (slider) { 2300 const slideWidth = slider.scrollWidth / (this.itemCount + this.pageFillers); 2301 slider.scrollLeft = Math.floor(slideWidth) * idx; 2302 this.active = idx; 2303 } 2304 } 2305 } 2306 } 2307 </script>
2307 2308 <section class=" mb-10 lg:mb-20 product-slider-wrapper" x-data="initSliderComponent()" x-init="calcPageSize();" @resize.window.debounce="calcPageSize(); $nextTick( function() { calcActive() })"> 2309 <div class="relative"> 2310 <h2 class="text-lg font-semibold mb-2 text-dark md:text-center py-6"> 2311 Nieuw binnen </h2> 2312 <div class="relative w-full overflow-x-hidden products mode-grid mobile-mode-grid"> 2313 <div class="relative flex flex-nowrap overflow-auto transition-all js_slides snap" @scroll.debounce="calcActive"> 2314 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 2315 <div class="mx-1 product-item w-full" data-product-sku="eng-set-bham-26-28"> 2316 <div class="item product product-item flex flex-col w-full " data-product-sku="eng-set-bham-26-28"> 2317 <div class="product-item-info"> 2318 <div class="product-item-left"> 2319 2320 <a href="https://www.voetbalshirtskoning.nl/engeland-voetbaltenue-bellingham-thuis.html" class="product photo product-item-photo block mx-auto" tabindex="-1"> 2321 <span class="block product-image-container product-image-container-"> 2322 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 2323 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 2324 rounded-lg product-image-photo" x-data="" @update-gallery-18038.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/VKjOvnkocJQVV7_ACCaOc2L864DnR6Ym3t4K65JVpyg/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3QvYi9lL2JlbGxpbmdoYW0tZW5nZWxhbmQtdGVudWUtdGh1aXMta2luZC12b2x3YXNzZW5lbi5qcGc_d2lkdGg9MzAwJmhlaWdodD0zMDA.jpg" loading="lazy" width="300" height="300" alt="Engeland Voetbaltenue Bellingham Thuis - Kind en Volwassenen" title="Engeland Voetbaltenue Bellingham Thuis - Kind en Volwassenen"> 2325 </span> 2326</span> 2327 2328<style> 2329 .product-image-container- span.product-image-wrapper { 2330 padding-bottom: 100%; 2331 } 2332 2333 @media (min-width: 768px) { 2334 .product-image-container- .product-image-photo { 2335 height: 300px; 2336 } 2337 } 2338</style> </a> 2339 </div> 2340 <div class="product-item-right no-reviews"> 2341 <div class="product-info flex flex-col grow"> 2342 <div class="product-details md:bg-white md:group-hover:-mt-12"> 2343 <div class="product name product-item-name"> 2344 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/engeland-voetbaltenue-bellingham-thuis.html"> 2345 Engeland Voetbaltenue Bellingham Thuis - Kind en Volwassenen </a> 2346 </div> 2347 2348 2349 2350 2351 <div class="product-price-wrapper" x-data="initPriceBox__6ac34b46c1578()" x-defer="intersect" @update-prices-18038.window="updatePrice($event.detail);"> 2352 </div> 2353 2354 </div> 2355 2356
2356<script> 2357 function initPriceBox__6ac34b46c1578() 2358 { 2359 return { 2360 updatePrice(priceData) { 2361 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 2362 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 2363 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 2364 regularPriceLabel.classList.add('hidden'); 2365 } else { 2366 regularPriceLabel.classList.remove('hidden'); 2367 } 2368 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 2369 } 2370 } 2371 } 2372 </script>
2372 2373 2374 <div class="product-item-inner"> 2375 2376 </div> 2377 </div> 2378 </div> 2379 </div> 2380 </div> </div> 2381 </div> 2382 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 2383 <div class="mx-1 product-item w-full" data-product-sku="BD19E-YAMA"> 2384 <form method="post" action="https://www.voetbalshirtskoning.nl/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~/product/18020/" data-testid="product-item" class="item product product-item group product_addtocart_form product-item flex flex-col w-full h-full 2385 " data-product-sku="BD19E-YAMA"> 2386 <input name="form_key" type="hidden" value="i9tjDByFy1Iir9hF"> <input type="hidden" name="product" value="18020"> 2387 <div class="product-item-info"> 2388 <div class="product-item-left"> 2389 2390 <a href="https://www.voetbalshirtskoning.nl/lamine-yamal-fc-barcelona-voetbaltenue-thuis-2026-2027-kind.html" class="product photo product-item-photo block mx-auto" tabindex="-1" data-testid="salable-product-item"> 2391 <span class="block product-image-container product-image-container-"> 2392 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 2393 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 2394 rounded-lg product-image-photo" x-data="" @update-gallery-18020.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/bN2SCcQCD_yJmcXfMdasfvCsmnIHATBAGoVRLtonDAA/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3QvbC9hL2xhbWluZS15YW1hbC1mYy1iYXJjZWxvbmEtdGVudWUta2luZC5qcGc_d2lkdGg9MzAwJmhlaWdodD0zMDA.jpg" loading="lazy" width="300" height="300" alt="Lamine Yamal FC Barcelona Voetbaltenue Thuis - 2026-2027 - Kind" title="Lamine Yamal FC Barcelona Voetbaltenue Thuis - 2026-2027 - Kind"> 2395 </span> 2396</span> 2397 2398<style> 2399 .product-image-container- span.product-image-wrapper { 2400 padding-bottom: 100%; 2401 } 2402 2403 @media (min-width: 768px) { 2404 .product-image-container- .product-image-photo { 2405 height: 300px; 2406 } 2407 } 2408</style> </a> 2409 </div> 2410 <div class="product-item-right "> 2411 <div class="product-info flex flex-col grow"> 2412 <div class="product-details md:bg-white md:group-hover:-mt-12"> 2413 <div class="product name product-item-name"> 2414 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/lamine-yamal-fc-barcelona-voetbaltenue-thuis-2026-2027-kind.html" data-testid="salable-product-name-link"> 2415 Lamine Yamal FC Barcelona Voetbaltenue Thuis - 2026-2027 - Kind </a> 2416 </div> 2417 2418 <div class="product-reviews-summary"> 2419 <div class="rating-summary flex"> 2420 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 2421 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2422<title>star</title></svg> 2423 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 2424 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2425<title>star</title></svg> 2426 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 2427 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2428<title>star</title></svg> 2429 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 2430 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2431<title>star</title></svg> 2432 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="text-secondary w-5 h-5" width="24" height="24" role="img"> 2433 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> 2434<title>star</title></svg> 2435 </div> 2436 <div class="reviews-actions"> 2437 <a class="action view" href="https://www.voetbalshirtskoning.nl/lamine-yamal-fc-barcelona-voetbaltenue-thuis-2026-2027-kind.html#reviews">1 Â <span>Je beoordeling over het product </span> 2438 </a> 2439 </div> 2440 </div> 2441 2442 2443 <div class="product-price-wrapper" x-data="initPriceBox__6ac34b46c7925()" x-defer="intersect" @update-prices-18020.window="updatePrice($event.detail);"> 2444 <div class="price-box price-final_price" data-role="priceBox" data-product-id="18020" data-price-box="product-id-18020"><span class="normal-price">
2445 <span x-data x-id="['product\u002Dprice\u002D18020']" class="price-container price-final_price tax weee"> 2446 <span class="price-label">Voor</span> 2447 <span :id="$id('product\u002Dprice\u002D18020')" data-price-amount="54.95" data-price-type="finalPrice" class="price-wrapper "><span class="price">54,95</span></span> 2448 </span></span></div> </div> 2449 2450 </div> 2451 2452
2452<script> 2453 function initPriceBox__6ac34b46c7925() 2454 { 2455 return { 2456 updatePrice(priceData) { 2457 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 2458 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 2459 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 2460 regularPriceLabel.classList.add('hidden'); 2461 } else { 2462 regularPriceLabel.classList.remove('hidden'); 2463 } 2464 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 2465 } 2466 } 2467 } 2468 </script>
2468 2469 2470 <div class="product-item-inner"> 2471 2472 <div class="addtocart-btn-wrapper md:h-0 md:group-hover:h-12"> 2473 <button class="btn btn-primary action tocart px-6 md:px-2" data-testid="add-to-cart-btn" aria-label="In winkelwagen"> 2474 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="h-5 w-5" width="20" height="20" role="img"> 2475 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path> 2476<title>shopping-cart</title></svg> 2477 <span>In winkelwagen</span> 2478 </button> 2479 </div> 2480 </div> 2481 </div> 2482 </div> 2483 </div> 2484 </form> </div> 2485 </div> 2486 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 2487 <div class="mx-1 product-item w-full" data-product-sku="RM26B2MB"> 2488 <form method="post" action="https://www.voetbalshirtskoning.nl/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~/product/18014/" data-testid="product-item" class="item product product-item group product_addtocart_form product-item flex flex-col w-full h-full 2489 " data-product-sku="RM26B2MB"> 2490 <input name="form_key" type="hidden" value="i9tjDByFy1Iir9hF"> <input type="hidden" name="product" value="18014"> 2491 <div class="product-item-info"> 2492 <div class="product-item-left"> 2493 2494 <a href="https://www.voetbalshirtskoning.nl/mbappe-real-madrid-voetbaltenue-uit-2026-2027-kind.html" class="product photo product-item-photo block mx-auto" tabindex="-1" data-testid="salable-product-item"> 2495 <span class="block product-image-container product-image-container-"> 2496 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 2497 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 2498 rounded-lg product-image-photo" x-data="" @update-gallery-18014.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/jJU_I9ECcbnfRf-OaaYnyDx25WIyLsc5tUWm2Zkv2HQ/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3QvbS9iL21iYXBwZS1yZWFsLW1hZHJpZC11aXR0ZW51ZS0yMDI2LTIwMjcta2luZC5qcGc_d2lkdGg9MzAwJmhlaWdodD0zMDA.jpg" loading="lazy" width="300" height="300" alt="Mbappe Real Madrid Voetbaltenue Uit - 2026-2027 - Kind" title="Mbappe Real Madrid Voetbaltenue Uit - 2026-2027 - Kind"> 2499 </span> 2500</span> 2501 2502<style> 2503 .product-image-container- span.product-image-wrapper { 2504 padding-bottom: 100%; 2505 } 2506 2507 @media (min-width: 768px) { 2508 .product-image-container- .product-image-photo { 2509 height: 300px; 2510 } 2511 } 2512</style> </a> 2513 </div> 2514 <div class="product-item-right no-reviews"> 2515 <div class="product-info flex flex-col grow"> 2516 <div class="product-details md:bg-white md:group-hover:-mt-12"> 2517 <div class="product name product-item-name"> 2518 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/mbappe-real-madrid-voetbaltenue-uit-2026-2027-kind.html" data-testid="salable-product-name-link"> 2519 Mbappe Real Madrid Voetbaltenue Uit - 2026-2027 - Kind </a> 2520 </div> 2521 2522 2523 2524 2525 <div class="product-price-wrapper" x-data="initPriceBox__6ac34b46cfc54()" x-defer="intersect" @update-prices-18014.window="updatePrice($event.detail);"> 2526 <div class="price-box price-final_price" data-role="priceBox" data-product-id="18014" data-price-box="product-id-18014"><span class="normal-price">
2527 <span x-data x-id="['product\u002Dprice\u002D18014']" class="price-container price-final_price tax weee"> 2528 <span class="price-label">Voor</span> 2529 <span :id="$id('product\u002Dprice\u002D18014')" data-price-amount="54.95" data-price-type="finalPrice" class="price-wrapper "><span class="price">54,95</span></span> 2530 </span></span></div> </div> 2531 2532 </div> 2533 2534
2534<script> 2535 function initPriceBox__6ac34b46cfc54() 2536 { 2537 return { 2538 updatePrice(priceData) { 2539 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 2540 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 2541 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 2542 regularPriceLabel.classList.add('hidden'); 2543 } else { 2544 regularPriceLabel.classList.remove('hidden'); 2545 } 2546 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 2547 } 2548 } 2549 } 2550 </script>
2550 2551 2552 <div class="product-item-inner"> 2553 2554 <div class="addtocart-btn-wrapper md:h-0 md:group-hover:h-12"> 2555 <button class="btn btn-primary action tocart px-6 md:px-2" data-testid="add-to-cart-btn" aria-label="In winkelwagen"> 2556 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="h-5 w-5" width="20" height="20" role="img"> 2557 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path> 2558<title>shopping-cart</title></svg> 2559 <span>In winkelwagen</span> 2560 </button> 2561 </div> 2562 </div> 2563 </div> 2564 </div> 2565 </div> 2566 </form> </div> 2567 </div> 2568 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 2569 <div class="mx-1 product-item w-full" data-product-sku="RM26B2"> 2570 <form method="post" action="https://www.voetbalshirtskoning.nl/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~/product/18008/" data-testid="product-item" class="item product product-item group product_addtocart_form product-item flex flex-col w-full h-full 2571 " data-product-sku="RM26B2"> 2572 <input name="form_key" type="hidden" value="i9tjDByFy1Iir9hF"> <input type="hidden" name="product" value="18008"> 2573 <div class="product-item-info"> 2574 <div class="product-item-left"> 2575 2576 <a href="https://www.voetbalshirtskoning.nl/real-madrid-voetbaltenue-uit-eigen-naam-2026-2027-kind.html" class="product photo product-item-photo block mx-auto" tabindex="-1" data-testid="salable-product-item"> 2577 <span class="block product-image-container product-image-container-"> 2578 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 2579 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 2580 rounded-lg product-image-photo" x-data="" @update-gallery-18008.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/vyornNK7Uwtxyocqrrn-O_hVp4B3lcbghcENl4yuXlo/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3Qvci9lL3JlYWwtbWFkcmlkLXRlbnVlLXVpdC0yMDI2LTIwMjcta2luZC5qcGc_d2lkdGg9MzAwJmhlaWdodD0zMDA.jpg" loading="lazy" width="300" height="300" alt="Real Madrid Voetbaltenue Uit - Eigen Naam - 2026-2027 - Kind" title="Real Madrid Voetbaltenue Uit - Eigen Naam - 2026-2027 - Kind"> 2581 </span> 2582</span> 2583 2584<style> 2585 .product-image-container- span.product-image-wrapper { 2586 padding-bottom: 100%; 2587 } 2588 2589 @media (min-width: 768px) { 2590 .product-image-container- .product-image-photo { 2591 height: 300px; 2592 } 2593 } 2594</style> </a> 2595 </div> 2596 <div class="product-item-right no-reviews"> 2597 <div class="product-info flex flex-col grow"> 2598 <div class="product-details md:bg-white md:group-hover:-mt-12"> 2599 <div class="product name product-item-name"> 2600 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/real-madrid-voetbaltenue-uit-eigen-naam-2026-2027-kind.html" data-testid="salable-product-name-link"> 2601 Real Madrid Voetbaltenue Uit - Eigen Naam - 2026-2027 - Kind </a> 2602 </div> 2603 2604 2605 2606 2607 <div class="product-price-wrapper" x-data="initPriceBox__6ac34b46d82d4()" x-defer="intersect" @update-prices-18008.window="updatePrice($event.detail);"> 2608 <div class="price-box price-final_price" data-role="priceBox" data-product-id="18008" data-price-box="product-id-18008"><span class="normal-price">
2609 <span x-data x-id="['product\u002Dprice\u002D18008']" class="price-container price-final_price tax weee"> 2610 <span class="price-label">Voor</span> 2611 <span :id="$id('product\u002Dprice\u002D18008')" data-price-amount="49.95" data-price-type="finalPrice" class="price-wrapper "><span class="price">49,95</span></span> 2612 </span></span></div> </div> 2613 2614 </div> 2615 2616
2616<script> 2617 function initPriceBox__6ac34b46d82d4() 2618 { 2619 return { 2620 updatePrice(priceData) { 2621 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 2622 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 2623 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 2624 regularPriceLabel.classList.add('hidden'); 2625 } else { 2626 regularPriceLabel.classList.remove('hidden'); 2627 } 2628 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 2629 } 2630 } 2631 } 2632 </script>
2632 2633 2634 <div class="product-item-inner"> 2635 2636 <div class="addtocart-btn-wrapper md:h-0 md:group-hover:h-12"> 2637 <button class="btn btn-primary action tocart px-6 md:px-2" data-testid="add-to-cart-btn" aria-label="In winkelwagen"> 2638 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="h-5 w-5" width="20" height="20" role="img"> 2639 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path> 2640<title>shopping-cart</title></svg> 2641 <span>In winkelwagen</span> 2642 </button> 2643 </div> 2644 </div> 2645 </div> 2646 </div> 2647 </div> 2648 </form> </div> 2649 </div> 2650 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 2651 <div class="mx-1 product-item w-full" data-product-sku="spain-sh-yamal"> 2652 <form method="post" action="https://www.voetbalshirtskoning.nl/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~/product/17997/" data-testid="product-item" class="item product product-item group product_addtocart_form product-item flex flex-col w-full h-full 2653 " data-product-sku="spain-sh-yamal"> 2654 <input name="form_key" type="hidden" value="i9tjDByFy1Iir9hF"> <input type="hidden" name="product" value="17997"> 2655 <div class="product-item-info"> 2656 <div class="product-item-left"> 2657 2658 <a href="https://www.voetbalshirtskoning.nl/lamine-yamal-spanje-voetbalshirt-kind-en-volwassenen.html" class="product photo product-item-photo block mx-auto" tabindex="-1" data-testid="salable-product-item"> 2659 <span class="block product-image-container product-image-container-"> 2660 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 2661 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 2662 rounded-lg product-image-photo" x-data="" @update-gallery-17997.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/WhqOKr4DPbtd9PIMwk_tq-t5x2sTqcu6CVHX7tAplk8/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3QvbC9hL2xhbWluZS15YW1hbC1zaGlydC1raW5kLXZvbHdhc3NlbmVuLmpwZz93aWR0aD0zMDAmaGVpZ2h0PTMwMA.jpg" loading="lazy" width="300" height="300" alt="Lamine Yamal Spanje Voetbalshirt - Kind en Volwassenen" title="Lamine Yamal Spanje Voetbalshirt - Kind en Volwassenen"> 2663 </span> 2664</span> 2665 2666<style> 2667 .product-image-container- span.product-image-wrapper { 2668 padding-bottom: 100%; 2669 } 2670 2671 @media (min-width: 768px) { 2672 .product-image-container- .product-image-photo { 2673 height: 300px; 2674 } 2675 } 2676</style> </a> 2677 </div> 2678 <div class="product-item-right no-reviews"> 2679 <div class="product-info flex flex-col grow"> 2680 <div class="product-details md:bg-white md:group-hover:-mt-12"> 2681 <div class="product name product-item-name"> 2682 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/lamine-yamal-spanje-voetbalshirt-kind-en-volwassenen.html" data-testid="salable-product-name-link"> 2683 Lamine Yamal Spanje Voetbalshirt - Kind en Volwassenen </a> 2684 </div> 2685 2686 2687 2688 2689 <div class="product-price-wrapper" x-data="initPriceBox__6ac34b46e1b4a()" x-defer="intersect" @update-prices-17997.window="updatePrice($event.detail);"> 2690 <div class="price-box price-final_price" data-role="priceBox" data-product-id="17997" data-price-box="product-id-17997"><span class="normal-price">
2691 <span x-data x-id="['product\u002Dprice\u002D17997']" class="price-container price-final_price tax weee"> 2692 <span class="price-label">Voor</span> 2693 <span :id="$id('product\u002Dprice\u002D17997')" data-price-amount="34.95" data-price-type="finalPrice" class="price-wrapper "><span class="price">34,95</span></span> 2694 </span></span></div> </div> 2695 2696 </div> 2697 2698
2698<script> 2699 function initPriceBox__6ac34b46e1b4a() 2700 { 2701 return { 2702 updatePrice(priceData) { 2703 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 2704 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 2705 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 2706 regularPriceLabel.classList.add('hidden'); 2707 } else { 2708 regularPriceLabel.classList.remove('hidden'); 2709 } 2710 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 2711 } 2712 } 2713 } 2714 </script>
2714 2715 2716 <div class="product-item-inner"> 2717 2718 <div class="addtocart-btn-wrapper md:h-0 md:group-hover:h-12"> 2719 <button class="btn btn-primary action tocart px-6 md:px-2" data-testid="add-to-cart-btn" aria-label="In winkelwagen"> 2720 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="h-5 w-5" width="20" height="20" role="img"> 2721 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path> 2722<title>shopping-cart</title></svg> 2723 <span>In winkelwagen</span> 2724 </button> 2725 </div> 2726 </div> 2727 </div> 2728 </div> 2729 </div> 2730 </form> </div> 2731 </div> 2732 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 2733 <div class="mx-1 product-item w-full" data-product-sku="P25125"> 2734 <form method="post" action="https://www.voetbalshirtskoning.nl/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~/product/17991/" data-testid="product-item" class="item product product-item group product_addtocart_form product-item flex flex-col w-full h-full 2735 " data-product-sku="P25125"> 2736 <input name="form_key" type="hidden" value="i9tjDByFy1Iir9hF"> <input type="hidden" name="product" value="17991"> 2737 <div class="product-item-info"> 2738 <div class="product-item-left"> 2739 2740 <a href="https://www.voetbalshirtskoning.nl/psg-trainingspak-thuis-volwas.html" class="product photo product-item-photo block mx-auto" tabindex="-1" data-testid="salable-product-item"> 2741 <span class="block product-image-container product-image-container-"> 2742 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 2743 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 2744 rounded-lg product-image-photo" x-data="" @update-gallery-17991.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/3qQ7WHUKmO7H7VjBPN03MoSjx1U9U5PT83S3vOLJdsU/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3QvcC9zL3BzZy10cmFpbmluZ3NwYWsta2luZC0yMDI2LTIwMjdfMS5qcGc_d2lkdGg9MzAwJmhlaWdodD0zMDA.jpg" loading="lazy" width="300" height="300" alt="PSG Trainingspak Thuis - Eigen Naam - 2026-2027 - Volwassenen" title="PSG Trainingspak Thuis - Eigen Naam - 2026-2027 - Volwassenen"> 2745 </span> 2746</span> 2747 2748<style> 2749 .product-image-container- span.product-image-wrapper { 2750 padding-bottom: 100%; 2751 } 2752 2753 @media (min-width: 768px) { 2754 .product-image-container- .product-image-photo { 2755 height: 300px; 2756 } 2757 } 2758</style> </a> 2759 </div> 2760 <div class="product-item-right no-reviews"> 2761 <div class="product-info flex flex-col grow"> 2762 <div class="product-details md:bg-white md:group-hover:-mt-12"> 2763 <div class="product name product-item-name"> 2764 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/psg-trainingspak-thuis-volwas.html" data-testid="salable-product-name-link"> 2765 PSG Trainingspak Thuis - Eigen Naam - 2026-2027 - Volwassenen </a> 2766 </div> 2767 2768 2769 2770 2771 <div class="product-price-wrapper" x-data="initPriceBox__6ac34b46e99dd()" x-defer="intersect" @update-prices-17991.window="updatePrice($event.detail);"> 2772 <div class="price-box price-final_price" data-role="priceBox" data-product-id="17991" data-price-box="product-id-17991"><span class="normal-price">
2773 <span x-data x-id="['product\u002Dprice\u002D17991']" class="price-container price-final_price tax weee"> 2774 <span class="price-label">Voor</span> 2775 <span :id="$id('product\u002Dprice\u002D17991')" data-price-amount="69.95" data-price-type="finalPrice" class="price-wrapper "><span class="price">69,95</span></span> 2776 </span></span></div> </div> 2777 2778 </div> 2779 2780
2780<script> 2781 function initPriceBox__6ac34b46e99dd() 2782 { 2783 return { 2784 updatePrice(priceData) { 2785 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 2786 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 2787 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 2788 regularPriceLabel.classList.add('hidden'); 2789 } else { 2790 regularPriceLabel.classList.remove('hidden'); 2791 } 2792 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 2793 } 2794 } 2795 } 2796 </script>
2796 2797 2798 <div class="product-item-inner"> 2799 2800 <div class="addtocart-btn-wrapper md:h-0 md:group-hover:h-12"> 2801 <button class="btn btn-primary action tocart px-6 md:px-2" data-testid="add-to-cart-btn" aria-label="In winkelwagen"> 2802 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="h-5 w-5" width="20" height="20" role="img"> 2803 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path> 2804<title>shopping-cart</title></svg> 2805 <span>In winkelwagen</span> 2806 </button> 2807 </div> 2808 </div> 2809 </div> 2810 </div> 2811 </div> 2812 </form> </div> 2813 </div> 2814 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 2815 <div class="mx-1 product-item w-full" data-product-sku="P25172"> 2816 <form method="post" action="https://www.voetbalshirtskoning.nl/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~/product/17985/" data-testid="product-item" class="item product product-item group product_addtocart_form product-item flex flex-col w-full h-full 2817 " data-product-sku="P25172"> 2818 <input name="form_key" type="hidden" value="i9tjDByFy1Iir9hF"> <input type="hidden" name="product" value="17985"> 2819 <div class="product-item-info"> 2820 <div class="product-item-left"> 2821 2822 <a href="https://www.voetbalshirtskoning.nl/psg-trainingspak-thuis-kind.html" class="product photo product-item-photo block mx-auto" tabindex="-1" data-testid="salable-product-item"> 2823 <span class="block product-image-container product-image-container-"> 2824 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 2825 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 2826 rounded-lg product-image-photo" x-data="" @update-gallery-17985.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/CxZTHqyuE0uSE_1IIYNbRBQaLF6icN0FAWvSErJN7ZA/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3QvcC9zL3BzZy10cmFpbmluZ3NwYWsta2luZC0yMDI2LTIwMjcuanBnP3dpZHRoPTMwMCZoZWlnaHQ9MzAw.jpg" loading="lazy" width="300" height="300" alt="PSG Trainingspak Thuis - Eigen Naam - 2026-2027 - Kind" title="PSG Trainingspak Thuis - Eigen Naam - 2026-2027 - Kind"> 2827 </span> 2828</span> 2829 2830<style> 2831 .product-image-container- span.product-image-wrapper { 2832 padding-bottom: 100%; 2833 } 2834 2835 @media (min-width: 768px) { 2836 .product-image-container- .product-image-photo { 2837 height: 300px; 2838 } 2839 } 2840</style> </a> 2841 </div> 2842 <div class="product-item-right no-reviews"> 2843 <div class="product-info flex flex-col grow"> 2844 <div class="product-details md:bg-white md:group-hover:-mt-12"> 2845 <div class="product name product-item-name"> 2846 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/psg-trainingspak-thuis-kind.html" data-testid="salable-product-name-link"> 2847 PSG Trainingspak Thuis - Eigen Naam - 2026-2027 - Kind </a> 2848 </div> 2849 2850 2851 2852 2853 <div class="product-price-wrapper" x-data="initPriceBox__6ac34b46f188e()" x-defer="intersect" @update-prices-17985.window="updatePrice($event.detail);"> 2854 <div class="price-box price-final_price" data-role="priceBox" data-product-id="17985" data-price-box="product-id-17985"><span class="normal-price">
2855 <span x-data x-id="['product\u002Dprice\u002D17985']" class="price-container price-final_price tax weee"> 2856 <span class="price-label">Voor</span> 2857 <span :id="$id('product\u002Dprice\u002D17985')" data-price-amount="64.95" data-price-type="finalPrice" class="price-wrapper "><span class="price">64,95</span></span> 2858 </span></span></div> </div> 2859 2860 </div> 2861 2862
2862<script> 2863 function initPriceBox__6ac34b46f188e() 2864 { 2865 return { 2866 updatePrice(priceData) { 2867 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 2868 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 2869 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 2870 regularPriceLabel.classList.add('hidden'); 2871 } else { 2872 regularPriceLabel.classList.remove('hidden'); 2873 } 2874 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 2875 } 2876 } 2877 } 2878 </script>
2878 2879 2880 <div class="product-item-inner"> 2881 2882 <div class="addtocart-btn-wrapper md:h-0 md:group-hover:h-12"> 2883 <button class="btn btn-primary action tocart px-6 md:px-2" data-testid="add-to-cart-btn" aria-label="In winkelwagen"> 2884 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="h-5 w-5" width="20" height="20" role="img"> 2885 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path> 2886<title>shopping-cart</title></svg> 2887 <span>In winkelwagen</span> 2888 </button> 2889 </div> 2890 </div> 2891 </div> 2892 </div> 2893 </div> 2894 </form> </div> 2895 </div> 2896 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 2897 <div class="mx-1 product-item w-full" data-product-sku="RM26B1MB"> 2898 <form method="post" action="https://www.voetbalshirtskoning.nl/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~/product/17979/" data-testid="product-item" class="item product product-item group product_addtocart_form product-item flex flex-col w-full h-full 2899 " data-product-sku="RM26B1MB"> 2900 <input name="form_key" type="hidden" value="i9tjDByFy1Iir9hF"> <input type="hidden" name="product" value="17979"> 2901 <div class="product-item-info"> 2902 <div class="product-item-left"> 2903 2904 <a href="https://www.voetbalshirtskoning.nl/mbappe-real-madrid-voetbaltenue-thuis-2026-2027-kind.html" class="product photo product-item-photo block mx-auto" tabindex="-1" data-testid="salable-product-item"> 2905 <span class="block product-image-container product-image-container-"> 2906 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 2907 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 2908 rounded-lg product-image-photo" x-data="" @update-gallery-17979.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/cm73kJLFZGZB13BZvGC9awuBXPoGbraABfd1_U_hMV0/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3Qvci9lL3JlYWwtbWFkcmlkLXZvZXRiYWx0ZW51ZS1tYmFwcGUtYWNodGVya2FudC1raW5kXzEuanBnP3dpZHRoPTMwMCZoZWlnaHQ9MzAw.jpg" loading="lazy" width="300" height="300" alt="Mbappe Real Madrid Voetbaltenue Thuis - 2026-2027 - Kind" title="Mbappe Real Madrid Voetbaltenue Thuis - 2026-2027 - Kind"> 2909 </span> 2910</span> 2911 2912<style> 2913 .product-image-container- span.product-image-wrapper { 2914 padding-bottom: 100%; 2915 } 2916 2917 @media (min-width: 768px) { 2918 .product-image-container- .product-image-photo { 2919 height: 300px; 2920 } 2921 } 2922</style> </a> 2923 </div> 2924 <div class="product-item-right no-reviews"> 2925 <div class="product-info flex flex-col grow"> 2926 <div class="product-details md:bg-white md:group-hover:-mt-12"> 2927 <div class="product name product-item-name"> 2928 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/mbappe-real-madrid-voetbaltenue-thuis-2026-2027-kind.html" data-testid="salable-product-name-link"> 2929 Mbappe Real Madrid Voetbaltenue Thuis - 2026-2027 - Kind </a> 2930 </div> 2931 2932 2933 2934 2935 <div class="product-price-wrapper" x-data="initPriceBox__6ac34b4706b0a()" x-defer="intersect" @update-prices-17979.window="updatePrice($event.detail);"> 2936 <div class="price-box price-final_price" data-role="priceBox" data-product-id="17979" data-price-box="product-id-17979"><span class="normal-price">
2937 <span x-data x-id="['product\u002Dprice\u002D17979']" class="price-container price-final_price tax weee"> 2938 <span class="price-label">Voor</span> 2939 <span :id="$id('product\u002Dprice\u002D17979')" data-price-amount="54.95" data-price-type="finalPrice" class="price-wrapper "><span class="price">54,95</span></span> 2940 </span></span></div> </div> 2941 2942 </div> 2943 2944
2944<script> 2945 function initPriceBox__6ac34b4706b0a() 2946 { 2947 return { 2948 updatePrice(priceData) { 2949 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 2950 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 2951 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 2952 regularPriceLabel.classList.add('hidden'); 2953 } else { 2954 regularPriceLabel.classList.remove('hidden'); 2955 } 2956 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 2957 } 2958 } 2959 } 2960 </script>
2960 2961 2962 <div class="product-item-inner"> 2963 2964 <div class="addtocart-btn-wrapper md:h-0 md:group-hover:h-12"> 2965 <button class="btn btn-primary action tocart px-6 md:px-2" data-testid="add-to-cart-btn" aria-label="In winkelwagen"> 2966 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="h-5 w-5" width="20" height="20" role="img"> 2967 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path> 2968<title>shopping-cart</title></svg> 2969 <span>In winkelwagen</span> 2970 </button> 2971 </div> 2972 </div> 2973 </div> 2974 </div> 2975 </div> 2976 </form> </div> 2977 </div> 2978 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 2979 <div class="mx-1 product-item w-full" data-product-sku="RM26B1"> 2980 <form method="post" action="https://www.voetbalshirtskoning.nl/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~/product/17973/" data-testid="product-item" class="item product product-item group product_addtocart_form product-item flex flex-col w-full h-full 2981 " data-product-sku="RM26B1"> 2982 <input name="form_key" type="hidden" value="i9tjDByFy1Iir9hF"> <input type="hidden" name="product" value="17973"> 2983 <div class="product-item-info"> 2984 <div class="product-item-left"> 2985 2986 <a href="https://www.voetbalshirtskoning.nl/real-madrid-voetbaltenue-thuis-eigen-naam-2026-2027-kind.html" class="product photo product-item-photo block mx-auto" tabindex="-1" data-testid="salable-product-item"> 2987 <span class="block product-image-container product-image-container-"> 2988 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 2989 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 2990 rounded-lg product-image-photo" x-data="" @update-gallery-17973.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/ZbDvQ6m0kulSkqtgqKAS3ArDz7fIHf6kx21q2xGD_vo/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3Qvci9lL3JlYWwtbWFkcmlkLXRlbnVlLXRodWlzLWtpbmQuanBnP3dpZHRoPTMwMCZoZWlnaHQ9MzAw.jpg" loading="lazy" width="300" height="300" alt="Real Madrid Voetbaltenue Thuis - Eigen Naam - 2026-2027 - Kind" title="Real Madrid Voetbaltenue Thuis - Eigen Naam - 2026-2027 - Kind"> 2991 </span> 2992</span> 2993 2994<style> 2995 .product-image-container- span.product-image-wrapper { 2996 padding-bottom: 100%; 2997 } 2998 2999 @media (min-width: 768px) { 3000 .product-image-container- .product-image-photo { 3001 height: 300px; 3002 } 3003 } 3004</style> </a> 3005 </div> 3006 <div class="product-item-right no-reviews"> 3007 <div class="product-info flex flex-col grow"> 3008 <div class="product-details md:bg-white md:group-hover:-mt-12"> 3009 <div class="product name product-item-name"> 3010 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/real-madrid-voetbaltenue-thuis-eigen-naam-2026-2027-kind.html" data-testid="salable-product-name-link"> 3011 Real Madrid Voetbaltenue Thuis - Eigen Naam - 2026-2027 - Kind </a> 3012 </div> 3013 3014 3015 3016 3017 <div class="product-price-wrapper" x-data="initPriceBox__6ac34b471088a()" x-defer="intersect" @update-prices-17973.window="updatePrice($event.detail);"> 3018 <div class="price-box price-final_price" data-role="priceBox" data-product-id="17973" data-price-box="product-id-17973"><span class="normal-price">
3019 <span x-data x-id="['product\u002Dprice\u002D17973']" class="price-container price-final_price tax weee"> 3020 <span class="price-label">Voor</span> 3021 <span :id="$id('product\u002Dprice\u002D17973')" data-price-amount="49.95" data-price-type="finalPrice" class="price-wrapper "><span class="price">49,95</span></span> 3022 </span></span></div> </div> 3023 3024 </div> 3025 3026
3026<script> 3027 function initPriceBox__6ac34b471088a() 3028 { 3029 return { 3030 updatePrice(priceData) { 3031 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 3032 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 3033 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 3034 regularPriceLabel.classList.add('hidden'); 3035 } else { 3036 regularPriceLabel.classList.remove('hidden'); 3037 } 3038 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 3039 } 3040 } 3041 } 3042 </script>
3042 3043 3044 <div class="product-item-inner"> 3045 3046 <div class="addtocart-btn-wrapper md:h-0 md:group-hover:h-12"> 3047 <button class="btn btn-primary action tocart px-6 md:px-2" data-testid="add-to-cart-btn" aria-label="In winkelwagen"> 3048 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="h-5 w-5" width="20" height="20" role="img"> 3049 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path> 3050<title>shopping-cart</title></svg> 3051 <span>In winkelwagen</span> 3052 </button> 3053 </div> 3054 </div> 3055 </div> 3056 </div> 3057 </div> 3058 </form> </div> 3059 </div> 3060 <div class="flex shrink-0 js_slide w-1/2 sm:w-1/3 lg:w-1/4"> 3061 <div class="mx-1 product-item w-full" data-product-sku="UCL26010-yam"> 3062 <form method="post" action="https://www.voetbalshirtskoning.nl/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~/product/17956/" data-testid="product-item" class="item product product-item group product_addtocart_form product-item flex flex-col w-full h-full 3063 " data-product-sku="UCL26010-yam"> 3064 <input name="form_key" type="hidden" value="i9tjDByFy1Iir9hF"> <input type="hidden" name="product" value="17956"> 3065 <div class="product-item-info"> 3066 <div class="product-item-left"> 3067 3068 <a href="https://www.voetbalshirtskoning.nl/lamine-yamal-champions-league-voetbaltenue-kind.html" class="product photo product-item-photo block mx-auto" tabindex="-1" data-testid="salable-product-item"> 3069 <span class="block product-image-container product-image-container-"> 3070 <span class="block relative product-image-wrapper overflow-hidden rounded-lg"> 3071 <img class="object-contain absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 3072 rounded-lg product-image-photo" x-data="" @update-gallery-17956.window="$root.src = $event.detail" src="https://www.voetbalshirtskoning.nl/img/GgKJ7vXO5mc_Ki69SnPFu0SaEyOLxundRRxt3-4ggOQ/resize:fit:300:300/aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC9tZWRpYS9jYXRhbG9nL3Byb2R1Y3QvbC9hL2xhbWluZS15YW1hbC12b2V0YmFsdGVudWUtY2hhbXBpb25zLWxlYWd1ZS1raW5kLmpwZz93aWR0aD0zMDAmaGVpZ2h0PTMwMA.jpg" loading="lazy" width="300" height="300" alt="Lamine Yamal Champions League Voetbaltenue - Kind" title="Lamine Yamal Champions League Voetbaltenue - Kind"> 3073 </span> 3074</span> 3075 3076<style> 3077 .product-image-container- span.product-image-wrapper { 3078 padding-bottom: 100%; 3079 } 3080 3081 @media (min-width: 768px) { 3082 .product-image-container- .product-image-photo { 3083 height: 300px; 3084 } 3085 } 3086</style> </a> 3087 </div> 3088 <div class="product-item-right no-reviews"> 3089 <div class="product-info flex flex-col grow"> 3090 <div class="product-details md:bg-white md:group-hover:-mt-12"> 3091 <div class="product name product-item-name"> 3092 <a class="product-item-link" href="https://www.voetbalshirtskoning.nl/lamine-yamal-champions-league-voetbaltenue-kind.html" data-testid="salable-product-name-link"> 3093 Lamine Yamal Champions League Voetbaltenue - Kind </a> 3094 </div> 3095 3096 3097 3098 3099 <div class="product-price-wrapper" x-data="initPriceBox__6ac34b4718e0f()" x-defer="intersect" @update-prices-17956.window="updatePrice($event.detail);"> 3100 <div class="price-box price-final_price" data-role="priceBox" data-product-id="17956" data-price-box="product-id-17956"><span class="normal-price">
3101 <span x-data x-id="['product\u002Dprice\u002D17956']" class="price-container price-final_price tax weee"> 3102 <span class="price-label">Voor</span> 3103 <span :id="$id('product\u002Dprice\u002D17956')" data-price-amount="49.95" data-price-type="finalPrice" class="price-wrapper "><span class="price">49,95</span></span> 3104 </span></span></div> </div> 3105 3106 </div> 3107 3108
3108<script> 3109 function initPriceBox__6ac34b4718e0f() 3110 { 3111 return { 3112 updatePrice(priceData) { 3113 const regularPriceLabel = this.$root.querySelector('.normal-price .price-label'); 3114 const regularPriceElement = this.$root.querySelector('.normal-price .price-wrapper .price'); 3115 if (priceData.finalPrice.amount < priceData.oldPrice.amount) { 3116 regularPriceLabel.classList.add('hidden'); 3117 } else { 3118 regularPriceLabel.classList.remove('hidden'); 3119 } 3120 regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); 3121 } 3122 } 3123 } 3124 </script>
3124 3125 3126 <div class="product-item-inner"> 3127 3128 <div class="addtocart-btn-wrapper md:h-0 md:group-hover:h-12"> 3129 <button class="btn btn-primary action tocart px-6 md:px-2" data-testid="add-to-cart-btn" aria-label="In winkelwagen"> 3130 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" class="h-5 w-5" width="20" height="20" role="img"> 3131 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path> 3132<title>shopping-cart</title></svg> 3133 <span>In winkelwagen</span> 3134 </button> 3135 </div> 3136 </div> 3137 </div> 3138 </div> 3139 </div> 3140 </form> </div> 3141 </div> 3142 </div> 3143 </div> 3144 <template x-if="itemCount > pageSize"> 3145 <div class="slider-nav"> 3146 <button aria-label="Vorige" tabindex="-1" class="slider-btn btn-prev" :class="{ 'opacity-0 pointer-events-none' : !isScrollPreviousButtonVisible }" @click="scrollPrevious"> 3147 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" width="20" height="20" role="img"> 3148 <path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd"></path> 3149<title>arrow-left</title></svg> 3150 </button> 3151 <button aria-label="Volgende" tabindex="-1" class="slider-btn btn-next" :class="{ 'opacity-0 pointer-events-none' : !isScrollNextButtonVisible }" @click="scrollNext"> 3152 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20" fill="currentColor" width="20" height="20" role="img"> 3153 <path fill-rule="evenodd" d="M10.293 3.293a1 1 0 011.414 0l6 6a1 1 0 010 1.414l-6 6a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-4.293-4.293a1 1 0 010-1.414z" clip-rule="evenodd"></path> 3154<title>arrow-right</title></svg> 3155 </button> 3156 </div> 3157 </template> 3158 </div> 3159 </section> 3160</div><div class="footer-usp-title-wrapper"> 3161 <h4 class="block-title"> 3162 Bij ons zit je goed </h4> 3163 </div> 3164 <div class="footer-usp-wrapper grid-cols-4"> 3165 <div class="footer-usp-item"> 3166 <div class="footer-usp-icon"> 3167 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="32" height="32" role="img"> 3168 <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 3169<title>check-circle</title></svg> 3170 </div> 3171 <div class="footer-usp-text"> 3172 Op werkdagen voor 22.00 besteld, <strong>morgen in huis!*</strong> </div> 3173 </div> 3174 <div class="footer-usp-item"> 3175 <div class="footer-usp-icon"> 3176 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="32" height="32" role="img"> 3177 <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 3178<title>check-circle</title></svg> 3179 </div> 3180 <div class="footer-usp-text"> 3181 <strong>Gratis verzending</strong> vanaf 30 euro </div> 3182 </div> 3183 <div class="footer-usp-item"> 3184 <div class="footer-usp-icon"> 3185 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="32" height="32" role="img"> 3186 <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 3187<title>check-circle</title></svg> 3188 </div> 3189 <div class="footer-usp-text"> 3190 <strong>Gratis retourneren</strong> binnen 30 dagen </div> 3191 </div> 3192 <div class="footer-usp-item"> 3193 <div class="footer-usp-icon"> 3194 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="32" height="32" role="img"> 3195 <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 3196<title>check-circle</title></svg> 3197 </div> 3198 <div class="footer-usp-text"> 3199 <strong>Thuiswinkel waarborg</strong> </div> 3200 </div> 3201 </div><div class="home-cms-content mt-10 md:mt-20"><h1>Goedkope Voetbalshirts</h1> 3202<p class="normal">Ben jij op zoek naar goedkope voetbalshirts? Voetbalshirtskoning.nl is dé voetbal webshop van Nederland met goedkope voetbalshirts. Wij zijn liefhebbers van <a href="/voetbalshirts/">voetbalshirts</a> en delen onze voetbalpassie graag met jou, de voetbalfan. Dit betekent goedkope voetbalshirts van een hoogwaardige kwaliteit, maar te koop voor een voordelige prijs. Ons assortiment is met zorg samengesteld en bestaat daarom uit een divers aanbod van goedkope voetbal producten. Zo hebben we officiële voetbalshirts, maar ook fanshirts. Voetbalshirts bestellen is bij ons gemakkelijk en loopt altijd via een beveiligde verbinding.</p> 3203<h2>Shirts, tenues, trainingspakken en fanartikelen</h2> 3204<p class="normal">Voetbalshirts zijn op alle posities sterk vertegenwoordigd, met zowel thuisshirts als uitshirts en in zowel korte als lange mouwen. Compleet en nieuw <a title="Voetbaltenue" href="/voetbaltenues/">voetbaltenue</a> bestaande uit een voetbalshirt, voetbalbroekje en voetbalsokken mogen uiteraard niet ontbreken in een uitgebalanceerde selectie. Ook hebben we aan de onmisbare schakel gedacht met een ruim aanbod aan keeperskleding, zoals keepersshirts en volwaardige keeperstenues. Naast de gevarieerde collectie goedkope voetbalshirts, kun je in de voetbal fanshop terecht voor andere producten zoals <a title="voetbal trainingspakken" href="https://www.voetbalshirtskoning.nl/trainingspakken/">voetbal trainingspakken</a>, voetbalpetten en overige gave merchandising.</p> 3205<h2>Eredivisie, Europese topclubs en landenteams</h2> 3206<p class="normal">Onze collectie goedkope voetbalshirts bestaat uit artikelen van Nederlandse clubs en Europese grootmachten zoals het Ajax shirt, <a title="barcelona shirt" href="/voetbalshirts/barcelona/">Barcelona shirt</a>, <a title="real madrid shirt" href="/voetbalshirts/real-madrid/">Real Madrid shirt</a> en Bayern München shirt. Ook voor de trouwe Oranje supporters hebben we vele Oranje fanartikelen zoals het <a title="nederlands elftal shirt" href="/voetbalshirts/landen/nederlands-elftal/">Nederlands Elftal shirt</a> naar de overwinning schreeuwt. Een landen voetbalshirt haal je ook van populaire landenteams zoals Spanje, Brazilië en België kan natuurlijk ook, de keuze is reuze. </p> 3207<h2>Shirt bedrukking van je favoriete speler</h2> 3208<p class="normal">Bijna alles is mogelijk in onze voetbalshop. Wil je graag de naam van je favoriete speler op het replica voetbal shirt? Kies dan voor de optie <a title="Voetbalshirt bedrukken" href="/voetbalshirt-bedrukken/" target="_self">voetbalshirt bedrukken</a> en ga voor het spelersshirt van bijvoorbeeld <a title="Messi shirt" href="/spelers
3208/messi-voetbalshirt/" target="_self">Messi</a>, <a title="Ronaldo shirt" href="/spelers/ronaldo-voetbalshirt/" target="_self">Ronaldo</a>, <a href="https://www.voetbalshirtskoning.nl/spelers/mbappe/">Mbappe</a>, <a title="Lamine Yamal" href="/spelers/lamine-yamal/">Lamine Yamal</a> of <a title="Haaland" href="/spelers/haaland/">Haaland</a>. Ook kun je natuurlijk kiezen voor je eigen naam en favoriete rugnummer. Wij bedrukken de voetbalshirts altijd met het juiste lettertype zodat het mooi bij het shirt past. Bestel je een bedrukt shirt al voor 14.00? Dan is het morgen in huis. Helemaal een eigen design nodig? Kijk voor meer informatie op onze voetbalshirt ontwerpen pagina.</p> 3209<h2>Goedkope voetbalshirts voor alle leeftijden, voor elk budget</h2> 3210<p class="normal">Voetbal is voor alle leeftijden, kinderen en volwassenen. Voor de junioren is er daarom volop keuze aan goedkope <a title="Voetbalshirts kids" href="/voetbalshirts-kids/">voetbalshirts kids</a>. Kies uit verschillende kleuren en maten en profiteer dankzij de vele aanbiedingen van aantrekkelijke kortingen. De voetbalfan is onze nummer één, daarom kun je binnen 30 dagen gratis ruilen of retourneren. In onze voetbalwinkel kun je betalen met iDEAL, Creditcard, Paypal, Bancontact, Apple Pay of Google Pay. Ook kun je ervoor kiezen om je voetbalshirt achteraf te betalen via Klarna. Wij verzenden gratis vanaf 30 euro. Kom je niet aan dat bedrag? Koop er dan nog een leuk paar voetbalsokken of een voetbalbroekje bij. Goedkope voetbalshirts en andere voetbalkleding bestel je via Voetbalshirtskoning. Veel winkelplezier!</p></div></div></div></main><div class="kiyoh-shop-snippets kiyoh-schema border-t py-3 lg:py-6" 3211 itemscope="itemscope" itemtype="http://schema.org/Organization" style="display:block;"> 3212 <meta itemprop="name" content="Voetbalshirtskoning.nl"/> 3213 <div class="flex justify-center flex-col items-center" 3214 itemprop="aggregateRating" itemscope="itemscope" itemtype="http://schema.org/AggregateRating"> 3215 <meta itemprop="bestRating" content="10"> 3216 <h2 class="block-title !text-2xl font-bold mb-3 lg:mb-4">Klantbeoordeling <span itemprop="ratingValue">8.5</span> 3217 </h2> 3218 <div class="rating-box flex mb-2"> 3219 <svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 18 18" fill="currentColor" class="text-secondary" role="img"> 3220 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> 3221<title>star-xl</title></svg> 3222 <svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 18 18" fill="currentColor" class="text-secondary" role="img"> 3223 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> 3224<title>star-xl</title></svg> 3225 <svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 18 18" fill="currentColor" class="text-secondary" role="img"> 3226 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> 3227<title>star-xl</title></svg> 3228 <svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 18 18" fill="currentColor" class="text-secondary" role="img"> 3229 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
3229 3230<title>star-xl</title></svg> 3231 <svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 18 18" fill="currentColor"> 3232 <defs> 3233 <linearGradient id="partialFill-6ac3510c934c9"> 3234 <stop offset="0%" stop-color="#FF6600"/> 3235 <stop offset="25%" stop-color="#FF6600"/> 3236 <stop offset="25%" stop-color="#D1D5DB"/> 3237 <stop offset="100%" stop-color="#D1D5DB"/> 3238 </linearGradient> 3239 </defs> 3240 <g fill="url(#partialFill-6ac3510c934c9)"> 3241 <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> 3242 </g> 3243 </svg> 3244 </div> 3245 <p> 3246 <a href="https://www.kiyoh.com/reviews/1047312/voetbalshirtskoning_nl" target="_blank" class="kiyoh-link"> 3247 <span itemprop="ratingCount">16659</span> 3248 reviews </a> 3249 </p> 3250 </div> 3251</div><footer class="page-footer"><div class="footer container overflow-hidden"><div class="footer-usp-wrapper"> 3252 <a class="footer-usp-item" href="/klantenservice/" 3253 aria-label="Meer informatie"> 3254 <div class="footer-usp-icon"> 3255 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="24" height="24" role="img"> 3256 <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 3257<title>check-circle</title></svg> 3258 </div> 3259 <div class="footer-usp-text"> 3260 <strong>Klantenservice</strong> - we staan voor je klaar </div> 3261 </a> 3262 <a class="footer-usp-item" href="/klantenservice/verzenden/onze-verzendservice/" 3263 aria-label="Meer informatie"> 3264 <div class="footer-usp-icon"> 3265 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="24" height="24" role="img"> 3266 <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 3267<title>check-circle</title></svg> 3268 </div> 3269 <div class="footer-usp-text"> 3270 <strong>Morgen bezorgd</strong> - bestel op werkdagen voor 22.00 uur* </div> 3271 </a> 3272 <a class="footer-usp-item" href="/klantenservice/verzenden/onze-verzendservice/" 3273 aria-label="Meer informatie"> 3274 <div class="footer-usp-icon"> 3275 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="24" height="24" role="img"> 3276 <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 3277<title>check-circle</title></svg> 3278 </div> 3279 <div class="footer-usp-text"> 3280 <strong>Gratis verzending</strong> - vanaf 30 euro </div> 3281 </a> 3282 <a class="footer-usp-item" href="https://www.thuiswinkel.org/leden/voetbalshirtskoning-nl/certificaat" 3283 aria-label="Meer informatie"> 3284 <div class="footer-usp-icon"> 3285 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="24" height="24" role="img"> 3286 <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 3287<title>check-circle</title></svg> 3288 </div> 3289 <div class="footer-usp-text"> 3290 Thuiswinkel waarborg </div> 3291 </a> 3292 </div><div class="footer-middle-wrapper md:flex flex-col lg:flex-row-reverse md:gap-y-10 md:pb-10 lg:pt-10 md:border-b md:border-footer-columns-border-color md:gap-x-8"><div class="footer-links-columns" role="navigation" 3293 aria-label=Footer Links> 3294 <div class="footer-links-col" x-data="{open: false}" :class="{active: open}" 3295 aria-labelledby="footer-col-1-toggle"> 3296 <button 3297 type="button" 3298 id="footer-col-1-toggle" 3299 class="block-title inline-flex w-full items-center justify-between gap-2" 3300 @click="open = !open" 3301 @keydown.enter.prevent="open = !open" 3302 @keydown.space.prevent="open = !open" 3303 :aria-expanded="open.toString()" 3304 aria-controls="footer-col-1-content" 3305 >
3306 <span>Over Voetbalshirtskoning</span> 3307 <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"> 3308 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/> 3309</svg> 3310 </button> 3311 <div id="footer-col-1-content" 3312 class="block-content hidden" :class="{hidden: !open}"> 3313 <ul class="footer-links"> 3314 <li> 3315 <a href="/klantenservice/over-ons/" 3316 aria-label="Go to Over ons"> 3317 Over ons </a> 3318 </li> 3319 <li> 3320 <a href="/klantenservice/veilig-winkelen/keurmerk/" 3321 aria-label="Go to Thuiswinkel waarborg"> 3322 Thuiswinkel waarborg </a> 3323 </li> 3324 <li> 3325 <a href="/klantenservice/veilig-winkelen/cookies/" 3326 aria-label="Go to Cookies"> 3327 Cookies </a> 3328 </li> 3329 <li> 3330 <a href="/ontwerpen/voetbalshirt/" 3331 aria-label="Go to Voetbalshirt ontwerpen"> 3332 Voetbalshirt ontwerpen </a> 3333 </li> 3334 <li> 3335 <a href="/blog/" 3336 aria-label="Go to Blog"> 3337 Blog </a> 3338 </li> 3339 <li> 3340 <a href="/reviews" 3341 aria-label="Go to Reviews"> 3342 Reviews </a> 3343 </li> 3344 </ul> 3345 </div> 3346 </div> 3347 <div class="footer-links-col" x-data="{open: false}" :class="{active: open}" 3348 aria-labelledby="footer-col-2-toggle"> 3349 <button 3350 type="button" 3351 id="footer-col-2-toggle" 3352 class="block-title inline-flex w-full items-center justify-between gap-2" 3353 @click="open = !open" 3354 @keydown.enter.prevent="open = !open" 3355 @keydown.space.prevent="open = !open" 3356 :aria-expanded="open.toString()" 3357 aria-controls="footer-col-2-content" 3358 > 3359 <span>Klantenservice</span> 3360 <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"> 3361 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/> 3362</svg> 3363 </button> 3364 <div id="footer-col-2-content" 3365 class="block-content hidden" :class="{hidden: !open}"> 3366 <ul class="footer-links"> 3367 <li> 3368 <a href="/klantenservice/" 3369 aria-label="Go to Klantenservice"> 3370 Klantenservice </a> 3371 </li> 3372 <li> 3373 <a href="/klantenservice/bestellen/" 3374 aria-label="Go to Bestellen"> 3375 Bestellen </a> 3376 </li> 3377 <li> 3378 <a href="/klantenservice/betalen/" 3379 aria-label="Go to Betalen"> 3380 Betalen </a> 3381 </li> 3382 <li> 3383 <a href="/klantenservice/verzenden/" 3384 aria-label="Go to Verzending"> 3385 Verzending </a> 3386 </li> 3387 <li> 3388 <a href="/klantenservice/ruilen-en-retouren/" 3389 aria-label="Go to Ruilen en retourneren"> 3390 Ruilen en retourneren </a> 3391 </li> 3392 <li> 3393 <a href="/klantenservice/ruilen-en-retouren/bedenktijd/" 3394 aria-label="Go to 30 dagen bedenktijd"> 3395 30 dagen bedenktijd </a> 3396 </li> 3397 <li> 3398 <a href="/contact/" 3399 aria-label="Go to Contact"> 3400 Contact </a> 3401 </li> 3402 </ul> 3403 </div> 3404 </div> 3405 <div class="footer-links-col" x-data="{open: false}" :class="{active: open}" 3406 aria-labelledby="footer-col-3-toggle"> 3407 <button 3408 type="button" 3409 id="footer-col-3-toggle" 3410 class="block-title inline-flex w-full items-center justify-between gap-2" 3411 @click="open = !open" 3412 @keydown.enter.prevent="open = !open" 3413 @keydown.space.prevent="open = !open" 3414 :aria-expanded="open.toString()" 3415 aria-controls="footer-col-3-content" 3416 >
3417 <span>Ons Assortiment</span> 3418 <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"> 3419 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/> 3420</svg> 3421 </button> 3422 <div id="footer-col-3-content" 3423 class="block-content hidden" :class="{hidden: !open}"> 3424 <ul class="footer-links"> 3425 <li> 3426 <a href="/voetbaltenues/" 3427 aria-label="Go to Voetbaltenues"> 3428 Voetbaltenues </a> 3429 </li> 3430 <li> 3431 <a href="/voetbalshirts/" 3432 aria-label="Go to Voetbalshirts"> 3433 Voetbalshirts </a> 3434 </li> 3435 <li> 3436 <a href="/trainingspakken/" 3437 aria-label="Go to Trainingspakken"> 3438 Trainingspakken </a> 3439 </li> 3440 <li> 3441 <a href="/fanshop/" 3442 aria-label="Go to Fanshop"> 3443 Fanshop </a> 3444 </li> 3445 <li> 3446 <a href="/voetbalsokken/" 3447 aria-label="Go to Voetbalsokken"> 3448 Voetbalsokken </a> 3449 </li> 3450 <li> 3451 <a href="/keeperskleding/" 3452 aria-label="Go to Keepers"> 3453 Keepers </a> 3454 </li> 3455 </ul> 3456 </div> 3457 </div> 3458 </div></div><div class="footer-bottom-wrapper md:flex md:flex-col md:py-10 gap-6 items-center"><ul class="footer-icons py-4 border-b border-footer-columns-border-color flex flex-wrap gap-x-6 gap-y-4 3459 md:border-b-0 md:p-0 justify-center"> 3460 <li class="footer-icon"> 3461 <svg xmlns="http://www.w3.org/2000/svg" width="32" height="24" viewBox="0 0 33 24" fill="none" role="img"> 3462<g clip-path="url(#clip0_296_12967)"> 3463<path d="M28.4062 0H4.66419C2.38379 0 0.535156 1.86872 0.535156 4.17391V19.8261C0.535156 22.1313 2.38379 24 4.66419 24H28.4062C30.6866 24 32.5352 22.1313 32.5352 19.8261V4.17391C32.5352 1.86872 30.6866 0 28.4062 0V0Z" fill="#0095FF"/> 3464<path d="M16.5352 24C23.1626 24 28.5352 18.6274 28.5352 12C28.5352 5.37258 23.1626 0 16.5352 0C9.90774 0 4.53516 5.37258 4.53516 12C4.53516 18.6274 9.90774 24 16.5352 24Z" fill="#0095FF"/> 3465<path fill-rule="evenodd" clip-rule="evenodd" d="M0.535156 8.7966L1.73472 6H3.80922L4.48999 7.56654V6H7.06879L7.47405 7.13225L7.86694 6H19.4432V6.56923C19.4432 6.56923 20.0516 6 21.0518 6L24.8078 6.01313L25.4768 7.55917V6H27.635L28.2289 6.88807V6H30.4068V11.0239H28.2289L27.6597 10.133V11.0239H24.4889L24.1701 10.232H23.3177L23.004 11.0239H20.8537C19.9932 11.0239 19.4432 10.4664 19.4432 10.4664V11.0239H16.201L15.5575 10.232V11.0239H3.5019L3.18327 10.232H2.33358L2.0172 11.0239H0.535156V8.7966ZM2.15923 6.61934L0.541292 10.3811H1.59465L1.89318 9.62779H3.62868L3.92567 10.3811H5.00224L3.38583 6.61934H2.15923ZM2.75784 7.49482L3.28684 8.81114H2.22729L2.75784 7.49482ZM5.11371 6.6187V10.3805H6.05415V7.60863L7.05384 10.3805H7.8786L8.87547 7.60863V10.3805H9.81594V6.6187H8.33103
3465L7.48124 9.04961L6.6106 6.62426L5.11371 6.6187ZM10.4594 10.3805V6.6187H13.5282V7.46015H11.4098V8.10361H13.4788V8.89556H11.4098V9.56377H13.5282V10.3805H10.4594ZM14.0726 10.3811V6.61934H16.1654C16.8589 6.61934 17.4803 7.04814 17.4803 7.83976C17.4803 8.51648 16.9563 8.95234 16.4485 8.99521L17.686 10.3811H16.5368L15.4092 9.04469H15.0131V10.3811H14.0726ZM16.0882 7.46079H15.0131V8.25274H16.1021C16.2905 8.25274 16.5337 8.10669 16.5337 7.85677C16.5337 7.66252 16.346 7.46079 16.0882 7.46079ZM18.8243 10.3805H17.8642V6.6187H18.8243V10.3805ZM20.894 10.3805H21.1013L21.4972 9.55882H21.2498C20.6508 9.55882 20.235 9.25286 20.235 8.52434C20.235 7.91085 20.5986 7.50964 21.1128 7.50964H22.1901V6.6187H21.1507C19.8843 6.6187 19.2822 7.41316 19.2822 8.51506C19.2822 9.59037 19.8911 10.3805 20.894 10.3805ZM23.1477 6.61934L21.5297 10.3811H22.5831L22.8816 9.62779H24.6171L24.9141 10.3811H25.9906L24.3742 6.61934H23.1477ZM23.7463 7.49482L24.2753 8.81114H23.2157L23.7463 7.49482ZM26.1005 6.6187V10.3805H27.041V7.95512L28.6063 10.3805H29.7633V6.6187H28.8229V8.98219L27.2961 6.6187H26.1005Z" fill="white"/> 3466<path fill-rule="evenodd" clip-rule="evenodd" d="M6.74609 12.5831V17.607H12.0322L12.6109 16.847L13.1807 17.607H16.3733V16.4439H17.0911C17.7137 16.4439 18.0017 16.2552 18.0017 16.2552V17.607H20.1104V16.8151L20.7539 17.607H31.4452C32.0292 17.602 32.5342 17.2606 32.5342 17.2606V16.2434C32.3804 16.6662 32.0024 16.9636 31.3872 16.9636H29.3829V16.1469H31.2651C31.5435 16.
34661469 31.664 15.9964 31.664 15.8313C31.664 15.6732 31.5439 15.5133 31.2651 15.5133H30.4145C29.6752 15.5133 29.2634 15.0629 29.2634 14.3866C29.2634 13.7834 29.6405 13.2018 30.7391 13.2018H32.5342V12.5831H13.2259L12.6363 13.3271L12.0655 12.5831H6.74609ZM32.5342 13.2794L32.1745 14.0482H30.5906C30.2878 14.0482 30.1947 14.2071 30.1947 14.3588C30.1947 14.5147 30.3098 14.6867 30.5411 14.6867H31.432C32.0347 14.6867 32.3878 14.9367 32.5342 15.3104V13.2794ZM7.38948 13.2018V16.9636H10.4583V16.1469H8.33983V15.4787H10.4089V14.6867H8.33983V14.0433H10.4583V13.2018H7.38948ZM25.4957 16.9636H22.4268V13.2018H25.4957V14.0433H23.3772V14.6867H25.4363V15.4787H23.3772V16.1469H25.4957V16.9636ZM12.0717 15.1059L10.5774 16.9636H11.7453L12.6083 15.8051L13.4929 16.9636H14.6776L13.1807 15.0826L14.6903 13.2018H13.5519L12.6377 14.3789L11.7267 13.2018H10.5419L12.0717 15.1059ZM14.7893 13.2024V16.9642H15.7545V15.7762H16.7445C17.5821 15.7762 18.2171 15.3319 18.2171 14.4676C18.2171 13.7519 17.719 13.2024 16.8666 13.2024H14.7893ZM15.7545 14.0531H16.7971C17.0677 14.0531 17.2611 14.219 17.2611 14.4862C17.2611 14.7374 17.0686 14.9194 16.7941 14.9194H15.7545V14.0531ZM19.5659 16.9636H18.6254V13.2018H20.7182C21.4117 13.2018 22.0331 13.6306 22.0331 14.4222C22.0331 15.0989 21.5092 15.5348 21.0013 15.5777L22.2388 16.9636H21.0895L19.9619 15.6272H19.5659V16.9636ZM20.6409 14.0433H19.5659V14.8352H20.6548C20.8433 14.8352 21.0865 14.6891 21.0865 14.4392C21.0865 14.245 20.8988 14.0433 20.6409 14.0433ZM25.9311 16.9636V16.1469H27.8133C28.0918 16.1469 28.2124 15.9964 28.2124 15.8313C28.2124 15.6732 28.0922 15.5133 27.8133 15.5133H26.9628C26.2235 15.5133 25.8118 15.0629 25.8118 14.3866C25.8118 13.7834 26.1889 13.2018 27.2874 13.2018H29.1188L28.7229 14.0482H27.1389C26.8362 14.0482 26.7429 14.2071 26.7429 14.3588C26.7429 14.5147 26.8581 14.6867 27.0895 14.6867H27.9804C28.8046 14.6867 29.1621 15.1542 29.1621 15.7663C29.1621 16.4245 28.7636 16.9636 27.9355 16.9636H25.9311Z" fill="white"/> 3467</g> 3468<defs> 3469<clipPath id="clip0_296_12967"> 3470<rect width="32" height="24" fill="white" transform="translate(0.535156)"/> 3471</clipPath> 3472</defs> 3473<title>amex</title></svg> 3474 </li> 3475 <li class="footer-icon"> 3476 <svg xmlns="http://www.w3.org/2000/svg" width="32" height="24" viewBox="0 0 33 24" fill="none" role="img"> 3477<g clip-path="url(#clip0_296_12767)"> 3478<path d="M4.66419 0.5H28.4062C30.4053 0.5 32.0352 2.13976 32.0352 4.17391V19.8261C32.0352 21.8602 30.4053 23.5 28.4062 23.5H4.66419C2.66502 23.5 1.03516 21.8602 1.03516 19.8261V4.17391C1.03516 2.13976 2.66502 0.5 4.66419 0.5Z" fill="white" stroke="#E6E6E6"/> 3479<path fill-rule="evenodd" clip-rule="evenodd" d="M9.20488 8.97799C9.45988 8.66099 9.63188 8.23499 9.58588 7.79999C9.21488 7.81799 8.76188 8.04499 8.49988 8.36199C8.26388 8.63399 8.05588 9.07799 8.10988 9.49499C8.52688 9.53099 8.94288 9.28599 9.20588 8.97799H9.20488ZM9.58088 9.57699C8.97588 9.53999 8.46088 9.91999 8.17188 9.91999C7.88288 9.91999 7.44088 9.59499 6.96188 9.60399C6.33888 9.61299 5.76088 9.96399 5.44488 10.525C4.79488 11.645 5.27288 13.308 5.90488 14.221C6.21288 14.673 6.58288 15.17 7.06988 15.152C7.52988 15.134 7.71188 14.854 8.27188 14.854C8.83188 14.854 8.99388 15.152 9.48188 15.144C9.98688 15.134 10.3039 14.691 10.6109 14.239C10.9629 13.724 11.1069 13.227 11.1159 13.2C11.1069 13.19 10.1409 12.82 10.1319 11.709C10.1219 10.779 10.8909 10.336 10.9269 10.309C10.4929 9.66699 9.81588 9.59499 9.58088 9.57699ZM14.1249 11.897H15.3319C16.2479 11.897 16.7689 11.404 16.7689 10.549C16.7689 9.69399 16.2479 9.20499 15.3359 9.20499H14.1249V11.897ZM15.6129 8.31699C16.9289 8.31699 17.8449 9.22399 17.8449 10.544C17.8449 11.869 16.9099 12.78 15.5809 12.78H14.1239V15.096H13.0719V8.31699H15.6129ZM21.2999 13.254V12.874L20.1299 12.949C19.4719 12.991 19.1299 13.235 19.1299 13.663C19.1299 14.076 19.4859 14.344 20.0449 14.344C20.7589 14.344 21.2999 13.888 21.2999 13.254ZM18.1049 13.691C18.1049 12.822 18.7679 12.324 19.9889 12.249L21.2989 12.169V11.793C21.2989 11.243 20.9379 10.943 20.2939 10.943C19.7639 10.943 19.3779 11.215 19.2979 11.633H18.3489C18.3779 10.755 19.2039 10.116 20.3229 10.116C21.5249 10.116 22.3099 10.746 22.3099 11.723V15.096H21.3369V14.283H21.3139C21.0369 14.813 20.4259 15.147 19.7639 15.147C18.7869 15.147 18.1049 14.565 18.1049 13.691ZM23.2049 16.91V16.097C23.2709 16.106 23.4309 16.115 23.5149 16.115C23.9799 16.115 24.2429 15.918 24.4029 15.411L24.4969 15.111L22.7169 10.178H23.8159L25.0559 14.18H25.0799L26.3199 10.178H27.3899L25.5449 15.359C25.1219 16.548 24.6379 16.938 23.6139 16.938C23.5339 16.938 23.2759 16.928 23.2049 16.909V16.91Z" fill="#111111"/> 3480</g> 3481<defs> 3482<clipPath id="clip0_296_12767"> 3483<rect width="32" height="24" fill="white" transform="translate(0.535156)"/> 3484</clipPath> 3485</defs> 3486<title>apple-pay</title></svg> 3487 </li> 3488 <li class="footer-icon"> 3489 <svg xmlns="http://www.w3.org/2000/svg" width="32" height="24" viewBox="0 0 33 24" fill="none" role="img"> 3490<g clip-path="url(#clip0_296_12770)"> 3491<path d="M4.63116 0.5H28.4392C30.4214 0.5 32.0352 2.12098 32.0352 4.12903V19.871C32.0352 21.879 30.4214 23.5 28.4392 23.5H4.63116C2.64892 23.5 1.03516 21.879 1.03516 19.871V4.12903C1.03516 2.12098 2.64892 0.5 4.63116 0.5Z" fill="white" stroke="#E6E6E6"/> 3492<path fill-rule="evenodd" clip-rule="evenodd" d="M6.60938 13.3636C6.60938 12.8407 7.02845 12.4168 7.54399 12.4168H10.3903L8.97246 13.8461
3492H14.6438L17.4796 10.5111H23.6236L19.525 15.0559C19.1784 15.4402 18.4886 15.7518 17.9738 15.7518H7.53297C7.02288 15.7518 6.60938 15.3294 6.60938 14.805L6.60938 13.3636Z" fill="#00549D"/> 3493<path fill-rule="evenodd" clip-rule="evenodd" d="M26.4004 11.0577C26.4004 11.5781 25.977 11.9999 25.4774 11.9999H22.1469L23.5647 10.5706H17.4207L15.0576 13.9056H8.91359L13.0412 8.91255C13.3718 8.51265 14.0644 8.18847 14.5781 8.18847H25.4621C25.9803 8.18847 26.4004 8.61092 26.4004 9.13062V11.0577Z" fill="#FFD800"/> 3494</g> 3495<defs> 3496<clipPath id="clip0_296_12770"> 3497<rect width="32" height="24" fill="white" transform="translate(0.535156)"/> 3498</clipPath> 3499</defs> 3500<title>bancontact</title></svg> 3501 </li> 3502 <li class="footer-icon"> 3503 <svg xmlns="http://www.w3.org/2000/svg" width="32" height="24" viewBox="0 0 33 24" fill="none" role="img"> 3504<g clip-path="url(#clip0_296_12790)"> 3505<path d="M28.5352 0H4.53516C2.32602 0 0.535156 1.79086 0.535156 4V20C0.535156 22.2091 2.32602 24 4.53516 24H28.5352C30.7443 24 32.5352 22.2091 32.5352 20V4C32.5352 1.79086 30.7443 0 28.5352 0Z" fill="#D50043"/> 3506<path fill-rule="evenodd" clip-rule="evenodd" d="M11.2852 8.53118C11.2852 7.54746 12.0744 6.75 13.0663 6.75H20.004C20.9877 6.75 21.7852 7.53921 21.7852 8.53118V17.25H13.0663C12.0826 17.25 11.2852 16.4608 11.2852 15.4688V8.53118ZM13.5352 10.4123V10.5877C13.5352 10.9608 13.8329 11.25 14.2002 11.25H18.8701C19.2458 11.25 19.5352 10.9535 19.5352 10.5877V10.4123C19.5352 10.0392 19.2374 9.75 18.8701 9.75H14.2002C13.8245 9.75 13.5352 10.0465 13.5352 10.4123ZM13.5352 13.4123V13.5877C13.5352 13.9608 13.8329 14.25 14.2002 14.25H18.8701C19.2458 14.25 19.5352 13.9535 19.5352 13.5877V13.4123C19.5352 13.0392 19.2374 12.75 18.8701 12.75H14.2002C13.8245 12.75 13.5352 13.0465 13.5352 13.4123Z" fill="white"/> 3507</g> 3508<defs> 3509<clipPath id="clip0_296_12790"> 3510<rect width="32" height="24" fill="white" transform="translate(0.535156)"/> 3511</clipPath> 3512</defs> 3513<title>belfius</title></svg> 3514 </li> 3515 <li class="footer-icon"> 3516 <svg xmlns="http://www.w3.org/2000/svg" width="32" height="24" viewBox="0 0 33 24" fill="none" role="img"> 3517<mask id="mask0_296_12793" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="33" height="24"> 3518<path d="M28.5352 0H4.53516C2.32602 0 0.535156 1.79086 0.535156 4V20C0.535156 22.2091 2.32602 24 4.53516 24H28.5352C30.7443 24 32.5352 22.2091 32.5352 20V4C32.5352 1.79086 30.7443 0 28.5352 0Z" fill="white"/> 3519</mask> 3520<g mask="url(#mask0_296_12793)"> 3521<path d="M28.5352 0H4.53516C2.32602 0 0.535156 1.79086 0.535156 4V20C0.535156 22.2091 2.32602 24 4.53516 24H28.5352C30.7443 24 32.5352 22.2091 32.5352 20V4C32.5352 1.79086 30.7443 0 28.5352 0Z" fill="url(#paint0_linear_296_12793)"/> 3522<path opacity="0.1" d="M38.0352 69C55.4322 69 69.5352 54.897 69.5352 37.5C69.5352 20.103 55.4322 6 38.0352 6C20.6382 6 6.53516 20.103 6.53516 37.5C6.53516 54.897 20.6382 69 38.0352 69Z" fill="url(#paint1_linear_296_12793)"/> 3523<path opacity="0.1" d="M7.03516 45C16.1479 45 23.5352 37.6127 23.5352 28.5C23.5352 19.3873 16.1479 12 7.03516 12C-2.07754 12 -9.46484 19.3873 -9.46484 28.5C-9.46484 37.6127 -2.07754 45 7.03516 45Z" fill="url(#paint2_linear_296_12793)"/> 3524<path opacity="0.1" d="M43.0352 22C57.6707 22 69.5352 10.1355 69.5352 -4.5C69.5352 -19.1355 57.6707 -31 43.0352 -31C28.3997 -31 16.5352 -19.1355 16.5352 -4.5C16.5352 10.1355 28.3997 22 43.0352 22Z" fill="url(#paint3_linear_296_12793)"/> 3525<path d="M10.5352 7H5.53516C4.98287 7 4.53516 7.44771 4.53516 8V11C4.53516 11.5523 4.98287 12 5.53516 12H10.5352C11.0874 12 11.5352 11.5523 11.5352 11V8C11.5352 7.44771 11.0874 7 10.5352 7Z" fill="black"/> 3526<path d="M10.5352 7H5.53516C4.98287 7 4.53516 7.44771 4.53516 8V11C4.53516 11.5523 4.98287 12 5.53516 12H10.5352C11.0874 12 11.5352 11.5523 11.5352 11V8C11.5352 7.44771 11.0874 7 10.5352 7Z" fill="url(#paint4_linear_296_12793)"/> 3527<path opacity="0.3" d="M6.53516 8H5.53516V11H6.53516V8Z" fill="#7A3802"/> 3528<path opacity="0.3" d="M8.53516 8H7.53516V11H8.53516V8Z" fill="#7A3802"/> 3529<path opacity="0.3" d="M10.5352 8H9.53516V11H10.5352V8Z" fill="#7A3802"/> 3530<path d="M9.53516 15H4.53516V16H9.53516V15Z" fill="white" fill-opacity="0.8"/> 3531<path d="M7.53516 17H4.53516V18H7.53516V17Z" fill="white" fill-opacity="0.8"/> 3532<path d="M11.5352 17H8.53516V18H11.5352V17Z" fill="white" fill-opacity="0.8"/> 3533<path d="M15.5352 17H12.5352V18H15.5352V17Z" fill="white" fill-opacity="0.8"/> 3534<path d="M15.5352 15H10.5352V16H15.5352V15Z" fill="white" fill-opacity="0.8"/> 3535<path d="M21.5352 15H16.5352V16H21.5352V15Z" fill="white" fill-opacity="0.8"/> 3536<path d="M27.5352 15H22.5352V16H27.5352V15Z" fill="white" fill-opacity="0.8"/> 3537</g> 3538<defs> 3539<linearGradient id="paint0_linear_296_12793" x1="-15.4648" y1="12" x2="7.57514" y2="-18.72" gradientUnits="userSpaceOnUse"> 3540<stop stop-color="#060B0E"/> 3541<stop offset="1" stop-color="#254764"/> 3542</linearGradient> 3543<linearGradient id="paint1_linear_296_12793" x1="19.5909" y1="23.6392" x2="16.4121" y2="14.9302" gradientUnits="userSpaceOnUse"> 3544<stop stop-color="white" stop-opacity="0"/> 3545<stop offset="1" stop-color="white"/> 3546</linearGradient> 3547<linearGradient id="paint2_linear_296_12793" x1="-0.302775" y1="46.8244" x2="-3.95155" y2="32.1485" gradientUnits="userSpaceOnUse"> 3548<stop stop-color="white" stop-opacity="0"/> 3549<stop offset="1" stop-color="white"/> 3550</linearGradient> 3551<linearGradient id="paint3_linear_296_12793" x1="48.96" y1="-4.5005" x2="54.8203" y2="19.0698" gradientUnits="userSpaceOnUse"> 3552<stop stop-color="white" stop-opacity="0"/> 3553<stop offset="1" stop-color="white"/> 3554</linearGradient> 3555<linearGradient id="paint4_linear_296_12793" x1="11.5352" y1="7" x2="11.5352" y2="12" gradientUnits="userSpaceOnUse"> 3556<stop stop-color="#FAD961"/> 3557<stop offset="1" stop-color="#F7955D"/> 3558</linearGradient> 3559</defs> 3560<title>credit_card</title></svg> 3561 </li> 3562 <li class="footer-icon"> 3563 <svg xmlns="http://www.w3.org/2000/svg" width="32" height="24" viewBox="0 0 33 24" fill="none" role="img"> 3564<g clip-path="url(#clip0_296_12997)"> 3565<path d="M28.5352 0H4.53516C2.32602 0 0.535156 1.79086 0.535156 4V20C0.535156 22.2091 2.32602 24 4.53516 24H28.5352C30.7443 24 32.5352 22.2091 32.5352 20V4C32.5352 1.79086 30.7443 0 28.5352 0Z" fill="#FECC00"/> 3566<g clip-path="url(#clip1_296_12997)"> 3567<path d="M32.5352 8V15.0621H0.535156V8H32.5352Z" fill="#FECC00"/> 3568<path d="M10.8527 10.9508C10.7128 11.1401 10.4788 11.4693 10.3365 11.6616C10.2642 11.7594 10.1336 11.9369 10.5664 11.9369C11.0244 11.9369 12.8451 11.9369 12.8451 11.9369C12.8451 11.9369 13.2124 11.4373 13.5203 11.0194C13.9391 10.451 13.5565 9.26819 12.0593 9.26819C10.7192 9.26819 6.16285 9.26819 6.16285 9.26819L5.14048 10.6573C5.14048 10.6573 10.4406 10.6573 10.7126 10.6573C10.9939 10.6573 10.9901 10.7643 10.8527 10.9508ZM9.17862 12.2796C8.74582 12.2796 8.87637 12.1017 8.94866 12.0039C9.09104 11.8116 9.32884 11.4859 9.46867 11.2965C9.60633 11.1101 9.60997 11.003 9.32829 11.003C9.05645 11.003 6.77992 11.003 6.77992 11.003L4.72661 13.7936C4.72661 13.7936 8.39386 13.7936 9.73396 13.7936C11.3878 13.7936 12.3086 12.6687 12.5924 12.2798C12.5924 12.2796 9.63637 12.2796 9.17862 12.2796ZM12.436 13.7936H15.3735L16.4871 12.2794L13.55 12.2798C13.5491 12.2796 12.436 13.7936 12.436 13.7936ZM20.015 9.26819L18.8883 10.7986H17.5774L18.7035 9.26819H15.767L13.8023 11.9369H20.9872L22.9513 9.26819H20.015ZM16.6845 13.7936H19.6208L20.735 12.2798H17.7986C17.7975 12.2796 16.6845 13.7936 16.6845 13.7936ZM0.535156 12.8768V13.1984H4.6261L4.86244 12.8768H0.535156ZM5.30216 12.2796H0.535156V12.6008H5.06528L5.30216 12.2796ZM0.535156 13.7936H4.18784L4.42309 13.4738H0.535156V13.7936ZM28.2243 13.1982H32.5352V12.8766H28.461L28.2243 13.1982ZM27.7864 13.7936H32.5352V13.4738H28.0214L27.7864 13.7936ZM28.9 12.2796L28.6638 12.6011H32.5352V12.2796H28.9ZM25.0537 11.9369L27.0182 9.26819H23.9081C23.907 9.26819 21.9422 11.9369 21.9422 11.9369H25.0537ZM21.6904 12.2796C21.6904 12.2796 21.4757 12.5729 21.3714 12.7142C21.0026 13.2124 21.3287 13.7936 22.5323 13.7936C23.9226 13.7936 27.2483 13.7936 27.2483 13.7936L28.3625 12.2798H21.6904V12.2796Z" fill="#D50029"/> 3569</g> 3570</g> 3571<defs> 3572<clipPath id="clip0_296_12997"> 3573<rect width="32" height="24" fill="white" transform="translate(0.535156)"/> 3574</clipPath> 3575<clipPath id="clip1_296_12997"> 3576<rect width="32" height="7.06211" fill="white" transform="translate(0.535156 8)"/> 3577</clipPath> 3578</defs> 3579<title>dhl</title></svg> 3580 </li> 3581 <li class="footer-icon"> 3582 <?xml version="1.0" encoding="UTF-8"?> 3583<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 320" width="32" height="24" role="img"> 3584 <defs> 3585 <linearGradient id="linear-gradient" x1="352.72" y1="95.3" x2="330.2" y2="67.73" gradientTransform="translate(0 184) scale(1 -1)" gradientUnits="userSpaceOnUse"> 3586 <stop offset=".02" stop-color="#1d1c1c" stop-opacity="0"/> 3587 <stop offset=".68" stop-color="#1d1c1c"/> 3588 </linearGradient> 3589 <linearGradient id="linear-gradient-2" x1="313.44" y1="89.45" x2="336.52" y2="112.26" gradientTransform="translate(0 184) scale(1 -1)" gradientUnits="userSpaceOnUse"> 3590 <stop offset=".02" stop-color="#1d1c1c" stop-opacity="0"/> 3591 <stop offset=".68" stop-color="#1d1c1c"/> 3592 </linearGradient> 3593 </defs> 3594 3595 <rect fill="#fff48d" stroke-width="0" x="0" width="480" height="320" rx="60" ry="60"/> 3596 3597 <g transform="translate(0 69)"> 3598 <path fill="#fff" stroke-width="0" d="M11.02,22.87v136.4c0,6.53,5.37,11.87,11.93,11.87h81.89c61.91,0,88.74-34.49,88.74-80.25S166.74,11,104.83,11H22.94c-6.56,0-11.93,5.34-11.93,11.87Z"/> 3599 <path fill="#c06" stroke-width="0" d="M65.83,44.48v100.79h44.07c40.02,0,57.37-22.5,57.37-54.31s-17.36-54.07-57.37-54.07h-36.44c-4.23,0-7.63,3.44-7.63,7.6Z"/> 3600 <path fill="#232323" fill-rule="evenodd" stroke-width="0" d="M33.62,160.28h71.21c50.04,0,77.65-24.63,77.65-69.33,0-25.76-10.08-69.03-77.65-69.03H33.62c-6.32,0-11.45,5.1-11.45,11.4v115.57c0,6.29,5.13,11.4,11.45,11.4ZM25.98,33.32c0-4.21,3.4-7.6,7.63-7.6h71.21c27.55,0,73.83,8.49,73.83,65.23,0,42.26-26.24,65.53-73.83,65.53H33.62c-4.23,0-7.63-3.38-7.63
3600-7.6V33.32Z"/> 3601 <path fill="#fff" fill-rule="evenodd" stroke-width="0" d="M87.51,76.3c-1.34-.48-2.74-.72-4.26-.72v-.06h-10.09v24.34h10.21c1.81,0,3.38-.36,4.73-.96,1.34-.66,2.45-1.5,3.33-2.58.88-1.08,1.52-2.4,1.98-3.9.41-1.5.64-3.12.64-4.92,0-2.04-.29-3.78-.82-5.28-.58-1.44-1.34-2.7-2.27-3.72-.99-.96-2.1-1.74-3.44-2.22ZM85.12,95.07c-.76.24-1.46.36-2.22.36v.06h-4.61v-15.35h3.73c1.28,0,2.33.18,3.21.54.88.36,1.58.96,2.1,1.62.52.66.93,1.56,1.17,2.52.23.96.35,2.1.35,3.3,0,1.38-.18,2.46-.52,3.42-.35.96-.82,1.68-1.34,2.28-.52.6-1.17,1.02-1.87,1.26Z"/> 3602 <path fill="#fff" stroke-width="0" d="M115.11,75.59v4.5h-12.49v5.22h11.49v4.14h-11.49v5.94h12.78v4.5h-17.97v-24.34h17.68v.06Z"/> 3603 <path fill="#fff" fill-rule="evenodd" stroke-width="0" d="M141.83,99.93l-8.87-24.34h-5.42l-8.93,24.34h5.25l1.87-5.4h8.87l1.81,5.4h5.43ZM130.27,81.58l2.98,8.93h-6.12l3.09-8.93h.06Z"/> 3604 <path fill="#fff" stroke-width="0" d="M150.29,75.58v19.85h11.55v4.5h-16.74v-24.34h5.19Z"/> 3605 <path fill="#232323" stroke-width="0" d="M45.35,100.29c6.32,0,11.44-5.12,11.44-11.45s-5.12-11.45-11.44-11.45-11.44,5.12-11.44,11.45,5.12,11.45,11.44,11.45Z"/> 3606 <path fill="#232323" stroke-width="0" d="M52.16,146.08c-8.86,0-15.96-7.65-15.96-17.05v-13.31c0-4.7,3.55-8.56,8.01-8.56s8.01,3.8,8.01,8.56v30.36h-.06Z"/> 3607 </g> 3608 3609 <g transform="translate(0 69)"> 3610 <path fill="#1d1c1c" stroke-width="0" d="M405.6,91.62c0-13.38,9.52-25.57,25.96-25.57s26.03,12.2,26.03,25.57-9.52,25.57-26.03,25.57c-16.44,0-25.96-12.2-25.96-25.57ZM443.14,91.62c0-6.45-4.25-12.4-11.58-12.4s-11.58,5.96-11.58,12.4,4.32,12.41,11.58,12.41,11.58-5.96,11.58-12.41Z"/> 3611 <path fill="#1d1c1c" stroke-width="0" d="M395.49,101.12c5.48-3.12,8.77-9.08,8.77-15.66,0-9.77-7.06-18.09-18.02-18.09h-23.01v48.51h14.25v-12.4h2.67l8.15,12.4h16.78l-9.59-14.76ZM383.37,92.31h-5.89v-13.72h5.96c3.84,0,6.3,3.12,6.3,6.86s-2.54,6.86-6.37,6.86Z"/> 3612 <path fill="#1d1c1c" stroke-width="0" d="M298.18,67.31l-8.55,28.91-8.34-28.91h-11.35l-8.41,28.91-8.48-28.91h-15.04l17.23,48.42h12.37l8-26.36,7.93,26.36h12.44l17.23-48.42h-15.04Z"/> 3613 <path fill="#1d1c1c" stroke-width="0" d="M334.78,103.91h-.03c-5.33,0-9.07-3.22-10.67-7.48h36.21c.29-1.6.44-3.24.44-4.9,0-13.34-9.49-25.51-25.95-25.52v13.14c5.36.01,9.06,3.23,10.65,7.48h-36.16c-.29,1.6-.44,3.24-.44,4.9,0,13.35,9.5,25.53,25.91,25.53h.03v-13.15Z"/> 3614 <path fill="url(#linear-gradient)" stroke-width="0" d="M334.75,117.05c.56,0,1.11-.02,1.65-.04,3.33-.17,6.36-.85,9.06-1.94,2.7-1.09,5.07-2.6,7.08-4.42,2.02-1.82,3.68-3.95,4.97-6.3,1.17-2.14,2.03-4.45,2.57-6.86h-15.09c-.31.64-.67,1.26-1.08,1.83-.56.79-1.22,1.5-1.97,2.11-.75.62-1.59,1.14-2.51,1.54-.92.4-1.93.68-3.02.83-.53.07-1.08.11-1.65.11-3.39,0-6.14-1.31-8.11-3.36l-9.81,9.92c4.36,4.03,10.41,6.57,17.91,6.57Z"/> 3615 <path fill="url(#linear-gradient-2)" stroke-width="0" d="M334.75,66c-13.92,0-22.87,8.76-25.26,19.56h15.04c1.8-3.72,5.34-6.42,10.22-6.42,3.89,0,6.91,1.68,8.88,4.22l9.9-10.01c-4.42-4.48-10.78-7.35-18.77-7.35Z"/> 3616 </g> 3617 3618 <path transform="translate(0 69)" fill="#1d1c1c" stroke-width="0" d="M215.61,145c-1.1,0-2-.9-2-2V39c0-1.1.9-2,2-2s2,.9,2,2v104c0,1.1-.9,2-2,2Z"/> 3619<title>ideal</title></svg> 3620 </li> 3621 <li class="footer-icon"> 3622 <svg xmlns="http://www.w3.org/2000/svg" width="32" height="24" viewBox="0 0 33 24" fill="none" role="img"> 3623<g clip-path="url(#clip0_296_12858)"> 3624<path d="M4.66419 0.499878H28.4062C30.4053 0.499878 32.0352 2.13964 32.0352 4.17379V19.826C32.0352 21.8601 30.4053 23.4999 28.4062 23.4999H4.66419C2.66502 23.4999 1.03516 21.8601 1.03516 19.826V4.17379C1.03516 2.13964 2.66502 0.499878 4.66419 0.499878Z" fill="white" stroke="#E6E6E6"/> 3625<path fill-rule="evenodd" clip-rule="evenodd" d="M16.6187 10.8766C18.2398 10.8766 19.5539 9.56346 19.5539 7.94369C19.5539 6.32404 18.2398 5.01086 16.6187 5.01086C14.9977 5.01086 13.6836 6.32404 13.6836 7.94369C13.6836 9.56346 14.9977 10.8766 16.6187 10.8766Z" fill="#019ACC"/> 3626<path fill-rule="evenodd" clip-rule="evenodd" d="M15.9719 11.5282C14.9902 11.5282 14.1449 11.147 13.6073 10.7233C10.4027 11.0593 8.01953 11.5356 8.01953 11.5356V12.7826H25.0518C25.0518 11.0322 25.0518 10.157 25.0518 10.157C25.0518 10.157 22.1068 10.139 18.7824 10.3167C18.2233 10.9224 17.2371 11.5282 15.9719 11.5282Z" fill="#019ACC"/> 3627<path fill-rule="evenodd" clip-rule="evenodd" d="M10.0391 18.2608H8.01953V13.5652H10.0391V15.6783L11.2393 13.5652H13.6607L11.8876 15.9918L13.5606 18.2608H11.2498L10.053 16.496L10.0391 18.2608Z" fill="#003466"/> 3628<path fill-rule="evenodd" clip-rule="evenodd" d="M25.0187 18.0115C24.5421 18.1682 23.9158 18.2608 23.3553 18.2608C21.3574 18.2608 19.8906 17.6493 19.8906 15.8708C19.8906 14.2635 21.3123 13.5652 23.2558 13.5652C23.796 13.5652 24.482 13.6294 25.0187 13.8139L25.018 15.3707C24.6203 15.1113 24.2225 14.9496 23.6529 14.9496C22.9117 14.9496 22.1708 15.3427 22.1708 15.9133C22.1708 16.4853 22.9084 16.8771 23.6529 16.8771C24.2134 16.8771 24.6203 16.71 25.018 16.4625L25.0187 18.0115Z" fill="#003466"/> 3629<path fill-rule="evenodd" clip-rule="evenodd" d="M16.0097 15.5552H17.0155C17.4042 15.5552 17.5565 15.3794 17.5565 15.1098C17.5565 14.8008 17.4029 14.6465 17.0436 14.6465H16.0096L16.0097 15.5552ZM16.0097 17.3062H17.0626C17.4573 17.3062 17.5917 17.1237 17.5917 16.8543C17.5917 16.5846 17.4559 16.3909 17.0671 16.3909H16.0096L16.0097 17.3062ZM13.9902 13.5652H18.0725C19.133 13.5652 19.4805 14.0256 19.4805 14.7423C19.4805 15.5446 18.8383 15.8933 18.1786 15.9326V15.9458C18.8559 16.0051 19.5158 16.0904 19.5158 17.0374C19.5158 17.6558 19.1682 18.2608 18.0018 18.2608H13.9902V13.5652Z" fill="#003466"/> 3630</g> 3631<defs> 3632<clipPath id="clip0_296_12858"> 3633<rect width="32" height="24" fill="white" transform="translate(0.535156)"/> 3634</clipPath> 3635</defs> 3636<title>kbc</title></svg> 3637 </li> 3638 <li class="footer-icon"> 3639 <svg xmlns="http://www.w3.org/2000/svg" width="32" height="24" viewBox="0 0 33 24" fill="none" role="img"> 3640<g clip-path="url(#clip0_296_12866)"> 3641<path d="M28.5352 0H4.53516C2.32602 0 0.535156 1.79086 0.535156 4V20C0.535156 22.2091 2.32602 24 4.53516 24H28.5352C30.7443 24 32.5352 22.2091 32.5352 20V4C32.5352 1.79086 30.7443 0 28.5352 0Z" fill="#F4B6C7"/> 3642<path fill-rule="evenodd" clip-rule="evenodd" d="M12.7852 17.25H10.5352V6.75H12.7852V17.25ZM13.2019 12.0222C15.1983 11.039 16.4886 9.05237 16.5351 6.75088H18.8984C18.8663 8.93615 17.9644 10.9634 16.3767 12.4672L19.5351 17.25H16.5351L13.2019 12.0222Z" fill="black"/> 3643<path fill-rule="evenodd" clip-rule="evenodd" d="M19.5352 15.7501C19.5352 16.5784 20.2068 17.25 21.0353 17.25C21.8636 17.25 22.5352 16.5784 22.5352 15.7501C22.5352 14.9216 21.8636 14.25 21.0353 14.25C20.2068 14.25 19.5352 14.9216 19.5352 15.7501Z" fill="black"/> 3644</g> 3645<defs> 3646<clipPath id="clip0_296_12866"> 3647<rect width="32" height="24" fill="white" transform="translate(0.535156)"/> 3648</clipPath> 3649</defs> 3650<title>klarna</title></svg> 3651 </li> 3652 <li class="footer-icon"> 3653 <svg xmlns="http://www.w3.org/2000/svg" width="32" height="24" viewBox="0 0 33 24" fill="none" role="img"> 3654<g clip-path="url(#clip0_296_12880)"> 3655<path d="M28.4392 0H4.63116C2.369 0 0.535156 1.84863 0.535156 4.12903V19.871C0.535156 22.1514 2.369 24 4.63116 24H28.4392C30.7014 24 32.5352 22.1514 32.5352 19.871V4.12903C32.5352 1.84863 30.7014 0 28.4392 0V0Z" fill="#0071C0"/> 3656<path d="M20.7768 8.87006C20.7661 8.94158 20.7538 9.01471 20.74 9.08983C20.265 11.6276 18.6399 12.5043 16.5644 12.5043H15.5076C15.2538 12.5043 15.0399 12.6961 15.0003 12.9566L14.4593 16.5273L14.3061 17.5394C14.2803 17.7104 14.4071 17.8647 14.5729 17.8647H16.4472C16.6692 17.8647 16.8577 17.6969 16.8927 17.4691L16.9111 17.37L17.264 15.0396L17.2867 14.9118C17.3212 14.6832 17.5102 14.5154 17.7321 14.5154H18.0124C19.8284 14.5154 21.2499 13.7482 21.6654 11.5281C21.839 10.6007 21.7491 9.82626 21.2899 9.28163C21.1509 9.1174 20.9784 8.98114 20.7768 8.87006V8.87006Z" fill="#99C6E5"/> 3657<path d="M20.2816 8.66387C20.209 8.64189 20.1341 8.62191 20.0573 8.60393C19.9801 8.58635 19.901 8.57076 19.8196 8.55718C19.5347 8.50923 19.2225 8.48645 18.888 8.48645H16.0649C15.9954 8.48645 15.9293 8.50283 15.8702 8.5324C15.74 8.59753 15.6432 8.7258 15.6198 8.88284L15.0192 12.8411L15.002 12.9566C15.0415 12.6961 15.2554 12.5043 15.5092 12.5043H16.566C18.6415 12.5043 20.2666 11.6272 20.7416 9.08982C20.7558 9.0147 20.7677 8.94158 20.7785 8.87005C20.6583 8.80372 20.5281 8.74698 20.3879 8.69863C20.3534 8.68664 20.3177 8.67505 20.2816 8.66387Z" fill="#CCE2F2"/> 3658<path d="M15.6195 8.88286C15.6429 8.72582 15.7397 8.59755 15.8699 8.53282C15.9294 8.50325 15.9951 8.48687 16.0646 8.48
3658687H18.8877C19.2222 8.48687 19.5344 8.50964 19.8193 8.55759C19.9007 8.57118 19.9798 8.58676 20.057 8.60435C20.1338 8.62233 20.2087 8.64231 20.2813 8.66428C20.3174 8.67547 20.3531 8.68706 20.388 8.69865C20.5282 8.747 20.6584 8.80414 20.7785 8.87007C20.9199 7.93225 20.7774 7.29371 20.2901 6.71551C19.7529 6.07897 18.7833 5.80646 17.5426 5.80646H13.9407C13.6872 5.80646 13.471 5.99826 13.4319 6.25919L11.9316 16.1549C11.902 16.3507 12.0472 16.5273 12.2369 16.5273H14.4606L15.0189 12.8411L15.6195 8.88286Z" fill="white"/> 3659</g> 3660<defs> 3661<clipPath id="clip0_296_12880"> 3662<rect width="32" height="24" fill="white" transform="translate(0.535156)"/> 3663</clipPath> 3664</defs> 3665<title>paypal</title></svg> 3666 </li> 3667 </ul><div class="footer-bottom pt-4 pb-6 text-xs md:p-0"> 3668 <ul class="footer-bottom-links flex flex-wrap gap-x-2 gap-y-6 md:gap-x-8 justify-center"> 3669 <li> 3670 <a href="/algemene-voorwaarden"> 3671 Algemene voorwaarden </a> 3672 </li> 3673 <li> 3674 <a href="/klantenservice/veilig-winkelen/cookies/"> 3675 Privacy policy </a> 3676 </li> 3677 <li class="copyright w-full md:w-auto text-center md:order-first"> 3678 © 2012-2026 Kingdo B.V. Alle prijzen zijn inclusief 21% btw </li> 3679 </ul> 3680</div></div></div></footer>
3680<script data-ommit="true" nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M="> 3681 3682 document.addEventListener("DOMContentLoaded", () => 3683 { 3684 let bind = () => 3685 { 3686 Object.entries( 3687 { 3688 add_to_cart: event => 3689 { 3690 AEC.add(event.currentTarget, dataLayer, event); 3691 }, 3692 remove_from_cart:event => 3693 { 3694 AEC.remove(event.currentTarget, dataLayer, event); 3695 }, 3696 select_item:event => 3697 { 3698 AEC.click(event.currentTarget, dataLayer, event); 3699 }, 3700 add_to_wishlist:event => 3701 { 3702 AEC.wishlist(event.currentTarget, dataLayer, event); 3703 }, 3704 remove_from_wishlist:event => 3705 { 3706 AEC.wishlistRemove(event.currentTarget, dataLayer, event); 3707 }, 3708 add_to_compare:event => 3709 { 3710 AEC.compare(event.currentTarget, dataLayer, event); 3711 }, 3712 add_to_cart_swatch:event => 3713 { 3714 AEC.addSwatch(event.currentTarget, dataLayer, event); 3715 } 3716 }).forEach(([event, callback]) => 3717 { 3718 [...document.querySelectorAll('[data-event]:not([data-bound])')].filter(element => { return element.dataset.event === event; }
3718).forEach(element => 3719 { 3720 element.addEventListener('click', callback); 3721 3722 element.dataset.bound = true; 3723 }); 3724 }); 3725 }; 3726 3727 bind(); 3728 3729 if("PerformanceObserver" in window) 3730 { 3731 const observer = new PerformanceObserver((items) => 3732 { 3733 items.getEntries().filter(({ initiatorType }) => initiatorType === "xmlhttprequest").forEach((entry) => 3734 { 3735 bind(); 3736 }); 3737 }); 3738 3739 observer.observe( 3740 { 3741 entryTypes: ["resource"] 3742 }); 3743 } 3744 });</script>
3744<script data-ommit="true" nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M="> 3745 3746 document.addEventListener("DOMContentLoaded", () => 3747 { 3748 var PromotionTrack = ((dataLayer) => 3749 { 3750 return { 3751 apply: () => 3752 { 3753 var promotions = [], position = 0; 3754 3755 document.querySelectorAll('[data-promotion]').forEach(promotion => 3756 { 3757 let entity = 3758 { 3759 promotion_id: promotion.dataset.promotionId, 3760 promotion_name: promotion.dataset.promotionName, 3761 creative_name: promotion.dataset.promotionCreative, 3762 creative_slot: promotion.dataset.promotionPosition 3763 }; 3764 3765 AEC.EventDispatcher.trigger('ec.cookie.promotion.entity', entity, 3766 { 3767 element: promotion 3768 }); 3769 3770 promotions.push(entity); 3771 3772 promotion.addEventListener('click', (event) => 3773 { 3774 var data = 3775 { 3776 'event': 'select_promotion', 3777 'ecommerce': 3778 { 3779 'items': 3780 [ 3781 { 3782 promotion_id: event.target.dataset.promotionId, 3783 promotion_name: event.target.dataset.promotionName, 3784 creative_name: event.target.dataset.promotionCreative, 3785 creative_slot: event.target.dataset.promotionPosition 3786 } 3787 ] 3788 } 3789 }; 3790 3791 AEC.Cookie.promotionClick(data, promotion).push(dataLayer); 3792 3793 /** 3794 * Save persistent data 3795 */ 3796 AEC.Persist.push(AEC.Persist.CONST_KEY_PROMOTION, 3797 { 3798 'promotion': data.ecommerce.items[0] 3799 }); 3800 }); 3801 }); 3802 3803 if (promotions.length) 3804 { 3805 AEC.Cookie.promotion( 3806 { 3807 'event':'view_promotion', 3808 'ecommerce': 3809 { 3810 'items': promotions 3811 } 3812 }).push(dataLayer); 3813 } 3814 3815 return this; 3816 } 3817 } 3818 })(dataLayer).apply(); 3819 });</script>
3819<script data-ommit="true" nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M="> 3820 3821 document.addEventListener("DOMContentLoaded", () => 3822 { 3823 (() => 3824 { 3825 let map = {}, trace = {}; 3826 3827 document.querySelectorAll('[data-widget]').forEach((element) => 3828 { 3829 let widget = element.dataset.widget; 3830 3831 let entity = 3832 { 3833 3834 item_id: element.dataset.id, 3835 item_name: element.dataset.name, 3836 item_list_name: element.dataset.list, 3837 item_list_id: element.dataset.list, 3838 item_brand: element.dataset.brand, 3839 category: element.dataset.category, 3840 price: parseFloat(element.dataset.price), 3841 index: parseFloat(element.dataset.position), 3842 currency: AEC.GA4.currency, 3843 quantity: 1, 3844 google_business_vertical: 'retail' 3845 }; 3846 3847 Object.assign(entity, entity, AEC.GA4.augmentCategories(entity)); 3848 3849 let attributes = element.dataset.attributes; 3850 3851 if (attributes) 3852 { 3853 Object.entries(JSON.parse(attributes)).forEach(([key, value]) => 3854 { 3855 entity[key] = value; 3856 }); 3857 } 3858 3859 if (!map.hasOwnProperty(widget)) 3860 { 3861 map[widget] = []; 3862 3863 map[widget].trace = {}; 3864 map[widget].entry = []; 3865 map[widget].item_list_id = ''; 3866 map[widget].item_list_name = ''; 3867 } 3868 3869 if (!map[widget].trace.hasOwnProperty(element.dataset.id)) 3870 { 3871 map[widget].trace[element.dataset.id] = true; 3872 3873 map[widget].entry.push(entity); 3874 3875 map[widget].item_list_id = entity.item_list_id; 3876 map[widget].item_list_name = entity.item_list_name; 3877 } 3878 }); 3879 3880 Object.entries(map).forEach(([key, value]) => 3881 { 3882 if (value.entry.length) 3883 { 3884 let data = 3885 { 3886 event: 'view_item_list', 3887 ecommerce: 3888 { 3889 item_list_id: value.item_list_id, 3890 item_list_name: value.item_list_name, 3891 items: value.entry 3892 } 3893 }; 3894 3895 if ('undefined' !== typeof dataLayer) 3896 { 3897 (function(callback) 3898 { 3899 if (AEC.Const.COOKIE_DIRECTIVE) 3900 { 3901 AEC.CookieConsent.queue(callback).process(); 3902 } 3903 else 3904 { 3905 callback.apply(window,[]); 3906 } 3907 }) 3908 ( 3909 (function(dataLayer, data) 3910 { 3911 return function() 3912 { 3913 AEC.EventDispatcher.trigger('ec.widget.view.data', data); 3914 3915 if (AEC.reset) 3916 { 3917 dataLayer.push({ ecommerce: null }); 3918 } 3919 3920 dataLayer.push(data); 3921 } 3922 })(dataLayer, data) 3923 ); 3924 } 3925 } 3926 }); 3927 })(); 3928 });</script>
3928<script data-ommit="true" nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M="> 3929 3930 if (typeof dataLayer !== "undefined") 3931 { 3932 3933 AEC.Request.get(AEC.url('datalayer/index/events'), {}, response => 3934 { 3935 Object.entries(response.events).forEach(([key, event]) => 3936 { 3937 dataLayer.push(event); 3938 }); 3939 }); 3940 3941 AEC.EventDispatcher.on('ec.facebook.loaded', () => 3942 { 3943 }); 3944 3945 if (window.google_tag_params) 3946 { 3947 (function(callback) 3948 { 3949 if (AEC.Const.COOKIE_DIRECTIVE) 3950 { 3951 AEC.CookieConsent.queue(callback, "cookieConsentGranted").process(); 3952 } 3953 else 3954 { 3955 callback.apply(window,[]); 3956 } 3957 }) 3958 ( 3959 (function(dataLayer) 3960 { 3961 return () => 3962 { 3963 AEC.Cookie.remarketing({ event:'fireRemarketingTag', google_tag_params: window.google_tag_params }).push(dataLayer); 3964 } 3965 })(dataLayer) 3966 ); 3967 } 3968 3969 } 3970 else 3971 { 3972 console.log('dataLayer[] is not intialized. Check if GTM is installed properly'); 3973 }</script>
3973<!-- Start of Clerk.io E-commerce Personalisation tool - www.clerk.io -->
3973<script> 3974 (function (w, d) { 3975 var e = d.createElement('script'); 3976 e.type = 'text/javascript'; 3977 e.async = true; 3978 e.src = (d.location.protocol == 'https:' ? 'https' : 'http') + '://custom.clerk.io/nl.js'; 3979 var s = d.getElementsByTagName('script')[0]; 3980 s.parentNode.insertBefore(e, s); 3981 w.__clerk_q = w.__clerk_q || []; 3982 w.Clerk = w.Clerk || function () { 3983 w.__clerk_q.push(arguments) 3984 }; 3985 })(window, document); 3986 3987 Clerk('config', { 3988 key: 'vObVwfC8kragEI44c0JSsnFDfjdRWpZi', 3989 collect_email: true, 3990 globals: { 3991 uenc: 'aHR0cHM6Ly93d3cudm9ldGJhbHNoaXJ0c2tvbmluZy5ubC8~', 3992 formkey: 'kg814vNZzfNGE6fR', 3993 currency_symbol: 'â¬', 3994 currency_iso: 'EUR' 3995 }, 3996 formatters: { 3997 convert_currency: function (price) { 3998 const ex_rate = parseFloat('1') ?? null; 3999 if (ex_rate) { 4000 return price * ex_rate; 4001 } 4002 return price; 4003 }, 4004 convert_currency_from_iso: function (price, currency_iso) { 4005 const ex_rates = JSON.parse('{"AFN":false,"ALL":false,"DZD":false,"AOA":false,"ARS":false,"AMD":false,"AWG":false,"AUD":false,"AZN":false,"AZM":false,"BSD":false,"BHD":false,"BDT":false,"BBD":false,"BYR":false,"BZD":false,"BMD":false,"BTN":false,"BOB":false,"BAM":false,"BWP":false,"BRL":false,"GBP":false,"BND":false,"BGN":false,"BUK":false,"BIF":false,"XPF":false,"KHR":false,"CAD":false,"CVE":false,"KYD":false,"CLP":false,"CNY":false,"COP":false,"KMF":false,"CDF":false,"CRC":false,"HRK":false,"CUP":false,"CZK":false,"DKK":false,"DJF":false,"DOP":false,"XCD":false,"EGP":false,"GQE":false,"ERN":false,"EEK":false,"ETB":false,"EUR":1,"FKP":false,"FJD":false,"GMD":false,"GEK":false,"GEL":false,"GHS":false,"GIP":false,"GTQ":false,"GNF":false,"GYD":false,"HTG":false,"HNL":false,"HKD":false,"HUF":false,"ISK":false,"INR":false,"IDR":false,"IRR":false,"IQD":false,"ILS":false,"JMD":false,"JPY":false,"JOD":false,"KZT":false,"KES":false,"KWD":false,"KGS":false,"LAK":false,"LVL":false,"LBP":false,"LSL":false,"LRD":false,"LYD":false,"LTL":false,"MOP":false,"MKD":false,"MGA":false,"MWK":false,"MYR":false,"MVR":false,"MRO":false,"MUR":false,"MXN":false,"MDL":false,"MNT":false,"MAD":false,"MZN":false,"MMK":false,"NAD":false,"NPR":false,"ANG":false,"TWD":false,"NZD":false,"NIC":false,"NGN":false,"KPW":false,"NOK":false,"OMR":false,"PKR":false,"PAB":false,"PGK":false,"PYG":false,"PEN":false,"PHP":false,"PLN":false,"QAR":false,"RHD":false,"RON":false,"ROL":false,"RUB":false,"RWF":false,"SVC":false,"WST":false,"SAR":false,"RSD":false,"SCR":false,"SLL":false,"SGD":false,"SKK":false,"SBD":false,"SOS":false,"ZAR":false,"KRW":false,"LKR":false,"SHP":false,"SDG":false,"SRD":false,"SZL":false,"SEK":false,"CHF":false,"SYP":false,"STD":false,"TJS":false,"TZS":false,"THB":false,"TOP":false,"TTD":false,"TND":false,"TRY":false,"TRL":false,"TMM":false,"USD":"1.415000000000","UGX":false,"UAH":false,"AED":false,"UYU":false,"UZS":false,"VUV":false,"VEB":false,"VEF":false,"VND":false,"CHE":false,"CHW":false,"XOF":false,"YER":false,"ZMK":false,"ZWD":false}'); 4006 if (ex_rates[currency_iso] !== undefined) { 4007 return price * ex_rates[currency_iso]; 4008 } 4009 return price; 4010 }, 4011 currency_symbol_from_iso: function (symbol, iso) { 4012 const ex_symbols = JSON.parse('{"AFN":"\u060b","ALL":"Lek\u00eb","DZD":"\u062f.\u062c.\u200f","AOA":"Kz","ARS":"$","AMD":"\u058f","AWG":"Afl.","AUD":"$","AZN":"\u20bc","AZM":"AZM","BSD":"$","BHD":"\u062f.\u0628.\u200f","BDT":"\u09f3","BBD":"$","BYR":"BYR","BZD":"$","BMD":"$","BTN":"Nu.","BOB":"Bs","BAM":"KM","BWP":"P","BRL":"R$","GBP":"\u00a3","BND":"$","BGN":"\u043b\u0432.","BUK":"BUK","BIF":"FBu","XPF":"XPF","KHR":"\u17db","CAD":"$","CVE":"CVE","KYD":"$","CLP":"$","CNY":"CN\u00a5","COP":"$","KMF":"CF","CDF":"FC","CRC":"\u20a1","HRK":"kn","CUP":"$","CZK":"K\u010d","DKK":"kr.","DJF":"DJF","DOP":"RD$","XCD":"$","EGP":"\u062c.\u0645.\u200f","GQE":"GQE","ERN":"Nfk","EEK":"EEK","ETB":"ETB","EUR":"\u20ac","FKP":"\u
401200a3","FJD":"FJD","GMD":"D","GEK":"GEK","GEL":"\u20be","GHS":"GH\u20b5","GIP":"\u00a3","GTQ":"Q","GNF":"FG","GYD":"$","HTG":"HTG","HNL":"L","HKD":"HK$","HUF":"Ft","ISK":"kr.","INR":"\u20b9","IDR":"Rp","IRR":"\u0631\u06cc\u0627\u0644","IQD":"\u062f.\u0639.\u200f","ILS":"\u20aa","JMD":"$","JPY":"\uffe5","JOD":"\u062f.\u0623.\u200f","KZT":"\u20b8","KES":"Ksh","KWD":"\u062f.\u0643.\u200f","KGS":"\u0441\u043e\u043c","LAK":"\u20ad","LVL":"LVL","LBP":"\u0644.\u0644.\u200f","LSL":"LSL","LRD":"$","LYD":"\u062f.\u0644.\u200f","LTL":"LTL","MOP":"MOP$","MKD":"\u0434\u0435\u043d.","MGA":"Ar","MWK":"MWK","MYR":"RM","MVR":"MVR","MRO":"MRO","MUR":"MUR","MXN":"$","MDL":"L","MNT":"\u20ae","MAD":"\u062f.\u0645.\u200f","MZN":"MTn","MMK":"K","NAD":"NAD","NPR":"\u0928\u0947\u0930\u0942","ANG":"ANG","TWD":"$","NZD":"NZ$","NIC":"NIC","NGN":"\u20a6","KPW":"KPW","NOK":"NOK","OMR":"\u0631.\u0639.\u200f","PKR":"Rs","PAB":"B\/.","PGK":"PGK","PYG":"PYG","PEN":"S\/","PHP":"\u20b1","PLN":"z\u0142","QAR":"\u0631.\u0642.\u200f","RHD":"RHD","RON":"RON","ROL":"ROL","RUB":"\u20bd","RWF":"RF","SVC":"SVC","WST":"WST","SAR":"\u0631.\u0633.\u200f","RSD":"RSD","SCR":"SCR","SLL":"SLL","SGD":"$","SKK":"SKK","SBD":"$","SOS":"SOS","ZAR":"R","KRW":"\u20a9","LKR":"\u0dbb\u0dd4.","SHP":"\u00a3","SDG":"\u062c.\u0633.","SRD":"SRD","SZL":"E","SEK":"kr","CHF":"CHF","SYP":"\u0644.\u0633.\u200f","STD":"STD","TJS":"\u0441\u043e\u043c.","TZS":"TSh","THB":"\u0e3f","TOP":"T$","TTD":"$","TND":"\u062f.\u062a.\u200f","TRY":"\u20ba","TRL":"TRL","TMM":"TMM","USD":"$","UGX":"USh","UAH":"\u20b4","AED":"\u062f.\u0625.\u200f","UYU":"$","UZS":"\u0441\u045e\u043c","VUV":"VUV","VEB":"VEB","VEF":"VEF","VND":"\u20ab","CHE":"CHE","CHW":"CHW","XOF":"F\u202fCFA","YER":"\u0631.\u064a.\u200f","ZMK":"ZMK","ZWD":"ZWD"}'); 4013 if (ex_symbols[currency_iso] !== undefined) { 4014 return ex_symbols[currency_iso]; 4015 } 4016 return symbol; 4017 } 4018 } 4019 }); 4020 4021 var collectbaskets = false; 4022 4023 if (collectbaskets) { 4024 4025 let open = XMLHttpRequest.prototype.open; 4026 XMLHttpRequest.prototype.open = function () { 4027 this.addEventListener("load", function () { 4028 4029 if (this.responseURL.includes("=cart")) { 4030 4031 if (this.readyState === 4 && this.status === 200) { 4032 var response = JSON.parse(this.responseText); 4033 4034 var clerk_productids = []; 4035 if (response && response.hasOwnProperty('cart') && response.cart.hasOwnProperty('items')) { 4036 for (var i = 0, len = response.cart.items.length; i < len; i++) { 4037 clerk_productids.push(response.cart.items[i].product_id); 4038 } 4039 } 4040 4041 clerk_productids = clerk_productids.map(Number); 4042 var clerk_last_productids = []; 4043 if (localStorage.getItem('clerk_productids') !== null) { 4044 clerk_last_productids = localStorage.getItem('clerk_productids').split(","); 4045 clerk_last_productids = clerk_last_productids.map(Number); 4046 } 4047 clerk_productids = clerk_productids.sort((a, b) => a - b); 4048 clerk_last_productids = clerk_last_productids.sort((a, b) => a - b); 4049 if (JSON.stringify(clerk_productids) == JSON.stringify(clerk_last_productids)) { 4050 4051 } else { 4052 if (JSON.stringify(clerk_productids) === "[0]") { 4053 Clerk('cart', 'set', []); 4054 } else { 4055 Clerk('cart', 'set', clerk_productids); 4056 } 4057 } 4058 localStorage.setItem("clerk_productids", clerk_productids); 4059 } 4060 } 4061 4062 if (this.responseURL.includes("/cart/add/")) { 4063 if (this.readyState === 4 && this.status === 200) { 4064 const urlParts = this.responseURL.split('/'); 4065 const product_id = urlParts[urlParts.length - 2]; 4066 Clerk('basket', 'add', product_id); 4067 } 4068 } 4069 4070 }, false); 4071 open.apply(this, arguments); 4072 }; 4073 4074 }</script>
4074<!-- End of Clerk.io E-commerce Personalisation tool - www.clerk.io -->
4074<script>document.addEventListener("DOMContentLoaded", function() { if (document.querySelectorAll('.mf-ytw-wrapper').length || document.querySelectorAll('[data-mf-ytw-youtube-link]').length) { !function (f, b, e, v, t, s) { if(f.mfytwcss)return; f.mfytwcss=1; t = b.createElement(e); t.rel = 'stylesheet'; t.type = 'text/css'; t.href = v; s = b.getElementsByTagName('HEAD')[0]; s.appendChild(t) }(window, document, 'link', 'https://www.voetbalshirtskoning.nl/static/version20261002143139/frontend/Vendic/voetbalshirtskoning/nl_NL/Magefan_YouTubeWidget/css/youtubewidget.css'); } if (document.querySelectorAll('.mf-ytw-wrapper').length) { !function (f, b, e, v, t, s) { if(f.mfytwjs)return; f.mfytwjs=1; t = b.createElement(e); t.type = 'text/javascript'; t.src = v; s = b.getElementsByTagName('HEAD')[0]; s.appendChild(t) }(window, document, 'script', 'https://www.voetbalshirtskoning.nl/static/version20261002143139/frontend/Vendic/voetbalshirtskoning/nl_NL/Magefan_YouTubeWidget/js/iframe.js'); } if (document.querySelectorAll('[data-mf-ytw-youtube-link]').length) { !function (f, b, e, v, t) { if(f.mflinkjs)return; f.mflinkjs=1; t = b.createElement(e); t.type = 'text/javascript'; t.src = v; s = b.getElementsByTagName('HEAD')[0]; s.appendChild(t) }(window, document, 'script', 'https://www.voetbalshirtskoning.nl/static/version20261002143139/frontend/Vendic/voetbalshirtskoning/nl_NL/Magefan_YouTubeWidget/js/link.js'); } });</script>
4074<!-- TikTok Pixel Code Start -->
4074<script> !function (w, d, t) { 4075 w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];ttq.methods=["page","track","identify","instances","debug", 4076 "on","off","once","ready","alias","group","enableCookie","disableCookie","holdConsent","revokeConsent", 4077 "grantConsent"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call 4078 (arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance= 4079 function(t){for( 4080 var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e},ttq.load= 4081 function(e,n){var r="https://analytics.tiktok.com/i18n/pixel/events.js",o=n&&n.partner;ttq._i=ttq._i|| 4082 {},ttq._i[e]=[],ttq._i[e]._u=r,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{}; 4083 n=document.createElement("script") 4084 ;n.type="text/javascript",n.async=!0,n.src=r+"?sdkid="+e+"&lib="+t;e=document.getElementsByTagName("script") 4085 [0];e.parentNode.insertBefore(n,e)}; 4086 4087 4088 ttq.load('D4FG09RC77UCJ0N6CF2G'); 4089 ttq.page(); 4090 }(window, document, 'ttq');</script>
4090 <!-- TikTok Pixel Code End -->
4090<script> 4091 if (HTMLScriptElement.supports && 4092 HTMLScriptElement.supports('speculationrules')) { 4093 const specScript = document.createElement('script'); 4094 specScript.type = 'speculationrules'; 4095 specRules = { 4096 "prerender": [{ 4097 "source": "document", 4098 "where": { 4099 "and": [ 4100 {"href_matches":"/*"}, {"not":{"href_matches":"https://www.voetbalshirtskoning.nl/customer*"}}, {"not":{"href_matches":"https://www.voetbalshirtskoning.nl/checkout*"}}, {"not":{"href_matches":"https://www.voetbalshirtskoning.nl/download*"}}, {"not":{"href_matches":"https://www.voetbalshirtskoning.nl/redirect*"}}, {"not":{"href_matches":"https://www.voetbalshirtskoning.nl/store*"}}, {"not":{"href_matches":"https://www.voetbalshirtskoning.nl/rewrite*"}}, {"not":{"href_matches":"https://www.voetbalshirtskoning.nl/switch*"}}, {"not":{"href_matches":"https://www.voetbalshirtskoning.nl/.pdf"}}, {"not":{"selector_matches":".do-not-prerender"}}, {"not":{"selector_matches":"[rel=nofollow]"}} ] 4101 }, 4102 "eagerness": "moderate" 4103 }] 4104 }; 4105 specScript.textContent = JSON.stringify(specRules); 4106 document.body.append(specScript); 4107 }</script>
4107<script> 4108 (() => { 4109 function src_default(Alpine) { 4110 Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { 4111 let evaluate = evaluateLater(expression); 4112 let options = { 4113 rootMargin: getRootMargin(modifiers), 4114 threshold: getThreshold(modifiers) 4115 }; 4116 let observer = new IntersectionObserver((entries) => { 4117 entries.forEach((entry) => { 4118 if (entry.isIntersecting === (value === "leave")) 4119 return; 4120 evaluate(); 4121 modifiers.includes("once") && observer.disconnect(); 4122 }); 4123 }, options); 4124 observer.observe(el); 4125 cleanup(() => { 4126 observer.disconnect(); 4127 }); 4128 })); 4129 } 4130 function getThreshold(modifiers) { 4131 if (modifiers.includes("full")) 4132 return 0.99; 4133 if (modifiers.includes("half")) 4134 return 0.5; 4135 if (!modifiers.includes("threshold")) 4136 return 0; 4137 let threshold = modifiers[modifiers.indexOf("threshold") + 1]; 4138 if (threshold === "100") 4139 return 1; 4140 if (threshold === "0") 4141 return 0; 4142 return Number(`.${threshold}`); 4143 } 4144 function getLengthValue(rawValue) { 4145 let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); 4146 return match ? match[1] + (match[2] || "px") : void 0; 4147 } 4148 function getRootMargin(modifiers) { 4149 const key = "margin"; 4150 const fallback = "0px 0px 0px 0px"; 4151 const index = modifiers.indexOf(key); 4152 if (index === -1) 4153 return fallback; 4154 let values = []; 4155 for (let i = 1; i < 5; i++) { 4156 values.push(getLengthValue(modifiers[index + i] || "")); 4157 } 4158 values = values.filter((v) => v !== void 0); 4159 return values.length ? values.join(" ").trim() : fallback; 4160 } 4161 4162 document.addEventListener("alpine:init", () => { 4163 window.Alpine.plugin(src_default); 4164 }); 4165 })();</script>
4165<script> 4166 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"})) { 4167 document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); 4168 }</script>
4168
4168<script> 4169 (function () { 4170 "use strict"; 4171 4172 const hasAlpine = new Promise(resolve => { 4173 window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); 4174 }); 4175 4176 const hasInteract = new Promise(resolve => { 4177 (events => { 4178 const onInteract = () => { 4179 resolve(); 4180 events.forEach(type => window.removeEventListener(type, onInteract)); 4181 } 4182 events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) 4183 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 4184 }); 4185 4186 const onIntersect = (el) => { 4187 return new Promise(resolve => { 4188 const observer = new IntersectionObserver(entries => { 4189 for (const entry of entries) { 4190 if (entry.isIntersecting) { 4191 observer.disconnect() 4192 resolve(); 4193 } 4194 } 4195 }, {}); 4196 observer.observe(el); 4197 }); 4198 } 4199 4200 function runComponent(el) { 4201 hasAlpine.then(() => { 4202 el.removeAttribute('x-ignore'); 4203 queueMicrotask(() => Alpine.initTree(el)); 4204 }); 4205 } 4206 4207 function initDeferredComponents() { 4208 document.querySelectorAll('[x-data][x-defer]').forEach(el => { 4209 el.setAttribute('x-ignore', ''); 4210 const deferUntil = (el.getAttribute('x-defer') || '').trim(); 4211 switch (deferUntil) { 4212 case 'interact': 4213 hasInteract.then(() => runComponent(el)); 4214 break; 4215 case 'intersect': 4216 onIntersect(el).then(() => runComponent(el)) 4217 break; 4218 case 'idle': 4219 window.requestIdleCallback 4220 ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) 4221 : setTimeout(() => runComponent(el), 4000); 4222 break; 4223 case 'eager': 4224 runComponent(el); 4225 break; 4226 default: 4227 if (deferUntil.startsWith('event:') && deferUntil.length > 6) { 4228 window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); 4229 } 4230 } 4231 }); 4232 } 4233 4234 window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); 4235 })()</script>
vendor: 4,405 bytes, lines 4235-4342
4235<script> 4236 (() => { 4237 // packages/collapse/src/index.js 4238 function src_default(Alpine) { 4239 Alpine.directive("collapse", collapse); 4240 collapse.inline = (el, { 4241 modifiers 4242 }) => { 4243 if (!modifiers.includes("min")) 4244 return; 4245 el._x_doShow = () => {}; 4246 el._x_doHide = () => {}; 4247 }; 4248 4249 function collapse(el, { 4250 modifiers 4251 }) { 4252 let duration = modifierValue(modifiers, "duration", 250) / 1e3; 4253 let floor = modifierValue(modifiers, "min", 0); 4254 let fullyHide = !modifiers.includes("min"); 4255 if (!el._x_isShown) 4256 el.style.height = `${floor}px`; 4257 if (!el._x_isShown && fullyHide) 4258 el.hidden = true; 4259 if (!el._x_isShown) 4260 el.style.overflow = "hidden"; 4261 let setFunction = (el2, styles) => { 4262 let revertFunction = Alpine.setStyles(el2, styles); 4263 return styles.height ? () => {} : revertFunction; 4264 }; 4265 let transitionStyles = { 4266 transitionProperty: "height", 4267 transitionDuration: `${duration}s`, 4268 transitionTimingFunction: "cubic-bezier(0.4, 0.0, 0.2, 1)" 4269 }; 4270 el._x_transition = { 4271 in(before = () => {}, after = () => {}) { 4272 if (fullyHide) 4273 el.hidden = false; 4274 if (fullyHide) 4275 el.style.display = null; 4276 let current = el.getBoundingClientRect().height; 4277 el.style.height = "auto"; 4278 let full = el.getBoundingClientRect().height; 4279 if (current === full) { 4280 current = floor; 4281 } 4282 Alpine.transition(el, Alpine.setStyles, { 4283 during: transitionStyles, 4284 start: { 4285 height: current + "px" 4286 }, 4287 end: { 4288 height: full + "px" 4289 } 4290 }, () => el._x_isShown = true, () => { 4291 if (Math.abs(el.getBoundingClientRect().height - full) < 1) { 4292 el.style.overflow = null; 4293 } 4294 }); 4295 }, 4296 out(before = () => {}, after = () => {}) { 4297 let full = el.getBoundingClientRect().height; 4298 Alpine.transition(el, setFunction, { 4299 during: transitionStyles, 4300 start: { 4301 height: full + "px" 4302 }, 4303 end: { 4304 height: floor + "px" 4305 } 4306 }, () => el.style.overflow = "hidden", () => { 4307 el._x_isShown = false; 4308 if (el.style.height == `${floor}px` && fullyHide) { 4309 el.style.display = "none"; 4310 el.hidden = true; 4311 } 4312 }); 4313 } 4314 }; 4315 } 4316 } 4317 4318 function modifierValue(modifiers, key, fallback) { 4319 if (modifiers.indexOf(key) === -1) 4320 return fallback; 4321 const rawValue = modifiers[modifiers.indexOf(key) + 1]; 4322 if (!rawValue) 4323 return fallback; 4324 if (key === "duration") { 4325 let match = rawValue.match(/([0-9]+)ms/); 4326 if (match) 4327 return match[1]; 4328 } 4329 if (key === "min") { 4330 let match = rawValue.match(/([0-9]+)px/); 4331 if (match) 4332 return match[1]; 4333 } 4334 return rawValue; 4335 } 4336 4337 // packages/collapse/builds/cdn.js 4338 document.addEventListener("alpine:init", () => { 4339 window.Alpine.plugin(src_default); 4340 }); 4341 })(); 4342</script>
4342
4342<script type="module" 4343 src="https://www.voetbalshirtskoning.nl/static/version20261002143139/frontend/Vendic/voetbalshirtskoning/nl_NL/Hyva_Theme/js/alpine3.min.js" 4344 defer 4345 crossorigin 4346></script>
4346<script> 4347 'use strict'; 4348 function dispatchMessages(messages, hideAfter) { 4349 const messagesEvent = new CustomEvent("messages-loaded", { 4350 detail: { 4351 messages: messages, 4352 hideAfter: hideAfter 4353 } 4354 }); 4355 window.dispatchEvent(messagesEvent); 4356 } 4357 4358 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 4359 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 4360 } 4361 4362 (function( hyva, undefined ) { 4363 4364 hyva.initFormKey = () => { 4365 const inputSelector = 'input[name="form_key"]', 4366 formKey = hyva.getFormKey(); 4367 4368 Array.from(document.querySelectorAll(inputSelector)).map(function (input) { 4369 input.value = formKey 4370 }); 4371 } 4372 4373 hyva.initMessages = () => { 4374 try { 4375 const messages = hyva.getCookie('mage-messages'); 4376 window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; 4377 4378 dispatchMessages(window.mageMessages); 4379 4380 const skipSetDomain = true; 4381 hyva.setCookie('mage-messages','', -1, skipSetDomain); 4382 4383 } catch (error) { 4384 console.warn('Error parsing Cookie Messages:', error); 4385 } 4386 } 4387 4388 window.addEventListener('DOMContentLoaded', hyva.initFormKey); 4389 hyva.alpineInitialized(hyva.initMessages) 4390 4391 }( window.hyva = window.hyva || {} ));</script>
4391<script> 4392 'use strict'; 4393 { 4394 const private_content_key = 'mage-cache-storage'; 4395 const private_content_expire_key = 'mage-cache-timeout'; 4396 const private_content_version_key = 'private_content_version'; 4397 const section_data_ids_key = 'section_data_ids'; 4398 const mage_cache_session_id_key = 'mage-cache-sessid'; 4399 const last_visited_store_key = 'last_visited_store'; 4400 4401 const ttl = 86400; 4402 4403 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 4404 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 4405 } 4406 4407 function loadSectionData () { 4408 const browserStorage = hyva.getBrowserStorage(); 4409 if (!browserStorage) { 4410 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 4411 [{ 4412 type: "warning", 4413 text: "Please enable LocalStorage in your browser." 4414 }] 4415 ); 4416 return; 4417 } 4418 try { 4419 let isInvalid = false; 4420 4421 if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { 4422 isInvalid = true; 4423 } 4424 hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); 4425 4426 if (!hyva.getCookie(mage_cache_session_id_key)) { 4427 isInvalid = true; 4428 browserStorage.removeItem(private_content_key); 4429 const skipSetDomain = true; 4430 const days = false; 4431 hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) 4432 } 4433 4434 const cookieVersion = hyva.getCookie(private_content_version_key); 4435 const storageVersion = browserStorage.getItem(private_content_version_key); 4436 4437 if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { 4438 isInvalid = true; 4439 } 4440 4441 const privateContentExpires = browserStorage.getItem(private_content_expire_key); 4442 if (privateContentExpires && new Date(privateContentExpires) < new Date()) { 4443 browserStorage.removeItem(private_content_key); 4444 } 4445 4446 if (isInvalid && cookieVersion) { 4447 fetchPrivateContent([]); 4448 } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { 4449 const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); 4450 if ( 4451 privateContent && 4452 privateContentExpires && 4453 privateContent.cart && 4454 privateContent.customer 4455 ) { 4456 dispatchPrivateContent(privateContent); 4457 } else { 4458 fetchPrivateContent([]); 4459 } 4460 } else { 4461 if (document.getElementById('default-section-data')) { 4462 const privateContent = JSON.parse(document.getElementById('default-section-data').innerText.trim()); 4463 dispatchPrivateContent(privateContent); 4464 } else { 4465 dispatchPrivateContent({}); 4466 } 4467 } 4468 4469 } catch (error) { 4470 console.warn('Error retrieving Private Content:', error); 4471 } 4472 } 4473 4474 hyva.alpineInitialized(loadSectionData) 4475 window.addEventListener('reload-customer-section-data', loadSectionData); 4476 4477 window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data); 4478 4479 function dispatchPrivateContent(data) { 4480 4481 const privateContentEvent = new CustomEvent("private-content-loaded", { 4482 detail: { 4483 data: window.processSectionDataBeforeDispatch(data) 4484 } 4485 }); 4486 window.dispatchEvent(privateContentEvent); 4487 } 4488 4489 function fetchPrivateContent(sections) { 4490 fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { 4491 method: 'GET', 4492 headers: { 4493 'Content-Type': 'application/json', 4494 'X-Requested-With': 'XMLHttpRequest' 4495 } 4496 }) 4497 .then(response => response.ok && response.json()) 4498 .then( 4499 data => { 4500 if (data) { 4501 try { 4502 const browserStorage = hyva.getBrowserStorage(); 4503 4504 4505 const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; 4506 4507 if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { 4508 delete oldSectionData['checkout-data']; 4509 } 4510 const newSectionData = Object.assign(oldSectionData, data); 4511 4512 dispatchPrivateContent(newSectionData); 4513 4514 4515 if (newSectionData.messages && newSectionData.messages.messages ) { 4516 newSectionData.messages.messages = []; 4517 } 4518 4519 browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); 4520 4521 const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); 4522 browserStorage.setItem(private_content_expire_key, expiresAt); 4523 4524 const newCookieVersion = hyva.getCookie(private_content_version_key); 4525 browserStorage.setItem(private_content_version_key, newCookieVersion); 4526 4527 4528 4529 hyva.setCookie( 4530 section_data_ids_key, 4531 JSON.stringify( 4532 Object.keys(data).reduce((sectionDataIds, sectionKey) => { 4533 sectionDataIds[sectionKey] = data[sectionKey]['data_id']; 4534 return sectionDataIds; 4535 }, {}) 4536 ), 4537 false, 4538 true 4539 ); 4540 } catch (error) { 4541 console.warn("Couldn't store privateContent", error); 4542 } 4543 } 4544 } 4545 ); 4546 } 4547 }</script>
4547<script> 4548 (() => { 4549 document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); 4550 })()</script>
4550<script> 4551 (events => { 4552 const dispatchUserInteractionEvent = () => { 4553 events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) 4554 window.dispatchEvent(new Event('init-external-scripts')) 4555 }; 4556 events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) 4557 })(['touchstart', 'mousemove', 'wheel', 'scroll', 'keydown'])</script>
4557<script> 4558 'use strict'; 4559 4560 const grecaptchaV2LoadCallbacks = []; 4561 4562 function executeRecaptchaLoadCallbacks () { 4563 while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) { 4564 const callback = grecaptchaV2LoadCallbacks.pop(); 4565 typeof callback === 'string' ? window[callback]() : callback(); 4566 } 4567 } 4568 4569 (function() { 4570 const loadRecaptchaScript = (event) => { 4571 4572 if (window.grecaptcha || !event.target.form) { 4573 return; 4574 } 4575 4576 const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks'; 4577 const siteKey = '6Lc5UQosAAAAADAu53_Ic8JHzWhlDLO8HTaO5Qve'; 4578 const script = document.createElement('script'); 4579 script.type = 'text/javascript'; 4580 script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`; 4581 script.async = true; 4582 document.head.appendChild(script); 4583 4584 script.addEventListener('load', () => { 4585 Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled')); 4586 }); 4587 } 4588 4589 window.forceLoadRecaptchaScript = (form) => { 4590 loadRecaptchaScript({target: {form: form || 'dummy'}}); 4591 executeRecaptchaLoadCallbacks(); 4592 }; 4593 4594 document.body.addEventListener('input', loadRecaptchaScript, { once: true }); 4595 document.body.addEventListener('focus', loadRecaptchaScript, { once: true }); 4596 4597 }()); 4598 4599</script>
4599<script> 4600 'use strict'; 4601 4602 (function () { 4603 const modals = []; 4604 const excludedFromFocusTrapping = new Set(); 4605 4606 function trapFocusInNextModalWithOverlay() { 4607 for (let idx = modals.length -1; idx >= 0; idx--) { 4608 const nextOnStack = modals[idx]; 4609 const nextDialogElement = nextOnStack.instance.$refs[nextOnStack.name]; 4610 if (! isOverlayDisabled(nextDialogElement)) { 4611 hyva.trapFocus(nextDialogElement); 4612 break; 4613 } 4614 } 4615 } 4616 4617 function focusables(dialogElement) { 4618 const selector = 'button, [href], input, textarea, select, details, [tabindex]:not([tabindex="-1"])'; 4619 return Array.from(dialogElement.querySelectorAll(selector)) 4620 .filter(el => !el.hasAttribute('disabled')); 4621 } 4622 4623 function firstVisible(elements) { 4624 const a = Array.from(elements); 4625 for (let i = 0; i < a.length; i++) { 4626 if (a[i].offsetWidth || a[i].offsetHeight || a[i].getClientRects().length) return a[i]; 4627 } 4628 return null; 4629 } 4630 4631 function isInViewport(element) { 4632 const rect = element && element.getBoundingClientRect(); 4633 return rect && 4634 rect.top >= 0 && 4635 rect.left >= 0 && 4636 rect.right <= window.innerWidth && 4637 rect.bottom <= window.innerHeight; 4638 } 4639 4640 function setFocusAfterTransition(dialogElement, duration) { 4641 const nested = Array.from(dialogElement.querySelectorAll('[role="dialog"]')); 4642 const candidates = Array.from(dialogElement.querySelectorAll('[x-focus-first]')); 4643 next: for (let candidate of candidates) { 4644 for (let child of nested) { 4645 if (child.contains(candidate)) continue next; 4646 } 4647 setTimeout(() => candidate.focus(), 50); 4648 break; 4649 } 4650 window.setTimeout(() => { 4651 const focusElement = firstVisible(dialogElement.querySelectorAll('[x-focus-first]')) || 4652 focusables(dialogElement)[0] || 4653 null; 4654 focusElement && isInViewport(focusElement) && focusElement.focus(); 4655 }, Math.max(1, duration)); 4656 } 4657 4658 function determineTrigger($refs, dialog, trigger) { 4659 if (typeof trigger === 'undefined' && typeof dialog === 'object' && dialog.target instanceof HTMLElement) { 4660 return dialog.target; 4661 } 4662 if (typeof dialog === 'string' && typeof trigger === 'object' && trigger.target instanceof HTMLElement) { 4663 return trigger.target; 4664 } 4665 if (typeof trigger === 'string') { 4666 try { 4667 return $refs[trigger] || document.querySelector(trigger) 4668 } catch (e) {} 4669 } 4670 if (trigger instanceof Element) { 4671 return trigger; 4672 } 4673 4674 return null; 4675 } 4676 4677 function isOverlayDisabled(dialog) { 4678 return dialog && dialog.hasAttribute('x-no-overlay') 4679 } 4680 4681 function areRemainingModalsWithoutOverlay(modals) 4682 { 4683 const overflowDisabled = modals.map(modal => modal.instance.$refs[modal.name]).filter(isOverlayDisabled); 4684 4685 return overflowDisabled.length === modals.length; 4686 } 4687 4688 window.hyva.modal = function(options = {}) { 4689 if (this.$el && this.$el.dataset && this.$el.dataset.options) { 4690 try { 4691 options = Object.assign(options, JSON.parse(this.$el.dataset.options || '{}')); 4692 } catch (e) { 4693 throw new Error('Cannot read the dialog options from the data-options attribute: not valid JSON'); 4694 } 4695 } 4696 4697 const config = Object.assign({ 4698 dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300', 4699 transitionEnterStart: 'opacity-0', 4700 transitionEnterEnd: 'opacity-100', 4701 transitionLeave: 'transition ease-in duration-300', 4702 transitionLeaveStart: 'opacity-100', 4703 transitionLeaveEnd: 'opacity-0', 4704 }, options); 4705 let lastHide = 0; 4706 4707 return { 4708 opened: {}, 4709 show(dialog, trigger) { 4710 const focusTargetAfterHide = determineTrigger(this.$refs, dialog, trigger); 4711 const name = typeof dialog === 'string' ? dialog : config.dialog; 4712 const dialogElement = this.$refs[name]; 4713 if (! dialogElement) { 4714 return; 4715 } 4716 const useOverlay = ! dialogElement.hasAttribute('x-no-overlay'); 4717 4718 dialogElement.scrollTop = 0; 4719 4720 if (this.opened[name]) { 4721 return; 4722 } 4723 4724 if (focusTargetAfterHide) { 4725 focusTargetAfterHide.setAttribute('aria-expanded', 'true'); 4726 } 4727 4728 this.opened[name] = true; 4729 useOverlay && this.$nextTick(() => hyva.trapFocus(dialogElement)); 4730 setFocusAfterTransition(dialogElement, config.duration); 4731 4732 const frame = {name, instance: this, focusTarget: focu
4732sTargetAfterHide, time: Date.now()}; 4733 4734 modals.push(frame); 4735 if (useOverlay) { 4736 document.body.classList.add('overflow-hidden'); 4737 } 4738 return new Promise(resolve => frame.resolve = resolve); 4739 }, 4740 cancel() { 4741 this.hide(false); 4742 }, 4743 ok() { 4744 this.hide(true); 4745 }, 4746 hide(value) { 4747 if (Date.now() - lastHide < config.duration) { 4748 return; 4749 } 4750 lastHide = Date.now(); 4751 4752 const modal = modals.pop() || {}; 4753 if (! modal.instance) { 4754 return; 4755 } 4756 4757 const name = modal.name; 4758 this.opened[name] = false; 4759 hyva.releaseFocus(modal.instance.$refs[modal.name]) 4760 trapFocusInNextModalWithOverlay(); 4761 4762 const nextFocusAfterHide = modal.focusTarget; 4763 nextFocusAfterHide && setTimeout(() => { 4764 nextFocusAfterHide.setAttribute('aria-expanded', 'false'); 4765 nextFocusAfterHide.focus() 4766 }, config.duration); 4767 4768 if (modals.length === 0 || areRemainingModalsWithoutOverlay(modals)) { 4769 document.body.classList.remove('overflow-hidden'); 4770 } 4771 4772 modal.resolve(value); 4773 }, 4774 overlay(dialog) { 4775 dialog = this.$el.dataset.dialogRefName || dialog; 4776 const name = typeof dialog === 'string' ? dialog : config.dialog; 4777 return { 4778 ['x-show']() { 4779 return this.opened[name] 4780 }, 4781 ['x-transition:enter']: config.transitionEnter, 4782 ['x-transition:enter-start']: config.transitionEnterStart, 4783 ['x-transition:enter-end']: config.transitionEnterEnd, 4784 ['x-transition:leave']: config.transitionLeave, 4785 ['x-transition:leave-start']: config.transitionLeaveStart, 4786 ['x-transition:leave-end']: config.transitionLeaveEnd, 4787 ['@hyva-modal-show.window'](event) { 4788 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide) 4789 } 4790 }; 4791 }, 4792 showDialogOnInit() { 4793 const parent = this.$el.closest('[data-dialog-ref-name]'); 4794 if (parent && parent.dataset.dialogRefName) { 4795 this.$dispatch('hyva-modal-show', {dialog: parent.dataset.dialogRefName}) 4796 } 4797 } 4798 }; 4799 } 4800 4801 window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length -1] 4802 4803 window.hyva.modal.pop = function () { 4804 if (modals.length > 0) { 4805 const modal = modals[modals.length -1]; 4806 modal.instance.hide(); 4807 } 4808 } 4809 4810 window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) { 4811 typeof selectors === 'string' || selectors instanceof String 4812 ? excludedFromFocusTrapping.add(selectors) 4813 : selectors.map(selector => excludedFromFocusTrapping.add(selector)); 4814 } 4815 4816 window.hyva.modal.eventListeners = { 4817 keydown: event => { 4818 if (event.key === 'Escape') { 4819 window.hyva.modal.pop(); 4820 } 4821 }, 4822 click: event => { 4823 if (modals.length > 0) { 4824 const modal = modals[modals.length -1]; 4825 const dialog = modal.instance.$refs[modal.name]; 4826 if (modal.time + 50 < Date.now() && 4827 ! isOverlayDisabled(dialog) && 4828 ! dialog.contains(event.target)) { 4829 modal.instance.hide(); 4830 } 4831 } 4832 } 4833 }; 4834 4835 document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown); 4836 4837 document.addEventListener('click', window.hyva.modal.eventListeners.click); 4838 })(); 4839 window.addEventListener('alpine:init', () => { 4840 Alpine.data('hyvaModal', window.hyva.modal); 4841 }, {once: true});</script>
4841<div class="thuiswinkel-badge fixed bottom-4 right-4 z-30 transition-all"> 4842 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13.23 25.1" width="48" height="48" role="img"><defs><style>.cls-1{fill:#fff;}.cls-2{fill:#1e1e1e;}.cls-3{fill:#bdea18;}.cls-4{fill:#fc3f4d;}.cls-5{fill:#eee;}</style></defs><rect class="cls-1" x="0.35" y="10.74" width="12.53" height="14" rx="1.15" ry="1.15"/><path class="cls-2" d="M11.73,11.1a.79.79,0,0,1,.8.79V23.6a.8.8,0,0,1-.8.8H1.5a.8.8,0,0,1-.8-.8V11.89a.79.79,0,0,1,.8-.79H11.73m0-.71H1.5A1.5,1.5,0,0,0,0,11.89V23.6a1.5,1.5,0,0,0,1.5,1.5H11.73a1.5,1.5,0,0,0,1.5-1.5V11.89a1.5,1.5,0,0,0-1.5-1.5Z"/><path class="cls-2" d="M6.62,0,0,3.82v7.66H13.23V3.82Zm5.91,10.77H7V7.84l5.56-3.2Zm-6.27,0H.71V4.64l5.55,3.2Zm.36-3.54L1.06,4,6.62.82,12.17,4Z"/><polygon class="cls-3" points="12.53 4.64 6.97 7.84 6.97 10.77 12.53 10.77 12.53 4.64"/><polygon class="cls-4" points="0.71 10.77 6.26 10.77 6.26 7.84 0.71 4.64 0.71 10.77"/><polygon class="cls-1" points="1.06 4.02 6.62 7.23 12.17 4.02 6.62 0.82 1.06 4.02"/><rect class="cls-5" x="3.38" y="14.37" width="6.47" height="6.47"/><path d="M8.57,16.76a.2.2,0,0,1-.06.14L7,18.39l-.28.29a.24.24,0,0,1-.14.05.2.2,0,0,1-.14-.05l-.29-.29-.74-.74a.2.2,0,0,1-.06-.14.17.17,0,0,1,.06-.14l.28-.28A.18.18,0,0,1,5.85,17a.2.2,0,0,1,.14.06l.61.6L8,16.34a.2.2,0,0,1,.14-.06.18.18,0,0,1,.14.06l.28.28A.18.18,0,0,1,8.57,16.76Z"/><title>thuiswinkel</title></svg> 4843</div>
4843<script> 4844 function initConfigurableOptions(productId, optionConfig) { 4845 4846 function findPathParam(key) { 4847 const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL; 4848 const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/'); 4849 const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3); 4850 for (let i = 0; i < pathParts.length; i += 2) { 4851 if (pathParts[i] === key && pathParts.length > i) { 4852 return pathParts[i + 1]; 4853 } 4854 } 4855 } 4856 4857 return { 4858 optionConfig, 4859 productId, 4860 itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'), 4861 allowedAttributeOptions: [], 4862 selectedValues: [], 4863 init() { 4864 this.findAllowedAttributeOptions(); 4865 this.$nextTick(() => { 4866 if (typeof this.optionConfig.defaultValues === 'object') { 4867 for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) { 4868 this.changeOption(attributeId, value + ''); 4869 } 4870 } 4871 this.preselectQuerystringItems(); 4872 this.preselectLocationHashItems(); 4873 }); 4874 }, 4875 productIndex: 0, 4876 productIndexForPrice: 0, 4877 optionIsActive(attributeId, optionId) { 4878 return !!this.getAllowedAttributeOptions(attributeId).find( 4879 option => option.id === optionId 4880 ) 4881 }, 4882 optionIsEnabled(attributeId, optionId) { 4883 for (const productId in this.optionConfig.index) { 4884 if (this.optionConfig.index[productId][attributeId] === optionId) { 4885 return true; 4886 } 4887 } 4888 return false; 4889 }, 4890 findSimpleIndex() { 4891 this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues); 4892 this.productIndexForPrice = this.findCheapestProductForPartialSelection(this.selectedValues); 4893 }, 4894 calculateSimpleIndexForPartialSelection(selectedValues) { 4895 if (selectedValues.length === 0) return 0; 4896 return this.findProductIdsForPartialSelection(selectedValues)[0]; 4897 }, 4898 calculateSimpleIndexForFullSelection(selectedValues) { 4899 if (! this.isFullSelection(selectedValues)) return false; 4900 4901 const productIndexes = this.optionConfig.index; 4902 return Object.keys(productIndexes).find(productIndex => { 4903 const productCandidateOptions = productIndexes[productIndex]; 4904 4905 for (const productOption in productCandidateOptions) { 4906 if ( 4907 !selectedValues[productOption] || 4908 selectedValues[productOption] !== productCandidateOptions[productOption] 4909 ) { 4910 return false; 4911 } 4912 } 4913 return productIndex; 4914 }); 4915 }, 4916 findAllowedAttributeOptions() { 4917 this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues); 4918 }, 4919 calculateAllowedAttributeOptions(selectedValues) { 4920 const allAttributes = this.optionConfig.attributes; 4921 const allAttributesSorted = Object.values(allAttributes).sort((a,b) => { 4922 return a.position - b.position 4923 }); 4924 4925 const newAllowedAttributeOptions = []; 4926 4927 allAttributesSorted.forEach(attribute => { 4928 const selectionWithoutAttr = Object.assign({}, this.removeAttrFromSelection(selectedValues, attribute.id)); 4929 const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr); 4930 newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => { 4931 return !!option.products.find(product => { 4932 return availableIndexes.includes(product); 4933 }) 4934 }); 4935 }); 4936 return newAllowedAttributeOptions; 4937 }, 4938 calculateAvailableProductIndexes(selectedOptions) { 4939 if (Object.keys(selectedOptions).length === 0) { 4940 if (Object.values(this.optionConfig.salable || {}).length) { 4941 return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i) 4942 } 4943 return Object.keys(this.optionConfig.index); 4944 } 4945 4946 const selectedIds = Object.keys(selectedOptions); 4947 if (Object.values(this.optionConfig.salable || {}).length) { 4948 const selectedOptionIndexes = selectedIds.map(attrId => { 4949 const optionValue = selectedOptions[attrId]; 4950 return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || [] 4951 }) 4952 return selectedOptionIndexes.reduce((acc, optionIndexes) => { 4953 return acc.filter(index => optionIndexes.includes(index)); 4954 }); 4955 } else { 4956 const productIndexes = this.optionConfig.index; 4957 return Object.keys(productIndexes).filter(index => { 4958 for (const attrId of selectedIds) { 4959 if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false 4960 } 4961 return true 4962 }); 4963 } 4964 }, 4965 findAttributeByOptionId(optionId) { 4966 for (const attributeId in this.optionConfig.attributes) { 4967 const attributeOptions = this.optionConfig.attributes[attributeId].options || []; 4968 if (attributeOptions.find(option => option.id === optionId)) { 4969 return attributeId; 4970 } 4971 } 4972 }, 4973 getAllowedAttributeOptions(attributeId) { 4974 return this.allowedAttributeOptions[attributeId] || [] 4975 }, 4976 getAllAttributeOptions(attributeId) { 4977 return ( 4978 this.optionConfig.attributes[attributeId] && 4979 this.optionConfig.attributes[attributeId].options 4980 ) || [] 4981 }, 4982 getProductIdsForOption(option) { 4983 const attributeId = this.findAttributeByOptionId(option.id); 4984 const allOptions = this.optionConfig.attributes[attributeId]; 4985 const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id); 4986 return opt && opt.products 4987 ? opt.products 4988 : []; 4989 }, 4990 findProductIdsForPartialSelection(optionSelection) { 4991 const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => { 4992 const newCandidates = this.getProductIdsForOption({id: optionId}); 4993 return candidates === null 4994 ? newCandidates 4995 : candidates.filter(productId => newCandidates.includes(productId)); 4996 }, null); 4997 return candidateProducts || []; 4998 },
4999 findCheapestProductForPartialSelection(optionSelection) { 5000 const candidateProducts = this.findProductIdsForPartialSelection(optionSelection); 5001 return candidateProducts.reduce((cheapest, simpleIdx) => { 5002 // in the first iteration we start with simpleIdx as the currently cheapest product 5003 if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx; 5004 const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount; 5005 return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount 5006 ? simpleIdx 5007 : cheapest; 5008 }, 0) 5009 }, 5010 findProductIdToUseForOptionPrice(option) { 5011 // try to find a product for a complete selection 5012 const attributeId = this.findAttributeByOptionId(option.id); 5013 const optionSelection = Object.assign({}, this.selectedValues, {[attributeId]: option.id}); 5014 const matchingSimpleIndex = this.calculateSimpleIndexForFullSelection(optionSelection); 5015 // if there is no complete selection, use the cheapest product for the option 5016 return matchingSimpleIndex || this.findCheapestProductForPartialSelection(optionSelection); 5017 }, 5018 getAttributeOptionLabel(option) { 5019 const optionProduct = this.findProductIdToUseForOptionPrice(option); 5020 5021 if ((! optionProduct) || (optionProduct === this.productIndexForPrice)) { 5022 return option.label; 5023 } 5024 5025 const currentPrice = this.getOptionPriceAdjustmentBasePrice(); 5026 5027 if (this.optionConfig.optionPrices[optionProduct]) { 5028 const optionPrice = this.optionConfig.optionPrices[optionProduct].finalPrice.amount; 5029 if (optionPrice !== currentPrice){ 5030 return option.label + ' ' + hyva.formatPrice(optionPrice - currentPrice, true); 5031 } 5032 } 5033 return option.label; 5034 }, 5035 getOptionPriceAdjustmentBasePrice() { 5036 if (this.optionConfig.optionPrices[this.productIndexForPrice]) { 5037 return this.optionConfig.optionPrices[this.productIndexForPrice].finalPrice.amount 5038 } 5039 return this.optionConfig.prices.finalPrice.amount; // default price if no option selection 5040 }, 5041 clearOptionIfActive(optionId, value) { 5042 if (this.selectedValues[optionId] === value) { 5043 this.blurLabel() 5044 this.changeOption(optionId, '') 5045 } 5046 }, 5047 removeAttrFromSelection(selectedValues, attributeId) { 5048 attributeId = parseInt(attributeId); 5049 return selectedValues.reduce((newSelection, val, attr) => { 5050 if (attr !== attributeId) { 5051 newSelection[attr] = val; 5052 } 5053 return newSelection; 5054 }, []); 5055 }, 5056 changeOption(attributeId, value) { 5057 if (value === '') { 5058 this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId) 5059 } else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) { 5060 this.selectedValues[attributeId] = value; 5061 } 5062 this.findSimpleIndex(); 5063 this.findAllowedAttributeOptions(); 5064 this.updatePrices(); 5065 this.updateGallery(); 5066 5067 const candidates = this.findProductIdsForPartialSelection(this.selectedValues); 5068 5069 window.dispatchEvent( 5070 new CustomEvent( 5071 'configurable-selection-changed', 5072 { 5073 detail: { 5074 productId: this.productId, 5075 optionId: attributeId, 5076 value: value, 5077 productIndex: this.productIndex, 5078 selectedValues: this.selectedValues, 5079 candidates: candidates, 5080 skuCandidates: Object.values(candidates).map(id =>
5080 this.optionConfig.sku?.[id] ?? null).filter(Boolean), 5081 } 5082 } 5083 ) 5084 ); 5085 }, 5086 calculateIsMinimalPrice() { 5087 return ! this.isFullSelection(this.selectedValues); 5088 }, 5089 isFullSelection(selectedValues) { 5090 return Object.values(selectedValues).length === Object.keys(this.optionConfig.attributes).length; 5091 }, 5092 updatePrices() { 5093 const value = this.optionConfig.optionPrices[this.productIndexForPrice] || this.optionConfig.prices; 5094 window.dispatchEvent( 5095 new CustomEvent( 5096 "update-prices-" + this.productId, 5097 { 5098 detail: Object.assign( 5099 value, 5100 { isMinimalPrice: this.calculateIsMinimalPrice() } 5101 ) 5102 } 5103 ) 5104 ); 5105 }, 5106 updateGallery () { 5107 if (this.productIndex) { 5108 const images = this.optionConfig.images[this.productIndex]; 5109 images && window.dispatchEvent(new CustomEvent( 5110 "update-gallery", 5111 { detail: this.sortImagesByPosition(images) } 5112 )); 5113 } else { 5114 window.dispatchEvent(new Event("reset-gallery")); 5115 } 5116 }, 5117 sortImagesByPosition(images) { 5118 return images.sort((x, y) => { 5119 return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1) 5120 }); 5121 }, 5122 onGetCartData(data) { 5123 }, 5124 preselectCartItems(data) { 5125 // pre-select options based on cart data for current (quote) itemId 5126 const cart = data && data.cart; 5127 if (cart && cart.items) { 5128 const cartItem = cart.items.find((item) => { 5129 return ( 5130 item.item_id === this.itemId 5131 && item.product_id === this.productId 5132 ) 5133 }); 5134 if (cartItem && cartItem.options && cartItem.options.length) { 5135 cartItem.options.map(option => { 5136 this.changeOption(option.option_id, option.option_value); 5137 }) 5138 } 5139 } 5140 }, 5141 preselectQuerystringItems() { 5142 // pre-select option like ?size=167 5143 const urlQueryParams = new URLSearchParams(window.location.search.replace('?','')); 5144 this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code)); 5145 }, 5146 preselectLocationHashItems() { 5147 // pre-select option like #144=167 5148 const urlHashParams = new URLSearchParams(window.location.hash.replace('#','')); 5149 this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id)); 5150 }, 5151 preselectItemsBasedOnLocation(getLocationValue) { 5152 Object.values(this.optionConfig.attributes).map(attribute => { 5153 const v = getLocationValue(attribute); 5154 v && this.changeOption(attribute.id, v) 5155 }); 5156 } 5157 } 5158 } 5159</script>
5159<script> 5160 function initSwatchOptions(swatchConfig) { 5161 return { 5162 swatchConfig, 5163 getAttributeSwatchData(attributeId) { 5164 const swatchConfig = Object.assign({}, this.swatchConfig[attributeId]); 5165 swatchConfig['details'] = JSON.parse(swatchConfig['additional_data']); 5166 5167 return swatchConfig; 5168 }, 5169 mapSwatchTypeNumberToTypeCode(typeNumber) { 5170 switch ("" + typeNumber) { 5171 case "1": 5172 return "color" 5173 case "2": 5174 return "image" 5175 case "3": 5176 return "empty" 5177 case "0": 5178 default: 5179 return "text" 5180 } 5181 }, 5182 getTypeOfFirstOption(attributeId) { 5183 for (const optionId in this.swatchConfig[attributeId]) { 5184 const option = this.swatchConfig[attributeId][optionId]; 5185 if (typeof option.type !== 'undefined') { 5186 return this.mapSwatchTypeNumberToTypeCode(option.type); 5187 } 5188 } 5189 }, 5190 getVisualSwatchType(attributeId, targetOptionId) { 5191 // If a type configuration is present for the given option id, use it 5192 const config = this.swatchConfig[attributeId]; 5193 if (config[targetOptionId] && typeof config[targetOptionId].type !== 'undefined') { 5194 return this.mapSwatchTypeNumberToTypeCode(config[targetOptionId].type); 5195 } 5196 5197 // Otherwise - if no config is present for the target option - use the type of the first option 5198 // with a type property from the attribute, thus assuming its the same type as the target option. 5199 // (This edge case condition can occur on single swatch products if some options are not salable) 5200 return this.getTypeOfFirstOption(attributeId); 5201 }, 5202 getSwatchType(attributeId, optionId) { 5203 // Deserialize the attribute details the first time they are used 5204 if (this.swatchConfig[attributeId] && ! this.swatchConfig[attributeId].details) { 5205 this.swatchConfig[attributeId] = this.getAttributeSwatchData(attributeId); 5206 } 5207 const type = this.swatchConfig[attributeId] && 5208 this.swatchConfig[attributeId].details && 5209 this.swatchConfig[attributeId].details.swatch_input_type || 5210 "empty"; 5211 return type === 'visual' ? this.getVisualSwatchType(attributeId, optionId) : type; 5212 }, 5213 isTextSwatch(attributeId, optionId) { 5214 return this.getSwatchType(attributeId, optionId) === 'text'; 5215 }, 5216 isVisualSwatch(attributeId, optionId) { 5217 const type = this.getSwatchType(attributeId, optionId); 5218 5219 return ['image', 'color'].includes(type); 5220 }, 5221 getSwatchBackgroundStyle(attributeId, optionId) { 5222 const config = this.getSwatchConfig(attributeId, optionId); 5223 const type = this.getSwatchType(attributeId, optionId); 5224 5225 if (type === "color") { 5226 return 'background-color:' + config.value; 5227 } else if (type === "image") { 5228 return "background: #fff url('" + config.value + "') no-repeat center"; 5229 } else { 5230 return ''; 5231 } 5232 }, 5233 getSwatchText(attributeId, optionId) { 5234 const config = this.getSwatchConfig(attributeId, optionId); 5235 return config.label || config.value || this.getOptionLabelFromOptionConfig(attributeId, optionId); 5236 }, 5237 getOptionLabelFromOptionConfig(attributeId, optionId) { 5238 // Fallback if no value is present in swatchConfig data 5239 // Reference issue https://gitlab.hyva.io/hyva-themes/magento2-default-theme/-/issues/190 5240 const option = this.getAllAttributeOptions(attributeId).filter(option => option.id === optionId); 5241 return option && option[0] && option[0].label ||''; 5242 }, 5243 getSwatchConfig(attributeId, optionId) { 5244 return this.swatchConfig[attributeId] && this.swatchConfig[attributeId][optionId] 5245 ? this.swatchConfig[attributeId][optionId] 5246 : false;
5247 }, 5248 activeTooltipItem: false, 5249 tooltipPositionElement: false, 5250 isTooltipVisible() { 5251 return this.activeTooltipItem && 5252 this.getSwatchConfig( 5253 this.activeTooltipItem.attribute, 5254 this.activeTooltipItem.item 5255 ); 5256 }, 5257 isFirstItemCol() { 5258 return this.activeTooltipItem.index === 0; 5259 }, 5260 getTooltipImageStyle(attributeId, optionId) { 5261 const config = this.getSwatchConfig(attributeId, optionId); 5262 const type = this.getSwatchType(attributeId, optionId); 5263 5264 if (type === "color") { 5265 return 'background-color:' + config.value + '; width: 110px; height: 90px;'; 5266 } else if (type === "image") { 5267 return "background: #ffffff url('" + config.thumb + 5268 "') center center no-repeat; width: 110px; height: 90px;"; 5269 } else { 5270 return 'display:none'; 5271 } 5272 }, 5273 getTooltipPosition() { 5274 return this.tooltipPositionElement ? 5275 `top: ${this.tooltipPositionElement.offsetTop}px;` + 5276 `left: ${ 5277 this.tooltipPositionElement.offsetLeft - ( 5278 this.tooltipPositionElement.closest('.snap') && 5279 this.tooltipPositionElement.closest('.snap').scrollLeft || 5280 0 5281 ) 5282 }px;` : '' 5283 }, 5284 getTooltipLabel() { 5285 return this.getSwatchConfig(this.activeTooltipItem.attribute, this.activeTooltipItem.item).label 5286 }, 5287 focusedLabel: false, 5288 focusLabel(optionId) { 5289 this.focusedLabel = optionId; 5290 }, 5291 blurLabel() { 5292 this.focusedLabel = false; 5293 } 5294 } 5295 } 5296</script>
5296<script nonce="NXM3aDNrNzgxOXZ1cmU2YmNoZjNkZjRndG9wcDhlb2M="> 5297 5298 (() => 5299 { 5300 const { fetch: originalFetch } = window; 5301 5302 window.fetch = async (...args) => 5303 { 5304 let [resource, config ] = args; 5305 5306 let targetUrl = (resource instanceof Request) ? resource.url : resource.toString(); 5307 5308 const response = await originalFetch(resource, config); 5309 5310 const json = () => response.clone().json().then((data) => 5311 { 5312 switch (true) 5313 { 5314 case -1 !== targetUrl.indexOf('removeItem'): 5315 5316 if (data.hasOwnProperty('dataLayer') && 'undefined' !== typeof dataLayer) 5317 { 5318 AEC.Cookie.remove(data.dataLayer).push(dataLayer); 5319 } 5320 5321 break; 5322 5323 case -1 !== targetUrl.indexOf('graphql'): 5324 5325 if (!AEC?.Checkout?.data?.payload) 5326 { 5327 break; 5328 } 5329 5330 if (data.hasOwnProperty('data') && data.data.hasOwnProperty('setPaymentMethodOnCart') && 'undefined' !== typeof dataLayer) 5331 { 5332 let method = data.data.setPaymentMethodOnCart.cart.selected_payment_method.title; 5333 5334 ((payload, method) => 5335 { 5336 payload['payment_type'] = method; 5337 5338 dataLayer.push({ ecommerce: null }); 5339 dataLayer.push( 5340 { 5341 event: 'add_payment_info', 5342 ecommerce: payload 5343 }); 5344 5345 })(AEC.Checkout.data.payload, method); 5346 } 5347 5348 if (data.hasOwnProperty('data') && data.data.hasOwnProperty('cart') && 'undefined' !== typeof dataLayer) 5349 { 5350 let methods = []; 5351 5352 data.data.cart.shipping_addresses.forEach(address => 5353 { 5354 methods.push(address.selected_shipping_method); 5355 }); 5356 5357 if (methods.length) 5358 { 5359 methods.forEach(method => 5360 { 5361 ((payload, method) => 5362 { 5363 payload['shipping_tier'] = method.carrier_code; 5364 5365 dataLayer.push({ ecommerce: null }); 5366 dataLayer.push( 5367 { 5368 event: 'add_shipping_info', 5369 ecommerce: payload 5370 }); 5371 5372 })(AEC.Checkout.data.payload.ecommerce, method); 5373 }); 5374 } 5375 } 5376 5377 if (data.hasOwnProperty('data') && data.data.hasOwnProperty('setShippingMethodsOnCart') && 'undefined' !== typeof dataLayer) 5378 { 5379 let methods = []; 5380 5381 data.data.setShippingMethodsOnCart.cart.shipping_addresses.forEach(address => 5382 { 5383 methods.push(address.selected_shipping_method); 5384 }); 5385 5386 if (methods.length) 5387 { 5388 methods.forEach(method => 5389 { 5390 ((payload, method) => 5391 { 5392 payload['shipping_tier'] = method.carrier_code; 5393 5394 dataLayer.push({ ecommerce: null }); 5395 dataLayer.push( 5396 { 5397 event: 'add_shipping_info', 5398 ecommerce: payload 5399 }); 5400 5401 })(AEC.Checkout.data.payload.ecommerce, method); 5402 }); 5403 } 5404 } 5405 5406 break; 5407 } 5408 5409 return data; 5410 }); 5411 5412 response.json = json; 5413 5414 return response; 5415 }; 5416 5417 5418 /** 5419 * Custom variants 5420 */ 5421 AEC.EventDispatcher.on('ec.variants', variants => 5422 { 5423 if (!variants.length) 5424 { 5425 [...document.querySelectorAll('[name^="super_attribute"')].forEac
5425h(input => 5426 { 5427 if (input.parentNode.classList.contains('border-primary')) 5428 { 5429 var name = input.getAttribute('name'), id = name.substring(name.indexOf('[') + 1, name.lastIndexOf(']')); 5430 5431 Object.entries(AEC.SUPER).forEach(([key, attribute]) => 5432 { 5433 if (attribute.id == id) 5434 { 5435 attribute.options.forEach(option => 5436 { 5437 if (option.value_index == input.value) 5438 { 5439 variants.push( 5440 { 5441 id: id, 5442 option: option.value_index, 5443 text: option.label 5444 }); 5445 } 5446 }); 5447 } 5448 }); 5449 } 5450 }); 5451 } 5452 }); 5453 5454 window.addEventListener('add-to-cart', event => 5455 { 5456 let element = [...document.querySelectorAll('[data-event=add_to_cart]')].filter(node => 5457 { 5458 return node.dataset.id === event.detail.product_sku; 5459 }); 5460 5461 if (element) 5462 { 5463 AEC.add(element[0], dataLayer); 5464 } 5465 }); 5466 5467 window.addEventListener('cart-data-updated', event => 5468 { 5469 dataLayer.push( 5470 { 5471 event: 'update_cart', 5472 payload: event.detail.cart 5473 }); 5474 }); 5475 5476 window.addEventListener('checkout:payment:method-activate', event => 5477 { 5478 ((payload, method) => 5479 { 5480 document.querySelectorAll('label[for="payment-method-' + method + '"]').forEach(label => 5481 { 5482 let title = label.textContent.trim(), method_code = event.detail.method; 5483 5484 (title => 5485 { 5486 payload['payment_type'] = title; 5487 5488 dataLayer.push({ ecommerce: null }); 5489 dataLayer.push( 5490 { 5491 event: 'add_payment_info', 5492 ecommerce: payload 5493 }); 5494 5495 })(title); 5496 5497 5498 }); 5499 5500 })(AEC.Checkout.data.payload, event.detail.method); 5501 }); 5502 5503 window.addEventListener('checkout:payment:method-activate', event => 5504 { 5505 ((payload, method) => 5506 { 5507 document.querySelectorAll('label[for="payment-method-' + method + '"]').forEach(label => 5508 { 5509 let title = label.textContent.trim(), method_code = event.detail.method; 5510 5511 (title => 5512 { 5513 payload['payment_type'] = title; 5514 5515 dataLayer.push({ ecommerce: null }); 5516 dataLayer.push( 5517 { 5518 event: 'add_payment_info', 5519 ecommerce: payload 5520 }); 5521 5522 })(title); 5523 5524 5525 }); 5526 5527 })(AEC.Checkout.data.payload, event.detail.method); 5528 }); 5529 5530 window.addEventListener('checkout:shipping:method-activate', event => 5531 { 5532 ((payload, method) => 5533 { 5534 (title => 5535 { 5536 payload['shipping_tier'] = title; 5537 5538 dataLayer.push({ ecommerce: null }); 5539 dataLayer.push( 5540 { 5541 event: 'add_shipping_info', 5542 ecommerce: payload 5543 }); 5544 5545 })(method); 5546 5547 })(AEC.Checkout.data.payload, event.detail.method); 5548 }); 5549 5550 window.addEventListener('load', event => 5551 { 5552 let observer_payment = new MutationObserver(function(mutations) 5553 { 5554 mutations.forEach(mutationRecord => 5555 { 5556 if (mutationRecord.target.classList.contains('active')) 5557 { 5558 ((payload, method) => 5559 { 5560 payload['event'] = 'add_payment_info'; 5561 payload['payment_type'] = method; 5562 5563 dataLayer.push({ ecommerce: null }); 5564 dataLayer.push(payload); 5565 5566 })(AEC.Checkout.data.payload, mutationRecord.target.id); 5567 } 5568 }) 5569 }); 5570 5571 let observer_shipping = new MutationObserver(function(mutations) 5572 { 5573 mutations.forEach(mutationRecord => 5574 { 5575 if (mutationRecord.target.classList.contains('active')) 5576 { 5577 ((payload, method) => 5578 { 5579 payload['event'] = 'add_shipping_info'; 5580 payload['shipping_tier'] = method; 5581 5582 dataLayer.push({ ecommerce: null }); 5583 dataLayer.push(payload); 5584 5585 })(AEC.Checkout.data.payload, mutationRecord.target.id); 5586 } 5587 }) 5588 }); 5589 5590 document.querySelectorAll("ol[id=payment-method-list] li").forEach(target => 5591 { 5592 observer_payment.observe(target, 5593 { 5594 attributes:true, 5595 attributeFilter:['style', 'class'] 5596 }); 5597 }); 5598 5599 document.querySelectorAll("ol[id=shipping-method-list] li").forEach(target => 5600 {
5601 observer_shipping.observe(target, 5602 { 5603 attributes:true, 5604 attributeFilter:['style', 'class'] 5605 }); 5606 }); 5607 }); 5608 5609 })();</script>
5609<script type="text/json" id="default-section-data"> 5610 {"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"cart":[],"directory-data":{"AT":{"name":"Oostenrijk","regions":{"102":{"code":"BL","name":"Burgenland"},"99":{"code":"KN","name":"K\u00e4rnten"},"96":{"code":"NO","name":"Nieder\u00f6sterreich"},"97":{"code":"OO","name":"Ober\u00f6sterreich"},"98":{"code":"SB","name":"Salzburg"},"100":{"code":"ST","name":"Steiermark"},"101":{"code":"TI","name":"Tirol"},"103":{"code":"VB","name":"Voralberg"},"95":{"code":"WI","name":"Wien"}}},"BE":{"name":"Belgi\u00eb","regions":{"913":{"code":"VAN","name":"Antwerpen"},"914":{"code":"WBR","name":"Brabant wallon"},"915":{"code":"BRU","name":"Brussels-Capital Region"},"916":{"code":"WHT","name":"Hainaut"},"918":{"code":"WLG","name":"Li\u00e8ge"},"917":{"code":"VLI","name":"Limburg"},"919":{"code":"WLX","name":"Luxembourg"},"920":{"code":"WNA","name":"Namur"},"921":{"code":"VOV","name":"Oost-Vlaanderen"},"922":{"code":"VBR","name":"Vlaams-Brabant"},"923":{"code":"VWV","name":"West-Vlaanderen"}}},"CH":{"name":"Zwitserland","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":"Duitsland","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"}}},"FR":{"name":"Frankrijk","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"},"743":{"code":"GP","name":"Guadeloupe"},"744":{"code":"GF","name":"Guyane"},"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"}
5610,"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"},"747":{"code":"RE","name":"La R\u00e9union"},"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"},"745":{"code":"MQ","name":"Martinique"},"235":{"code":"53","name":"Mayenne"},"746":{"code":"YT","name":"Mayotte"},"236":{"code":"54","name":"Meurthe-et-Moselle"},"237":{"code":"55","name":"Meuse"},"238":{"code":"56","name":"Morbihan"},"239":{"code":"57","name":"Moselle"},"240":{"code":"58","name":"Ni\u00e8vre"},"241":{"code":"59","name":"Nord"},"242":{"code":"60","name":"Oise"},"243":{"code":"61","name":"Orne"},"257":{"code":"75","name":"Paris"},"244":{"code":"62","name":"Pas-de-Calais"},"245":{"code":"63","name":"Puy-de-D\u00f4me"},"246":{"code":"64","name":"Pyr\u00e9n\u00e9es-Atlantiques"},"248":{"code":"66","name":"Pyr\u00e9n\u00e9es-Orientales"},"251":{"code":"69","name":"Rh\u00f4ne"},"253":{"code":"71","name":"Sa\u00f4ne-et-Loire"},"254":{"code":"72","name":"Sarthe"},"255":{"code":"73","name":"Savoie"},"259":{"code":"77","name":"Seine-et-Marne"},"258":{"code":"76","name":"Seine-Maritime"},"275":{"code":"93","name":"Seine-Saint-Denis"},"262":{"code":"80","name":"Somme"},"263":{"code":"81","name":"Tarn"},"264":{"code":"82","name":"Tarn-et-Garonne"},"272":{"code":"90","name":"Territoire-de-Belfort"},"277":{"code":"95","name":"Val-d'Oise"},"276":{"code":"94","name":"Val-de-Marne"},"265":{"code":"83","name":"Var"},"266":{"code":"84","name":"Vaucluse"},"267":{"code":"85","name":"Vend\u00e9e"},"268":{"code":"86","name":"Vienne"},"270":{"code":"88","name":"Vosges"},"271":{"code":"89","name":"Yonne"},"260":{"code":"78","name":"Yvelines"}}},"NL":{"name":"Nederland"},"data_id":1791185164},"loggedAsCustomer":[],"captcha":[],"persistent":[],"review":[],"wishlist":{"items":[]},"hyva_checkout":[],"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[]}</script>
5610<script> 5611 window.rumv = window.rumv || function() { (window.rumv.q = window.rumv.q || []).push(arguments) }; 5612 (function(rum, vi,si,on) { 5613 var s = JSON.parse( sessionStorage.getItem('rumv') || '{"pageviews":0}' ); s.pageviews++; 5614 if ( s.urls && s.regex && ( s.page = eval('('+s.regex+')')( s.urls, vi.location.pathname ) ) && !s.page.type ) { 5615 return sessionStorage.setItem('rumv', JSON.stringify( s ) ); 5616 } 5617 5618 vi.rumv.storage = s; 5619 var head = si.querySelector('head'), js = si.createElement('script'); 5620 js.src = 'https://d5yoctgpv4cpx.cloudfront.net/'+rum+'/v4-'+vi.location.hostname+'.js'; 5621 head.appendChild(js); 5622 })( 'RUM\u002DB0723E5AFA', window, document, 'voetbalshirtskoning.nl' );</script>
5622</div>
5622<script type="text/x-magento-init">{"*": 5623 {"Magento_Persistent/js/remember-me-config": { 5624 "config": {"persistenceConfig":{"isRememberMeCheckboxVisible":true,"isRememberMeCheckboxChecked":true}} 5625 }}}</script>
5625</body> 5626</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.