diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 3ca8b68f..be05e136 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -28,7 +28,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v6 with: - node-version: 24 + node-version-file: .nvmrc cache: pnpm - name: Install dependencies diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 70f9808a..4d3b17f3 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -17,7 +17,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v6 with: - node-version: 24 + node-version-file: .nvmrc cache: pnpm - name: Install dependencies diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..a45fd52c --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24 diff --git a/package.json b/package.json index 945fecac..0a73f5b5 100644 --- a/package.json +++ b/package.json @@ -26,39 +26,31 @@ "@astrojs/sitemap": "^3.7.2", "@astrojs/tailwind": "^6.0.2", "@headlessui/react": "^2.2.10", - "@heroicons/react": "^2.1.3", - "@react-three/drei": "9.117.0", - "@react-three/fiber": "8.17.10", "@tailwindcss/forms": "^0.5.7", - "animate.css": "^4.1.1", "astro": "^5.18.1", "dayjs": "^1.11.20", "dompurify": "^3.3.3", "framer-motion": "^12.38.0", - "gray-matter": "^4.0.3", - "leaflet": "^1.9.4", - "lodash": "^4.18.1", "marked": "^17.0.5", "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.2.1", - "react-is": "^18.3.1", - "react-leaflet": "^4.2.1", "sass": "^1.99.0", "slugify": "^1.6.9", "tailwindcss": "^3.4.3", - "three": "^0.183.2", "typescript": "^5.4.5" }, "devDependencies": { "@tailwindcss/typography": "^0.5.14", "@types/dompurify": "^3.2.0", - "@types/lodash": "^4.17.24", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", "npm-run-all": "^4.1.5", "pagefind": "^1.5.0" }, + "engines": { + "node": ">=24.0.0" + }, "pnpm": { "overrides": { "minimatch@>=3.0.0 <3.1.4": "3.1.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 25e6f6fe..a06c7146 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,21 +48,9 @@ importers: '@headlessui/react': specifier: ^2.2.10 version: 2.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@heroicons/react': - specifier: ^2.1.3 - version: 2.1.5(react@18.3.1) - '@react-three/drei': - specifier: 9.117.0 - version: 9.117.0(@react-three/fiber@8.17.10(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.183.2))(@types/react@18.3.12)(@types/three@0.183.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.183.2) - '@react-three/fiber': - specifier: 8.17.10 - version: 8.17.10(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.183.2) '@tailwindcss/forms': specifier: ^0.5.7 version: 0.5.9(tailwindcss@3.4.14) - animate.css: - specifier: ^4.1.1 - version: 4.1.1 astro: specifier: ^5.18.1 version: 5.18.1(@types/node@24.12.2)(jiti@1.21.6)(rollup@4.60.1)(sass@1.99.0)(typescript@5.6.3)(yaml@2.8.3) @@ -75,15 +63,6 @@ importers: framer-motion: specifier: ^12.38.0 version: 12.38.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - gray-matter: - specifier: ^4.0.3 - version: 4.0.3 - leaflet: - specifier: ^1.9.4 - version: 1.9.4 - lodash: - specifier: ^4.18.1 - version: 4.18.1 marked: specifier: ^17.0.5 version: 17.0.5 @@ -96,12 +75,6 @@ importers: react-icons: specifier: ^5.2.1 version: 5.3.0(react@18.3.1) - react-is: - specifier: ^18.3.1 - version: 18.3.1 - react-leaflet: - specifier: ^4.2.1 - version: 4.2.1(leaflet@1.9.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) sass: specifier: ^1.99.0 version: 1.99.0 @@ -111,9 +84,6 @@ importers: tailwindcss: specifier: ^3.4.3 version: 3.4.14 - three: - specifier: ^0.183.2 - version: 0.183.2 typescript: specifier: ^5.4.5 version: 5.6.3 @@ -124,9 +94,6 @@ importers: '@types/dompurify': specifier: ^3.2.0 version: 3.2.0 - '@types/lodash': - specifier: ^4.17.24 - version: 4.17.24 '@types/react': specifier: ^18.2.37 version: 18.3.12 @@ -295,10 +262,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - '@babel/template@7.28.6': resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} @@ -315,9 +278,6 @@ packages: resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} engines: {node: '>=18'} - '@dimforge/rapier3d-compat@0.12.0': - resolution: {integrity: sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==} - '@emmetio/abbreviation@2.3.3': resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} @@ -682,11 +642,6 @@ packages: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc - '@heroicons/react@2.1.5': - resolution: {integrity: sha512-FuzFN+BsHa+7OxbvAERtgBTNeZpUjgM/MIizfVkSCL2/edriN0Hx/DWRCR//aPYwO5QX/YlgLGXk+E3PcfZwjA==} - peerDependencies: - react: '>= 16' - '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} @@ -861,14 +816,6 @@ packages: '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} - '@mediapipe/tasks-vision@0.10.17': - resolution: {integrity: sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==} - - '@monogrid/gainmap-js@3.4.0': - resolution: {integrity: sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==} - peerDependencies: - three: '>= 0.159.0' - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1023,41 +970,6 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-leaflet/core@2.1.0': - resolution: {integrity: sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==} - peerDependencies: - leaflet: ^1.9.0 - react: ^18.0.0 - react-dom: ^18.0.0 - - '@react-spring/animated@9.7.5': - resolution: {integrity: sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@react-spring/core@9.7.5': - resolution: {integrity: sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@react-spring/rafz@9.7.5': - resolution: {integrity: sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==} - - '@react-spring/shared@9.7.5': - resolution: {integrity: sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@react-spring/three@9.7.5': - resolution: {integrity: sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==} - peerDependencies: - '@react-three/fiber': '>=6.0' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - three: '>=0.126' - - '@react-spring/types@9.7.5': - resolution: {integrity: sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==} - '@react-stately/flags@3.1.2': resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} @@ -1066,42 +978,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-three/drei@9.117.0': - resolution: {integrity: sha512-UuYnM/qNiP+37R2dVR68R9ufGrWI/OdtDxfJRxtHaXyHWWfj7muEy4vbLZRe95a4fGEfaKy0gdplbG2BFedHtg==} - peerDependencies: - '@react-three/fiber': '>=8.0' - react: '>=18.0' - react-dom: '>=18.0' - three: '>=0.137' - peerDependenciesMeta: - react-dom: - optional: true - - '@react-three/fiber@8.17.10': - resolution: {integrity: sha512-S6bqa4DqUooEkInYv/W+Jklv2zjSYCXAhm6qKpAQyOXhTEt5gBXnA7W6aoJ0bjmp9pAeaSj/AZUoz1HCSof/uA==} - peerDependencies: - expo: '>=43.0' - expo-asset: '>=8.4' - expo-file-system: '>=11.0' - expo-gl: '>=11.0' - react: '>=18.0' - react-dom: '>=18.0' - react-native: '>=0.64' - three: '>=0.133' - peerDependenciesMeta: - expo: - optional: true - expo-asset: - optional: true - expo-file-system: - optional: true - expo-gl: - optional: true - react-dom: - optional: true - react-native: - optional: true - '@react-types/shared@3.33.1': resolution: {integrity: sha512-oJHtjvLG43VjwemQDadlR5g/8VepK56B/xKO2XORPHt9zlW6IZs3tZrYlvH29BMvoqC7RtE7E5UjgbnbFtDGag==} peerDependencies: @@ -1323,9 +1199,6 @@ packages: '@tanstack/virtual-core@3.13.23': resolution: {integrity: sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==} - '@tweenjs/tween.js@23.1.3': - resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1338,9 +1211,6 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/debounce@1.2.4': - resolution: {integrity: sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==} - '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -1351,9 +1221,6 @@ packages: resolution: {integrity: sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==} deprecated: This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed. - '@types/draco3d@1.4.10': - resolution: {integrity: sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==} - '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -1363,9 +1230,6 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/lodash@4.17.24': - resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1384,35 +1248,18 @@ packages: '@types/node@24.12.2': resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} - '@types/offscreencanvas@2019.7.3': - resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} - '@types/prop-types@15.7.13': resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} '@types/react-dom@18.3.1': resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} - '@types/react-reconciler@0.26.7': - resolution: {integrity: sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==} - - '@types/react-reconciler@0.28.9': - resolution: {integrity: sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==} - peerDependencies: - '@types/react': '*' - '@types/react@18.3.12': resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} - '@types/stats.js@0.17.4': - resolution: {integrity: sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==} - - '@types/three@0.183.1': - resolution: {integrity: sha512-f2Pu5Hrepfgavttdye3PsH5RWyY/AvdZQwIVhrc4uNtvF7nOWJacQKcoVJn0S4f0yYbmAE6AR+ve7xDcuYtMGw==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1422,20 +1269,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/webxr@0.5.24': - resolution: {integrity: sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==} - '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@use-gesture/core@10.3.1': - resolution: {integrity: sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==} - - '@use-gesture/react@10.3.1': - resolution: {integrity: sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==} - peerDependencies: - react: '>= 16.8.0' - '@vitejs/plugin-react@4.7.0': resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1468,9 +1304,6 @@ packages: '@vscode/l10n@0.0.18': resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} - '@webgpu/types@0.1.69': - resolution: {integrity: sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1492,9 +1325,6 @@ packages: ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} - animate.css@4.1.1: - resolution: {integrity: sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==} - ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -1528,9 +1358,6 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1582,17 +1409,11 @@ packages: base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.8: resolution: {integrity: sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==} engines: {node: '>=6.0.0'} hasBin: true - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -1616,9 +1437,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -1631,11 +1449,6 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - camera-controls@2.10.1: - resolution: {integrity: sha512-KnaKdcvkBJ1Irbrzl8XD6WtZltkRjp869Jx8c0ujs9K+9WD+1D7ryBsCiVqJYUqt6i/HR5FxT7RLASieUD+Q5w==} - peerDependencies: - three: '>=0.126.1' - caniuse-lite@1.0.30001780: resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==} @@ -1730,11 +1543,6 @@ packages: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} - cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - cross-spawn@6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} @@ -1743,10 +1551,6 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} @@ -1792,9 +1596,6 @@ packages: dayjs@1.11.20: resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} - debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -1837,9 +1638,6 @@ packages: destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} - detect-gpu@5.0.70: - resolution: {integrity: sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==} - detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} @@ -1885,9 +1683,6 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - draco3d@1.5.7: - resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} - dset@3.1.4: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} @@ -1975,11 +1770,6 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - estree-util-attach-comments@3.0.0: resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} @@ -2007,10 +1797,6 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2043,12 +1829,6 @@ packages: picomatch: optional: true - fflate@0.6.10: - resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} - - fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2142,19 +1922,12 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - glsl-noise@0.0.0: - resolution: {integrity: sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==} - gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} - h3@1.15.9: resolution: {integrity: sha512-H7UPnyIupUOYUQu7f2x7ABVeMyF/IbJjqn20WSXpMdnQB260luADUkSgJU7QTWLutq8h3tUayMQ1DdbSYX5LkA==} @@ -2223,9 +1996,6 @@ packages: hastscript@8.0.0: resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} - hls.js@1.6.15: - resolution: {integrity: sha512-E3a5VwgXimGHwpRGV+WxRTKeSp2DW5DI5MWv34ulL3t5UNmyJWCQ1KmLEHbYzcfThfXG8amBL+fCYPneGHC4VA==} - hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -2238,12 +2008,6 @@ packages: http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - immutable@5.1.5: resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} @@ -2308,10 +2072,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2348,9 +2108,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -2384,11 +2141,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - its-fine@1.2.5: - resolution: {integrity: sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==} - peerDependencies: - react: '>=18.0' - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -2399,10 +2151,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.2: - resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} - hasBin: true - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -2433,10 +2181,6 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -2445,12 +2189,6 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - leaflet@1.9.4: - resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==} - - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -2475,9 +2213,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash@4.18.1: - resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -2495,12 +2230,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - maath@0.10.8: - resolution: {integrity: sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==} - peerDependencies: - '@types/three': '>=0.134.0' - three: '>=0.134.0' - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -2590,14 +2319,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - meshline@3.3.1: - resolution: {integrity: sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==} - peerDependencies: - three: '>=0.137' - - meshoptimizer@1.0.1: - resolution: {integrity: sha512-Vix+QlA1YYT3FwmBBZ+49cE5y/b+pRrcXKqGpS5ouh33d3lSp2PoTpCw19E0cKDFWalembrHnIaZetf27a+W2g==} - micromark-core-commonmark@2.0.1: resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} @@ -3038,9 +2759,6 @@ packages: resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} engines: {node: ^10 || ^12 || >=14} - potpack@1.0.2: - resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} - prettier@3.8.1: resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} engines: {node: '>=14'} @@ -3050,16 +2768,10 @@ packages: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} - promise-worker-transferable@1.0.4: - resolution: {integrity: sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==} - prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} @@ -3072,11 +2784,6 @@ packages: radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - react-composer@5.0.3: - resolution: {integrity: sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==} - peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -3087,25 +2794,6 @@ packages: peerDependencies: react: '*' - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - - react-leaflet@4.2.1: - resolution: {integrity: sha512-p9chkvhcKrWn/H/1FFeVSqLdReGwn2qmiobOQGO3BifX+/vV/39qhY8dGqbdcPh1e6jxh/QHriLXr7a4eLFK4Q==} - peerDependencies: - leaflet: ^1.9.0 - react: ^18.0.0 - react-dom: ^18.0.0 - - react-reconciler@0.27.0: - resolution: {integrity: sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: ^18.0.0 - react-refresh@0.17.0: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} @@ -3262,16 +2950,9 @@ packages: resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} engines: {node: '>=11.0.0'} - scheduler@0.21.0: - resolution: {integrity: sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==} - scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} - semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -3372,18 +3053,6 @@ packages: spdx-license-ids@3.0.20: resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stats-gl@2.4.2: - resolution: {integrity: sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==} - peerDependencies: - '@types/three': '*' - three: '*' - - stats.js@0.17.0: - resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} - stream-replace-string@2.0.0: resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} @@ -3425,10 +3094,6 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -3455,11 +3120,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - suspend-react@0.1.3: - resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==} - peerDependencies: - react: '>=17.0' - svgo@4.0.1: resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} engines: {node: '>=16'} @@ -3480,20 +3140,6 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - three-mesh-bvh@0.7.8: - resolution: {integrity: sha512-BGEZTOIC14U0XIRw3tO4jY7IjP7n7v24nv9JXS1CyeVRWOCkcOMhRnmENUjuV39gktAw4Ofhr0OvIAiTspQrrw==} - deprecated: Deprecated due to three.js version incompatibility. Please use v0.8.0, instead. - peerDependencies: - three: '>= 0.151.0' - - three-stdlib@2.36.1: - resolution: {integrity: sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==} - peerDependencies: - three: '>=0.128.0' - - three@0.183.2: - resolution: {integrity: sha512-di3BsL2FEQ1PA7Hcvn4fyJOlxRRgFYBpMTcyOgkwJIaDOdJMebEFPA+t98EvjuljDx4hNulAGwF6KIjtwI5jgQ==} - tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} @@ -3516,19 +3162,6 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - troika-three-text@0.52.4: - resolution: {integrity: sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==} - peerDependencies: - three: '>=0.125.0' - - troika-three-utils@0.52.4: - resolution: {integrity: sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==} - peerDependencies: - three: '>=0.125.0' - - troika-worker-utils@0.52.0: - resolution: {integrity: sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==} - trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} @@ -3548,9 +3181,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tunnel-rat@0.1.2: - resolution: {integrity: sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==} - type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -3715,14 +3345,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - utility-types@3.11.0: - resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} - engines: {node: '>= 4'} - - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -3881,12 +3503,6 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - webgl-constants@1.1.1: - resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==} - - webgl-sdf-generator@1.1.1: - resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==} - which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -3979,30 +3595,6 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - zustand@3.7.2: - resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} - engines: {node: '>=12.7.0'} - peerDependencies: - react: '>=16.8' - peerDependenciesMeta: - react: - optional: true - - zustand@4.5.7: - resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} - 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 - zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -4306,8 +3898,6 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/runtime@7.29.2': {} - '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 @@ -4335,8 +3925,6 @@ snapshots: dependencies: fontkitten: 1.0.3 - '@dimforge/rapier3d-compat@0.12.0': {} - '@emmetio/abbreviation@2.3.3': dependencies: '@emmetio/scanner': 1.0.4 @@ -4556,10 +4144,6 @@ snapshots: react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.6.0(react@18.3.1) - '@heroicons/react@2.1.5(react@18.3.1)': - dependencies: - react: 18.3.1 - '@img/colour@1.1.0': optional: true @@ -4730,13 +4314,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@mediapipe/tasks-vision@0.10.17': {} - - '@monogrid/gainmap-js@3.4.0(three@0.183.2)': - dependencies: - promise-worker-transferable: 1.0.4 - three: 0.183.2 - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4868,45 +4445,6 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-leaflet/core@2.1.0(leaflet@1.9.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - leaflet: 1.9.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@react-spring/animated@9.7.5(react@18.3.1)': - dependencies: - '@react-spring/shared': 9.7.5(react@18.3.1) - '@react-spring/types': 9.7.5 - react: 18.3.1 - - '@react-spring/core@9.7.5(react@18.3.1)': - dependencies: - '@react-spring/animated': 9.7.5(react@18.3.1) - '@react-spring/shared': 9.7.5(react@18.3.1) - '@react-spring/types': 9.7.5 - react: 18.3.1 - - '@react-spring/rafz@9.7.5': {} - - '@react-spring/shared@9.7.5(react@18.3.1)': - dependencies: - '@react-spring/rafz': 9.7.5 - '@react-spring/types': 9.7.5 - react: 18.3.1 - - '@react-spring/three@9.7.5(@react-three/fiber@8.17.10(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.183.2))(react@18.3.1)(three@0.183.2)': - dependencies: - '@react-spring/animated': 9.7.5(react@18.3.1) - '@react-spring/core': 9.7.5(react@18.3.1) - '@react-spring/shared': 9.7.5(react@18.3.1) - '@react-spring/types': 9.7.5 - '@react-three/fiber': 8.17.10(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.183.2) - react: 18.3.1 - three: 0.183.2 - - '@react-spring/types@9.7.5': {} - '@react-stately/flags@3.1.2': dependencies: '@swc/helpers': 0.5.19 @@ -4916,62 +4454,6 @@ snapshots: '@swc/helpers': 0.5.19 react: 18.3.1 - '@react-three/drei@9.117.0(@react-three/fiber@8.17.10(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.183.2))(@types/react@18.3.12)(@types/three@0.183.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.183.2)': - dependencies: - '@babel/runtime': 7.29.2 - '@mediapipe/tasks-vision': 0.10.17 - '@monogrid/gainmap-js': 3.4.0(three@0.183.2) - '@react-spring/three': 9.7.5(@react-three/fiber@8.17.10(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.183.2))(react@18.3.1)(three@0.183.2) - '@react-three/fiber': 8.17.10(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.183.2) - '@use-gesture/react': 10.3.1(react@18.3.1) - camera-controls: 2.10.1(three@0.183.2) - cross-env: 7.0.3 - detect-gpu: 5.0.70 - glsl-noise: 0.0.0 - hls.js: 1.6.15 - maath: 0.10.8(@types/three@0.183.1)(three@0.183.2) - meshline: 3.3.1(three@0.183.2) - react: 18.3.1 - react-composer: 5.0.3(react@18.3.1) - stats-gl: 2.4.2(@types/three@0.183.1)(three@0.183.2) - stats.js: 0.17.0 - suspend-react: 0.1.3(react@18.3.1) - three: 0.183.2 - three-mesh-bvh: 0.7.8(three@0.183.2) - three-stdlib: 2.36.1(three@0.183.2) - troika-three-text: 0.52.4(three@0.183.2) - tunnel-rat: 0.1.2(@types/react@18.3.12)(react@18.3.1) - utility-types: 3.11.0 - uuid: 9.0.1 - zustand: 3.7.2(react@18.3.1) - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - '@types/three' - - immer - - '@react-three/fiber@8.17.10(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.183.2)': - dependencies: - '@babel/runtime': 7.29.2 - '@types/debounce': 1.2.4 - '@types/react-reconciler': 0.26.7 - '@types/webxr': 0.5.24 - base64-js: 1.5.1 - buffer: 6.0.3 - debounce: 1.2.1 - its-fine: 1.2.5(@types/react@18.3.12)(react@18.3.1) - react: 18.3.1 - react-reconciler: 0.27.0(react@18.3.1) - scheduler: 0.21.0 - suspend-react: 0.1.3(react@18.3.1) - three: 0.183.2 - zustand: 3.7.2(react@18.3.1) - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - '@react-types/shared@3.33.1(react@18.3.1)': dependencies: react: 18.3.1 @@ -5183,8 +4665,6 @@ snapshots: '@tanstack/virtual-core@3.13.23': {} - '@tweenjs/tween.js@23.1.3': {} - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.2 @@ -5206,8 +4686,6 @@ snapshots: dependencies: '@babel/types': 7.29.0 - '@types/debounce@1.2.4': {} - '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 @@ -5220,8 +4698,6 @@ snapshots: dependencies: dompurify: 3.3.3 - '@types/draco3d@1.4.10': {} - '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.8 @@ -5232,8 +4708,6 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/lodash@4.17.24': {} - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -5252,22 +4726,12 @@ snapshots: dependencies: undici-types: 7.16.0 - '@types/offscreencanvas@2019.7.3': {} - '@types/prop-types@15.7.13': {} '@types/react-dom@18.3.1': dependencies: '@types/react': 18.3.12 - '@types/react-reconciler@0.26.7': - dependencies: - '@types/react': 18.3.12 - - '@types/react-reconciler@0.28.9(@types/react@18.3.12)': - dependencies: - '@types/react': 18.3.12 - '@types/react@18.3.12': dependencies: '@types/prop-types': 15.7.13 @@ -5277,18 +4741,6 @@ snapshots: dependencies: '@types/node': 24.12.2 - '@types/stats.js@0.17.4': {} - - '@types/three@0.183.1': - dependencies: - '@dimforge/rapier3d-compat': 0.12.0 - '@tweenjs/tween.js': 23.1.3 - '@types/stats.js': 0.17.4 - '@types/webxr': 0.5.24 - '@webgpu/types': 0.1.69 - fflate: 0.8.2 - meshoptimizer: 1.0.1 - '@types/trusted-types@2.0.7': optional: true @@ -5296,17 +4748,8 @@ snapshots: '@types/unist@3.0.3': {} - '@types/webxr@0.5.24': {} - '@ungap/structured-clone@1.2.0': {} - '@use-gesture/core@10.3.1': {} - - '@use-gesture/react@10.3.1(react@18.3.1)': - dependencies: - '@use-gesture/core': 10.3.1 - react: 18.3.1 - '@vitejs/plugin-react@4.7.0(vite@6.4.2(@types/node@24.12.2)(jiti@1.21.6)(sass@1.99.0)(yaml@2.8.3))': dependencies: '@babel/core': 7.29.0 @@ -5369,8 +4812,6 @@ snapshots: '@vscode/l10n@0.0.18': {} - '@webgpu/types@0.1.69': {} - acorn-jsx@5.3.2(acorn@8.16.0): dependencies: acorn: 8.16.0 @@ -5388,8 +4829,6 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - animate.css@4.1.1: {} - ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -5417,10 +4856,6 @@ snapshots: arg@5.0.2: {} - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - argparse@2.0.1: {} aria-query@5.3.2: {} @@ -5568,14 +5003,8 @@ snapshots: base-64@1.0.0: {} - base64-js@1.5.1: {} - baseline-browser-mapping@2.10.8: {} - bidi-js@1.0.3: - dependencies: - require-from-string: 2.0.2 - binary-extensions@2.3.0: {} boolbase@1.0.0: {} @@ -5607,11 +5036,6 @@ snapshots: node-releases: 2.0.36 update-browserslist-db: 1.2.3(browserslist@4.28.1) - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -5624,10 +5048,6 @@ snapshots: camelcase@8.0.0: {} - camera-controls@2.10.1(three@0.183.2): - dependencies: - three: 0.183.2 - caniuse-lite@1.0.30001780: {} ccount@2.0.1: {} @@ -5708,10 +5128,6 @@ snapshots: cookie@1.1.1: {} - cross-env@7.0.3: - dependencies: - cross-spawn: 7.0.6 - cross-spawn@6.0.5: dependencies: nice-try: 1.0.5 @@ -5726,12 +5142,6 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - crossws@0.3.5: dependencies: uncrypto: 0.1.3 @@ -5784,8 +5194,6 @@ snapshots: dayjs@1.11.20: {} - debounce@1.2.1: {} - debug@4.3.7: dependencies: ms: 2.1.3 @@ -5820,10 +5228,6 @@ snapshots: destr@2.0.5: {} - detect-gpu@5.0.70: - dependencies: - webgl-constants: 1.1.1 - detect-libc@1.0.3: optional: true @@ -5868,8 +5272,6 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - draco3d@1.5.7: {} - dset@3.1.4: {} eastasianwidth@0.2.0: {} @@ -6046,8 +5448,6 @@ snapshots: escape-string-regexp@5.0.0: {} - esprima@4.0.1: {} - estree-util-attach-comments@3.0.0: dependencies: '@types/estree': 1.0.8 @@ -6085,10 +5485,6 @@ snapshots: eventemitter3@5.0.4: {} - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - extend@3.0.2: {} fast-deep-equal@3.1.3: {} @@ -6121,10 +5517,6 @@ snapshots: optionalDependencies: picomatch: 4.0.4 - fflate@0.6.10: {} - - fflate@0.8.2: {} - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -6217,21 +5609,12 @@ snapshots: define-properties: 1.2.1 gopd: 1.0.1 - glsl-noise@0.0.0: {} - gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 graceful-fs@4.2.11: {} - gray-matter@4.0.3: - dependencies: - js-yaml: 3.14.2 - kind-of: 6.0.3 - section-matter: 1.0.0 - strip-bom-string: 1.0.0 - h3@1.15.9: dependencies: cookie-es: 1.2.3 @@ -6406,8 +5789,6 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 - hls.js@1.6.15: {} - hosted-git-info@2.8.9: {} html-escaper@3.0.3: {} @@ -6416,10 +5797,6 @@ snapshots: http-cache-semantics@4.2.0: {} - ieee754@1.2.1: {} - - immediate@3.0.6: {} - immutable@5.1.5: {} import-meta-resolve@4.2.0: {} @@ -6479,8 +5856,6 @@ snapshots: is-docker@3.0.0: {} - is-extendable@0.1.1: {} - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -6505,8 +5880,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-promise@2.2.2: {} - is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -6540,13 +5913,6 @@ snapshots: isexe@2.0.0: {} - its-fine@1.2.5(@types/react@18.3.12)(react@18.3.1): - dependencies: - '@types/react-reconciler': 0.28.9(@types/react@18.3.12) - react: 18.3.1 - transitivePeerDependencies: - - '@types/react' - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -6557,11 +5923,6 @@ snapshots: js-tokens@4.0.0: {} - js-yaml@3.14.2: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -6582,18 +5943,10 @@ snapshots: jsonc-parser@3.3.1: {} - kind-of@6.0.3: {} - kleur@3.0.3: {} kleur@4.1.5: {} - leaflet@1.9.4: {} - - lie@3.3.0: - dependencies: - immediate: 3.0.6 - lilconfig@2.1.0: {} lilconfig@3.1.2: {} @@ -6613,8 +5966,6 @@ snapshots: lodash.merge@4.6.2: {} - lodash@4.18.1: {} - longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -6629,11 +5980,6 @@ snapshots: dependencies: yallist: 3.1.1 - maath@0.10.8(@types/three@0.183.1)(three@0.183.2): - dependencies: - '@types/three': 0.183.1 - three: 0.183.2 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -6855,12 +6201,6 @@ snapshots: merge2@1.4.1: {} - meshline@3.3.1(three@0.183.2): - dependencies: - three: 0.183.2 - - meshoptimizer@1.0.1: {} - micromark-core-commonmark@2.0.1: dependencies: decode-named-character-reference: 1.0.2 @@ -7533,28 +6873,15 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - potpack@1.0.2: {} - prettier@3.8.1: {} prismjs@1.30.0: {} - promise-worker-transferable@1.0.4: - dependencies: - is-promise: 2.2.2 - lie: 3.3.0 - prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - property-information@6.5.0: {} property-information@7.1.0: {} @@ -7563,11 +6890,6 @@ snapshots: radix3@1.1.2: {} - react-composer@5.0.3(react@18.3.1): - dependencies: - prop-types: 15.8.1 - react: 18.3.1 - react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -7578,23 +6900,6 @@ snapshots: dependencies: react: 18.3.1 - react-is@16.13.1: {} - - react-is@18.3.1: {} - - react-leaflet@4.2.1(leaflet@1.9.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@react-leaflet/core': 2.1.0(leaflet@1.9.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - leaflet: 1.9.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react-reconciler@0.27.0(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.21.0 - react-refresh@0.17.0: {} react@18.3.1: @@ -7858,19 +7163,10 @@ snapshots: sax@1.6.0: {} - scheduler@0.21.0: - dependencies: - loose-envify: 1.4.0 - scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - section-matter@1.0.0: - dependencies: - extend-shallow: 2.0.1 - kind-of: 6.0.3 - semver@5.7.2: {} semver@6.3.1: {} @@ -8014,15 +7310,6 @@ snapshots: spdx-license-ids@3.0.20: {} - sprintf-js@1.0.3: {} - - stats-gl@2.4.2(@types/three@0.183.1)(three@0.183.2): - dependencies: - '@types/three': 0.183.1 - three: 0.183.2 - - stats.js@0.17.0: {} - stream-replace-string@2.0.0: {} string-width@4.2.3: @@ -8082,8 +7369,6 @@ snapshots: dependencies: ansi-regex: 6.1.0 - strip-bom-string@1.0.0: {} - strip-bom@3.0.0: {} strnum@2.2.3: {} @@ -8112,10 +7397,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - suspend-react@0.1.3(react@18.3.1): - dependencies: - react: 18.3.1 - svgo@4.0.1: dependencies: commander: 11.1.0 @@ -8163,22 +7444,6 @@ snapshots: dependencies: any-promise: 1.3.0 - three-mesh-bvh@0.7.8(three@0.183.2): - dependencies: - three: 0.183.2 - - three-stdlib@2.36.1(three@0.183.2): - dependencies: - '@types/draco3d': 1.4.10 - '@types/offscreencanvas': 2019.7.3 - '@types/webxr': 0.5.24 - draco3d: 1.5.7 - fflate: 0.6.10 - potpack: 1.0.2 - three: 0.183.2 - - three@0.183.2: {} - tiny-inflate@1.0.3: {} tinyexec@1.0.4: {} @@ -8199,20 +7464,6 @@ snapshots: trim-lines@3.0.1: {} - troika-three-text@0.52.4(three@0.183.2): - dependencies: - bidi-js: 1.0.3 - three: 0.183.2 - troika-three-utils: 0.52.4(three@0.183.2) - troika-worker-utils: 0.52.0 - webgl-sdf-generator: 1.1.1 - - troika-three-utils@0.52.4(three@0.183.2): - dependencies: - three: 0.183.2 - - troika-worker-utils@0.52.0: {} - trough@2.2.0: {} ts-interface-checker@0.1.13: {} @@ -8223,14 +7474,6 @@ snapshots: tslib@2.8.1: {} - tunnel-rat@0.1.2(@types/react@18.3.12)(react@18.3.1): - dependencies: - zustand: 4.5.7(@types/react@18.3.12)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - immer - - react - type-fest@4.41.0: {} typed-array-buffer@1.0.2: @@ -8383,10 +7626,6 @@ snapshots: util-deprecate@1.0.2: {} - utility-types@3.11.0: {} - - uuid@9.0.1: {} - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -8530,10 +7769,6 @@ snapshots: web-namespaces@2.0.1: {} - webgl-constants@1.1.1: {} - - webgl-sdf-generator@1.1.1: {} - which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -8637,15 +7872,4 @@ snapshots: zod@4.3.6: {} - zustand@3.7.2(react@18.3.1): - optionalDependencies: - react: 18.3.1 - - zustand@4.5.7(@types/react@18.3.12)(react@18.3.1): - dependencies: - use-sync-external-store: 1.6.0(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.12 - react: 18.3.1 - zwitch@2.0.4: {} diff --git a/src/components/admin/github.ts b/src/components/admin/github.ts index ec300415..108dc23d 100644 --- a/src/components/admin/github.ts +++ b/src/components/admin/github.ts @@ -124,17 +124,6 @@ export async function getFileSha(token: string, path: string): Promise { - const res = await fetch(`${API}/repos/${REPO_OWNER}/${REPO_NAME}/git/blobs`, { - method: 'POST', - headers: headers(token), - body: JSON.stringify({ content: base64Content, encoding: 'base64' }), - }); - const data = await res.json(); - return data.sha; -} - /** Get the authenticated user (cached) */ export async function getUser(token: string): Promise<{ login: string; avatar_url: string; name: string }> { const cached = cacheGet<{ login: string; avatar_url: string; name: string }>('user'); @@ -319,6 +308,3 @@ export async function readJsonFile(token: string, path: string): Pr const content = await readFile(token, path); return JSON.parse(content); } - -/** OAuth configuration */ -export const OAUTH_AUTH_URL = 'https://elixir-cms-oauth.vercel.app/auth'; diff --git a/src/components/hero-scene.tsx b/src/components/hero-scene.tsx deleted file mode 100644 index 06c22a06..00000000 --- a/src/components/hero-scene.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import React, { Component, Suspense, useState, useRef, useMemo } from 'react'; -import { Canvas, useFrame } from '@react-three/fiber'; -import * as THREE from 'three'; -import type { ReactNode } from 'react'; -import { ProteinStructure } from './protein-scene'; - -const BASE = import.meta.env.BASE_URL.replace(/\/$/, ''); -const ORANGE = '#f47d20'; - -class SceneErrorBoundary extends Component< - { fallback: ReactNode; children: ReactNode }, - { hasError: boolean } -> { - state = { hasError: false }; - static getDerivedStateFromError() { return { hasError: true }; } - componentDidCatch(error: Error) { console.warn('3D scene failed:', error.message); } - render() { - if (this.state.hasError) return this.props.fallback; - return this.props.children; - } -} - -function SceneFallback() { - return ( -
- ELIXIR Norway -
- ); -} - -function Particles({ count = 40, playing = true }) { - const ref = useRef(null!); - const dummy = useMemo(() => new THREE.Object3D(), []); - - const particles = useMemo(() => - Array.from({ length: count }, () => ({ - x: (Math.random() - 0.5) * 16, - y: (Math.random() - 0.5) * 12, - z: (Math.random() - 0.5) * 6 - 3, - speed: 0.05 + Math.random() * 0.15, - phase: Math.random() * Math.PI * 2, - size: 0.02 + Math.random() * 0.04, - })), - [count]); - - useFrame(({ clock }) => { - if (!ref.current || !playing) return; - const t = clock.getElapsedTime(); - particles.forEach((p, i) => { - dummy.position.set( - p.x + Math.sin(t * p.speed + p.phase) * 0.5, - p.y + Math.cos(t * p.speed * 0.8 + p.phase) * 0.3, - p.z, - ); - dummy.scale.setScalar(p.size); - dummy.updateMatrix(); - ref.current.setMatrixAt(i, dummy.matrix); - }); - ref.current.instanceMatrix.needsUpdate = true; - }); - - return ( - - - - - ); -} - -export default function HeroScene() { - const [playing, setPlaying] = useState(() => { - if (typeof window === 'undefined') return true; - return !window.matchMedia('(prefers-reduced-motion: reduce)').matches; - }); - - return ( - - ); -} diff --git a/src/components/map-with-pin.astro b/src/components/map-with-pin.astro deleted file mode 100644 index f65bdd11..00000000 --- a/src/components/map-with-pin.astro +++ /dev/null @@ -1,31 +0,0 @@ ---- -const { address, lat, lng } = Astro.props; -const center = { lat, lng }; - -const mapBaseUrl = "https://www.openstreetmap.org/export/embed.html"; -const zoomLevel = 14; // Change this to control the zoom level (higher is more zoomed in) -const latOffset = 0.005 / zoomLevel; // Adjust these to fine-tune the zoom -const lngOffset = 0.005 / zoomLevel; -const src = `${mapBaseUrl}?bbox=${center.lng - lngOffset},${center.lat - latOffset},${center.lng + lngOffset},${center.lat + latOffset}&zoom=14&layer=mapnik&marker=${center.lat},${center.lng}`; ---- - -
-
-
- -
-
- -
\ No newline at end of file diff --git a/src/components/protein-scene.tsx b/src/components/protein-scene.tsx deleted file mode 100644 index 5980fb9b..00000000 --- a/src/components/protein-scene.tsx +++ /dev/null @@ -1,218 +0,0 @@ -import { useRef, useMemo } from 'react'; -import { useFrame, useLoader } from '@react-three/fiber'; -import * as THREE from 'three'; - -const BASE = import.meta.env.BASE_URL.replace(/\/$/, ''); - -interface Residue { - resNum: number; - position: THREE.Vector3; - ss: 'H' | 'E' | 'C'; -} - -function parsePDB(text: string): Residue[] { - const lines = text.split('\n'); - - // Secondary structure from HELIX/SHEET records - const ssMap = new Map(); - for (const line of lines) { - if (line.startsWith('HELIX')) { - const start = parseInt(line.substring(21, 25).trim()); - const end = parseInt(line.substring(33, 37).trim()); - for (let i = start; i <= end; i++) ssMap.set(i, 'H'); - } else if (line.startsWith('SHEET')) { - const start = parseInt(line.substring(22, 26).trim()); - const end = parseInt(line.substring(33, 37).trim()); - for (let i = start; i <= end; i++) ssMap.set(i, 'E'); - } - } - - // Extract Cα atoms (one per residue) - const residues: Residue[] = []; - for (const line of lines) { - if (line.startsWith('ATOM') && line.substring(12, 16).trim() === 'CA') { - const resNum = parseInt(line.substring(22, 26).trim()); - const x = parseFloat(line.substring(30, 38).trim()); - const y = parseFloat(line.substring(38, 46).trim()); - const z = parseFloat(line.substring(46, 54).trim()); - residues.push({ - resNum, - position: new THREE.Vector3(x, y, z), - ss: ssMap.get(resNum) || 'C', - }); - } - } - - // Center on origin - const center = new THREE.Vector3(); - for (const r of residues) center.add(r.position); - center.divideScalar(residues.length); - for (const r of residues) r.position.sub(center); - - return residues; -} - -// Propagate a consistent coordinate frame along the curve without flipping -function computeParallelTransport( - points: THREE.Vector3[], - tangents: THREE.Vector3[], -): Array<{ normal: THREE.Vector3; binormal: THREE.Vector3 }> { - const frames: Array<{ normal: THREE.Vector3; binormal: THREE.Vector3 }> = []; - - const t0 = tangents[0].clone().normalize(); - let seed = new THREE.Vector3(0, 1, 0); - if (Math.abs(t0.dot(seed)) > 0.9) seed.set(1, 0, 0); - const n0 = new THREE.Vector3().crossVectors(t0, seed).normalize(); - const b0 = new THREE.Vector3().crossVectors(t0, n0).normalize(); - frames.push({ normal: n0, binormal: b0 }); - - for (let i = 1; i < points.length; i++) { - const tPrev = tangents[i - 1].clone().normalize(); - const tCurr = tangents[i].clone().normalize(); - const nPrev = frames[i - 1].normal.clone(); - - const axis = new THREE.Vector3().crossVectors(tPrev, tCurr); - const dot = Math.min(1, Math.max(-1, tPrev.dot(tCurr))); - const angle = Math.acos(dot); - - if (axis.lengthSq() > 1e-10 && angle > 1e-6) { - axis.normalize(); - nPrev.applyAxisAngle(axis, angle); - } - - nPrev.normalize(); - const bCurr = new THREE.Vector3().crossVectors(tCurr, nPrev).normalize(); - frames.push({ normal: nPrev, binormal: bCurr }); - } - - return frames; -} - -const CROSS_SEGMENTS = 8; -const SAMPLES_PER_RESIDUE = 6; - -function createRibbonGeometry(residues: Residue[]): THREE.BufferGeometry { - const curve = new THREE.CatmullRomCurve3(residues.map(r => r.position)); - const totalSamples = residues.length * SAMPLES_PER_RESIDUE; - - // Sample curve - const points: THREE.Vector3[] = []; - const tangents: THREE.Vector3[] = []; - for (let i = 0; i <= totalSamples; i++) { - const t = i / totalSamples; - points.push(curve.getPoint(t)); - tangents.push(curve.getTangent(t)); - } - - const frames = computeParallelTransport(points, tangents); - - // Compute cross-section dimensions per sample, then smooth transitions - const rawDims: Array<[number, number]> = []; - for (let i = 0; i <= totalSamples; i++) { - const t = i / totalSamples; - const resIdx = Math.min(Math.floor(t * residues.length), residues.length - 1); - const ss = residues[resIdx].ss; - if (ss === 'H') rawDims.push([1.2, 0.3]); - else if (ss === 'E') rawDims.push([1.4, 0.1]); - else rawDims.push([0.3, 0.3]); - } - - // Bidirectional exponential smoothing to avoid jagged width transitions - const dims = rawDims.map(d => [...d] as [number, number]); - const alpha = 0.25; - for (let i = 1; i < dims.length; i++) { - dims[i][0] = dims[i - 1][0] * (1 - alpha) + rawDims[i][0] * alpha; - dims[i][1] = dims[i - 1][1] * (1 - alpha) + rawDims[i][1] * alpha; - } - for (let i = dims.length - 2; i >= 0; i--) { - dims[i][0] = dims[i + 1][0] * (1 - alpha) + dims[i][0] * alpha; - dims[i][1] = dims[i + 1][1] * (1 - alpha) + dims[i][1] * alpha; - } - - // Build elliptical cross-section rings - const positions: number[] = []; - const colors: number[] = []; - - for (let i = 0; i <= totalSamples; i++) { - const t = i / totalSamples; - const [hw, ht] = dims[i]; - const p = points[i]; - const n = frames[i].normal; - const b = frames[i].binormal; - - // Rainbow: blue (0.66) to red (0.0) - const hue = 0.66 * (1 - t); - const color = new THREE.Color().setHSL(hue, 0.85, 0.55); - - for (let j = 0; j < CROSS_SEGMENTS; j++) { - const angle = (j / CROSS_SEGMENTS) * Math.PI * 2; - const nx = Math.cos(angle) * hw; - const ny = Math.sin(angle) * ht; - - positions.push( - p.x + n.x * nx + b.x * ny, - p.y + n.y * nx + b.y * ny, - p.z + n.z * nx + b.z * ny, - ); - colors.push(color.r, color.g, color.b); - } - } - - // Connect consecutive rings into quads (2 triangles each) - const indices: number[] = []; - for (let i = 0; i < totalSamples; i++) { - for (let j = 0; j < CROSS_SEGMENTS; j++) { - const a = i * CROSS_SEGMENTS + j; - const b = i * CROSS_SEGMENTS + (j + 1) % CROSS_SEGMENTS; - const c = (i + 1) * CROSS_SEGMENTS + (j + 1) % CROSS_SEGMENTS; - const d = (i + 1) * CROSS_SEGMENTS + j; - indices.push(a, b, c); - indices.push(a, c, d); - } - } - - const geometry = new THREE.BufferGeometry(); - geometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3)); - geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3)); - geometry.setIndex(indices); - geometry.computeVertexNormals(); - - return geometry; -} - -interface ProteinStructureProps { - playing?: boolean; -} - -export function ProteinStructure({ playing = true }: ProteinStructureProps) { - const groupRef = useRef(null!); - - const text = useLoader(THREE.FileLoader, `${BASE}/assets/models/1aki.pdb`) as string; - - const { geometry, autoScale } = useMemo(() => { - const residues = parsePDB(text); - const geo = createRibbonGeometry(residues); - geo.computeBoundingSphere(); - const radius = geo.boundingSphere?.radius || 10; - return { geometry: geo, autoScale: 5 / radius }; - }, [text]); - - useFrame((_, delta) => { - if (groupRef.current && playing) { - groupRef.current.rotation.y += delta * 0.2; - } - }); - - return ( - - - - - - ); -} diff --git a/src/components/sections/basic-feature.astro b/src/components/sections/basic-feature.astro deleted file mode 100644 index 33a58e1b..00000000 --- a/src/components/sections/basic-feature.astro +++ /dev/null @@ -1,9 +0,0 @@ -
-
- -
-
- -
-
- diff --git a/src/components/sections/grid-feature.astro b/src/components/sections/grid-feature.astro deleted file mode 100644 index 2e15cec5..00000000 --- a/src/components/sections/grid-feature.astro +++ /dev/null @@ -1,17 +0,0 @@ ---- -import Intro from "../content/landing/features/intro.mdx"; -import FeatureList from "../content/landing/features/list.mdx"; -import {IoMdHelpCircle} from "react-icons/io"; -import {FaFingerprint, FaServer, FaTools} from "react-icons/fa"; ---- - -
-
- -
-
-
- -
-
-
diff --git a/src/components/tiny-card-with-icon-left.tsx b/src/components/tiny-card-with-icon-left.tsx deleted file mode 100644 index 039923d8..00000000 --- a/src/components/tiny-card-with-icon-left.tsx +++ /dev/null @@ -1,16 +0,0 @@ -export default function TinyCardWithIconLeft({ icon: Icon, title, children }) { - return ( -
-
-
-
- {title} -
-
- {children} -
-
- ) -} diff --git a/src/components/useful-links.astro b/src/components/useful-links.astro deleted file mode 100644 index 963a3648..00000000 --- a/src/components/useful-links.astro +++ /dev/null @@ -1,17 +0,0 @@ ---- -const { links } = Astro.props; ---- - -
- -
diff --git a/src/components/what-we-offer.astro b/src/components/what-we-offer.astro deleted file mode 100644 index e69de29b..00000000 diff --git a/src/content/config.ts b/src/content/config.ts index 04c4bf38..a04a0413 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -21,14 +21,6 @@ const accessibility = defineCollection({ }), }); -const banner = defineCollection({ - type: 'content', - schema: z.object({ - title: z.string().optional(), - summary: z.string().optional(), - }), -}); - const events = defineCollection({ type: 'content', schema: z.object({ @@ -67,14 +59,6 @@ const fundingAndProjects = defineCollection({ }), }); -const landing = defineCollection({ - type: 'content', - schema: z.object({ - layout: z.string().optional(), - variant: z.string().optional(), - }), -}); - const news = defineCollection({ type: 'content', schema: z.object({ @@ -91,15 +75,6 @@ const news = defineCollection({ }), }); -const researchSupport = defineCollection({ - type: 'content', - schema: z.object({ - title: z.string().optional(), - layout: z.string().optional(), - variant: z.string().optional(), - }), -}); - const services = defineCollection({ type: 'content', schema: z.object({ @@ -113,15 +88,6 @@ const services = defineCollection({ }), }); -const training = defineCollection({ - type: 'content', - schema: z.object({ - layout: z.string().optional(), - variant: z.string().optional(), - title: z.string().optional(), - }), -}); - export const collections = { news, services, @@ -129,8 +95,4 @@ export const collections = { about, 'funding-and-projects': fundingAndProjects, accessibility, - banner, - landing, - 'research-support': researchSupport, - training, }; diff --git a/src/content/landing/index.mdx b/src/content/landing/index.mdx deleted file mode 100644 index dace86e8..00000000 --- a/src/content/landing/index.mdx +++ /dev/null @@ -1,49 +0,0 @@ ---- -layout: "../../layouts/page.astro" -variant: "full" ---- - -import Hero from "../../components/hero.tsx"; -import TinyCardWithIconLeft from "../../components/tiny-card-with-icon-left.tsx"; -import {IoMdHelpCircle} from "react-icons/io"; -import {FaFingerprint, FaServer, FaTools} from "react-icons/fa"; -import Universities from "../../components/universities.tsx"; -import FeaturedNews from "../../components/featured-news.astro"; -import GridFeature from "../../components/sections/grid-feature.astro"; -import BasicFeature from "../../components/sections/basic-feature.astro"; - - - - -
- # Unlock the Power of Your Data with ELIXIR Norway - At ELIXIR Norway, we empower your research with cutting-edge solutions tailored to _life sciences_. From - comprehensive **data management and analysis** to **secure storage and specialised support**, we offer - everything you need to propel your projects forward. Whether handling sensitive human data or managing - large-scale genomics datasets, our services are designed to meet the unique demands of life science research in - Norway and beyond. -
- Short and long-term support with bioinformatics - analyses, programming and data management tasks. [Contact the - helpdesk](mailto:support@elixir.no). - Analysis and management of life science data within marine, - health, genomics, proteomics, structural analysis and more. - NeLS, the Norwegian e-Infrastructure for Life - Sciences, for analysis, sharing, management and storage of life science data. - ELIXIR Norway provides archiving solutions for - potentially identifiable human data and provides support for data analysis and management on national secure - infrastructures, including [TSD](https://www.uio.no/english/services/it/research/sensitive-data/index.html), - [HUNT Cloud](https://www.ntnu.edu/mh/huntcloud) and - [SAFE](https://www.uib.no/en/it/131011/safe-secure-access-research-data-and-e-infrastructure). -
- - -
- # Collaboration Between Five Organisations Across Norway - - ELIXIR Norway is built on a robust collaboration between five leading organisations across Norway. By combining - their expertise and resources, these institutions work together to advance research and innovation, driving - progress in life sciences and data science throughout the region. -
- -
diff --git a/src/content/research-support/index.mdx b/src/content/research-support/index.mdx deleted file mode 100644 index d9b8e7ce..00000000 --- a/src/content/research-support/index.mdx +++ /dev/null @@ -1,83 +0,0 @@ -import Callout from "../../components/callout.tsx"; -import Card from "../../components/card.tsx"; -import Pricing from "../../components/pricing.tsx"; - -# How to get help - -Contact us at [support@elixir.no](mailto:support@elixir.no) - -When a request is submitted, it is broadcast to all members of the - Helpdesk. The request is then picked up by the member with the most expertise on the topic. We typically reply within 1 working day - -# Usage instructions - -ELIXIR Norway also hosts documentation for its storage infrastructure (NeLS), available [here](https://nels-docs.readthedocs.io/en/latest/). - -# Support model - -Projects that can be solved within a working day are free of charge (enabled by funding from the Research Council of Norway). -For more demanding projects, an hourly rate applies, and you will have to **enter an agreement with ELIXIR Norway**. - -Projects that require an effort beyond technical assistance/consultancy may be set up as a research collaboration, e.g. by providing funding for a percentage of the position of a helpdesk member. - - - For requests that require platform contribution for more than a working day, an agreement - between the client and the platform must be made. The agreement should cover the type and cost of the service. If - applicable, the agreement should also cover a plan for _publication_ and _co-authorship_. Regardless of the type of - contribution the platform has given to a project, we expect to be included in the **acknowledgements** of resulting - publications or other relevant outputs. - - -# Pricing for support - - - diff --git a/src/content/training/index.mdx b/src/content/training/index.mdx deleted file mode 100644 index 1718ad67..00000000 --- a/src/content/training/index.mdx +++ /dev/null @@ -1,51 +0,0 @@ -import Placeholder from "../../components/placeholder.astro"; - -export const BASE = import.meta.env.BASE_URL.replace(/\/$/, ''); - -# Training by ELIXIR Norway -ELIXIR Norway aims to provide high-quality bioinformatics training and a wide set of services, designed to support researchers and professionals in life science research, to both the local and global community. Our training programs provide comprehensive resources to enhance your skills and knowledge, enabling you to stay at the forefront of cutting-edge scientific advancements. Regardless of the experience you have as scientist or data analyst, we offer a diverse array of courses, workshops and materials tailored to meet your specific needs, all crafted by instructors with relevant expertise and competency. Our trainings materials are open-access. - -## Types of Training -### Research Data Management (RDM) courses - -We offer general RDM courses covering a range of topics from data collection and metadata management to understanding regulations for handling sensitive data. In addition, we deliver courses on what best practices to consider for FAIR data handling. - -### Tool-specific courses - -We offer courses designed to provide hands-on experience on tools for your data management tasks such as [Norwegian e-Infrastructure for Life Sciences](https://nels.bioinfo.no/) for storage of non-sensitive data, [UseGalaxy](https://galaxyproject.org/use/usegalaxy-no/) where you can use/create streamlined bioinformatics workflows, [national Data Stewardship Wizard instance](https://norway.dsw.elixir-europe.org/wizard/) that you can use to create Data Management Plans based on domain-specific templates relevant to the field of your research project, and [FEGA-Norway](https://ega.elixir.no/) that allows secure sharing of sensitive data across borders in compliance with data governance procedures including GDPR in Norway. -These courses are designed to help you navigate and make the most of these tools, improving your data management practices and supporting your research objectives. Whether you are looking to get started or deepen your expertise, our training courses are structured to meet the diverse needs of researchers at all levels. - -### Domain-specific courses - -In addition to tool-specific training, ELIXIR Norway can offer a range of domain-specific courses aimed at enhancing your expertise in specialised areas of bioinformatics and data analysis. These courses cover key topics such as single-cell sequencing, microbiome analysis, biodiversity studies, and sequencing assemblies. Our courses focus on challenges and techniques to help explore and analyse data of your interest and apply best practices for assembling high-quality sequences, from short-read to long-read technologies. These domain-specific courses are designed to provide you with the knowledge and skills to tackle the specific challenges in your research projects with confidence. - -### Train-the-Trainer - -As a national ELIXIR node, we are a part of the ELIXIR-GOBLET Train-the-Trainer (TtT) programme that enables us to provide training on how to become a better instructor/trainer. The TtT courses touch upon various teaching techniques that can help you ensure productive engagement from learners/trainees and make your course material easy to understand. TtT is an open instructors’ community, and you can read more about it [here](https://elixir-europe.org/platforms/training/train-the-trainer) - -## Get Started - -Navigating ELIXIR's Training programs by exploring our catalogue of available courses, which are categorised by topic and proficiency level to help you find the right fit. Each course page provides detailed information about the curriculum, prerequisites, and learning outcomes. We announce our courses and upload training materials to [ELIXIR TeSS](https://tess.elixir-europe.org/), where you can also find upcoming trainings that are happening internationally. In addition, you can look at the past training material on our [GitHub](https://github.com/ELIXIR-Norway-Training) and [Zenodo](https://zenodo.org/communities/elixir-no/records?q=&f=resource_type%3Alesson&f=resource_type%3Apresentation&l=list&p=1&s=10&sort=newest) repositories. - - - -# Upcoming Events - -
-No upcoming events at the moment. - - -# Training Material - -
- - -# Past Events - -
- - - diff --git a/src/data/organizations.ts b/src/data/organizations.ts index 099a8233..6f62859e 100644 --- a/src/data/organizations.ts +++ b/src/data/organizations.ts @@ -118,7 +118,3 @@ export const organizations: Record = { }; export const ORG_SLUGS = new Set(Object.keys(organizations)); - -export function getOrganization(slug: string): Organization | undefined { - return organizations[slug]; -} diff --git a/src/lib/utils.ts b/src/lib/utils.ts index b54f6722..8e71900e 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -4,16 +4,6 @@ export const slugToTitleCase = (slug: string) => slug .map((w) => `${w.charAt(0).toUpperCase()}${w.slice(1)}`) .join(' '); -export const classNames = (...classes): string => { - return classes.filter(Boolean).join(' ') -} - -export const truncateStringToLength = (string: string, length: number) => { - return (string.length > length) - ? `${string.substring(0, length).trim()}...` - : string -}; - /** * Converts Astro v5 content id to a URL-safe slug path. * entry.id is relative to the collection directory (no collection prefix). diff --git a/src/pages/accessibility-test.astro b/src/pages/accessibility-test.astro deleted file mode 100644 index 55673448..00000000 --- a/src/pages/accessibility-test.astro +++ /dev/null @@ -1,84 +0,0 @@ ---- -import PageLayout from "../layouts/page.astro"; ---- - - -
- -
-

Keyboard Navigation Test

-

Press Tab to navigate through these links. Focus should be clearly visible.

- -
- -
-

Color Contrast Test

-
-

Primary text - should be easy to read

-

Secondary text - should still be readable

-

Muted text - minimum contrast

-
- Text on brand color background -
-
-
- -
-

Screen Reader Test

-

These elements should be properly announced by screen readers:

- -
- -
-

Form Elements Test

-
-
- - -
- -
- - -
-
-
- -
-
diff --git a/src/styles/global.scss b/src/styles/global.scss index dfb16331..f340a02a 100644 --- a/src/styles/global.scss +++ b/src/styles/global.scss @@ -1,5 +1,4 @@ @import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&display=swap'); -@import "animate.css"; @tailwind base; @tailwind components; @@ -116,26 +115,6 @@ } -.tess-controls { - @apply flex justify-center mb-4; -} - -.tess-search { - @apply flex items-center space-x-3 !important; -} - -.tess-search input { - @apply px-4 py-2 w-full flex bg-light-surface dark:bg-dark-surface text-light-on-surface dark:text-dark-on-surface border border-gray-300 dark:border-gray-600 rounded-lg !important; -} - -.tess-search-clear { - @apply text-light-on-surface dark:text-dark-on-surface hover:text-gray-600 dark:hover:text-gray-300 cursor-pointer !important; -} - -.tess-search button { - @apply bg-brand-primary text-white px-4 py-2 rounded-lg font-semibold hover:bg-brand-primary focus:ring-2 focus:ring-brand-primary !important; -} - /* ─── CMS Preview styles ──────────────────────────────── */ .cms-preview { diff --git a/src/types/common.d.ts b/src/types/common.d.ts deleted file mode 100644 index eb5abed8..00000000 --- a/src/types/common.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { ReactNode } from "react"; -import type { ElixirServiceCategory } from "./enums.ts"; - -export type ElixirService = { - name: string; - description: ReactNode; - imageUrl?: string; - category: ElixirServiceCategory[]; -}; diff --git a/src/types/components.d.ts b/src/types/components.d.ts deleted file mode 100644 index b0589576..00000000 --- a/src/types/components.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { ReactNode } from "react"; - -export type Filter = { - text: ReactNode; - description: ReactNode; - predicate: () => boolean; -}; - -export type FloatingFilterProps = { - filters?: Array; - onFilterChange: (filter: Filter) => void; -}; - -export type ElixirNorwayOrganizations = "UIB" | "UIT" | "UIO" | "NMBU" | "NTNU"; - -export type PersonCardProps = { - name: string; - title?: string; - organization: ElixirNorwayOrganizations; - photo: string; -} diff --git a/src/types/enums.ts b/src/types/enums.ts deleted file mode 100644 index ad227afa..00000000 --- a/src/types/enums.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const enum ElixirServiceCategory { - DATA_ANALYSIS_PLATFORMS = "Data Analysis Platforms", - HUMAN_DATA = "Human Data", - PLANT_AND_BIO_DIVERSITY = "Plant & Biodiversity", - FUNCTIONAL_GENOMICS = "Functional Genomics", - RESEARCH_DATA_MANAGEMENT = "Research Data Management", -} diff --git a/tailwind.config.mjs b/tailwind.config.mjs index ea0ec96c..a099c497 100644 --- a/tailwind.config.mjs +++ b/tailwind.config.mjs @@ -15,16 +15,13 @@ export default { brand: { "primary": "#023452", "secondary": "#f47d20", - "secondary-text": "#d97016", "grey": "#4d4848", - "green": "#bebf32", }, light: { "background": colors.white, "surface": "#f8f9fa", "on-background": "#4d4848", "on-surface": "#4d4848", - "on-primary": "#f47d20", }, dark: { "background": "#121212", @@ -35,11 +32,7 @@ export default { }, }, invert: { - 25: '.25', - 50: '.5', - 75: '.75', 85: '.85', - 95: '.95', }, }, },