This commit is contained in:
Kakabay 2025-01-30 18:11:01 +05:00
parent ce24e44b0e
commit 312ab2ca0b
30 changed files with 370 additions and 378 deletions

1
dist/assets/about-CR3bOZS3.js vendored Normal file
View File

@ -0,0 +1 @@
import{j as s,f as o,C as t,A as a,g as e,h as r,i as u,k as i}from"./ui-library-BWmJzXiX.js";import"./react-vendor-DnK_KZAP.js";import{u as x}from"./use-scroll-top-DE9Ps7OH.js";function l(){return x(),s.jsxs("div",{className:o(""),children:[s.jsx(t,{title:"О выставке"}),s.jsx(a,{}),s.jsx(e,{}),s.jsx(r,{}),s.jsx(u,{}),s.jsx(i,{})]})}export{l as default};

1
dist/assets/b2b-Bv9LWoQb.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{r as j,j as e,C as d,t as b,s as h,m as f,q as o,l as y,n,o as l,p as m,B as g,L as S,v as _}from"./ui-library-BWmJzXiX.js";import{a as v}from"./react-vendor-DnK_KZAP.js";import{R as F,a as p}from"./radio-group-JZueQgsm.js";import{z as a,t as N}from"./index-XsVNdJkE.js";import{p as w}from"./service-BkBmsZj9.js";import{u as C}from"./use-scroll-top-DE9Ps7OH.js";const R=a.object({company_name:a.string().min(3,{message:"Название компании должно быть не менее 3 символов"}),rep_name:a.string().min(3,{message:"Имя представителя должно быть не менее 3 символов"}),job_title:a.string().min(3,{message:"Должность должна быть не менее 3 символов"}),country:a.string().min(3,{message:"Название страны должно быть не менее 3 символов"}),email:a.string().email({message:"Укажите корректный email"}),phone:a.string().min(8,{message:"Номер телефона должен быть не менее 8 символов"}),website:a.string().optional(),visa_support:a.string().optional()}),V={company_name:"",rep_name:"",job_title:"",country:"",email:"",phone:"",website:"",visa_support:""};function P(){C();const[c,x]=v.useState(!1),s=j({resolver:N(R),defaultValues:V}),u=async t=>{try{await w(t)&&x(!0)}catch(i){console.error("POST sponsor error",i)}},{errors:r}=s.formState;return e.jsxs("div",{children:[e.jsx(d,{title:"Стать спонсором"}),e.jsx(b,{children:!c&&e.jsx(h,{...s,children:e.jsxs(f.form,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:"max-w-[828px] mx-auto px-5 md:mt-20 mt-10 mb-20 md:mb-[120px] flex flex-col gap-8",onSubmit:s.handleSubmit(u),children:[e.jsx(o,{label:"Название компании/организации",name:"company_name",control:s.control,error:r.company_name}),e.jsx(o,{label:"Имя представителя",name:"rep_name",control:s.control,error:r.rep_name}),e.jsx(o,{label:"Название должности/позиция",name:"job_title",control:s.control,error:r.job_title}),e.jsx(o,{label:"Страна",name:"country",control:s.control,error:r.country}),e.jsx(o,{label:"E-mail адрес",name:"email",control:s.control,error:r.email}),e.jsx(o,{label:"Номер телефона",name:"phone",control:s.control,error:r.phone}),e.jsx(o,{label:"Вебсайт",name:"website",control:s.control}),e.jsx(y,{control:s.control,name:"visa_support",render:({field:t})=>e.jsxs(n,{className:"space-y-5",children:[e.jsx(l,{className:"text-xl",children:"Визовая поддержка:"}),e.jsx(m,{children:e.jsxs(F,{onValueChange:t.onChange,defaultValue:t.value,className:"flex flex-col space-y-4 ml-3",children:[e.jsxs(n,{className:"flex items-center space-x-5 space-y-0",children:[e.jsx(m,{children:e.jsx(p,{value:"yes",checked:t.value==="yes"})}),e.jsx(l,{className:"text-base",children:"Да"})]}),e.jsxs(n,{className:"flex items-center space-x-5 space-y-0 ",children:[e.jsx(m,{children:e.jsx(p,{value:"no",checked:t.value==="no"})}),e.jsx(l,{className:"text-base",children:"Нет"})]})]})})]})}),e.jsx(g,{disabled:s.formState.isSubmitting,className:"mt-5",children:s.formState.isSubmitting?e.jsx(S,{className:"animate-spin"}):"Отправить"})]})})}),c&&e.jsx(_,{delay:.3})]})}export{P as default};

1
dist/assets/contacts-DM0y5atr.js vendored Normal file
View File

