{"version":3,"file":"ScrambleText.BC-3owX6.mjs","names":["useState","useMemo","useRef"],"sources":["https:/framerusercontent.com/modules/13KSePhzdFUClZvcp0LC/FekjRA9aFzv6cdWmkYZ8/ScrambleText.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{useEffect,useMemo,useRef,useState}from\"react\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";/* ────────────────────────────────────────────────────────────────────────\n   Constants\n   ──────────────────────────────────────────────────────────────────────── */const UPPER=\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";const LOWER=\"abcdefghijklmnopqrstuvwxyz\";const DIGITS=\"0123456789\";const SYMBOLS=\"!@#$%^&*()_+-=[]{}|;:,.<>?/~\";// Every character gets at least this fraction of the scramble duration to\n// flicker before it's allowed to lock in — without it, whichever\n// character resolves first (e.g. index 0 in leftToRight) would lock in\n// instantly at t=0 with no visible scramble at all.\nconst MIN_RESOLVE_FRACTION=.12;const REDUCED_MOTION_FADE_MS=200;const SR_ONLY_STYLE={position:\"absolute\",width:1,height:1,padding:0,margin:-1,overflow:\"hidden\",clip:\"rect(0, 0, 0, 0)\",whiteSpace:\"nowrap\",border:0};/* ────────────────────────────────────────────────────────────────────────\n   Character helpers\n   ──────────────────────────────────────────────────────────────────────── */function randomCharFor(targetChar,characterSet,customChars){if(characterSet===\"custom\"){const pool=customChars.length>0?customChars:targetChar;return pool[Math.floor(Math.random()*pool.length)];}if(characterSet===\"symbols\"){return SYMBOLS[Math.floor(Math.random()*SYMBOLS.length)];}if(/[A-Z]/.test(targetChar))return UPPER[Math.floor(Math.random()*UPPER.length)];if(/[a-z]/.test(targetChar))return LOWER[Math.floor(Math.random()*LOWER.length)];if(/[0-9]/.test(targetChar)){// \"letters\" set has no digit pool to draw from — resolve directly.\nif(characterSet===\"lettersAndNumbers\")return DIGITS[Math.floor(Math.random()*DIGITS.length)];return targetChar;}// Punctuation / other characters: resolve directly (letters and\n// lettersAndNumbers don't scramble punctuation).\nreturn targetChar;}/** Maps each character position to its \"resolve rank\" (0 = resolves\n *  first) according to the chosen stagger direction. */function buildResolveOrder(length,direction){const indices=Array.from({length},(_,i)=>i);if(direction===\"rightToLeft\")return indices.map(i=>length-1-i);if(direction===\"random\"){const shuffled=[...indices];for(let i=shuffled.length-1;i>0;i--){const j=Math.floor(Math.random()*(i+1));[shuffled[i],shuffled[j]]=[shuffled[j],shuffled[i]];}const rankByPosition=new Array(length);shuffled.forEach((pos,rank)=>{rankByPosition[pos]=rank;});return rankByPosition;}return indices// leftToRight\n;}function resolvedCells(text){return text.split(\"\").map(char=>({char,resolved:true}));}/** One-shot, non-animated frame — used only for the canvas preview. */function staticScrambleFrame(toText,t,order,characterSet,customChars){const length=toText.length;const maxRank=Math.max(1,length-1);return toText.split(\"\").map((targetChar,i)=>{if(targetChar===\" \")return{char:\" \",resolved:true};const resolveT=MIN_RESOLVE_FRACTION+(1-MIN_RESOLVE_FRACTION)*(order[i]/maxRank);const resolved=t>=resolveT;return{char:resolved?targetChar:randomCharFor(targetChar,characterSet,customChars),resolved};});}/**\n * Drives one scramble transition with a single requestAnimationFrame\n * loop (timestamp-based, not setInterval).\n *\n * Length interpolation: the visible character COUNT is lerped from\n * fromLength to the target's length across the whole duration, so a\n * word that's shorter/longer than the current one grows or shrinks\n * smoothly instead of jumping at t=0.\n *\n * Stagger: each position has a \"resolve rank\" (from buildResolveOrder)\n * converted to a threshold in [MIN_RESOLVE_FRACTION, 1] on the timeline\n * — once elapsed progress passes a position's threshold, it locks to\n * the target character permanently. Until then it shows a random\n * character that's only re-rolled every `tickMs` (a persistent `pool`,\n * not regenerated every animation frame), which is what reads as a\n * flicker instead of noise.\n */function runScrambleTransition(opts){const{fromLength,toText,durationMs,tickMs,staggerDirection,characterSet,customChars,onFrame,onComplete,logTimings}=opts;const toLength=toText.length;const order=buildResolveOrder(toLength,staggerDirection);const maxRank=Math.max(1,toLength-1);let cancelled=false;let rafHandle=null;let startTime=null;let lastTick=0;let pool=[];function regeneratePool(displayLength){const next=[];for(let i=0;i<displayLength;i++){const targetChar=i<toLength?toText[i]:\"\";next.push(targetChar===\" \"?\" \":randomCharFor(targetChar||\"a\",characterSet,customChars));}pool=next;}function buildCells(displayLength,t){const cells=[];for(let i=0;i<displayLength;i++){if(i>=toLength){cells.push({char:pool[i]??\" \",resolved:false});continue;}const targetChar=toText[i];if(targetChar===\" \"){cells.push({char:\" \",resolved:true});continue;}const resolveT=MIN_RESOLVE_FRACTION+(1-MIN_RESOLVE_FRACTION)*(order[i]/maxRank);if(t>=resolveT){cells.push({char:targetChar,resolved:true});}else{cells.push({char:pool[i]??targetChar,resolved:false});}}return cells;}function frame(timestamp){if(cancelled)return;if(startTime===null){// The clock starts on the first rAF callback this transition\n// actually receives — whatever delay preceded scheduling it\n// (trigger detection, fonts, layout) is never counted.\nstartTime=timestamp;lastTick=timestamp;if(logTimings){console.log(`[ScrambleText] \"${toText}\" scramble start @ ${timestamp.toFixed(1)}ms (rAF)`);}}const elapsed=timestamp-startTime;const t=durationMs<=0?1:Math.min(1,elapsed/durationMs);const displayLength=Math.round(fromLength+(toLength-fromLength)*t);if(timestamp-lastTick>=tickMs||pool.length!==displayLength){regeneratePool(displayLength);lastTick=timestamp;}onFrame(buildCells(displayLength,t));if(t>=1){onFrame(resolvedCells(toText));if(logTimings){console.log(`[ScrambleText] \"${toText}\" scramble end @ ${timestamp.toFixed(1)}ms — elapsed ${elapsed.toFixed(1)}ms (target ${durationMs}ms)`);}onComplete();return;}rafHandle=requestAnimationFrame(frame);}rafHandle=requestAnimationFrame(frame);return()=>{cancelled=true;if(rafHandle!==null)cancelAnimationFrame(rafHandle);};}/* ────────────────────────────────────────────────────────────────────────\n   Reduced motion\n   ──────────────────────────────────────────────────────────────────────── */function usePrefersReducedMotion(){const[prefersReduced,setPrefersReduced]=useState(()=>{if(typeof window===\"undefined\"||!window.matchMedia)return false;try{return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;}catch{return false;}});useEffect(()=>{if(typeof window===\"undefined\"||!window.matchMedia)return;const query=window.matchMedia(\"(prefers-reduced-motion: reduce)\");const handleChange=()=>setPrefersReduced(query.matches);query.addEventListener(\"change\",handleChange);return()=>query.removeEventListener(\"change\",handleChange);},[]);return prefersReduced;}/* ────────────────────────────────────────────────────────────────────────\n   Component\n   ──────────────────────────────────────────────────────────────────────── *//**\n * Scramble Text\n *\n * Cycles a static prefix + a decoding word/phrase list, terminal-cipher\n * style: characters flicker through random noise and lock in left-to-\n * right (or right-to-left / random) until the next word resolves.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight auto\n */export default function ScrambleText(props){const{words,prefixText,font,prefixColor,wordColor,scrambleColor,characterSet,customCharacters,scrambleDuration,holdDuration,tickSpeed,staggerDirection,loop,trigger,replayOnReenter,decodeFirstWord,layout,alignment,widthMode,monospaceScramble,previewScrambled,logTimings,respectReducedMotion,style}=props;const validWords=useMemo(()=>words.filter(w=>w.length>0),[words]);const validWordsKey=validWords.join(\"\\x00\");const isCanvas=RenderTarget.current()===RenderTarget.canvas;// Android's \"Remove animations\" / battery-saver modes report\n// prefers-reduced-motion, which swaps the scramble for a plain\n// crossfade. respectReducedMotion=false lets the scramble run anyway.\nconst systemPrefersReducedMotion=usePrefersReducedMotion();const prefersReducedMotion=respectReducedMotion!==false&&systemPrefersReducedMotion;const[displayCells,setDisplayCells]=useState(()=>resolvedCells(validWords[0]??\"\"));const[ariaWord,setAriaWord]=useState(validWords[0]??\"\");const[fadeVisible,setFadeVisible]=useState(true);const rootRef=useRef(null);// ── The whole sequencer: trigger gating, Delay-free start, the\n// scramble/crossfade transition, Hold, and Loop/stop-on-last — one\n// effect, one cancelable chain, restarted cleanly whenever content\n// or pacing props change. ─────────────────────────────────────────\nuseEffect(()=>{if(isCanvas||validWords.length===0)return;if(typeof window===\"undefined\")return;let cancelled=false;let cancelCurrentTransition=null;let holdHandle=null;let lengthRef=0;function clear(){if(cancelCurrentTransition){cancelCurrentTransition();cancelCurrentTransition=null;}if(holdHandle!==null){clearTimeout(holdHandle);holdHandle=null;}}function scheduleHoldThenNext(fromIndex){if(cancelled||validWords.length<=1)return;holdHandle=window.setTimeout(()=>{if(cancelled)return;const isLast=fromIndex===validWords.length-1;// Loop off: stop here, permanently — stay on the last\n// (fully resolved) word, no further transitions.\nif(isLast&&!loop)return;const nextIndex=(fromIndex+1)%validWords.length;transitionTo(nextIndex);},Math.max(0,holdDuration));}function transitionTo(toIndex){if(cancelled)return;const toText=validWords[toIndex];if(prefersReducedMotion){setFadeVisible(false);holdHandle=window.setTimeout(()=>{if(cancelled)return;setDisplayCells(resolvedCells(toText));setAriaWord(toText);lengthRef=toText.length;setFadeVisible(true);scheduleHoldThenNext(toIndex);},REDUCED_MOTION_FADE_MS);return;}cancelCurrentTransition=runScrambleTransition({fromLength:lengthRef,toText,durationMs:Math.max(0,scrambleDuration),tickMs:Math.max(1,tickSpeed),staggerDirection,characterSet,customChars:customCharacters,logTimings,onFrame:cells=>{lengthRef=cells.length;setDisplayCells(cells);},onComplete:()=>{setAriaWord(toText);scheduleHoldThenNext(toIndex);}});}function start(){if(cancelled)return;clear();const first=validWords[0];if(prefersReducedMotion||!decodeFirstWord){setDisplayCells(resolvedCells(first));setAriaWord(first);lengthRef=first.length;setFadeVisible(true);if(logTimings){console.log(`[ScrambleText] \"${first}\" shown instantly, no scramble (reduced motion or decodeFirstWord=false)`);}scheduleHoldThenNext(0);return;}// Same shared transition as every later word — the only\n// difference is fromLength starts at the first word's OWN\n// length (not 0), so all its characters render as random\n// noise immediately instead of growing in from nothing, and\n// it resolves on the exact same stagger timing as any other\n// transition.\nlengthRef=first.length;transitionTo(0);}// Waiting on document.fonts.ready only delays WHEN start() is\n// called — the transition's own clock (in runScrambleTransition)\n// begins fresh from its first rAF timestamp regardless, so this\n// wait is never counted as part of scrambleDuration.\nconst fontsReady=typeof document!==\"undefined\"&&document.fonts&&document.fonts.ready?document.fonts.ready:Promise.resolve();function startWhenFontsReady(){fontsReady.then(()=>{if(!cancelled)start();},()=>{if(!cancelled)start();});}const root=rootRef.current;let intersectionObserver=null;let hasPlayedOnce=false;function handleHoverStart(){startWhenFontsReady();}if(trigger===\"onLoad\"){startWhenFontsReady();}else if(trigger===\"inView\"&&root){intersectionObserver=new IntersectionObserver(entries=>{for(const entry of entries){if(entry.isIntersecting&&(!hasPlayedOnce||replayOnReenter)){hasPlayedOnce=true;startWhenFontsReady();}}},{threshold:.2});intersectionObserver.observe(root);}else if(trigger===\"onHover\"&&root){root.addEventListener(\"mouseenter\",handleHoverStart);}return()=>{cancelled=true;clear();intersectionObserver?.disconnect();if(trigger===\"onHover\"&&root){root.removeEventListener(\"mouseenter\",handleHoverStart);}};// eslint-disable-next-line react-hooks/exhaustive-deps\n},[isCanvas,validWordsKey,scrambleDuration,holdDuration,tickSpeed,staggerDirection,loop,trigger,replayOnReenter,decodeFirstWord,characterSet,customCharacters,prefersReducedMotion,logTimings]);// ── Width lock: measure every word off-screen with the same font,\n// reserve the widest so the layout around this component never\n// shifts as words cycle. ────────────────────────────────────────\nconst measureRefs=useRef([]);const[lockedWidth,setLockedWidth]=useState(null);useEffect(()=>{if(widthMode!==\"lockToLongest\"){setLockedWidth(null);return;}let cancelled=false;function measure(){if(cancelled)return;let maxWidth=0;measureRefs.current.forEach(el=>{if(el)maxWidth=Math.max(maxWidth,el.getBoundingClientRect().width);});setLockedWidth(maxWidth>0?maxWidth:null);}// Measuring before the real font has loaded would lock in a\n// fallback-font width, so wait for it — this only delays the\n// measurement, it has no effect on scramble timing.\nconst fontsReady=typeof document!==\"undefined\"&&document.fonts&&document.fonts.ready?document.fonts.ready:Promise.resolve();fontsReady.then(measure,measure);return()=>{cancelled=true;};// eslint-disable-next-line react-hooks/exhaustive-deps\n},[widthMode,validWordsKey,font]);// ── What to actually render: canvas gets a static, non-animated\n// frame (full word, or a frozen half-scrambled preview); the live\n// site renders the state the sequencer above is driving. ─────────\nconst cells=isCanvas?previewScrambled?staticScrambleFrame(validWords[0]??\"\",.5,buildResolveOrder((validWords[0]??\"\").length,staggerDirection),characterSet,customCharacters):resolvedCells(validWords[0]??\"\"):displayCells;const fontFamilyFallback=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\";const flexAlign=alignment===\"left\"?\"flex-start\":alignment===\"right\"?\"flex-end\":\"center\";// Group cells into words so a line break can only happen at a space —\n// never in the middle of a word, even with monospaceScramble (whose\n// per-character inline-blocks would otherwise create a break point\n// between every letter). Spaces are real, breakable spaces.\nconst wordGroups=[];cells.forEach((cell,i)=>{const isSpace=cell.char===\" \";const last=wordGroups[wordGroups.length-1];if(last&&last.space===isSpace&&!isSpace)last.text.push(cell);else wordGroups.push({text:[cell],space:isSpace,key:i});});const renderCell=(cell,i)=>monospaceScramble?/*#__PURE__*/_jsx(\"span\",{style:{display:\"inline-block\",width:\"1ch\",textAlign:\"center\",fontVariantNumeric:\"tabular-nums\",color:cell.resolved?wordColor:scrambleColor},children:cell.char},i):/*#__PURE__*/_jsx(\"span\",{style:{color:cell.resolved?wordColor:scrambleColor},children:cell.char},i);const wordSpan=/*#__PURE__*/_jsx(\"span\",{\"aria-hidden\":\"true\",style:{display:\"inline-block\",// Locked width is capped at the container's width, so it can\n// reserve space for the longest phrase without ever forcing\n// an overflow when the container is narrower than that.\nminWidth:widthMode===\"lockToLongest\"&&lockedWidth?`min(${lockedWidth}px, 100%)`:0,maxWidth:\"100%\",// pre-wrap keeps the spaces and lets lines wrap at them.\nwhiteSpace:\"pre-wrap\",overflowWrap:\"normal\",wordBreak:\"normal\",opacity:fadeVisible?1:0,transition:prefersReducedMotion?`opacity ${REDUCED_MOTION_FADE_MS}ms ease`:undefined},children:wordGroups.map(group=>group.space?\" \":/*#__PURE__*/_jsx(\"span\",{style:{display:\"inline-block\",whiteSpace:\"nowrap\"},children:group.text.map((cell,j)=>renderCell(cell,group.key+j))},group.key))});const prefixSpan=prefixText.length>0&&/*#__PURE__*/_jsx(\"span\",{style:{color:prefixColor,minWidth:0,maxWidth:\"100%\",whiteSpace:\"normal\",overflowWrap:\"normal\"},children:prefixText});const ariaLive=prefixText.length>0?`${prefixText} ${ariaWord}`:ariaWord;return /*#__PURE__*/_jsxs(\"div\",{ref:rootRef,style:{display:\"flex\",width:\"100%\",boxSizing:\"border-box\",flexDirection:layout===\"stacked\"?\"column\":\"row\",alignItems:layout===\"stacked\"?flexAlign:\"baseline\",justifyContent:layout===\"inline\"?flexAlign:undefined,gap:layout===\"inline\"?\"0.3em\":\"0.15em\",textAlign:alignment,fontFamily:fontFamilyFallback,...font,...style},children:[prefixSpan,wordSpan,widthMode===\"lockToLongest\"&&/*#__PURE__*/_jsx(\"div\",{\"aria-hidden\":\"true\",style:{position:\"absolute\",visibility:\"hidden\",height:0,overflow:\"hidden\",whiteSpace:\"nowrap\",fontFamily:fontFamilyFallback,...font},children:validWords.map((word,i)=>/*#__PURE__*/_jsx(\"span\",{ref:el=>{measureRefs.current[i]=el;},style:{display:\"inline-block\"},children:word},i))}),/*#__PURE__*/_jsx(\"span\",{\"aria-live\":\"polite\",style:SR_ONLY_STYLE,children:ariaLive})]});}addPropertyControls(ScrambleText,{words:{type:ControlType.Array,title:\"Words\",control:{type:ControlType.String,defaultValue:\"\"},defaultValue:[\"Students\",\"Designers\",\"Founders\"],maxCount:50},prefixText:{type:ControlType.String,title:\"Prefix\",defaultValue:\"Library for\"},font:{type:ControlType.Font,title:\"Font\",controls:\"extended\",defaultFontType:\"sans-serif\",defaultValue:{fontSize:32}},prefixColor:{type:ControlType.Color,title:\"Prefix Color\",defaultValue:\"#FFFFFF\"},wordColor:{type:ControlType.Color,title:\"Word Color\",defaultValue:\"rgba(255, 255, 255, 0.6)\"},scrambleColor:{type:ControlType.Color,title:\"Scramble Color\",defaultValue:\"rgba(255, 255, 255, 0.6)\"},characterSet:{type:ControlType.Enum,title:\"Character Set\",options:[\"letters\",\"lettersAndNumbers\",\"symbols\",\"custom\"],optionTitles:[\"Letters\",\"Letters + Numbers\",\"Symbols\",\"Custom\"],defaultValue:\"letters\"},customCharacters:{type:ControlType.String,title:\"Custom Chars\",defaultValue:\"!<>-_\\\\/[]{}—=+*^?#\",hidden:props=>props.characterSet!==\"custom\"},scrambleDuration:{type:ControlType.Number,title:\"Scramble Dur.\",defaultValue:800,min:100,max:3e3,step:10,unit:\"ms\"},holdDuration:{type:ControlType.Number,title:\"Hold\",defaultValue:2e3,min:200,max:8e3,step:50,unit:\"ms\"},tickSpeed:{type:ControlType.Number,title:\"Tick Speed\",defaultValue:40,min:10,max:200,step:5,unit:\"ms\"},staggerDirection:{type:ControlType.Enum,title:\"Stagger\",options:[\"leftToRight\",\"rightToLeft\",\"random\"],optionTitles:[\"Left to Right\",\"Right to Left\",\"Random\"],defaultValue:\"leftToRight\"},loop:{type:ControlType.Boolean,title:\"Loop\",defaultValue:true},trigger:{type:ControlType.Enum,title:\"Trigger\",options:[\"onLoad\",\"inView\",\"onHover\"],optionTitles:[\"On Load\",\"In View\",\"On Hover\"],defaultValue:\"onLoad\"},replayOnReenter:{type:ControlType.Boolean,title:\"Replay\",defaultValue:false,description:\"Restart every time it re-enters the viewport.\",hidden:props=>props.trigger!==\"inView\"},decodeFirstWord:{type:ControlType.Boolean,title:\"Decode First\",defaultValue:true},layout:{type:ControlType.Enum,title:\"Layout\",options:[\"stacked\",\"inline\"],optionTitles:[\"Stacked\",\"Inline\"],defaultValue:\"stacked\"},alignment:{type:ControlType.Enum,title:\"Alignment\",options:[\"left\",\"center\",\"right\"],optionTitles:[\"Left\",\"Center\",\"Right\"],displaySegmentedControl:true,defaultValue:\"left\"},widthMode:{type:ControlType.Enum,title:\"Width\",options:[\"auto\",\"lockToLongest\"],optionTitles:[\"Auto\",\"Lock to Longest\"],defaultValue:\"lockToLongest\"},monospaceScramble:{type:ControlType.Boolean,title:\"Fixed Char Width\",defaultValue:false,description:\"Stops scrambled characters from jittering the word's width in proportional fonts.\"},previewScrambled:{type:ControlType.Boolean,title:\"Preview Scrambled\",defaultValue:false,description:\"Canvas-only: freeze a half-scrambled frame to check the look of the random characters.\"},respectReducedMotion:{type:ControlType.Boolean,title:\"Reduced Motion\",defaultValue:true,enabledTitle:\"Respect\",disabledTitle:\"Ignore\",description:\"On = devices with 'reduce motion' / 'remove animations' / battery saver on get a simple fade instead of the scramble. Off = scramble always plays.\"},logTimings:{type:ControlType.Boolean,title:\"Log Timings\",defaultValue:false,description:\"Debug: logs each transition's actual start/end time to the console. Turn off when done.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ScrambleText\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"auto\",\"framerSupportedLayoutWidth\":\"any\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ScrambleText.map"],"mappings":"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"}