{"version":3,"file":"Typewriter.DCyFhXJT.mjs","names":["useState","useRef","useMemo","_Fragment"],"sources":["https:/framerusercontent.com/modules/BImBBepmbIjs4G88iLD0/jYbRnr5IB3mPZGWQkTuc/Typewriter.js"],"sourcesContent":["// Typewriter effect component that works with formatted text blocks\n// Supports letter-by-letter or word-by-word animation\n// Preserves HTML formatting and styling including multiple colors\n// Use a ComponentInstance control to link to a Framer text component and extract its content\nimport{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{useEffect,useState,useRef,useMemo}from\"react\";import{addPropertyControls,ControlType}from\"framer\";/**\n * Typewriter Effect\n *\n * @framerIntrinsicWidth 400\n * @framerIntrinsicHeight 100\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n */export default function Typewriter(props){const{textComponent,speed=50,mode=\"letter\",autoStart=true,loop=false,cursor=true,cursorColor=\"#000000\",fadeEffect=false,fadeDuration=300,style}=props;const[displayedChars,setDisplayedChars]=useState(0);const[isComplete,setIsComplete]=useState(false);const[showCursor,setShowCursor]=useState(true);const indexRef=useRef(0);const timeoutRef=useRef(null);const containerRef=useRef(null);const hiddenRef=useRef(null);const mountedRef=useRef(false);// Force re-extraction after hidden component renders\nuseEffect(()=>{if(textComponent){mountedRef.current=true;}},[textComponent]);// Extract HTML content and styles from the linked component\nconst{extractedHTML,containerStyles}=useMemo(()=>{if(typeof window===\"undefined\"||!hiddenRef.current||!mountedRef.current){return{extractedHTML:\"\",containerStyles:{}};}// Get the first child element (the actual text component)\nconst textElement=hiddenRef.current.firstElementChild;if(!textElement)return{extractedHTML:\"\",containerStyles:{}};// Get computed styles from the original component\nconst computed=window.getComputedStyle(textElement);const containerStyles={color:computed.color,fontSize:computed.fontSize,fontFamily:computed.fontFamily,fontWeight:computed.fontWeight,fontStyle:computed.fontStyle,letterSpacing:computed.letterSpacing,lineHeight:computed.lineHeight,textAlign:computed.textAlign,textDecoration:computed.textDecoration,textTransform:computed.textTransform,fontVariant:computed.fontVariant};const content=textElement.innerHTML;return{extractedHTML:content,containerStyles};},[textComponent,mountedRef.current]);// Parse HTML and extract text nodes with their formatting\nconst textNodes=useMemo(()=>{if(typeof window===\"undefined\"||!extractedHTML||!hiddenRef.current)return[];const nodes=[];// Get the actual rendered element to extract computed styles\nconst renderedElement=hiddenRef.current.firstElementChild;if(!renderedElement)return[];// Cache computed styles to avoid repeated getComputedStyle calls\nconst styleCache=new Map;const getElementStyles=element=>{if(styleCache.has(element)){return styleCache.get(element);}const computed=window.getComputedStyle(element);const styles={color:computed.color,fontSize:computed.fontSize,fontFamily:computed.fontFamily,fontWeight:computed.fontWeight,fontStyle:computed.fontStyle,letterSpacing:computed.letterSpacing,lineHeight:computed.lineHeight,textDecoration:computed.textDecoration,textTransform:computed.textTransform};styleCache.set(element,styles);return styles;};const traverse=(domElement,inheritedStyles={})=>{if(domElement.nodeType===Node.TEXT_NODE){const textContent=domElement.textContent||\"\";if(textContent){nodes.push({text:textContent,styles:{...inheritedStyles}});}}else if(domElement.nodeType===Node.ELEMENT_NODE){const element=domElement;// Handle BR elements as line breaks\nif(element.tagName===\"BR\"){nodes.push({text:\"\\n\",styles:{...inheritedStyles}});return;}// Handle block-level elements that should create line breaks\nconst isBlockElement=[\"DIV\",\"P\",\"H1\",\"H2\",\"H3\",\"H4\",\"H5\",\"H6\"].includes(element.tagName);const currentStyles={...inheritedStyles,...getElementStyles(element)};// Add line break before block element (except for the first one)\nif(isBlockElement&&nodes.length>0){nodes.push({text:\"\\n\",styles:currentStyles});}Array.from(domElement.childNodes).forEach(child=>{traverse(child,currentStyles);});}};traverse(renderedElement,{});return nodes;},[extractedHTML,textComponent]);// Build character/word array with formatting info\nconst units=useMemo(()=>{const result=[];textNodes.forEach(node=>{const chars=mode===\"letter\"?node.text.split(\"\"):node.text.split(\" \");chars.forEach((char,idx)=>{const unit=mode===\"word\"&&idx>0?\" \"+char:char;result.push({char:unit,styles:node.styles});});});return result;},[textNodes,mode]);useEffect(()=>{if(!autoStart)return;const animate=()=>{if(indexRef.current<units.length){setDisplayedChars(indexRef.current+1);indexRef.current++;timeoutRef.current=window.setTimeout(animate,speed);}else{setIsComplete(true);if(loop){timeoutRef.current=window.setTimeout(()=>{indexRef.current=0;setDisplayedChars(0);setIsComplete(false);// Restart animation after reset\ntimeoutRef.current=window.setTimeout(animate,speed);},1e3);}}};indexRef.current=0;setDisplayedChars(0);setIsComplete(false);timeoutRef.current=window.setTimeout(animate,speed);return()=>{if(timeoutRef.current!==null){clearTimeout(timeoutRef.current);}};},[speed,autoStart,loop,units,textComponent]);// Cursor blink effect\nuseEffect(()=>{if(!cursor)return;const interval=setInterval(()=>{setShowCursor(prev=>!prev);},530);return()=>clearInterval(interval);},[cursor]);const isFixedWidth=style?.width===\"100%\";return /*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"div\",{ref:hiddenRef,style:{position:\"fixed\",visibility:\"hidden\",opacity:0,pointerEvents:\"none\",top:-9999,left:-9999},children:textComponent}),/*#__PURE__*/_jsxs(\"div\",{ref:containerRef,style:{...style,...containerStyles,position:\"relative\",overflow:\"visible\",minHeight:\"1em\",display:\"flex\",alignItems:\"flex-start\",...isFixedWidth?{}:{width:\"max-content\"}},children:[fadeEffect&&/*#__PURE__*/_jsx(\"style\",{children:`\n                            @keyframes fadeIn {\n                                from {\n                                    opacity: 0;\n                                }\n                                to {\n                                    opacity: 1;\n                                }\n                            }\n                        `}),/*#__PURE__*/_jsxs(\"span\",{style:{whiteSpace:\"pre-wrap\",wordBreak:\"break-word\"},children:[units.slice(0,displayedChars).map((unit,idx)=>/*#__PURE__*/_jsx(\"span\",{style:{...unit.styles,...fadeEffect&&{animation:`fadeIn ${fadeDuration}ms ease-in`}},children:unit.char},idx)),cursor&&!isComplete&&/*#__PURE__*/_jsx(\"span\",{style:{color:cursorColor,opacity:showCursor?1:0,transition:\"opacity 0.1s\"},children:\"|\"})]})]})]});}addPropertyControls(Typewriter,{textComponent:{type:ControlType.ComponentInstance,title:\"Text Component\"},mode:{type:ControlType.Enum,title:\"Mode\",options:[\"letter\",\"word\"],optionTitles:[\"Letter\",\"Word\"],defaultValue:\"letter\",displaySegmentedControl:true},speed:{type:ControlType.Number,title:\"Speed\",defaultValue:50,min:10,max:500,step:10,unit:\"ms\"},autoStart:{type:ControlType.Boolean,title:\"Auto Start\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},loop:{type:ControlType.Boolean,title:\"Loop\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},cursor:{type:ControlType.Boolean,title:\"Show Cursor\",defaultValue:true,enabledTitle:\"Show\",disabledTitle:\"Hide\"},cursorColor:{type:ControlType.Color,title:\"Cursor Color\",defaultValue:\"#000000\",hidden:({cursor})=>!cursor},fadeEffect:{type:ControlType.Boolean,title:\"Fade Effect\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},fadeDuration:{type:ControlType.Number,title:\"Fade Duration\",defaultValue:300,min:50,max:1e3,step:50,unit:\"ms\",hidden:({fadeEffect})=>!fadeEffect}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"Typewriter\",\"slots\":[\"textComponent\"],\"annotations\":{\"framerIntrinsicWidth\":\"400\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerIntrinsicHeight\":\"100\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Typewriter.map"],"mappings":"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"}