{"version":3,"file":"GlobalNav.Bbkx-R75.mjs","names":["useRef","useState","_Fragment","Logo"],"sources":["https:/framer.com/m/Logo-igZRe.js","https:/framerusercontent.com/modules/8Y71Nyf0HFegVWyT4pQ6/uToswfM6oRhXz8Ft6Vj5/GlobalNav.js"],"sourcesContent":["/*\n * Logo\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/yQMZBWTR4cJdlBH8Csuh/DdZuBx634WBnu2PSvohF/pKlPQLbfP.js\"\nexport { default } from \"https://framerusercontent.com/modules/yQMZBWTR4cJdlBH8Csuh/DdZuBx634WBnu2PSvohF/pKlPQLbfP.js\"\n","import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{useState,useEffect,useRef}from\"react\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{motion,AnimatePresence}from\"framer-motion\";import Logo from\"https://framer.com/m/Logo-igZRe.js\";const NAV_HEIGHT=64;// Shared site breakpoint: below this width the nav collapses to the hamburger\n// menu. Set at 1024 so every tablet in portrait (768/820/834) gets the clean\n// mobile menu, while tablet landscape (1024+) keeps the one-line nav.\nconst MOBILE_BREAKPOINT=1024;// Native Framer sections follow the PROJECT breakpoints, not the 1024 code scheme.\n// Framer's stacked \"Tablet\" variant is active up to 1199px (iPad landscape ~1194\n// lands here), so the sticky-title un-stick must reach 1199, not 1024.\nconst STICKY_UNSTICK_MAX=1199;// Framer Phone breakpoint top. Below this we swap the native Anim Videos gallery\n// for the ResultsMobileStack code component (see project notes).\nconst PHONE_MAX=809;// Logo width, also used as the right-hand spacer width when the CTA pill is\n// hidden so the centred nav links stay optically centred (see LOGO_SPACER below).\nconst LOGO_WIDTH=140;const CF_WATCH_RE=/https?:\\/\\/customer-[a-z0-9]+\\.cloudflarestream\\.com\\/([a-f0-9]+)\\/watch/i;// YouTube lightbox support (added 2026-06-04 for the Batavia card). Matches\n// the common YouTube URL shapes and captures the 11-char video id:\n//   youtube.com/watch?v=ID , youtu.be/ID , youtube.com/embed/ID , /shorts/ID\nconst YT_RE=/(?:youtube\\.com\\/(?:watch\\?(?:.*&)?v=|embed\\/|shorts\\/)|youtu\\.be\\/)([A-Za-z0-9_-]{11})/i;const CF_SUBDOMAIN=\"customer-w7eb0upuhmosufj1.cloudflarestream.com\";const HLS_JS_URL=\"https://cdn.jsdelivr.net/npm/hls.js@1.5.13/dist/hls.min.js\";// Stable id on the lightbox backdrop. Used to focus it on open WITHOUT relying\n// on a React ref — see the focus note in the ESC effect below.\nconst LIGHTBOX_ID=\"pj-lightbox\";// 2026-08-04 — nav updated to Ed's locked structure:\n// About Us · Services ▾ · Pricing · Juice Press · Contact Us.\n// \"Workshops\" is GONE: public workshops were dropped, and workshops are now sold\n// through /pricing and /services/ai-strategy instead of their own nav item.\n// 2026-10-01: overrides are now IGNORED in code (see the links block in the\n// component) — DEFAULT_NAV_LINKS is the single source for every page's nav.\n// Editing the DEFAULT here is the only one-shot way to change every page's nav,\n// because the Framer MCP cannot write Array property controls — it can only be\n// done per-instance by hand in the property panel otherwise. Any page whose nav\n// instance has navLinks set in the panel OVERRIDES this default; the homepage's\n// override was CLEARED on 2026-08-10, but other pages may still carry one.\n// Safe to edit on a branch: code files were confirmed branch-scoped 2026-08-04.\n//\n// 2026-08-10 — added \"Our Work\" as the FIRST top-level item, linking to\n// /the-vault, per Ed's homepage review (his nav list: Work · Services · About ·\n// Pricing · Insights · Contact). One deliberate departure from Ed's list:\n// \"Juice Press\" is NOT renamed to \"Insights\" — it is a deliberate brand pun and\n// an established section name; Simon's call on 10 August was to keep it.\n// servicesPosition stays 1, so the rendered order is:\n//   Our Work · Services ▾ · About Us · Juice Press · Contact Us.\n//\n// 2026-08-17 — \"Pricing\" REMOVED from the nav and /pricing set to Draft, on\n// Simon's instruction. The page keeps its content and schema so it can be\n// switched back on; it was never live in production (pixeljuice.ai/pricing\n// 404s and is absent from the prod sitemap), so nothing was lost by hiding it.\n// Every price still appears on its service page in both copy and schema, and\n// in llms.txt, so pricing answers survive. If the page is restored, add the\n// item back here AND check per-instance navLinks overrides (see note above).\nconst DEFAULT_NAV_LINKS=[{label:\"Our Work\",href:\"/the-vault\"},{label:\"About Us\",href:\"/about\"},{label:\"Juice Press\",href:\"/juice-press\"},{label:\"Contact Us\",href:\"/contact\"}];// 2026-08-04 — replaced the eight legacy service pages with Ed's five locked\n// services. The old paths (tvc, brand-films, product-videos, corporate-b2b,\n// social-media-content, print-ooh, scene-recreations, animation-character-ip)\n// are being retired and still need 301s; leaving them in the nav dropdown would\n// have kept driving traffic into pages scheduled for deletion.\n//\n// 2026-08-10 — RE-POINTED to the five NEW service pages built from Ed's\n// service-page brief. Simon's call was to build fresh pages rather than\n// restructure the existing ones, so these are new routes.\n// ⚠️ These are REVIEW paths, not final ones. The keyword-bearing URLs\n// (/services/explainer-videos above all) are still occupied by the OLD pages,\n// and Framer cannot rename a page path — so the old URLs must be 301'd across\n// to these before publish, or the SEO history is stranded.\n// ⚠️ The old pages still hold the FAQ sections, the pricing tiers and ALL the\n// JSON-LD (Service + FAQPage). The new pages have none of that yet, and no\n// imagery. Repointing the dropdown moves traffic to the thinner pages — that\n// was a deliberate decision on 10 August, not an oversight. If the new pages\n// are not ready to publish, revert these five hrefs, NOT the whole file.\n//\n// 2026-08-24 — Services labels now come from the exposed `servicesItems` control\n// again (labels only), while destination paths stay locked to the five service\n// routes below. This keeps page behavior/links stable while making the dropdown\n// copy editable from Framer.\nconst DEFAULT_SERVICES=[{label:\"Explainer Videos\",href:\"/services/explain\"},{label:\"Vision & Pitch Films\",href:\"/services/win-support\"},{label:\"Brand Films\",href:\"/services/tell-your-story\"},{label:\"Historical Films\",href:\"/services/history\"},{label:\"AI Consulting\",href:\"/services/ai-consulting-training\"}];// 2026-08-10 — the CTA pill is now OPT-IN and defaults to HIDDEN.\n// The nav carried BOTH a \"Contact Us\" text link and a black \"Contact →\" pill,\n// which read as two contact buttons. Simon's call was to keep the text link and\n// drop the pill. The pill previously rendered unconditionally (`ctaLabel ?? \"Contact →\"`),\n// so an empty label produced an empty black pill rather than removing it — hence\n// the explicit showCta check below. Set a CTA Label on an instance to bring the\n// pill back on that page.\nconst DEFAULT_CTA_LABEL=\"\";// 2026-08-11 — DARK-HERO / OVERLAY SUPPORT (added for the /full-bleed-test page).\n// Three OPT-IN props, all defaulting to the exact previous behaviour, so every\n// existing page renders byte-identically unless it explicitly opts in:\n//\n//   lightText — flips link, hamburger and dropdown colours to white, and gives\n//               the dropdown + mobile menu a solid dark panel. Needed because a\n//               transparent nav over dark footage would otherwise render the\n//               default near-black links invisible.\n//\n//   overlay   — REMOVES A DOUBLE RESERVE. Read this before using it; it is not\n//               what its name suggests. The nav renders position:fixed, so this\n//               component injects `html { padding-top: 64px }` to push the page\n//               clear of it. But the GlobalNav LAYER also still occupies 64px in\n//               the page stack, and that slot is empty because the real bar is\n//               fixed on top of it. Result: 128px of space reserved for a 64px\n//               bar, i.e. a 64px dead gap under the nav on EVERY page.\n//               Setting overlay drops the html padding, leaving the empty layer\n//               to supply the 64px on its own — so the first section starts\n//               flush under the bar with no gap and nothing hidden.\n//               ⚠️ Corrected 2026-08-11: this was first documented as \"content\n//               runs UNDER the nav, so the first section must clear the bar\n//               itself\". That is WRONG for every page in this project, because\n//               every page's first child IS the nav layer, which already\n//               provides the clearance. It would only be true on a page that\n//               did not start with a GlobalNav layer.\n//               The padding is injected once per document, so `styleVersion`\n//               below includes the overlay state — otherwise navigating from an\n//               overlay page to a normal one would keep the wrong padding.\n//               ⚠️ NOT YET APPLIED SITE-WIDE. As of 2026-08-11 only\n//               /full-bleed-test sets it. The 64px gap is almost certainly on\n//               every other page too; it goes unnoticed because those pages open\n//               with padded sections, so it reads as generous spacing rather\n//               than a gap. It was only obvious against a full-bleed video's\n//               hard top edge. Verify on /about before switching pages over.\n//\n//   whiteLogo — renders the logo solid white via a filter. The imported Logo\n//               component is external (framer.com/m/Logo-igZRe.js) and has no\n//               colour prop, so this is the only lever available. It flattens\n//               the pink mark to white; turn it off if the logo reads fine.\nconst DEFAULT_LIGHT_TEXT=false;const DEFAULT_OVERLAY=false;const DEFAULT_WHITE_LOGO=false;let hlsLoadingPromise=null;function loadHlsJs(){if(typeof window===\"undefined\")return Promise.resolve(null);const w=window;if(w.Hls)return Promise.resolve(w.Hls);if(hlsLoadingPromise)return hlsLoadingPromise;hlsLoadingPromise=new Promise((resolve,reject)=>{const existing=document.querySelector(`script[data-pj-hls=\"true\"]`);if(existing){existing.addEventListener(\"load\",()=>resolve(w.Hls));existing.addEventListener(\"error\",reject);return;}const s=document.createElement(\"script\");s.src=HLS_JS_URL;s.async=true;s.dataset.pjHls=\"true\";s.onload=()=>resolve(w.Hls);s.onerror=reject;document.head.appendChild(s);});return hlsLoadingPromise;}function LightboxVideo({videoUID}){const videoRef=useRef(null);useEffect(()=>{const video=videoRef.current;if(!video)return;const hlsUrl=`https://${CF_SUBDOMAIN}/${videoUID}/manifest/video.m3u8`;let hls=null;let cancelled=false;// hls.js FIRST; native HLS only where hls.js can't run (iOS Safari, no MSE).\n// Do NOT gate this on canPlayType(\"application/vnd.apple.mpegurl\") — every\n// Chromium browser returns the truthy string \"maybe\" but has no real ABR,\n// so that check sent Chrome/Edge/Brave/Opera/Arc down the native path and\n// pinned the reel to a low rendition. Firefox returns \"\" and so always got\n// hls.js, which is why this only ever looked broken in Chrome. Fixed\n// 2026-08-04; same fix applied in CloudflareVideo.tsx (see its v2.4 note).\nconst useNative=()=>{if(!cancelled&&videoRef.current)videoRef.current.src=hlsUrl;};loadHlsJs().then(Hls=>{if(cancelled||!videoRef.current)return;if(Hls&&Hls.isSupported()){hls=new Hls;hls.loadSource(hlsUrl);hls.attachMedia(videoRef.current);}else{useNative();}}).catch(useNative);// Put keyboard focus on the <video> itself, not the backdrop.\n// 2026-08-04: SPACE did nothing because the browser only maps space to\n// play/pause when the video element itself holds focus — and it couldn't\n// even fall back to scrolling, since the lightbox locks body scroll. With\n// focus here, space plays/pauses and the arrow keys seek, as people\n// expect. ESC is unaffected: the video is inside this document, so the\n// window-level capture listener in GlobalNav still sees the key.\nconst focusRaf=requestAnimationFrame(()=>{if(!cancelled&&videoRef.current){videoRef.current.focus({preventScroll:true});// 2026-08-19: strip the native fullscreen control. The lightbox\n// is now full-bleed on a phone, so fullscreen gains nothing -\n// and entering it hands the screen to the OS player, which\n// hides our close button and leaves no obvious way back.\n// Chromium honours this; iOS Safari ignores controlsList, so\n// the button can still appear there.\nvideoRef.current.setAttribute(\"controlsList\",\"nofullscreen nodownload noplaybackrate\");videoRef.current.disablePictureInPicture=true;}});return()=>{cancelled=true;cancelAnimationFrame(focusRaf);if(hls){try{hls.destroy();}catch(e){}}};},[videoUID]);return /*#__PURE__*/_jsx(\"video\",{ref:videoRef,controls:true,playsInline:true,preload:\"metadata\",style:{position:\"absolute\",top:0,left:0,width:\"100%\",height:\"100%\",objectFit:\"cover\",background:\"#000\",border:\"none\",outline:\"none\"}});}// YouTube embed for the lightbox — autoplays, hides related-video clutter.\n// Deliberately NOT focused on open: focus inside a cross-origin iframe sends\n// every keystroke to YouTube's document, which would kill ESC entirely.\nfunction LightboxYouTube({videoId}){const src=`https://www.youtube-nocookie.com/embed/${videoId}?autoplay=1&rel=0&modestbranding=1&playsinline=1`;return /*#__PURE__*/_jsx(\"iframe\",{src:src,title:\"Video\",allow:\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen\",allowFullScreen:true,style:{position:\"absolute\",top:0,left:0,width:\"100%\",height:\"100%\",border:\"none\",background:\"#000\"}});}/**\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight fixed\n * @framerIntrinsicHeight 64\n * @framerIntrinsicWidth 1440\n */export default function GlobalNav({bgColor,borderColor,navLinks,servicesLabel,servicesItems,servicesPosition,ctaLabel,ctaHref,lightText,overlay,whiteLogo}){const bg=bgColor||\"rgb(255, 255, 255)\";const border=borderColor||\"rgb(230, 230, 230)\";// 2026-08-17 — /pricing is hidden (page set to Draft on Simon's call). Most\n// pages still carry a per-instance navLinks override in the property panel,\n// which MCP cannot rewrite, so removing the item from DEFAULT_NAV_LINKS alone\n// left \"Pricing\" in the nav on every page EXCEPT Home (whose override was\n// cleared on 2026-08-10). Filtering here catches every instance regardless of\n// its override. To restore: delete HIDDEN_NAV_HREFS and re-add the item to\n// DEFAULT_NAV_LINKS. Same \"ignore the prop\" pattern as the Services menu below.\nconst HIDDEN_NAV_HREFS=[\"/pricing\"];// 2026-10-01 — per-instance navLinks overrides are now IGNORED: every page\n// renders DEFAULT_NAV_LINKS. The /juice-press/:slug template still carried a\n// pre-August override (About Us · Workshops → / · Juice Press · Contact Us),\n// so all 13 blog posts showed \"Workshops\" pointing at the homepage and no\n// \"Our Work\". MCP cannot clear an Array control, and every other page already\n// rendered exactly DEFAULT_NAV_LINKS (verified on all 10 live non-blog pages),\n// so ignoring the prop changes the blog posts only. To change the nav, edit\n// DEFAULT_NAV_LINKS above — the panel's navLinks control no longer does anything.\nvoid navLinks;const links=DEFAULT_NAV_LINKS.filter(l=>!HIDDEN_NAV_HREFS.includes(l.href));// Services labels are configurable from `servicesItems`, but hrefs remain\n// locked to DEFAULT_SERVICES so page destinations stay unchanged.\nconst configuredServices=Array.isArray(servicesItems)?servicesItems:DEFAULT_SERVICES;const services=DEFAULT_SERVICES.map((service,index)=>{const configuredLabel=configuredServices[index]?.label;return{...service,label:typeof configuredLabel===\"string\"&&configuredLabel.trim().length>0?configuredLabel:service.label};});const servLabel=servicesLabel??\"Services\";const showServices=services.length>0&&servLabel.trim().length>0;const servPos=Math.min(Math.max(typeof servicesPosition===\"number\"?servicesPosition:1,0),links.length);const cta=ctaLabel??DEFAULT_CTA_LABEL;const ctaTo=ctaHref??\"/contact\";// Empty label hides the pill entirely rather than rendering an empty one.\nconst showCta=cta.trim().length>0;// Dark-hero opt-ins. See the DEFAULT_LIGHT_TEXT block above.\nconst light=lightText===true;const isOverlay=overlay===true;const invertLogo=whiteLogo===true;// Text colour for links, the dropdown caret and the hamburger icon.\nconst textColor=light?\"rgb(255, 255, 255)\":\"rgb(23, 23, 23)\";// The dropdown and mobile menu previously inherited `bg`. With a transparent\n// overlay nav that would make them transparent too, so they get their own\n// solid dark panel in light mode.\nconst panelBg=light?\"rgb(23, 23, 23)\":bg;const mobilePanelBg=light?\"rgb(18, 18, 18)\":bg;const panelBorder=light?\"rgba(255, 255, 255, 0.22)\":border;const subLinkColor=light?\"rgba(255, 255, 255, 0.72)\":\"rgb(60, 60, 60)\";const hoverBg=light?\"rgba(255, 255, 255, 0.09)\":\"rgb(248, 248, 248)\";const[isMobile,setIsMobile]=useState(false);const[isTouch,setIsTouch]=useState(false);const[mobileOpen,setMobileOpen]=useState(false);const[mobileServicesOpen,setMobileServicesOpen]=useState(false);const[servicesOpen,setServicesOpen]=useState(false);const[lightbox,setLightbox]=useState(null);const dropdownRef=useRef(null);const closeBtnRef=useRef(null);const lastFocusRef=useRef(null);const isCanvas=RenderTarget.current()===RenderTarget.canvas;useEffect(()=>{if(isCanvas)return;const styleId=\"pj-global-nav-style\";// Bump styleVersion whenever the injected CSS below changes, so the\n// stylesheet is replaced instead of skipped on client-side navigation.\n// The overlay state is part of the version deliberately: the html\n// padding-top differs between overlay and normal pages, and without it\n// in the key a client-side navigation between the two would keep the\n// first page's padding.\nconst styleVersion=`v6-hero-height-${isOverlay?\"overlay\":\"padded\"}`;const existing=document.getElementById(styleId);if(existing&&existing.getAttribute(\"data-version\")===styleVersion)return;if(existing)existing.remove();const el=document.createElement(\"style\");el.id=styleId;el.setAttribute(\"data-version\",styleVersion);el.textContent=`\nhtml { padding-top: ${isOverlay?0:NAV_HEIGHT}px !important; box-sizing: border-box; }\n/* Inner-page heroes (layer name \"HERO \") are full/large height with\n   justify-content:center, which floats the content down and leaves a big gap\n   under the nav. Size them to their content instead. The hero photo is a\n   separate layer (\"HERO PHOTO\"), not matched here, so it keeps its size.\n   Homepage uses the HomepageHero code component (not this layer) — unaffected.\n   Hooked on the Framer layer name; if a page's hero is renamed, update this. */\n[data-framer-name=\"HERO \"], [data-framer-name=\"HERO\"] {\n  height: auto !important;\n  min-height: 0 !important;\n}\n/* Homepage sticky section titles (\"Latest Work — Sydney\" and \"How we work\")\n   pin in their column on the side-by-side desktop layout. On Framer's stacked\n   Tablet/Phone variants (active up to ${STICKY_UNSTICK_MAX}px — note: project\n   breakpoints, NOT the 1024 code-component scheme, so this must reach into the\n   iPad-landscape ~1194 range) a pinned title floats over the cards, so disable\n   sticky there. Targeted by Framer-generated class names; if either section is\n   restyled and Framer regenerates these hashes, re-grab them from the live DOM\n   (querySelectorAll for position:sticky) and update here. See project notes.\n   NOTE 2026-08-04: the \"How we work\" homepage section was DELETED, so one of\n   these two hashes is now stale. Harmless, but re-verify both if this is\n   touched again. */\n@media (max-width: ${STICKY_UNSTICK_MAX}px) {\n  .framer-1twjdi4, .framer-1l0zvuk { position: relative !important; top: auto !important; }\n}\n/* Homepage Results \"Anim Videos\" gallery (.framer-lqa4oa = its instance root,\n   grabbed from live DOM) doesn't work on a narrow phone — hide it below the\n   Framer Phone breakpoint; the ResultsMobileStack code component shows the same\n   clips as a vertical stack there. Same hash fragility as the sticky rule. */\n@media (max-width: ${PHONE_MAX}px) {\n  .framer-lqa4oa { display: none !important; }\n}`;document.head.appendChild(el);},[isCanvas,isOverlay]);useEffect(()=>{if(isCanvas)return;const update=()=>setIsMobile(window.innerWidth<MOBILE_BREAKPOINT);update();window.addEventListener(\"resize\",update);return()=>window.removeEventListener(\"resize\",update);},[isCanvas]);// Touch-primary devices (iPad, phones): Safari renders <video> on its own\n// compositing layer that lags a CSS scale transform, so the open animation's\n// scale-up makes the video visibly \"bump\" to size. Detect touch and switch\n// the lightbox open animation to fade-only (no scale) for those devices.\nuseEffect(()=>{if(isCanvas)return;if(typeof window===\"undefined\"||!window.matchMedia)return;setIsTouch(window.matchMedia(\"(hover: none) and (pointer: coarse)\").matches);},[isCanvas]);useEffect(()=>{if(isCanvas)return;const handler=e=>{if(e.defaultPrevented)return;if(e.button!==0)return;if(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;const target=e.target;const a=target?.closest(\"a\");if(!a)return;const href=a.href||\"\";// Cloudflare Stream /watch link → HLS lightbox\nconst cf=href.match(CF_WATCH_RE);if(cf){e.preventDefault();e.stopPropagation();lastFocusRef.current=document.activeElement;setLightbox({type:\"cf\",uid:cf[1]});return;}// YouTube link → YouTube embed lightbox\nconst yt=href.match(YT_RE);if(yt){e.preventDefault();e.stopPropagation();lastFocusRef.current=document.activeElement;setLightbox({type:\"youtube\",id:yt[1]});return;}};document.addEventListener(\"click\",handler,true);return()=>document.removeEventListener(\"click\",handler,true);},[isCanvas]);// ESC-to-close + scroll lock + focus management.\n//\n// The keydown listener is on window in the CAPTURE phase, so it runs before\n// the event reaches whatever is focused — nothing inside the page can eat the\n// key first. For the Cloudflare path, LightboxVideo focuses the <video>\n// itself (so space/arrows drive playback); this block focuses the backdrop as\n// a fallback, which is what the YouTube path gets.\n//\n// 2026-08-04 — do NOT focus via a React ref on the <motion.div>. An earlier\n// attempt did exactly that and silently did nothing: in Framer's bundled\n// framer-motion the ref never resolved to the DOM node, so focus stayed on\n// <body>. Verified live — manually focusing the same element worked and held,\n// proving the element was fine and the ref was the problem. Query it by id\n// instead, and fall back to the close <button> (a plain DOM element).\n//\n// Cases no page-level handler can catch, by browser design:\n//   1. Native video fullscreen — the browser eats the first ESC to leave\n//      fullscreen; a second ESC then closes the lightbox.\n//   2. Focus inside the cross-origin YouTube iframe — keys go to YouTube's\n//      document, not ours. The X button and backdrop click still work.\n//   3. Framer's on-page editor (only ever visible to a logged-in Framer user\n//      browsing the published site) claims ESC before the page does. Confirmed\n//      2026-08-04: in that session ESC never reached the page at all, while a\n//      clean session on the same build received it and closed normally. Not a\n//      site bug and not fixable here — visitors are unaffected.\nuseEffect(()=>{if(!lightbox)return;const onKey=e=>{if(e.key===\"Escape\"||e.key===\"Esc\")setLightbox(null);};const prevOverflow=document.body.style.overflow;document.body.style.overflow=\"hidden\";window.addEventListener(\"keydown\",onKey,true);const raf=requestAnimationFrame(()=>{// Only claim focus if nothing inside the lightbox already has it —\n// the Cloudflare path focuses its <video>, and that must win.\nconst root=document.getElementById(LIGHTBOX_ID);const ae=document.activeElement;if(root&&ae&&root.contains(ae)&&ae!==root)return;const el=root||closeBtnRef.current;if(el)el.focus({preventScroll:true});});return()=>{cancelAnimationFrame(raf);window.removeEventListener(\"keydown\",onKey,true);document.body.style.overflow=prevOverflow;const prev=lastFocusRef.current;if(prev&&typeof prev.focus===\"function\"&&document.contains(prev)){prev.focus({preventScroll:true});}lastFocusRef.current=null;};},[lightbox]);useEffect(()=>{if(!servicesOpen)return;const handler=e=>{if(dropdownRef.current&&!dropdownRef.current.contains(e.target)){setServicesOpen(false);}};document.addEventListener(\"mousedown\",handler);return()=>document.removeEventListener(\"mousedown\",handler);},[servicesOpen]);const fontBase={fontFamily:\"'Plus Jakarta Sans', sans-serif\",fontWeight:600,fontSize:\"16px\",letterSpacing:\"-0.5px\",lineHeight:\"1.4em\"};const navStyle={position:isCanvas?\"relative\":\"fixed\",top:0,left:0,right:0,height:`${NAV_HEIGHT}px`,width:\"100%\",backgroundColor:bg,borderBottom:`1px dashed ${border}`,zIndex:1e3,display:\"flex\",alignItems:\"center\",padding:\"0 40px\",boxSizing:\"border-box\",...fontBase};const linkStyle={...fontBase,color:textColor,textDecoration:\"none\",background:\"none\",border:\"none\",cursor:\"pointer\",display:\"inline-flex\",alignItems:\"center\",gap:\"4px\",padding:0,margin:0,whiteSpace:\"nowrap\"};// In light mode the default near-black pill all but disappears against dark\n// footage, so it inverts to a white pill with dark text.\nconst ctaStyle={...fontBase,color:light?\"rgb(23, 23, 23)\":\"rgb(255, 255, 255)\",backgroundColor:light?\"rgb(255, 255, 255)\":\"rgb(23, 23, 23)\",textDecoration:\"none\",padding:\"10px 22px\",borderRadius:\"100px\",display:\"inline-flex\",alignItems:\"center\",gap:\"8px\",whiteSpace:\"nowrap\",flexShrink:0};// With the CTA hidden there is nothing on the right to balance the logo on\n// the left, so the `margin: 0 auto` links block would centre itself in the\n// space AFTER the logo and sit visibly right of true centre. This spacer\n// restores the balance.\nconst LOGO_SPACER=/*#__PURE__*/_jsx(\"div\",{style:{width:`${LOGO_WIDTH}px`,flexShrink:0},\"aria-hidden\":\"true\"});const items=[];for(let i=0;i<=links.length;i++){if(showServices&&i===servPos)items.push({kind:\"dropdown\"});if(i<links.length)items.push({kind:\"link\",link:links[i]});}const renderDropdownButton=key=>/*#__PURE__*/_jsxs(\"div\",{ref:dropdownRef,style:{position:\"relative\"},children:[/*#__PURE__*/_jsxs(\"button\",{onClick:isCanvas?undefined:()=>setServicesOpen(o=>!o),style:linkStyle,children:[servLabel,/*#__PURE__*/_jsx(motion.span,{animate:{rotate:!isCanvas&&servicesOpen?180:0},transition:{duration:.2},style:{display:\"inline-block\",fontSize:\"11px\",lineHeight:1},children:\"▾\"})]}),/*#__PURE__*/_jsx(AnimatePresence,{children:!isCanvas&&servicesOpen&&/*#__PURE__*/_jsx(motion.div,{initial:{opacity:0,y:6},animate:{opacity:1,y:0},exit:{opacity:0,y:6},transition:{duration:.15},style:{position:\"absolute\",top:\"calc(100% + 18px)\",left:\"50%\",transform:\"translateX(-50%)\",backgroundColor:panelBg,border:`1px dashed ${panelBorder}`,borderRadius:\"12px\",padding:\"8px\",minWidth:\"240px\",display:\"flex\",flexDirection:\"column\",gap:\"2px\",zIndex:1001,boxShadow:\"0 8px 24px rgba(0,0,0,0.08)\"},children:services.map((s,si)=>/*#__PURE__*/_jsx(\"a\",{href:s.href,style:{...linkStyle,fontSize:\"15px\",padding:\"10px 14px\",borderRadius:\"8px\",display:\"block\",whiteSpace:\"nowrap\"},onMouseEnter:e=>{e.currentTarget.style.backgroundColor=hoverBg;},onMouseLeave:e=>{e.currentTarget.style.backgroundColor=\"transparent\";},onClick:()=>setServicesOpen(false),children:s.label},`s-${si}-${s.href}`))},\"dropdown\")})]},key);return /*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsxs(\"nav\",{style:navStyle,children:[/*#__PURE__*/_jsx(\"div\",{style:{flexShrink:0,display:\"inline-flex\",// The Logo component is external and has no colour prop,\n// so a filter is the only way to make it read on a dark\n// hero. Flattens the pink mark to white.\nfilter:invertLogo?\"brightness(0) invert(1)\":undefined},children:/*#__PURE__*/_jsx(Logo,{width:LOGO_WIDTH,height:36})}),!isCanvas&&isMobile?/*#__PURE__*/_jsx(\"button\",{onClick:()=>{setMobileOpen(o=>!o);setMobileServicesOpen(false);},style:{...linkStyle,marginLeft:\"auto\",padding:\"8px\"},\"aria-label\":mobileOpen?\"Close menu\":\"Open menu\",children:mobileOpen?/*#__PURE__*/_jsxs(\"svg\",{width:\"24\",height:\"24\",viewBox:\"0 0 24 24\",fill:\"none\",stroke:textColor,strokeWidth:\"2.5\",strokeLinecap:\"round\",children:[/*#__PURE__*/_jsx(\"line\",{x1:\"18\",y1:\"6\",x2:\"6\",y2:\"18\"}),/*#__PURE__*/_jsx(\"line\",{x1:\"6\",y1:\"6\",x2:\"18\",y2:\"18\"})]}):/*#__PURE__*/_jsxs(\"svg\",{width:\"24\",height:\"24\",viewBox:\"0 0 24 24\",fill:\"none\",stroke:textColor,strokeWidth:\"2.5\",strokeLinecap:\"round\",children:[/*#__PURE__*/_jsx(\"line\",{x1:\"3\",y1:\"7\",x2:\"21\",y2:\"7\"}),/*#__PURE__*/_jsx(\"line\",{x1:\"3\",y1:\"13\",x2:\"21\",y2:\"13\"}),/*#__PURE__*/_jsx(\"line\",{x1:\"3\",y1:\"19\",x2:\"21\",y2:\"19\"})]})}):/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"div\",{style:{display:\"flex\",alignItems:\"center\",gap:\"32px\",margin:\"0 auto\"},children:items.map((item,idx)=>{if(item.kind===\"link\"){return /*#__PURE__*/_jsx(\"a\",{href:item.link.href,style:linkStyle,children:item.link.label},`l-${idx}-${item.link.href}`);}return renderDropdownButton(`d-${idx}`);})}),showCta?/*#__PURE__*/_jsx(\"a\",{href:ctaTo,style:ctaStyle,children:cta}):LOGO_SPACER]})]}),/*#__PURE__*/_jsx(AnimatePresence,{children:!isCanvas&&mobileOpen&&/*#__PURE__*/_jsxs(motion.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.18},style:{position:\"fixed\",top:`${NAV_HEIGHT}px`,left:0,right:0,bottom:0,backgroundColor:mobilePanelBg,zIndex:999,overflowY:\"auto\",display:\"flex\",flexDirection:\"column\"},children:[items.map((item,idx)=>{if(item.kind===\"link\"){return /*#__PURE__*/_jsx(\"a\",{href:item.link.href,style:{...linkStyle,fontSize:\"22px\",padding:\"20px 28px\",borderBottom:`1px dashed ${panelBorder}`,display:\"block\"},onClick:()=>setMobileOpen(false),children:item.link.label},`ml-${idx}-${item.link.href}`);}return /*#__PURE__*/_jsxs(\"div\",{style:{borderBottom:`1px dashed ${panelBorder}`},children:[/*#__PURE__*/_jsxs(\"button\",{onClick:()=>setMobileServicesOpen(o=>!o),style:{...linkStyle,fontSize:\"22px\",padding:\"20px 28px\",width:\"100%\",justifyContent:\"space-between\",boxSizing:\"border-box\"},children:[servLabel,/*#__PURE__*/_jsx(motion.span,{animate:{rotate:mobileServicesOpen?180:0},transition:{duration:.2},style:{display:\"inline-block\",fontSize:\"13px\"},children:\"▾\"})]}),/*#__PURE__*/_jsx(AnimatePresence,{children:mobileServicesOpen&&/*#__PURE__*/_jsx(motion.div,{initial:{height:0},animate:{height:\"auto\"},exit:{height:0},style:{overflow:\"hidden\"},children:services.map((s,si)=>/*#__PURE__*/_jsx(\"a\",{href:s.href,style:{...linkStyle,fontSize:\"17px\",fontWeight:500,padding:\"14px 28px 14px 44px\",display:\"block\",borderTop:`1px dashed ${panelBorder}`,color:subLinkColor},onClick:()=>setMobileOpen(false),children:s.label},`ms-${si}-${s.href}`))},\"mobile-services\")})]},`md-${idx}`);}),showCta&&/*#__PURE__*/_jsx(\"div\",{style:{padding:\"32px 28px\"},children:/*#__PURE__*/_jsx(\"a\",{href:ctaTo,style:ctaStyle,onClick:()=>setMobileOpen(false),children:cta})})]},\"mobile-menu\")}),!isCanvas&&lightbox&&/*#__PURE__*/_jsx(motion.div,{id:LIGHTBOX_ID,tabIndex:-1,role:\"dialog\",\"aria-modal\":\"true\",\"aria-label\":\"Video player\",initial:{opacity:0},animate:{opacity:1},transition:{duration:.18},onClick:()=>setLightbox(null),style:{position:\"fixed\",inset:0,backgroundColor:\"rgba(0,0,0,0.78)\",backdropFilter:\"blur(6px)\",WebkitBackdropFilter:\"blur(6px)\",zIndex:1e4,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",padding:isMobile?\"0px\":\"40px 24px\",cursor:\"zoom-out\",outline:\"none\"},children:/*#__PURE__*/_jsxs(motion.div,{initial:isTouch?{opacity:0}:{scale:.94,opacity:0},animate:isTouch?{opacity:1}:{scale:1,opacity:1},transition:{duration:.22,ease:[.2,.8,.2,1]},onClick:e=>e.stopPropagation(),style:{position:\"relative\",width:isMobile?\"min(100vw, calc(100dvh * 16 / 9))\":\"min(70vw, 980px)\",maxWidth:\"100%\",maxHeight:\"100dvh\",aspectRatio:\"16 / 9\",cursor:\"default\"},children:[/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",inset:0,background:\"#000\",borderRadius:isMobile?\"0px\":\"14px\",overflow:\"hidden\",boxShadow:\"0 30px 80px rgba(0,0,0,0.6)\"},children:lightbox.type===\"youtube\"?/*#__PURE__*/_jsx(LightboxYouTube,{videoId:lightbox.id}):/*#__PURE__*/_jsx(LightboxVideo,{videoUID:lightbox.uid})}),/*#__PURE__*/_jsx(\"button\",{ref:closeBtnRef,onClick:()=>setLightbox(null),\"aria-label\":\"Close video\",style:{position:isMobile?\"fixed\":\"absolute\",top:isMobile?\"max(12px, env(safe-area-inset-top, 0px))\":-14,right:isMobile?\"max(12px, env(safe-area-inset-right, 0px))\":-14,width:isMobile?44:30,height:isMobile?44:30,borderRadius:\"50%\",background:\"rgb(23,23,23)\",border:\"none\",color:\"rgb(255,255,255)\",cursor:\"pointer\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",boxShadow:\"0 4px 14px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.15)\",zIndex:3},children:/*#__PURE__*/_jsxs(\"svg\",{width:isMobile?18:14,height:isMobile?18:14,viewBox:\"0 0 14 14\",fill:\"none\",stroke:\"currentColor\",strokeWidth:\"2.2\",strokeLinecap:\"round\",children:[/*#__PURE__*/_jsx(\"line\",{x1:\"2\",y1:\"2\",x2:\"12\",y2:\"12\"}),/*#__PURE__*/_jsx(\"line\",{x1:\"12\",y1:\"2\",x2:\"2\",y2:\"12\"})]})})]},\"cf-lightbox-frame\")},\"cf-lightbox\")]});}GlobalNav.displayName=\"Global Nav\";addPropertyControls(GlobalNav,{navLinks:{type:ControlType.Array,title:\"Nav Links\",control:{type:ControlType.Object,controls:{label:{type:ControlType.String,title:\"Label\",defaultValue:\"Link\"},href:{type:ControlType.String,title:\"URL / Path\",defaultValue:\"/\"}}},defaultValue:DEFAULT_NAV_LINKS},servicesLabel:{type:ControlType.String,title:\"Services Label\",defaultValue:\"Services\",description:\"Leave empty to hide the dropdown.\"},servicesPosition:{type:ControlType.Number,title:\"Services Position\",defaultValue:1,min:0,max:10,step:1,displayStepper:true,description:\"Index in Nav Links where the Services dropdown appears.\"},servicesItems:{type:ControlType.Array,title:\"Services Items\",control:{type:ControlType.Object,controls:{label:{type:ControlType.String,title:\"Label\",defaultValue:\"Service\"},href:{type:ControlType.String,title:\"URL / Path\",defaultValue:\"/services/\"}}},defaultValue:DEFAULT_SERVICES,description:\"Labels are editable here; destination paths stay fixed to the current service routes.\"},ctaLabel:{type:ControlType.String,title:\"CTA Label\",defaultValue:DEFAULT_CTA_LABEL,description:\"Leave empty to hide the CTA pill.\"},ctaHref:{type:ControlType.String,title:\"CTA URL / Path\",defaultValue:\"/contact\"},bgColor:{type:ControlType.Color,title:\"Background\",defaultValue:\"rgb(255, 255, 255)\"},borderColor:{type:ControlType.Color,title:\"Border\",defaultValue:\"rgb(230, 230, 230)\"},lightText:{type:ControlType.Boolean,title:\"Light Text\",defaultValue:DEFAULT_LIGHT_TEXT,description:\"White links + dark dropdown panel, for a nav over dark media.\"},overlay:{type:ControlType.Boolean,title:\"No Double Gap\",defaultValue:DEFAULT_OVERLAY,description:\"Closes the 64px dead gap under the nav. The bar is fixed AND its layer still holds 64px, so the page reserves the height twice. On = reserve it once.\"},whiteLogo:{type:ControlType.Boolean,title:\"White Logo\",defaultValue:DEFAULT_WHITE_LOGO,description:\"Filters the logo to solid white. Flattens the pink mark.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"GlobalNav\",\"slots\":[],\"annotations\":{\"framerIntrinsicWidth\":\"1440\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any\",\"framerIntrinsicHeight\":\"64\",\"framerSupportedLayoutHeight\":\"fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./GlobalNav.map"],"mappings":"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"}