{"id":6858,"date":"2025-06-07T09:43:41","date_gmt":"2025-06-07T08:43:41","guid":{"rendered":"https:\/\/x-cube.nl\/locatie-delft\/"},"modified":"2026-04-14T22:36:06","modified_gmt":"2026-04-14T21:36:06","slug":"locatie-delft","status":"publish","type":"page","link":"https:\/\/x-cube.nl\/nl\/locatie-delft\/","title":{"rendered":"Locatie: Delft"},"content":{"rendered":"<div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:54px;--awb-padding-bottom:57px;--awb-margin-top:0px;--awb-background-color:var(--awb-color2);--awb-background-image:linear-gradient(180deg, var(--awb-color2) 0%,var(--awb-color4) 100%);--awb-flex-wrap:wrap;\" ><div class=\"awb-background-pattern\" style=\"background-image:  url(data:image\/svg+xml;utf8,%3Csvg%20width%3D%2280%22%20height%3D%22120%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20clip-path%3D%22url%28%23prefix__clip0_43_320%29%22%20fill%3D%22rgba%28255%2C255%2C255%2C0.02%29%22%3E%3Cpath%20d%3D%22M40%200L0%2030v30l40-30V0zm0%2030v30l40%2030V60L40%2030zM40-30V0l40%2030V0L40-30zm0%2090L0%2090v30l40-30V60zm0%2030v30l40%2030v-30L40%2090z%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3CclipPath%20id%3D%22prefix__clip0_43_320%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M0%200h80v120H0z%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E);opacity: 1 ;mix-blend-mode:normal;\"><\/div><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1248px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_2_3 2_3 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:66.666666666667%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.88%;--awb-margin-bottom-large:20px;--awb-spacing-left-large:2.88%;--awb-width-medium:66.666666666667%;--awb-order-medium:0;--awb-spacing-right-medium:2.88%;--awb-spacing-left-medium:2.88%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-1 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:var(--awb-color7);--awb-margin-top-small:10px;--awb-margin-right-small:0px;--awb-margin-bottom-small:10px;--awb-margin-left-small:0px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:48;line-height:var(--awb-typography1-line-height);\">Bleekemolens Race Planet<\/h2><\/div><div class=\"fusion-title title fusion-title-2 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-text-color:var(--awb-custom_color_3);--awb-margin-top:-10px;--awb-margin-top-small:-15px;--awb-margin-right-small:0px;--awb-margin-bottom-small:10px;--awb-margin-left-small:0px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:36;line-height:var(--awb-typography1-line-height);\">Delft<\/h3><\/div><div ><a class=\"fusion-button button-flat fusion-button-default-size button-custom fusion-button-default button-1 fusion-button-span-no fusion-button-default-type\" style=\"--button_accent_color:var(--awb-color7);--button_accent_hover_color:var(--awb-color7);--button_border_hover_color:var(--awb-color4);--button_gradient_top_color:var(--awb-custom_color_3);--button_gradient_bottom_color:var(--awb-custom_color_3);--button_gradient_top_color_hover:hsla(var(--awb-color2-h),calc(var(--awb-color2-s) - 5%),calc(var(--awb-color2-l) - 10%),var(--awb-color2-a));--button_gradient_bottom_color_hover:hsla(var(--awb-color2-h),calc(var(--awb-color2-s) - 5%),calc(var(--awb-color2-l) - 10%),var(--awb-color2-a));--button_font_size:20px;--button_typography-font-family:&quot;Bungee&quot;;--button_typography-font-style:normal;--button_typography-font-weight:400;\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https:\/\/reserveren-delft.raceplanet.nl\/products?activiteiten=x-cube&amp;utm_source=x-cube&amp;utm_medium=referral&amp;utm_campaign=locatie-delft\"><i class=\"fa-shopping-cart fas awb-button__icon awb-button__icon--default button-icon-left\" aria-hidden=\"true\"><\/i><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Nu boeken<\/span><\/a><\/div><div class=\"fusion-text fusion-text-1\" style=\"--awb-text-color:var(--awb-color7);--awb-margin-top:20px;\"><p data-start=\"1581\" data-end=\"1998\">Ben je op zoek naar een leuke, spannende en originele activiteit in Delft? Ontdek de <strong data-start=\"1654\" data-end=\"1685\">X-Cube bij Race Planet Delft<\/strong> \u2013 een unieke escape-achtige ervaring waarin teamwork, technologie en adrenaline samenkomen. De X-Cube is een digitale escape room van de volgende generatie, waarin jij en je groep puzzels oplossen, minigames spelen en samenwerken op gigantische interactieve schermen \u2013 allemaal onder tijdsdruk en met meeslepende licht- en geluidseffecten.  <\/p>\n<p data-start=\"2000\" data-end=\"2369\">Bij Race Planet Delft is er <strong data-start=\"2034\" data-end=\"2049\">een X-Cube<\/strong> beschikbaar. Je kan met <strong data-start=\"2079\" data-end=\"2115\">2 tot 6 spelers tegelijkertijd spelen<\/strong>. De X-Cube bevind zich op de eerste verdieping in een priv\u00e9, gesloten ruimte direct tegenover de bar.   This means you\u2019ll have no background noise, so you can fully concentrate on the game and your teammates.<\/p>\n<p data-start=\"2371\" data-end=\"2775\">De X-Cube is geschikt voor alle leeftijden \u2013 van gezinnen en kinderfeestjes tot vriendengroepen en bedrijfsuitjes. Je kunt kiezen uit een breed aanbod aan games: los een mysterieuze moord op in <em data-start=\"2555\" data-end=\"2578\">Murder at the Mansion<\/em>, train als geheim agent in <em data-start=\"2607\" data-end=\"2621\">Spy Training<\/em> of speel hilarische minigames in <em data-start=\"2655\" data-end=\"2675\">The Crazy Gameshow<\/em>. Wil je n\u00f3g meer actie? Combineer je bezoek dan met indoor karten of bowlen voor het ultieme dagje uit.   <\/p>\n<\/div><div class=\"fusion-image-carousel fusion-image-carousel-auto fusion-image-carousel-1\" style=\"margin-top:20px;margin-bottom:20px;\"><div data-slide-effect=\"fade\" class=\"awb-carousel awb-swiper awb-swiper-carousel awb-carousel--slider awb-swiper-dots-position-bottom\" data-layout=\"slider\" data-autoplay=\"no\" data-autoplayspeed=\"2500\" data-autoplaypause=\"no\" data-loop=\"yes\" data-columns=\"5\" data-columnsmedium=\"1\" data-columnssmall=\"1\" data-itemmargin=\"13\" data-itemwidth=\"180\" data-touchscroll=\"no\" data-freemode=\"no\" data-imagesize=\"auto\" data-scrollitems=\"0\" data-centeredslides=\"no\" data-rotationangle=\"50\" data-depth=\"100\" data-speed=\"500\" data-shadow=\"yes\" data-pagination=\"bullets\" style=\"--awb-border-radius-top-left:20px;--awb-border-radius-top-right:20px;--awb-border-radius-bottom-right:20px;--awb-border-radius-bottom-left:20px;--awb-arrow-size:30px;--awb-arrow-color:var(--awb-color7);--awb-dots-align:center;\"><div class=\"swiper-wrapper awb-image-carousel-wrapper fusion-flex-align-items-center\"><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"1200\" height=\"630\" src=\"https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/d5c423b33e1df6b5171a883a36fe8203e6c73d55.jpg\" class=\"attachment-full size-full\" alt=\"\" srcset=\"https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/d5c423b33e1df6b5171a883a36fe8203e6c73d55-200x105.jpg 200w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/d5c423b33e1df6b5171a883a36fe8203e6c73d55-300x158.jpg 300w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/d5c423b33e1df6b5171a883a36fe8203e6c73d55-400x210.jpg 400w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/d5c423b33e1df6b5171a883a36fe8203e6c73d55-600x315.jpg 600w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/d5c423b33e1df6b5171a883a36fe8203e6c73d55-768x403.jpg 768w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/d5c423b33e1df6b5171a883a36fe8203e6c73d55-800x420.jpg 800w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/d5c423b33e1df6b5171a883a36fe8203e6c73d55-1024x538.jpg 1024w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/d5c423b33e1df6b5171a883a36fe8203e6c73d55.jpg 1200w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" \/><\/div><\/div><\/div><div class=\"swiper-slide\"><div class=\"fusion-carousel-item-wrapper\"><div class=\"fusion-image-wrapper hover-type-none\"><img decoding=\"async\" width=\"1280\" height=\"720\" src=\"https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/maxresdefault.jpg\" class=\"attachment-full size-full\" alt=\"\" srcset=\"https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/maxresdefault-200x113.jpg 200w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/maxresdefault-300x169.jpg 300w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/maxresdefault-400x225.jpg 400w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/maxresdefault-600x338.jpg 600w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/maxresdefault-768x432.jpg 768w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/maxresdefault-800x450.jpg 800w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/maxresdefault-1024x576.jpg 1024w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/maxresdefault-1200x675.jpg 1200w, https:\/\/x-cube.nl\/wp-content\/uploads\/2025\/06\/maxresdefault.jpg 1280w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><\/div><\/div><\/div><\/div><div class=\"awb-swiper-button awb-swiper-button-prev\"><i class=\"awb-icon-angle-left\" aria-hidden=\"true\"><\/i><\/div><div class=\"awb-swiper-button awb-swiper-button-next\"><i class=\"awb-icon-angle-right\" aria-hidden=\"true\"><\/i><\/div><\/div><\/div><div ><a class=\"fusion-button button-flat fusion-button-default-size button-custom fusion-button-default button-2 fusion-button-span-no fusion-button-default-type\" style=\"--button_accent_color:var(--awb-color7);--button_accent_hover_color:var(--awb-color7);--button_border_hover_color:var(--awb-color4);--button_gradient_top_color:var(--awb-custom_color_3);--button_gradient_bottom_color:var(--awb-custom_color_3);--button_gradient_top_color_hover:hsla(var(--awb-color2-h),calc(var(--awb-color2-s) - 5%),calc(var(--awb-color2-l) - 10%),var(--awb-color2-a));--button_gradient_bottom_color_hover:hsla(var(--awb-color2-h),calc(var(--awb-color2-s) - 5%),calc(var(--awb-color2-l) - 10%),var(--awb-color2-a));--button_font_size:20px;--button_typography-font-family:&quot;Bungee&quot;;--button_typography-font-style:normal;--button_typography-font-weight:400;\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https:\/\/reserveren-delft.raceplanet.nl\/products?activiteiten=x-cube&amp;utm_source=x-cube&amp;utm_medium=referral&amp;utm_campaign=locatie-delft\"><i class=\"fa-shopping-cart fas awb-button__icon awb-button__icon--default button-icon-left\" aria-hidden=\"true\"><\/i><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Ga naar Race Planet om te reserveren<\/span><\/a><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_3 1_3 fusion-flex-column\" style=\"--awb-padding-top:20px;--awb-padding-right:20px;--awb-padding-bottom:29px;--awb-padding-left:20px;--awb-overflow:hidden;--awb-bg-color:rgba(84,60,255,0.18);--awb-bg-color-hover:rgba(84,60,255,0.18);--awb-bg-size:cover;--awb-border-color:rgba(255,255,255,0.35);--awb-border-top:0.5px;--awb-border-right:0.5px;--awb-border-bottom:0.5px;--awb-border-left:0.5px;--awb-border-style:solid;--awb-border-radius:10px 10px 10px 10px;--awb-width-large:33.333333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:5.76%;--awb-margin-bottom-large:20px;--awb-spacing-left-large:5.76%;--awb-width-medium:33.333333333333%;--awb-order-medium:0;--awb-spacing-right-medium:5.76%;--awb-spacing-left-medium:5.76%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div ><a class=\"fusion-button button-flat fusion-button-default-size button-custom fusion-button-default button-3 fusion-button-span-yes fusion-button-default-type\" style=\"--button_accent_color:var(--awb-color7);--button_accent_hover_color:var(--awb-color7);--button_border_hover_color:var(--awb-color4);--button_gradient_top_color:var(--awb-custom_color_3);--button_gradient_bottom_color:var(--awb-custom_color_3);--button_gradient_top_color_hover:hsla(var(--awb-color2-h),calc(var(--awb-color2-s) - 5%),calc(var(--awb-color2-l) - 10%),var(--awb-color2-a));--button_gradient_bottom_color_hover:hsla(var(--awb-color2-h),calc(var(--awb-color2-s) - 5%),calc(var(--awb-color2-l) - 10%),var(--awb-color2-a));--button_font_size:20px;--button_typography-font-family:&quot;Bungee&quot;;--button_typography-font-style:normal;--button_typography-font-weight:400;\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https:\/\/reserveren-delft.raceplanet.nl\/products?activiteiten=x-cube&amp;utm_source=x-cube&amp;utm_medium=referral&amp;utm_campaign=locatie-delft\"><i class=\"fa-shopping-cart fas awb-button__icon awb-button__icon--default button-icon-left\" aria-hidden=\"true\"><\/i><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Nu boeken<\/span><\/a><\/div><div class=\"fusion-text fusion-text-2\" style=\"--awb-font-size:25px;--awb-text-color:var(--awb-color7);--awb-margin-top:20px;--awb-text-font-family:&quot;Bungee&quot;;--awb-text-font-style:normal;--awb-text-font-weight:400;\"><p>Informatie<\/p>\n<\/div><div class=\"fusion-builder-row fusion-builder-row-inner fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"--awb-flex-grow:0;--awb-flex-grow-medium:0;--awb-flex-grow-small:0;--awb-flex-shrink:0;--awb-flex-shrink-medium:0;--awb-flex-shrink-small:0;width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-0 fusion_builder_column_inner_1_6 1_6 fusion-flex-column\" style=\"--awb-padding-top:0px;--awb-padding-right:-20px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-bg-size:cover;--awb-width-large:16.666666666667%;--awb-margin-top-large:0px;--awb-spacing-right-large:11.52%;--awb-margin-bottom-large:3px;--awb-spacing-left-large:11.52%;--awb-width-medium:16.666666666667%;--awb-order-medium:0;--awb-spacing-right-medium:11.52%;--awb-spacing-left-medium:11.52%;--awb-width-small:20%;--awb-order-small:0;--awb-spacing-right-small:9.6%;--awb-spacing-left-small:9.6%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><i class=\"fb-icon-element-1 fb-icon-element fontawesome-icon fa-clock fas circle-yes fusion-text-flow\" style=\"--awb-iconcolor:var(--awb-color7);--awb-iconcolor-hover:var(--awb-color7);--awb-circlecolor:rgba(255,63,146,0);--awb-circlecolor-hover:var(--awb-custom_color_3);--awb-circlebordercolor-hover:var(--awb-color8);--awb-circlebordersize:0px;--awb-font-size:20px;--awb-width:29px;--awb-height:29px;--awb-line-height:29px;--awb-margin-right:10px;\"><\/i><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-1 fusion_builder_column_inner_4_5 4_5 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:80%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.4%;--awb-margin-bottom-large:-20px;--awb-spacing-left-large:0%;--awb-width-medium:80%;--awb-order-medium:0;--awb-spacing-right-medium:2.4%;--awb-spacing-left-medium:0%;--awb-width-small:66.666666666667%;--awb-order-small:0;--awb-spacing-right-small:2.88%;--awb-spacing-left-small:0%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-column\"><div class=\"fusion-text fusion-text-3\" style=\"--awb-font-size:18px;--awb-text-color:var(--awb-custom_color_3);--awb-text-font-family:&quot;Montserrat&quot;;--awb-text-font-style:normal;--awb-text-font-weight:700;\"><p>Openingstijden<\/p>\n<\/div><\/div><\/div><\/div><div class=\"fusion-text fusion-text-4\" style=\"--awb-text-color:var(--awb-color7);--awb-margin-top:10px;\"><div class=\"openingstijden\">\n<div><span class=\"dag\">Maandag <\/span><span class=\"tijd\">12:00 &#8211; 22:00<\/span><\/div>\n<div><span class=\"dag\">Dinsdag <\/span><span class=\"tijd\">12:00 &#8211; 22:00<\/span><\/div>\n<div><span class=\"tijd\">Woensdag 12:00 &#8211; 22:00<\/span><\/div>\n<div><span class=\"dag\">Donderdag <\/span><span class=\"tijd\">12:00 &#8211; 22:00<\/span><\/div>\n<div><span class=\"dag\">Vrijdag <\/span><span class=\"tijd\">12:00 &#8211; 22:00<\/span><\/div>\n<div><span class=\"dag\">Zaterdag <\/span><span class=\"tijd\">10:00 &#8211; 00:00<\/span><\/div>\n<div><span class=\"dag\">Zondag <\/span><span class=\"tijd\">10:00 &#8211; 22:00<\/span><\/div>\n<div><\/div>\n<div><\/div>\n<\/div>\n<div><strong data-start=\"67\" data-end=\"83\">Let op:<\/strong> Openingtijden kunnen afwijken tijdens feestdagen en in vakanties.<\/div>\n<\/div><div class=\"fusion-separator fusion-full-width-sep\" style=\"align-self: center;margin-left: auto;margin-right: auto;margin-top:20px;width:100%;\"><div class=\"fusion-separator-border sep-single sep-dotted\" style=\"--awb-height:20px;--awb-amount:20px;--awb-sep-color:rgba(255,255,255,0.32);border-color:rgba(255,255,255,0.32);border-top-width:1px;\"><\/div><\/div><div class=\"fusion-builder-row fusion-builder-row-inner fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"--awb-flex-grow:0;--awb-flex-grow-medium:0;--awb-flex-grow-small:0;--awb-flex-shrink:0;--awb-flex-shrink-medium:0;--awb-flex-shrink-small:0;width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-2 fusion_builder_column_inner_1_6 1_6 fusion-flex-column\" style=\"--awb-padding-top:0px;--awb-padding-right:-20px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-bg-size:cover;--awb-width-large:16.666666666667%;--awb-margin-top-large:16px;--awb-spacing-right-large:11.52%;--awb-margin-bottom-large:3px;--awb-spacing-left-large:11.52%;--awb-width-medium:16.666666666667%;--awb-order-medium:0;--awb-spacing-right-medium:11.52%;--awb-spacing-left-medium:11.52%;--awb-width-small:20%;--awb-order-small:0;--awb-spacing-right-small:9.6%;--awb-spacing-left-small:9.6%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><i class=\"fb-icon-element-2 fb-icon-element fontawesome-icon fa-map-marker fas circle-yes fusion-text-flow\" style=\"--awb-iconcolor:var(--awb-color7);--awb-iconcolor-hover:var(--awb-color7);--awb-circlecolor:rgba(255,63,146,0);--awb-circlecolor-hover:var(--awb-custom_color_3);--awb-circlebordercolor-hover:var(--awb-color8);--awb-circlebordersize:0px;--awb-font-size:20px;--awb-width:29px;--awb-height:29px;--awb-line-height:29px;--awb-margin-right:10px;\"><\/i><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-3 fusion_builder_column_inner_4_5 4_5 fusion-flex-column\" style=\"--awb-padding-top:18px;--awb-bg-size:cover;--awb-width-large:80%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.4%;--awb-margin-bottom-large:-20px;--awb-spacing-left-large:0%;--awb-width-medium:80%;--awb-order-medium:0;--awb-spacing-right-medium:2.4%;--awb-spacing-left-medium:0%;--awb-width-small:66.666666666667%;--awb-order-small:0;--awb-spacing-right-small:2.88%;--awb-spacing-left-small:0%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-column\"><div class=\"fusion-text fusion-text-5\" style=\"--awb-font-size:18px;--awb-text-color:var(--awb-custom_color_3);--awb-text-font-family:&quot;Montserrat&quot;;--awb-text-font-style:normal;--awb-text-font-weight:700;\"><p>Adres<\/p>\n<\/div><\/div><\/div><\/div><div class=\"fusion-text fusion-text-6\" style=\"--awb-text-color:var(--awb-color7);--awb-margin-top:10px;\"><p><strong>Race Planet Delft<br \/>\n<\/strong>Kleveringweg 18<br \/>\n2616 LZ Delft<br \/>\n+31 (0)15 212 7125<\/p>\n<div><\/div>\n<\/div><div style=\"text-align:left;\"><a class=\"fusion-button button-flat button-medium button-custom fusion-button-default button-4 fusion-button-default-span fusion-button-default-type awb-b-icon-pos-left\" style=\"--button_accent_color:var(--awb-color7);--button_border_color:var(--awb-color7);--button_accent_hover_color:var(--awb-color7);--button_border_hover_color:var(--awb-color4);--button-border-radius-top-left:30px;--button-border-radius-top-right:30px;--button-border-radius-bottom-right:30px;--button-border-radius-bottom-left:30px;--button_gradient_angle:45deg;--button_gradient_top_color:var(--awb-custom_color_2);--button_gradient_bottom_color:var(--awb-custom_color_2);--button_gradient_top_color_hover:hsla(var(--awb-color2-h),calc(var(--awb-color2-s) - 5%),calc(var(--awb-color2-l) - 10%),var(--awb-color2-a));--button_gradient_bottom_color_hover:hsla(var(--awb-color2-h),calc(var(--awb-color2-s) - 5%),calc(var(--awb-color2-l) - 10%),var(--awb-color2-a));--button_text_transform:uppercase;--button_typography-letter-spacing:1px;--button_typography-font-family:&quot;Montserrat&quot;;--button_typography-font-style:normal;--button_typography-font-weight:600;\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" data-hover=\"icon_position\" href=\"https:\/\/www.google.com\/maps\/dir\/?api=1&amp;destination=Kleveringweg+18,+2616+LZ+Delft\"><i class=\"fa-map-marker-alt fas awb-button__icon awb-button__icon--default button-icon-left\" aria-hidden=\"true\"><\/i><i class=\"fa-map-marker-alt fas awb-button__icon awb-button__icon--default button-icon-left\" aria-hidden=\"true\"><\/i><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Route<\/span><\/a><\/div><div class=\"fusion-text fusion-text-7\" style=\"--awb-text-color:var(--awb-color7);--awb-margin-top:10px;\"><div class=\"openingstijden\">\n<p>&nbsp;<\/p>\n<div><strong>Steden dichtbij<\/strong><\/div>\n<div><span class=\"dag\">The Hague<\/span><span class=\"tijd\">10,0 km<\/span><\/div>\n<div><span class=\"dag\">Rotterdam <\/span><span class=\"tijd\">15,0 km<\/span><\/div>\n<div><span class=\"dag\">Zoetermeer<\/span><span class=\"tijd\">20,0 km<\/span><\/div>\n<div><span class=\"dag\">Leiden<\/span><span class=\"tijd\">30,0 km<\/span><\/div>\n<div><span class=\"dag\">Dordrecht<\/span><span class=\"tijd\">35,0 km<\/span><\/div>\n<\/div>\n<div><\/div>\n<\/div><div class=\"fusion-separator fusion-full-width-sep\" style=\"align-self: center;margin-left: auto;margin-right: auto;margin-top:20px;width:100%;\"><div class=\"fusion-separator-border sep-single sep-dotted\" style=\"--awb-height:20px;--awb-amount:20px;--awb-sep-color:rgba(255,255,255,0.32);border-color:rgba(255,255,255,0.32);border-top-width:1px;\"><\/div><\/div><div class=\"fusion-text fusion-text-8\" style=\"--awb-font-size:13px;--awb-text-color:var(--awb-color7);\"><\/div><div class=\"fusion-builder-row fusion-builder-row-inner fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"--awb-flex-grow:0;--awb-flex-grow-medium:0;--awb-flex-grow-small:0;--awb-flex-shrink:0;--awb-flex-shrink-medium:0;--awb-flex-shrink-small:0;width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-4 fusion_builder_column_inner_1_6 1_6 fusion-flex-column\" style=\"--awb-padding-top:0px;--awb-padding-right:-20px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-bg-size:cover;--awb-width-large:16.666666666667%;--awb-margin-top-large:16px;--awb-spacing-right-large:11.52%;--awb-margin-bottom-large:3px;--awb-spacing-left-large:11.52%;--awb-width-medium:16.666666666667%;--awb-order-medium:0;--awb-spacing-right-medium:11.52%;--awb-spacing-left-medium:11.52%;--awb-width-small:20%;--awb-order-small:0;--awb-spacing-right-small:9.6%;--awb-spacing-left-small:9.6%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><i class=\"fb-icon-element-3 fb-icon-element fontawesome-icon fa-info fas circle-yes fusion-text-flow\" style=\"--awb-iconcolor:var(--awb-color7);--awb-iconcolor-hover:var(--awb-color7);--awb-circlecolor:rgba(255,63,146,0);--awb-circlecolor-hover:var(--awb-custom_color_3);--awb-circlebordercolor-hover:var(--awb-color8);--awb-circlebordersize:0px;--awb-font-size:20px;--awb-width:29px;--awb-height:29px;--awb-line-height:29px;--awb-margin-right:10px;\"><\/i><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-5 fusion_builder_column_inner_4_5 4_5 fusion-flex-column\" style=\"--awb-padding-top:18px;--awb-bg-size:cover;--awb-width-large:80%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.4%;--awb-margin-bottom-large:-20px;--awb-spacing-left-large:0%;--awb-width-medium:80%;--awb-order-medium:0;--awb-spacing-right-medium:2.4%;--awb-spacing-left-medium:0%;--awb-width-small:66.666666666667%;--awb-order-small:0;--awb-spacing-right-small:2.88%;--awb-spacing-left-small:0%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-column\"><div class=\"fusion-text fusion-text-9\" style=\"--awb-font-size:18px;--awb-text-color:var(--awb-custom_color_3);--awb-text-font-family:&quot;Montserrat&quot;;--awb-text-font-style:normal;--awb-text-font-weight:700;\"><p>X-Cube informatie<\/p>\n<\/div><\/div><\/div><\/div><div class=\"fusion-text fusion-text-10\" style=\"--awb-text-color:var(--awb-color7);--awb-margin-top:10px;\"><p>De locatie heeft 1<strong data-start=\"2624\" data-end=\"2637\"> X-Cube<\/strong> geschikt voor 6 spelers.<br data-start=\"2658\" data-end=\"2661\">De X-Cube bevind zich op de <strong data-start=\"2692\" data-end=\"2707\">eerste verdieping<\/strong>, direct tegenover de bar ruimte.<br data-start=\"2743\" data-end=\"2746\">Het staat in een  <strong data-start=\"2767\" data-end=\"2791\">aparte, stille ruimte<\/strong>, dus er is geen achtergrondgeluid &#8211; ideaal voor focus en samenwerking.<br data-start=\"2855\" data-end=\"2858\">Alle X-Cube games zijn beschikbaar voor deze locatie.<\/p>\n<\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-padding-bottom:0px;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:20px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><!-- Include Mapbox GL CSS -->\r\n<link href=\"https:\/\/api.mapbox.com\/mapbox-gl-js\/v3.2.0\/mapbox-gl.css\" rel=\"stylesheet\">\r\n\r\n<!-- Include Mapbox GL JS -->\r\n<script src=\"https:\/\/api.mapbox.com\/mapbox-gl-js\/v3.2.0\/mapbox-gl.js\"><\/script>\r\n\r\n<!-- Include Mapbox GL Geocoder CSS -->\r\n<script src=\"https:\/\/api.mapbox.com\/mapbox-gl-js\/plugins\/mapbox-gl-geocoder\/v5.0.0\/mapbox-gl-geocoder.min.js\"><\/script>\r\n<link rel=\"stylesheet\"\r\n    href=\"https:\/\/api.mapbox.com\/mapbox-gl-js\/plugins\/mapbox-gl-geocoder\/v5.0.0\/mapbox-gl-geocoder.css\" type=\"text\/css\">\r\n\r\n<!-- Preconnect to Google Fonts -->\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap\"\r\n    rel=\"stylesheet\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n<style>\r\n    body {\r\n        margin: 0px;\r\n        padding: 0px;\r\n        font-family: \"Montserrat\", sans-serif;\r\n        font-optical-sizing: auto;\r\n        font-weight: normal;\r\n        font-style: normal;\r\n    }\r\n\r\n    .map-wrapper {\r\n        max-width: 100%;\r\n        width: 100%;\r\n        margin: 0 auto;\r\n    }\r\n\r\n    .map-wrapper_inner {\r\n        width: 100%;\r\n        display: flex;\r\n        flex-direction: column;\r\n        align-items: center;\r\n        position: relative;\r\n    }\r\n\r\n    .aside-section {\r\n        position: absolute;\r\n        left: 0px;\r\n        width: 40%;\r\n        height: auto;\r\n        max-height: 100%;\r\n        margin: 10px;\r\n        z-index: 2;\r\n        box-shadow: 0px 0px 0.25rem #4f4444;\r\n        border-radius: 0.25rem;\r\n        background-color: #fff;\r\n        overflow: hidden;\r\n    }\r\n\r\n    .geocoder {\r\n        width: 100%;\r\n    }\r\n\r\n    .suggestions-wrapper {\r\n        display: none;\r\n    }\r\n\r\n    .location-list {\r\n        width: 100%;\r\n        overflow-y: auto;\r\n        overflow-x: hidden;\r\n        display: none;\r\n    }\r\n\r\n    .location-list::-webkit-scrollbar {\r\n        width: 8px;\r\n    }\r\n\r\n    .location-list::-webkit-scrollbar-thumb {\r\n        background: #9e9e9e;\r\n        border-radius: 8px;\r\n    }\r\n\r\n    .location-list::-webkit-scrollbar-thumb:hover {\r\n        background: #767676;\r\n    }\r\n\r\n    .location-list.show {\r\n        max-height: 50vh;\r\n        display: block;\r\n    }\r\n\r\n    .location-item {\r\n        transition: 0.25s;\r\n        width: 100%;\r\n        border-bottom: 1px solid #ececec;\r\n        padding: 0.8rem 1rem;\r\n        line-height: 1.5rem;\r\n        color: #221f46;\r\n        font-weight: 600;\r\n        text-transform: capitalize;\r\n        cursor: pointer;\r\n        display: flex;\r\n        justify-content: space-between;\r\n        align-items: center;\r\n        box-sizing: border-box;\r\n    }\r\n\r\n    \/* FIX: keyboard focus style for accessibility *\/\r\n    .location-item:focus {\r\n        outline: 2px solid #4A33C9;\r\n        outline-offset: -2px;\r\n        background-color: #f0eeff;\r\n    }\r\n\r\n    .location-item .location {\r\n        display: flex;\r\n        flex-direction: column;\r\n    }\r\n\r\n    .location-item:hover {\r\n        background-color: #ececec;\r\n        padding: 0.8rem 1.25rem;\r\n    }\r\n\r\n    .location-item>* {\r\n        pointer-events: none;\r\n    }\r\n\r\n    .location-item h3 {\r\n        color: #4A33C9 !important;\r\n        font-size: 20px !important;\r\n        line-height: 24px !important;\r\n        margin: 0 !important;\r\n    }\r\n\r\n    .location-item p {\r\n        line-height: 18px !important;\r\n        opacity: 0.75 !important;\r\n        margin: 0 !important;\r\n    }\r\n\r\n    #map {\r\n        width: 100%;\r\n        height: 70vh;\r\n        font-family: \"Montserrat\", sans-serif;\r\n    }\r\n\r\n    .div-marker {\r\n        cursor: pointer;\r\n    }\r\n\r\n    .div-marker.active svg #path-fill {\r\n        fill: #4A33C9;\r\n    }\r\n\r\n    .div-marker>* {\r\n        pointer-events: none;\r\n    }\r\n\r\n    .mapboxgl-ctrl-geocoder {\r\n        min-width: 100%;\r\n    }\r\n\r\n    .mapboxgl-ctrl-geocoder--icon-search {\r\n        display: none !important;\r\n    }\r\n\r\n    .mapboxgl-ctrl-geocoder--input {\r\n        background-color: #F7F7F7 !important;\r\n    }\r\n\r\n    .mapboxgl-popup-content {\r\n        border-width: 0px;\r\n        color: rgb(53 0 85);\r\n        font-family: \"Montserrat\", sans-serif;\r\n        font-size: .875rem;\r\n        line-height: 1.25rem;\r\n        padding: 0;\r\n        height: auto;\r\n        width: fit-content;\r\n        max-width: 20rem;\r\n    }\r\n\r\n    .mapboxgl-popup-close-button {\r\n        padding-top: 0.25rem;\r\n        padding-left: 0.375rem;\r\n        padding-right: 0.375rem;\r\n        font-size: 1.75rem;\r\n    }\r\n\r\n    .mapboxgl-popup-content h2 {\r\n        padding-right: 1rem;\r\n        font-style: italic;\r\n        font-weight: 900;\r\n        font-size: 1.125rem;\r\n        line-height: 1.75rem;\r\n        margin: 0;\r\n    }\r\n\r\n    .mapboxgl-popup-content .popup-content {\r\n        padding: 1rem;\r\n    }\r\n\r\n    .mapboxgl-popup-content .popup-content > div {\r\n        margin-bottom: 0.5rem;\r\n    }\r\n\r\n    \/* FIX: simplified popup button \u2014 no broken glow variables, clean solid style *\/\r\n    .mapboxgl-popup-content a {\r\n        text-decoration: none;\r\n        display: block;\r\n        margin-top: 0.75rem;\r\n    }\r\n\r\n    .mapboxgl-popup-content .btn--pink {\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        background-color: #4A33C9;\r\n        color: #fff;\r\n        font-family: \"Montserrat\", sans-serif;\r\n        font-weight: 700;\r\n        font-size: 0.875rem;\r\n        letter-spacing: 0.05em;\r\n        text-transform: uppercase;\r\n        padding: 0.75rem 1.5rem;\r\n        border-radius: 4px;\r\n        transition: background-color 0.2s ease;\r\n    }\r\n\r\n    .mapboxgl-popup-content .btn--pink:hover {\r\n        background-color: #3826a8;\r\n    }\r\n\r\n    \/* FIX: distance badge in popup *\/\r\n    .popup-distance {\r\n        display: inline-block;\r\n        font-size: 0.75rem;\r\n        font-weight: 500;\r\n        font-style: normal;\r\n        color: #888;\r\n        margin-left: 0.4rem;\r\n    }\r\n\r\n    .header-section {\r\n        display: flex;\r\n        padding: 5px;\r\n    }\r\n\r\n    .toggle-btn {\r\n        background-color: rgb(236, 236, 236);\r\n        border: none;\r\n        margin-right: 0.25rem;\r\n        cursor: pointer;\r\n        font-size: 18px;\r\n        border-radius: 2px;\r\n        padding: 0.25rem;\r\n        width: 36px;\r\n    }\r\n\r\n    @media only screen and (max-width: 700px) {\r\n        .map-wrapper {\r\n            width: 100%;\r\n            max-width: 100%;\r\n        }\r\n\r\n        .aside-section {\r\n            width: 90% !important;\r\n            max-width: 90%;\r\n        }\r\n    }\r\n<\/style>\r\n\r\n<div class=\"map-wrapper\">\r\n    <div class=\"map-wrapper_inner\">\r\n        <div class=\"aside-section\">\r\n            <div class=\"header-section\">\r\n                <!-- FIX: aria-label for accessibility -->\r\n                <button class=\"btn toggle-btn\" id=\"toggle-btn\" aria-label=\"Toggle location list\">&#9776;<\/button>\r\n                <div id=\"geocoder\" class=\"geocoder\"><\/div>\r\n            <\/div>\r\n            <div class=\"location-list\" role=\"list\" aria-label=\"Locations\"><\/div>\r\n        <\/div>\r\n        <div id=\"map\"><\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/PapaParse\/5.4.1\/papaparse.min.js\"\r\n    integrity=\"sha512-dfX5uYVXzyU8+KHqj8bjo7UkOdg18PaOtpa48djpNbZHwExddghZ+ZmzWT06R5v6NSk3ZUfsH6FNEDepLx9hPQ==\"\r\n    crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"><\/script>\r\n\r\n<script>\r\n    mapboxgl.accessToken = 'pk.eyJ1IjoieGN1YmV0ZWNoIiwiYSI6ImNsazB4aG85bTAwNWkzaW92cW4xejhkaHkifQ.Mr8oNwtF_lxKf9RWSrPDiA';\r\n\r\n    const map = new mapboxgl.Map({\r\n        container: 'map',\r\n        style: 'mapbox:\/\/styles\/xcubetech\/cltb7lzhi000401qp6air6qie',\r\n        center: { lng: 5.2913, lat: 52.1326 },\r\n        zoom: 7\r\n    });\r\n\r\n    \/\/ FIX: hoisted to a constant \u2014 evaluated once, not on every click\r\n    const isMobile = (function () {\r\n        let check = false;\r\n        (function (a) { if (\/(android|bb\\d+|meego).+mobile|avantgo|bada\\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino\/i.test(a) || \/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-\/i.test(a.substr(0, 4))) check = true; })(navigator.userAgent || navigator.vendor || window.opera);\r\n        return check;\r\n    })();\r\n\r\n    const svgIcons = `\r\n        <svg display=\"block\" height=\"41px\" width=\"27px\" viewBox=\"0 0 27 41\" role=\"img\" aria-label=\"Location marker\">\r\n            <defs>\r\n                <radialGradient id=\"shadowGradient\">\r\n                    <stop offset=\"10%\" stop-opacity=\"0.4\"><\/stop>\r\n                    <stop offset=\"100%\" stop-opacity=\"0.05\"><\/stop>\r\n                <\/radialGradient>\r\n            <\/defs>\r\n            <ellipse cx=\"13.5\" cy=\"34.8\" rx=\"10.5\" ry=\"5.25\" fill=\"url(#shadowGradient)\"><\/ellipse>\r\n            <path id=\"path-fill\" fill=\"#221f46\" d=\"M27,13.5C27,19.07 20.25,27 14.75,34.5C14.02,35.5 12.98,35.5 12.25,34.5C6.75,27 0,19.22 0,13.5C0,6.04 6.04,0 13.5,0C20.96,0 27,6.04 27,13.5Z\"><\/path>\r\n            <path opacity=\"0.25\" d=\"M13.5,0C6.04,0 0,6.04 0,13.5C0,19.22 6.75,27 12.25,34.5C13,35.52 14.02,35.5 14.75,34.5C20.25,27 27,19.07 27,13.5C27,6.04 20.96,0 13.5,0ZM13.5,1C20.42,1 26,6.58 26,13.5C26,15.9 24.5,19.18 22.22,22.74C19.95,26.3 16.71,30.14 13.94,33.91C13.74,34.18 13.61,34.32 13.5,34.44C13.39,34.32 13.26,34.18 13.06,33.91C10.28,30.13 7.41,26.31 5.02,22.77C2.62,19.23 1,15.95 1,13.5C1,6.58 6.58,1 13.5,1Z\"><\/path>\r\n            <circle fill=\"white\" cx=\"13.5\" cy=\"13.5\" r=\"5.5\"><\/circle>\r\n        <\/svg>\r\n    `;\r\n\r\n    function getLanguageCode() {\r\n        const match = window.location.pathname.match(\/\\\/([a-z]{2})\\\/\/i);\r\n        return match ? match[1].toUpperCase() : null;\r\n    }\r\n\r\n    const langCode = getLanguageCode();\r\n\r\n    function ensureAbsoluteURL(url) {\r\n        if (!url) return url;\r\n        return url.match(\/^https?:\\\/\\\/\/i) ? url : `https:\/\/${url}`;\r\n    }\r\n\r\n    function getBookingLink(entry) {\r\n        const localKey = langCode ? `Booking Link ${langCode}` : null;\r\n        const link = (localKey && entry[localKey]) ? entry[localKey] : entry['Booking Link'];\r\n        return ensureAbsoluteURL(link);\r\n    }\r\n\r\n    \/\/ FIX: compute distance in km between two lat\/lng points (Haversine formula)\r\n    function getDistanceKm(lat1, lng1, lat2, lng2) {\r\n        const R = 6371;\r\n        const dLat = (lat2 - lat1) * Math.PI \/ 180;\r\n        const dLng = (lng2 - lng1) * Math.PI \/ 180;\r\n        const a = Math.sin(dLat \/ 2) ** 2 +\r\n            Math.cos(lat1 * Math.PI \/ 180) * Math.cos(lat2 * Math.PI \/ 180) *\r\n            Math.sin(dLng \/ 2) ** 2;\r\n        return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n    }\r\n\r\n    \/\/ FIX: request the user's location once and cache it\r\n    let userCoords = null;\r\n    if (navigator.geolocation) {\r\n        navigator.geolocation.getCurrentPosition(pos => {\r\n            userCoords = { lat: pos.coords.latitude, lng: pos.coords.longitude };\r\n        });\r\n    }\r\n\r\n    var activeMarkerEl, activePopup;\r\n    \/\/ FIX: always initialised as array so .forEach never throws\r\n    var locationsMarkers = [];\r\n    var locations = [];\r\n\r\n    \/\/ FIX: track sidebar open state independently so search doesn't force it open\r\n    var sidebarOpen = false;\r\n\r\n    function forwardGeocoder(query) {\r\n        const matchingFeatures = [];\r\n        for (const feature of locations) {\r\n            if (feature.Name.toLowerCase().includes(query.toLowerCase())) {\r\n                matchingFeatures.push({\r\n                    text: feature.Name,\r\n                    place_name: `${feature.Name}, x-cube-location`,\r\n                    center: [parseFloat(feature.Longitude), parseFloat(feature.Latitude)],\r\n                    place_type: ['park'],\r\n                    location_type: 'x-cube-location'\r\n                });\r\n            }\r\n        }\r\n        return matchingFeatures;\r\n    }\r\n\r\n    const geocoder = new MapboxGeocoder({\r\n        accessToken: mapboxgl.accessToken,\r\n        mapboxgl: mapboxgl,\r\n        marker: false,\r\n        localGeocoder: forwardGeocoder\r\n    });\r\n\r\n    document.getElementById('geocoder').appendChild(geocoder.onAdd(map));\r\n\r\n    map.on(\"load\", () => {\r\n        getLocations();\r\n\r\n        document.getElementById(\"toggle-btn\").onclick = () => {\r\n            sidebarOpen = !sidebarOpen;\r\n            document.querySelector(\".location-list\").classList.toggle(\"show\", sidebarOpen);\r\n        };\r\n    });\r\n\r\n    function getTopDomain() {\r\n        const parts = window.location.hostname.split('.');\r\n        return parts[parts.length - 1];\r\n    }\r\n\r\n    function getPageURL() {\r\n        const parts = window.location.pathname.split('\/').filter(Boolean);\r\n        return parts[parts.length - 1];\r\n    }\r\n\r\n    function getLocations() {\r\n        Papa.parse(\"https:\/\/docs.google.com\/spreadsheets\/d\/e\/2PACX-1vQd73rANFQawO5P82Rkk1SngvwJ2STRBri_aWCD7WRlYNhVhH-QCVRknwLa2mGQJKGhSbXActYpMIQx\/pub?gid=0&single=true&output=csv\", {\r\n            header: true,\r\n            download: true,\r\n            complete: function ({ data }) {\r\n                locations = [...data.filter(entry => entry.Latitude)];\r\n                const topDomain = getTopDomain();\r\n                const pageURL = getPageURL();\r\n\r\n                locations.sort((a, b) => {\r\n                    if (a.WebCode === topDomain) return -1;\r\n                    if (b.WebCode === topDomain) return 1;\r\n                    return 0;\r\n                });\r\n\r\n                if (pageURL !== \"locations\") {\r\n                    locations.sort((a, b) => {\r\n                        if (a.Country.toLowerCase() === pageURL) return -1;\r\n                        if (b.Country.toLowerCase() === pageURL) return 1;\r\n                        return 0;\r\n                    });\r\n                }\r\n\r\n                \/\/ FIX: added easing and padding to initial flyTo\r\n                map.flyTo({\r\n                    center: [parseFloat(locations[0].FocusLon), parseFloat(locations[0].FocusLat)],\r\n                    zoom: locations[0].FocusZoom,\r\n                    speed: 1.2,\r\n                    curve: 1.4,\r\n                    easing: t => t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t\r\n                });\r\n\r\n                renderMarkers(locations);\r\n                renderLocationList(locations);\r\n            }\r\n        });\r\n    }\r\n\r\n    function searchLocation(term) {\r\n        const filteredLocations = locations.filter(location =>\r\n            location.Name.toLowerCase().includes(term.toLowerCase()) ||\r\n            location.Country.toLowerCase().includes(term.toLowerCase()) ||\r\n            location.WebCode.toLowerCase().includes(term.toLowerCase()) ||\r\n            location.City.toLowerCase().includes(term.toLowerCase()) ||\r\n            location.Address.toLowerCase().includes(term.toLowerCase())\r\n        );\r\n        renderMarkers(filteredLocations);\r\n        renderLocationList(filteredLocations);\r\n    }\r\n\r\n    document.querySelector('.mapboxgl-ctrl-geocoder--input').addEventListener(\"input\", (e) => {\r\n        \/\/ FIX: only open the sidebar if the user has explicitly opened it before or is actively typing\r\n        if (e.target.value.length > 0 && sidebarOpen) {\r\n            document.querySelector('.location-list').classList.add('show');\r\n        } else if (e.target.value.length > 0) {\r\n            sidebarOpen = true;\r\n            document.querySelector('.location-list').classList.add('show');\r\n        }\r\n        searchLocation(e.target.value);\r\n    });\r\n\r\n    document.querySelector('.mapboxgl-ctrl-geocoder--button').addEventListener(\"click\", () => {\r\n        searchLocation(\"\");\r\n    });\r\n\r\n    function renderLocationList(items) {\r\n        const itemsContainer = document.querySelector(\".location-list\");\r\n        if (!itemsContainer) return;\r\n\r\n        const locationItems = items\r\n            .filter(entry => !entry.Name.includes('Display') && getBookingLink(entry))\r\n            .map(entry => `\r\n                <div class=\"location-item\" role=\"listitem\" tabindex=\"0\" data-name=\"${entry.Name}\" aria-label=\"${entry.Name}, ${entry.City}, ${entry.Country}\">\r\n                    <div class=\"location\">\r\n                        <h3>${entry.Name}<\/h3>\r\n                        <p>${entry.City}, ${entry.Country}<\/p>\r\n                    <\/div>\r\n                    <img decoding=\"async\" src=\"https:\/\/x-cube.nl\/wp-content\/plugins\/sitepress-multilingual-cms\/res\/flags\/${entry.CountryCode.toLowerCase()}.svg\" alt=\"${entry.Country} flag\" width=\"24\" height=\"16\">\r\n                <\/div>\r\n            `)\r\n            .join(\"\");\r\n\r\n        itemsContainer.innerHTML = locationItems;\r\n        fireClickListener();\r\n    }\r\n\r\n    function fireClickListener() {\r\n        document.querySelectorAll(\".location-item\").forEach(item => {\r\n            const name = item.getAttribute('data-name');\r\n\r\n            item.onclick = () => {\r\n                toggleMarkerByName(name);\r\n                if (isMobile) {\r\n                    sidebarOpen = false;\r\n                    document.querySelector(\".location-list\").classList.remove(\"show\");\r\n                }\r\n            };\r\n\r\n            \/\/ FIX: keyboard navigation \u2014 Enter and Space activate the item\r\n            item.onkeydown = (e) => {\r\n                if (e.key === 'Enter' || e.key === ' ') {\r\n                    e.preventDefault();\r\n                    toggleMarkerByName(name);\r\n                    if (isMobile) {\r\n                        sidebarOpen = false;\r\n                        document.querySelector(\".location-list\").classList.remove(\"show\");\r\n                    }\r\n                }\r\n                \/\/ Arrow key navigation through the list\r\n                if (e.key === 'ArrowDown') {\r\n                    e.preventDefault();\r\n                    const next = item.nextElementSibling;\r\n                    if (next) next.focus();\r\n                }\r\n                if (e.key === 'ArrowUp') {\r\n                    e.preventDefault();\r\n                    const prev = item.previousElementSibling;\r\n                    if (prev) prev.focus();\r\n                }\r\n            };\r\n        });\r\n    }\r\n\r\n    function toggleMarkerByName(name) {\r\n        const location = locations.find(entry => entry.Name === name);\r\n        if (!location) return;\r\n\r\n        locationsMarkers.forEach(marker => {\r\n            if (marker.title === name) {\r\n                const popup = marker.getPopup();\r\n                if (activePopup) activePopup.remove();\r\n                marker.togglePopup();\r\n                activeMarkerEl = marker.getElement();\r\n                activeMarkerEl.classList.add(\"active\");\r\n                activePopup = popup;\r\n\r\n                \/\/ FIX: smoother flyTo with easing and padding so popup isn't clipped\r\n                map.flyTo({\r\n                    center: [parseFloat(location.Longitude), parseFloat(location.Latitude)],\r\n                    zoom: 14,\r\n                    speed: 1.4,\r\n                    curve: 1.4,\r\n                    padding: { top: 60, bottom: 60, left: 320, right: 60 },\r\n                    easing: t => t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t\r\n                });\r\n            }\r\n        });\r\n    }\r\n\r\n    \/\/ FIX: remove old markers before creating new ones \u2014 prevents accumulation on every search\r\n    function renderMarkers(cities) {\r\n        locationsMarkers.forEach(marker => marker.remove());\r\n\r\n        locationsMarkers = cities\r\n            .filter(city => getBookingLink(city))\r\n            .map((city, i) => createMarker(city, i));\r\n    }\r\n\r\n    function createMarker(entry, i) {\r\n        const markerEl = document.createElement(\"div\");\r\n        markerEl.classList.add(\"div-marker\");\r\n        \/\/ FIX: accessible label on the marker element itself\r\n        markerEl.setAttribute(\"aria-label\", entry.Name);\r\n        markerEl.innerHTML += svgIcons;\r\n\r\n        const popup = createPopup(entry);\r\n        const marker = new mapboxgl.Marker({ element: markerEl });\r\n        marker.setLngLat([parseFloat(entry.Longitude), parseFloat(entry.Latitude)])\r\n              .setPopup(popup)\r\n              .addTo(map);\r\n        marker.title = entry.Name;\r\n\r\n        \/\/ FIX: null-guard prevents crash on first popup close\r\n        popup.on(\"close\", () => {\r\n            if (activeMarkerEl) {\r\n                activeMarkerEl.classList.remove(\"active\");\r\n            }\r\n        });\r\n\r\n        markerEl.addEventListener(\"click\", (e) => {\r\n            e.stopPropagation();\r\n            if (activeMarkerEl && activeMarkerEl !== e.currentTarget) {\r\n                activeMarkerEl.classList.remove(\"active\");\r\n                if (activePopup) activePopup.remove();\r\n            }\r\n            markerEl.classList.add(\"active\");\r\n            marker.togglePopup();\r\n            activeMarkerEl = markerEl;\r\n            activePopup = popup;\r\n        });\r\n\r\n        return marker;\r\n    }\r\n\r\n    function createPopup(entry) {\r\n        \/\/ FIX: compute and display distance from user if geolocation was granted\r\n        let distanceLabel = '';\r\n        if (userCoords) {\r\n            const km = getDistanceKm(\r\n                userCoords.lat, userCoords.lng,\r\n                parseFloat(entry.Latitude), parseFloat(entry.Longitude)\r\n            );\r\n            distanceLabel = km < 1000\r\n                ? `${Math.round(km)} km away`\r\n                : `${(km \/ 1000).toFixed(1)}k km away`;\r\n        }\r\n\r\n        const popupContent = `\r\n            <div class=\"popup-content\">\r\n                <h2>${entry.Name}${distanceLabel ? `<span class=\"popup-distance\">${distanceLabel}<\/span>` : ''}<\/h2>\r\n                <div>${entry.City}, ${entry.Country}<\/div>\r\n                <a href=\"${getBookingLink(entry)}\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n                    <div class=\"btn--pink\">FIND OUT MORE<\/div>\r\n                <\/a>\r\n            <\/div>\r\n        `;\r\n\r\n        return new mapboxgl.Popup({ focusAfterOpen: false, offset: [0, -10] }).setHTML(popupContent);\r\n    }\r\n<\/script><\/div><\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":7,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"100-width.php","meta":{"footnotes":""},"class_list":["post-6858","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/x-cube.nl\/nl\/wp-json\/wp\/v2\/pages\/6858","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/x-cube.nl\/nl\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/x-cube.nl\/nl\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/x-cube.nl\/nl\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/x-cube.nl\/nl\/wp-json\/wp\/v2\/comments?post=6858"}],"version-history":[{"count":0,"href":"https:\/\/x-cube.nl\/nl\/wp-json\/wp\/v2\/pages\/6858\/revisions"}],"wp:attachment":[{"href":"https:\/\/x-cube.nl\/nl\/wp-json\/wp\/v2\/media?parent=6858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}