diff --git a/public/img/pages/prime/3dtour.jpg b/public/img/pages/prime/3dtour.jpg index e646f9ed..aaf89efe 100644 Binary files a/public/img/pages/prime/3dtour.jpg and b/public/img/pages/prime/3dtour.jpg differ diff --git a/src/components/pages/MainPage/Presentation/PresentationDesktop.tsx b/src/components/pages/MainPage/Presentation/PresentationDesktop.tsx index a9a8314b..030880f6 100644 --- a/src/components/pages/MainPage/Presentation/PresentationDesktop.tsx +++ b/src/components/pages/MainPage/Presentation/PresentationDesktop.tsx @@ -2,7 +2,7 @@ import { videos } from '@/consts/presentation/videos'; import { Title } from '@/ui/Title'; -import { useMotionValueEvent, useScroll, scroll } from 'framer-motion'; +import { useMotionValueEvent, useScroll } from 'framer-motion'; import { useRef, useState } from 'react'; import { Engine } from '../../../slides/Engine'; import { Infrastructure } from '../../../slides/Infrastructure'; @@ -21,9 +21,9 @@ export function PresentationDesktop() { const [slide, setSlide] = useState(0); - useMotionValueEvent(scrollYProgress, 'change', (value) => { - setSlide(Math.min(Math.trunc(value * videos.length), videos.length - 1)); - }); + useMotionValueEvent(scrollYProgress, 'change', (value) => + setSlide(Math.min(Math.trunc(value * videos.length), videos.length - 1)) + ); return (
@@ -32,7 +32,7 @@ export function PresentationDesktop() { улучшает опыт выбора недвижимости{' '} и увеличивает темпы продаж квартир в жилом комплексе -
+
@@ -42,7 +42,7 @@ export function PresentationDesktop() {
- {videos.map(({ src, anchorImg }, index) => ( + {videos.map(({ src, anchorImg, title }, index) => ( { if (!target.current) return; @@ -50,22 +50,19 @@ export function PresentationDesktop() { top: target.current.getBoundingClientRect().top - document.body.getBoundingClientRect().top + - (index / 6) * target.current.scrollHeight, + (index / 6) * target.current.clientHeight - + 120, }); }} active={index === slide} src={anchorImg} - title={src} + title={title} key={src} /> ))}
-
- {Array.from({ length: videos.length }).map((_, index) => ( -
- ))} -
+
); diff --git a/src/components/pages/PrimePage/DesktopPresentation/FolderAnimation.tsx b/src/components/pages/PrimePage/DesktopPresentation/FolderAnimation.tsx index a647bf79..9fca3ef9 100644 --- a/src/components/pages/PrimePage/DesktopPresentation/FolderAnimation.tsx +++ b/src/components/pages/PrimePage/DesktopPresentation/FolderAnimation.tsx @@ -14,38 +14,38 @@ export function FolderAnimation({ scroll }: { scroll: MotionValue }) { setSlide( Math.min( Math.trunc(value * (primeVideos.length + 9)), - primeVideos.length + 8 + primeVideos.length + 7 ) ) ); const y = useTransform( scroll, - [6 / (primeVideos.length + 8), 7 / (primeVideos.length + 8)], + [6 / (primeVideos.length + 7), 7 / (primeVideos.length + 7)], ['49.444vw', '0vw'] ); const scale = useTransform( scroll, - [8 / (primeVideos.length + 8), 9 / (primeVideos.length + 8)], + [8 / (primeVideos.length + 7), 9 / (primeVideos.length + 7)], [1, 0.83] ); const bottomBorder = useTransform( scroll, - [9 / (primeVideos.length + 8), 10 / (primeVideos.length + 8)], + [9 / (primeVideos.length + 7), 10 / (primeVideos.length + 7)], ['17.014vw', '0vw'] ); const bottomFolder = useTransform( scroll, - [9 / (primeVideos.length + 8), 10 / (primeVideos.length + 8)], + [9 / (primeVideos.length + 7), 10 / (primeVideos.length + 7)], ['19.931vw', '2.986vw'] ); const opacity = useTransform( scroll, - [9 / (primeVideos.length + 8), 10 / (primeVideos.length + 8)], + [9 / (primeVideos.length + 7), 10 / (primeVideos.length + 7)], [0, 1] ); diff --git a/src/components/pages/PrimePage/DesktopPresentation/PrimeProgress.tsx b/src/components/pages/PrimePage/DesktopPresentation/PrimeProgress.tsx index fe4cb292..2e27eb58 100644 --- a/src/components/pages/PrimePage/DesktopPresentation/PrimeProgress.tsx +++ b/src/components/pages/PrimePage/DesktopPresentation/PrimeProgress.tsx @@ -9,14 +9,20 @@ import { } from 'framer-motion'; import { useState } from 'react'; -export function PrimeProgress({ scroll }: { scroll: MotionValue }) { +export function PrimeProgress({ + scroll, + target, +}: { + scroll: MotionValue; + target: HTMLDivElement; +}) { const [slide, setSlide] = useState(0); useMotionValueEvent(scroll, 'change', (value) => setSlide( Math.min( Math.trunc(value * (primeVideos.length + 9)), - primeVideos.length + 8 + primeVideos.length + 7 ) ) ); @@ -24,18 +30,18 @@ export function PrimeProgress({ scroll }: { scroll: MotionValue }) { const bottom = useTransform( scroll, [ - 6 / (primeVideos.length + 8), - 7 / (primeVideos.length + 8), - 8 / (primeVideos.length + 8), - 9 / (primeVideos.length + 8), - 10 / (primeVideos.length + 8), + 6 / (primeVideos.length + 7), + 7 / (primeVideos.length + 7), + 8 / (primeVideos.length + 7), + 9 / (primeVideos.length + 7), + 10 / (primeVideos.length + 7), ], ['0vw', '31.389vw', '31.389vw', '28.794vw', '12.194vw'] ); const scale = useTransform( scroll, - [8 / (primeVideos.length + 8), 9 / (primeVideos.length + 8)], + [8 / (primeVideos.length + 7), 9 / (primeVideos.length + 7)], [1, 0.83] ); @@ -49,17 +55,21 @@ export function PrimeProgress({ scroll }: { scroll: MotionValue }) { transition={{ bounce: false }} className="flex absolute p-[0.556vw] z-10 rounded-[1.875vw] bg-[#37393B99] left-1/2 -translate-1/2 transition-colors" > - {primeVideos.map(({ src, anchorImg }, index) => ( + {primeVideos.map(({ src, anchorImg, title }, index) => ( 7} {...(slide > 7 ? primeProgressItemsTranslates[index] : undefined)} onClick={() => { - window.scrollTo({ top: 0 }); - console.log('as'); + window.scroll({ + top: + target.getBoundingClientRect().top - + document.body.getBoundingClientRect().top + + (index / 15) * target.clientHeight, + }); }} active={index === slide} src={anchorImg} - title={src} + title={title} key={src} /> ))} diff --git a/src/components/pages/PrimePage/PrimePage.tsx b/src/components/pages/PrimePage/PrimePage.tsx index cf40ccf9..3b208664 100644 --- a/src/components/pages/PrimePage/PrimePage.tsx +++ b/src/components/pages/PrimePage/PrimePage.tsx @@ -3,8 +3,8 @@ import { primeVideos } from '@/consts/presentation/videos'; import { Title } from '@/ui/Title'; -import { motion, useMotionValueEvent, useScroll } from 'framer-motion'; -import { useEffect, useRef, useState } from 'react'; +import { useMotionValueEvent, useScroll } from 'framer-motion'; +import { useRef, useState } from 'react'; import { CommercialOffer } from '../../slides/CommercialOffer'; import { Favorites } from '../../slides/Favorites'; import { Infrastructure } from '../../slides/Infrastructure'; @@ -13,8 +13,6 @@ import { SearchAndSelect } from '../../slides/SearchAndSelect'; import { ThreeDTour } from '../../slides/ThreeDTour'; import { VideoLayerPrime } from '../../slides/VideoLayerPrime'; import { Insolation } from '../../slides/Insolation'; -import { PrimeProgressItem } from '@/ui/PrimeProgressItem'; -import { PrimeAnimations } from './PrimeAnimations'; import { PackageTitle } from './DesktopPresentation/PackageTitle'; import { DesignCard } from './DesktopPresentation/DesignCard'; import { EnvironmentCard } from './DesktopPresentation/EnvironmentCard'; @@ -44,7 +42,7 @@ export function PrimeDesktopPage() { setSlide( Math.min( Math.trunc(value * (primeVideos.length + 9)), - primeVideos.length + 8 + primeVideos.length + 7 ) ) ); @@ -52,14 +50,14 @@ export function PrimeDesktopPage() { const [slide, setSlide] = useState(0); return ( -
+
Интерактивная презентация улучшает{' '} <span className="text-gradient">опыт выбора недвижимости</span> и увеличивает темпы продаж квартир в жилом комплексе
-
+
@@ -68,9 +66,7 @@ export function PrimeDesktopPage() { - - @@ -87,9 +83,10 @@ export function PrimeDesktopPage() { - - + {target.current && ( + + )}
diff --git a/src/components/slides/CommercialOffer.tsx b/src/components/slides/CommercialOffer.tsx index 82c6d52e..9e50b8ef 100644 --- a/src/components/slides/CommercialOffer.tsx +++ b/src/components/slides/CommercialOffer.tsx @@ -5,19 +5,19 @@ import { motion, MotionValue, useTransform } from 'framer-motion'; export function CommercialOffer({ scroll }: { scroll: MotionValue }) { const x = useTransform( scroll, - [5 / (primeVideos.length + 8), 6 / (primeVideos.length + 8)], + [5 / (primeVideos.length + 7), 6 / (primeVideos.length + 7)], ['100%', '0%'] ); const y = useTransform( scroll, - [6 / (primeVideos.length + 8), 7 / (primeVideos.length + 8)], - ['0%', '-110%'] + [6 / (primeVideos.length + 7), 7 / (primeVideos.length + 7)], + ['0%', '-100%'] ); const opacity = useTransform( scroll, - [5 / (primeVideos.length + 8), 6 / (primeVideos.length + 8)], + [5 / (primeVideos.length + 7), 6 / (primeVideos.length + 7)], [0, 1] ); diff --git a/src/components/slides/Engine.tsx b/src/components/slides/Engine.tsx index 2e274b94..ba4bc01c 100644 --- a/src/components/slides/Engine.tsx +++ b/src/components/slides/Engine.tsx @@ -10,9 +10,21 @@ export function Engine({ scroll: MotionValue; top?: number; }) { - const opacity = useTransform(scroll, [3 / 5, 4 / 5, 4.5 / 5], [0, 1, 0]); + const opacity = useTransform( + scroll, + [ + 3 / (videos.length - 1), + 4 / (videos.length - 1), + 4.5 / (videos.length - 1), + ], + [0, 1, 0] + ); - const x = useTransform(scroll, [3 / 5, 4 / 5], ['-100%', '0%']); + const x = useTransform( + scroll, + [3 / (videos.length - 1), 4 / (videos.length - 1)], + ['-100%', '0%'] + ); const opacityMini = useTransform( scroll, diff --git a/src/components/slides/Favorites.tsx b/src/components/slides/Favorites.tsx index 20207451..293e0a40 100644 --- a/src/components/slides/Favorites.tsx +++ b/src/components/slides/Favorites.tsx @@ -4,27 +4,30 @@ import { motion, MotionValue, useTransform } from 'framer-motion'; export function Favorites({ scroll }: { scroll: MotionValue }) { const x = useTransform( scroll, - [ - 2 / (primeVideos.length + 8), - 3 / (primeVideos.length + 8), - 4 / (primeVideos.length + 8), - ], - ['-100%', '0%', '-100%'] + [3 / (primeVideos.length + 7), 4 / (primeVideos.length + 7)], + ['0%', '100%'] ); + + const y = useTransform( + scroll, + [2 / (primeVideos.length + 7), 3 / (primeVideos.length + 7)], + ['100%', '0%'] + ); + const opacity = useTransform( scroll, [ - 2 / (primeVideos.length + 8), - 3 / (primeVideos.length + 8), - 4 / (primeVideos.length + 8), + 2 / (primeVideos.length + 7), + 3 / (primeVideos.length + 7), + 3.5 / (primeVideos.length + 7), ], [0, 1, 0] ); return (

Формирование списка избранного

diff --git a/src/components/slides/Infrastructure.tsx b/src/components/slides/Infrastructure.tsx index 6265b68d..5fe44f9b 100644 --- a/src/components/slides/Infrastructure.tsx +++ b/src/components/slides/Infrastructure.tsx @@ -17,30 +17,30 @@ export function Infrastructure({ top?: number; page?: 'main' | 'prime'; }) { - const xMain = useTransform(scrollProgress, [1 / 5, 2 / 5], ['100%', '0%']); + const xMain = useTransform( + scrollProgress, + [1 / (videos.length - 1), 2 / (videos.length - 1)], + ['100%', '0%'] + ); const xPrime = useTransform( scrollProgress, - [ - 1 / (primeVideos.length + 8), - 2 / (primeVideos.length + 8), - 3 / (primeVideos.length + 8), - ], - ['100%', '0%', '100%'] + [1 / (primeVideos.length + 7), 2 / (primeVideos.length + 7)], + ['100%', '0%'] ); const opacityMain = useTransform( scrollProgress, - [1 / 5, 2 / 5, 1 / 2], + [1 / (videos.length - 1), 2 / (videos.length - 1), 1 / 2], [0, 1, 0] ); const opacityPrime = useTransform( scrollProgress, [ - 1 / (primeVideos.length + 8), - 2 / (primeVideos.length + 8), - 3 / (primeVideos.length + 8), + 1 / (primeVideos.length + 7), + 2 / (primeVideos.length + 7), + 2.5 / (primeVideos.length + 7), ], [0, 1, 0] ); diff --git a/src/components/slides/Insolation.tsx b/src/components/slides/Insolation.tsx index 496eed7d..58c2e4af 100644 --- a/src/components/slides/Insolation.tsx +++ b/src/components/slides/Insolation.tsx @@ -12,32 +12,40 @@ export function Insolation({ top?: number; page?: 'main' | 'prime'; }) { - const y = useTransform(scrollProgress, [2 / 5, 3 / 5], ['100%', '0%']); + const y = useTransform( + scrollProgress, + [2 / (videos.length - 1), 3 / (videos.length - 1)], + ['100%', '0%'] + ); - const xMain = useTransform(scrollProgress, [3 / 5, 4 / 5], ['0%', '100%']); + const xMain = useTransform( + scrollProgress, + [3 / (videos.length - 1), 4 / (videos.length - 1)], + ['0%', '100%'] + ); const x = useTransform( scrollProgress, - [ - 4 / (primeVideos.length + 8), - 5 / (primeVideos.length + 8), - 6 / (primeVideos.length + 8), - ], - ['-100%', '0%', '-100%'] + [5 / (primeVideos.length + 7), 6 / (primeVideos.length + 7)], + ['0%', '-100%'] ); const opacityMain = useTransform( scrollProgress, - [2 / 5, 3 / 5, 3.5 / 5], + [ + 2 / (videos.length - 1), + 3 / (videos.length - 1), + 3.5 / (videos.length - 1), + ], [0, 1, 0] ); const opacityPrime = useTransform( scrollProgress, [ - 4 / (primeVideos.length + 8), - 5 / (primeVideos.length + 8), - 6 / (primeVideos.length + 8), + 4 / (primeVideos.length + 7), + 5 / (primeVideos.length + 7), + 5.5 / (primeVideos.length + 7), ], [0, 1, 0] ); @@ -48,13 +56,19 @@ export function Insolation({ [1, 0] ); + const yPrime = useTransform( + scrollProgress, + [4 / (primeVideos.length + 7), 5 / (primeVideos.length + 7)], + ['100%', '0%'] + ); + return ( <>