{"version":3,"file":"ASCIIShiftText.CcUxIIbq.mjs","names":["useRef"],"sources":["https:/framerusercontent.com/modules/0DLOivCZFLMd3PrT5FYp/0s9yhEDeDVWTlACdKr3j/ASCIIShiftText.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef}from\"react\";import{addPropertyControls,ControlType}from\"framer\";/**\n * ASCII Shift Text Component\n * \n * A text component with an ASCII wave animation effect on hover.\n * The text characters shift through a sequence creating a ripple effect.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n */export default function ASCIIShiftText(props){const{text=\"Hover over me\",font,color=\"#000000\",animateOnAppear=false,appearDirection=\"center\",enableHoverAnimation=true,duration=1e3,style}=props;const elementRef=useRef(null);const instanceRef=useRef(null);useEffect(()=>{const el=elementRef.current;if(!el)return;// Create ASCII shift instance\nconst createASCIIShift=element=>{let origTxt=element.textContent||\"\";let origChars=origTxt.split(\"\");let isAnim=false;let cursorPos=0;let waves=[];let animId=null;let isHover=false;let origW=null;let cachedRect=null;const cfg={dur:duration,chars:'.,\\xb7-─~+:;=*π\"\"┐┌┘┴┬╗╔╝╚╬╠╣╩╦║░▒▓█▄▀▌▐■!?&#$@0123456789*',preserveSpaces:true,spread:1};const WAVE_THRESH=3;const CHAR_MULT=3;const ANIM_STEP=40;const WAVE_BUF=5;const updateCursorPos=e=>{if(!cachedRect){cachedRect=element.getBoundingClientRect();}const x=e.clientX-cachedRect.left;const len=origTxt.length;const pos=Math.round(x/cachedRect.width*len);cursorPos=Math.max(0,Math.min(pos,len-1));};const startWave=()=>{waves.push({startPos:cursorPos,startTime:Date.now(),id:Math.random()});if(!isAnim)start();};const cleanupWaves=t=>{waves=waves.filter(w=>t-w.startTime<cfg.dur);};const calcWaveEffect=(charIdx,t)=>{let shouldAnim=false;let resultChar=origChars[charIdx];for(const w of waves){const age=t-w.startTime;const prog=Math.min(age/cfg.dur,1);const dist=Math.abs(charIdx-w.startPos);const maxDist=Math.max(w.startPos,origChars.length-w.startPos-1);const rad=prog*(maxDist+WAVE_BUF)/cfg.spread;if(dist<=rad){shouldAnim=true;const intens=Math.max(0,rad-dist);if(intens<=WAVE_THRESH&&intens>0){const charIdx=(dist*CHAR_MULT+Math.floor(age/ANIM_STEP))%cfg.chars.length;resultChar=cfg.chars[charIdx];}}}return{shouldAnim,char:resultChar};};const genScrambledTxt=t=>{let result=\"\";for(let i=0;i<origChars.length;i++){const char=origChars[i];if(cfg.preserveSpaces&&char===\" \"){result+=\" \";}else{const res=calcWaveEffect(i,t);result+=res.shouldAnim?res.char:char;}}return result;};const stop=()=>{element.textContent=origTxt;element.classList.remove(\"as\");if(origW!==null){element.style.width=\"\";origW=null;}isAnim=false;};const start=()=>{if(isAnim)return;if(origW===null){origW=element.getBoundingClientRect().width;element.style.width=`${origW}px`;}isAnim=true;element.classList.add(\"as\");const animate=()=>{const t=Date.now();cleanupWaves(t);if(waves.length===0){stop();return;}element.textContent=genScrambledTxt(t);animId=requestAnimationFrame(animate);};animId=requestAnimationFrame(animate);};const handleEnter=e=>{isHover=true;cachedRect=element.getBoundingClientRect();updateCursorPos(e);startWave();};const handleMove=e=>{if(!isHover)return;const old=cursorPos;updateCursorPos(e);if(cursorPos!==old)startWave();};const handleLeave=()=>{isHover=false;cachedRect=null;};const init=()=>{if(!enableHoverAnimation)return;element.addEventListener(\"mouseenter\",handleEnter);element.addEventListener(\"mousemove\",handleMove);element.addEventListener(\"mouseleave\",handleLeave);};const resetToOrig=()=>{waves=[];if(animId){cancelAnimationFrame(animId);animId=null;}// Reset width preservation\nif(origW!==null){element.style.width=\"\";origW=null;}stop();};const updateTxt=newTxt=>{origTxt=newTxt;origChars=newTxt.split(\"\");if(!isAnim)element.textContent=newTxt;};const destroy=()=>{resetToOrig();if(enableHoverAnimation){element.removeEventListener(\"mouseenter\",handleEnter);element.removeEventListener(\"mousemove\",handleMove);element.removeEventListener(\"mouseleave\",handleLeave);}};const triggerAppearAnimation=()=>{// Set cursor position based on direction\nif(appearDirection===\"left\"){cursorPos=0;}else if(appearDirection===\"right\"){cursorPos=origChars.length-1;}else{cursorPos=Math.floor(origChars.length/2);}startWave();};init();return{updateTxt,resetToOrig,destroy,triggerAppearAnimation};};instanceRef.current=createASCIIShift(el);// Trigger animation on appear if enabled\nif(animateOnAppear&&instanceRef.current){// Small delay to ensure element is rendered\nsetTimeout(()=>{if(instanceRef.current){instanceRef.current.triggerAppearAnimation();}},100);}return()=>{if(instanceRef.current){instanceRef.current.destroy();}};},[animateOnAppear,appearDirection,enableHoverAnimation,duration]);useEffect(()=>{if(instanceRef.current){instanceRef.current.updateTxt(text);}},[text]);return /*#__PURE__*/_jsx(\"span\",{ref:elementRef,style:{...style,...font,color,display:\"inline-block\",cursor:\"pointer\",userSelect:\"none\",whiteSpace:\"pre\",position:\"relative\"},children:text});}addPropertyControls(ASCIIShiftText,{text:{type:ControlType.String,title:\"Text\",defaultValue:\"Hover over me\"},animateOnAppear:{type:ControlType.Boolean,title:\"Animate on Appear\",defaultValue:false,enabledTitle:\"Yes\",disabledTitle:\"No\"},appearDirection:{type:ControlType.Enum,title:\"Direction\",options:[\"left\",\"center\",\"right\"],optionTitles:[\"Left\",\"Center\",\"Right\"],defaultValue:\"center\",displaySegmentedControl:true,hidden:({animateOnAppear})=>!animateOnAppear},enableHoverAnimation:{type:ControlType.Boolean,title:\"Hover Animation\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},duration:{type:ControlType.Number,title:\"Duration\",defaultValue:1e3,min:100,max:5e3,step:100,unit:\"ms\"},font:{type:ControlType.Font,title:\"Font\",controls:\"extended\",defaultFontType:\"sans-serif\",defaultValue:{fontSize:\"40px\",variant:\"Bold\",letterSpacing:\"-0.04em\",lineHeight:\"1em\"}},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"#000000\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ASCIIShiftText\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"any\",\"framerSupportedLayoutWidth\":\"any\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ASCIIShiftText.map"],"mappings":"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"}