diff --git a/package-lock.json b/package-lock.json index 39a5bc7..101261b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,13 +8,17 @@ "name": "spcb-website", "version": "0.1.0", "dependencies": { + "@react-three/drei": "^9.120.5", + "@react-three/fiber": "^8.17.10", "@tanstack/react-query": "^5.59.17", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "date-fns": "^4.1.0", "firebase": "^10.14.1", + "framer-motion": "^11.15.0", "lucide-react": "^0.436.0", "next": "14.2.6", + "ngrok": "^5.0.0-beta.2", "puppeteer": "^23.11.1", "react": "^18", "react-dom": "^18", @@ -22,7 +26,8 @@ "react-hot-toast": "^2.4.1", "react-icons": "^5.3.0", "tailwind-merge": "^2.5.2", - "tailwindcss-animate": "^1.0.7" + "tailwindcss-animate": "^1.0.7", + "three": "^0.172.0" }, "devDependencies": { "@types/node": "^20", @@ -69,6 +74,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "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", @@ -792,6 +809,24 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mediapipe/tasks-vision": { + "version": "0.10.17", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz", + "integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==", + "license": "Apache-2.0" + }, + "node_modules/@monogrid/gainmap-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.1.0.tgz", + "integrity": "sha512-Obb0/gEd/HReTlg8ttaYk+0m62gQJmCblMOjHSMHRrBP2zdfKMHLCRbh/6ex9fSUJMKdjjIEiohwkbGD3wj2Nw==", + "license": "MIT", + "dependencies": { + "promise-worker-transferable": "^1.0.4" + }, + "peerDependencies": { + "three": ">= 0.159.0" + } + }, "node_modules/@next/env": { "version": "14.2.6", "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.6.tgz", @@ -1066,12 +1101,239 @@ "node": ">=18" } }, + "node_modules/@react-spring/animated": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", + "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", + "license": "MIT", + "dependencies": { + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", + "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", + "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", + "license": "MIT" + }, + "node_modules/@react-spring/shared": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", + "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", + "license": "MIT", + "dependencies": { + "@react-spring/rafz": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.5.tgz", + "integrity": "sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", + "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", + "license": "MIT" + }, + "node_modules/@react-three/drei": { + "version": "9.120.5", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.120.5.tgz", + "integrity": "sha512-hSu3q+gq546Op4aihIkbdIsFfjrmOqcJyMPNGv/IqM0nycJtvv5IzL+MISLplFTNFI6xMBJ9ZwC+7dpq35/FOA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mediapipe/tasks-vision": "0.10.17", + "@monogrid/gainmap-js": "^3.0.6", + "@react-spring/three": "~9.7.5", + "@use-gesture/react": "^10.3.1", + "camera-controls": "^2.9.0", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.56", + "glsl-noise": "^0.0.0", + "hls.js": "^1.5.17", + "maath": "^0.10.8", + "meshline": "^3.3.1", + "react-composer": "^5.0.3", + "stats-gl": "^2.2.8", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.7.8", + "three-stdlib": "^2.34.0", + "troika-three-text": "^0.52.0", + "tunnel-rat": "^0.1.2", + "utility-types": "^3.11.0", + "uuid": "^9.0.1", + "zustand": "^5.0.1" + }, + "peerDependencies": { + "@react-three/fiber": "^8 || ^9.0.0-0", + "react": "^18", + "react-dom": "^18", + "three": ">=0.137" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber": { + "version": "8.17.10", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.17.10.tgz", + "integrity": "sha512-S6bqa4DqUooEkInYv/W+Jklv2zjSYCXAhm6qKpAQyOXhTEt5gBXnA7W6aoJ0bjmp9pAeaSj/AZUoz1HCSof/uA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/debounce": "^1.2.1", + "@types/react-reconciler": "^0.26.7", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "debounce": "^1.2.1", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "scheduler": "^0.21.0", + "suspend-react": "^0.1.3", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "react-native": ">=0.64", + "three": ">=0.133" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "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==", + "license": "MIT", + "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", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "license": "MIT", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, "node_modules/@rushstack/eslint-patch": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", "dev": true }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -1086,6 +1348,18 @@ "tslib": "^2.4.0" } }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@tanstack/query-core": { "version": "5.59.17", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.59.17.tgz", @@ -1117,12 +1391,57 @@ "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "license": "MIT" + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debounce": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.4.tgz", + "integrity": "sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==", + "license": "MIT" + }, + "node_modules/@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "20.16.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", @@ -1131,17 +1450,21 @@ "undici-types": "~6.19.2" } }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" + }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "dev": true + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/react": { "version": "18.3.4", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.4.tgz", "integrity": "sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==", - "dev": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -1156,6 +1479,50 @@ "@types/react": "*" } }, + "node_modules/@types/react-reconciler": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", + "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/three": { + "version": "0.171.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.171.0.tgz", + "integrity": "sha512-oLuT1SAsT+CUg/wxUTFHo0K3NtJLnx9sJhZWQJp/0uXqFpzSk1hRHmvWvpaAWSfvx2db0lVKZ5/wV0I0isD2mQ==", + "license": "MIT", + "dependencies": { + "@tweenjs/tween.js": "~23.1.3", + "@types/stats.js": "*", + "@types/webxr": "*", + "@webgpu/types": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/@types/webxr": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.20.tgz", + "integrity": "sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==", + "license": "MIT" + }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", @@ -1298,6 +1665,30 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", + "license": "MIT" + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "license": "MIT", + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/@webgpu/types": { + "version": "0.1.52", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.52.tgz", + "integrity": "sha512-eI883Nlag2hGIkhXxAnq8s4APpqXWuPL3Gbn2ghiU12UjLvfCbVqHK4XfXl3eLRTatqcMmeK7jws7IwWsGfbzw==", + "license": "BSD-3-Clause" + }, "node_modules/acorn": { "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", @@ -1688,6 +2079,15 @@ "node": ">=10.0.0" } }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -1762,6 +2162,33 @@ "node": ">=10.16.0" } }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -1797,6 +2224,15 @@ "node": ">= 6" } }, + "node_modules/camera-controls": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.9.0.tgz", + "integrity": "sha512-TpCujnP0vqPppTXXJRYpvIy0xq9Tro6jQf2iYUxlDpPCNxkvE/XGaTuwIxnhINOkVP/ob2CRYXtY3iVYXeMEzA==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.126.1" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001653", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", @@ -1949,6 +2385,18 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -2012,6 +2460,24 @@ } } }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2116,6 +2582,12 @@ "url": "https://github.com/sponsors/kossnocorp" } }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", @@ -2132,6 +2604,33 @@ } } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", @@ -2170,6 +2669,15 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -2217,6 +2725,15 @@ "node": ">= 14" } }, + "node_modules/detect-gpu": { + "version": "5.0.63", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.63.tgz", + "integrity": "sha512-S4ZOf2tI5nwFyhzGvsaRA86IvctD6JQtq4+NPSseO6E1AWW66qTDFHdAMBPlFiD7Dfe9TETy0Q7pa/kHcIYYMQ==", + "license": "MIT", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, "node_modules/devtools-protocol": { "version": "0.0.1367902", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz", @@ -2256,6 +2773,12 @@ "node": ">=6.0.0" } }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", + "license": "Apache-2.0" + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -3048,6 +3571,12 @@ "pend": "~1.2.0" } }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -3166,6 +3695,33 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/framer-motion": { + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.15.0.tgz", + "integrity": "sha512-MLk8IvZntxOMg7lDBLw2qgTHHv664bYoYmnFTmE0Gm/FW67aOJk0WM3ctMcG+Xhcv+vh5uyyXwxvxhSeJzSe+w==", + "license": "MIT", + "dependencies": { + "motion-dom": "^11.14.3", + "motion-utils": "^11.14.3", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3408,6 +3964,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "license": "MIT" + }, "node_modules/goober": { "version": "2.1.16", "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", @@ -3429,6 +3991,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3520,6 +4107,25 @@ "node": ">= 0.4" } }, + "node_modules/hls.js": { + "version": "1.5.18", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.18.tgz", + "integrity": "sha512-znxR+2jecWluu/0KOBqUcvVyAB5tLff10vjMGrpAlz1eFY+ZhF1bY3r82V+Bk7WJdk03iTjtja9KFFz5BrqjSA==", + "license": "Apache-2.0" + }, + "node_modules/hpagent": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-0.1.2.tgz", + "integrity": "sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ==", + "license": "MIT", + "optional": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "license": "BSD-2-Clause" + }, "node_modules/http-parser-js": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", @@ -3537,6 +4143,19 @@ "node": ">= 14" } }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -3582,6 +4201,12 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -3915,6 +4540,12 @@ "node": ">=8" } }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -4067,6 +4698,27 @@ "set-function-name": "^2.0.1" } }, + "node_modules/its-fine": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", + "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", + "license": "MIT", + "dependencies": { + "@types/react-reconciler": "^0.28.0" + }, + "peerDependencies": { + "react": ">=18.0" + } + }, + "node_modules/its-fine/node_modules/@types/react-reconciler": { + "version": "0.28.9", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", + "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, "node_modules/jackspeak": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", @@ -4116,8 +4768,7 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -4167,7 +4818,6 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, "dependencies": { "json-buffer": "3.0.1" } @@ -4203,6 +4853,15 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -4236,6 +4895,12 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4258,6 +4923,15 @@ "loose-envify": "cli.js" } }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -4271,6 +4945,16 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, + "node_modules/maath": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", + "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "license": "MIT", + "peerDependencies": { + "@types/three": ">=0.134.0", + "three": ">=0.134.0" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4279,6 +4963,21 @@ "node": ">= 8" } }, + "node_modules/meshline": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", + "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/meshoptimizer": { + "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==", + "license": "MIT" + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -4291,6 +4990,15 @@ "node": ">=8.6" } }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4325,6 +5033,18 @@ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" }, + "node_modules/motion-dom": { + "version": "11.14.3", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.14.3.tgz", + "integrity": "sha512-lW+D2wBy5vxLJi6aCP0xyxTxlTfiu+b+zcpVbGVFUxotwThqhdpPRSmX8xztAgtZMPMeU0WGVn/k1w4I+TbPqA==", + "license": "MIT" + }, + "node_modules/motion-utils": { + "version": "11.14.3", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.14.3.tgz", + "integrity": "sha512-Xg+8xnqIJTpr0L/cidfTTBFkvRw26ZtGGuIhA94J9PQ2p4mEa06Xx7QVYZH0BP+EpMSaDlu+q0I0mmvwADPsaQ==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4447,6 +5167,37 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/ngrok": { + "version": "5.0.0-beta.2", + "resolved": "https://registry.npmjs.org/ngrok/-/ngrok-5.0.0-beta.2.tgz", + "integrity": "sha512-UzsyGiJ4yTTQLCQD11k1DQaMwq2/SsztBg2b34zAqcyjS25qjDpogMKPaCKHwe/APRTHeel3iDXcVctk5CNaCQ==", + "hasInstallScript": true, + "dependencies": { + "extract-zip": "^2.0.1", + "got": "^11.8.5", + "lodash.clonedeep": "^4.5.0", + "uuid": "^7.0.0 || ^8.0.0", + "yaml": "^2.2.2" + }, + "bin": { + "ngrok": "bin/ngrok" + }, + "engines": { + "node": ">=14.2" + }, + "optionalDependencies": { + "hpagent": "^0.1.2" + } + }, + "node_modules/ngrok/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4455,6 +5206,18 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4614,6 +5377,15 @@ "node": ">= 0.8.0" } }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4950,6 +5722,12 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "license": "ISC" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5062,11 +5840,20 @@ "node": ">=0.4.0" } }, + "node_modules/promise-worker-transferable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", + "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "license": "Apache-2.0", + "dependencies": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -5205,6 +5992,18 @@ "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -5216,6 +6015,18 @@ "node": ">=0.10.0" } }, + "node_modules/react-composer": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", + "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -5266,8 +6077,32 @@ "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-reconciler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", + "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "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==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } }, "node_modules/read-cache": { "version": "1.0.0", @@ -5309,6 +6144,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -5335,6 +6176,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -5351,6 +6201,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -5368,6 +6224,18 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -5655,6 +6523,32 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" }, + "node_modules/stats-gl": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", + "integrity": "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==", + "license": "MIT", + "dependencies": { + "@types/three": "*", + "three": "^0.170.0" + }, + "peerDependencies": { + "@types/three": "*", + "three": "*" + } + }, + "node_modules/stats-gl/node_modules/three": { + "version": "0.170.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", + "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", + "license": "MIT" + }, + "node_modules/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", + "license": "MIT" + }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -5953,6 +6847,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=17.0" + } + }, "node_modules/tailwind-merge": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.2.tgz", @@ -6071,6 +6974,45 @@ "node": ">=0.8" } }, + "node_modules/three": { + "version": "0.172.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.172.0.tgz", + "integrity": "sha512-6HMgMlzU97MsV7D/tY8Va38b83kz8YJX+BefKjspMNAv0Vx6dxMogHOrnRl/sbMIs3BPUKijPqDqJ/+UwJbIow==", + "license": "MIT" + }, + "node_modules/three-mesh-bvh": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.8.tgz", + "integrity": "sha512-BGEZTOIC14U0XIRw3tO4jY7IjP7n7v24nv9JXS1CyeVRWOCkcOMhRnmENUjuV39gktAw4Ofhr0OvIAiTspQrrw==", + "deprecated": "Deprecated due to three.js version incompatibility. Please use v0.8.0, instead.", + "license": "MIT", + "peerDependencies": { + "three": ">= 0.151.0" + } + }, + "node_modules/three-stdlib": { + "version": "2.35.2", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.35.2.tgz", + "integrity": "sha512-Ns9ZdiFEAsiv8JvHS28Qgxg4YRTq13Ixa4EDUQZhUovZ3j/GLTou4zE887SLSqsuRZwuy3gklttn2ha5JaJpTQ==", + "license": "MIT", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/three-stdlib/node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "license": "MIT" + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -6087,6 +7029,36 @@ "node": ">=8.0" } }, + "node_modules/troika-three-text": { + "version": "0.52.3", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.3.tgz", + "integrity": "sha512-jLhiwgV8kEkwWjvK12f2fHVpbOC75p7SgPQ0cgcz+IMtN5Bdyg4EuFdwuTOVu9ga8UeYdKBpzd1AxviyixtYTQ==", + "license": "MIT", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.52.0", + "troika-worker-utils": "^0.52.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.0.tgz", + "integrity": "sha512-00oxqIIehtEKInOTQekgyknBuRUj1POfOUE2q1OmL+Xlpp4gIu+S0oA0schTyXsDS4d9DkR04iqCdD40rF5R6w==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.52.0.tgz", + "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==", + "license": "MIT" + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -6121,6 +7093,43 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, + "node_modules/tunnel-rat": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", + "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "license": "MIT", + "dependencies": { + "zustand": "^4.3.2" + } + }, + "node_modules/tunnel-rat/node_modules/zustand": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz", + "integrity": "sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6282,11 +7291,53 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==", + "license": "MIT" + }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -6612,6 +7663,35 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/zustand": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.2.tgz", + "integrity": "sha512-8qNdnJVJlHlrKXi50LDqqUNmUbuBjoKLrYQBnoChIbVph7vni+sY+YpvdjXG9YLd/Bxr6scMcR+rm5H3aSqPaw==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } } } } diff --git a/package.json b/package.json index 46e29c6..077affd 100644 --- a/package.json +++ b/package.json @@ -9,13 +9,17 @@ "lint": "next lint" }, "dependencies": { + "@react-three/drei": "^9.120.5", + "@react-three/fiber": "^8.17.10", "@tanstack/react-query": "^5.59.17", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "date-fns": "^4.1.0", "firebase": "^10.14.1", + "framer-motion": "^11.15.0", "lucide-react": "^0.436.0", "next": "14.2.6", + "ngrok": "^5.0.0-beta.2", "puppeteer": "^23.11.1", "react": "^18", "react-dom": "^18", @@ -23,7 +27,8 @@ "react-hot-toast": "^2.4.1", "react-icons": "^5.3.0", "tailwind-merge": "^2.5.2", - "tailwindcss-animate": "^1.0.7" + "tailwindcss-animate": "^1.0.7", + "three": "^0.172.0" }, "devDependencies": { "@types/node": "^20", diff --git a/public/landing/bg.svg b/public/landing/bg.svg new file mode 100644 index 0000000..5d9dbb5 --- /dev/null +++ b/public/landing/bg.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/landing/logos/meta.png b/public/landing/logos/meta.png new file mode 100644 index 0000000..72ffa9f Binary files /dev/null and b/public/landing/logos/meta.png differ diff --git a/public/landing/logos/microsoft.png b/public/landing/logos/microsoft.png new file mode 100644 index 0000000..aa2d5d2 Binary files /dev/null and b/public/landing/logos/microsoft.png differ diff --git a/public/landing/logos/nvidia.png b/public/landing/logos/nvidia.png new file mode 100644 index 0000000..53b8abc Binary files /dev/null and b/public/landing/logos/nvidia.png differ diff --git a/public/landing/logos/roblox.png b/public/landing/logos/roblox.png new file mode 100644 index 0000000..d30e6a5 Binary files /dev/null and b/public/landing/logos/roblox.png differ diff --git a/public/landing/logos/samsung.png b/public/landing/logos/samsung.png new file mode 100644 index 0000000..806accf Binary files /dev/null and b/public/landing/logos/samsung.png differ diff --git a/public/landing/logos/ukg.png b/public/landing/logos/ukg.png new file mode 100644 index 0000000..b3bf920 Binary files /dev/null and b/public/landing/logos/ukg.png differ diff --git a/public/models/case.glb b/public/models/case.glb new file mode 100644 index 0000000..a364f69 Binary files /dev/null and b/public/models/case.glb differ diff --git a/src/app/events/page.tsx b/src/app/events/page.tsx index f4c5f0d..9b39b1f 100644 --- a/src/app/events/page.tsx +++ b/src/app/events/page.tsx @@ -1,13 +1,13 @@ "use client"; -import Calendar from "@/components/client-events/Calendar"; -import MonthlyEvents from "@/components/client-events/MonthlyEvents"; +import Calendar from "@/components/events/Calendar"; +import MonthlyEvents from "@/components/events/MonthlyEvents"; export default function Events() { return ( <> -
-
-
+
+
+
diff --git a/src/app/globals.css b/src/app/globals.css index 2dbcc1c..7d7352c 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,4 +1,4 @@ -@import url("https://fonts.googleapis.com/css2?family=Krub:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;1,200;1,300;1,400;1,500;1,600;1,700&family=Michroma&display=swap"); +@import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Michroma&family=Source+Sans+3:ital,wght@0,200..900;1,200..900&display=swap'); @tailwind base; @tailwind components; @tailwind utilities; @@ -15,12 +15,56 @@ textarea { } body { - font-family: "Krub", sans-serif; + font-family: "Inter", sans-serif; + background-color: #ffffff; } -.bg { - background: linear-gradient(60deg, #000000, #3c4175); - inset: 0; + +.hero { + background-image: url('/landing/bg.svg'); + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} + + + + +.noise-bg { position: fixed; - z-index: -1; + inset: 0; + z-index: 1; + pointer-events: none; + opacity: 0.02; + background: + repeating-radial-gradient(#fff 0 0.0001%, #000 0 0.0002%) 50% 0/2500px 2500px, + repeating-conic-gradient(#fff 0 0.0001%, #000 0 0.0002%) 50% 50%/2500px 2500px; + background-blend-mode: difference; +} + +@media (max-width: 768px) { + .noise-bg { + background: + repeating-radial-gradient(#fff 0 1%, #000 0 0.02%) 50% 0/500px 500px, + repeating-conic-gradient(#fff 0 1%, #000 0 0.02%) 50% 50%/500px 500px; + } +} + + +.monthly-event { + background: radial-gradient( + 138.71% 110.11% at 93.15% -36.58%, + #4255f922 25%, + #0F1319 100% + ), + radial-gradient( + 61.66% 37.6% at 6.63% 95.08%, + #4255f922 25%, + #0F1319 100% + ), + rgba(26, 26, 26, 0.43); + box-shadow: 0px 0.5px 16px 0px rgba(200, 200, 255, 0.1); + border: 1px solid #4255f911; + + } diff --git a/src/app/page.tsx b/src/app/page.tsx index 05a3804..00fe72e 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,620 +1,15 @@ -// page.tsx "use client"; - -import React from "react"; -import Image from "next/image"; -import { ChevronDown } from "lucide-react"; -import GlowingLine from "@/components/decorations/GlowingLine"; -import Link from "next/link"; -import { useState, useEffect } from "react"; -import SocialStats from "@/components/MemberCounts/SocialStats"; +import Hero from "@/components/landing/Hero"; +import LandingAbout from "@/components/landing/LandingAbout"; const Website = () => { - const [isDesktop, setIsDesktop] = useState(false); - - useEffect(() => { - const checkIfDesktop = () => { - setIsDesktop(window.innerWidth >= 768); - }; - - // Initial check - checkIfDesktop(); - - // Add event listener - window.addEventListener("resize", checkIfDesktop); - - // Cleanup - return () => window.removeEventListener("resize", checkIfDesktop); - }, []); - return ( -
- {/* Add Michroma font */} - - {/* Hero Section with Background Image */} -
- {/* Hero Content */} -
- {/* Content Container with Grid */} -
- {/* Logo Section */} -
- {/* Outer Glow */} -
- {/* Inner Glow */} -
- {/* Logo */} -
- SPCB Logo -
-
- - {/* Text Section */} -
-

