virtual tour page
@@ -10,6 +10,8 @@
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@react-three/drei": "^9.105.6",
|
||||
"@react-three/fiber": "^8.16.6",
|
||||
"@types/react-router-dom": "^5.3.3",
|
||||
"gsap": "^3.12.5",
|
||||
"react": "^18.2.0",
|
||||
@@ -22,6 +24,7 @@
|
||||
"react-swipeable": "^7.0.1",
|
||||
"react-transition-group": "^4.4.5",
|
||||
"react-zoom-pan-pinch": "^3.4.4",
|
||||
"three": "^0.164.1",
|
||||
"zustand": "^4.5.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
|
After Width: | Height: | Size: 146 KiB |
|
After Width: | Height: | Size: 250 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 256 KiB |
|
After Width: | Height: | Size: 268 KiB |
|
After Width: | Height: | Size: 304 KiB |
|
After Width: | Height: | Size: 341 KiB |
@@ -14,12 +14,12 @@ const ButtomPanel = () => {
|
||||
<div className="flex gap-2 pb-6 pl-6">
|
||||
<Button
|
||||
text="Disclaimer"
|
||||
buttonType="tertiary"
|
||||
buttonType="special"
|
||||
className="pl-2"
|
||||
icon={<DisclaimerIcon />}
|
||||
onClick={handleOnDisclaimerClick}
|
||||
/>
|
||||
<Button text="Privacy Policy" buttonType="tertiary" />
|
||||
<Button text="Privacy Policy" buttonType="special" />
|
||||
</div>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
|
||||
@@ -18,12 +18,12 @@ const ComplexButtomPanel = () => {
|
||||
<div className="flex gap-2 pb-6 pl-6">
|
||||
<Button
|
||||
text="Disclaimer"
|
||||
buttonType="tertiary"
|
||||
buttonType="special"
|
||||
className="pl-2"
|
||||
icon={<DisclaimerIcon />}
|
||||
onClick={handleOnDisclaimerClick}
|
||||
/>
|
||||
<Button text="Privacy Policy" buttonType="tertiary" />
|
||||
<Button text="Privacy Policy" buttonType="special" />
|
||||
</div>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
|
||||
@@ -50,12 +50,20 @@ const MultiRangeSlider = ({
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (!firstInputRef.current) return;
|
||||
if (
|
||||
!firstInputRef.current ||
|
||||
multirangeSlider.startValue === multirangeSlider.minValue
|
||||
)
|
||||
return;
|
||||
(firstInputRef.current as HTMLInputElement).focus();
|
||||
}, [multirangeSlider.startValue]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!secondInputRef.current) return;
|
||||
if (
|
||||
!secondInputRef.current ||
|
||||
multirangeSlider.maxValue === multirangeSlider.endValue
|
||||
)
|
||||
return;
|
||||
(secondInputRef.current as HTMLInputElement).focus();
|
||||
}, [multirangeSlider.endValue]);
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import { ISwitcher } from "../types/switcher";
|
||||
|
||||
interface ISwitchProps {
|
||||
switcher: ISwitcher;
|
||||
onClick: (id: string) => void;
|
||||
onClick: ((id: string) => void) | (() => void);
|
||||
}
|
||||
|
||||
const Switch = ({ switcher, onClick }: ISwitchProps) => {
|
||||
@@ -18,9 +18,8 @@ const Switch = ({ switcher, onClick }: ISwitchProps) => {
|
||||
onClick={handleOnClick}
|
||||
>
|
||||
<div
|
||||
className={`w-5 h-5 bg-[#fff] rounded-full absolute transition-all duration-300 ease-in-out top-[2px] ${
|
||||
switcher.isSwitched ? "left-[18px]" : "left-[2px]"
|
||||
}`}
|
||||
className={`w-5 h-5 bg-[#fff] rounded-full absolute transition-all duration-300 ease-in-out top-[2px]
|
||||
${switcher.isSwitched ? "left-[18px]" : "left-[2px]"}`}
|
||||
></div>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -148,7 +148,7 @@ const SequenceWing = () => {
|
||||
}, [isSidebar]);
|
||||
|
||||
return (
|
||||
<div className="absolute left-0 overflow-hidden h-screen w-screen select-none pointer-events-none">
|
||||
<div className="absolute left-0 overflow-hidden h-screen w-screen select-none ">
|
||||
<div
|
||||
className=" absolute h-[calc(100vh-56px)] right-0 w-1/2 duration-300 transition-all "
|
||||
style={{ right: `${isFloorSidebar ? "0" : "-50%"}` }}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import useModal from "../../store/useModal";
|
||||
import { ILayoutCard } from "../../types/layoutCard";
|
||||
import Button from "../Button";
|
||||
import BookingIcon from "../icons/BookingIcon";
|
||||
import CrossIcon from "../icons/CrossIcon";
|
||||
import HeartIcon from "../icons/Heart";
|
||||
|
||||
interface FavoriteAppartmentCardProps {
|
||||
@@ -8,17 +10,14 @@ interface FavoriteAppartmentCardProps {
|
||||
}
|
||||
|
||||
const FavoriteAppartmentCard = ({ card }: FavoriteAppartmentCardProps) => {
|
||||
const {
|
||||
roveHome,
|
||||
floorEnd,
|
||||
floorStart,
|
||||
wing,
|
||||
units,
|
||||
apartmentType,
|
||||
square,
|
||||
cost,
|
||||
} = card;
|
||||
const { roveHome, floorEnd, floorStart, wing, apartmentType, square, cost } =
|
||||
card;
|
||||
|
||||
const { setModal } = useModal();
|
||||
|
||||
const handleOnSendEquiryClick = () => {
|
||||
setModal(<SendEnquiryModal />);
|
||||
};
|
||||
return (
|
||||
<div className="bg-white flex flex-col p-4 rounded-lg gap-4 cursor-pointer select-none">
|
||||
<div className="flex gap-4 justify-between">
|
||||
@@ -55,10 +54,65 @@ const FavoriteAppartmentCard = ({ card }: FavoriteAppartmentCardProps) => {
|
||||
text="Send Enquiry"
|
||||
className="flex justify-center"
|
||||
buttonType="cta"
|
||||
onClick={handleOnSendEquiryClick}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
const SendEnquiryModal = () => {
|
||||
const { setModal } = useModal();
|
||||
|
||||
const handleOnModalClick = () => {
|
||||
setModal(null);
|
||||
};
|
||||
return (
|
||||
<div className="absolute z-50 top-0 left-0 w-screen bg-[#0D192266] h-screen backdrop-blur-[6px] grid grid-cols-12 items-center">
|
||||
<div className="h-full col-span-3 col-start-10 bg-[#F3F3F2] py-6 px-6 flex flex-col justify-between items-center">
|
||||
<div className="flex flex-col gap-8 w-full">
|
||||
<div className="flex justify-between pb-4 border-b border-[#E2E2DC] ">
|
||||
<h2 className="text-subheadline-m font-semibold">
|
||||
Apartment purchase enquiry
|
||||
</h2>
|
||||
<Button
|
||||
buttonType="tertiary"
|
||||
icon={<CrossIcon />}
|
||||
onClick={handleOnModalClick}
|
||||
/>
|
||||
</div>
|
||||
<div className="rounded-lg bg-white p-4 flex flex-col gap-4">
|
||||
<div className="flex flex-col gap-1">
|
||||
<p className="text-subheadline-s font-semibold text-[#0D1922]">
|
||||
1 bedroom, 609 Sqft{" "}
|
||||
</p>
|
||||
<p className="text-subheadline-s font-semibold text-[#0D192266]">
|
||||
AED 1,668,888
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex flex-col gap-1">
|
||||
<p className="text-[#00BED7] text-s">1 bedroom, 609 Sqft </p>
|
||||
<div className="flex gap-1 flex-col">
|
||||
<div className="text-[#73787C] flex gap-2 items-center w-fit">
|
||||
<p className="text-caption-m font-semibold leading-4">
|
||||
East Wing
|
||||
</p>
|
||||
<div className="w-1 h-1 bg-[#E2E2DC] rounded-full"></div>
|
||||
<p className="text-caption-m font-semibold leading-4">
|
||||
Floor 11
|
||||
</p>
|
||||
<div className="w-1 h-1 bg-[#E2E2DC] rounded-full"></div>
|
||||
<p className="text-caption-m font-semibold leading-4">
|
||||
№ 213
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default FavoriteAppartmentCard;
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
import { ILayoutCard } from "../../types/layoutCard";
|
||||
import FavoriteAppartmentCard from "./FavoriteApartmentCard";
|
||||
|
||||
interface FavoriteCardListProps {
|
||||
cards: ILayoutCard[];
|
||||
}
|
||||
|
||||
const FavoriteCardList = ({ cards }: FavoriteCardListProps) => {
|
||||
return (
|
||||
<div className="grid grid-cols-4 gap-4">
|
||||
{cards.map((card) => (
|
||||
<FavoriteAppartmentCard card={card} key={card.id} />
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default FavoriteCardList;
|
||||
@@ -0,0 +1,99 @@
|
||||
import { useState, useRef, useEffect } from "react";
|
||||
import { ILayoutCard } from "../../types/layoutCard";
|
||||
import FavoriteSliderCard from "./FavoriteSliderCard";
|
||||
import Button from "../Button";
|
||||
import RightArrowIcon from "../icons/RightArrowIcon";
|
||||
import LeftArrowIcon from "../icons/LeftArrowIcon";
|
||||
|
||||
interface FavoritesSliderProps {
|
||||
cards: ILayoutCard[];
|
||||
}
|
||||
|
||||
const cols = 4;
|
||||
|
||||
const FavoritesSlider = ({ cards }: FavoritesSliderProps) => {
|
||||
const [offset, setOffset] = useState(0);
|
||||
const cardRef = useRef<HTMLDivElement | null>(null);
|
||||
const [cardWidth, setCardWidth] = useState(0);
|
||||
const [buttonTopPos, setButtonTopPos] = useState(0);
|
||||
|
||||
useEffect(() => {
|
||||
const cardElement = cardRef.current;
|
||||
if (cardElement) {
|
||||
const gap = 16;
|
||||
const width = cardElement.clientWidth + gap;
|
||||
const buttonHeight = cardElement.clientHeight;
|
||||
const _buttonTopPos = buttonHeight / 2 + 20;
|
||||
setCardWidth(width);
|
||||
setButtonTopPos(_buttonTopPos);
|
||||
}
|
||||
}, []);
|
||||
|
||||
const handleOnLeftBtnClick = () => {
|
||||
if (0 > offset) {
|
||||
setOffset((prev) => prev + 1);
|
||||
}
|
||||
};
|
||||
|
||||
const handleOnRightBtnClick = () => {
|
||||
if (offset > -cards.length + cols) {
|
||||
setOffset((prev) => prev - 1);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="w-[calc(100vw - 48px)] relative">
|
||||
<div
|
||||
className="absolute -left-2 z-30"
|
||||
style={{ top: `${buttonTopPos}px` }}
|
||||
>
|
||||
<Button
|
||||
buttonType="fab"
|
||||
icon={<LeftArrowIcon />}
|
||||
onClick={handleOnLeftBtnClick}
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
className="absolute -right-2 z-30"
|
||||
style={{ top: `${buttonTopPos}px` }}
|
||||
>
|
||||
<Button
|
||||
buttonType="fab"
|
||||
icon={<RightArrowIcon />}
|
||||
onClick={handleOnRightBtnClick}
|
||||
/>
|
||||
</div>
|
||||
<div className="w-full overflow-hidden">
|
||||
<div
|
||||
className="transition-all ease-in-out duration-300"
|
||||
style={{ transform: `translateX(${offset * cardWidth}px)` }}
|
||||
>
|
||||
<div className="flex w-fit gap-4">
|
||||
{Array.from({ length: Math.floor(cards.length / cols) }).map(
|
||||
(_, index) => {
|
||||
return (
|
||||
<div
|
||||
className="grid grid-cols-4 gap-4 w-[calc(100vw-48px)] h-fit"
|
||||
key={index}
|
||||
>
|
||||
{cards
|
||||
.slice(index * cols, cols + index * cols)
|
||||
.map((card) => (
|
||||
<FavoriteSliderCard
|
||||
elementRef={cardRef}
|
||||
card={card}
|
||||
key={card.id}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default FavoritesSlider;
|
||||
@@ -0,0 +1,59 @@
|
||||
import { ILayoutCard } from "../../types/layoutCard";
|
||||
import Button from "../Button";
|
||||
import BookingIcon from "../icons/BookingIcon";
|
||||
import HeartIcon from "../icons/Heart";
|
||||
|
||||
interface FavoriteSliderCardProps {
|
||||
card: ILayoutCard;
|
||||
elementRef: React.MutableRefObject<HTMLDivElement | null>;
|
||||
}
|
||||
|
||||
const FavoriteSliderCard = ({ card, elementRef }: FavoriteSliderCardProps) => {
|
||||
return (
|
||||
<div className="rounded-lg flex flex-col overflow-clip gap-6">
|
||||
<div className="flex flex-col gap-4 bg-white p-4" ref={elementRef}>
|
||||
<div className="flex justify-between">
|
||||
<div className="flex text-subheadline-s font-semibold text-[#0D1922]">
|
||||
<h2>
|
||||
{card.apartmentType}, {card.square} Sqft
|
||||
</h2>
|
||||
</div>
|
||||
<Button buttonType="favorite" icon={<HeartIcon isFilled />} />
|
||||
</div>
|
||||
<img src="/images/layout-1.png" alt="" className="w-full" />
|
||||
</div>
|
||||
<div className="flex flex-col gap-1 pb-6 border-b">
|
||||
<p className="text-s text-[#73787C]">Price</p>
|
||||
<p className="text-[#0D1922] text-m">AED {card.cost}</p>
|
||||
</div>
|
||||
<div className="flex flex-col gap-1 pb-6 border-b">
|
||||
<p className="text-s text-[#73787C]">Total Area</p>
|
||||
<p className="text-[#0D1922] text-m">{card.square} Sqft</p>
|
||||
</div>
|
||||
<div className="flex flex-col gap-1 pb-6 border-b">
|
||||
<p className="text-s text-[#73787C]">Project</p>
|
||||
<p className="text-[#00BED7] text-m">Rove Home {card.roveHome}</p>
|
||||
</div>
|
||||
<div className="flex flex-col gap-1 pb-6 border-b">
|
||||
<p className="text-s text-[#73787C]">Section</p>
|
||||
<p className="text-[#0D1922] text-m">{card.wing}</p>
|
||||
</div>
|
||||
<div className="flex flex-col gap-1 pb-6 border-b">
|
||||
<p className="text-s text-[#73787C]">Floor</p>
|
||||
<p className="text-[#0D1922] text-m">Floor 11</p>
|
||||
</div>
|
||||
<div className="flex flex-col gap-1 pb-6 border-b">
|
||||
<p className="text-s text-[#73787C]">Number</p>
|
||||
<p className="text-[#0D1922] text-m">213</p>
|
||||
</div>
|
||||
<Button
|
||||
icon={<BookingIcon />}
|
||||
text="Send Enquiry"
|
||||
className="flex justify-center"
|
||||
buttonType="cta"
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default FavoriteSliderCard;
|
||||
@@ -0,0 +1,21 @@
|
||||
const LeftArrowIcon = () => {
|
||||
return (
|
||||
<svg
|
||||
width="20"
|
||||
height="21"
|
||||
viewBox="0 0 20 21"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M12.5001 16.3334L6.66675 10.5001L12.5001 4.66675"
|
||||
stroke="currentColor"
|
||||
strokeWidth="1.5"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
|
||||
export default LeftArrowIcon;
|
||||
@@ -14,11 +14,6 @@ const ApartmentLayout = () => {
|
||||
};
|
||||
return (
|
||||
<div className="p-10 pt-6 rounded-lg bg-white flex flex-col items-center gap-8 relative">
|
||||
<SwitchToggle
|
||||
labels={apartmentLayouts}
|
||||
currentLabel={currentLabel}
|
||||
onClick={handleOnSwitchClick}
|
||||
/>
|
||||
<div className="w-full px-[304px] ">
|
||||
<img className="w-full " src="/images/layout-1.png" alt="" />
|
||||
</div>
|
||||
@@ -27,6 +22,11 @@ const ApartmentLayout = () => {
|
||||
alt=""
|
||||
className="absolute right-10 bottom-10"
|
||||
/>
|
||||
<SwitchToggle
|
||||
labels={apartmentLayouts}
|
||||
currentLabel={currentLabel}
|
||||
onClick={handleOnSwitchClick}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,24 +1,19 @@
|
||||
import { useEffect, useLayoutEffect, useRef, useState } from "react";
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import { useLayoutEffect, useRef, useState } from "react";
|
||||
import { layoutsCards } from "../../consts/initialSearchPage";
|
||||
import LayoutCard from "../searchPage/LayoutCard";
|
||||
import SimilarAppartmentCard from "./SimilarAppartmentCard";
|
||||
import Button from "../Button";
|
||||
import RightArrowIcon from "../icons/RightArrowIcon";
|
||||
|
||||
const cols = 4;
|
||||
|
||||
const SimilarSlider = () => {
|
||||
const [cards, setCards] = useState(layoutsCards.slice(0, 4));
|
||||
const [cards, setCards] = useState(layoutsCards);
|
||||
const [offset, setOffset] = useState(0);
|
||||
const sliderRef = useRef<HTMLDivElement | null>(null);
|
||||
const cardRef = useRef<HTMLDivElement | null>(null);
|
||||
const [sliderHeight, setSliderHeight] = useState(0);
|
||||
const [cardWidth, setCardWidth] = useState(0);
|
||||
|
||||
useLayoutEffect(() => {
|
||||
const sliderElement = sliderRef.current;
|
||||
if (sliderElement) {
|
||||
const height = sliderElement.clientHeight;
|
||||
setSliderHeight(height);
|
||||
}
|
||||
const cardElement = cardRef.current;
|
||||
if (cardElement) {
|
||||
const gap = 16;
|
||||
@@ -27,21 +22,20 @@ const SimilarSlider = () => {
|
||||
}
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
console.log("offset", offset);
|
||||
|
||||
return () => {};
|
||||
}, [offset]);
|
||||
|
||||
const handleOnLeftBtnClick = () => {
|
||||
if (0 < offset) {
|
||||
if (0 > offset) {
|
||||
setOffset((prev) => prev + 1);
|
||||
}
|
||||
};
|
||||
|
||||
const handleOnRightBtnClick = () => {
|
||||
// if (0 > offset) {
|
||||
setOffset((prev) => prev - 1);
|
||||
if (offset > -cards.length + cols) {
|
||||
setOffset((prev) => prev - 1);
|
||||
}
|
||||
// if (offset === -cards.length + cols) {
|
||||
// const updatedCards = [...cards, ...cards.slice(0, 4)];
|
||||
// setCards(updatedCards);
|
||||
// setOffset((prev) => prev - 1);
|
||||
// }
|
||||
};
|
||||
|
||||
@@ -68,32 +62,32 @@ const SimilarSlider = () => {
|
||||
<div className="border-t border-b py-4">
|
||||
<div className="w-[100vw-16px] overflow-hidden">
|
||||
<div
|
||||
className={` relative transition-transform duration-300 ease-in-out`}
|
||||
className={`transition-transform duration-300 ease-in-out`}
|
||||
style={{
|
||||
height: sliderHeight,
|
||||
transform: `translateX(${offset * cardWidth}px)`,
|
||||
}}
|
||||
>
|
||||
<div className="flex w-fit gap-4 absolute left-0 top-0">
|
||||
<div
|
||||
className="grid grid-cols-4 gap-4 w-[calc(100vw-32px)] h-fit"
|
||||
ref={sliderRef}
|
||||
>
|
||||
{cards.map((layoutsCard) => (
|
||||
<SimilarAppartmentCard
|
||||
elementRef={cardRef}
|
||||
layoutCard={layoutsCard}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
<div className="grid grid-cols-4 gap-4 w-[calc(100vw-32px)]">
|
||||
{cards.map((layoutsCard) => (
|
||||
<SimilarAppartmentCard
|
||||
elementRef={cardRef}
|
||||
layoutCard={layoutsCard}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
<div className="flex w-fit gap-4">
|
||||
{Array.from({ length: Math.floor(cards.length / cols) }).map(
|
||||
(_, index) => {
|
||||
return (
|
||||
<div
|
||||
className="grid grid-cols-4 gap-4 w-[calc(100vw-48px)] h-fit"
|
||||
key={index}
|
||||
>
|
||||
{cards
|
||||
.slice(index * cols, cols + index * cols)
|
||||
.map((card) => (
|
||||
<SimilarAppartmentCard
|
||||
elementRef={cardRef}
|
||||
layoutCard={card}
|
||||
key={card.id}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -34,7 +34,7 @@ const SortButton = ({ sortList, onClick }: SortButtonProps) => {
|
||||
</div>
|
||||
</button>
|
||||
<div
|
||||
className={`absolute flex flex-col bg-white p-2 text-[#0D1922] rounded-lg w-full shadow-lg transition-opacity duration-300 ease-in-out ${
|
||||
className={`absolute z-20 flex flex-col bg-white p-2 text-[#0D1922] rounded-lg w-full shadow-lg transition-opacity duration-300 ease-in-out ${
|
||||
isSelected ? "opacity-100" : "opacity-0"
|
||||
}`}
|
||||
>
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
import { BackSide, MeshBasicMaterial } from "three";
|
||||
import { OrbitControls, Html, Sphere, useTexture } from "@react-three/drei";
|
||||
import { Suspense, useRef } from "react";
|
||||
import { OrbitControls as OrbitControlsImpl } from "three-stdlib";
|
||||
import { useParams } from "react-router-dom";
|
||||
|
||||
const VirtualTourWrapper = () => {
|
||||
const orbitRef = useRef<OrbitControlsImpl>(null);
|
||||
const materialRef = useRef<MeshBasicMaterial>(null);
|
||||
const texture = useTexture(
|
||||
"/images/virtual-tour/studio1/Studio1_w-12_13_sp-01.webp"
|
||||
);
|
||||
const { id } = useParams();
|
||||
|
||||
return (
|
||||
<Suspense fallback={<div>Loading ...</div>}>
|
||||
<Sphere
|
||||
args={[1, 64, 64]}
|
||||
position={[-14.16, 0, 24.11]}
|
||||
scale={[-1, 1, 1]}
|
||||
rotation={[0, Math.PI, 0]}
|
||||
>
|
||||
<meshBasicMaterial
|
||||
ref={materialRef}
|
||||
map={texture}
|
||||
side={BackSide}
|
||||
transparent
|
||||
/>
|
||||
</Sphere>
|
||||
<OrbitControls
|
||||
ref={orbitRef}
|
||||
maxDistance={0.001}
|
||||
enableZoom={false}
|
||||
rotateSpeed={0.5}
|
||||
reverseOrbit
|
||||
onChange={() => console.log("e", orbitRef.current?.getAzimuthalAngle())}
|
||||
target={[-14.16, 0, 24.11]}
|
||||
/>
|
||||
</Suspense>
|
||||
);
|
||||
};
|
||||
|
||||
export default VirtualTourWrapper;
|
||||
@@ -4,27 +4,30 @@ const backgroundColors: ButtonStyle = {
|
||||
cta: "bg-[#00BED7] hover:bg-[#00A8BE]",
|
||||
primary: "bg-[#ffffff] hover:bg-[#F3F3F2] active:bg-[#fff]",
|
||||
secondary: "bg-[#ffffff] hover:bg-[#F3F3F2] active:bg-[#fff]",
|
||||
tertiary: "bg-[#0D192266] hover:bg-[#0D1922B2]",
|
||||
tertiary: "",
|
||||
fab: "bg-[#ffffff] hover:bg-[#F3F3F2]",
|
||||
favorite: "bg-[#FFFFFF] hover:bg-[#F3F3F2]",
|
||||
special: "bg-[#0D192266] hover:bg-[#0D1922B2]",
|
||||
};
|
||||
|
||||
const textColors: ButtonStyle = {
|
||||
cta: "text-[#ffffff]",
|
||||
primary: "text-[#0D1922]",
|
||||
secondary: "text-[#0D1922]",
|
||||
tertiary: "text-[#ffffff]",
|
||||
tertiary: "text-[#73787C] hover:text-[#0D1922] active:text-[#00BED7]",
|
||||
fab: "text-[#0D1922]",
|
||||
favorite: "text-[#F3F3F2]",
|
||||
special: "text-[#ffffff]",
|
||||
};
|
||||
|
||||
const borders: ButtonStyle = {
|
||||
cta: "rounded-lg",
|
||||
primary: "rounded-lg border border-[#ffffff] active:border-[#00BED7]",
|
||||
secondary: "rounded-lg border border-[#E2E2DC] active:border-[#00BED7]",
|
||||
tertiary: "rounded-full",
|
||||
tertiary: "",
|
||||
fab: "rounded-full",
|
||||
favorite: "rounded-lg border border-[#E2E2DC]",
|
||||
favorite: "rounded-full border border-[#E2E2DC]",
|
||||
special: "rounded-full",
|
||||
};
|
||||
|
||||
const paddings: ButtonStyle = {
|
||||
@@ -34,6 +37,7 @@ const paddings: ButtonStyle = {
|
||||
tertiary: "py-1 px-3",
|
||||
fab: "py-3 px-6",
|
||||
favorite: "p-[10px]",
|
||||
special: "py-1 px-3",
|
||||
};
|
||||
|
||||
export { textColors, backgroundColors, borders, paddings };
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
[
|
||||
{
|
||||
"id": "studio-1-sp-01",
|
||||
"src": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-01.webp",
|
||||
"position": [-23.12, 0, -13.4],
|
||||
"mapPosition": [97.61, 281.92],
|
||||
"links": [
|
||||
{ "toId": "Dvor_16", "label": "" },
|
||||
{ "toId": "Dvor_17", "label": "Детская площадка" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "studio-1-sp-02",
|
||||
"src": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-02.webp",
|
||||
"position": [-14.16, 0, 24.11],
|
||||
"mapPosition": [39.57, 347.47],
|
||||
"links": [
|
||||
{ "toId": "Dvor_16", "label": "" },
|
||||
{ "toId": "Dvor_2", "label": "" },
|
||||
{ "toId": "Hall_1", "label": "Лобби" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "studio-1-sp-03",
|
||||
"src": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-03.webp",
|
||||
"position": [-22.27, 0, 19.69],
|
||||
"mapPosition": [36.26, 327.64],
|
||||
"links": [
|
||||
{ "toId": "Dvor_1", "label": "" },
|
||||
{ "toId": "Dvor_14", "label": "" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "studio-1-sp-04",
|
||||
"src": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-04.webp",
|
||||
"position": [-52.03, 0, -3.63],
|
||||
"mapPosition": [41.11, 241.29],
|
||||
"links": [
|
||||
{ "toId": "Dvor_15", "label": "" },
|
||||
{ "toId": "Dvor_4", "label": "" },
|
||||
{ "toId": "Dvor_9", "label": "Детская площадка" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "studio-1-sp-05",
|
||||
"src": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-05.webp",
|
||||
"position": [-50.6, 0, -15.06],
|
||||
"mapPosition": [64.39, 228.91],
|
||||
"links": [
|
||||
{ "toId": "Dvor_9", "label": "Детская площадка" },
|
||||
{ "toId": "Dvor_5", "label": "" },
|
||||
{ "toId": "Dvor_3", "label": "" },
|
||||
{ "toId": "Dvor_6", "label": "Детская площадка" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "studio-1-sp-06",
|
||||
"src": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-06.webp",
|
||||
"position": [-34.36, 0, -4.72],
|
||||
"mapPosition": [66.41, 273.23],
|
||||
"links": [
|
||||
{ "toId": "Dvor_4", "label": "" },
|
||||
{ "toId": "Dvor_17", "label": "Детская площадка" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "studio-1-sp-07",
|
||||
"src": "/images/virtual-tour/studio1/Studio1_w-12_13_sp-07.webp",
|
||||
"position": [-40.94, 0, -23.93],
|
||||
"mapPosition": [93.88, 235.03],
|
||||
"links": [
|
||||
{ "toId": "Dvor_17", "label": "Детская площадка" },
|
||||
{ "toId": "Dvor_7", "label": "" },
|
||||
{ "toId": "Dvor_4", "label": "" }
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -10,6 +10,7 @@ import Search from "./pages/Search";
|
||||
import SearchParticularApartments from "./pages/SearchParticularApartments";
|
||||
import SearchApartment from "./pages/SearchApartment";
|
||||
import Favorites from "./pages/Favorites";
|
||||
import VirtualTour from "./pages/VirtualTour";
|
||||
|
||||
const router = createBrowserRouter([
|
||||
{
|
||||
@@ -52,6 +53,10 @@ const router = createBrowserRouter([
|
||||
path: "/favorites",
|
||||
element: <Favorites />,
|
||||
},
|
||||
{
|
||||
path: "virtual-tour/:appartmentTypeId",
|
||||
element: <VirtualTour />,
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
||||
@@ -2,12 +2,14 @@ import { useState, useEffect } from "react";
|
||||
import { sortCardBy } from "../calc/sortCard";
|
||||
import Button from "../components/Button";
|
||||
import Footer from "../components/Footer";
|
||||
import FiltersIcon from "../components/icons/FiltersIcon";
|
||||
import TrashIcon from "../components/icons/TrashIcon";
|
||||
import SortButton from "../components/searchPage/SortButton";
|
||||
import { initialSortList } from "../consts/initialSearchPage";
|
||||
import { ILayoutCard } from "../types/layoutCard";
|
||||
import FavoriteAppartmentCard from "../components/favoritesPage/FavoriteApartmentCard";
|
||||
import Switch from "../components/Switch";
|
||||
import { ISwitcher } from "../types/switcher";
|
||||
import FavoritesSlider from "../components/favoritesPage/FavoriteSlider";
|
||||
import FavoriteCardList from "../components/favoritesPage/FavoriteCardList";
|
||||
|
||||
const favoriteCards: ILayoutCard[] = [
|
||||
{
|
||||
@@ -144,9 +146,16 @@ const favoriteCards: ILayoutCard[] = [
|
||||
},
|
||||
];
|
||||
|
||||
const initialCollectionCompareSwitcher: ISwitcher = {
|
||||
id: "1",
|
||||
title: "collection/compare",
|
||||
isSwitched: false,
|
||||
};
|
||||
|
||||
const Favorites = () => {
|
||||
const [sortList, setSortList] = useState(initialSortList);
|
||||
const [cards, setCards] = useState(favoriteCards);
|
||||
const [switcher, setSwitcher] = useState(initialCollectionCompareSwitcher);
|
||||
|
||||
const handleOnSortClick = (sortId: string) => {
|
||||
const updatedSortList = sortList.map((sort) => {
|
||||
@@ -156,6 +165,12 @@ const Favorites = () => {
|
||||
setSortList(updatedSortList);
|
||||
};
|
||||
|
||||
const handleOnSwitchClick = () => {
|
||||
setSwitcher((prev) => {
|
||||
return { ...prev, isSwitched: !prev.isSwitched };
|
||||
});
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
const sortedCards = sortCardBy(sortList, favoriteCards);
|
||||
|
||||
@@ -164,37 +179,50 @@ const Favorites = () => {
|
||||
|
||||
return (
|
||||
<div className="overflow-scroll h-screen w-screen pt-14">
|
||||
<div className="p-6">
|
||||
<div className="p-6 pb-16">
|
||||
<div className="pb-6">
|
||||
<div className="flex justify-between w-full items-center border-b pb-[11px]">
|
||||
<div className="flex gap-4 font-semibold text-subheadline-s leading-7 py-[6px]">
|
||||
<h2 className="text-[#0D1922]">Units</h2>
|
||||
<p className="text-[#73787C]">145</p>
|
||||
<div className="flex items-center gap-8">
|
||||
<div className="flex gap-4 font-semibold text-subheadline-s leading-7 py-[6px]">
|
||||
<h2 className="text-[#0D1922]">Units</h2>
|
||||
<p className="text-[#73787C]">145</p>
|
||||
</div>
|
||||
<SortButton sortList={sortList} onClick={handleOnSortClick} />
|
||||
</div>
|
||||
<div className="flex items-center gap-4">
|
||||
<div className="flex items-center gap-2">
|
||||
<Button
|
||||
buttonType="fab"
|
||||
icon={<FiltersIcon />}
|
||||
className="text-[#73787C]"
|
||||
text={"Compare"}
|
||||
/>
|
||||
<Button
|
||||
buttonType="fab"
|
||||
buttonType="tertiary"
|
||||
icon={<TrashIcon />}
|
||||
className="text-[#73787C]"
|
||||
text="Remove all"
|
||||
/>
|
||||
<div className="flex gap-2 items-center text-s">
|
||||
<p
|
||||
className={`transition-all duration-300 ease-in-out ${
|
||||
!switcher.isSwitched ? "text-[#0D1922]" : "text-[#73787C]"
|
||||
}`}
|
||||
>
|
||||
Collection
|
||||
</p>
|
||||
<Switch switcher={switcher} onClick={handleOnSwitchClick} />
|
||||
<p
|
||||
className={`transition-all duration-300 ease-in-out ${
|
||||
switcher.isSwitched ? "text-[#0D1922]" : "text-[#73787C]"
|
||||
}`}
|
||||
>
|
||||
Compare
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<SortButton sortList={sortList} onClick={handleOnSortClick} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="grid grid-cols-4 gap-4">
|
||||
{cards.map((card) => (
|
||||
<FavoriteAppartmentCard card={card} key={card.id} />
|
||||
))}
|
||||
</div>
|
||||
{switcher.isSwitched ? (
|
||||
<FavoritesSlider cards={cards} />
|
||||
) : (
|
||||
<FavoriteCardList cards={cards} />
|
||||
)}
|
||||
</div>
|
||||
<Footer />
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
import { Canvas } from "@react-three/fiber";
|
||||
import ButtomPanel from "../components/ButtomPanel";
|
||||
import VirtualTourWrapper from "../components/virtualTour/VirtualTourWrapper";
|
||||
|
||||
const VirtualTour = () => {
|
||||
return (
|
||||
<div className="overflow-hidden h-screen w-screen">
|
||||
{/* <TopPanel /> */}
|
||||
<div className="absolute w-screen h-screen grid grid-cols-12 z-30 pointer-events-none">
|
||||
<div className="col-span-3 h-screen py-[68px] px-3">
|
||||
<div className="bg-white w-full rounded-lg p-4 flex flex-col">
|
||||
<div className="flex flex-col gap-1 pb-[18px] border-b">
|
||||
<p className="text-[#00BED7] text-caption-m font-medium">
|
||||
Rove Home Marasi Drive{" "}
|
||||
</p>
|
||||
<div className="text-[#73787C] flex gap-2 items-center w-fit">
|
||||
<p className="text-caption-m font-semibold leading-4">
|
||||
East Wing
|
||||
</p>
|
||||
<div className="w-1 h-1 bg-[#E2E2DC] rounded-full"></div>
|
||||
<p className="text-caption-m font-semibold leading-4">
|
||||
Floor 11
|
||||
</p>
|
||||
<div className="w-1 h-1 bg-[#E2E2DC] rounded-full"></div>
|
||||
<p className="text-caption-m font-semibold leading-4">№ 213</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Canvas>
|
||||
<VirtualTourWrapper />
|
||||
</Canvas>
|
||||
<ButtomPanel />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default VirtualTour;
|
||||
@@ -4,7 +4,8 @@ type ButtonType =
|
||||
| "cta"
|
||||
| "fab"
|
||||
| "secondary"
|
||||
| "favorite";
|
||||
| "favorite"
|
||||
| "special";
|
||||
type ButtonStyle = {
|
||||
[key in ButtonType]: string;
|
||||
};
|
||||
|
||||
@@ -185,7 +185,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.24.0"
|
||||
|
||||
"@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
|
||||
"@babel/runtime@^7.11.2", "@babel/runtime@^7.17.8", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
|
||||
version "7.24.5"
|
||||
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz"
|
||||
integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==
|
||||
@@ -436,6 +436,18 @@
|
||||
"@jridgewell/resolve-uri" "^3.1.0"
|
||||
"@jridgewell/sourcemap-codec" "^1.4.14"
|
||||
|
||||
"@mediapipe/tasks-vision@0.10.8":
|
||||
version "0.10.8"
|
||||
resolved "https://registry.yarnpkg.com/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz#a78e137018a19933b7a1d0e887d553d4ab833d10"
|
||||
integrity sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==
|
||||
|
||||
"@monogrid/gainmap-js@^3.0.5":
|
||||
version "3.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@monogrid/gainmap-js/-/gainmap-js-3.0.5.tgz#8c736088012ae8cd1f7b3d5adbd221c3905ab4ed"
|
||||
integrity sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA==
|
||||
dependencies:
|
||||
promise-worker-transferable "^1.0.4"
|
||||
|
||||
"@nodelib/fs.scandir@2.1.5":
|
||||
version "2.1.5"
|
||||
resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
|
||||
@@ -462,6 +474,98 @@
|
||||
resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz"
|
||||
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
|
||||
|
||||
"@react-spring/animated@~9.6.1":
|
||||
version "9.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.6.1.tgz#ccc626d847cbe346f5f8815d0928183c647eb425"
|
||||
integrity sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==
|
||||
dependencies:
|
||||
"@react-spring/shared" "~9.6.1"
|
||||
"@react-spring/types" "~9.6.1"
|
||||
|
||||
"@react-spring/core@~9.6.1":
|
||||
version "9.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.6.1.tgz#ebe07c20682b360b06af116ea24e2b609e778c10"
|
||||
integrity sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==
|
||||
dependencies:
|
||||
"@react-spring/animated" "~9.6.1"
|
||||
"@react-spring/rafz" "~9.6.1"
|
||||
"@react-spring/shared" "~9.6.1"
|
||||
"@react-spring/types" "~9.6.1"
|
||||
|
||||
"@react-spring/rafz@~9.6.1":
|
||||
version "9.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.6.1.tgz#d71aafb92b78b24e4ff84639f52745afc285c38d"
|
||||
integrity sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==
|
||||
|
||||
"@react-spring/shared@~9.6.1":
|
||||
version "9.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.6.1.tgz#4e2e4296910656c02bd9fd54c559702bc836ac4e"
|
||||
integrity sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==
|
||||
dependencies:
|
||||
"@react-spring/rafz" "~9.6.1"
|
||||
"@react-spring/types" "~9.6.1"
|
||||
|
||||
"@react-spring/three@~9.6.1":
|
||||
version "9.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.6.1.tgz#095fcd1dc6509127c33c14486d88289b89baeb9d"
|
||||
integrity sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==
|
||||
dependencies:
|
||||
"@react-spring/animated" "~9.6.1"
|
||||
"@react-spring/core" "~9.6.1"
|
||||
"@react-spring/shared" "~9.6.1"
|
||||
"@react-spring/types" "~9.6.1"
|
||||
|
||||
"@react-spring/types@~9.6.1":
|
||||
version "9.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.6.1.tgz#913d3a68c5cbc1124fdb18eff919432f7b6abdde"
|
||||
integrity sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==
|
||||
|
||||
"@react-three/drei@^9.105.6":
|
||||
version "9.105.6"
|
||||
resolved "https://registry.yarnpkg.com/@react-three/drei/-/drei-9.105.6.tgz#62a576149d179a02a3aaf5f9d962bcf9e1540eb2"
|
||||
integrity sha512-JBgYeV36N9N9f1c3o1ZfLYW4rXZA7UQTq32Y8s3DEF6lwj1/y+RP/yq2VG5I8OzUPl7gsmWdy8fpWZgrlAqUpQ==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.11.2"
|
||||
"@mediapipe/tasks-vision" "0.10.8"
|
||||
"@monogrid/gainmap-js" "^3.0.5"
|
||||
"@react-spring/three" "~9.6.1"
|
||||
"@use-gesture/react" "^10.2.24"
|
||||
camera-controls "^2.4.2"
|
||||
cross-env "^7.0.3"
|
||||
detect-gpu "^5.0.28"
|
||||
glsl-noise "^0.0.0"
|
||||
hls.js "1.3.5"
|
||||
maath "^0.10.7"
|
||||
meshline "^3.1.6"
|
||||
react-composer "^5.0.3"
|
||||
stats-gl "^2.0.0"
|
||||
stats.js "^0.17.0"
|
||||
suspend-react "^0.1.3"
|
||||
three-mesh-bvh "^0.7.0"
|
||||
three-stdlib "^2.29.9"
|
||||
troika-three-text "^0.49.0"
|
||||
tunnel-rat "^0.1.2"
|
||||
utility-types "^3.10.0"
|
||||
uuid "^9.0.1"
|
||||
zustand "^3.7.1"
|
||||
|
||||
"@react-three/fiber@^8.16.6":
|
||||
version "8.16.6"
|
||||
resolved "https://registry.yarnpkg.com/@react-three/fiber/-/fiber-8.16.6.tgz#8ee71f6b10b3420c03f2ab3758909e6d98fd8f31"
|
||||
integrity sha512-sKEqocYKRI3deW7z9CAVjedDID1an2i8FwxQVv2reMJxzIxIlyxCYXMIAqXBCgHTFtVX2hWGTZYhLL5nyne8kA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.17.8"
|
||||
"@types/react-reconciler" "^0.26.7"
|
||||
"@types/webxr" "*"
|
||||
base64-js "^1.5.1"
|
||||
buffer "^6.0.3"
|
||||
its-fine "^1.0.6"
|
||||
react-reconciler "^0.27.0"
|
||||
react-use-measure "^2.1.1"
|
||||
scheduler "^0.21.0"
|
||||
suspend-react "^0.1.3"
|
||||
zustand "^3.7.1"
|
||||
|
||||
"@remix-run/router@1.16.1":
|
||||
version "1.16.1"
|
||||
resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.16.1.tgz#73db3c48b975eeb06d0006481bde4f5f2d17d1cd"
|
||||
@@ -547,6 +651,11 @@
|
||||
resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz"
|
||||
integrity sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==
|
||||
|
||||
"@tweenjs/tween.js@~23.1.1":
|
||||
version "23.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-23.1.2.tgz#4e5357fd6742f5aa50447d3fa808aed4cda93ed7"
|
||||
integrity sha512-kMCNaZCJugWI86xiEHaY338CU5JpD0B97p1j1IKNn/Zto8PgACjQx0UxbHjmOcLl/dDOBnItwD07KmCs75pxtQ==
|
||||
|
||||
"@types/babel__core@^7.20.5":
|
||||
version "7.20.5"
|
||||
resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz"
|
||||
@@ -580,6 +689,11 @@
|
||||
dependencies:
|
||||
"@babel/types" "^7.20.7"
|
||||
|
||||
"@types/draco3d@^1.4.0":
|
||||
version "1.4.10"
|
||||
resolved "https://registry.yarnpkg.com/@types/draco3d/-/draco3d-1.4.10.tgz#63ec0ba78b30bd58203ec031f4e4f0198c596dca"
|
||||
integrity sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==
|
||||
|
||||
"@types/estree@1.0.5":
|
||||
version "1.0.5"
|
||||
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz"
|
||||
@@ -595,6 +709,11 @@
|
||||
resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"
|
||||
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
|
||||
|
||||
"@types/offscreencanvas@^2019.6.4":
|
||||
version "2019.7.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz#90267db13f64d6e9ccb5ae3eac92786a7c77a516"
|
||||
integrity sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==
|
||||
|
||||
"@types/prop-types@*":
|
||||
version "15.7.12"
|
||||
resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz"
|
||||
@@ -607,6 +726,20 @@
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react-reconciler@^0.26.7":
|
||||
version "0.26.7"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.26.7.tgz#0c4643f30821ae057e401b0d9037e03e8e9b2a36"
|
||||
integrity sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react-reconciler@^0.28.0":
|
||||
version "0.28.8"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.28.8.tgz#e51710572bcccf214306833c2438575d310b3e98"
|
||||
integrity sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react-router-dom@^5.3.3":
|
||||
version "5.3.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83"
|
||||
@@ -644,6 +777,27 @@
|
||||
resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz"
|
||||
integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==
|
||||
|
||||
"@types/stats.js@*":
|
||||
version "0.17.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/stats.js/-/stats.js-0.17.3.tgz#705446e12ce0fad618557dd88236f51148b7a935"
|
||||
integrity sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==
|
||||
|
||||
"@types/three@^0.163.0":
|
||||
version "0.163.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/three/-/three-0.163.0.tgz#96f5440fcd39452d2c84dfe0c9b7a9cf0247b9e6"
|
||||
integrity sha512-uIdDhsXRpQiBUkflBS/i1l3JX14fW6Ot9csed60nfbZNXHDTRsnV2xnTVwXcgbvTiboAR4IW+t+lTL5f1rqIqA==
|
||||
dependencies:
|
||||
"@tweenjs/tween.js" "~23.1.1"
|
||||
"@types/stats.js" "*"
|
||||
"@types/webxr" "*"
|
||||
fflate "~0.8.2"
|
||||
meshoptimizer "~0.18.1"
|
||||
|
||||
"@types/webxr@*", "@types/webxr@^0.5.2":
|
||||
version "0.5.16"
|
||||
resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.16.tgz#28955aa2d1197d1ef0b9826ae0f7e68f7eca0601"
|
||||
integrity sha512-0E0Cl84FECtzrB4qG19TNTqpunw0F1YF0QZZnFMF6pDw1kNKJtrlTKlVB34stGIsHbZsYQ7H0tNjPfZftkHHoA==
|
||||
|
||||
"@typescript-eslint/eslint-plugin@^7.2.0":
|
||||
version "7.6.0"
|
||||
resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.6.0.tgz"
|
||||
@@ -735,6 +889,18 @@
|
||||
resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz"
|
||||
integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
|
||||
|
||||
"@use-gesture/core@10.3.1":
|
||||
version "10.3.1"
|
||||
resolved "https://registry.yarnpkg.com/@use-gesture/core/-/core-10.3.1.tgz#976c9421e905f0079d49822cfd5c2e56b808fc56"
|
||||
integrity sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==
|
||||
|
||||
"@use-gesture/react@^10.2.24":
|
||||
version "10.3.1"
|
||||
resolved "https://registry.yarnpkg.com/@use-gesture/react/-/react-10.3.1.tgz#17a743a894d9bd9a0d1980c618f37f0164469867"
|
||||
integrity sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==
|
||||
dependencies:
|
||||
"@use-gesture/core" "10.3.1"
|
||||
|
||||
"@vitejs/plugin-react@^4.2.1":
|
||||
version "4.2.1"
|
||||
resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz"
|
||||
@@ -840,6 +1006,18 @@ balanced-match@^1.0.0:
|
||||
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
|
||||
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
|
||||
|
||||
base64-js@^1.3.1, base64-js@^1.5.1:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
|
||||
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
||||
|
||||
bidi-js@^1.0.2:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/bidi-js/-/bidi-js-1.0.3.tgz#6f8bcf3c877c4d9220ddf49b9bb6930c88f877d2"
|
||||
integrity sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==
|
||||
dependencies:
|
||||
require-from-string "^2.0.2"
|
||||
|
||||
binary-extensions@^2.0.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz"
|
||||
@@ -877,6 +1055,14 @@ browserslist@^4.22.2, browserslist@^4.23.0:
|
||||
node-releases "^2.0.14"
|
||||
update-browserslist-db "^1.0.13"
|
||||
|
||||
buffer@^6.0.3:
|
||||
version "6.0.3"
|
||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
|
||||
integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
|
||||
dependencies:
|
||||
base64-js "^1.3.1"
|
||||
ieee754 "^1.2.1"
|
||||
|
||||
callsites@^3.0.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
|
||||
@@ -887,6 +1073,11 @@ camelcase-css@^2.0.1:
|
||||
resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz"
|
||||
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
|
||||
|
||||
camera-controls@^2.4.2:
|
||||
version "2.8.3"
|
||||
resolved "https://registry.yarnpkg.com/camera-controls/-/camera-controls-2.8.3.tgz#54c296d21564dede84e56ffd6b75b3daa3c76e90"
|
||||
integrity sha512-zFjqUR6onLkG+z1A6vAWfzovxZxWVSvp6e5t3lfZgfgPZtX3n74aykNAUaoRbq8Y3tOxadHkDjbfGDOP9hFf2w==
|
||||
|
||||
caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599:
|
||||
version "1.0.30001610"
|
||||
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz"
|
||||
@@ -973,7 +1164,14 @@ core-js@^3.22.4:
|
||||
resolved "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz"
|
||||
integrity sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==
|
||||
|
||||
cross-spawn@^7.0.0, cross-spawn@^7.0.2:
|
||||
cross-env@^7.0.3:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
|
||||
integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
|
||||
dependencies:
|
||||
cross-spawn "^7.0.1"
|
||||
|
||||
cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
|
||||
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
|
||||
@@ -992,6 +1190,11 @@ csstype@^3.0.2:
|
||||
resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
|
||||
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
|
||||
|
||||
debounce@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5"
|
||||
integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==
|
||||
|
||||
debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
|
||||
version "4.3.4"
|
||||
resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
|
||||
@@ -1004,6 +1207,13 @@ deep-is@^0.1.3:
|
||||
resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
|
||||
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
|
||||
|
||||
detect-gpu@^5.0.28:
|
||||
version "5.0.38"
|
||||
resolved "https://registry.yarnpkg.com/detect-gpu/-/detect-gpu-5.0.38.tgz#1c05ce728ea1229d16db15b865631609bf0d6952"
|
||||
integrity sha512-36QeGHSXYcJ/RfrnPEScR8GDprbXFG4ZhXsfVNVHztZr38+fRxgHnJl3CjYXXjbeRUhu3ZZBJh6Lg0A9v0Qd8A==
|
||||
dependencies:
|
||||
webgl-constants "^1.1.1"
|
||||
|
||||
didyoumean@^1.2.2:
|
||||
version "1.2.2"
|
||||
resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz"
|
||||
@@ -1036,6 +1246,11 @@ dom-helpers@^5.0.1:
|
||||
"@babel/runtime" "^7.8.7"
|
||||
csstype "^3.0.2"
|
||||
|
||||
draco3d@^1.4.1:
|
||||
version "1.5.7"
|
||||
resolved "https://registry.yarnpkg.com/draco3d/-/draco3d-1.5.7.tgz#94f9bce293eb8920c159dc91a4ce9124a9e899e0"
|
||||
integrity sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==
|
||||
|
||||
eastasianwidth@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz"
|
||||
@@ -1233,6 +1448,16 @@ fastq@^1.6.0:
|
||||
dependencies:
|
||||
reusify "^1.0.4"
|
||||
|
||||
fflate@^0.6.9:
|
||||
version "0.6.10"
|
||||
resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.6.10.tgz#5f40f9659205936a2d18abf88b2e7781662b6d43"
|
||||
integrity sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==
|
||||
|
||||
fflate@~0.8.2:
|
||||
version "0.8.2"
|
||||
resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea"
|
||||
integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==
|
||||
|
||||
file-entry-cache@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz"
|
||||
@@ -1368,6 +1593,11 @@ globby@^11.1.0:
|
||||
merge2 "^1.4.1"
|
||||
slash "^3.0.0"
|
||||
|
||||
glsl-noise@^0.0.0:
|
||||
version "0.0.0"
|
||||
resolved "https://registry.yarnpkg.com/glsl-noise/-/glsl-noise-0.0.0.tgz#367745f3a33382c0eeec4cb54b7e99cfc1d7670b"
|
||||
integrity sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==
|
||||
|
||||
graphemer@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz"
|
||||
@@ -1395,11 +1625,26 @@ hasown@^2.0.0:
|
||||
dependencies:
|
||||
function-bind "^1.1.2"
|
||||
|
||||
hls.js@1.3.5:
|
||||
version "1.3.5"
|
||||
resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.3.5.tgz#0e8b0799ecf2feb7ba199f5e95f35ba9552e04f4"
|
||||
integrity sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew==
|
||||
|
||||
ieee754@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
|
||||
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
|
||||
|
||||
ignore@^5.2.0, ignore@^5.3.1:
|
||||
version "5.3.1"
|
||||
resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz"
|
||||
integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
|
||||
|
||||
immediate@~3.0.5:
|
||||
version "3.0.6"
|
||||
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
|
||||
integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==
|
||||
|
||||
import-fresh@^3.2.1:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
|
||||
@@ -1467,11 +1712,23 @@ is-path-inside@^3.0.3:
|
||||
resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
|
||||
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
|
||||
|
||||
is-promise@^2.1.0:
|
||||
version "2.2.2"
|
||||
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
|
||||
integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
|
||||
|
||||
isexe@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
|
||||
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
|
||||
|
||||
its-fine@^1.0.6:
|
||||
version "1.2.5"
|
||||
resolved "https://registry.yarnpkg.com/its-fine/-/its-fine-1.2.5.tgz#5466c287f86a0a73e772c8d8d515626c97195dc9"
|
||||
integrity sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==
|
||||
dependencies:
|
||||
"@types/react-reconciler" "^0.28.0"
|
||||
|
||||
jackspeak@^2.3.6:
|
||||
version "2.3.6"
|
||||
resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz"
|
||||
@@ -1538,6 +1795,13 @@ levn@^0.4.1:
|
||||
prelude-ls "^1.2.1"
|
||||
type-check "~0.4.0"
|
||||
|
||||
lie@^3.0.2:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
|
||||
integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==
|
||||
dependencies:
|
||||
immediate "~3.0.5"
|
||||
|
||||
lilconfig@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz"
|
||||
@@ -1591,11 +1855,26 @@ lru-cache@^6.0.0:
|
||||
dependencies:
|
||||
yallist "^4.0.0"
|
||||
|
||||
maath@^0.10.7:
|
||||
version "0.10.7"
|
||||
resolved "https://registry.yarnpkg.com/maath/-/maath-0.10.7.tgz#9289b42a5db8ac5b26407b3bfca4e3bebefe50b4"
|
||||
integrity sha512-zQ2xd7dNOIVTjAS+hj22fyj1EFYmOJX6tzKjZ92r6WDoq8hyFxjuGA2q950tmR4iC/EKXoMQdSipkaJVuUHDTg==
|
||||
|
||||
merge2@^1.3.0, merge2@^1.4.1:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
|
||||
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
|
||||
|
||||
meshline@^3.1.6:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/meshline/-/meshline-3.3.0.tgz#8d926d3889ea9c37b37484961fbfbff0a464cd51"
|
||||
integrity sha512-EKKf2TLnfyqUeA7ryWFKgT9HchTMATvECGZnMQjtlcyxK0sB8shVLVkemBUp9dB3tkDEmoqQDLJCPStjkH8D7A==
|
||||
|
||||
meshoptimizer@~0.18.1:
|
||||
version "0.18.1"
|
||||
resolved "https://registry.yarnpkg.com/meshoptimizer/-/meshoptimizer-0.18.1.tgz#cdb90907f30a7b5b1190facd3b7ee6b7087797d8"
|
||||
integrity sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==
|
||||
|
||||
micromatch@^4.0.4, micromatch@^4.0.5:
|
||||
version "4.0.5"
|
||||
resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz"
|
||||
@@ -1818,12 +2097,25 @@ postcss@^8.4.23, postcss@^8.4.38:
|
||||
picocolors "^1.0.0"
|
||||
source-map-js "^1.2.0"
|
||||
|
||||
potpack@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14"
|
||||
integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==
|
||||
|
||||
prelude-ls@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
|
||||
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
|
||||
|
||||
prop-types@^15.6.2:
|
||||
promise-worker-transferable@^1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz#2c72861ba053e5ae42b487b4a83b1ed3ae3786e8"
|
||||
integrity sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==
|
||||
dependencies:
|
||||
is-promise "^2.1.0"
|
||||
lie "^3.0.2"
|
||||
|
||||
prop-types@^15.6.0, prop-types@^15.6.2:
|
||||
version "15.8.1"
|
||||
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
|
||||
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
|
||||
@@ -1842,6 +2134,13 @@ queue-microtask@^1.2.2:
|
||||
resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
|
||||
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
|
||||
|
||||
react-composer@^5.0.3:
|
||||
version "5.0.3"
|
||||
resolved "https://registry.yarnpkg.com/react-composer/-/react-composer-5.0.3.tgz#7beb9513da5e8687f4f434ea1333ef36a4f3091b"
|
||||
integrity sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==
|
||||
dependencies:
|
||||
prop-types "^15.6.0"
|
||||
|
||||
react-device-detect@^2.2.3:
|
||||
version "2.2.3"
|
||||
resolved "https://registry.npmjs.org/react-device-detect/-/react-device-detect-2.2.3.tgz"
|
||||
@@ -1882,6 +2181,14 @@ react-range-slider-input@^3.0.7:
|
||||
clsx "^1.1.1"
|
||||
core-js "^3.22.4"
|
||||
|
||||
react-reconciler@^0.27.0:
|
||||
version "0.27.0"
|
||||
resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.27.0.tgz#360124fdf2d76447c7491ee5f0e04503ed9acf5b"
|
||||
integrity sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==
|
||||
dependencies:
|
||||
loose-envify "^1.1.0"
|
||||
scheduler "^0.21.0"
|
||||
|
||||
react-refresh@^0.14.0:
|
||||
version "0.14.0"
|
||||
resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz"
|
||||
@@ -1917,6 +2224,13 @@ react-transition-group@^4.4.5:
|
||||
loose-envify "^1.4.0"
|
||||
prop-types "^15.6.2"
|
||||
|
||||
react-use-measure@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/react-use-measure/-/react-use-measure-2.1.1.tgz#5824537f4ee01c9469c45d5f7a8446177c6cc4ba"
|
||||
integrity sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==
|
||||
dependencies:
|
||||
debounce "^1.2.1"
|
||||
|
||||
react-zoom-pan-pinch@^3.4.4:
|
||||
version "3.4.4"
|
||||
resolved "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.4.4.tgz"
|
||||
@@ -1948,6 +2262,11 @@ regenerator-runtime@^0.14.0:
|
||||
resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz"
|
||||
integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
|
||||
|
||||
require-from-string@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
|
||||
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
|
||||
|
||||
resolve-from@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
|
||||
@@ -2006,6 +2325,13 @@ run-parallel@^1.1.9:
|
||||
dependencies:
|
||||
queue-microtask "^1.2.2"
|
||||
|
||||
scheduler@^0.21.0:
|
||||
version "0.21.0"
|
||||
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820"
|
||||
integrity sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==
|
||||
dependencies:
|
||||
loose-envify "^1.1.0"
|
||||
|
||||
scheduler@^0.23.0:
|
||||
version "0.23.0"
|
||||
resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz"
|
||||
@@ -2052,6 +2378,18 @@ source-map-js@^1.2.0:
|
||||
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz"
|
||||
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
|
||||
|
||||
stats-gl@^2.0.0:
|
||||
version "2.2.8"
|
||||
resolved "https://registry.yarnpkg.com/stats-gl/-/stats-gl-2.2.8.tgz#72566abc8e4a66e91c26b7d9abf659d032379d68"
|
||||
integrity sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==
|
||||
dependencies:
|
||||
"@types/three" "^0.163.0"
|
||||
|
||||
stats.js@^0.17.0:
|
||||
version "0.17.0"
|
||||
resolved "https://registry.yarnpkg.com/stats.js/-/stats.js-0.17.0.tgz#b1c3dc46d94498b578b7fd3985b81ace7131cc7d"
|
||||
integrity sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==
|
||||
|
||||
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0:
|
||||
name string-width-cjs
|
||||
version "4.2.3"
|
||||
@@ -2122,6 +2460,11 @@ supports-preserve-symlinks-flag@^1.0.0:
|
||||
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
|
||||
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
||||
|
||||
suspend-react@^0.1.3:
|
||||
version "0.1.3"
|
||||
resolved "https://registry.yarnpkg.com/suspend-react/-/suspend-react-0.1.3.tgz#a52f49d21cfae9a2fb70bd0c68413d3f9d90768e"
|
||||
integrity sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==
|
||||
|
||||
tailwindcss@^3.4.3:
|
||||
version "3.4.3"
|
||||
resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz"
|
||||
@@ -2169,6 +2512,28 @@ thenify-all@^1.0.0:
|
||||
dependencies:
|
||||
any-promise "^1.0.0"
|
||||
|
||||
three-mesh-bvh@^0.7.0:
|
||||
version "0.7.4"
|
||||
resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.7.4.tgz#a5c799856a3f26f73537a73b6ec632c30f712ba8"
|
||||
integrity sha512-flxe0A4uflTPR6elgq/Y8VrLoljDNS899i422SxQcU3EtMj6o8z4kZRyqZqGWzR0qMf1InTZzY1/0xZl/rnvVw==
|
||||
|
||||
three-stdlib@^2.29.9:
|
||||
version "2.30.0"
|
||||
resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.30.0.tgz#c6133f5e16ba2ab702d8dc05203ed9aa89595c9f"
|
||||
integrity sha512-ALL7rn57jq/MovDRk5hGjeWCvOeZlZhFCWIdpbBAQNudCO3nMwxEba5ZulsMgiI1ymQMzUzTMcxhLTCVlUaKDw==
|
||||
dependencies:
|
||||
"@types/draco3d" "^1.4.0"
|
||||
"@types/offscreencanvas" "^2019.6.4"
|
||||
"@types/webxr" "^0.5.2"
|
||||
draco3d "^1.4.1"
|
||||
fflate "^0.6.9"
|
||||
potpack "^1.0.1"
|
||||
|
||||
three@^0.164.1:
|
||||
version "0.164.1"
|
||||
resolved "https://registry.yarnpkg.com/three/-/three-0.164.1.tgz#b742f76bd8dfd3736ba0d86a12dfddb73c5cdcc0"
|
||||
integrity sha512-iC/hUBbl1vzFny7f5GtqzVXYjMJKaTPxiCxXfrvVdBi1Sf+jhd1CAkitiFwC7mIBFCo3MrDLJG97yisoaWig0w==
|
||||
|
||||
to-fast-properties@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
|
||||
@@ -2181,6 +2546,26 @@ to-regex-range@^5.0.1:
|
||||
dependencies:
|
||||
is-number "^7.0.0"
|
||||
|
||||
troika-three-text@^0.49.0:
|
||||
version "0.49.1"
|
||||
resolved "https://registry.yarnpkg.com/troika-three-text/-/troika-three-text-0.49.1.tgz#1aaa75337e507ea4120103fb69a5e4687fff97dd"
|
||||
integrity sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==
|
||||
dependencies:
|
||||
bidi-js "^1.0.2"
|
||||
troika-three-utils "^0.49.0"
|
||||
troika-worker-utils "^0.49.0"
|
||||
webgl-sdf-generator "1.1.1"
|
||||
|
||||
troika-three-utils@^0.49.0:
|
||||
version "0.49.0"
|
||||
resolved "https://registry.yarnpkg.com/troika-three-utils/-/troika-three-utils-0.49.0.tgz#3fbdbf8783740ce3c1f7acac642e7e957ea4f090"
|
||||
integrity sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==
|
||||
|
||||
troika-worker-utils@^0.49.0:
|
||||
version "0.49.0"
|
||||
resolved "https://registry.yarnpkg.com/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz#e5e200a09d2e0e4eb9fe818a83effa912e2ec4b4"
|
||||
integrity sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==
|
||||
|
||||
ts-api-utils@^1.3.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz"
|
||||
@@ -2191,6 +2576,13 @@ ts-interface-checker@^0.1.9:
|
||||
resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz"
|
||||
integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
|
||||
|
||||
tunnel-rat@^0.1.2:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/tunnel-rat/-/tunnel-rat-0.1.2.tgz#1717efbc474ea2d8aa05a91622457a6e201c0aeb"
|
||||
integrity sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==
|
||||
dependencies:
|
||||
zustand "^4.3.2"
|
||||
|
||||
type-check@^0.4.0, type-check@~0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
|
||||
@@ -2238,6 +2630,16 @@ util-deprecate@^1.0.2:
|
||||
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
|
||||
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
|
||||
|
||||
utility-types@^3.10.0:
|
||||
version "3.11.0"
|
||||
resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c"
|
||||
integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==
|
||||
|
||||
uuid@^9.0.1:
|
||||
version "9.0.1"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30"
|
||||
integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==
|
||||
|
||||
vite@^5.2.0:
|
||||
version "5.2.8"
|
||||
resolved "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz"
|
||||
@@ -2249,6 +2651,16 @@ vite@^5.2.0:
|
||||
optionalDependencies:
|
||||
fsevents "~2.3.3"
|
||||
|
||||
webgl-constants@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/webgl-constants/-/webgl-constants-1.1.1.tgz#f9633ee87fea56647a60b9ce735cbdfb891c6855"
|
||||
integrity sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==
|
||||
|
||||
webgl-sdf-generator@1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz#3e1b422b3d87cd3cc77f2602c9db63bc0f6accbd"
|
||||
integrity sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==
|
||||
|
||||
which@^2.0.1:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
|
||||
@@ -2299,7 +2711,12 @@ yocto-queue@^0.1.0:
|
||||
resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
|
||||
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
|
||||
|
||||
zustand@^4.5.2:
|
||||
zustand@^3.7.1:
|
||||
version "3.7.2"
|
||||
resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.7.2.tgz#7b44c4f4a5bfd7a8296a3957b13e1c346f42514d"
|
||||
integrity sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==
|
||||
|
||||
zustand@^4.3.2, zustand@^4.5.2:
|
||||
version "4.5.2"
|
||||
resolved "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz"
|
||||
integrity sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==
|
||||
|
||||