Skip to content

Commit

Permalink
Updated
Browse files Browse the repository at this point in the history
  • Loading branch information
tristanpoland committed Aug 25, 2024
1 parent 2d42f39 commit 134931a
Show file tree
Hide file tree
Showing 28 changed files with 453 additions and 139 deletions.
14 changes: 7 additions & 7 deletions app/components/enterprise-cards.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ export function EnterpriseCards() {
</p>
</div>
<Image
src="https://ui.aceternity.com/linear.webp"
width={500}
height={500}
src="/dashboard/Horizon-Dashboard3.png"
width={450}
height={400}
alt="linear demo image"
className="absolute -right-4 lg:-right-[40%] grayscale filter -bottom-10 object-contain rounded-2xl"
className="absolute -right-4 lg:-right-[40%] filter -bottom-10 object-contain rounded-2xl"
/>
</WobbleCard>
<WobbleCard containerClassName="col-span-1 min-h-[300px]">
Expand Down Expand Up @@ -52,9 +52,9 @@ export function EnterpriseCards() {
</p>
</div>
<Image
src="https://ui.aceternity.com/linear.webp"
width={500}
height={500}
src="/dashboard/Horizon-Dashboard12.png"
width={550}
height={550}
alt="linear demo image"
className="absolute -right-10 md:-right-[40%] lg:-right-[20%] -bottom-10 object-contain rounded-2xl"
/>
Expand Down
50 changes: 50 additions & 0 deletions app/components/enterprise-slideshow.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
"use client";
import { motion } from "framer-motion";
import React from "react";
import { ImagesSlider } from "./ui/images-slider";

export function EnterpriseSlides() {
const images = [
"/dashboard/Horizon-Dashboard3.png",
"/dashboard/Horizon-Dashboard.png",
"/dashboard/Horizon-Dashboard4.png",
"/dashboard/Horizon-Dashboard5.png",
"/dashboard/Horizon-Dashboard6.png",
"/dashboard/Horizon-Dashboard7.png",
"/dashboard/Horizon-Dashboard8.png",
"/dashboard/Horizon-Dashboard9.png",
"/dashboard/Horizon-Dashboard10.png",
"/dashboard/Horizon-Dashboard11.png",
"/dashboard/Horizon-Dashboard12.png",
"/dashboard/Horizon-Dashboard13.png",
"/dashboard/Horizon-Dashboard14.png",
"/dashboard/Horizon-Dashboard15.png",
"/dashboard/Horizon-Dashboard16.png"
];
return (
<ImagesSlider className="h-[27rem]" images={images}>
<motion.div
initial={{
opacity: 0,
y: -80,
}}
animate={{
opacity: 1,
y: 0,
}}
transition={{
duration: 0.6,
}}
className="z-50 flex flex-col justify-center items-center"
>
{/* <motion.p className="font-bold text-xl md:text-6xl text-center bg-clip-text text-transparent bg-gradient-to-b from-neutral-50 to-neutral-400 py-4">
The hero section slideshow <br /> nobody asked for
</motion.p>
<button className="px-4 py-2 backdrop-blur-sm border bg-emerald-300/10 border-emerald-500/20 text-white mx-auto text-center rounded-full relative mt-4">
<span>Join now →</span>
<div className="absolute inset-x-0 h-px -bottom-px bg-gradient-to-r w-3/4 mx-auto from-transparent via-emerald-500 to-transparent" />
</button> */}
</motion.div>
</ImagesSlider>
);
}
6 changes: 3 additions & 3 deletions app/components/ui/google-gemini-effect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export const GoogleGeminiEffect = ({
`Scroll this component and see the bottom SVG come to life wow this
works!`}
</p>
<div className="w-full h-[890px] -top-60 md:-top-40 flex items-center justify-center bg-red-transparent absolute ">
<div className="w-full h-[500px] -top-60 md:-top-40 flex items-center justify-center bg-red-transparent absolute ">
<button className="font-bold bg-white rounded-full md:px-4 md:py-2 px-2 py-1 md:mt-24 mt-8 z-30 md:text-base text-black text-xs w-fit mx-auto ">
<a href="/enterprise">
Go Enterprise
Expand All @@ -38,8 +38,8 @@ export const GoogleGeminiEffect = ({
</div>
<svg
width="1440"
height="890"
viewBox="0 0 1440 890"
height="500"
viewBox="0 0 1440 500"
xmlns="http://www.w3.org/2000/svg"
className=" absolute -top-60 md:-top-40 w-full"
>
Expand Down
151 changes: 151 additions & 0 deletions app/components/ui/images-slider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
"use client";
import { cn } from "../lib/utils";
import { motion, AnimatePresence } from "framer-motion";
import React, { useEffect, useState } from "react";

export const ImagesSlider = ({
images,
children,
overlay = true,
overlayClassName,
className,
autoplay = true,
direction = "up",
}: {
images: string[];
children: React.ReactNode;
overlay?: React.ReactNode;
overlayClassName?: string;
className?: string;
autoplay?: boolean;
direction?: "up" | "down";
}) => {
const [currentIndex, setCurrentIndex] = useState(0);
const [loading, setLoading] = useState(false);
const [loadedImages, setLoadedImages] = useState<string[]>([]);

const handleNext = () => {
setCurrentIndex((prevIndex) =>
prevIndex + 1 === images.length ? 0 : prevIndex + 1
);
};

const handlePrevious = () => {
setCurrentIndex((prevIndex) =>
prevIndex - 1 < 0 ? images.length - 1 : prevIndex - 1
);
};

useEffect(() => {
loadImages();
}, []);

const loadImages = () => {
setLoading(true);
const loadPromises = images.map((image) => {
return new Promise((resolve, reject) => {
const img = new Image();
img.src = image;
img.onload = () => resolve(image);
img.onerror = reject;
});
});

Promise.all(loadPromises)
.then((loadedImages) => {
setLoadedImages(loadedImages as string[]);
setLoading(false);
})
.catch((error) => console.error("Failed to load images", error));
};
useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => {
if (event.key === "ArrowRight") {
handleNext();
} else if (event.key === "ArrowLeft") {
handlePrevious();
}
};

window.addEventListener("keydown", handleKeyDown);

// autoplay
let interval: any;
if (autoplay) {
interval = setInterval(() => {
handleNext();
}, 5000);
}

return () => {
window.removeEventListener("keydown", handleKeyDown);
clearInterval(interval);
};
}, []);

const slideVariants = {
initial: {
scale: 0,
opacity: 0,
rotateX: 45,
},
visible: {
scale: 1,
rotateX: 0,
opacity: 1,
transition: {
duration: 0.5,
ease: [0.645, 0.045, 0.355, 1.0],
},
},
upExit: {
opacity: 1,
y: "-150%",
transition: {
duration: 1,
},
},
downExit: {
opacity: 1,
y: "150%",
transition: {
duration: 1,
},
},
};

const areImagesLoaded = loadedImages.length > 0;

return (
<div
className={cn(
"overflow-hidden h-full w-full relative flex items-center justify-center",
className
)}
style={{
perspective: "1000px",
}}
>
{areImagesLoaded && children}
{areImagesLoaded && overlay && (
<div
className={cn("absolute inset-0 bg-black/0 z-40", overlayClassName)}
/>
)}

{areImagesLoaded && (
<AnimatePresence>
<motion.img
key={currentIndex}
src={loadedImages[currentIndex]}
initial="initial"
animate="visible"
exit={direction === "up" ? "upExit" : "downExit"}
variants={slideVariants}
className="image h-full w-full absolute inset-0 object-cover object-center rounded-xl"
/>
</AnimatePresence>
)}
</div>
);
};
Loading

0 comments on commit 134931a

Please sign in to comment.