{"version":3,"file":"shared-lib.C_dCeKjb.mjs","names":["usePrimary","useState","registry","useId","useRef","SETTINGS","_Fragment","listeners","notify","SETTINGS","useState","useId","useRef","useRef","useState","_Fragment","useRef","__esmMin","init_npm_react_18_3_1","init_ssg_sandbox_shims","window","ie","l","_e","Ha","c","init_jsx_runtime","ce","de","init_framer_BL70qLPA","RenderTarget","ControlType","addPropertyControls","goHome","strip","p","dest","href","startY","duration","t0","ease","t","step","now","usePrimary$1","force","registry$1","id","rerender","n","listeners$1","notify$1","i","findFrame","node","el","FRAME_MIN_WIDTH","SiteHeader","asGlobal","props","uid","isCanvas","mounted","setMounted","skip","setSkip","primary","wrapRef","anchorRef","frameWidth","setFrameWidth","check","path","onSkippedPath","SETTINGS$2","ownLogoPresent","timers","ro","observed","update","frame","wrapper","prev","s","stackedEnabled","narrowLogo","narrowFade","horizontalWidth","buildGradient","STACKED_VIEWBOX","STACKED_PATHS","HORIZONTAL_VIEWBOX","HORIZONTAL_PATHS","draw","hit","horizontalRem","stackedRem","css","toRgb","init_SiteHeader","init_npm_react_dom_18_3_1","hex","h","x","rgb","r","g","b","solid","stops","alpha","pos","init_SiteHeader_UwtQG2","addCover","COVER_ID","style","SETTINGS$1","removeCover","usePrimary","registry","listeners","notify","PageFadeTransition","opacity","setOpacity","transitionOn","setTransitionOn","firedExitRef","overlayRef","playArrival","hasHandledArrivalThisLoad","flagged","FLAG","onAlwaysPath","handleClick","e","target","anchor","hrefAttr","url","handlePageShow","overlay","init_PageFadeTransition","init_PageFadeTransition_ZSUEbd","SiteTextScale","inject","buildRule","SETTINGS","STYLE_ID","init_SiteTextScale","maxPx","basePx","maxScale","startWidth","endWidth","init_SiteTextScale_oQhQYG","GlassCursor","dotRef","currentSize","size","targetSize","hasMouse","setHasMouse","mq","hideDot","showDot","move","touched","isInteractive","over","hoverSize","prevCursor","styleEl","raf","tick","dpr","snap","v","growEase","hideOnCanvas","dot","tintColor","backdropBlur","init_GlassCursor","SmoothScroll","targetRef","currentRef","rafRef","getMaxScroll","onWheel","maxScroll","wheelMultiplier","onResize","lastKnownScrollY","init_SmoothScroll","metadata","init_siteMetadata"],"sources":["https:/framerusercontent.com/modules/nQ0yeIY7rJYa1mpOdm1q/suouNWt6zorh72w3csbp/SiteHeader.js","https:/framer.com/m/SiteHeader-UwtQG2.js","https:/framerusercontent.com/modules/ueFSRnB0aSoEdO4YLXTG/o1NqzjVbudZ9bOblFHaE/PageFadeTransition.js","https:/framer.com/m/PageFadeTransition-ZSUEbd.js","https:/framerusercontent.com/modules/5YWOSn7N2cCibpiXcL1N/WnjSBNjXue8a7n4LHZC0/SiteTextScale.js","https:/framer.com/m/SiteTextScale-oQhQYG.js","https:/framerusercontent.com/modules/QZH0pBFxJvG90smCpGB7/ysLPBlKrSiD6jOSFvgLE/GlassCursor.js","https:/framerusercontent.com/modules/cbkVZjTe3y9SWnUIoJGh/dUdEkDazc8eOCN4eeiHY/SmoothScroll.js","https:/framerusercontent.com/modules/eKzhsrGaI6aq3BkjAVZk/2L1J3nb08dq0fDHkiifD/siteMetadata.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{useEffect,useRef,useState}from\"react\";import{createPortal}from\"react-dom\";import{useId}from\"react\";import{RenderTarget}from\"framer\";/**\n * SiteHeader — the GLOBAL site header.\n *\n * Draws the CARL SHERRY logo pinned at the top centre of the screen, with\n * a feathered black fade behind it so the logo always reads clearly while\n * page content dissolves into the black as it scrolls up.\n *\n * ── The logo scales with the text ────────────────────────────────────\n * On live pages the logo's width is set in rem (the same relative unit the\n * site's text uses), not fixed pixels. On large monitors the site's text\n * grows gently (see SiteTextScale.tsx); because the logo is sized from the\n * same root font size, it grows by exactly the same amount, so it always\n * looks balanced against the intro paragraph and the rest of the text. On\n * laptops and below, where nothing scales, it is exactly `logoWidth` px.\n *\n * ── Always the full horizontal logo ──────────────────────────────────\n * The one-line \"CARL SHERRY\" logo is used at every screen size, phones\n * included. (The stacked artwork is still stored below; set\n * logoMobileBreakpoint to a width, e.g. 600, to bring back a switch to\n * it on screens that wide or narrower. 0 = never switch.) On a very\n * narrow screen the logo shrinks just enough to keep a margin each side,\n * so it can never run off the edge.\n *\n * ── The logo is a link home ──────────────────────────────────────────\n * Clicking the logo always takes you to the home page. On any other page\n * it navigates to the home page; if you're already on the home page it\n * glides you back to the top instead (a plain link to the page you're on\n * would do nothing). The clickable area is a little larger than the logo\n * itself so it's easy to hit, and cmd/ctrl-click still opens in a new tab.\n *\n * ── It is global ─────────────────────────────────────────────────────\n * Every setting lives in the SETTINGS block just below — there are no\n * per-layer settings. Change a value there (logo size, fade height, the\n * logo artwork itself, anything) and every page that shows the header\n * updates at once — in Preview, on the live site, and on the editor\n * canvas.\n *\n * On the live site it is loaded from the site's shared custom-cursor code,\n * which every page already contains, so it appears on every page without\n * adding a layer to each one.\n *\n * ── Seeing it on the editor canvas ───────────────────────────────────\n * The live header is pinned to the browser window, which has no meaning\n * on the editor canvas. So a SiteHeader LAYER placed on a page shows a\n * canvas view instead: the fade and logo drawn at the top of the page\n * frame the layer sits in (sized by that frame's width, so the phone\n * frame matches what a phone shows). The canvas view is lifted ABOVE the\n * page's own sections (it has its own stacking order), because the\n * sections that follow it in the layout are drawn later and, on a frame\n * with a solid background, would otherwise paint over it. In Preview / on\n * the live site that layer draws nothing itself (the real pinned header\n * does) and ignores clicks, so it never blocks the page.\n *\n * ── One header per page ──────────────────────────────────────────────\n * On the live site only one header ever draws at a time, however many\n * places load it. It also stays out of the way on any page that already\n * has its own scrolling logo (the Home page).\n *\n * The logo artwork is the outlined SVG as vector paths (no image upload,\n * no font), so it's sharp at any size.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n */// ───────────────────────── GLOBAL SETTINGS ─────────────────────────\n// Edit here to change the header on every page at once.\nconst SETTINGS={// Logo\nlogoWidth:220,stackedWidth:110,logoMobileBreakpoint:0,logoSideMargin:32,logoColor:\"#FFFFFF\",logoLink:\"/\",logoTop:40,logoOrder:10,logoHitPadding:12,rootFontPx:16,// Black fade behind the logo\nshowFade:true,fadeColor:\"#000000\",fadeHeight:100,mobileFadeHeight:130,fadeMobileBreakpoint:809,fadeSolidPercent:0,fadeCurve:1,fadeOrder:4,// Pages where the header should not draw (they supply their own logo).\nskipOnPaths:[\"/\"]};// ───────────────────────── LOGO ARTWORK ─────────────────────────\nconst HORIZONTAL_VIEWBOX=\"0 0 1524.68 110.24\";const HORIZONTAL_PATHS=[\"M110.08,88.92c-11.93,11.14-30.06,21.32-52.81,21.32C22.75,110.24,0,85.58,0,55.04S22.91,0,56.47,0c19.09,0,37.86,7.48,50.27,18.13l-14.32,14.95c-9.54-8.27-22.91-13.36-34.04-13.36-21,0-34.52,16.07-34.52,35.47s13.84,35.47,35.31,35.47c14.16,0,27.36-7.48,36.43-16.54l14.48,14.79Z\",\"M196.13,3.18h19.57l48.2,103.88h-24.97l-9.54-21.95h-48.04l-9.39,21.95h-24.02L196.13,3.18ZM189.13,67.13h32.45l-15.75-36.75h-.95l-15.75,36.75Z\",\"M314,107.06V3.18h57.58c14.79,0,24.5,4.29,31.18,11.29,5.41,5.73,8.59,13.2,8.59,21.48,0,13.36-8.27,23.7-21,29.27l24.34,41.84h-26.09l-21-38.18h-30.86v38.18h-22.75ZM336.75,22.43v27.2h37.22c7.95,0,14.48-5.73,14.48-13.68,0-3.5-1.27-6.68-3.66-9.07-3.66-3.98-8.27-4.45-12.41-4.45h-35.63Z\",\"M492.64,3.18v84.31h61.08v19.57h-83.83V3.18h22.75Z\",\"M746.03,29.91c-6.2-4.61-19.25-11.14-36.43-11.14-10.34,0-19.57,3.82-19.57,12.73s13.68,9.86,27.2,10.98c18.93,1.27,48.52,3.5,48.52,32.13,0,25.61-21.32,35.63-46.77,35.63-26.88,0-45.02-10.66-57.11-20.52l12.88-15.59c8.75,7,23.54,17.5,44.54,17.5,13.2,0,23.7-5.09,23.7-14.79s-10.66-12.25-26.25-13.52c-22.75-1.43-49.47-3.98-49.47-30.38S690.68,0,710.24,0c21.63,0,39.93,7.95,48.83,14l-13.04,15.91Z\",\"M820.48,107.06V3.18h22.91v38.5h48.99V3.18h22.91v103.88h-22.91v-46.13h-48.99v46.13h-22.91Z\",\"M1040.95,62.67h-38.34v24.82h67.45v19.57h-90.19V3.18h86.54v19.73h-63.79v20.2h38.34v19.57Z\",\"M1124.77,107.06V3.18h57.58c14.79,0,24.5,4.29,31.18,11.29,5.41,5.73,8.59,13.2,8.59,21.48,0,13.36-8.27,23.7-21,29.27l24.34,41.84h-26.09l-21-38.18h-30.86v38.18h-22.75ZM1147.52,22.43v27.2h37.22c7.95,0,14.48-5.73,14.48-13.68,0-3.5-1.27-6.68-3.66-9.07-3.66-3.98-8.27-4.45-12.41-4.45h-35.63Z\",\"M1280.66,107.06V3.18h57.58c14.79,0,24.5,4.29,31.18,11.29,5.41,5.73,8.59,13.2,8.59,21.48,0,13.36-8.27,23.7-21,29.27l24.34,41.84h-26.09l-21-38.18h-30.86v38.18h-22.75ZM1303.41,22.43v27.2h37.22c7.95,0,14.48-5.73,14.48-13.68,0-3.5-1.27-6.68-3.66-9.07-3.66-3.98-8.27-4.45-12.41-4.45h-35.63Z\",\"M1524.68,3.18l-41.2,56.47v47.4h-22.91v-47.4l-41.36-56.47h28.31l25.29,36.11,25.13-36.11h26.72Z\"];const STACKED_VIEWBOX=\"0 0 862.8 270.24\";const STACKED_PATHS=[\"M264.38,88.92c-11.93,11.14-30.06,21.32-52.81,21.32-34.52,0-57.27-24.66-57.27-55.2S177.21,0,210.77,0c19.09,0,37.86,7.48,50.27,18.13l-14.32,14.95c-9.54-8.27-22.91-13.36-34.04-13.36-21,0-34.52,16.07-34.52,35.47s13.84,35.47,35.31,35.47c14.16,0,27.36-7.48,36.43-16.54l14.48,14.79Z\",\"M350.43,3.18h19.57l48.2,103.87h-24.97l-9.54-21.95h-48.04l-9.39,21.95h-24.02L350.43,3.18ZM343.43,67.13h32.45l-15.75-36.75h-.95l-15.75,36.75Z\",\"M468.3,107.06V3.18h57.58c14.79,0,24.5,4.29,31.18,11.29,5.41,5.73,8.59,13.2,8.59,21.47,0,13.36-8.27,23.7-21,29.27l24.34,41.84h-26.09l-21-38.18h-30.86v38.18h-22.75ZM491.05,22.43v27.2h37.22c7.95,0,14.48-5.73,14.48-13.68,0-3.5-1.27-6.68-3.66-9.07-3.66-3.98-8.27-4.45-12.41-4.45h-35.63Z\",\"M646.94,3.18v84.31h61.08v19.57h-83.83V3.18h22.75Z\",\"M84.15,189.91c-6.2-4.61-19.25-11.13-36.43-11.13-10.34,0-19.57,3.82-19.57,12.73s13.68,9.86,27.2,10.98c18.93,1.27,48.52,3.5,48.52,32.13,0,25.61-21.32,35.63-46.77,35.63-26.88,0-45.02-10.66-57.11-20.52l12.88-15.59c8.75,7,23.54,17.5,44.54,17.5,13.2,0,23.7-5.09,23.7-14.79s-10.66-12.25-26.25-13.52c-22.75-1.43-49.47-3.98-49.47-30.38s23.38-32.93,42.95-32.93c21.63,0,39.93,7.95,48.83,14l-13.04,15.91Z\",\"M158.59,267.06v-103.88h22.91v38.5h48.99v-38.5h22.91v103.88h-22.91v-46.13h-48.99v46.13h-22.91Z\",\"M379.06,222.67h-38.34v24.81h67.45v19.57h-90.19v-103.88h86.54v19.73h-63.79v20.2h38.34v19.57Z\",\"M462.89,267.06v-103.88h57.58c14.79,0,24.5,4.29,31.18,11.29,5.41,5.73,8.59,13.2,8.59,21.47,0,13.36-8.27,23.7-21,29.27l24.34,41.84h-26.09l-21-38.18h-30.86v38.18h-22.75ZM485.64,182.43v27.2h37.22c7.95,0,14.48-5.73,14.48-13.68,0-3.5-1.27-6.68-3.66-9.07-3.66-3.98-8.27-4.45-12.41-4.45h-35.63Z\",\"M618.78,267.06v-103.88h57.58c14.79,0,24.5,4.29,31.18,11.29,5.41,5.73,8.59,13.2,8.59,21.47,0,13.36-8.27,23.7-21,29.27l24.34,41.84h-26.09l-21-38.18h-30.86v38.18h-22.75ZM641.53,182.43v27.2h37.22c7.95,0,14.48-5.73,14.48-13.68,0-3.5-1.27-6.68-3.66-9.07-3.66-3.98-8.27-4.45-12.41-4.45h-35.63Z\",\"M862.8,163.18l-41.2,56.47v47.4h-22.91v-47.4l-41.36-56.47h28.31l25.29,36.11,25.13-36.11h26.72Z\"];// ───────────────── logo click: always back to the home page ─────────────────\n// On another page this lets the link navigate to the home page normally. On\n// the home page itself (where a plain link would do nothing) it glides back\n// to the top instead. Modified clicks (cmd/ctrl/shift, middle button) are\n// left alone so \"open in new tab\" still works.\nfunction goHome(e,href){if(typeof window===\"undefined\")return;if(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||e.button!==0)return;const strip=p=>p.replace(/\\/+$/,\"\")||\"/\";let dest=\"/\";try{dest=strip(new URL(href,window.location.href).pathname);}catch(err){return;}if(strip(window.location.pathname)!==dest)return;// other page: normal navigation\ne.preventDefault();const startY=window.scrollY;if(startY<=0)return;const duration=Math.min(1600,600+startY*.15);const t0=performance.now();const ease=t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2;const step=now=>{const t=Math.min((now-t0)/duration,1);window.scrollTo(0,startY*(1-ease(t)));if(t<1)requestAnimationFrame(step);};requestAnimationFrame(step);}// ───────────────── one header at a time (live site) ─────────────────\n// Every SiteHeader instance registers here; only the first one draws.\n// If it unmounts (e.g. navigating to another page), the next takes over.\nconst registry=[];const listeners=new Set;const notify=()=>listeners.forEach(l=>l());function usePrimary(id){const[,force]=useState(0);useEffect(()=>{registry.push(id);const rerender=()=>force(n=>n+1);listeners.add(rerender);notify();return()=>{listeners.delete(rerender);const i=registry.indexOf(id);if(i>=0)registry.splice(i,1);notify();};},[id]);return registry[0]===id;}// Parse #RGB / #RRGGBB / rgb() / rgba() into r,g,b (alpha is ignored, so the\n// fade always starts fully dark at the very top).\nconst toRgb=c=>{if(!c)return[0,0,0];const hex=c.trim().match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hex){let h=hex[1];if(h.length===3)h=h.split(\"\").map(x=>x+x).join(\"\");return[parseInt(h.slice(0,2),16),parseInt(h.slice(2,4),16),parseInt(h.slice(4,6),16)];}const rgb=c.match(/rgba?\\(\\s*([\\d.]+)[ ,]+([\\d.]+)[ ,]+([\\d.]+)/i);if(rgb)return[Math.round(+rgb[1]),Math.round(+rgb[2]),Math.round(+rgb[3])];return[0,0,0];};const buildGradient=()=>{const s=SETTINGS;const[r,g,b]=toRgb(s.fadeColor);const steps=14;const solid=Math.max(0,Math.min(95,s.fadeSolidPercent));const stops=[`rgba(${r},${g},${b},1) 0%`,`rgba(${r},${g},${b},1) ${solid}%`];for(let i=1;i<=steps;i++){const t=i/steps;const alpha=Math.pow(1-t,s.fadeCurve);const pos=solid+(100-solid)*t;stops.push(`rgba(${r},${g},${b},${alpha.toFixed(4)}) ${pos.toFixed(2)}%`);}return`linear-gradient(to bottom, ${stops.join(\", \")})`;};// The width of the page frame (Desktop / Tablet / Phone) that a canvas layer\n// sits in: the first ancestor that is plausibly a whole page frame. The\n// layer's own box is skipped because on the canvas it can be tiny, which\n// would wrongly look like a phone-sized layout.\nconst FRAME_MIN_WIDTH=320;function findFrame(el){let node=el?el.parentElement:null;for(let i=0;i<12&&node;i++){if(node.offsetWidth>=FRAME_MIN_WIDTH)return node;node=node.parentElement;}return null;}export default function SiteHeader(props){// When loaded from the shared cursor code, `asGlobal` is set: draw only\n// the real pinned header (never the canvas view).\nconst asGlobal=!!(props&&props.asGlobal);const uid=useId().replace(/[:]/g,\"\");const isCanvas=RenderTarget.current()===RenderTarget.canvas;const[mounted,setMounted]=useState(false);const[skip,setSkip]=useState(false);const primary=usePrimary(uid);const wrapRef=useRef(null);const anchorRef=useRef(null);const[frameWidth,setFrameWidth]=useState(1200);useEffect(()=>{setMounted(true);if(typeof window===\"undefined\")return;// Stay out of the way on pages that supply their own logo: either a\n// listed path (the Home page), or any other site logo already on the\n// page (identified by its label, ignoring this header's own).\nconst check=()=>{const path=window.location.pathname.replace(/\\/+$/,\"\")||\"/\";const onSkippedPath=SETTINGS.skipOnPaths.includes(path);const ownLogoPresent=Array.from(document.querySelectorAll('a[aria-label=\"Carl Sherry\"]')).some(el=>!String(el.className).includes(\"sh-\"));setSkip(onSkippedPath||ownLogoPresent);};check();const timers=[window.setTimeout(check,300),window.setTimeout(check,1200)];return()=>timers.forEach(t=>window.clearTimeout(t));},[]);// Canvas view: follow the width of the page frame this layer sits in.\nuseEffect(()=>{if(!isCanvas||asGlobal)return;const el=wrapRef.current;if(!el)return;let ro=null;let observed=null;const update=()=>{const frame=findFrame(el);if(frame){setFrameWidth(frame.offsetWidth);if(ro&&frame!==observed){if(observed)ro.unobserve(observed);ro.observe(frame);observed=frame;}}};ro=typeof ResizeObserver!==\"undefined\"?new ResizeObserver(update):null;update();const timers=[window.setTimeout(update,200),window.setTimeout(update,800)];return()=>{timers.forEach(t=>window.clearTimeout(t));if(ro)ro.disconnect();};},[isCanvas,asGlobal]);// Live site: a SiteHeader layer's own box must never block clicks on\n// the page beneath it.\nuseEffect(()=>{if(isCanvas||asGlobal)return;const wrapper=anchorRef.current?anchorRef.current.parentElement:null;if(wrapper&&wrapper.offsetHeight<400){const prev=wrapper.style.pointerEvents;wrapper.style.pointerEvents=\"none\";return()=>{wrapper.style.pointerEvents=prev;};}},[isCanvas,asGlobal,mounted]);const s=SETTINGS;const stackedEnabled=s.logoMobileBreakpoint>0;// ───────────── Editor canvas view ─────────────\nif(isCanvas){if(asGlobal)return null;const narrowLogo=stackedEnabled&&frameWidth<=s.logoMobileBreakpoint;const narrowFade=frameWidth<=s.fadeMobileBreakpoint;// The horizontal logo shrinks only if the frame is too narrow to fit it.\nconst horizontalWidth=Math.min(s.logoWidth,Math.max(60,frameWidth-s.logoSideMargin*2));return /*#__PURE__*/_jsxs(\"div\",{ref:wrapRef,style:{position:\"relative\",// Its own stacking order, above the page sections that\n// follow it, so they can't paint over the header.\nzIndex:50,width:\"100%\",height:\"100%\",overflow:\"visible\",pointerEvents:\"none\"},children:[s.showFade&&/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",top:0,left:0,right:0,height:narrowFade?s.mobileFadeHeight:s.fadeHeight,background:buildGradient()}}),/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",top:s.logoTop,left:0,right:0,display:\"flex\",justifyContent:\"center\",color:s.logoColor},children:narrowLogo?/*#__PURE__*/_jsx(\"svg\",{viewBox:STACKED_VIEWBOX,fill:\"currentColor\",style:{display:\"block\",width:s.stackedWidth,height:\"auto\"},children:STACKED_PATHS.map((d,i)=>/*#__PURE__*/_jsx(\"path\",{d:d},i))}):/*#__PURE__*/_jsx(\"svg\",{viewBox:HORIZONTAL_VIEWBOX,fill:\"currentColor\",style:{display:\"block\",width:horizontalWidth,height:\"auto\"},children:HORIZONTAL_PATHS.map((d,i)=>/*#__PURE__*/_jsx(\"path\",{d:d},i))})})]});}// ───────────── Live site: the real pinned header ─────────────\nconst draw=mounted&&typeof document!==\"undefined\"&&primary&&!skip;const hit=s.logoHitPadding;// Logo widths are in rem so they scale with the site's text on large\n// monitors (the root font size grows there), staying balanced with it.\n// The horizontal logo still shrinks on a very narrow screen so it always\n// keeps logoSideMargin clear on each side. The stacked logo (and its\n// switch) only exists if a breakpoint is set.\nconst horizontalRem=s.logoWidth/s.rootFontPx;const stackedRem=s.stackedWidth/s.rootFontPx;const css=`\n        .sh-${uid}-fade {\n            position: fixed;\n            top: 0;\n            left: 0;\n            right: 0;\n            height: ${s.fadeHeight}px;\n            background: ${buildGradient()};\n            pointer-events: none;\n            z-index: ${s.fadeOrder};\n        }\n        @media (max-width: ${s.fadeMobileBreakpoint}px) {\n            .sh-${uid}-fade { height: ${s.mobileFadeHeight}px; }\n        }\n        .sh-${uid}-logo {\n            position: fixed;\n            top: ${s.logoTop-hit}px;\n            left: 50%;\n            transform: translateX(-50%);\n            display: flex;\n            justify-content: center;\n            width: max-content;\n            padding: ${hit}px ${Math.round(hit*1.5)}px;\n            box-sizing: content-box;\n            color: ${s.logoColor};\n            text-decoration: none;\n            cursor: pointer;\n            z-index: ${s.logoOrder};\n        }\n        .sh-${uid}-h { display: block; width: min(${horizontalRem}rem, calc(100vw - ${s.logoSideMargin*2+Math.round(hit*3)}px)); height: auto; flex-shrink: 0; }\n        .sh-${uid}-s { display: none; width: ${stackedRem}rem; height: auto; flex-shrink: 0; }\n        ${stackedEnabled?`@media (max-width: ${s.logoMobileBreakpoint}px) {\n            .sh-${uid}-h { display: none; }\n            .sh-${uid}-s { display: block; }\n        }`:\"\"}\n    `;return /*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"span\",{ref:anchorRef,style:{display:\"none\"}}),draw&&/*#__PURE__*/createPortal(/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"style\",{children:css}),s.showFade&&/*#__PURE__*/_jsx(\"div\",{className:`sh-${uid}-fade`,\"aria-hidden\":\"true\"}),/*#__PURE__*/_jsxs(\"a\",{className:`sh-${uid}-logo`,href:s.logoLink,\"aria-label\":\"Carl Sherry\",title:\"Back to home\",onClick:e=>goHome(e,s.logoLink),children:[/*#__PURE__*/_jsx(\"svg\",{className:`sh-${uid}-h`,viewBox:HORIZONTAL_VIEWBOX,fill:\"currentColor\",role:\"img\",\"aria-hidden\":\"true\",children:HORIZONTAL_PATHS.map((d,i)=>/*#__PURE__*/_jsx(\"path\",{d:d},i))}),stackedEnabled&&/*#__PURE__*/_jsx(\"svg\",{className:`sh-${uid}-s`,viewBox:STACKED_VIEWBOX,fill:\"currentColor\",role:\"img\",\"aria-hidden\":\"true\",children:STACKED_PATHS.map((d,i)=>/*#__PURE__*/_jsx(\"path\",{d:d},i))})]})]}),document.body)]});}\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"SiteHeader\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./SiteHeader.map","/*\n * SiteHeader\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/nQ0yeIY7rJYa1mpOdm1q/suouNWt6zorh72w3csbp/SiteHeader.js\"\nexport { default } from \"https://framerusercontent.com/modules/nQ0yeIY7rJYa1mpOdm1q/suouNWt6zorh72w3csbp/SiteHeader.js\"\n","import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef,useState}from\"react\";import{createPortal}from\"react-dom\";import{useId}from\"react\";import{RenderTarget}from\"framer\";/**\n * PageFadeTransition — the GLOBAL page transition.\n *\n * Every page change on the site fades out to black, then the new page\n * fades in from black: 2 seconds out + 2 seconds in = a 4-second\n * transition, eased smoothly at both ends.\n *\n * ── It is global ─────────────────────────────────────────────────────\n * Every setting lives in the SETTINGS block just below — there are no\n * per-layer settings. Change a value there (durations, colour, easing)\n * and every page changes at once.\n *\n * It is loaded from the site's shared custom-cursor code, which every\n * page already contains, so it applies to every page without adding a\n * layer to each one. Only one copy is ever active per page, however many\n * places load it, so an old PageFadeTransition layer left on a page won't\n * double up.\n *\n * ── What counts as a page change ─────────────────────────────────────\n * Clicking any link to a DIFFERENT page of this site. These are left\n * completely alone: links to the page you're already on (including\n * scroll-to-section and #anchor links and the Home logo's scroll-to-top),\n * external sites, mailto:/tel: links, links that open in a new tab,\n * downloads, and cmd/ctrl/shift-clicks.\n *\n * ── How the fade works ───────────────────────────────────────────────\n *  - Leaving: a full-screen black layer fades from clear to solid black\n *    over `fadeOutMs`, THEN the browser goes to the new page.\n *  - Arriving: the new page starts covered in solid black and the layer\n *    fades away over `fadeInMs`. To avoid any flash of the new page\n *    before it goes black, the page is hidden as early as this code runs\n *    whenever a transition is in progress, and revealed behind the black\n *    layer the moment it's ready. The black has to appear instantly\n *    (no animation) before it can fade down — otherwise that first\n *    appearance would itself fade and look like an extra, unwanted fade.\n *  - Back/forward: if the browser restores a page from its cache with the\n *    black layer still up, it is cleared immediately so you never get a\n *    stuck black screen.\n *\n * Renders in the browser (Preview or the published site); the editor\n * canvas shows nothing for it.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n */// ───────────────────────── GLOBAL SETTINGS ─────────────────────────\n// Edit here to change the page transition on every page at once.\nconst SETTINGS={fadeOutMs:1e3,fadeInMs:1e3,color:\"#000000\",easing:\"cubic-bezier(0.45, 0, 0.55, 1)\",// Pages that fade in from black on EVERY load (e.g. the first visit to\n// the site), not just when arriving through a link click.\nalwaysFadeInPaths:[\"/\"],// Links with these tooltips are never treated as page changes (the Home\n// logo, which glides back to the top instead of navigating).\nignoreLinkTitles:[\"Back to top\"]};const FLAG=\"pft-transitioning\";const COVER_ID=\"pft-arrival-cover\";// ── Early page cover ──\n// If we're arriving via a transition, hide the page the moment this code\n// runs (before the black layer exists) so the new page never flashes.\nfunction addCover(){if(typeof document===\"undefined\"||document.getElementById(COVER_ID))return;const style=document.createElement(\"style\");style.id=COVER_ID;style.textContent=`html { background: ${SETTINGS.color} !important; } body { visibility: hidden !important; }`;document.head.appendChild(style);}function removeCover(){if(typeof document===\"undefined\")return;const el=document.getElementById(COVER_ID);if(el)el.remove();}try{if(typeof window!==\"undefined\"&&window.sessionStorage.getItem(FLAG)===\"1\"){addCover();// Failsafe: never leave the page hidden if the fade doesn't start.\nwindow.setTimeout(removeCover,3e3);}}catch(err){/* sessionStorage unavailable — skip the early cover */}// Guards against handling the arrival more than once per page load.\nlet hasHandledArrivalThisLoad=false;// ── One active copy at a time ──\nconst registry=[];const listeners=new Set;const notify=()=>listeners.forEach(l=>l());function usePrimary(id){const[,force]=useState(0);useEffect(()=>{registry.push(id);const rerender=()=>force(n=>n+1);listeners.add(rerender);notify();return()=>{listeners.delete(rerender);const i=registry.indexOf(id);if(i>=0)registry.splice(i,1);notify();};},[id]);return registry[0]===id;}export default function PageFadeTransition(){const uid=useId().replace(/[:]/g,\"\");const isCanvas=RenderTarget.current()===RenderTarget.canvas;const[mounted,setMounted]=useState(false);const[opacity,setOpacity]=useState(0);const[transitionOn,setTransitionOn]=useState(true);const primary=usePrimary(uid);const firedExitRef=useRef(false);const overlayRef=useRef(null);useEffect(()=>{setMounted(true);},[]);useEffect(()=>{if(isCanvas||!primary||typeof window===\"undefined\")return;const strip=p=>p.replace(/\\/+$/,\"\")||\"/\";// ── Arrival: snap to black, reveal the page behind it, then fade down ──\nconst playArrival=()=>{setTransitionOn(false);setOpacity(1);requestAnimationFrame(()=>{if(overlayRef.current)void overlayRef.current.offsetHeight// flush the instant black\n;removeCover()// the black layer now covers the page\n;requestAnimationFrame(()=>{setTransitionOn(true);setOpacity(0);});});};if(!hasHandledArrivalThisLoad){let flagged=false;try{flagged=window.sessionStorage.getItem(FLAG)===\"1\";}catch(err){flagged=false;}const onAlwaysPath=SETTINGS.alwaysFadeInPaths.includes(strip(window.location.pathname));if(flagged||onAlwaysPath){hasHandledArrivalThisLoad=true;try{window.sessionStorage.removeItem(FLAG);}catch(err){/* ignore */}playArrival();}else{removeCover();}}// ── Leaving: intercept clicks on links to a different page ──\nconst handleClick=e=>{if(e.defaultPrevented)return;if(e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;const target=e.target;const anchor=target&&target.closest?target.closest(\"a\"):null;if(!anchor)return;const hrefAttr=anchor.getAttribute(\"href\");if(!hrefAttr)return;if(/^(#|mailto:|tel:|javascript:)/i.test(hrefAttr))return;if(anchor.target===\"_blank\"||anchor.hasAttribute(\"download\"))return;if(SETTINGS.ignoreLinkTitles.includes(anchor.getAttribute(\"title\")||\"\"))return;let url;try{url=new URL(anchor.href,window.location.href);}catch(err){return;}if(url.origin!==window.location.origin)return;// external site\nif(strip(url.pathname)===strip(window.location.pathname))return;// same page / section link\nif(firedExitRef.current)return;firedExitRef.current=true;e.preventDefault();e.stopPropagation();if(typeof e.stopImmediatePropagation===\"function\")e.stopImmediatePropagation();setTransitionOn(true);setOpacity(1);try{window.sessionStorage.setItem(FLAG,\"1\");}catch(err){/* ignore */}window.setTimeout(()=>{window.location.assign(url.href);},SETTINGS.fadeOutMs);};// ── Back/forward: a restored page must never keep the black layer up ──\nconst handlePageShow=e=>{if(!e.persisted)return;firedExitRef.current=false;hasHandledArrivalThisLoad=false;removeCover();setTransitionOn(false);setOpacity(0);};document.addEventListener(\"click\",handleClick,true);window.addEventListener(\"pageshow\",handlePageShow);return()=>{document.removeEventListener(\"click\",handleClick,true);window.removeEventListener(\"pageshow\",handlePageShow);};},[isCanvas,primary]);if(isCanvas||!mounted||!primary||typeof document===\"undefined\")return null;const overlay=/*#__PURE__*/_jsx(\"div\",{ref:overlayRef,\"aria-hidden\":\"true\",style:{position:\"fixed\",top:0,left:0,right:0,bottom:0,backgroundColor:SETTINGS.color,opacity,// The early cover hides the whole body; this layer must still show.\nvisibility:\"visible\",pointerEvents:opacity>0?\"auto\":\"none\",transition:transitionOn?`opacity ${opacity===1?SETTINGS.fadeOutMs:SETTINGS.fadeInMs}ms ${SETTINGS.easing}`:\"none\",zIndex:2147483646}});return /*#__PURE__*/createPortal(overlay,document.body);}\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"PageFadeTransition\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./PageFadeTransition.map","/*\n * PageFadeTransition\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/ueFSRnB0aSoEdO4YLXTG/o1NqzjVbudZ9bOblFHaE/PageFadeTransition.js\"\nexport { default } from \"https://framerusercontent.com/modules/ueFSRnB0aSoEdO4YLXTG/o1NqzjVbudZ9bOblFHaE/PageFadeTransition.js\"\n","import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect}from\"react\";import{addPropertyControls,RenderTarget}from\"framer\";/**\n * SiteTextScale — gentle text scaling for large monitors.\n *\n * On large screens the layout stretches to fill the width but text stays a\n * fixed size, so it looks smaller next to everything else (and physically\n * smaller on a big monitor than on a laptop). This makes ALL the site's\n * text grow gradually as the screen gets wider, and leaves it exactly as\n * designed on laptops and smaller.\n *\n * How it works: your text styles are set in rem units, which are sized\n * from the page's root font size. This sets that root size on wide\n * screens, so every rem-sized piece of text — headings, titles, labels,\n * the email address, the footer — scales together, in proportion, with one\n * rule. Layout measurements in pixels (boxes, spacing, images) are\n * unaffected; only text grows.\n *\n * The growth is smooth, not stepped:\n *  - below `startWidth` (1600px): no change (normal size).\n *  - from `startWidth` up to `endWidth` (2560px): the text grows steadily\n *    to `maxScale` times its normal size (1.3 = 30% bigger).\n *  - beyond `endWidth`: it stays at that maximum size.\n * (So roughly +10% on a 1920px screen, +30% on a 2560px screen.)\n *\n * ── No size \"jump\" on load — and no paid plan needed ─────────────────\n * Code components are built into the page's HTML before it reaches the\n * browser (server-side rendering). This component draws the rule as a\n * <style> element in its own output, so the rule travels INSIDE the page's\n * HTML and applies as soon as the browser reads it — before the page's\n * scripts have even started — instead of being added afterwards by a\n * script (which is what caused text to draw at normal size and then jump\n * larger). Nothing needs to be added in Site Settings.\n *\n * It is also still added by script (when this file loads, and again on\n * mount) as a safety net, in case the page is ever drawn without the\n * built-in copy. The copies are identical, so this is harmless.\n *\n * Every setting lives in the SETTINGS block below — change a value and the\n * whole site follows. It's loaded from the shared code every page already\n * contains, so there's nothing to add to individual pages. It runs in\n * Preview and on the published site; the editor canvas is unaffected.\n *\n * Note: only text sized in rem scales. Text set in fixed pixels (for\n * example the small pill labels) stays exactly the same size.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n */// ───────────────────────── GLOBAL SETTINGS ─────────────────────────\nconst SETTINGS={basePx:16,startWidth:1600,endWidth:2560,maxScale:1.3};const STYLE_ID=\"site-large-screen-text\";// The rule, built from the settings above.\nconst buildRule=()=>{const{basePx,startWidth,endWidth,maxScale}=SETTINGS;const maxPx=basePx*maxScale;// Growth in px of root font size per px of extra screen width.\nconst slope=(maxPx-basePx)/(endWidth-startWidth);return`@media (min-width: ${startWidth}px) { html { font-size: clamp(${basePx}px, calc(${basePx}px + (100vw - ${startWidth}px) * ${slope.toFixed(6)}), ${maxPx}px) !important; } }`;};// Safety net: also add the rule by script (once, shared by every page). Runs\n// as soon as this file loads and again on mount; canvas is left alone.\nconst inject=()=>{if(typeof document===\"undefined\")return;if(RenderTarget.current()===RenderTarget.canvas)return;if(document.getElementById(STYLE_ID))return;const style=document.createElement(\"style\");style.id=STYLE_ID;style.textContent=buildRule();(document.head||document.documentElement).appendChild(style);};inject();export default function SiteTextScale(props){useEffect(()=>{inject();},[]);// The rule, drawn as part of the page itself so it ships inside the page's\n// HTML. Nothing visible is drawn. (Not applied on the editor canvas.)\nconst onCanvas=RenderTarget.current()===RenderTarget.canvas;return onCanvas?/*#__PURE__*/_jsx(\"div\",{\"aria-hidden\":\"true\",style:{display:\"none\"}}):/*#__PURE__*/_jsx(\"style\",{children:buildRule()});}addPropertyControls(SiteTextScale,{});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"SiteTextScale\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./SiteTextScale.map","/*\n * SiteTextScale\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/5YWOSn7N2cCibpiXcL1N/WnjSBNjXue8a7n4LHZC0/SiteTextScale.js\"\nexport { default } from \"https://framerusercontent.com/modules/5YWOSn7N2cCibpiXcL1N/WnjSBNjXue8a7n4LHZC0/SiteTextScale.js\"\n","import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{useEffect,useRef,useState}from\"react\";import{createPortal}from\"react-dom\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";// The global site header (logo + black fade). It lives in its own file so\n// it can be edited in one place; it's loaded here because this cursor is\n// already on every page, which makes the header appear everywhere without\n// adding a layer to each page. It only ever draws once per page.\nimport SiteHeader from\"https://framer.com/m/SiteHeader-UwtQG2.js\";// The global page transition (fade to black, then in from black), loaded\n// here for the same reason: this file is on every page, on every device.\n// It only ever runs once per page.\nimport PageFadeTransition from\"https://framer.com/m/PageFadeTransition-ZSUEbd.js\";// The global large-monitor text scaling (all text grows gently on wide\n// screens). One shared rule, added once per page.\nimport SiteTextScale from\"https://framer.com/m/SiteTextScale-oQhQYG.js\";/**\n * GlassCursor\n * A custom circular cursor matching the site's glass-button aesthetic:\n * a semi-transparent tinted circle with a backdrop blur, so whatever's\n * behind the cursor shows through frosted, exactly like the WORK/CONTACT\n * nav pill.\n *\n * This file is on every page, so it also carries the site-wide behaviours\n * that need to run everywhere (they work on every device, including\n * phones, where the cursor itself isn't drawn):\n *  - the site header (logo + black fade) — see SiteHeader.tsx\n *  - the page transition (fade out to black, fade in from black) — see\n *    PageFadeTransition.tsx\n *  - gentle text scaling on large monitors — see SiteTextScale.tsx\n *  - switching off the phone browser's built-in \"tap highlight\": the\n *    translucent light-blue box a mobile browser flashes over any link or\n *    button the instant you tap it. It's one CSS rule\n *    (-webkit-tap-highlight-color: transparent), added once per page. It\n *    has no effect on desktop, and keyboard focus outlines are left alone\n *    so the site stays accessible.\n *\n * Mouse only — never on touch. The cursor only exists on devices whose\n * main pointer is a real mouse or trackpad (one that can hover). On touch\n * screens (phones, tablets) it isn't drawn at all, and nothing is hidden\n * or changed. Why: when a screen is tapped, the browser fakes a mouse\n * movement to that spot, which used to drag the dot there and leave it\n * stuck. The cursor also listens only to genuine mouse movement (pointer\n * events marked \"mouse\"), ignoring those faked touch events, so on a\n * hybrid laptop with a touch screen a tap hides the dot until the real\n * mouse moves again.\n *\n * The fill itself uses mix-blend-mode: difference, so its rendered color\n * inverts relative to whatever is directly beneath the cursor — this\n * keeps it visible against any background (including solid black) while\n * still showing the frosted/blurred glass effect through the fill.\n *\n * Crisp at any screen size: the circle is NEVER scaled with a CSS\n * transform. A transform: scale() on a small, GPU-promoted element makes\n * the browser rasterize it once at its tiny base size and then stretch\n * that cached bitmap — which looks pixelated on large or high-DPI\n * screens. Instead, the real width/height are animated each frame, so\n * the browser re-draws the circle as a vector shape at its true current\n * size and the screen's native resolution. Position is applied with a\n * translate only (no resampling) and snapped to whole device pixels so\n * edges never land on a half pixel.\n *\n * Position tracking and the hover-grow are eased independently: position\n * uses `ease` (kept at 1 = instant, no trailing delay), while the\n * grow/shrink on hovering a link uses its own `growEase` — a lower value\n * gives a soft, smooth \"easy ease\" grow rather than an instant snap.\n *\n * Rendered via a portal directly into document.body, so it always sits at\n * the true top of the stacking order and true viewport position — it can\n * never get trapped behind (or offset by) a transformed/sticky/fixed\n * ancestor like a floating header.\n *\n * Also injects a global stylesheet forcing cursor:none on every element,\n * not just body — browsers apply their own default \"cursor: pointer\"\n * directly on links/buttons/inputs, which otherwise overrides an inherited\n * cursor:none set only on body, causing the native pointer to reappear on\n * hover over clickable elements. (Only on devices that get the custom\n * cursor.)\n *\n * Drop this anywhere on a page (it renders as a fixed overlay covering the\n * whole viewport, so position on the canvas doesn't matter). Add it to every\n * page you want the cursor active on.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n */export default function GlassCursor(props){const{size,hoverSize,tintColor,backdropBlur,ease,growEase,hideOnCanvas}=props;const dotRef=useRef(null);const pos=useRef({x:-100,y:-100});const target=useRef({x:-100,y:-100});const currentSize=useRef(size);const targetSize=useRef(size);const[mounted,setMounted]=useState(false);// True only on devices whose main pointer is a real mouse/trackpad that\n// can hover. False on touch screens, so nothing is drawn or changed.\nconst[hasMouse,setHasMouse]=useState(false);const isCanvas=RenderTarget.current()===RenderTarget.canvas;// Switch off the mobile browser's tap-highlight flash on links/buttons,\n// site-wide. Added once (shared by every page), runs on every device.\nuseEffect(()=>{if(isCanvas||typeof document===\"undefined\")return;const id=\"site-no-tap-highlight\";if(document.getElementById(id))return;const style=document.createElement(\"style\");style.id=id;style.textContent=`\n            * { -webkit-tap-highlight-color: transparent !important; }\n            a, button, [role=\"button\"] { -webkit-tap-highlight-color: transparent !important; }\n        `;document.head.appendChild(style);},[isCanvas]);useEffect(()=>{setMounted(true);if(typeof window===\"undefined\"||!window.matchMedia){setHasMouse(true);return;}const mq=window.matchMedia(\"(hover: hover) and (pointer: fine)\");const update=()=>setHasMouse(mq.matches);update();if(mq.addEventListener)mq.addEventListener(\"change\",update);else if(mq.addListener)mq.addListener(update);return()=>{if(mq.removeEventListener)mq.removeEventListener(\"change\",update);else if(mq.removeListener)mq.removeListener(update);};},[]);useEffect(()=>{if(isCanvas||!hasMouse)return;currentSize.current=size;targetSize.current=size;const hideDot=()=>{if(dotRef.current)dotRef.current.style.display=\"none\";};const showDot=()=>{if(dotRef.current)dotRef.current.style.display=\"\";};// Only genuine mouse movement moves the cursor. Touches (and the\n// faked mouse events a browser fires after a tap) are ignored, and a\n// touch hides the dot until the real mouse moves again.\nconst move=e=>{if(e.pointerType&&e.pointerType!==\"mouse\"){hideDot();return;}showDot();target.current.x=e.clientX;target.current.y=e.clientY;};const touched=()=>hideDot();const isInteractive=el=>{if(!(el instanceof Element))return false;return!!el.closest(\"a, button, [role='button'], input, textarea, select\");};const over=e=>{if(e.pointerType&&e.pointerType!==\"mouse\")return;targetSize.current=isInteractive(e.target)?hoverSize:size;};window.addEventListener(\"pointermove\",move);window.addEventListener(\"pointerover\",over);window.addEventListener(\"pointerdown\",move);window.addEventListener(\"touchstart\",touched,{passive:true});const prevCursor=document.body.style.cursor;document.body.style.cursor=\"none\";// Force cursor:none on every element, including links/buttons/inputs,\n// which otherwise get the browser's own default pointer cursor\n// regardless of body's inherited value.\nconst styleEl=document.createElement(\"style\");styleEl.setAttribute(\"data-glass-cursor\",\"true\");styleEl.textContent=`* { cursor: none !important; }`;document.head.appendChild(styleEl);let raf=0;const tick=()=>{const dpr=window.devicePixelRatio||1;// Snap to whole device pixels so the circle's edge never sits\n// on a half pixel (which would soften/blur it).\nconst snap=v=>Math.round(v*dpr)/dpr;pos.current.x+=(target.current.x-pos.current.x)*ease;pos.current.y+=(target.current.y-pos.current.y)*ease;// Grow/shrink eased independently and more softly than position.\ncurrentSize.current+=(targetSize.current-currentSize.current)*growEase;if(Math.abs(targetSize.current-currentSize.current)<.01){currentSize.current=targetSize.current;}const el=dotRef.current;if(el){const s=snap(currentSize.current);el.style.width=`${s}px`;el.style.height=`${s}px`;el.style.transform=`translate(${snap(pos.current.x-s/2)}px, ${snap(pos.current.y-s/2)}px)`;}raf=requestAnimationFrame(tick);};raf=requestAnimationFrame(tick);return()=>{window.removeEventListener(\"pointermove\",move);window.removeEventListener(\"pointerover\",over);window.removeEventListener(\"pointerdown\",move);window.removeEventListener(\"touchstart\",touched);document.body.style.cursor=prevCursor;styleEl.remove();cancelAnimationFrame(raf);};},[isCanvas,hasMouse,size,hoverSize,ease,growEase]);if(isCanvas&&hideOnCanvas){return /*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",height:\"100%\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",color:\"rgba(0,0,0,0.4)\",fontSize:14,fontFamily:\"sans-serif\",padding:12,textAlign:\"center\"},children:\"Glass cursor (invisible on canvas — active in Preview/Live)\"});}const dot=/*#__PURE__*/_jsx(\"div\",{ref:dotRef,style:{position:\"fixed\",top:0,left:0,width:size,height:size,borderRadius:\"50%\",backgroundColor:tintColor,backdropFilter:`blur(${backdropBlur}px)`,WebkitBackdropFilter:`blur(${backdropBlur}px)`,mixBlendMode:\"difference\",pointerEvents:\"none\",zIndex:2147483647,// Offscreen until the first mouse move, so it never flashes\n// at the top-left corner on load.\ntransform:\"translate(-100px, -100px)\"}});// No custom cursor on touch devices (or before mounting / on canvas) —\n// the site header, page transition and text scaling still run.\nif(isCanvas||!mounted||!hasMouse||typeof document===\"undefined\"){return /*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(SiteHeader,{}),/*#__PURE__*/_jsx(PageFadeTransition,{}),/*#__PURE__*/_jsx(SiteTextScale,{})]});}return /*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/createPortal(dot,document.body),/*#__PURE__*/_jsx(SiteHeader,{}),/*#__PURE__*/_jsx(PageFadeTransition,{}),/*#__PURE__*/_jsx(SiteTextScale,{})]});}addPropertyControls(GlassCursor,{size:{type:ControlType.Number,title:\"Size\",defaultValue:10,min:4,max:100},hoverSize:{type:ControlType.Number,title:\"Hover Size\",defaultValue:20,min:4,max:160},tintColor:{type:ControlType.Color,title:\"Tint\",defaultValue:\"rgba(255,255,255,0.35)\"},backdropBlur:{type:ControlType.Number,title:\"Backdrop Blur\",defaultValue:10,min:0,max:40},ease:{type:ControlType.Number,title:\"Trail Ease\",defaultValue:1,min:.02,max:1,step:.01},growEase:{type:ControlType.Number,title:\"Grow Ease\",defaultValue:.18,min:.02,max:1,step:.01,description:\"Smoothness of the hover grow/shrink. Lower = softer, slower.\"},hideOnCanvas:{type:ControlType.Boolean,title:\"Placeholder on Canvas\",defaultValue:true}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"GlassCursor\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"any\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./GlassCursor.map","import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef}from\"react\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";/**\n * SmoothScroll\n * Site-wide eased \"lerp\" smooth scrolling — the technique used by\n * libraries like Lenis. Instead of the page jumping instantly per wheel\n * tick, scroll position glides toward a target with easing, giving a\n * soft, weighted feel when scrolling up and down.\n *\n * Invisible marker component — add one instance per page. Only intercepts\n * mouse wheel input (trackpad/mouse); touch scrolling on mobile is left\n * as native, which is standard practice for this kind of effect and keeps\n * mobile scrolling responsive and familiar.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n */export default function SmoothScroll(props){const{ease,wheelMultiplier,hideOnCanvas}=props;const targetRef=useRef(0);const currentRef=useRef(0);const rafRef=useRef(null);const isCanvas=RenderTarget.current()===RenderTarget.canvas;useEffect(()=>{if(isCanvas)return;if(typeof window===\"undefined\")return;const getMaxScroll=()=>document.documentElement.scrollHeight-window.innerHeight;targetRef.current=window.scrollY;currentRef.current=window.scrollY;const onWheel=e=>{e.preventDefault();const maxScroll=getMaxScroll();targetRef.current=Math.max(0,Math.min(targetRef.current+e.deltaY*wheelMultiplier,maxScroll));};const onResize=()=>{const maxScroll=getMaxScroll();targetRef.current=Math.min(targetRef.current,maxScroll);};let lastKnownScrollY=window.scrollY;const tick=()=>{// If something else moved the page (e.g. a click-triggered\n// scroll-to-section animation, or a manual jump), pick up\n// from the real position instead of fighting it.\nif(Math.abs(window.scrollY-lastKnownScrollY)>2&&Math.abs(window.scrollY-currentRef.current)>2){currentRef.current=window.scrollY;targetRef.current=window.scrollY;}currentRef.current+=(targetRef.current-currentRef.current)*ease;if(Math.abs(targetRef.current-currentRef.current)<.05){currentRef.current=targetRef.current;}window.scrollTo(0,currentRef.current);lastKnownScrollY=window.scrollY;rafRef.current=requestAnimationFrame(tick);};window.addEventListener(\"wheel\",onWheel,{passive:false});window.addEventListener(\"resize\",onResize);rafRef.current=requestAnimationFrame(tick);return()=>{window.removeEventListener(\"wheel\",onWheel);window.removeEventListener(\"resize\",onResize);if(rafRef.current)cancelAnimationFrame(rafRef.current);};},[isCanvas,ease,wheelMultiplier]);if(isCanvas&&hideOnCanvas){return /*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",height:\"100%\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",color:\"rgba(0,0,0,0.4)\",fontSize:12,fontFamily:\"sans-serif\",padding:8,textAlign:\"center\"},children:\"Smooth scroll (active in Preview/Live)\"});}return null;}addPropertyControls(SmoothScroll,{ease:{type:ControlType.Number,title:\"Ease\",defaultValue:.09,min:.02,max:.5,step:.01,description:\"Lower = softer/slower glide, higher = snappier.\"},wheelMultiplier:{type:ControlType.Number,title:\"Wheel Speed\",defaultValue:1,min:.2,max:3,step:.1},hideOnCanvas:{type:ControlType.Boolean,title:\"Placeholder on Canvas\",defaultValue:true}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"SmoothScroll\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"any\",\"framerSupportedLayoutWidth\":\"any\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./SmoothScroll.map","// Generated by Framer (9801af1)\nexport default function metadata(params,activeLocale){return{description:\"PORTFOLIO\",favicon:\"https://framerusercontent.com/assets/2Go8Lt5orMAg4NBPxhOdijSlaic.png\",robots:\"max-image-preview:large\",title:\"CARL SHERRY\"};}export const metadataVersion=1;\nexport const __FramerMetadata__ = {\"exports\":{\"metadataVersion\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"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"}