1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"/> 5 <!-- Google Search Console verification --> 6 <meta name="google-site-verification" content="Chz37GHSYEWHpOXkXBMCamWJUfBo3iqm6QLCepiu5gs" /> 7 <!-- OneTrust Cookie Consent --> 8
8<script src="https://cdn-ukwest.onetrust.com/scripttemplates/otSDKStub.js" type="text/javascript" charset="UTF-8" data-domain-script="018ed226-4701-7dbc-a7f1-1f7da140e49a"></script>
8 9
9<script type="text/javascript">function OptanonWrapper() { }</script>
9 10 <!-- Google Tag Manager --> 11
11<script>
vendor: 335 bytes, lines 11-15
11(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 12 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 13 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 14 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 15 })(window,document,'script','dataLayer','
15GTM-W7336WP
vendor: 3 bytes, line 15
15');
15</script>
15 16 <!-- End Google Tag Manager --> 17 <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 18 <title>About Us | Loop Horizon</title> 19 <meta name="description" content="Loop Horizon is an elite customer data consultancy. We hire people who have done the job client-side and work across every discipline where data meets commercial impact." /> 20 <link rel="canonical" href="https://www.loophorizon.com/about" /> 21 <link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon/loophorizon_nobackground_favicon.png" /> 22 <link rel="apple-touch-icon" sizes="256x256" href="/assets/favicon/loophorizon_icon_256.png" /> 23 <meta property="og:type" content="website" /> 24 <meta property="og:site_name" content="Loop Horizon" /> 25 <meta property="og:title" content="About Us | Loop Horizon" /> 26 <meta property="og:description" content="Loop Horizon is an elite customer data consultancy. We hire people who have done the job client-side and work across every discipline where data meets commercial impact." /> 27 <meta property="og:url" content="https://www.loophorizon.com/about" /> 28 <meta name="twitter:card" content="summary" /> 29 <meta name="twitter:title" content="About Us | Loop Horizon" /> 30 <meta name="twitter:description" content="Loop Horizon is an elite customer data consultancy. We hire people who have done the job client-side and work across every discipline where data meets commercial impact." /> 31 <link rel="stylesheet" href="styles.css"/> 32 <link rel="stylesheet" href="services/services.css"/> 33 <style> 34 /* ââ About-page additions only âââââââââââââââââââââââââââââ */ 35 36 /* ââ Our Story âââââââââââââââââââââââââââââââââââââââââââââ */ 37 .about-story-layout { 38 display: grid; 39 grid-template-columns: 1fr 380px; 40 gap: 80px; 41 align-items: start; 42 } 43 .about-story-body p { 44 font-size: 17px; 45 color: var(--text-muted); 46 line-height: 1.8; 47 margin-bottom: 20px; 48 } 49 .about-story-body p:last-child { margin-bottom: 0; } 50 .about-story-body strong { color: var(--white); font-weight: 600; } 51 .about-story-aside { 52 display: flex; 53 flex-direction: column; 54 gap: 20px; 55 position: sticky; 56 top: 96px; 57 } 58 .about-story-stat { 59 background: var(--card-bg); 60 border: 1px solid var(--border); 61 border-radius: var(--radius-lg); 62 padding: 28px 26px; 63 border-left: 3px solid var(--orange); 64 } 65 .about-story-stat:nth-child(2) { border-left-color: var(--teal); } 66 .about-story-stat:nth-child(3) { border-left-color: var(--yellow); } 67 .about-story-stat-label { 68 font-size: 11px; font-weight: 700; 69 letter-spacing: 0.14em; text-transform: uppercase; 70 color: var(--orange); margin-bottom: 10px; 71 } 72 .about-story-stat:nth-child(2) .about-story-stat-label { color: var(--teal); } 73 .about-story-stat:nth-child(3) .about-story-stat-label { color: var(--yellow); } 74 .about-story-stat-val { 75 font-size: 16px; font-weight: 600; 76 color: var(--white); line-height: 1.4; margin-bottom: 6px; 77 } 78 .about-story-stat-desc { 79 font-size: 13px; color: var(--text-dim); line-height: 1.6; 80 } 81 82 /* ââ What We Stand For âââââââââââââââââââââââââââââââââââââ */ 83 .about-mission-block { 84 background: linear-gradient(135deg, rgba(254,102,3,0.07) 0%, rgba(3,165,165,0.04) 100%); 85 border: 1px solid rgba(254,102,3,0.18); 86 border-radius: var(--radius-lg); 87 padding: 48px 52px; 88 margin-bottom: 56px; 89 position: relative; 90 overflow: hidden; 91 } 92 .about-mission-block::before { 93 content: '"'; 94 position: absolute; 95 top: -10px; left: 40px; 96 font-size: 140px; line-height: 1; 97 color: rgba(254,102,3,0.08); 98 font-family: Georgia, serif; 99 pointer-events: none; 100 } 101 .about-mission-text { 102 font-size: clamp(18px, 1.8vw, 24px); 103 font-weight: 600; 104 color: var(--white); 105 line-height: 1.45; 106 letter-spacing: -0.01em; 107 max-width: none; 108 white-space: nowrap; 109 position: relative; 110 } 111 .about-mission-sub { 112 font-size: 16px; 113 color: var(--text-muted); 114 margin-top: 20px; 115 position: relative; 116 max-width: 680px; 117 line-height: 1.7; 118 } 119 120 /* Values label + grid */ 121 .about-values-label { 122 font-size: 11px; font-weight: 700; 123 letter-spacing: 0.16em; text-transform: uppercase; 124 color: var(--text-dim); margin-bottom: 20px; 125 } 126 .about-values-grid { 127 display: grid; 128 grid-template-columns: repeat(5, 1fr); 129 gap: 16px; 130 } 131 .about-value-card { 132 background: var(--card-bg); 133 border: 1px solid var(--border); 134 border-top: 3px solid var(--orange); 135 border-radius: var(--radius-lg); 136 padding: 28px 22px 32px; 137 transition: background var(--transition), transform 0.3s ease, border-color 0.3s ease; 138 } 139 .about-value-card:nth-child(2) { border-top-color: var(--teal); } 140 .about-value-card:nth-child(3) { border-top-color: #7da0e0; } 141 .about-value-card:nth-child(4) { border-top-color: var(--yellow); } 142 .about-value-card:nth-child(5) { border-top-color: var(--orange); } 143 .about-value-card:hover { 144 background: var(--card-hover); 145 transform: translateY(-4px); 146 } 147 .about-value-num { 148 font-size: 11px; font-weight: 700; 149 letter-spacing: 0.12em; color: var(--text-dim); 150 margin-bottom: 14px; 151 } 152 .about-value-card h3 { 153 font-size: 15px; font-weight: 600; 154 color: var(--white); margin-bottom: 10px; line-height: 1.3; 155 } 156 .about-value-card p { 157 font-size: 13px; color: var(--text-dim); 158 line-height: 1.7; margin: 0; 159 } 160 161 /* ââ Team â unified person card âââââââââââââââââââââââââââ */ 162 .about-people-grid-3 { 163 display: grid; 164 grid-template-columns: repeat(3, 1fr); 165 gap: 20px; 166 margin-top: 48px; 167 margin-bottom: 56px; 168 } 169 .about-people-grid-5 { 170 display: grid; 171 grid-template-columns: repeat(5, 1fr); 172 gap: 20px; 173 } 174 .about-team-label { 175 font-size: 11px; font-weight: 700; 176 letter-spacing: 0.14em; text-transform: uppercase; 177 color: var(--text-dim); margin-bottom: 24px; 178 display: flex; align-items: center; gap: 16px; 179 } 180 .about-team-label::after { 181 content: ''; flex: 1; 182 height: 1px; background: var(--border); 183 } 184 .about-person-card { 185 background: var(--card-bg); 186 border: 1px solid var(--border); 187 border-radius: var(--radius-lg); 188 padding: 32px 20px 28px; 189 display: flex; 190 flex-direction: column; 191 align-items: center; 192 text-align: center; 193 transition: background var(--transition), border-color var(--transition), transform 0.3s ease; 194 } 195 .about-person-card:hover { 196 background: var(--card-hover); 197 border-color: rgba(255,255,255,0.12); 198 transform: translateY(-3px); 199 } 200 .about-person-avatar { 201 width: 88px; height: 88px; 202 border-radius: 50%; overflow: hidden; 203 border: 2px solid var(--border); 204 background: rgba(45,75,138,0.25); 205 margin-bottom: 18px; 206 flex-shrink: 0; 207 transition: border-color var(--transition); 208 } 209 .about-person-card:hover .about-person-avatar { border-color: rgba(254,102,3,0.5); } 210 .about-person-avatar img { 211 width: 100%; height: 100%; 212 object-fit: cover; object-position: top center; 213 filter: grayscale(100%); 214 } 215 .about-person-name { 216 font-size: 14px; font-weight: 600; 217 color: var(--white); margin-bottom: 5px; line-height: 1.3; 218 } 219 .about-person-role { 220 font-size: 11px; color: var(--orange); 221 font-weight: 600; letter-spacing: 0.04em; 222 text-transform: uppercase; line-height: 1.4; 223 margin-bottom: 14px; 224 } 225 .about-person-bio { 226 font-size: 12px; color: var(--text-dim); 227 line-height: 1.7; margin: 0; 228 } 229 .about-person-linkedin { 230 display: inline-flex; 231 align-items: center; 232 gap: 5px; 233 margin-top: 16px; 234 color: var(--text-dim); 235 font-size: 11px; 236 font-weight: 500; 237 text-decoration: none; 238 letter-spacing: 0.03em; 239 transition: color var(--transition); 240 } 241 .about-person-linkedin svg { 242 width: 13px; height: 13px; 243 fill: currentColor; flex-shrink: 0; 244 } 245 .about-person-linkedin:hover { color: #0A66C2; } 246 247 /* ââ Life at Loop â 5 Reason cards ââââââââââââââââââââââââ */ 248 .about-reasons-grid { 249 display: grid; 250 grid-template-columns: repeat(6, 1fr); 251 gap: 20px; 252 margin-top: 48px; 253 } 254 .about-reason-card { 255 grid-column: span 2; 256 background: var(--card-bg); 257 border: 1px solid var(--border); 258 border-top: 3px solid var(--orange); 259 border-radius: var(--radius-lg); 260 padding: 32px 28px 36px; 261 position: relative; 262 overflow: hidden; 263 transition: background var(--transition), border-color var(--transition), transform 0.3s ease, box-shadow 0.3s ease; 264 } 265 .about-reason-card:nth-child(2) { border-top-color: var(--teal); } 266 .about-reason-card:nth-child(3) { border-top-color: var(--yellow); } 267 .about-reason-card:nth-child(4) { border-top-color: var(--orange); grid-column: span 3; } 268 .about-reason-card:nth-child(5) { border-top-color: var(--teal); grid-column: span 3; } 269 .about-reason-card:hover { 270 background: var(--card-hover); 271 border-color: rgba(255,255,255,0.14); 272 transform: translateY(-4px); 273 box-shadow: 0 16px 48px rgba(0,0,0,0.28); 274 } 275 .about-reason-bg-num { 276 position: absolute; 277 bottom: -16px; right: 12px; 278 font-size: 96px; font-weight: 700; 279 letter-spacing: -0.06em; line-height: 1; 280 color: rgba(255,255,255,0.04); 281 pointer-events: none; user-select: none; 282 } 283 .about-reason-card h3 { 284 font-size: 17px; font-weight: 600; 285 color: var(--white); margin-bottom: 12px; line-height: 1.3; 286 position: relative; 287 } 288 .about-reason-card p { 289 font-size: 14px; color: var(--text-muted); 290 line-height: 1.75; margin: 0; 291 position: relative; 292 } 293 294 /* ââ Responsive ââââââââââââââââââââââââââââââââââââââââââââ */ 295 @media (max-width: 1100px) { 296 .about-story-layout { grid-template-columns: 1fr; gap: 48px; } 297 .about-story-aside { position: static; flex-direction: row; } 298 .about-story-stat { flex: 1; } 299 .about-values-grid { grid-template-columns: repeat(3, 1fr); } 300 .about-people-grid-3 { grid-template-columns: repeat(2, 1fr); } 301 .about-people-grid-5 { grid-template-columns: repeat(4, 1fr); } 302 } 303 @media (max-width: 900px) { 304 .about-values-grid { grid-template-columns: repeat(2, 1fr); } 305 .about-people-grid-3 { grid-template-columns: 1fr; } 306 .about-people-grid-5 { grid-template-columns: repeat(3, 1fr); } 307 .about-story-aside { flex-direction: column; } 308 .about-reasons-grid { grid-template-columns: 1fr; } 309 .about-reason-card,
310 .about-reason-card:nth-child(4), 311 .about-reason-card:nth-child(5) { grid-column: span 1; } 312 } 313 @media (max-width: 640px) { 314 .about-values-grid { grid-template-columns: 1fr; } 315 .about-people-grid-5 { grid-template-columns: repeat(2, 1fr); } 316 .about-mission-block { padding: 32px 28px; } 317 .about-mission-text { white-space: normal; font-size: 18px; } 318 } 319 </style> 320</head> 321<body> 322<!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 322-323
322 323<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
323GTM-W7336WP
vendor: 83 bytes, line 323
323" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
324<!-- End Google Tag Manager (noscript) --> 325 326 <nav id="navbar"> 327 <div class="nav-inner"> 328 <a href="/" class="nav-logo" aria-label="Loop Horizon Home"> 329 <img src="assets/logo/Stacked - Colour + White text/loop-logo-2024-white-colour.png" alt="Loop Horizon"/> 330 </a> 331 <ul class="nav-links" id="navLinks"> 332 <li><a href="/" class="nav-link">Home</a></li> 333 <li class="nav-has-dropdown"> 334 <a href="/#services" class="nav-link"> 335 Services 336 <svg class="nav-chevron" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg> 337 </a> 338 <div class="nav-dropdown" role="menu"> 339 <a href="/#services" class="nav-drop-item nav-drop-all" role="menuitem">All Services</a> 340 <a href="/services/digital-data" class="nav-drop-item" role="menuitem"><span class="nav-drop-dot" style="--c:#FE6603"></span>Digital Data</a> 341 <a href="/services/data-engineering" class="nav-drop-item" role="menuitem"><span class="nav-drop-dot" style="--c:#03A5A5"></span>Data Engineering</a> 342 <a href="/services/data-science-analytics" class="nav-drop-item" role="menuitem"><span class="nav-drop-dot" style="--c:#FFC100"></span>Data Science & Analytics</a> 343 <a href="/services/marketing-technology" class="nav-drop-item" role="menuitem"><span class="nav-drop-dot" style="--c:#FE6603"></span>Marketing Technology</a> 344 <a href="/services/marketing-activation" class="nav-drop-item" role="menuitem"><span class="nav-drop-dot" style="--c:#03A5A5"></span>Marketing Activation</a> 345 <a href="/services/reporting-measurement" class="nav-drop-item" role="menuitem"><span class="nav-drop-dot" style="--c:#FFC100"></span>Reporting & Measurement</a> 346 <a href="/services/strategy-transformation" class="nav-drop-item" role="menuitem"><span class="nav-drop-dot" style="--c:#FE6603"></span>Strategy & Transformation</a> 347 </div> 348 </li> 349 <li><a href="/case-studies" class="nav-link">Case Studies</a></li> 350 <li><a href="/insights" class="nav-link">Insights</a></li> 351 <li><a href="#" class="nav-link active">About</a></li> 352 <li><a href="/contact" class="nav-link">Contact</a></li> 353 </ul> 354 <a href="/contact" class="nav-cta">Get In Touch</a> 355 <button class="nav-toggle" id="navToggle" aria-label="Toggle menu"> 356 <span></span><span></span><span></span> 357 </button> 358 </div> 359 </nav> 360 361 362 <!-- âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 363 1. HERO 364 âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ --> 365 <header class="svc-hero cs-mesh-bg"> 366 <div class="svc-hero-overlay"></div> 367 <div class="lh-container svc-hero-inner"> 368 <p class="svc-number">About Loop Horizon</p> 369 <h1 class="svc-title">Senior experts.<br>Embedded in your team.</h1> 370 <p class="svc-tagline">A specialist consultancy of senior practitioners, deployed directly into client organisations to close the gap between data strategy and measurable business outcomes.</p> 371 <div class="svc-hero-actions"> 372 <a href="#open-roles" class="btn-primary"> 373 Open roles 374 <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg> 375 </a> 376 <a href="#team" class="btn-secondary">Meet the people</a> 377 </div> 378 </div> 379 </header> 380 381 382 <!-- âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 383 2. OUR STORY 384 âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ --> 385 <section class="section" id="story"> 386 <div class="lh-container"> 387 <p class="svc-label">Our story</p> 388 <h2 class="svc-section-title">Where we came from</h2> 389 390 <div class="about-story-layout"> 391 392 <div class="about-story-body reveal"> 393 <p>Loop Horizon was founded by James Alexander, who previously created and led the Decisioning Transformation Programme at Sky. That experience taught him something important: the biggest barrier to value from data is rarely the data itself. It is the gap between what a business knows and what it does with that knowledge.</p> 394 <p>Traditional consultancies hand over recommendations. Loop Horizon was built to do something different. We deploy senior practitioners directly into client organisations, working inside the team, accountable for delivery, and measured against real business outcomes rather than the quality of a slide deck. We hire people who have done the job client-side, and work across every discipline where data meets commercial impact.</p> 395 <p>Today, Loop Horizon works with some of the largest consumer brands in the UK, across consumer goods, financial services, travel and hospital
395ity, and telecoms and utilities. We are ISO 27001 certified, and proud of the trust our clients place in us to handle their most valuable asset: their customer data.</p> 396 </div> 397 398 <div class="about-story-aside"> 399 <div class="about-story-stat reveal"> 400 <div class="about-story-stat-label">Embedded</div> 401 <div class="about-story-stat-val">Inside your organisation</div> 402 <div class="about-story-stat-desc">We work as part of your team from day one, inside your systems, attending your meetings, alongside your people.</div> 403 </div> 404 <div class="about-story-stat reveal"> 405 <div class="about-story-stat-label">Client-side experience</div> 406 <div class="about-story-stat-val">Built from the inside out</div> 407 <div class="about-story-stat-desc">Our team has held senior client-side roles at major brands. We understand the pressures, politics and pace of working inside large organisations.</div> 408 </div> 409 <div class="about-story-stat reveal"> 410 <div class="about-story-stat-label">Outcome</div> 411 <div class="about-story-stat-val">Accountable for results</div> 412 <div class="about-story-stat-desc">We measure ourselves against business impact, not activity. Real returns from your customer data, not reports about them.</div> 413 </div> 414 </div> 415 416 </div> 417 </div> 418 </section> 419 420 421 <!-- âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 422 3. WHAT WE STAND FOR 423 âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ --> 424 <section class="section section-alt" id="values"> 425 <div class="lh-container"> 426 <p class="svc-label">What we stand for</p> 427 <h2 class="svc-section-title">Mission and values</h2> 428 429 <div class="about-mission-block reveal"> 430 <p class="about-mission-text">Our mission is to make every customer experience relevant.</p> 431 <p class="about-mission-sub">We use our passion and experience to help brands connect with customers by unlocking the power of their data, combining strategic thinking with hands-on delivery expertise.</p> 432 </div> 433 434 <div class="about-values-label">Our five values</div> 435 <div class="about-values-grid"> 436 437 <div class="about-value-card reveal"> 438 <div class="about-value-num">01</div> 439 <h3>Impact Driven</h3> 440 <p>We focus on outcomes, not activity. We challenge ourselves to create real, measurable value for our clients and the business.</p> 441 </div> 442 443 <div class="about-value-card reveal"> 444 <div class="about-value-num">02</div> 445 <h3>Positive</h3> 446 <p>We bring energy, curiosity and a solutions-based mindset. We look for opportunities, even in complex problems.</p> 447 </div> 448 449 <div class="about-value-card reveal"> 450 <div class="about-value-num">03</div> 451 <h3>Open</h3> 452 <p>We communicate transparently, share ideas early, and create an environment where people can speak up and be heard.</p> 453 </div> 454 455 <div class="about-value-card reveal"> 456 <div class="about-value-num">04</div> 457 <h3>Empathetic</h3> 458 <p>We listen with intent, respect different perspectives, and support people to do their best work.</p> 459 </div> 460 461 <div class="about-value-card reveal"> 462 <div class="about-value-num">05</div> 463 <h3>Stronger Together</h3> 464 <p>Collaboration is our superpower. We thrive on winning as one team and celebrate success together.</p> 465 </div> 466 467 </div> 468 </div> 469 </section> 470 471 472 <!-- âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 473 4. THE TEAM 474 âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ --> 475 <section class="section" id="team"> 476 <div class="lh-container"> 477 <p class="svc-label">The team</p> 478 <h2 class="svc-section-title">Who you will work with</h2> 479 <p class="svc-section-intro">Senior practitioners across data, technology, marketing and strategy, deployed directly onto every client engagement.</p> 480 481 <!-- Leadership --> 482 <div class="about-people-grid-3"> 483 484 <div class="about-person-card reveal"> 485 <div class="about-person-avatar"><img src="assets/Loop%20Employees%20pics/James%20Alexander.jpg" alt="James Alexander"/></div> 486 <div class="about-person-name">James Alexander</div> 487 <div class="about-person-role">Founder and CEO</div> 488 <p class="about-person-bio">Loop Horizon's founder. Prior to Loop, he created and led the Decisioning Transformation Programme at Sky.</p> 489 <a href="https://www.linkedin.com/in/jamesalexander101/" target="_blank" rel="noopener" class="about-person-linkedin" aria-label="James Alexander on LinkedIn"> 490 <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 491 LinkedIn 492 </a> 493 </div> 494 495 <div class="about-person-card reveal"> 496 <div class="about-person-avatar"><img src="assets/Loop%20Employees%20pics/Rachel%20Fox.jpg" alt="Rachel Fox"/></div> 497 <div class="about-person-name">Rachel Fox</div> 498 <div class="about-person-role">Managing Director, Marketing</div> 499 <p class="about-person-bio">
499Strategically leads the Marketing Services function, holds senior client relationships and helps develop future business.</p> 500 <a href="https://www.linkedin.com/in/rachel-fox294/" target="_blank" rel="noopener" class="about-person-linkedin" aria-label="Rachel Fox on LinkedIn"> 501 <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 502 LinkedIn 503 </a> 504 </div> 505 506 <div class="about-person-card reveal"> 507 <div class="about-person-avatar"><img src="assets/Loop%20Employees%20pics/Ethan%20James.jpg" alt="Ethan James"/></div> 508 <div class="about-person-name">Ethan James</div> 509 <div class="about-person-role">Managing Director, Technology</div> 510 <p class="about-person-bio">Has led the Data and Technology team on significant engagements for Loop clients across complex data transformation programmes.</p> 511 <a href="https://www.linkedin.com/in/ethjames/" target="_blank" rel="noopener" class="about-person-linkedin" aria-label="Ethan James on LinkedIn"> 512 <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 513 LinkedIn 514 </a> 515 </div> 516 517 <div class="about-person-card reveal"> 518 <div class="about-person-avatar"><img src="assets/Loop%20Employees%20pics/Prithvi%20Banerjee.jpg" alt="Prithvi Banerjee"/></div> 519 <div class="about-person-name">Prithvi Banerjee</div> 520 <div class="about-person-role">Managing Director, Commercial</div> 521 <p class="about-person-bio">Leads commercial strategy and client development, driving growth across Loop Horizon's key accounts and new business pipeline.</p> 522 <a href="https://www.linkedin.com/in/prithviraj-banerjee/" target="_blank" rel="noopener" class="about-person-linkedin" aria-label="Prithvi Banerjee on LinkedIn"> 523 <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 524 LinkedIn 525 </a> 526 </div> 527 528 <div class="about-person-card reveal"> 529 <div class="about-person-avatar"><img src="assets/Loop%20Employees%20pics/Chris%20Field.jpg" alt="Chris Field"/></div> 530 <div class="about-person-name">Chris Field</div> 531 <div class="about-person-role">Managing Director, Finance</div> 532 <p class="about-person-bio">Oversees financial operations and governance, ensuring the business is run with the rigour and transparency our clients expect.</p> 533 <a href="https://www.linkedin.com/in/chrisfield/" target="_blank" rel="noopener" class="about-person-linkedin" aria-label="Chris Field on LinkedIn"> 534 <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 535 LinkedIn 536 </a> 537 </div> 538 539 <div class="about-person-card reveal"> 540 <div class="about-person-avatar"><img src="assets/Loop%20Employees%20pics/Sarah%20Astbury.jpeg" alt="Sarah Astbury"/></div> 541 <div class="about-person-name">Sarah Astbury</div> 542 <div class="about-person-role">Director of Operations</div> 543 <p class="about-person-bio">
543Leads operations at Loop Horizon, ensuring the highest standards of delivery, compliance and information security across all engagements.</p> 544 <a href="https://www.linkedin.com/in/sarah-astbury-8ab814/" target="_blank" rel="noopener" class="about-person-linkedin" aria-label="Sarah Astbury on LinkedIn"> 545 <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 546 LinkedIn 547 </a> 548 </div> 549 550 </div> 551 552 <!-- Heads of practice --> 553 <div class="about-team-label">Our heads of practice</div> 554 <div class="about-people-grid-5"> 555 556 <div class="about-person-card reveal"> 557 <div class="about-person-avatar"><img src="assets/Loop%20Employees%20pics/Kristina%20Kalpokaite.jpg" alt="Kristina Kalpokaite"/></div> 558 <div class="about-person-name">Kristina Kalpokaite</div> 559 <div class="about-person-role">Head of MarTech</div> 560 <p class="about-person-bio">Deep expertise in CDP strategy, vendor selection and large-scale marketing technology transformation.</p> 561 <a href="https://www.linkedin.com/in/kristina-kalpokaite-36998027/" target="_blank" rel="noopener" class="about-person-linkedin" aria-label="Kristina Kalpokaite on LinkedIn"> 562 <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 563 LinkedIn 564 </a> 565 </div> 566 567 <div class="about-person-card reveal"> 568 <div class="about-person-avatar"><img src="assets/Loop%20Employees%20pics/Matt%20Bentley.jpeg" alt="Matt Bentley"/></div> 569 <div class="about-person-name">Matt Bentley</div> 570 <div class="about-person-role">Head of Digital Data</div> 571 <p class="about-person-bio">With 15+ years of experience, Matt heads up Loop Horizon's Data Architecture and Analytics function.</p> 572 <a href="https://www.linkedin.com/in/mattdoesdata/" target="_blank" rel="noopener" class="about-person-linkedin" aria-label="Matt Bentley on LinkedIn"> 573 <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 574 LinkedIn 575 </a> 576 </div> 577 578 <div class="about-person-card reveal"> 579 <div class="about-person-avatar"><img src="assets/Loop%20Employees%20pics/Nicola%20Bhojani.jpg" alt="Nicola Bhojani"/></div> 580 <div class="about-person-name">Nicola Bhojani</div> 581 <div class="about-person-role">Head of Marketing Strategy</div> 582 <p class="about-person-bio">26 years of experience across top-tier brands, focused on insight and data-driven marketing strategy.</p> 583 <a href="https://www.linkedin.com/in/nicola-bhojani/" target="_blank" rel="noopener" class="about-person-linkedin" aria-label="Nicola Bhojani on LinkedIn"> 584 <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 585 LinkedIn 586 </a> 587 </div> 588 589 <div class="about-person-card reveal"> 590 <div class="about-person-avatar"><img src="assets/Loop%20Employees%20pics/Ata%20Mehmet.jpg" alt="Ata Mehmet"/></div> 591 <div class="about-person-name">Ata Mehmet</div> 592 <div class="about-person-role">Head of Customer Value</div> 593 <p class="about-person-bio">Deep experience across campaign strategy, advanced analytics, experimentation and CRM capability development.</p> 594 <a href="https://www.linkedin.com/in/ata-mehmet-1624a930/" target="_blank" rel="noopener" class="about-person-linkedin" aria-label="Ata Mehmet on LinkedIn"> 595 <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 596 LinkedIn 597 </a> 598 </div> 599 600 <div class="about-person-card reveal"> 601 <div class="about-person-avatar"><img src="assets/Loop%20Employees%20pics/Nicholas%20Edwards.jpg" alt="Nicholas Edwards"/></div> 602 <div class="about-person-name">Nicholas Edwards</div> 603 <div class="about-person-role">Head of Engineering & Analytics</div> 604 <p class="about-person-bio">Leads the Engineering and Analytics practice, delivering data infrastru
604cture and analytics solutions for major clients.</p> 605 <a href="https://www.linkedin.com/in/nicholas-e-7b596123/" target="_blank" rel="noopener" class="about-person-linkedin" aria-label="Nicholas Edwards on LinkedIn"> 606 <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 607 LinkedIn 608 </a> 609 </div> 610 611 </div> 612 </div> 613 </section> 614 615 616 <!-- âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 617 5. LIFE AT LOOP â 5 REASONS 618 âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ --> 619 <section class="section section-alt" id="life-at-loop"> 620 <div class="lh-container"> 621 <p class="svc-label">Life at Loop Horizon</p> 622 <h2 class="svc-section-title">Five reasons to join us</h2> 623 <p class="svc-section-intro">What makes Loop Horizon a place where ambitious people want to build their careers.</p> 624 625 <div class="about-reasons-grid"> 626 627 <div class="about-reason-card reveal"> 628 <div class="about-reason-bg-num">01</div> 629 <h3>Meaningful client work</h3> 630 <p>We work with some of the UK's largest consumer brands on genuinely complex data and marketing challenges. The work is substantive, the stakes are real, and your contribution is visible.</p> 631 </div> 632 633 <div class="about-reason-card reveal"> 634 <div class="about-reason-bg-num">02</div> 635 <h3>A values-led culture</h3> 636 <p>Our values shape how we hire, how we work and how we treat each other. We are a team that communicates honestly, supports one another and genuinely celebrates success together.</p> 637 </div> 638 639 <div class="about-reason-card reveal"> 640 <div class="about-reason-bg-num">03</div> 641 <h3>Flexibility that works in practice</h3> 642 <p>Our hybrid model is built on trust. We give our people the autonomy to work in the way that helps them perform at their best, balancing collaboration with the focus that deep work requires.</p> 643 </div> 644 645 <div class="about-reason-card reveal"> 646 <div class="about-reason-bg-num">04</div> 647 <h3>Real investment in your development</h3> 648 <p>We invest in people with a dedicated training budget, structured development plans and clear progression paths. We create the conditions for growth and take it seriously at every stage of your career.</p> 649 </div> 650 651 <div class="about-reason-card reveal"> 652 <div class="about-reason-bg-num">05</div> 653 <h3>A team worth working with</h3> 654 <p>The people at Loop Horizon are experienced, collaborative and genuinely good to work with. We have a dedicated focus on connection and culture, from social events to the everyday moments that matter.</p> 655 </div> 656 657 </div> 658 </div> 659 </section> 660 661 662 <!-- âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 663 6. CTA 664 âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ --> 665 <section class="section" id="open-roles"> 666 <div class="lh-container"> 667 <p class="svc-label">Careers</p> 668 <h2 class="svc-section-title">Open roles</h2> 669 <p class="svc-section-intro">We are always looking for senior practitioners who want to do substantive work with some of the UK's largest brands. Explore our current openings below.</p> 670 <div id="jobsGrid" class="jobs-grid"></div> 671 </div> 672 </section> 673 674 <!-- Open role expand overlay --> 675 <div id="jobsOverlay" aria-hidden="true" role="dialog" aria-modal="true" tabindex="-1"></div> 676 677 678 <footer> 679 <div class="lh-container"> 680 <div class="footer-top"> 681 <div class="footer-brand"> 682 <a href="/" class="footer-logo"> 683 <img src="assets/logo/Stacked - Colour + White text/loop-logo-2024-white-colour.png" alt="Loop Horizon"/> 684 </a> 685 <p class="footer-tagline">We deploy elite teams to accelerate returns from your customer data, connecting technology, data and marketing to drive measurable business outcomes.</p>
686 <span class="footer-cert"> 687 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z"/></svg> 688 ISO 27001 Certified 689 </span> 690 <span class="footer-cert"> 691 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z"/></svg> 692 FT1000 Europe's Fastest Growing Companies, 2024-2027 693 </span> 694 </div> 695 <div class="footer-cols"> 696 <div class="footer-col"> 697 <h5>Services</h5> 698 <ul> 699 <li><a href="/services/digital-data">Digital Data</a></li> 700 <li><a href="/services/data-engineering">Data Engineering</a></li> 701 <li><a href="/services/data-science-analytics">Data Science & Analytics</a></li> 702 <li><a href="/services/marketing-technology">Marketing Technology</a></li> 703 <li><a href="/services/marketing-activation">Marketing Activation</a></li> 704 <li><a href="/services/reporting-measurement">Reporting & Measurement</a></li> 705 <li><a href="/services/strategy-transformation">Strategy & Transformation</a></li> 706 </ul> 707 </div> 708 <div class="footer-col"> 709 <h5>Company</h5> 710 <ul> 711 <li><a href="/case-studies">Case Studies</a></li> 712 <li><a href="/insights">Insights</a></li> 713 <li><a href="/contact">Contact</a></li> 714 <li><a href="/sustainability">Sustainability</a></li> 715 </ul> 716 </div> 717 <div class="footer-col"> 718 <h5>Policies</h5> 719 <ul> 720 <li><a href="/privacy-policy">Privacy Policy</a></li> 721 <li><a href="/cookie-policy">Cookie Policy</a></li> 722 <li><a href="/modern-slavery-policy">Modern Slavery Policy</a></li> 723 </ul> 724 </div> 725 </div> 726 </div> 727 <div class="footer-bottom"> 728 <p>© 2026 Loop Horizon. All rights reserved.</p> 729 <a href="https://www.linkedin.com/company/loophorizon/" target="_blank" rel="noopener" class="footer-linkedin" aria-label="Loop Horizon on LinkedIn"> 730 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 731 </a> 732 </div> 733 </div> 734 </footer> 735 736
736<script src="script.js"></script>
736 737
737<script>document.getElementById('navbar').classList.add('scrolled');</script>
737 738
738<script src="cs-mesh-bg.js"></script>
738 739
739<script src="content.js"></script>
739 740
740<script> 741 /* ââ Open roles: cards + expand overlay ââ */ 742 (function () { 743 const jobs = (typeof CONTENT !== 'undefined' && CONTENT.jobs) || []; 744 const grid = document.getElementById('jobsGrid'); 745 const overlay = document.getElementById('jobsOverlay'); 746 if (!grid || !overlay) return; 747 748 const APPLY_EMAIL = '[email protected]'; 749 750 /* Render cards (or empty state) */ 751 if (!jobs.length) { 752 grid.innerHTML = `<div class="jobs-empty"> 753 <p>We do not have any open roles right now, but we are always keen to hear from talented people. Email us at <a href="mailto:${APPLY_EMAIL}">${APPLY_EMAIL}</a> and tell us how you could help.</p> 754 </div>`; 755 } else { 756 grid.innerHTML = jobs.map(job => ` 757 <div class="job-card" role="button" tabindex="0" aria-label="View role: ${job.title}" data-job-id="${job.id}"> 758 <div class="job-card-head"> 759 <h3>${job.title}</h3> 760 <div class="job-card-meta"> 761 <span class="job-pill">${job.location}</span> 762 <span class="job-pill">${job.type}</span> 763 </div> 764 </div> 765 <p class="job-card-summary">${job.summary || ''}</p> 766 <span class="job-card-cta">View role 767 <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg> 768 </span> 769 </div>`).join(''); 770 771 grid.querySelectorAll('.job-card[data-job-id]').forEach(card => { 772 const open = () => { 773 const job = jobs.find(j => j.id === card.dataset.jobId); 774 if (job) openJob(job, card); 775 }; 776 card.addEventListener('click', open); 777 card.addEventListener('keydown', e => { 778 if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); open(); } 779 }); 780 }); 781 } 782 783 let _jobClosingRect = null; 784 785 function openJob(job, triggerEl) { 786 const cardRect = triggerEl.getBoundingClientRect(); 787 const mailto = `mailto:${APPLY_EMAIL}?subject=` + encodeURIComponent('Application: ' + job.title); 788 overlay.innerHTML = ` 789 <div class="cso-inner job-overlay-inner"> 790 <button class="cso-close" id="jobCloseBtn" aria-label="Close"> 791 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 792 <line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/> 793 </svg> 794 </button> 795 <div class="cso-scroll"> 796 <div class="cso-header"> 797 <h2 class="cso-title">${job.title}</h2> 798 <div class="job-meta-row"> 799 <span class="job-pill">${job.location}</span> 800 <span class="job-pill">${job.type}</span> 801 </div> 802 </div> 803 <div class="job-body">${job.body || ''}</div> 804 <div class="job-apply"> 805 <p class="job-apply-note">Email your CV and a short note to <a href="${mailto}">${APPLY_EMAIL}</a> and we will be in touch.</p> 806 </div> 807 </div> 808 </div>`; 809 810 overlay.setAttribute('aria-hidden', 'false'); 811 document.body.style.overflow = 'hidden'; 812 overlay.style.pointerEvents = 'none'; 813 history.pushState({ jobId: job.id }, '', '#' + job.id); 814 815 const inner = overlay.querySelector('.cso-inner'); 816 if (window.innerWidth < 768) { 817 inner.style.opacity = '1'; 818 overlay.classList.add('is-open'); 819 overlay.style.pointerEvents = ''; 820 _jobClosingRect = cardRect; 821 } else { 822 requestAnimationFrame(() => { 823 const f = inner.getBoundingClientRect(); 824 const dx = (cardRect.left + cardRect.width / 2) - (f.left + f.width / 2); 825 const dy = (cardRect.top + cardRect.height / 2) - (f.top + f.height / 2); 826 const sx = cardRect.width / f.width; 827 const sy = cardRect.height / f.height; 828 inner.style.transition = 'none'; 829 inner.style.transform = `translate(${dx}px, ${dy}px) scale(${sx}, ${sy})`; 830 inner.style.opacity = '0.4'; 831 inner.style.borderRadius = '12px'; 832 requestAnimationFrame(() => { 833 inner.style.transition = 'transform 0.46s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.30s ease, border-radius 0.46s ease'; 834 inner.style.transform = 'translate(0,0) scale(1)'; 835 inner.style.opacity = '1';
836 inner.style.borderRadius = '20px'; 837 overlay.classList.add('is-open'); 838 overlay.style.pointerEvents = ''; 839 _jobClosingRect = cardRect; 840 }); 841 }); 842 } 843 844 document.getElementById('jobCloseBtn').addEventListener('click', closeJob); 845 overlay.addEventListener('click', e => { if (e.target === overlay) closeJob(); }); 846 overlay.addEventListener('keydown', e => { if (e.key === 'Escape') closeJob(); }, { once: true }); 847 } 848 849 function closeJob() { 850 const inner = overlay.querySelector('.cso-inner'); 851 if (!inner) return; 852 if (_jobClosingRect && window.innerWidth >= 768) { 853 const f = inner.getBoundingClientRect(); 854 const dx = (_jobClosingRect.left + _jobClosingRect.width / 2) - (f.left + f.width / 2); 855 const dy = (_jobClosingRect.top + _jobClosingRect.height / 2) - (f.top + f.height / 2); 856 const sx = _jobClosingRect.width / f.width; 857 const sy = _jobClosingRect.height / f.height; 858 inner.style.transition = 'transform 0.38s cubic-bezier(0.4, 0, 0.8, 0.6), opacity 0.28s ease, border-radius 0.38s ease'; 859 inner.style.transform = `translate(${dx}px, ${dy}px) scale(${sx}, ${sy})`; 860 inner.style.opacity = '0'; 861 inner.style.borderRadius = '12px'; 862 } 863 overlay.classList.remove('is-open'); 864 document.body.style.overflow = ''; 865 overlay.setAttribute('aria-hidden', 'true'); 866 const delay = window.innerWidth < 768 ? 0 : 400; 867 setTimeout(() => { overlay.innerHTML = ''; overlay.style.cssText = ''; _jobClosingRect = null; }, delay); 868 history.pushState(null, '', window.location.pathname); 869 } 870 871 window.addEventListener('popstate', e => { 872 if (overlay.classList.contains('is-open')) { 873 overlay.classList.remove('is-open'); 874 document.body.style.overflow = ''; 875 overlay.setAttribute('aria-hidden', 'true'); 876 setTimeout(() => { overlay.innerHTML = ''; overlay.style.cssText = ''; _jobClosingRect = null; }, 400); 877 } else if (e.state && e.state.jobId) { 878 const job = jobs.find(j => j.id === e.state.jobId); 879 if (job) openJob(job, document.querySelector(`[data-job-id="${e.state.jobId}"]`) || document.body); 880 } 881 }); 882 883 /* Auto-open if landed with a matching hash (e.g. shared link) */ 884 (function () { 885 const hash = decodeURIComponent(window.location.hash.slice(1)); 886 if (!hash) return; 887 const job = jobs.find(j => j.id === hash); 888 if (!job) return; 889 const trigger = document.querySelector(`[data-job-id="${hash}"]`) || document.body; 890 setTimeout(() => openJob(job, trigger), 150); 891 })(); 892 })(); 893 </script>
893 894 895</body> 896</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.