PageSourceSearch

https://www.loophorizon.com/about

html loophorizon.com collected 2026-10-04 07:36:58 UTC 51,681 bytes, 896 lines download raw bytes

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 &amp; 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 &amp; Measurement</a>
346            <a href="/services/strategy-transformation"     class="nav-drop-item" role="menuitem"><span class="nav-drop-dot" style="--c:#FE6603"></span>Strategy &amp; 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 &amp; 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 &amp; 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 &amp; Measurement</a></li>
705              <li><a href="/services/strategy-transformation">Strategy &amp; 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>&copy; 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.