{"version":3,"file":"Video.BmbNLgQE.mjs","names":["useRef","useCallback","animate","useRef","useMemo","useCallback"],"sources":["https:/framer.com/m/framer/useAutoMotionValue.js@^0.3.0","https:/framerusercontent.com/modules/lRDHiNWNVWmE0lqtoVHP/0jtlswBvrookcx7EpjBD/Video.js"],"sourcesContent":["import{useCallback,useEffect,useRef}from\"react\";import{motionValue,animate,RenderTarget}from\"framer\";import{isMotionValue}from\"https://framerusercontent.com/modules/3mKFSGQqKHV82uOV1eBc/TbXI1XaZFNevVKcgIt7G/isMotionValue.js\";import{useConstant}from\"https://framerusercontent.com/modules/ExNgrA7EJTKUPpH6vIlN/eiOrSJ2Ab5M9jPCvVwUz/useConstant.js\";export function useAutoMotionValue(inputValue,options){// Put options on a local ref\n// Might wanna just memo instead but it works for now\nconst optionsRef=useRef(options);const animation=useRef();const didInitialMount=useRef(false);const isOnCanvas=RenderTarget.current()===RenderTarget.canvas;// in-progress - trying to figure out effect hooks\nconst onChangeDeps=(options===null||options===void 0?void 0:options.onChangeDeps)?options.onChangeDeps:[];// Memoize the onChange handler\nconst onChange=useCallback(options===null||options===void 0?void 0:options.onChange,[...onChangeDeps,]);// Optionally scale the value from props\nconst transformer=useCallback(value=>{var ref;return((ref=optionsRef.current)===null||ref===void 0?void 0:ref.transform)?optionsRef.current.transform(value):value;},[]);// Create new MotionValue from inputValue\nconst value1=useConstant(()=>isMotionValue(inputValue)?inputValue:motionValue(transformer(inputValue)));// Setting value from prop change\nuseEffect(()=>{if(!isMotionValue(inputValue)&&didInitialMount.current){var ref,ref1;const newValue=transformer(inputValue);(ref=animation.current)===null||ref===void 0?void 0:ref.stop();// Call change callback\nif(onChange)onChange(newValue,value1);// Trigger animation to new value\nif(((ref1=optionsRef.current)===null||ref1===void 0?void 0:ref1.animate)&&!isOnCanvas){var ref2;// @ts-ignore\nanimation.current=animate(value1,newValue,(ref2=optionsRef.current)===null||ref2===void 0?void 0:ref2.transition);}else{value1.set(newValue);}}didInitialMount.current=true;},[inputValue,...onChangeDeps]);return value1;}\nexport const __FramerMetadata__ = {\"exports\":{\"useAutoMotionValue\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./useAutoMotionValue.map","import{jsx as _jsx}from\"react/jsx-runtime\";import{useMotionValueEvent}from\"framer-motion\";import{useRef,useEffect,useMemo,useCallback,memo}from\"react\";import{ControlType,addPropertyControls,useIsInCurrentNavigationTarget}from\"framer\";import{useOnEnter,useOnExit,defaultEvents,useIsOnCanvas,useIsBrowserSafari,useRadius,borderRadiusControl}from\"https://framer.com/m/framer/default-utils.js@^0.45.0\";import{useAutoMotionValue}from\"https://framer.com/m/framer/useAutoMotionValue.js@^0.3.0\";var ObjectFitType;(function(ObjectFitType){ObjectFitType[\"Fill\"]=\"fill\";ObjectFitType[\"Contain\"]=\"contain\";ObjectFitType[\"Cover\"]=\"cover\";ObjectFitType[\"None\"]=\"none\";ObjectFitType[\"ScaleDown\"]=\"scale-down\";})(ObjectFitType||(ObjectFitType={}));var SrcType;(function(SrcType){SrcType[\"Video\"]=\"Upload\";SrcType[\"Url\"]=\"URL\";})(SrcType||(SrcType={}));// Reduce renders\nfunction getProps(props){const{width,height,topLeft,topRight,bottomRight,bottomLeft,id,children,...rest}=props;return rest;}/**\n * VIDEO\n *\n * @framerIntrinsicWidth 200\n * @framerIntrinsicHeight 112\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n */ export function Video(props){const newProps=getProps(props);return /*#__PURE__*/ _jsx(VideoMemo,{...newProps});}/**\n * For the useEffect hook to change progress of the video on state change.\n * It was causing the video to restart on hydration\n */ let isMountedAndReadyForProgressChanges=false;const VideoMemo=/*#__PURE__*/ memo(function VideoInner(props){const{srcType,srcFile,srcUrl,playing,canvasPlay,muted,playsinline,controls,progress,objectFit,backgroundColor,radius,topLeft,topRight,bottomRight,bottomLeft,isMixed,onSeeked,onPause,onPlay,onEnd,onClick,onMouseEnter,onMouseLeave,onMouseDown,onMouseUp,poster,restartOnEnter,posterEnabled,startTime:startTimeProp,volume,loop}=props;const isInCurrentNavigationTarget=useIsInCurrentNavigationTarget();const videoRef=useRef();const isSafari=useIsBrowserSafari();const requestingPlay=useRef(false);const wasPausedOnLeave=useRef(null);const wasEndedOnLeave=useRef(null);const isOnCanvas=useIsOnCanvas();const borderRadius=useRadius(props);// Video elements behave oddly at 100% duration\nconst startTime=useMemo(()=>startTimeProp===100?99.9:startTimeProp,[startTimeProp]);const shouldPlay=!isOnCanvas||canvasPlay;const autoPlay=useMemo(()=>playing,[]);const isMuted=useMemo(()=>isOnCanvas?true:muted,[isOnCanvas,muted]);const setProgress=useCallback(rawProgress=>{if(!videoRef.current)return;const newProgress=(rawProgress===1?.999:rawProgress)*videoRef.current.duration;const isAlreadySet=Math.abs(videoRef.current.currentTime-newProgress)<.1;if(videoRef.current.duration>0&&!isAlreadySet){videoRef.current.currentTime=newProgress;}},[]);const play=useCallback(()=>{const isPlaying=videoRef.current.currentTime>0&&videoRef.current.onplaying&&!videoRef.current.paused&&!videoRef.current.ended&&videoRef.current.readyState>videoRef.current.HAVE_CURRENT_DATA;if(!isPlaying&&videoRef.current&&!requestingPlay.current&&isInCurrentNavigationTarget){requestingPlay.current=true;videoRef.current.play().catch(e=>{}) // It's likely fine, swallow error\n.finally(()=>requestingPlay.current=false);}},[]);const pause=useCallback(()=>{if(!videoRef.current||requestingPlay.current)return;videoRef.current.pause();},[]);// Pause/play via props\nuseEffect(()=>{if(playing&&shouldPlay)play();else pause();},[playing,canvasPlay]);// Change progress via prop\nuseEffect(()=>{if(isMountedAndReadyForProgressChanges)setProgress(startTime*.01);else isMountedAndReadyForProgressChanges=true;},[startTime,srcFile,srcUrl]);const videoProgress=useAutoMotionValue(progress,{transform:value=>value*.01,onChange:newValue=>{setProgress(newValue);}});// Allow scrubbing with MotionValue\nuseMotionValueEvent(videoProgress,\"change\",latest=>{if(!isOnCanvas)setProgress(latest);});// (Prototyping) Checking if we need to play on navigation enter\nuseOnEnter(()=>{if(wasPausedOnLeave.current===null)return;if(videoRef.current){// if (restartOnEnter) setProgress(0)\nif(!wasEndedOnLeave&&loop||!wasPausedOnLeave.current)play();}});// (Prototyping) Pausing & saving playing state on navigation exit\nuseOnExit(()=>{if(videoRef.current){wasEndedOnLeave.current=videoRef.current.ended;wasPausedOnLeave.current=videoRef.current.paused;pause();}});const src=useMemo(()=>{let fragment=\"\";// if (\n//     startTime > 0 &&\n//     videoRef.current &&\n//     !isNaN(videoRef.current.duration) &&\n//     !isOnCanvas\n// ) {\n//     console.log(startTime, videoRef.current.duration)\n//     fragment = `#t=${startTime * videoRef.current.duration}`\n// }\nif(srcType===SrcType.Url)return srcUrl+fragment;if(srcType===SrcType.Video)return srcFile+fragment;},[srcType,srcFile,srcUrl,startTime]);// Autoplay via JS to work in Safari\nuseEffect(()=>{if(isSafari&&videoRef.current&&autoPlay){setTimeout(()=>play(),50);}},[]);// Volume Control\nuseEffect(()=>{if(videoRef.current&&!muted)videoRef.current.volume=volume/100;},[volume]);// When video is ready, set start-time, then autoplay if needed\nconst handleReady=()=>{if(videoRef.current&&videoRef.current.currentTime<.3)setProgress(startTime*.01);if(shouldPlay&&videoRef.current&&autoPlay)play();};return /*#__PURE__*/ _jsx(\"video\",{onClick,onMouseEnter,onMouseLeave,onMouseDown,onMouseUp,src:src,loop:loop,ref:videoRef,onSeeked:e=>{return onSeeked===null||onSeeked===void 0?void 0:onSeeked(e);},onPause:e=>{return onPause===null||onPause===void 0?void 0:onPause(e);},onPlay:e=>{return onPlay===null||onPlay===void 0?void 0:onPlay(e);},onEnded:e=>{return onEnd===null||onEnd===void 0?void 0:onEnd(e);},autoPlay:autoPlay&&shouldPlay,poster:posterEnabled?poster:undefined,onLoadedData:handleReady,controls:controls,muted:isMuted,playsInline:playsinline,style:{cursor:!!onClick?\"pointer\":\"auto\",width:\"100%\",height:\"100%\",borderRadius,display:\"block\",objectFit:objectFit,backgroundColor:backgroundColor,objectPosition:\"50% 50%\"}});});Video.displayName=\"Video\";Video.defaultProps={srcType:SrcType.Url,srcUrl:\"https://assets.mixkit.co/videos/preview/mixkit-ice-cream-glass-of-red-soda-5094-small.mp4\",srcFile:\"\",posterEnabled:false,controls:false,autoPlay:true,canvasPlay:false,loop:true,muted:true,playsinline:true,restartOnEnter:false,objectFit:ObjectFitType.Cover,backgroundColor:\"rgba(0,0,0,0)\",radius:0,volume:25,startTime:0};addPropertyControls(Video,{srcType:{type:ControlType.Enum,displaySegmentedControl:true,title:\"Source\",options:[SrcType.Url,SrcType.Video]},srcUrl:{type:ControlType.String,title:\" \",placeholder:\"../example.mp4\",hidden(props){return props.srcType===SrcType.Video;},description:\"Hosted video file URL. For Youtube, use the Youtube component.\"},srcFile:{type:ControlType.File,title:\" \",allowedFileTypes:[\"mp4\"],hidden(props){return props.srcType===SrcType.Url;}},playing:{type:ControlType.Boolean,title:\"Playing\",enabledTitle:\"Yes\",disabledTitle:\"No\"},posterEnabled:{type:ControlType.Boolean,title:\"Poster\",enabledTitle:\"Yes\",disabledTitle:\"No\"},poster:{type:ControlType.Image,title:\" \",hidden:({posterEnabled})=>!posterEnabled},backgroundColor:{type:ControlType.Color,title:\"Background\"},...borderRadiusControl,startTime:{title:\"Start Time\",type:ControlType.Number,min:0,max:100,step:.1,unit:\"%\"},loop:{type:ControlType.Boolean,title:\"Loop\",enabledTitle:\"Yes\",disabledTitle:\"No\"},objectFit:{type:ControlType.Enum,title:\"Fit\",options:[ObjectFitType.Cover,ObjectFitType.Fill,ObjectFitType.Contain,ObjectFitType.ScaleDown,ObjectFitType.None,]},canvasPlay:{type:ControlType.Boolean,title:\"On Canvas\",enabledTitle:\"Play\",disabledTitle:\"Pause\",hidden(props){return props.autoPlay===false;}},// restartOnEnter: {\n//     type: ControlType.Boolean,\n//     title: \"On ReEnter\",\n//     enabledTitle: \"Restart\",\n//     disabledTitle: \"Resume\",\n// },\ncontrols:{type:ControlType.Boolean,title:\"Controls\",enabledTitle:\"Show\",disabledTitle:\"Hide\"},muted:{type:ControlType.Boolean,title:\"Muted\",enabledTitle:\"Yes\",disabledTitle:\"No\"},volume:{type:ControlType.Number,max:100,min:0,unit:\"%\",hidden:({muted})=>muted},onEnd:{type:ControlType.EventHandler},onSeeked:{type:ControlType.EventHandler},onPause:{type:ControlType.EventHandler},onPlay:{type:ControlType.EventHandler},...defaultEvents});\nexport const __FramerMetadata__ = {\"exports\":{\"VideoProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"Video\":{\"type\":\"reactComponent\",\"name\":\"Video\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerContractVersion\":\"1\",\"framerIntrinsicWidth\":\"200\",\"framerIntrinsicHeight\":\"112\",\"framerSupportedLayoutWidth\":\"fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Video.map"],"mappings":"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"}