-
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
1 parent
18a4dba
commit 0c8b9a2
Showing
5 changed files
with
285 additions
and
8 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
"use client"; | ||
|
||
import { FaLocationArrow } from "react-icons/fa6"; | ||
|
||
import { projects } from "@/data"; | ||
import { PinContainer } from "@/components/ui/3d-pin"; | ||
|
||
const RecentProjects = () => { | ||
return ( | ||
<div className="py-20"> | ||
<h1 className="heading"> | ||
A small selection of{" "} | ||
<span className="text-purple">recent projects</span> | ||
</h1> | ||
<div className="flex flex-wrap items-center justify-center p-4 gap-16 mt-10"> | ||
{projects.map((item) => ( | ||
<div | ||
className="lg:min-h-[32.5rem] h-[25rem] flex items-center justify-center sm:w-96 w-[80vw]" | ||
key={item.id} | ||
> | ||
<PinContainer | ||
title="/zoom.clone.vercel" | ||
href="https://zoom-clone-iota-six.vercel.app/" | ||
> | ||
<div className="relative flex items-center justify-center sm:w-96 w-[80vw] overflow-hidden h-[20vh] lg:h-[30vh] mb-10"> | ||
<div | ||
className="relative w-full h-full overflow-hidden lg:rounded-3xl" | ||
style={{ backgroundColor: "#13162D" }} | ||
> | ||
<img src="/bg.png" alt="bgimg" /> | ||
</div> | ||
<img | ||
src={item.img} | ||
alt="cover" | ||
className="z-10 absolute bottom-0" | ||
/> | ||
</div> | ||
|
||
<h1 className="font-bold lg:text-2xl md:text-xl text-base line-clamp-1"> | ||
{item.title} | ||
</h1> | ||
|
||
<p | ||
className="lg:text-xl lg:font-normal font-light text-sm line-clamp-2" | ||
style={{ | ||
color: "#BEC1DD", | ||
margin: "1vh 0", | ||
}} | ||
> | ||
{item.des} | ||
</p> | ||
|
||
<div className="flex items-center justify-between mt-7 mb-3"> | ||
<div className="flex items-center"> | ||
{item.iconLists.map((icon, index) => ( | ||
<div | ||
key={index} | ||
className="border border-white/[.2] rounded-full bg-black lg:w-10 lg:h-10 w-8 h-8 flex justify-center items-center" | ||
style={{ | ||
transform: `translateX(-${5 * index + 2}px)`, | ||
}} | ||
> | ||
<img src={icon} alt="icon5" className="p-2" /> | ||
</div> | ||
))} | ||
</div> | ||
|
||
<div className="flex justify-center items-center"> | ||
<p className="flex lg:text-xl md:text-xs text-sm text-purple"> | ||
Check Live Site | ||
</p> | ||
<FaLocationArrow className="ms-3" color="#CBACF9" /> | ||
</div> | ||
</div> | ||
</PinContainer> | ||
</div> | ||
))} | ||
</div> | ||
</div> | ||
); | ||
}; | ||
|
||
export default RecentProjects; |
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,166 @@ | ||
"use client"; | ||
import React, { useState } from "react"; | ||
import { motion } from "framer-motion"; | ||
import { cn } from "@/utils/cn"; | ||
import Link from "next/link"; | ||
|
||
export const PinContainer = ({ | ||
children, | ||
title, | ||
href, | ||
className, | ||
containerClassName, | ||
}: { | ||
children: React.ReactNode; | ||
title?: string; | ||
href?: string; | ||
className?: string; | ||
containerClassName?: string; | ||
}) => { | ||
const [transform, setTransform] = useState( | ||
"translate(-50%,-50%) rotateX(0deg)" | ||
); | ||
|
||
const onMouseEnter = () => { | ||
setTransform("translate(-50%,-50%) rotateX(40deg) scale(0.8)"); | ||
}; | ||
const onMouseLeave = () => { | ||
setTransform("translate(-50%,-50%) rotateX(0deg) scale(1)"); | ||
}; | ||
|
||
return ( | ||
<Link | ||
className={cn( | ||
"relative group/pin z-50 cursor-pointer", | ||
containerClassName | ||
)} | ||
onMouseEnter={onMouseEnter} | ||
onMouseLeave={onMouseLeave} | ||
href={href || "/"} | ||
> | ||
<div | ||
style={{ | ||
perspective: "1000px", | ||
transform: "rotateX(70deg) translateZ(0deg)", | ||
}} | ||
className="absolute left-1/2 top-1/2 ml-[0.09375rem] mt-4 -translate-x-1/2 -translate-y-1/2" | ||
> | ||
<div | ||
style={{ | ||
transform: transform, | ||
}} | ||
className="absolute left-1/2 p-4 top-1/2 flex justify-start items-start rounded-2xl shadow-[0_8px_16px_rgb(0_0_0/0.4)] border-white/[0.1] group-hover/pin:border-white/[0.2] transition duration-700 overflow-hidden" | ||
> | ||
<div className={cn(" relative z-50 ", className)}>{children}</div> | ||
</div> | ||
</div> | ||
<PinPerspective title={title} href={href} /> | ||
</Link> | ||
); | ||
}; | ||
|
||
export const PinPerspective = ({ | ||
title, | ||
href, | ||
}: { | ||
title?: string; | ||
href?: string; | ||
}) => { | ||
return ( | ||
<motion.div className="pointer-events-none w-full h-80 flex items-center justify-center opacity-0 group-hover/pin:opacity-100 z-[60] transition duration-500"> | ||
<div className=" w-full h-full -mt-7 flex-none inset-0"> | ||
<div className="absolute top-0 inset-x-0 flex justify-center"> | ||
<a | ||
href={href} | ||
target={"_blank"} | ||
className="relative flex space-x-2 items-center z-10 rounded-full bg-zinc-950 py-0.5 px-4 ring-1 ring-white/10 " | ||
> | ||
<span className="relative z-20 text-white text-xs font-bold inline-block py-0.5"> | ||
{title} | ||
</span> | ||
|
||
<span className="absolute -bottom-0 left-[1.125rem] h-px w-[calc(100%-2.25rem)] bg-gradient-to-r from-emerald-400/0 via-emerald-400/90 to-emerald-400/0 transition-opacity duration-500 group-hover/btn:opacity-40"></span> | ||
</a> | ||
</div> | ||
|
||
<div | ||
style={{ | ||
perspective: "1000px", | ||
transform: "rotateX(70deg) translateZ(0)", | ||
}} | ||
className="absolute left-1/2 top-1/2 ml-[0.09375rem] mt-4 -translate-x-1/2 -translate-y-1/2" | ||
> | ||
<> | ||
<motion.div | ||
initial={{ | ||
opacity: 0, | ||
scale: 0, | ||
x: "-50%", | ||
y: "-50%", | ||
}} | ||
animate={{ | ||
opacity: [0, 1, 0.5, 0], | ||
scale: 1, | ||
|
||
z: 0, | ||
}} | ||
transition={{ | ||
duration: 6, | ||
repeat: Infinity, | ||
delay: 0, | ||
}} | ||
className="absolute left-1/2 top-1/2 h-[11.25rem] w-[11.25rem] rounded-[50%] bg-sky-500/[0.08] shadow-[0_8px_16px_rgb(0_0_0/0.4)]" | ||
></motion.div> | ||
<motion.div | ||
initial={{ | ||
opacity: 0, | ||
scale: 0, | ||
x: "-50%", | ||
y: "-50%", | ||
}} | ||
animate={{ | ||
opacity: [0, 1, 0.5, 0], | ||
scale: 1, | ||
|
||
z: 0, | ||
}} | ||
transition={{ | ||
duration: 6, | ||
repeat: Infinity, | ||
delay: 2, | ||
}} | ||
className="absolute left-1/2 top-1/2 h-[11.25rem] w-[11.25rem] rounded-[50%] bg-sky-500/[0.08] shadow-[0_8px_16px_rgb(0_0_0/0.4)]" | ||
></motion.div> | ||
<motion.div | ||
initial={{ | ||
opacity: 0, | ||
scale: 0, | ||
x: "-50%", | ||
y: "-50%", | ||
}} | ||
animate={{ | ||
opacity: [0, 1, 0.5, 0], | ||
scale: 1, | ||
|
||
z: 0, | ||
}} | ||
transition={{ | ||
duration: 6, | ||
repeat: Infinity, | ||
delay: 4, | ||
}} | ||
className="absolute left-1/2 top-1/2 h-[11.25rem] w-[11.25rem] rounded-[50%] bg-sky-500/[0.08] shadow-[0_8px_16px_rgb(0_0_0/0.4)]" | ||
></motion.div> | ||
</> | ||
</div> | ||
|
||
<> | ||
<motion.div className="absolute right-1/2 bottom-1/2 bg-gradient-to-b from-transparent to-cyan-500 translate-y-[14px] w-px h-20 group-hover/pin:h-40 blur-[2px]" /> | ||
<motion.div className="absolute right-1/2 bottom-1/2 bg-gradient-to-b from-transparent to-cyan-500 translate-y-[14px] w-px h-20 group-hover/pin:h-40 " /> | ||
<motion.div className="absolute right-1/2 translate-x-[1.5px] bottom-1/2 bg-cyan-600 translate-y-[14px] w-[4px] h-[4px] rounded-full z-40 blur-[3px]" /> | ||
<motion.div className="absolute right-1/2 translate-x-[0.5px] bottom-1/2 bg-cyan-300 translate-y-[14px] w-[2px] h-[2px] rounded-full z-40 " /> | ||
</> | ||
</div> | ||
</motion.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,26 @@ | ||
"use client"; | ||
import React from "react"; | ||
import { PinContainer } from "@/components/ui/3d-pin"; | ||
|
||
export function AnimatedPinDemo() { | ||
return ( | ||
<div className="h-[40rem] w-full flex items-center justify-center "> | ||
<PinContainer | ||
title="/ui.aceternity.com" | ||
href="https://twitter.com/mannupaaji" | ||
> | ||
<div className="flex basis-full flex-col p-4 tracking-tight text-slate-100/50 sm:basis-1/2 w-[20rem] h-[20rem] "> | ||
<h3 className="max-w-xs !pb-2 !m-0 font-bold text-base text-slate-100"> | ||
Aceternity UI | ||
</h3> | ||
<div className="text-base !m-0 !p-0 font-normal"> | ||
<span className="text-slate-500 "> | ||
Customizable Tailwind CSS and Framer Motion Components. | ||
</span> | ||
</div> | ||
<div className="flex flex-1 w-full rounded-lg mt-4 bg-gradient-to-br from-violet-500 via-purple-500 to-blue-500" /> | ||
</div> | ||
</PinContainer> | ||
</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