{"version":3,"file":"shared-lib.Bsd6plVn.mjs","names":["useRef"],"sources":["https:/framerusercontent.com/modules/qLjXXBlaXCRt6GhPmimU/MupJp00Wg6MtMoy0SMnU/Cursor.js","https:/framerusercontent.com/modules/etgVwfl8WOmltWJoAfeX/JlSA5ADDnrVuQ6kLOKtb/siteMetadata.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{useEffect,useRef}from\"react\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";/**\n * CustomCursor\n *\n * Drop this component anywhere on your Framer page (position: fixed works best).\n * It hides the native cursor site-wide and replaces it with a small filled circle\n * that follows the pointer (optionally with a slight lag) for a premium feel.\n * On click/tap anywhere on the page, the dot bursts into small particles that\n * radiate outward and fade, like a ripple.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n */export default function CustomCursor({size=16,color=\"#0062FF\",lag=0,burstEnabled=true,burstCount=8,burstDistance=36,burstDuration=500}){// Positions the dot (translate only — never touched by the pulse animation)\nconst positionRef=useRef(null);// Renders the visible circle and plays the click pulse (scale only)\nconst dotRef=useRef(null);const burstLayerRef=useRef(null);const targetRef=useRef({x:-100,y:-100});const currentRef=useRef({x:-100,y:-100});const rafRef=useRef(null);const isStaticRenderer=useIsStaticRenderer();useEffect(()=>{if(isStaticRenderer||typeof window===\"undefined\")return;const styleEl=document.createElement(\"style\");styleEl.id=\"custom-cursor-hide\";styleEl.textContent=`\n            *, *::before, *::after { cursor: none !important; }\n\n            @keyframes custom-cursor-burst-particle {\n                0% { transform: translate(-50%, -50%) scale(1); opacity: 1; }\n                100% { transform: translate(calc(-50% + var(--dx)), calc(-50% + var(--dy))) scale(0); opacity: 0; }\n            }\n\n            /* Scale-only pulse: never animates transform on the positioning\n               element, so it can't reset the dot's translate offset. */\n            @keyframes custom-cursor-burst-pulse {\n                0% { transform: scale(1); }\n                40% { transform: scale(0.6); }\n                100% { transform: scale(1); }\n            }\n        `;document.head.appendChild(styleEl);// factor = 1 means \"no lag\" (snaps straight to target each frame)\nconst factor=lag<=0?1:1-Math.min(Math.max(lag,.01),.99);const onMove=e=>{targetRef.current.x=e.clientX;targetRef.current.y=e.clientY;};const tick=()=>{const current=currentRef.current;const target=targetRef.current;current.x+=(target.x-current.x)*factor;current.y+=(target.y-current.y)*factor;if(positionRef.current){positionRef.current.style.transform=`translate(${current.x-size/2}px, ${current.y-size/2}px)`;}rafRef.current=requestAnimationFrame(tick);};rafRef.current=requestAnimationFrame(tick);const onDown=e=>{if(!burstEnabled)return;if(dotRef.current){dotRef.current.style.animation=\"none\";void dotRef.current.offsetWidth// restart the animation\n;dotRef.current.style.animation=`custom-cursor-burst-pulse 260ms ease-out`;}const layer=burstLayerRef.current;if(!layer)return;const count=Math.max(1,Math.round(burstCount));const particleSize=Math.max(2,size*.35);const fragment=document.createDocumentFragment();for(let i=0;i<count;i++){const angle=i/count*Math.PI*2+Math.random()*.3;const distance=burstDistance*(.7+Math.random()*.6);const dx=Math.cos(angle)*distance;const dy=Math.sin(angle)*distance;const particle=document.createElement(\"div\");particle.style.position=\"absolute\";particle.style.left=`${e.clientX}px`;particle.style.top=`${e.clientY}px`;particle.style.width=`${particleSize}px`;particle.style.height=`${particleSize}px`;particle.style.borderRadius=\"50%\";particle.style.backgroundColor=color;particle.style.pointerEvents=\"none\";particle.style.setProperty(\"--dx\",`${dx}px`);particle.style.setProperty(\"--dy\",`${dy}px`);particle.style.animation=`custom-cursor-burst-particle ${burstDuration}ms ease-out forwards`;particle.addEventListener(\"animationend\",()=>particle.remove());fragment.appendChild(particle);}layer.appendChild(fragment);};window.addEventListener(\"pointermove\",onMove,{passive:true});window.addEventListener(\"pointerdown\",onDown,{passive:true});return()=>{window.removeEventListener(\"pointermove\",onMove);window.removeEventListener(\"pointerdown\",onDown);if(rafRef.current!=null)cancelAnimationFrame(rafRef.current);document.getElementById(\"custom-cursor-hide\")?.remove();};},[isStaticRenderer,size,lag,color,burstEnabled,burstCount,burstDistance,burstDuration]);if(isStaticRenderer)return null;return /*#__PURE__*/_jsxs(\"div\",{style:{position:\"fixed\",inset:0,pointerEvents:\"none\",zIndex:99999,overflow:\"hidden\"},\"aria-hidden\":\"true\",children:[/*#__PURE__*/_jsx(\"div\",{ref:positionRef,style:{position:\"absolute\",top:0,left:0,width:size,height:size,willChange:\"transform\",transform:\"translate(-100px, -100px)\"},children:/*#__PURE__*/_jsx(\"div\",{ref:dotRef,style:{width:\"100%\",height:\"100%\",borderRadius:\"50%\",backgroundColor:color}})}),/*#__PURE__*/_jsx(\"div\",{ref:burstLayerRef,style:{position:\"absolute\",inset:0}})]});}addPropertyControls(CustomCursor,{size:{type:ControlType.Number,title:\"Size\",defaultValue:16,min:16,max:48,unit:\"px\",step:1},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"#0062FF\"},lag:{type:ControlType.Number,title:\"Lag\",defaultValue:0,min:0,max:.95,step:.05,description:\"0 = instant, 0.85 = very floaty. Leave at 0 for crisp tracking.\"},burstEnabled:{type:ControlType.Boolean,title:\"Click Burst\",defaultValue:true,description:\"Show a ripple of particles on click/tap.\"},burstCount:{type:ControlType.Number,title:\"Particles\",defaultValue:8,min:3,max:20,step:1,hidden:props=>!props.burstEnabled},burstDistance:{type:ControlType.Number,title:\"Distance\",defaultValue:36,min:10,max:120,unit:\"px\",step:1,hidden:props=>!props.burstEnabled},burstDuration:{type:ControlType.Number,title:\"Duration\",defaultValue:500,min:150,max:1200,unit:\"ms\",step:10,hidden:props=>!props.burstEnabled}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CustomCursor\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any\",\"framerSupportedLayoutHeight\":\"any\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Cursor.map","// Generated by Framer (bee8ea6)\nexport default function metadata(params,activeLocale){return{description:\"Communication designer with experience across branding, digital design, and visual identity systems. I create thoughtful, research-driven work that connects strategy with clear visual communication.\",favicon:\"https://framerusercontent.com/assets/uqLymphCngoHX5mGYgUKyQM9Ps.png\",robots:\"max-image-preview:large\",socialImage:\"https://framerusercontent.com/assets/Dip8VWmHmCGmy3MLx2iGJJQMNS4.png\",title:\"Linda Jolly\"};}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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"}