diff --git a/package-lock.json b/package-lock.json index d7e13efa..c0ea96ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,8 +35,6 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", - "@react-three/drei": "^9.112.0", - "@react-three/fiber": "^8.17.7", "@t3-oss/env-nextjs": "^0.10.1", "@tanstack/react-query": "^5.50.0", "@trpc/client": "^11.17.0", @@ -50,7 +48,6 @@ "cors": "^2.8.5", "dexie": "^4.0.11", "formidable": "^3.5.4", - "framer-motion": "^11.11.9", "geist": "^1.3.0", "idb-keyval": "^6.2.1", "jsonld": "^9.0.0", @@ -71,8 +68,6 @@ "swagger-ui-react": "^5.22.0", "tailwind-merge": "^2.5.2", "tailwindcss-animate": "^1.0.7", - "three": "^0.168.0", - "three-globe": "^2.31.1", "uuid": "^11.1.0", "zod": "^3.23.8", "zustand": "^4.5.5" @@ -83,8 +78,6 @@ "@jest/globals": "^30.1.2", "@next/bundle-analyzer": "^16.2.6", "@playwright/test": "1.60.0", - "@react-three/drei": "^9.122.0", - "@react-three/fiber": "^8.17.7", "@types/cors": "^2.8.18", "@types/eslint": "^8.56.10", "@types/formidable": "^3.5.1", @@ -1343,13 +1336,6 @@ "node": ">=18.0" } }, - "node_modules/@dimforge/rapier3d-compat": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", - "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -2998,13 +2984,6 @@ } } }, - "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==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/@meshsdk/bitcoin": { "version": "1.9.0-beta.89", "resolved": "https://registry.npmjs.org/@meshsdk/bitcoin/-/bitcoin-1.9.0-beta.89.tgz", @@ -4402,19 +4381,6 @@ "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/@monogrid/gainmap-js": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.4.0.tgz", - "integrity": "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "promise-worker-transferable": "^1.0.4" - }, - "peerDependencies": { - "three": ">= 0.159.0" - } - }, "node_modules/@multiformats/dns": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.13.tgz", @@ -6489,225 +6455,6 @@ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", "license": "MIT" }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/@react-three/drei": { - "version": "9.122.0", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.122.0.tgz", - "integrity": "sha512-SEO/F/rBCTjlLez7WAlpys+iGe9hty4rNgjZvgkQeXFSiwqD4Hbk/wNHMAbdd8vprO2Aj81mihv4dF5bC7D0CA==", - "dev": true, - "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.35.6", - "troika-three-text": "^0.52.0", - "tunnel-rat": "^0.1.2", - "utility-types": "^3.11.0", - "zustand": "^5.0.1" - }, - "peerDependencies": { - "@react-three/fiber": "^8", - "react": "^18", - "react-dom": "^18", - "three": ">=0.137" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/@react-three/drei/node_modules/zustand": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.13.tgz", - "integrity": "sha512-efI2tVaVQPqtOh114loML/Z80Y4NP3yc+Ff0fYiZJPauNeWZeIp/bRFD7I9bfmCOYBh/PHxlglQ9+wvlwnPikQ==", - "dev": true, - "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 - } - } - }, - "node_modules/@react-three/fiber": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.18.0.tgz", - "integrity": "sha512-FYZZqD0UUHUswKz3LQl2Z7H24AhD14XGTsIRw3SJaXUxyfVMi+1yiZGmqTcPt/CkPpdU7rrxqcyQ1zJE5DjvIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@types/react-reconciler": "^0.26.7", - "@types/webxr": "*", - "base64-js": "^1.5.1", - "buffer": "^6.0.3", - "its-fine": "^1.0.6", - "react-reconciler": "^0.27.0", - "react-use-measure": "^2.1.7", - "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 <19", - "react-dom": ">=18 <19", - "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/zustand": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -7671,55 +7418,6 @@ "typescript": ">=5.7.2" } }, - "node_modules/@turf/boolean-point-in-polygon": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-7.3.5.tgz", - "integrity": "sha512-ba7+B0wzaS9GtERZOoXUZ6oW8IcIJHNQZf3c+tiD9ESjcsPO1Q/4qIJGTKl92nBLhhracHJxMWBM/U6hAVkaRg==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.5", - "@turf/invariant": "7.3.5", - "@types/geojson": "^7946.0.10", - "point-in-polygon-hao": "^1.1.0", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/helpers": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.3.5.tgz", - "integrity": "sha512-E/NMGV5MwbjjP7AJXBtsanC3yY8N2MQ87IGdIgkB2ji5AtBpwnH4L3gEqpYN4RlCJJWbLbzO91BbKv2waUd0eg==", - "license": "MIT", - "dependencies": { - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/invariant": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.3.5.tgz", - "integrity": "sha512-ZVIvsBvjr8lO7WxC5zYNjRsjSDvyGvWkJMjuWaJjTU8x+1tmfNnw3gDX/TI2Sit83gcRYLYkNo23lB/udqx/Hg==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.5", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "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/@tybys/wasm-util": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", @@ -7862,13 +7560,6 @@ "@types/ms": "*" } }, - "node_modules/@types/draco3d": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", - "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/eslint": { "version": "8.56.12", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", @@ -7905,12 +7596,6 @@ "@types/node": "*" } }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -8019,13 +7704,6 @@ "undici-types": "~6.21.0" } }, - "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==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/papaparse": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.5.2.tgz", @@ -8081,16 +7759,6 @@ "@types/react": "^19.2.0" } }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -8098,13 +7766,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/stats.js": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", - "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/swagger-jsdoc": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/@types/swagger-jsdoc/-/swagger-jsdoc-6.0.4.tgz", @@ -8122,21 +7783,6 @@ "@types/react": "*" } }, - "node_modules/@types/three": { - "version": "0.184.1", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.184.1.tgz", - "integrity": "sha512-6q4VdiqVsrTRqmk62/BnlcAvIrnDM0zf2ZDVKI5kZiniWrSaOHaQzmbp+BNzoggc/8tgW412pL//wZIxu2PPTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@dimforge/rapier3d-compat": "~0.12.0", - "@tweenjs/tween.js": "~23.1.3", - "@types/stats.js": "*", - "@types/webxr": ">=0.5.17", - "fflate": "~0.8.2", - "meshoptimizer": "~1.1.1" - } - }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -8156,13 +7802,6 @@ "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, - "node_modules/@types/webxr": { - "version": "0.5.24", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", - "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/yargs": { "version": "17.0.35", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", @@ -8798,26 +8437,6 @@ "win32" ] }, - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@use-gesture/core": "10.3.1" - }, - "peerDependencies": { - "react": ">= 16.8.0" - } - }, "node_modules/@utxorpc/sdk": { "version": "0.6.8", "resolved": "https://registry.npmjs.org/@utxorpc/sdk/-/sdk-0.6.8.tgz", @@ -9062,15 +8681,6 @@ "integrity": "sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==", "license": "MIT" }, - "node_modules/accessor-fn": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz", - "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -10030,16 +9640,6 @@ "devOptional": true, "license": "MIT" }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, "node_modules/bignumber.js": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", @@ -10445,16 +10045,6 @@ "node": ">= 6" } }, - "node_modules/camera-controls": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.10.1.tgz", - "integrity": "sha512-KnaKdcvkBJ1Irbrzl8XD6WtZltkRjp869Jx8c0ujs9K+9WD+1D7ryBsCiVqJYUqt6i/HR5FxT7RLASieUD+Q5w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "three": ">=0.126.1" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001793", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", @@ -10912,25 +10502,6 @@ "sha.js": "^2.4.8" } }, - "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==", - "dev": true, - "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-fetch": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", @@ -10978,18 +10549,6 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", @@ -10999,18 +10558,6 @@ "node": ">=12" } }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "license": "ISC", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-dispatch": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", @@ -11042,42 +10589,6 @@ "node": ">=12" } }, - "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo-voronoi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/d3-geo-voronoi/-/d3-geo-voronoi-2.1.0.tgz", - "integrity": "sha512-kqE4yYuOjPbKdBXG0xztCacPwkVSK2REF1opSNrnqqtXJmNcM++UbwQ8SxvwP6IQTj9RvIjjK4qeiVsEfj0Z2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-delaunay": "6", - "d3-geo": "3", - "d3-tricontour": "1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", @@ -11090,41 +10601,6 @@ "node": ">=12" } }, - "node_modules/d3-octree": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz", - "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==", - "license": "MIT" - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", @@ -11134,30 +10610,6 @@ "node": ">=12" } }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-timer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", @@ -11186,19 +10638,6 @@ "d3-selection": "2 - 3" } }, - "node_modules/d3-tricontour": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-tricontour/-/d3-tricontour-1.1.0.tgz", - "integrity": "sha512-G7gHKj89n2owmkGb6WX6ixcnQ0Kf/0wpa9VIh9DGdbHu8wdrlaHU4ir3/bFNERl8N8nn4G7e7qbtBG8N9caihQ==", - "license": "ISC", - "dependencies": { - "d3-delaunay": "6", - "d3-scale": "4" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-zoom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", @@ -11222,18 +10661,6 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/data-bind-mapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/data-bind-mapper/-/data-bind-mapper-1.0.3.tgz", - "integrity": "sha512-QmU3lyEnbENQPo0M1F9BMu4s6cqNNp8iJA+b/HP2sSb7pf3dxwF3+EP1eO69rwBfH9kFJ1apmzrtogAmVt2/Xw==", - "license": "MIT", - "dependencies": { - "accessor-fn": "1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -11423,15 +10850,6 @@ "devOptional": true, "license": "MIT" }, - "node_modules/delaunator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", - "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", - "license": "ISC", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -11487,16 +10905,6 @@ ], "license": "MIT" }, - "node_modules/detect-gpu": { - "version": "5.0.70", - "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.70.tgz", - "integrity": "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "webgl-constants": "^1.1.1" - } - }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -11625,13 +11033,6 @@ "node": ">=0.10" } }, - "node_modules/draco3d": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", - "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/drange": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", @@ -11662,12 +11063,6 @@ "dev": true, "license": "MIT" }, - "node_modules/earcut": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", - "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", - "license": "ISC" - }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -12721,13 +12116,6 @@ } } }, - "node_modules/fflate": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", - "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", - "dev": true, - "license": "MIT" - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -12897,54 +12285,18 @@ }, "engines": { "node": ">=14.0.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/fraction.js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.1.tgz", - "integrity": "sha512-NQYzZw8MUsxSZFQo6E8tKOlmSd/BlDTNOR4puXFSHSwFwNaIlmbortQy5PDN/KnVQ4xWG2NtN0J0hjPw7eE06A==", - "license": "MIT OR GPL-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/frame-ticker": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/frame-ticker/-/frame-ticker-1.0.3.tgz", - "integrity": "sha512-E0X2u2JIvbEMrqEg5+4BpTqaD22OwojJI63K7MdKHdncjtAhGRbCR8nJCr2vwEt9NWBPCPcu70X9smPviEBy8Q==", - "license": "MIT", - "dependencies": { - "simplesignal": "^2.1.6" - } - }, - "node_modules/framer-motion": { - "version": "11.18.2", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", - "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", - "license": "MIT", - "dependencies": { - "motion-dom": "^11.18.1", - "motion-utils": "^11.18.1", - "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 - } + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/fraction.js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.1.tgz", + "integrity": "sha512-NQYzZw8MUsxSZFQo6E8tKOlmSd/BlDTNOR4puXFSHSwFwNaIlmbortQy5PDN/KnVQ4xWG2NtN0J0hjPw7eE06A==", + "license": "MIT OR GPL-2.0", + "engines": { + "node": "*" } }, "node_modules/fsevents": { @@ -13289,13 +12641,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "dev": true, - "license": "MIT" - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -13366,17 +12711,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/h3-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/h3-js/-/h3-js-4.4.0.tgz", - "integrity": "sha512-DvJh07MhGgY2KcC4OeZc8SSyA+ZXpdvoh6uCzGpoKvWtZxJB+g6VXXC1+eWYkaMIsLz7J/ErhOalHCpcs1KYog==", - "license": "Apache-2.0", - "engines": { - "node": ">=4", - "npm": ">=3", - "yarn": ">=1.3.0" - } - }, "node_modules/handlebars": { "version": "4.7.9", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", @@ -13664,13 +12998,6 @@ "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", "license": "CC0-1.0" }, - "node_modules/hls.js": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.16.tgz", - "integrity": "sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/hono": { "version": "4.12.23", "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.23.tgz", @@ -13789,13 +13116,6 @@ "node": ">= 4" } }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true, - "license": "MIT" - }, "node_modules/immutable": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.3.tgz", @@ -13870,15 +13190,6 @@ "node": ">=0.8.19" } }, - "node_modules/index-array-by": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz", - "integrity": "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -13906,15 +13217,6 @@ "node": ">= 0.4" } }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -14317,13 +13619,6 @@ "node": ">=0.10.0" } }, - "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==", - "dev": true, - "license": "MIT" - }, "node_modules/is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -14638,29 +13933,6 @@ "node": ">= 0.4" } }, - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, "node_modules/jackspeak": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", @@ -15466,18 +14738,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/kapsule": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz", - "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==", - "license": "MIT", - "dependencies": { - "lodash-es": "4" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -15559,16 +14819,6 @@ "libsodium-sumo": "^0.7.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==", - "dev": true, - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, "node_modules/light-bolt11-decoder": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/light-bolt11-decoder/-/light-bolt11-decoder-3.2.0.tgz", @@ -15630,12 +14880,6 @@ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, - "node_modules/lodash-es": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", - "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", - "license": "MIT" - }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -15787,17 +15031,6 @@ "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==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/three": ">=0.134.0", - "three": ">=0.134.0" - } - }, "node_modules/main-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/main-event/-/main-event-1.0.4.tgz", @@ -16165,23 +15398,6 @@ "node": ">= 8" } }, - "node_modules/meshline": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", - "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/meshoptimizer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-1.1.1.tgz", - "integrity": "sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g==", - "dev": true, - "license": "MIT" - }, "node_modules/micro-packed": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.7.3.tgz", @@ -16878,21 +16094,6 @@ "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", "license": "MIT" }, - "node_modules/motion-dom": { - "version": "11.18.1", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", - "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", - "license": "MIT", - "dependencies": { - "motion-utils": "^11.18.1" - } - }, - "node_modules/motion-utils": { - "version": "11.18.1", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz", - "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", - "license": "MIT" - }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -19898,15 +19099,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/point-in-polygon-hao": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/point-in-polygon-hao/-/point-in-polygon-hao-1.2.4.tgz", - "integrity": "sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==", - "license": "MIT", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -20110,13 +19302,6 @@ "node": ">=0.10.0" } }, - "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", - "dev": true, - "license": "ISC" - }, "node_modules/preact": { "version": "10.24.3", "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", @@ -20351,17 +19536,6 @@ "integrity": "sha512-82DVc5tI36neVB3IjdXR11ztwGuoBc98em9ijzubeZKxI47OlV2Znq6mlPqE5xPDzO2Uw98GHiQSjj2favBCRQ==", "license": "Apache-2.0 OR MIT" }, - "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==", - "dev": true, - "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", @@ -20589,19 +19763,6 @@ "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==", - "dev": true, - "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-copy-to-clipboard": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", @@ -20748,23 +19909,6 @@ "react": ">=18" } }, - "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==", - "dev": true, - "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-redux": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", @@ -20877,22 +20021,6 @@ "react": ">= 0.14.0" } }, - "node_modules/react-use-measure": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", - "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": ">=16.13", - "react-dom": ">=16.13" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -21314,12 +20442,6 @@ "node": ">= 0.8" } }, - "node_modules/robust-predicates": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", - "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", - "license": "Unlicense" - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -21453,16 +20575,6 @@ "integrity": "sha512-74mD4wL1vw4GVh2ECemQhoB3q5Smwj5S8W7OG1j7OWuLkwJ0Mvz4LFhZPA9rZjpNvanZoKiDqc3S/qGD65uRYg==", "license": "Apache-2.0" }, - "node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/semver": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", @@ -21746,12 +20858,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simplesignal": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/simplesignal/-/simplesignal-2.1.7.tgz", - "integrity": "sha512-PEo2qWpUke7IMhlqiBxrulIFvhJRLkl1ih52Rwa+bPjzhJepcd4GIjn2RiQmFSx3dQvsEAgF0/lXMwMN7vODaA==", - "license": "MIT" - }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -21882,35 +20988,6 @@ "fast-sha256": "^1.3.0" } }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" - }, "node_modules/std-env": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", @@ -22264,16 +21341,6 @@ "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==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": ">=17.0" - } - }, "node_modules/swagger-client": { "version": "3.37.4", "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.37.4.tgz", @@ -22699,139 +21766,6 @@ "node": ">=0.8" } }, - "node_modules/three": { - "version": "0.168.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.168.0.tgz", - "integrity": "sha512-6m6jXtDwMJEK/GGMbAOTSAmxNdzKvvBzgd7q8bE/7Tr6m7PaBh5kKLrN7faWtlglXbzj7sVba48Idwx+NRsZXw==", - "license": "MIT" - }, - "node_modules/three-conic-polygon-geometry": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/three-conic-polygon-geometry/-/three-conic-polygon-geometry-2.1.3.tgz", - "integrity": "sha512-7KYcgd7rYg91L8AnCEddeyhw4qlv9+8NAI0luHq7QGt26icWUGNCsvLyD+u6FPKjP+un3zGBi4JGzqgGpmBSWA==", - "license": "MIT", - "dependencies": { - "@turf/boolean-point-in-polygon": "^7.2", - "d3-array": "1 - 3", - "d3-geo": "1 - 3", - "d3-geo-voronoi": "2", - "d3-scale": "1 - 4", - "delaunator": "5", - "earcut": "3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "three": ">=0.72.0" - } - }, - "node_modules/three-geojson-geometry": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/three-geojson-geometry/-/three-geojson-geometry-2.1.1.tgz", - "integrity": "sha512-dC7bF3ri1goDcihYhzACHOBQqu7YNNazYLa2bSydVIiJUb3jDFojKSy+gNj2pMkqZNSVjssSmdY9zlmnhEpr1w==", - "license": "MIT", - "dependencies": { - "d3-geo": "1 - 3", - "d3-interpolate": "1 - 3", - "earcut": "3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "three": ">=0.72.0" - } - }, - "node_modules/three-globe": { - "version": "2.45.2", - "resolved": "https://registry.npmjs.org/three-globe/-/three-globe-2.45.2.tgz", - "integrity": "sha512-3qJE2LAdyHsUPt02mgMRc+PG3j9kGEA0fUYrwKPGIVtvMR1XjDn9hCXu31AWocdgHOFcXkrRVz7jJZzTIvR0eQ==", - "license": "MIT", - "dependencies": { - "@tweenjs/tween.js": "18 - 25", - "accessor-fn": "1", - "d3-array": "3", - "d3-color": "3", - "d3-geo": "3", - "d3-interpolate": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "data-bind-mapper": "1", - "frame-ticker": "1", - "h3-js": "4", - "index-array-by": "1", - "kapsule": "^1.16", - "three-conic-polygon-geometry": "2", - "three-geojson-geometry": "2", - "three-slippy-map-globe": "1", - "tinycolor2": "1" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "three": ">=0.154" - } - }, - "node_modules/three-mesh-bvh": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.9.10.tgz", - "integrity": "sha512-UOlTgPIeqUURcwaG8knxvBaruwZlC4X3/WSHEFO7rYvMVv/YNUrkfFEszvfj36pXV88dCHoHNnIp0PifkirnTQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "three": ">= 0.159.0" - } - }, - "node_modules/three-slippy-map-globe": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/three-slippy-map-globe/-/three-slippy-map-globe-1.0.6.tgz", - "integrity": "sha512-PCUR+X+1kYFYtQBf8+b/ct8xBHtnkeu7FItRYBeFxyIe3ksnGuLi0H9RAxAfVSSUsZVbKIKNz9q1atEjynrrkg==", - "license": "MIT", - "dependencies": { - "d3-geo": "1 - 3", - "d3-octree": "^1.1", - "d3-scale": "1 - 4" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "three": ">=0.154" - } - }, - "node_modules/three-stdlib": { - "version": "2.36.1", - "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.36.1.tgz", - "integrity": "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", - "license": "MIT" - }, "node_modules/tinyglobby": { "version": "0.2.16", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", @@ -22951,39 +21885,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/troika-three-text": { - "version": "0.52.4", - "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.4.tgz", - "integrity": "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bidi-js": "^1.0.2", - "troika-three-utils": "^0.52.4", - "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.4", - "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.4.tgz", - "integrity": "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" - }, "node_modules/trough": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", @@ -23199,16 +22100,6 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "zustand": "^4.3.2" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -23774,16 +22665,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/uuid": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", @@ -23939,19 +22820,6 @@ "integrity": "sha512-a19+DzlT6Kp9/UI+mF9XQopeZ+n2ussjhxHJ4/pmIGge9ijCDz7Gn93mNnjpZAk95T4Tae8iHZ6sSf869txqiQ==", "license": "MPL-2.0" }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "license": "MIT" - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/package.json b/package.json index 01262c4b..1fe0ce2e 100644 --- a/package.json +++ b/package.json @@ -60,8 +60,6 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", - "@react-three/drei": "^9.112.0", - "@react-three/fiber": "^8.17.7", "@t3-oss/env-nextjs": "^0.10.1", "@tanstack/react-query": "^5.50.0", "@trpc/client": "^11.17.0", @@ -75,7 +73,6 @@ "cors": "^2.8.5", "dexie": "^4.0.11", "formidable": "^3.5.4", - "framer-motion": "^11.11.9", "geist": "^1.3.0", "idb-keyval": "^6.2.1", "jsonld": "^9.0.0", @@ -96,8 +93,6 @@ "swagger-ui-react": "^5.22.0", "tailwind-merge": "^2.5.2", "tailwindcss-animate": "^1.0.7", - "three": "^0.168.0", - "three-globe": "^2.31.1", "uuid": "^11.1.0", "zod": "^3.23.8", "zustand": "^4.5.5" @@ -108,8 +103,6 @@ "@jest/globals": "^30.1.2", "@next/bundle-analyzer": "^16.2.6", "@playwright/test": "1.60.0", - "@react-three/drei": "^9.122.0", - "@react-three/fiber": "^8.17.7", "@types/cors": "^2.8.18", "@types/eslint": "^8.56.10", "@types/formidable": "^3.5.1", @@ -144,7 +137,6 @@ "ip": "^2.0.1", "rimraf": "^6.1.2", "glob": "^11.0.0", - "three-mesh-bvh": "^0.9.3", "node-domexception": "^2.0.2", "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", diff --git a/src/components/common/overall-layout/layout.tsx b/src/components/common/overall-layout/layout.tsx index af790ac3..bdc873a2 100644 --- a/src/components/common/overall-layout/layout.tsx +++ b/src/components/common/overall-layout/layout.tsx @@ -6,8 +6,6 @@ import { publicRoutes } from "@/data/public-routes"; import { api } from "@/utils/api"; import useUser from "@/hooks/useUser"; import { useUserStore } from "@/lib/zustand/user"; -import { useAppearanceStore } from "@/lib/zustand/appearance"; -import { Background } from "@/components/ui/background"; import { normalizeAddressToBech32 } from "@/utils/addressCompatibility"; import useAppWallet from "@/hooks/useAppWallet"; import useUTXOS from "@/hooks/useUTXOS"; @@ -128,14 +126,6 @@ export default function RootLayout({ const [hasCheckedSession, setHasCheckedSession] = useState(false); // Prevent duplicate checks const [showPostAuthLoading, setShowPostAuthLoading] = useState(false); // Show loading after authorization - // Animated background preference (persisted to localStorage). Gate render on a - // mounted flag so the server (which can't read localStorage) and the first - // client paint agree, avoiding a hydration mismatch. - const backgroundEnabled = useAppearanceStore((s) => s.backgroundEnabled); - const backgroundPreset = useAppearanceStore((s) => s.backgroundPreset); - const [appearanceMounted, setAppearanceMounted] = useState(false); - useEffect(() => setAppearanceMounted(true), []); - // Use WalletState for connection check const connected = String(walletState) === String(WalletState.CONNECTED); const anyWalletConnected = connected || isUtxosEnabled; @@ -602,18 +592,6 @@ export default function RootLayout({ return (
- {/* Animated app background (on by default; toggle in profile → Appearance). - Renders on every route including the homepage, behind the homepage's - own hero background. */} - {appearanceMounted && backgroundEnabled && ( -
- -
- )} {/* Skip link for keyboard users */} import("../../ui/globe").then((m) => m.World), { - ssr: false, -}); - -const globeConfig = { - pointSize: 4, - globeColor: "#062056", - showAtmosphere: true, - atmosphereColor: "#FFFFFF", - atmosphereAltitude: 0.1, - emissive: "#062056", - emissiveIntensity: 0.1, - shininess: 0.9, - polygonColor: "rgba(255,255,255,0.7)", - ambientLight: "#38bdf8", - directionalLeftLight: "#ffffff", - directionalTopLight: "#ffffff", - pointLight: "#ffffff", - arcTime: 1000, - arcLength: 0.9, - rings: 1, - maxRings: 3, - initialPosition: { lat: 22.3193, lng: 114.1694 }, - autoRotate: true, - autoRotateSpeed: 0.5, -}; -const colors = ["#06b6d4", "#3b82f6", "#6366f1"]; -const sampleArcs = [ - { - order: 1, - startLat: -19.885592, - startLng: -43.951191, - endLat: -22.9068, - endLng: -43.1729, - arcAlt: 0.1, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 1, - startLat: 28.6139, - startLng: 77.209, - endLat: 3.139, - endLng: 101.6869, - arcAlt: 0.2, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 1, - startLat: -19.885592, - startLng: -43.951191, - endLat: -1.303396, - endLng: 36.852443, - arcAlt: 0.5, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 2, - startLat: 1.3521, - startLng: 103.8198, - endLat: 35.6762, - endLng: 139.6503, - arcAlt: 0.2, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 2, - startLat: 51.5072, - startLng: -0.1276, - endLat: 3.139, - endLng: 101.6869, - arcAlt: 0.3, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 2, - startLat: -15.785493, - startLng: -47.909029, - endLat: 36.162809, - endLng: -115.119411, - arcAlt: 0.3, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 3, - startLat: -33.8688, - startLng: 151.2093, - endLat: 22.3193, - endLng: 114.1694, - arcAlt: 0.3, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 3, - startLat: 21.3099, - startLng: -157.8581, - endLat: 40.7128, - endLng: -74.006, - arcAlt: 0.3, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 3, - startLat: -6.2088, - startLng: 106.8456, - endLat: 51.5072, - endLng: -0.1276, - arcAlt: 0.3, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 4, - startLat: 11.986597, - startLng: 8.571831, - endLat: -15.595412, - endLng: -56.05918, - arcAlt: 0.5, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 4, - startLat: -34.6037, - startLng: -58.3816, - endLat: 22.3193, - endLng: 114.1694, - arcAlt: 0.7, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 4, - startLat: 51.5072, - startLng: -0.1276, - endLat: 48.8566, - endLng: -2.3522, - arcAlt: 0.1, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 5, - startLat: 14.5995, - startLng: 120.9842, - endLat: 51.5072, - endLng: -0.1276, - arcAlt: 0.3, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 5, - startLat: 1.3521, - startLng: 103.8198, - endLat: -33.8688, - endLng: 151.2093, - arcAlt: 0.2, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 5, - startLat: 34.0522, - startLng: -118.2437, - endLat: 48.8566, - endLng: -2.3522, - arcAlt: 0.2, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 6, - startLat: -15.432563, - startLng: 28.315853, - endLat: 1.094136, - endLng: -63.34546, - arcAlt: 0.7, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 6, - startLat: 37.5665, - startLng: 126.978, - endLat: 35.6762, - endLng: 139.6503, - arcAlt: 0.1, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 6, - startLat: 22.3193, - startLng: 114.1694, - endLat: 51.5072, - endLng: -0.1276, - arcAlt: 0.3, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 7, - startLat: -19.885592, - startLng: -43.951191, - endLat: -15.595412, - endLng: -56.05918, - arcAlt: 0.1, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 7, - startLat: 48.8566, - startLng: -2.3522, - endLat: 52.52, - endLng: 13.405, - arcAlt: 0.1, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 7, - startLat: 52.52, - startLng: 13.405, - endLat: 34.0522, - endLng: -118.2437, - arcAlt: 0.2, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 8, - startLat: -8.833221, - startLng: 13.264837, - endLat: -33.936138, - endLng: 18.436529, - arcAlt: 0.2, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 8, - startLat: 49.2827, - startLng: -123.1207, - endLat: 52.3676, - endLng: 4.9041, - arcAlt: 0.2, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 8, - startLat: 1.3521, - startLng: 103.8198, - endLat: 40.7128, - endLng: -74.006, - arcAlt: 0.5, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 9, - startLat: 51.5072, - startLng: -0.1276, - endLat: 34.0522, - endLng: -118.2437, - arcAlt: 0.2, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 9, - startLat: 22.3193, - startLng: 114.1694, - endLat: -22.9068, - endLng: -43.1729, - arcAlt: 0.7, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 9, - startLat: 1.3521, - startLng: 103.8198, - endLat: -34.6037, - endLng: -58.3816, - arcAlt: 0.5, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 10, - startLat: -22.9068, - startLng: -43.1729, - endLat: 28.6139, - endLng: 77.209, - arcAlt: 0.7, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 10, - startLat: 34.0522, - startLng: -118.2437, - endLat: 31.2304, - endLng: 121.4737, - arcAlt: 0.3, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 10, - startLat: -6.2088, - startLng: 106.8456, - endLat: 52.3676, - endLng: 4.9041, - arcAlt: 0.3, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 11, - startLat: 41.9028, - startLng: 12.4964, - endLat: 34.0522, - endLng: -118.2437, - arcAlt: 0.2, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 11, - startLat: -6.2088, - startLng: 106.8456, - endLat: 31.2304, - endLng: 121.4737, - arcAlt: 0.2, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 11, - startLat: 22.3193, - startLng: 114.1694, - endLat: 1.3521, - endLng: 103.8198, - arcAlt: 0.2, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 12, - startLat: 34.0522, - startLng: -118.2437, - endLat: 37.7749, - endLng: -122.4194, - arcAlt: 0.1, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 12, - startLat: 35.6762, - startLng: 139.6503, - endLat: 22.3193, - endLng: 114.1694, - arcAlt: 0.2, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 12, - startLat: 22.3193, - startLng: 114.1694, - endLat: 34.0522, - endLng: -118.2437, - arcAlt: 0.3, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 13, - startLat: 52.52, - startLng: 13.405, - endLat: 22.3193, - endLng: 114.1694, - arcAlt: 0.3, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 13, - startLat: 11.986597, - startLng: 8.571831, - endLat: 35.6762, - endLng: 139.6503, - arcAlt: 0.3, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 13, - startLat: -22.9068, - startLng: -43.1729, - endLat: -34.6037, - endLng: -58.3816, - arcAlt: 0.1, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, - { - order: 14, - startLat: -33.936138, - startLng: 18.436529, - endLat: 21.395643, - endLng: 39.883798, - arcAlt: 0.3, - color: colors[Math.floor(Math.random() * (colors.length - 1))], - }, -]; - -export default function Globe() { - const [live, setLive] = useState(false); - useEffect(() => { - setLive(true); - }, []); - return ( - <> -
-
- {/* @ts-ignore */} - {live && } -
-
- - ); -} diff --git a/src/components/pages/homepage/index.tsx b/src/components/pages/homepage/index.tsx index fb90ea85..8671fd65 100644 --- a/src/components/pages/homepage/index.tsx +++ b/src/components/pages/homepage/index.tsx @@ -1,9 +1,6 @@ import ConnectWallet from "@/components/common/cardano-objects/connect-wallet"; import { Button } from "@/components/ui/button"; import { Separator } from "@/components/ui/separator"; -import { Background } from "@/components/ui/background"; -import { useAppearanceStore } from "@/lib/zustand/appearance"; -import { MarbleField } from "@/components/ui/marble-field"; import { FeatureIcon } from "@/components/pages/homepage/feature-icons"; import { MultisigSigningExplainer } from "@/components/pages/homepage/multisig-explainer"; import Link from "next/link"; @@ -13,7 +10,7 @@ import { api } from "@/utils/api"; import CardUI from "@/components/ui/card-content"; import RowLabelInfo from "@/components/common/row-label-info"; import Image from "next/image"; -import { useEffect, useRef, useState } from "react"; +import { useEffect, useState } from "react"; import { Database, Bot, Code, Download, Check, Sparkles, Plug } from "lucide-react"; import { Reveal } from "@/components/ui/reveal"; import { Typewriter } from "@/components/ui/typewriter"; @@ -151,74 +148,6 @@ export function PageHomepage() { const pathIsNewWallet = router.pathname === "/wallets/invite/[id]"; const newWalletId = pathIsNewWallet ? (router.query.id as string) : undefined; - // Scroll-driven fade of the hero background layers. We write opacity straight - // to the layer DOM nodes via refs inside a requestAnimationFrame callback, so - // scrolling never triggers a React re-render of this (large) page — the old - // setState-on-every-scroll approach re-rendered the whole tree each frame, - // which is what made scrolling choppy. - const auroraRef = useRef(null); - const meshRef = useRef(null); - - // The homepage hero background follows the same appearance setting as the rest - // of the app. Default-show until mounted so the SSR markup and first client - // paint agree (avoids a hydration mismatch on the persisted preference). - const backgroundEnabled = useAppearanceStore((s) => s.backgroundEnabled); - const backgroundPreset = useAppearanceStore((s) => s.backgroundPreset); - const [appearanceMounted, setAppearanceMounted] = useState(false); - useEffect(() => setAppearanceMounted(true), []); - const heroBackgroundOn = !appearanceMounted || backgroundEnabled; - const heroPreset = appearanceMounted ? backgroundPreset : "aurora"; - - useEffect(() => { - if (!heroBackgroundOn) return; - const mainElement = document.querySelector("main"); - if (!mainElement) return; - - const root = document.documentElement; - let raf = 0; - let hideTimer = 0; - const apply = () => { - raf = 0; - const y = mainElement.scrollTop; - // Aurora fades 500→1500px; the marble mesh starts a touch more present. - const aurora = y < 500 ? 0.35 : y > 1500 ? 0 : 0.35 * (1 - (y - 500) / 1000); - const mesh = y < 500 ? 0.9 : y > 1500 ? 0 : 0.9 * (1 - (y - 500) / 1000); - if (auroraRef.current) auroraRef.current.style.opacity = String(aurora); - if (meshRef.current) meshRef.current.style.opacity = String(mesh); - - // Once the background is fully faded out (invisible), stop animating it a - // beat later to save GPU — it keeps running the whole time it's visible - // or fading, and resumes instantly the moment it fades back in. - if (aurora === 0 && mesh === 0) { - if (!hideTimer && !root.hasAttribute("data-bg-hidden")) { - hideTimer = window.setTimeout(() => { - hideTimer = 0; - root.setAttribute("data-bg-hidden", ""); - }, 800); - } - } else { - if (hideTimer) { - clearTimeout(hideTimer); - hideTimer = 0; - } - root.removeAttribute("data-bg-hidden"); - } - }; - const onScroll = () => { - if (raf) return; - raf = requestAnimationFrame(apply); - }; - - apply(); - mainElement.addEventListener("scroll", onScroll, { passive: true }); - return () => { - mainElement.removeEventListener("scroll", onScroll); - if (raf) cancelAnimationFrame(raf); - if (hideTimer) clearTimeout(hideTimer); - root.removeAttribute("data-bg-hidden"); - }; - }, [heroBackgroundOn]); - const { data: newWallet } = api.wallet.getNewWallet.useQuery( { walletId: newWalletId! }, { @@ -228,25 +157,6 @@ export function PageHomepage() { return (
- {heroBackgroundOn && ( - <> - {/* Aurora Background — opacity is driven per-frame via the rAF scroll - effect above (ref), not React state, so scrolling stays smooth. */} -
- -
- - {/* Marble swirls under a soft wash, above the aurora. The wash is a - plain translucent fill (no backdrop-filter): blurring the live - canvas every frame was a major scroll cost, and the marble is now - rendered low-res, so it already reads soft. */} -
- -
-
- - )} - {/* Hero Section */}
diff --git a/src/components/pages/homepage/wallets/new-wallet-flow/shared/GlassMorphismPageWrapper.tsx b/src/components/pages/homepage/wallets/new-wallet-flow/shared/GlassMorphismPageWrapper.tsx index 7114507c..2a689cea 100644 --- a/src/components/pages/homepage/wallets/new-wallet-flow/shared/GlassMorphismPageWrapper.tsx +++ b/src/components/pages/homepage/wallets/new-wallet-flow/shared/GlassMorphismPageWrapper.tsx @@ -1,90 +1,32 @@ /** * Glass Morphism Page Wrapper - * Shared wrapper for all new-wallet-flow pages with glass effect and globe background - * Eliminates 70+ lines of duplicate code per page + * Shared wrapper for all new-wallet-flow pages. Applies the glass-effect body + * class the flow's styles hang off; the plain theme background replaces the + * old GPU-rendered globe backdrop. */ import React from 'react'; -import dynamic from 'next/dynamic'; - -// Lazy load Globe -const Globe = dynamic(() => import('@/components/pages/homepage/globe'), { - ssr: false, - loading: () => null -}); interface GlassMorphismPageWrapperProps { children: React.ReactNode; className?: string; } -export default function GlassMorphismPageWrapper({ - children, - className = '' +export default function GlassMorphismPageWrapper({ + children, + className = '' }: GlassMorphismPageWrapperProps) { - const [isDarkMode, setIsDarkMode] = React.useState(false); - - // Add subtle glass effect styles React.useEffect(() => { // Add glass class to body for this page only document.body.classList.add('add-wallet-glass-page'); - - const updateLocalTheme = () => { - const isDark = document.documentElement.classList.contains('dark'); - setIsDarkMode(isDark); - }; - - // Initial check - updateLocalTheme(); - - // Listen for theme changes via MutationObserver - const observer = new MutationObserver(updateLocalTheme); - observer.observe(document.documentElement, { - attributes: true, - attributeFilter: ['class'] - }); - return () => { - // Clean up when leaving the page document.body.classList.remove('add-wallet-glass-page'); - observer.disconnect(); }; }, []); return ( - <> - {/* Globe background - centered and always visible */} -
-
- -
-
- - {/* Page content */} -
- {children} -
- +
+ {children} +
); -} \ No newline at end of file +} diff --git a/src/components/ui/background.tsx b/src/components/ui/background.tsx deleted file mode 100644 index 32e4d41a..00000000 --- a/src/components/ui/background.tsx +++ /dev/null @@ -1,275 +0,0 @@ -import * as React from "react" -import { cva, type VariantProps } from "class-variance-authority" -import { cn } from "@/lib/utils" -import { useReducedMotion } from "@/hooks/useReducedMotion" - -const backgroundVariants = cva( - "absolute inset-0", - { - variants: { - variant: { - aurora: "", - "aurora-static": "", - }, - }, - defaultVariants: { - variant: "aurora", - }, - } -) - -export interface BackgroundProps - extends React.HTMLAttributes, - VariantProps { - /** - * Show radial gradient mask for center focus - * @default true - */ - showRadialGradient?: boolean - /** - * Colour theme for the orbs / sheen / bloom. - * @default "aurora" - */ - preset?: BackgroundPreset -} - -// Two grayscale aurora gradients at different angles. Animating them in opposite -// directions at different speeds produces a layered, parallax shimmer. -const LAYER_ONE = `repeating-linear-gradient( - 100deg, - hsl(240 10% 98% / 0.40) 10%, - hsl(240 10% 50% / 0.50) 15%, - hsl(240 10% 85% / 0.40) 20%, - hsl(240 10% 40% / 0.45) 25%, - hsl(240 10% 98% / 0.40) 30% -)` - -const LAYER_TWO = `repeating-linear-gradient( - 72deg, - hsl(240 8% 99% / 0.30) 6%, - hsl(240 9% 62% / 0.42) 13%, - hsl(240 8% 82% / 0.30) 19%, - hsl(240 10% 36% / 0.42) 26%, - hsl(240 8% 99% / 0.30) 32% -)` - -// Coloured glow orbs. Kept restrained (cool blue / violet / teal at low alpha) -// so the enterprise-neutral base reads "alive" rather than loud, especially -// once the homepage fades the whole layer to ~0.55 opacity. -const ORBS = [ - { - key: "a", - position: "-left-[8%] top-[2%] h-[48%] w-[48%]", - blur: "blur-[80px]", - anim: "animate-aurora-float-1", - color: "hsl(222 70% 66% / 0.40)", - depth: 30, - }, - { - key: "b", - position: "right-[2%] top-[16%] h-[44%] w-[44%]", - blur: "blur-[90px]", - anim: "animate-aurora-float-2", - color: "hsl(268 55% 68% / 0.36)", - depth: 46, - }, - { - key: "c", - position: "bottom-[-8%] left-[26%] h-[54%] w-[54%]", - blur: "blur-[100px]", - anim: "animate-aurora-float-3", - color: "hsl(190 65% 64% / 0.34)", - depth: 22, - }, -] as const - -// Selectable colour themes for the aurora. Each supplies the three orb glows, -// the rotating conic sheen, and the top bloom; the grayscale base layers are -// shared. `BACKGROUND_PRESETS` is the source of truth for the settings picker. -export const BACKGROUND_PRESETS = [ - { id: "aurora", label: "Aurora" }, - { id: "sunset", label: "Sunset" }, - { id: "ocean", label: "Ocean" }, - { id: "nebula", label: "Nebula" }, - { id: "mono", label: "Monochrome" }, -] as const - -export type BackgroundPreset = (typeof BACKGROUND_PRESETS)[number]["id"] - -const PRESET_COLORS: Record< - BackgroundPreset, - { orbs: readonly [string, string, string]; sheen: string; bloom: string } -> = { - aurora: { - orbs: ["hsl(222 70% 66% / 0.40)", "hsl(268 55% 68% / 0.36)", "hsl(190 65% 64% / 0.34)"], - sheen: - "conic-gradient(from 0deg at 50% 50%, transparent 0deg, hsl(222 60% 70% / 0.22) 60deg, transparent 150deg, hsl(275 55% 70% / 0.20) 240deg, transparent 330deg)", - bloom: "radial-gradient(50% 60% at 50% 0%, hsl(225 30% 90% / 0.35), transparent 70%)", - }, - sunset: { - orbs: ["hsl(28 90% 64% / 0.42)", "hsl(344 75% 66% / 0.38)", "hsl(45 92% 62% / 0.34)"], - sheen: - "conic-gradient(from 0deg at 50% 50%, transparent 0deg, hsl(28 80% 70% / 0.24) 60deg, transparent 150deg, hsl(344 70% 70% / 0.20) 240deg, transparent 330deg)", - bloom: "radial-gradient(50% 60% at 50% 0%, hsl(35 60% 88% / 0.38), transparent 70%)", - }, - ocean: { - orbs: ["hsl(192 80% 60% / 0.40)", "hsl(210 75% 62% / 0.38)", "hsl(168 65% 58% / 0.34)"], - sheen: - "conic-gradient(from 0deg at 50% 50%, transparent 0deg, hsl(192 70% 66% / 0.24) 60deg, transparent 150deg, hsl(210 65% 66% / 0.20) 240deg, transparent 330deg)", - bloom: "radial-gradient(50% 60% at 50% 0%, hsl(195 45% 88% / 0.36), transparent 70%)", - }, - nebula: { - orbs: ["hsl(270 70% 66% / 0.42)", "hsl(320 65% 66% / 0.38)", "hsl(245 70% 66% / 0.34)"], - sheen: - "conic-gradient(from 0deg at 50% 50%, transparent 0deg, hsl(270 65% 70% / 0.24) 60deg, transparent 150deg, hsl(320 60% 70% / 0.20) 240deg, transparent 330deg)", - bloom: "radial-gradient(50% 60% at 50% 0%, hsl(275 40% 88% / 0.38), transparent 70%)", - }, - mono: { - orbs: ["hsl(240 6% 60% / 0.34)", "hsl(240 5% 72% / 0.30)", "hsl(240 6% 46% / 0.30)"], - sheen: - "conic-gradient(from 0deg at 50% 50%, transparent 0deg, hsl(240 8% 72% / 0.18) 60deg, transparent 150deg, hsl(240 6% 60% / 0.16) 240deg, transparent 330deg)", - bloom: "radial-gradient(50% 60% at 50% 0%, hsl(240 10% 90% / 0.30), transparent 70%)", - }, -} - -/** - * Background Component - * - * Animated, layered aurora background — coloured drifting orbs + a rotating - * conic sheen over two counter-moving grayscale gradients, with a subtle - * mouse-reactive parallax. Honors `prefers-reduced-motion` (the `.animate-*` - * utilities disable motion, and pointer parallax is skipped). - * - * @example - * ```tsx - *
- * - *
- * ``` - */ -const Background = React.forwardRef( - ({ className, variant, preset = "aurora", showRadialGradient = true, children, ...props }, ref) => { - const isAnimated = variant !== "aurora-static" - const colors = PRESET_COLORS[preset] ?? PRESET_COLORS.aurora - const reduced = useReducedMotion() - const rootRef = React.useRef(null) - - React.useImperativeHandle(ref, () => rootRef.current as HTMLDivElement) - - // Mouse-reactive parallax: publish the normalized cursor offset (-1..1) as - // CSS variables the orb/sheen layers read. rAF-throttled and pointer-passive, - // so it's cheap; disabled for reduced-motion users. - React.useEffect(() => { - if (!isAnimated || reduced) return - const el = rootRef.current - if (!el) return - let raf = 0 - const onMove = (e: PointerEvent) => { - cancelAnimationFrame(raf) - raf = requestAnimationFrame(() => { - const px = (e.clientX / window.innerWidth - 0.5) * 2 - const py = (e.clientY / window.innerHeight - 0.5) * 2 - el.style.setProperty("--aurora-px", px.toFixed(3)) - el.style.setProperty("--aurora-py", py.toFixed(3)) - }) - } - window.addEventListener("pointermove", onMove, { passive: true }) - return () => { - window.removeEventListener("pointermove", onMove) - cancelAnimationFrame(raf) - } - }, [isAnimated, reduced]) - - return ( -
- {/* Layer 1 — primary grayscale aurora. Static: animating background- - position here repaints a 300%-size, 40px-blurred surface every frame - (very expensive). Movement/life comes from the transform-based orbs - and sheen below, which composite cheaply. */} -
- - {/* Layer 2 — counter-positioned grayscale shimmer (also static; dropped - mix-blend-soft-light, which is costly to composite). */} -
- - {/* Rotating conic sheen — a slow "scanning light" pass in cool tones. */} -
- - {/* Coloured drifting orbs, on a mouse-parallax layer for depth. */} -
- {ORBS.map((orb, i) => ( -
- ))} -
- - {/* Soft top bloom — a gentle light source breathing in and out */} -
- - {/* Radial vignette mask for center focus */} - {showRadialGradient && ( -
- )} - - {/* Children content */} - {children} -
- ) - } -) -Background.displayName = "Background" - -export { Background, backgroundVariants } diff --git a/src/components/ui/globe.tsx b/src/components/ui/globe.tsx deleted file mode 100644 index 28e7ce3d..00000000 --- a/src/components/ui/globe.tsx +++ /dev/null @@ -1,327 +0,0 @@ -import { useEffect, useRef, useState } from "react"; -import { Color, Scene, Fog, PerspectiveCamera, Vector3 } from "three"; -import ThreeGlobe from "three-globe"; -import { useThree, Object3DNode, Canvas, extend } from "@react-three/fiber"; -import { OrbitControls } from "@react-three/drei"; -import countries from "@/data/globe.json"; -declare module "@react-three/fiber" { - interface ThreeElements { - threeGlobe: Object3DNode; - } -} - -extend({ ThreeGlobe }); - -const RING_PROPAGATION_SPEED = 3; -const aspect = 1.2; -const cameraZ = 300; - -type Position = { - order: number; - startLat: number; - startLng: number; - endLat: number; - endLng: number; - arcAlt: number; - color: string; -}; - -export type GlobeConfig = { - pointSize?: number; - globeColor?: string; - showAtmosphere?: boolean; - atmosphereColor?: string; - atmosphereAltitude?: number; - emissive?: string; - emissiveIntensity?: number; - shininess?: number; - polygonColor?: string; - ambientLight?: string; - directionalLeftLight?: string; - directionalTopLight?: string; - pointLight?: string; - arcTime?: number; - arcLength?: number; - rings?: number; - maxRings?: number; - initialPosition?: { - lat: number; - lng: number; - }; - autoRotate?: boolean; - autoRotateSpeed?: number; -}; - -interface WorldProps { - globeConfig: GlobeConfig; - data: Position[]; -} - -let numbersOfRings = [0]; - -export function Globe({ globeConfig, data }: WorldProps) { - const [globeData, setGlobeData] = useState< - | { - size: number; - order: number; - color: (t: number) => string; - lat: number; - lng: number; - }[] - | null - >(null); - - const globeRef = useRef(null); - - const defaultProps = { - pointSize: 1, - atmosphereColor: "#ffffff", - showAtmosphere: true, - atmosphereAltitude: 0.1, - polygonColor: "rgba(255,255,255,0.7)", - globeColor: "#1d072e", - emissive: "#000000", - emissiveIntensity: 0.1, - shininess: 0.9, - arcTime: 2000, - arcLength: 0.9, - rings: 1, - maxRings: 3, - ...globeConfig, - }; - - useEffect(() => { - if (globeRef.current) { - _buildData(); - _buildMaterial(); - } - }, [globeRef.current, globeConfig]); - - const _buildMaterial = () => { - if (!globeRef.current) return; - - const globeMaterial = globeRef.current.globeMaterial() as unknown as { - color: Color; - emissive: Color; - emissiveIntensity: number; - shininess: number; - }; - globeMaterial.color = new Color(globeConfig.globeColor || defaultProps.globeColor); - globeMaterial.emissive = new Color(globeConfig.emissive || defaultProps.emissive); - globeMaterial.emissiveIntensity = globeConfig.emissiveIntensity ?? defaultProps.emissiveIntensity; - globeMaterial.shininess = globeConfig.shininess ?? defaultProps.shininess; - - // Update atmosphere if globe ref is available - if (globeRef.current) { - globeRef.current - .showAtmosphere(globeConfig.showAtmosphere ?? defaultProps.showAtmosphere) - .atmosphereColor(globeConfig.atmosphereColor || defaultProps.atmosphereColor) - .atmosphereAltitude(globeConfig.atmosphereAltitude ?? defaultProps.atmosphereAltitude); - } - }; - - const _buildData = () => { - const arcs = data; - const points = []; - for (let i = 0; i < arcs.length; i++) { - const arc = arcs[i]; - if (arc) { - const rgb = hexToRgb(arc.color) as { r: number; g: number; b: number }; - points.push({ - size: defaultProps.pointSize, - order: arc.order, - color: (t: number) => `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${1 - t})`, - lat: arc.startLat, - lng: arc.startLng, - }); - points.push({ - size: defaultProps.pointSize, - order: arc.order, - color: (t: number) => `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${1 - t})`, - lat: arc.endLat, - lng: arc.endLng, - }); - } - } - - // remove duplicates for same lat and lng - const filteredPoints = points.filter( - (v, i, a) => - a.findIndex((v2) => - ["lat", "lng"].every( - (k) => v2[k as "lat" | "lng"] === v[k as "lat" | "lng"], - ), - ) === i, - ); - - setGlobeData(filteredPoints); - }; - - useEffect(() => { - if (globeRef.current && globeData) { - globeRef.current - .hexPolygonsData(countries.features) - .hexPolygonResolution(3) - .hexPolygonMargin(0.7) - .showAtmosphere(defaultProps.showAtmosphere) - .atmosphereColor(defaultProps.atmosphereColor) - .atmosphereAltitude(defaultProps.atmosphereAltitude) - .hexPolygonColor((e) => { - return defaultProps.polygonColor; - }); - startAnimation(); - } - }, [globeData]); - - const startAnimation = () => { - if (!globeRef.current || !globeData) return; - - globeRef.current - .arcsData(data) - .arcStartLat((d) => (d as { startLat: number }).startLat * 1) - .arcStartLng((d) => (d as { startLng: number }).startLng * 1) - .arcEndLat((d) => (d as { endLat: number }).endLat * 1) - .arcEndLng((d) => (d as { endLng: number }).endLng * 1) - .arcColor((e: any) => (e as { color: string }).color) - .arcAltitude((e) => { - return (e as { arcAlt: number }).arcAlt * 1; - }) - .arcStroke(() => { - // Enhanced stroke widths for better visibility - return [0.4, 0.35, 0.38][Math.round(Math.random() * 2)] || 0.35; - }) - .arcDashLength(defaultProps.arcLength) - .arcDashInitialGap((e) => (e as { order: number }).order * 1) - .arcDashGap(15) - .arcDashAnimateTime((e) => defaultProps.arcTime); - - globeRef.current - .pointsData(data) - .pointColor((e) => (e as { color: string }).color) - .pointsMerge(true) - .pointAltitude(0.0) - .pointRadius(globeConfig.pointSize || defaultProps.pointSize); - - globeRef.current - .ringsData([]) - .ringColor((e: any) => (t: any) => e.color(t)) - .ringMaxRadius(defaultProps.maxRings) - .ringPropagationSpeed(RING_PROPAGATION_SPEED) - .ringRepeatPeriod( - (defaultProps.arcTime * defaultProps.arcLength) / defaultProps.rings, - ); - }; - - useEffect(() => { - if (!globeRef.current || !globeData) return; - - const interval = setInterval(() => { - if (!globeRef.current || !globeData) return; - numbersOfRings = genRandomNumbers( - 0, - data.length, - Math.floor((data.length * 4) / 5), - ); - - globeRef.current.ringsData( - globeData.filter((d, i) => numbersOfRings.includes(i)), - ); - }, 2000); - - return () => { - clearInterval(interval); - }; - }, [globeRef.current, globeData]); - - return ( - <> - - - ); -} - -export function WebGLRendererConfig() { - const { gl, size } = useThree(); - - useEffect(() => { - gl.setPixelRatio(window.devicePixelRatio); - gl.setSize(size.width, size.height); - gl.setClearColor(0xffaaff, 0); - }, []); - - return null; -} - -export function World(props: WorldProps) { - const { globeConfig } = props; - const scene = new Scene(); - // Enhanced fog for better depth perception - scene.fog = new Fog(0x000000, 400, 2000); - return ( - - - - - - - - - - ); -} - -export function hexToRgb(hex: string) { - var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; - hex = hex.replace(shorthandRegex, function (m, r, g, b) { - return r + r + g + g + b + b; - }); - - var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); - return result - ? { - r: result[1] ? parseInt(result[1], 16) : 0, - g: parseInt(result[2] ?? "0", 16), - b: parseInt(result[3] ?? "0", 16), - } - : null; -} - -export function genRandomNumbers(min: number, max: number, count: number) { - const arr = []; - while (arr.length < count) { - const r = Math.floor(Math.random() * (max - min)) + min; - if (arr.indexOf(r) === -1) arr.push(r); - } - - return arr; -} diff --git a/src/components/ui/marble-field.tsx b/src/components/ui/marble-field.tsx deleted file mode 100644 index c2408ef7..00000000 --- a/src/components/ui/marble-field.tsx +++ /dev/null @@ -1,238 +0,0 @@ -import { useEffect, useRef } from "react"; -import { cn } from "@/lib/utils"; -import { useReducedMotion } from "@/hooks/useReducedMotion"; - -/** - * Marble background — a WebGL fragment shader that domain-warps fractal noise - * (iq's warp technique) into smooth swirling veins, like the inside of a glass - * marble. Slowly animated and gently swelled around the cursor. Cool palette, - * theme-aware, and reduced-motion-safe (renders a single still frame). - * - * Raw WebGL (no three.js) so it stays light. If WebGL/compile fails it simply - * renders nothing — the aurora underneath still shows. - */ - -const VERT = ` -attribute vec2 p; -void main() { gl_Position = vec4(p, 0.0, 1.0); } -`; - -const FRAG = ` -precision highp float; -uniform vec2 u_res; -uniform float u_time; -uniform vec2 u_mouse; -uniform float u_dark; - -float hash(vec2 p) { - p = fract(p * vec2(123.34, 345.45)); - p += dot(p, p + 34.345); - return fract(p.x * p.y); -} -float noise(vec2 p) { - vec2 i = floor(p); - vec2 f = fract(p); - vec2 u = f * f * (3.0 - 2.0 * f); - float a = hash(i); - float b = hash(i + vec2(1.0, 0.0)); - float c = hash(i + vec2(0.0, 1.0)); - float d = hash(i + vec2(1.0, 1.0)); - return mix(mix(a, b, u.x), mix(c, d, u.x), u.y); -} -float fbm(vec2 p) { - float v = 0.0; - float a = 0.5; - for (int i = 0; i < 5; i++) { - v += a * noise(p); - p = p * 2.0 + vec2(13.7, 7.3); - a *= 0.5; - } - return v; -} -void main() { - vec2 uv = gl_FragCoord.xy / u_res.xy; - float aspect = u_res.x / u_res.y; - vec2 p = vec2(uv.x * aspect, uv.y) * 2.2; - p.y -= u_time * 0.038; // slow upward drift of the marble and its veins - float t = u_time * 0.032; - - vec2 m = u_mouse / u_res.xy; - float md = distance(vec2(uv.x * aspect, uv.y), vec2(m.x * aspect, m.y)); - - // Double domain warp → marble swirl. - vec2 q = vec2(fbm(p + t), fbm(p + vec2(5.2, 1.3) - t)); - vec2 r = vec2( - fbm(p + 3.5 * q + vec2(1.7, 9.2) + 0.5 * t), - fbm(p + 3.5 * q + vec2(8.3, 2.8) - 0.5 * t) - ); - float f = fbm(p + 3.5 * r); - f += 0.07 * exp(-md * 4.5); // cursor gently swells the marble (subtle) - - // Muted, desaturated stone palette (slate / gray-blue / mauve). - vec3 deep = vec3(0.22, 0.24, 0.30); - vec3 blue = vec3(0.44, 0.49, 0.58); - vec3 teal = vec3(0.42, 0.52, 0.54); - vec3 violet = vec3(0.50, 0.47, 0.56); - - // Tighter transition between regions → crisper marble edges. - vec3 col = mix(deep, blue, smoothstep(0.34, 0.62, f)); - col = mix(col, teal, clamp(length(q) * 0.8, 0.0, 1.0)); - col = mix(col, violet, clamp(length(r) * 0.7, 0.0, 1.0)); - - // Keep the background light: wash the base toward off-white first. - if (u_dark < 0.5) { - col = mix(vec3(0.93, 0.94, 0.97), col, 0.34); - } - - // Deeper veins, added after the wash so they stay rich and dark. - float vd = abs(f - 0.5); - vec3 deepVein = (u_dark < 0.5) ? vec3(0.16, 0.19, 0.30) : vec3(0.08, 0.10, 0.18); - col = mix(col, deepVein, smoothstep(0.026, 0.0, vd) * 0.5); - - // Sometimes a thin, sharp vein flares up and pierces the frost. A sparse, - // slowly-drifting field gates where (and when) that happens. - float pierce = smoothstep(0.60, 0.82, fbm(p * 0.45 + vec2(3.0, u_time * 0.012))); - col = mix(col, deepVein, smoothstep(0.008, 0.0, vd) * pierce * 0.9); - - gl_FragColor = vec4(col, 0.95); -} -`; - -export function MarbleField({ className }: { className?: string }) { - const canvasRef = useRef(null); - const reduced = useReducedMotion(); - - useEffect(() => { - const canvas = canvasRef.current; - if (!canvas) return; - const gl = - canvas.getContext("webgl", { alpha: true, antialias: true, premultipliedAlpha: false }) ?? - canvas.getContext("experimental-webgl", { alpha: true }); - if (!gl || !(gl instanceof WebGLRenderingContext)) return; - - const compile = (type: number, src: string) => { - const sh = gl.createShader(type); - if (!sh) return null; - gl.shaderSource(sh, src); - gl.compileShader(sh); - if (!gl.getShaderParameter(sh, gl.COMPILE_STATUS)) { - console.warn("[MarbleField] shader:", gl.getShaderInfoLog(sh)); - return null; - } - return sh; - }; - - const vs = compile(gl.VERTEX_SHADER, VERT); - const fs = compile(gl.FRAGMENT_SHADER, FRAG); - if (!vs || !fs) return; - - const prog = gl.createProgram(); - if (!prog) return; - gl.attachShader(prog, vs); - gl.attachShader(prog, fs); - gl.linkProgram(prog); - if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) { - console.warn("[MarbleField] link:", gl.getProgramInfoLog(prog)); - return; - } - gl.useProgram(prog); - - const buf = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buf); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW); - const loc = gl.getAttribLocation(prog, "p"); - gl.enableVertexAttribArray(loc); - gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0); - - const uRes = gl.getUniformLocation(prog, "u_res"); - const uTime = gl.getUniformLocation(prog, "u_time"); - const uMouse = gl.getUniformLocation(prog, "u_mouse"); - const uDark = gl.getUniformLocation(prog, "u_dark"); - - gl.enable(gl.BLEND); - gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); - - let raf = 0; - let running = true; - const mouse = { x: -9999, y: -9999 }; - - const resize = () => { - // The marble sits under a soft wash at low opacity, so render the backing - // store well below display resolution and let the browser upscale — - // invisibly softer, but a fraction of the fragment-shader cost. - const dpr = Math.min(window.devicePixelRatio || 1, 1); - const scale = 0.6; - canvas.width = Math.max(1, Math.floor(canvas.clientWidth * dpr * scale)); - canvas.height = Math.max(1, Math.floor(canvas.clientHeight * dpr * scale)); - gl.viewport(0, 0, canvas.width, canvas.height); - }; - - const frame = (timeMs: number) => { - gl.uniform2f(uRes, canvas.width, canvas.height); - gl.uniform1f(uTime, timeMs * 0.001); - gl.uniform2f(uMouse, mouse.x, mouse.y); - gl.uniform1f(uDark, document.documentElement.classList.contains("dark") ? 1 : 0); - gl.drawArrays(gl.TRIANGLES, 0, 3); - }; - - // Cap to ~30fps and skip work while the tab is hidden or the background has - // fully faded out (data-bg-hidden, set by the landing once it scrolls past - // the fade). It keeps running during scroll while still visible — at low - // resolution + 30fps its GPU cost coexists fine with scroll compositing. - const FRAME_MS = 1000 / 30; - let last = -Infinity; - const loop = (timeMs: number) => { - if (!running) return; - raf = requestAnimationFrame(loop); - if (document.hidden) return; - if (document.documentElement.hasAttribute("data-bg-hidden")) return; - if (timeMs - last < FRAME_MS) return; - last = timeMs; - frame(timeMs); - }; - - const onMove = (e: PointerEvent) => { - const rect = canvas.getBoundingClientRect(); - const sx = canvas.width / rect.width; - const sy = canvas.height / rect.height; - mouse.x = (e.clientX - rect.left) * sx; - // WebGL origin is bottom-left; flip Y. - mouse.y = canvas.height - (e.clientY - rect.top) * sy; - }; - const onLeave = () => { - mouse.x = -9999; - mouse.y = -9999; - }; - - resize(); - window.addEventListener("resize", resize); - window.addEventListener("pointermove", onMove, { passive: true }); - window.addEventListener("pointerleave", onLeave); - - if (reduced) { - frame(3000); - } else { - raf = requestAnimationFrame(loop); - } - - return () => { - running = false; - cancelAnimationFrame(raf); - window.removeEventListener("resize", resize); - window.removeEventListener("pointermove", onMove); - window.removeEventListener("pointerleave", onLeave); - gl.deleteProgram(prog); - gl.deleteBuffer(buf); - }; - }, [reduced]); - - return ( -