{"version":3,"file":"Scroll.B8mLxats.mjs","names":["useRef","useState"],"sources":["https:/framerusercontent.com/modules/zB5HwcxJnOOAidnf4LM2/7u6PaanAwYHF1YQ2mAmL/Scroll.js"],"sourcesContent":["// @ts-ignore\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";import{useRef,useEffect,useState}from\"react\";/**\n * SCROLL REVEAL TEXT\n *\n * Reveals text on scroll, word- or letter-by-letter.\n *\n * Fixes:\n * - Consistent left alignment on every line\n * - Full-width line containers\n * - Proper left / center / right / justify alignment\n * - Word and letter animation preserved\n * - Explicit line breaks preserved\n * - Framer static renderer support\n * - Reduced-motion support\n */const EASING=\"cubic-bezier(0.23, 1, 0.32, 1)\";const MOTION_PROPS={\"fade-up\":[\"transform\",\"opacity\"],mask:[\"transform\"],blur:[\"opacity\",\"filter\"],scale:[\"transform\",\"opacity\"]};const DEFAULT_FONT={fontSize:48,lineHeight:1.15,letterSpacing:\"-0.02em\",textAlign:\"left\",variant:\"Semibold\"};const parseToken=value=>value&&typeof value===\"object\"&&\"value\"in value?value.value:value;const normalizeStyleObject=(style={})=>{const next={...style};for(const key in next){next[key]=parseToken(next[key]);}return next;};const getReducedMotion=()=>typeof window!==\"undefined\"&&typeof window.matchMedia===\"function\"&&window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;export default function ScrollRevealText(props){const{text=\"We make brands look better,\\ncommunicate better,\\nand sell better online.\",splitMode=\"word\",animationStyle=\"mask\",triggerOnce=true,staggerMs=60,animDuration=800,startDelay=0,threshold=25,font=DEFAULT_FONT,textColor=\"#0A0A0A\",textAlign=\"left\",style}=props;const isStatic=typeof useIsStaticRenderer===\"function\"?useIsStaticRenderer():false;const rootRef=useRef(null);const[reducedMotion,setReducedMotion]=useState(getReducedMotion);const[isRevealed,setIsRevealed]=useState(()=>isStatic||getReducedMotion());const noMotion=isStatic||reducedMotion;/*\n     * Reduced motion\n     */useEffect(()=>{if(typeof window===\"undefined\"||typeof window.matchMedia!==\"function\"){return;}const mq=window.matchMedia(\"(prefers-reduced-motion: reduce)\");const update=()=>{setReducedMotion(mq.matches);};update();mq.addEventListener?.(\"change\",update);return()=>{mq.removeEventListener?.(\"change\",update);};},[]);/*\n     * Scroll observer\n     */useEffect(()=>{if(noMotion){setIsRevealed(true);return;}if(!rootRef.current||typeof IntersectionObserver===\"undefined\"){setIsRevealed(true);return;}const obs=new IntersectionObserver(entries=>{entries.forEach(entry=>{if(entry.isIntersecting){setIsRevealed(true);if(triggerOnce){obs.disconnect();}}else if(!triggerOnce){setIsRevealed(false);}});},{threshold:Math.max(0,Math.min(1,threshold/100))});obs.observe(rootRef.current);return()=>{obs.disconnect();};},[noMotion,triggerOnce,threshold]);const framerStyle=normalizeStyleObject(style);const fontStyle=normalizeStyleObject(font);const resolvedTextAlign=fontStyle.textAlign||framerStyle.textAlign||textAlign||\"left\";const content=String(text??\"\");/*\n     * Keep explicit line breaks.\n     */const lines=content.split(\"\\n\");/*\n     * Global animation token counter.\n     */let tokenIndex=0;/*\n     * Animation style for the actual text.\n     */const getInnerStyle=index=>{if(noMotion){return{display:\"inline-block\",transition:\"none\",willChange:\"auto\"};}const delay=startDelay+index*staggerMs;const animProps=MOTION_PROPS[animationStyle]||[];const transition=animProps.map(property=>`${property} ${animDuration}ms ${property===\"transform\"?EASING:\"ease\"} ${delay}ms`).join(\", \");const base={display:\"inline-block\",transition,willChange:animProps.length>0?animProps.join(\", \"):\"auto\"};switch(animationStyle){case\"fade-up\":return{...base,opacity:isRevealed?1:0,transform:isRevealed?\"translateY(0)\":\"translateY(0.4em)\"};case\"mask\":return{...base,transform:isRevealed?\"translateY(0)\":\"translateY(110%)\"};case\"blur\":return{...base,opacity:isRevealed?1:0,filter:isRevealed?\"blur(0px)\":\"blur(10px)\"};case\"scale\":return{...base,opacity:isRevealed?1:0,transform:isRevealed?\"scale(1)\":\"scale(0.8)\",transformOrigin:\"center bottom\"};default:return base;}};/*\n     * Outer animation mask.\n     *\n     * Important:\n     * The outer element does NOT affect horizontal alignment.\n     * It only clips the vertical animation.\n     */const getOuterStyle=()=>{if(animationStyle!==\"mask\"){return{display:\"inline-block\",verticalAlign:\"top\"};}return{display:\"inline-block\",verticalAlign:\"top\",overflow:\"hidden\",/*\n             * Only vertical padding.\n             * No horizontal padding or margin.\n             */paddingTop:0,paddingRight:0,paddingLeft:0,paddingBottom:\"0.15em\",marginTop:0,marginRight:0,marginLeft:0,marginBottom:\"-0.15em\"};};/*\n     * Render one word.\n     */const renderWord=(word,wordKey)=>{/*\n         * LETTER MODE\n         */if(splitMode===\"letter\"){const letters=Array.from(word);return /*#__PURE__*/_jsx(\"span\",{style:{display:\"inline-block\",whiteSpace:\"nowrap\",verticalAlign:\"top\"},children:letters.map((ch,li)=>{const idx=tokenIndex++;return /*#__PURE__*/_jsx(\"span\",{style:getOuterStyle(),children:/*#__PURE__*/_jsx(\"span\",{style:getInnerStyle(idx),children:ch})},`${wordKey}-${li}`);})},wordKey);}/*\n         * WORD MODE\n         */const idx=tokenIndex++;return /*#__PURE__*/_jsx(\"span\",{style:getOuterStyle(),children:/*#__PURE__*/_jsx(\"span\",{style:getInnerStyle(idx),children:word})},wordKey);};/*\n     * Render a complete line.\n     *\n     * THIS IS THE IMPORTANT FIX.\n     *\n     * Every line gets:\n     *\n     * width: 100%\n     * display: block\n     * text-align inherited\n     *\n     * So every line begins from exactly\n     * the same horizontal coordinate.\n     */const renderLine=(line,lineIdx)=>{const parts=line.split(/(\\s+)/).filter(part=>part!==\"\");return /*#__PURE__*/_jsx(\"div\",{style:{display:\"block\",width:\"100%\",margin:0,padding:0,/*\n                     * Critical:\n                     * Keep the line itself aligned.\n                     */textAlign:resolvedTextAlign,/*\n                     * Prevent flex/block formatting\n                     * from changing the text position.\n                     */boxSizing:\"border-box\",/*\n                     * Keep line height controlled by\n                     * the Framer font settings.\n                     */lineHeight:fontStyle.lineHeight||DEFAULT_FONT.lineHeight},children:parts.map((part,partIdx)=>{/*\n                     * Preserve spaces.\n                     */if(/^\\s+$/.test(part)){return /*#__PURE__*/_jsx(\"span\",{style:{whiteSpace:\"pre\",display:\"inline\"},children:part},`sp-${lineIdx}-${partIdx}`);}return renderWord(part,`w-${lineIdx}-${partIdx}`);})},`line-${lineIdx}`);};return /*#__PURE__*/_jsx(\"div\",{ref:rootRef,style:{/*\n                 * Framer styles first.\n                 */...framerStyle,/*\n                 * Native Framer Font control.\n                 */...fontStyle,/*\n                 * Explicit text color.\n                 */color:parseToken(textColor)||fontStyle.color,/*\n                 * Force alignment at the root.\n                 */textAlign:resolvedTextAlign,/*\n                 * Important sizing.\n                 */width:\"100%\",maxWidth:\"100%\",/*\n                 * Remove browser defaults.\n                 */margin:0,padding:0,/*\n                 * Prevent any inline formatting\n                 * from creating unexpected offsets.\n                 */boxSizing:\"border-box\"},children:lines.map(renderLine)});}ScrollRevealText.defaultProps={text:\"We make brands look better,\\ncommunicate better,\\nand sell better online.\",splitMode:\"word\",animationStyle:\"mask\",triggerOnce:true,staggerMs:60,animDuration:800,startDelay:0,threshold:25,textColor:\"#0A0A0A\",textAlign:\"left\",font:DEFAULT_FONT};addPropertyControls(ScrollRevealText,{text:{type:ControlType.String,title:\"Text\",displayTextArea:true,defaultValue:\"We make brands look better,\\ncommunicate better,\\nand sell better online.\",description:\"Use line breaks for explicit new lines.\"},splitMode:{type:ControlType.Enum,title:\"Split\",options:[\"word\",\"letter\"],optionTitles:[\"By Word\",\"By Letter\"],defaultValue:\"word\",displaySegmentedControl:true,description:\"Letter mode is dramatic but heavier - use on short headlines.\"},animationStyle:{type:ControlType.Enum,title:\"Style\",options:[\"fade-up\",\"mask\",\"blur\",\"scale\"],optionTitles:[\"Fade Up\",\"Mask\",\"Blur\",\"Scale\"],defaultValue:\"mask\"},font:{// @ts-ignore\ntype:ControlType.Font,title:\"Text Style\",controls:\"extended\",displayFontSize:true,displayTextAlignment:true,defaultFontType:\"sans-serif\",defaultFontSize:\"48px\",defaultValue:DEFAULT_FONT},textColor:{type:ControlType.Color,title:\"Color\",defaultValue:\"#0A0A0A\"},triggerOnce:{type:ControlType.Boolean,title:\"Trigger\",defaultValue:true,enabledTitle:\"Once\",disabledTitle:\"Replay\",description:\"Replay on every viewport entry, or fire once.\"},threshold:{type:ControlType.Number,title:\"Trigger At\",min:0,max:100,step:5,defaultValue:25,unit:\"%\",description:\"% of element visible before the reveal fires.\"},staggerMs:{type:ControlType.Number,title:\"Stagger\",min:0,max:300,step:5,defaultValue:60,unit:\"ms\",description:\"Delay between each word/letter.\"},animDuration:{type:ControlType.Number,title:\"Duration\",min:200,max:2e3,step:50,defaultValue:800,unit:\"ms\"},startDelay:{type:ControlType.Number,title:\"Start Delay\",min:0,max:2e3,step:50,defaultValue:0,unit:\"ms\",description:\"Pause before the first token reveals.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ScrollRevealText\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Scroll.map"],"mappings":"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"}