{"version":3,"file":"PathReveal_Prod.BvFlO2qZ.mjs","names":["React","p"],"sources":["https:/framerusercontent.com/modules/WakSDJVmfsctE2krZwY5/Fc99pwz9Fatqm2WjBFCN/PathReveal_Prod.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import React,{useEffect,useLayoutEffect}from\"react\";import{motion,useTransform,useMotionValue}from\"framer-motion\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";// Helper function to clamp a number between 0 and 1\nconst clamp01=n=>Math.max(0,Math.min(1,n));/**\n * Extracts all path elements from SVG content and measures their precise lengths\n * This is crucial for accurate animation timing and sizing\n */const extractPathsFromSVG=svgContent=>{// Parse SVG content into DOM elements\nconst parser=new DOMParser;const svgDoc=parser.parseFromString(svgContent,\"image/svg+xml\");const pathElements=Array.from(svgDoc.querySelectorAll(\"path\"));// Extract the \"d\" attribute (path data) from each path element\nconst paths=pathElements.map(p=>p.getAttribute(\"d\")).filter(d=>!!d);// Measure each path's length and dimensions for accurate animation\nconst lengths=[];let longestPathLength=0;let maxPathWidth=0;let maxPathHeight=0;if(pathElements.length>0){// Create a temporary hidden SVG to measure path lengths\nconst tempSvg=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");tempSvg.style.position=\"absolute\";tempSvg.style.visibility=\"hidden\";document.body.appendChild(tempSvg);// Measure each individual path\npathElements.forEach(pathEl=>{const tempPath=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");tempPath.setAttribute(\"d\",pathEl.getAttribute(\"d\")||\"\");tempSvg.appendChild(tempPath);// Get the precise length of this path\nconst pathLength=tempPath.getTotalLength();lengths.push(pathLength);longestPathLength=Math.max(longestPathLength,pathLength);// Get the bounding box for sizing calculations\nconst boundingBox=tempPath.getBBox();maxPathWidth=Math.max(maxPathWidth,boundingBox.width);maxPathHeight=Math.max(maxPathHeight,boundingBox.height);});// Clean up temporary SVG\ndocument.body.removeChild(tempSvg);}// Return all extracted data for animation and sizing\nreturn{paths,lengths,longestPathLength,maxPathWidth,maxPathHeight};};// Default SVG icon (star) used when no SVG is provided by the user\nconst FALLBACK_SVG=`\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M12.4952 18.5868L16.5874 20.7373C16.7603 20.8282 16.9552 20.8688 17.15 20.8544C17.3448 20.84 17.5316 20.7713 17.6893 20.656C17.847 20.5408 17.9692 20.3836 18.042 20.2023C18.1148 20.0211 18.1352 19.823 18.1011 19.6307L17.3181 15.0792C17.289 14.9114 17.3013 14.739 17.3541 14.577C17.4069 14.4151 17.4984 14.2685 17.6209 14.1501L20.9301 10.9243C21.0709 10.7888 21.1707 10.6166 21.2184 10.4271C21.2661 10.2377 21.2597 10.0387 21.1999 9.8527C21.14 9.66672 21.0292 9.50127 20.8801 9.37514C20.7309 9.24902 20.5493 9.16728 20.356 9.13923L15.7836 8.48155C15.6163 8.45643 15.4577 8.39105 15.3213 8.29103C15.1849 8.19102 15.0749 8.05936 15.0006 7.90739L12.9128 3.73168C12.8273 3.55518 12.6938 3.40633 12.5276 3.30218C12.3615 3.19803 12.1693 3.14279 11.9732 3.14279C11.7771 3.14279 11.585 3.19803 11.4188 3.30218C11.2526 3.40633 11.1192 3.55518 11.0337 3.73168L8.94584 7.90739C8.87161 8.05936 8.76156 8.19102 8.62518 8.29103C8.48879 8.39105 8.33015 8.45643 8.16289 8.48155L3.65312 9.13923C3.45894 9.16566 3.27611 9.24622 3.12556 9.37169C2.97502 9.49716 2.86283 9.66248 2.80183 9.84872C2.74084 10.035 2.73351 10.2346 2.78067 10.4248C2.82783 10.6151 2.92759 10.7882 3.06853 10.9243L6.37778 14.1501C6.5002 14.2685 6.5918 14.4151 6.64457 14.577C6.69734 14.739 6.70968 14.9114 6.68052 15.0792L5.89757 19.6307C5.86341 19.823 5.88388 20.0211 5.95667 20.2023C6.02946 20.3836 6.15164 20.5408 6.30932 20.656C6.46701 20.7713 6.65387 20.84 6.84867 20.8544C7.04347 20.8688 7.23838 20.8282 7.41126 20.7373L11.5035 18.5868C11.6558 18.5045 11.8262 18.4615 11.9993 18.4615C12.1724 18.4615 12.3428 18.5045 12.4952 18.5868Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n</svg>\n`;/**\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n * @framerIntrinsicWidth 200\n * @framerIntrinsicHeight 200\n */export default function PathReveal(props){// Destructure all the props for easier access\nconst{svgFile,svgCode,inputType,beamColor,beamWidth,opacity,progress,start,length,startAlign}=props;// Reference to the SVG group containing all paths\nconst groupRef=React.useRef(null);// ===== STATE MANAGEMENT =====\n// Store the extracted SVG path data and their measured lengths\nconst[svgPaths,setSvgPaths]=React.useState([])// Array of path \"d\" attributes\n;const[pathLengths,setPathLengths]=React.useState([])// Array of measured path lengths\n;// ===== SCROLL PROGRESS TRACKING =====\n// MotionValue that tracks scroll progress (0 to 1) relative to this component's position\nconst sectionProgressMV=useMotionValue(0);// ===== ANIMATION CONFIGURATION =====\n// Extract opacity start/end values from the opacity object prop\nconst opacityStart=opacity&&typeof opacity.start===\"number\"?opacity.start:0;const opacityEnd=opacity&&typeof opacity.end===\"number\"?opacity.end:1;// Extract progress range [start, end] from the progress object prop\n// This allows users to control which portion of the scroll triggers the animation\nconst rangeStart=Math.max(0,Math.min(1,progress?.start??0));const rangeEnd=Math.max(0,Math.min(1,progress?.end??1));// Transform scroll progress to path drawing progress\n// This maps the scroll progress to the user-defined progress range\nconst pathDrawProgress=useTransform(sectionProgressMV,scrollProgress=>{// Linear interpolation: maps scroll progress to the defined progress range\nreturn rangeStart+(rangeEnd-rangeStart)*scrollProgress;});// ===== PROGRESS SYNCHRONIZATION =====\n// Keep a numeric snapshot of the current progress value for per-path calculations\n// This avoids having to call .get() on the MotionValue in the render loop\nconst[pathProgressValue,setPathProgressValue]=React.useState(()=>{const initial=pathDrawProgress?.get?.();return typeof initial===\"number\"?initial:rangeStart;});// Sync the local progress state with the MotionValue changes\nuseEffect(()=>{// Get current value immediately when the range changes\nconst current=pathDrawProgress?.get?.();if(typeof current===\"number\")setPathProgressValue(current);// Subscribe to future changes\nconst unsub=pathDrawProgress.onChange(v=>setPathProgressValue(v));return()=>unsub&&unsub();},[pathDrawProgress,rangeStart,rangeEnd]);// ===== REFS AND ADDITIONAL STATE =====\n// SVG element references for DOM manipulation and measurements\nconst svgRef=React.useRef(null)// Main SVG container\n;const containerRef=React.useRef(null)// Outer container for positioning\n;const startPositionRef=React.useRef(0)// Cached start position for scroll calculations\n;const zoomProbeRef=React.useRef(null)// Hidden element to detect editor zoom\n;// Dynamic values that update based on SVG content and zoom level\nconst[viewBox,setViewBox]=React.useState(undefined)// SVG viewBox for proper scaling\n;const[computedStrokeWidth,setComputedStrokeWidth]=React.useState(beamWidth)// Stroke width adjusted for zoom\n;const[maxPathWidth,setMaxPathWidth]=React.useState(0)// Widest path for container sizing\n;const[maxPathHeight,setMaxPathHeight]=React.useState(0)// Tallest path for container sizing\n;// ===== SVG LOADING AND PROCESSING =====\n// Load and process SVG content (either from file or code)\nReact.useEffect(()=>{let cancelled=false;// Helper function to safely update state if component is still mounted\nconst setPathsAndLength=(paths,lengths,_longest)=>{if(!cancelled){setSvgPaths(paths);setPathLengths(lengths);}};// Load SVG based on input type\nif(inputType===\"file\"&&svgFile){// Fetch SVG from URL\nfetch(svgFile).then(response=>response.text()).then(svgContent=>{const result=extractPathsFromSVG(svgContent);setPathsAndLength(result.paths,result.lengths,result.longestPathLength);}).catch(()=>setPathsAndLength([],[],0));}else if(inputType===\"code\"&&svgCode){// Use provided SVG code string\nconst result=extractPathsFromSVG(svgCode);setPathsAndLength(result.paths,result.lengths,result.longestPathLength);}else{// Use fallback SVG when nothing is provided\nconst result=extractPathsFromSVG(FALLBACK_SVG);setPathsAndLength(result.paths,result.lengths,result.longestPathLength);}return()=>{cancelled=true// Prevent state updates after unmount\n;};},[inputType,svgFile,svgCode]);// Both path drawing and opacity are tied to the same drawProgress\n// ===== SCROLL POSITION CALCULATION =====\n// Find any sticky parent elements that might affect positioning calculations\nconst findStickyParent=React.useCallback(el=>{let current=el;while(current&&current!==document.body){const pos=window.getComputedStyle(current).position;if(pos===\"sticky\")return current;current=current.parentElement;}return null;},[]);// Get the absolute top position of an element, accounting for sticky positioning\nconst getOriginalPosition=React.useCallback(element=>{const sticky=findStickyParent(element);const target=sticky||element;const originalPosition=target.style.position;// Temporarily remove sticky positioning to get true position\ntarget.style.position=\"static\";const rect=target.getBoundingClientRect();const scrollTop=window.pageYOffset||document.documentElement.scrollTop;const top=rect.top+scrollTop;// Restore original positioning\ntarget.style.position=originalPosition;return top;},[findStickyParent]);// ===== SCROLL EVENT HANDLING =====\n// Main effect that handles scroll events and updates progress\nuseEffect(()=>{// Calculate and cache the starting position of this component\nconst computeStart=()=>{if(!containerRef.current)return;startPositionRef.current=getOriginalPosition(containerRef.current);};// Update progress based on current scroll position\nconst updateProgress=()=>{const scrollY=window.scrollY||window.pageYOffset||0;const startPx=typeof start===\"number\"?start:0;const lenPx=Math.max(1,typeof length===\"number\"?length:1);const vh=window.innerHeight||0;// Calculate where the animation should start relative to viewport\nconst linePx=startAlign===\"center\"?vh/2:startAlign===\"bottom\"?vh:0;// Calculate the scroll position where animation should begin\nconst startScrollY=startPositionRef.current-linePx+startPx;// Calculate progress (0 to 1) based on scroll position\nconst p=clamp01((scrollY-startScrollY)/lenPx);sectionProgressMV.set(p);};// Initialize and set up event listeners\ncomputeStart();updateProgress();// Throttle scroll events to improve performance\nconst onScroll=()=>requestAnimationFrame(updateProgress);const onResize=()=>{computeStart();updateProgress();};window.addEventListener(\"scroll\",onScroll,{passive:true});window.addEventListener(\"resize\",onResize);return()=>{window.removeEventListener(\"scroll\",onScroll);window.removeEventListener(\"resize\",onResize);};},[start,length,startAlign,getOriginalPosition,sectionProgressMV]);// ===== VIEWBOX CALCULATION =====\n// Calculate the optimal viewBox for the SVG based on actual path geometry\nuseLayoutEffect(()=>{if(!svgPaths||svgPaths.length===0||!groupRef.current)return;// Get the bounding box of all paths combined\nconst bbox=groupRef.current.getBBox();if(bbox&&bbox.width>0&&bbox.height>0){// Add padding around paths to account for stroke width\nconst strokePadding=Math.max(0,(computedStrokeWidth||beamWidth)/2);setViewBox(`${bbox.x-strokePadding} ${bbox.y-strokePadding} ${bbox.width+strokePadding*2} ${bbox.height+strokePadding*2}`);}else{// Fallback viewBox if no valid paths\nsetViewBox(\"0 0 100 100\");}},[svgPaths,computedStrokeWidth,beamWidth]);// ===== PATH DIMENSIONS CALCULATION =====\n// Calculate the maximum width and height of individual paths for container sizing\nuseLayoutEffect(()=>{if(!svgPaths||svgPaths.length===0||!groupRef.current)return;// Get all rendered path elements\nconst paths=Array.from(groupRef.current.querySelectorAll(\"path\"));if(paths.length===0)return;// Find the widest and tallest individual path\nlet widest=0;let tallest=0;for(const path of paths){const boundingBox=path.getBBox();widest=Math.max(widest,boundingBox.width);tallest=Math.max(tallest,boundingBox.height);}// Add stroke width padding to ensure paths aren't clipped\nconst strokePadding=Math.max(0,(computedStrokeWidth||beamWidth)/2);setMaxPathWidth(Math.ceil(widest+strokePadding*2));setMaxPathHeight(Math.ceil(tallest+strokePadding*2));},[svgPaths,computedStrokeWidth,beamWidth]);// ===== STROKE WIDTH CALCULATION =====\n// Calculate stroke width accounting for canvas zoom and SVG scaling\nuseEffect(()=>{const compute=()=>{const containerEl=containerRef.current;const svgEl=svgRef.current;if(!containerEl||!svgEl){setComputedStrokeWidth(beamWidth);return;}// Detect editor zoom using a hidden 20x20 probe element\nconst probe=zoomProbeRef.current;const editorZoom=probe?probe.getBoundingClientRect().width/20:1;// Get current SVG dimensions\nconst rect=svgEl.getBoundingClientRect();const parts=(viewBox||\"0 0 100 100\").split(\" \").map(Number);const vbWidth=parts[2]||100;const vbHeight=parts[3]||100;// Calculate the actual scale factor of the SVG\nconst safeZoom=Math.max(editorZoom,1e-4);// Remove editor zoom from the measured size so scale matches preview/live\nconst scaleX=rect.width/safeZoom/vbWidth;const scaleY=rect.height/safeZoom/vbHeight;const scale=Math.min(scaleX,scaleY)||1;// Adjust stroke width based on scale\nconst adjustedStrokeWidth=beamWidth/scale;setComputedStrokeWidth(prev=>Math.abs(prev-adjustedStrokeWidth)>.05?adjustedStrokeWidth:prev);};// Different behavior for canvas (editor) vs preview/live\nif(RenderTarget.current()===RenderTarget.canvas){// In canvas: continuously monitor for zoom and size changes\nlet rafId=0;const last={ts:0,zoom:0,w:0,h:0};const TICK_MS=250// throttle to 4Hz to avoid unnecessary work\n;const EPS_ZOOM=.001;const EPS_SIZE=.5;const tick=now=>{const probe=zoomProbeRef.current;const svgEl=svgRef.current;if(probe&&svgEl){const currentZoom=probe.getBoundingClientRect().width/20;const r=svgEl.getBoundingClientRect();// Only update if enough time has passed and something meaningful changed\nconst timeOk=!last.ts||(now||performance.now())-last.ts>=TICK_MS;const zoomChanged=Math.abs(currentZoom-last.zoom)>EPS_ZOOM;const sizeChanged=Math.abs(r.width-last.w)>EPS_SIZE||Math.abs(r.height-last.h)>EPS_SIZE;if(timeOk&&(zoomChanged||sizeChanged)){last.ts=now||performance.now();last.zoom=currentZoom;last.w=r.width;last.h=r.height;compute();}}rafId=requestAnimationFrame(tick);};rafId=requestAnimationFrame(tick);return()=>cancelAnimationFrame(rafId);}// Preview/Live: only respond to real size changes, not every animation frame\ncompute();const ro=new ResizeObserver(()=>compute());if(containerRef.current)ro.observe(containerRef.current);window.addEventListener(\"resize\",compute);return()=>{ro.disconnect();window.removeEventListener(\"resize\",compute);};},[beamWidth,viewBox]);// ===== RENDER =====\nreturn /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{position:\"relative\",width:\"100%\",height:\"100%\",display:\"flex\",minWidth:maxPathWidth||undefined,minHeight:maxPathHeight||undefined},children:/*#__PURE__*/_jsxs(\"div\",{style:{position:\"absolute\",inset:0},children:[/*#__PURE__*/_jsx(\"div\",{ref:zoomProbeRef,style:{position:\"absolute\",width:20,height:20,opacity:0,pointerEvents:\"none\"}}),/*#__PURE__*/_jsx(\"svg\",{ref:svgRef,width:\"100%\",height:\"100%\",viewBox:viewBox,preserveAspectRatio:\"xMidYMid meet\",overflow:\"visible\",children:/*#__PURE__*/_jsx(\"g\",{ref:groupRef,children:svgPaths.map((pathData,pathIndex)=>{const pathLength=pathLengths[pathIndex]??0;const dasharray=pathLength>0?`${pathLength}`:\"1\";const isCanvas=RenderTarget.hasRestrictions();const effectiveProgress=isCanvas?1:pathProgressValue;// All paths use the same progress value - they start and finish at the same scroll positions\n// This ensures synchronized animation regardless of individual path lengths\nconst dashoffset=pathLength>0?(1-effectiveProgress)*pathLength:0;// Calculate opacity based on progress (fade in/out effect)\nconst opacityValue=isCanvas?1:opacityStart+(opacityEnd-opacityStart)*effectiveProgress;return /*#__PURE__*/_jsx(motion.path,{d:pathData,stroke:beamColor,strokeWidth:computedStrokeWidth,strokeLinecap:\"round\",strokeLinejoin:\"round\",strokeOpacity:opacityValue,fill:\"none\",strokeDasharray:dasharray,strokeDashoffset:dashoffset},pathIndex);})})})]})});}// ===== DEFAULT PROPS =====\nPathReveal.defaultProps={svgFile:\"\",svgCode:\"\",inputType:\"file\",beamColor:\"#fc5025\",beamWidth:3,opacity:{start:0,end:1},progress:{start:0,end:1},start:0,length:1e3,startAlign:\"top\"};// ===== PROPERTY CONTROLS =====\naddPropertyControls(PathReveal,{// Input source configuration\ninputType:{type:ControlType.Enum,title:\"Type\",options:[\"file\",\"code\"],optionTitles:[\"File\",\"Code\"],displaySegmentedControl:true,defaultValue:\"file\"},// SVG source controls (file or code)\nsvgFile:{type:ControlType.File,title:\"SVG File\",allowedFileTypes:[\"svg\"],hidden:props=>props.inputType!==\"file\"},svgCode:{type:ControlType.String,title:\" \",displayTextArea:true,hidden:props=>props.inputType!==\"code\"},// Visual styling controls\nbeamColor:{type:ControlType.Color,title:\"Beam Color\"},beamWidth:{type:ControlType.Number,title:\"Beam Width\",min:1,max:50,step:1},// Animation trigger positioning\nstartAlign:{type:ControlType.Enum,title:\"Start At\",options:[\"top\",\"center\",\"bottom\"],optionTitles:[\"Top\",\"Center\",\"Bottom\"],displaySegmentedControl:true,segmentedControlDirection:\"horizontal\",defaultValue:\"top\"},// Scroll mapping controls - animation is driven by absolute pixel positions\nlength:{type:ControlType.Number,title:\"Distance\",min:1,max:2e5,step:50},start:{type:ControlType.Number,title:\"Offset\",min:-1e5,max:1e5,step:10},// Progress range controls - maps scroll progress to animation progress\nprogress:{type:ControlType.Object,title:\"Progress\",controls:{start:{type:ControlType.Number,title:\"Start\",min:0,max:1,step:.01,defaultValue:0},end:{type:ControlType.Number,title:\"End\",min:0,max:1,step:.01,defaultValue:1}}},// Opacity controls - fade in/out effect during animation\nopacity:{type:ControlType.Object,title:\"Opacity\",controls:{start:{type:ControlType.Number,title:\"Start\",min:0,max:1,step:.01,defaultValue:0},end:{type:ControlType.Number,title:\"End\",min:0,max:1,step:.01,defaultValue:1}},description:\"More components at [Framer University](https://frameruni.link/cc).\"}});// Component display name for Framer's component panel\nPathReveal.displayName=\"Scroll Path Reveal\";\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"PathReveal\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"fixed\",\"framerIntrinsicHeight\":\"200\",\"framerIntrinsicWidth\":\"200\",\"framerSupportedLayoutWidth\":\"fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./PathReveal_Prod.map"],"mappings":"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"}