-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
14 changed files
with
14,230 additions
and
11,045 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
import React from "react" | ||
|
||
import { HeroVideoDialog } from "@/components/fancy/hero-video-dialog" | ||
import { FramerComponentWrapper } from "@/components/layout/framer-wrapper" | ||
|
||
export function MarketingVideo() { | ||
return ( | ||
<FramerComponentWrapper | ||
className="relative mx-auto flex w-full items-center justify-center pb-8" | ||
initial={{ opacity: 0, y: 50 }} | ||
animate={{ opacity: 1, y: 0 }} | ||
transition={{ delay: 1.2, duration: 1 }} | ||
> | ||
<HeroVideoDialog | ||
animationStyle="from-center" | ||
videoSrc="https://www.youtube.com/watch?v=KQrSe4ZFpUU" | ||
thumbnailSrc="/marketing/video-preview.png" | ||
thumbnailAlt="Hero Video" | ||
className="max-w-screen-lg rounded-lg border shadow-lg" | ||
/> | ||
</FramerComponentWrapper> | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
"use client" | ||
|
||
import { useState } from "react" | ||
import Image from "next/image" | ||
import { AnimatePresence, motion } from "framer-motion" | ||
import { Play, XIcon } from "lucide-react" | ||
|
||
import { cn } from "@/lib/utils" | ||
|
||
type AnimationStyle = | ||
| "from-bottom" | ||
| "from-center" | ||
| "from-top" | ||
| "from-left" | ||
| "from-right" | ||
| "fade" | ||
| "top-in-bottom-out" | ||
| "left-in-right-out" | ||
|
||
interface HeroVideoProps { | ||
animationStyle?: AnimationStyle | ||
videoSrc: string | ||
thumbnailSrc: string | ||
thumbnailAlt?: string | ||
className?: string | ||
} | ||
|
||
const animationVariants = { | ||
"from-bottom": { | ||
initial: { y: "100%", opacity: 0 }, | ||
animate: { y: 0, opacity: 1 }, | ||
exit: { y: "100%", opacity: 0 }, | ||
}, | ||
"from-center": { | ||
initial: { scale: 0.5, opacity: 0 }, | ||
animate: { scale: 1, opacity: 1 }, | ||
exit: { scale: 0.5, opacity: 0 }, | ||
}, | ||
"from-top": { | ||
initial: { y: "-100%", opacity: 0 }, | ||
animate: { y: 0, opacity: 1 }, | ||
exit: { y: "-100%", opacity: 0 }, | ||
}, | ||
"from-left": { | ||
initial: { x: "-100%", opacity: 0 }, | ||
animate: { x: 0, opacity: 1 }, | ||
exit: { x: "-100%", opacity: 0 }, | ||
}, | ||
"from-right": { | ||
initial: { x: "100%", opacity: 0 }, | ||
animate: { x: 0, opacity: 1 }, | ||
exit: { x: "100%", opacity: 0 }, | ||
}, | ||
fade: { | ||
initial: { opacity: 0 }, | ||
animate: { opacity: 1 }, | ||
exit: { opacity: 0 }, | ||
}, | ||
"top-in-bottom-out": { | ||
initial: { y: "-100%", opacity: 0 }, | ||
animate: { y: 0, opacity: 1 }, | ||
exit: { y: "100%", opacity: 0 }, | ||
}, | ||
"left-in-right-out": { | ||
initial: { x: "-100%", opacity: 0 }, | ||
animate: { x: 0, opacity: 1 }, | ||
exit: { x: "100%", opacity: 0 }, | ||
}, | ||
} | ||
|
||
export function HeroVideoDialog({ | ||
animationStyle = "from-center", | ||
videoSrc, | ||
thumbnailSrc, | ||
thumbnailAlt = "Video thumbnail", | ||
className, | ||
}: HeroVideoProps) { | ||
const [isVideoOpen, setIsVideoOpen] = useState(false) | ||
const selectedAnimation = animationVariants[animationStyle] | ||
|
||
return ( | ||
<div className={cn("relative", className)}> | ||
<div | ||
className="group relative cursor-pointer rounded-md p-2 ring-1 ring-slate-200/50 backdrop-blur-md dark:bg-gray-900/70 dark:ring-white/10" | ||
onClick={() => setIsVideoOpen(true)} | ||
> | ||
<Image | ||
src={thumbnailSrc} | ||
alt={thumbnailAlt} | ||
width={1920} | ||
height={1080} | ||
className="rounded-md border transition-all duration-200 ease-out group-hover:brightness-[0.8]" | ||
/> | ||
<div className="absolute inset-0 flex scale-[0.9] items-center justify-center rounded-2xl transition-all duration-200 ease-out group-hover:scale-100"> | ||
<div className="z-30 flex size-28 items-center justify-center rounded-full bg-primary/10 backdrop-blur-md"> | ||
<div | ||
className={`relative flex size-20 scale-100 items-center justify-center rounded-full bg-gradient-to-b from-primary/30 to-primary shadow-md transition-all duration-200 ease-out group-hover:scale-[1.2]`} | ||
> | ||
<Play | ||
className="size-8 scale-100 fill-white text-white transition-transform duration-200 ease-out group-hover:scale-105" | ||
style={{ | ||
filter: | ||
"drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06))", | ||
}} | ||
/> | ||
</div> | ||
</div> | ||
</div> | ||
</div> | ||
<AnimatePresence> | ||
{isVideoOpen && ( | ||
<motion.div | ||
initial={{ opacity: 0 }} | ||
animate={{ opacity: 1 }} | ||
onClick={() => setIsVideoOpen(false)} | ||
exit={{ opacity: 0 }} | ||
className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-md" | ||
> | ||
<motion.div | ||
{...selectedAnimation} | ||
transition={{ type: "spring", damping: 30, stiffness: 300 }} | ||
className="relative mx-4 aspect-video w-full max-w-4xl md:mx-0" | ||
> | ||
<motion.button className="absolute -top-16 right-0 rounded-full bg-neutral-900/50 p-2 text-xl text-white ring-1 backdrop-blur-md dark:bg-neutral-100/50 dark:text-black"> | ||
<XIcon className="size-5" /> | ||
</motion.button> | ||
<div className="relative isolate z-[1] size-full overflow-hidden rounded-2xl border-2 border-white"> | ||
<iframe | ||
src={videoSrc} | ||
className="size-full rounded-2xl" | ||
allowFullScreen | ||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" | ||
></iframe> | ||
</div> | ||
</motion.div> | ||
</motion.div> | ||
)} | ||
</AnimatePresence> | ||
</div> | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
"use client" | ||
|
||
import React from "react" | ||
import { motion } from "framer-motion" | ||
|
||
const ease = [0.16, 1, 0.3, 1] | ||
|
||
export function WordPullUp({ | ||
text, | ||
className, | ||
}: { | ||
text: string[] | ||
className?: string | ||
}) { | ||
return ( | ||
<div className={className}> | ||
{text.map((text, index) => ( | ||
<motion.span | ||
key={index} | ||
className="px-1 md:px-2" | ||
initial={{ opacity: 0, y: 20 }} | ||
animate={{ opacity: 1, y: 0 }} | ||
transition={{ | ||
duration: 0.8, | ||
delay: index * 0.2, | ||
ease, | ||
}} | ||
> | ||
{text} | ||
</motion.span> | ||
))} | ||
</div> | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.