{"version":3,"file":"TextStagger.DOxOcIyV.mjs","names":["useState","useRef","React","useMemo","_Fragment","__esmMin","le","init_ssg_sandbox_shims","pe","te","init_npm_react_18_3_1","_e","de","c","init_jsx_runtime","e","ce","window","motion","useInView","init_framer_motion_DhsWWWsN","useAnimationControls","init_framer_CcflMUCW","addPropertyControls","useIsStaticRenderer","ControlType","TextStagger","props","hasAnimated","setHasAnimated","clicked","setClicked","isStatic","wrappedLines","setWrappedLines","measureRef","controls","containerRef","inView","measureLines","element","range","textNode","lines","fullText","text","currentLine","lastBottom","i","rect","font","style","shouldAnimate","trigger","delay","duration","fontFamily","handleMouseEnter","handleClick","l","charCountBeforeLine","sum","halfPoint","lineOpacity","halfOpacity","variable","line","init_TextStagger"],"sources":["https:/framerusercontent.com/modules/pw1uoh6hnk9jDLWxpu5i/GDXZDOqmr43PIi4ttZO4/TextStagger.js"],"sourcesContent":["// Text stagger per line animation, editable text, BDO Grotesk font (simulated with sans-serif), variable setting\nimport{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{useEffect,useMemo,useState,startTransition,useRef,useLayoutEffect}from\"react\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";import{motion,useAnimationControls,useInView}from\"framer-motion\";import React from\"react\";/**\n * Staggered text per line with editable text, BDO Grotesk (sans-serif), and variable toggle\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n */export default function TextStagger(props){const{text,delay,duration,font,color,variable,style,trigger=\"inView\",halfOpacity=false}=props;const[hasAnimated,setHasAnimated]=useState(false);const[clicked,setClicked]=useState(false);const isStatic=useIsStaticRenderer();const[wrappedLines,setWrappedLines]=useState([]);const measureRef=useRef(null);const controls=useAnimationControls();// Use useRef, not useState for a DOM ref\nconst containerRef=React.useRef(null);const inView=useInView(containerRef);// Measure actual rendered lines including auto-wrap\nuseLayoutEffect(()=>{if(!measureRef.current||typeof window===\"undefined\")return;const measureLines=()=>{const element=measureRef.current;if(!element)return;const range=document.createRange();const textNode=element.firstChild;if(!textNode||textNode.nodeType!==Node.TEXT_NODE)return;const lines=[];const fullText=text||\"\";let currentLine=\"\";let lastBottom=-1;// Measure character by character to detect line breaks\nfor(let i=0;i<fullText.length;i++){range.setStart(textNode,0);range.setEnd(textNode,i+1);const rect=range.getBoundingClientRect();if(lastBottom===-1){lastBottom=rect.bottom;}// New line detected\nif(rect.bottom>lastBottom+2){lines.push(currentLine);currentLine=fullText[i];lastBottom=rect.bottom;}else{currentLine+=fullText[i];}}// Push the last line\nif(currentLine){lines.push(currentLine);}setWrappedLines(lines.length>0?lines:[fullText]);};measureLines();window.addEventListener(\"resize\",measureLines);return()=>window.removeEventListener(\"resize\",measureLines);},[text,font,style]);// Determine whether to fire animation trigger\nconst shouldAnimate=useMemo(()=>{if(isStatic)return false;if(trigger===\"inView\")return inView;if(trigger===\"hover\")return hasAnimated;if(trigger===\"click\")return clicked;return false;},[isStatic,inView,hasAnimated,clicked,trigger]);useEffect(()=>{if(!isStatic&&shouldAnimate){if(!hasAnimated){controls.start(i=>({y:0,transition:{delay:i*delay,duration,ease:[.44,0,.34,.98]}}));setHasAnimated(true);}}},[controls,delay,duration,isStatic,hasAnimated,shouldAnimate]);// Simulate BDO Grotesk with sans-serif; for real, user must select it on font control if installed\nconst fontFamily=font&&font.fontFamily||\"'BDO Grotesk', 'Inter', 'Helvetica Neue', Arial, sans-serif\";// Event handlers for hover/click triggers\nconst handleMouseEnter=()=>{if(trigger===\"hover\"&&!hasAnimated)startTransition(()=>setHasAnimated(true));};const handleClick=()=>{if(trigger===\"click\"&&!clicked)startTransition(()=>setClicked(true));};return /*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"div\",{ref:measureRef,style:{position:\"absolute\",visibility:\"hidden\",pointerEvents:\"none\",whiteSpace:\"pre-wrap\",...font,fontFamily,width:style?.width||\"100%\"},\"aria-hidden\":\"true\",children:text}),/*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{...style,position:\"relative\",display:\"flex\",flexDirection:\"column\",justifyContent:\"center\",color,...font,fontFamily},onMouseEnter:trigger===\"hover\"?handleMouseEnter:undefined,onClick:trigger===\"click\"?handleClick:undefined,children:wrappedLines.map((line,i)=>{// Calculate cumulative character count up to this line\nconst charCountBeforeLine=wrappedLines.slice(0,i).reduce((sum,l)=>sum+l.length,0);const totalChars=text.length;const halfPoint=totalChars/2;// Determine if this line is in the second half\nconst lineOpacity=halfOpacity&&charCountBeforeLine>=halfPoint?.5:1;return /*#__PURE__*/_jsx(\"span\",{style:{display:\"block\",overflow:\"hidden\",width:\"100%\",marginBottom:0,lineHeight:font.lineHeight||1.2},children:/*#__PURE__*/_jsx(motion.span,{custom:i,initial:isStatic?{y:0}:{y:70},animate:isStatic?undefined:controls,style:{display:\"inline-block\",whiteSpace:\"pre-wrap\",...font,fontFamily,color,opacity:lineOpacity,fontVariationSettings:variable?'\"wght\" 700':'\"wght\" 500',fontWeight:variable?700:500,WebkitClipPath:\"inset(0 0 0 0)\",clipPath:\"inset(0 0 0 0)\",willChange:\"transform\",lineHeight:font.lineHeight||1.2},children:line||\" \"})},i);})})]});}addPropertyControls(TextStagger,{text:{type:ControlType.String,title:\"Text\",defaultValue:\"Editable\\nStaggered\\nText\",displayTextArea:true,placeholder:\"Type your text...\"},delay:{type:ControlType.Number,title:\"Delay\",defaultValue:.08,min:.01,max:1,step:.01,unit:\"s\"},duration:{type:ControlType.Number,title:\"Dur. per line\",defaultValue:.5,min:.05,max:2,step:.01,unit:\"s\"},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"#000000\"},font:{type:ControlType.Font,title:\"Font\",controls:\"extended\",defaultFontType:\"sans-serif\",defaultValue:{fontSize:40,lineHeight:\"1em\",letterSpacing:\"-0.02em\",variant:\"Regular\",textAlign:\"left\"}},variable:{type:ControlType.Boolean,title:\"Variable Weight\",defaultValue:false,enabledTitle:\"Bold\",disabledTitle:\"Regular\"},trigger:{type:ControlType.Enum,title:\"Trigger\",options:[\"inView\",\"hover\",\"click\"],optionTitles:[\"When in view\",\"On hover\",\"On click\"],defaultValue:\"inView\",displaySegmentedControl:true},halfOpacity:{type:ControlType.Boolean,title:\"Half Opacity\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"TextStagger\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"any\",\"framerSupportedLayoutWidth\":\"any\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./TextStagger.map"],"mappings":"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"}