@ -0,0 +1 @@
import{r as x,j as s,f as d,s as h,q as l,B as u,K as p,M as g}from"./ui-library-BWmJzXiX.js";import{a as f}from"./react-vendor-DnK_KZAP.js";import{z as a,t as j}from"./index-XsVNdJkE.js";import{b}from"./service-BkBmsZj9.js";import{u as N}from"./use-scroll-top-DE9Ps7OH.js";const v=a.object({name:a.string().min(2,"error"),email:a.string().email(),phone:a.string().min(8,"error"),company:a.string().min(2,"error"),msg:a.string().min(5,"error")}),C={name:"",email:"",phone:"",company:"",msg:""},w=({className:n})=>{const[c,o]=f.useState(!1),e=x({resolver:j(v),defaultValues:C});async function m(i){try{const t=await b(i);o(t)}catch(t){console.error("POST contact",t)}}const{errors:r}=e.formState;return s.jsx("div",{className:d("bg-primary rounded-[8px] py-8 px-6 ",n),children:s.jsx(h,{...e,children:s.jsxs("form",{onSubmit:e.handleSubmit(m),children:[s.jsx("h2",{className:"h2 !text-on_primary lg:mb-8 mb-6",children:"Связаться с нами"}),s.jsxs("div",{className:"flex flex-col gap-8",children:[s.jsx(l,{onPrimary:!0,name:"name",control:e.control,label:"Имя",error:r.name}),s.jsxs("div",{className:"flex flex-col lg:flex-row gap-6",children:[s.jsx(l,{onPrimary:!0,name:"email",control:e.control,label:"E-mail",error:r.email}),s.jsx(l,{onPrimary:!0,name:"phone",control:e.control,label:"Телефон",error:r.phone})]}),s.jsx(l,{onPrimary:!0,name:"company",control:e.control,label:"Название компании",error:r.name}),s.jsx(l,{onPrimary:!0,textArea:!0,name:"msg",label:"Сообщение",control:e.control,error:r.msg}),s.jsx(u,{disabled:e.formState.isSubmitting||c,className:"w-full h-12 overflow-hidden",variant:"secondary",children:c?"Форма отправлена":e.formState.isSubmitting?s.jsx(p,{className:"animate-spin text-white"}):"Отправить"})]})]})})})};function F(){return N(),s.jsxs("div",{className:"flex flex-col gap-20 pt-10 md:pt-20",children:[s.jsx(g,{children:s.jsxs("section",{className:"grid grid-cols-1 lg:grid-cols-2 gap-20 lg:gap-6",children:[s.jsx(w,{}),s.jsxs("div",{className:"p-6 bg-bg_surface_container rounded-[8px]",children:[s.jsx("h2",{className:"h2 mb-10 xl:mb-8",children:"Контакты"}),s.jsxs("div",{className:"flex flex-col gap-20",children:[s.jsxs("div",{className:"flex items-center gap-6",children:[s.jsx("img",{src:"/contacts/map.svg",alt:"address"}),s.jsxs("div",{children:[s.jsx("h3",{className:"text-xl mb-2",children:"Адрес офиса:"}),s.jsx("address",{className:"text-base normal not-italic",children:"744000, г. Ашхабад, просп. Битарап Туркменистан, 183"})]})]}),s.jsxs("div",{className:"flex items-center gap-6",children:[s.jsx("img",{src:"/contacts/phone.svg",alt:"phone"}),s.jsxs("div",{children:[s.jsx("h3",{className:"text-xl mb-2",children:"Телефон:"}),s.jsx("h4",{className:"text-base normal",children:"+99371871812; 99363719588"})]})]}),s.jsxs("div",{className:"flex items-center gap-6",children:[s.jsx("img",{src:"/contacts/fax.svg",alt:"fax"}),s.jsxs("div",{children:[s.jsx("h3",{className:"text-xl mb-2",children:"Факс:"}),s.jsx("h4",{className:"text-base normal",children:"+99312454111"})]})]}),s.jsxs("div",{className:"flex items-center gap-6",children:[s.jsx("img",{src:"/contacts/email.svg",alt:"email"}),s.jsxs("div",{children:[s.jsx("h3",{className:"text-xl mb-2",children:"E-mail:"}),s.jsx("h4",{className:"text-base normal",children:"contact@turkmenexpo.com"})]})]})]})]})]})}),s.jsx("section",{className:"relative w-full h-[300px] sm:h-[350px] md:h-[400px] lg:h-[600px]",children:s.jsx("iframe",{src:"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d1443.0869986358682!2d58.35620779177324!3d37.921200202365405!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3f7001fd7afd2a95%3A0x9ce9dca95ea4b87e!2z0JDQstC40LDQutCw0YHRgdCwINCw0LLQuNCw0LrQvtC80L_QsNC90LjQuCDCq9CR0LXQu9Cw0LLQuNCwwrsg0LIg0KLRg9GA0LrQvNC10L3QuNGB0YLQsNC90LU!5e0!3m2!1sru!2sru!4v1738063695919!5m2!1sru!2sru",className:"absolute inset-0 w-full h-full ",style:{border:0},allowFullScreen:!0,loading:"lazy"})})]})}export{F as default};

