From 27565bd319ee7903795c12c92ad3f96aa3720e66 Mon Sep 17 00:00:00 2001 From: kjerandp Date: Thu, 6 Mar 2025 13:54:13 +0100 Subject: [PATCH 1/2] chore: support React 19 --- package-lock.json | 769 +++++--------- package.json | 24 +- src/components/Annotations/types.ts | 4 +- .../ObservableGroup/ObservableGroup.tsx | 4 +- src/components/Symbol/Symbol.tsx | 6 +- .../BasicTrajectory/BasicTrajectory.tsx | 19 +- .../DepthMarkers/DepthMarkers.stories.tsx | 14 +- .../curve/tube-geometry.stories.tsx | 4 +- src/sdk/managers/CameraManager.ts | 2 +- .../decorators/performance-decorator.tsx | 14 +- .../examples/Wellbore.example.stories.tsx | 32 +- .../examples/Wells.example.stories.tsx | 957 +++++++++--------- tsconfig.json | 2 +- 13 files changed, 804 insertions(+), 1047 deletions(-) diff --git a/package-lock.json b/package-lock.json index bf16205..6d8e25e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "0.1.2-beta", "license": "MIT", "dependencies": { - "@react-three/drei": "^9.121.4", "curve-interpolator": "^3.3.1", "d3-array": "^3.2.4", "d3-axis": "^3.0.0", @@ -25,13 +24,15 @@ "p-queue": "^8.0.1", "proj4": "^2.11.0", "rbush": "^3.0.1", - "react-use-measure": "^2.1.1", + "react-use-measure": "^2.1.7", "use-zustand": "^0.2.0", "zustand": "^5.0.0-rc.2" }, "devDependencies": { "@chromatic-com/storybook": "^3.2.4", "@eslint/js": "^9.17.0", + "@react-three/drei": "^10.0.4", + "@react-three/fiber": "^9.0.4", "@storybook/addon-essentials": "^8.5.5", "@storybook/addon-interactions": "^8.5.5", "@storybook/blocks": "^8.5.5", @@ -51,20 +52,21 @@ "@types/node": "^22.12.0", "@types/proj4": "^2.5.5", "@types/rbush": "^3.0.3", - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", "@typescript-eslint/eslint-plugin": "^8.19.1", "@typescript-eslint/parser": "8.19.1", "@vitejs/plugin-react": "^4.3.4", "@vitest/coverage-v8": "^3.0.7", "@vitest/ui": "^3.0.7", "eslint": "^9.18.0", - "eslint-plugin-react-hooks": "^5.1.0", - "eslint-plugin-react-refresh": "^0.4.18", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", "eslint-plugin-storybook": "^0.11.2", "globals": "^15.14.0", "minimist": "^1.2.8", - "r3f-perf": "^7.2.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", "rimraf": "^6.0.1", "sass": "^1.83.1", "storybook": "^8.5.5", @@ -79,11 +81,9 @@ "vitest": "^3.0.7" }, "peerDependencies": { - "@react-three/fiber": "8", - "comlink": ">=4.4", - "react": ">=18 <19", - "react-dom": ">=18 <19", - "three": ">=0.169" + "@react-three/drei": ">=9", + "@react-three/fiber": ">=8", + "comlink": ">=4.4" } }, "node_modules/@adobe/css-tools": { @@ -355,6 +355,7 @@ "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz", "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", + "dev": true, "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1268,6 +1269,7 @@ "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/@microsoft/api-extractor": { @@ -1415,6 +1417,7 @@ "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==", + "dev": true, "license": "MIT", "dependencies": { "promise-worker-transferable": "^1.0.4" @@ -1789,99 +1792,16 @@ "dev": true, "license": "MIT" }, - "node_modules/@radix-ui/react-icons": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz", - "integrity": "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc" - } - }, - "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.122.0", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.122.0.tgz", - "integrity": "sha512-SEO/F/rBCTjlLez7WAlpys+iGe9hty4rNgjZvgkQeXFSiwqD4Hbk/wNHMAbdd8vprO2Aj81mihv4dF5bC7D0CA==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-10.0.4.tgz", + "integrity": "sha512-/ZtU4DAkJg72ipsa/UHXJ6SFs45G/rTzV+TdgZH2vyqaNbnFqNHQNXpr/HXWtceZOYI8Gzlv1yPAuk8EjuhLSA==", + "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", @@ -1890,22 +1810,22 @@ "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-mesh-bvh": "^0.8.3", "three-stdlib": "^2.35.6", "troika-three-text": "^0.52.0", "tunnel-rat": "^0.1.2", + "use-sync-external-store": "^1.4.0", "utility-types": "^3.11.0", "zustand": "^5.0.1" }, "peerDependencies": { - "@react-three/fiber": "^8", - "react": "^18", - "react-dom": "^18", - "three": ">=0.137" + "@react-three/fiber": "^9.0.0", + "react": "^19", + "react-dom": "^19", + "three": ">=0.159" }, "peerDependenciesMeta": { "react-dom": { @@ -1914,33 +1834,34 @@ } }, "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==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.0.4.tgz", + "integrity": "sha512-Uvo7KrvecISNyg4llc9mdI0UwjTQg250zwSVwirLBlDSODcE/AsVaBS0pIdKgFao+1uMFL/WoPPD4JX/l5VOJQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.17.8", - "@types/react-reconciler": "^0.26.7", + "@types/react-reconciler": "^0.28.9", "@types/webxr": "*", "base64-js": "^1.5.1", "buffer": "^6.0.3", - "its-fine": "^1.0.6", - "react-reconciler": "^0.27.0", + "its-fine": "^2.0.0", + "react-reconciler": "^0.31.0", "react-use-measure": "^2.1.7", - "scheduler": "^0.21.0", + "scheduler": "^0.25.0", "suspend-react": "^0.1.3", - "zustand": "^3.7.1" + "use-sync-external-store": "^1.4.0", + "zustand": "^5.0.3" }, "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" + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-native": ">=0.78", + "three": ">=0.156" }, "peerDependenciesMeta": { "expo": { @@ -1963,24 +1884,6 @@ } } }, - "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", - "peer": true, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, "node_modules/@rollup/pluginutils": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", @@ -2468,20 +2371,10 @@ "dev": true, "license": "MIT" }, - "node_modules/@stitches/react": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@stitches/react/-/react-1.2.8.tgz", - "integrity": "sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": ">= 16.3.0" - } - }, "node_modules/@storybook/addon-actions": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.6.3.tgz", - "integrity": "sha512-0UrVqRoZFRFCqjtR8ODacpJNqi47qDUnsnB5F7e93U9ihSrH2edOBBX6frl11XKYA23rzq7jtnviFTVOpWpG7Q==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.6.4.tgz", + "integrity": "sha512-mCcyfkeb19fJX0dpQqqZCnWBwjVn0/27xcpR0mbm/KW2wTByU6bKFFujgrHsX3ONl97IcIaUnmwwUwBr1ebZXw==", "dev": true, "license": "MIT", "dependencies": { @@ -2496,13 +2389,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/addon-backgrounds": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.6.3.tgz", - "integrity": "sha512-2mmMpMyUsS8rti2guMR4rk4h5YBLNHidxUqTm+U4nITZFfCXNP76To9hfTczpLTvUEpPxSbPG0sCIeHFaw4NRQ==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.6.4.tgz", + "integrity": "sha512-lRYGumlYdd1RptQJvOTRMx/q2pDmg2MO5GX4la7VfI8KrUyeuC1ZOSRDEcXeTuAZWJztqmtymg6bB7cAAoxCFA==", "dev": true, "license": "MIT", "dependencies": { @@ -2515,13 +2408,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/addon-controls": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.6.3.tgz", - "integrity": "sha512-j4Oof3nwjyiO6oNP1bJ98Sz1iZlYhdcgHX284yd0wBO91Q5B2GoCeqyCE+yRCh752ZnnYG1gazJrHmiG6gKxVg==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.6.4.tgz", + "integrity": "sha512-oMMP9Bj0RMfYmaitjFt6oBSjKH4titUqP+wE6PrZ3v+Om56f4buqfNKXRf80As2OrsZn0pjj95muWzVVHqIhyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2534,20 +2427,20 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/addon-docs": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.6.3.tgz", - "integrity": "sha512-FRABH+r2huMpAK8iUQiFlYZtYenbqtudX3fNKFK9b38eV1R14kWggVG02lsa6upXbzxWVbMLUdOqaZJHxNbO/A==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.6.4.tgz", + "integrity": "sha512-+kbcjvEAH0Xs+k+raAwfC0WmJilWhxBYnLLeazP3m5AkVI3sIjbzuuZ78NR0DCdRkw9BpuuXMHv5o4tIvLIUlw==", "dev": true, "license": "MIT", "dependencies": { "@mdx-js/react": "^3.0.0", - "@storybook/blocks": "8.6.3", - "@storybook/csf-plugin": "8.6.3", - "@storybook/react-dom-shim": "8.6.3", + "@storybook/blocks": "8.6.4", + "@storybook/csf-plugin": "8.6.4", + "@storybook/react-dom-shim": "8.6.4", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "ts-dedent": "^2.0.0" @@ -2557,25 +2450,25 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/addon-essentials": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.6.3.tgz", - "integrity": "sha512-tH+MwkZ6UwRWyhGdq8izVZAZHGWdeiBY1wpIwdceP1Rl2j9s11Gbddb/JlmiXrC+f/Oiylxghaf7EIksVVqLQQ==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.6.4.tgz", + "integrity": "sha512-3pF0ZDl5EICqe0eOupPQq6PxeupwkLsfTWANuuJUYTJur82kvJd3Chb7P9vqw0A0QBx6106mL6PIyjrFJJMhLg==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/addon-actions": "8.6.3", - "@storybook/addon-backgrounds": "8.6.3", - "@storybook/addon-controls": "8.6.3", - "@storybook/addon-docs": "8.6.3", - "@storybook/addon-highlight": "8.6.3", - "@storybook/addon-measure": "8.6.3", - "@storybook/addon-outline": "8.6.3", - "@storybook/addon-toolbars": "8.6.3", - "@storybook/addon-viewport": "8.6.3", + "@storybook/addon-actions": "8.6.4", + "@storybook/addon-backgrounds": "8.6.4", + "@storybook/addon-controls": "8.6.4", + "@storybook/addon-docs": "8.6.4", + "@storybook/addon-highlight": "8.6.4", + "@storybook/addon-measure": "8.6.4", + "@storybook/addon-outline": "8.6.4", + "@storybook/addon-toolbars": "8.6.4", + "@storybook/addon-viewport": "8.6.4", "ts-dedent": "^2.0.0" }, "funding": { @@ -2583,13 +2476,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/addon-highlight": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.6.3.tgz", - "integrity": "sha512-LYZsgZt5q3EZBkZjUEELh/5+TDnUP0njuQ5g6skyKil6vj9+2RI4/Vjodp+ni5+xct5aDhXavRyUnPRfclX/Cg==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.6.4.tgz", + "integrity": "sha512-jFREXnSE/7VuBR8kbluN+DBVkMXEV7MGuCe8Ytb1/D2Q0ohgJe395dfVgEgSMXErOwsn//NV/NgJp6JNXH2DrA==", "dev": true, "license": "MIT", "dependencies": { @@ -2600,19 +2493,19 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/addon-interactions": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.6.3.tgz", - "integrity": "sha512-cDvxuMcjoQdtimNrT4BM9AK0qZJhA0Ep/CWPcVK1bAFzqlzBbe//UZa5It/AeC4EMYAr5rFY+LWEli3YPeOnjQ==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.6.4.tgz", + "integrity": "sha512-MZAAZjyvmJXCvM35zEiPpXz7vK+fimovt+WZKAMayAbXy5fT+7El0c9dDyTQ2norNKNj9QU/8hiU/1zARSUELQ==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/instrumenter": "8.6.3", - "@storybook/test": "8.6.3", + "@storybook/instrumenter": "8.6.4", + "@storybook/test": "8.6.4", "polished": "^4.2.2", "ts-dedent": "^2.2.0" }, @@ -2621,13 +2514,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/addon-measure": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.6.3.tgz", - "integrity": "sha512-FC/3pqM2adSnwyPOd9AxEoZD5XWCMKAk16urQFQ0M4+IzRUdf2OV8cc7aM/oZiBX36+q/UCcUWm2SbQ5nzNJpg==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.6.4.tgz", + "integrity": "sha512-IpVL1rTy1tO8sy140eU3GdVB1QJ6J62+V6GSstcmqTLxDJQk5jFfg7hVbPEAZZ2sPFmeyceP9AMoBBo0EB355A==", "dev": true, "license": "MIT", "dependencies": { @@ -2639,13 +2532,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/addon-outline": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.6.3.tgz", - "integrity": "sha512-YklKHRkoDLSWawIIBrEI69RAWEdvhkYCOv+fMLu9zBeVPnkwbtIjXN/I+UJwPCm6jlxeEwEUAvbPWZMMf+BkPQ==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.6.4.tgz", + "integrity": "sha512-28nAslKTy0zWMdxAZcipMDYrEp1TkXVooAsqMGY5AMXMiORi1ObjhmjTLhVt1dXp+aDg0X+M3B6PqoingmHhqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2657,13 +2550,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/addon-toolbars": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.6.3.tgz", - "integrity": "sha512-GTC1GPrFNfWvvBaQQnGuL7ZfGK5Q+3ZovwQA9tnPu7QZEwea/4CXvUyQh1u0NwqrFZkrabOad1XvYfpRuCPGSA==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.6.4.tgz", + "integrity": "sha512-PU2lvgwCKDn93zpp5MEog103UUmSSugcxDf18xaoa9D15Qtr+YuQHd2hXbxA7+dnYL9lA7MLYsstfxE91ieM4Q==", "dev": true, "license": "MIT", "funding": { @@ -2671,13 +2564,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/addon-viewport": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.6.3.tgz", - "integrity": "sha512-AixZKiQdBVs7ePj5iV0U1IY2jvH0G7wQJwBRTOq4qC1FKiOsZEYmrwc3wLUBUlVqyenXFKN+H40r4VhPzzSfLw==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.6.4.tgz", + "integrity": "sha512-O5Ij+SRVg6grY6JOL5lOpsFyopZxuZEl2GHfh2SUf9hfowNS0QAgFpJupqXkwZzRSrlf9uKrLkjB6ulLgN2gOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2688,13 +2581,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/blocks": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.6.3.tgz", - "integrity": "sha512-Ieu6kwqdeAcrLzcX2QIqnCd0XWZi46i4eem8W54JRiOMQMYUpZ7onbciRAP58qxEWrZWqgxPS+tiCTaJe48VVQ==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.6.4.tgz", + "integrity": "sha512-+oPXwT3KzJzsdkQuGEzBqOKTIFlb6qmlCWWbDwAnP0SEqYHoTVRTAIa44icFP0EZeIe+ypFVAm1E7kWTLmw1hQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2708,7 +2601,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^8.6.3" + "storybook": "^8.6.4" }, "peerDependenciesMeta": { "react": { @@ -2720,13 +2613,13 @@ } }, "node_modules/@storybook/builder-vite": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.6.3.tgz", - "integrity": "sha512-v/nlBeT7Avn1ld2GHY5dtm1+TKREvtQ+DEcKK5iOWfv2259WqUp0dGnF4fbHcsNCtFurkA/P2uqJ9vc0xOIVUg==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.6.4.tgz", + "integrity": "sha512-FuSP2GhWVVTt6NdX0UJHhPOqhu09X4apSk+KWUf3aITRIJg9gbPYtJDBmxv1vXQEgvfCDdYBYbeG1khiO/Ghfw==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf-plugin": "8.6.3", + "@storybook/csf-plugin": "8.6.4", "browser-assert": "^1.2.1", "ts-dedent": "^2.0.0" }, @@ -2735,14 +2628,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3", + "storybook": "^8.6.4", "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@storybook/components": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.6.3.tgz", - "integrity": "sha512-q5DQkV+E/j0KfF818RywgqEHjaZTg71q5YY4z0UO8CRSzDQ/VYF6L76oc69corbkJtYAk/GqaYJllzrWykS4sg==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.6.4.tgz", + "integrity": "sha512-91VEVFWOgHkEFoNFMk6gs1AuOE9Yp7N283BXQOW+AgP+atpzED6t/fIBPGqJ2ewAuzLJ+cFOrasSzoNwVfg3Jg==", "dev": true, "license": "MIT", "funding": { @@ -2754,13 +2647,13 @@ } }, "node_modules/@storybook/core": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.6.3.tgz", - "integrity": "sha512-0iMTfmo3UFCa1hFJLtThnRIppkIpGPyTL3MElhORP1t5l9lCUq5am0ymbi/TeCbsJPjE86FjeO0NinokL9iQiw==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.6.4.tgz", + "integrity": "sha512-glDbjEBi3wokw1T+KQtl93irHO9N0LCwgylWfWVXYDdQjUJ7pGRQGnw73gPX7Ds9tg3myXFC83GjmY94UYSMbA==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/theming": "8.6.3", + "@storybook/theming": "8.6.4", "better-opn": "^3.0.2", "browser-assert": "^1.2.1", "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", @@ -2796,9 +2689,9 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.6.3.tgz", - "integrity": "sha512-0QDLBcMOxSEt1yH28cvIsoiaIokIxDDShMnxVJHWk/7+KZ3xe4lZBfKCWZspZoJmrxgz10gLRifj1b3ysIFlyA==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.6.4.tgz", + "integrity": "sha512-7UpEp4PFTy1iKjZiRaYMG7zvnpLIRPyD0+lUJUlLYG4UIemV3onvnIi1Je1tSZ4hfTup+ulom7JLztVSHZGRMg==", "dev": true, "license": "MIT", "dependencies": { @@ -2809,7 +2702,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/global": { @@ -2834,9 +2727,9 @@ } }, "node_modules/@storybook/instrumenter": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.6.3.tgz", - "integrity": "sha512-Y5n6JWCWdOqok08Hgklsc98TBoqROhAhBRSzNWuIaLsRhz8EziXQtuEkWqmVbyYOys25iTZiK3S8+QQkOzGrBw==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.6.4.tgz", + "integrity": "sha512-8OtIWLhayTUdqJEeXiPm6l3LTdSkWgQzzV2l2HIe4Adedeot+Rkwu6XHmyRDpnb0+Ish6zmMDqtJBxC2PQsy6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2848,13 +2741,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/manager-api": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.6.3.tgz", - "integrity": "sha512-7m9MQELc6XpuKIuliqMiQWzl8yVWpUDwTcpr+rTT7l3OfRzw7Y00UFct2tI03YG6EXsxsykw8EmueMQhe0lG5Q==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.6.4.tgz", + "integrity": "sha512-w/Nn/VznfbIg2oezDfzZNwSTDY5kBZbzxVBHLCnIcyu2AKt2Yto3pfGi60SikFcTrsClaAKT7D92kMQ9qdQNQQ==", "dev": true, "license": "MIT", "funding": { @@ -2866,9 +2759,9 @@ } }, "node_modules/@storybook/preview-api": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.6.3.tgz", - "integrity": "sha512-y2Ic6eHBQD/AwaCHctKOJ4tOM1r7/mPXfhGh0I+Qf8kZPlDTgQcJ6Z7/Ruma1L+ijXPBWouDaPw51gipcX+t9Q==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.6.4.tgz", + "integrity": "sha512-5HBfxggzxGz0dg2c61NpPiQJav7UAmzsQlzmI5SzWOS6lkaylcDG8giwKzASVCXVWBxNji9qIDFM++UH090aDg==", "dev": true, "license": "MIT", "funding": { @@ -2880,18 +2773,18 @@ } }, "node_modules/@storybook/react": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.6.3.tgz", - "integrity": "sha512-B4WYRWU2Y71UWl4CG3+mcB7duNln9finJyDB8Y1o2CYWUxgEo+3Bnp3k7NUr++tYVkZI1H+28UWeX0rpCkvReQ==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.6.4.tgz", + "integrity": "sha512-pfv4hMhu3AScOh0l86uIzmXLSQ0XA/e0reIVwQcxKht6miaKArhx9GkS4mMp6SO23ZoV5G/nfLgUaMVPVE0ZPg==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/components": "8.6.3", + "@storybook/components": "8.6.4", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "8.6.3", - "@storybook/preview-api": "8.6.3", - "@storybook/react-dom-shim": "8.6.3", - "@storybook/theming": "8.6.3" + "@storybook/manager-api": "8.6.4", + "@storybook/preview-api": "8.6.4", + "@storybook/react-dom-shim": "8.6.4", + "@storybook/theming": "8.6.4" }, "engines": { "node": ">=18.0.0" @@ -2901,10 +2794,10 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@storybook/test": "8.6.3", + "@storybook/test": "8.6.4", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.6.3", + "storybook": "^8.6.4", "typescript": ">= 4.2.x" }, "peerDependenciesMeta": { @@ -2917,9 +2810,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.6.3.tgz", - "integrity": "sha512-vE3LA2TxbzDF1Fso2IgvUtoHc+8a6laKhuJdx8frP5A8M1KGOBfuEPFCCcE49Q90HUlDgwb/zQl1GNq/QjLgWQ==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.6.4.tgz", + "integrity": "sha512-kTGJ3aFdmfCFzYaDFGmZWfTXr9xhbUaf0tJ6+nEjc4tME6mFwMI+tTUT6U/J6mJhZuc2DjvIRA7bM0x77dIDqw==", "dev": true, "license": "MIT", "funding": { @@ -2929,20 +2822,20 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/react-vite": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.6.3.tgz", - "integrity": "sha512-A/cA0wM/mMfFcJH7dxhWSbVg9aE2zZKNDioyEbiB042CgrLW3zQ6dvQvA5ohFhsPWZ6GVAyc+r3x0JE55aXxWQ==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.6.4.tgz", + "integrity": "sha512-MEmD6sP2tUI/SYCXCeWGTs8umZj+N0e3DHXCQUz0nCsJH7kuCTTipOTBQvr/GuEstNd7BNG5k8aLIRrXLjAvdA==", "dev": true, "license": "MIT", "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "0.5.0", "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "8.6.3", - "@storybook/react": "8.6.3", + "@storybook/builder-vite": "8.6.4", + "@storybook/react": "8.6.4", "find-up": "^5.0.0", "magic-string": "^0.30.0", "react-docgen": "^7.0.0", @@ -2957,10 +2850,10 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@storybook/test": "8.6.3", + "@storybook/test": "8.6.4", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.6.3", + "storybook": "^8.6.4", "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" }, "peerDependenciesMeta": { @@ -2970,14 +2863,14 @@ } }, "node_modules/@storybook/test": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.6.3.tgz", - "integrity": "sha512-UimvhV/PmYoXCwIbGpkyqQfMhjdH2GaHJbV6BWr7M7BHA3kUS6zYJAm2V2CC5SYcmyj7FejLB4tgL7FmLXB6hA==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.6.4.tgz", + "integrity": "sha512-JPjfbaMMuCBT47pg3/MDD9vYFF5OGPAOWEB9nJWJ9IjYAb2Nd8OYJQIDoYJQNT+aLkTVLtvzGnVNwdxpouAJcQ==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/instrumenter": "8.6.3", + "@storybook/instrumenter": "8.6.4", "@testing-library/dom": "10.4.0", "@testing-library/jest-dom": "6.5.0", "@testing-library/user-event": "14.5.2", @@ -2989,13 +2882,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.3" + "storybook": "^8.6.4" } }, "node_modules/@storybook/theming": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.3.tgz", - "integrity": "sha512-sDcWnnko73KOCIc9stQyec9KvTmGOuMswqeKtWh0ha/wsgYB6G2/2j1xOheFmWKPitOsbwgvqtjCP7bRE68uIA==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.4.tgz", + "integrity": "sha512-g9Ns4uenC9oAWETaJ/tEKEIPMdS+CqjNWZz5Wbw1bLNhXwADZgKrVqawzZi64+bYYtQ+i8VCTjPoFa6s2eHiDQ==", "dev": true, "license": "MIT", "funding": { @@ -3086,6 +2979,7 @@ "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==", + "dev": true, "license": "MIT" }, "node_modules/@types/argparse": { @@ -3240,6 +3134,7 @@ "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/estree": { @@ -3304,6 +3199,7 @@ "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/proj4": { @@ -3313,12 +3209,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "license": "MIT" - }, "node_modules/@types/rbush": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/rbush/-/rbush-3.0.4.tgz", @@ -3327,32 +3217,32 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", - "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "version": "19.0.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", + "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", + "devOptional": true, "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", - "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz", + "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", "dev": true, "license": "MIT", "peerDependencies": { - "@types/react": "^18.0.0" + "@types/react": "^19.0.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==", + "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", - "peer": true, - "dependencies": { + "peerDependencies": { "@types/react": "*" } }, @@ -3367,12 +3257,14 @@ "version": "0.17.3", "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/three": { "version": "0.174.0", "resolved": "https://registry.npmjs.org/@types/three/-/three-0.174.0.tgz", "integrity": "sha512-De/+vZnfg2aVWNiuy1Ldu+n2ydgw1osinmiZTAn0necE++eOfsygL8JpZgFjR2uHmAPo89MkxBj3JJ+2BMe+Uw==", + "dev": true, "license": "MIT", "dependencies": { "@tweenjs/tween.js": "~23.1.3", @@ -3401,6 +3293,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.21.tgz", "integrity": "sha512-geZIAtLzjGmgY2JUi6VxXdCrTb99A7yP49lxLr2Nm/uIK0PkkxcEi4OGhoGDO4pxCf3JwGz2GiJL2Ej4K2bKaA==", + "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { @@ -3790,12 +3683,14 @@ "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" @@ -3804,31 +3699,6 @@ "react": ">= 16.8.0" } }, - "node_modules/@utsubo/events": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@utsubo/events/-/events-0.1.7.tgz", - "integrity": "sha512-WB/GEj/0h27Bz8rJ0+CBtNz5mLT79ne1OjB7PUM4n0qLBqEDwm6yBzZC3j6tasHjlBPJDYZiBVIA1glaMlgZ5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.7" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@utsubo/events/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, "node_modules/@vitejs/plugin-react": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", @@ -4276,15 +4146,16 @@ "license": "MIT" }, "node_modules/@webgpu/types": { - "version": "0.1.54", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.54.tgz", - "integrity": "sha512-81oaalC8LFrXjhsczomEQ0u3jG+TqE6V9QHLA8GNZq/Rnot0KDugu3LhSYSlie8tSdooAN1Hov05asrUUp9qgg==", + "version": "0.1.55", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.55.tgz", + "integrity": "sha512-p97I8XEC1h04esklFqyIH+UhFrUcj8/1/vBWgc6lAK4jMJc+KbhUy8D4dquHYztFj6pHLqGcp/P1xvBBF4r3DA==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", "bin": { @@ -4490,6 +4361,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -4504,8 +4376,7 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/better-opn": { "version": "3.0.2", @@ -4524,6 +4395,7 @@ "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" @@ -4608,6 +4480,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, "funding": [ { "type": "github", @@ -4623,7 +4496,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -4703,6 +4575,7 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.10.0.tgz", "integrity": "sha512-vBQ5Daxv4KRsn07U/VqkPxoqD8U+S++0oq5NLf4HevMuh/BDta3rg49e/P564AMzFPBePQeXDKOkiIezRgyDwg==", + "dev": true, "license": "MIT", "peerDependencies": { "three": ">=0.126.1" @@ -4872,6 +4745,7 @@ "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" @@ -4890,6 +4764,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -4911,6 +4786,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true, "license": "MIT" }, "node_modules/curve-interpolator": { @@ -5134,6 +5010,7 @@ "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" @@ -5177,6 +5054,7 @@ "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/dunder-proto": { @@ -5429,9 +5307,9 @@ } }, "node_modules/eslint-plugin-storybook": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.11.3.tgz", - "integrity": "sha512-gDBnBZiyk4ZG7OMSJRaHBcuJ8TMCXgMIQ3HB/XvtN0SvSio2ZOIeYD3yGj39g/DbyCe/Bg02j/ip9tWlDEs82A==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.11.4.tgz", + "integrity": "sha512-OvLf1ljpDQ6Y/U2kM7hT5hESn+hg0vq/nh62+YiPFWdRIEjuQM9ivmwoTP9nRBExH8fT2VPqM5t/RB68lqTWJw==", "dev": true, "license": "MIT", "dependencies": { @@ -5629,9 +5507,9 @@ } }, "node_modules/exsolve": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.1.tgz", - "integrity": "sha512-Smf0iQtkQVJLaph8r/qS8C8SWfQkaq9Q/dFcD44MLbJj6DNhlWefVuaS21SjfqOsBbjVlKtbCj6L9ekXK6EZUg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.2.tgz", + "integrity": "sha512-ZEcIMbthn2zeX4/wD/DLxDUjuCltHXT8Htvm/JFlTkdYgWh2+HGppgwwNUnIVxzxP7yJOPtuBAec0dLx6lVY8w==", "dev": true, "license": "MIT" }, @@ -5732,6 +5610,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true, "license": "MIT" }, "node_modules/file-entry-cache": { @@ -5981,6 +5860,7 @@ "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": { @@ -6089,6 +5969,7 @@ "version": "1.5.20", "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.20.tgz", "integrity": "sha512-uu0VXUK52JhihhnN/MVVo1lvqNNuhoxkonqgO3IpjvQiGpJBdIXMGkofjQb/j9zvV7a1SW8U9g1FslWx/1HOiQ==", + "dev": true, "license": "Apache-2.0" }, "node_modules/html-escaper": { @@ -6102,6 +5983,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -6116,8 +5998,7 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.2", @@ -6133,6 +6014,7 @@ "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": { @@ -6346,6 +6228,7 @@ "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-regex": { @@ -6400,6 +6283,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { @@ -6457,26 +6341,16 @@ } }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz", + "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@types/react-reconciler": "^0.28.0" + "@types/react-reconciler": "^0.28.9" }, "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", - "peer": true, - "peerDependencies": { - "@types/react": "*" + "react": "^19.0.0" } }, "node_modules/jackspeak": { @@ -6506,6 +6380,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -6626,6 +6501,7 @@ "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" @@ -6695,18 +6571,6 @@ "dev": true, "license": "MIT" }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, "node_modules/loupe": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", @@ -6745,6 +6609,7 @@ "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", @@ -6855,6 +6720,7 @@ "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" @@ -6864,6 +6730,7 @@ "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==", + "dev": true, "license": "MIT" }, "node_modules/mgrs": { @@ -7051,15 +6918,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", @@ -7238,6 +7096,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7398,6 +7257,7 @@ "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/prelude-ls": { @@ -7462,29 +7322,13 @@ "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", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/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==", - "license": "MIT" - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -7549,66 +7393,6 @@ "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", "license": "ISC" }, - "node_modules/r3f-perf": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/r3f-perf/-/r3f-perf-7.2.3.tgz", - "integrity": "sha512-4+P/N/bnO9D8nzdm3suL/NjPZK/HHdjwpvajhi8j7eB41i2ECN6lX9RXiKSpHzpsDi2ui1tBj6q7/sz5opoqXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-icons": "^1.3.0", - "@react-three/drei": "^9.103.0", - "@stitches/react": "^1.2.8", - "@utsubo/events": "^0.1.7", - "zustand": "~4.5.2" - }, - "peerDependencies": { - "@react-three/fiber": ">=8.0", - "react": ">=18.0", - "react-dom": ">=18.0", - "three": ">=0.133" - }, - "peerDependenciesMeta": { - "@react-three/fiber": { - "optional": true - }, - "dom": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/r3f-perf/node_modules/zustand": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.6.tgz", - "integrity": "sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==", - "dev": true, - "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/rbush": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", @@ -7619,29 +7403,14 @@ } }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "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-confetti": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.4.0.tgz", @@ -7691,25 +7460,16 @@ } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "devOptional": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.25.0" }, "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" + "react": "^19.0.0" } }, "node_modules/react-is": { @@ -7720,20 +7480,19 @@ "license": "MIT" }, "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==", + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.31.0.tgz", + "integrity": "sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.21.0" + "scheduler": "^0.25.0" }, "engines": { "node": ">=0.10.0" }, "peerDependencies": { - "react": "^18.0.0" + "react": "^19.0.0" } }, "node_modules/react-refresh": { @@ -7823,12 +7582,14 @@ "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, "license": "MIT" }, "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==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8082,14 +7843,11 @@ } }, "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", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "devOptional": true, + "license": "MIT" }, "node_modules/semver": { "version": "7.7.1", @@ -8126,6 +7884,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -8138,6 +7897,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8216,6 +7976,7 @@ "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": "*", @@ -8230,12 +7991,14 @@ "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": { @@ -8246,13 +8009,13 @@ "license": "MIT" }, "node_modules/storybook": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.6.3.tgz", - "integrity": "sha512-Vbmd8/FXp6X0AOMak6arcg3WdkHj+2AYJTNHbCPVHsCEbnREyRZIG+Eq5/Ffmy6byiz+4OAX5HwsHGSMR6Xmow==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.6.4.tgz", + "integrity": "sha512-XXh1Acvf1r3BQX0BDLQw6yhZ7yUGvYxIcKOBuMdetnX7iXtczipJTfw0uyFwk0ltkKEE9PpJvivYmARF3u64VQ==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/core": "8.6.3" + "@storybook/core": "8.6.4" }, "bin": { "getstorybook": "bin/index.cjs", @@ -8448,6 +8211,7 @@ "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" @@ -8472,23 +8236,25 @@ "version": "0.174.0", "resolved": "https://registry.npmjs.org/three/-/three-0.174.0.tgz", "integrity": "sha512-p+WG3W6Ov74alh3geCMkGK9NWuT62ee21cV3jEnun201zodVF4tCE5aZa2U122/mkLRmhJJUQmLLW1BH00uQJQ==", + "dev": true, "license": "MIT", "peer": true }, "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.", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.8.3.tgz", + "integrity": "sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg==", + "dev": true, "license": "MIT", "peerDependencies": { - "three": ">= 0.151.0" + "three": ">= 0.159.0" } }, "node_modules/three-stdlib": { "version": "2.35.14", "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.35.14.tgz", "integrity": "sha512-kpCaEg59M9usFTgHC+YZNKvx7nMoLI2zQxZBV8pjoNW6vNZmGyXpaLBL09A2oLCsS3KepgMFkOuk6lRoebTNvA==", + "dev": true, "license": "MIT", "dependencies": { "@types/draco3d": "^1.4.0", @@ -8506,6 +8272,7 @@ "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/tiny-invariant": { @@ -8603,6 +8370,7 @@ "version": "0.52.3", "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.3.tgz", "integrity": "sha512-jLhiwgV8kEkwWjvK12f2fHVpbOC75p7SgPQ0cgcz+IMtN5Bdyg4EuFdwuTOVu9ga8UeYdKBpzd1AxviyixtYTQ==", + "dev": true, "license": "MIT", "dependencies": { "bidi-js": "^1.0.2", @@ -8618,6 +8386,7 @@ "version": "0.52.0", "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.0.tgz", "integrity": "sha512-00oxqIIehtEKInOTQekgyknBuRUj1POfOUE2q1OmL+Xlpp4gIu+S0oA0schTyXsDS4d9DkR04iqCdD40rF5R6w==", + "dev": true, "license": "MIT", "peerDependencies": { "three": ">=0.125.0" @@ -8627,6 +8396,7 @@ "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/ts-api-utils": { @@ -8678,6 +8448,7 @@ "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" @@ -8687,6 +8458,7 @@ "version": "4.5.6", "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.6.tgz", "integrity": "sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==", + "dev": true, "license": "MIT", "dependencies": { "use-sync-external-store": "^1.2.2" @@ -8960,6 +8732,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "devOptional": true, "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -8992,6 +8765,7 @@ "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" @@ -9381,12 +9155,14 @@ "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==" + "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/webpack-virtual-modules": { @@ -9400,6 +9176,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" diff --git a/package.json b/package.json index 6295d3a..ff14105 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "coverage": "vitest --coverage" }, "dependencies": { - "@react-three/drei": "^9.121.4", "curve-interpolator": "^3.3.1", "d3-array": "^3.2.4", "d3-axis": "^3.0.0", @@ -60,13 +59,15 @@ "p-queue": "^8.0.1", "proj4": "^2.11.0", "rbush": "^3.0.1", - "react-use-measure": "^2.1.1", + "react-use-measure": "^2.1.7", "use-zustand": "^0.2.0", "zustand": "^5.0.0-rc.2" }, "devDependencies": { "@chromatic-com/storybook": "^3.2.4", "@eslint/js": "^9.17.0", + "@react-three/drei": "^10.0.4", + "@react-three/fiber": "^9.0.4", "@storybook/addon-essentials": "^8.5.5", "@storybook/addon-interactions": "^8.5.5", "@storybook/blocks": "^8.5.5", @@ -86,20 +87,21 @@ "@types/node": "^22.12.0", "@types/proj4": "^2.5.5", "@types/rbush": "^3.0.3", - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", "@typescript-eslint/eslint-plugin": "^8.19.1", "@typescript-eslint/parser": "8.19.1", "@vitejs/plugin-react": "^4.3.4", "@vitest/coverage-v8": "^3.0.7", "@vitest/ui": "^3.0.7", "eslint": "^9.18.0", - "eslint-plugin-react-hooks": "^5.1.0", - "eslint-plugin-react-refresh": "^0.4.18", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", "eslint-plugin-storybook": "^0.11.2", "globals": "^15.14.0", "minimist": "^1.2.8", - "r3f-perf": "^7.2.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", "rimraf": "^6.0.1", "sass": "^1.83.1", "storybook": "^8.5.5", @@ -114,10 +116,8 @@ "vitest": "^3.0.7" }, "peerDependencies": { - "@react-three/fiber": "8", - "comlink": ">=4.4", - "react": ">=18 <19", - "react-dom": ">=18 <19", - "three": ">=0.169" + "@react-three/fiber": ">=8", + "@react-three/drei": ">=9", + "comlink": ">=4.4" } } diff --git a/src/components/Annotations/types.ts b/src/components/Annotations/types.ts index 7516beb..a0156cc 100644 --- a/src/components/Annotations/types.ts +++ b/src/components/Annotations/types.ts @@ -30,7 +30,7 @@ export type AnnotationLayer = { connectorWidth: number connectorColor: string onClick?: (annotation: AnnotationComponentProps) => void - labelComponent?: (props: AnnotationComponentProps) => JSX.Element + labelComponent?: (props: AnnotationComponentProps) => React.JSX.Element //annotations: AnnotationProps[], } @@ -74,7 +74,7 @@ export type AnnotationInstanceState = { export type AnnotationInstance = { id: string - ref: RefObject | null + ref: RefObject | null layer: AnnotationLayer annotation: AnnotationProps priority: number diff --git a/src/components/ObservableGroup/ObservableGroup.tsx b/src/components/ObservableGroup/ObservableGroup.tsx index 1c93c7e..6f635ae 100644 --- a/src/components/ObservableGroup/ObservableGroup.tsx +++ b/src/components/ObservableGroup/ObservableGroup.tsx @@ -1,4 +1,4 @@ -import { GroupProps } from '@react-three/fiber' +import { ThreeElements } from '@react-three/fiber' import { PropsWithChildren, useEffect, useMemo, useRef } from 'react' import { Box3, Group, Vector3 } from 'three' import { Vec3 } from '../../sdk' @@ -66,7 +66,7 @@ export type BoxPadding = { * ObservableGroup props * @expand */ -export type ObservableGroupProps = GroupProps & { +export type ObservableGroupProps = ThreeElements['group'] & { padding?: number | Vec3 | BoxPadding snapTo?: number updateRate?: number diff --git a/src/components/Symbol/Symbol.tsx b/src/components/Symbol/Symbol.tsx index fd41628..14a2c11 100644 --- a/src/components/Symbol/Symbol.tsx +++ b/src/components/Symbol/Symbol.tsx @@ -1,7 +1,7 @@ -import { BufferGeometry, InstancedBufferAttribute, InstancedMesh, Layers, Material } from 'three' -import { SymbolsType } from '../../sdk/data/types/Symbol' import { forwardRef, useEffect, useImperativeHandle, useMemo } from 'react' +import { BufferGeometry, InstancedBufferAttribute, InstancedMesh, Layers, Material } from 'three' import { PointerEvents } from '../../events/interaction-events' +import { SymbolsType } from '../../sdk/data/types/Symbol' import { EventEmitterCallback, useEventEmitter } from '../Handlers/EventEmitter/EventEmitterContext' import { CommonComponentProps } from '../common' @@ -71,7 +71,7 @@ export const Symbols = forwardRef(({ } if (layers) { - const mask = layers instanceof Layers ? layers.mask : layers + const mask = layers instanceof Layers ? layers.mask : layers as number mesh.layers.mask = mask } diff --git a/src/components/Wellbores/BasicTrajectory/BasicTrajectory.tsx b/src/components/Wellbores/BasicTrajectory/BasicTrajectory.tsx index 5b08b34..4345d96 100644 --- a/src/components/Wellbores/BasicTrajectory/BasicTrajectory.tsx +++ b/src/components/Wellbores/BasicTrajectory/BasicTrajectory.tsx @@ -1,6 +1,6 @@ -import { extend, ReactThreeFiber } from '@react-three/fiber' + import { useEffect, useMemo, useState } from 'react' -import { BufferGeometry, Color, Line, LineBasicMaterial, Material } from 'three' +import { BufferGeometry, Color, LineBasicMaterial, Material } from 'three' import { useGenerator } from '../../../hooks/useGenerator' import { unpackBufferGeometry } from '../../../sdk/geometries/packing' @@ -97,7 +97,7 @@ export const BasicTrajectory = ({ if (!geometry) return null return ( - ) } - - -/** Typescript/JSX namespace workaround */ -declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace JSX { - interface IntrinsicElements { - line_: ReactThreeFiber.Object3DNode - } - } -} - -extend({ Line_: Line }) \ No newline at end of file diff --git a/src/components/Wellbores/DepthMarkers/DepthMarkers.stories.tsx b/src/components/Wellbores/DepthMarkers/DepthMarkers.stories.tsx index acec367..53ef797 100644 --- a/src/components/Wellbores/DepthMarkers/DepthMarkers.stories.tsx +++ b/src/components/Wellbores/DepthMarkers/DepthMarkers.stories.tsx @@ -1,16 +1,16 @@ import type { Meta, StoryObj } from '@storybook/react' -import { Wellbore } from '../Wellbore/Wellbore' import { useEffect } from 'react' -import { GeneratorsProviderDecorator } from '../../../storybook/decorators/generators-provider-decorator' -import { DataProviderDecorator } from '../../../storybook/decorators/data-provider-decorator' import { Canvas3dDecorator } from '../../../storybook/decorators/canvas-3d-decorator' -import { PerformanceDecorator } from '../../../storybook/decorators/performance-decorator' -import { DepthSelectorDecorator } from '../../../storybook/decorators/depth-selector-decorator' +import { DataProviderDecorator } from '../../../storybook/decorators/data-provider-decorator' +import { GeneratorsProviderDecorator } from '../../../storybook/decorators/generators-provider-decorator' +import { Wellbore } from '../Wellbore/Wellbore' +//import { PerformanceDecorator } from '../../../storybook/decorators/performance-decorator' import { WellboreSelectedEvent } from '../../../events/wellbore-events' import { AnnotationsDecorator } from '../../../storybook/decorators/annotations-decorator' +import { DepthSelectorDecorator } from '../../../storybook/decorators/depth-selector-decorator' +import storyArgs from '../../../storybook/story-args.json' import { TubeTrajectory } from '../TubeTrajectory/TubeTrajectory' import { DepthMarkers } from './DepthMarkers' -import storyArgs from '../../../storybook/story-args.json' const wellboreOptions = storyArgs.wellboreOptions const wellboreId = storyArgs.defaultWellbore @@ -47,7 +47,7 @@ export const Default: Story = { } }, decorators: [ - PerformanceDecorator, + //PerformanceDecorator, AnnotationsDecorator, Canvas3dDecorator, GeneratorsProviderDecorator, diff --git a/src/sdk/geometries/curve/tube-geometry.stories.tsx b/src/sdk/geometries/curve/tube-geometry.stories.tsx index 8b85533..08d00b0 100644 --- a/src/sdk/geometries/curve/tube-geometry.stories.tsx +++ b/src/sdk/geometries/curve/tube-geometry.stories.tsx @@ -4,7 +4,7 @@ import { useEffect, useState } from 'react' import { BufferGeometry } from 'three' import { VertexNormalsHelper } from 'three/examples/jsm/Addons.js' import { Canvas3dDecorator } from '../../../storybook/decorators/canvas-3d-decorator' -import { PerformanceDecorator } from '../../../storybook/decorators/performance-decorator' +//import { PerformanceDecorator } from '../../../storybook/decorators/performance-decorator' import { Vec3 } from '../../types/common' import { getSplineCurve } from './curve-3d' import { TubeGeometryOptions, createTubeGeometry } from './tube-geometry' @@ -170,7 +170,7 @@ export const Default: Story = { }, }, decorators: [ - PerformanceDecorator, + //PerformanceDecorator, Canvas3dDecorator ], parameters: { diff --git a/src/sdk/managers/CameraManager.ts b/src/sdk/managers/CameraManager.ts index 27fd933..f805043 100644 --- a/src/sdk/managers/CameraManager.ts +++ b/src/sdk/managers/CameraManager.ts @@ -1,7 +1,7 @@ import { CameraControls } from '@react-three/drei' -import { Vec3 } from '../types/common' import { Vector3 } from 'three' import { cameraFocusAtPointEventType, cameraSetPositionEventType } from '../../events/camera-events' +import { Vec3 } from '../types/common' const cameraTarget = new Vector3() const cameraPosition = new Vector3() diff --git a/src/storybook/decorators/performance-decorator.tsx b/src/storybook/decorators/performance-decorator.tsx index 6e0a281..48e85ac 100644 --- a/src/storybook/decorators/performance-decorator.tsx +++ b/src/storybook/decorators/performance-decorator.tsx @@ -1,8 +1,8 @@ -import { Perf } from 'r3f-perf' +// import { Perf } from 'r3f-perf' -export const PerformanceDecorator = (Story: any) => ( - <> - - - -) \ No newline at end of file +// export const PerformanceDecorator = (Story: any) => ( +// <> +// +// +// +// ) \ No newline at end of file diff --git a/src/storybook/examples/Wellbore.example.stories.tsx b/src/storybook/examples/Wellbore.example.stories.tsx index 2deecbb..bd656c7 100644 --- a/src/storybook/examples/Wellbore.example.stories.tsx +++ b/src/storybook/examples/Wellbore.example.stories.tsx @@ -1,26 +1,26 @@ import type { Meta, StoryObj } from '@storybook/react' -import storyArgs from '../story-args.json' -import { Wellbore } from '../../components/Wellbores/Wellbore/Wellbore' -import { GeneratorsProviderDecorator } from '../decorators/generators-provider-decorator' -import { DataProviderDecorator } from '../decorators/data-provider-decorator' -import { Canvas3dDecorator } from '../decorators/canvas-3d-decorator' +import { useEffect } from 'react' import { BasicTrajectory } from '../../components/Wellbores/BasicTrajectory/BasicTrajectory' -import { CompletionTools } from '../../components/Wellbores/CompletionTools/CompletionTools' import { Casings } from '../../components/Wellbores/Casings/Casings' -import { useEffect } from 'react' -import { PerformanceDecorator } from '../decorators/performance-decorator' -import { Perimeter } from '../../components/Wellbores/Perimeter/Perimeter' -import { CasingAnnotations } from '../../components/Wellbores/Casings/CasingAnnotations/CasingAnnotations' -import { DepthSelectorDecorator } from '../decorators/depth-selector-decorator' -import { WellboreSelectedEvent } from '../../events/wellbore-events' +import { CompletionTools } from '../../components/Wellbores/CompletionTools/CompletionTools' +import { Wellbore } from '../../components/Wellbores/Wellbore/Wellbore' +import { Canvas3dDecorator } from '../decorators/canvas-3d-decorator' +import { DataProviderDecorator } from '../decorators/data-provider-decorator' +import { GeneratorsProviderDecorator } from '../decorators/generators-provider-decorator' +import storyArgs from '../story-args.json' +//import { PerformanceDecorator } from '../decorators/performance-decorator' import { Annotations } from '../../components/Annotations/Annotations' +import { useAnnotationsState } from '../../components/Annotations/annotations-state' import { AnnotationsLayer } from '../../components/Annotations/AnnotationsLayer' -import { CasingLabel } from '../../components/Wellbores/Casings/CasingAnnotations/CasingLabel' import { AnnotationComponentProps } from '../../components/Annotations/types' -import { CameraFocusAtPointEvent } from '../../events/camera-events' +import { CasingAnnotations } from '../../components/Wellbores/Casings/CasingAnnotations/CasingAnnotations' +import { CasingLabel } from '../../components/Wellbores/Casings/CasingAnnotations/CasingLabel' import { CompletionAnnotations } from '../../components/Wellbores/CompletionTools/CompletionAnnotations/CompletionAnnotations' -import { useAnnotationsState } from '../../components/Annotations/annotations-state' import { Perforations } from '../../components/Wellbores/Perforations/Perforations' +import { Perimeter } from '../../components/Wellbores/Perimeter/Perimeter' +import { CameraFocusAtPointEvent } from '../../events/camera-events' +import { WellboreSelectedEvent } from '../../events/wellbore-events' +import { DepthSelectorDecorator } from '../decorators/depth-selector-decorator' const meta = { title: 'examples/Wellbore', @@ -98,7 +98,7 @@ export const Default: Story = { }, }, decorators: [ - PerformanceDecorator, + //PerformanceDecorator, Canvas3dDecorator, GeneratorsProviderDecorator, DepthSelectorDecorator, diff --git a/src/storybook/examples/Wells.example.stories.tsx b/src/storybook/examples/Wells.example.stories.tsx index 3fa2c43..5379f40 100644 --- a/src/storybook/examples/Wells.example.stories.tsx +++ b/src/storybook/examples/Wells.example.stories.tsx @@ -1,483 +1,476 @@ -import { useThree } from '@react-three/fiber' -import type { Meta, StoryObj } from '@storybook/react' -import { scaleOrdinal } from 'd3-scale' -import { useEffect, useMemo, useRef, useState } from 'react' -import { RepeatWrapping, TextureLoader, Vector3 } from 'three' -import { useAnnotationsState } from '../../components/Annotations/annotations-state' -import { CameraTargetMarker } from '../../components/CameraTargetMarker/CameraTargetMarker' -import { Distance } from '../../components/Distance/Distance' -import { BoxGrid } from '../../components/Grids/BoxGrid/BoxGrid' -import { useHighlighter } from '../../components/Handlers/Highlighter/highlight-state' -import { Highlighter } from '../../components/Handlers/Highlighter/Highlighter' -import { useOutputPanel, useOutputPanelState } from '../../components/Html/OutputPanel/output-panel-state' -import { ObservableGroup } from '../../components/ObservableGroup/ObservableGroup' -import { Surface } from '../../components/Surfaces/Surface' -import { ContourColorMode } from '../../components/Surfaces/SurfaceMaterial' -import { UtmArea } from '../../components/UtmArea/UtmArea' -import { UtmPosition } from '../../components/UtmArea/UtmPosition' -import { BasicTrajectory } from '../../components/Wellbores/BasicTrajectory/BasicTrajectory' -import { Casings } from '../../components/Wellbores/Casings/Casings' -import { CompletionTools } from '../../components/Wellbores/CompletionTools/CompletionTools' -import { DepthMarkers } from '../../components/Wellbores/DepthMarkers/DepthMarkers' -import { Perforations } from '../../components/Wellbores/Perforations/Perforations' -import { Picks } from '../../components/Wellbores/Picks/Picks' -import { Shoes } from '../../components/Wellbores/Shoes/Shoes' -import { TubeTrajectory } from '../../components/Wellbores/TubeTrajectory/TubeTrajectory' -import { Wellbore } from '../../components/Wellbores/Wellbore/Wellbore' -import { WellboreBounds } from '../../components/Wellbores/WellboreBounds/WellboreBounds' -import { WellboreLabel } from '../../components/Wellbores/WellboreLabel/WellboreLabel' -import { Wells } from '../../components/Wellbores/Wells/Wells' -import { WellboreSelectedEvent, wellboreSelectedEventType } from '../../events/wellbore-events' -import { CRS } from '../../sdk/projection/crs' -import { Vec2, Vec3 } from '../../sdk/types/common' -import { AnnotationsDecorator } from '../decorators/annotations-decorator' -import { Canvas3dDecorator } from '../decorators/canvas-3d-decorator' -import { DataProviderDecorator } from '../decorators/data-provider-decorator' -import { EventEmitterDecorator } from '../decorators/event-emitter-decorator' -import { GeneratorsProviderDecorator } from '../decorators/generators-provider-decorator' -import { OutputPanelDecorator } from '../decorators/output-panel-decorator' -import { WellMapDecorator } from '../decorators/well-map-decorator' -import { useSurfaceMetaDict } from '../hooks/useSurfaceMeta' -import { useWellboreHeaders } from '../hooks/useWellboreHeaders' -import storyArgs from '../story-args.json' -//import { PerformanceDecorator } from '../decorators/performance-decorator' - -const loader = new TextureLoader() -const normalMap = loader.load('normal_map.jpg') -normalMap.anisotropy = 4 - -const colorScale = scaleOrdinal(["tomato", "#4e79a7", "#f28e2c", "#76b7b2", "#59a14f", "#edc949", "#af7aa1", "#ff9da7", "#9c755f", "#86a68c", "darkgreen", "purple", "#c3b380"]) - -const utmZone = storyArgs.utmZone -const origin = storyArgs.origin as Vec2 - -const v = new Vector3() - -type ExampleProps = { - selected?: string, - surfaceId?: string, - useColorRamp: boolean, - reverseRamp: boolean, - color?: string, - colorRamp: number, - opacity: number, - maxError: number, - wireframe: boolean, - showContours: boolean, - contoursInterval: number, - contoursColorMode: ContourColorMode, - contoursColorModeFactor: number, - contoursThickness: number, - contoursColor: string, - depthMarkerInterval: number, - showPicks: boolean, - showShoes: boolean, - showDepthMarkers: boolean, - showCasingAndCompletion: boolean, - showPerforations: boolean, - showCameraTarget: boolean, - casingOpacity: number, - sizeMultiplier: number, - gridCellSize: number, - -} - -const Example = (args: ExampleProps) => { - const [selected, setSelected] = useState(args.selected) - const crsRef = useRef(null) - - const [gridSize, setGridSize] = useState([0, 0, 0]) - const [gridPosition, setGridPosition] = useState([0, 0, 0]) - - const highlighter = useHighlighter() - const outputPanel = useOutputPanel() - - const { camera } = useThree() - - const toggleVisibility = useAnnotationsState(state => state.toggleVisibility) - - const wellbores = useWellboreHeaders() - const surfaceMeta = useSurfaceMetaDict() - - const included = useMemo(() => wellbores.map(d => d.id), [wellbores]) - - const surface = useMemo(() => { - return args.surfaceId ? surfaceMeta[args.surfaceId] : null - }, [args.surfaceId, surfaceMeta]) - - useEffect(() => { - if (surface) { - normalMap.repeat.set( - Math.ceil((surface.header.nx * surface.header.xinc) / 500), - Math.ceil((surface.header.ny * surface.header.yinc) / 500), - ) - normalMap.wrapS = RepeatWrapping - normalMap.wrapT = RepeatWrapping - } - }, [surface]) - - useEffect(() => { - function onKeyPress(event: KeyboardEvent) { - if (event.code === 'Space') { - toggleVisibility() - } - } - addEventListener('keypress', onKeyPress) - return () => removeEventListener('keypress', onKeyPress) - }, [toggleVisibility]) - - useEffect(() => { - if (outputPanel) { - if (!outputPanel.has('selected')) { - outputPanel.add('selected', { - label: 'Selected', - value: '(none)', - color: 'tomato', - order: 2, - details: { - status: { label: 'Status', value: '-' }, - depth: { label: 'Total Depth (Md Msl)', value: '-' }, - kickoff: { label: 'Kickoff (Md Msl)', value: '-' }, - easting: { label: 'Easting (wellhead)', value: '-' }, - northing: { label: 'Northing (wellhead)', value: '-' }, - depthRef: { label: 'Depth ref. (Msl)', value: '-' }, - } - }) - } - if (!outputPanel.has('readout')) { - outputPanel.add('readout', { - label: 'Readout', - color: 'orange', - value: '(none)', - order: 1, - details: { - easting: { label: 'Easting', value: '-' }, - northing: { label: 'Northing', value: '-' }, - depth: { label: 'TVD (Msl)', value: '-' }, - distance: { label: 'Distance (m)', value: '-' }, - }, - }) - } - } - }, [outputPanel]) - - useEffect(() => { - if (args.selected) dispatchEvent(new WellboreSelectedEvent({ id: args.selected })) - }, [args.selected]) - - useEffect(() => { - function onSelect(event: WellboreSelectedEvent) { - setSelected(event.detail.id) - const wellbore = wellbores.find(d => d.id === event.detail.id) - if (wellbore) { - outputPanel.update('selected', wellbore.name, { - status: wellbore.status, - depth: wellbore.depthMdMsl.toFixed(1), - kickoff: wellbore.kickoffDepthMsl?.toFixed(1) || '-', - easting: wellbore.easting.toFixed(1), - northing: wellbore.northing.toFixed(1), - depthRef: wellbore.depthReferenceElevation.toFixed(1), - }) - } - } - addEventListener(wellboreSelectedEventType, onSelect) - - return () => removeEventListener(wellboreSelectedEventType, onSelect) - }, [outputPanel, wellbores]) - - useEffect(() => { - return () => { - highlighter.removeAll() - } - }, [highlighter]) - - return ( - <> - - - - {args.showCameraTarget && } - {!surface && ( - - )} - - {/* - - - - - */} - - {surface && ( - { - // console.log(e.position && e.position[1]) - // }} - /> - - )} - - { - setGridPosition(state.center) - setGridSize(state.size) - }} - > - { - const color = isActiveWell ? colorScale(wellbore.name.replace(wellbore.well, '') || 'Main') : '#aaa' - - return ( - - { - setSelected(event.ref) - dispatchEvent(new WellboreSelectedEvent({ id: event.ref, position: event.position, flyTo: !event.keys.ctrlKey })) - console.log(wellbore.id) - }} - onPointerEnter={async (event) => { - if (!isSelected) { - highlighter.highlight(event.target) - } - }} - onPointerLeave={async () => { - highlighter.removeAll() - outputPanel.update('readout', '(none)', { - easting: '-', - northing: '-', - depth: '-', - distance: '-', - }, - ) - }} - onPointerMove={async (event) => { - if (crsRef.current && event.position) { - const utmPos = crsRef.current.worldToUtm(...event.position) - let distance = '-' - if (event.position) { - v.set(event.position[0], event.position[1], event.position[2]) - distance = v.distanceTo(camera.position).toFixed(1) - } - outputPanel.update('readout', wellbore.name, { - easting: utmPos.easting.toFixed(1), - northing: utmPos.northing.toFixed(1), - depth: (-utmPos.altitude).toFixed(1), - distance, - }) - } - }} - > - - - - - {args.showShoes && ()} - - {args.showCasingAndCompletion && ( - - - } /> - - )} - - {args.showPerforations && } - {(args.showDepthMarkers && isActiveWell) && } - - {args.showPicks && } - {/* {isSelected && } */} - - - - ) - }} - /> - - - - ) -} - -const meta = { - title: 'examples/Wells', - loaders: [async () => { - useAnnotationsState.getState().clear() - useOutputPanelState.setState({ groups: {} }) - }], - component: Example, - argTypes: { - surfaceId: { - options: [undefined, ...Object.keys(storyArgs.surfaceOptions)], - control: { - type: 'select', - labels: { 'undefined': '(none)', ...storyArgs.surfaceOptions }, - }, - }, - colorRamp: { - options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], - control: { - type: 'select', - labels: { - '0': 'rainbow', - '1': 'jet', - '2': 'portland', - '3': 'earth', - '4': 'plasma', - '5': 'salinity', - '6': 'seismic', - '7': 'seismic2', - '8': 'spectrum', - '9': 'gray', - } - } - }, - color: { - control: { - type: 'color', - } - }, - opacity: { - control: { - type: 'range', - min: 0, - max: 1, - step: 0.01, - } - }, - maxError: { - control: { - type: 'range', - min: 0.1, - max: 10, - step: 0.01, - } - }, - contoursInterval: { - options: [1, 2, 5, 10, 25, 50, 100, 250, 500], - control: { - type: 'select' - } - }, - contoursColorMode: { - options: [0, 1, 2], - control: { - type: 'radio', - labels: { '0': 'darken', '1': 'lighten', '2': 'mixed' }, - }, - }, - contoursThickness: { - control: { - type: 'range', - min: 0.5, - max: 5, - step: 0.1, - } - }, - contoursColor: { - control: { - type: 'color', - } - }, - casingOpacity: { - control: { - type: 'range', - min: 0, - max: 1, - step: 0.01, - } - }, - gridCellSize: { - options: [250, 500, 1000], - control: { - type: 'select' - } - }, - }, - parameters: { - scale: 1000, - cameraPosition: [0, 15000, 20000], - cameraTarget: [0, 0, 0], - colorScale, - }, - decorators: [ - //PerformanceDecorator, - EventEmitterDecorator, - AnnotationsDecorator, - Canvas3dDecorator, - GeneratorsProviderDecorator, - //DepthSelectorDecorator, - WellMapDecorator, - OutputPanelDecorator, - DataProviderDecorator, - ], -} satisfies Meta - - -type Story = StoryObj - -export const Default: Story = { - args: { - surfaceId: undefined, - useColorRamp: true, - reverseRamp: false, - color: 'white', - colorRamp: 0, - opacity: 0.98, - maxError: 5, - wireframe: false, - showContours: false, - contoursColorMode: ContourColorMode.darken, - contoursColorModeFactor: 0.5, - contoursInterval: 10, - contoursThickness: 0.8, - contoursColor: '#000000', - depthMarkerInterval: 250, - showPicks: false, - showShoes: true, - showDepthMarkers: false, - showCasingAndCompletion: false, - showPerforations: true, - showCameraTarget: true, - sizeMultiplier: 3, - casingOpacity: 1, - gridCellSize: 500, - }, -} - +import { useThree } from '@react-three/fiber' +import type { Meta, StoryObj } from '@storybook/react' +import { scaleOrdinal } from 'd3-scale' +import { useEffect, useMemo, useRef, useState } from 'react' +import { RepeatWrapping, TextureLoader, Vector3 } from 'three' +import { useAnnotationsState } from '../../components/Annotations/annotations-state' +import { CameraTargetMarker } from '../../components/CameraTargetMarker/CameraTargetMarker' +import { Distance } from '../../components/Distance/Distance' +import { BoxGrid } from '../../components/Grids/BoxGrid/BoxGrid' +import { useHighlighter } from '../../components/Handlers/Highlighter/highlight-state' +import { Highlighter } from '../../components/Handlers/Highlighter/Highlighter' +import { useOutputPanel, useOutputPanelState } from '../../components/Html/OutputPanel/output-panel-state' +import { ObservableGroup } from '../../components/ObservableGroup/ObservableGroup' +import { Surface } from '../../components/Surfaces/Surface' +import { ContourColorMode } from '../../components/Surfaces/SurfaceMaterial' +import { UtmArea } from '../../components/UtmArea/UtmArea' +import { UtmPosition } from '../../components/UtmArea/UtmPosition' +import { BasicTrajectory } from '../../components/Wellbores/BasicTrajectory/BasicTrajectory' +import { Casings } from '../../components/Wellbores/Casings/Casings' +import { CompletionTools } from '../../components/Wellbores/CompletionTools/CompletionTools' +import { DepthMarkers } from '../../components/Wellbores/DepthMarkers/DepthMarkers' +import { Perforations } from '../../components/Wellbores/Perforations/Perforations' +import { Picks } from '../../components/Wellbores/Picks/Picks' +import { Shoes } from '../../components/Wellbores/Shoes/Shoes' +import { TubeTrajectory } from '../../components/Wellbores/TubeTrajectory/TubeTrajectory' +import { Wellbore } from '../../components/Wellbores/Wellbore/Wellbore' +import { WellboreBounds } from '../../components/Wellbores/WellboreBounds/WellboreBounds' +import { WellboreLabel } from '../../components/Wellbores/WellboreLabel/WellboreLabel' +import { Wells } from '../../components/Wellbores/Wells/Wells' +import { WellboreSelectedEvent, wellboreSelectedEventType } from '../../events/wellbore-events' +import { CRS } from '../../sdk/projection/crs' +import { Vec2, Vec3 } from '../../sdk/types/common' +import { AnnotationsDecorator } from '../decorators/annotations-decorator' +import { Canvas3dDecorator } from '../decorators/canvas-3d-decorator' +import { DataProviderDecorator } from '../decorators/data-provider-decorator' +import { EventEmitterDecorator } from '../decorators/event-emitter-decorator' +import { GeneratorsProviderDecorator } from '../decorators/generators-provider-decorator' +import { OutputPanelDecorator } from '../decorators/output-panel-decorator' +import { WellMapDecorator } from '../decorators/well-map-decorator' +import { useSurfaceMetaDict } from '../hooks/useSurfaceMeta' +import { useWellboreHeaders } from '../hooks/useWellboreHeaders' +import storyArgs from '../story-args.json' +//import { PerformanceDecorator } from '../decorators/performance-decorator' + +const loader = new TextureLoader() +const normalMap = loader.load('normal_map.jpg') +normalMap.anisotropy = 4 + +const colorScale = scaleOrdinal(["tomato", "#4e79a7", "#f28e2c", "#76b7b2", "#59a14f", "#edc949", "#af7aa1", "#ff9da7", "#9c755f", "#86a68c", "darkgreen", "purple", "#c3b380"]) + +const utmZone = storyArgs.utmZone +const origin = storyArgs.origin as Vec2 + +const v = new Vector3() + +type ExampleProps = { + selected?: string, + surfaceId?: string, + useColorRamp: boolean, + reverseRamp: boolean, + color?: string, + colorRamp: number, + opacity: number, + maxError: number, + wireframe: boolean, + showContours: boolean, + contoursInterval: number, + contoursColorMode: ContourColorMode, + contoursColorModeFactor: number, + contoursThickness: number, + contoursColor: string, + depthMarkerInterval: number, + showPicks: boolean, + showShoes: boolean, + showDepthMarkers: boolean, + showCasingAndCompletion: boolean, + showPerforations: boolean, + showCameraTarget: boolean, + casingOpacity: number, + sizeMultiplier: number, + gridCellSize: number, + +} + +const Example = (args: ExampleProps) => { + const [selected, setSelected] = useState(args.selected) + const crsRef = useRef(null) + + const [gridSize, setGridSize] = useState([0, 0, 0]) + const [gridPosition, setGridPosition] = useState([0, 0, 0]) + + const highlighter = useHighlighter() + const outputPanel = useOutputPanel() + + const { camera } = useThree() + + const toggleVisibility = useAnnotationsState(state => state.toggleVisibility) + + const wellbores = useWellboreHeaders() + const surfaceMeta = useSurfaceMetaDict() + + const included = useMemo(() => wellbores.map(d => d.id), [wellbores]) + + const surface = useMemo(() => { + return args.surfaceId ? surfaceMeta[args.surfaceId] : null + }, [args.surfaceId, surfaceMeta]) + + useEffect(() => { + if (surface) { + normalMap.repeat.set( + Math.ceil((surface.header.nx * surface.header.xinc) / 500), + Math.ceil((surface.header.ny * surface.header.yinc) / 500), + ) + normalMap.wrapS = RepeatWrapping + normalMap.wrapT = RepeatWrapping + } + }, [surface]) + + useEffect(() => { + function onKeyPress(event: KeyboardEvent) { + if (event.code === 'Space') { + toggleVisibility() + } + } + addEventListener('keypress', onKeyPress) + return () => removeEventListener('keypress', onKeyPress) + }, [toggleVisibility]) + + useEffect(() => { + if (outputPanel) { + if (!outputPanel.has('selected')) { + outputPanel.add('selected', { + label: 'Selected', + value: '(none)', + color: 'tomato', + order: 2, + details: { + status: { label: 'Status', value: '-' }, + depth: { label: 'Total Depth (Md Msl)', value: '-' }, + kickoff: { label: 'Kickoff (Md Msl)', value: '-' }, + easting: { label: 'Easting (wellhead)', value: '-' }, + northing: { label: 'Northing (wellhead)', value: '-' }, + depthRef: { label: 'Depth ref. (Msl)', value: '-' }, + } + }) + } + if (!outputPanel.has('readout')) { + outputPanel.add('readout', { + label: 'Readout', + color: 'orange', + value: '(none)', + order: 1, + details: { + easting: { label: 'Easting', value: '-' }, + northing: { label: 'Northing', value: '-' }, + depth: { label: 'TVD (Msl)', value: '-' }, + distance: { label: 'Distance (m)', value: '-' }, + }, + }) + } + } + }, [outputPanel]) + + useEffect(() => { + if (args.selected) dispatchEvent(new WellboreSelectedEvent({ id: args.selected })) + }, [args.selected]) + + useEffect(() => { + function onSelect(event: WellboreSelectedEvent) { + setSelected(event.detail.id) + const wellbore = wellbores.find(d => d.id === event.detail.id) + if (wellbore) { + outputPanel.update('selected', wellbore.name, { + status: wellbore.status, + depth: wellbore.depthMdMsl.toFixed(1), + kickoff: wellbore.kickoffDepthMsl?.toFixed(1) || '-', + easting: wellbore.easting.toFixed(1), + northing: wellbore.northing.toFixed(1), + depthRef: wellbore.depthReferenceElevation.toFixed(1), + }) + } + } + addEventListener(wellboreSelectedEventType, onSelect) + + return () => removeEventListener(wellboreSelectedEventType, onSelect) + }, [outputPanel, wellbores]) + + useEffect(() => { + return () => { + highlighter.removeAll() + } + }, [highlighter]) + + return ( + <> + + + + {args.showCameraTarget && } + {!surface && ( + + )} + + {surface && ( + { + // console.log(e.position && e.position[1]) + // }} + /> + + )} + + { + setGridPosition(state.center) + setGridSize(state.size) + }} + > + { + const color = isActiveWell ? colorScale(wellbore.name.replace(wellbore.well, '') || 'Main') : '#aaa' + + return ( + + { + setSelected(event.ref) + dispatchEvent(new WellboreSelectedEvent({ id: event.ref, position: event.position, flyTo: !event.keys.ctrlKey })) + console.log(wellbore.id) + }} + onPointerEnter={async (event) => { + if (!isSelected) { + highlighter.highlight(event.target) + } + }} + onPointerLeave={async () => { + highlighter.removeAll() + outputPanel.update('readout', '(none)', { + easting: '-', + northing: '-', + depth: '-', + distance: '-', + }, + ) + }} + onPointerMove={async (event) => { + if (crsRef.current && event.position) { + const utmPos = crsRef.current.worldToUtm(...event.position) + let distance = '-' + if (event.position) { + v.set(event.position[0], event.position[1], event.position[2]) + distance = v.distanceTo(camera.position).toFixed(1) + } + outputPanel.update('readout', wellbore.name, { + easting: utmPos.easting.toFixed(1), + northing: utmPos.northing.toFixed(1), + depth: (-utmPos.altitude).toFixed(1), + distance, + }) + } + }} + > + + + + + {args.showShoes && ()} + + {args.showCasingAndCompletion && ( + + + } /> + + )} + + {args.showPerforations && } + {(args.showDepthMarkers && isActiveWell) && } + + {args.showPicks && } + {/* {isSelected && } */} + + + + ) + }} + /> + + + + ) +} + +const meta = { + title: 'examples/Wells', + loaders: [async () => { + useAnnotationsState.getState().clear() + useOutputPanelState.setState({ groups: {} }) + }], + component: Example, + argTypes: { + surfaceId: { + options: [undefined, ...Object.keys(storyArgs.surfaceOptions)], + control: { + type: 'select', + labels: { 'undefined': '(none)', ...storyArgs.surfaceOptions }, + }, + }, + colorRamp: { + options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + control: { + type: 'select', + labels: { + '0': 'rainbow', + '1': 'jet', + '2': 'portland', + '3': 'earth', + '4': 'plasma', + '5': 'salinity', + '6': 'seismic', + '7': 'seismic2', + '8': 'spectrum', + '9': 'gray', + } + } + }, + color: { + control: { + type: 'color', + } + }, + opacity: { + control: { + type: 'range', + min: 0, + max: 1, + step: 0.01, + } + }, + maxError: { + control: { + type: 'range', + min: 0.1, + max: 10, + step: 0.01, + } + }, + contoursInterval: { + options: [1, 2, 5, 10, 25, 50, 100, 250, 500], + control: { + type: 'select' + } + }, + contoursColorMode: { + options: [0, 1, 2], + control: { + type: 'radio', + labels: { '0': 'darken', '1': 'lighten', '2': 'mixed' }, + }, + }, + contoursThickness: { + control: { + type: 'range', + min: 0.5, + max: 5, + step: 0.1, + } + }, + contoursColor: { + control: { + type: 'color', + } + }, + casingOpacity: { + control: { + type: 'range', + min: 0, + max: 1, + step: 0.01, + } + }, + gridCellSize: { + options: [250, 500, 1000], + control: { + type: 'select' + } + }, + }, + parameters: { + scale: 1000, + cameraPosition: [0, 15000, 20000], + cameraTarget: [0, 0, 0], + colorScale, + }, + decorators: [ + //PerformanceDecorator, + EventEmitterDecorator, + AnnotationsDecorator, + Canvas3dDecorator, + GeneratorsProviderDecorator, + //DepthSelectorDecorator, + WellMapDecorator, + OutputPanelDecorator, + DataProviderDecorator, + ], +} satisfies Meta + + +type Story = StoryObj + +export const Default: Story = { + args: { + surfaceId: undefined, + useColorRamp: true, + reverseRamp: false, + color: 'white', + colorRamp: 0, + opacity: 0.98, + maxError: 5, + wireframe: false, + showContours: false, + contoursColorMode: ContourColorMode.darken, + contoursColorModeFactor: 0.5, + contoursInterval: 10, + contoursThickness: 0.8, + contoursColor: '#000000', + depthMarkerInterval: 250, + showPicks: false, + showShoes: true, + showDepthMarkers: false, + showCasingAndCompletion: false, + showPerforations: true, + showCameraTarget: false, + sizeMultiplier: 3, + casingOpacity: 1, + gridCellSize: 500, + }, +} + export default meta \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index c972b19..b5afa57 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,6 +21,6 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true }, - "include": ["src", "tests"], + "include": ["src"], "exclude": ["vite.config.ts", "vite.config.static.ts"], } From 2be3692c0d5aa3c084478432ec85e1f5f65548e1 Mon Sep 17 00:00:00 2001 From: kjerandp Date: Fri, 7 Mar 2025 12:46:22 +0100 Subject: [PATCH 2/2] chore: Add support for React 19, update docs and deps. --- README.md | 24 ++++++--- documents/getting-started.md | 23 ++++---- package-lock.json | 52 ++++++++++++------- package.json | 22 ++++---- .../BasicTrajectory/BasicTrajectory.tsx | 4 +- src/storybook/dependencies/api.ts | 2 +- vite.config.ts | 10 +--- 7 files changed, 81 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index 3632421..8aea821 100644 --- a/README.md +++ b/README.md @@ -31,21 +31,33 @@ This library has dependencies to the following libs: npm i videx-3d ``` -You also need to install the peer-dependencies: +You also need to install the required peer-dependencies. + +First, if not already installed, you'll need React version 18 or later: ``` // react -npm i react@18 react-dom@18 +npm i react react-dom +``` +React Three Fiber (R3F): +``` +// react three fiber +npm i @react-three/fiber +``` +Note that if using React 18, you need `@react-three/fiber` version 8. + +Depending on your needs you might consider installing the following additional packages: +``` // three js npm i three -// react three fiber -npm i @react-three/fiber +// drei +npm i @react-three/drei -// comlink +// comlink - if using web workers npm i comlink ``` - +Note that if using React 18, you need `@react-three/drei` version 9. ## Configure Rendering complex scenes in the browser (single threaded) can quickly become bottlenecked, degrading user experience. For this reason, most of the components have been decoupled from data management and processing, by depending on a _store interface_ and _generator_ functions. This allows the heavy work to be offloaded to web workers (but not required). diff --git a/documents/getting-started.md b/documents/getting-started.md index 01093e1..073854d 100644 --- a/documents/getting-started.md +++ b/documents/getting-started.md @@ -2,22 +2,23 @@ ## Creating a React app -First, we need a basic React web application running. At the time being this must be React v18 due to missing support for v19 in peer dependencies. - -To create a new React v18 app, you can use Next.js: +First, we need a basic React web application running. Quickest and easiest way to do so it to use Vite: ``` -npx create-next-app@14 +npm create vite@latest my-app --template react +cd my-app +npm install +npm run dev ``` -Please note that we have to use next version 14 for react v18! +Note that we need react v18 or later, and typescript is recommended. ## Installing peer dependencies -Besides React, we will also need threejs, react three fiber and comlink: +Besides React, we will also need to install react three fiber: ``` -npm install three @react-three/fiber comlink +npm install three @react-three/fiber ``` ## Make a simple 3d scene @@ -27,8 +28,6 @@ Before adding the `videx-3d` components library we should create a basic 3d scen In this example, we will be using typescript. We start by creating a new file for a component named "Test.tsx": ```tsx -'use client' // <-- if using next - // Test.tsx import { Canvas } from '@react-three/fiber' @@ -47,10 +46,10 @@ export const Test = () => { Then import this file and render the Scene component in your app: ```tsx -// page.tsx +// App.tsx import { Test } from './Test' -export default function Home() { +export default function App() { return (
@@ -308,10 +307,8 @@ We return a mesh element, this time passing the generated geometry as a prop to Let's replace the cubes from our earlier example with the new Tube component: ```tsx -'use client' // <-- if using next // Test.tsx - import { CameraControls } from '@react-three/drei' import { Canvas } from '@react-three/fiber' import { Tube } from './Tube' diff --git a/package-lock.json b/package-lock.json index 6d8e25e..50390dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,14 +19,14 @@ "d3-scale": "^4.0.2", "d3-selection": "^3.0.0", "lodash.filter": "^4.6.0", - "nanoid": "^5.0.7", - "p-limit": "^6.1.0", - "p-queue": "^8.0.1", - "proj4": "^2.11.0", - "rbush": "^3.0.1", + "nanoid": "^5.1.2", + "p-limit": "^6.2.0", + "p-queue": "^8.1.0", + "proj4": "^2.15.0", + "rbush": "^4.0.1", "react-use-measure": "^2.1.7", "use-zustand": "^0.2.0", - "zustand": "^5.0.0-rc.2" + "zustand": "^5.0.3" }, "devDependencies": { "@chromatic-com/storybook": "^3.2.4", @@ -76,6 +76,7 @@ "vite": "^6.1.0", "vite-plugin-css-injected-by-js": "^3.5.2", "vite-plugin-dts": "^4.5.0", + "vite-plugin-externalize-deps": "^0.9.0", "vite-plugin-glsl": "^1.3.1", "vite-plugin-static-copy": "^2.2.0", "vitest": "^3.0.7" @@ -83,7 +84,10 @@ "peerDependencies": { "@react-three/drei": ">=9", "@react-three/fiber": ">=8", - "comlink": ">=4.4" + "comlink": ">=4.4", + "react": ">=18", + "react-dom": ">=18", + "three": ">=0.169" } }, "node_modules/@adobe/css-tools": { @@ -7388,18 +7392,18 @@ "license": "MIT" }, "node_modules/quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", "license": "ISC" }, "node_modules/rbush": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", - "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-4.0.1.tgz", + "integrity": "sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ==", "license": "MIT", "dependencies": { - "quickselect": "^2.0.0" + "quickselect": "^3.0.0" } }, "node_modules/react": { @@ -8236,7 +8240,6 @@ "version": "0.174.0", "resolved": "https://registry.npmjs.org/three/-/three-0.174.0.tgz", "integrity": "sha512-p+WG3W6Ov74alh3geCMkGK9NWuT62ee21cV3jEnun201zodVF4tCE5aZa2U122/mkLRmhJJUQmLLW1BH00uQJQ==", - "dev": true, "license": "MIT", "peer": true }, @@ -8917,6 +8920,19 @@ } } }, + "node_modules/vite-plugin-externalize-deps": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/vite-plugin-externalize-deps/-/vite-plugin-externalize-deps-0.9.0.tgz", + "integrity": "sha512-wg3qb5gCy2d1KpPKyD9wkXMcYJ84yjgziHrStq9/8R7chhUC73mhQz+tVtvhFiICQHsBn1pnkY4IBbPqF9JHNw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/voracious" + }, + "peerDependencies": { + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + } + }, "node_modules/vite-plugin-glsl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/vite-plugin-glsl/-/vite-plugin-glsl-1.3.3.tgz", @@ -9370,9 +9386,9 @@ } }, "node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.0.tgz", + "integrity": "sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==", "license": "MIT", "engines": { "node": ">=12.20" diff --git a/package.json b/package.json index ff14105..5fa2651 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "videx-3d", - "version": "0.1.2-beta", + "version": "0.1.3-beta", "private": false, "type": "module", "license": "MIT", @@ -54,14 +54,14 @@ "d3-scale": "^4.0.2", "d3-selection": "^3.0.0", "lodash.filter": "^4.6.0", - "nanoid": "^5.0.7", - "p-limit": "^6.1.0", - "p-queue": "^8.0.1", - "proj4": "^2.11.0", - "rbush": "^3.0.1", + "nanoid": "^5.1.2", + "p-limit": "^6.2.0", + "p-queue": "^8.1.0", + "proj4": "^2.15.0", + "rbush": "^4.0.1", "react-use-measure": "^2.1.7", "use-zustand": "^0.2.0", - "zustand": "^5.0.0-rc.2" + "zustand": "^5.0.3" }, "devDependencies": { "@chromatic-com/storybook": "^3.2.4", @@ -111,13 +111,17 @@ "vite": "^6.1.0", "vite-plugin-css-injected-by-js": "^3.5.2", "vite-plugin-dts": "^4.5.0", + "vite-plugin-externalize-deps": "^0.9.0", "vite-plugin-glsl": "^1.3.1", "vite-plugin-static-copy": "^2.2.0", "vitest": "^3.0.7" }, "peerDependencies": { - "@react-three/fiber": ">=8", "@react-three/drei": ">=9", - "comlink": ">=4.4" + "@react-three/fiber": ">=8", + "comlink": ">=4.4", + "react": ">=18", + "react-dom": ">=18", + "three": ">=0.169" } } diff --git a/src/components/Wellbores/BasicTrajectory/BasicTrajectory.tsx b/src/components/Wellbores/BasicTrajectory/BasicTrajectory.tsx index 4345d96..95ab951 100644 --- a/src/components/Wellbores/BasicTrajectory/BasicTrajectory.tsx +++ b/src/components/Wellbores/BasicTrajectory/BasicTrajectory.tsx @@ -1,14 +1,16 @@ import { useEffect, useMemo, useState } from 'react' -import { BufferGeometry, Color, LineBasicMaterial, Material } from 'three' +import { BufferGeometry, Color, Line, LineBasicMaterial, Material } from 'three' import { useGenerator } from '../../../hooks/useGenerator' import { unpackBufferGeometry } from '../../../sdk/geometries/packing' +import { extend } from '@react-three/fiber' import { useWellboreContext } from '../../../hooks/useWellboreContext' import { queue } from '../../../sdk/utils/limiter' import { CommonComponentProps, CustomMaterialProps } from '../../common' import { basicTrajectory, BasicTrajectoryGeneratorResponse } from './basic-trajectory-defs' +extend({ 'ThreeLine': Line }) /** * BasicTrajectory props * @expand diff --git a/src/storybook/dependencies/api.ts b/src/storybook/dependencies/api.ts index 825f16a..3d1b65a 100644 --- a/src/storybook/dependencies/api.ts +++ b/src/storybook/dependencies/api.ts @@ -1,7 +1,7 @@ export async function get(url: string): Promise { // use correct path when not running locally - if (!self.location.origin.startsWith('http://localhost')) { + if (!self.location.origin.startsWith('http://')) { url = '/videx-3d' + url } diff --git a/vite.config.ts b/vite.config.ts index cbd3a2f..274ea6b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,15 +3,9 @@ import { resolve } from 'path' import { defineConfig } from 'vite' import cssInjectedByJsPlugin from "vite-plugin-css-injected-by-js" import dts from 'vite-plugin-dts' +import { externalizeDeps } from 'vite-plugin-externalize-deps' import glsl from 'vite-plugin-glsl' import { viteStaticCopy } from 'vite-plugin-static-copy' -import pkg from './package.json' with { type: 'json' } - - -const externalDependencies = Object.keys({ - ...pkg.peerDependencies, - ...pkg.dependencies, -}) // https://vitejs.dev/config/ export default defineConfig({ @@ -23,6 +17,7 @@ export default defineConfig({ } }, plugins: [ + externalizeDeps(), react(), glsl(), cssInjectedByJsPlugin({ @@ -60,7 +55,6 @@ export default defineConfig({ output: { chunkFileNames: 'chunk-[hash].js', }, - external: ['@babel/runtime', 'react/jsx-runtime', ...externalDependencies], treeshake: 'recommended' }, }