- The Society of PC Building -

- - {/* Social Stats */} -
- -
- - {/* Join Button */} - -
-
- - {/* Scroll Indicator */} -
-
- -
-
-
-
+
+
+ + {/* About Section */} -
- - {/* Base black background */} - - - {/* Gradient overlay for radial left */} - - - - - - - - {/* White polygon - using isDesktop state */} - {isDesktop && ( - - )} - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- {/* Decorative Lines */} - - - - - {/* Content Box */} -
-
-
-

- About -

-

- The Society of PC Building (SPCB) at the University of Florida - is a community for students passionate about PC hardware, - building, and tech. Whether you're a beginner or an expert, - SPCB offers workshops, live demos, and events to help you - learn, collaborate, and build custom rigs. Beyond PCs, we - foster innovation, teamwork, and technical growth, connecting - students through a shared love for technology. -

- - Learn More - - - - -
-
-
-
- {/* Activities Section */} -
- {/* Main vertical line */} - - - - {/* Top right Blue Group */} - - - - {/* Middle Left Blue Group */} - - - - - {/* Content Cards */} -
- {/* Socials Card - Left */} -
-
-
- Socials -
-
-

- Socials -

-
-
-
- - {/* GBMs Card - Right */} -
-
-
- GBMs -
-
-

- GBMs -

