build
This commit is contained in:
parent
ce24e44b0e
commit
312ab2ca0b
|
|
@ -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};
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -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})}));
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -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};
|
||||
|
|
@ -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};
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -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};
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
);
|
||||
};
|
||||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
52
src/main.tsx
52
src/main.tsx
|
|
@ -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" },
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
@ -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>
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"],
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
|
|||
Loading…
Reference in New Issue