{"version":3,"file":"Examples.DZn0NlyF.mjs","names":["useRef","useCallback","useState","useMemo","useRef"],"sources":["https:/framerusercontent.com/modules/lRDHiNWNVWmE0lqtoVHP/90ICLbTHnkXgVfH1BSgW/Video.js","https:/framerusercontent.com/modules/xpUANLUYs0J3TkWEzRBK/eXjwWWqt502UMQmT4cel/Examples.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,useIsInCurrentNavigationTarget}from\"framer\";import{isMotionValue,useInView}from\"framer-motion\";import{borderRadiusControl,defaultEvents,useIsBrowserSafari,useIsOnCanvas,useOnEnter,useOnExit,useRadius}from\"https://framerusercontent.com/modules/G4IfyjvwmaeSBpdb4TWu/OIjZRBmWDcIE2B6qgG1j/index.js\";// https://framer.com/m/framer/default-utils.js@^0.45.0\nimport{memo,useCallback,useEffect,useMemo,useRef,useState}from\"react\";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={}));const defaultVideo=\"https://framerusercontent.com/assets/MLWPbW1dUQawJLhhun3dBwpgJak.mp4\";// 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});}function usePlaybackControls(videoRef){const isInCurrentNavigationTarget=useIsInCurrentNavigationTarget();const requestingPlay=useRef(false);const isPlayingRef=useRef(false);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 video=videoRef.current;if(!video)return;video.preload=\"auto\"// makes sure browsers don't throttle: https://html.spec.whatwg.org/multipage/media.html#:~:text=When%20the%20media%20resource%20is%20playing%2C%20hints%20to%20the%20user%20agent%20that%20bandwidth%20is%20to%20be%20considered%20scarce%2C%20e.g.%20suggesting%20throttling%20the%20download%20so%20that%20the%20media%20data%20is%20obtained%20at%20the%20slowest%20possible%20rate%20that%20still%20maintains%20consistent%20playback.\n;const isPlaying=video.currentTime>0&&video.onplaying&&!video.paused&&!video.ended&&video.readyState>=video.HAVE_CURRENT_DATA;if(!isPlaying&&video&&!requestingPlay.current&&isInCurrentNavigationTarget){requestingPlay.current=true;isPlayingRef.current=true;video.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();isPlayingRef.current=false;},[]);return{play,pause,setProgress,isPlaying:isPlayingRef};}function useAutoplayBehavior({playingProp,muted,loop,playsinline,controls}){const[initialPlayingProp]=useState(()=>playingProp);const[hasPlayingPropChanged,setHasPlayingPropChanged]=useState(false);if(playingProp!==initialPlayingProp&&!hasPlayingPropChanged){setHasPlayingPropChanged(true);}const behavesAsGif=// passing `playing === true` on mount indicates that the video should\n// autoplay, like a GIF\ninitialPlayingProp&&muted&&loop&&playsinline&&!controls&&// Some users of the <Video> component use it by wrapping it with\n// another smart component and adding their own controls on top. (The\n// controls use transitions to control the video: e.g., when clicking\n// the play button, the smart component will transition to a state with\n// <Video playing={true} />.) In this case, we don't want the video to\n// behave as a gif, as it will be weird if the video suddenly started\n// acting as such (and auto-pausing when leaving the viewport) as soon\n// as the site visitor mutes it and clicks “Play”.\n!hasPlayingPropChanged;let autoplay;if(behavesAsGif)autoplay=\"on-viewport\";else if(initialPlayingProp)autoplay=\"on-mount\";else autoplay=\"no-autoplay\";return autoplay;}const VideoMemo=/*#__PURE__*/memo(function VideoInner(props){const{// default props\nsrcType=\"URL\",srcUrl,srcFile=\"\",posterEnabled=false,controls=false,playing=true,loop=true,muted=true,playsinline=true,restartOnEnter=false,objectFit=\"cover\",backgroundColor=\"rgba(0,0,0,0)\",radius=0,volume=25,startTime:startTimeProp=0,poster,playing:playingProp,progress,onSeeked,onPause,onPlay,onEnd,onClick,onMouseEnter,onMouseLeave,onMouseDown,onMouseUp}=props;const videoRef=useRef();const isSafari=useIsBrowserSafari();const wasPausedOnLeave=useRef(null);const wasEndedOnLeave=useRef(null);const isOnCanvas=useIsOnCanvas();const borderRadius=useRadius(props);// Hard-coding `autoplayBehavior` and `isInViewport` when on canvas as a\n// tiny perf optimization. isOnCanvas won’t change through the lifecycle of\n// the component, so using these hooks conditionally should be safe\nconst autoplayBehavior=isOnCanvas?\"no-autoplay\":useAutoplayBehavior({playingProp,muted,loop,playsinline,controls});const isInViewport=isOnCanvas?true:useInView(videoRef);const isCloseToViewport=isOnCanvas?false:useInView(videoRef,{margin:\"0px 0px 100px 100px\",once:true});// Video elements behave oddly at 100% duration\nconst startTime=startTimeProp===100?99.9:startTimeProp;const{play,pause,setProgress,isPlaying}=usePlaybackControls(videoRef);// Pause/play via props\nuseEffect(()=>{if(isOnCanvas)return;if(playingProp)play();else pause();},[playingProp]);// Pause/play via viewport\nuseEffect(()=>{if(isOnCanvas)return;if(autoplayBehavior!==\"on-viewport\")return;if(isInViewport)play();else pause();},[autoplayBehavior,isInViewport]);/**\n     * The Video component has some effects that sync the video element with props\n     * like `startTime`, `progress`, etc. React calls these effects whenever these\n     * props change. However, it also calls them on the first mount, and this is\n     * troublesome – if we’re doing SSR, and the user changed the video state before\n     * the video was hydrated, the initial `useEffect` call will reset the video\n     * state. To avoid this, we use this flag.\n     */const isMountedAndReadyForProgressChanges=useRef(false);// Allow scrubbling via progress prop\n// 1) Handle cases when the progress prop itself changes\nuseEffect(()=>{if(!isMountedAndReadyForProgressChanges.current){isMountedAndReadyForProgressChanges.current=true;return;}const rawProgressValue=isMotionValue(progress)?progress.get():(progress!==null&&progress!==void 0?progress:0)*.01;setProgress(// When the progress value exists (e.g. <Video startTime={10}\n// progress={50} />), we respect the `progress` value over\n// `startTime`, even if `startTime` changes. That’s because\n// `startTime` == start == changing it shouldn’t affect the current\n// progress\n(rawProgressValue!==null&&rawProgressValue!==void 0?rawProgressValue:0)||// Then why fall back to `startTime` when `progress` doesn’t exist,\n// you might ask? Now, that’s for\n// - canvas UX: we want the video progress to change when the user\n//   is scrobbling the “Start Time” in component settings.\n// - backwards compatibility: maybe some users *are* scrobbling\n//   using `startTime` instead of `progress`? We don’t know, and it\n//   always supported it, so let’s not break it\n(startTime!==null&&startTime!==void 0?startTime:0)/100);},[startTime,srcFile,srcUrl,progress]);// 2) Handle cases when the motion value inside the progress prop changes\nuseEffect(()=>{if(!isMotionValue(progress))return;return progress.on(\"change\",value=>setProgress(value));},[progress]);// (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===\"URL\")return srcUrl+fragment;if(srcType===\"Upload\")return srcFile+fragment;},[srcType,srcFile,srcUrl,startTime]);// Autoplay via JS to work in Safari\nuseEffect(()=>{if(isSafari&&videoRef.current&&autoplayBehavior===\"on-mount\"){setTimeout(()=>play(),50);}},[]);// Volume Control\nuseEffect(()=>{if(videoRef.current&&!muted)videoRef.current.volume=(volume!==null&&volume!==void 0?volume:0)/100;},[volume]);// When video is ready, set start-time, then autoplay if needed\nconst handleReady=()=>{const video=videoRef.current;if(!video)return;if(video.currentTime<.3&&startTime>0)setProgress((startTime!==null&&startTime!==void 0?startTime:0)*.01);if(// when the component updates (e.g. only srcFile/url changes), and the video was already playing, keep playing\nisPlaying.current||autoplayBehavior===\"on-mount\"||autoplayBehavior===\"on-viewport\"&&isInViewport)play();};return /*#__PURE__*/_jsx(\"video\",{onClick,onMouseEnter,onMouseLeave,onMouseDown,onMouseUp,src:src,loop:loop,ref:videoRef,onSeeked:e=>onSeeked===null||onSeeked===void 0?void 0:onSeeked(e),onPause:e=>onPause===null||onPause===void 0?void 0:onPause(e),onPlay:e=>onPlay===null||onPlay===void 0?void 0:onPlay(e),onEnded:e=>onEnd===null||onEnd===void 0?void 0:onEnd(e),autoPlay:isPlaying.current||autoplayBehavior===\"on-mount\"||autoplayBehavior===\"on-viewport\"&&isInViewport,preload:isPlaying.current?\"auto\":isOnCanvas&&!poster?\"metadata\":autoplayBehavior!==\"on-mount\"&&!isCloseToViewport?\"none\":// `autoplay` overrides this too\n\"metadata\",poster:posterEnabled&&!srcFile&&srcUrl===defaultVideo?\"https://framerusercontent.com/images/5ILRvlYXf72kHSVHqpa3snGzjU.jpg\":posterEnabled&&poster?poster:undefined,onLoadedData:handleReady,controls:controls,muted:isOnCanvas?true:muted,playsInline:playsinline,style:{cursor:!!onClick?\"pointer\":\"auto\",width:\"100%\",height:\"100%\",borderRadius,display:\"block\",objectFit:objectFit,backgroundColor:backgroundColor,objectPosition:\"50% 50%\"}});});Video.displayName=\"Video\";function capitalizeFirstLetter(value){return value.charAt(0).toUpperCase()+value.slice(1);}export function titleCase(value){const groups=value.match(/[A-Z]{2,}|[A-Z][a-z]+|[a-z]+|[A-Z]|\\d+/gu)||[];return groups.map(capitalizeFirstLetter).join(\" \");}const objectFitOptions=[\"cover\",\"fill\",\"contain\",\"scale-down\",\"none\"];addPropertyControls(Video,{srcType:{type:ControlType.Enum,displaySegmentedControl:true,title:\"Source\",options:[\"URL\",\"Upload\"]},srcUrl:{type:ControlType.String,title:\"URL\",defaultValue:\"https://framerusercontent.com/assets/MLWPbW1dUQawJLhhun3dBwpgJak.mp4\",hidden(props){return props.srcType===\"Upload\";}},srcFile:{type:ControlType.File,title:\"File\",allowedFileTypes:[\"mp4\",\"webm\"],hidden(props){return props.srcType===\"URL\";}},playing:{type:ControlType.Boolean,title:\"Playing\",enabledTitle:\"Yes\",disabledTitle:\"No\"},posterEnabled:{type:ControlType.Boolean,title:\"Poster\",enabledTitle:\"Yes\",disabledTitle:\"No\",description:\"We recommend adding a poster. [Learn more](https://www.framer.com/help/articles/how-are-videos-optimized-in-framer/).\"},poster:{type:ControlType.Image,title:\" \",hidden:({posterEnabled})=>!posterEnabled},backgroundColor:{type:ControlType.Color,title:\"Background\",defaultValue:\"rgba(0,0,0,0)\"},...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:objectFitOptions,optionTitles:objectFitOptions.map(titleCase)},// 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\",defaultValue:false},muted:{type:ControlType.Boolean,title:\"Muted\",enabledTitle:\"Yes\",disabledTitle:\"No\"},volume:{type:ControlType.Number,max:100,min:0,unit:\"%\",hidden:({muted})=>muted,defaultValue:25},onEnd:{type:ControlType.EventHandler},onSeeked:{type:ControlType.EventHandler},onPause:{type:ControlType.EventHandler},onPlay:{type:ControlType.EventHandler},...defaultEvents});\nexport const __FramerMetadata__ = {\"exports\":{\"Video\":{\"type\":\"reactComponent\",\"name\":\"Video\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerContractVersion\":\"1\",\"framerIntrinsicWidth\":\"200\",\"framerSupportedLayoutWidth\":\"fixed\",\"framerIntrinsicHeight\":\"112\"}},\"titleCase\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"VideoProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Video.map","import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";import{motion,useScroll,useTransform}from\"framer-motion\";import{useRef}from\"react\";const EachWord=({word,starting,ending,progress})=>{const opacity=useTransform(progress,[starting,ending],[.15,1]);return /*#__PURE__*/_jsxs(motion.span,{style:{opacity},children:[word,\" \"]});};export default function ScrollRevealText(props){const{text,textColor,font,startOffset,endOffset}=props;const words=text.split(\" \");const totalWords=words.length;const ref=useRef(null);const{scrollYProgress}=useScroll({target:ref,offset:[`start ${1-startOffset}`,`end ${1-endOffset}`]});return /*#__PURE__*/_jsx(\"p\",{ref:ref,style:{...font,color:textColor,margin:0,padding:0,// KHẮC PHỤC: Đưa lineHeight về giá trị gốc và xóa textAlign\n// để giữ khoảng cách từ như ban đầu.\nlineHeight:1.1},children:words.map((word,idx)=>{const starting=idx/totalWords;const ending=(idx+.8)/totalWords;return /*#__PURE__*/_jsx(EachWord,{word:word,starting:starting,ending:ending,progress:scrollYProgress},idx);})});}// Property Controls không thay đổi\naddPropertyControls(ScrollRevealText,{text:{title:\"Text\",type:ControlType.String,defaultValue:\"Step into the future where each collection is a doorway to a different realm. From the nomadic trails of the desert to the bustling streets of the urban jungle, our collections merge the past's heritage with the future's possibilities. Futuristic architecture in the Amazon jungle\",displayTextArea:true},font:{type:\"font\",controls:\"extended\"},textColor:{type:ControlType.Color,defaultValue:\"#FFFFFF\"},startOffset:{title:\"Start Offset\",type:ControlType.Number,defaultValue:.9,min:0,max:1,step:.01,display:\"slider\"},endOffset:{title:\"End Offset\",type:ControlType.Number,defaultValue:.9,min:0,max:1,step:.01,display:\"slider\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ScrollRevealText\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Examples.map"],"mappings":"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"}