-
-
-
- - {/* PC Builds Card - Left */} -
-
-
- PC Builds -
-
-

- PC Builds -

-
-
-
-
-
- {/* Social Links Section */} -
-
- - - -
- - {/* Content */} -
-
- {/* Left side */} -
-
- SPCB Logo -
-

- Proudly building PCs. -

- {/* Social Media Icons */} -
- - LinkedIn - - - Instagram - - - Discord - - - Linktree - -
-
- - {/* Right side - GUD section */} -
-
-
-

- Gator User Design -

- GUD Logo -
- - Check us out - - - - -
-
-
-
- {/* Footer */} -
-
-

- © {new Date().getFullYear()} The Society of PC Building. - All rights reserved. -

-
-
-
-
); }; diff --git a/src/components/Navbar/PublicNavbar.tsx b/src/components/Navbar/PublicNavbar.tsx index 462a3cb..1ff624a 100644 --- a/src/components/Navbar/PublicNavbar.tsx +++ b/src/components/Navbar/PublicNavbar.tsx @@ -1,122 +1,98 @@ -"use client"; - import Link from "next/link"; -import Image from "next/image"; import { useState } from "react"; +import { FaBars } from "react-icons/fa"; +import { FaXmark } from "react-icons/fa6"; +import { AnimatePresence, motion } from "framer-motion"; -export default function Navbar() { - const [isOpen, setIsOpen] = useState(false); - const toggleMenu = () => setIsOpen(!isOpen); - +export default function Nav() { + const [showMobileNav, setShowMobileNav] = useState(false); return ( - <> - {/* Add Michroma font */} - + ); } diff --git a/src/components/admin/auth/ProtectedRoute.tsx b/src/components/admin/auth/ProtectedRoute.tsx index 4615351..1045cb6 100644 --- a/src/components/admin/auth/ProtectedRoute.tsx +++ b/src/components/admin/auth/ProtectedRoute.tsx @@ -37,5 +37,5 @@ export default function ProtectedRoute({ return null; } - return
{children}
; + return
{children}
; } diff --git a/src/components/client-events/CalendarDays.tsx b/src/components/client-events/CalendarDays.tsx deleted file mode 100644 index 3d7bf4d..0000000 --- a/src/components/client-events/CalendarDays.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { FirebaseEvent } from "@/types/events"; -import { format, isSameDay } from "date-fns"; - -type CalendarDaysProps = { - daysToDisplay: Date[]; - currentDate: Date; - events: FirebaseEvent[]; -}; - -const CalendarDays: React.FC = ({ - daysToDisplay, - currentDate, - events, -}) => { - return ( -
- {daysToDisplay.map((day, i) => { - const isCurrentMonth = format(day, "MM") === format(currentDate, "MM"); - - const dayEvents = events.filter((event) => { - const eventDate = event.time.toDate(); - return isCurrentMonth && isSameDay(eventDate, day); - }); - - if (isCurrentMonth) { - return ( -
-
{format(day, "dd")}
-
- {dayEvents.map((_event,i) => ( -
{_event.title}
- ))} -
-
- ); - } else { - return ( -
- ); - } - })} -
- ); -}; - -export default CalendarDays; diff --git a/src/components/client-events/MonthlyEvent.tsx b/src/components/client-events/MonthlyEvent.tsx deleted file mode 100644 index c82abec..0000000 --- a/src/components/client-events/MonthlyEvent.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { FirebaseEvent } from "@/types/events"; - -type MonthlyEventProps = { - event: FirebaseEvent; -}; - -const MonthlyEvent: React.FC = ({ event }) => { - function parseDateTime(dateTime: Date): { - timeString: string; - dayOfMonth: string; - dayOfWeek: string; - } { - const timeString = dateTime.toLocaleString("en-US", { - hour: "numeric", - minute: "2-digit", - hour12: true, - }); - - const dayOfMonth = dateTime.getDate().toString(); - - const dayOfWeek = dateTime - .toLocaleString("en-US", { - weekday: "short", - }) - .toUpperCase(); - - return { timeString, dayOfMonth, dayOfWeek }; - } - - const { - timeString: time, - dayOfMonth, - dayOfWeek, - } = parseDateTime(event.time.toDate()); - - return ( -
-
-

{dayOfWeek}

-

{dayOfMonth}

-
-
-

{event.title}

-
-

- Location:{" "} - {event.location} -

-

- Time: {time} -

-
-

{event.description}

-
- {event.tags.map((tag, i) => ( -
- - {tag} -
- ))} -
-
-
- ); -}; - -export default MonthlyEvent; diff --git a/src/components/client-events/MonthlyEvents.tsx b/src/components/client-events/MonthlyEvents.tsx deleted file mode 100644 index 71581dc..0000000 --- a/src/components/client-events/MonthlyEvents.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { useCachedEvents } from "@/hooks/useCachedEvents"; -import React, { useState } from "react"; -import MonthlyEvent from "./MonthlyEvent"; - -export default function MonthlyEvents() { - const [currentDate, setCurrentDate] = useState(new Date()); - const { - data: events, - isLoading, - isError, - error, - } = useCachedEvents(currentDate); - - if (isError) { - return ( -
- Error occured while fetching data. Please contact us on discord. -
- ); - } - if (isLoading) { - return ( -
-

December Events

-
- ); - } - - return ( -
-

December Events

-
- {events?.map((_event) => )} -
-
- ); -} - diff --git a/src/components/client-events/Calendar.tsx b/src/components/events/Calendar.tsx similarity index 61% rename from src/components/client-events/Calendar.tsx rename to src/components/events/Calendar.tsx index 8904517..ec376bc 100644 --- a/src/components/client-events/Calendar.tsx +++ b/src/components/events/Calendar.tsx @@ -12,6 +12,7 @@ import { import { FaChevronLeft, FaChevronRight } from "react-icons/fa"; import { useCachedEvents } from "@/hooks/useCachedEvents"; import CalendarDays from "./CalendarDays"; +import CalendarSkeleton from "./CalendarSkeleton"; export default function Calendar() { const [currentDate, setCurrentDate] = useState(new Date()); @@ -38,20 +39,20 @@ export default function Calendar() { }; return ( -
-
-

+

+
+

{currentMonthName} {currentYear}

- {/* Days of the Week */} -
+ {/* Desktop Days of the Week */} +
{["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"].map((day) => (
{day}
))}
- {/* Calendar Days */} + {/* Mobile Days of the Week */} +
+ {["Su", "M", "T", "W", "Th", "F", "Sa"].map((day) => ( +
+ {day} +
+ ))} +
+ + {/* While fetching show the calendar skeleton */} {events && } + {isLoading && } +
); } diff --git a/src/components/events/CalendarDay.tsx b/src/components/events/CalendarDay.tsx new file mode 100644 index 0000000..64b9d97 --- /dev/null +++ b/src/components/events/CalendarDay.tsx @@ -0,0 +1,67 @@ +import { FirebaseEvent } from "@/types/events"; +import { format } from "date-fns"; +import CalendarEvent from "./CalendarEvent"; +import MobileCalendarEvent from "./MobileCalendarEvent"; + +type CalendarDayProps = { + dayEvents?: FirebaseEvent[]; + daysInMonth: number; + isCurrentMonth: boolean; + index: number; + day: Date; +}; + +const CalendarDay: React.FC = ({ + dayEvents, + daysInMonth, + isCurrentMonth, + index, + day, +}) => { + if (!isCurrentMonth) { + return ( + <> + {/* Desktop Calendar Day not in current month */} +
+

{format(day, "dd")}

+
+ + {/* Mobile Calendar Day not in current month */} +
+
{format(day, "dd")}
+
+ + ); + } + return ( + <> + {/* Desktop Calendar day in current month */} +
+
{format(day, "dd")}
+ {dayEvents && ( +
+ {dayEvents.map((_event, i) => ( + + ))} +
+ )} +
+ + {/* Mobile Calendar day in current month */} + +
+ {dayEvents && dayEvents.length > 0 ? ( + + ) : ( +
{format(day, "dd")}
+ )} +
+ + ); +}; + +export default CalendarDay; diff --git a/src/components/events/CalendarDays.tsx b/src/components/events/CalendarDays.tsx new file mode 100644 index 0000000..1ff41ef --- /dev/null +++ b/src/components/events/CalendarDays.tsx @@ -0,0 +1,35 @@ +import { FirebaseEvent } from "@/types/events"; +import { format, isSameDay } from "date-fns"; +import CalendarEvent from "./CalendarEvent"; +import CalendarDay from "./CalendarDay"; + +type CalendarDaysProps = { + daysToDisplay: Date[]; + currentDate: Date; + events: FirebaseEvent[]; +}; + +const CalendarDays: React.FC = ({ + daysToDisplay, + currentDate, + events, +}) => { + return ( +
+ {daysToDisplay.map((day, i) => { + const isCurrentMonth = format(day, "MM") === format(currentDate, "MM"); + + const dayEvents = events.filter((event) => { + const eventDate = event.time.toDate(); + return isCurrentMonth && isSameDay(eventDate, day); + }); + + return + })} +
+ ); +}; + +export default CalendarDays; + + diff --git a/src/components/events/CalendarEvent.tsx b/src/components/events/CalendarEvent.tsx new file mode 100644 index 0000000..6a73e82 --- /dev/null +++ b/src/components/events/CalendarEvent.tsx @@ -0,0 +1,85 @@ +import { FirebaseEvent } from "@/types/events"; +import { useEffect, useState } from "react"; +import { FaXmark } from "react-icons/fa6"; + +type CalendarEventProps = { + _event: FirebaseEvent; +}; + +const CalendarEvent: React.FC = ({ _event }) => { + const [showEventModal, setShowEventModal] = useState(false); + + const handleEventClick = () => { + setShowEventModal((prev) => !prev); + document.body.style.overflow = + document.body.style.overflow === "hidden" ? "auto" : "hidden"; + }; + + const time = _event.time.toDate().toLocaleString("en-US", { + hour: "numeric", + minute: "2-digit", + hour12: true, + }); + + function formatDateToMMDDYY(date: Date): string { + const padZero = (num: number): string => num.toString().padStart(2, "0"); + + const month = padZero(date.getMonth() + 1); // Months are 0-based + const day = padZero(date.getDate()); + const year = date.getFullYear().toString().slice(-2); // Get last 2 digits of the year + + return `${month}/${day}/${year}`; + } + + const date = formatDateToMMDDYY(_event.time.toDate()); + + useEffect(() => { + return () => { + if (document.body.style.overflow === "hidden") { + document.body.style.overflow = "auto"; + } + }; + }, []); + return ( + <> +
+ {_event.title} +
+ + {showEventModal && ( +
+
+ +

{_event.title}

+
+

Location: {_event.location}

+

Time: {time}

Date: {date}

+
+

{_event.description}

+
+ {_event.tags.map((tag, i) => ( +
+ + {tag} +
+ ))} +
+
+
+ )} + + ); +}; + +export default CalendarEvent; diff --git a/src/components/events/CalendarSkeleton.tsx b/src/components/events/CalendarSkeleton.tsx new file mode 100644 index 0000000..271443d --- /dev/null +++ b/src/components/events/CalendarSkeleton.tsx @@ -0,0 +1,22 @@ +import { format, isSameDay } from "date-fns"; +import CalendarDay from "./CalendarDay"; + +type CalendarSkeletonProps = { + daysToDisplay: Date[]; + currentDate: Date; +}; + +const CalendarSkeleton: React.FC = ({ + daysToDisplay, + currentDate, +}) => { + return ( +
+ {daysToDisplay.map((day, i) => { + const isCurrentMonth = format(day, "MM") === format(currentDate, "MM"); + return + })} +
+ ); +}; +export default CalendarSkeleton; diff --git a/src/components/events/MobileCalendarEvent.tsx b/src/components/events/MobileCalendarEvent.tsx new file mode 100644 index 0000000..cf13885 --- /dev/null +++ b/src/components/events/MobileCalendarEvent.tsx @@ -0,0 +1,61 @@ +import { FirebaseEvent } from "@/types/events"; +import { format } from "date-fns"; +import { useEffect, useState } from "react"; +import { FaXmark } from "react-icons/fa6"; +import MonthlyEvent from "./MonthlyEvent"; + +type MobileCalendarEventProps = { + day: Date; + dayEvents: FirebaseEvent[]; +}; + +const MobileCalendarEvent: React.FC = ({ + day, + dayEvents, +}) => { + const [showEventModal, setShowEventModal] = useState(false); + + const handleEventClick = () => { + setShowEventModal((prev) => !prev); + document.body.style.overflow = + document.body.style.overflow === "hidden" ? "auto" : "hidden"; + }; + + useEffect(() => { + return () => { + if (document.body.style.overflow === "hidden") { + document.body.style.overflow = "auto"; + } + }; + }, []); + + return ( + <> +
+ {format(day, "dd")} +
+ {showEventModal && ( +
+
+ + +
+ {dayEvents.map((_event, i) => ( + + ))} +
+ + +
+
+ )} + + ); +}; + +export default MobileCalendarEvent; diff --git a/src/components/events/MonthlyEvent.tsx b/src/components/events/MonthlyEvent.tsx new file mode 100644 index 0000000..d1d3ff4 --- /dev/null +++ b/src/components/events/MonthlyEvent.tsx @@ -0,0 +1,118 @@ +import { FirebaseEvent } from "@/types/events"; +import { AnimatePresence, motion } from "framer-motion"; +import { useState } from "react"; + +type MonthlyEventProps = { + event: FirebaseEvent; +}; + +const MonthlyEvent: React.FC = ({ event }) => { + const [expandMobileEvent, setExpandMobileEvent] = useState(false); + function parseDateTime(dateTime: Date): { + timeString: string; + dayOfMonth: string; + dayOfWeek: string; + } { + const timeString = dateTime.toLocaleString("en-US", { + hour: "numeric", + minute: "2-digit", + hour12: true, + }); + + const dayOfMonth = dateTime.getDate().toString(); + + const dayOfWeek = dateTime + .toLocaleString("en-US", { + weekday: "short", + }) + .toUpperCase(); + + return { timeString, dayOfMonth, dayOfWeek }; + } + + const { + timeString: time, + dayOfMonth, + dayOfWeek, + } = parseDateTime(event.time.toDate()); + + return ( + <> + {/* Desktop version */} +
+
+

{dayOfWeek}

+

{dayOfMonth}

+
+
+

{event.title}

+
+

+ Location: {event.location} +

+

+ Time: {time} +

+
+

{event.description}

+
+ {event.tags.map((tag, i) => ( +
+ + {tag} +
+ ))} +
+
+
+ + {/* Mobile Version */} +
setExpandMobileEvent((prev) => !prev)} + > +
+
+

{dayOfWeek}

+

{dayOfMonth}

+
+

{event.title}

+
+ + + {expandMobileEvent && ( + +
+

Location: {event.location}

+

Time: {time}

+
+

{event.description}

+
+ {event.tags.map((tag, i) => ( +
+ + {tag} +
+ ))} +
+
+ )} +
+
+ + ); +}; + +export default MonthlyEvent; diff --git a/src/components/events/MonthlyEvents.tsx b/src/components/events/MonthlyEvents.tsx new file mode 100644 index 0000000..09fbcc3 --- /dev/null +++ b/src/components/events/MonthlyEvents.tsx @@ -0,0 +1,49 @@ +import { useCachedEvents } from "@/hooks/useCachedEvents"; +import React, { useState } from "react"; +import MonthlyEvent from "./MonthlyEvent"; +import { format } from "date-fns"; +import { FaSpinner } from "react-icons/fa"; + +export default function MonthlyEvents() { + const [currentDate, setCurrentDate] = useState(new Date()); + const { + data: events, + isLoading, + isError, + error, + } = useCachedEvents(currentDate); + + if (isError) { + return ( +
+ Error occured while fetching data. Please contact us on discord. +
+ ); + } + if (isLoading) { + return ( +
+

{format(currentDate, 'MMMM')} Events

+

Click an event for more details.

+
+ +
+
+ ); + } + + + + return ( +
+ +

{format(currentDate, 'MMMM')} Events

+ +

Click an event for more details.

+
+ {events?.map((_event) => )} +
+
+ ); +} + diff --git a/src/components/landing/Hero.tsx b/src/components/landing/Hero.tsx new file mode 100644 index 0000000..5c76ceb --- /dev/null +++ b/src/components/landing/Hero.tsx @@ -0,0 +1,66 @@ +import React from "react"; +import LogoCarousel from "./LogoCarousel"; +import Image from "next/image"; +import {motion} from "framer-motion" + +export default function Hero() { + return ( +
+
+
+ + 1000+ Active Members! + +

+ The Society
of PC Building +

+

+ + Join the Society of PC Building at UF—where + + Where students passionate about + hardware and tech connect, innovate, and build custom PCs together. +

+ + +
+

+ Led by a team of officers with experience at: +

+
+ + + + + + +

+ More!

+
+ +
+
+ {/*
+ +
*/} + + SPCB Logo + +
+ +
+ ); +} diff --git a/src/components/landing/LandingAbout.tsx b/src/components/landing/LandingAbout.tsx new file mode 100644 index 0000000..bac0dfe --- /dev/null +++ b/src/components/landing/LandingAbout.tsx @@ -0,0 +1,428 @@ +import Image from "next/image"; +import Link from "next/link"; +import React, { useEffect, useState } from "react"; +import { motion } from "framer-motion"; +import GlowingLine from "../decorations/GlowingLine"; + +export default function LandingAbout() { + const [isDesktop, setIsDesktop] = useState(false); + + useEffect(() => { + const checkIfDesktop = () => { + setIsDesktop(window.innerWidth >= 768); + }; + + // Initial check + checkIfDesktop(); + + // Add event listener + window.addEventListener("resize", checkIfDesktop); + + // Cleanup + return () => window.removeEventListener("resize", checkIfDesktop); + }, []); + return ( +
+ + {/* Gradient overlay for radial left */} + + {/* White polygon - using isDesktop state */} + {isDesktop && ( + + )} + + +
+ {/* Decorative Lines */} + + + + + {/* Content Box */} +
+ +
+

+ About +

+

+ The Society of PC Building (SPCB) at the University of Florida + is a community for students passionate about PC hardware, + building, and tech. Whether you're a beginner or an expert, SPCB + offers workshops, live demos, and events to help you learn, + collaborate, and build custom rigs. Beyond PCs, we foster + innovation, teamwork, and technical growth, connecting students + through a shared love for technology. +

+ + Learn More + + + + +
+
+
+
+ {/* Activities Section */} +
+ {/* Main vertical line */} + + + + {/* Top right Blue Group */} + + + + {/* Middle Left Blue Group */} + + + + + {/* Content Cards */} +
+ {/* Socials Card - Left */} + +
+
+ Socials +
+
+

+ Socials +

+
+
+
+ + {/* GBMs Card - Right */} + +
+
+ GBMs +
+
+

+ GBMs +

+
+
+
+ + {/* PC Builds Card - Left */} + +
+
+ PC Builds +
+
+

+ PC Builds +

+
+
+
+
+
+ {/* Social Links Section */} +
+
+ + + +
+ + {/* Content */} +
+
+ {/* Left side */} +
+
+ SPCB Logo +
+

+ Proudly building PCs. +

+ {/* Social Media Icons */} +
+ + LinkedIn + + + Instagram + + + Discord + + + Linktree + +
+
+ + {/* Right side - GUD section */} +
+
+
+

+ Gator User Design +

+ GUD Logo +
+ + Check us out + + + + +
+
+
+
+ {/* Footer */} +
+
+

+ © {new Date().getFullYear()} The Society of PC Building. All + rights reserved. +

+
+
+
+
+ ); +} diff --git a/src/components/landing/LogoCarousel.tsx b/src/components/landing/LogoCarousel.tsx new file mode 100644 index 0000000..3acc702 --- /dev/null +++ b/src/components/landing/LogoCarousel.tsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +interface Logo { + src: string; + alt: string; +} + +const LogoCarousel: React.FC = () => { + const logos: Logo[] = [ + { src: "/landing/logos/roblox.png", alt: "Roblox" }, + { src: "/landing/logos/nvidia.png", alt: "NVIDIA" }, + { src: "/landing/logos/microsoft.png", alt: "Microsoft" }, + { src: "/landing/logos/samsung.png", alt: "Samsung" }, + { src: "/landing/logos/ukg.png", alt: "UKG" }, + { src: "/landing/logos/meta.png", alt: "Meta" } + ]; + + // Duplicate the logos array to create a seamless infinite effect + const duplicatedLogos = [...logos, ...logos]; + + return ( +
+ + {duplicatedLogos.map((logo, index) => ( +
+ {logo.alt} +
+ ))} + + More! +
+
+ ); +}; + +export default LogoCarousel; diff --git a/src/components/landing/Scene.tsx b/src/components/landing/Scene.tsx new file mode 100644 index 0000000..5a20400 --- /dev/null +++ b/src/components/landing/Scene.tsx @@ -0,0 +1,56 @@ +import { Canvas, useFrame } from '@react-three/fiber'; +import { OrbitControls, Environment, useGLTF } from '@react-three/drei'; +import { useRef } from 'react'; +import { Group } from 'three'; + +function Scene() { + return ( + + + + + + + + ); +} + +export default Scene; + +interface ModelProps { + position: [number, number, number]; +} + +export function Model(props: ModelProps) { + const { nodes, materials } = useGLTF('/models/case.glb') as any; // Use "as any" to avoid issues with the GLTF loader + const ref = useRef(null); + + useFrame((state, delta) => { + if (ref.current) { + ref.current.rotation.y += delta / 2; + } + }); + + return ( + + + + ); +} + +useGLTF.preload('/models/case.glb'); diff --git a/tailwind.config.ts b/tailwind.config.ts index 8e167c1..74049d2 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -26,7 +26,7 @@ const config = { 'light-blue': "#8BC5F7", }, fontFamily: { - title: ["Michroma", "sans-serif"], + Michroma: ["Michroma", "sans-serif"], }, }, },