From d0b2a73185379d77664c4ec6a32f6dd1dd24b20e Mon Sep 17 00:00:00 2001 From: Bart Zalewski Date: Thu, 29 Feb 2024 00:26:24 +0100 Subject: [PATCH] feat: replace JSX with TSX for type safety --- .devcontainer/devcontainer.json | 50 +- README.md | 3 +- index.html | 4 +- package-lock.json | 1998 +++++++++-------- package.json | 29 +- .../models/{Mariokart.jsx => Mariokart.tsx} | 22 +- public/models/mariokarttest.tsx | 30 +- src/{App.jsx => App.tsx} | 75 +- src/HUD.jsx | 144 -- src/HUD.tsx | 147 ++ src/Landing.jsx | 128 -- src/Landing.tsx | 152 ++ src/assets/react.svg | 1 - .../{Experience.jsx => Experience.tsx} | 111 +- src/components/{Ground.jsx => Ground.tsx} | 0 ...oinParticle.jsx => CircleCoinParticle.tsx} | 0 .../Particles/coins/CoinParticles.jsx | 15 - .../Particles/coins/CoinParticles.tsx | 30 + ...rCoinParticle.jsx => StarCoinParticle.tsx} | 0 ...rticlesLeft.jsx => DriftParticlesLeft.tsx} | 0 ...iclesRight.jsx => DriftParticlesRight.tsx} | 0 .../drifts/{Particles1.jsx => Particles1.tsx} | 0 .../Particles/drifts/Particles2.jsx | 54 - .../Particles/drifts/Particles2.tsx | 63 + .../drifts/{Particles3.jsx => Particles3.tsx} | 0 .../Particles/drifts/Particles4.jsx | 55 - .../Particles/drifts/Particles4.tsx | 65 + .../{PointParticle.jsx => PointParticle.tsx} | 0 .../{FlameParticle.jsx => FlameParticle.tsx} | 0 ...{FlameParticles.jsx => FlameParticles.tsx} | 0 .../hits/{HitParticle.jsx => HitParticle.tsx} | 0 ...{HitParticleTwo.jsx => HitParticleTwo.tsx} | 0 .../{HitParticles.jsx => HitParticles.tsx} | 0 ...temParticle.jsx => CircleItemParticle.tsx} | 0 .../{ItemParticles.jsx => ItemParticles.tsx} | 0 ...leParticle.jsx => SmallCircleParticle.tsx} | 0 ...rItemParticle.jsx => StarItemParticle.tsx} | 0 .../{SmokeParticle.jsx => SmokeParticle.tsx} | 0 ...{SmokeParticles.jsx => SmokeParticles.tsx} | 0 ...yerController.jsx => PlayerController.tsx} | 0 ...amepad.jsx => PlayerControllerGamepad.tsx} | 0 ...board.jsx => PlayerControllerKeyboard.tsx} | 0 ...lerTouch.jsx => PlayerControllerTouch.tsx} | 0 .../{PlayerDummies.jsx => PlayerDummies.tsx} | 0 .../{FakeFlame.jsx => FakeFlame.tsx} | 10 +- ...eGlowMaterial.jsx => FakeGlowMaterial.tsx} | 0 src/components/{Skid.jsx => Skid.tsx} | 0 .../{Mario_kart.jsx => Mario_kart.tsx} | 38 +- ...io_kart.jsx => Banana_peel_mario_kart.tsx} | 0 ...ario_shell_red.jsx => Mario_shell_red.tsx} | 0 .../models/misc/{Gift.jsx => Gift.tsx} | 0 ...t_item_box.jsx => Mario_kart_item_box.tsx} | 0 ...ros_coin.jsx => Super_mario_bros_coin.tsx} | 0 .../tracks/{Paris-bis.jsx => Paris-bis.tsx} | 0 ...promenade.jsx => Tour_paris_promenade.tsx} | 0 src/components/store.jsx | 169 -- src/components/store.tsx | 253 +++ src/components/useCurvedPath.jsx | 26 - src/components/useCurvedPath.tsx | 40 + src/components/useGamepad.jsx | 68 - src/components/useGamepad.tsx | 122 + src/index.css | 225 +- src/{main.jsx => main.tsx} | 11 +- src/react.svg | 1 - tsconfig.json | 21 + tsconfig.node.json | 10 + vite-env.d.ts | 1 + vite.config.js => vite.config.ts | 8 +- 68 files changed, 2344 insertions(+), 1835 deletions(-) rename public/models/{Mariokart.jsx => Mariokart.tsx} (52%) rename src/{App.jsx => App.tsx} (53%) delete mode 100644 src/HUD.jsx create mode 100644 src/HUD.tsx delete mode 100644 src/Landing.jsx create mode 100644 src/Landing.tsx delete mode 100644 src/assets/react.svg rename src/components/{Experience.jsx => Experience.tsx} (65%) rename src/components/{Ground.jsx => Ground.tsx} (100%) rename src/components/Particles/coins/{CircleCoinParticle.jsx => CircleCoinParticle.tsx} (100%) delete mode 100644 src/components/Particles/coins/CoinParticles.jsx create mode 100644 src/components/Particles/coins/CoinParticles.tsx rename src/components/Particles/coins/{StarCoinParticle.jsx => StarCoinParticle.tsx} (100%) rename src/components/Particles/drifts/{DriftParticlesLeft.jsx => DriftParticlesLeft.tsx} (100%) rename src/components/Particles/drifts/{DriftParticlesRight.jsx => DriftParticlesRight.tsx} (100%) rename src/components/Particles/drifts/{Particles1.jsx => Particles1.tsx} (100%) delete mode 100644 src/components/Particles/drifts/Particles2.jsx create mode 100644 src/components/Particles/drifts/Particles2.tsx rename src/components/Particles/drifts/{Particles3.jsx => Particles3.tsx} (100%) delete mode 100644 src/components/Particles/drifts/Particles4.jsx create mode 100644 src/components/Particles/drifts/Particles4.tsx rename src/components/Particles/drifts/{PointParticle.jsx => PointParticle.tsx} (100%) rename src/components/Particles/flames/{FlameParticle.jsx => FlameParticle.tsx} (100%) rename src/components/Particles/flames/{FlameParticles.jsx => FlameParticles.tsx} (100%) rename src/components/Particles/hits/{HitParticle.jsx => HitParticle.tsx} (100%) rename src/components/Particles/hits/{HitParticleTwo.jsx => HitParticleTwo.tsx} (100%) rename src/components/Particles/hits/{HitParticles.jsx => HitParticles.tsx} (100%) rename src/components/Particles/items/{CircleItemParticle.jsx => CircleItemParticle.tsx} (100%) rename src/components/Particles/items/{ItemParticles.jsx => ItemParticles.tsx} (100%) rename src/components/Particles/items/{SmallCircleParticle.jsx => SmallCircleParticle.tsx} (100%) rename src/components/Particles/items/{StarItemParticle.jsx => StarItemParticle.tsx} (100%) rename src/components/Particles/smoke/{SmokeParticle.jsx => SmokeParticle.tsx} (100%) rename src/components/Particles/smoke/{SmokeParticles.jsx => SmokeParticles.tsx} (100%) rename src/components/{PlayerController.jsx => PlayerController.tsx} (100%) rename src/components/{PlayerControllerGamepad.jsx => PlayerControllerGamepad.tsx} (100%) rename src/components/{PlayerControllerKeyboard.jsx => PlayerControllerKeyboard.tsx} (100%) rename src/components/{PlayerControllerTouch.jsx => PlayerControllerTouch.tsx} (100%) rename src/components/{PlayerDummies.jsx => PlayerDummies.tsx} (100%) rename src/components/ShaderMaterials/FakeFlame/{FakeFlame.jsx => FakeFlame.tsx} (95%) rename src/components/ShaderMaterials/FakeGlow/{FakeGlowMaterial.jsx => FakeGlowMaterial.tsx} (100%) rename src/components/{Skid.jsx => Skid.tsx} (100%) rename src/components/models/characters/{Mario_kart.jsx => Mario_kart.tsx} (84%) rename src/components/models/items/{Banana_peel_mario_kart.jsx => Banana_peel_mario_kart.tsx} (100%) rename src/components/models/items/{Mario_shell_red.jsx => Mario_shell_red.tsx} (100%) rename src/components/models/misc/{Gift.jsx => Gift.tsx} (100%) rename src/components/models/misc/{Mario_kart_item_box.jsx => Mario_kart_item_box.tsx} (100%) rename src/components/models/misc/{Super_mario_bros_coin.jsx => Super_mario_bros_coin.tsx} (100%) rename src/components/models/tracks/{Paris-bis.jsx => Paris-bis.tsx} (100%) rename src/components/models/tracks/{Tour_paris_promenade.jsx => Tour_paris_promenade.tsx} (100%) delete mode 100644 src/components/store.jsx create mode 100644 src/components/store.tsx delete mode 100644 src/components/useCurvedPath.jsx create mode 100644 src/components/useCurvedPath.tsx delete mode 100644 src/components/useGamepad.jsx create mode 100644 src/components/useGamepad.tsx rename src/{main.jsx => main.tsx} (53%) delete mode 100644 src/react.svg create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite-env.d.ts rename vite.config.js => vite.config.ts (50%) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 0dd192e..1b995a2 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,27 +1,27 @@ { - "name": "Mario Kart Dev Container", - "image": "mcr.microsoft.com/devcontainers/javascript-node", - "customizations": { - "vscode": { - "extensions": [ - "eamodio.gitlens", - "esbenp.prettier-vscode", - "VisualStudioExptTeam.vscodeintellicode", - "dbaeumer.vscode-eslint", - "dsznajder.es7-react-js-snippets", - "antfu.vite", - "meganrogge.template-string-converter", - "ambar.bundle-size", - "aaron-bond.better-comments" - ] - } - }, - "forwardPorts": [4000], - "portsAttributes": { - "4000": { - "label": "Application", - "onAutoForward": "notify" - } - }, - "postCreateCommand": "npm install" + "name": "Mario Kart Dev Container", + "image": "mcr.microsoft.com/devcontainers/javascript-node", + "customizations": { + "vscode": { + "extensions": [ + "eamodio.gitlens", + "esbenp.prettier-vscode", + "VisualStudioExptTeam.vscodeintellicode", + "dbaeumer.vscode-eslint", + "dsznajder.es7-react-js-snippets", + "antfu.vite", + "meganrogge.template-string-converter", + "ambar.bundle-size", + "aaron-bond.better-comments" + ] + } + }, + "forwardPorts": [4000], + "portsAttributes": { + "4000": { + "label": "Application", + "onAutoForward": "notify" + } + }, + "postCreateCommand": "npm install" } diff --git a/README.md b/README.md index 4db4b3c..bc49f01 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # Mario Kart 3.js - JavaScript/WebGL Mario Kart + [Link](https://mario-kart-3-js.vercel.app/) [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Lunakepio/Mario-Kart-3.js) @@ -53,7 +54,7 @@ Start the dev server - [ ] Add curve/length modifiers to drift particles 3/4 -- [ ] Add Skid marks +- [ ] Add Skid marks - [x] Add smokes diff --git a/index.html b/index.html index 8b95fce..001ccca 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,7 @@ Mario Kart 3.js -
- +
+ diff --git a/package-lock.json b/package-lock.json index 7de5594..fc4cefd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,32 +8,37 @@ "name": "vite-starter", "version": "0.0.0", "dependencies": { - "@react-three/drei": "^9.96.4", - "@react-three/fiber": "^8.15.15", - "@react-three/postprocessing": "^2.15.11", - "@react-three/rapier": "^1.2.1", + "@react-three/drei": "^9.99.4", + "@react-three/fiber": "^8.15.16", + "@react-three/postprocessing": "^2.16.0", + "@react-three/rapier": "^1.3.0", "gsap": "^3.12.5", "leva": "^0.9.35", - "playroomkit": "^0.0.66", + "playroomkit": "^0.0.68", "react": "^18.2.0", "react-dom": "^18.2.0", "react-gamepad": "^1.0.3", "react-joystick-component": "^6.2.1", - "three": "^0.160.1", - "three-mesh-bvh": "^0.7.0", - "zustand": "^4.5.0" + "three": "^0.161.0", + "three-mesh-bvh": "^0.7.3", + "vite-tsconfig-paths": "^4.3.1", + "zustand": "^4.5.1" }, "devDependencies": { - "@types/react": "^18.0.28", - "@types/react-dom": "^18.0.11", - "@vitejs/plugin-react-swc": "^3.0.0", - "vite": "^4.2.0" + "@types/react": "^18.2.60", + "@types/react-dom": "^18.2.19", + "@types/three": "^0.161.2", + "@typescript-eslint/eslint-plugin": "^7.1.0", + "@typescript-eslint/parser": "^7.1.0", + "@vitejs/plugin-react-swc": "^3.6.0", + "typescript": "^5.3.3", + "vite": "^5.1.4" } }, "node_modules/@babel/runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", - "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -71,14 +76,30 @@ "integrity": "sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==" }, "node_modules/@dimforge/rapier3d-compat": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.11.2.tgz", - "integrity": "sha512-vdWmlkpS3G8nGAzLuK7GYTpNdrkn/0NKCe0l1Jqxc7ZZOB3N0q9uG/Ap9l9bothWuAvxscIt0U97GVLr0lXWLg==" + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", + "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } }, "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", "cpu": [ "arm" ], @@ -92,9 +113,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", "cpu": [ "arm64" ], @@ -108,9 +129,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", "cpu": [ "x64" ], @@ -124,9 +145,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", "cpu": [ "arm64" ], @@ -140,9 +161,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", "cpu": [ "x64" ], @@ -156,9 +177,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", "cpu": [ "arm64" ], @@ -172,9 +193,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", "cpu": [ "x64" ], @@ -188,9 +209,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", "cpu": [ "arm" ], @@ -204,9 +225,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", "cpu": [ "arm64" ], @@ -220,9 +241,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", "cpu": [ "ia32" ], @@ -236,9 +257,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", "cpu": [ "loong64" ], @@ -252,9 +273,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", "cpu": [ "mips64el" ], @@ -268,9 +289,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", "cpu": [ "ppc64" ], @@ -284,9 +305,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", "cpu": [ "riscv64" ], @@ -300,9 +321,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", "cpu": [ "s390x" ], @@ -316,9 +337,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", "cpu": [ "x64" ], @@ -332,9 +353,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", "cpu": [ "x64" ], @@ -348,9 +369,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", "cpu": [ "x64" ], @@ -364,9 +385,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", "cpu": [ "x64" ], @@ -380,9 +401,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", "cpu": [ "arm64" ], @@ -396,9 +417,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", "cpu": [ "ia32" ], @@ -412,9 +433,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "cpu": [ "x64" ], @@ -427,29 +448,53 @@ "node": ">=12" } }, - "node_modules/@floating-ui/core": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz", - "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, "dependencies": { - "@floating-ui/utils": "^0.1.3" + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "dependencies": { + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", - "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", "dependencies": { - "@floating-ui/dom": "^1.5.1" + "@floating-ui/dom": "^1.6.1" }, "peerDependencies": { "react": ">=16.8.0", @@ -457,15 +502,50 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, "node_modules/@mediapipe/tasks-vision": { "version": "0.10.8", "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", "integrity": "sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==" }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@radix-ui/primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", @@ -936,9 +1016,9 @@ "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" }, "node_modules/@react-three/drei": { - "version": "9.96.4", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.96.4.tgz", - "integrity": "sha512-Zmy5felOamD7DkD5EeLfijNkohDxHNtXomGAf3C/0G6ml/ocf1+VrJ6mLDQRE+DhRnF1RDHV+WC6nuvpPPkx1w==", + "version": "9.99.4", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.99.4.tgz", + "integrity": "sha512-Dig6SmsOIF1LiGAatU0WjFAgNqCixfHhO6BGlvb16E0vVi+t3S5WJbyEQO6msRgYu7pGQLCy9m0iBcfLUz8vkw==", "dependencies": { "@babel/runtime": "^7.11.2", "@mediapipe/tasks-vision": "0.10.8", @@ -951,13 +1031,12 @@ "maath": "^0.10.7", "meshline": "^3.1.6", "react-composer": "^5.0.3", - "react-merge-refs": "^1.1.0", "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.4", - "troika-three-text": "^0.47.2", + "troika-three-text": "^0.49.0", "tunnel-rat": "^0.1.2", "utility-types": "^3.10.0", "uuid": "^9.0.1", @@ -992,9 +1071,9 @@ } }, "node_modules/@react-three/fiber": { - "version": "8.15.15", - "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.15.15.tgz", - "integrity": "sha512-Z5POnzgpYxrgnYuiCv+8t7lpynEcGcn0/323kV1NtE7Cwq16aMqEuC6nF2Y/tK+crJpKNEqsRtvng/eJy0xxOA==", + "version": "8.15.16", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.15.16.tgz", + "integrity": "sha512-4f47K9e2mP8W/guNtu3e2J/Nt6GwKTsX/YP2dktPZRcpHYEsqfXCO8kSfvVMb+lQ8wR0HoFzggqdnGuhZaui0g==", "dependencies": { "@babel/runtime": "^7.17.8", "@types/react-reconciler": "^0.26.7", @@ -1039,14 +1118,6 @@ } } }, - "node_modules/@react-three/fiber/node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/@react-three/fiber/node_modules/zustand": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", @@ -1064,9 +1135,9 @@ } }, "node_modules/@react-three/postprocessing": { - "version": "2.15.11", - "resolved": "https://registry.npmjs.org/@react-three/postprocessing/-/postprocessing-2.15.11.tgz", - "integrity": "sha512-XQJxhk/hsbzUCLagd8V4pg28iy+UMkYeFFL7BOdlSM1TgAorNzMim+Wu5zI6fbAaGMpmwk7PCbOZN5YPgD0BRQ==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@react-three/postprocessing/-/postprocessing-2.16.0.tgz", + "integrity": "sha512-Cc+VIOxD2jVEgXrc66W6yQaAxTMg02ef2N1B5ldyLtTt22n75JxolYTullQqY4zTsyLEmORvaO85SRlZwg6Avw==", "dependencies": { "buffer": "^6.0.3", "maath": "^0.6.0", @@ -1090,11 +1161,11 @@ } }, "node_modules/@react-three/rapier": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@react-three/rapier/-/rapier-1.2.1.tgz", - "integrity": "sha512-h22uqwvMBVVmwfe37fs0tF3u+gNDJv/LzS4lRYnZ4IaHZPlprAjvccef6R7pFlW2EU/o26HhzTMoE5/Btkdcew==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@react-three/rapier/-/rapier-1.3.0.tgz", + "integrity": "sha512-nQor1pbGFu1mp585bGR719yAEnEYeu2LvsxP4RaWXP7XHBqv2p0l9/ttDQBZzivqRT142icut2tdo6vgtW+XyA==", "dependencies": { - "@dimforge/rapier3d-compat": "0.11.2", + "@dimforge/rapier3d-compat": "0.12.0", "three-stdlib": "2.23.9", "use-asset": "1.0.4" }, @@ -1125,6 +1196,175 @@ "three": ">=0.128.0" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@stitches/react": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@stitches/react/-/react-1.2.8.tgz", @@ -1134,13 +1374,13 @@ } }, "node_modules/@swc/core": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.102.tgz", - "integrity": "sha512-OAjNLY/f6QWKSDzaM3bk31A+OYHu6cPa9P/rFIx8X5d24tHXUpRiiq6/PYI6SQRjUPlB72GjsjoEU8F+ALadHg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.2.tgz", + "integrity": "sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg==", "dev": true, "hasInstallScript": true, "dependencies": { - "@swc/counter": "^0.1.1", + "@swc/counter": "^0.1.2", "@swc/types": "^0.1.5" }, "engines": { @@ -1151,16 +1391,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.102", - "@swc/core-darwin-x64": "1.3.102", - "@swc/core-linux-arm-gnueabihf": "1.3.102", - "@swc/core-linux-arm64-gnu": "1.3.102", - "@swc/core-linux-arm64-musl": "1.3.102", - "@swc/core-linux-x64-gnu": "1.3.102", - "@swc/core-linux-x64-musl": "1.3.102", - "@swc/core-win32-arm64-msvc": "1.3.102", - "@swc/core-win32-ia32-msvc": "1.3.102", - "@swc/core-win32-x64-msvc": "1.3.102" + "@swc/core-darwin-arm64": "1.4.2", + "@swc/core-darwin-x64": "1.4.2", + "@swc/core-linux-arm-gnueabihf": "1.4.2", + "@swc/core-linux-arm64-gnu": "1.4.2", + "@swc/core-linux-arm64-musl": "1.4.2", + "@swc/core-linux-x64-gnu": "1.4.2", + "@swc/core-linux-x64-musl": "1.4.2", + "@swc/core-win32-arm64-msvc": "1.4.2", + "@swc/core-win32-ia32-msvc": "1.4.2", + "@swc/core-win32-x64-msvc": "1.4.2" }, "peerDependencies": { "@swc/helpers": "^0.5.0" @@ -1172,9 +1412,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.102.tgz", - "integrity": "sha512-CJDxA5Wd2cUMULj3bjx4GEoiYyyiyL8oIOu4Nhrs9X+tlg8DnkCm4nI57RJGP8Mf6BaXPIJkHX8yjcefK2RlDA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.2.tgz", + "integrity": "sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw==", "cpu": [ "arm64" ], @@ -1188,9 +1428,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.102.tgz", - "integrity": "sha512-X5akDkHwk6oAer49oER0qZMjNMkLH3IOZaV1m98uXIasAGyjo5WH1MKPeMLY1sY6V6TrufzwiSwD4ds571ytcg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.2.tgz", + "integrity": "sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ==", "cpu": [ "x64" ], @@ -1204,9 +1444,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.102.tgz", - "integrity": "sha512-kJH3XtZP9YQdjq/wYVBeFuiVQl4HaC4WwRrIxAHwe2OyvrwUI43dpW3LpxSggBnxXcVCXYWf36sTnv8S75o2Gw==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.2.tgz", + "integrity": "sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ==", "cpu": [ "arm" ], @@ -1220,9 +1460,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.102.tgz", - "integrity": "sha512-flQP2WDyCgO24WmKA1wjjTx+xfCmavUete2Kp6yrM+631IHLGnr17eu7rYJ/d4EnDBId/ytMyrnWbTVkaVrpbQ==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.2.tgz", + "integrity": "sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA==", "cpu": [ "arm64" ], @@ -1236,9 +1476,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.102.tgz", - "integrity": "sha512-bQEQSnC44DyoIGLw1+fNXKVGoCHi7eJOHr8BdH0y1ooy9ArskMjwobBFae3GX4T1AfnrTaejyr0FvLYIb0Zkog==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.2.tgz", + "integrity": "sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw==", "cpu": [ "arm64" ], @@ -1252,9 +1492,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.102.tgz", - "integrity": "sha512-dFvnhpI478svQSxqISMt00MKTDS0e4YtIr+ioZDG/uJ/q+RpcNy3QI2KMm05Fsc8Y0d4krVtvCKWgfUMsJZXAg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.2.tgz", + "integrity": "sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg==", "cpu": [ "x64" ], @@ -1268,9 +1508,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.102.tgz", - "integrity": "sha512-+a0M3CvjeIRNA/jTCzWEDh2V+mhKGvLreHOL7J97oULZy5yg4gf7h8lQX9J8t9QLbf6fsk+0F8bVH1Ie/PbXjA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.2.tgz", + "integrity": "sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ==", "cpu": [ "x64" ], @@ -1284,9 +1524,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.102.tgz", - "integrity": "sha512-w76JWLjkZNOfkB25nqdWUNCbt0zJ41CnWrJPZ+LxEai3zAnb2YtgB/cCIrwxDebRuMgE9EJXRj7gDDaTEAMOOQ==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.2.tgz", + "integrity": "sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ==", "cpu": [ "arm64" ], @@ -1300,9 +1540,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.102.tgz", - "integrity": "sha512-vlDb09HiGqKwz+2cxDS9T5/461ipUQBplvuhW+cCbzzGuPq8lll2xeyZU0N1E4Sz3MVdSPx1tJREuRvlQjrwNg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.2.tgz", + "integrity": "sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA==", "cpu": [ "ia32" ], @@ -1316,9 +1556,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.102.tgz", - "integrity": "sha512-E/jfSD7sShllxBwwgDPeXp1UxvIqehj/ShSUqq1pjR/IDRXngcRSXKJK92mJkNFY7suH6BcCWwzrxZgkO7sWmw==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.2.tgz", + "integrity": "sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw==", "cpu": [ "x64" ], @@ -1332,9 +1572,9 @@ } }, "node_modules/@swc/counter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", - "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", "dev": true }, "node_modules/@swc/types": { @@ -1348,6 +1588,18 @@ "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.9.tgz", "integrity": "sha512-4MMUjMQb4yA5fJ4osXx+QxGHt0/ZSy4spT6jL1HM7Tn8OJEC35siqdnpOo+HxPhYjqEFumKfGVF9hJfdyKBIBA==" }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, "node_modules/@types/offscreencanvas": { "version": "2019.7.3", "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", @@ -1359,9 +1611,9 @@ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { - "version": "18.2.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.46.tgz", - "integrity": "sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==", + "version": "18.2.60", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.60.tgz", + "integrity": "sha512-dfiPj9+k20jJrLGOu9Nf6eqxm2EyJRrq2NvwOFsfbb7sFExZ9WELPs67UImHj3Ayxg8ruTtKtNnbjaF8olPq0A==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -1369,10 +1621,10 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.18", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", - "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", - "devOptional": true, + "version": "18.2.19", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", + "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", + "dev": true, "dependencies": { "@types/react": "*" } @@ -1390,17 +1642,23 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, "node_modules/@types/stats.js": { "version": "0.17.3", "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==", - "peer": true + "dev": true }, "node_modules/@types/three": { "version": "0.161.2", "resolved": "https://registry.npmjs.org/@types/three/-/three-0.161.2.tgz", "integrity": "sha512-DazpZ+cIfBzbW/p0zm6G8CS03HBMd748A3R1ZOXHpqaXZLv2I5zNgQUrRG//UfJ6zYFp2cUoCQaOLaz8ubH07w==", - "peer": true, + "dev": true, "dependencies": { "@types/stats.js": "*", "@types/webxr": "*", @@ -1409,9 +1667,199 @@ } }, "node_modules/@types/webxr": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.10.tgz", - "integrity": "sha512-n3u5sqXQJhf1CS68mw3Wf16FQ4cRPNBBwdYLFzq3UddiADOim1Pn3Y6PBdDilz1vOJF3ybLxJ8ZEDlLIzrOQZg==" + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.14.tgz", + "integrity": "sha512-UEMMm/Xn3DtEa+gpzUrOcDj+SJS1tk5YodjwOxcqStNhCfPcwgyC5Srg2ToVKyg2Fhq16Ffpb0UWUQHqoT9AMA==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz", + "integrity": "sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/type-utils": "7.1.0", + "@typescript-eslint/utils": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz", + "integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz", + "integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz", + "integrity": "sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/utils": "7.1.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz", + "integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz", + "integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz", + "integrity": "sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz", + "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.1.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, "node_modules/@use-gesture/core": { "version": "10.3.0", @@ -1430,34 +1878,26 @@ } }, "node_modules/@vitejs/plugin-react-swc": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.5.0.tgz", - "integrity": "sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz", + "integrity": "sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==", "dev": true, "dependencies": { - "@swc/core": "^1.3.96" + "@swc/core": "^1.3.107" }, "peerDependencies": { "vite": "^4 || ^5" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -1474,6 +1914,12 @@ "node": ">=4" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1501,27 +1947,25 @@ "require-from-string": "^2.0.2" } }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=8" } }, "node_modules/buffer": { @@ -1547,31 +1991,10 @@ "ieee754": "^1.2.1" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/camera-controls": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.7.3.tgz", - "integrity": "sha512-L4mxjBd3u8qiOLozdWrH2P8ZybSsDXBF7iyNyqNEFJhPUkovmuARWR8JTc1B/qlclOIg6FvZZA/0uAZMMim0mw==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.8.3.tgz", + "integrity": "sha512-zFjqUR6onLkG+z1A6vAWfzovxZxWVSvp6e5t3lfZgfgPZtX3n74aykNAUaoRbq8Y3tOxadHkDjbfGDOP9hFf2w==", "peerDependencies": { "three": ">=0.126.1" } @@ -1594,50 +2017,6 @@ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -1679,32 +2058,19 @@ "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">= 0.4" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/dequal": { @@ -1715,45 +2081,35 @@ "node": ">=6" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/detect-gpu": { - "version": "5.0.37", - "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.37.tgz", - "integrity": "sha512-EraWs84faI4iskB4qvE39bevMIazEvd1RpoyGLOBesRLbiz6eMeJqqRPHjEFClfRByYZzi9IzU35rBXIO76oDw==", + "version": "5.0.38", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.38.tgz", + "integrity": "sha512-36QeGHSXYcJ/RfrnPEScR8GDprbXFG4ZhXsfVNVHztZr38+fRxgHnJl3CjYXXjbeRUhu3ZZBJh6Lg0A9v0Qd8A==", "dependencies": { "webgl-constants": "^1.1.1" } }, - "node_modules/draco3d": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.6.tgz", - "integrity": "sha512-+3NaRjWktb5r61ZFoDejlykPEFKT5N/LkbXsaddlw6xNSXBanUYpFc2AXXpbJDilPHazcSreU/DpQIaxfX0NfQ==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" + }, "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", "dev": true, "hasInstallScript": true, "bin": { @@ -1763,82 +2119,41 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">= 0.10.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/extend-shallow": { @@ -1865,6 +2180,31 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fflate": { "version": "0.6.10", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", @@ -1881,21 +2221,16 @@ "node": ">= 10" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, "node_modules/for-in": { @@ -1906,22 +2241,6 @@ "node": ">=0.10.0" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1936,28 +2255,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -1966,97 +2263,59 @@ "node": ">=0.10.0" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + }, "node_modules/glsl-noise": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/gsap": { "version": "3.12.5", "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.12.5.tgz", "integrity": "sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==" }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -2076,17 +2335,13 @@ } ] }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, "engines": { - "node": ">= 0.10" + "node": ">= 4" } }, "node_modules/is-extendable": { @@ -2100,6 +2355,36 @@ "node": ">=0.10.0" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2207,6 +2492,18 @@ "loose-envify": "cli.js" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/maath": { "version": "0.10.7", "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.7.tgz", @@ -2216,19 +2513,6 @@ "three": ">=0.144.0" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, "node_modules/merge-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/merge-value/-/merge-value-1.0.0.tgz", @@ -2243,10 +2527,19 @@ "node": ">=0.10.0" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/meshline": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.1.7.tgz", - "integrity": "sha512-uf9fPI9wy0Ie0kZjvKuIkf2n7gi3ih0wdTeb/kmSvmzpPyEL5d9lFohg9+JV9VC4sQUBOZDgxu6fnjn57goSHg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.2.0.tgz", + "integrity": "sha512-ZaJkC967GTuef7UBdO0rGPX544oIWaNo7tYedVHSoR2lje6RR16fX8IsgMxgxoYYERtjqsRWIYBSPBxG4QR84Q==", "peerDependencies": { "three": ">=0.137" } @@ -2255,44 +2548,34 @@ "version": "0.18.1", "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", - "peer": true + "dev": true }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, "dependencies": { - "mime-db": "1.52.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">= 0.6" + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mixin-deep": { @@ -2313,18 +2596,14 @@ "integrity": "sha512-Qi0VCU46t2IwfGv5KF0+D/t9cizcDug7qnNoy9Ggk7aucp0tssV8IwTMkBlDbm+VqAf3cdQHTCARKSsuS2MYFg==" }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/n8ao": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/n8ao/-/n8ao-1.7.3.tgz", - "integrity": "sha512-4eq0ZW+hKCDaCmkXIl7qqui7L2YSQyINvXeqqnXYXrXQ56Zbc59FADhwj59q+4zyG93ccGrmIq97x3WmQ8GBbA==", - "dependencies": { - "cors": "^2.8.5", - "express": "^4.18.2" - }, + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/n8ao/-/n8ao-1.8.1.tgz", + "integrity": "sha512-biKUW09KnflZpeWmbCy1gjuiyZsbeG6y+EsqV+1IDqQ1KqEydXc6nUUseZp9ZRbjvEOPnsvsjaTce8Pta0803A==", "peerDependencies": { "postprocessing": ">=6.30.0", "three": ">=0.137" @@ -2348,13 +2627,11 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "node_modules/object-assign": { "version": "4.1.1", @@ -2364,25 +2641,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/opentype.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/opentype.js/-/opentype.js-1.3.4.tgz", @@ -2398,14 +2656,6 @@ "node": ">= 8.0.0" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2414,10 +2664,14 @@ "node": ">=8" } }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/picocolors": { "version": "1.0.0", @@ -2425,19 +2679,31 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/playroomkit": { - "version": "0.0.66", - "resolved": "https://registry.npmjs.org/playroomkit/-/playroomkit-0.0.66.tgz", - "integrity": "sha512-lBYSLR/0AebQhWteMgkXiMXyMPxMqGz2uptA3QrBig4NCn5r3ViIXWIFmsdbLSG9spKrFPVTaYRClUq3fSCxDw==", + "version": "0.0.68", + "resolved": "https://registry.npmjs.org/playroomkit/-/playroomkit-0.0.68.tgz", + "integrity": "sha512-n5KP701pmAlnpLVWmxEOSkEFWWoYYgPwd2L1Ti1UYQbi6h9mM39RLdZ+QbTHEYxjq7/dK/BcmkUs70DzpOgnQQ==", "peerDependencies": { "react": ">=17.0.2 <= 18", "react-dom": ">=17.0.2 <= 18" } }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "funding": [ { @@ -2463,14 +2729,14 @@ } }, "node_modules/postprocessing": { - "version": "6.34.1", - "resolved": "https://registry.npmjs.org/postprocessing/-/postprocessing-6.34.1.tgz", - "integrity": "sha512-xae6A2XNs61V3ohGHR+i9sQDvB4dWaoG/AICw0hg8sOYQWAYDlf+esWMRmO4hixMaYo3AJBJ9WAA7JF7OiGakw==", + "version": "6.34.3", + "resolved": "https://registry.npmjs.org/postprocessing/-/postprocessing-6.34.3.tgz", + "integrity": "sha512-AjsxAGWeHMKlCTuWLeahNnPyFwR0c/pEmveq5mBz767lFBc1+HHYzk0aRGBCE9PZIjiA27oRL7lATd+fVOscRA==", "engines": { "node": ">= 0.13.2" }, "peerDependencies": { - "three": ">= 0.138.0 < 0.161.0" + "three": ">= 0.138.0 < 0.162.0" } }, "node_modules/potpack": { @@ -2488,53 +2754,25 @@ "react-is": "^16.13.1" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/react": { "version": "18.2.0", @@ -2579,6 +2817,14 @@ "react": "^18.2.0" } }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/react-dropzone": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.1.0.tgz", @@ -2617,15 +2863,6 @@ "react-dom": ">=17.0.2" } }, - "node_modules/react-merge-refs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-1.1.0.tgz", - "integrity": "sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, "node_modules/react-reconciler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", @@ -2641,14 +2878,6 @@ "react": "^18.0.0" } }, - "node_modules/react-reconciler/node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/react-use-measure": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", @@ -2679,26 +2908,53 @@ "node": ">=0.10.0" } }, - "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", "fsevents": "~2.3.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -2712,75 +2968,32 @@ "type": "consulting", "url": "https://feross.org/support" } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", "dependencies": { "loose-envify": "^1.1.0" } }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "node": ">=10" } }, "node_modules/set-value": { @@ -2805,11 +3018,6 @@ "node": ">=0.10.0" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2829,17 +3037,13 @@ "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/source-map-js": { @@ -2884,14 +3088,6 @@ "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/string.prototype.codepointat": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", @@ -2906,14 +3102,14 @@ } }, "node_modules/three": { - "version": "0.160.1", - "resolved": "https://registry.npmjs.org/three/-/three-0.160.1.tgz", - "integrity": "sha512-Bgl2wPJypDOZ1stAxwfWAcJ0WQf7QzlptsxkjYiURPz+n5k4RBDLsq+6f9Y75TYxn6aHLcWz+JNmwTOXWrQTBQ==" + "version": "0.161.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.161.0.tgz", + "integrity": "sha512-LC28VFtjbOyEu5b93K0bNRLw1rQlMJ85lilKsYj6dgTu+7i17W+JCCEbvrpmNHF1F3NAUqDSWq50UD7w9H2xQw==" }, "node_modules/three-mesh-bvh": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.0.tgz", - "integrity": "sha512-Hj0Z1Rp02yy5H+/xtMBu/dYAeRsSONaBaVLZoST9sMpZxycHypRiUeMHucPOLWFHnpc5hwelOnONcLpkfhDg0Q==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.3.tgz", + "integrity": "sha512-3W6KjzmupjfE89GuHPT31kxKWZ4YGZPEZJNysJpiOZfQRsBQQgmK7v/VJPpjG6syhAvTnY+5Fr77EvIkTLpGSw==", "peerDependencies": { "three": ">= 0.151.0" } @@ -2939,22 +3135,26 @@ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, "engines": { - "node": ">=0.6" + "node": ">=8.0" } }, "node_modules/troika-three-text": { - "version": "0.47.2", - "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.47.2.tgz", - "integrity": "sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng==", + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.0.tgz", + "integrity": "sha512-sn9BNC6eIX8OO3iAkPwjecJ7Pn21Ve8P1UNFMNeQzXx759rrqS4i4pSZs7FLMYdWyCKVXBFGimBySFwRKLjq/Q==", "dependencies": { "bidi-js": "^1.0.2", - "troika-three-utils": "^0.47.2", - "troika-worker-utils": "^0.47.2", + "troika-three-utils": "^0.49.0", + "troika-worker-utils": "^0.49.0", "webgl-sdf-generator": "1.1.1" }, "peerDependencies": { @@ -2962,17 +3162,48 @@ } }, "node_modules/troika-three-utils": { - "version": "0.47.2", - "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.47.2.tgz", - "integrity": "sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg==", + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.49.0.tgz", + "integrity": "sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==", "peerDependencies": { "three": ">=0.125.0" } }, "node_modules/troika-worker-utils": { - "version": "0.47.2", - "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.47.2.tgz", - "integrity": "sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA==" + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz", + "integrity": "sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==" + }, + "node_modules/ts-api-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfck": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.2.tgz", + "integrity": "sha512-6lWtFjwuhS3XI4HsX4Zg0izOI3FU/AI9EGVlPEUMDIhvLPMD4wkiof0WCoDgW7qY+Dy198g4d9miAqUHWHFH6Q==", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, "node_modules/tslib": { "version": "2.6.2", @@ -2987,24 +3218,17 @@ "zustand": "^4.3.2" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" + "node": ">=14.17" } }, "node_modules/use-asset": { @@ -3034,14 +3258,6 @@ "node": ">= 4" } }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -3059,38 +3275,30 @@ "resolved": "https://registry.npmjs.org/v8n/-/v8n-1.5.1.tgz", "integrity": "sha512-LdabyT4OffkyXFCe9UT+uMkxNBs5rcTVuZClvxQr08D5TUgo1OFKkoT65qYRCsiKBl/usHjpXvP4hHMzzDRj3A==" }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/vite": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz", - "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", + "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", "dev": true, "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", @@ -3122,6 +3330,24 @@ } } }, + "node_modules/vite-tsconfig-paths": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.1.tgz", + "integrity": "sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.1" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, "node_modules/webgl-constants": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", @@ -3146,15 +3372,21 @@ "node": ">= 8" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/zstddec": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.0.2.tgz", "integrity": "sha512-DCo0oxvcvOTGP/f5FA6tz2Z6wF+FIcEApSTu0zV5sQgn9hoT5lZ9YRAKUraxt9oP7l4e8TnNdi8IZTCX6WCkwA==" }, "node_modules/zustand": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.0.tgz", - "integrity": "sha512-zlVFqS5TQ21nwijjhJlx4f9iGrXSL0o/+Dpy4txAP22miJ8Ti6c1Ol1RLNN98BMib83lmDH/2KmLwaNXpjrO1A==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.1.tgz", + "integrity": "sha512-XlauQmH64xXSC1qGYNv00ODaQ3B+tNPoy22jv2diYiP4eoDKr9LA+Bh5Bc3gplTrFdb6JVI+N4kc1DZ/tbtfPg==", "dependencies": { "use-sync-external-store": "1.2.0" }, diff --git a/package.json b/package.json index bae5452..f1178d0 100644 --- a/package.json +++ b/package.json @@ -9,25 +9,30 @@ "preview": "vite preview" }, "dependencies": { - "@react-three/drei": "^9.96.4", - "@react-three/fiber": "^8.15.15", - "@react-three/postprocessing": "^2.15.11", - "@react-three/rapier": "^1.2.1", + "@react-three/drei": "^9.99.4", + "@react-three/fiber": "^8.15.16", + "@react-three/postprocessing": "^2.16.0", + "@react-three/rapier": "^1.3.0", "gsap": "^3.12.5", "leva": "^0.9.35", - "playroomkit": "^0.0.66", + "playroomkit": "^0.0.68", "react": "^18.2.0", "react-dom": "^18.2.0", "react-gamepad": "^1.0.3", "react-joystick-component": "^6.2.1", - "three": "^0.160.1", - "three-mesh-bvh": "^0.7.0", - "zustand": "^4.5.0" + "three": "^0.161.0", + "three-mesh-bvh": "^0.7.3", + "vite-tsconfig-paths": "^4.3.1", + "zustand": "^4.5.1" }, "devDependencies": { - "@types/react": "^18.0.28", - "@types/react-dom": "^18.0.11", - "@vitejs/plugin-react-swc": "^3.0.0", - "vite": "^4.2.0" + "@types/react": "^18.2.60", + "@types/react-dom": "^18.2.19", + "@types/three": "^0.161.2", + "@typescript-eslint/eslint-plugin": "^7.1.0", + "@typescript-eslint/parser": "^7.1.0", + "@vitejs/plugin-react-swc": "^3.6.0", + "typescript": "^5.3.3", + "vite": "^5.1.4" } } diff --git a/public/models/Mariokart.jsx b/public/models/Mariokart.tsx similarity index 52% rename from public/models/Mariokart.jsx rename to public/models/Mariokart.tsx index e565191..fbda44f 100644 --- a/public/models/Mariokart.jsx +++ b/public/models/Mariokart.tsx @@ -11,9 +11,25 @@ export function ario(props) { const { nodes, materials } = useGLTF('/mariokart-transformed.glb') return ( - - - + + + ) } diff --git a/public/models/mariokarttest.tsx b/public/models/mariokarttest.tsx index 54eaeb8..9caac54 100644 --- a/public/models/mariokarttest.tsx +++ b/public/models/mariokarttest.tsx @@ -24,16 +24,36 @@ type GLTFResult = GLTF & { animations: GLTFAction[] } -type ContextType = Record> +type ContextType = Record< + string, + React.ForwardRefExoticComponent +> export function Model(props: JSX.IntrinsicElements['group']) { const { nodes, materials } = useGLTF('/mariokarttest.glb') as GLTFResult return ( - - - - + + + + ) diff --git a/src/App.jsx b/src/App.tsx similarity index 53% rename from src/App.jsx rename to src/App.tsx index 6a7b1a5..a320039 100644 --- a/src/App.jsx +++ b/src/App.tsx @@ -2,11 +2,10 @@ import { Canvas } from '@react-three/fiber' import { Experience } from './components/Experience' import { Suspense, useEffect, useMemo } from 'react' import { Physics } from '@react-three/rapier' -import { Environment, KeyboardControls, Loader, OrbitControls, Preload, Stats } from '@react-three/drei' +import { KeyboardControls, Loader, Preload } from '@react-three/drei' import { insertCoin, onPlayerJoin } from 'playroomkit' -import { useStore } from "./components/store"; -import * as THREE from "three"; -import { ParisBis } from './components/models/tracks/Paris-bis' +import { useStore } from './components/store' +import * as THREE from 'three' export const Controls = { up: 'up', @@ -17,8 +16,9 @@ export const Controls = { shoot: 'shoot', slow: 'slow', reset: 'reset', - escape: 'escape' -} + escape: 'escape', + jump: 'jump', +} as const function App() { const map = useMemo( @@ -31,55 +31,58 @@ function App() { { name: Controls.slow, keys: ['Shift'] }, { name: Controls.shoot, keys: ['KeyE', 'Click'] }, { name: Controls.reset, keys: ['KeyR'] }, - { name: Controls.escape, keys: ['Escape']} + { name: Controls.escape, keys: ['Escape'] }, ], [] ) - const { actions } = useStore(); + const { actions } = useStore() + const start = async () => { - await insertCoin(); + await insertCoin() onPlayerJoin((state) => { - actions.addPlayer(state); + actions.addPlayer(state) - actions.setId(state.id); + actions.setId(state.id) state.onQuit(() => { - actions.removePlayer(state); - - }); - }); + actions.removePlayer(state) + }) + }) } useEffect(() => { - start(); + start() }, []) return ( <> - - { + + { gl.toneMapping = THREE.AgXToneMapping gl.setClearColor(0x000000, 0) - }}> - - - - - - - - - + }} + > + + + + + + + + + ) } diff --git a/src/HUD.jsx b/src/HUD.jsx deleted file mode 100644 index 161085a..0000000 --- a/src/HUD.jsx +++ /dev/null @@ -1,144 +0,0 @@ -import React, { useEffect, useRef, useState } from "react"; -import { useStore } from "./components/store"; -import { Joystick } from "react-joystick-component"; - -export const HUD = () => { - const wheel = useRef(); - const [image, setImage] = useState(""); - const { item, gameStarted, actions, controls } = useStore(); - - useEffect(() => { - const handleMouseMove = (e) => { - if (wheel.current) { - const { clientX, clientY } = e; - const screenWidth = window.innerWidth; - const rotation = ((clientX - screenWidth / 2) / screenWidth) * 180; - - wheel.current.style.left = `${clientX - 100}px`; - wheel.current.style.top = `${clientY - 100}px`; - wheel.current.style.transform = `rotate(${rotation}deg)`; - } - }; - - window.addEventListener("mousemove", handleMouseMove); - - return () => { - window.removeEventListener("mousemove", handleMouseMove); - }; - }, []); - - const handleMove = (e) => { - actions.setJoystickX(e.x); - }; - - const handleStop = () => { - actions.setJoystickX(0); - }; - - useEffect(() => { - switch (item) { - case "banana": - setImage("./images/banana.webp"); - break; - case "mushroom": - setImage("./images/mushroom.png"); - break; - case "shell": - setImage("./images/shell.webp"); - break; - default: - setImage(""); - } - }, [item]); - - return ( -
- {gameStarted && ( - <> -
-
-
-
- {image && item} -
-
-
-
- {controls === "touch" && ( - <> -
- -
-
{ - actions.setDriftButton(true); - }} - onMouseUp={(e) => { - actions.setDriftButton(false); - }} - onTouchStart={(e) => { - e.preventDefault(); - actions.setDriftButton(true); - }} - onTouchEnd={(e) => { - e.preventDefault(); - actions.setDriftButton(false); - }} - > - drift -
-
{ - actions.setItemButton(true); - }} - onMouseUp={(e) => { - actions.setItemButton(false); - }} - onTouchStart={(e) => { - e.preventDefault(); - actions.setItemButton(true); - }} - onTouchEnd={(e) => { - e.preventDefault(); - actions.setItemButton(false); - }} - - > - item -
-
{ - actions.setMenuButton(true); - }} - onMouseUp={(e) => { - actions.setMenuButton(false); - }} - onTouchStart={(e) => { - e.preventDefault(); - actions.setMenuButton(true); - }} - onTouchEnd={(e) => { - e.preventDefault(); - actions.setMenuButton(false); - }} - - > - menu -
- - )} - - )} -
- ); -}; diff --git a/src/HUD.tsx b/src/HUD.tsx new file mode 100644 index 0000000..0dac55b --- /dev/null +++ b/src/HUD.tsx @@ -0,0 +1,147 @@ +import { useEffect, useRef, useState } from 'react' +import { useStore } from './components/store' +import { Joystick } from 'react-joystick-component' +import { IJoystickUpdateEvent } from 'react-joystick-component/build/lib/Joystick' + +export const HUD = () => { + const wheel = useRef() + const [image, setImage] = useState('') + const { item, gameStarted, actions, controls } = useStore() + + useEffect(() => { + const handleMouseMove = (e: MouseEvent) => { + if (wheel.current) { + const { clientX, clientY } = e + const screenWidth = window.innerWidth + const rotation = ((clientX - screenWidth / 2) / screenWidth) * 180 + + if (wheel.current) { + ;(wheel.current as HTMLDivElement).style.left = `${clientX - 100}px` + ;(wheel.current as HTMLDivElement).style.top = `${clientY - 100}px` + ;( + wheel.current as HTMLDivElement + ).style.transform = `rotate(${rotation}deg)` + } + } + } + + window.addEventListener('mousemove', handleMouseMove) + + return () => { + window.removeEventListener('mousemove', handleMouseMove) + } + }, []) + + const handleMove = (e: IJoystickUpdateEvent) => { + actions.setJoystickX(e.x ?? 0) + } + + const handleStop = () => { + actions.setJoystickX(0) + } + + useEffect(() => { + switch (item) { + case 'banana': + setImage('./images/banana.webp') + break + case 'mushroom': + setImage('./images/mushroom.png') + break + case 'shell': + setImage('./images/shell.webp') + break + default: + setImage('') + } + }, [item]) + + return ( +
+ {gameStarted && ( + <> +
+
+
+
+ {image && item} +
+
+
+
+ {controls === 'touch' && ( + <> +
+ +
+
{ + actions.setDriftButton(true) + }} + onMouseUp={() => { + actions.setDriftButton(false) + }} + onTouchStart={(e) => { + e.preventDefault() + actions.setDriftButton(true) + }} + onTouchEnd={(e) => { + e.preventDefault() + actions.setDriftButton(false) + }} + > + drift +
+
{ + actions.setItemButton(true) + }} + onMouseUp={() => { + actions.setItemButton(false) + }} + onTouchStart={(e) => { + e.preventDefault() + actions.setItemButton(true) + }} + onTouchEnd={(e) => { + e.preventDefault() + actions.setItemButton(false) + }} + > + item +
+
{ + actions.setMenuButton(true) + }} + onMouseUp={() => { + actions.setMenuButton(false) + }} + onTouchStart={(e) => { + e.preventDefault() + actions.setMenuButton(true) + }} + onTouchEnd={(e) => { + e.preventDefault() + actions.setMenuButton(false) + }} + > + menu +
+ + )} + + )} +
+ ) +} diff --git a/src/Landing.jsx b/src/Landing.jsx deleted file mode 100644 index e053c36..0000000 --- a/src/Landing.jsx +++ /dev/null @@ -1,128 +0,0 @@ -import React, { useEffect, useRef, useState } from "react"; -import { useStore } from "./components/store"; -import gsap from "gsap"; - -export const Landing = () => { - const { gameStarted, actions } = useStore(); - - const logo = useRef(); - const startButton = useRef(); - const homeRef = useRef(); - const [setupStatus, setSetupStatus] = useState(0); - const [controlStyle, setControlStyle] = useState(""); - - useEffect(() => { - const tl = gsap.timeline(); - - if (setupStatus === 0) { - if (logo.current && startButton.current) { - tl.from(logo.current, { - scale: 122, - opacity: 0, - duration: 0, - ease: "power4.out", - }) - .to(logo.current, { - scale: 1, - opacity: 1, - duration: 1.5, - ease: "power4.out", - }) - .to(startButton.current, { - opacity: 1, - duration: 3, - delay: 1, - ease: "power4.out", - }); - } - } - - const handleKeyDown = (event) => { - if (event.key === 'Enter') { - setSetupStatus(1); - } - }; - - document.body.addEventListener('keydown', handleKeyDown); - return () => { - document.body.removeEventListener('keydown', handleKeyDown); - }; - }, [setupStatus]); - - if (gameStarted) { - return null; - } - return ( - <> - {setupStatus === 0 && ( -
-
- logo -
-
- -
-
- )} - {setupStatus === 1 && ( -
-
-

CHOOSE YOUR CONTROL STYLE

- -
-
- setControlStyle("keyboard")}> - keyboard -
-

Keyboard

-
-
-
- setControlStyle("gamepad")}> - gamepad -
-

Gamepad

-
-
-
- setControlStyle("mouseKeyboard")}> - mouse & keyboard -
-

Mouse & Keyboard

-
-
-
- setControlStyle("touch")}> - mobile -
-

