{"version":3,"file":"Cursor.DDp-R5TN.mjs","names":["useState","useRef","useMemo","_Fragment"],"sources":["https:/framerusercontent.com/modules/jMECYKhMEkLfa4PjKGPi/S8W7JhiwYBiyaP39Y5Rx/Cursor.js"],"sourcesContent":["// Get Started: https://www.framer.com/developers\nimport{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{motion,useMotionValue,useSpring,useTransform,useVelocity}from\"framer-motion\";import{useEffect,useMemo,useRef,useState}from\"react\";import{createPortal}from\"react-dom\";// Module scope, so it survives remounts within a session. Framer tears\n// code components down and rebuilds them on page navigation and on every\n// preview reload, and a fresh mount means fresh motion values sitting at\n// 0,0 — which is the flight in from the corner.\nlet lastPointer=null;// .set() on a spring-backed value animates towards the new number.\n// .jump() moves it there with no animation at all, which is what you\n// want the first time you learn where the pointer actually is.\nconst hardSet=(mv,v)=>{if(typeof mv.jump===\"function\")mv.jump(v);else mv.set(v);};/**\n * Custom Cursor\n *\n * A dot that eases behind the pointer, grows over anything\n * interactive, and becomes a glass pill over project links. The pill is\n * heavier than the dot and banks into its own movement.\n *\n * Drop ONE instance anywhere on the page — it portals to <body>, so\n * where it sits on the canvas doesn't matter. Put it in a shared\n * layout to get it site-wide.\n *\n * The pill carries whatever \"Pill text\" says — \"View project\" by\n * default — plus an optional arrow. Blank the field and it falls back\n * to reading the project's own name off the link, in this order:\n *   1. data-cursor-label=\"...\" on the link\n *   2. aria-label / title\n *   3. the first text element inside the link (your caption)\n *   4. the slug in the href, de-hyphenated and capitalised\n *\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n */export default function CustomCursor(props){const{dotSize,hoverSize,blendMode,dotColor,labelColor,maxLabelWidth,blurAmount,pillRadius,projectSelector,hoverSelector,lag,pillLag,tiltAmount,pillLabel,arrow}=props;const onCanvas=RenderTarget.current()===RenderTarget.canvas;const[mounted,setMounted]=useState(false);const[fine,setFine]=useState(false);const[visible,setVisible]=useState(false);const[mode,setMode]=useState(\"default\");const[label,setLabel]=useState(\"\");const[pillW,setPillW]=useState(0);const[winW,setWinW]=useState(0);const pillRef=useRef(null);// Have we ever had a real pointer coordinate on this mount? Until we\n// have, everything stays parked and hidden rather than sitting at the\n// origin waiting to swoop.\nconst seeded=useRef(false);const rawX=useMotionValue(0);const rawY=useMotionValue(0);// Memoised. These objects are read as spring options, and handing the\n// hook a brand new object on every render — which is every hover,\n// since mode and label are state — is asking for the animation to be\n// rebuilt underneath you mid-move.\nconst dotSpring=useMemo(()=>({stiffness:1200-lag*900,damping:40,mass:.35}),[lag]);const dotX=useSpring(rawX,dotSpring);const dotY=useSpring(rawY,dotSpring);// The pill: heavier. Two objects with clearly different masses read\n// as two objects — trailing at similar rates just looks broken.\nconst pillSpring=useMemo(()=>({stiffness:900-pillLag*750,damping:32,mass:.6}),[pillLag]);const pillSpringX=useSpring(rawX,pillSpring);const pillSpringY=useSpring(rawY,pillSpring);// A long name centred on a cursor near the right edge runs off\n// screen. Clamping the sprung value means it can't escape even\n// mid-overshoot, while the dot keeps tracking the pointer exactly.\n// Barely fires on a short fixed label, but it's the safety net if\n// you ever blank the field and fall back to project names.\n//\n// winW comes from state rather than window.innerWidth read inline, so\n// the clamp survives a resize and never runs during a server render.\nconst pillX=useTransform(pillSpringX,v=>{if(!pillW||!winW)return v;const half=pillW/2+12;if(winW<pillW+24)return winW/2;return Math.max(half,Math.min(winW-half,v));});// Bank into the movement. Velocity of the SPRUNG position, not the\n// raw pointer, so the tilt follows the pill's own motion and\n// settles with it rather than twitching on every mouse sample.\nconst vx=useVelocity(pillSpringX);const vy=useVelocity(pillSpringY);const tiltSpring=useMemo(()=>({stiffness:220,damping:26,mass:.5}),[]);const rotateY=useSpring(useTransform(vx,[-1500,1500],[-tiltAmount,tiltAmount]),tiltSpring);const rotateX=useSpring(useTransform(vy,[-1500,1500],[tiltAmount,-tiltAmount]),tiltSpring);// Capability, not width. A tablet with a trackpad has a real\n// pointer; a landscape phone reports a desktop-ish width and\n// doesn't. Get this wrong and touch users end up with no cursor at\n// all — native one hidden, replacement never moving.\nuseEffect(()=>{if(onCanvas)return;setMounted(true);const mq=window.matchMedia(\"(hover: hover) and (pointer: fine)\");const update=()=>setFine(mq.matches);update();mq.addEventListener(\"change\",update);return()=>mq.removeEventListener(\"change\",update);},[onCanvas]);useEffect(()=>{if(onCanvas)return;const onResize=()=>setWinW(window.innerWidth);onResize();window.addEventListener(\"resize\",onResize);return()=>window.removeEventListener(\"resize\",onResize);},[onCanvas]);// The remount fix. If this session has seen the pointer before, jump\n// every value straight there before the first paint — no spring, no\n// travel, no corner.\nuseEffect(()=>{if(!fine||onCanvas||!lastPointer)return;const{x,y}=lastPointer;hardSet(rawX,x);hardSet(rawY,y);hardSet(dotX,x);hardSet(dotY,y);hardSet(pillSpringX,x);hardSet(pillSpringY,y);seeded.current=true;setVisible(true);},[fine,onCanvas]);// Hide the native cursor. The universal selector is load-bearing:\n// `cursor` inherits, but links and buttons set their own, so hiding\n// it on <body> alone leaves a pointer over every link.\nuseEffect(()=>{if(!fine||onCanvas)return;const style=document.createElement(\"style\");style.textContent=\"*, *::before, *::after { cursor: none !important; }\";document.head.appendChild(style);return()=>style.remove();},[fine,onCanvas]);// Remeasure whenever anything inside the pill changes width, so the\n// clamp uses the width of the pill you can actually see.\nuseEffect(()=>{if(pillRef.current)setPillW(pillRef.current.offsetWidth);},[label,pillLabel,arrow]);useEffect(()=>{if(!fine||onCanvas)return;const readLabel=el=>{const attr=el.getAttribute(\"data-cursor-label\")||el.getAttribute(\"aria-label\")||el.getAttribute(\"title\");if(attr)return attr.trim();const text=el.querySelector(\"h1, h2, h3, h4, h5, h6, p\");if(text&&text.textContent.trim())return text.textContent.trim();const href=el.getAttribute(\"href\")||\"\";const slug=href.split(\"?\")[0].split(\"/\").filter(Boolean).pop();if(!slug)return\"\";return slug.replace(/-/g,\" \").replace(/\\b\\w/g,c=>c.toUpperCase());};const onMove=e=>{const x=e.clientX;const y=e.clientY;// First real coordinate of this mount: land on it rather than\n// animating to it from wherever the values happen to sit.\nif(!seeded.current){seeded.current=true;hardSet(dotX,x);hardSet(dotY,y);hardSet(pillSpringX,x);hardSet(pillSpringY,y);}rawX.set(x);rawY.set(y);lastPointer={x,y};setVisible(true);};// One delegated listener rather than one per element. mouseover\n// bubbles (mouseenter doesn't) and fires on every element the\n// pointer crosses, so recomputing the mode here is enough.\nconst onOver=e=>{const t=e.target;if(!t||!t.closest)return;const project=projectSelector?t.closest(projectSelector):null;if(project){setLabel(readLabel(project));setMode(\"project\");return;}if(hoverSelector&&t.closest(hoverSelector))setMode(\"hover\");else setMode(\"default\");};const onLeave=()=>setVisible(false);// Only reappear if we know where we are. Otherwise the next\n// mousemove — a frame away — does it.\nconst onEnter=()=>{if(seeded.current)setVisible(true);};document.addEventListener(\"mousemove\",onMove,{passive:true});document.addEventListener(\"mouseover\",onOver,{passive:true});document.documentElement.addEventListener(\"mouseleave\",onLeave);document.documentElement.addEventListener(\"mouseenter\",onEnter);return()=>{document.removeEventListener(\"mousemove\",onMove);document.removeEventListener(\"mouseover\",onOver);document.documentElement.removeEventListener(\"mouseleave\",onLeave);document.documentElement.removeEventListener(\"mouseenter\",onEnter);};},[fine,onCanvas,projectSelector,hoverSelector]);// On the canvas, render something selectable. A component that\n// returns null is painful to find in the layer list.\nif(onCanvas){return /*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",alignItems:\"center\",gap:10,padding:\"10px 14px\",borderRadius:8,border:\"1px dashed rgba(0,0,0,0.25)\",fontSize:12,fontWeight:500,color:\"rgba(0,0,0,0.6)\",whiteSpace:\"nowrap\"},children:[/*#__PURE__*/_jsx(\"span\",{style:{width:dotSize,height:dotSize,borderRadius:\"50%\",background:dotColor}}),\"Custom Cursor\"]});}// Also the SSR guard: `mounted` only flips inside an effect, so the\n// server render returns null and never touches document.body.\nif(!mounted||!fine)return null;const size=mode===\"hover\"?hoverSize:dotSize;const showDot=mode!==\"project\";// Fixed label wins. Leave \"Pill text\" blank in the panel to fall\n// back to the project's own name, read off the link.\nconst pillText=(pillLabel||\"\").trim()||label;const showPill=mode===\"project\"&&(pillText||arrow!==\"None\");// Blend mode applies to the DOT only. The pill always stays a normal\n// glass capsule — difference blending on a translucent pill with a\n// backdrop-filter looks broken (see the note on pillStyle below), and\n// a legible label matters more here than the invert trick.\nconst dotBlending=blendMode!==\"Normal\";// Difference against white inverts whatever is beneath. Against the\n// dot's own colour it does nothing useful — difference with black is\n// the identity operation, so a black dot over a black overlay stays\n// invisible. Force white and let the blend do the work.\nconst dotFill=dotBlending?\"#FFFFFF\":dotColor;// Blur alone over a pale image gives white text on near-white. The\n// brightness knock-down means the pill carries its own contrast\n// wherever it lands; the saturation keeps the colours behind it\n// alive instead of turning them to grey.\nconst glass=\"blur(\"+blurAmount+\"px) saturate(180%) brightness(0.62)\";// Always the glass look, never the flat difference-mode swap:\n// backdrop-filter and mix-blend-mode fight each other (the filter\n// establishes a backdrop root, leaving the blend nothing to blend\n// against), so the pill just never opts into blending in the first\n// place.\nconst pillStyle={background:\"rgba(255,255,255,0.14)\",backdropFilter:glass,WebkitBackdropFilter:glass,border:\"0.5px solid rgba(255,255,255,0.3)\",color:labelColor};// Diagonal reads as \"opens something\", right as \"next\". These are\n// project links, so diagonal is the truer signal.\nconst arrowPath=arrow===\"Diagonal\"?\"M3.5 8.5L8.5 3.5M8.5 3.5H4.5M8.5 3.5V7.5\":\"M2.5 6H9M9 6L6 3M9 6L6 9\";return /*#__PURE__*/createPortal(/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(motion.div,{style:{position:\"fixed\",top:0,left:0,x:dotX,y:dotY,pointerEvents:\"none\",zIndex:99999,mixBlendMode:dotBlending?blendMode.toLowerCase():\"normal\"},children:/*#__PURE__*/_jsx(\"div\",{style:{width:size,height:size,marginLeft:-size/2,marginTop:-size/2,borderRadius:\"50%\",background:dotFill,opacity:visible&&showDot?1:0,transition:\"width 0.2s ease, height 0.2s ease, margin 0.2s ease, opacity 0.15s ease\"}})}),/*#__PURE__*/_jsx(motion.div,{style:{position:\"fixed\",top:0,left:0,x:pillX,y:pillSpringY,pointerEvents:\"none\",zIndex:99998,// Pill: always normal blend, regardless of the dot's\n// blend mode setting.\nmixBlendMode:\"normal\"},children:/*#__PURE__*/_jsxs(motion.div,{ref:pillRef,style:{x:\"-50%\",y:\"-50%\",rotateX,rotateY,scale:showPill?1:.6,transformPerspective:600,padding:\"7px 14px\",borderRadius:pillRadius,...pillStyle,fontSize:12,lineHeight:1.4,letterSpacing:\"0.02em\",maxWidth:maxLabelWidth,// Flex row so the arrow sits beside the text and\n// stays put while the text truncates.\ndisplay:\"flex\",alignItems:\"center\",gap:pillText&&arrow!==\"None\"?6:0,opacity:visible&&showPill?1:0,transition:\"opacity 0.2s ease, scale 0.2s ease\"},children:[pillText&&/*#__PURE__*/_jsx(\"span\",{style:{overflow:\"hidden\",textOverflow:\"ellipsis\",whiteSpace:\"nowrap\"},children:pillText}),arrow!==\"None\"&&/*#__PURE__*/_jsx(\"svg\",{width:\"11\",height:\"11\",viewBox:\"0 0 12 12\",fill:\"none\",style:{flexShrink:0,display:\"block\"},children:/*#__PURE__*/_jsx(\"path\",{d:arrowPath,stroke:\"currentColor\",strokeWidth:\"1.4\",strokeLinecap:\"round\",strokeLinejoin:\"round\"})})]})})]}),document.body);}addPropertyControls(CustomCursor,{dotSize:{title:\"Dot\",type:ControlType.Number,defaultValue:8,min:4,max:32,unit:\"px\"},hoverSize:{title:\"On hover\",type:ControlType.Number,defaultValue:20,min:8,max:64,unit:\"px\"},blendMode:{title:\"Dot blend\",type:ControlType.Enum,defaultValue:\"Normal\",options:[\"Normal\",\"Difference\",\"Exclusion\"],description:\"Applies to the dot only. Difference inverts against whatever is beneath. The project pill always stays normal blend with the glass look.\"},dotColor:{title:\"Dot colour\",type:ControlType.Color,defaultValue:\"#000000\",hidden:p=>p.blendMode!==\"Normal\"},lag:{title:\"Dot weight\",type:ControlType.Number,defaultValue:.55,min:0,max:1,step:.05,description:\"0 is pinned to the pointer, 1 trails well behind.\"},pillLag:{title:\"Pill weight\",type:ControlType.Number,defaultValue:.75,min:0,max:1,step:.05,description:\"Keep this clearly above the dot.\"},tiltAmount:{title:\"Bank\",type:ControlType.Number,defaultValue:14,min:0,max:30,unit:\"\\xb0\",description:\"Under 10 if Safari drops the glass.\"},blurAmount:{title:\"Blur\",type:ControlType.Number,defaultValue:16,min:0,max:30,unit:\"px\",description:\"Lower this first if hover stutters.\"},pillRadius:{title:\"Pill radius\",type:ControlType.Number,defaultValue:100,min:0,max:100,unit:\"px\",description:\"100 is a capsule, 12 a rounded rectangle.\"},pillLabel:{title:\"Pill text\",type:ControlType.String,defaultValue:\"View project\",description:\"Blank falls back to the project's own name.\"},arrow:{title:\"Arrow\",type:ControlType.Enum,defaultValue:\"Diagonal\",options:[\"None\",\"Diagonal\",\"Right\"],description:\"Diagonal reads as opening, right as next.\"},labelColor:{title:\"Pill text colour\",type:ControlType.Color,defaultValue:\"#FFFFFF\"},maxLabelWidth:{title:\"Pill max\",type:ControlType.Number,defaultValue:180,min:120,max:480,unit:\"px\"},projectSelector:{title:\"Project links\",type:ControlType.String,defaultValue:'a[href*=\"projects/\"]',description:\"Links that show the pill.\"},hoverSelector:{title:\"Interactive\",type:ControlType.String,defaultValue:\"a, button\",description:\"Everything that just grows the dot.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CustomCursor\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"auto\",\"framerSupportedLayoutWidth\":\"auto\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Cursor.map"],"mappings":"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"}