diff --git a/index.html b/index.html index 5e757c5..2bdcc7f 100644 --- a/index.html +++ b/index.html @@ -1,6 +1,7 @@ + diff --git a/public/images/aboutCompany/Map.png b/public/images/aboutCompany/Map.png new file mode 100644 index 0000000..5e869e6 Binary files /dev/null and b/public/images/aboutCompany/Map.png differ diff --git a/public/images/aboutCompany/advantages/1.png b/public/images/aboutCompany/advantages/1.png new file mode 100644 index 0000000..b005ef3 Binary files /dev/null and b/public/images/aboutCompany/advantages/1.png differ diff --git a/public/images/aboutCompany/advantages/2.png b/public/images/aboutCompany/advantages/2.png new file mode 100644 index 0000000..e53c0e0 Binary files /dev/null and b/public/images/aboutCompany/advantages/2.png differ diff --git a/public/images/aboutCompany/advantages/3.png b/public/images/aboutCompany/advantages/3.png new file mode 100644 index 0000000..9a3c78f Binary files /dev/null and b/public/images/aboutCompany/advantages/3.png differ diff --git a/public/images/aboutCompany/advantages/4.png b/public/images/aboutCompany/advantages/4.png new file mode 100644 index 0000000..da88c5c Binary files /dev/null and b/public/images/aboutCompany/advantages/4.png differ diff --git a/public/images/aboutCompany/advantages/5.png b/public/images/aboutCompany/advantages/5.png new file mode 100644 index 0000000..dd20a74 Binary files /dev/null and b/public/images/aboutCompany/advantages/5.png differ diff --git a/public/images/aboutCompany/livingSolutionsSlider/1.png b/public/images/aboutCompany/livingSolutionsSlider/1.png new file mode 100644 index 0000000..25f1401 Binary files /dev/null and b/public/images/aboutCompany/livingSolutionsSlider/1.png differ diff --git a/public/images/aboutCompany/livingSolutionsSlider/2.png b/public/images/aboutCompany/livingSolutionsSlider/2.png new file mode 100644 index 0000000..25f1401 Binary files /dev/null and b/public/images/aboutCompany/livingSolutionsSlider/2.png differ diff --git a/public/images/aboutCompany/livingSolutionsSlider/3.png b/public/images/aboutCompany/livingSolutionsSlider/3.png new file mode 100644 index 0000000..b3e946c Binary files /dev/null and b/public/images/aboutCompany/livingSolutionsSlider/3.png differ diff --git a/public/images/aboutCompany/livingSolutionsSlider/4.png b/public/images/aboutCompany/livingSolutionsSlider/4.png new file mode 100644 index 0000000..b3e946c Binary files /dev/null and b/public/images/aboutCompany/livingSolutionsSlider/4.png differ diff --git a/public/images/aboutCompany/roveAroundTheCity/1.png b/public/images/aboutCompany/roveAroundTheCity/1.png new file mode 100644 index 0000000..12b2f3c Binary files /dev/null and b/public/images/aboutCompany/roveAroundTheCity/1.png differ diff --git a/public/images/aboutCompany/roveAroundTheCity/10.png b/public/images/aboutCompany/roveAroundTheCity/10.png new file mode 100644 index 0000000..0bf78fd Binary files /dev/null and b/public/images/aboutCompany/roveAroundTheCity/10.png differ diff --git a/public/images/aboutCompany/roveAroundTheCity/2.png b/public/images/aboutCompany/roveAroundTheCity/2.png new file mode 100644 index 0000000..dc98e3e Binary files /dev/null and b/public/images/aboutCompany/roveAroundTheCity/2.png differ diff --git a/public/images/aboutCompany/roveAroundTheCity/3.png b/public/images/aboutCompany/roveAroundTheCity/3.png new file mode 100644 index 0000000..d2ea4a1 Binary files /dev/null and b/public/images/aboutCompany/roveAroundTheCity/3.png differ diff --git a/public/images/aboutCompany/roveAroundTheCity/4.png b/public/images/aboutCompany/roveAroundTheCity/4.png new file mode 100644 index 0000000..48961da Binary files /dev/null and b/public/images/aboutCompany/roveAroundTheCity/4.png differ diff --git a/public/images/aboutCompany/roveAroundTheCity/5.png b/public/images/aboutCompany/roveAroundTheCity/5.png new file mode 100644 index 0000000..620e220 Binary files /dev/null and b/public/images/aboutCompany/roveAroundTheCity/5.png differ diff --git a/public/images/aboutCompany/roveAroundTheCity/6.png b/public/images/aboutCompany/roveAroundTheCity/6.png new file mode 100644 index 0000000..62cc621 Binary files /dev/null and b/public/images/aboutCompany/roveAroundTheCity/6.png differ diff --git a/public/images/aboutCompany/roveAroundTheCity/7.png b/public/images/aboutCompany/roveAroundTheCity/7.png new file mode 100644 index 0000000..05733a9 Binary files /dev/null and b/public/images/aboutCompany/roveAroundTheCity/7.png differ diff --git a/public/images/aboutCompany/roveAroundTheCity/8.png b/public/images/aboutCompany/roveAroundTheCity/8.png new file mode 100644 index 0000000..ad0c934 Binary files /dev/null and b/public/images/aboutCompany/roveAroundTheCity/8.png differ diff --git a/public/images/aboutCompany/roveAroundTheCity/9.png b/public/images/aboutCompany/roveAroundTheCity/9.png new file mode 100644 index 0000000..08ea244 Binary files /dev/null and b/public/images/aboutCompany/roveAroundTheCity/9.png differ diff --git a/public/images/aboutCompany/rovehome.png b/public/images/aboutCompany/rovehome.png new file mode 100644 index 0000000..3359db9 Binary files /dev/null and b/public/images/aboutCompany/rovehome.png differ diff --git a/public/images/aboutCompany/rovehome_roof.png b/public/images/aboutCompany/rovehome_roof.png new file mode 100644 index 0000000..c8ce913 Binary files /dev/null and b/public/images/aboutCompany/rovehome_roof.png differ diff --git a/public/images/aboutCompany/unitsDescription/1.png b/public/images/aboutCompany/unitsDescription/1.png new file mode 100644 index 0000000..d29994b Binary files /dev/null and b/public/images/aboutCompany/unitsDescription/1.png differ diff --git a/public/images/aboutCompany/unitsDescription/2.png b/public/images/aboutCompany/unitsDescription/2.png new file mode 100644 index 0000000..fcb106e Binary files /dev/null and b/public/images/aboutCompany/unitsDescription/2.png differ diff --git a/public/images/aboutCompany/unitsDescription/3.png b/public/images/aboutCompany/unitsDescription/3.png new file mode 100644 index 0000000..22f76bf Binary files /dev/null and b/public/images/aboutCompany/unitsDescription/3.png differ diff --git a/public/images/aboutCompany/unitsDescription/4.png b/public/images/aboutCompany/unitsDescription/4.png new file mode 100644 index 0000000..6f6b95e Binary files /dev/null and b/public/images/aboutCompany/unitsDescription/4.png differ diff --git a/public/images/virtual-tour/studio1/map.jpg b/public/images/virtual-tour/studio1/map.jpg new file mode 100644 index 0000000..0319fb2 Binary files /dev/null and b/public/images/virtual-tour/studio1/map.jpg differ diff --git a/public/images/virtual-tour/studio1/map.svg b/public/images/virtual-tour/studio1/map.svg new file mode 100644 index 0000000..827caf4 --- /dev/null +++ b/public/images/virtual-tour/studio1/map.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/components/aboutComplex/LivingSolutionSlider.tsx b/src/components/aboutComplex/LivingSolutionSlider.tsx new file mode 100644 index 0000000..c7426ba --- /dev/null +++ b/src/components/aboutComplex/LivingSolutionSlider.tsx @@ -0,0 +1,118 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { useSwipeable } from "react-swipeable"; +import { useLayoutEffect, useRef, useState } from "react"; +import { Image } from "../../types/image"; +import { isMobile } from "react-device-detect"; +import Button from "../Button"; +import LeftArrowSliderIcon from "../icons/LeftArrowSliderIcon"; +import RightArrowSliderIcon from "../icons/RightArrowSliderIcon"; + +const images: Image[] = [ + { id: "1", src: "/images/aboutCompany/livingSolutionsSlider/1.png" }, + { id: "2", src: "/images/aboutCompany/livingSolutionsSlider/2.png" }, + { id: "3", src: "/images/aboutCompany/livingSolutionsSlider/3.png" }, + { id: "4", src: "/images/aboutCompany/livingSolutionsSlider/4.png" }, +]; + +const getGapOffset = (screenWidth: number) => { + if (screenWidth > 1600) return 16; + if (screenWidth > 1280) return 24; + if (screenWidth > 640) return 16; + return 16; +}; + +const LivingSolutionSlider = () => { + const [selectedImageIndex, setSelectedImageIndex] = useState(-1); + const [rightImageOffset, setRightImageOffset] = useState(""); + const [imageWidth, setImageWidth] = useState(0); + const imageRef = useRef(null); + + useLayoutEffect(() => { + if (!imageRef.current?.src) return; + const width = imageRef.current.width; + setImageWidth(width); + }, [imageRef.current, window.innerWidth]); + + useLayoutEffect(() => { + const screenWidth = window.innerWidth; + const gapOffset = getGapOffset(screenWidth); + + const _rightImageOffset = + screenWidth > 1280 + ? `${"calc(clamp(315px, 7.0317rem + 19.0319vw, 485px)"} + ${ + // ? `${"calc(clamp(315px, 6.9317rem + 17.0319vw, 420px)"} + ${ + selectedImageIndex * (imageWidth + gapOffset) + }px)` + : `${(selectedImageIndex + 1) * (imageWidth + gapOffset)}px`; + + setRightImageOffset(_rightImageOffset); + }, [imageWidth, selectedImageIndex, window.innerWidth]); + + const handlers = useSwipeable({ + onSwipedLeft: next, + onSwipedRight: prev, + trackMouse: true, + }); + + function next() { + const lastIndex = isMobile ? images.length - 2 : images.length - 3; + + if (selectedImageIndex === lastIndex) return; + setSelectedImageIndex((prev) => prev + 1); + } + + function prev() { + if (selectedImageIndex === -1) return; + setSelectedImageIndex((prev) => prev - 1); + } + + return ( +
+
+
+ {images.map((image) => ( + + ))} +
+
+
+ {images.map((image, index) => ( +
+ ))} +
+
+ ); +}; + +export default LivingSolutionSlider; diff --git a/src/components/complexWingPage/FloorSidebar/ApartmentDescription.tsx b/src/components/complexWingPage/FloorSidebar/ApartmentDescription.tsx index 364ea4e..65d990a 100644 --- a/src/components/complexWingPage/FloorSidebar/ApartmentDescription.tsx +++ b/src/components/complexWingPage/FloorSidebar/ApartmentDescription.tsx @@ -4,16 +4,21 @@ interface ApartmentDescriptionProps { const ApartmentDescription = ({ isVisible }: ApartmentDescriptionProps) => { return ( -
+
-

- 1 bedroom, 609 Sqft -

-

AED 1,668,888

+

1 bedroom, 609 Sqft

+
+

East Wing

+
+

Floor 11

+
+

E-213

+
+

AED 1,668,888

diff --git a/src/components/complexWingPage/FloorSidebar/FloorSidebar.tsx b/src/components/complexWingPage/FloorSidebar/FloorSidebar.tsx index 0896fb5..48cc682 100644 --- a/src/components/complexWingPage/FloorSidebar/FloorSidebar.tsx +++ b/src/components/complexWingPage/FloorSidebar/FloorSidebar.tsx @@ -25,17 +25,9 @@ const FloorSidebar = ({ currentFloor, onMouseEnter }: IFloorSidebarProps) => { } function handleMouseMove(e: MouseEvent) { - const top = window.innerWidth / 2 - window.innerHeight / 2; - // setMousePos([e.clientX - 752, e.clientY - Math.abs(top) + 5]); - const y = e.clientY - 210; - const x = e.clientX - 800; + const y = e.clientY - 170; + const x = e.clientX - window.innerWidth / 2 - 50; setMousePos([x, y]); - console.log("e.clientX", e.clientX); - console.log("e.clientY", e.clientY); - // setMousePos([ - // e.clientX - window.innerWidth / 2 - 48, - // e.clientY - window.innerHeight / 2 - top, - // ]); } function handleOnMouseOut(): void { @@ -53,64 +45,67 @@ const FloorSidebar = ({ currentFloor, onMouseEnter }: IFloorSidebarProps) => { }, []); return ( -
-
-
-

- {currentFloor?.floor} Floor -

-

{currentFloor?.wing}

+ <> +
+ +
+
+
+
+

+ {currentFloor?.floor} Floor +

+

{currentFloor?.wing}

+
+
+
234 units
+
-
-
234 units
+
+
+
+

Studio Flex

+
+
+
+

Studio

+
+
+
+

1 Bedroom

+
+
+
+

1 Bedroom

+
+
+
+

2 Bedroom

+
+
+ +
+ + + +
-
-
-
-

Studio Flex

-
-
-
-

Studio

-
-
-
-

1 Bedroom

-
-
-
-

1 Bedroom

-
-
-
-

2 Bedroom

-
-
-
-
- -
- - - - -
-
+ ); }; diff --git a/src/components/complexWingPage/SequenceWing.tsx b/src/components/complexWingPage/SequenceWing.tsx index d7491fe..669ddef 100644 --- a/src/components/complexWingPage/SequenceWing.tsx +++ b/src/components/complexWingPage/SequenceWing.tsx @@ -159,13 +159,13 @@ const SequenceWing = () => { }} > -
{currentSphere?.roomType}
+
+ {currentSphere?.roomType} +
diff --git a/src/components/virtualTour/VirtualTourSidebar.tsx b/src/components/virtualTour/VirtualTourSidebar.tsx index 46009be..c55bec0 100644 --- a/src/components/virtualTour/VirtualTourSidebar.tsx +++ b/src/components/virtualTour/VirtualTourSidebar.tsx @@ -5,12 +5,15 @@ import Button from "../Button"; import BookingIcon from "../icons/BookingIcon"; import ChevronDownIcon from "../icons/ChevronDownIcon"; import HeartIcon from "../icons/Heart"; +import MapVectorIcon from "../icons/MapVectorIcon"; +import useCompass from "../../store/useCompass"; interface VirtualTourSidebarProps { currentAppartment: null | IAppartmentSphere; } const VirtualTourSidebar = ({ currentAppartment }: VirtualTourSidebarProps) => { + const { currentCompassRotate } = useCompass(); const [isActive, setIsActive] = useState(false); const { setSelectedSphere, selectedSphere } = useSphere(); const handleOnShowClick = () => { @@ -53,8 +56,18 @@ const VirtualTourSidebar = ({ currentAppartment }: VirtualTourSidebarProps) => { !isActive ? "max-h-0 opacity-0" : "max-h-screen opacity-100" }`} > -
- +
+ +
+ +
@@ -80,13 +93,13 @@ const VirtualTourSidebar = ({ currentAppartment }: VirtualTourSidebarProps) => {
-
+
{currentAppartment && currentAppartment.spheres.map((sphere) => { return (
handleOnLabelClick(sphere)} - className={` font-semibold text-caption-s py-0.5 px-2 w-fit rounded-full cursor-pointer pointer-events-auto select-none text-white ${ + className={`font-semibold text-caption-s py-0.5 px-2 w-fit rounded-full cursor-pointer pointer-events-auto select-none text-white ${ selectedSphere?.id === sphere.id ? "bg-[#00BED7]" : "bg-[#0D192266]" diff --git a/src/data/appartments.json b/src/data/appartments.json index 83a5ca4..e04f6a2 100644 --- a/src/data/appartments.json +++ b/src/data/appartments.json @@ -7,6 +7,7 @@ "sphereImage": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-01.jpg", "roomType": "entrance", "position": [-14.16, 0, 24.11], + "mapPosition": [120, 240], "links": [ { "id": "studio-1_sp-02", @@ -25,6 +26,7 @@ "sphereImage": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-02.jpg", "roomType": "bathroom", "position": [-14.16, 0, 24.11], + "mapPosition": [160, 240], "links": [ { "id": "studio-1_sp-01", @@ -38,6 +40,7 @@ "sphereImage": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-03.jpg", "roomType": "kitchen", "position": [-14.16, 0, 24.11], + "mapPosition": [120, 175], "links": [ { "id": "studio-1_sp-04", @@ -56,6 +59,7 @@ "sphereImage": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-04.jpg", "roomType": "bedroom 1", "position": [-14.16, 0, 24.11], + "mapPosition": [125, 155], "links": [ { "id": "studio-1_sp-05", @@ -74,6 +78,7 @@ "sphereImage": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-05.jpg", "roomType": "bedroom 2", "position": [-14.16, 0, 24.11], + "mapPosition": [115, 125], "links": [ { "id": "studio-1_sp-06", @@ -92,6 +97,7 @@ "sphereImage": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-06.jpg", "roomType": "glass doors", "position": [-14.16, 0, 24.11], + "mapPosition": [115, 55], "links": [ { "id": "studio-1_sp-07", @@ -110,6 +116,7 @@ "sphereImage": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-07.jpg", "roomType": "balcony", "position": [-14.16, 0, 24.11], + "mapPosition": [165, 14], "links": [ { "id": "studio-1_sp-06", diff --git a/src/index.css b/src/index.css index 4eafcc7..81d7b83 100644 --- a/src/index.css +++ b/src/index.css @@ -82,6 +82,10 @@ html { left: clamp(230px, 0.5927rem + 17.2144vw, 370px); } + .left-solution-slider-btn-offset { + left: clamp(230px, 0.3927rem + 15.5144vw, 370px); + } + .slider { position: relative; } diff --git a/src/main.tsx b/src/main.tsx index babe790..f40702c 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -11,6 +11,7 @@ import SearchParticularApartments from "./pages/SearchParticularApartments"; import SearchApartment from "./pages/SearchApartment"; import Favorites from "./pages/Favorites"; import VirtualTour from "./pages/VirtualTour"; +import AboutComplex from "./pages/AboutComplex"; const router = createBrowserRouter([ { @@ -29,6 +30,10 @@ const router = createBrowserRouter([ path: "/masterplan/:complexId", element: , }, + { + path: "/masterplan/:complexId/aboutComplex", + element: , + }, { path: "/masterplan/:complexId/wing", element: , diff --git a/src/pages/AboutComplex.tsx b/src/pages/AboutComplex.tsx new file mode 100644 index 0000000..0d37b66 --- /dev/null +++ b/src/pages/AboutComplex.tsx @@ -0,0 +1,294 @@ +import { isMobile } from "react-device-detect"; +import Footer from "../components/Footer"; +import Button from "../components/Button"; +import LeftArrowIcon from "../components/icons/LeftArrowIcon"; +import { Project } from "../types/project"; +import LivingSolutionSlider from "../components/aboutComplex/LivingSolutionSlider"; + +interface ICityItem { + time: number; + title: string; + id: string; + image: string; +} + +const roveAroundTheCity: ICityItem[] = [ + { + id: "1", + title: "Burj Khalifa", + time: 10, + image: "/images/aboutCompany/roveAroundTheCity/1.png", + }, + { + id: "2", + title: "The Dubai Fountain", + time: 10, + image: "/images/aboutCompany/roveAroundTheCity/2.png", + }, + { + id: "3", + title: "Dubai Mall", + time: 8, + image: "/images/aboutCompany/roveAroundTheCity/3.png", + }, + { + id: "4", + title: "Dubai Opera", + time: 11, + image: "/images/aboutCompany/roveAroundTheCity/4.png", + }, + { + id: "5", + title: "Marasi Promenade", + time: 4, + image: "/images/aboutCompany/roveAroundTheCity/5.png", + }, + { + id: "6", + title: "Rove Downtown Hotel", + time: 10, + image: "/images/aboutCompany/roveAroundTheCity/6.png", + }, + { + id: "7", + title: "Rove City Walk Hotel", + time: 12, + image: "/images/aboutCompany/roveAroundTheCity/7.png", + }, + { + id: "8", + title: "City Walk", + time: 12, + image: "/images/aboutCompany/roveAroundTheCity/8.png", + }, + { + id: "9", + title: "Coca Cola arena", + time: 14, + image: "/images/aboutCompany/roveAroundTheCity/9.png", + }, + { + id: "10", + title: " Dubai International Airport", + time: 10, + image: "/images/aboutCompany/roveAroundTheCity/10.png", + }, +]; + +interface IAdvantages { + title: string; + image: string; + id: string; +} + +const advantages: IAdvantages[] = [ + { + title: "Community", + image: "/images/aboutCompany/advantages/1.png", + id: "1", + }, + { + title: "Rove-Inspired design", + image: "/images/aboutCompany/advantages/2.png", + id: "2", + }, + { + title: "Fully loaded amenities", + image: "/images/aboutCompany/advantages/3.png", + id: "3", + }, + { + title: "Add-on services", + image: "/images/aboutCompany/advantages/4.png", + id: "4", + }, + { + title: "Central urban location", + image: "/images/aboutCompany/advantages/5.png", + id: "5", + }, +]; + +interface IUnitDesc { + title: string; + desc: string; + id: string; + sqft: number; + aed: number; + image: string; +} + +const unitsDesc: IUnitDesc[] = [ + { + id: "1", + image: "/images/aboutCompany/unitsDescription/1.png", + aed: 1048888, + title: "Studio flex", + sqft: 341, + desc: "Live in the future, today. In Studio Flex explore the ORI Cloud Bed, optimizing your living space with functionality and smart living. Every inch is designed to provide more space for comfort and convenience. This feature increase your unit size by 33%", + }, +]; + +const advStyles = [ + "xl:col-start-3 xl:col-end-7", + "xl:col-span-4", + "xl:col-start-5 xl:col-end-9", + "xl:col-span-4", + "xl:col-start-3 xl:col-span-4", +]; + +const AboutComplex = () => { + return ( +
+
+
+
+
+

+ Rove Home this residence a complete ecosystem that has everything you’ll + ever need. This isn’t just where you’ll live. It’s where you’ll thrive. +

+ +
+
+ About rove home +
+
+ +
+ Embrace Rove’s forever-young spirit at Rove Home, where inspiring + design and vibrant art installations converge with an exceptional + location and an extended playlist of life-enhancing{" "} +
+
+
+
+ +
+
+
+ ROVE AROUND THE CITY +
+
+
+ {roveAroundTheCity.map((item) => ( +
+
+
+
{item.title}
+
+

{item.time} mins

+ +
+ ))} +
+
+ +
+
+
+
+
+ ADVANTAGES +
+

+ What makes a rove home? +

+ {advantages.map((adv, index) => { + const styles = `${advStyles[index]} sm:col-start-1 ${ + index === advantages.length - 1 ? "" : "pb-14" + }`; + + return ( +
+ {adv.title} +
+
+
{adv.title}
+
+
+ ); + })} +
+

+ Live in the future, today. Designed to embody Rove’s unique look and + feel, the interiors will feature intelligent and modular living + solutions by ORI, never seen before in UAE and the region. +

+
+
+ EXPANDABLE LIVING SOLUTIONS +
+
+
+ ORI introduces a revolutionary solution to apartment living, where + space is not just a constraint but an opportunity.{" "} +
+
+
+
+

Simple

+
+
+
+

Safe

+
+
+
+

Effortless

+
+
+
+
+ +
+
+
+
+ ROVE AROUND THE CITY +
+
+ {unitsDesc.map((unit) => ( +
+
+ sdfsdfdsfsd +
+ +
+ ))} + +
+
+
+
+
+ +
+ ); +}; + +export default AboutComplex; diff --git a/src/types/apartmentSphere.ts b/src/types/apartmentSphere.ts index b66950d..2fb1375 100644 --- a/src/types/apartmentSphere.ts +++ b/src/types/apartmentSphere.ts @@ -9,6 +9,7 @@ interface ISphere { sphereImage: string; roomType: string; position: [number, number, number]; + mapPosition: [number, number]; links: ISphereLink[]; }