This commit is contained in:
2025-11-11 12:19:12 +05:00
parent 5bfc06da77
commit 84a18f7dd9
28 changed files with 145 additions and 81 deletions
+6
View File
@@ -0,0 +1,6 @@
{
"command": "bun dev",
"serverUrl": "http://localhost:3000",
"authenticateProxy": false,
"commitMode": "commits"
}
+2 -2
View File
@@ -2,6 +2,6 @@ import AboutMain from "@/components/pages/AboutPage/AboutMain";
import { InProcess } from "@/components/pages/InProcess";
export default function AboutPage() {
return <InProcess />;
// return <AboutMain />;
// return <InProcess />;
return <AboutMain />;
}
+2 -2
View File
@@ -2,6 +2,6 @@ import { InProcess } from "@/components/pages/InProcess";
import WebMain from "@/components/pages/WebPage/WebMain";
export default function WebPage() {
return <InProcess />;
// return <WebMain />;
// return <InProcess />;
return <WebMain />;
}
@@ -49,7 +49,7 @@ export function IntegrationsDesktop() {
href="/blog/graff.estate-na-wow-fest-2024"
mainSrc="/img/pages/home/integrations/upside.jpg"
title="Офис продаж ЖК «Upside Towers» для Upside Development"
linkTitle="Лучший офис продаж по версии WOW AWARDS 2023"
linkTitle="Лучший офис продаж по версии WOW AWARDS 2024"
linkSrc="/img/pages/home/awards/wow_awards.png"
className="w-[30vw] aspect-[576/354]"
/>
@@ -77,7 +77,7 @@ export function IntegrationsDesktop() {
<IntegrationItem
mainSrc="/img/pages/home/integrations/masharov.jpg"
linkSrc="/img/pages/home/awards/wow_awards.png"
linkTitle="Лучший офис продаж по версии WOW AWARDS 2023"
linkTitle="Лучший офис продаж по версии WOW AWARDS 2024"
title="Офис продаж Авторского квартала Машаров"
className="w-[21.111vw] aspect-[448/354]"
/>
@@ -97,7 +97,7 @@ export function IntegrationsDesktop() {
title="Офис продаж ЖК «Мираполис»"
mainSrc="/img/pages/home/integrations/mirapolis.jpg"
linkSrc="/img/pages/home/awards/wow_awards.png"
linkTitle="Лучший офис продаж по версии WOW AWARDS 2023"
linkTitle="Лучший офис продаж по версии WOW AWARDS 2024"
className="w-[46.389vw] aspect-[812/354]"
/>
{/* hidden links for SEO */}
@@ -105,10 +105,10 @@ export function IntegrationsDesktop() {
<Link href={`/blog/${slug}`} key={slug} className="hidden" />
))}
<IntegrationItem
title="Офисы продаж Паритет девелопмент"
title="Офисы продаж «Паритет»"
mainSrc="/img/pages/home/integrations/paritet.jpg"
linkSrc="/img/pages/home/awards/wow_awards.png"
linkTitle="Лучший офис продаж по версии WOW AWARDS 2023"
linkTitle="Лучший офис продаж по версии WOW AWARDS 2024"
className="w-[30vw] aspect-[576/354]"
/>
<VideoLink
@@ -25,7 +25,7 @@ export function IntegrationsMini() {
className="aspect-[340/228]"
/>
<IntegrationItem
title="Офис продаж Авторского кварталла Машаров"
title="Офис продаж Авторского квартала Машаров"
mainSrc="/img/pages/home/integrations/masharov.jpg"
className="aspect-[340/228]"
/>
@@ -40,7 +40,7 @@ export function IntegrationsMini() {
<Link href={`/blog/${slug}`} key={slug} className="hidden" />
))}
<IntegrationItem
title="Офисы продаж Паритет девелопмент"
title="Офисы продаж «Паритет»"
mainSrc="/img/pages/home/integrations/paritet.jpg"
className="aspect-[340/228]"
/>
+12 -4
View File
@@ -34,9 +34,13 @@ export function Slider({ mapPoint }: { mapPoint?: IMapProject[] }) {
setBuffering(true);
}, [current, cityPoint]);
useEffect(() => {
console.log(mapPoint);
}, [mapPoint]);
return (
<AnimatePresence mode="popLayout">
{cityPoint && mapPoint && mapPoint.length > 0 && (
{cityPoint && (
<motion.div
onViewportEnter={handleOnViewportFeatureEnter}
viewport={{ margin: "-10% 0% 0% 0%", once: true }}
@@ -48,7 +52,7 @@ export function Slider({ mapPoint }: { mapPoint?: IMapProject[] }) {
className="max-lg:hidden absolute top-[calc(93.98/731.98*100%)] group left-[calc(698/1432.4*100%)] rounded-[1.667vw] overflow-hidden w-[calc(341/1333.4*100%)] flex flex-col bg-[#37393B99] backdrop-blur-xs"
>
<AnimatePresence mode="popLayout">
{current < mapPoint.length && mapPoint.length ? (
{mapPoint && mapPoint.length > 0 && current < mapPoint.length ? (
<motion.div
key={mapPoint[current].id}
initial={{ opacity: 0 }}
@@ -126,10 +130,10 @@ export function Slider({ mapPoint }: { mapPoint?: IMapProject[] }) {
animate={{ x: -sliderOffset + "vw" }}
transition={{ bounce: "none" }}
className={`flex flex-nowrap items-center relative gap-[0.278vw]${
mapPoint.length < 6 ? " justify-center" : ""
mapPoint && mapPoint.length < 6 ? " justify-center" : ""
}`}
>
{mapPoint.map(({ company: { id, mapIcon, title } }, index) => (
{mapPoint?.map(({ company: { id, mapIcon, title } }, index) => (
<button
onClick={() => setCurrent(index)}
key={index}
@@ -163,6 +167,7 @@ export function Slider({ mapPoint }: { mapPoint?: IMapProject[] }) {
</OpenFormModalWrapper>
</motion.div>
</div>
{mapPoint && (
<button
className="p-[0.556vw] absolute cursor-pointer disabled:hidden right-0 top-0 translate-y-[calc(3.889vw/2+1.667vw-50%)]"
disabled={
@@ -177,12 +182,15 @@ export function Slider({ mapPoint }: { mapPoint?: IMapProject[] }) {
<ArrowRightIcon />
</div>
</button>
)}
<p className="btnl text-nowrap font-medium select-none">
Проекты в{cityPoint.title.startsWith("В") ? "о" : ""} 
{prepositionCity(cityPoint.title)}
</p>
</div>
{mapPoint && mapPoint.length > 0 && (
<ItemActions item={mapPoint[current]} />
)}
</motion.div>
)}
</AnimatePresence>
@@ -112,7 +112,7 @@ export function Streaming() {
className="lg:apect-[1400/640] max-h-dvh md:max-lg:aspect-[736/480] aspect-[340/600]"
>
<p className="absolute font-medium md:bottom-6 md:left-6 bottom-4 left-4 lg:max-w-[40%] md:max-lg:max-w-[80%] accent">
Graff.estate stream доступен на&nbsp;любых устройствах,
GRAFF.estate Stream доступен на&nbsp;любых устройствах,
для&nbsp;демонстрации нужен только интернет
</p>
</VideoPlayer>
@@ -8,11 +8,14 @@ export function ThreeDReelsCard({ slide }: { slide: number }) {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 10),
bottom: slide > 10 ? "0vw" : undefined,
}}
className="p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] w-[13.611vw] h-[36.447vh] flex flex-col justify-between absolute bg-[#37393B99] right-[27.847vw] cursor-pointer"
className={`p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] w-[13.611vw] h-[36.447vh] flex flex-col justify-between absolute bg-[#37393B99] right-[27.847vw] cursor-pointer${
slide <= 10 ? " pointer-events-none" : ""
}`}
onClick={() =>
setModal(
<PrimeModal
@@ -8,6 +8,7 @@ export function AnaliticsCard({ slide }: { slide: number }) {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 11),
bottom: slide > 11 ? "21.842vh" : "93.684vh",
@@ -23,7 +24,9 @@ export function AnaliticsCard({ slide }: { slide: number }) {
/>
)
}
className="p-[1.389vw] -translate-y-[1.389vw] rounded-[1.389vw] absolute bg-[#37393B99] right-[1.667vw] w-[15.486vw] h-[28.816vh] flex flex-col justify-between cursor-pointer"
className={`p-[1.389vw] -translate-y-[1.389vw] rounded-[1.389vw] absolute bg-[#37393B99] right-[1.667vw] w-[15.486vw] h-[28.816vh] flex flex-col justify-between cursor-pointer${
slide <= 11 ? " pointer-events-none" : ""
}`}
>
<img
src="/img/pages/prime/analyse.png"
@@ -8,6 +8,7 @@ export function ArchVisCard({ slide }: { slide: number }) {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 11),
bottom: slide > 11 ? "26.316vh" : "93.684vh",
@@ -23,7 +24,9 @@ export function ArchVisCard({ slide }: { slide: number }) {
/>
)
}
className="w-[15.486vw] h-[29.211vh] -translate-y-[1.389vw] p-[1.389vw] rounded-[1.389vw] bg-[#37393B99] flex flex-col justify-between absolute bg-[length:9.979vw] bg-[url(/img/pages/prime/architecture.png)] bg-no-repeat bg-center cursor-pointer"
className={`w-[15.486vw] h-[29.211vh] -translate-y-[1.389vw] p-[1.389vw] rounded-[1.389vw] bg-[#37393B99] flex flex-col justify-between absolute bg-[length:9.979vw] bg-[url(/img/pages/prime/architecture.png)] bg-no-repeat bg-center cursor-pointer${
slide <= 11 ? " pointer-events-none" : ""
}`}
>
<p className="px-[0.833vw] py-[0.486vw] rounded-[1.181vw] btns font-medium bg-[#37393B99] self-end">
{slide === 12
@@ -8,6 +8,7 @@ export function AvatarCard({ slide }: { slide: number }) {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 13),
bottom: slide > 13 ? "56.711vh" : "93.684vh",
@@ -23,7 +24,9 @@ export function AvatarCard({ slide }: { slide: number }) {
/>
)
}
className="p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] flex flex-col justify-between items-center absolute bg-[#37393B99] w-[8.75vw] h-[20.132vh] right-[17.778vw] cursor-pointer"
className={`p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] flex flex-col justify-between items-center absolute bg-[#37393B99] w-[8.75vw] h-[20.132vh] right-[17.778vw] cursor-pointer${
slide <= 13 ? " pointer-events-none" : ""
}`}
>
<img src="/img/pages/prime/avatar.png" alt="" />
<p className="btns font-medium">Аватар клиента</p>
@@ -1,9 +1,9 @@
'use client';
"use client";
import { useModalStore } from '@/stores/useModalStore';
import { motion } from 'framer-motion';
import { PrimeModal } from '../modals/PrimeModal';
import { categoryDescription } from '@/consts/categories';
import { useModalStore } from "@/stores/useModalStore";
import { motion } from "framer-motion";
import { PrimeModal } from "../modals/PrimeModal";
import { categoryDescription } from "@/consts/categories";
/* eslint-disable @next/next/no-img-element */
export function DesignCard({ slide }: { slide: number }) {
@@ -15,36 +15,36 @@ export function DesignCard({ slide }: { slide: number }) {
setModal(
<PrimeModal
src={`/img/pages/prime/designInterior${
slide === 11 ? '1' : slide === 12 ? '2' : slide === 13 ? '3' : '4'
slide === 11 ? "1" : slide === 12 ? "2" : slide === 13 ? "3" : "4"
}.jpg`}
packages={
slide === 11
? ['Стандарт']
? ["Стандарт"]
: slide === 12
? ['Комфорт+', 'Стандарт']
? ["Комфорт+", "Стандарт"]
: slide === 13
? ['Бизнес', 'Комфорт+', 'Стандарт']
: ['Премиум', 'Бизнес', 'Комфорт+', 'Стандарт']
? ["Бизнес", "Комфорт+", "Стандарт"]
: ["Премиум", "Бизнес", "Комфорт+", "Стандарт"]
}
title={
slide === 11
? `Чистовая отделка ( WhiteBox )`
? `Чистовая отделка ( WhiteBox )`
: slide === 12
? 'В квартирах типовая мебель ( WhiteBox+ )'
? "В квартирах типовая мебель ( WhiteBox+ )"
: `Дизайн по референсам заказчика (${
slide === 13 ? '1 стиль' : '3 стиля'
slide === 13 ? "1 стиль" : "3 стиля"
})`
}
text={
categoryDescription['Дизайн интерьеров'].find(
categoryDescription["Дизайн интерьеров"].find(
(item) =>
item.title ===
(slide === 11
? `WhiteBox`
: slide === 12
? 'WhiteBox +'
? "WhiteBox +"
: `Уникальный дизайн интерьеров${
slide === 13 ? '' : ' (3 стиля)'
slide === 13 ? "" : " (3 стиля)"
}`)
)!.text1
}
@@ -52,44 +52,47 @@ export function DesignCard({ slide }: { slide: number }) {
/>
)
}
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 10),
bottom: slide > 10 ? '0vw' : undefined,
bottom: slide > 10 ? "0vw" : undefined,
}}
transition={{ bounce: 'none' }}
className="p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] absolute bg-[#37393B99] backdrop-blur-[47.6px] w-[15.278vw] h-[24.737vh] flex flex-col justify-between cursor-pointer"
transition={{ bounce: "none" }}
className={`p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] absolute bg-[#37393B99] backdrop-blur-[47.6px] w-[15.278vw] h-[24.737vh] flex flex-col justify-between cursor-pointer${
slide <= 10 ? " pointer-events-none" : ""
}`}
>
<div className="relative">
<img
src="/img/pages/prime/designInterior1.jpg"
width={'100%'}
width={"100%"}
alt="дизайн"
className={`rounded-[0.556vw] absolute w-[12.5vw] aspect-[180/104] transition-opacity duration-300 ${
slide === 11 ? 'opacity-100' : 'opacity-0'
slide === 11 ? "opacity-100" : "opacity-0"
}`}
/>
<img
src="/img/pages/prime/designInterior2.jpg"
width={'100%'}
width={"100%"}
alt="дизайн"
className={`rounded-[0.556vw] absolute w-[12.5vw] aspect-[180/104] transition-opacity duration-300 ${
slide === 12 ? 'opacity-100' : 'opacity-0'
slide === 12 ? "opacity-100" : "opacity-0"
}`}
/>
<img
src="/img/pages/prime/designInterior3.jpg"
width={'100%'}
width={"100%"}
alt="дизайн"
className={`rounded-[0.556vw] absolute w-[12.5vw] aspect-[180/104] transition-opacity duration-300 ${
slide === 13 ? 'opacity-100' : 'opacity-0'
slide === 13 ? "opacity-100" : "opacity-0"
}`}
/>
<img
src="/img/pages/prime/designInterior4.jpg"
width={'100%'}
width={"100%"}
alt="дизайн"
className={`rounded-[0.556vw] absolute w-[12.5vw] aspect-[180/104] transition-opacity duration-300 ${
slide === 14 ? 'opacity-100' : 'opacity-0'
slide === 14 ? "opacity-100" : "opacity-0"
}`}
/>
</div>
@@ -97,9 +100,9 @@ export function DesignCard({ slide }: { slide: number }) {
{slide === 11
? `Чистовая отделка ( WhiteBox )`
: slide === 12
? 'В квартирах типовая мебель ( WhiteBox+ )'
? "В квартирах типовая мебель ( WhiteBox+ )"
: `Дизайн по референсам заказчика (${
slide === 13 ? '1 стиль' : '3 стиля'
slide === 13 ? "1 стиль" : "3 стиля"
})`}
</p>
</motion.div>
@@ -8,6 +8,7 @@ export function EngineCard({ slide }: { slide: number }) {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 11),
bottom: slide > 11 ? "21.842vh" : "93.684vh",
@@ -23,7 +24,9 @@ export function EngineCard({ slide }: { slide: number }) {
/>
)
}
className="w-[9.236vw] h-[33.289vh] -translate-y-[1.389vw] p-[1.389vw] rounded-[1.389vw] absolute bg-[#37393B99] right-[17.778vw] flex flex-col justify-between cursor-pointer"
className={`w-[9.236vw] h-[33.289vh] -translate-y-[1.389vw] p-[1.389vw] rounded-[1.389vw] absolute bg-[#37393B99] right-[17.778vw] flex flex-col justify-between cursor-pointer${
slide <= 11 ? " pointer-events-none" : ""
}`}
>
<img
src="/img/pages/prime/ruble.png"
@@ -10,6 +10,7 @@ export function EnvironmentCard({ slide }: { slide: number }) {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 10),
bottom: slide > 10 ? "0vw" : undefined,
@@ -27,7 +28,9 @@ export function EnvironmentCard({ slide }: { slide: number }) {
/>
)
}
className="p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] absolute bg-[url(/img/pages/prime/summer.jpg)] bg-cover bg-center flex items-end w-[23.681vw] h-[41.053vh] left-[17.708vw] cursor-pointer"
className={`p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] absolute bg-[url(/img/pages/prime/summer.jpg)] bg-cover bg-center flex items-end w-[23.681vw] h-[41.053vh] left-[17.708vw] cursor-pointer${
slide <= 10 ? " pointer-events-none" : ""
}`}
>
<p className="btns max-w-2/3 font-medium">
Детальная проработка ЖК и ближайшего благоустойства
@@ -8,6 +8,7 @@ export function EquipmentCard({ slide }: { slide: number }) {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 10),
bottom: slide > 10 ? "0vw" : undefined,
@@ -43,7 +44,9 @@ export function EquipmentCard({ slide }: { slide: number }) {
/>
)
}
className="right-[11.458vw] p-[1.389vw] -translate-y-[1.389vw] rounded-[1.389vw] w-[15.556vw] h-[20.263vh] bg-[#37393B99] before:z-[1] before:absolute before:inset-0 before:bg-gradient-to-t before:from-[#37393B99] overflow-hidden backdrop-blur-xs bg-cover bg-[position:calc(8/225*100%)_calc(15/225*100%)] flex items-end absolute cursor-pointer"
className={`right-[11.458vw] p-[1.389vw] -translate-y-[1.389vw] rounded-[1.389vw] w-[15.556vw] h-[20.263vh] bg-[#37393B99] before:z-[1] before:absolute before:inset-0 before:bg-gradient-to-t before:from-[#37393B99] overflow-hidden backdrop-blur-xs bg-cover bg-[position:calc(8/225*100%)_calc(15/225*100%)] flex items-end absolute cursor-pointer${
slide <= 10 ? " pointer-events-none" : ""
}`}
>
<img
src="/img/pages/prime/wallPanel.png"
@@ -21,11 +21,14 @@ export function ExcursionVRCard({ slide }: { slide: number }) {
/>
)
}
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 12),
bottom: slide > 12 ? "42.632vh" : "93.684vh",
}}
className="p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] flex flex-col justify-between absolute bg-[#37393B99] w-[10.347vw] h-[16.842vh] left-[17.708vw] cursor-pointer"
className={`p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] flex flex-col justify-between absolute bg-[#37393B99] w-[10.347vw] h-[16.842vh] left-[17.708vw] cursor-pointer${
slide <= 11 ? " pointer-events-none" : ""
}`}
>
<img
src="/img/pages/prime/ruble.png"
@@ -8,6 +8,7 @@ export function ExtraInterestPointsCard({ slide }: { slide: number }) {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 12),
bottom: slide > 12 ? "15.597vw" : "27.362vw",
@@ -23,7 +24,9 @@ export function ExtraInterestPointsCard({ slide }: { slide: number }) {
/>
)
}
className="p-[1.389vw] -translate-y-[1.389vw] rounded-[1.389vw] flex flex-col justify-end absolute w-[15vw] h-[25vh] left-[42.222vw] bg-[#37393B99] bg-[url(/img/pages/prime/wheel.png)] bg-contain bg-no-repeat bg-right-bottom before:absolute before:inset-0 before:bg-gradient-to-t before:from-[#37393B99] overflow-hidden cursor-pointer"
className={`p-[1.389vw] -translate-y-[1.389vw] rounded-[1.389vw] flex flex-col justify-end absolute w-[15vw] h-[25vh] left-[42.222vw] bg-[#37393B99] bg-[url(/img/pages/prime/wheel.png)] bg-contain bg-no-repeat bg-right-bottom before:absolute before:inset-0 before:bg-gradient-to-t before:from-[#37393B99] overflow-hidden cursor-pointer${
slide <= 12 ? " pointer-events-none" : ""
}`}
>
<img
src="/img/pages/prime/ruble.png"
@@ -8,6 +8,7 @@ export function FinanceToolCard({ slide }: { slide: number }) {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 12),
bottom: slide > 12 ? "42.632vh" : "93.684vh",
@@ -23,7 +24,9 @@ export function FinanceToolCard({ slide }: { slide: number }) {
/>
)
}
className="p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] flex flex-col justify-end absolute bg-[#37393B99] w-[12.5vw] h-[23.684vh] left-[28.889vw] bg-[url(/img/pages/prime/finance.png)] bg-[length:12.083vw] overflow-hidden bg-no-repeat bg-[position:1.944vw_1.944vw] before:absolute before:w-[12.083vw] before:h-[12.083vw] before:-bottom-[22px] before:-right-[22px] before:bg-[linear-gradient(#27282A00,#27282A)] cursor-pointer"
className={`p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] flex flex-col justify-end absolute bg-[#37393B99] w-[12.5vw] h-[23.684vh] left-[28.889vw] bg-[url(/img/pages/prime/finance.png)] bg-[length:12.083vw] overflow-hidden bg-no-repeat bg-[position:1.944vw_1.944vw] before:absolute before:w-[12.083vw] before:h-[12.083vw] before:-bottom-[22px] before:-right-[22px] before:bg-[linear-gradient(#27282A00,#27282A)] cursor-pointer${
slide <= 12 ? " pointer-events-none" : ""
}`}
>
<p className="btns font-medium z-[1]">
Финансовые инсументы{" "}
@@ -8,6 +8,7 @@ export function InteractiveWindowCard({ slide }: { slide: number }) {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 13),
bottom: slide > 13 ? "57.105vh" : "93.684vh",
@@ -23,7 +24,9 @@ export function InteractiveWindowCard({ slide }: { slide: number }) {
/>
)
}
className="p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] flex flex-col justify-end absolute bg-[#37393B99] w-[15.486vw] h-[36.316vh] cursor-pointer"
className={`p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] flex flex-col justify-end absolute bg-[#37393B99] w-[15.486vw] h-[36.316vh] cursor-pointer${
slide <= 13 ? " pointer-events-none" : ""
}`}
>
<img
src="/img/pages/prime/interactiveWindow.png"
@@ -9,6 +9,7 @@ export function InterierConfiguratorCard({ slide }: { slide: number }) {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 11),
bottom: slide > 11 ? "38.026vh" : "93.684vh",
@@ -24,7 +25,9 @@ export function InterierConfiguratorCard({ slide }: { slide: number }) {
/>
)
}
className="p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] absolute bg-[#37393B99] w-[13.542vw] h-[17.105vh] flex flex-col justify-between backdrop-blur-[47.6px] right-[27.847vw] cursor-pointer"
className={`p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] absolute bg-[#37393B99] w-[13.542vw] h-[17.105vh] flex flex-col justify-between backdrop-blur-[47.6px] right-[27.847vw] cursor-pointer${
slide <= 11 ? " pointer-events-none" : ""
}`}
>
<img
src="/img/pages/prime/ruble.png"
@@ -4,7 +4,7 @@ import { AnimatePresence, motion } from "framer-motion";
export function PackageTitle({ slide }: { slide: number }) {
return (
<motion.div
animate={{ opacity: +(slide > 10) }}
style={{ opacity: +(slide > 10) }}
className="absolute space-y-[2.639vw] left-1/2 !-translate-x-1/2 overflow-hidden top-[calc(100px-1.389vw)]"
>
<Title headerLevel={1} className="text-center">
@@ -8,6 +8,7 @@ export function ScenarioCard({ slide }: { slide: number }) {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 13),
bottom: slide > 13 ? "78.421vh" : "93.684vh",
@@ -23,7 +24,9 @@ export function ScenarioCard({ slide }: { slide: number }) {
/>
)
}
className="p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] flex items-end gap-4 absolute bg-[#37393B99] w-[15.764vw] h-[15.395vh] right-[1.667vw] cursor-pointer"
className={`p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] flex items-end gap-4 absolute bg-[#37393B99] w-[15.764vw] h-[15.395vh] right-[1.667vw] cursor-pointer${
slide <= 13 ? " pointer-events-none" : ""
}`}
>
<p className="btns font-medium">Сценарии проживания</p>
<img
@@ -7,6 +7,7 @@ export function SeasonsCard({ slide }: { slide: number }) {
return (
<motion.div
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 12),
bottom: slide > 12 ? "52.237vh" : "93.684vh",
@@ -22,7 +23,9 @@ export function SeasonsCard({ slide }: { slide: number }) {
/>
)
}
className="p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] flex flex-col justify-end absolute w-[15.486vw] h-[24.605vh] bg-[url(/img/pages/prime/autumn.jpg)] bg-cover bg-no-repeat bg-center right-[1.667vw] cursor-pointer"
className={`p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] flex flex-col justify-end absolute w-[15.486vw] h-[24.605vh] bg-[url(/img/pages/prime/autumn.jpg)] bg-cover bg-no-repeat bg-center right-[1.667vw] cursor-pointer${
slide <= 12 ? " pointer-events-none" : ""
}`}
>
<p className="btns font-medium">Сезонность</p>
</motion.div>
@@ -13,18 +13,21 @@ export function StreamingCard({ slide }: { slide: number }) {
setModal(
<PrimeModal
categoryTitle="Удаленная демонстрация"
title="Graff.estate stream"
title="GRAFF.estate Stream"
text="GRAFF.estate разворачивает «облако» и стримит 3D-сцену на устройство клиента (PC, мобильный), менеджер ведёт экскурсию в режиме реального времени."
packages={["Премиум"]}
src="/videos/pages/home/streaming.mp4"
/>
)
}
initial={{ opacity: 0 }}
animate={{
opacity: +(slide > 10),
bottom: slide > 10 ? "0vw" : undefined,
}}
className="p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] bg-[#37393B99] backdrop-blur-xs absolute right-[1.667vw] w-[8.958vw] h-[20.263vh] flex flex-col justify-between"
className={`p-[1.389vw] rounded-[1.389vw] -translate-y-[1.389vw] bg-[#37393B99] backdrop-blur-xs absolute right-[1.667vw] w-[8.958vw] h-[20.263vh] flex flex-col justify-between${
slide <= 10 ? " pointer-events-none" : ""
}`}
>
<img src="/img/pages/prime/ruble.png" className="w-[0.833vw]" alt="" />
<div className="w-[3.333vw] aspect-square rounded-[1.111vw] bg-[#37393B99] relative self-center">
@@ -33,7 +36,7 @@ export function StreamingCard({ slide }: { slide: number }) {
<GraffIcon />
</div>
</div>
<p className="btns font-medium">Graff.estate stream</p>
<p className="btns font-medium">GRAFF.estate Stream</p>
</motion.div>
);
}
@@ -23,7 +23,7 @@ export function PrimeModal({
return (
<div className="flex items-center gap-[11.458vw] absolute inset-0 z-10 pl-[1.667vw] py-[1.389vw] before:inset-0 before:absolute before:bg-[#0F101199]">
<div className="flex flex-col gap-y-[0.417vw] z-[1]">
<div className="flex flex-col gap-y-[0.417vw] z-[1] opacity-0 pointer-events-none">
<button
onClick={() => setModal(null)}
className="w-[4.444vw] aspect-square rounded-[0.556vw] bg-white cursor-pointer"
+1
View File
@@ -231,6 +231,7 @@ export default function WebDemo() {
<motion.div
ref={demoRef}
initial={{ width: "80vw" }}
animate={{
width: demoActive ? "100vw" : isMobile ? "100%" : "80vw",
}}
+1 -1
View File
@@ -112,7 +112,7 @@ export function VideoLayerMain({ scroll }: { scroll: MotionValue<number> }) {
style={{ opacity }}
className="absolute left-[1.667vw] top-[1.667vw] z-10 max-w-[34.097vw] heading2 font-medium"
>
Graff.estate легко встраивается в существующую цепочку продаж,
GRAFF.estate легко встраивается в существующую цепочку продаж,
собирает данные о пользователе и его поведении
</motion.p>
)}
+2 -1
View File
@@ -186,7 +186,7 @@ export function VideoLayerPrime({ scroll }: { scroll: MotionValue<number> }) {
style={{ opacity }}
className="absolute left-[1.667vw] top-[1.667vw] z-10 max-w-[34.097vw] heading2 font-medium"
>
Graff.estate легко встраивается в существующую цепочку продаж,
GRAFF.estate легко встраивается в существующую цепочку продаж,
собирает данные о пользователе и его поведении
</motion.p>
)}
@@ -221,6 +221,7 @@ export function VideoLayerPrime({ scroll }: { scroll: MotionValue<number> }) {
top,
}}
className="object-bottom object-cover origin-top absolute left-1/2 bg-black/50 -translate-x-1/2 ![rotate:x_4deg] flex justify-center items-center"
initial={{ opacity: 0 }}
animate={{
opacity: currentBuffering ? 1 : 0,
}}