PageSourceSearch

https://ourjay-foundation-website.netlify.app/map/

html ourjay-foundation-website.netlify.app collected 2026-10-03 11:14:18 UTC 22,901 bytes, 180 lines download raw bytes

1<!DOCTYPE html><html lang="en-GB"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"><meta name="theme-color" content="#2A1F5C"><title>Defib map | OurJay Foundation</title><meta name="description" content="Find the nearest public defibrillator. Every OurJay-funded AED and bleed kit on a single live map, with What3Words location for emergency handoff to 999."><link rel="canonical" href="https://ourjay.org.uk/map/"><link rel="icon" type="image/png" href="/favicon.png"><link rel="apple-touch-icon" href="/apple-touch-icon.png"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@1,400;1,500&family=Poppins:wght@300;400;500;600;700;800&display=swap"><meta property="og:type" content="website"><meta property="og:title" content="Defib map | OurJay Foundation"><meta property="og:description" content="Find the nearest public defibrillator. Every OurJay-funded AED and bleed kit on a single live map, with What3Words location for emergency handoff to 999."><meta property="og:image" content="/icon-512.png"><meta property="og:url" content="https://ourjay.org.uk/map/"><meta name="twitter:card" content="summary_large_image">
1<script type="application/ld+json">{"@context":"https://schema.org","@type":"NGO","name":"OurJay Foundation","alternateName":"OurJay","url":"https://ourjay.org.uk","logo":"https://ourjay.org.uk/icon-512.png","description":"UK registered charity (1200846) founded by Jamie Rees' family, installing 24/7 publicly accessible defibrillators and bleed control kits across the UK.","sameAs":["https://www.facebook.com/ourjayfoundation"],"areaServed":"GB","address":{"@type":"PostalAddress","addressRegion":"Warwickshire","addressCountry":"GB"},"identifier":{"@type":"PropertyValue","propertyID":"UK Registered Charity","value":"1200846"}}</script>
1<!--
2      Add a `.js` class to <html> as early as possible so the CSS rules that
3      hide [data-reveal] elements only apply when JS is actually running.
4      If this script never executes (CSP, network, etc.) reveal targets stay
5      visible at their natural state rather than getting stranded invisible.
6
7      On pages without a dark hero (lightHeader=true), also set
8      data-scrolled=true and route-pill-nav at parse time so the navbar
9      renders in its solid pill state immediately and stays there
10      regardless of scroll position. animations.ts checks for
11      route-pill-nav and skips its scroll handler when it sees it.
12    -->
12<script>(function(){const lightHeader = false;
13
14      document.documentElement.classList.add("js");
15      if (lightHeader) {
16        document.documentElement.dataset.scrolled = "true";
17        document.documentElement.classList.add("route-pill-nav");
18      }
19    })();</script>
19<link rel="stylesheet" href="/_astro/style.Jc3c1320.css">
19<script type="module" src="/_astro/page.Dd_PLX--.js"></script>
19</head> <body> <a href="#main" class="sr-only focus:not-sr-only focus:fixed focus:left-4 focus:top-4 focus:z-[100] focus:rounded-full focus:bg-brand-purple focus:px-4 focus:py-2 focus:text-sm focus:font-semibold focus:text-white">
20Skip to content
21</a>   
21<script>
22    document.documentElement.setAttribute("data-scrolled", "true");
23    document.documentElement.classList.add("route-fullscreen-map");
24  </script>
24 <!--
25  Sticky header. Two visual states driven by html[data-scrolled]:
26
27    AT TOP     full-bleed, transparent, taller, white logo on dark hero
28    SCROLLED   floating pill, brand cyan→purple gradient, rounded-full,
29               margin from the edges, slightly shorter
30--><header class="pointer-events-none fixed inset-x-0 top-0 z-50" data-astro-cid-5blmo7yk> <!--
31    No tinted backdrop band behind the pill - earlier versions had one
32    but it rendered as a rectangle that bled past the pill's rounded
33    corners on the right/left edges, making the pill look not-quite-
34    rounded.
35
36    The pill uses a tight, NEUTRAL downward drop shadow. Any purple-tinted
37    shadow (the old 80px shadow-glow-purple, and even a tighter purple one)
38    pooled into soft coloured smudges at the rounded left/right ends against
39    light page content - the "weird formatting at the ends" Ryan flagged
40    twice. A neutral ink shadow + an INSET ring keeps the rounded caps clean.
41    Verified in-browser at both ends.
42  --> <div class="relative z-10 px-3 pt-2 transition-[padding] duration-300 sm:px-5 sm:pt-3 [html[data-scrolled=true]_&]:pt-3 sm:[html[data-scrolled=true]_&]:pt-4" data-astro-cid-5blmo7yk> <nav class="pointer-events-auto mx-auto flex h-20 max-w-7xl items-center justify-between rounded-none border border-transparent bg-transparent px-5 transition-all duration-300 sm:h-24 sm:px-8 [html[data-scrolled=true]_&]:h-16 sm:[html[data-scrolled=true]_&]:h-[68px] [html[data-scrolled=true]_&]:rounded-full [html[data-scrolled=true]_&]:bg-gradient-to-r [html[data-scrolled=true]_&]:from-brand-cyan [html[data-scrolled=true]_&]:via-[#4d4cb9] [html[data-scrolled=true]_&]:to-brand-purple [html[data-scrolled=true]_&]:px-4 [html[data-scrolled=true]_&]:shadow-[0_6px_16px_-8px_rgba(15,19,32,0.30)] [html[data-scrolled=true]_&]:ring-1 [html[data-scrolled=true]_&]:ring-inset [html[data-scrolled=true]_&]:ring-white/15 sm:[html[data-scrolled=true]_&]:px-6" data-astro-cid-5blmo7yk> <a href="/" class="flex shrink-0 items-center gap-3 transition hover:opacity-80" aria-label="OurJay Foundation home" data-astro-cid-5blmo7yk> <img src="/logo-white.png" alt="" width="160" height="60" class="h-12 w-auto sm:h-14 [html[data-scrolled=true]_&]:h-10 sm:[html[data-scrolled=true]_&]:h-11" data-astro-cid-5blmo7yk> <span class="sr-only" data-astro-cid-5blmo7yk>OurJay Foundation</span> </a> <ul class="hidden items-center gap-1 xl:flex" data-astro-cid-5blmo7yk> <li data-astro-cid-5blmo7yk> <a href="/" class="relative whitespace-nowrap rounded-full px-3 py-2 text-sm font-medium text-white/90 transition hover:text-white" data-astro-cid-5blmo7yk> Home </a> </li><li data-astro-cid-5blmo7yk> <a href="/jamie" class="relative whitespace-nowrap rounded-full px-3 py-2 text-sm font-medium text-white/90 transition hover:text-white" data-astro-cid-5blmo7yk> Jamie </a> </li><li data-astro-cid-5blmo7yk> <a href="/mission" class="relative whitespace-nowrap rounded-full px-3 py-2 text-sm font-medium text-white/90 transition hover:text-white" data-astro-cid-5blmo7yk> Mission </a> </li><li data-astro-cid-5blmo7yk> <a href="/map" class="relative whitespace-nowrap rounded-full px-3 py-2 text-sm font-medium text-white/90 transition hover:text-white" data-astro-cid-5blmo7yk> Defib map </a> </li><li data-festival-nav hidden data-astro-cid-5blmo7yk> <a href="/festival" class="relative whitespace-nowrap rounded-full px-3 py-2 text-sm font-medium text-white/90 transition hover:text-white" data-astro-cid-5blmo7yk> Festival </a> </li><li data-astro-cid-5blmo7yk> <a href="/news" class="relative whitespace-nowrap rounded-full px-3 py-2 text-sm font-medium text-white/90 transition hover:text-white" data-astro-cid-5blmo7yk> News </a> </li><li data-astro-cid-5blmo7yk> <a href="/events" class="relative whitespace-nowrap rounded-full px-3 py-2 text-sm font-medium text-white/90 transition hover:text-white" data-astro-cid-5blmo7yk> Events </a> </li><li data-astro-cid-5blmo7yk> <a href="/team" class="relative whitespace-nowrap rounded-full px-3 py-2 text-sm font-medium text-white/90 transition hover:text-white" data-astro-cid-5blmo7yk> Team </a> </li><li data-astro-cid-5blmo7yk> <a href="/jamieslaw" class="relative whitespace-nowrap rounded-full px-3 py-2 text-sm font-medium text-white/90 transition hover:text-white" data-astro-cid-5blmo7yk> #JamiesLaw </a> </li><li data-astro-cid-5blmo7yk> <a href="/get-in-touch" class="relative whitespace-nowrap rounded-full px-3 py-2 text-sm font-medium text-white/90 transition hover:text-white" data-astro-cid-5blmo7yk> Contact </a> </li> </ul> <div class="flex shrink-0 items-center gap-2" data-astro-cid-5blmo7yk> <button type="button" data-donate-open class="inline-flex min-h-[44px] items-center gap-2 rounded-full bg-white px-5 py-2.5 text-sm font-semibold text-brand-purple shadow-glow-purple transition hover:-translate-y-0.5 hover:bg-white/95" data-astro-cid-5blmo7yk> <svg viewBox="0 0 24 24" fill="currentColor" class="size-4" aria-hidden data-astro-cid-5blmo7yk> <path d="M12 21s-7.5-4.7-9.5-10.2C1.4 7.3 3.7 4 7 4c2 0 3.6 1.1 5 3 1.4-1.9 3-3 5-3 3.3 0 5.6 3.3 4.5 6.8C19.5 16.3 12 21 12 21z" data-astro-cid-5blmo7yk></path> </svg>
43Donate
44</button> <button type="button" data-nav-toggle aria-label="Toggle menu" aria-expanded="false" class="grid size-11 place-items-center rounded-full border border-white/30 bg-white/10 text-white backdrop-blur transition hover:bg-white/20 xl:hidden" data-astro-cid-5blmo7yk> <span class="relative block h-3.5 w-5" data-astro-cid-5blmo7yk> <span class="absolute left-0 top-0 h-0.5 w-5 bg-current transition [[data-nav-toggle][aria-expanded=true]_&]:translate-y-1.5 [[data-nav-toggle][aria-expanded=true]_&]:rotate-45" data-astro-cid-5blmo7yk></span> <span class="absolute left-0 top-1.5 h-0.5 w-5 bg-current transition [[data-nav-toggle][aria-expanded=true]_&]:opacity-0" data-astro-cid-5blmo7yk></span> <span class="absolute left-0 top-3 h-0.5 w-5 bg-current transition [[data-nav-toggle][aria-expanded=true]_&]:-translate-y-1.5 [[data-nav-toggle][aria-expanded=true]_&]:-rotate-45" data-astro-cid-5blmo7yk></span> </span> </button> </div> </nav> </div> <div data-nav-menu class="pointer-events-auto container-wide overflow-hidden opacity-0 transition-all duration-300 data-[open=true]:max-h-[80vh] data-[open=true]:opacity-100 xl:hidden" style="max-height: 0;" data-open="false" data-astro-cid-5blmo7yk> <ul class="mt-3 overflow-hidden rounded-2xl border border-ink-900/10 bg-white/95 p-3 shadow-soft backdrop-blur-xl" data-astro-cid-5blmo7yk> <li data-astro-cid-5blmo7yk> <a href="/" class="block rounded-xl px-4 py-3 text-base font-medium text-ink-900 transition hover:bg-surface-50 hover:text-brand-purple" data-astro-cid-5blmo7yk> Home </a> </li><li data-astro-cid-5blmo7yk> <a href="/jamie" class="block rounded-xl px-4 py-3 text-base font-medium text-ink-900 transition hover:bg-surface-50 hover:text-brand-purple" data-astro-cid-5blmo7yk> Jamie </a> </li><li data-astro-cid-5blmo7yk> <a href="/mission" class="block rounded-xl px-4 py-3 text-base font-medium text-ink-900 transition hover:bg-surface-50 hover:text-brand-purple" data-astro-cid-5blmo7yk> Mission </a> </li><li data-astro-cid-5blmo7yk> <a href="/map" class="block rounded-xl px-4 py-3 text-base font-medium text-ink-900 transition hover:bg-surface-50 hover:text-brand-purple" data-astro-cid-5blmo7yk> Defib map </a> </li><li data-festival-nav hidden data-astro-cid-5blmo7yk> <a href="/festival" class="block rounded-xl px-4 py-3 text-base font-medium text-ink-900 transition hover:bg-surface-50 hover:text-brand-purple" data-astro-cid-5blmo7yk> Festival </a> </li><li data-astro-cid-5blmo7yk> <a href="/news" class="block rounded-xl px-4 py-3 text-base font-medium text-ink-900 transition hover:bg-surface-50 hover:text-brand-purple" data-astro-cid-5blmo7yk> News </a> </li><li data-astro-cid-5blmo7yk> <a href="/events" class="block rounded-xl px-4 py-3 text-base font-medium text-ink-900 transition hover:bg-surface-50 hover:text-brand-purple" data-astro-cid-5blmo7yk> Events </a> </li><li data-astro-cid-5blmo7yk> <a href="/team" class="block rounded-xl px-4 py-3 text-base font-medium text-ink-900 transition hover:bg-surface-50 hover:text-brand-purple" data-astro-cid-5blmo7yk> Team </a> </li><li data-astro-cid-5blmo7yk> <a href="/jamieslaw" class="block rounded-xl px-4 py-3 text-base font-medium text-ink-900 transition hover:bg-surface-50 hover:text-brand-purple" data-astro-cid-5blmo7yk> #JamiesLaw </a> </li><li data-astro-cid-5blmo7yk> <a href="/get-in-touch" class="block rounded-xl px-4 py-3 text-base font-medium text-ink-900 transition hover:bg-surface-50 hover:text-brand-purple" data-astro-cid-5blmo7yk> Contact </a> </li> </ul> </div> </header>  <!--
45  Festival nav reveal. The festival link ships hidden; this checks the
46  live festival state and reveals it only while the event is active, so
47  it auto-disappears after the festival with no rebuild. Fail-closed:
48  if the fetch errors or the festival is inactive, the link stays
49  hidden. Spec 0020.
50--> 
50<script>(function(){const PUBLIC_API_BASE = "https://portal.ourjay.org.uk/api/v1/public";
51
52  (async function () {
53    try {
54      const res = await fetch(`${PUBLIC_API_BASE}/festival`, {
55        headers: { Accept: "application/json" },
56      });
57      if (!res.ok) return;
58      const state = await res.json();
59      if (state && state.active) {
60        document
61          .querySelectorAll("[data-festival-nav]")
62          .forEach((el) => (el.hidden = false));
63      }
64    } catch (_) {
65      /* leave the festival link hidden */
66    }
67  })();
68})();</script>
68 <main id="main" class="route-fullscreen-map__main"> <h1 class="sr-only">Find your nearest public defibrillator on the OurJay map</h1> <div data-map data-api-url="https://portal.ourjay.org.uk/api/v1/public/defibs" class="absolute inset-0" aria-label="Map showing OurJay Foundation defibrillator locations"></div> <!-- Top-right overlay: data status (count + errors). Sits clear of
69         the floating pill nav by anchoring below it. --> <div data-map-status data-tone="muted" class="pointer-events-none absolute right-3 top-24 z-20 rounded-full bg-surface-950/85 px-4 py-2 text-xs font-medium text-white/85 shadow-soft backdrop-blur-md sm:right-4 sm:top-28 sm:text-sm">
70Loading defibrillators...
71</div> <!-- Top-left overlay: Map / List view toggle. Mirrors the one on
72         /map/list. Sits below the floating pill nav. --> <div class="absolute left-3 top-24 z-20 inline-flex rounded-full border border-white/10 bg-surface-950/85 p-0.5 text-xs font-semibold shadow-soft backdrop-blur-md sm:left-4 sm:top-28" role="tablist" aria-label="Defib view"> <span class="rounded-full bg-white/95 px-3.5 py-1.5 text-ink-900" role="tab" aria-selected="true">
73Map
74</span> <a href="/map/list" class="rounded-full px-3.5 py-1.5 text-white/80 hover:text-white" role="tab" aria-selected="false">
75List
76</a> </div> <!-- Bottom-left overlay: W3W grid affordance. Above the map but
77         below any popup. Compact on mobile. --> <div data-map-grid-hint class="pointer-events-none absolute left-3 bottom-3 z-20 max-w-[60vw] rounded bg-white/90 px-2.5 py-1.5 text-[11px] font-medium leading-tight text-ink-900 shadow-soft backdrop-blur sm:left-4 sm:bottom-4 sm:max-w-none sm:text-xs">
78Zoom in to see the What3Words 3 m grid
79</div> <!-- Bottom-right overlay: collapsible legend. Closed by default on
80         mobile to save room; open on >= sm. The native <details>/
81         <summary> pair handles toggle state with zero JS. --> <details class="absolute bottom-3 right-3 z-20 max-w-[16rem] overflow-hidden rounded-2xl border border-ink-900/5 bg-white/95 text-ink-900 shadow-soft backdrop-blur-md sm:bottom-4 sm:right-4" open> <summary class="flex cursor-pointer list-none items-center justify-between gap-3 px-4 py-2.5 text-[11px] font-semibold uppercase tracking-[0.18em] text-ink-700 [&::-webkit-details-marker]:hidden">
82Legend
83<svg viewBox="0 0 16 16" class="size-4 transition group-open:-rotate-180" fill="none" aria-hidden> <path d="M4 6l4 4 4-4" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"></path> </svg> </summary> <ul class="space-y-1.5 px-4 pb-3 pt-1 text-xs"> <li class="flex items-center gap-2"> <span class="inline-block size-3 shrink-0 rounded-full border border-ink-300" style="background:#1d6fb8"></span>
84Defibrillator
85</li> <li class="flex items-center gap-2"> <span class="inline-block size-3 shrink-0 rounded-full border border-ink-300" style="background:linear-gradient(90deg,#1d6fb8 0%,#1d6fb8 50%,#c0392b 50%,#c0392b 100%)"></span>
86With bleed kit
87</li> <li class="flex items-center gap-2"> <span class="inline-block size-3 shrink-0 rounded-full border" style="background:#1f8a4c;border-color:#1f8a4c"></span>
88Ready
89</li> <li class="flex items-center gap-2"> <span class="inline-block size-3 shrink-0 rounded-full border" style="background:#c97a0e;border-color:#c97a0e"></span>
90Expiring soon
91</li> <li class="flex items-center gap-2"> <span class="inline-block size-3 shrink-0 rounded-full border" style="background:#c0392b;border-color:#c0392b"></span>
92Expired / Not ready
93</li> <li class="flex items-center gap-2 border-t border-ink-900/5 pt-1.5"> <svg viewBox="0 0 38 44" class="size-3.5 shrink-0" aria-hidden="true"> <path d="M19 2 L34 7 L34 22 C34 31 27 39 19 42 C11 39 4 31 4 22 L4 7 Z" fill="#0E2A56" stroke="rgba(255,255,255,0.9)" stroke-width="2"></path> </svg>
94Police force HQ
95</li> </ul> <p class="border-t border-ink-900/5 px-4 py-2 text-[10px] leading-snug text-ink-500">
96In an emergency, always call 999 first.
97</p> </details> </main>    <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/maplibre-gl.css" crossorigin="anonymous">  
97<script type="module" src="/_astro/map.astro_astro_type_script_index_0_lang.B1qLNB-x.js"></script>
97  <!--
98      Site-wide donate modal. Mounted once at the layout level so any
99      page can trigger it by adding `data-donate-open` to a button or
100      link. See DonateModal.astro for the contract.
101    --> <!--
102  Dialog uses the native <dialog> element so we get a free, browser-
103  managed top-layer stacking context and focus trap on showModal().
104  We layer a custom backdrop on top of the default ::backdrop because
105  the default one isn't blurry enough to feel premium.
106--><dialog data-donate-modal aria-labelledby="donate-modal-title" class="m-0 w-full max-w-[560px] rounded-3xl border border-ink-900/10 bg-white p-0 text-ink-900 shadow-soft backdrop:bg-surface-950/65 backdrop:backdrop-blur-md open:animate-[donate-pop_0.3s_ease-out] sm:rounded-[2rem]"> <!--
107    overflow-hidden clips the decorative glow blobs below to this wrapper.
108    Without it the right-hand blob (-right-24, i.e. 96px past the edge) pushed
109    the dialog wider than its content and the dialog's overflow-x:auto turned
110    that into a sideways scrollbar. Clipping here (not on the dialog) keeps the
111    blobs contained without risking vertical clipping of the form on short
112    screens.
113  --> <div class="relative overflow-hidden"> <!-- Soft brand glow at the top of the modal card --> <div aria-hidden class="pointer-events-none absolute -left-20 -top-20 size-72 rounded-full bg-brand-cyan/30 blur-3xl"></div> <div aria-hidden class="pointer-events-none absolute -right-24 -top-24 size-72 rounded-full bg-brand-purple/30 blur-3xl"></div> <!-- Close button --> <button type="button" data-donate-close aria-label="Close donate dialog" class="absolute right-4 top-4 z-10 grid size-10 place-items-center rounded-full border border-ink-900/10 bg-white/90 text-ink-700 shadow-soft backdrop-blur transition hover:-translate-y-0.5 hover:bg-white"> <svg viewBox="0 0 24 24" fill="none" class="size-5" aria-hidden> <path d="M6 6l12 12M18 6L6 18" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path> </svg> </button> <div class="relative px-6 pb-6 pt-8 sm:px-10 sm:pb-8 sm:pt-10"> <!-- Header --> <div class="text-center"> <span class="eyebrow">Make a donation</span> <h2 id="donate-modal-title" class="mt-3 font-display text-3xl font-bold leading-tight text-ink-900 sm:text-4xl">
114Every pound goes on a wall.
115</h2> <p class="mx-auto mt-4 max-w-md text-sm leading-relaxed text-ink-700 sm:text-base">
116No salaries, no offices. Donations buy defibs, bleed kits, and
117          CPR training in Jamie's name.
118</p> </div> <!--
119        DonorBox inline embed. The widget script (loaded once in
120        Layout.astro) upgrades this custom element into an auto-growing
121        iframe. enable-auto-scroll keeps the active step in view as the
122        form grows; the modal body scrolls if the embed gets tall.
123      --> <div class="dbox-embed mt-6 max-h-[68vh] overflow-y-auto overflow-x-hidden"> <dbox-widget campaign="ourjay-foundation-public-access-defibrillator-fundraising" type="donation_form" interval="1 M" enable-auto-scroll="true"></dbox-widget> </div> <p class="mt-4 text-center text-[11px] leading-relaxed text-ink-500">
124Donations process securely via  <a href="https://donorbox.org/" target="_blank" rel="noreferrer noopener" class="text-brand-purple underline-offset-4 hover:underline">
125DonorBox
126</a>
127. We never see or store your card details.
128</p> </div> </div> </dialog>  
128<script>
129  (function () {
130    const dialog = document.querySelector("dialog[data-donate-modal]");
131    if (!dialog) return;
132    const triggers = document.querySelectorAll("[data-donate-open]");
133    const closeBtn = dialog.querySelector("[data-donate-close]");
134
135    function openModal() {
136      if (dialog.open) return;
137      // Lock the background scroll while the modal is open. Removing the page
138      // scrollbar would shift everything (and pull the centred modal ~7px off
139      // centre), so compensate the body with padding equal to the scrollbar
140      // width to keep the layout (and the modal centring) rock-steady.
141      var scrollbar = window.innerWidth - document.documentElement.clientWidth;
142      document.body.style.overflow = "hidden";
143      if (scrollbar > 0) document.body.style.paddingRight = scrollbar + "px";
144      dialog.showModal();
145    }
146    function closeModal() {
147      if (!dialog.open) return;
148      dialog.close();
149      document.body.style.overflow = "";
150      document.body.style.paddingRight = "";
151    }
152
153    triggers.forEach(function (t) {
154      t.addEventListener("click", function (e) {
155        e.preventDefault();
156        openModal();
157      });
158    });
159
160    closeBtn?.addEventListener("click", closeModal);
161
162    // Close on backdrop click. Native <dialog> doesn't do this by default.
163    // The DonorBox iframe swallows clicks inside the form, so a click that
164    // reaches the dialog element outside its content box is a backdrop tap.
165    dialog.addEventListener("click", function (e) {
166      const rect = dialog.getBoundingClientRect();
167      const inside =
168        e.clientX >= rect.left &&
169        e.clientX <= rect.right &&
170        e.clientY >= rect.top &&
171        e.clientY <= rect.bottom;
172      if (!inside) closeModal();
173    });
174  })();
175</script>
175 <!--
176      DonorBox inline-embed widget script. Loaded once for the whole site so
177      the <dbox-widget> inside DonateModal renders its auto-growing iframe.
178      User-approved third-party script (donation widget) - overrides the
179      default no-third-party-scripts rule for this single case.
180    --> 
180<script type="module" src="https://donorbox.org/widgets.js" async></script>
180 
180<script type="module" src="/_astro/Layout.astro_astro_type_script_index_0_lang.De7auqgm.js"></script>
180 </body> </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.