chore: transfer repo
This commit is contained in:
184
components/home/HeroCarousel.tsx
Normal file
184
components/home/HeroCarousel.tsx
Normal file
@@ -0,0 +1,184 @@
|
||||
"use client";
|
||||
|
||||
import { Button } from "@/components/ui/Button";
|
||||
import { Carousel } from "@/components/ui/Carousel";
|
||||
import { Section } from "@/components/ui/Section";
|
||||
import { Heading, Text } from "@/components/ui/Typography";
|
||||
import { useTranslation } from "@/lib/hooks/useTranslation";
|
||||
import { CarouselSlide } from "@/lib/types/carousel";
|
||||
import { container } from "@/lib/utils";
|
||||
import Image from "next/image";
|
||||
|
||||
export default function HeroCarousel() {
|
||||
const { t } = useTranslation();
|
||||
|
||||
// Carousel data with translations
|
||||
const carouselData: CarouselSlide[] = [
|
||||
{
|
||||
id: 1,
|
||||
title: t('hero.title'),
|
||||
titleColored: t('hero.title_colored'),
|
||||
titleEnd: t('hero.title_end'),
|
||||
description: t('hero.description'),
|
||||
buttonText: t('hero.build_box_button'),
|
||||
buttonLink: "/build-box",
|
||||
imageSrc: "/assets/images/carousel1.png"
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
title: t('hero.title'),
|
||||
titleColored: t('hero.title_colored'),
|
||||
titleEnd: t('hero.title_end'),
|
||||
description: t('hero.description'),
|
||||
buttonText: t('hero.build_box_button'),
|
||||
buttonLink: "/build-box",
|
||||
imageSrc: "/assets/images/carousel2.png"
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
title: t('hero.title'),
|
||||
titleColored: t('hero.title_colored'),
|
||||
titleEnd: t('hero.title_end'),
|
||||
description: t('hero.description'),
|
||||
buttonText: t('hero.build_box_button'),
|
||||
buttonLink: "/build-box",
|
||||
imageSrc: "/assets/images/carousel1.png"
|
||||
}
|
||||
];
|
||||
|
||||
// Default slide to use as fallback
|
||||
const defaultSlide: CarouselSlide = {
|
||||
id: 0,
|
||||
title: t('hero.title'),
|
||||
titleColored: t('hero.title_colored'),
|
||||
titleEnd: t('hero.title_end'),
|
||||
description: t('hero.description'),
|
||||
buttonText: t('hero.build_box_button'),
|
||||
buttonLink: "/build-box",
|
||||
imageSrc: "/assets/images/image1.png"
|
||||
};
|
||||
|
||||
// Create mobile slide components - each image needs to be in a container div
|
||||
const mobileImageSlides = carouselData.map((slide, index) => (
|
||||
<div key={slide.id} className="relative w-full h-full">
|
||||
{/* Background gradient */}
|
||||
<div className="absolute inset-0 bg-gradient-to-r from-[#958C87] via-[#A9A19C] via-[#BDBAB3] via-[#C5C1C0] via-[#C7C1C1] via-[#C3BFBE] to-[#C4C0BF]"></div>
|
||||
|
||||
{/* Image container - right side with padding */}
|
||||
<div className="absolute right-0 top-0 h-full w-1/2">
|
||||
<div className="relative h-full py-8">
|
||||
<Image
|
||||
src={slide.imageSrc}
|
||||
alt={slide.title}
|
||||
fill
|
||||
sizes="50vw"
|
||||
className="object-contain"
|
||||
priority={index === 0}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
));
|
||||
|
||||
// Create desktop slide components
|
||||
const desktopSlides = carouselData.map((slide, index) => (
|
||||
<div key={slide.id} className="w-full h-full">
|
||||
{/* Background gradient */}
|
||||
<div className="absolute inset-0 bg-gradient-to-r from-[#958C87] via-[#A9A19C] via-[#BDBAB3] via-[#C5C1C0] via-[#C7C1C1] via-[#C3BFBE] to-[#C4C0BF]"></div>
|
||||
|
||||
{/* Image container - positioned on the right with padding */}
|
||||
<div className="absolute right-0 top-0 h-full w-[46.3%]">
|
||||
<div className="relative h-full py-12">
|
||||
<Image
|
||||
src={slide.imageSrc}
|
||||
alt={slide.title}
|
||||
fill
|
||||
sizes="46.3vw"
|
||||
className="object-contain"
|
||||
priority={index === 0}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Container for proper alignment */}
|
||||
<div className={`relative h-full ${container} flex items-end`}>
|
||||
{/* Text overlay */}
|
||||
<div className="pb-32 max-w-2xl">
|
||||
<Heading level={1} className="mb-4 text-black text-[40px] leading-[48px] md:text-[60px] md:leading-[76px] flex flex-col font-bold">
|
||||
<span>{slide.title}</span>
|
||||
<span className="text-primary">{slide.titleColored}</span>
|
||||
<span>{slide.titleEnd}</span>
|
||||
</Heading>
|
||||
<Text size="lg" className="mb-6 text-black text-[18px] leading-[28px]">
|
||||
{slide.description}
|
||||
</Text>
|
||||
<div className="flex gap-4">
|
||||
<Button
|
||||
href={slide.buttonLink}
|
||||
variant="filled"
|
||||
size="lg"
|
||||
>
|
||||
{slide.buttonText}
|
||||
</Button>
|
||||
<Button
|
||||
href="/products"
|
||||
variant="custom"
|
||||
size="lg"
|
||||
>
|
||||
{t('hero.ready_made_button')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
));
|
||||
|
||||
return (
|
||||
<Section spacing="none" fullWidth={true}>
|
||||
<div className="w-full">
|
||||
{/* Mobile version */}
|
||||
<div className="md:hidden">
|
||||
{/* Image carousel */}
|
||||
<div className="relative w-full h-[350px] bg-gradient-to-r from-[#958C87] via-[#A9A19C] via-[#BDBAB3] via-[#C5C1C0] via-[#C7C1C1] via-[#C3BFBE] to-[#C4C0BF]">
|
||||
<Carousel
|
||||
slides={mobileImageSlides}
|
||||
interval={10000}
|
||||
indicatorsClassName="absolute bottom-4 left-0 right-0"
|
||||
className="w-full h-full"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Text content below carousel on mobile */}
|
||||
<div className="p-6 bg-white">
|
||||
<Heading level={1} className="mb-3 text-[40px] leading-[48px] flex flex-col font-bold">
|
||||
<span>{carouselData[0]?.title || defaultSlide.title}</span>
|
||||
<span className="text-primary">{carouselData[0]?.titleColored || defaultSlide.titleColored}</span>
|
||||
<span>{carouselData[0]?.titleEnd || defaultSlide.titleEnd}</span>
|
||||
</Heading>
|
||||
<Text className="mb-6 text-[18px] leading-[28px]">
|
||||
{carouselData[0]?.description || defaultSlide.description}
|
||||
</Text>
|
||||
<Button
|
||||
href={carouselData[0]?.buttonLink || defaultSlide.buttonLink}
|
||||
variant="filled"
|
||||
size="lg"
|
||||
fullWidth
|
||||
>
|
||||
{carouselData[0]?.buttonText || defaultSlide.buttonText}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Desktop version */}
|
||||
<div className="hidden md:block relative h-[600px]">
|
||||
<Carousel
|
||||
slides={desktopSlides}
|
||||
interval={10000}
|
||||
indicatorsClassName="absolute bottom-6 left-0 right-0"
|
||||
className="w-full h-full"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</Section>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user