fixes
This commit is contained in:
+2
-1
@@ -14,5 +14,6 @@ module.exports = {
|
||||
'warn',
|
||||
{ allowConstantExport: true },
|
||||
],
|
||||
'no-irregular-whitespace': 'off',
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
@@ -11,13 +11,13 @@ export function Footer() {
|
||||
<div className="flex flex-col gap-y-1">
|
||||
<NavLink
|
||||
to="/policy"
|
||||
className="flex gap-4 outline-none sm:font-medium m-text"
|
||||
className="sm:font-medium m-text flex gap-4 outline-none"
|
||||
target="_blank"
|
||||
>
|
||||
Политика конфиденциальности <span>graff.tech</span>
|
||||
</NavLink>
|
||||
<p className="opacity-40 sm:font-medium m-text">
|
||||
© 2024 GRAFF interactive. Все права защищены
|
||||
<p className="sm:font-medium m-text opacity-40">
|
||||
© 2025 GRAFF interactive. Все права защищены
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,17 +2,14 @@ import { motion } from 'framer-motion';
|
||||
import { PropsWithChildren, useRef, useState } from 'react';
|
||||
import { AnchorLink } from '../../ui/AnchorLink';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { useLanguageStore } from '../../store/languageStore';
|
||||
import { useOnClickOutside } from 'usehooks-ts';
|
||||
import { useModalStore } from '../../store/modalStore';
|
||||
import { ModalWithForm } from '../Main/ModalWithForm';
|
||||
import { Button } from '../../ui/Button';
|
||||
import { LogoWithTextIcon } from '../icons/LogoWithTextIcon';
|
||||
import { LogoIcon } from '../icons/LogoIcon';
|
||||
import { BurgerIcon } from '../icons/BurgerIcon';
|
||||
import { CloseIcon } from '../icons/CloseIcon';
|
||||
import { CubeIcon } from '../icons/CubeIcon';
|
||||
import { useWindowWidth } from '../../hooks/useWindowWidth';
|
||||
|
||||
export function Header() {
|
||||
const [menuOpen, setMenuOpen] = useState(false);
|
||||
@@ -25,14 +22,11 @@ export function Header() {
|
||||
() => setMenuOpen(false),
|
||||
);
|
||||
|
||||
const width = useWindowWidth();
|
||||
|
||||
return (
|
||||
<header className="sticky top-0 z-[90] w-full bg-[#14161F]">
|
||||
<nav className="flex justify-between border-b border-[#3D425C] lg:pl-10 pl-4 xl:max-h-[72px] max-h-16">
|
||||
<Link to={'/'} className="flex items-center outline-none">
|
||||
<LogoIcon className="lg:hidden" />
|
||||
{width >= 1024 && <LogoWithTextIcon className="w-[104px]" />}
|
||||
<LogoWithTextIcon className="w-[104px]" />
|
||||
</Link>
|
||||
<div className="flex mx-auto">
|
||||
<AnchorLink route="#products">Типы тренажеров</AnchorLink>
|
||||
@@ -41,7 +35,7 @@ export function Header() {
|
||||
</div>
|
||||
<Button
|
||||
onClick={() => setModal(<ModalWithForm />)}
|
||||
className="px-10 font-semibold rounded-none btn-text max-sm:hidden"
|
||||
className="btn-text max-sm:hidden px-10 font-semibold rounded-none"
|
||||
>
|
||||
Оставить заявку
|
||||
</Button>
|
||||
@@ -51,7 +45,9 @@ export function Header() {
|
||||
onClick={() => setMenuOpen(prev => !prev)}
|
||||
className="p-5 xl:hidden border-[#3D425C] max-sm:border-l outline-none"
|
||||
>
|
||||
{!menuOpen ? <BurgerIcon /> : <CloseIcon />}
|
||||
<div className="size-6">
|
||||
{!menuOpen ? <BurgerIcon /> : <CloseIcon />}
|
||||
</div>
|
||||
</button>
|
||||
</nav>
|
||||
<motion.div
|
||||
@@ -72,20 +68,20 @@ export function Header() {
|
||||
<BurgerAnchor route="#products">Типы тренажеров</BurgerAnchor>
|
||||
<BurgerAnchor route="#projects">Проекты</BurgerAnchor>
|
||||
<BurgerAnchor route="#trainings">Варианты комплектации</BurgerAnchor>
|
||||
</div>
|
||||
<div className="grid grid-cols-[2fr_1fr_1fr] sm:grid-cols-2">
|
||||
<Button
|
||||
onClick={() => {
|
||||
setMenuOpen(false);
|
||||
setModal(<ModalWithForm />);
|
||||
}}
|
||||
width="full"
|
||||
className="font-semibold rounded-none outline-none sm:hidden btn-text"
|
||||
className="sm:hidden btn-text py-6 font-semibold rounded-none outline-none"
|
||||
>
|
||||
Оставить заявку
|
||||
</Button>
|
||||
<ChooseLang currentLang="RU" />
|
||||
<ChooseLang currentLang="EN" />
|
||||
</div>
|
||||
<div className="gridgrid-cols-[2fr_1fr_1fr] sm:grid-cols-2">
|
||||
{/* <ChooseLang currentLang="RU" />
|
||||
<ChooseLang currentLang="EN" /> */}
|
||||
</div>
|
||||
</motion.div>
|
||||
</header>
|
||||
@@ -107,23 +103,23 @@ function BurgerAnchor({
|
||||
);
|
||||
}
|
||||
|
||||
function ChooseLang({ currentLang }: { currentLang: 'RU' | 'EN' }) {
|
||||
const { setLang, lang } = useLanguageStore();
|
||||
// function ChooseLang({ currentLang }: { currentLang: 'RU' | 'EN' }) {
|
||||
// const { setLang, lang } = useLanguageStore();
|
||||
|
||||
return (
|
||||
<button
|
||||
onClick={() => setLang(currentLang)}
|
||||
className={
|
||||
'min-h-[72px] w-full h-full btn-text font-semibold bg-[#14161F] sm:hover:bg-[#3D425C] border active:bg-[#14161F] outline-none ' +
|
||||
(lang === currentLang
|
||||
? '[border-image:linear-gradient(to_right,#798FFF,#D375FF)_3]'
|
||||
: 'border-[#3D425C]')
|
||||
}
|
||||
>
|
||||
{currentLang}
|
||||
</button>
|
||||
);
|
||||
}
|
||||
// return (
|
||||
// <button
|
||||
// onClick={() => setLang(currentLang)}
|
||||
// className={
|
||||
// 'min-h-[72px] w-full h-full btn-text font-semibold bg-[#14161F] sm:hover:bg-[#3D425C] border active:bg-[#14161F] outline-none ' +
|
||||
// (lang === currentLang
|
||||
// ? '[border-image:linear-gradient(to_right,#798FFF,#D375FF)_3]'
|
||||
// : 'border-[#3D425C]')
|
||||
// }
|
||||
// >
|
||||
// {currentLang}
|
||||
// </button>
|
||||
// );
|
||||
// }
|
||||
|
||||
// function LangToggler({ lang }: { lang: Lang }) {
|
||||
// const [open, setOpen] = useState(false);
|
||||
@@ -139,7 +135,7 @@ function ChooseLang({ currentLang }: { currentLang: 'RU' | 'EN' }) {
|
||||
// <button
|
||||
// ref={langTogglerRef}
|
||||
// onClick={() => setOpen(prev => !prev)}
|
||||
// className="flex items-center h-full mx-6 font-semibold outline-none gap-x-1 btn-text"
|
||||
// className="btn-text flex gap-x-1 items-center mx-6 h-full font-semibold outline-none"
|
||||
// >
|
||||
// {lang}
|
||||
// <ChevronDownIcon />
|
||||
|
||||
@@ -16,7 +16,7 @@ export function Contacts() {
|
||||
return (
|
||||
<div className="sm:grid lg:grid-cols-12 sm:grid-cols-2 lg:gap-x-4 sm:gap-x-14 lg:gap-y-[68px] pb-20 pt-[70px]">
|
||||
<h2 className="lg:col-span-7 sm:col-span-full h2 max-lg:mb-6 font-medium">
|
||||
Хотите использовать интерактивные тренажеры в обучении?
|
||||
Хотите использовать интерактивные тренажеры в обучении?
|
||||
<br />
|
||||
<span className="text-gradient">Давайте обсудим детали</span>
|
||||
</h2>
|
||||
@@ -30,7 +30,7 @@ export function Contacts() {
|
||||
/>
|
||||
</div>
|
||||
}
|
||||
className="lg:col-span-3 sm:max-lg:mb-20 max-sm:mb-14 self-end row-start-2 px-6 py-4"
|
||||
className="lg:col-span-3 sm:max-lg:mb-20 max-sm:mb-14 row-start-2 self-end px-6 py-4"
|
||||
width="full"
|
||||
onClick={() => setModal(<ModalWithForm />)}
|
||||
>
|
||||
@@ -38,32 +38,32 @@ export function Contacts() {
|
||||
</Button>
|
||||
<div className="lg:col-start-9 lg:col-span-4 sm:col-span-1 sm:col-start-1 max-sm:mb-8 space-y-3">
|
||||
<h4 className="mb-1 text-xl font-medium">Свяжитесь с нами</h4>
|
||||
<Button
|
||||
color="secondary"
|
||||
className="py-4"
|
||||
width="full"
|
||||
icon={<ClassNameWrapper element={<MailIcon />} className="w-8 h-8" />}
|
||||
onClick={() => {
|
||||
window.location.href = 'mailto:info@graff.tech';
|
||||
}}
|
||||
>
|
||||
<span className="btn-text opacity-80">Написать</span>
|
||||
</Button>
|
||||
<Button
|
||||
color="secondary"
|
||||
className="py-4"
|
||||
width="full"
|
||||
icon={<PhoneIcon />}
|
||||
onClick={() => {
|
||||
window.location.href = 'tel:88007700067';
|
||||
}}
|
||||
>
|
||||
<span className="btn-text opacity-80">Позвонить</span>
|
||||
</Button>
|
||||
<Link to={'mailto:info@graff.tech'} className="block">
|
||||
<Button
|
||||
color="secondary"
|
||||
className="py-4"
|
||||
width="full"
|
||||
icon={
|
||||
<ClassNameWrapper element={<MailIcon />} className="w-8 h-8" />
|
||||
}
|
||||
>
|
||||
<span className="btn-text opacity-80">Написать</span>
|
||||
</Button>
|
||||
</Link>
|
||||
<Link to={'tel:88007700067'} className="block">
|
||||
<Button
|
||||
color="secondary"
|
||||
className="py-4"
|
||||
width="full"
|
||||
icon={<PhoneIcon />}
|
||||
>
|
||||
<span className="btn-text opacity-80">Позвонить</span>
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
<div className="lg:col-start-9 lg:col-span-4 lg:row-start-2 sm:row-start-3 lg:self-end sm:flex sm:flex-col sm:justify-between col-start-2 space-y-4">
|
||||
<h4 className="h4 font-medium">Социальные сети</h4>
|
||||
<div className="gap-x-2 flex">
|
||||
<div className="flex gap-x-2">
|
||||
<Link
|
||||
to={'https://www.youtube.com/@GRAFFtech'}
|
||||
className="p-4 rounded-full opacity-80 border-[#3D425C] border hover:border-[#52587A] transition-all"
|
||||
|
||||
@@ -17,21 +17,21 @@ export function Decreasing() {
|
||||
</span>{' '}
|
||||
сделать обучение сотрудников безопасней и эффективней
|
||||
</Title>
|
||||
<div className="grid grid-cols-2 mt-6 lg:mt-14 gap-x-4 gap-y-6">
|
||||
<div className="col-span-2 space-y-10 lg:col-start-1 sm:max-lg:col-start-1 xl:col-span-1">
|
||||
<div className="lg:mt-14 grid grid-cols-2 gap-x-4 gap-y-6 mt-6">
|
||||
<div className="lg:col-start-1 sm:max-lg:col-start-1 xl:col-span-1 col-span-2 space-y-10">
|
||||
<div>
|
||||
{[
|
||||
'снижение количества несчастных случаев',
|
||||
'уменьшение количества ошибок при ТО и ППР',
|
||||
'меньше случаев внеплановой остановки оборудования',
|
||||
'снижение расходов на закупку реальной техники и оборудования для обучения',
|
||||
'снижение расходов на закупку реальной техники и оборудования для обучения',
|
||||
'сокращение сроков обучения',
|
||||
].map((text, index) => (
|
||||
<DecreasingOption key={index} text={text} number={index + 1} />
|
||||
))}
|
||||
</div>
|
||||
<Button
|
||||
className="w-full py-4 text-xl font-bold xl:w-1/2 lg:w-1/3 sm:w-1/2"
|
||||
className="xl:w-1/2 lg:w-1/3 sm:w-1/2 py-4 w-full text-xl font-bold"
|
||||
icon={
|
||||
<div className="p-2 bg-white rounded-full">
|
||||
<ClassNameWrapper
|
||||
@@ -72,12 +72,12 @@ function DecreasingOption({ text, number }: { text: string; number: number }) {
|
||||
return (
|
||||
<div className="group">
|
||||
<AppearanceHr delay={number * 0.5} />
|
||||
<div className="flex items-center justify-between py-5 gap-x-4">
|
||||
<div className="flex gap-x-4 justify-between items-center py-5">
|
||||
<Plus text={text} />
|
||||
<Number number={number} />
|
||||
</div>
|
||||
<AppearanceHr
|
||||
className="hidden group-last:block"
|
||||
className="group-last:block hidden"
|
||||
delay={(number + 1) * 0.5}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -8,24 +8,24 @@ export function Distance() {
|
||||
className="lg:py-[100px] py-14"
|
||||
>
|
||||
<Title className="lg:w-4/5 lg:mb-14 mb-6">
|
||||
Платформа GRAFF.training позволяет осуществлять
|
||||
<span className="text-gradient"> дистанционное обучение</span>{' '}
|
||||
с любого устройства
|
||||
Платформа GRAFF.training позволяет осуществлять
|
||||
<span className="text-gradient"> дистанционное обучение</span> с любого
|
||||
устройства
|
||||
</Title>
|
||||
<div className="sm:grid lg:grid-cols-12 gap-x-4 gap-y-6">
|
||||
<p className="lg:col-start-1 max-sm:mb-6 col-span-6 row-start-1 text-xl">
|
||||
Обучающиеся будут получать доступ к системе с высоко детализированной
|
||||
3D графикой для прохождения сценариев на любом устройстве, без
|
||||
необходимости установки дополнительного ПО.
|
||||
Обучающиеся будут получать доступ к системе с высокодетализированной
|
||||
3D‑графикой для прохождения сценариев на любом устройстве,
|
||||
без необходимости установки дополнительного ПО.
|
||||
</p>
|
||||
<div className="lg:col-start-1 max-sm:mb-4 self-stretch col-span-6 row-start-2">
|
||||
<div className="lg:col-start-1 max-sm:mb-4 col-span-6 row-start-2 self-stretch">
|
||||
<img
|
||||
src="/images/distance/datamining_2.jpg"
|
||||
alt="дистанционное обучение с любого устройства"
|
||||
className="object-cover object-[bottom_-1px_left_-1px]"
|
||||
/>
|
||||
</div>
|
||||
<div className="lg:col-start-7 lg:col-span-6 self-stretch col-span-3 row-start-2">
|
||||
<div className="lg:col-start-7 lg:col-span-6 col-span-3 row-start-2 self-stretch">
|
||||
<img
|
||||
src="/images/distance/datamining_1.jpg"
|
||||
alt="дистанционное обучение с любого устройства"
|
||||
|
||||
@@ -7,7 +7,7 @@ import { useWindowWidth } from '../../hooks/useWindowWidth';
|
||||
export function Effeciency() {
|
||||
return (
|
||||
<div className="lg:py-[70px] py-14">
|
||||
<div className="pt-5 gap-x-4 gap-y-8 sm:grid lg:grid-cols-12 sm:grid-cols-8 max-sm:space-y-6">
|
||||
<div className="sm:grid lg:grid-cols-12 sm:grid-cols-8 max-sm:space-y-6 gap-x-4 gap-y-8 pt-5">
|
||||
<MiniTitle
|
||||
text={'экономическая эффективность'}
|
||||
className="col-span-3"
|
||||
@@ -16,7 +16,7 @@ export function Effeciency() {
|
||||
<Figure
|
||||
percents={50}
|
||||
type="charts"
|
||||
title={'сокращение бюджета на обучение сотрудников'}
|
||||
title={'сокращение бюджета на обучение сотрудников'}
|
||||
/>
|
||||
<Figure
|
||||
percents={30}
|
||||
@@ -26,24 +26,24 @@ export function Effeciency() {
|
||||
<Figure
|
||||
percents={90}
|
||||
type="pizza"
|
||||
title={'готовность к опасным ситуациям выше на'}
|
||||
title={'готовность к опасным ситуациям выше на'}
|
||||
/>
|
||||
</div>
|
||||
<AppearanceText
|
||||
className="row-start-3 lg:col-span-6 col-span-full"
|
||||
className="lg:col-span-6 col-span-full row-start-3"
|
||||
splits={[
|
||||
'В тренажере человек ',
|
||||
'принимает решения ',
|
||||
'так же, ',
|
||||
'как в реальном мире, ',
|
||||
'как в реальном мире, ',
|
||||
'активируя ',
|
||||
'те же нейронные ',
|
||||
'цепочки в мозгу. ',
|
||||
'цепочки в мозгу. ',
|
||||
'Это позволяет ',
|
||||
'добиться ',
|
||||
'реальной ',
|
||||
'производительности ',
|
||||
'в работе. ',
|
||||
'в работе. ',
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -101,13 +101,15 @@ export function ModalWithForm() {
|
||||
<div className="fixed flex flex-col gap-4 top-0 right-0 h-full sm:w-[408px] w-full bg-[#14161F] overflow-y-auto sm:p-8 p-6">
|
||||
{!isSend ? (
|
||||
<div className="space-y-8">
|
||||
<div className="flex items-center justify-between">
|
||||
<p className="font-medium accent">Оставьте заявку</p>
|
||||
<div className="flex justify-between items-center">
|
||||
<p className="accent font-medium">Оставьте заявку</p>
|
||||
<button
|
||||
onClick={() => setModal(null)}
|
||||
className="p-2 transition-colors rounded-full lg:hover:bg-white lg:hover:bg-opacity-10"
|
||||
className="lg:hover:bg-white lg:hover:bg-opacity-10 p-2 rounded-full transition-colors"
|
||||
>
|
||||
<CloseIcon />
|
||||
<div className="size-6">
|
||||
<CloseIcon />
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
<form onSubmit={handleSubmit}>
|
||||
@@ -154,7 +156,7 @@ export function ModalWithForm() {
|
||||
value={phone}
|
||||
placeholder={placeholder}
|
||||
onChange={e => setPhone(e.target.value.replace(/ /g, ''))}
|
||||
className="w-full transition-all bg-transparent rounded-none outline-none h4 placeholder:h4 placeholder:font-medium placeholder:select-none peer"
|
||||
className="h4 placeholder:h4 placeholder:font-medium placeholder:select-none peer w-full bg-transparent rounded-none transition-all outline-none"
|
||||
/>
|
||||
<div className="bottom-0 absolute w-full border-b border-[#3D425C] peer-focus:border-white -mb-2" />
|
||||
</div>
|
||||
@@ -237,7 +239,7 @@ export function ModalWithForm() {
|
||||
) : (
|
||||
<div className="">
|
||||
<div className="space-y-8">
|
||||
<h2 className="font-medium h2">Спасибо за отправку заявки!</h2>
|
||||
<h2 className="h2 font-medium">Спасибо за отправку заявки!</h2>
|
||||
<p className="m-text">
|
||||
Мы ценим ваш интерес к нашей компании и в ближайшее время свяжемся
|
||||
с вами для уточнения деталей проекта.
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
export function Motivation() {
|
||||
return (
|
||||
<div>
|
||||
<div className="grid grid-cols-12 lg:py-28 sm:py-12 py-14">
|
||||
<h1 className="2xl:mb-[38px] pb-8 font-medium lg:block max-lg:hidden h1 col-span-full">
|
||||
<div className="lg:py-28 sm:py-12 grid grid-cols-12 py-14">
|
||||
<h1 className="2xl:mb-[38px] pb-8 font-medium max-lg:hidden h1 col-span-full">
|
||||
Создаем
|
||||
<span className="text-gradient"> интерактивные тренажеры </span>
|
||||
для промышленности и образования
|
||||
для промышленности и образования
|
||||
</h1>
|
||||
<h1 className="font-medium lg:hidden h1 col-span-full">
|
||||
<h1 className="lg:hidden h1 col-span-full font-medium">
|
||||
Интерактивные тренажеры
|
||||
<span className="text-gradient"> для обучения сотрудников</span>
|
||||
<span className="text-gradient"> для обучения сотрудников</span>
|
||||
</h1>
|
||||
<h3 className="lg:col-span-full max-lg:hidden h3">
|
||||
Помогаем сократить затраты на обучение, повысить безопасность и
|
||||
|
||||
@@ -12,7 +12,7 @@ export function MultiUser() {
|
||||
itemType="http://schema.org/MultiUser"
|
||||
className="lg:py-[100px] py-14 sm:grid lg:grid-cols-12 sm:grid-cols-3"
|
||||
>
|
||||
<Title className="row-start-1 mb-6 lg:mb-14 col-span-full">
|
||||
<Title className="lg:mb-14 col-span-full row-start-1 mb-6">
|
||||
<span className="text-gradient text-wrap">Многопользовательский </span>
|
||||
<br className="lg:hidden" />
|
||||
режим обучения
|
||||
@@ -22,15 +22,15 @@ export function MultiUser() {
|
||||
itemProp="multiUserFeatures"
|
||||
itemScope
|
||||
itemType="http://schema.org/MultiUserFeatures"
|
||||
className="grid max-lg:col-span-full sm:max-lg:row-start-2 lg:col-span-6 lg:row-span-2 lg:grid-cols-2 sm:grid-cols-3 lg:-mr-10 max-lg:-mx-6"
|
||||
className="max-lg:col-span-full sm:max-lg:row-start-2 lg:col-span-6 lg:row-span-2 lg:grid-cols-2 sm:grid-cols-3 lg:-mr-10 max-lg:-mx-6 grid"
|
||||
>
|
||||
<MultiUserFeature
|
||||
type="processes"
|
||||
text="отработка производственных процессов, в которых участвует группа людей"
|
||||
text="отработка производственных процессов, в которых участвует группа людей"
|
||||
/>
|
||||
<MultiUserFeature
|
||||
type="plans"
|
||||
text="командная отработка планов мероприятий по локализации и ликвидации последствий аварий"
|
||||
text="командная отработка планов мероприятий по локализации и ликвидации последствий аварий"
|
||||
/>
|
||||
<MultiUserFeature
|
||||
type="teamwork"
|
||||
@@ -39,7 +39,7 @@ export function MultiUser() {
|
||||
</div>
|
||||
<div className="lg:hidden lg:col-span-6 col-start-1 lg:row-span-2 sm:col-span-3 lg:row-start-2 sm:row-start-3 sm:row-span-1 bg-[url(/images/availables/image.jpg)] bg-cover bg-no-repeat bg-center sm:aspect-[728/356] aspect-[3/2] max-sm:-mx-6" />
|
||||
<AppearanceText
|
||||
className="col-span-7 col-start-1 mt-8 lg:col-span-6 max-lg:mt-6"
|
||||
className="lg:col-span-6 max-lg:mt-6 col-span-7 col-start-1 mt-8"
|
||||
splits={[
|
||||
'В одном ',
|
||||
'цифровом ',
|
||||
|
||||
@@ -29,23 +29,23 @@ export function ForTeachingTab() {
|
||||
transition={{ duration: 1.5, delay: 0.5 }}
|
||||
className="flex justify-between"
|
||||
>
|
||||
<h2 className="font-medium h2">
|
||||
Интерактивные тренажеры для учебных заведений
|
||||
<h2 className="h2 font-medium">
|
||||
Интерактивные тренажеры для учебных заведений
|
||||
</h2>
|
||||
<p className="h3 font-medium text-[#3D425C]">03</p>
|
||||
</motion.div>
|
||||
<div className="flex justify-between max-sm:flex-col">
|
||||
<div className="max-sm:flex-col flex justify-between">
|
||||
<div className="sm:max-w-[calc(500/768*100vw)] mt-6">
|
||||
<div itemProp="creating" className="space-y-4 lg:max-w-[40vw] flex-1">
|
||||
<ForTeachingOption
|
||||
title="cоздание обучающих VR систем"
|
||||
description="Проведение виртуальных практических работ, создание учебных мастерских и стендов"
|
||||
description="Проведение виртуальных практических работ, создание учебных мастерских и стендов"
|
||||
type="teaching"
|
||||
/>
|
||||
<ForTeachingOption
|
||||
title="cоздание VR лабораторий"
|
||||
description="Тренажер для проведения лабораториных работ позволит избежать
|
||||
поломки оборудования, а также экономить на расходных средствах"
|
||||
description="Тренажер для проведения лабораториных работ позволит избежать
|
||||
поломки оборудования, а также экономить на расходных средствах"
|
||||
type="labs"
|
||||
/>
|
||||
<motion.p
|
||||
@@ -53,10 +53,10 @@ export function ForTeachingTab() {
|
||||
initial={{ opacity: 0 }}
|
||||
animate={textInView ? { opacity: 1 } : {}}
|
||||
transition={{ duration: 1, delay: 1 }}
|
||||
className="font-medium lg:text-2xl sm:text-xl"
|
||||
className="lg:text-2xl sm:text-xl font-medium"
|
||||
>
|
||||
Оснащение учебных классов и центров всем необходимым для
|
||||
современного обучения под «ключ»
|
||||
Оснащение учебных классов и центров всем необходимым
|
||||
для современного обучения «под ключ»
|
||||
</motion.p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -65,7 +65,7 @@ export function ForTeachingTab() {
|
||||
animate={imgInView ? { opacity: 1 } : {}}
|
||||
transition={{ duration: 1, delay: 1 }}
|
||||
ref={imgRef}
|
||||
className="mt-5 -mr-4 lg:-mr-10 sm:-mr-6 max-sm:-mx-6 max-sm:-mb-4"
|
||||
className="lg:-mr-10 sm:-mr-6 max-sm:-mx-6 max-sm:-mb-4 mt-5 -mr-4"
|
||||
>
|
||||
<img
|
||||
src="/images/products/teaching/teaching.png"
|
||||
@@ -74,7 +74,7 @@ export function ForTeachingTab() {
|
||||
/>
|
||||
<img
|
||||
src="/images/products/teaching/teaching_mobile.png"
|
||||
className="w-full mt-5 -mx-6 sm:hidden"
|
||||
className="sm:hidden -mx-6 mt-5 w-full"
|
||||
alt="обучение"
|
||||
/>
|
||||
</motion.div>
|
||||
@@ -105,11 +105,11 @@ function ForTeachingOption({
|
||||
>
|
||||
{getIcon(type, true, 'max-sm:hidden min-w-11')}
|
||||
<div className="lg:pl-4 sm:pl-[13px] sm:border-l border-[#3D425C] w-[90%]">
|
||||
<div className="flex items-center mb-1 sm:items-start sm:max-lg:flex-col max-sm:gap-x-2">
|
||||
<div className="sm:items-start sm:max-lg:flex-col max-sm:gap-x-2 flex items-center mb-1">
|
||||
{getIcon(type, inView, 'sm:hidden min-w-11')}
|
||||
<h4 className="font-medium lg:text-2xl sm:text-xl">{title}</h4>
|
||||
<h4 className="lg:text-2xl sm:text-xl font-medium">{title}</h4>
|
||||
</div>
|
||||
<p className="opacity-60 l-text">{description}</p>
|
||||
<p className="l-text opacity-60">{description}</p>
|
||||
</div>
|
||||
</motion.div>
|
||||
);
|
||||
|
||||
@@ -32,9 +32,9 @@ function TeachingItem({
|
||||
>
|
||||
{getIcon(iconType, true, 'max-sm:hidden sm:max-lg:mb-[14px] min-w-11')}
|
||||
<div className="sm:border-l border-[#3D425C] sm:pl-4">
|
||||
<div className="flex items-center mb-2 max-sm:gap-x-2">
|
||||
<div className="max-sm:gap-x-2 flex items-center mb-2">
|
||||
{getIcon(iconType, rootInView, 'sm:hidden min-w-11')}
|
||||
<h4 className="font-medium lg:text-2xl sm:text-xl">{title}</h4>
|
||||
<h4 className="lg:text-2xl sm:text-xl font-medium">{title}</h4>
|
||||
</div>
|
||||
<p className="l-text opacity-60">{text}</p>
|
||||
</div>
|
||||
@@ -63,12 +63,12 @@ export function IndustrialTab() {
|
||||
animate={{ opacity: titleInView ? 1 : 0 }}
|
||||
transition={{ duration: 1, delay: 0.5 }}
|
||||
ref={titleRef}
|
||||
className="flex items-center justify-between"
|
||||
className="flex justify-between items-center"
|
||||
>
|
||||
<h2 className="w-full font-medium h2">Промышленные тренажеры</h2>
|
||||
<h2 className="h2 w-full font-medium">Промышленные тренажеры</h2>
|
||||
<p className="h3 font-medium text-[#3D425C]">01</p>
|
||||
</motion.div>
|
||||
<div className="flex justify-between max-sm:items-center max-sm:flex-col">
|
||||
<div className="max-sm:items-center max-sm:flex-col flex justify-between">
|
||||
<div
|
||||
itemProp="education"
|
||||
itemScope
|
||||
@@ -77,20 +77,20 @@ export function IndustrialTab() {
|
||||
>
|
||||
<TeachingItem
|
||||
iconType="danger"
|
||||
text="отработка проведения технологических операций: оказание первой помощи, работы на высоте, работа с доменной печью и т.п."
|
||||
title="обучение навыкам работы на опасных производствах"
|
||||
text="отработка проведения технологических операций: оказание первой помощи, работы на высоте, работа с доменной печью и т.п."
|
||||
title="обучение навыкам работы на опасных производствах"
|
||||
index={0}
|
||||
/>
|
||||
<TeachingItem
|
||||
iconType="service"
|
||||
text="отработка определения неисправностей оборудования и выполнения ремонтных работ на цифровом двойнике"
|
||||
title="обучение обслуживанию и ремонту оборудования, систем, техники"
|
||||
text="отработка определения неисправностей оборудования и выполнения ремонтных работ на цифровом двойнике"
|
||||
title="обучение обслуживанию и ремонту оборудования, систем, техники"
|
||||
index={1}
|
||||
/>
|
||||
<TeachingItem
|
||||
iconType="safety"
|
||||
text="отработка плана мероприятий по локализации и ликвидации последствий аварий. "
|
||||
title="обучение правилам промышленной безопасности и охраны труда"
|
||||
text="отработка плана мероприятий по локализации и ликвидации последствий аварий"
|
||||
title="обучение правилам промышленной безопасности и охраны труда"
|
||||
index={2}
|
||||
/>
|
||||
</div>
|
||||
@@ -99,7 +99,7 @@ export function IndustrialTab() {
|
||||
initial={{ opacity: 0 }}
|
||||
animate={imgInView ? { opacity: 1 } : {}}
|
||||
transition={{ duration: 1, delay: 1 }}
|
||||
className="relative bottom-0 lg:left-10 sm:left-6 left-4 lg:top-10 sm:top-6 top-4"
|
||||
className="lg:left-10 sm:left-6 lg:top-10 sm:top-6 relative bottom-0 top-4 left-4"
|
||||
>
|
||||
<img
|
||||
src="/images/products/trainings/trainings_desktop.png"
|
||||
@@ -113,7 +113,7 @@ export function IndustrialTab() {
|
||||
/>
|
||||
<img
|
||||
src="/images/products/trainings/trainings_mobile.png"
|
||||
className="object-cover object-center sm:hidden"
|
||||
className="sm:hidden object-cover object-center"
|
||||
alt="тренажеры"
|
||||
/>
|
||||
</motion.div>
|
||||
|
||||
@@ -40,9 +40,9 @@ export function SimulatorsTab() {
|
||||
initial={{ opacity: 0 }}
|
||||
animate={titleInView ? { opacity: 1 } : {}}
|
||||
transition={{ duration: 1, delay: 0.5 }}
|
||||
className="flex justify-between gap-x-2"
|
||||
className="flex gap-x-2 justify-between"
|
||||
>
|
||||
<h2 className="font-medium h2">Симуляторы управления техникой</h2>
|
||||
<h2 className="h2 font-medium">Симуляторы управления техникой</h2>
|
||||
<p className="text-[#3D425C] h3 font-medium">02</p>
|
||||
</motion.div>
|
||||
<div
|
||||
@@ -94,8 +94,8 @@ export function SimulatorsTab() {
|
||||
/>
|
||||
<p className="l-text opacity-60">
|
||||
Модель позволяет производить расчеты характеристик работы,
|
||||
отслеживать безопасность работы устройств и симулировать внештатные
|
||||
ситуации.
|
||||
отслеживать безопасность работы устройств и симулировать внештатные
|
||||
ситуации
|
||||
</p>
|
||||
</motion.div>
|
||||
</div>
|
||||
|
||||
@@ -15,8 +15,8 @@ export function Teaching() {
|
||||
координацию между всеми участниками процесса
|
||||
</Title>
|
||||
<Title className="2xl:mb-[29px] lg:hidden mb-6 col-span-full">
|
||||
<span className="text-gradient">Дистанционное обучение</span> на базе
|
||||
платформы GRAFF TRANING
|
||||
<span className="text-gradient">Дистанционное обучение</span> на базе
|
||||
платформы GRAFF.training
|
||||
</Title>
|
||||
<TeachingFeaturesForDesktop />
|
||||
<TeachingFeaturesForOtherScreens />
|
||||
@@ -79,8 +79,8 @@ function TeachingFeaturesForDesktop() {
|
||||
<div className="space-y-2 max-w-[calc(410/752*100%)]">
|
||||
<TeachingFeatureTitle>Видеозапись обучения</TeachingFeatureTitle>
|
||||
<TeachingFeatureDescription>
|
||||
Фиксация и хранение сессий обучения, тренировки и тестирования.
|
||||
Ретроспектива по пройденной сессии вместе с инструктором
|
||||
Фиксация и хранение сессий обучения, тренировки и тестирования.
|
||||
Ретроспектива по пройденной сессии вместе с инструктором
|
||||
</TeachingFeatureDescription>
|
||||
</div>
|
||||
<img
|
||||
@@ -155,8 +155,8 @@ function TeachingFeaturesForOtherScreens() {
|
||||
<div className="space-y-1">
|
||||
<TeachingFeatureTitle>Видеозапись обучения</TeachingFeatureTitle>
|
||||
<TeachingFeatureDescription className="sm:max-w-[calc(305/768*100vw)]">
|
||||
Фиксация и хранение сессий обучения, тренировки и тестирования.
|
||||
Ретроспектива по пройденной сессии вместе с инструктором
|
||||
Фиксация и хранение сессий обучения, тренировки и тестирования.
|
||||
Ретроспектива по пройденной сессии вместе с инструктором
|
||||
</TeachingFeatureDescription>
|
||||
</div>
|
||||
<img
|
||||
|
||||
@@ -14,33 +14,36 @@ export function Trainings() {
|
||||
className="lg:py-[70px] py-16"
|
||||
>
|
||||
<Title className="2xl:mb-[77px] lg:mb-14 mb-6 lg:w-4/5 min-[2500px]:w-[70%]">
|
||||
Предлагаем различные{' '}
|
||||
<span className="text-gradient">варианты комплектации тренажеров</span>,
|
||||
основываясь на специфике вашего тренировочного процесса
|
||||
Предлагаем различные
|
||||
<span className="text-gradient">
|
||||
{' '}
|
||||
варианты комплектации тренажеров,{' '}
|
||||
</span>
|
||||
основываясь на специфике вашего тренировочного процесса
|
||||
</Title>
|
||||
<div
|
||||
itemType="http://schema.org/TrainingsEquipmentsFeatures"
|
||||
itemScope
|
||||
itemProp="features"
|
||||
className="sm:grid lg:grid-cols-12 gap-x-4 grid-cols-8"
|
||||
className="sm:grid lg:grid-cols-12 grid-cols-8 gap-x-4"
|
||||
>
|
||||
<TrainingsFeature
|
||||
order={1}
|
||||
src="/images/trainings/vr.png"
|
||||
title="VR - тренажеры"
|
||||
text="Обучение навыкам работы с инструментами и оборудованием. Пешее хождение по территории или между оборудованием"
|
||||
text="Обучение навыкам работы с инструментами и оборудованием. Пешее хождение по территории или между оборудованием"
|
||||
/>
|
||||
<TrainingsFeature
|
||||
order={2}
|
||||
src="/images/trainings/stand.png"
|
||||
title="Cтенды"
|
||||
text="Отработки навыков вождения и управления техникой. Работа с панелями управления"
|
||||
text="Отработки навыков вождения и управления техникой. Работа с панелями управления"
|
||||
/>
|
||||
<TrainingsFeature
|
||||
order={3}
|
||||
src="/images/trainings/classroom.png"
|
||||
title="Учебные классы"
|
||||
text="Оснащение учебных классов и центров всем необходимым для современного обучения и профессиональной подготовки кадров"
|
||||
text="Оснащение учебных классов и центров всем необходимым для современного обучения и профессиональной подготовки кадров"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -66,7 +69,7 @@ function TrainingsFeature({
|
||||
itemProp={title}
|
||||
itemScope
|
||||
itemType={`http://schema.org/${title}`}
|
||||
className="lg:col-start-1 col-span-full group"
|
||||
className="lg:col-start-1 group col-span-full"
|
||||
>
|
||||
<AppearanceHr delay={0.5 * order} />
|
||||
<div
|
||||
@@ -75,9 +78,9 @@ function TrainingsFeature({
|
||||
>
|
||||
<div className="sm:space-y-4 lg:w-1/3 sm:w-1/2 col-span-1">
|
||||
<h3 className="max-sm:mb-2 h3 font-medium">{title}</h3>
|
||||
<p className="opacity-60 l-text">{text}</p>
|
||||
<p className="l-text opacity-60">{text}</p>
|
||||
</div>
|
||||
<div className="sm:hidden flex items-end justify-between">
|
||||
<div className="sm:hidden flex justify-between items-end">
|
||||
<p className="text-[#52587A] m-text mb-5">[0{order}]</p>
|
||||
<div className="flex flex-col items-center">
|
||||
<img src={src} alt={title} className="relative z-30 w-[50vw]" />
|
||||
@@ -91,7 +94,7 @@ function TrainingsFeature({
|
||||
transition={{
|
||||
duration: 0.4,
|
||||
}}
|
||||
className="lg:flex items-center justify-center hidden -my-10"
|
||||
className="lg:flex hidden justify-center items-center -my-10"
|
||||
>
|
||||
<img
|
||||
src={src}
|
||||
@@ -100,7 +103,7 @@ function TrainingsFeature({
|
||||
/>
|
||||
<VrBacklightIcon className="absolute w-[24vw]" />
|
||||
</motion.div>
|
||||
<div className="lg:hidden flex items-center justify-center">
|
||||
<div className="lg:hidden flex justify-center items-center">
|
||||
<img
|
||||
src={src}
|
||||
className="w-[27vw] relative z-20 h-[calc(27vw*0.6)]"
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
export function BurgerIcon({ className = '' }: { className?: string }) {
|
||||
return (
|
||||
<svg
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
className={className}
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
|
||||
@@ -21,7 +21,7 @@ export const projects: IProject<Media>[] = [
|
||||
src: '/images/projects/plane.jpg',
|
||||
tags: ['Симулятор', 'VR-приложение'],
|
||||
title: 'L 410 NG Aircraft',
|
||||
year: '2024',
|
||||
year: '2019',
|
||||
media: Media.img,
|
||||
id: Math.random(),
|
||||
},
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ export function Button({
|
||||
icon ? 'pr-4' : ''
|
||||
} flex gap-1 items-center overflow-hidden w-${width} ${className} justify-between`}
|
||||
>
|
||||
<div className="absolute top-0 left-0 w-full h-full transition-opacity bg-black opacity-0 group-hover:opacity-10" />
|
||||
<div className="group-hover:opacity-10 absolute top-0 left-0 w-full h-full bg-black opacity-0 transition-opacity" />
|
||||
<span className={'relative font-medium' + (icon ? '' : ' m-auto')}>
|
||||
{children}
|
||||
</span>
|
||||
|
||||
Reference in New Issue
Block a user