{"version":3,"file":"LineMaskSplit.ByM7FWWK.mjs","names":["useRef","useMemo","useState","useCallback","_Fragment"],"sources":["https:/framerusercontent.com/modules/qighyPay8IgiqwG15dY4/y2mPXH3YgcIGuFrY2NGn/LineMaskSplit.js"],"sourcesContent":["// User provided an existing LineMaskSplit component using GSAP SplitText + ScrollTrigger and asked to create a Framer component that follows the Framer component rules and achieves the same goal (line/word/char mask split reveal on Appear or Scroll).\nimport{jsx as _jsx,Fragment as _Fragment}from\"react/jsx-runtime\";import{useCallback,useEffect,useLayoutEffect,useMemo,useRef,useState,startTransition}from\"react\";import{addPropertyControls,ControlType,RenderTarget,useIsStaticRenderer}from\"framer\";import{motion,useInView}from\"framer-motion\";function clamp(n,min,max){return Math.max(min,Math.min(max,n));}function tokenizeWords(input){// Keep spaces as tokens so spacing stays identical.\n// Example: \"Hello  world\" => [\"Hello\", \"  \", \"world\"]\nconst tokens=[];const re=/(\\s+|\\S+)/g;let m;while((m=re.exec(input))!==null)tokens.push(m[0]);return tokens;}function useResizeObserver(ref,onResize){useEffect(()=>{if(typeof window===\"undefined\")return;if(!ref.current)return;if(typeof ResizeObserver===\"undefined\")return;const ro=new ResizeObserver(()=>onResize());ro.observe(ref.current);return()=>ro.disconnect();},[ref,onResize]);}function rootMarginForStart(start){// useInView considers rootMargin relative to viewport.\n// Negative bottom margin makes it trigger sooner.\n// These values are pragmatic approximations.\nif(start===\"top\")return\"0px 0px -85% 0px\";if(start===\"center\")return\"0px 0px -50% 0px\";return\"0px 0px -15% 0px\"// bottom\n;}/**\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n * @framerIntrinsicWidth 800\n * @framerIntrinsicHeight 250\n */export default function LineMaskSplit(props){const{text,color,font,tag,className,trigger,scrollTriggerPosition,reverse,splitMode,maskLines,staggerAmount,transition,animation,style}=props;const{translateXInitial,translateYInitial,opacityInitial,rotateInitial,scaleInitial,blurInitial}=animation;const isStatic=useIsStaticRenderer();const containerRef=useRef(null);const words=useMemo(()=>tokenizeWords(text||\"\"),[text]);// For line splitting, we render words as spans and group by offsetTop.\nconst wordRefs=useRef([]);wordRefs.current=[];const[lines,setLines]=useState([]);const measureLines=useCallback(()=>{if(typeof window===\"undefined\")return;if(!containerRef.current)return;if(splitMode!==\"lines\")return;const nodes=wordRefs.current.filter(Boolean);if(nodes.length===0){startTransition(()=>setLines([]));return;}const grouped=[];let currentTop=null;let current=[];for(let i=0;i<nodes.length;i++){const top=nodes[i].offsetTop;if(currentTop===null){currentTop=top;current=[i];continue;}if(Math.abs(top-currentTop)<=1){current.push(i);}else{grouped.push(current);currentTop=top;current=[i];}}if(current.length)grouped.push(current);startTransition(()=>setLines(grouped));},[splitMode]);useLayoutEffect(()=>{if(isStatic)return;if(RenderTarget.current()===RenderTarget.canvas)return;measureLines();// eslint-disable-next-line react-hooks/exhaustive-deps\n},[measureLines,text,splitMode,maskLines,font?.fontSize,font?.lineHeight,font?.letterSpacing]);useResizeObserver(containerRef,measureLines);// Trigger logic\nconst inView=useInView(containerRef,{margin:rootMarginForStart(scrollTriggerPosition),amount:.01});const[hasPlayedOnce,setHasPlayedOnce]=useState(false);useEffect(()=>{if(isStatic)return;if(RenderTarget.current()===RenderTarget.canvas)return;if(trigger===\"Appear\"){if(!hasPlayedOnce){startTransition(()=>setHasPlayedOnce(true));}return;}// Scroll mode\nif(inView){if(!hasPlayedOnce)startTransition(()=>setHasPlayedOnce(true));}else{if(reverse)startTransition(()=>setHasPlayedOnce(false));}},[trigger,inView,reverse,hasPlayedOnce,isStatic]);const shouldAnimate=!isStatic&&RenderTarget.current()!==RenderTarget.canvas&&RenderTarget.current()!==RenderTarget.thumbnail;const Tag=tag;const textBaseStyle=useMemo(()=>({margin:0,color,width:\"100%\",display:\"block\",whiteSpace:\"pre-wrap\",...font}),[color,font]);const itemInitial=useMemo(()=>({opacity:clamp(opacityInitial,0,1),x:translateXInitial,y:translateYInitial,rotate:rotateInitial,scale:scaleInitial,filter:`blur(${Math.max(0,blurInitial)}px)`}),[opacityInitial,translateXInitial,translateYInitial,rotateInitial,scaleInitial,blurInitial]);const itemAnimate=useMemo(()=>({opacity:1,x:0,y:0,rotate:0,scale:1,filter:\"blur(0px)\"}),[]);const itemTransition=useMemo(()=>{const t=transition||{type:\"tween\",duration:.4,ease:\"easeOut\"};return t;},[transition]);const renderWordsOrChars=()=>{if(splitMode===\"chars\"){const chars=Array.from(text||\"\");const items=chars.map((ch,i)=>{const display=ch===\" \"?\"\\xa0\":ch;if(!shouldAnimate){return /*#__PURE__*/_jsx(\"span\",{style:{display:\"inline-block\"},children:display},i);}return /*#__PURE__*/_jsx(motion.span,{style:{display:\"inline-block\",willChange:\"transform, opacity, filter\"},initial:itemInitial,animate:hasPlayedOnce?itemAnimate:itemInitial,transition:{...itemTransition,delay:i*staggerAmount},children:display},i);});return /*#__PURE__*/_jsx(_Fragment,{children:items});}// words or lines use the word tokenizer\nconst items=words.map((token,i)=>{const display=token.replace(/\\s/g,\"\\xa0\");const setRef=el=>{if(splitMode===\"lines\")wordRefs.current[i]=el;};if(!shouldAnimate||splitMode===\"lines\"){return /*#__PURE__*/_jsx(\"span\",{ref:setRef,style:{display:\"inline-block\"},children:display},i);}return /*#__PURE__*/_jsx(motion.span,{ref:setRef,style:{display:\"inline-block\",willChange:\"transform, opacity, filter\"},initial:itemInitial,animate:hasPlayedOnce?itemAnimate:itemInitial,transition:{...itemTransition,delay:i*staggerAmount},children:display},i);});return /*#__PURE__*/_jsx(_Fragment,{children:items});};const renderLines=()=>{// Fallback: if we don't have measurements yet, just render word spans.\nif(lines.length===0){if(!shouldAnimate)return renderWordsOrChars();// Let measurement happen; show non-animated words so it still looks fine.\nreturn renderWordsOrChars();}const lineNodes=lines.map((line,lineIndex)=>{const lineContent=line.map(wordIndex=>{const token=words[wordIndex]??\"\";const display=token.replace(/\\s/g,\"\\xa0\");return /*#__PURE__*/_jsx(\"span\",{style:{display:\"inline-block\"},children:display},wordIndex);});const wrapperStyle={display:\"block\",overflow:maskLines?\"hidden\":\"visible\"};if(!shouldAnimate){return /*#__PURE__*/_jsx(\"div\",{style:wrapperStyle,children:/*#__PURE__*/_jsx(\"div\",{style:{display:\"inline\"},children:lineContent})},lineIndex);}return /*#__PURE__*/_jsx(\"div\",{style:wrapperStyle,children:/*#__PURE__*/_jsx(motion.div,{style:{display:\"inline-block\",willChange:\"transform, opacity, filter\"},initial:itemInitial,animate:hasPlayedOnce?itemAnimate:itemInitial,transition:{...itemTransition,delay:lineIndex*staggerAmount},children:lineContent})},lineIndex);});return /*#__PURE__*/_jsx(_Fragment,{children:lineNodes});};const content=splitMode===\"lines\"?renderLines():renderWordsOrChars();const containerStyles={position:\"relative\",width:\"100%\",height:\"100%\",display:\"flex\",justifyContent:\"center\",alignItems:\"center\",backgroundColor:\"transparent\",...style};// Keep the text from shrinking oddly in auto-height contexts.\nconst tagStyles={...textBaseStyle,// Ensure proper line wrapping for our word spans\nwordBreak:\"break-word\",overflowWrap:\"break-word\"};return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,className:`line-mask-split ${className||\"\"}`.trim(),style:containerStyles,children:/*#__PURE__*/_jsx(Tag,{style:tagStyles,\"aria-label\":text,children:content})});}addPropertyControls(LineMaskSplit,{trigger:{type:ControlType.Enum,title:\"Trigger\",options:[\"Appear\",\"Scroll\"],optionTitles:[\"Appear\",\"Layer in View\"],defaultValue:\"Appear\",displaySegmentedControl:true,segmentedControlDirection:\"vertical\"},scrollTriggerPosition:{type:ControlType.Enum,title:\"Start\",options:[\"top\",\"center\",\"bottom\"],optionTitles:[\"Top\",\"Center\",\"Bottom\"],defaultValue:\"center\",displaySegmentedControl:true,segmentedControlDirection:\"horizontal\",hidden:p=>p.trigger!==\"Scroll\"},reverse:{type:ControlType.Boolean,title:\"Replay\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\",hidden:p=>p.trigger!==\"Scroll\"},splitMode:{type:ControlType.Enum,title:\"Per\",options:[\"words\",\"chars\",\"lines\"],optionTitles:[\"Words\",\"Characters\",\"Lines\"],defaultValue:\"lines\",displaySegmentedControl:true,segmentedControlDirection:\"vertical\"},maskLines:{type:ControlType.Boolean,title:\"Mask Lines\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\",hidden:p=>p.splitMode!==\"lines\"},staggerAmount:{type:ControlType.Number,title:\"Stagger\",unit:\"s\",min:0,max:1,step:.01,defaultValue:.05},animation:{type:ControlType.Object,title:\"Animation\",icon:\"effect\",controls:{opacityInitial:{type:ControlType.Number,title:\"Opacity\",min:0,max:1,step:.05,defaultValue:0},scaleInitial:{type:ControlType.Number,title:\"Scale\",unit:\"x\",min:0,max:2,step:.01,defaultValue:1},blurInitial:{type:ControlType.Number,title:\"Blur\",unit:\"px\",min:0,max:40,step:1,defaultValue:10},rotateInitial:{type:ControlType.Number,title:\"Rotate\",unit:\"deg\",min:-180,max:180,step:1,defaultValue:0},translateXInitial:{type:ControlType.Number,title:\"Offset X\",unit:\"px\",min:-200,max:200,step:1,defaultValue:0},translateYInitial:{type:ControlType.Number,title:\"Offset Y\",unit:\"px\",min:-200,max:200,step:1,defaultValue:40}},defaultValue:{opacityInitial:0,scaleInitial:1,blurInitial:10,rotateInitial:0,translateXInitial:0,translateYInitial:40}},transition:{type:ControlType.Transition,title:\"Transition\",defaultValue:{type:\"tween\",duration:.6,ease:\"easeOut\"}},text:{type:ControlType.String,title:\"Text\",displayTextArea:true,defaultValue:\"Welcome to the amazing world of random word appearances. Tweak the component to see an amazing line by line mask split effect.\"},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"#000000\"},font:{type:ControlType.Font,title:\"Font\",controls:\"extended\",defaultFontType:\"sans-serif\",defaultValue:{fontSize:\"48px\",variant:\"Semibold\",lineHeight:\"1.1em\",letterSpacing:\"-0.02em\"}},tag:{type:ControlType.Enum,title:\"Tag\",options:[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"p\",\"div\",\"span\"],defaultValue:\"h1\"},className:{type:ControlType.String,title:\"Class\",defaultValue:\"\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"LineMaskSplit\",\"slots\":[],\"annotations\":{\"framerIntrinsicWidth\":\"800\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerIntrinsicHeight\":\"250\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./LineMaskSplit.map"],"mappings":"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"}