/* PL1 marketing — shared system components. Exports to window so other Babel scripts can use them. */ const { useState, useEffect, useRef, Fragment } = React; /* ──────────────────────────────────────────────────────────────── Logo mark — inlined for theme-aware swatch & for use as anchor. The SVG below is a reference to the delivered vector; we use an for raster pixel fidelity, but expose a CSS-mask variant when we want to recolor the mark inside dark blocks. ──────────────────────────────────────────────────────────────── */ function LogoMark({ size = 40, variant = "full" }) { // variant="full" → the rendered logo as-is (neon green + black) // variant="mono" → mark recolored to currentColor via mask if (variant === "mono") { return ( ); } return ( PL1 Goalkeeping Academy ); } /* ──────────────────────────────────────────────────────────────── Slim static header — fixed-height, brand mark + nav + two CTAs. Behaves as a static element inside each artboard. ──────────────────────────────────────────────────────────────── */ function SiteHeader({ active = "home" }) { const nav = [ { id: "home", label: "Home" }, { id: "programs", label: "Programs" }, { id: "coaches", label: "Coaches & about" }, { id: "testimonials", label: "Results" }, { id: "contact", label: "Contact" }, ]; return (
PL1 Goalkeeping Academy
Log in Explore
); } /* small arrow glyph used inside CTAs */ function ArrowGlyph({ size = 14 }) { return ( ); } /* ──────────────────────────────────────────────────────────────── Static footer — 4 columns + base row + giant background mark. ──────────────────────────────────────────────────────────────── */ function SiteFooter() { return ( ); } function FooterSocial({ label }) { return ( {label} ); } /* The PL1 mark used HUGE as a footer anchor — bleed off the edge */ function BigMarkAnchor() { return (
); } /* ──────────────────────────────────────────────────────────────── Angular section break — the energy system divider. ──────────────────────────────────────────────────────────────── */ function Slash({ flip = false, variant = "accent" }) { const cls = ["slash", flip ? "slash--flip" : "", variant === "inverse" ? "slash--inverse" : ""].filter(Boolean).join(" "); return
; } /* ──────────────────────────────────────────────────────────────── Photo slot — premium green-duotone placeholder. Author sets aspect and caption; ratio prop = w/h ──────────────────────────────────────────────────────────────── */ function PhotoSlot({ caption, ratio = "4 / 3", className = "", style = {} }) { return (
{caption || "image"}
); } /* ──────────────────────────────────────────────────────────────── Page wrapper — sets theme via data-theme attr. ──────────────────────────────────────────────────────────────── */ function Page({ theme = "light", children, density = "desktop" }) { return (
{children}
); } /* ──────────────────────────────────────────────────────────────── "25" big stat block — the proof moment, reused across pages. ──────────────────────────────────────────────────────────────── */ function StatProof({ compact = false }) { return (
25
The receipt

25 PL1 graduates are currently signed to professional academies across England — from Premier League to League Two.

); } /* expose to other Babel scripts */ Object.assign(window, { LogoMark, SiteHeader, SiteFooter, ArrowGlyph, Slash, PhotoSlot, Page, StatProof, BigMarkAnchor, });