This commit is contained in:
Batyr 2025-02-08 12:45:32 +05:00
parent eca0564f1a
commit 4655ecb77f
18 changed files with 244 additions and 91 deletions

View File

@ -11,6 +11,8 @@ import { useTranslate } from "@/hooks/use-translate";
export const Header: FC = () => {
const lang = useLangStore((state) => state.lang);
console.log(navData);
return (
<header>
<div className="h-12 hidden lg:flex bg-sur text-surface-bg items-center overflow-hidden">
@ -33,8 +35,9 @@ export const Header: FC = () => {
</Link>
) : (
<Menu
key={item.title}
color={"black"}
dropDownText={item.dropDownText!}
dropDownContent={item.dropDownContent}
title={item.title}
/>
)
@ -68,7 +71,8 @@ export const Header: FC = () => {
</Link>
) : (
<Menu
dropDownText={item.dropDownText!}
key={item.title}
dropDownContent={item.dropDownContent}
title={item.title}
color="white"
/>

View File

@ -36,7 +36,7 @@ export const AboutBron: FC<Props> = ({ className }) => {
{aboutBron[useTranslate(lang)].button1}
</Button>
</Link>
<Link to={"/become-sponsor"} className="w-full">
<Link to={"/B2B-B2GS"} className="w-full">
<Button className="bg-reverse_primary w-full hover:bg-reverse_primary/90 text-primary">
{aboutBron[useTranslate(lang)].button2}
</Button>

View File

@ -50,8 +50,8 @@ export const AboutInfo: FC<Props> = () => {
</ul>
</div>
<Link to="/become-sponsor">
<Button className="w-full">{t("main.button")}</Button>
<Link className="flex justify-center" to="/become-sponsor">
<Button>{t("main.button")}</Button>
</Link>
</Container>
);

View File

@ -14,7 +14,7 @@ export const AboutTime: FC<Props> = ({ className }) => {
const lang = useLangStore((state) => state.lang);
return (
<section
className={cn("bg-bg_surface_container py-10 md:py-[160px]", className)}
className={cn("bg-bg_surface_container py-10 md:py-[80px]", className)}
>
<Container>
<h2 className="h2 mb-6">{times[useTranslate(lang)].title}</h2>

View File

@ -12,12 +12,15 @@ import {
} from "@/lib/get-contacts-form-details";
import { postContact } from "@/services/service";
import { Loader2 } from "lucide-react";
import { useTranslation } from "react-i18next";
interface Props {
className?: string;
}
export const ContactsForm: FC<Props> = ({ className }) => {
const { t } = useTranslation("contacts");
const [success, setSuccess] = useState(false);
const form = useForm({
resolver: zodResolver(contactsSchema),
@ -40,14 +43,14 @@ export const ContactsForm: FC<Props> = ({ className }) => {
<div className={cn("bg-primary rounded-[8px] py-8 px-6 ", className)}>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)}>
<h2 className="h2 !text-on_primary lg:mb-8 mb-6">Связаться с нами</h2>
<h2 className="h2 !text-on_primary lg:mb-8 mb-6">{t("title")}</h2>
<div className="flex flex-col gap-8">
<Field
onPrimary
name="name"
control={form.control}
label="Имя"
label={t("name")}
error={errors.name}
/>
@ -56,14 +59,14 @@ export const ContactsForm: FC<Props> = ({ className }) => {
onPrimary
name="email"
control={form.control}
label="E-mail"
label="Email"
error={errors.email}
/>
<Field
onPrimary
name="phone"
control={form.control}
label="Телефон"
label={t("phone")}
error={errors.phone}
/>
</div>
@ -72,14 +75,14 @@ export const ContactsForm: FC<Props> = ({ className }) => {
onPrimary
name="company"
control={form.control}
label="Название компании"
label={t("company")}
error={errors.name}
/>
<Field
onPrimary
textArea
name="msg"
label="Сообщение"
label={t("message")}
control={form.control}
error={errors.msg}
/>
@ -89,11 +92,11 @@ export const ContactsForm: FC<Props> = ({ className }) => {
variant="secondary"
>
{success ? (
"Форма отправлена"
t("submitted")
) : form.formState.isSubmitting ? (
<Loader2 className="animate-spin text-white" />
) : (
"Отправить"
t("button")
)}
</Button>
</div>

View File

@ -41,7 +41,7 @@ export const SubscribeForm: FC<Props> = () => {
<div className="relative">
<input
{...form.register("email")}
placeholder="E-mail"
placeholder="Email"
className="input xl:w-[392px] lg:w-[320px] w-full"
/>
<span className="text-error absolute text-red-600 -bottom-6 text-sm left-0">

View File

@ -1,37 +1,59 @@
import { FC } from "react";
import { FC, useState } from "react";
import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover";
import { Chevron } from "./";
import { Link } from "react-router-dom";
interface Props {
className?: string;
dropDownText?: string;
title: string;
color?: string;
items?: {
title: string;
link: string;
blank: boolean;
onMenu?: VoidFunction;
dropDownContent?: {
text: string;
link?: string;
blank?: boolean;
}[];
}
export const Menu: FC<Props> = ({ title, dropDownText, color, items }) => {
export const Menu: FC<Props> = ({ title, dropDownContent, color, onMenu }) => {
const [isOpen, setIsOpen] = useState(false);
return (
<Popover>
<Popover open={isOpen} onOpenChange={() => setIsOpen(!isOpen)}>
<PopoverTrigger className="flex items-center gap-2">
{title}
<Chevron color={color} />
</PopoverTrigger>
<PopoverContent className="w-fit cursor-pointer bg-surface_container">
{dropDownText}
{items &&
items.map((item) => (
<Link key={item.title} target="_blank" to={item.link}>
{item.title}
</Link>
))}
<PopoverContent className="w-fit px-0 py-2 cursor-pointer bg-surface_container">
{dropDownContent &&
dropDownContent.map((item) =>
item.link ? (
<Link
onClick={() => setIsOpen(false)}
className="h-14 px-3 flex gap-3 items-center hover:bg-slate-300/50 transition-all"
key={item.text}
target={item.blank ? "_blank" : ""}
to={item.link}
>
{item.text}
{item.blank && <img src="/pdf.svg" />}
</Link>
) : (
<div
key={item.text}
className="h-14 px-3 flex items-center hover:bg-slate-300/50 transition-all"
onClick={() => {
setIsOpen(false);
onMenu?.();
}}
>
{item.text}
</div>
)
)}
</PopoverContent>
</Popover>
);

View File

@ -3,13 +3,13 @@ export const aboutBron = [
title: "Приглашение к участию",
p: `Министерство текстильной промышленности Туркменистана приглашает бизнес-сообщество со всего мира присоединиться к этому уникальному событию, которое станет важным шагом к укреплению позиций Туркменистана в международной экономической арене.`,
button1: "Забронировать стенд",
button2: "Стать спонсором",
button2: "B2B | B2G встречи",
},
{
title: "Invitation to Participate",
p: `Ministry of Textile Industry of Turkmenistan invites the global business community to join this unique event, which will be a significant step toward strengthening Turkmenistans position on the global economic stage`,
button1: "Book a stand",
button2: "Become a sponsor",
button2: "B2B | B2G meetings",
},
];

View File

@ -18,7 +18,7 @@ export const b2bStage1 = [
label: "Страна",
},
{
label: "E-mail адрес",
label: "Email адрес",
},
{
label: "Номер телефона",

View File

@ -5,27 +5,77 @@ export const navData = [
title: "Путеводитель",
link: "",
},
{
title: "Новости",
dropDown: true,
dropDownContent: [
{
text: "Новости",
link: "",
},
{ text: "Подписаться на новости" },
],
},
{
title: "Контакты",
link: "/contacts",
},
{
title: "Новости",
title: "О выставке",
dropDown: true,
dropDownText: "Подписаться на новости",
},
{
title: "О выставке",
link: "/about",
dropDownContent: [
{
text: "О выставке",
link: "/about",
},
{
text: "Медиа",
link: "",
},
],
},
{
title: "Посетителям",
link: "",
dropDown: true,
dropDownContent: [
{
text: "Почему стоит посетить?",
link: "",
blank: true,
},
{
text: "Список участников",
link: "",
blank: true,
},
{
text: "Путеводитель",
link: "https://turkmentextile.turkmenexpo.com/app/storage/app/media/travel_guide/Travel_guide_ru.pdf",
blank: true,
},
],
},
{
title: "Экспонентам",
link: "",
title: "Участникам",
dropdown: true,
dropDownContent: [
{
text: "Забронировать стенд",
link: "/stend-form",
},
{
text: "Почему стоить участвовать?",
link: "",
},
{
text: "Тематические разделы ",
link: "",
},
],
},
],
},
@ -33,7 +83,7 @@ export const navData = [
{
data: [
{
title: "Guide",
title: "Travel Guide",
link: "",
},
{
@ -44,20 +94,70 @@ export const navData = [
title: "News",
dropDown: true,
dropDownText: "Subscribe to the news",
dropDownContent: [
{ text: "News", link: "" },
{ text: "Subscribe to the news" },
],
},
{
title: "About exhibition",
link: "/about",
dropDown: true,
dropDownContent: [
{
text: "About exhibition",
link: "/about",
},
{
text: "Media",
link: "",
},
],
},
{
title: "To the Visitors",
link: "",
title: "Visitors",
dropDown: true,
dropDownContent: [
{
text: "Why visit?",
link: "",
},
{
text: "List of Participants",
link: "",
blank: true,
},
{
text: "Programme",
link: "",
blank: true,
},
{
text: "Travel Guide",
link: "https://turkmentextile.turkmenexpo.com/app/storage/app/media/travel_guide/Travel_guide_ru.pdf",
blank: true,
},
],
},
{
title: "To the Exhibitors",
link: "",
title: "Exhibitors",
dropDown: true,
dropDownContent: [
{
text: "Book a stand",
link: "/stend-form",
},
{
text: "Why exhibit?",
link: "",
},
{
text: "Thematic areas of the exhibition",
link: "",
},
],
},
],
},

View File

@ -10,19 +10,19 @@ export const homeAbout = [
data: [
{
nums: "10,000 m²",
text: "выставочной площади",
text: "Выставочной площади",
},
{
nums: "10000+",
text: "Посетители посетят выставку",
text: "Ожидаемых посетителей ",
},
{
nums: "100+",
text: "Экспоненты из более чем 30 стран",
text: "Экспонентов из более чем 30 стран",
},
{
nums: "80%",
text: "Участники принимают участие в принятии решений о закупках",
text: "Участников топ-менеджмента",
},
],
@ -38,19 +38,19 @@ export const homeAbout = [
data: [
{
nums: "10,000 m²",
text: "Of the exhibition area",
text: "Exhibition area",
},
{
nums: "10000+",
text: "Visitors and specialists attend the exhibition",
text: "Expected visitors ",
},
{
nums: "100+",
text: "More than 100 exhibitors from 30 countries ",
text: "Exhibitors from over 30 countries",
},
{
nums: "80%",
text: "Visitors are involved in procurement decisions",
text: "Participants are top-management",
},
],
button: "More about the exhibition",

View File

@ -37,7 +37,7 @@ export const btns = [
link: "/stend-form",
},
{
title: "Participants list",
title: "List of participants",
link: "/",
},
{

View File

@ -22,17 +22,16 @@ export const offersData = [
data: [
{
img: "/offer-2.png",
title: "Hotels; Transfers; Visas",
btnText: "Download travel guide",
text: `Regarding hotel accommodation, visa support,
transportation and excursion services you can check out the Travel guide`,
title: "Hotels, transfer, visas;",
btnText: "Download Travel Guide",
text: `For inquiries regarding hotel accommodations, visa support, transportation, and tour services, please refer to the travel guide;`,
link: "https://turkmentextile.turkmenexpo.com/app/storage/app/media/travel_guide/Travel_guide_ru.pdf",
},
{
img: "/offer-2.png",
title: "Explore the TurkmenTextile 2025 Exhibition Plan",
btnText: "Download Exhibition plan",
text: `How to choose the best location at the exhibition? A Prime spot increases your chances of attracting potential clients. `,
title: "Explore “TurkmenTextile Expo-2025” plan;",
btnText: "Download exhibition plan.",
text: `How to choose the best location at the exhibition? A prime spot increases your chances to attract potential clients;`,
link: "https://turkmentextile.turkmenexpo.com/app/storage/app/media/Floor%20plan/floor%20plan.pdf",
},
],

View File

@ -11,7 +11,7 @@ export const stendData = [
label_3: "Название должности/позиция",
number_of_participants: "Количество участников",
label_4: "Страна",
label_5: "E-mail адрес",
label_5: "Email адрес",
label_6: "Номер телефона",
label_7: "Вебсайт",
@ -23,18 +23,18 @@ export const stendData = [
},
{
cover: "Book your stand",
cover: "Book a stand:",
h2: "Select one of the options:",
radio: "Space Only",
radio_2: "Stand Package",
radio: "Stand space only",
radio_2: "Prefabricated stand",
label_1: "Company/Organization Name",
label_2: "Name of Representative",
label_3: "Job title/Position",
number_of_participants: "Number of the participants",
label_4: "Country",
label_5: "E-mail address",
label_5: "Email address",
label_6: "Phone number",
label_7: "Website",

View File

@ -0,0 +1,13 @@
{
"title": "Contact us",
"name": "Name",
"phone": "Phone",
"company": "Company name",
"message": "Message",
"button": "Send",
"title_2": "Contact details",
"address": "Address",
"venue": "744000, Ashgabat, Bitarap Turkmenistan ave., 183",
"submitted": "Your message is submitted"
}

View File

@ -0,0 +1,13 @@
{
"title": "Связать с нами",
"name": "Имя",
"phone": "Телефон:",
"company": "Название компании",
"message": "Сообщение",
"button": "Отправить",
"title_2": "Контакты",
"address": "Адрес:",
"venue": "744000, г. Ашхабад, просп. Битарап Туркменистан, 183",
"submitted": "Ваше письмо отправлено"
}

View File

@ -2,7 +2,7 @@
"venue": "Ашхабад, Туркменистан",
"guide": {
"title": "Guide"
"title": "Гид"
},
"contacts": {
@ -13,7 +13,7 @@
"news": {
"title": "Новости",
"item": "Пописаться на новости"
"item": ["Пописаться на новости"]
},
"": "",
@ -30,23 +30,28 @@
"title": "Почему стоит посетить",
"link": ""
},
{
"title": "Список участников",
"link": ""
},
{
"title": "Программа",
"link": ""
},
{
"title": "Список участников",
"link": ""
"title": "Петеводитель",
"link": "https://turkmentextile.turkmenexpo.com/app/storage/app/media/travel_guide/Travel_guide_ru.pdf",
"pdf": true
}
]
},
"exhibitors": {
"trigger": "Экспонентам"
"trigger": "Участникам"
},
"participants": {
"trigger": "Список участников",
"trigger": "Посетителям",
"items": [
{

View File

@ -1,10 +1,13 @@
import { Container } from "@/components/layout";
import { ContactsForm } from "@/components/shared/forms/contacts-form";
import { useScrollTop } from "@/hooks/use-scroll-top";
import { useTranslation } from "react-i18next";
export default function Contacts() {
useScrollTop();
const { t } = useTranslation("contacts");
return (
<div className={"flex flex-col gap-20 pt-10 md:pt-20"}>
<Container>
@ -12,16 +15,16 @@ export default function Contacts() {
<ContactsForm />
<div className="p-6 bg-bg_surface_container rounded-[8px]">
<h2 className="h2 mb-10 xl:mb-8">Контакты</h2>
<h2 className="h2 mb-10 xl:mb-8">{t("title_2")}</h2>
<div className="flex flex-col gap-20">
<div className="flex items-center gap-6">
<img src="/contacts/map.svg" alt="address" />
<div>
<h3 className="text-xl mb-2">Адрес офиса:</h3>
<h3 className="text-xl mb-2">{t("address")}</h3>
<address className="text-base normal not-italic">
744000, г. Ашхабад, просп. Битарап Туркменистан, 183
{t("venue")}
</address>
</div>
</div>
@ -29,27 +32,18 @@ export default function Contacts() {
<img src="/contacts/phone.svg" alt="phone" />
<div>
<h3 className="text-xl mb-2">Телефон:</h3>
<h3 className="text-xl mb-2">{t("phone")}</h3>
<h4 className="text-base normal">
+99371871812; 99363719588
</h4>
</div>
</div>
<div className="flex items-center gap-6">
<img src="/contacts/fax.svg" alt="fax" />
<div>
<h3 className="text-xl mb-2">Факс:</h3>
<h4 className="text-base normal">+99312454111</h4>
</div>
</div>
<div className="flex items-center gap-6">
<img src="/contacts/email.svg" alt="email" />
<div>
<h3 className="text-xl mb-2">E-mail:</h3>
<h3 className="text-xl mb-2">Email:</h3>
<h4 className="text-base normal">contact@turkmenexpo.com</h4>
</div>
</div>