diff --git a/components/Layers/Model/index.tsx b/components/Layers/Model/index.tsx new file mode 100644 index 00000000..8d39998e --- /dev/null +++ b/components/Layers/Model/index.tsx @@ -0,0 +1,102 @@ +/* eslint-disable import/no-extraneous-dependencies */ +import * as THREE from 'three'; +import maplibregl from 'maplibre-gl'; +import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'; +import { COORDS_EKATERINBURG } from 'constants/coords'; + +// parameters to ensure the model is georeferenced correctly on the map +const modelOrigin = COORDS_EKATERINBURG; +const modelAltitude = 0; +const modelRotate = [Math.PI / 2, 0, 0]; + +const modelAsMercatorCoordinate = maplibregl.MercatorCoordinate.fromLngLat( + modelOrigin, + modelAltitude, +); + +// transformation parameters to position, rotate and scale the 3D model onto the map +const modelTransform = { + translateX: modelAsMercatorCoordinate.x, + translateY: modelAsMercatorCoordinate.y, + translateZ: modelAsMercatorCoordinate.z, + rotateX: modelRotate[0], + rotateY: modelRotate[1], + rotateZ: modelRotate[2], + /* Since our 3D model is in real world meters, a scale transform needs to be + * applied since the CustomLayerInterface expects units in MercatorCoordinates. + */ + scale: modelAsMercatorCoordinate.meterInMercatorCoordinateUnits(), +}; + +// configuration of the custom layer for a 3D model per the CustomLayerInterface +export const getModelLayer = (id: string, path: string) => ({ + id, + type: 'custom', + renderingMode: '3d', + onAdd(map, gl) { + this.camera = new THREE.Camera(); + this.scene = new THREE.Scene(); + + // create two three.js lights to illuminate the model + const directionalLight = new THREE.DirectionalLight(0xffffff); + directionalLight.position.set(0, -70, 100).normalize(); + this.scene.add(directionalLight); + + const directionalLight2 = new THREE.DirectionalLight(0xffffff); + directionalLight2.position.set(0, 70, 100).normalize(); + this.scene.add(directionalLight2); + + // use the three.js GLTF loader to add the 3D model to the three.js scene + const loader = new GLTFLoader(); + loader.load(path, (gltf) => { + this.scene.add(gltf.scene); + }); + this.map = map; + + // use the MapLibre GL JS map canvas for three.js + this.renderer = new THREE.WebGLRenderer({ + canvas: map.getCanvas(), + context: gl, + antialias: true, + }); + + this.renderer.autoClear = false; + }, + render(gl, matrix) { + const rotationX = new THREE.Matrix4().makeRotationAxis( + new THREE.Vector3(1, 0, 0), + modelTransform.rotateX, + ); + const rotationY = new THREE.Matrix4().makeRotationAxis( + new THREE.Vector3(0, 1, 0), + modelTransform.rotateY, + ); + const rotationZ = new THREE.Matrix4().makeRotationAxis( + new THREE.Vector3(0, 0, 1), + modelTransform.rotateZ, + ); + + const m = new THREE.Matrix4().fromArray(matrix); + const l = new THREE.Matrix4() + .makeTranslation( + modelTransform.translateX, + modelTransform.translateY, + modelTransform.translateZ, + ) + .scale( + new THREE.Vector3( + modelTransform.scale, + -modelTransform.scale, + modelTransform.scale, + ), + ) + .multiply(rotationX) + .multiply(rotationY) + .multiply(rotationZ); + + this.camera.projectionMatrix = m.multiply(l); + this.renderer.resetState(); + this.renderer.render(this.scene, this.camera); + this.map.triggerRepaint(); + }, +}); diff --git a/components/Map/Map.tsx b/components/Map/Map.tsx index 58debece..cbaa2745 100644 --- a/components/Map/Map.tsx +++ b/components/Map/Map.tsx @@ -14,6 +14,7 @@ import { DesignCodeSource } from './layers/DesignCodeSource'; import { MapContext } from './providers/MapProvider'; import 'maplibre-gl/dist/maplibre-gl.css'; +import { ModelSource } from './layers/ModelSource'; function MapLayers() { return ( @@ -23,6 +24,7 @@ function MapLayers() { + ); } @@ -40,7 +42,7 @@ export function Map() { pitch: 30, }} minZoom={11} - maxZoom={20} + maxZoom={23} // hash style={{ width: '100vw', height: '100vh', color: 'black' }} mapStyle="https://map-backend.netlify.app/style.json" diff --git a/components/Map/layers/ModelSource.tsx b/components/Map/layers/ModelSource.tsx new file mode 100644 index 00000000..029ebbb1 --- /dev/null +++ b/components/Map/layers/ModelSource.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import { useMap } from 'react-map-gl'; +import { getModelLayer } from 'components/Layers/Model'; + +export function ModelSource() { + const ekbMap = useMap(); + + return ( + { + const map = ekbMap?.current?.getMap?.(); + map.addLayer( + // @ts-ignore + getModelLayer( + `3d-model-${Math.round(Math.random() * 1000)}`, + URL.createObjectURL(e.target.files[0]), + ), + ); + }} + /> + ); +} diff --git a/package.json b/package.json index b05eda3f..cbbfe661 100644 --- a/package.json +++ b/package.json @@ -18,10 +18,10 @@ "@types/lodash": "^4.14.197", "@types/node": "20.5.4", "@types/react": "^18.2.21", + "@types/three": "^0.155.1", "classnames": "^2.3.2", "ekb": "^1.1.4", "framer-motion": "^10.16.1", - "hls.js": "^1.4.10", "lodash": "^4.17.21", "mapbox-gl": "npm:empty-npm-package@1.0.0", "maplibre-gl": "^3.3.0", @@ -36,6 +36,7 @@ "react-modal-sheet": "^2.0.0", "react-redux": "^8.1.2", "redux": "^4.2.1", + "three": "^0.156.0", "typescript": "^5.1.6" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dacd3e19..bfccfe2a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ dependencies: '@types/react': specifier: ^18.2.21 version: 18.2.21 + '@types/three': + specifier: ^0.155.1 + version: 0.155.1 classnames: specifier: ^2.3.2 version: 2.3.2 @@ -26,9 +29,6 @@ dependencies: framer-motion: specifier: ^10.16.1 version: 10.16.1(react-dom@18.2.0)(react@18.2.0) - hls.js: - specifier: ^1.4.10 - version: 1.4.10 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -43,16 +43,16 @@ dependencies: version: 13.4.19(@babel/core@7.20.12)(react-dom@18.2.0)(react@18.2.0) postcss-flexbugs-fixes: specifier: ^5.0.2 - version: 5.0.2(postcss@8.4.21) + version: 5.0.2(postcss@8.4.31) postcss-mixins: specifier: ^9.0.4 - version: 9.0.4(postcss@8.4.21) + version: 9.0.4(postcss@8.4.31) postcss-nesting: specifier: ^12.0.1 - version: 12.0.1(postcss@8.4.21) + version: 12.0.1(postcss@8.4.31) postcss-preset-env: specifier: ^9.1.4 - version: 9.2.0(postcss@8.4.21) + version: 9.2.0(postcss@8.4.31) react: specifier: 18.2.0 version: 18.2.0 @@ -71,6 +71,9 @@ dependencies: redux: specifier: ^4.2.1 version: 4.2.1 + three: + specifier: ^0.156.0 + version: 0.156.0 typescript: specifier: ^5.1.6 version: 5.1.6 @@ -402,18 +405,18 @@ packages: '@csstools/css-tokenizer': 2.2.1 dev: false - /@csstools/postcss-cascade-layers@4.0.0(postcss@8.4.21): + /@csstools/postcss-cascade-layers@4.0.0(postcss@8.4.31): resolution: {integrity: sha512-dVPVVqQG0FixjM9CG/+8eHTsCAxRKqmNh6H69IpruolPlnEF1611f2AoLK8TijTSAsqBSclKd4WHs1KUb/LdJw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.21 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 dev: false - /@csstools/postcss-color-function@3.0.7(postcss@8.4.21): + /@csstools/postcss-color-function@3.0.7(postcss@8.4.31): resolution: {integrity: sha512-/PIB20G1TPCXmQlaJLWIYzTZRZpj6csT4ijgnshIj/kcmniIRroAfDa0xSWnfuO1eNo0NptIaPU7jzUukWn55Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -422,11 +425,11 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.21) - postcss: 8.4.21 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.31) + postcss: 8.4.31 dev: false - /@csstools/postcss-color-mix-function@2.0.7(postcss@8.4.21): + /@csstools/postcss-color-mix-function@2.0.7(postcss@8.4.31): resolution: {integrity: sha512-57/g8aGo5eKFjEeJMiRKh8Qq43K2rCyk5ZZTvJ34TNl4zUtYU5DvLkIkOnhCtL8/a4z9oMA42aOnFPddRrScUQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -435,11 +438,11 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.21) - postcss: 8.4.21 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.31) + postcss: 8.4.31 dev: false - /@csstools/postcss-exponential-functions@1.0.1(postcss@8.4.21): + /@csstools/postcss-exponential-functions@1.0.1(postcss@8.4.31): resolution: {integrity: sha512-ZLK2iSK4DUxeypGce2PnQSdYugUqDTwxnhNiq1o6OyKMNYgYs4eKbvEhFG8JKr1sJWbeqBi5jRr0017l2EWVvg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -448,20 +451,20 @@ packages: '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /@csstools/postcss-font-format-keywords@3.0.0(postcss@8.4.21): + /@csstools/postcss-font-format-keywords@3.0.0(postcss@8.4.31): resolution: {integrity: sha512-ntkGj+1uDa/u6lpjPxnkPcjJn7ChO/Kcy08YxctOZI7vwtrdYvFhmE476dq8bj1yna306+jQ9gzXIG/SWfOaRg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-gamut-mapping@1.0.0(postcss@8.4.21): + /@csstools/postcss-gamut-mapping@1.0.0(postcss@8.4.31): resolution: {integrity: sha512-6UQyK8l9YaG5Ao5rBDcCnKHrLsHiQ1E0zeFQuqDJqEtinVzAPb/MwSw3TenZXL1Rnd7th3tb+4CBFHBXdW5tbQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -470,10 +473,10 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /@csstools/postcss-gradients-interpolation-method@4.0.7(postcss@8.4.21): + /@csstools/postcss-gradients-interpolation-method@4.0.7(postcss@8.4.31): resolution: {integrity: sha512-GT1CzE/Tyr/ei4j5BwKESkHAgg+Gzys/0mAY7W+UiR+XrcYk5hDbOrE/YJIx1rflfO/7La1bDoZtA0YnLl4qNA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -482,11 +485,11 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.21) - postcss: 8.4.21 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.31) + postcss: 8.4.31 dev: false - /@csstools/postcss-hwb-function@3.0.6(postcss@8.4.21): + /@csstools/postcss-hwb-function@3.0.6(postcss@8.4.31): resolution: {integrity: sha512-uQgWt2Ho2yy2S6qthWY7mD5v57NKxi6dD1NB8nAybU5bJSsm+hLXRGm3/zbOH4xNrqO3Cl60DFSNlSrUME3Xjg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -495,70 +498,70 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /@csstools/postcss-ic-unit@3.0.2(postcss@8.4.21): + /@csstools/postcss-ic-unit@3.0.2(postcss@8.4.31): resolution: {integrity: sha512-n28Er7W9qc48zNjJnvTKuVHY26/+6YlA9WzJRksIHiAWOMxSH5IksXkw7FpkIOd+jLi59BMrX/BWrZMgjkLBHg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.21) - postcss: 8.4.21 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.31) + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-initial@1.0.0(postcss@8.4.21): + /@csstools/postcss-initial@1.0.0(postcss@8.4.31): resolution: {integrity: sha512-1l7iHHjIl5qmVeGItugr4ZOlCREDP71mNKqoEyxlosIoiu3Os1nPWMHpuCvDLCLiWI/ONTOg3nzJh7gwHOrqUA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /@csstools/postcss-is-pseudo-class@4.0.3(postcss@8.4.21): + /@csstools/postcss-is-pseudo-class@4.0.3(postcss@8.4.31): resolution: {integrity: sha512-/dt5M9Ty/x3Yiq0Nm/5PJJzwkVFchJgdjKVnryBPtoMCb9ohb/nDIJOwr/Wr3hK3FDs1EA1GE6PyRYsUmQPS8Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.21 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 dev: false - /@csstools/postcss-logical-float-and-clear@2.0.0(postcss@8.4.21): + /@csstools/postcss-logical-float-and-clear@2.0.0(postcss@8.4.31): resolution: {integrity: sha512-Wki4vxsF6icRvRz8eF9bPpAvwaAt0RHwhVOyzfoFg52XiIMjb6jcbHkGxwpJXP4DVrnFEwpwmrz5aTRqOW82kg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /@csstools/postcss-logical-resize@2.0.0(postcss@8.4.21): + /@csstools/postcss-logical-resize@2.0.0(postcss@8.4.31): resolution: {integrity: sha512-lCQ1aX8c5+WI4t5EoYf3alTzJNNocMqTb+u1J9CINdDhFh1fjovqK+0aHalUHsNstZmzFPNzIkU4Mb3eM9U8SA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-logical-viewport-units@2.0.3(postcss@8.4.21): + /@csstools/postcss-logical-viewport-units@2.0.3(postcss@8.4.31): resolution: {integrity: sha512-xeVxqND5rlQyqLGdH7rX34sIm/JbbQKxpKQP8oD1YQqUHHCLQR9NUS57WqJKajxKN6AcNAMWJhb5LUH5RfPcyA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /@csstools/postcss-media-minmax@1.1.0(postcss@8.4.21): + /@csstools/postcss-media-minmax@1.1.0(postcss@8.4.31): resolution: {integrity: sha512-t5Li/DPC5QmW/6VFLfUvsw/4dNYYseWR0tOXDeJg/9EKUodBgNawz5tuk5vYKtNvoj+Q08odMuXcpS5YJj0AFA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -568,10 +571,10 @@ packages: '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 '@csstools/media-query-list-parser': 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.3(postcss@8.4.21): + /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.3(postcss@8.4.31): resolution: {integrity: sha512-IPL8AvnwMYW+cWtp+j8cW3MFN0RyXNT4hLOvs6Rf2N+NcbvXhSyKxZuE3W9Cv4KjaNoNoGx1d0UhT6tktq6tUw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -580,30 +583,30 @@ packages: '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 '@csstools/media-query-list-parser': 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /@csstools/postcss-nested-calc@3.0.0(postcss@8.4.21): + /@csstools/postcss-nested-calc@3.0.0(postcss@8.4.31): resolution: {integrity: sha512-HsB66aDWAouOwD/GcfDTS0a7wCuVWaTpXcjl5VKP0XvFxDiU+r0T8FG7xgb6ovZNZ+qzvGIwRM+CLHhDgXrYgQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-normalize-display-values@3.0.1(postcss@8.4.21): + /@csstools/postcss-normalize-display-values@3.0.1(postcss@8.4.31): resolution: {integrity: sha512-nUvRxI+ALJwkxZdPU4EDyuM380vP91sAGvI3jAOHs/sr3jfcCOzLkY6xKI1Mr526kZ3RivmMoYM/xq+XFyE/bw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-oklab-function@3.0.7(postcss@8.4.21): + /@csstools/postcss-oklab-function@3.0.7(postcss@8.4.31): resolution: {integrity: sha512-vBFTQD3CARB3u/XIGO44wWbcO7xG/4GsYqJlcPuUGRSK8mtxes6n4vvNFlIByyAZy2k4d4RY63nyvTbMpeNTaQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -612,21 +615,21 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.21) - postcss: 8.4.21 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.31) + postcss: 8.4.31 dev: false - /@csstools/postcss-progressive-custom-properties@3.0.2(postcss@8.4.21): + /@csstools/postcss-progressive-custom-properties@3.0.2(postcss@8.4.31): resolution: {integrity: sha512-YEvTozk1SxnV/PGL5DllBVDuLQ+jiQhyCSQiZJ6CwBMU5JQ9hFde3i1qqzZHuclZfptjrU0JjlX4ePsOhxNzHw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-relative-color-syntax@2.0.7(postcss@8.4.21): + /@csstools/postcss-relative-color-syntax@2.0.7(postcss@8.4.31): resolution: {integrity: sha512-2AiFbJSVF4EyymLxme4JzSrbXykHolx8DdZECHjYKMhoulhKLltx5ccYgtrK3BmXGd3v3nJrWFCc8JM8bjuiOg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -635,21 +638,21 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.21) - postcss: 8.4.21 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.31) + postcss: 8.4.31 dev: false - /@csstools/postcss-scope-pseudo-class@3.0.0(postcss@8.4.21): + /@csstools/postcss-scope-pseudo-class@3.0.0(postcss@8.4.31): resolution: {integrity: sha512-GFNVsD97OuEcfHmcT0/DAZWAvTM/FFBDQndIOLawNc1Wq8YqpZwBdHa063Lq+Irk7azygTT+Iinyg3Lt76p7rg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 dev: false - /@csstools/postcss-stepped-value-functions@3.0.2(postcss@8.4.21): + /@csstools/postcss-stepped-value-functions@3.0.2(postcss@8.4.31): resolution: {integrity: sha512-I3wX44MZVv+tDuWfrd3BTvRB/YRIM2F5v1MBtTI89sxpFn47mNpTwpPYUOGPVCgKlRDfZSlxIUYhUQmqRQZZFQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -658,21 +661,21 @@ packages: '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /@csstools/postcss-text-decoration-shorthand@3.0.3(postcss@8.4.21): + /@csstools/postcss-text-decoration-shorthand@3.0.3(postcss@8.4.31): resolution: {integrity: sha512-d5J9m49HhqXRcw1S6vTZuviHi/iknUKGjBpChiNK1ARg9sSa3b8m5lsWz5Izs8ISORZdv2bZRwbw5Z2R6gQ9kQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/color-helpers': 3.0.2 - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-trigonometric-functions@3.0.2(postcss@8.4.21): + /@csstools/postcss-trigonometric-functions@3.0.2(postcss@8.4.31): resolution: {integrity: sha512-AwzNhF4QOKaLOKvMljwwFkeYXwufhRO15G+kKohHkyoNOL75xWkN+W2Y9ik9tSeAyDv+cYNlYaF+o/a79WjVjg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -681,16 +684,16 @@ packages: '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /@csstools/postcss-unset-value@3.0.0(postcss@8.4.21): + /@csstools/postcss-unset-value@3.0.0(postcss@8.4.31): resolution: {integrity: sha512-P0JD1WHh3avVyKKRKjd0dZIjCEeaBer8t1BbwGMUDtSZaLhXlLNBqZ8KkqHzYWXOJgHleXAny2/sx8LYl6qhEA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 dev: false /@csstools/selector-specificity@2.1.1(postcss-selector-parser@6.0.13)(postcss@8.4.21): @@ -1416,6 +1419,10 @@ packages: tslib: 2.6.0 dev: false + /@tweenjs/tween.js@18.6.4: + resolution: {integrity: sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==} + dev: false + /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: false @@ -1493,16 +1500,35 @@ packages: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true + /@types/stats.js@0.17.0: + resolution: {integrity: sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w==} + dev: false + /@types/supercluster@7.1.0: resolution: {integrity: sha512-6JapQ2GmEkH66r23BK49I+u6zczVDGTtiJEVvKDYZVSm/vepWaJuTq6BXzJ6I4agG5s8vA1KM7m/gXWDg03O4Q==} dependencies: '@types/geojson': 7946.0.10 dev: false + /@types/three@0.155.1: + resolution: {integrity: sha512-uNUwnz/wWRxahjIqTtDYQ1qdE1R1py21obxfuILkT+kKrjocMwRLQQA1l8nMxfQU7VXb7CXu04ucMo8OqZt4ZA==} + dependencies: + '@tweenjs/tween.js': 18.6.4 + '@types/stats.js': 0.17.0 + '@types/webxr': 0.5.4 + fflate: 0.6.10 + lil-gui: 0.17.0 + meshoptimizer: 0.18.1 + dev: false + /@types/use-sync-external-store@0.0.3: resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} dev: false + /@types/webxr@0.5.4: + resolution: {integrity: sha512-41gfGLTtqXZhcmoDlLDHqMJDuwAMwhHwXf9Q2job3TUBsvkNfPNI/3IWVEtLH4tyY1ElWtfwIaoNeqeEX238/Q==} + dev: false + /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6): resolution: {integrity: sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1815,7 +1841,7 @@ packages: postcss-value-parser: 4.2.0 dev: false - /autoprefixer@10.4.16(postcss@8.4.21): + /autoprefixer@10.4.16(postcss@8.4.31): resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -1827,7 +1853,7 @@ packages: fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false @@ -2066,35 +2092,35 @@ packages: which: 2.0.2 dev: true - /css-blank-pseudo@6.0.0(postcss@8.4.21): + /css-blank-pseudo@6.0.0(postcss@8.4.31): resolution: {integrity: sha512-VbfLlOWO7sBHBTn6pwDQzc07Z0SDydgDBfNfCE0nvrehdBNv9RKsuupIRa/qal0+fBZhAALyQDPMKz5lnvcchw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 dev: false - /css-has-pseudo@6.0.0(postcss@8.4.21): + /css-has-pseudo@6.0.0(postcss@8.4.31): resolution: {integrity: sha512-X+r+JBuoO37FBOWVNhVJhxtSBUFHgHbrcc0CjFT28JEdOw1qaDwABv/uunyodUuSy2hMPe9j/HjssxSlvUmKjg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.21 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 dev: false - /css-prefers-color-scheme@9.0.0(postcss@8.4.21): + /css-prefers-color-scheme@9.0.0(postcss@8.4.31): resolution: {integrity: sha512-03QGAk/FXIRseDdLb7XAiu6gidQ0Nd8945xuM7VFVPpc6goJsG9uIO8xQjTxwbPdPIIV4o4AJoOJyt8gwDl67g==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 dev: false /cssdb@7.8.0: @@ -2917,6 +2943,10 @@ packages: dependencies: reusify: 1.0.4 + /fflate@0.6.10: + resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} + dev: false + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3211,10 +3241,6 @@ packages: function-bind: 1.1.1 dev: true - /hls.js@1.4.10: - resolution: {integrity: sha512-wAVSj4Fm2MqOHy5+BlYnlKxXvJlv5IuZHjlzHu18QmjRzSDFQiUDWdHs5+NsFMQrgKEBwuWDcyvaMC9dUzJ5Uw==} - dev: false - /hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: @@ -3633,6 +3659,10 @@ packages: type-check: 0.4.0 dev: true + /lil-gui@0.17.0: + resolution: {integrity: sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==} + dev: false + /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -3763,6 +3793,10 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + /meshoptimizer@0.18.1: + resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==} + dev: false + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -4068,58 +4102,58 @@ packages: hasBin: true dev: true - /postcss-attribute-case-insensitive@6.0.2(postcss@8.4.21): + /postcss-attribute-case-insensitive@6.0.2(postcss@8.4.31): resolution: {integrity: sha512-IRuCwwAAQbgaLhxQdQcIIK0dCVXg3XDUnzgKD8iwdiYdwU4rMWRWyl/W9/0nA4ihVpq5pyALiHB2veBJ0292pw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 dev: false - /postcss-clamp@4.1.0(postcss@8.4.21): + /postcss-clamp@4.1.0(postcss@8.4.31): resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} engines: {node: '>=7.6.0'} peerDependencies: postcss: ^8.4.6 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /postcss-color-functional-notation@6.0.2(postcss@8.4.21): + /postcss-color-functional-notation@6.0.2(postcss@8.4.31): resolution: {integrity: sha512-FsjSmlSufuiFBsIqQ++VxFmvX7zKndZpBkHmfXr4wqhvzM92FTEkAh703iqWTl1U3faTgqioIqCbfqdWiFVwtw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.21) - postcss: 8.4.21 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.31) + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /postcss-color-hex-alpha@9.0.2(postcss@8.4.21): + /postcss-color-hex-alpha@9.0.2(postcss@8.4.31): resolution: {integrity: sha512-SfPjgr//VQ/DOCf80STIAsdAs7sbIbxATvVmd+Ec7JvR8onz9pjawhq3BJM3Pie40EE3TyB0P6hft16D33Nlyg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /postcss-color-rebeccapurple@9.0.1(postcss@8.4.21): + /postcss-color-rebeccapurple@9.0.1(postcss@8.4.31): resolution: {integrity: sha512-ds4cq5BjRieizVb2PnvbJ0omg9VCo2/KzluvoFZbxuGpsGJ5BQSD93CHBooinEtangCM5YqUOerGDl4xGmOb6Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /postcss-custom-media@10.0.2(postcss@8.4.21): + /postcss-custom-media@10.0.2(postcss@8.4.31): resolution: {integrity: sha512-zcEFNRmDm2fZvTPdI1pIW3W//UruMcLosmMiCdpQnrCsTRzWlKQPYMa1ud9auL0BmrryKK1+JjIGn19K0UjO/w==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -4129,10 +4163,10 @@ packages: '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 '@csstools/media-query-list-parser': 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /postcss-custom-properties@13.3.2(postcss@8.4.21): + /postcss-custom-properties@13.3.2(postcss@8.4.31): resolution: {integrity: sha512-2Coszybpo8lpLY24vy2CYv9AasiZ39/bs8Imv0pWMq55Gl8NWzfc24OAo3zIX7rc6uUJAqESnVOMZ6V6lpMjJA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -4141,11 +4175,11 @@ packages: '@csstools/cascade-layer-name-parser': 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /postcss-custom-selectors@7.1.6(postcss@8.4.21): + /postcss-custom-selectors@7.1.6(postcss@8.4.31): resolution: {integrity: sha512-svsjWRaxqL3vAzv71dV0/65P24/FB8TbPX+lWyyf9SZ7aZm4S4NhCn7N3Bg+Z5sZunG3FS8xQ80LrCU9hb37cw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -4154,97 +4188,97 @@ packages: '@csstools/cascade-layer-name-parser': 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.21 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 dev: false - /postcss-dir-pseudo-class@8.0.0(postcss@8.4.21): + /postcss-dir-pseudo-class@8.0.0(postcss@8.4.31): resolution: {integrity: sha512-Oy5BBi0dWPwij/IA+yDYj+/OBMQ9EPqAzTHeSNUYrUWdll/PRJmcbiUj0MNcsBi681I1gcSTLvMERPaXzdbvJg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 dev: false - /postcss-double-position-gradients@5.0.2(postcss@8.4.21): + /postcss-double-position-gradients@5.0.2(postcss@8.4.31): resolution: {integrity: sha512-KTbvdOOy8z8zb0BTkEg4/1vqlRlApdvjw8/pFoehgQl0WVO+fezDGlvo0B8xRA+XccA7ohkQCULKNsiNOx70Cw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.21) - postcss: 8.4.21 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.31) + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /postcss-flexbugs-fixes@5.0.2(postcss@8.4.21): + /postcss-flexbugs-fixes@5.0.2(postcss@8.4.31): resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} peerDependencies: postcss: ^8.1.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /postcss-focus-visible@9.0.0(postcss@8.4.21): + /postcss-focus-visible@9.0.0(postcss@8.4.31): resolution: {integrity: sha512-zA4TbVaIaT8npZBEROhZmlc+GBKE8AELPHXE7i4TmIUEQhw/P/mSJfY9t6tBzpQ1rABeGtEOHYrW4SboQeONMQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 dev: false - /postcss-focus-within@8.0.0(postcss@8.4.21): + /postcss-focus-within@8.0.0(postcss@8.4.31): resolution: {integrity: sha512-E7+J9nuQzZaA37D/MUZMX1K817RZGDab8qw6pFwzAkDd/QtlWJ9/WTKmzewNiuxzeq6WWY7ATiRePVoDKp+DnA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 dev: false - /postcss-font-variant@5.0.0(postcss@8.4.21): + /postcss-font-variant@5.0.0(postcss@8.4.31): resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /postcss-gap-properties@5.0.0(postcss@8.4.21): + /postcss-gap-properties@5.0.0(postcss@8.4.31): resolution: {integrity: sha512-YjsEEL6890P7MCv6fch6Am1yq0EhQCJMXyT4LBohiu87+4/WqR7y5W3RIv53WdA901hhytgRvjlrAhibhW4qsA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /postcss-image-set-function@6.0.1(postcss@8.4.21): + /postcss-image-set-function@6.0.1(postcss@8.4.31): resolution: {integrity: sha512-VlZncC9hhZ5tg0JllY4g6Z28BeoPO8DIkelioEEkXL0AA0IORlqYpTi2L8TUnl4YQrlwvBgxVy+mdZJw5R/cIQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /postcss-js@4.0.1(postcss@8.4.21): + /postcss-js@4.0.1(postcss@8.4.31): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /postcss-lab-function@6.0.7(postcss@8.4.21): + /postcss-lab-function@6.0.7(postcss@8.4.31): resolution: {integrity: sha512-4d1lhDVPukHFqkMv4G5vVcK+tgY52vwb5uR1SWKOaO5389r2q8fMxBWuXSW+YtbCOEGP0/X9KERi9E9le2pJuw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -4253,31 +4287,31 @@ packages: '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.21) - postcss: 8.4.21 + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.31) + postcss: 8.4.31 dev: false - /postcss-logical@7.0.0(postcss@8.4.21): + /postcss-logical@7.0.0(postcss@8.4.31): resolution: {integrity: sha512-zYf3vHkoW82f5UZTEXChTJvH49Yl9X37axTZsJGxrCG2kOUwtaAoz9E7tqYg0lsIoJLybaL8fk/2mOi81zVIUw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /postcss-mixins@9.0.4(postcss@8.4.21): + /postcss-mixins@9.0.4(postcss@8.4.31): resolution: {integrity: sha512-XVq5jwQJDRu5M1XGkdpgASqLk37OqkH4JCFDXl/Dn7janOJjCTEKL+36cnRVy7bMtoBzALfO7bV7nTIsFnUWLA==} engines: {node: '>=14.0'} peerDependencies: postcss: ^8.2.14 dependencies: fast-glob: 3.3.0 - postcss: 8.4.21 - postcss-js: 4.0.1(postcss@8.4.21) - postcss-simple-vars: 7.0.1(postcss@8.4.21) - sugarss: 4.0.1(postcss@8.4.21) + postcss: 8.4.31 + postcss-js: 4.0.1(postcss@8.4.31) + postcss-simple-vars: 7.0.1(postcss@8.4.31) + sugarss: 4.0.1(postcss@8.4.31) dev: false /postcss-nesting@11.2.2(postcss@8.4.21): @@ -4291,146 +4325,146 @@ packages: postcss-selector-parser: 6.0.13 dev: false - /postcss-nesting@12.0.1(postcss@8.4.21): + /postcss-nesting@12.0.1(postcss@8.4.31): resolution: {integrity: sha512-6LCqCWP9pqwXw/njMvNK0hGY44Fxc4B2EsGbn6xDcxbNRzP8GYoxT7yabVVMLrX3quqOJ9hg2jYMsnkedOf8pA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.21 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 dev: false - /postcss-opacity-percentage@2.0.0(postcss@8.4.21): + /postcss-opacity-percentage@2.0.0(postcss@8.4.31): resolution: {integrity: sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /postcss-overflow-shorthand@5.0.0(postcss@8.4.21): + /postcss-overflow-shorthand@5.0.0(postcss@8.4.31): resolution: {integrity: sha512-2rlxDyeSics/hC2FuMdPnWiP9WUPZ5x7FTuArXLFVpaSQ2woPSfZS4RD59HuEokbZhs/wPUQJ1E3MT6zVv94MQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /postcss-page-break@3.0.4(postcss@8.4.21): + /postcss-page-break@3.0.4(postcss@8.4.31): resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} peerDependencies: postcss: ^8 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /postcss-place@9.0.0(postcss@8.4.21): + /postcss-place@9.0.0(postcss@8.4.31): resolution: {integrity: sha512-qLEPD9VPH5opDVemwmRaujODF9nExn24VOC3ghgVLEvfYN7VZLwJHes0q/C9YR5hI2UC3VgBE8Wkdp1TxCXhtg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: false - /postcss-preset-env@9.2.0(postcss@8.4.21): + /postcss-preset-env@9.2.0(postcss@8.4.31): resolution: {integrity: sha512-Lnr4C5gb7t5Cc8akQMJzNdJkqw7s7s7BHUaQSgsuf+CTY9Lsz5lqQTft5yNZr59JyCLz0aFNSAqSLm/xRtcTpg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-cascade-layers': 4.0.0(postcss@8.4.21) - '@csstools/postcss-color-function': 3.0.7(postcss@8.4.21) - '@csstools/postcss-color-mix-function': 2.0.7(postcss@8.4.21) - '@csstools/postcss-exponential-functions': 1.0.1(postcss@8.4.21) - '@csstools/postcss-font-format-keywords': 3.0.0(postcss@8.4.21) - '@csstools/postcss-gamut-mapping': 1.0.0(postcss@8.4.21) - '@csstools/postcss-gradients-interpolation-method': 4.0.7(postcss@8.4.21) - '@csstools/postcss-hwb-function': 3.0.6(postcss@8.4.21) - '@csstools/postcss-ic-unit': 3.0.2(postcss@8.4.21) - '@csstools/postcss-initial': 1.0.0(postcss@8.4.21) - '@csstools/postcss-is-pseudo-class': 4.0.3(postcss@8.4.21) - '@csstools/postcss-logical-float-and-clear': 2.0.0(postcss@8.4.21) - '@csstools/postcss-logical-resize': 2.0.0(postcss@8.4.21) - '@csstools/postcss-logical-viewport-units': 2.0.3(postcss@8.4.21) - '@csstools/postcss-media-minmax': 1.1.0(postcss@8.4.21) - '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.3(postcss@8.4.21) - '@csstools/postcss-nested-calc': 3.0.0(postcss@8.4.21) - '@csstools/postcss-normalize-display-values': 3.0.1(postcss@8.4.21) - '@csstools/postcss-oklab-function': 3.0.7(postcss@8.4.21) - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.21) - '@csstools/postcss-relative-color-syntax': 2.0.7(postcss@8.4.21) - '@csstools/postcss-scope-pseudo-class': 3.0.0(postcss@8.4.21) - '@csstools/postcss-stepped-value-functions': 3.0.2(postcss@8.4.21) - '@csstools/postcss-text-decoration-shorthand': 3.0.3(postcss@8.4.21) - '@csstools/postcss-trigonometric-functions': 3.0.2(postcss@8.4.21) - '@csstools/postcss-unset-value': 3.0.0(postcss@8.4.21) - autoprefixer: 10.4.16(postcss@8.4.21) + '@csstools/postcss-cascade-layers': 4.0.0(postcss@8.4.31) + '@csstools/postcss-color-function': 3.0.7(postcss@8.4.31) + '@csstools/postcss-color-mix-function': 2.0.7(postcss@8.4.31) + '@csstools/postcss-exponential-functions': 1.0.1(postcss@8.4.31) + '@csstools/postcss-font-format-keywords': 3.0.0(postcss@8.4.31) + '@csstools/postcss-gamut-mapping': 1.0.0(postcss@8.4.31) + '@csstools/postcss-gradients-interpolation-method': 4.0.7(postcss@8.4.31) + '@csstools/postcss-hwb-function': 3.0.6(postcss@8.4.31) + '@csstools/postcss-ic-unit': 3.0.2(postcss@8.4.31) + '@csstools/postcss-initial': 1.0.0(postcss@8.4.31) + '@csstools/postcss-is-pseudo-class': 4.0.3(postcss@8.4.31) + '@csstools/postcss-logical-float-and-clear': 2.0.0(postcss@8.4.31) + '@csstools/postcss-logical-resize': 2.0.0(postcss@8.4.31) + '@csstools/postcss-logical-viewport-units': 2.0.3(postcss@8.4.31) + '@csstools/postcss-media-minmax': 1.1.0(postcss@8.4.31) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.3(postcss@8.4.31) + '@csstools/postcss-nested-calc': 3.0.0(postcss@8.4.31) + '@csstools/postcss-normalize-display-values': 3.0.1(postcss@8.4.31) + '@csstools/postcss-oklab-function': 3.0.7(postcss@8.4.31) + '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.31) + '@csstools/postcss-relative-color-syntax': 2.0.7(postcss@8.4.31) + '@csstools/postcss-scope-pseudo-class': 3.0.0(postcss@8.4.31) + '@csstools/postcss-stepped-value-functions': 3.0.2(postcss@8.4.31) + '@csstools/postcss-text-decoration-shorthand': 3.0.3(postcss@8.4.31) + '@csstools/postcss-trigonometric-functions': 3.0.2(postcss@8.4.31) + '@csstools/postcss-unset-value': 3.0.0(postcss@8.4.31) + autoprefixer: 10.4.16(postcss@8.4.31) browserslist: 4.22.1 - css-blank-pseudo: 6.0.0(postcss@8.4.21) - css-has-pseudo: 6.0.0(postcss@8.4.21) - css-prefers-color-scheme: 9.0.0(postcss@8.4.21) + css-blank-pseudo: 6.0.0(postcss@8.4.31) + css-has-pseudo: 6.0.0(postcss@8.4.31) + css-prefers-color-scheme: 9.0.0(postcss@8.4.31) cssdb: 7.8.0 - postcss: 8.4.21 - postcss-attribute-case-insensitive: 6.0.2(postcss@8.4.21) - postcss-clamp: 4.1.0(postcss@8.4.21) - postcss-color-functional-notation: 6.0.2(postcss@8.4.21) - postcss-color-hex-alpha: 9.0.2(postcss@8.4.21) - postcss-color-rebeccapurple: 9.0.1(postcss@8.4.21) - postcss-custom-media: 10.0.2(postcss@8.4.21) - postcss-custom-properties: 13.3.2(postcss@8.4.21) - postcss-custom-selectors: 7.1.6(postcss@8.4.21) - postcss-dir-pseudo-class: 8.0.0(postcss@8.4.21) - postcss-double-position-gradients: 5.0.2(postcss@8.4.21) - postcss-focus-visible: 9.0.0(postcss@8.4.21) - postcss-focus-within: 8.0.0(postcss@8.4.21) - postcss-font-variant: 5.0.0(postcss@8.4.21) - postcss-gap-properties: 5.0.0(postcss@8.4.21) - postcss-image-set-function: 6.0.1(postcss@8.4.21) - postcss-lab-function: 6.0.7(postcss@8.4.21) - postcss-logical: 7.0.0(postcss@8.4.21) - postcss-nesting: 12.0.1(postcss@8.4.21) - postcss-opacity-percentage: 2.0.0(postcss@8.4.21) - postcss-overflow-shorthand: 5.0.0(postcss@8.4.21) - postcss-page-break: 3.0.4(postcss@8.4.21) - postcss-place: 9.0.0(postcss@8.4.21) - postcss-pseudo-class-any-link: 9.0.0(postcss@8.4.21) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.21) - postcss-selector-not: 7.0.1(postcss@8.4.21) + postcss: 8.4.31 + postcss-attribute-case-insensitive: 6.0.2(postcss@8.4.31) + postcss-clamp: 4.1.0(postcss@8.4.31) + postcss-color-functional-notation: 6.0.2(postcss@8.4.31) + postcss-color-hex-alpha: 9.0.2(postcss@8.4.31) + postcss-color-rebeccapurple: 9.0.1(postcss@8.4.31) + postcss-custom-media: 10.0.2(postcss@8.4.31) + postcss-custom-properties: 13.3.2(postcss@8.4.31) + postcss-custom-selectors: 7.1.6(postcss@8.4.31) + postcss-dir-pseudo-class: 8.0.0(postcss@8.4.31) + postcss-double-position-gradients: 5.0.2(postcss@8.4.31) + postcss-focus-visible: 9.0.0(postcss@8.4.31) + postcss-focus-within: 8.0.0(postcss@8.4.31) + postcss-font-variant: 5.0.0(postcss@8.4.31) + postcss-gap-properties: 5.0.0(postcss@8.4.31) + postcss-image-set-function: 6.0.1(postcss@8.4.31) + postcss-lab-function: 6.0.7(postcss@8.4.31) + postcss-logical: 7.0.0(postcss@8.4.31) + postcss-nesting: 12.0.1(postcss@8.4.31) + postcss-opacity-percentage: 2.0.0(postcss@8.4.31) + postcss-overflow-shorthand: 5.0.0(postcss@8.4.31) + postcss-page-break: 3.0.4(postcss@8.4.31) + postcss-place: 9.0.0(postcss@8.4.31) + postcss-pseudo-class-any-link: 9.0.0(postcss@8.4.31) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.31) + postcss-selector-not: 7.0.1(postcss@8.4.31) postcss-value-parser: 4.2.0 dev: false - /postcss-pseudo-class-any-link@9.0.0(postcss@8.4.21): + /postcss-pseudo-class-any-link@9.0.0(postcss@8.4.31): resolution: {integrity: sha512-QNCYIL98VKFKY6HGDEJpF6+K/sg9bxcUYnOmNHJxZS5wsFDFaVoPeG68WAuhsqwbIBSo/b9fjEnTwY2mTSD+uA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 dev: false - /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.21): + /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.31): resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} peerDependencies: postcss: ^8.0.3 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 dev: false - /postcss-selector-not@7.0.1(postcss@8.4.21): + /postcss-selector-not@7.0.1(postcss@8.4.31): resolution: {integrity: sha512-1zT5C27b/zeJhchN7fP0kBr16Cc61mu7Si9uWWLoA3Px/D9tIJPKchJCkUH3tPO5D0pCFmGeApAv8XpXBQJ8SQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 dev: false @@ -4442,13 +4476,13 @@ packages: util-deprecate: 1.0.2 dev: false - /postcss-simple-vars@7.0.1(postcss@8.4.21): + /postcss-simple-vars@7.0.1(postcss@8.4.31): resolution: {integrity: sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A==} engines: {node: '>=14.0'} peerDependencies: postcss: ^8.2.1 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 dev: false /postcss-value-parser@4.2.0: @@ -5028,13 +5062,13 @@ packages: react: 18.2.0 dev: false - /sugarss@4.0.1(postcss@8.4.21): + /sugarss@4.0.1(postcss@8.4.31): resolution: {integrity: sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.3.3 dependencies: - postcss: 8.4.21 + postcss: 8.4.31 dev: false /supercluster@8.0.1: @@ -5083,6 +5117,10 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true + /three@0.156.0: + resolution: {integrity: sha512-r6meetGWDk3aYjDRh6NpKuUkzoPlI3yldDQe2SkwCcqTTB5NZn7vKQBUXyMExvlwZShaLmvAbsVWaFzp1rkk3A==} + dev: false + /tinyqueue@2.0.3: resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} dev: false