1<!DOCTYPE html> 2<html lang='en'> 3<head prefix=""> 4 <meta charset="UTF-8"/> 5 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/> 6 <meta http-equiv="X-UA-Compatible" content="IE=edge"/> 7 8 <title>About Us</title> 9 10 <link rel="icon" type="image/x-icon" href="/favicon.ico" /> 11 <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" /> 12 <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" /> 13 <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" /> 14 <link rel="manifest" href="/site.webmanifest" /> 15 <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5" /> 16 <meta name="msapplication-TileColor" content="#da532c" /> 17 <meta name="theme-color" content="#ffffff" /> 18 <meta name="facebook-domain-verification" content="kbnxoiau6tkqb01lt513hmwdi9i9py" /> 19 <link href="/app/frontend/main-e00cc81c.css" rel="stylesheet" type="text/css"/> 20 <link rel="dns-prefetch" href="https://cdn.bookboon.io"> 21 <link rel="dns-prefetch" href="https://cdn.jsdelivr.net"> 22 <link rel="dns-prefetch" href="https://dev.visualwebsiteoptimizer.com"> 23 <link rel="dns-prefetch" href="https://a.omappapi.com"> 24
24<script type="text/javascript" src="https://cdn.bookboon.io/boont-v1.min.js" defer onload="initializeBoontrackIfNeeded()"></script>
24 25
25<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cookieconsent.umd.js" defer></script>
25 26 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/cookieconsent.css"> 27
27<script type="text/javascript"> 28/** 29 * Check if both required consent cookies exist 30 * @returns {boolean} true if both cc_cookie and acceptCookies exist 31 */ 32function hasValidConsentCookies() { 33 if (typeof document === 'undefined') { 34 return false; // No consent on server-side 35 } 36 37 const cookies = document.cookie.split(';'); 38 39 // Check if cc_cookie exists (the library's consent cookie) 40 const hasCcCookie = cookies.some((cookie) => 41 cookie.trim().startsWith('cc_cookie=') 42 ); 43 44 // Check if acceptCookies exists (our custom cookie) 45 const hasAcceptCookies = cookies.some((cookie) => 46 cookie.trim().startsWith('acceptCookies=') 47 ); 48 49 // Both cookies must exist for consent to be valid 50 return hasCcCookie && hasAcceptCookies; 51} 52 53/** 54 * Check if user has given cookie consent (for banner display logic) 55 * @returns {boolean} true if user has given consent, false if banner should show 56 */ 57function hasGivenCookieConsent() { 58 return hasValidConsentCookies(); 59} 60 61/** 62 * Check if a specific cookie category is accepted (for analytics loading) 63 * @param {string} category - The category to check (e.g., 'functional', 'analytics') 64 * @returns {boolean} true if category is accepted and consent is valid 65 */ 66function isCategoryAccepted(category) { 67 if (!hasValidConsentCookies()) { 68 return false; // No valid consent 69 } 70 71 // Check if CookieConsent library is available and category is accepted 72 if ( 73 typeof window.CookieConsent !== 'undefined' && 74 window.CookieConsent.acceptedCategory 75 ) { 76 return window.CookieConsent.acceptedCategory(category); 77 } 78 79 return false; 80} 81 82/** 83 * Configure boontrack with current application settings 84 * This function calls getCurrentApp() and actionReceiverUrl directly from Twig 85 * and respects user's cookie consent choices 86 * @param {Object} acceptCookies - Optional acceptCookies object from React component 87 */ 88function configureBoontrack(acceptCookies) { 89 if (window.boontrack) { 90 let trackPageView = false; 91 92 // If acceptCookies object is provided (from React), use it directly 93 if (acceptCookies && typeof acceptCookies === 'object') { 94 trackPageView = acceptCookies.STATISTICAL || false; 95 } else { 96 // Try to get user's consent choices from CookieConsent library 97 if (typeof window.CookieConsent !== 'undefined' && 98 window.CookieConsent.acceptedCategory && 99 window.CookieConsent.acceptedCategory('analytics')) { 100 trackPageView = true; 101 } else { 102 // Fallback: parse acceptCookies cookie for other cases 103 const cookies = document.cookie.split(';'); 104 const acceptCookiesCookie = cookies.find(cookie => 105 cookie.trim().startsWith('acceptCookies=') 106 ); 107 108 if (acceptCookiesCookie) { 109 try { 110 const acceptCookiesJson = acceptCookiesCookie.split('=')[1]; 111 const acceptCookies = JSON.parse(decodeURIComponent(acceptCookiesJson)); 112 trackPageView = acceptCookies.STATISTICAL || false; 113 } catch (e) { 114 // If parsing fails, default to false 115 trackPageView = false; 116 } 117 } 118 } 119 } 120 121 boontrack.configure({ 122 application: '855abac0499c28e3', 123 receiverUrl: 'https://boont.co/action', langCode: document.documentElement.lang || 'en', 124 trackPageView: trackPageView, // Respect user's actual choices 125 featureFlags: window.features || {} 126 }); 127 128 if (window.user && window.user.id) { 129 boontrack.setUserID(window.user.id); 130 if (boontrack.setOrganisationID && window.user.organisationId) { 131 boontrack.setOrganisationID(window.user.organisationId); 132 } 133 if (boontrack.setAccessUserID && window.user.accessUserId) { 134 boontrack.setAccessUserID(window.user.accessUserId); 135 } 136 } 137 } 138} 139 140// Make functions available globally 141window.hasValidConsentCookies = hasValidConsentCookies; 142window.hasGivenCookieConsent = hasGivenCookieConsent; 143window.isCategoryAccepted = isCategoryAccepted; 144window.configureBoontrack = configureBoontrack; 145</script>
145 146
146<script type="text/javascript">var features = {"new-library-page":true,"intercom":true,"nanos":true,"video-podcasts":true,"playlists":true,"wootric":true,"languages-v2":true,"use-new-deep-links":true,"evo-tab-new-logo":true,"premium-upsell":true,"show-french-content":true,"no-interface-language":true,"light-mode-toggle":true,"library-mimir-only":true};</script>
146 147 148
148<script type="text/javascript"> 149 function cookieToObject(cookies) { 150 var cookieObj = {} 151 var cookieArr = cookies.split(';') 152 for (i = 0; i < cookieArr.length; i++) { 153 var elementTuple = cookieArr[i].split('='); 154 var cookieValue = elementTuple[1] 155 try { 156 cookieValue = JSON.parse(cookieValue) 157 } catch { 158 cookieValue = cookieValue 159 } 160 cookieObj[elementTuple[0].trim()] = cookieValue; 161 } 162 return cookieObj; 163 } 164 165 var pageLocale = 'en'; 166 var locale = 'en'; 167 var cookies = cookieToObject(document.cookie); 168 var head = document.getElementsByTagName('head')[0]; 169 170 if (typeof CookieConsent !== 'undefined' && hasValidConsentCookies() && CookieConsent.acceptedCategory('analytics')) { 171 var link = document.createElement('link'); 172 link.rel = 'preconnect'; 173 link.href = 'https://dev.visualwebsiteoptimizer.com'; 174 head.appendChild(link); 175 176 var scriptVWO = document.createElement('script'); 177 scriptVWO.type = 'text/javascript'; 178 scriptVWO.id = 'vwoCode'; 179 scriptVWO.defer = true; 180 scriptVWO.innerHTML = ` 181 window._vwo_code || (function() { 182 var account_id=777880, 183 version=2.0, 184 settings_tolerance=2000, 185 hide_element='body', 186 hide_element_style = 'opacity:0 !important;filter:alpha(opacity=0) !important;background:none !important', 187 /* DO NOT EDIT BELOW THIS LINE */ 188 f=false,w=window,d=document,v=d.querySelector('#vwoCode'),cK='_vwo_'+account_id+'_settings',cc={};try{var c=JSON.parse(localStorage.getItem('_vwo_'+account_id+'_config'));cc=c&&typeof c==='object'?c:{}}catch(e){}var stT=cc.stT==='session'?w.sessionStorage:w.localStorage;code={use_existing_jquery:function(){return typeof use_existing_jquery!=='undefined'?use_existing_jquery:undefined},library_tolerance:function(){return typeof library_tolerance!=='undefined'?library_tolerance:undefined},settings_tolerance:function(){return cc.sT||settings_tolerance},hide_element_style:function(){return'{'+(cc.hES||hide_element_style)+'}'},hide_element:function(){return typeof cc.hE==='string'?cc.hE:hide_element},getVersion:function(){return version},finish:function(){if(!f){f=true;var e=d.getElementById('_vis_opt_path_hides');if(e)e.parentNode.removeChild(e)}},finished:function(){return f},load:function(e){var t=this.getSettings(),n=d.createElement('script'),i=this;if(t){n.textContent=t;d.getElementsByTagName('head')[0].appendChild(n);if(!w.VWO||VWO.caE){stT.removeItem(cK);i.load(e)}}else{n.fetchPriority='high';n.src=e;n.type='text/javascript';n.onerror=function(){_vwo_code.finish()};d.getElementsByTagName('head')[0].appendChild(n)}},getSettings:function(){try{var e=stT.getItem(cK);if(!e){return}e=JSON.parse(e);if(Date.now()>e.e){stT.removeItem(cK);return}return e.s}catch(e){return}},init:function(){if(d.URL.indexOf('__vwo_disable__')>-1)return;var e=this.settings_tolerance();w._vwo_settings_timer=setTimeout(function(){_vwo_code.finish();stT.removeItem(cK)},e);var t=d.currentScript,n=d.createElement('style'),i=this.hide_element(),r=t&&!t.async&&i?i+this.hide_element_style():'',c=d.getElementsByTagName('head')[0];n.setAttribute('id','_vis_opt_path_hides');v&&n.setAttribute('nonce',v.nonce);n.setAttribute('type','text/css');if(n.styleSheet)n.styleSheet.cssText=r;else n.appendChild(d.createTextNode(r));c.appendChild(n);this.load('https://dev.visualwebsiteoptimizer.com/j.php?a='+account_id+'&u='+encodeURIComponent(d.URL)+'&vn='+version)}};w._vwo_code=code;code.init(); 189 })(); 190 `; 191 head.appendChild(scriptVWO); 192 193 var loadOM = function(d,u,ac){var s=d.createElement('script');s.type='text/javascript';s.src='https://a.omappapi.com/app/js/api.min.js';s.async=true;s.defer=true;s.dataset.user=u;s.dataset.account=ac;d.getElementsByTagName('head')[0].appendChild(s);} 194 loadOM(document,59271,66764); 195 } 196 197 // Function to initialize boontrack after script loads 198 window.initializeBoontrackIfNeeded = function() { 199 if (typeof CookieConsent !== 'undefined' && hasValidConsentCookies() && CookieConsent.acceptedCategory('functional')) { 200 if (window.configureBoontrack) { 201 window.configureBoontrack(); 202 } 203 } 204 } 205 </script>
205 206 207 208</head> 209<body class="main"> 210<div class="global-overlay"></div> 211<div class="global-menu"> 212 <ul class="global-menu__items"> 213 <li> 214 <a href="#" class="global-menu__items__close"> 215 Close 216 </a> 217 </li> 218 <li> 219 <a href="/"> 220 Home 221 </a> 222 </li> 223 <li> 224 <a href="/en/categories"> 225 Categories 226 </a> 227 </li> 228 <li> 229 <a href="/en/about-us"> 230 About Us 231 </a> 232 </li> 233 234 <li> 235 <div class="global-menu__language"> 236 <div class="global-menu__language__selected global-menu__language__flag global-menu__language__flag--gb"> 237 English 238 </div> 239 240 <div class="global-menu__language-options"> 241 <ul> 242 <li class="global-menu__language__flag global-menu__language__flag--active"> 243 <a class="global-menu__language__flag--gb" 244 href="/en">English</a> 245 </li> 246 <li class="global-menu__language__flag "> 247 <a class="global-menu__language__flag--de" 248 href="/de">Deutsch</a> 249 </li> 250 </ul> 251 </div> 252 </div> 253 </li> 254 </ul> 255 256 <a href="/premium/" class="global-menu__button-log-in"> 257 Log in 258 </a> 259</div> 260 261 262 263
263<script> 264 function onSearchClick() { 265 var searchField = document.getElementById('search_field'); 266 boontrack.track( 267 'search.submission', 268 { 269 loggedIn: false, 270 searchQuery: searchField? searchField.value : null 271 } 272 ); 273 } 274</script>
274 275 276<header class="header"> 277 <div class="header__top"> 278 <button class="header__logo-menu__button" aria-label="Main menu"></button> 279 <a href="https://bookboon.com/" class="header__logo-menu__logo header__logo-menu__logo--md"> 280 <img width="187px" src="/syzygy/bookboon-logo.png"> 281 </a> 282 <a href="https://bookboon.com/" class="header__logo-menu__logo header__logo-menu__logo--sm"> 283 <img width="187px" src="/syzygy/bookboon-logo.png"> 284 </a> 285 <a class="header__links-link" href="/en/categories">Categories</a> 286 <a class="header__links-link" href="/en/about-us">About Us</a> 287 288 <form action="/en/search" method="get" class="header__search" role="search"> 289 <div class="header__search__container"> 290 <input type="text" name="query" value="" class="header__search__field" id="search_field" 291 placeholder="Search all content"> 292 <button type="submit" 293 class="header__search__button" 294 onclick="onSearchClick()" 295 > 296 <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> 297 <path d="M12.7 11.23C13.6182 10.0332 14.1109 8.56437 14.1 7.056C14.1047 6.13278 13.9273 5.21768 13.5779 4.36312C13.2285 3.50856 12.7139 2.73132 12.0637 2.0759C11.4135 1.42048 10.6404 0.899749 9.78863 0.543536C8.93688 0.187322 8.02323 0.00261814 7.1 0C5.22496 0.00127493 3.42644 0.743688 2.09648 2.06541C0.76651 3.38714 0.0129309 5.18101 0 7.056C0.0129309 8.93099 0.76651 10.7249 2.09648 12.0466C3.42644 13.3683 5.22496 14.1107 7.1 14.112C8.61752 14.1399 10.0991 13.6492 11.3 12.721L14.3 15.702C14.3906 15.7962 14.4993 15.8712 14.6196 15.9224C14.7399 15.9737 14.8693 16.0001 15 16.0001C15.1307 16.0001 15.2601 15.9737 15.3804 15.9224C15.5007 15.8712 15.6094 15.7962 15.7 15.702C15.7946 15.6126 15.87 15.5047 15.9215 15.3851C15.9731 15.2656 15.9996 15.1367 15.9996 15.0065C15.9996 14.8763 15.9731 14.7474 15.9215 14.6279C15.87 14.5083 15.7946 14.4004 15.7 14.311L12.7 11.23ZM7.1 12.03C6.43799 12.0403 5.78047 11.9196 5.16528 11.6749C4.55009 11.4301 3.98936 11.0661 3.51538 10.6038C3.04139 10.1416 2.66349 9.59011 2.40342 8.98123C2.14335 8.37236 2.00625 7.71806 2 7.056C2 5.7034 2.53732 4.40619 3.49376 3.44976C4.45019 2.49332 5.7474 1.956 7.1 1.956C8.4526 1.956 9.74981 2.49332 10.7062 3.44976C11.6627 4.40619 12.2 5.7034 12.2 7.056C12.1931 7.71764 12.0555 8.3714 11.7952 8.97969C11.5348 9.58799 11.1568 10.1388 10.6829 10.6006C10.2089 11.0623 9.64844 11.4259 9.03358 11.6703C8.41871 11.9148 7.7616 12.0353 7.1 12.025V12.03Z" fill="white"/> 298</svg> 299 300 </button> 301 </div> 302 </form> 303 304 <ul class="header__buttons"> 305 <li> 306 <a href="/premium/" class="header__log-in-button"> 307 Log in 308 </a> 309 </li> 310 </ul> 311 </div> 312</header> 313 314 <div class="about-us"> 315 <div class="about-us__content"> 316 <div class="about-us__content-grid-left"> 317 <h1>What we're all about</h1> 318 <p>At Access Bookboon, we are passionate about making learning accessible, engaging, and effective for everyone. Founded in 2005, Access Bookboon has grown into a trusted platform for professional and personal development. In 2022, we became part of The Access Group, a leading provider of business software solutions that empower organisations to achieve more. As part of Access Learning, Access Bookboon contributes to a comprehensive suite of tools designed to simplify modern L&D, boost engagement, and drive workplace excellence.</p> 319 </div> 320 <div class="about-us__content-grid-image"> 321 <div> 322 <img src="/frontend/laptop.png" width="100%"> 323 </div> 324 </div> 325 326 <div class="about-us__content-grid-full about-us__content-grid-quote"> 327 <div class="about-us__content-grid-quote-border-top"></div> 328 <div class="about-us__content-grid-quote-inner"> 329 <p>With Access Bookboon, youâre not just buying a learning toolâyouâre investing in y
329our teamâs future.</p> 330 </div> 331 <div class="about-us__content-grid-quote-border-bottom"></div> 332 </div> 333 334 <div class="about-us__content-grid-image"> 335 <div> 336 <img src="/frontend/split-screen.jpg" width="100%"> 337 </div> 338 </div> 339 <div class="about-us__content-grid-right"> 340 <h1>Offering Opportunity and Growth</h1> 341 <p>For learners, Access Bookboon offers an unparalleled opportunity to grow and thrive on your own terms. Whether you're upskilling for work or pursuing personal interests, Access Bookboon provides a library of expertly curated content, including eBooks, audiobooks, and live classes. With topics ranging from leadership and communication to mental health and digital skills, our platform empowers you to learn at your own pace, anytime, anywhere</p> 342 <p>For organisations, Access Bookboon is the ultimate solution to foster a culture of continuous learning. Our platform helps close skill gaps, retain top talent, and unlock the full potential of teams by providing employees with the tools they need to grow and succeed. With fresh content added weekly by Subject Matter Experts (SMEs), Access Bookboon ensures your workforce stays prepared to tackle todayâs business challenges.</p> 343 </div> 344 345 <div class="about-us__content-grid-full"> 346 <h2>Part of The Access Group</h2> 347 <p>As part of The Access Group, Access Bookboon benefits from being integrated into one of the UKâs leading providers of business software. The Access Group supports over 75,000 organisations globally, offering innovative solutions across HR, finance, learning, and more. Together, we are committed to helping both individuals and organisations achieve their full potential by delivering impactful, accessible, and engaging learning experiences.</p> 348 </div> 349 </div> 350 </div> 351 352 353 <footer class="footer"> 354 <a class="footer__logo"> 355 <img src="/syzygy/bookboon-logo.png" alt="BookBoon" class="footer__logo-image"/> 356 </a> 357 358 359 <div class="footer__menu"> 360 <ul> 361 <li> 362 <a href="https://www.theaccessgroup.com/en-gb/privacy-notice-for-access-products/" class="footer__menu-link"> 363 Privacy Statement 364 </a> 365 </li> 366 <li> 367 <a href="/en/about-us" class="footer__menu-link"> 368 About Us 369 </a> 370 </li> 371 <li> 372 <a href="https://bookboon.com/blog/en/about-the-website/gdpr" class="footer__menu-link"> 373 GDPR Statement 374 </a> 375 </li> 376 <li> 377 <a href="/cookie-policy" class="footer__menu-link"> 378 Cookie Policy 379 </a> 380 </li> 381 382 </ul> 383 </div> 384 385 <div class="footer__copyright"> 386 <p class="footer__logo-legend">Copyright Bookboon 2026</p> 387 </div> 388</footer>
389<script type="text/javascript"> 390 // Inline utility functions (fallback when shared script not available) 391 function hasValidConsentCookies() { 392 if (typeof document === 'undefined') { 393 return false; 394 } 395 const cookies = document.cookie.split(';'); 396 const hasCcCookie = cookies.some(cookie => cookie.trim().startsWith('cc_cookie=')); 397 const hasAcceptCookies = cookies.some(cookie => cookie.trim().startsWith('acceptCookies=')); 398 return hasCcCookie && hasAcceptCookies; 399 } 400 401 // Check if both cookies exist 402 function checkValidConsent() { 403 return hasValidConsentCookies(); 404 } 405 406 // Don't initialize vanilla-cookieconsent when in iframe (tab context) 407 // In iframe context, the legacy Access Cookie Policies system handles consent 408 // Check if user is an evo customer in a tab (same logic as isEvoUserInATab in index.tsx) 409 const isEvoUserInATab = window.user?.organisationId !== undefined && window.parent !== window; 410 if (isEvoUserInATab) { 411 // In iframe context, just load the main script if consent exists 412 if (checkValidConsent()) { 413 console.log('Frontend: Loading main.js in iframe context'); 414 var customScripts = document.createElement('script'); 415 customScripts.type = 'text/javascript'; 416 customScripts.src = "/app/frontend/main-36a32da3.js"; 417 document.body.appendChild(customScripts); 418 } 419 } else if (checkValidConsent()) { 420 console.log('Frontend: Valid consent exists, loading main.js'); 421 var customScripts = document.createElement('script'); 422 customScripts.type = 'text/javascript'; 423 customScripts.src = "/app/frontend/main-36a32da3.js"; 424 document.body.appendChild(customScripts); 425 } else { 426 // Shared function to get acceptCookies object based on user preferences 427 function getAcceptCookiesFromPreferences() { 428 const userPreferences = CookieConsent.getUserPreferences(); 429 const acceptType = userPreferences.acceptType; 430 431 if (acceptType === 'necessary') { 432 return { 433 FUNCTIONAL: true, 434 STATISTICAL: false, 435 MARKETING: false, 436 FUNCTIONAL_ENHANCED: false 437 }; 438 } else if (acceptType === 'all') { 439 return { 440 FUNCTIONAL: true, 441 STATISTICAL: true, 442 MARKETING: true, 443 FUNCTIONAL_ENHANCED: true 444 }; 445 } else { 446 const analyticsAccepted = CookieConsent.acceptedCategory('analytics'); 447 const marketingAccepted = CookieConsent.acceptedCategory('marketing'); 448 const functionalAccepted = CookieConsent.acceptedCategory('functional'); 449 return { 450 FUNCTIONAL: true, 451 STATISTICAL: analyticsAccepted, 452 MARKETING: marketingAccepted, 453 FUNCTIONAL_ENHANCED: functionalAccepted 454 }; 455 } 456 } 457 458 // Function to initialize vanilla-cookieconsent 459 function initCookieConsent() { 460 CookieConsent.run({ 461 root: 'body', 462 autoShow: true, 463 disablePageInteraction: true, 464 hideFromBots: false, 465 cookie: { 466 name: 'cc_cookie', 467 expiresAfterDays: 365 468 }, 469 guiOptions: { 470 consentModal: { 471 layout: 'box', 472 position: 'bottom right', 473 flipButtons: false, 474 equalWeightButtons: true 475 }, 476 preferencesModal: { 477 layout: 'box', 478 equalWeightButtons: true,
479 flipButtons: false 480 } 481 }, 482 categories: { 483 necessary: { 484 enabled: true, 485 readOnly: true 486 }, 487 analytics: { 488 enabled: false 489 }, 490 marketing: { 491 enabled: false 492 }, 493 functional: { 494 enabled: false 495 } 496 }, 497 language: { 498 default: 'en', 499 translations: { 500 en: { 501 consentModal: { 502 title: "This website uses cookies", 503 description: "We use cookies to improve user experience. Choose which cookies you allow us to use. You can read more about our <a href=\"https:\/\/bookboon.com\/cookie-policy\">Cookie Policy<\/a> in our privacy policy", 504 acceptAllBtn: "Accept all cookies", 505 acceptNecessaryBtn: "Reject non-essential", 506 showPreferencesBtn: "See Cookies Details", 507 footer: '<a href="/cookie-policy" ">Cookie Policy</a>' 508 }, 509 preferencesModal: { 510 title: "This website uses cookies", 511 acceptAllBtn: "Accept all cookies", 512 acceptNecessaryBtn: "Reject non-essential", 513 savePreferencesBtn: "Accept Selected cookies", 514 sections: [ 515 { 516 title: "Functional (Necessary)", 517 description: "These cookies are essential for the proper functioning of the website.", 518 linkedCategory: 'necessary' 519 }, 520 { 521 title: "Intercom", 522 description: "Required to provide customer support, onboarding and service communication", 523 linkedCategory: 'necessary' 524 }, 525 { 526 title: "VWO", 527 description: "VWO (A/B testing and optimization)", 528 linkedCategory: 'analytics' 529 }, 530 { 531 title: "Microsoft Application Insights", 532 description: "Microsoft Application Insights (performance monitoring)", 533 linkedCategory: 'analytics' 534 }, 535 { 536 title: "Microsoft Clarity", 537 description: "Microsoft Clarity (user behavior analysis)", 538 linkedCategory: 'analytics' 539 }, 540 { 541 title: "Sentry", 542 description: "Sentry (error monitoring)", 543 linkedCategory: 'analytics' 544 }, 545 { 546 title: "Tracking", 547 description: "Marketing campaign effectiveness", 548 linkedCategory: 'marketing' 549 } 550 ] 551 } 552 } 553 } 554 }, 555 onConsent: function () { 556 // Check if acceptCookies already exists - if so, don't recreate it 557 // The vanilla-cookieconsent library triggers onConsent after every page load 558 // when it detects valid consent (cc_cookie exists). This prevents unnecessary 559 // recreation of the acceptCookies cookie when it already exists. 560 const cookies = document.cookie.split(';'); 561 const hasAcceptCookies = cookies.some(cookie => 562 cookie.trim().startsWith('acceptCookies=') 563 ); 564 565 566 if (hasAcceptCookies) { 567 // acceptCookies already exists, just configure boontrack and return 568 if (window.configureBoontrack) { 569 window.configureBoontrack(); 570 } 571 return; 572 } 573 574 // Get acceptCookies based on user preferences 575 const acceptCookies = getAcceptCookiesFromPreferences(); 576 document.cookie = `acceptCookies=${JSON.stringify(acceptCookies)};path=/`; 577 578 if (window.configureBoontrack) { 579 window.configureBoontrack(); 580 } 581 582 location.reload(); 583 }, 584 onChange: function () { 585 // Called when preferences are changed via the preferences modal (e.g., from footer link) 586 // Update the acceptCookies cookie without reloading the page 587 const acceptCookies = getAcceptCookiesFromPreferences(); 588 document.cookie = `acceptCookies=${JSON.stringify(acceptCookies)};path=/`; 589 590 if (window.configureBoontrack) { 591 window.configureBoontrack(); 592 } 593 // No page reload - preferences are updated dynamically 594 } 595 }); 596 } 597 598 // Wait for CookieConsent library to load before initializing 599 // The library is loaded with defer, so it may not be available immediately 600 if (typeof CookieConsent !== 'undefined') { 601 initCookieConsent(); 602 } else { 603 // Wait for DOMContentLoaded when deferred scripts have executed 604 document.addEventListener('DOMContentLoaded', function() { 605 if (typeof CookieConsent !== 'undefined') { 606 initCookieConsent(); 607 } else { 608 console.warn('Frontend: CookieConsent library n
608ot available'); 609 } 610 }); 611 } 612 } 613</script>
613 614 615<style> 616 /* Vanilla Cookie Consent styling */ 617 /* Style the middle "Reject non-essential" button with primary red */ 618 #cc-main .cm_btn[data-role="necessary"], 619 #cc-main button[data-role="necessary"] { 620 background-color: #e5173f; 621 color: white; 622 border: none; 623 transition: background-color 0.2s ease; 624 } 625 626 #cc-main .cm_btn[data-role="necessary"]:hover, 627 #cc-main button[data-role="necessary"]:hover { 628 background-color: #ce1539; 629 } 630</style> 631 632</body> 633</html> 634
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.