{
  "version": 3,
  "sources": ["ssg:https://framerusercontent.com/modules/J9DP3iOHGtvMqCJ3YHCR/0ScQxz6JTUfs3rQcMnY9/TextHighlighter.js"],
  "sourcesContent": ["// Text Highlighter: Highlights text when in view, with customizable colors, rounded corners, and alignment\nimport{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{useRef,useState,useEffect,startTransition}from\"react\";import{addPropertyControls,ControlType,useInView,useIsStaticRenderer}from\"framer\";/**\n * Text Highlighter\n *\n * @framerIntrinsicWidth 400\n * @framerIntrinsicHeight 60\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n */export default function TextHighlighter(props){const{text,highlightColor,textColor,borderRadius,font,alignment=\"left\",highlights=[{start:0,end:5}],links=[],style}=props;const ref=useRef(null);const isStatic=useIsStaticRenderer();const inView=useInView(ref,{amount:.5,once:false});const[highlighted,setHighlighted]=useState(false);const[hasPlayed,setHasPlayed]=useState(false);const{animationDuration=.7}=props;useEffect(()=>{if(isStatic){startTransition(()=>setHighlighted(true));return;}let timeout;if(props.animationMode===\"once\"){if(inView&&!hasPlayed){startTransition(()=>setHighlighted(true));setHasPlayed(true);}}else{if(inView){startTransition(()=>setHighlighted(true));}else{startTransition(()=>setHighlighted(false));}}return()=>{if(timeout)window.clearTimeout(timeout);};},[inView,isStatic,props.animationMode,hasPlayed]);// Merge and sort highlight ranges, clamp to text length\nconst textLength=text.length;const safeHighlights=Array.isArray(highlights)?highlights.map(({start,end,delay})=>({start:Math.max(0,Math.min(start,textLength)),end:Math.max(0,Math.min(end,textLength)),delay:typeof delay===\"number\"?delay:0})).filter(({start,end})=>end>start).sort((a,b)=>a.start-b.start):[];// Merge overlapping/adjacent ranges, keep the lower delay for merged\nconst merged=[];for(const range of safeHighlights){if(!merged.length)merged.push(range);else{const last=merged[merged.length-1];if(range.start<=last.end){last.end=Math.max(last.end,range.end);last.delay=Math.min(last.delay,range.delay);}else{merged.push(range);}}}// Prepare link ranges (clamped and sorted)\nconst safeLinks=Array.isArray(links)?links.map(({start,end,url,cursor,newTab})=>({start:Math.max(0,Math.min(start,textLength)),end:Math.max(0,Math.min(end,textLength)),url:url||\"#\",cursor:cursor||undefined,newTab:!!newTab})).filter(({start,end,url})=>end>start&&typeof url===\"string\"&&url.length>0).sort((a,b)=>a.start-b.start):[];const events=[...merged.map(h=>({type:\"highlight\",start:h.start,end:h.end,delay:h.delay})),...safeLinks.map(l=>({type:\"link\",start:l.start,end:l.end,url:l.url,cursor:l.cursor,newTab:l.newTab}))];// Sort by start, then by end descending (so longer ranges wrap shorter)\nevents.sort((a,b)=>a.start-b.start||b.end-a.end);const segments=[];let pos=0;while(pos<textLength){// Find all events that cover this position\nconst covering=events.filter(e=>e.start<=pos&&e.end>pos);// Find the next event boundary\nlet next=textLength;for(const e of events){if(e.start>pos&&e.start<next)next=e.start;if(e.end>pos&&e.end<next)next=e.end;}if(next===pos)next=pos+1// fallback\n;// Determine highlight and link\nconst highlight=covering.find(e=>e.type===\"highlight\");const link=covering.find(e=>e.type===\"link\");segments.push({text:text.slice(pos,next),isHighlight:!!highlight,delay:highlight?.delay,isLink:!!link,url:link?.url,cursor:link?.cursor,newTab:link?.newTab});pos=next;}// Merge adjacent segments with same highlight/link\nconst mergedSegments=[];for(const seg of segments){const last=mergedSegments[mergedSegments.length-1];if(last&&last.isHighlight===seg.isHighlight&&last.isLink===seg.isLink&&last.url===seg.url&&last.delay===seg.delay){last.text+=seg.text;}else{mergedSegments.push({...seg});}}return /*#__PURE__*/_jsx(\"div\",{ref:ref,style:{...style,position:\"relative\",display:\"inline-block\",width:\"100%\",height:\"100%\",minHeight:40,minWidth:80,overflow:\"visible\"},children:/*#__PURE__*/_jsx(\"span\",{style:{position:\"relative\",zIndex:2,color:textColor,...font,textAlign:alignment,width:\"100%\",display:\"block\",transition:\"color 0.3s cubic-bezier(.4,0,.2,1)\"},children:mergedSegments.map((seg,i)=>{let content=seg.text;if(seg.isHighlight){content=/*#__PURE__*/_jsxs(\"span\",{style:{position:\"relative\",display:\"inline-block\",verticalAlign:\"baseline\",padding:\"0.05em 0.2em\",borderRadius,zIndex:2,color:textColor,overflow:\"visible\"},children:[/*#__PURE__*/_jsx(\"span\",{style:{position:\"absolute\",left:0,top:\"50%\",width:\"100%\",height:\"90%\",borderRadius,background:highlightColor,zIndex:1,transformOrigin:\"left center\",transform:highlighted?\"scaleX(1) translateY(-50%)\":\"scaleX(0) translateY(-50%)\",transition:`transform ${animationDuration}s cubic-bezier(.4,0,.2,1)`,transitionDelay:highlighted?`${typeof seg.delay===\"number\"?seg.delay:0}s`:\"0s\",pointerEvents:\"none\"},\"aria-hidden\":\"true\"}),/*#__PURE__*/_jsx(\"span\",{style:{position:\"relative\",zIndex:2,display:\"inline\"},children:seg.text})]});}if(seg.isLink){content=/*#__PURE__*/_jsx(\"a\",{href:seg.url,target:seg.newTab?\"_blank\":undefined,rel:seg.newTab?\"noopener noreferrer\":undefined,style:{color:props.linkColor||textColor,textDecoration:\"underline\",position:\"relative\",zIndex:3,cursor:seg.cursor||\"pointer\"},children:content});}return /*#__PURE__*/_jsx(\"span\",{children:content},i);})})});}addPropertyControls(TextHighlighter,{text:{type:ControlType.String,title:\"Text\",defaultValue:\"Highlight me on scroll!\",displayTextArea:true},highlightColor:{type:ControlType.Color,title:\"Highlight\",defaultValue:\"#FFF59D\"},textColor:{type:ControlType.Color,title:\"Text Color\",defaultValue:\"#000000\"},linkColor:{type:ControlType.Color,title:\"Link Color\",defaultValue:\"#1976D2\"},borderRadius:{type:ControlType.Number,title:\"Radius\",defaultValue:8,min:0,max:32},font:{type:ControlType.Font,title:\"Font\",controls:\"extended\",defaultFontType:\"sans-serif\",defaultValue:{fontSize:\"32px\",variant:\"Semibold\",letterSpacing:\"-0.01em\",lineHeight:\"1.2em\"}},alignment:{type:ControlType.Enum,title:\"Alignment\",options:[\"left\",\"center\",\"right\"],optionTitles:[\"Left\",\"Center\",\"Right\"],defaultValue:\"left\",displaySegmentedControl:true},animationMode:{type:ControlType.Enum,title:\"Animation\",options:[\"once\",\"every\"],optionTitles:[\"Once\",\"Every time in view\"],defaultValue:\"once\",displaySegmentedControl:true},animationDuration:{type:ControlType.Number,title:\"Duration (s)\",defaultValue:.7,min:.1,max:3,step:.05,displayStepper:true},highlights:{type:ControlType.Array,title:\"Highlights\",control:{type:ControlType.Object,controls:{start:{type:ControlType.Number,title:\"Start\",defaultValue:0,min:0,displayStepper:true},end:{type:ControlType.Number,title:\"End\",defaultValue:5,min:0,displayStepper:true},delay:{type:ControlType.Number,title:\"Delay (s)\",defaultValue:0,min:0,max:5,step:.05,displayStepper:true}}},defaultValue:[{start:0,end:5,delay:0}],maxCount:8},links:{type:ControlType.Array,title:\"Links\",control:{type:ControlType.Object,controls:{start:{type:ControlType.Number,title:\"Start\",defaultValue:0,min:0,displayStepper:true},end:{type:ControlType.Number,title:\"End\",defaultValue:5,min:0,displayStepper:true},url:{type:ControlType.String,title:\"URL\",defaultValue:\"https://framer.com\"},cursor:{type:ControlType.Enum,title:\"Cursor\",options:[\"pointer\",\"default\",\"text\",\"crosshair\",\"help\",\"not-allowed\",\"alias\",\"e-resize\"],optionTitles:[\"Pointer\",\"Default\",\"Text\",\"Crosshair\",\"Help\",\"Not Allowed\",\"Alias\",\"E-Resize\"],defaultValue:\"pointer\"},newTab:{type:ControlType.Boolean,title:\"Open in New Tab\",defaultValue:true,enabledTitle:\"Yes\",disabledTitle:\"No\"}}},defaultValue:[],maxCount:8}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"TextHighlighter\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerContractVersion\":\"1\",\"framerIntrinsicHeight\":\"60\",\"framerIntrinsicWidth\":\"400\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./TextHighlighter.map"],
  "mappings": "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",
  "names": ["init_ssg_sandbox_shims", "TextHighlighter", "props", "text", "highlightColor", "textColor", "borderRadius", "font", "alignment", "highlights", "links", "style", "ref", "pe", "isStatic", "useIsStaticRenderer", "inView", "useInView", "highlighted", "setHighlighted", "ye", "hasPlayed", "setHasPlayed", "animationDuration", "ue", "Z", "timeout", "textLength", "safeHighlights", "start", "end", "delay", "a", "b", "merged", "range", "last", "safeLinks", "url", "cursor", "newTab", "events", "h", "l", "segments", "pos", "covering", "e", "next", "highlight", "link", "mergedSegments", "seg", "p", "i", "content", "u", "addPropertyControls", "ControlType"]
}
