fixes,meta tags
This commit is contained in:
+4
-5
@@ -3,13 +3,12 @@
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<!-- <meta name="keywords" content="интерактивные,тренажеры,эффективность,промышленность,обучение">
|
||||
<meta name="description" content="Создаем интерактивные тренажеры для промышленности и образования. Помогаем сократить затраты на обучение, повысить безопасность и производительность"> -->
|
||||
<meta name="keywords" content="интерактивные,тренажеры,эффективность,промышленность,обучение">
|
||||
<meta name="description" content="Создаем интерактивные тренажеры для промышленности и образования. Помогаем сократить затраты на обучение, повысить безопасность и производительность">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<!-- <meta property="og:title" content="Интерактивные тренажеры для промышленности и образования" />
|
||||
<meta property="og:image" content="" />
|
||||
<meta property="og:title" content="Интерактивные тренажеры для промышленности и образования" />
|
||||
<meta property="og:description" content="Создаем интерактивные тренажеры для промышленности и образования. Помогаем сократить затраты на обучение, повысить безопасность и производительность"/>
|
||||
<meta property="og:url" content="https://graff.training.ru"/> -->
|
||||
<meta property="og:url" content="https://graff.training.ru"/>
|
||||
<title>Интерактивные тренажеры для промышленности и образования</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -5,13 +5,13 @@ export function Footer() {
|
||||
return (
|
||||
<footer className="sm:grid xl:grid-cols-[2fr_1fr_1fr] sm:grid-cols-2 sm:max-xl:grid-rows-2">
|
||||
<div className="flex sm:items-center max-sm:flex-col sm:px-10 px-4 sm:py-9 py-4 border-t border-[#3D425C] gap-6 sm:max-xl:row-start-1 sm:max-xl:col-span-2">
|
||||
<Link to={'/'}>
|
||||
<Link to={'/'} className="outline-none">
|
||||
<LogoWithTextIcon className="h-[50px]" />
|
||||
</Link>
|
||||
<div className="flex flex-col gap-y-1">
|
||||
<Link
|
||||
to="https://graff.tech/privacypolicy"
|
||||
className="sm:font-medium flex gap-4 m-text"
|
||||
className="sm:font-medium flex gap-4 m-text outline-none"
|
||||
>
|
||||
Политика конфиденциальности <span>graff.tech</span>
|
||||
</Link>
|
||||
@@ -57,7 +57,7 @@ function Contact({
|
||||
to={
|
||||
type === 'email' ? `mailto:${text}` : `tel:${text.replace(' ', '')}`
|
||||
}
|
||||
className={'l-text ' + className}
|
||||
className={'l-text outline-none ' + className}
|
||||
>
|
||||
{text}
|
||||
</Link>
|
||||
|
||||
@@ -33,7 +33,7 @@ export function Header() {
|
||||
return (
|
||||
<header>
|
||||
<nav className="flex items-stretch justify-between border-b border-[#3D425C] lg:pl-10 pl-4 lg:min-h-[72px] min-h-16">
|
||||
<Link to={'/'} className="flex items-center">
|
||||
<Link to={'/'} className="flex items-center outline-none">
|
||||
<LogoIcon className="lg:hidden" />
|
||||
{width >= 1024 && <LogoWithTextIcon />}
|
||||
</Link>
|
||||
@@ -52,7 +52,7 @@ export function Header() {
|
||||
<button
|
||||
ref={menuBtnRef}
|
||||
onClick={() => setMenuOpen(prev => !prev)}
|
||||
className="px-6 py-5 min-[1350px]:hidden border-[#3D425C] max-sm:border-l"
|
||||
className="px-6 py-5 min-[1350px]:hidden border-[#3D425C] max-sm:border-l outline-none"
|
||||
>
|
||||
{!menuOpen ? <BurgerIcon /> : <CloseIcon />}
|
||||
</button>
|
||||
@@ -85,7 +85,7 @@ export function Header() {
|
||||
setModal(<ModalWithForm />);
|
||||
}}
|
||||
width="full"
|
||||
className="sm:hidden font-semibold btn-text rounded-none"
|
||||
className="sm:hidden font-semibold btn-text rounded-none outline-none"
|
||||
>
|
||||
Оставить заявку
|
||||
</Button>
|
||||
@@ -119,7 +119,7 @@ function ChooseLang({ currentLang }: { currentLang: 'RU' | 'EN' }) {
|
||||
<button
|
||||
onClick={() => setLang(currentLang)}
|
||||
className={
|
||||
'min-h-[72px] w-full h-full btn-text font-semibold bg-[#14161F] lg:hover:bg-[#3D425C] border active:bg-[#14161F] ' +
|
||||
'min-h-[72px] w-full h-full btn-text font-semibold bg-[#14161F] lg:hover:bg-[#3D425C] border active:bg-[#14161F] outline-none ' +
|
||||
(lang === currentLang
|
||||
? '[border-image:linear-gradient(to_right,#798FFF,#D375FF)_3]'
|
||||
: 'border-[#3D425C]')
|
||||
@@ -144,7 +144,7 @@ function LangToggler({ lang }: { lang: Lang }) {
|
||||
<button
|
||||
ref={langTogglerRef}
|
||||
onClick={() => setOpen(prev => !prev)}
|
||||
className="mx-6 h-full gap-x-1 items-center flex font-semibold btn-text"
|
||||
className="mx-6 h-full gap-x-1 items-center flex font-semibold btn-text outline-none"
|
||||
>
|
||||
{lang}
|
||||
<ArrowDownIcon />
|
||||
|
||||
@@ -9,49 +9,47 @@ import { getIcon } from '../../utils/getIcon';
|
||||
|
||||
export function Availables() {
|
||||
return (
|
||||
<div className="lg:py-[70px] lg:px-10 py-14 sm:px-6 px-4 overflow-hidden">
|
||||
<Title className="desktop-figma:mb-[77px] lg:mb-14 mb-6">
|
||||
<div className="lg:py-[70px] lg:px-10 py-14 sm:px-6 px-4 overflow-hidden sm:grid lg:grid-cols-12 max-lg:grid-cols-8 gap-x-4">
|
||||
<Title className="lg:mb-14 mb-6 lg:col-span-6 col-span-full">
|
||||
<span className="text-gradient text-wrap">Многопользовательский</span>
|
||||
<br />
|
||||
режим обучения
|
||||
</Title>
|
||||
<AppearanceHr className="max-sm:hidden" />
|
||||
<div className="flex max-lg:flex-col items-start lg:w-fit sm:pt-5">
|
||||
<MiniTitle text="возможности" />
|
||||
<AppearanceHr className="sm:hidden w-full mt-2" />
|
||||
<div className="sm:max-desktop-figma:mt-4 max-sm:mt-2">
|
||||
<div className="flex max-sm:flex-col max-sm:gap-y-2 lg:gap-x-4 sm:gap-x-3 sm:pb-5 pb-2 max-sm:pt-2">
|
||||
<MultiUserFeature
|
||||
type="processes"
|
||||
text="отработка производственных процессов, в которых участвует группа людей"
|
||||
/>
|
||||
<MultiUserFeature
|
||||
type="plans"
|
||||
text="командная отработка планов мероприятий по локализации и ликвидации последствий аварий"
|
||||
/>
|
||||
<MultiUserFeature
|
||||
type="teamwork"
|
||||
text="координация действий между несколькими сотрудниками"
|
||||
/>
|
||||
</div>
|
||||
<AppearanceHr className="mb-6" />
|
||||
<AppearanceText
|
||||
className="md:max-w-[668px] desktop-figma:max-w-[39.25vw]"
|
||||
splits={[
|
||||
'В одном ',
|
||||
'цифровом ',
|
||||
'пространстве ',
|
||||
'могут работать ',
|
||||
'сотрудники, ',
|
||||
'находящиеся ',
|
||||
'в разных ',
|
||||
'помещениях, ',
|
||||
'зданиях ',
|
||||
'или городах',
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
<AppearanceHr className="max-sm:hidden lg:col-span-11 col-span-full sm:mb-5" />
|
||||
<MiniTitle
|
||||
text="возможности"
|
||||
className="col-span-2 max-lg:col-start-1 mb-4"
|
||||
/>
|
||||
<div className="flex max-sm:flex-col justify-stretch max-sm:gap-y-2 lg:gap-x-4 sm:gap-x-3 sm:pb-5 pb-2 max-sm:pt-2 lg:col-start-3 lg:col-span-9 col-span-full">
|
||||
<MultiUserFeature
|
||||
type="processes"
|
||||
text="отработка производственных процессов, в которых участвует группа людей"
|
||||
/>
|
||||
<MultiUserFeature
|
||||
type="plans"
|
||||
text="командная отработка планов мероприятий по локализации и ликвидации последствий аварий"
|
||||
/>
|
||||
<MultiUserFeature
|
||||
type="teamwork"
|
||||
text="координация действий между несколькими сотрудниками"
|
||||
/>
|
||||
</div>
|
||||
<AppearanceHr className="mb-6 lg:col-start-3 lg:col-span-9 col-span-full" />
|
||||
<AppearanceText
|
||||
className="lg:col-start-3 lg:col-span-6 col-span-7"
|
||||
splits={[
|
||||
'В одном ',
|
||||
'цифровом ',
|
||||
'пространстве ',
|
||||
'могут работать ',
|
||||
'сотрудники, ',
|
||||
'находящиеся ',
|
||||
'в разных ',
|
||||
'помещениях, ',
|
||||
'зданиях ',
|
||||
'или городах',
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -80,7 +78,7 @@ function MultiUserFeature({
|
||||
transition: { duration: 0.075 },
|
||||
}}
|
||||
ref={ref}
|
||||
className="bg-bottom bg-no-repeat flex flex-col bg-[length:100%_0%] desktop-figma:max-w-[22vw] w-full justify-between items-start p-6 bg-[#3D425C4D] rounded-2xl lg:min-h-[214px] sm:min-h-[240px] min-h-[220px]"
|
||||
className="bg-bottom bg-no-repeat flex flex-col bg-[length:100%_0%] w-full justify-between items-start p-6 bg-[#3D425C4D] rounded-2xl lg:min-h-[214px] sm:min-h-[240px] min-h-[220px]"
|
||||
>
|
||||
{getIcon(type, hovered, 'mb-4 max-sm:hidden')}
|
||||
{getIcon(type, isInView, 'mb-4 sm:hidden')}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import { Link } from 'react-router-dom';
|
||||
import { AppearanceHr } from '../../ui/AppearanceHr';
|
||||
import { Button } from '../../ui/Button';
|
||||
import { MailIcon } from '../icons/MailIcon';
|
||||
import { PhoneIcon } from '../icons/PhoneIcon';
|
||||
import { TelegramIcon } from '../icons/TelegramIcon';
|
||||
@@ -8,143 +10,79 @@ import { ContactsForm } from './ContactsForm';
|
||||
|
||||
export function Contacts() {
|
||||
return (
|
||||
<div className="lg:py-[70px] lg:px-10 py-14 sm:px-6 px-4 lg:flex justify-between gap-x-4">
|
||||
<div>
|
||||
<div className="lg:flex gap-x-4">
|
||||
<div className="sm:max-lg:grid grid-cols-2 max-lg:mb-6">
|
||||
<h1 className="w-fit text-gradient lg:mb-6 max-sm:mb-4 2xl:text-[64px] xl:text-5xl text-[40px] leading-none">
|
||||
Свяжитесь
|
||||
<br />с нами
|
||||
</h1>
|
||||
<p className="2xl:text-xl lg:text-lg font-semibold leading-tight">
|
||||
Хотите использовать интерактивные тренажеры в обучении? <br />
|
||||
Давайте обсудим детали!
|
||||
</p>
|
||||
</div>
|
||||
<ContactsForm />
|
||||
</div>
|
||||
<div className="mt-[104px] relative">
|
||||
<div className="relative grid lg:grid-cols-4 gap-4">
|
||||
<div className="flex gap-4">
|
||||
<p className="2xl:text-xl font-gilroy font-semibold">
|
||||
Горячая линия
|
||||
</p>
|
||||
<AppearanceHr className="w-full" />
|
||||
</div>
|
||||
|
||||
<div className="space-y-2 2xl:pr-4 xl:pr-2">
|
||||
<a
|
||||
href="mailto:info@graff.tech"
|
||||
className="2xl:h-16 h-14 px-6 py-4 2xl:text-base text-sm border rounded-full font-medium flex justify-between items-center w-full border-[#52587A] lg:opacity-80 lg:hover:opacity-100 transition-all"
|
||||
>
|
||||
<span>Написать</span>
|
||||
<MailIcon className="lg:w-8 lg:h-8 w-6 h-6" />
|
||||
</a>
|
||||
<a
|
||||
href="tel:88007700067"
|
||||
className="2xl:h-16 h-14 px-6 py-4 2xl:text-base text-sm border rounded-full font-medium flex justify-between items-center w-full border-[#52587A] lg:opacity-80 lg:hover:opacity-100 transition-all"
|
||||
>
|
||||
<span>Позвонить</span>
|
||||
<PhoneIcon className="lg:w-8 lg:h-8 w-6 h-6" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div className="sm:col-span-2 flex sm:justify-end lg:mt-0 mt-10">
|
||||
<div className="lg:w-auto sm:w-1/2 w-full flex justify-between 2xl:gap-8 lg:gap-6 gap-4">
|
||||
<p className="2xl:text-xl font-gilroy font-semibold 2xl:-mt-1.5 -mt-1">
|
||||
Социальные
|
||||
<br />
|
||||
сети
|
||||
</p>
|
||||
<div className="flex gap-2 h-fit">
|
||||
<a
|
||||
href="https://www.youtube.com/@GRAFFtech"
|
||||
target="_blank"
|
||||
className="group border border-[#3D425C] xl:p-4 p-3 rounded-full lg:hover:border-[#52587A] transition-all"
|
||||
>
|
||||
<YouTubeIcon className="2xl:w-8 2xl:h-8 w-6 h-6" />
|
||||
</a>
|
||||
<a
|
||||
href="https://vk.com/graff.interactive"
|
||||
target="_blank"
|
||||
className="group border border-[#3D425C] xl:p-4 p-3 rounded-full lg:hover:border-[#52587A] transition-all"
|
||||
>
|
||||
<VKIcon className="2xl:w-8 2xl:h-8 w-6 h-6" />
|
||||
</a>
|
||||
<a
|
||||
href="https://t.me/GRAFFinteractive"
|
||||
target="_blank"
|
||||
className="border rounded-full border-[#52587A] xl:p-4 p-3 opacity-80 lg:hover:opacity-100 transition-all"
|
||||
>
|
||||
<TelegramIcon className="2xl:w-8 2xl:h-8 w-6 h-6" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="lg:py-[70px] lg:px-10 py-14 sm:px-6 px-4 sm:grid lg:grid-cols-12 grid-cols-8 gap-x-4 lg:gap-y-[104px]">
|
||||
<div className="max-lg:mb-6 lg:col-span-3 sm:col-span-full sm:max-lg:flex items-start justify-between space-y-4">
|
||||
<h1 className="min-w-[50%] text-gradient lg:mb-6 max-sm:mb-4 2xl:text-[64px] xl:text-5xl text-[40px] leading-none">
|
||||
Свяжитесь
|
||||
<br />с нами
|
||||
</h1>
|
||||
<p className="2xl:text-xl lg:text-lg font-semibold leading-tight">
|
||||
Хотите использовать интерактивные тренажеры в обучении? <br />
|
||||
Давайте обсудим детали!
|
||||
</p>
|
||||
</div>
|
||||
{/* <div className="sm:max-lg:mb-20 mb-14">
|
||||
<Title className="desktop-figma:mb-[77px] lg:mb-[68px] desktop-figma:max-w-[899px] lg:max-w-[720px] mb-6">
|
||||
Хотите использовать интерактивные тренажеры в обучении?
|
||||
<br />
|
||||
<span
|
||||
className="text-gradient"
|
||||
>
|
||||
Давайте обсудим детали.
|
||||
</span>
|
||||
</Title>
|
||||
<button
|
||||
onClick={() => setModal(<ContactsForm />)}
|
||||
className="bg-gradient-to-r from-[#798FFF] to-[#D375FF] rounded-[104px] py-4 px-6 flex font-semibold text-[#ffffff] justify-between desktop-figma:min-w-[23vw] lg:max-desktop-figma:min-w-[368px] sm:max-lg:min-w-[332px] max-sm:w-full items-center btn-text"
|
||||
|
||||
<ContactsForm />
|
||||
|
||||
<div className="flex gap-4 lg:col-span-3 sm:col-start-1 sm:col-span-4 max-sm:mb-4">
|
||||
<p className="2xl:text-xl font-gilroy font-semibold">Горячая линия</p>
|
||||
<AppearanceHr className="w-full" />
|
||||
</div>
|
||||
|
||||
<div className="space-y-2 2xl:pr-4 lg:col-span-3 sm:col-span-4">
|
||||
<Button
|
||||
color="secondary"
|
||||
className="py-4"
|
||||
width="full"
|
||||
icon={<MailIcon />}
|
||||
>
|
||||
Оставить заявку <img src="src/assets/send.svg" alt="" />
|
||||
</button>
|
||||
<Link
|
||||
to="mailto:info@graff.tech"
|
||||
className="btn-text opacity-80 outline-none"
|
||||
>
|
||||
Написать
|
||||
</Link>
|
||||
</Button>
|
||||
<Button
|
||||
color="secondary"
|
||||
className="py-4"
|
||||
width="full"
|
||||
icon={<PhoneIcon />}
|
||||
>
|
||||
<span className="btn-text opacity-80 outline-none">Позвонить</span>
|
||||
</Button>
|
||||
</div>
|
||||
<div className="min-w-[31.69vw] sm:max-lg:flex items-stretch justify-between gap-x-4">
|
||||
<div className="lg:min-w-[20.75vw] sm:w-full">
|
||||
<p className="text-[#ffffff] mb-4 l-text">Свяжитесь с нами</p>
|
||||
<div className="flex flex-col gap-y-3 lg:mb-20 max-sm:mb-6">
|
||||
<Link
|
||||
to={'mailto:info@graff.tech'}
|
||||
className="text-[#ffffff] font-semibold py-4 px-6 flex items-center justify-between rounded-[104px] border border-[#3D425C] btn-text"
|
||||
>
|
||||
Написать
|
||||
<img src="src/assets/mail.svg" alt="" />
|
||||
</Link>
|
||||
<Link
|
||||
to={'tel:+780077700067'}
|
||||
className="text-[#ffffff] font-semibold py-4 px-6 flex items-center justify-between rounded-[104px] border border-[#3D425C] btn-text"
|
||||
>
|
||||
Позвонить
|
||||
<img src="src/assets/phone.svg" alt="" />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="lg:col-start-10 lg:col-span-3 col-start-5 col-span-4 flex justify-between lg:mt-0 mt-8">
|
||||
<p className="2xl:text-xl font-gilroy font-semibold 2xl:-mt-1.5 -mt-1">
|
||||
Социальные
|
||||
<br />
|
||||
сети
|
||||
</p>
|
||||
<div className="flex gap-2 h-fit">
|
||||
<Link
|
||||
to="https://www.youtube.com/@GRAFFtech"
|
||||
target="_blank"
|
||||
className="border border-[#3D425C] xl:p-4 p-3 rounded-full lg:hover:border-[#52587A] transition-all outline-none"
|
||||
>
|
||||
<YouTubeIcon className="2xl:w-8 2xl:h-8 w-6 h-6" />
|
||||
</Link>
|
||||
<Link
|
||||
to="https://vk.com/graff.interactive"
|
||||
target="_blank"
|
||||
className="border border-[#3D425C] xl:p-4 p-3 rounded-full lg:hover:border-[#52587A] transition-all outline-none"
|
||||
>
|
||||
<VKIcon className="2xl:w-8 2xl:h-8 w-6 h-6" />
|
||||
</Link>
|
||||
<Link
|
||||
to="https://t.me/GRAFFinteractive"
|
||||
target="_blank"
|
||||
className="border rounded-full border-[#3D425C] xl:p-4 p-3 lg:hover:border-[#52587A] transition-all outline-none"
|
||||
>
|
||||
<TelegramIcon className="2xl:w-8 2xl:h-8 w-6 h-6" />
|
||||
</Link>
|
||||
</div>
|
||||
<div className="flex flex-col gap-y-4 sm:max-lg:justify-between md:max-lg:min-w-[332px] sm:max-md:min-w-[250px]">
|
||||
<p className="font-semibold text-[#ffffff] l-text">Социальные сети</p>
|
||||
<div className="flex gap-x-2">
|
||||
<Link
|
||||
to={'https://www.youtube.com/@GRAFFtech'}
|
||||
className="rounded-full p-4 border border-[#3D425C]"
|
||||
>
|
||||
<img src="src/assets/youtube.svg" alt="" />
|
||||
</Link>
|
||||
<Link
|
||||
to={'https://vk.com/graff.interactive'}
|
||||
className="rounded-full p-4 border border-[#3D425C]"
|
||||
>
|
||||
<img src="src/assets/vk.svg" alt="" />
|
||||
</Link>
|
||||
<Link
|
||||
to={'https://t.me/GRAFFinteractive'}
|
||||
className="rounded-full p-4 border border-[#3D425C]"
|
||||
>
|
||||
<img src="src/assets/tg.svg" alt="" />
|
||||
</Link>
|
||||
</div>
|
||||
</div> */}
|
||||
{/* </div> */}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -52,7 +52,10 @@ export function ContactsForm({ inModal = false }: { inModal?: boolean }) {
|
||||
<form
|
||||
onSubmit={handleSubmit}
|
||||
className={
|
||||
'grid' + (!inModal ? ' lg:grid-cols-3 sm:grid-cols-2' : '')
|
||||
'grid' +
|
||||
(!inModal
|
||||
? ' lg:grid-cols-3 sm:grid-cols-2 lg:col-span-9 sm:col-span-full sm:mb-20 mb-14'
|
||||
: '')
|
||||
}
|
||||
>
|
||||
<div className="relative">
|
||||
|
||||
@@ -12,8 +12,8 @@ export function Decreasing() {
|
||||
<span className="text-gradient">Помогаем</span> сократить затраты на
|
||||
обучение, повысить безопасность и производительность
|
||||
</Title>
|
||||
<div className="flex max-md:flex-col justify-normal desktop-figma:gap-x-[10vw] md:max-desktop-figma:gap-x-[clamp(16px,16px+(100vw-1024px)/576*142,160px)] desktop-figma:max-w-[calc(70.8vw+256px)] desktop-figma:justify-between sm:items-end xl:pl-64 desktop-figma:mt-[77px] lg:mt-14 mt-6">
|
||||
<ul className="xl:max-w-[47vw] w-full sm:min-w-[318px] mb-6">
|
||||
<div className="sm:grid lg:grid-cols-12 sm:max-lg:grid-cols-9 2xl:mt-[77px] lg:mt-14 mt-6 gap-x-4">
|
||||
<ul className="w-full mb-6 lg:col-start-3 sm:max-lg:col-start-1 lg:col-span-6 sm:col-span-5">
|
||||
<DecreasingOption
|
||||
text="снижение количества несчастных случаев"
|
||||
number="[01]"
|
||||
@@ -34,7 +34,7 @@ export function Decreasing() {
|
||||
</ul>
|
||||
<img
|
||||
src="src/assets/effect.jpg"
|
||||
className="max-md:self-center max-md:w-full object-contain rounded-2xl w-[max(352px,22vw)]"
|
||||
className="max-md:self-center max-md:w-full self-end object-contain rounded-2xl w-[max(352px,22vw)] lg:col-start-10 sm:col-start-7 col-span-3"
|
||||
alt="снижение издержек"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -3,29 +3,27 @@ import { Title } from '../../ui/Title';
|
||||
export function Distance() {
|
||||
return (
|
||||
<div className="lg:py-[70px] lg:px-10 py-14 sm:px-6 px-4">
|
||||
<Title className="desktop-figma:mb-[77px] lg:mb-14 sm:mb-6 mb-4">
|
||||
<Title className="desktop-figma:mb-[77px] lg:mb-14 mb-6">
|
||||
Платформа GRAFF.training поволяет осуществлять
|
||||
<span className="text-gradient"> дистанционное обучение</span> с любого
|
||||
устройства
|
||||
</Title>
|
||||
<div className="xl:pl-64">
|
||||
<div className="sm:grid lg:gap-x-4 lg:gap-y-6 sm:gap-x-3 sm:gap-y-4 lg:grid-cols-2 md:max-[956px]:grid-cols-[446px_1fr]">
|
||||
<p className="row-start-1 max-sm:mb-6 l-text">
|
||||
Обучающиеся будут получать доступ к системе с высоко
|
||||
детализированной 3D графикой для прохождения сценариев на любом
|
||||
устройстве, без необходимости установки дополнительного ПО.
|
||||
</p>
|
||||
<img
|
||||
src="src/assets/datamining_2.jpg"
|
||||
alt="дистанционное обучение с любого устройства"
|
||||
className="row-start-2 max-sm:mb-4 rounded-2xl aspect-[624/420]"
|
||||
/>
|
||||
<img
|
||||
src="src/assets/datamining_1.jpg"
|
||||
alt="дистанционное обучение с любого устройства"
|
||||
className="row-start-2 col-start-2 rounded-2xl h-full aspect-[624/420]"
|
||||
/>
|
||||
</div>
|
||||
<div className="sm:grid lg:grid-cols-12 gap-x-4 gap-y-6">
|
||||
<p className="row-start-1 lg:col-start-3 col-span-5 max-sm:mb-6 l-text">
|
||||
Обучающиеся будут получать доступ к системе с высоко детализированной
|
||||
3D графикой для прохождения сценариев на любом устройстве, без
|
||||
необходимости установки дополнительного ПО.
|
||||
</p>
|
||||
<img
|
||||
src="src/assets/datamining_2.jpg"
|
||||
alt="дистанционное обучение с любого устройства"
|
||||
className="row-start-2 lg:col-start-3 col-span-5 max-sm:mb-4 rounded-2xl self-stretch object-cover"
|
||||
/>
|
||||
<img
|
||||
src="src/assets/datamining_1.jpg"
|
||||
alt="дистанционное обучение с любого устройства"
|
||||
className="row-start-2 lg:col-start-8 lg:col-span-5 col-span-3 rounded-2xl h-full self-stretch object-cover"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -8,9 +8,12 @@ export function Effeciency() {
|
||||
return (
|
||||
<div className="lg:py-[70px] py-14 lg:px-10 sm:px-6 px-4">
|
||||
<AppearanceHr className="max-sm:hidden" />
|
||||
<div className="flex max-lg:flex-col pt-5 sm:max-lg:gap-4">
|
||||
<MiniTitle text={'экономическая эффективность'} />
|
||||
<div className="max-sm:mt-4">
|
||||
<div className="pt-5 gap-4 sm:grid lg:grid-cols-12 sm:grid-cols-8">
|
||||
<MiniTitle
|
||||
text={'экономическая эффективность'}
|
||||
className="lg:col-span-2 col-span-3"
|
||||
/>
|
||||
<div className="max-sm:mt-4 lg:col-span-9 col-span-full">
|
||||
<div className="flex max-sm:flex-col lg:max-desktop-figma:w-[clamp(728px,728px+(100vw-1024px)/576*405,1133px)] justify-stretch gap-x-4 gap-y-2 max-sm:py-5 sm:pb-5">
|
||||
<Figure
|
||||
percents={50}
|
||||
@@ -28,7 +31,7 @@ export function Effeciency() {
|
||||
</div>
|
||||
<AppearanceHr className="mb-9" />
|
||||
<AppearanceText
|
||||
className="max-w-[752px] desktop-figma:max-w-[47vw]"
|
||||
className="lg:w-2/3 sm:w-full"
|
||||
splits={[
|
||||
'В тренажере человек ',
|
||||
'принимает решения ',
|
||||
|
||||
@@ -10,9 +10,9 @@ export function Events() {
|
||||
return (
|
||||
<div className="lg:py-[70px] lg:px-10 sm:py-14 sm:px-6 px-4" id="events">
|
||||
<AppearanceHr className="max-lg:hidden" />
|
||||
<div className="flex max-lg:flex-col pt-5 gap-x-4 w-full">
|
||||
<MiniTitle text="события" className="max-sm:mb-2" />
|
||||
<div className="lg:max-desktop-figma:min-w-[clamp(688px,688px+(100vw-1024px)/576*425,1133px)] desktop-figma:min-w-[70.9vw]">
|
||||
<div className="pt-5 gap-x-4 w-full sm:grid lg:grid-cols-12 grid-cols-8">
|
||||
<MiniTitle text="события" className="max-sm:mb-2 col-span-2" />
|
||||
<div className="lg:col-span-9 col-span-full">
|
||||
<AppearanceHr className="sm:hidden" />
|
||||
<div className="lg:py-7 sm:py-6 py-5 flex justify-between max-sm:flex-col items-start gap-x-4">
|
||||
<div className="w-fit">
|
||||
@@ -69,7 +69,7 @@ function LinkButton({ href }: { href: string }) {
|
||||
<Link
|
||||
to={href}
|
||||
ref={ref}
|
||||
className="text-nowrap opacity-60 uppercase flex items-center w-fit lg:min-w-[min(133px,fit)] gap-x-2 sm:min-w-[140px] max-sm:self-end link max-sm:mt-4"
|
||||
className="text-nowrap opacity-60 uppercase flex items-center w-fit lg:min-w-[min(133px,fit)] gap-x-2 sm:min-w-[140px] max-sm:self-end link max-sm:mt-4 outline-none"
|
||||
>
|
||||
как это было <ArrowInsertIcon />
|
||||
</Link>
|
||||
|
||||
@@ -25,7 +25,7 @@ export function ModalWithForm() {
|
||||
</p>
|
||||
<button
|
||||
onClick={() => setModal(null)}
|
||||
className="p-2 lg:hover:bg-white lg:hover:bg-opacity-10 transition-colors rounded-full"
|
||||
className="p-2 lg:hover:bg-white lg:hover:bg-opacity-10 transition-colors rounded-full outline-none"
|
||||
>
|
||||
<CloseIcon />
|
||||
</button>
|
||||
|
||||
@@ -3,17 +3,17 @@ import { Marquee } from '../Main/Marquee';
|
||||
export function Motivation() {
|
||||
return (
|
||||
<div>
|
||||
<div className="lg:px-10 sm:px-6 px-4 lg:py-28 sm:py-12 py-14">
|
||||
<h1 className="desktop-figma:mb-[38px] pb-8 font-medium lg:block max-lg:hidden h1">
|
||||
<div className="lg:px-10 sm:px-6 px-4 lg:py-28 sm:py-12 py-14 grid grid-cols-12">
|
||||
<h1 className="desktop-figma:mb-[38px] pb-8 font-medium lg:block max-lg:hidden h1 col-span-full">
|
||||
Создаем
|
||||
<span className="text-gradient"> интерактивные тренажеры </span>
|
||||
для промышленности и образования
|
||||
</h1>
|
||||
<h1 className="font-medium lg:hidden h1">
|
||||
<h1 className="font-medium lg:hidden h1 col-span-full">
|
||||
Интерактивные тренажеры
|
||||
<span className="text-gradient"> для обучения сотрудников</span>
|
||||
</h1>
|
||||
<h3 className="max-w-[768px] lg:block max-lg:hidden h3">
|
||||
<h3 className="lg:col-span-6 max-lg:hidden h3">
|
||||
Помогаем сократить затраты на обучение, повысить безопасность и
|
||||
производительность
|
||||
</h3>
|
||||
|
||||
@@ -82,7 +82,7 @@ function TabButton({
|
||||
<button
|
||||
onClick={onClick}
|
||||
className={
|
||||
'font-semibold rounded-lg px-5 py-[13.5px] btn-text text-nowrap text-clip bg-text-gradient relative ' +
|
||||
'font-semibold rounded-lg px-5 py-[13.5px] btn-text text-nowrap text-clip bg-text-gradient relative outline-none ' +
|
||||
className
|
||||
}
|
||||
>
|
||||
|
||||
@@ -134,27 +134,27 @@ export function SimulatorsTab() {
|
||||
<img
|
||||
src="src/assets/train.jpg"
|
||||
className="rounded-xl xl:w-[clamp(178px,178px+(100vw-1280px)/320*54,232px)] object-cover aspect-[232/229] desktop-figma:w-[calc((100vw-256px)*0.145)] sm:max-xl:hidden"
|
||||
alt="Симулятор"
|
||||
alt="Поезд"
|
||||
/>
|
||||
<img
|
||||
src="src/assets/dispatcher.jpg"
|
||||
className="rounded-lg xl:w-[clamp(178px,178px+(100vw-1280px)/320*54,232px)] object-cover aspect-[232/229] desktop-figma:w-[calc((100vw-256px)*0.145)] sm:max-xl:hidden"
|
||||
alt="Симулятор"
|
||||
alt="Диспетчер"
|
||||
/>
|
||||
<img
|
||||
src="src/assets/winda.jpg"
|
||||
className="rounded-xl xl:w-[clamp(178px,178px+(100vw-1280px)/320*54,232px)] object-cover aspect-[232/229] desktop-figma:w-[calc((100vw-256px)*0.145)] sm:max-xl:hidden"
|
||||
alt="Симулятор"
|
||||
alt="Диспетчер"
|
||||
/>
|
||||
<img
|
||||
src="src/assets/rzhd.jpg"
|
||||
className="rounded-xl xl:w-[clamp(272px,272px+(100vw-1280px)/320*80,352px)] object-cover aspect-[352/229] desktop-figma:w-[calc((100vw-256px)*0.22)]"
|
||||
alt="Симулятор"
|
||||
alt="РЖД"
|
||||
/>
|
||||
<img
|
||||
src="src/assets/rzhd2.jpg"
|
||||
className="rounded-xl xl:w-[clamp(272px,272px+(100vw-1280px)/320*80,352px)] object-cover aspect-[352/229] desktop-figma:w-[calc((100vw-256px)*0.22)]"
|
||||
alt="Симулятор"
|
||||
alt="РЖД"
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
|
||||
@@ -50,12 +50,12 @@ function Project({
|
||||
tags: string[];
|
||||
}) {
|
||||
return (
|
||||
<div className="bg-[#3D425C] bg-opacity-50 rounded-2xl lg:min-w-[624px] sm:min-w-[520px] min-w-[calc(100vw-32px)] lg:translate-x-[264px] pointer-events-none flex flex-col">
|
||||
<div className="bg-[#3D425C] bg-opacity-50 rounded-2xl aspect-[624/462] lg:min-w-[39vw] sm:min-w-[67vw] min-w-[calc(100vw-32px)] lg:translate-x-[calc(15.5vw-32px)] pointer-events-none flex flex-col">
|
||||
<div
|
||||
className="bg-cover bg-center bg-no-repeat h-[340px] rounded-2xl"
|
||||
className="bg-cover bg-center bg-no-repeat min-h-[340px] flex-1 rounded-2xl"
|
||||
style={{ backgroundImage: `url(${src})` }}
|
||||
/>
|
||||
<div className="p-5 flex-1 flex flex-col justify-between gap-3">
|
||||
<div className="p-5 flex flex-col justify-between gap-3 h-fit">
|
||||
<h4 className="font-medium h4">{title}</h4>
|
||||
<div className="flex gap-2">
|
||||
{tags.map(tag => (
|
||||
@@ -78,7 +78,8 @@ function Slider({
|
||||
projects: { src: string; title: string; tags: string[] }[];
|
||||
}) {
|
||||
const width = useWindowWidth();
|
||||
const baseOffset = width >= 1024 ? 640 : width >= 640 ? 536 : width - 24;
|
||||
const baseOffset =
|
||||
width >= 1024 ? width * 0.39 : width >= 640 ? width * 0.67 : width - 20;
|
||||
const [sliderOffset, setSliderOffset] = useState(-baseOffset);
|
||||
const [slide, setSlide] = useState(0);
|
||||
const [isAnimating, setIsAnimating] = useState(false);
|
||||
@@ -157,7 +158,7 @@ function Slider({
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center gap-4 lg:w-[clamp(720px,100vw-465px,1135px)] desktop-figma:w-[70.9vw] w-full self-start lg:ml-64">
|
||||
<div className="flex items-center gap-4 lg:w-[clamp(720px,100vw-465px,1135px)] desktop-figma:w-[70.9vw] w-full self-start lg:ml-[15.5vw]">
|
||||
<button
|
||||
onClick={() => {
|
||||
if (!isAnimating) {
|
||||
@@ -166,7 +167,7 @@ function Slider({
|
||||
dispatch('prev');
|
||||
}
|
||||
}}
|
||||
className="max-sm:hidden"
|
||||
className="max-sm:hidden outline-none"
|
||||
>
|
||||
<ArrowLeftIcon />
|
||||
</button>
|
||||
@@ -184,7 +185,7 @@ function Slider({
|
||||
dispatch('next');
|
||||
}
|
||||
}}
|
||||
className="max-sm:hidden"
|
||||
className="max-sm:hidden outline-none"
|
||||
>
|
||||
<ArrowRightIcon />
|
||||
</button>
|
||||
|
||||
@@ -3,14 +3,14 @@ import { Title } from '../../ui/Title';
|
||||
|
||||
export function Teaching() {
|
||||
return (
|
||||
<div className="lg:py-[70px] lg:mb-[60px] lg:px-10 sm:px-6 px-4 py-14 lg:flex gap-x-4">
|
||||
<Title className="max-lg:hidden desktop-figma:mb-[38px] mb-8 lg:sticky top-14 h-fit max-w-[40vw]">
|
||||
<div className="lg:py-[70px] lg:mb-[60px] lg:px-10 sm:px-6 px-4 py-14 md:grid lg:grid-cols-12 gap-x-4">
|
||||
<Title className="max-lg:hidden 2xl:mb-[38px] mb-8 lg:sticky top-14 h-fit col-span-5">
|
||||
<span className="text-gradient">Тренинг модуль</span>
|
||||
<br className="max-lg:hidden" />
|
||||
<span className="lg:hidden"> </span>помогает осуществлять
|
||||
координацию между всеми участниками процесса
|
||||
</Title>
|
||||
<Title className="desktop-figma:mb-[29px] lg:hidden mb-6">
|
||||
<Title className="desktop-figma:mb-[29px] lg:hidden mb-6 col-span-full">
|
||||
<span className="text-gradient">Дистанционное обучение</span> на базе
|
||||
платформы GRAFF TRANING
|
||||
</Title>
|
||||
@@ -22,8 +22,8 @@ export function Teaching() {
|
||||
|
||||
function TeachingFeaturesForDesktop() {
|
||||
return (
|
||||
<div className="hidden flex-col gap-y-4 flex-wrap lg:flex">
|
||||
<div className="p-10 bg-[#3D425C4D] overflow-hidden items-end flex justify-between rounded-2xl min-h-[400px] max-desktop-figma:min-w-[clamp(575px,575px+(100vw-1024px)/576*305,880px)] desktop-figma:min-w-[51vw]">
|
||||
<div className="hidden flex-col gap-y-4 flex-wrap lg:flex col-span-7">
|
||||
<div className="p-10 bg-[#3D425C4D] overflow-hidden items-end flex justify-between rounded-2xl">
|
||||
<div className="max-w-[380px] flex flex-col justify-between self-stretch">
|
||||
<div>
|
||||
<TeachingFeatureTitle>Управление процессом</TeachingFeatureTitle>
|
||||
@@ -46,7 +46,7 @@ function TeachingFeaturesForDesktop() {
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="p-10 bg-[#3D425C4D] rounded-2xl flex min-h-[400px] justify-between gap-x-3">
|
||||
<div className="p-10 bg-[#3D425C4D] rounded-2xl flex min-h-[400px] justify-between gap-x-3 overflow-hidden">
|
||||
<div className="w-fit">
|
||||
<TeachingFeatureTitle className="w-fit">
|
||||
Управление пользователями
|
||||
@@ -81,7 +81,7 @@ function TeachingFeaturesForDesktop() {
|
||||
<img
|
||||
src="src/assets/pinned_windows.jpg"
|
||||
className="rounded-tl-lg w-[24vw] relative left-10 self-end top-10"
|
||||
alt=""
|
||||
alt="Видеозапись обучения"
|
||||
/>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ export function Trainings() {
|
||||
<span className="text-gradient">варианты комплектации тренажеров</span>,
|
||||
основываясь на специфике вашего тренировочного процесса
|
||||
</Title>
|
||||
<div className="xl:pl-[16vw] desktop-figma:pl-[256px] w-fit">
|
||||
<div className="sm:grid lg:grid-cols-12 grid-cols-8 gap-x-4">
|
||||
<TrainingsFeature
|
||||
order="[01]"
|
||||
src="src/assets/vr_1.png"
|
||||
@@ -32,7 +32,7 @@ export function Trainings() {
|
||||
title="Учебные классы"
|
||||
text="Оснащение учебных классов и центров всем необходимым для современного обучения и профессиональной подготовки кадров"
|
||||
/>
|
||||
<AppearanceHr />
|
||||
<AppearanceHr className="lg:col-start-3 col-span-full" />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
@@ -53,24 +53,20 @@ function TrainingsFeature({
|
||||
const hovered = useHover(ref);
|
||||
|
||||
return (
|
||||
<div className="xl:max-desktop-figma:max-w-[clamp(557px,557px+(100vw-1024px)/576*576,1133px)] desktop-figma:w-[70.8vw]">
|
||||
<div className="lg:col-start-3 col-span-full">
|
||||
<AppearanceHr />
|
||||
<div
|
||||
ref={ref}
|
||||
className="lg:first:h-[200px] lg:last:h-[200px] lg:h-[176px] sm:flex items-stretch justify-between sm:py-10 max-sm:pt-5"
|
||||
className="lg:first:h-[200px] lg:last:h-[200px] lg:h-[176px] sm:flex max-sm:space-y-[42px] items-stretch justify-between sm:py-10 max-sm:pt-5"
|
||||
>
|
||||
<div className="sm:flex flex-col gap-y-4 max-sm:mb-[42px] md:w-[43.7%] sm:max-md:min-w-[76%]">
|
||||
<div className="sm:space-y-4 lg:w-[40%] sm:w-1/2">
|
||||
<h3 className="font-medium max-sm:mb-2 h3">{title}</h3>
|
||||
<p className=" opacity-60 l-text">{text}</p>
|
||||
</div>
|
||||
<div className="flex sm:hidden justify-between items-end">
|
||||
<p className="text-[#52587A] m-text mb-5">{order}</p>
|
||||
<div className="flex flex-col items-center">
|
||||
<img
|
||||
src={src}
|
||||
alt="VR-тренажер"
|
||||
className="relative z-30 w-[50vw]"
|
||||
/>
|
||||
<img src={src} alt={title} className="relative z-30 w-[50vw]" />
|
||||
<VrBacklightIcon className="absolute w-[36vw] h-fit" />
|
||||
</div>
|
||||
</div>
|
||||
@@ -86,7 +82,7 @@ function TrainingsFeature({
|
||||
<img
|
||||
src={src}
|
||||
className="relative z-20 w-[27vw/1120*843] h-[calc(27vw*0.6)]"
|
||||
alt="VR-тренажер"
|
||||
alt={title}
|
||||
/>
|
||||
<VrBacklightIcon className="absolute w-[24vw]" />
|
||||
</motion.div>
|
||||
@@ -94,14 +90,14 @@ function TrainingsFeature({
|
||||
<img
|
||||
src={src}
|
||||
className="w-[27vw] relative z-20 h-[calc(27vw*0.6)]"
|
||||
alt="VR-тренажер"
|
||||
alt={title}
|
||||
/>
|
||||
<VrBacklightIcon className="absolute w-[24vw]" />
|
||||
</div>
|
||||
<p className="text-[#52587A] lg:font-medium m-text">{order}</p>
|
||||
</div>
|
||||
<div className="w-[calc(280/768*100%)] max-sm:hidden md:hidden flex justify-center items-center">
|
||||
<img src={src} className="relative z-20" alt="VR-тренажер" />
|
||||
<img src={src} className="relative z-20" alt={title} />
|
||||
<VrBacklightIcon className="absolute w-[24vw]" />
|
||||
</div>
|
||||
<p className="text-[#52587A] lg:font-medium m-text max-sm:hidden md:hidden">
|
||||
|
||||
@@ -16,8 +16,11 @@ export function Video() {
|
||||
return (
|
||||
<>
|
||||
<div className="flex bg-[url(src/assets/video.jpg)] lg:h-[836px] sm:h-[561px] h-[400px] bg-cover bg-right bg-no-repeat justify-center">
|
||||
<button className="self-center" onClick={() => setOpen(true)}>
|
||||
<PlayIcon className="lg:w-[114px] sm:w-[94px]" />
|
||||
<button
|
||||
className="self-center outline-none"
|
||||
onClick={() => setOpen(true)}
|
||||
>
|
||||
<PlayIcon className="lg:w-[114px] sm:w-[94px] outline-none" />
|
||||
</button>
|
||||
<div className="flex self-end absolute right-0 max-sm:hidden">
|
||||
<div className="w-0 h-0 lg:border-b-[100px] lg:border-l-[100px] sm:border-b-[82px] sm:border-l-[82px] border-[transparent_transparent_#14161F_transparent]" />
|
||||
@@ -30,7 +33,7 @@ export function Video() {
|
||||
<div className="absolute top-0 left-0 w-screen h-screen overflow-hidden flex justify-center items-start">
|
||||
<div className="aspect-video w-full">
|
||||
<button
|
||||
className="absolute top-6 right-6 p-6 z-60 rounded-full border border-white"
|
||||
className="absolute top-6 right-6 p-6 z-60 rounded-full border border-white outline-none"
|
||||
onClick={() => setOpen(false)}
|
||||
>
|
||||
<CloseIcon />
|
||||
|
||||
@@ -14,7 +14,7 @@ export function AnchorLink({
|
||||
<HashLink
|
||||
itemProp="url"
|
||||
className={
|
||||
'btn-text font-semibold border-l border-[#3D425C] hidden py-[30px] px-10 min-[1350px]:block hover:bg-[#3D425C] active:bg-[#14161F] ' +
|
||||
'btn-text font-semibold border-l border-[#3D425C] hidden py-[30px] px-10 min-[1350px]:block hover:bg-[#3D425C] active:bg-[#14161F] outline-none ' +
|
||||
className
|
||||
}
|
||||
to={route}
|
||||
|
||||
+3
-1
@@ -27,7 +27,9 @@ export function Button({
|
||||
(color === 'primary'
|
||||
? 'bg-gradient-to-r from-[#798FFF] to-[#D375FF]'
|
||||
: '') ||
|
||||
(color === 'secondary' ? 'outline outline-1 outline-[#3D425C]' : '')
|
||||
(color === 'secondary'
|
||||
? 'outline outline-1 outline-[#3D425C]'
|
||||
: 'outline-none')
|
||||
} ${
|
||||
icon ? 'pr-4' : ''
|
||||
} flex gap-1 items-center overflow-hidden w-${width} ${className} justify-between`}
|
||||
|
||||
@@ -10,7 +10,7 @@ export function MiniTitle({
|
||||
return (
|
||||
<h2
|
||||
className={
|
||||
'flex gap-1 items-start self-start uppercase opacity-80 font-medium link lg:max-w-64 xl:w-full ' +
|
||||
'flex gap-1 items-start self-start uppercase opacity-60 font-medium link lg:max-w-64 xl:w-full ' +
|
||||
className
|
||||
}
|
||||
>
|
||||
|
||||
Reference in New Issue
Block a user