{"version":3,"file":"VariableText.Cet3y05F.mjs","names":["useMemo","useState","useRef","useId","useCallback","fontSize"],"sources":["https:/framerusercontent.com/modules/9qmC7MA5fLrjkfxPiAkC/H00n2dWdB8904M02qfjZ/VariableText.js"],"sourcesContent":["// Interactive variable font text component with smooth weight transitions on hover\nimport{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{motion,useMotionValue,useTransform,animate}from\"framer-motion\";import{addPropertyControls,ControlType}from\"framer\";import{useState,useRef,useEffect,startTransition,useMemo,useCallback,useId}from\"react\";/**\n * Variable Font Hover Effect\n *\n * @framerIntrinsicWidth 400\n * @framerIntrinsicHeight 100\n *\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n */export default function VariableText(props){const{text=\"Variable Font\",font,color=\"#000000\",maxWeight=900,springStiffness=300,springDamping=20,resetDelay=0,rippleDistance=4,maxPadding=0,maxFontSizeScale=1.3,loopAnimation=false}=props;// Split text into individual characters\nconst characters=useMemo(()=>text.split(\"\"),[text]);const[hoveredIndex,setHoveredIndex]=useState(null);const loopTimeoutRef=useRef(null);const hitAreaClass=useId().replace(/:/g,\"\");const characterRefs=useRef([]);const handlePointerMove=useCallback(e=>{if(loopAnimation)return;const x=e.clientX;let bestIndex=null;let bestDistance=Number.POSITIVE_INFINITY;for(let i=0;i<characterRefs.current.length;i++){const el=characterRefs.current[i];if(!el)continue;const rect=el.getBoundingClientRect();const cx=rect.left+rect.width/2;const d=Math.abs(x-cx);if(d<bestDistance){bestDistance=d;bestIndex=i;}}startTransition(()=>setHoveredIndex(bestIndex));},[loopAnimation]);const handlePointerLeave=useCallback(()=>{if(loopAnimation)return;startTransition(()=>setHoveredIndex(null));},[loopAnimation]);useEffect(()=>{// Clear any existing loop timer whenever dependencies change\nif(loopTimeoutRef.current!==null){clearTimeout(loopTimeoutRef.current);loopTimeoutRef.current=null;}if(!loopAnimation){// When looping is disabled, ensure no character stays active\nstartTransition(()=>setHoveredIndex(null));return;}if(characters.length===0)return;const totalPerCharacter=.4+resetDelay;const stepDurationMs=Math.max(totalPerCharacter,.01)*1e3;let currentIndex=0;const runStep=()=>{startTransition(()=>setHoveredIndex(currentIndex));currentIndex=(currentIndex+1)%characters.length;loopTimeoutRef.current=setTimeout(runStep,stepDurationMs);};runStep();return()=>{if(loopTimeoutRef.current!==null){clearTimeout(loopTimeoutRef.current);loopTimeoutRef.current=null;}};},[loopAnimation,characters.length,resetDelay]);return /*#__PURE__*/_jsxs(\"div\",{style:{position:\"relative\",width:\"max-content\",minWidth:\"max-content\",display:\"flex\",alignItems:\"flex-end\"},onPointerMove:handlePointerMove,onPointerLeave:handlePointerLeave,children:[/*#__PURE__*/_jsx(\"style\",{children:`\n                .${hitAreaClass} {\n                    position: relative;\n                    display: inline-block;\n                }\n                .${hitAreaClass}::before {\n                    content: \"\";\n                    position: absolute;\n                    inset: -4px;\n                    pointer-events: auto;\n                    background: transparent;\n                }\n            `}),characters.map((char,index)=>/*#__PURE__*/_jsx(Character,{char:char,index:index,setRef:el=>{characterRefs.current[index]=el;},hitAreaClass:hitAreaClass,font:font,color:color,maxWeight:maxWeight,springStiffness:springStiffness,springDamping:springDamping,resetDelay:resetDelay,hoveredIndex:hoveredIndex,setHoveredIndex:setHoveredIndex,rippleDistance:rippleDistance,maxPadding:maxPadding,maxFontSizeScale:maxFontSizeScale,loopAnimation:loopAnimation},index))]});}function Character(props){const{char,index,setRef,hitAreaClass,font,color,maxWeight,springStiffness,springDamping,resetDelay,hoveredIndex,setHoveredIndex,rippleDistance,maxPadding,maxFontSizeScale,loopAnimation}=props;const timeoutRef=useRef(null);const animationTimeoutRef=useRef(null);const[isAnimating,setIsAnimating]=useState(false);const isAnimatingRef=useRef(false);const startedIncreaseRef=useRef(false);const loopControlsRef=useRef(null);const pendingResetRef=useRef(false);const baseWeight=400;const lastTargetRef=useRef(baseWeight);// Calculate baseFontSize first (needed for subsequent calculations)\nconst baseFontSize=useMemo(()=>{const fontSize=font?.fontSize;if(typeof fontSize===\"number\")return fontSize;if(typeof fontSize===\"string\"){const parsed=parseFloat(fontSize);return isNaN(parsed)?36:parsed;}return 36;},[font]);// Motion value for font weight\nconst fontWeight=useMotionValue(baseWeight);// Motion value for font size\nconst fontSize=useMotionValue(baseFontSize);// Calculate distance from hovered character with smooth falloff like Mac Dock\nconst rawDistance=hoveredIndex!==null?Math.abs(index-hoveredIndex):Infinity;const withinRipple=rawDistance<=rippleDistance&&hoveredIndex!==null;// Smooth falloff calculation (Mac Dock-like)\n// Use cosine interpolation for smoother falloff: 1 at distance 0, 0 at rippleDistance\nconst normalizedDistance=withinRipple?rawDistance/rippleDistance:1;const falloff=withinRipple?Math.cos(normalizedDistance*Math.PI/2):0;// Calculate target weight based on smooth falloff\nconst weightRange=maxWeight-baseWeight;const targetWeight=withinRipple?baseWeight+weightRange*falloff:baseWeight;// Calculate target font size based on same falloff\nconst maxFontSize=baseFontSize*maxFontSizeScale;const fontSizeRange=maxFontSize-baseFontSize;const targetFontSize=withinRipple?baseFontSize+fontSizeRange*falloff:baseFontSize;// Transform weight to padding (Dock-like magnification)\nconst animatedPadding=useTransform(fontWeight,[baseWeight,maxWeight],[0,maxPadding]);// Update weight based on hover or loop-driven hoveredIndex state\nuseEffect(()=>{// Clear any pending timeouts when dependencies change\nif(timeoutRef.current!==null){clearTimeout(timeoutRef.current);timeoutRef.current=null;}if(animationTimeoutRef.current!==null){clearTimeout(animationTimeoutRef.current);animationTimeoutRef.current=null;}// If we're resetting and a new hover/ripple target comes in, stop the reset so we can retarget.\nif(targetWeight!==baseWeight&&loopControlsRef.current&&lastTargetRef.current===baseWeight){loopControlsRef.current.stop();loopControlsRef.current=null;}// Calculate delay based on distance for ripple effect (Dock-style)\n// NOTE: For Mac Dock-like responsiveness, avoid delayed/staggered starts so re-hovering\n// during an active transition doesn't trigger lingering delayed animations in neighbors.\nconst startDelay=0;if(targetWeight!==baseWeight){// Always stop any in-flight animation so we can retarget immediately (prevents staggery).\nif(loopControlsRef.current){loopControlsRef.current.stop();loopControlsRef.current=null;}pendingResetRef.current=false;lastTargetRef.current=targetWeight;startedIncreaseRef.current=false;// Apply delay based on distance for ripple effect\nanimationTimeoutRef.current=setTimeout(()=>{startedIncreaseRef.current=true;startTransition(()=>setIsAnimating(true));isAnimatingRef.current=true;// Animate with spring physics like Mac Dock\nconst controls=animate(fontWeight,targetWeight,{type:\"spring\",stiffness:springStiffness,damping:springDamping,mass:.1,onComplete:()=>{if(pendingResetRef.current){const runReset=()=>{const resetControls=animate(fontWeight,baseWeight,{type:\"spring\",stiffness:springStiffness*.5,damping:springDamping,mass:1,onComplete:()=>{startTransition(()=>setIsAnimating(false));isAnimatingRef.current=false;pendingResetRef.current=false;lastTargetRef.current=baseWeight;}});loopControlsRef.current=resetControls;// Animate font size back to base in parallel\nanimate(fontSize,baseFontSize,{type:\"spring\",stiffness:springStiffness*.5,damping:springDamping,mass:1});};if(resetDelay>0){timeoutRef.current=setTimeout(runReset,resetDelay*1e3);}else{runReset();}return;}startTransition(()=>setIsAnimating(false));isAnimatingRef.current=false;lastTargetRef.current=targetWeight;}});// Animate font size in parallel\nanimate(fontSize,targetFontSize,{type:\"spring\",stiffness:springStiffness,damping:springDamping,mass:1});loopControlsRef.current=controls;},startDelay*1e3);}else{// If we are in the middle of increasing weight, don't interrupt it.\nif(isAnimatingRef.current&&lastTargetRef.current!==baseWeight){pendingResetRef.current=true;if(!startedIncreaseRef.current&&!loopControlsRef.current){pendingResetRef.current=false;isAnimatingRef.current=false;setIsAnimating(false);lastTargetRef.current=baseWeight;}return;}lastTargetRef.current=baseWeight;const resetAnimation=()=>{isAnimatingRef.current=true;setIsAnimating(true);// Animate back to baseWeight with spring physics\nconst controls=animate(fontWeight,baseWeight,{type:\"spring\",stiffness:springStiffness*.5,damping:springDamping,mass:1,onComplete:()=>{setIsAnimating(false);isAnimatingRef.current=false;pendingResetRef.current=false;lastTargetRef.current=baseWeight;}});// Animate font size back to base in parallel\nanimate(fontSize,baseFontSize,{type:\"spring\",stiffness:springStiffness*.5,damping:springDamping,mass:1});loopControlsRef.current=controls;};if(resetDelay>0){timeoutRef.current=setTimeout(resetAnimation,resetDelay*1e3);}else{resetAnimation();}}return()=>{if(timeoutRef.current!==null){clearTimeout(timeoutRef.current);}if(animationTimeoutRef.current!==null){clearTimeout(animationTimeoutRef.current);}};},[targetWeight,targetFontSize,baseFontSize,hoveredIndex,baseWeight,maxWeight,resetDelay,springStiffness,springDamping]);const handleMouseEnter=()=>{if(loopAnimation)return;startTransition(()=>setHoveredIndex(index));};const handleMouseLeave=()=>{if(loopAnimation)return;startTransition(()=>setHoveredIndex(null));};return /*#__PURE__*/_jsx(\"span\",{ref:setRef,className:hitAreaClass,style:{position:\"relative\",display:\"inline-block\",padding:16,margin:-16},onMouseEnter:handleMouseEnter,onMouseLeave:handleMouseLeave,children:/*#__PURE__*/_jsx(motion.span,{style:{...font,color,fontWeight:fontWeight,fontSize:fontSize,fontVariationSettings:useTransform(fontWeight,weight=>`'wght' ${weight}`),paddingLeft:animatedPadding,paddingRight:animatedPadding,display:\"inline-block\",cursor:loopAnimation?\"default\":\"pointer\",userSelect:\"none\",position:\"relative\",zIndex:1},children:char===\" \"?\"\\xa0\":char})});}addPropertyControls(VariableText,{text:{type:ControlType.String,title:\"Text\",defaultValue:\"Variable Font\"},font:{type:ControlType.Font,title:\"Font\",controls:\"extended\",defaultFontType:\"sans-serif\",defaultValue:{fontSize:\"48px\",letterSpacing:\"-0.02em\",lineHeight:\"1.2em\"}},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"#000000\"},maxWeight:{type:ControlType.Number,title:\"Max Weight\",defaultValue:900,min:100,max:900,step:100,displayStepper:true},springStiffness:{type:ControlType.Number,title:\"Spring Stiffness\",defaultValue:300,min:50,max:1e3,step:10,displayStepper:true},springDamping:{type:ControlType.Number,title:\"Spring Damping\",defaultValue:20,min:5,max:100,step:1,displayStepper:true},resetDelay:{type:ControlType.Number,title:\"Reset Delay\",defaultValue:0,min:0,max:5,step:.1,unit:\"s\",displayStepper:true},rippleDistance:{type:ControlType.Number,title:\"Ripple Distance\",defaultValue:3,min:0,max:10,step:1,displayStepper:true},maxPadding:{type:ControlType.Number,title:\"Max Padding\",defaultValue:0,min:0,max:30,step:1,unit:\"px\",displayStepper:true},maxFontSizeScale:{type:ControlType.Number,title:\"Max Font Size Scale\",defaultValue:1.3,min:1,max:2,step:.1,displayStepper:true},loopAnimation:{type:ControlType.Boolean,title:\"Loop\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"VariableText\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"auto\",\"framerIntrinsicWidth\":\"400\",\"framerContractVersion\":\"1\",\"framerIntrinsicHeight\":\"100\",\"framerSupportedLayoutHeight\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./VariableText.map"],"mappings":"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"}