1
dist/assets/home-GYWvcPlt.js vendored Normal file
View File

@ -0,0 +1 @@
import{j as e,a as s,b as o,c as m,d as a,e as x}from"./ui-library-BWmJzXiX.js";import"./react-vendor-DnK_KZAP.js";function j(){return e.jsxs("div",{className:"flex flex-col gap-20",children:[e.jsx(s,{}),e.jsx(o,{}),e.jsx(m,{}),e.jsx(a,{}),e.jsx(x,{})]})}export{j as default};

1
dist/assets/index-CJjZ1ahI.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

6
dist/assets/index-XsVNdJkE.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
dist/assets/index-rNdPW79j.js vendored Normal file
View File

@ -0,0 +1,2 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/home-GYWvcPlt.js","assets/ui-library-BWmJzXiX.js","assets/react-vendor-DnK_KZAP.js","assets/about-CR3bOZS3.js","assets/use-scroll-top-DE9Ps7OH.js","assets/b2b-Bv9LWoQb.js","assets/index-XsVNdJkE.js","assets/radio-group-JZueQgsm.js","assets/become-sponsor-DaDg_Rg4.js","assets/service-BkBmsZj9.js","assets/stend-form-Bh5slp0V.js","assets/contacts-DM0y5atr.js"])))=>i.map(i=>d[i]);
import{j as o,H as R,F as j}from"./ui-library-BWmJzXiX.js";import{f as P,O as v,a as c,g,h as O}from"./react-vendor-DnK_KZAP.js";(function(){const u=document.createElement("link").relList;if(u&&u.supports&&u.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))p(e);new MutationObserver(e=>{for(const r of e)if(r.type==="childList")for(const t of r.addedNodes)t.tagName==="LINK"&&t.rel==="modulepreload"&&p(t)}).observe(document,{childList:!0,subtree:!0});function d(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?r.credentials="include":e.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function p(e){if(e.ep)return;e.ep=!0;const r=d(e);fetch(e.href,r)}})();const L="modulepreload",b=function(l){return"/"+l},h={},a=function(u,d,p){let e=Promise.resolve();if(d&&d.length>0){document.getElementsByTagName("link");const t=document.querySelector("meta[property=csp-nonce]"),n=(t==null?void 0:t.nonce)||(t==null?void 0:t.getAttribute("nonce"));e=Promise.allSettled(d.map(s=>{if(s=b(s),s in h)return;h[s]=!0;const m=s.endsWith(".css"),y=m?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${s}"]${y}`))return;const i=document.createElement("link");if(i.rel=m?"stylesheet":L,m||(i.as="script"),i.crossOrigin="",i.href=s,n&&i.setAttribute("nonce",n),document.head.appendChild(i),m)return new Promise((E,x)=>{i.addEventListener("load",E),i.addEventListener("error",()=>x(new Error(`Unable to preload CSS for ${s}`)))})}))}function r(t){const n=new Event("vite:preloadError",{cancelable:!0});if(n.payload=t,window.dispatchEvent(n),!n.defaultPrevented)throw t}return e.then(t=>{for(const n of t||[])n.status==="rejected"&&r(n.reason);return u().catch(r)})};var f={},_;function A(){if(_)return f;_=1;var l=P();return f.createRoot=l.createRoot,f.hydrateRoot=l.hydrateRoot,f}var S=A();function w(){return o.jsxs("main",{className:"flex flex-col min-h-screen",children:[o.jsx(R,{}),o.jsx("div",{className:"flex-auto",children:o.jsx(v,{})}),o.jsx(j,{})]})}const B=c.lazy(()=>a(()=>import("./home-GYWvcPlt.js"),__vite__mapDeps([0,1,2]))),I=c.lazy(()=>a(()=>import("./about-CR3bOZS3.js"),__vite__mapDeps([3,1,2,4]))),D=c.lazy(()=>a(()=>import("./b2b-Bv9LWoQb.js"),__vite__mapDeps([5,1,2,6,7,4]))),T=c.lazy(()=>a(()=>import("./become-sponsor-DaDg_Rg4.js"),__vite__mapDeps([8,1,2,7,6,9,4]))),q=c.lazy(()=>a(()=>import("./stend-form-Bh5slp0V.js"),__vite__mapDeps([10,1,2,7,6,9]))),z=c.lazy(()=>a(()=>import("./contacts-DM0y5atr.js"),__vite__mapDeps([11,1,2,6,9,4]))),C=g([{element:o.jsx(w,{}),path:"/",children:[{element:o.jsx(B,{}),path:""},{element:o.jsx(I,{}),path:"/about"},{element:o.jsx(D,{}),path:"/B2B-B2G"},{element:o.jsx(T,{}),path:"/become-sponsor"},{element:o.jsx(q,{}),path:"/stend-form"},{element:o.jsx(z,{}),path:"/contacts"}]}]);S.createRoot(document.getElementById("root")).render(o.jsx(c.StrictMode,{children:o.jsx(O,{router:C})}));

1
dist/assets/radio-group-JZueQgsm.js vendored Normal file

File diff suppressed because one or more lines are too long

53
dist/assets/react-vendor-DnK_KZAP.js vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/assets/service-BkBmsZj9.js vendored Normal file
View File

@ -0,0 +1 @@
import{a as s}from"./index-XsVNdJkE.js";const o="https://turkmentextile.turkmenexpo.com/app/api/v1",n=async t=>(await s.post(`${o}/book_stand_form`,t)).status===201,e=async t=>(await s.post(`${o}/become_sponsor_form`,t)).status===201,p=async t=>(await s.post(`${o}/contact_form`,t)).status===201;export{n as a,p as b,e as p};

1
dist/assets/stend-form-Bh5slp0V.js vendored Normal file
View File

@ -0,0 +1 @@
import{r as h,j as e,C as b,t as g,s as f,m as y,l as p,n as o,o as c,p as l,q as r,B as _,L as v,v as N}from"./ui-library-BWmJzXiX.js";import{a as x}from"./react-vendor-DnK_KZAP.js";import{R as u,a as i}from"./radio-group-JZueQgsm.js";import{z as a,t as S}from"./index-XsVNdJkE.js";import{a as F}from"./service-BkBmsZj9.js";const k=a.object({space_package:a.string(),company_name:a.string().min(3,{message:"Название компании должно быть не менее 3 символов"}),rep_name:a.string().min(3,{message:"Имя представителя должно быть не менее 3 символов"}),job_title:a.string().min(3,{message:"Должность должна быть не менее 3 символов"}),participants_number:a.preprocess(m=>Number(m),a.number().min(1,"Укажите количество участников")),country:a.string().min(3,{message:"Название страны должно быть не менее 3 символов"}),email:a.string().email({message:"Укажите корректный email"}),phone:a.string().min(8,{message:"Номер телефона должен быть не менее 8 символов"}),website:a.string().optional(),visa_support:a.string().optional()}),w={space_package:"space",company_name:"",rep_name:"",job_title:"",participants_number:1,country:"",email:"",phone:"",website:"",visa_support:""};function G(){const[m,j]=x.useState(!1),s=h({resolver:S(k),defaultValues:w}),d=async t=>{await F(t)&&j(!0)};x.useEffect(()=>{window.scrollTo({behavior:"smooth",top:0})},[status]);const{errors:n}=s.formState;return e.jsxs("div",{children:[e.jsx(b,{title:"Забронировать стенд"}),e.jsx(g,{children:!m&&e.jsx(f,{...s,children:e.jsxs(y.form,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:"max-w-[828px] px-5 mx-auto mt-20 mb-[120px] flex flex-col gap-8",onSubmit:s.handleSubmit(d),children:[e.jsx(p,{control:s.control,name:"space_package",render:({field:t})=>e.jsxs(o,{className:"space-y-5",children:[e.jsx(c,{className:"text-xl",children:"Выберите один из вариантов:"}),e.jsx(l,{children:e.jsxs(u,{onValueChange:t.onChange,defaultValue:t.value,className:"flex flex-col space-y-4 ml-3",children:[e.jsxs(o,{className:"flex items-center space-x-5 space-y-0",children:[e.jsx(l,{children:e.jsx(i,{value:"space",checked:t.value==="space"})}),e.jsx(c,{className:"text-base",children:"Только стенд"})]}),e.jsxs(o,{className:"flex items-center space-x-5 space-y-0",children:[e.jsx(l,{children:e.jsx(i,{value:"package",checked:t.value==="package"})}),e.jsx(c,{className:"text-base",children:"Комплексное предложение"})]})]})})]})}),e.jsx(r,{label:"Название компании/организации",name:"company_name",control:s.control,error:n.company_name}),e.jsx(r,{label:"Имя представителя",name:"rep_name",control:s.control,error:n.rep_name}),e.jsx(r,{label:"Название должности/позиция",name:"job_title",control:s.control,error:n.job_title}),e.jsx(r,{label:"Количество участников",type:"number",name:"participants_number",control:s.control,error:n.participants_number}),e.jsx(r,{label:"Страна",name:"country",control:s.control,error:n.country}),e.jsx(r,{label:"E-mail адрес",name:"email",control:s.control,error:n.email}),e.jsx(r,{label:"Номер телефона",name:"phone",control:s.control,error:n.phone}),e.jsx(r,{label:"Вебсайт",name:"website",control:s.control}),e.jsx(p,{control:s.control,name:"visa_support",render:({field:t})=>e.jsxs(o,{className:"space-y-5",children:[e.jsx(c,{className:"text-xl",children:"Визовая поддержка:"}),e.jsx(l,{children:e.jsxs(u,{onValueChange:t.onChange,defaultValue:t.value,className:"flex flex-col space-y-4 ml-3",children:[e.jsxs(o,{className:"flex items-center space-x-5 space-y-0",children:[e.jsx(l,{children:e.jsx(i,{value:"yes",checked:t.value==="yes"})}),e.jsx(c,{className:"text-base",children:"Да"})]}),e.jsxs(o,{className:"flex items-center space-x-5 space-y-0 ",children:[e.jsx(l,{children:e.jsx(i,{value:"no",checked:t.value==="no"})}),e.jsx(c,{className:"text-base",children:"Нет"})]})]})})]})}),e.jsx(_,{disabled:s.formState.isSubmitting,className:"mt-5",children:s.formState.isSubmitting?e.jsx(v,{className:"animate-spin"}):"Отправить"})]})})}),m&&e.jsx(N,{delay:.3})]})}export{G as default};

116
dist/assets/ui-library-BWmJzXiX.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{a as r}from"./react-vendor-DnK_KZAP.js";const t=o=>{r.useEffect(()=>{window.scrollTo({behavior:"smooth",top:0})},[o])};export{t as u};

6
dist/index.html vendored
View File

@ -5,8 +5,10 @@
<link rel="icon" type="image/svg+xml" href="/logo-icon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Turkmen Textile</title>
<script type="module" crossorigin src="/assets/index-D0qfKxFm.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-hJDObhN5.css">
<script type="module" crossorigin src="/assets/index-rNdPW79j.js"></script>
<link rel="modulepreload" crossorigin href="/assets/react-vendor-DnK_KZAP.js">
<link rel="modulepreload" crossorigin href="/assets/ui-library-BWmJzXiX.js">
<link rel="stylesheet" crossorigin href="/assets/index-CJjZ1ahI.css">
</head>
<body>
<div id="root"></div>

View File

@ -8,7 +8,7 @@ import {
} from "../ui/sheet";
import { Link } from "react-router-dom";
import { Button } from "../ui/button";
import { navData2 } from "./header";
import { navData, navData2 } from "./header";
interface Props {
className?: string;
@ -21,9 +21,9 @@ export const Burger: FC<Props> = () => {
<Sheet onOpenChange={() => setOpen(!open)} open={open}>
<SheetTrigger>
<div className="flex flex-col gap-1 lg:hidden items-center justify-center size-10">
<div className="w-[18px] h-0.5 bg-reverse_primary rounded-[2px]" />
<div className="w-[18px] h-0.5 bg-reverse_primary rounded-[2px]" />
<div className="w-[18px] h-0.5 bg-reverse_primary rounded-[2px]" />
<div className="w-[18px] h-0.5 bg-white rounded-[2px]" />
<div className="w-[18px] h-0.5 bg-white rounded-[2px]" />
<div className="w-[18px] h-0.5 bg-white rounded-[2px]" />
</div>
</SheetTrigger>
@ -50,10 +50,10 @@ export const Burger: FC<Props> = () => {
<hr className="border-slate-500/20 my-8" />
<div className="flex flex-col gap-6">
{navData2.map((item) => (
{navData.concat(navData2).map((item) => (
<Link
onClick={() => setOpen(false)}
className="h-10 text-on_surface "
className="h-10 text-on_surface"
key={item.title}
to={item.link}
>

View File

@ -0,0 +1,123 @@
import { Container } from "@/components/layout";
import { FC } from "react";
interface Props {
className?: string;
}
export const AboutInfo: FC<Props> = () => {
return (
<Container className="flex flex-col md:my-20 my-10 gap-16">
<div className="flex flex-col gap-6">
<h3 className="h2">Выставка-ярмарка «TurkmenTextile Expo 2025» </h3>
<p className="p">
Глобальная выставка и ярмарка текстиля и моды, которая объединит
мировых лидеров отрасли, инновационных производителей и творческих
дизайнеров. Наша миссия укрепить позиции Туркменистана как ключевого
центра текстильной и модной индустрии. Выставка станет платформой для
изучения устойчивых практик, современных технологий и новых
дизайнерских решений, вдохновляя на развитие индустрии.{" "}
</p>
</div>
<div className="flex flex-col gap-6">
<h3 className="h2">Перспективы</h3>
<h4 className="p">
TurkmenTextile Expo-2025 открывает широкие перспективы для участников:
</h4>
<ol type="1" className="list-decimal pl-8 flex flex-col gap-3 p">
<li>
Расширение деловых связей уникальная возможность для B2B и
B2G-встреч, заключения торговых соглашений и установления
стратегических партнёрств.
</li>
<li>
Доступ к инновациям знакомство с передовыми технологиями
текстильного производства, экологичными материалами и трендами
устойчивого дизайна.
</li>
<li>
Повышение экспортного потенциала участие в форумах и семинарах,
посвящённых продвижению продукции на новые рынки.
</li>
<li>
Обучение и развитие мастер-классы и лекции от ведущих мировых
экспертов помогут участникам углубить знания и освоить современные
подходы в области текстильной индустрии.
</li>
<li>
Культурный обмен возможность продемонстрировать богатое
текстильное наследие Туркменистана и вдохновиться культурными
традициями других стран.
</li>
</ol>
</div>
<div className="flex flex-col gap-6">
<h3 className="h2">Направления</h3>
<h4 className="p">
Выставка охватывает ключевые аспекты текстильной и модной индустрии,
включая:
</h4>
<ul className="list-disc pl-8 flex flex-col gap-3 p">
<li>
Традиционный текстиль: экспозиции, шёлковым изделиям и ремесленным
техникам Туркменистана.
</li>
<li>
Инновационные материалы и технологии: зоны, где демонстрируются
устойчивые материалы, 3D-ткацкие технологии и экологически чистые
красители.
</li>
<li>
Модные показы: ежедневные подиумные шоу с участием местных и
международных дизайнеров, включая зарубежных модельеров.
</li>
<li>
Маркетплейс для переговоров: пространство для встреч между
экспортёрами и импортёрами.
</li>
<li>
Оборудование для текстильной промышленности: современные технологии
и машины для повышения эффективности и конкурентоспособности.
</li>
<li>
Образовательные зоны: интерактивные экспозиции и семинары на тему
устойчивости, дизайна и переработки.
</li>
</ul>
<p className="text-18">
Участники смогут обсудить современные технологии, лучшие практики и
эффективные стратегии для устойчивого бизнеса.
</p>
</div>
<div className="flex flex-col gap-6">
<h3 className="h2">Партнёрство и спонсорство</h3>
<h4 className="p">
TurkmenTextile Expo-2025 приглашает к сотрудничеству международные
организации, ассоциации и бренды для продвижения своих продуктов и
услуг. Партнёры получат:
</h4>
<ul className="list-disc pl-8 flex flex-col gap-3 p">
<li>
Признание на международной арене участие в масштабном событии,
привлекающем ведущих игроков текстильной и модной индустрий.
</li>
<li>
Рекламные возможности интеграция бренда в маркетинговую кампанию
выставки, включая digital и офлайн-каналы.
</li>
<li>
Вклад в развитие индустрии поддержка инноваций, устойчивых практик
и культурного наследия.
</li>
</ul>
</div>
</Container>
);
};

View File

@ -2,3 +2,4 @@ export { AboutThemes } from "./about-themes";
export { AboutTime } from "./about-time";
export { AboutPlace } from "./about-place";
export { AboutBron } from "./about-bron";
export { AboutInfo } from "./about-info";

View File

@ -62,8 +62,8 @@ const SheetContent = React.forwardRef<
className={cn(sheetVariants({ side }), className)}
{...props}
>
<SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary">
<X className="h-4 w-4" />
<SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none disabled:pointer-events-none data-[state=open]:bg-secondary">
<X className="size-8" />
<span className="sr-only">Close</span>
</SheetPrimitive.Close>
{children}

View File

@ -1,39 +1,35 @@
import { StrictMode } from "react";
import { StrictMode, lazy } from "react";
import { createRoot } from "react-dom/client";
import "./index.css";
import App from "./App.tsx";
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import { About, B2b, BecomeSponsor, Contacts, Home, StendForm } from "./pages";
import App from "./App.tsx";
import "./index.css";
// Импортируем страницы с `webpackPrefetch`
const Home = lazy(() => import(/* webpackPrefetch: true */ "./pages/home"));
const About = lazy(() => import(/* webpackPrefetch: true */ "./pages/about"));
const B2b = lazy(() => import(/* webpackPrefetch: true */ "./pages/b2b"));
const BecomeSponsor = lazy(
() => import(/* webpackPrefetch: true */ "./pages/become-sponsor")
);
const StendForm = lazy(
() => import(/* webpackPrefetch: true */ "./pages/stend-form")
);
const Contacts = lazy(
() => import(/* webpackPrefetch: true */ "./pages/contacts")
);
// Настраиваем маршруты
const router = createBrowserRouter([
{
element: <App />,
path: "/",
children: [
{
element: <Home />,
path: "",
},
{
element: <About />,
path: "/about",
},
{
element: <B2b />,
path: "/B2B-B2G",
},
{
element: <BecomeSponsor />,
path: "/become-sponsor",
},
{
element: <StendForm />,
path: "/stend-form",
},
{
element: <Contacts />,
path: "/contacts",
},
{ element: <Home />, path: "" },
{ element: <About />, path: "/about" },
{ element: <B2b />, path: "/B2B-B2G" },
{ element: <BecomeSponsor />, path: "/become-sponsor" },
{ element: <StendForm />, path: "/stend-form" },
{ element: <Contacts />, path: "/contacts" },
],
},
]);

View File

@ -1,144 +1,26 @@
import { Container, Cover } from "@/components/layout";
import { Cover } from "@/components/layout";
import {
AboutBron,
AboutInfo,
AboutPlace,
AboutThemes,
AboutTime,
} from "@/components/shared";
import { useScrollTop } from "@/hooks/use-scroll-top";
import { cn } from "@/lib/utils";
import { FC } from "react";
interface Props {
className?: string;
}
export const About: FC<Props> = ({ className }) => {
export default function About() {
useScrollTop();
return (
<div className={cn("", className)}>
<div className={cn("")}>
<Cover title="О выставке" />
<Container className="flex flex-col md:my-20 my-10 gap-16">
<div className="flex flex-col gap-6">
<h3 className="h2">Выставка-ярмарка «TurkmenTextile Expo 2025» </h3>
<p className="p">
Глобальная выставка и ярмарка текстиля и моды, которая объединит
мировых лидеров отрасли, инновационных производителей и творческих
дизайнеров. Наша миссия укрепить позиции Туркменистана как
ключевого центра текстильной и модной индустрии. Выставка станет
платформой для изучения устойчивых практик, современных технологий и
новых дизайнерских решений, вдохновляя на развитие индустрии.{" "}
</p>
</div>
<div className="flex flex-col gap-6">
<h3 className="h2">Перспективы</h3>
<h4 className="p">
TurkmenTextile Expo-2025 открывает широкие перспективы для
участников:
</h4>
<ol type="1" className="list-decimal pl-8 flex flex-col gap-3 p">
<li>
Расширение деловых связей уникальная возможность для B2B и
B2G-встреч, заключения торговых соглашений и установления
стратегических партнёрств.
</li>
<li>
Доступ к инновациям знакомство с передовыми технологиями
текстильного производства, экологичными материалами и трендами
устойчивого дизайна.
</li>
<li>
Повышение экспортного потенциала участие в форумах и семинарах,
посвящённых продвижению продукции на новые рынки.
</li>
<li>
Обучение и развитие мастер-классы и лекции от ведущих мировых
экспертов помогут участникам углубить знания и освоить современные
подходы в области текстильной индустрии.
</li>
<li>
Культурный обмен возможность продемонстрировать богатое
текстильное наследие Туркменистана и вдохновиться культурными
традициями других стран.
</li>
</ol>
</div>
<div className="flex flex-col gap-6">
<h3 className="h2">Направления</h3>
<h4 className="p">
Выставка охватывает ключевые аспекты текстильной и модной индустрии,
включая:
</h4>
<ul className="list-disc pl-8 flex flex-col gap-3 p">
<li>
Традиционный текстиль: экспозиции, шёлковым изделиям и ремесленным
техникам Туркменистана.
</li>
<li>
Инновационные материалы и технологии: зоны, где демонстрируются
устойчивые материалы, 3D-ткацкие технологии и экологически чистые
красители.
</li>
<li>
Модные показы: ежедневные подиумные шоу с участием местных и
международных дизайнеров, включая зарубежных модельеров.
</li>
<li>
Маркетплейс для переговоров: пространство для встреч между
экспортёрами и импортёрами.
</li>
<li>
Оборудование для текстильной промышленности: современные
технологии и машины для повышения эффективности и
конкурентоспособности.
</li>
<li>
Образовательные зоны: интерактивные экспозиции и семинары на тему
устойчивости, дизайна и переработки.
</li>
</ul>
<p className="text-18">
Участники смогут обсудить современные технологии, лучшие практики и
эффективные стратегии для устойчивого бизнеса.
</p>
</div>
<div className="flex flex-col gap-6">
<h3 className="h2">Партнёрство и спонсорство</h3>
<h4 className="p">
TurkmenTextile Expo-2025 приглашает к сотрудничеству международные
организации, ассоциации и бренды для продвижения своих продуктов и
услуг. Партнёры получат:
</h4>
<ul className="list-disc pl-8 flex flex-col gap-3 p">
<li>
Признание на международной арене участие в масштабном событии,
привлекающем ведущих игроков текстильной и модной индустрий.
</li>
<li>
Рекламные возможности интеграция бренда в маркетинговую кампанию
выставки, включая digital и офлайн-каналы.
</li>
<li>
Вклад в развитие индустрии поддержка инноваций, устойчивых
практик и культурного наследия.
</li>
</ul>
</div>
</Container>
<AboutInfo />
<AboutThemes />
<AboutTime />
<AboutPlace />
<AboutBron />
</div>
);
};
}

View File

@ -2,13 +2,9 @@ import { Cover } from "@/components/layout";
import { B2bFormProgress } from "@/components/shared";
import { B2bForm } from "@/components/shared/forms/b2b-form";
import { useScrollTop } from "@/hooks/use-scroll-top";
import { FC, useState } from "react";
import { useState } from "react";
interface Props {
className?: string;
}
export const B2b: FC<Props> = () => {
export default function B2b() {
useScrollTop();
const [stage, setStage] = useState(1);
@ -30,4 +26,4 @@ export const B2b: FC<Props> = () => {
</div>
</div>
);
};
}

View File

@ -16,18 +16,14 @@ import {
SponsorFormType,
} from "@/lib/get-sponsor-form-details";
import { zodResolver } from "@hookform/resolvers/zod";
import { FC, useState } from "react";
import { useState } from "react";
import { useForm } from "react-hook-form";
import { Loader } from "lucide-react";
import { postSponsor } from "@/services/service";
import { useScrollTop } from "@/hooks/use-scroll-top";
import { Cover } from "@/components/layout";
interface Props {
className?: string;
}
export const BecomeSponsor: FC<Props> = ({ className }) => {
export default function BecomeSponsor() {
useScrollTop();
const [success, setSuccess] = useState(false);
@ -49,7 +45,7 @@ export const BecomeSponsor: FC<Props> = ({ className }) => {
const { errors } = form.formState;
return (
<div className={className}>
<div>
<Cover title="Стать спонсором" />
<AnimatePresence>
@ -155,4 +151,4 @@ export const BecomeSponsor: FC<Props> = ({ className }) => {
{success && <FormSuccesStatus delay={0.3} />}
</div>
);
};
}

View File

@ -1,13 +1,8 @@
import { Container } from "@/components/layout";
import { ContactsForm } from "@/components/shared/forms/contacts-form";
import { useScrollTop } from "@/hooks/use-scroll-top";
import { FC } from "react";
interface Props {
className?: string;
}
export const Contacts: FC<Props> = () => {
export default function Contacts() {
useScrollTop();
return (
@ -74,4 +69,4 @@ export const Contacts: FC<Props> = () => {
</section>
</div>
);
};
}

View File

@ -1,5 +1,3 @@
import { FC } from "react";
import {
HomeAbout,
HomeHero,
@ -8,7 +6,7 @@ import {
HomeTime,
} from "@/components/shared";
export const Home: FC = () => {
export default function Home() {
return (
<div className="flex flex-col gap-20">
<HomeHero />
@ -18,4 +16,4 @@ export const Home: FC = () => {
<HomeTime />
</div>
);
};
}

View File

@ -1,6 +0,0 @@
export { B2b } from "./b2b";
export { Home } from "./home";
export { About } from "./about";
export { BecomeSponsor } from "./become-sponsor";
export { StendForm } from "./stend-form";
export { Contacts } from "./contacts";

View File

@ -15,17 +15,13 @@ import {
StandFormType,
} from "@/lib/get-stend-form-details";
import { zodResolver } from "@hookform/resolvers/zod";
import { FC, useEffect, useState } from "react";
import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { Loader } from "lucide-react";
import { Cover } from "@/components/layout";
import { postStend } from "@/services/service";
interface Props {
className?: string;
}
export const StendForm: FC<Props> = ({ className }) => {
export default function StendForm() {
const [success, setSuccess] = useState(false);
const form = useForm<StandFormType>({
resolver: zodResolver(standFormSchema),
@ -45,7 +41,7 @@ export const StendForm: FC<Props> = ({ className }) => {
const { errors } = form.formState;
return (
<div className={className}>
<div>
<Cover title="Забронировать стенд" />
<AnimatePresence>
@ -202,4 +198,4 @@ export const StendForm: FC<Props> = ({ className }) => {
{success && <FormSuccesStatus delay={0.3} />}
</div>
);
};
}

View File

@ -13,8 +13,8 @@ export default defineConfig({
rollupOptions: {
output: {
manualChunks: {
"react-vendor": ["react", "react-dom", "react-router-dom"], // Вынос библиотеки React
"ui-library": ["@/components/shared"], // Отдельный чанк для UI-компонентов
"react-vendor": ["react", "react-dom", "react-router-dom"],
"ui-library": ["@/components/shared"],
},
},
},