Mobile

-
-
- -
- -
- -
-
-
- )} - - - ); -}; diff --git a/src/Landing.tsx b/src/Landing.tsx new file mode 100644 index 0000000..974e7a0 --- /dev/null +++ b/src/Landing.tsx @@ -0,0 +1,152 @@ +import { useEffect, useRef, useState } from 'react' +import { useStore } from './components/store' +import gsap from 'gsap' + +export const Landing = () => { + const { gameStarted, actions } = useStore() + + const logo = useRef() + const startButton = useRef() + const homeRef = useRef() + const [setupStatus, setSetupStatus] = useState(0) + const [controlStyle, setControlStyle] = useState('') + + useEffect(() => { + const tl = gsap.timeline() + + if (setupStatus === 0) { + if (logo.current && startButton.current) { + tl.from(logo.current, { + scale: 122, + opacity: 0, + duration: 0, + ease: 'power4.out', + }) + .to(logo.current, { + scale: 1, + opacity: 1, + duration: 1.5, + ease: 'power4.out', + }) + .to(startButton.current, { + opacity: 1, + duration: 3, + delay: 1, + ease: 'power4.out', + }) + } + } + + const handleKeyDown = (event) => { + if (event.key === 'Enter') { + setSetupStatus(1) + } + } + + document.body.addEventListener('keydown', handleKeyDown) + return () => { + document.body.removeEventListener('keydown', handleKeyDown) + } + }, [setupStatus]) + + if (gameStarted) { + return null + } + return ( + <> + {setupStatus === 0 && ( +
+
+ logo +
+
+ +
+
+ )} + {setupStatus === 1 && ( +
+
+

CHOOSE YOUR CONTROL STYLE

+ +
+
setControlStyle('keyboard')} + > + keyboard +
+

Keyboard

+
+
+
setControlStyle('gamepad')} + > + gamepad +
+

Gamepad

+
+
+
setControlStyle('mouseKeyboard')} + > + mouse & keyboard +
+

Mouse & Keyboard

+
+
+
setControlStyle('touch')} + > + mobile +
+

