upd
This commit is contained in:
+3
-6
@@ -6,17 +6,14 @@
|
||||
<link rel="icon" type="image/svg+xml" href="/public/favicon.svg" />
|
||||
<meta
|
||||
name="keywords"
|
||||
content="интерактивные,выставки,3D,графика,VR,AR,макеты,приложения,стенды"
|
||||
content="интерактив,выставки,3D,графика,VR,AR,макеты,приложения,стенды"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta
|
||||
name="description"
|
||||
content="Создаем интерактивные выставочные решения"
|
||||
/>
|
||||
<meta
|
||||
property="og:title"
|
||||
content="Graff.event - Интерактивные выставочные решения"
|
||||
/>
|
||||
<meta property="og:title" content="Интерактивные выставочные решения" />
|
||||
<meta property="og:site_name" content="Интерактивные выставочные решения" />
|
||||
<meta
|
||||
property="og:description"
|
||||
@@ -31,7 +28,7 @@
|
||||
<meta property="og:image:height" content="200" />
|
||||
<meta property="og:logo" content="https://graff.event/favicon.svg" />
|
||||
<meta property="og:type" content="website" />
|
||||
<title>Graff.event - Интерактивные выставочные решения</title>
|
||||
<title>Интерактивные выставочные решения</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -15,7 +15,7 @@ export function Contacts() {
|
||||
return (
|
||||
<div
|
||||
id="contacts"
|
||||
className="lg:px-6 px-4 sm:grid lg:grid-cols-12 sm:grid-cols-2 lg:grid-rows-[repeat(min-content,2)] sm:grid-rows-[repeat(min-content,3)] lg:gap-x-4 sm:gap-x-14 lg:gap-y-[68px] pb-20 pt-[70px]"
|
||||
className="lg:px-6 px-4 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="font-medium lg:col-span-7 sm:col-span-full h2 max-lg:mb-6">
|
||||
Хотите использовать интерактивные тренажеры в обучении?
|
||||
|
||||
@@ -156,7 +156,7 @@ function Device({ title, description, img }: IDevice) {
|
||||
exit={{ opacity: 0, transition: { delay: 0 } }}
|
||||
transition={{ duration: 0.4 }}
|
||||
src={img}
|
||||
alt=""
|
||||
alt={title}
|
||||
/>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
|
||||
+12
-12
@@ -16,12 +16,12 @@ export function Form() {
|
||||
<div className="lg:w-[calc(116/1600*100vw)] sm:w-[calc(116/768*100vw)] flex flex-col justify-between h-full absolute">
|
||||
<img
|
||||
src="/images/form/1_1.png"
|
||||
alt=""
|
||||
alt="Виртуальные выставки и метавселенные"
|
||||
className="animate-[spin_15s_linear_infinite] [animation-direction:reverse]"
|
||||
/>
|
||||
<img
|
||||
src="/images/form/1_2.png"
|
||||
alt=""
|
||||
alt="Тренажер РЖД: ЭП2Д, Иволга, ЭП20, ТЭ33А, ТЭМ2"
|
||||
className="animate-[spin_15s_linear_infinite] [animation-direction:reverse]"
|
||||
/>
|
||||
</div>
|
||||
@@ -29,43 +29,43 @@ export function Form() {
|
||||
<img
|
||||
src="/images/form/2_1.png"
|
||||
className="animate-[spin_15s_linear_infinite] [animation-direction:reverse]"
|
||||
alt=""
|
||||
alt="L 410 NG Aircraft"
|
||||
/>
|
||||
<img
|
||||
src="/images/form/2_2.png"
|
||||
className="animate-[spin_15s_linear_infinite] [animation-direction:reverse]"
|
||||
alt=""
|
||||
alt="ЖК «Upside Towers»"
|
||||
/>
|
||||
</div>
|
||||
<div className="lg:w-[calc(116/1600*100vw)] sm:w-[calc(116/768*100vw)] flex flex-col justify-between h-full absolute rotate-90">
|
||||
<div className="-rotate-45">
|
||||
<div className="-rotate-90">
|
||||
<img
|
||||
src="/images/form/3_1.png"
|
||||
className="animate-[spin_15s_linear_infinite] [animation-direction:reverse]"
|
||||
alt=""
|
||||
alt="Стенд GRAFF.estate на Всероссийском Жилищном конгрессе в Сочи"
|
||||
/>
|
||||
</div>
|
||||
<div className="rotate-[135deg]">
|
||||
<div className="-rotate-90">
|
||||
<img
|
||||
src="/images/form/3_2.png"
|
||||
className="animate-[spin_15s_linear_infinite] [animation-direction:reverse]"
|
||||
alt=""
|
||||
alt="Интерактивная презентация военного корабля"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="lg:w-[calc(116/1600*100vw)] sm:w-[calc(116/768*100vw)] flex flex-col justify-between h-full absolute rotate-[135deg]">
|
||||
<div className="rotate-90">
|
||||
<div className="-rotate-90">
|
||||
<img
|
||||
src="/images/form/4_1.png"
|
||||
className="animate-[spin_15s_linear_infinite] [animation-direction:reverse]"
|
||||
alt=""
|
||||
alt="Симулятор погрузчика"
|
||||
/>
|
||||
</div>
|
||||
<div className="rotate-45">
|
||||
<div className="-rotate-[135deg]">
|
||||
<img
|
||||
src="/images/form/4_2.png"
|
||||
className="animate-[spin_15s_linear_infinite] [animation-direction:reverse]"
|
||||
alt=""
|
||||
alt="Макет кабины машиниста «Иволга» на выставке ВДНХ"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -10,8 +10,8 @@ import { AnimatePresence, motion } from 'framer-motion';
|
||||
|
||||
export const DesktopInteractionSlide = forwardRef<
|
||||
{ animationing: boolean },
|
||||
IInteraction & { active: boolean; onClick: () => void; bordered: boolean }
|
||||
>(({ active, video, onClick, bordered, title }, ref) => {
|
||||
IInteraction & { active: boolean; onClick: () => void }
|
||||
>(({ active, video, onClick, title }, ref) => {
|
||||
const videoRef = useRef<HTMLVideoElement>(null);
|
||||
|
||||
const [animationing, setAnimationing] = useState(false);
|
||||
@@ -45,8 +45,7 @@ export const DesktopInteractionSlide = forwardRef<
|
||||
duration: 1,
|
||||
}}
|
||||
className={
|
||||
'bg-[#14161F] first:border-l last:border-r flex flex-col transition-all border-[#3D425C] h-fit ' +
|
||||
(bordered ? 'border' : 'border-y') +
|
||||
'bg-[#14161F] border flex flex-col border-[#3D425C] h-fit [&:not(:first-child)]:relative [&:not(:first-child)]:right-px [&:nth-child(3)]:right-0.5 [&:nth-child(4)]:right-[3px] ' +
|
||||
(active ? ' p-8 justify-between' : ' content-center justify-center')
|
||||
}
|
||||
>
|
||||
@@ -55,8 +54,9 @@ export const DesktopInteractionSlide = forwardRef<
|
||||
<motion.p
|
||||
initial={{ opacity: 0, y: 10 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
exit={{ opacity: 0, transition: { delay: 0 } }}
|
||||
transition={{ delay: 1.25 }}
|
||||
className="font-medium text-[32px] leading-none mt-0"
|
||||
className="font-medium text-[32px] leading-none mt-0 mx-8"
|
||||
>
|
||||
{title}
|
||||
</motion.p>
|
||||
|
||||
@@ -29,7 +29,7 @@ export function DesktopInteractionsSlider() {
|
||||
onRightClick={() => goToSlide('next')}
|
||||
className="flex justify-end"
|
||||
/>
|
||||
<div className="flex items-end h-[600px]">
|
||||
<div className="flex items-end aspect-[1552/600]">
|
||||
<AnimatePresence mode="wait">
|
||||
{interactions.map(({ video, title }, index) => (
|
||||
<DesktopInteractionSlide
|
||||
@@ -38,7 +38,6 @@ export function DesktopInteractionsSlider() {
|
||||
title={title}
|
||||
active={index === current}
|
||||
onClick={() => goToSlide(index)}
|
||||
bordered={index === current || Math.abs(index - current) === 2}
|
||||
ref={index === current ? currentSlideRef : null}
|
||||
/>
|
||||
))}
|
||||
|
||||
@@ -23,7 +23,7 @@ export function Footer() {
|
||||
<div className="sm:px-6 px-4 py-[30px] flex items-center border-t xl:border-l sm:border-r border-[#3D425C] flex-1 justify-between sm:max-xl:row-start-2 sm:max-xl:col-start-1">
|
||||
<div>
|
||||
<Contact type="email" text="info@graff.tech" />
|
||||
<Contact type="phone" text="+7 800 770 00 67" />
|
||||
<Contact type="phone" text="8 800 770 00 67" />
|
||||
</div>
|
||||
<div className="font-medium p-[14px] border border-[#3D425C] rounded-full m-text">
|
||||
RU
|
||||
@@ -31,7 +31,7 @@ export function Footer() {
|
||||
</div>
|
||||
<div className="sm:px-6 px-4 py-[30px] flex items-center border-t border-[#3D425C] flex-1 justify-between sm:max-xl:row-start-2 sm:max-xl:col-start-2">
|
||||
<div>
|
||||
<Contact type="email" text="info@graff.tech" />
|
||||
<Contact type="email" text="sam@graff.tech" />
|
||||
<Contact type="phone" text="+971 58 506 0097" />
|
||||
</div>
|
||||
<div className="font-medium py-[14px] px-[10px] border border-[#3D425C] rounded-full m-text">
|
||||
|
||||
@@ -103,6 +103,11 @@ function HashLink({ path, text }: { path: string; text: string }) {
|
||||
<Link
|
||||
className="border-l lg:last:border-r border-[#3D425C] px-10 self-stretch font-medium lg:text-[#9299BD] content-center hover:bg-[#3D425C] max-lg:flex max-lg:py-6 btn-text bg-[#14161F] w-full max-lg:[&:not(:last-child)]:border-b"
|
||||
to={path}
|
||||
onClick={() => {
|
||||
document
|
||||
.getElementById(path.slice(2))
|
||||
?.scrollIntoView({ behavior: 'smooth' });
|
||||
}}
|
||||
>
|
||||
{text}
|
||||
</Link>
|
||||
|
||||
@@ -3,9 +3,9 @@ import { Showreel } from './Showreel';
|
||||
|
||||
export function Motivation() {
|
||||
return (
|
||||
<div className="lg:pt-20 sm:pt-14 pt-16">
|
||||
<div className="lg:space-y-12 space-y-8 mb-6">
|
||||
<h1 className="h1 font-medium">
|
||||
<div className="pt-16 lg:pt-20 sm:pt-14">
|
||||
<div className="mb-6 space-y-8 lg:space-y-12">
|
||||
<h1 className="font-medium h1">
|
||||
Создаем интерактивные
|
||||
<span className="text-gradient"> выставочные решения</span>
|
||||
</h1>
|
||||
@@ -19,6 +19,17 @@ export function Motivation() {
|
||||
key={solution}
|
||||
className="h4 font-medium flex gap-x-[7px]"
|
||||
to={`#${index === 0 ? 'vr_ar' : index == 1 ? 'interactive' : '3d_makets'}`}
|
||||
onClick={() =>
|
||||
document
|
||||
.getElementById(
|
||||
index === 0
|
||||
? 'vr_ar'
|
||||
: index == 1
|
||||
? 'interactive'
|
||||
: '3d_makets',
|
||||
)
|
||||
?.scrollIntoView({ behavior: 'smooth', block: 'start' })
|
||||
}
|
||||
>
|
||||
{solution}
|
||||
<sup className="text-xs">{count}</sup>
|
||||
|
||||
@@ -133,7 +133,7 @@ function DesktopFeature({
|
||||
<motion.img
|
||||
key={image}
|
||||
src={image}
|
||||
alt=""
|
||||
alt={title}
|
||||
transition={{ duration: 0.5 }}
|
||||
className="h-full "
|
||||
animate={{
|
||||
|
||||
@@ -35,7 +35,7 @@ export function SelectPhoneCode({
|
||||
<img
|
||||
src={countries.find(c => c.iso === currentCountry)?.flag}
|
||||
className="w-4 sm:w-6"
|
||||
alt=""
|
||||
alt={currentCountry}
|
||||
/>
|
||||
<p className="h4">{currentPhoneCode}</p>
|
||||
<ClassNameWrapper
|
||||
@@ -62,7 +62,7 @@ export function SelectPhoneCode({
|
||||
>
|
||||
<img
|
||||
src={countries.find(c => c.iso === country)?.flag}
|
||||
alt=""
|
||||
alt={country}
|
||||
className="w-4 sm:w-6"
|
||||
/>
|
||||
<p className="flex-1 py-1 cursor-pointer h4">{phoneCode}</p>
|
||||
|
||||
+114
-119
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+6
-37
@@ -16,7 +16,6 @@ body {
|
||||
|
||||
*::-webkit-scrollbar-thumb {
|
||||
background-color: #798fff;
|
||||
/* border: 3.5px solid transparent; */
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
@@ -26,21 +25,18 @@ body {
|
||||
|
||||
@layer components {
|
||||
.h1 {
|
||||
@apply -tracking-[.02em] text-[clamp(36px,36px+(100vw-360px)/1240*76,112px)] leading-[90%]
|
||||
/* leading-[clamp(36px,36px+(100vw-360px)/1240*50.4,86.4px)]; */;
|
||||
@apply -tracking-[.02em] text-[clamp(36px,36px+(100vw-360px)/1240*76,112px)] leading-[90%];
|
||||
}
|
||||
.h2 {
|
||||
@apply -tracking-[.02em] text-[clamp(24px,24px+(100vw-360px)/1240*40,64px)] lg:leading-[90%] leading-none;
|
||||
}
|
||||
|
||||
.h3 {
|
||||
@apply text-[clamp(18px,18px+(100vw-360px)/1240*22,40px)] leading-none
|
||||
/* leading-[clamp(22px,22px+(100vw-360px)/1240*6.8,28.8px)]; */;
|
||||
@apply text-[clamp(18px,18px+(100vw-360px)/1240*22,40px)] leading-none;
|
||||
}
|
||||
|
||||
.h4 {
|
||||
@apply text-[clamp(14px,14px+(100vw-360px)/1240*6,20px)] leading-[120%]
|
||||
/* leading-[clamp(17.6px,17.6px+(100vw-360px)/1240*6.4,24px)]; */;
|
||||
@apply text-[clamp(14px,14px+(100vw-360px)/1240*6,20px)] leading-[120%];
|
||||
}
|
||||
|
||||
.accent {
|
||||
@@ -48,19 +44,13 @@ body {
|
||||
}
|
||||
|
||||
.l-text {
|
||||
@apply text-[clamp(14px,14px+(100vw-360px)/1240*6,20px)] leading-[135%]
|
||||
/* leading-[clamp(21.6px,21.6px+(100vw-360px)/1240*5.4,27px)]; */;
|
||||
@apply text-[clamp(14px,14px+(100vw-360px)/1240*6,20px)] leading-[135%];
|
||||
}
|
||||
|
||||
.m-text {
|
||||
@apply text-[clamp(12px,12px+(100vw-360px)/1240*4,16px)] leading-[140%]
|
||||
/* leading-[clamp(19.6px,19.6px+(100vw-360px)/1240*2.4,22.4px)]; */;
|
||||
@apply text-[clamp(12px,12px+(100vw-360px)/1240*4,16px)] leading-[140%];
|
||||
}
|
||||
|
||||
/* .l-caption {
|
||||
@apply text-[clamp(14px,14px+(100vw-360px)/1240*2,16px)] leading-none;
|
||||
} */
|
||||
|
||||
.m-caption {
|
||||
@apply text-[clamp(10px,10px+(100vw-360px)/1240*2,12px)] leading-[clamp(12px,12px+(100vw-360px)/1240*2.4,14.4px)];
|
||||
}
|
||||
@@ -74,30 +64,9 @@ body {
|
||||
}
|
||||
|
||||
.descriptor {
|
||||
@apply text-[clamp(14px,14px+(100vw-360px)/1240*2,16px)] leading-[120%]
|
||||
/* leading-[clamp(15.6px,15.6px+(100vw-360px)/1240*2.6,18.2px)]; */;
|
||||
@apply text-[clamp(14px,14px+(100vw-360px)/1240*2,16px)] leading-[120%];
|
||||
}
|
||||
|
||||
/* .feedback-field:focus ~ .feedback-placeholder {
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.feedback-field:focus ~ .feedback-placeholder-2 {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.feedback-field:valid ~ .feedback-placeholder {
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.feedback-field:valid ~ .feedback-placeholder-2 {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.feedback-field::placeholder {
|
||||
@apply lg:text-base text-sm font-semibold text-[#77787d];
|
||||
} */
|
||||
|
||||
.text-gradient {
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
|
||||
Reference in New Issue
Block a user