{"version":3,"file":"shared-lib.CCEFNXJ1.mjs","names":["useRef","useState","useRef"],"sources":["https:/framerusercontent.com/modules/QZH0pBFxJvG90smCpGB7/Q3hPcMgMfCFyShRUYklD/GlassCursor.js","https:/framerusercontent.com/modules/cbkVZjTe3y9SWnUIoJGh/dUdEkDazc8eOCN4eeiHY/SmoothScroll.js","https:/framerusercontent.com/modules/eKzhsrGaI6aq3BkjAVZk/2L1J3nb08dq0fDHkiifD/siteMetadata.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef,useState}from\"react\";import{createPortal}from\"react-dom\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";/**\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 * 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 * Position tracking and the hover-grow are eased independently: position\n * uses `ease` (kept at 1 = instant, no trailing delay, per earlier setup),\n * while the grow/shrink on hovering a link uses its own `growEase` — a\n * lower value gives a soft, smooth \"easy ease\" grow rather than an\n * instant size 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.\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 scale=useRef(1);const targetScale=useRef(1);const[mounted,setMounted]=useState(false);const isCanvas=RenderTarget.current()===RenderTarget.canvas;useEffect(()=>{setMounted(true);},[]);useEffect(()=>{if(isCanvas)return;const move=e=>{target.current.x=e.clientX;target.current.y=e.clientY;};const isInteractive=el=>{if(!(el instanceof Element))return false;return!!el.closest(\"a, button, [role='button'], input, textarea, select\");};const over=e=>{targetScale.current=isInteractive(e.target)?hoverSize/size:1;};window.addEventListener(\"mousemove\",move);window.addEventListener(\"mouseover\",over);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=()=>{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.\nscale.current+=(targetScale.current-scale.current)*growEase;if(dotRef.current){dotRef.current.style.transform=`translate(${pos.current.x}px, ${pos.current.y}px) translate(-50%, -50%) scale(${scale.current})`;}raf=requestAnimationFrame(tick);};raf=requestAnimationFrame(tick);return()=>{window.removeEventListener(\"mousemove\",move);window.removeEventListener(\"mouseover\",over);document.body.style.cursor=prevCursor;styleEl.remove();cancelAnimationFrame(raf);};},[isCanvas,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,willChange:\"transform\"}});if(isCanvas||!mounted||typeof document===\"undefined\")return null;return /*#__PURE__*/createPortal(dot,document.body);}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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"}