{"version":3,"file":"shared-lib.KI3vvQOl.mjs","names":["usePrimary","useState","registry","useId","useRef","SETTINGS","_Fragment","listeners","notify","SETTINGS","useState","useId","useRef","_jsx","useRef","useState","_Fragment","useRef"],"sources":["https:/framerusercontent.com/modules/nQ0yeIY7rJYa1mpOdm1q/UybF65WqtXfDNI4ubrhY/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 * ── 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,// 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;// The horizontal logo is a fixed width, but shrinks on a very narrow\n// screen so it always keeps logoSideMargin clear on each side. The\n// stacked logo (and its switch) only exists if a breakpoint is set.\nconst 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(${s.logoWidth}px, calc(100vw - ${s.logoSideMargin*2+Math.round(hit*3)}px)); height: auto; flex-shrink: 0; }\n        .sh-${uid}-s { display: none; width: ${s.stackedWidth}px; 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/UybF65WqtXfDNI4ubrhY/SiteHeader.js\"\nexport { default } from \"https://framerusercontent.com/modules/nQ0yeIY7rJYa1mpOdm1q/UybF65WqtXfDNI4ubrhY/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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"}