Mobile

+
+
+
+ +
+ +
+
+
+ )} + + ) +} diff --git a/src/assets/react.svg b/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/components/Experience.jsx b/src/components/Experience.tsx similarity index 65% rename from src/components/Experience.jsx rename to src/components/Experience.tsx index 511e0cc..b082d6f 100644 --- a/src/components/Experience.jsx +++ b/src/components/Experience.tsx @@ -1,62 +1,47 @@ import { Environment, - OrbitControls, PerspectiveCamera, - Lightformer, - Bvh, -} from "@react-three/drei"; -import { Ground } from "./Ground"; -import { PlayerController } from "./PlayerController"; -import { PlayerControllerGamepad } from "./PlayerControllerGamepad"; -import { PlayerControllerKeyboard } from "./PlayerControllerKeyboard"; -import { PlayerControllerTouch } from "./PlayerControllerTouch"; -import { Paris } from "./models/tracks/Tour_paris_promenade"; +} from '@react-three/drei' +import { Ground } from './Ground' +import { PlayerController } from './PlayerController' +import { PlayerControllerGamepad } from './PlayerControllerGamepad' +import { PlayerControllerKeyboard } from './PlayerControllerKeyboard' +import { PlayerControllerTouch } from './PlayerControllerTouch' import { EffectComposer, - N8AO, Bloom, TiltShift2, HueSaturation, SMAA, - ChromaticAberration, - Vignette, - LUT, -} from "@react-three/postprocessing"; -import { Banana } from "./models/items/Banana_peel_mario_kart"; -import { ItemBox } from "./models/misc/Gift"; -import { useStore } from "./store"; -import { Shell } from "./models/items/Mario_shell_red"; -import { Coin } from "./models/misc/Super_mario_bros_coin"; +} from '@react-three/postprocessing' +import { Banana } from './models/items/Banana_peel_mario_kart' +import { ItemBox } from './models/misc/Gift' +import { useStore } from './store' +import { Shell } from './models/items/Mario_shell_red' +import { Coin } from './models/misc/Super_mario_bros_coin' import { - RPC, getState, - insertCoin, - isHost, myPlayer, - onPlayerJoin, useMultiplayerState, -} from "playroomkit"; -import { PlayerDummies } from "./PlayerDummies"; -import { useEffect, useState, useRef } from "react"; -import { useFrame, useLoader } from "@react-three/fiber"; -import { LUTPass, LUTCubeLoader } from "three-stdlib"; -import { useCurvedPathPoints } from "./useCurvedPath"; -import { ParisBis } from "./models/tracks/Paris-bis"; +} from 'playroomkit' +import { PlayerDummies } from './PlayerDummies' +import { useEffect, useState, useRef } from 'react' +import { useFrame, useLoader } from '@react-three/fiber' +import { LUTCubeLoader } from 'three-stdlib' +import { useCurvedPathPoints } from './useCurvedPath' +import { ParisBis } from './models/tracks/Paris-bis' export const Experience = () => { - const onCollide = (event) => {}; + const onCollide = (event) => {} const { gameStarted, bananas, shells, players, id, actions, controls } = - useStore(); - const [networkBananas, setNetworkBananas] = useMultiplayerState( - "bananas", - [] - ); + useStore() + const [networkBananas, setNetworkBananas] = useMultiplayerState('bananas', []) - const { points, loading, error } = useCurvedPathPoints("./CurvedPath.json"); + const { points, loading, error } = useCurvedPathPoints('./CurvedPath.json') - const [networkShells, setNetworkShells] = useMultiplayerState("shells", []); - const [pointest, setPointest] = useState([]); - const [currentPoint, setCurrentPoint] = useState(0); + const [networkShells, setNetworkShells] = useMultiplayerState('shells', []) + const [pointest, setPointest] = useState([]) + const [currentPoint, setCurrentPoint] = useState(0) useEffect(() => { if (points) { //This is adjusted to Paris scale @@ -64,14 +49,14 @@ export const Experience = () => { x: point.x * 50, y: point.y * 50, z: point.z * 50, - })); - setPointest(scaledPoints.reverse()); + })) + setPointest(scaledPoints.reverse()) } - }, [points]); + }, [points]) - const testing = getState("bananas"); - const cam = useRef(); - const lookAtTarget = useRef(); + const testing = getState('bananas') + const cam = useRef() + const lookAtTarget = useRef() // useEffect(() => { // setNetworkBananas(bananas); // }, [bananas]); @@ -79,41 +64,41 @@ export const Experience = () => { // useEffect(() => { // setNetworkShells(shells); // }, [shells]); - const speedFactor = 5; - const { texture } = useLoader(LUTCubeLoader, "./cubicle-99.CUBE"); + const speedFactor = 5 + const { texture } = useLoader(LUTCubeLoader, './cubicle-99.CUBE') useFrame((state, delta) => { if (!gameStarted) { - const camera = cam.current; + const camera = cam.current if (currentPoint < pointest.length - 1) { - camera.position.lerp(pointest[currentPoint], delta * speedFactor); + camera.position.lerp(pointest[currentPoint], delta * speedFactor) lookAtTarget.current.position.lerp( pointest[currentPoint + 1], delta * speedFactor - ); - camera.lookAt(lookAtTarget.current.position); + ) + camera.lookAt(lookAtTarget.current.position) if (camera.position.distanceTo(pointest[currentPoint]) < 5) { - setCurrentPoint(currentPoint + 1); + setCurrentPoint(currentPoint + 1) } } else { - setCurrentPoint(0); + setCurrentPoint(0) } } - }); + }) return ( <> {gameStarted && players.map((player) => { const ControllerComponent = - controls === "keyboard" + controls === 'keyboard' ? PlayerControllerKeyboard - : controls === "gamepad" + : controls === 'gamepad' ? PlayerControllerGamepad - : controls === "touch" + : controls === 'touch' ? PlayerControllerTouch - : PlayerController; + : PlayerController return ( { networkBananas={networkBananas} networkShells={networkShells} /> - ); + ) })} {gameStarted && players.map((player) => ( @@ -207,5 +192,5 @@ export const Experience = () => { {/* */} - ); -}; + ) +} diff --git a/src/components/Ground.jsx b/src/components/Ground.tsx similarity index 100% rename from src/components/Ground.jsx rename to src/components/Ground.tsx diff --git a/src/components/Particles/coins/CircleCoinParticle.jsx b/src/components/Particles/coins/CircleCoinParticle.tsx similarity index 100% rename from src/components/Particles/coins/CircleCoinParticle.jsx rename to src/components/Particles/coins/CircleCoinParticle.tsx diff --git a/src/components/Particles/coins/CoinParticles.jsx b/src/components/Particles/coins/CoinParticles.jsx deleted file mode 100644 index c4ba52d..0000000 --- a/src/components/Particles/coins/CoinParticles.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import { CircleCoinParticle } from "./CircleCoinParticle" -import { StarCoinParticle } from "./StarCoinParticle" - -export const CoinParticles = ({ coins }) => { - return ( - <> - - - - - - - - ) -} \ No newline at end of file diff --git a/src/components/Particles/coins/CoinParticles.tsx b/src/components/Particles/coins/CoinParticles.tsx new file mode 100644 index 0000000..b30dd97 --- /dev/null +++ b/src/components/Particles/coins/CoinParticles.tsx @@ -0,0 +1,30 @@ +import { CircleCoinParticle } from './CircleCoinParticle' +import { StarCoinParticle } from './StarCoinParticle' + +export const CoinParticles = ({ coins }) => { + return ( + <> + + + + + + + ) +} diff --git a/src/components/Particles/coins/StarCoinParticle.jsx b/src/components/Particles/coins/StarCoinParticle.tsx similarity index 100% rename from src/components/Particles/coins/StarCoinParticle.jsx rename to src/components/Particles/coins/StarCoinParticle.tsx diff --git a/src/components/Particles/drifts/DriftParticlesLeft.jsx b/src/components/Particles/drifts/DriftParticlesLeft.tsx similarity index 100% rename from src/components/Particles/drifts/DriftParticlesLeft.jsx rename to src/components/Particles/drifts/DriftParticlesLeft.tsx diff --git a/src/components/Particles/drifts/DriftParticlesRight.jsx b/src/components/Particles/drifts/DriftParticlesRight.tsx similarity index 100% rename from src/components/Particles/drifts/DriftParticlesRight.jsx rename to src/components/Particles/drifts/DriftParticlesRight.tsx diff --git a/src/components/Particles/drifts/Particles1.jsx b/src/components/Particles/drifts/Particles1.tsx similarity index 100% rename from src/components/Particles/drifts/Particles1.jsx rename to src/components/Particles/drifts/Particles1.tsx diff --git a/src/components/Particles/drifts/Particles2.jsx b/src/components/Particles/drifts/Particles2.jsx deleted file mode 100644 index dfef986..0000000 --- a/src/components/Particles/drifts/Particles2.jsx +++ /dev/null @@ -1,54 +0,0 @@ -import { useRef } from "react"; -import { useFrame } from "@react-three/fiber"; -import * as THREE from 'three'; - -export const Particles2 = ({ turboColor, scale, ...props }) => { - const ref = useRef(); - const velocity = useRef({ - x: Math.random() * 0.05, - y: Math.random() * 0.05, - z: Math.random() * 0.02, - }); - const gravity = -0.003; - - useFrame((state, delta) => { - let position = ref.current.position; - let velocityVector = new THREE.Vector3(velocity.current.x, velocity.current.y, velocity.current.z); - - - velocity.current.y += gravity * delta * 144; - - position.x += velocity.current.x * delta * 144; - position.y += velocity.current.y * delta * 144; - position.z += velocity.current.z * delta * 144; - - if (!velocityVector.equals(new THREE.Vector3(0, 0, 0))) { - const alignmentQuaternion = new THREE.Quaternion(); - alignmentQuaternion.setFromUnitVectors(new THREE.Vector3(0, 1, 0), velocityVector.normalize()); - ref.current.quaternion.slerp(alignmentQuaternion, 0.1); - } - - if (position.y < 0.05) { - position.set(0.6, 0.05, 0.5); - velocity.current = { - x: Math.random() * 0.05, - y: Math.random() * 0.05, - z: Math.random() * 0.02, - }; - } - - ref.current.position.set(position.x, position.y, position.z); - }); - - - return ( - - - - - ); -}; \ No newline at end of file diff --git a/src/components/Particles/drifts/Particles2.tsx b/src/components/Particles/drifts/Particles2.tsx new file mode 100644 index 0000000..d21bee4 --- /dev/null +++ b/src/components/Particles/drifts/Particles2.tsx @@ -0,0 +1,63 @@ +import { useRef } from 'react' +import { useFrame } from '@react-three/fiber' +import * as THREE from 'three' + +export const Particles2 = ({ turboColor, scale, ...props }) => { + const ref = useRef() + const velocity = useRef({ + x: Math.random() * 0.05, + y: Math.random() * 0.05, + z: Math.random() * 0.02, + }) + const gravity = -0.003 + + useFrame((state, delta) => { + let position = ref.current.position + let velocityVector = new THREE.Vector3( + velocity.current.x, + velocity.current.y, + velocity.current.z + ) + + velocity.current.y += gravity * delta * 144 + + position.x += velocity.current.x * delta * 144 + position.y += velocity.current.y * delta * 144 + position.z += velocity.current.z * delta * 144 + + if (!velocityVector.equals(new THREE.Vector3(0, 0, 0))) { + const alignmentQuaternion = new THREE.Quaternion() + alignmentQuaternion.setFromUnitVectors( + new THREE.Vector3(0, 1, 0), + velocityVector.normalize() + ) + ref.current.quaternion.slerp(alignmentQuaternion, 0.1) + } + + if (position.y < 0.05) { + position.set(0.6, 0.05, 0.5) + velocity.current = { + x: Math.random() * 0.05, + y: Math.random() * 0.05, + z: Math.random() * 0.02, + } + } + + ref.current.position.set(position.x, position.y, position.z) + }) + + return ( + + + + + ) +} diff --git a/src/components/Particles/drifts/Particles3.jsx b/src/components/Particles/drifts/Particles3.tsx similarity index 100% rename from src/components/Particles/drifts/Particles3.jsx rename to src/components/Particles/drifts/Particles3.tsx diff --git a/src/components/Particles/drifts/Particles4.jsx b/src/components/Particles/drifts/Particles4.jsx deleted file mode 100644 index f488fc8..0000000 --- a/src/components/Particles/drifts/Particles4.jsx +++ /dev/null @@ -1,55 +0,0 @@ -import { useRef } from "react"; -import { useFrame } from "@react-three/fiber"; -import * as THREE from 'three'; - -export const Particles4 = ({ turboColor, scale, ...props }) => { - const ref = useRef(); - const velocity = useRef({ - x: Math.random() * 0.05, - y: Math.random() * 0.05, - z: Math.random() * 0.02, - }); - const gravity = -0.001; - - useFrame((state, delta) => { - let position = ref.current.position; - let velocityVector = new THREE.Vector3(velocity.current.x, velocity.current.y, velocity.current.z); - - // Adjust gravity and velocity based on delta - velocity.current.y += gravity * delta * 144; // Multiply by 144 to scale for 144 FPS - - // Scale velocity changes by delta - position.x += velocity.current.x * delta * 144; - position.y += velocity.current.y * delta * 144; - position.z += velocity.current.z * delta * 144; - - if (!velocityVector.equals(new THREE.Vector3(0, 0, 0))) { - const alignmentQuaternion = new THREE.Quaternion(); - alignmentQuaternion.setFromUnitVectors(new THREE.Vector3(0, 1, 0), velocityVector.normalize()); - ref.current.quaternion.slerp(alignmentQuaternion, 0.1); - } - - if (position.y < 0.05) { - position.set(0.6, 0.05, 0.5); - velocity.current = { - x: Math.random() * 0.05, - y: Math.random() * 0.05, - z: Math.random() * 0.02, - }; - } - - ref.current.position.set(position.x, position.y, position.z); - }); - - - return ( - - - - - ); -}; diff --git a/src/components/Particles/drifts/Particles4.tsx b/src/components/Particles/drifts/Particles4.tsx new file mode 100644 index 0000000..ebb0b33 --- /dev/null +++ b/src/components/Particles/drifts/Particles4.tsx @@ -0,0 +1,65 @@ +import { useRef } from 'react' +import { useFrame } from '@react-three/fiber' +import * as THREE from 'three' + +export const Particles4 = ({ turboColor, scale, ...props }) => { + const ref = useRef() + const velocity = useRef({ + x: Math.random() * 0.05, + y: Math.random() * 0.05, + z: Math.random() * 0.02, + }) + const gravity = -0.001 + + useFrame((state, delta) => { + let position = ref.current.position + let velocityVector = new THREE.Vector3( + velocity.current.x, + velocity.current.y, + velocity.current.z + ) + + // Adjust gravity and velocity based on delta + velocity.current.y += gravity * delta * 144 // Multiply by 144 to scale for 144 FPS + + // Scale velocity changes by delta + position.x += velocity.current.x * delta * 144 + position.y += velocity.current.y * delta * 144 + position.z += velocity.current.z * delta * 144 + + if (!velocityVector.equals(new THREE.Vector3(0, 0, 0))) { + const alignmentQuaternion = new THREE.Quaternion() + alignmentQuaternion.setFromUnitVectors( + new THREE.Vector3(0, 1, 0), + velocityVector.normalize() + ) + ref.current.quaternion.slerp(alignmentQuaternion, 0.1) + } + + if (position.y < 0.05) { + position.set(0.6, 0.05, 0.5) + velocity.current = { + x: Math.random() * 0.05, + y: Math.random() * 0.05, + z: Math.random() * 0.02, + } + } + + ref.current.position.set(position.x, position.y, position.z) + }) + + return ( + + + + + ) +} diff --git a/src/components/Particles/drifts/PointParticle.jsx b/src/components/Particles/drifts/PointParticle.tsx similarity index 100% rename from src/components/Particles/drifts/PointParticle.jsx rename to src/components/Particles/drifts/PointParticle.tsx diff --git a/src/components/Particles/flames/FlameParticle.jsx b/src/components/Particles/flames/FlameParticle.tsx similarity index 100% rename from src/components/Particles/flames/FlameParticle.jsx rename to src/components/Particles/flames/FlameParticle.tsx diff --git a/src/components/Particles/flames/FlameParticles.jsx b/src/components/Particles/flames/FlameParticles.tsx similarity index 100% rename from src/components/Particles/flames/FlameParticles.jsx rename to src/components/Particles/flames/FlameParticles.tsx diff --git a/src/components/Particles/hits/HitParticle.jsx b/src/components/Particles/hits/HitParticle.tsx similarity index 100% rename from src/components/Particles/hits/HitParticle.jsx rename to src/components/Particles/hits/HitParticle.tsx diff --git a/src/components/Particles/hits/HitParticleTwo.jsx b/src/components/Particles/hits/HitParticleTwo.tsx similarity index 100% rename from src/components/Particles/hits/HitParticleTwo.jsx rename to src/components/Particles/hits/HitParticleTwo.tsx diff --git a/src/components/Particles/hits/HitParticles.jsx b/src/components/Particles/hits/HitParticles.tsx similarity index 100% rename from src/components/Particles/hits/HitParticles.jsx rename to src/components/Particles/hits/HitParticles.tsx diff --git a/src/components/Particles/items/CircleItemParticle.jsx b/src/components/Particles/items/CircleItemParticle.tsx similarity index 100% rename from src/components/Particles/items/CircleItemParticle.jsx rename to src/components/Particles/items/CircleItemParticle.tsx diff --git a/src/components/Particles/items/ItemParticles.jsx b/src/components/Particles/items/ItemParticles.tsx similarity index 100% rename from src/components/Particles/items/ItemParticles.jsx rename to src/components/Particles/items/ItemParticles.tsx diff --git a/src/components/Particles/items/SmallCircleParticle.jsx b/src/components/Particles/items/SmallCircleParticle.tsx similarity index 100% rename from src/components/Particles/items/SmallCircleParticle.jsx rename to src/components/Particles/items/SmallCircleParticle.tsx diff --git a/src/components/Particles/items/StarItemParticle.jsx b/src/components/Particles/items/StarItemParticle.tsx similarity index 100% rename from src/components/Particles/items/StarItemParticle.jsx rename to src/components/Particles/items/StarItemParticle.tsx diff --git a/src/components/Particles/smoke/SmokeParticle.jsx b/src/components/Particles/smoke/SmokeParticle.tsx similarity index 100% rename from src/components/Particles/smoke/SmokeParticle.jsx rename to src/components/Particles/smoke/SmokeParticle.tsx diff --git a/src/components/Particles/smoke/SmokeParticles.jsx b/src/components/Particles/smoke/SmokeParticles.tsx similarity index 100% rename from src/components/Particles/smoke/SmokeParticles.jsx rename to src/components/Particles/smoke/SmokeParticles.tsx diff --git a/src/components/PlayerController.jsx b/src/components/PlayerController.tsx similarity index 100% rename from src/components/PlayerController.jsx rename to src/components/PlayerController.tsx diff --git a/src/components/PlayerControllerGamepad.jsx b/src/components/PlayerControllerGamepad.tsx similarity index 100% rename from src/components/PlayerControllerGamepad.jsx rename to src/components/PlayerControllerGamepad.tsx diff --git a/src/components/PlayerControllerKeyboard.jsx b/src/components/PlayerControllerKeyboard.tsx similarity index 100% rename from src/components/PlayerControllerKeyboard.jsx rename to src/components/PlayerControllerKeyboard.tsx diff --git a/src/components/PlayerControllerTouch.jsx b/src/components/PlayerControllerTouch.tsx similarity index 100% rename from src/components/PlayerControllerTouch.jsx rename to src/components/PlayerControllerTouch.tsx diff --git a/src/components/PlayerDummies.jsx b/src/components/PlayerDummies.tsx similarity index 100% rename from src/components/PlayerDummies.jsx rename to src/components/PlayerDummies.tsx diff --git a/src/components/ShaderMaterials/FakeFlame/FakeFlame.jsx b/src/components/ShaderMaterials/FakeFlame/FakeFlame.tsx similarity index 95% rename from src/components/ShaderMaterials/FakeFlame/FakeFlame.jsx rename to src/components/ShaderMaterials/FakeFlame/FakeFlame.tsx index 022e56e..3abad47 100644 --- a/src/components/ShaderMaterials/FakeFlame/FakeFlame.jsx +++ b/src/components/ShaderMaterials/FakeFlame/FakeFlame.tsx @@ -2,12 +2,18 @@ * FakeFlame material component by Anderson Mancini - Jan 2024. */ -import React, { useMemo, useRef } from 'react' +import { useMemo, useRef } from 'react' import { shaderMaterial } from '@react-three/drei' import { extend, useFrame } from '@react-three/fiber' import { Color, DoubleSide, AdditiveBlending } from 'three' -export default function FakeFlame({ falloff = 3, glowInternalRadius = 1.0, glowColor = 'orange', glowSharpness = 1.0 , isBoosting,}) { +export default function FakeFlame({ + falloff = 3, + glowInternalRadius = 1.0, + glowColor = 'orange', + glowSharpness = 1.0, + isBoosting = false, +}) { const FakeFlame = useMemo(() => { return shaderMaterial( { diff --git a/src/components/ShaderMaterials/FakeGlow/FakeGlowMaterial.jsx b/src/components/ShaderMaterials/FakeGlow/FakeGlowMaterial.tsx similarity index 100% rename from src/components/ShaderMaterials/FakeGlow/FakeGlowMaterial.jsx rename to src/components/ShaderMaterials/FakeGlow/FakeGlowMaterial.tsx diff --git a/src/components/Skid.jsx b/src/components/Skid.tsx similarity index 100% rename from src/components/Skid.jsx rename to src/components/Skid.tsx diff --git a/src/components/models/characters/Mario_kart.jsx b/src/components/models/characters/Mario_kart.tsx similarity index 84% rename from src/components/models/characters/Mario_kart.jsx rename to src/components/models/characters/Mario_kart.tsx index f49c8a0..6011e9a 100644 --- a/src/components/models/characters/Mario_kart.jsx +++ b/src/components/models/characters/Mario_kart.tsx @@ -11,7 +11,13 @@ import FakeFlame from '../../ShaderMaterials/FakeFlame/FakeFlame' import { useStore } from '../../store' import gsap from 'gsap' -export function Mario({ currentSpeed, steeringAngleWheels, isBoosting, shouldLaunch, ...props }) { +export function Mario({ + currentSpeed, + steeringAngleWheels, + isBoosting, + shouldLaunch, + ...props +}) { const { nodes, materials } = useGLTF('./models/characters/mariokarttest.glb') const frontLeftWheel = useRef() @@ -21,36 +27,31 @@ export function Mario({ currentSpeed, steeringAngleWheels, isBoosting, shouldLau const [scale, setScale] = React.useState(1) const { actions } = useStore() const [shouldSlow, setShouldSlow] = React.useState(false) - const mario = useRef(); + const mario = useRef() // isBoosting = true; - useFrame((_,delta) => { + useFrame((_, delta) => { const rotation = currentSpeed / 100 frontLeftWheel.current.rotation.x += rotation frontRightWheel.current.rotation.x += rotation rearWheels.current.rotation.x += rotation frontWheels.current.rotation.y = steeringAngleWheels - if (isBoosting){ + if (isBoosting) { setScale(Math.min(scale + 0.05 * 144 * delta, 1)) } else { setScale(Math.max(scale - 0.03 * 144 * delta, 0)) } - setShouldSlow(actions.getShouldSlowDown()); + setShouldSlow(actions.getShouldSlowDown()) }) useEffect(() => { if (shouldLaunch) { - gsap.to(mario.current.rotation, {duration: 1.5, y: Math.PI * 3}) - mario.current.rotation.set(0, 0, 0); + gsap.to(mario.current.rotation, { duration: 1.5, y: Math.PI * 3 }) + mario.current.rotation.set(0, 0, 0) } }, [shouldLaunch]) return ( - + - + @@ -103,9 +101,8 @@ export function Mario({ currentSpeed, steeringAngleWheels, isBoosting, shouldLau position={[0.3, 0.65, -1.35]} rotation={[Math.PI / 1.5, 0, 0]} scale={scale} - > - + - + - ) } diff --git a/src/components/models/items/Banana_peel_mario_kart.jsx b/src/components/models/items/Banana_peel_mario_kart.tsx similarity index 100% rename from src/components/models/items/Banana_peel_mario_kart.jsx rename to src/components/models/items/Banana_peel_mario_kart.tsx diff --git a/src/components/models/items/Mario_shell_red.jsx b/src/components/models/items/Mario_shell_red.tsx similarity index 100% rename from src/components/models/items/Mario_shell_red.jsx rename to src/components/models/items/Mario_shell_red.tsx diff --git a/src/components/models/misc/Gift.jsx b/src/components/models/misc/Gift.tsx similarity index 100% rename from src/components/models/misc/Gift.jsx rename to src/components/models/misc/Gift.tsx diff --git a/src/components/models/misc/Mario_kart_item_box.jsx b/src/components/models/misc/Mario_kart_item_box.tsx similarity index 100% rename from src/components/models/misc/Mario_kart_item_box.jsx rename to src/components/models/misc/Mario_kart_item_box.tsx diff --git a/src/components/models/misc/Super_mario_bros_coin.jsx b/src/components/models/misc/Super_mario_bros_coin.tsx similarity index 100% rename from src/components/models/misc/Super_mario_bros_coin.jsx rename to src/components/models/misc/Super_mario_bros_coin.tsx diff --git a/src/components/models/tracks/Paris-bis.jsx b/src/components/models/tracks/Paris-bis.tsx similarity index 100% rename from src/components/models/tracks/Paris-bis.jsx rename to src/components/models/tracks/Paris-bis.tsx diff --git a/src/components/models/tracks/Tour_paris_promenade.jsx b/src/components/models/tracks/Tour_paris_promenade.tsx similarity index 100% rename from src/components/models/tracks/Tour_paris_promenade.jsx rename to src/components/models/tracks/Tour_paris_promenade.tsx diff --git a/src/components/store.jsx b/src/components/store.jsx deleted file mode 100644 index dd0d05f..0000000 --- a/src/components/store.jsx +++ /dev/null @@ -1,169 +0,0 @@ -import { create } from "zustand"; - -export const playAudio = (path, callback) => { - const audio = new Audio(`./sounds/${path}.mp3`); - if (callback) { - audio.addEventListener("ended", callback); - } - audio.play(); -}; -export const items = [ - "banana", - "shell", -] - -export const useStore = create((set, get) => ({ - gameStarted: false, - controls: "", - particles1: [], - particles2: [], - bodyPosition: [0, 0, 0], - bodyRotation: [0, 0, 0], - pastPositions: [], - shouldSlowdown: false, - bananas: [], - items: ["mushroom", "shell", "banana"], - item: "", - shells: [], - skids: [], - coins : 0, - players : [], - id : "", - joystickX: 0, - driftButton: false, - itemButton: false, - menuButton: false, - addPastPosition: (position) => { - set((state) => ({ - pastPositions: [position, ...state.pastPositions.slice(0, 499)], - })); - }, - actions: { - addParticle1: (particle) => { - set((state) => ({ - particles1: [...state.particles1, particle], - })); - }, - removeParticle1: (particle) => { - set((state) => ({ - particles1: state.particles1.filter((p) => p.id !== particle.id), - })); - }, - addParticle2: (particle) => { - set((state) => ({ - particles2: [...state.particles2, particle], - })); - }, - removeParticle2: (particle) => { - set((state) => ({ - particles2: state.particles2.filter((p) => p.id !== particle.id), - })); - }, - setBodyPosition: (position) => { - set({ bodyPosition: position }); - }, - setBodyRotation: (rotation) => { - set({ bodyRotation: rotation }); - }, - getBodyPosition: () => { - return get().bodyPosition; - }, - getBodyRotation: () => { - return get().bodyRotation; - }, - setShouldSlowDown: (shouldSlowdown) => { - set({ shouldSlowdown }); - }, - getShouldSlowDown: () => { - return get().shouldSlowdown; - }, - addBanana: (banana) => { - set((state) => ({ - bananas: [...state.bananas, banana], - })); - }, - removeBanana: (banana) => { - set((state) => ({ - bananas: state.bananas.filter((id) => id !== banana.id), - })); - }, - getBananas: () => { - return get().bananas; - }, - removeBananaById: (id) => { - set((state) => ({ - bananas: state.bananas.filter((b) => b.id !== id), - })); - }, - setBananas: (bananas) => { - set({ bananas }); - }, - setItem:() => { - set((state) => ({ - item: state.items[Math.floor(Math.random() * state.items.length)], - })); - }, - useItem:() => { - set((state) => ({ - item: "", - })); - }, - addShell: (shell) => { - set((state) => ({ - shells: [...state.shells, shell], - })); - }, - removeShell: (shell) => { - set((state) => ({ - shells: state.shells.filter((s) => s.id !== shell.id), - })); - }, - addSkid: (skid) => { - set((state) => ({ - skids: [...state.skids, skid], - })); - }, - addCoins : () => { - set((state) => ({ - coins: state.coins + 1, - })); - }, - looseCoins : () => { - set((state) => ({ - coins: state.coins - 1, - })); - }, - addPlayer : (player) => { - set((state) => ({ - players: [...state.players, player], - })); - }, - removePlayer : (player) => { - set((state) => ({ - players: state.players.filter((p) => p.id !== player.id), - })); - }, - setId : (id) => { - set({id}); - }, - setGameStarted: (gameStarted) => { - set({ gameStarted }); - }, - setControls: (controls) => { - set({ controls }); - }, - setJoystickX: (joystickX) => { - set({ joystickX }); - }, - setDriftButton: (driftButton) => { - set({ driftButton }); - }, - setItemButton: (itemButton) => { - set({ itemButton }); - }, - setMenuButton: (menuButton) => { - set({ menuButton }); - }, - }, - -})); diff --git a/src/components/store.tsx b/src/components/store.tsx new file mode 100644 index 0000000..3b5814a --- /dev/null +++ b/src/components/store.tsx @@ -0,0 +1,253 @@ +import { StoreApi, UseBoundStore, create } from 'zustand' + +type CallbackFunction = () => void + +export const playAudio = (path: string, callback?: CallbackFunction): void => { + const audio = new Audio(`./sounds/${path}.mp3`) + if (callback) { + audio.addEventListener('ended', callback) + } + audio.play() +} + +export const items: string[] = ['banana', 'shell'] + +type Position = [number, number, number] + +interface Particle { + id: string + // Other properties can be added here as needed +} + +interface Banana { + id: string + // Other properties can be added here as needed +} + +interface Shell { + id: string + // Other properties can be added here as needed +} + +interface Skid { + // Define properties for Skid +} + +interface Player { + id: string + // Other properties can be added here as needed +} + +interface StoreState { + gameStarted: boolean + controls: string + particles1: Particle[] + particles2: Particle[] + bodyPosition: Position + bodyRotation: Position + pastPositions: Position[] // Define a more specific type if possible + shouldSlowdown: boolean + bananas: Banana[] + items: string[] + item: string + shells: Shell[] + skids: Skid[] + coins: number + players: Player[] + id: string + joystickX: number + driftButton: boolean + itemButton: boolean + menuButton: boolean + actions: { + addPastPosition: (position: Position) => void + addParticle1: (particle: Particle) => void + removeParticle1: (particle: Particle) => void + addParticle2: (particle: Particle) => void + removeParticle2: (particle: Particle) => void + setBodyPosition: (position: Position) => void + setBodyRotation: (rotation: Position) => void + getBodyPosition: () => Position + getBodyRotation: () => Position + setShouldSlowDown: (shouldSlowdown: boolean) => void + getShouldSlowDown: () => boolean + addBanana: (banana: Banana) => void + removeBanana: (banana: Banana) => void + getBananas: () => Banana[] + removeBananaById: (id: string) => void + setBananas: (bananas: Banana[]) => void + setItem: () => void + useItem: () => void + addShell: (shell: Shell) => void + removeShell: (shell: Shell) => void + addSkid: (skid: Skid) => void + addCoins: () => void + looseCoins: () => void + addPlayer: (player: Player) => void + removePlayer: (player: Player) => void + setId: (id: string) => void + setGameStarted: (gameStarted: boolean) => void + setControls: (controls: string) => void + setJoystickX: (joystickX: number) => void + setDriftButton: (driftButton: boolean) => void + setItemButton: (itemButton: boolean) => void + setMenuButton: (menuButton: boolean) => void + } +} + +export const useStore: UseBoundStore> = create( + (set, get) => ({ + gameStarted: false, + controls: '', + particles1: [], + particles2: [], + bodyPosition: [0, 0, 0], + bodyRotation: [0, 0, 0], + pastPositions: [], + shouldSlowdown: false, + bananas: [], + items: ['mushroom', 'shell', 'banana'], + item: '', + shells: [], + skids: [], + coins: 0, + players: [], + id: '', + joystickX: 0, + driftButton: false, + itemButton: false, + menuButton: false, + actions: { + addPastPosition: (position: Position) => { + set((state: StoreState) => ({ + pastPositions: [position, ...state.pastPositions.slice(0, 499)], + })) + }, + addParticle1: (particle: Particle) => { + set((state: StoreState) => ({ + particles1: [...state.particles1, particle], + })) + }, + removeParticle1: (particle: Particle) => { + set((state: StoreState) => ({ + particles1: state.particles1.filter((p) => p.id !== particle.id), + })) + }, + addParticle2: (particle: Particle) => { + set((state: StoreState) => ({ + particles2: [...state.particles2, particle], + })) + }, + removeParticle2: (particle: Particle) => { + set((state: StoreState) => ({ + particles2: state.particles2.filter((p) => p.id !== particle.id), + })) + }, + setBodyPosition: (position: Position) => { + set({ bodyPosition: position }) + }, + setBodyRotation: (rotation: Position) => { + set({ bodyRotation: rotation }) + }, + getBodyPosition: (): Position => { + return (get() as StoreState).bodyPosition + }, + getBodyRotation: (): Position => { + return (get() as StoreState).bodyRotation + }, + setShouldSlowDown: (shouldSlowdown: boolean) => { + set({ shouldSlowdown }) + }, + getShouldSlowDown: (): boolean => { + return (get() as StoreState).shouldSlowdown + }, + addBanana: (banana: Banana) => { + set((state: StoreState) => ({ + bananas: [...state.bananas, banana], + })) + }, + removeBanana: (banana: Banana) => { + set((state: StoreState) => ({ + bananas: state.bananas.filter((b) => b.id !== banana.id), + })) + }, + getBananas: () => { + return (get() as StoreState).bananas + }, + removeBananaById: (id: string) => { + set((state: StoreState) => ({ + bananas: state.bananas.filter((b) => b.id !== id), + })) + }, + setBananas: (bananas: Banana[]) => { + set({ bananas }) + }, + setItem: () => { + set((state: StoreState) => ({ + item: state.items[Math.floor(Math.random() * state.items.length)], + })) + }, + useItem: () => { + set((state: StoreState) => ({ + item: '', + })) + }, + addShell: (shell: Shell) => { + set((state: StoreState) => ({ + shells: [...state.shells, shell], + })) + }, + removeShell: (shell: Shell) => { + set((state: StoreState) => ({ + shells: state.shells.filter((s) => s.id !== shell.id), + })) + }, + addSkid: (skid: Skid) => { + set((state: StoreState) => ({ + skids: [...state.skids, skid], + })) + }, + addCoins: () => { + set((state: StoreState) => ({ + coins: state.coins + 1, + })) + }, + looseCoins: () => { + set((state: StoreState) => ({ + coins: state.coins - 1, + })) + }, + addPlayer: (player: Player) => { + set((state: StoreState) => ({ + players: [...state.players, player], + })) + }, + removePlayer: (player: Player) => { + set((state: StoreState) => ({ + players: state.players.filter((p) => p.id !== player.id), + })) + }, + setId: (id: string) => { + set({ id }) + }, + setGameStarted: (gameStarted: boolean) => { + set({ gameStarted }) + }, + setControls: (controls: string) => { + set({ controls }) + }, + setJoystickX: (joystickX: number) => { + set({ joystickX }) + }, + setDriftButton: (driftButton: boolean) => { + set({ driftButton }) + }, + setItemButton: (itemButton: boolean) => { + set({ itemButton }) + }, + setMenuButton: (menuButton: boolean) => { + set({ menuButton }) + }, + }, + }) +) diff --git a/src/components/useCurvedPath.jsx b/src/components/useCurvedPath.jsx deleted file mode 100644 index 42287ae..0000000 --- a/src/components/useCurvedPath.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import * as THREE from 'three'; - -export const useCurvedPathPoints = (jsonPath) => { - const [points, setPoints] = useState([]); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - - useEffect(() => { - const loadPointsFromJson = async () => { - try { - const response = await fetch(jsonPath); - const data = await response.json(); - setPoints(data.points.map(point => new THREE.Vector3(point.x, point.y, point.z))); - setLoading(false); - } catch (err) { - setError(err); - setLoading(false); - } - }; - - loadPointsFromJson(); - }, [jsonPath]); - - return { points, loading, error }; -}; \ No newline at end of file diff --git a/src/components/useCurvedPath.tsx b/src/components/useCurvedPath.tsx new file mode 100644 index 0000000..d076581 --- /dev/null +++ b/src/components/useCurvedPath.tsx @@ -0,0 +1,40 @@ +import { useState, useEffect } from 'react' +import * as THREE from 'three' + +interface Point { + x: number + y: number + z: number +} + +interface PointsData { + points: Point[] +} + +export const useCurvedPathPoints = (jsonPath: string) => { + const [points, setPoints] = useState([]) + const [loading, setLoading] = useState(true) + const [error, setError] = useState(null) + + useEffect(() => { + const loadPointsFromJson = async () => { + try { + const response = await fetch(jsonPath) + const data: PointsData = await response.json() + setPoints( + data.points.map( + (point) => new THREE.Vector3(point.x, point.y, point.z) + ) + ) + setLoading(false) + } catch (err) { + setError(err as Error) + setLoading(false) + } + } + + loadPointsFromJson() + }, [jsonPath]) + + return { points, loading, error } +} diff --git a/src/components/useGamepad.jsx b/src/components/useGamepad.jsx deleted file mode 100644 index 2f3a027..0000000 --- a/src/components/useGamepad.jsx +++ /dev/null @@ -1,68 +0,0 @@ -import { useState, useEffect } from 'react'; - -export const useGamepad = () => { - const [gamepadInfo, setGamepadInfo] = useState({ connected: false, buttonA: false, buttonB :false, buttonX: false, buttonY:false, joystick: [0, 0], joystickRight : [0,0], RB: false, LB: false, RT: false, LT: false, start: false, select: false, up: false, down: false, left: false, right: false}); - - // Function to update gamepad state - const updateGamepadState = () => { - const gamepads = navigator.getGamepads ? navigator.getGamepads() : []; - const gamepad = gamepads[0]; // Assuming the first gamepad - - if (gamepad) { - const newGamepadInfo = { - connected: true, - buttonA: gamepad.buttons[0].pressed, - buttonB: gamepad.buttons[1].pressed, - buttonX: gamepad.buttons[2].pressed, - buttonY: gamepad.buttons[3].pressed, - joystickRight: [gamepad.axes[2], gamepad.axes[3]], - LT: gamepad.buttons[6].pressed, - RT: gamepad.buttons[7].pressed, - LB: gamepad.buttons[4].pressed, - RB: gamepad.buttons[5].pressed, - - start: gamepad.buttons[9].pressed, - select: gamepad.buttons[8].pressed, - up: gamepad.buttons[12].pressed, - down: gamepad.buttons[13].pressed, - left: gamepad.buttons[14].pressed, - right: gamepad.buttons[15].pressed, - joystick: [gamepad.axes[0], gamepad.axes[1]] - }; - - // Update state only if there's a change - if (JSON.stringify(newGamepadInfo) !== JSON.stringify(gamepadInfo)) { - setGamepadInfo(newGamepadInfo); - } - } else { - if (gamepadInfo.connected) { - setGamepadInfo({ connected: false, buttonA: false, buttonB :false, buttonX: false, buttonY:false, joystick: [0, 0], joystickRight : [0,0], RB: false, LB: false, RT: false, LT: false, start: false, select: false, up: false, down: false, left: false, right: false}); - } - } - }; - - useEffect(() => { - const gamepadConnected = () => { - console.log('Gamepad connected!'); - updateGamepadState(); - }; - - const gamepadDisconnected = () => { - console.log('Gamepad disconnected!'); - setGamepadInfo({ connected : false, buttonA: false, buttonB :false, buttonX: false, buttonY:false, joystick: [0, 0], joystickRight : [0,0], RB: false, LB: false, RT: false, LT: false, start: false, select: false, up: false, down: false, left: false, right: false}); - }; - - window.addEventListener('gamepadconnected', gamepadConnected); - window.addEventListener('gamepaddisconnected', gamepadDisconnected); - - const interval = setInterval(updateGamepadState, 100); - - return () => { - window.removeEventListener('gamepadconnected', gamepadConnected); - window.removeEventListener('gamepaddisconnected', gamepadDisconnected); - clearInterval(interval); - }; - }, [gamepadInfo]); - - return gamepadInfo; -}; \ No newline at end of file diff --git a/src/components/useGamepad.tsx b/src/components/useGamepad.tsx new file mode 100644 index 0000000..a41a6ad --- /dev/null +++ b/src/components/useGamepad.tsx @@ -0,0 +1,122 @@ +import { useState, useEffect } from 'react' + +export const useGamepad = () => { + const [gamepadInfo, setGamepadInfo] = useState({ + connected: false, + buttonA: false, + buttonB: false, + buttonX: false, + buttonY: false, + joystick: [0, 0], + joystickRight: [0, 0], + RB: false, + LB: false, + RT: false, + LT: false, + start: false, + select: false, + up: false, + down: false, + left: false, + right: false, + }) + + // Function to update gamepad state + const updateGamepadState = () => { + const gamepads = navigator.getGamepads ? navigator.getGamepads() : [] + const gamepad = gamepads[0] // Assuming the first gamepad + + if (gamepad) { + const newGamepadInfo = { + connected: true, + buttonA: gamepad.buttons[0].pressed, + buttonB: gamepad.buttons[1].pressed, + buttonX: gamepad.buttons[2].pressed, + buttonY: gamepad.buttons[3].pressed, + joystickRight: [gamepad.axes[2], gamepad.axes[3]], + LT: gamepad.buttons[6].pressed, + RT: gamepad.buttons[7].pressed, + LB: gamepad.buttons[4].pressed, + RB: gamepad.buttons[5].pressed, + + start: gamepad.buttons[9].pressed, + select: gamepad.buttons[8].pressed, + up: gamepad.buttons[12].pressed, + down: gamepad.buttons[13].pressed, + left: gamepad.buttons[14].pressed, + right: gamepad.buttons[15].pressed, + joystick: [gamepad.axes[0], gamepad.axes[1]], + } + + // Update state only if there's a change + if (JSON.stringify(newGamepadInfo) !== JSON.stringify(gamepadInfo)) { + setGamepadInfo(newGamepadInfo) + } + } else { + if (gamepadInfo.connected) { + setGamepadInfo({ + connected: false, + buttonA: false, + buttonB: false, + buttonX: false, + buttonY: false, + joystick: [0, 0], + joystickRight: [0, 0], + RB: false, + LB: false, + RT: false, + LT: false, + start: false, + select: false, + up: false, + down: false, + left: false, + right: false, + }) + } + } + } + + useEffect(() => { + const gamepadConnected = () => { + console.log('Gamepad connected!') + updateGamepadState() + } + + const gamepadDisconnected = () => { + console.log('Gamepad disconnected!') + setGamepadInfo({ + connected: false, + buttonA: false, + buttonB: false, + buttonX: false, + buttonY: false, + joystick: [0, 0], + joystickRight: [0, 0], + RB: false, + LB: false, + RT: false, + LT: false, + start: false, + select: false, + up: false, + down: false, + left: false, + right: false, + }) + } + + window.addEventListener('gamepadconnected', gamepadConnected) + window.addEventListener('gamepaddisconnected', gamepadDisconnected) + + const interval = setInterval(updateGamepadState, 100) + + return () => { + window.removeEventListener('gamepadconnected', gamepadConnected) + window.removeEventListener('gamepaddisconnected', gamepadDisconnected) + clearInterval(interval) + } + }, [gamepadInfo]) + + return gamepadInfo +} diff --git a/src/index.css b/src/index.css index a46f051..491a2ba 100644 --- a/src/index.css +++ b/src/index.css @@ -1,6 +1,6 @@ -@import url("https://fonts.googleapis.com/css2?family=Hanken+Grotesk:ital,wght@0,100..900;1,100..900&display=swap"); +@import url('https://fonts.googleapis.com/css2?family=Hanken+Grotesk:ital,wght@0,100..900;1,100..900&display=swap'); -#root { +#app { width: 100vw; height: 100vh; } @@ -88,7 +88,7 @@ body::-webkit-scrollbar { border: 2px solid transparent; border-radius: 50em; .background { - background-image: url("./scanline.jpg"); + background-image: url('./scanline.jpg'); background-position: center; background-size: cover; width: 100%; @@ -113,7 +113,7 @@ body::-webkit-scrollbar { .drift { right: 50px; - font-family: "Hanken Grotesk"; + font-family: 'Hanken Grotesk'; border-radius: 100px; background: rgba(255, 255, 255, 0.5); height: 66.6667px; @@ -156,7 +156,7 @@ body::-webkit-scrollbar { display: grid; place-content: center; z-index: 2; - font-family: "Hanken Grotesk"; + font-family: 'Hanken Grotesk'; .logo { img { @@ -201,114 +201,114 @@ body::-webkit-scrollbar { } } - .glassy { - width: 80vw; - height: 90vh; - background: #0000008f; - /* box-shadow: 0 8px 32px 0 rgba( 31, 38, 135, 0.37 ); */ - backdrop-filter: blur(0px); - -webkit-backdrop-filter: blur(0px); - border-radius: 10px; - border: 1px solid rgba(255, 255, 255, 0.18); - color: white; - position: relative; +.glassy { + width: 80vw; + height: 90vh; + background: #0000008f; + /* box-shadow: 0 8px 32px 0 rgba( 31, 38, 135, 0.37 ); */ + backdrop-filter: blur(0px); + -webkit-backdrop-filter: blur(0px); + border-radius: 10px; + border: 1px solid rgba(255, 255, 255, 0.18); + color: white; + position: relative; + display: flex; + justify-content: space-between; + align-items: center; + flex-direction: column; + padding: 40px; + transition: all 0.5s ease 0s; + animation: froze 2s ease 1s both; + .articles { display: flex; justify-content: space-between; - align-items: center; - flex-direction: column; - padding: 40px; - transition: all 0.5s ease 0s; - animation : froze 2s ease 1s both; - .articles { + align-items: flex-start; + width: 100%; + column-gap: 4%; + padding: 80px; + + .article { + position: relative; + background: rgba(35, 35, 53, 0.685); + width: calc((100% - 3 * 4%) / 4); + aspect-ratio: 1; + border: 3px solid #ffffff; + border-radius: 10px; display: flex; justify-content: space-between; - align-items: flex-start; - width: 100%; - column-gap: 4%; - padding: 80px; - - .article { - position: relative; - background: rgba(35, 35, 53, 0.685); - width: calc((100% - 3 * 4%) / 4); - aspect-ratio: 1; - border: 3px solid #ffffff; - border-radius: 10px; - display: flex; - justify-content: space-between; - align-items: center; - flex-direction: column; - padding: 20px; - transition: all 0.2s ease 0s; - cursor: pointer; - overflow: hidden; - &:hover { - background: rgba(216, 216, 216, 0.5); - transform: scale(1.05); - } - img { - max-width: 100%; - height: auto; - filter: drop-shadow(5px 5px 5px #0000008f); - } - } - .article.selected { - background: rgba(216, 216, 216, 0.7); - box-shadow: 0 0 20px 0 rgb(255, 255, 255); - } - - .article.mobile { - img { - width: 100px; - } - } - - .article_label { - position: absolute; - display: flex; - justify-content: center; - left: 0; - top: 80%; - background: rgba(6, 6, 6, 0.936); - border: 2px solid #272727; - width: 100%; - height: 100%; - overflow: hidden; - } - - .article_label p { - margin-top: 6px; - font-size: calc(0.01 * (80vw - 400px) + 10px); - color: white; - } - } - - .submit { - font-weight: 900; - padding: 10px; - color: rgba(255, 255, 255, 0.795); - border: 3px solid #ffffff; - background: rgba(35, 35, 53, 0.685); - border-radius: 10px; - font-size: 27px; + align-items: center; + flex-direction: column; + padding: 20px; transition: all 0.2s ease 0s; cursor: pointer; + overflow: hidden; &:hover { - text-shadow: 0 0 40px rgba(255, 255, 255, 0.541); - color: white; - opacity: 1; - animation: none; + background: rgba(216, 216, 216, 0.5); + transform: scale(1.05); } - button { - all: unset; - display: flex; - justify-content: center; - align-items: center; - display: inline-block; + img { + max-width: 100%; + height: auto; + filter: drop-shadow(5px 5px 5px #0000008f); } } + .article.selected { + background: rgba(216, 216, 216, 0.7); + box-shadow: 0 0 20px 0 rgb(255, 255, 255); + } + + .article.mobile { + img { + width: 100px; + } + } + + .article_label { + position: absolute; + display: flex; + justify-content: center; + left: 0; + top: 80%; + background: rgba(6, 6, 6, 0.936); + border: 2px solid #272727; + width: 100%; + height: 100%; + overflow: hidden; + } + + .article_label p { + margin-top: 6px; + font-size: calc(0.01 * (80vw - 400px) + 10px); + color: white; + } } + .submit { + font-weight: 900; + padding: 10px; + color: rgba(255, 255, 255, 0.795); + border: 3px solid #ffffff; + background: rgba(35, 35, 53, 0.685); + border-radius: 10px; + font-size: 27px; + transition: all 0.2s ease 0s; + cursor: pointer; + &:hover { + text-shadow: 0 0 40px rgba(255, 255, 255, 0.541); + color: white; + opacity: 1; + animation: none; + } + button { + all: unset; + display: flex; + justify-content: center; + align-items: center; + display: inline-block; + } + } +} + .disabled { pointer-events: none; cursor: not-allowed; @@ -334,12 +334,11 @@ body::-webkit-scrollbar { 100% { backdrop-filter: blur(15px); webkit-backdrop-filter: blur(15px); - } } .controls.itemButton { right: 150px; - font-family: "Hanken Grotesk"; + font-family: 'Hanken Grotesk'; border-radius: 100px; background: rgba(255, 255, 255, 0.5); height: 66.6667px; @@ -356,7 +355,7 @@ body::-webkit-scrollbar { .controls.menuButton { right: 50px; top: 60px; - font-family: "Hanken Grotesk"; + font-family: 'Hanken Grotesk'; border-radius: 100px; background: rgba(255, 255, 255, 0.5); height: 66.6667px; @@ -379,7 +378,7 @@ body::-webkit-scrollbar { } } - .start{ + .start { font-size: 30px; } @@ -387,25 +386,25 @@ body::-webkit-scrollbar { .glassy { width: 80vw; height: 90vh; - padding: 20px; + padding: 20px; .articles { display: flex; - flex-wrap: wrap; + flex-wrap: wrap; justify-content: space-between; align-items: flex-start; column-gap: 4%; - row-gap: 20px; + row-gap: 20px; .article { - width: calc((100% - 3 * 4%) / 2 - 10px); - aspect-ratio: 1; + width: calc((100% - 3 * 4%) / 2 - 10px); + aspect-ratio: 1; padding: 10px; - transition: transform 0.3s ease; + transition: transform 0.3s ease; img { - width: 100%; + width: 100%; height: auto; } &:hover { - transform: scale(1.05); + transform: scale(1.05); } } } diff --git a/src/main.jsx b/src/main.tsx similarity index 53% rename from src/main.jsx rename to src/main.tsx index 0b8c8b8..be1940c 100644 --- a/src/main.jsx +++ b/src/main.tsx @@ -1,15 +1,18 @@ import React from 'react' -import ReactDOM from 'react-dom/client' import App from './App' import './index.css' import { HUD } from './HUD' import { Landing } from './Landing' -import { useStore } from './components/store' -ReactDOM.createRoot(document.getElementById('root')).render( +import { createRoot } from 'react-dom/client' + +const container = document.getElementById('app') +const root = createRoot(container!) + +root.render( - , + ) diff --git a/src/react.svg b/src/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/src/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..3934b8f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite-env.d.ts b/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/vite.config.js b/vite.config.ts similarity index 50% rename from vite.config.js rename to vite.config.ts index 2ba14c3..279c5d7 100644 --- a/vite.config.js +++ b/vite.config.ts @@ -1,10 +1,10 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react-swc' +import viteTsconfigPaths from 'vite-tsconfig-paths' -// https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [react(), viteTsconfigPaths()], optimizeDeps: { - exclude: ['js-big-decimal'] - } + exclude: ['js-big-decimal'], + }, })