189 lines
7.1 KiB
TypeScript
189 lines
7.1 KiB
TypeScript
"use client";
|
|
|
|
import { Fragment, useState } from "react";
|
|
import { Play } from "lucide-react";
|
|
import { cn } from "@/lib/utils";
|
|
import { AspectRatio } from "@/components/ui/aspect-ratio";
|
|
import { Button } from "@/components/ui/button";
|
|
import {
|
|
Dialog,
|
|
DialogContent,
|
|
DialogHeader,
|
|
DialogTitle,
|
|
} from "@/components/ui/dialog";
|
|
|
|
export interface HeroContactProps {
|
|
className?: string;
|
|
/** برچسب بالای عنوان (مثلاً نام شرکت) */
|
|
eyebrow?: string;
|
|
/** عنوان اصلی - فقط یک h1 در صفحه */
|
|
heading: string;
|
|
/** توضیح زیر عنوان */
|
|
description: string;
|
|
/** متن دکمه اصلی (مثلاً «فرم تماس») */
|
|
ctaLabel?: string;
|
|
/** آدرس اسکرول به فرم (مثلاً #contact-form) */
|
|
ctaHref?: string;
|
|
/** مسیر تصویر هیرو (مثلاً /assets/contact-us/contact-us.jpg) */
|
|
imageSrc?: string;
|
|
/** متن جایگزین تصویر */
|
|
imageAlt?: string;
|
|
/** متن دکمه ویدیو (اختیاری - در صورت خالی بودن دکمه ویدیو نمایش داده نمیشود) */
|
|
videoLabel?: string;
|
|
/** آیدی ویدیو یوتیوب برای embed (اختیاری) */
|
|
videoId?: string;
|
|
}
|
|
|
|
const HeroContact = ({
|
|
className,
|
|
eyebrow,
|
|
heading,
|
|
description,
|
|
ctaLabel = "فرم تماس",
|
|
ctaHref = "#contact-form",
|
|
imageSrc,
|
|
imageAlt = "تماس با ما",
|
|
videoLabel,
|
|
videoId,
|
|
}: HeroContactProps) => {
|
|
const [isVideoOpen, setIsVideoOpen] = useState(false);
|
|
|
|
const handleCtaClick = (e: React.MouseEvent) => {
|
|
if (ctaHref.startsWith("#")) {
|
|
e.preventDefault();
|
|
const el = document.getElementById(ctaHref.slice(1));
|
|
el?.scrollIntoView({ behavior: "smooth" });
|
|
}
|
|
};
|
|
|
|
return (
|
|
<Fragment>
|
|
<section
|
|
className={cn(
|
|
"flex min-h-[60vh] flex-col justify-center pt-28 pb-16 md:pt-36 md:pb-24",
|
|
className
|
|
)}
|
|
aria-labelledby="hero-contact-heading"
|
|
>
|
|
<div className="container mx-auto w-full max-w-7xl px-4 md:px-6">
|
|
<div className="grid grid-cols-1 items-center justify-items-center gap-10 lg:grid-cols-2 lg:justify-items-stretch">
|
|
<div className="flex w-full max-w-xl flex-col gap-6 lg:max-w-[40rem]">
|
|
{eyebrow && (
|
|
<p className="text-caption font-medium tracking-wider text-muted-foreground uppercase">
|
|
{eyebrow}
|
|
</p>
|
|
)}
|
|
<div className="flex flex-col gap-6 text-center lg:text-right">
|
|
<h1
|
|
id="hero-contact-heading"
|
|
className="text-heading-1 font-bold leading-tight text-foreground"
|
|
>
|
|
{heading}
|
|
</h1>
|
|
<p className="text-body text-balance text-muted-foreground">
|
|
{description}
|
|
</p>
|
|
</div>
|
|
<div className="flex flex-wrap justify-center gap-4 py-4 lg:justify-start">
|
|
<Button
|
|
asChild
|
|
className="h-fit w-fit rounded-sm px-5 py-3.5 text-body-sm font-medium tracking-wider uppercase text-foreground"
|
|
>
|
|
<a
|
|
href={ctaHref}
|
|
onClick={ctaHref.startsWith("#") ? handleCtaClick : undefined}
|
|
className="inline-flex items-center justify-center"
|
|
>
|
|
<span className="text-inherit">{ctaLabel}</span>
|
|
</a>
|
|
</Button>
|
|
{videoLabel && videoId && (
|
|
<Button
|
|
type="button"
|
|
variant="ghost"
|
|
onClick={() => setIsVideoOpen(true)}
|
|
className="flex h-fit w-fit flex-nowrap items-center gap-2 rounded-sm bg-transparent px-5 py-3.5 text-body-sm font-medium tracking-wider uppercase text-foreground"
|
|
>
|
|
<Play className="h-4 w-4 fill-foreground" aria-hidden />
|
|
<span>{videoLabel}</span>
|
|
</Button>
|
|
)}
|
|
</div>
|
|
</div>
|
|
<div className="flex w-full justify-center">
|
|
{imageSrc ? (
|
|
<div className="relative mx-auto aspect-[4/3] w-full max-w-[25rem] overflow-hidden rounded-[35px]">
|
|
<img
|
|
src={imageSrc}
|
|
alt={imageAlt}
|
|
className="size-full object-cover object-center"
|
|
/>
|
|
</div>
|
|
) : (
|
|
<div className="relative mx-auto aspect-[0.789340102/1] w-full max-w-[25rem]">
|
|
<div className="absolute bottom-0 left-0 z-30 w-[63%]">
|
|
<AspectRatio
|
|
ratio={0.724137931 / 1}
|
|
className="overflow-hidden rounded-lg"
|
|
>
|
|
<img
|
|
src="https://deifkwefumgah.cloudfront.net/shadcnblocks/block/placeholder-1.svg"
|
|
alt=""
|
|
className="size-full object-cover object-center"
|
|
/>
|
|
</AspectRatio>
|
|
</div>
|
|
<div className="absolute top-1/2 left-1/2 z-20 w-[63%] -translate-x-1/2 -translate-y-1/2">
|
|
<AspectRatio
|
|
ratio={0.724137931 / 1}
|
|
className="overflow-hidden rounded-lg"
|
|
>
|
|
<img
|
|
src="https://deifkwefumgah.cloudfront.net/shadcnblocks/block/placeholder-dark-1.svg"
|
|
alt=""
|
|
className="size-full object-cover object-center"
|
|
/>
|
|
</AspectRatio>
|
|
</div>
|
|
<div className="absolute top-0 right-0 z-10 w-[63%]">
|
|
<AspectRatio
|
|
ratio={0.724137931 / 1}
|
|
className="overflow-hidden rounded-lg"
|
|
>
|
|
<img
|
|
src="https://deifkwefumgah.cloudfront.net/shadcnblocks/block/placeholder-1.svg"
|
|
alt=""
|
|
className="size-full object-cover object-center"
|
|
/>
|
|
</AspectRatio>
|
|
</div>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
{videoId && (
|
|
<Dialog open={isVideoOpen} onOpenChange={setIsVideoOpen}>
|
|
<DialogContent className="sm:max-w-[800px]" dir="rtl">
|
|
<DialogHeader>
|
|
<DialogTitle>ویدیو معرفی</DialogTitle>
|
|
</DialogHeader>
|
|
<div className="aspect-video">
|
|
<iframe
|
|
className="h-full w-full"
|
|
src={`https://www.youtube.com/embed/${videoId}`}
|
|
title="ویدیو معرفی"
|
|
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
|
allowFullScreen
|
|
/>
|
|
</div>
|
|
</DialogContent>
|
|
</Dialog>
|
|
)}
|
|
</Fragment>
|
|
);
|
|
};
|
|
|
|
export { HeroContact };
|