From 48cc136842c34f08a07be09e69bce117a1cc05eb Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Mon, 18 Nov 2024 21:15:51 +0000 Subject: [PATCH] feat: add reference page (#47) ### Explanation _No response_ ### Issue _No response_ ### Attestations - [x] I have read and agree to the [Code of Conduct](https://docs.nhcarrigan.com/community/coc/) - [x] I have read and agree to the [Community Guidelines](https://docs.nhcarrigan.com/community/guide/). - [x] My contribution complies with the [Contributor Covenant](https://docs.nhcarrigan.com/dev/covenant/). ### Dependencies - [x] I have pinned the dependencies to a specific patch version. ### Style - [x] I have run the linter and resolved any errors. - [x] My pull request uses an appropriate title, matching the conventional commit standards. - [x] My scope of feat/fix/chore/etc. correctly matches the nature of changes in my pull request. ### Tests - [x] My contribution adds new code, and I have added tests to cover it. - [x] My contribution modifies existing code, and I have updated the tests to reflect these changes. - [x] All new and existing tests pass locally with my changes. - [x] Code coverage remains at or above the configured threshold. ### Documentation _No response_ ### Versioning _No response_ Reviewed-on: https://codeberg.org/nhcarrigan/portfolio/pulls/47 Co-authored-by: Naomi Carrigan Co-committed-by: Naomi Carrigan --- package.json | 12 +- pnpm-lock.yaml | 787 ++++++++++++++++++++++++++++++++++++-- src/app/ref/page.tsx | 137 +++++++ src/config/NavItems.ts | 1 + src/config/Vroid.ts | 38 ++ test/config/VRoid.spec.ts | 36 ++ 6 files changed, 974 insertions(+), 37 deletions(-) create mode 100644 src/app/ref/page.tsx create mode 100644 src/config/Vroid.ts create mode 100644 test/config/VRoid.spec.ts diff --git a/package.json b/package.json index 1ba30f6..66a142d 100644 --- a/package.json +++ b/package.json @@ -16,10 +16,14 @@ "@fortawesome/free-brands-svg-icons": "6.6.0", "@fortawesome/free-solid-svg-icons": "6.6.0", "@fortawesome/react-fontawesome": "0.2.2", + "@pixiv/three-vrm": "3.1.6", + "@react-three/drei": "9.117.2", + "@react-three/fiber": "9.0.0-beta.1", "next": "15.0.2", "next-plausible": "3.12.2", "react": "18.3.1", - "react-dom": "18.3.1" + "react-dom": "18.3.1", + "three": "0.170.0" }, "devDependencies": { "@aws-sdk/client-s3": "3.693.0", @@ -28,6 +32,7 @@ "@types/node": "22.8.4", "@types/react": "18.3.12", "@types/react-dom": "18.3.1", + "@types/three": "0.170.0", "@vitest/coverage-istanbul": "2.1.4", "eslint": "9.13.0", "jsdom": "25.0.1", @@ -36,5 +41,10 @@ "tsx": "4.19.2", "typescript": "5.6.3", "vitest": "2.1.4" + }, + "resolutions": { + "react": "18.3.1", + "react-dom": "18.3.1", + "next": "15.0.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 076f48d..2332f55 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + react: 18.3.1 + react-dom: 18.3.1 + next: 15.0.2 + importers: .: @@ -20,6 +25,15 @@ importers: '@fortawesome/react-fontawesome': specifier: 0.2.2 version: 0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1) + '@pixiv/three-vrm': + specifier: 3.1.6 + version: 3.1.6(three@0.170.0) + '@react-three/drei': + specifier: 9.117.2 + version: 9.117.2(@react-three/fiber@9.0.0-beta.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.170.0))(@types/react@18.3.12)(@types/three@0.170.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.170.0)(use-sync-external-store@1.2.2(react@18.3.1)) + '@react-three/fiber': + specifier: 9.0.0-beta.1 + version: 9.0.0-beta.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.170.0) next: specifier: 15.0.2 version: 15.0.2(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -32,6 +46,9 @@ importers: react-dom: specifier: 18.3.1 version: 18.3.1(react@18.3.1) + three: + specifier: 0.170.0 + version: 0.170.0 devDependencies: '@aws-sdk/client-s3': specifier: 3.693.0 @@ -51,6 +68,9 @@ importers: '@types/react-dom': specifier: 18.3.1 version: 18.3.1 + '@types/three': + specifier: 0.170.0 + version: 0.170.0 '@vitest/coverage-istanbul': specifier: 2.1.4 version: 2.1.4(vitest@2.1.4(@types/node@22.8.4)(jsdom@25.0.1)) @@ -300,6 +320,10 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.25.9': resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} @@ -663,7 +687,7 @@ packages: resolution: {integrity: sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==} peerDependencies: '@fortawesome/fontawesome-svg-core': ~1 || ~6 - react: '>=16.3' + react: 18.3.1 '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -812,6 +836,14 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@mediapipe/tasks-vision@0.10.17': + resolution: {integrity: sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==} + + '@monogrid/gainmap-js@3.0.6': + resolution: {integrity: sha512-ireqJg7cw0tUn/JePDG8rAL7RyXgUKSDbjYdiygkrnye1WuKGLAWDBwF/ICwCwJ9iZBAF5caU8gSu+c34HLGdQ==} + peerDependencies: + three: '>= 0.159.0' + '@next/env@15.0.2': resolution: {integrity: sha512-c0Zr0ModK5OX7D4ZV8Jt/wqoXtitLNPwUfG9zElCZztdaZyNVnN40rDXVZ/+FGuR4CcNV5AEfM6N8f+Ener7Dg==} @@ -869,7 +901,7 @@ packages: peerDependencies: eslint: '>=9' playwright: '>=1' - react: '>=18' + react: 18.3.1 typescript: '>=5' vitest: '>=2' @@ -891,6 +923,62 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@pixiv/three-vrm-core@3.1.6': + resolution: {integrity: sha512-wxfvLOr4wpIheOdWCvb3nyy7TDboZAsR7ycqvYrqrZcc1+owtoPcSyxf74rE0VqmC+6Hl60O5idv+J7Wngp6tQ==} + peerDependencies: + three: '>=0.137' + + '@pixiv/three-vrm-materials-hdr-emissive-multiplier@3.1.6': + resolution: {integrity: sha512-XvotiL3Lwi+lr6qLwPBfB1m+CYLwHq8WyfR1xJDFGm03mRbgQXzvntN3Qlfmqblae/BQHTD4cSzFmDibKleD2Q==} + peerDependencies: + three: '>=0.137' + + '@pixiv/three-vrm-materials-mtoon@3.1.6': + resolution: {integrity: sha512-QnzHDnwUYm17bMftotgqUEZmzI9CId2e9Rqfo4d1j44Up2nMzr6GMPDojRQ8XFqdANHcfPTlWZMv8Th/SKtZ7w==} + peerDependencies: + three: '>=0.137' + + '@pixiv/three-vrm-materials-v0compat@3.1.6': + resolution: {integrity: sha512-42BMRwWBheoMTuKM10kDzKaqEQCgLfB4gPbFn7Q/On6qhXdqLyU/9PciKC4ZUU4UNUfigPlWV2wzGu/b4UYbCA==} + peerDependencies: + three: '>=0.137' + + '@pixiv/three-vrm-node-constraint@3.1.6': + resolution: {integrity: sha512-TYzzHSxjCCjnPOv/x0PAKcLECWkuuSp+E0LnE+rq1rk/l8Ci/C92MyYsHFuwG8idUpv0hVxb25axri/Z2qUxew==} + peerDependencies: + three: '>=0.137' + + '@pixiv/three-vrm-springbone@3.1.6': + resolution: {integrity: sha512-E2BMVNBOXzqK8lO4Jdo0RePOnOuGvVCnoZyaOXKMPNkJccylIXuqCk4S/ilqL0sexjPt74MHV7HqHi6hAOJnTg==} + peerDependencies: + three: '>=0.137' + + '@pixiv/three-vrm@3.1.6': + resolution: {integrity: sha512-maz2QvE1wKjK4ZKiwZu39UOOZNYOcthfxqes55wdhVijZrE1to57qskarBiX46JVSru3Koh2+JFbV//o3u0ytg==} + peerDependencies: + three: '>=0.137' + + '@pixiv/types-vrm-0.0@3.1.6': + resolution: {integrity: sha512-UvmWkK6AhHDF7VBxyqhLWFgdS65XZZ4+TlTv3HchmxHxsEUGiZxNlaX3Cu+mknAigQc4XIdqoi0WXOYV8F+RSg==} + + '@pixiv/types-vrmc-materials-hdr-emissive-multiplier-1.0@3.1.6': + resolution: {integrity: sha512-ebP7vDCF3uWXJg+YBkhzpJ1Oa7mPL5WgYjIhs3+/VlOcCB3kIADO4LDDZsEMniWd7/W9T59fehPo4I8QaE1eRw==} + + '@pixiv/types-vrmc-materials-mtoon-1.0@3.1.6': + resolution: {integrity: sha512-7LJVf8ccaY54pReXvzrF3edd7VlIkDqgU904mI2RQWa/LaoOS0MB65zw3w2PJMsvoFd17+dFZwkvj6EHHj4EKQ==} + + '@pixiv/types-vrmc-node-constraint-1.0@3.1.6': + resolution: {integrity: sha512-8RcweR53i4nB1AMp3ZHYYcPc3QjtYREbA8XYhRCvSuNsUD/I+Xhb+R7WC42Fa2+fPrF/F1OtbZvear8CYZ9+4w==} + + '@pixiv/types-vrmc-springbone-1.0@3.1.6': + resolution: {integrity: sha512-07pzlbV7/BfOzOEmz3YUXqOi/dviyrUuW/DT2hXC0rthdVpKau26ax7VP5bv5W0AJ4UquvQHYEsJNuPAtC9p7Q==} + + '@pixiv/types-vrmc-springbone-extended-collider-1.0@3.1.6': + resolution: {integrity: sha512-8l8WQOz0NKwICN1FJvnL0s3kyaPsgSa+CWqbQ4tjITHipRawRGHO3C3qRGW6nvWWNOnHDYg2XIZp27QJLwY94Q==} + + '@pixiv/types-vrmc-vrm-1.0@3.1.6': + resolution: {integrity: sha512-bskO6TiH+ntB03rKbuMi/axL/jPIo6HTj5PU4ufua8U7IO5lfL5KuE5vaXGA3moNGskJEvKuhO2y5Gtt2yBmXA==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -899,6 +987,70 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@react-spring/animated@9.7.5': + resolution: {integrity: sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==} + peerDependencies: + react: 18.3.1 + + '@react-spring/core@9.7.5': + resolution: {integrity: sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==} + peerDependencies: + react: 18.3.1 + + '@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: 18.3.1 + + '@react-spring/three@9.7.5': + resolution: {integrity: sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==} + peerDependencies: + '@react-three/fiber': '>=6.0' + react: 18.3.1 + three: '>=0.126' + + '@react-spring/types@9.7.5': + resolution: {integrity: sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==} + + '@react-three/drei@9.117.2': + resolution: {integrity: sha512-g4JZTvLtPmcmJlz0es1CCUgjFX/hqOkvVp/vAXbrpxJA5p/uD/YZCr5KKlnQOlj6ZwOtZ4P++WRXR4bDKXThzg==} + peerDependencies: + '@react-three/fiber': '>=8.0' + react: 18.3.1 + react-dom: 18.3.1 + three: '>=0.137' + peerDependenciesMeta: + react-dom: + optional: true + + '@react-three/fiber@9.0.0-beta.1': + resolution: {integrity: sha512-IEux2Xrnq7YZwKlh5WZWGM4dorZpUKy9OWg8OfgJY2mI/LvqcfFapblFBTWJIc8HmzlBW+BpL4SsXpT9J5pnMA==} + peerDependencies: + expo: '>=43.0' + expo-asset: '>=8.4' + expo-file-system: '>=11.0' + expo-gl: '>=11.0' + react: 18.3.1 + react-dom: 18.3.1 + react-native: '>=0.69' + three: '>=0.141' + 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 + '@rollup/rollup-android-arm-eabi@4.24.3': resolution: {integrity: sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ==} cpu: [arm] @@ -1207,6 +1359,12 @@ packages: '@swc/helpers@0.5.13': resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + '@tweenjs/tween.js@23.1.3': + resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} + + '@types/draco3d@1.4.10': + resolution: {integrity: sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -1222,15 +1380,30 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/offscreencanvas@2019.7.3': + resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} '@types/react-dom@18.3.1': resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} + '@types/react-reconciler@0.28.8': + resolution: {integrity: sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==} + '@types/react@18.3.12': resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} + '@types/stats.js@0.17.3': + resolution: {integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==} + + '@types/three@0.170.0': + resolution: {integrity: sha512-CUm2uckq+zkCY7ZbFpviRttY+6f9fvwm6YqSqPfA5K22s9w7R4VnA3rzJse8kHVvuzLcTx+CjNCs2NYe0QFAyg==} + + '@types/webxr@0.5.20': + resolution: {integrity: sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==} + '@typescript-eslint/eslint-plugin@8.7.0': resolution: {integrity: sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1342,6 +1515,14 @@ packages: resolution: {integrity: sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@use-gesture/core@10.3.1': + resolution: {integrity: sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==} + + '@use-gesture/react@10.3.1': + resolution: {integrity: sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==} + peerDependencies: + react: 18.3.1 + '@vitest/coverage-istanbul@2.1.4': resolution: {integrity: sha512-NLmfjzXnRSmLF/h4hYkzjvd7hZ85DRZzPUqXu0McPFCMczDfNmOjMoM3KaxjFaEmOc1YzX9HHbU/Rr9VO+35ow==} peerDependencies: @@ -1391,6 +1572,9 @@ packages: '@vitest/utils@2.1.4': resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} + '@webgpu/types@0.1.51': + resolution: {integrity: sha512-ktR3u64NPjwIViNCck+z9QeyN0iPkQCUOQ07ZCV1RzlkfP+olLTeEZ95O1QHS+v4w9vJeY9xj/uJuSphsHy5rQ==} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1496,6 +1680,12 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + 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'} @@ -1518,6 +1708,9 @@ 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==} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -1542,6 +1735,11 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + camera-controls@2.9.0: + resolution: {integrity: sha512-TpCujnP0vqPppTXXJRYpvIy0xq9Tro6jQf2iYUxlDpPCNxkvE/XGaTuwIxnhINOkVP/ob2CRYXtY3iVYXeMEzA==} + peerDependencies: + three: '>=0.126.1' + caniuse-lite@1.0.30001675: resolution: {integrity: sha512-/wV1bQwPrkLiQMjaJF5yUMVM/VdRPOCU8QZ+PmG6uW6DvYSrNY1bpwHI/3mOcUosLaJCzYDi5o91IQB51ft6cg==} @@ -1607,6 +1805,11 @@ packages: core-js-compat@3.38.1: resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1639,6 +1842,9 @@ packages: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1647,15 +1853,6 @@ packages: supports-color: optional: true - debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -1687,6 +1884,9 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + detect-gpu@5.0.57: + resolution: {integrity: sha512-iHfsCCAyxYTE0S4ULs52/DhV2W4l+VT9sTnnYLMwgdNlXKks6PSZleZRDmTCLvPXS4Lt30JI/M5QjhUPwwnZfQ==} + detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -1705,6 +1905,9 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + draco3d@1.5.7: + resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -1952,6 +2155,12 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fflate@0.6.10: + resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -2057,6 +2266,9 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + glsl-noise@0.0.0: + resolution: {integrity: sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==} + gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -2089,6 +2301,9 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hls.js@1.5.17: + resolution: {integrity: sha512-wA66nnYFvQa1o4DO/BFgLNRKnBTVXpNeldGRBJ2Y0SvFtdwvFKCbqa9zhHoZLoxHhZ+jYsj3aIBkWQQCPNOhMw==} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -2111,10 +2326,16 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -2214,6 +2435,9 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + 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'} @@ -2278,6 +2502,11 @@ packages: iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + its-fine@1.2.5: + resolution: {integrity: sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==} + peerDependencies: + react: 18.3.1 + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -2346,6 +2575,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + 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'} @@ -2381,6 +2613,12 @@ 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.12: resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} @@ -2395,6 +2633,14 @@ 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@0.18.1: + resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -2425,9 +2671,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2445,9 +2688,9 @@ packages: next-plausible@3.12.2: resolution: {integrity: sha512-jyOYLAdwaZZR6nrzFhN9xfVjzYOG6mIQ/LLDCfdAS99ELy759cKfNxluGo+pI2Xh9cYxTFYYZGlnkyR3IPy4yg==} peerDependencies: - next: ^11.1.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + next: 15.0.2 + react: 18.3.1 + react-dom: 18.3.1 next@15.0.2: resolution: {integrity: sha512-rxIWHcAu4gGSDmwsELXacqAPUk+j8dV/A9cDF5fsiCMpkBDYkO2AEaL1dfD+nNmDiU6QMCFN8Q30VEKapT9UHQ==} @@ -2457,8 +2700,8 @@ packages: '@opentelemetry/api': ^1.1.0 '@playwright/test': ^1.41.2 babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-02c0e824-20241028 - react-dom: ^18.2.0 || 19.0.0-rc-02c0e824-20241028 + react: 18.3.1 + react-dom: 18.3.1 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': @@ -2669,6 +2912,9 @@ packages: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} + potpack@1.0.2: + resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -2682,6 +2928,9 @@ packages: engines: {node: '>=14'} hasBin: true + promise-worker-transferable@1.0.4: + resolution: {integrity: sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -2692,14 +2941,31 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + react-composer@5.0.3: + resolution: {integrity: sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==} + peerDependencies: + react: 18.3.1 + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: - react: ^18.3.1 + react: 18.3.1 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-reconciler@0.31.0-rc.0: + resolution: {integrity: sha512-hOHzEH+aXLQGJjEoFkz2fX5ZQCDu0VjZfhyhIqRyJrz3bwkdEloH3y+xx8/HVr8oqcm65o9/9yaK97dH+tRP2A==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: 18.3.1 + + react-use-measure@2.1.1: + resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==} + peerDependencies: + react: 18.3.1 + react-dom: 18.3.1 + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -2723,6 +2989,9 @@ packages: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regexp-tree@0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true @@ -2735,6 +3004,10 @@ packages: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + requireindex@1.2.0: resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} engines: {node: '>=0.10.5'} @@ -2787,6 +3060,9 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.25.0-rc.0: + resolution: {integrity: sha512-B3aSqMfoRkucM94MztZD1CyNyf68W9A3dL/TT453G6uNcxMBqGQ+rhFKyxNnWH/mfRHlGBr0tF0F472JCETH4g==} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -2863,6 +3139,15 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + 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==} + std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} @@ -2925,7 +3210,7 @@ packages: peerDependencies: '@babel/core': '*' babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + react: 18.3.1 peerDependenciesMeta: '@babel/core': optional: true @@ -2945,6 +3230,11 @@ 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: 18.3.1 + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -2971,6 +3261,20 @@ 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.34.0: + resolution: {integrity: sha512-U5qJYWgUKBFJqr1coMSbczA964uvouzBjQbtJlaI9LfMwy7hr+kc1Mfh0gqi/2872KmGu9utgff6lj8Oti8+VQ==} + peerDependencies: + three: '>=0.128.0' + + three@0.170.0: + resolution: {integrity: sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -3008,6 +3312,19 @@ packages: resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} engines: {node: '>=18'} + troika-three-text@0.52.0: + resolution: {integrity: sha512-4rywfbPxayE5ktmdkCMdnq5BZl5LPVgNElQnJZ9/DAW6JYnY2ft9teCqof4qwdzLMZ7QaIS5NziJRs2XRsQpDg==} + peerDependencies: + three: '>=0.125.0' + + troika-three-utils@0.52.0: + resolution: {integrity: sha512-00oxqIIehtEKInOTQekgyknBuRUj1POfOUE2q1OmL+Xlpp4gIu+S0oA0schTyXsDS4d9DkR04iqCdD40rF5R6w==} + peerDependencies: + three: '>=0.125.0' + + troika-worker-utils@0.52.0: + resolution: {integrity: sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==} + ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -3028,6 +3345,9 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tunnel-rat@0.1.2: + resolution: {integrity: sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -3080,9 +3400,18 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: 18.3.1 + 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 @@ -3155,6 +3484,12 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + 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==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -3239,6 +3574,39 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zustand@4.5.5: + resolution: {integrity: sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: 18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + + zustand@5.0.1: + resolution: {integrity: sha512-pRET7Lao2z+n5R/HduXMio35TncTlSW68WsYBq2Lg1ASspsNGjpwLAsij3RpouyV6+kHMwwwzP0bZPD70/Jx/w==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: 18.3.1 + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + snapshots: '@alloc/quick-lru@5.2.0': {} @@ -3830,6 +4198,10 @@ snapshots: dependencies: '@babel/types': 7.26.0 + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/template@7.25.9': dependencies: '@babel/code-frame': 7.26.2 @@ -4017,7 +4389,7 @@ snapshots: '@eslint/config-array@0.18.0': dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.6 + debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -4027,7 +4399,7 @@ snapshots: '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.6 + debug: 4.3.7 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -4182,6 +4554,13 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@mediapipe/tasks-vision@0.10.17': {} + + '@monogrid/gainmap-js@3.0.6(three@0.170.0)': + dependencies: + promise-worker-transferable: 1.0.4 + three: 0.170.0 + '@next/env@15.0.2': {} '@next/swc-darwin-arm64@15.0.2': @@ -4257,11 +4636,159 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@pixiv/three-vrm-core@3.1.6(three@0.170.0)': + dependencies: + '@pixiv/types-vrm-0.0': 3.1.6 + '@pixiv/types-vrmc-vrm-1.0': 3.1.6 + three: 0.170.0 + + '@pixiv/three-vrm-materials-hdr-emissive-multiplier@3.1.6(three@0.170.0)': + dependencies: + '@pixiv/types-vrmc-materials-hdr-emissive-multiplier-1.0': 3.1.6 + three: 0.170.0 + + '@pixiv/three-vrm-materials-mtoon@3.1.6(three@0.170.0)': + dependencies: + '@pixiv/types-vrm-0.0': 3.1.6 + '@pixiv/types-vrmc-materials-mtoon-1.0': 3.1.6 + three: 0.170.0 + + '@pixiv/three-vrm-materials-v0compat@3.1.6(three@0.170.0)': + dependencies: + '@pixiv/types-vrm-0.0': 3.1.6 + '@pixiv/types-vrmc-materials-mtoon-1.0': 3.1.6 + three: 0.170.0 + + '@pixiv/three-vrm-node-constraint@3.1.6(three@0.170.0)': + dependencies: + '@pixiv/types-vrmc-node-constraint-1.0': 3.1.6 + three: 0.170.0 + + '@pixiv/three-vrm-springbone@3.1.6(three@0.170.0)': + dependencies: + '@pixiv/types-vrm-0.0': 3.1.6 + '@pixiv/types-vrmc-springbone-1.0': 3.1.6 + '@pixiv/types-vrmc-springbone-extended-collider-1.0': 3.1.6 + three: 0.170.0 + + '@pixiv/three-vrm@3.1.6(three@0.170.0)': + dependencies: + '@pixiv/three-vrm-core': 3.1.6(three@0.170.0) + '@pixiv/three-vrm-materials-hdr-emissive-multiplier': 3.1.6(three@0.170.0) + '@pixiv/three-vrm-materials-mtoon': 3.1.6(three@0.170.0) + '@pixiv/three-vrm-materials-v0compat': 3.1.6(three@0.170.0) + '@pixiv/three-vrm-node-constraint': 3.1.6(three@0.170.0) + '@pixiv/three-vrm-springbone': 3.1.6(three@0.170.0) + three: 0.170.0 + + '@pixiv/types-vrm-0.0@3.1.6': {} + + '@pixiv/types-vrmc-materials-hdr-emissive-multiplier-1.0@3.1.6': {} + + '@pixiv/types-vrmc-materials-mtoon-1.0@3.1.6': {} + + '@pixiv/types-vrmc-node-constraint-1.0@3.1.6': {} + + '@pixiv/types-vrmc-springbone-1.0@3.1.6': {} + + '@pixiv/types-vrmc-springbone-extended-collider-1.0@3.1.6': {} + + '@pixiv/types-vrmc-vrm-1.0@3.1.6': {} + '@pkgjs/parseargs@0.11.0': optional: true '@pkgr/core@0.1.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@9.0.0-beta.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.170.0))(react@18.3.1)(three@0.170.0)': + 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': 9.0.0-beta.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.170.0) + react: 18.3.1 + three: 0.170.0 + + '@react-spring/types@9.7.5': {} + + '@react-three/drei@9.117.2(@react-three/fiber@9.0.0-beta.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.170.0))(@types/react@18.3.12)(@types/three@0.170.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.170.0)(use-sync-external-store@1.2.2(react@18.3.1))': + dependencies: + '@babel/runtime': 7.26.0 + '@mediapipe/tasks-vision': 0.10.17 + '@monogrid/gainmap-js': 3.0.6(three@0.170.0) + '@react-spring/three': 9.7.5(@react-three/fiber@9.0.0-beta.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.170.0))(react@18.3.1)(three@0.170.0) + '@react-three/fiber': 9.0.0-beta.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.170.0) + '@use-gesture/react': 10.3.1(react@18.3.1) + camera-controls: 2.9.0(three@0.170.0) + cross-env: 7.0.3 + detect-gpu: 5.0.57 + glsl-noise: 0.0.0 + hls.js: 1.5.17 + maath: 0.10.8(@types/three@0.170.0)(three@0.170.0) + meshline: 3.3.1(three@0.170.0) + react: 18.3.1 + react-composer: 5.0.3(react@18.3.1) + stats-gl: 2.4.2(@types/three@0.170.0)(three@0.170.0) + stats.js: 0.17.0 + suspend-react: 0.1.3(react@18.3.1) + three: 0.170.0 + three-mesh-bvh: 0.7.8(three@0.170.0) + three-stdlib: 2.34.0(three@0.170.0) + troika-three-text: 0.52.0(three@0.170.0) + tunnel-rat: 0.1.2(@types/react@18.3.12)(react@18.3.1) + utility-types: 3.11.0 + uuid: 9.0.1 + zustand: 5.0.1(@types/react@18.3.12)(react@18.3.1)(use-sync-external-store@1.2.2(react@18.3.1)) + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/three' + - immer + - use-sync-external-store + + '@react-three/fiber@9.0.0-beta.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.170.0)': + dependencies: + '@babel/runtime': 7.26.0 + '@types/react-reconciler': 0.28.8 + base64-js: 1.5.1 + buffer: 6.0.3 + its-fine: 1.2.5(react@18.3.1) + react: 18.3.1 + react-reconciler: 0.31.0-rc.0(react@18.3.1) + react-use-measure: 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + scheduler: 0.25.0-rc.0 + suspend-react: 0.1.3(react@18.3.1) + three: 0.170.0 + zustand: 4.5.5(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - immer + '@rollup/rollup-android-arm-eabi@4.24.3': optional: true @@ -4667,6 +5194,10 @@ snapshots: dependencies: tslib: 2.7.0 + '@tweenjs/tween.js@23.1.3': {} + + '@types/draco3d@1.4.10': {} + '@types/estree@1.0.6': {} '@types/json-schema@7.0.15': {} @@ -4679,17 +5210,36 @@ snapshots: '@types/normalize-package-data@2.4.4': {} + '@types/offscreencanvas@2019.7.3': {} + '@types/prop-types@15.7.12': {} '@types/react-dom@18.3.1': dependencies: '@types/react': 18.3.12 + '@types/react-reconciler@0.28.8': + dependencies: + '@types/react': 18.3.12 + '@types/react@18.3.12': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 + '@types/stats.js@0.17.3': {} + + '@types/three@0.170.0': + dependencies: + '@tweenjs/tween.js': 23.1.3 + '@types/stats.js': 0.17.3 + '@types/webxr': 0.5.20 + '@webgpu/types': 0.1.51 + fflate: 0.8.2 + meshoptimizer: 0.18.1 + + '@types/webxr@0.5.20': {} + '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.11.0 @@ -4714,7 +5264,7 @@ snapshots: '@typescript-eslint/types': 8.7.0 '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.7.0 - debug: 4.3.6 + debug: 4.3.7 eslint: 9.13.0(jiti@1.21.6) optionalDependencies: typescript: 5.6.3 @@ -4740,7 +5290,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.3) '@typescript-eslint/utils': 8.7.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) - debug: 4.3.6 + debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -4758,7 +5308,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.6 + debug: 4.3.7 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -4773,7 +5323,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.12.2 '@typescript-eslint/visitor-keys': 8.12.2 - debug: 4.3.6 + debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -4788,7 +5338,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.7.0 '@typescript-eslint/visitor-keys': 8.7.0 - debug: 4.3.6 + debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -4847,6 +5397,13 @@ snapshots: '@typescript-eslint/types': 8.7.0 eslint-visitor-keys: 3.4.3 + '@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 + '@vitest/coverage-istanbul@2.1.4(vitest@2.1.4(@types/node@22.8.4)(jsdom@25.0.1))': dependencies: '@istanbuljs/schema': 0.1.3 @@ -4911,6 +5468,8 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 + '@webgpu/types@0.1.51': {} + acorn-jsx@5.3.2(acorn@7.4.1): dependencies: acorn: 7.4.1 @@ -5036,6 +5595,12 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: {} + + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + binary-extensions@2.3.0: {} bowser@2.11.0: {} @@ -5060,6 +5625,11 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + builtin-modules@3.3.0: {} busboy@1.6.0: @@ -5080,6 +5650,10 @@ snapshots: camelcase-css@2.0.1: {} + camera-controls@2.9.0(three@0.170.0): + dependencies: + three: 0.170.0 + caniuse-lite@1.0.30001675: {} chai@5.1.2: @@ -5151,6 +5725,10 @@ snapshots: dependencies: browserslist: 4.24.2 + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.3 + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -5188,14 +5766,12 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.1 + debounce@1.2.1: {} + debug@3.2.7: dependencies: ms: 2.1.3 - debug@4.3.6: - dependencies: - ms: 2.1.2 - debug@4.3.7: dependencies: ms: 2.1.3 @@ -5220,6 +5796,10 @@ snapshots: delayed-stream@1.0.0: {} + detect-gpu@5.0.57: + dependencies: + webgl-constants: 1.1.1 + detect-libc@2.0.3: optional: true @@ -5235,6 +5815,8 @@ snapshots: dependencies: esutils: 2.0.3 + draco3d@1.5.7: {} + eastasianwidth@0.2.0: {} electron-to-chromium@1.5.49: {} @@ -5467,7 +6049,7 @@ snapshots: '@es-joy/jsdoccomment': 0.48.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 - debug: 4.3.6 + debug: 4.3.7 escape-string-regexp: 4.0.0 eslint: 9.13.0(jiti@1.21.6) espree: 10.3.0 @@ -5570,7 +6152,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6 + debug: 4.3.7 escape-string-regexp: 4.0.0 eslint-scope: 8.2.0 eslint-visitor-keys: 4.2.0 @@ -5649,6 +6231,10 @@ snapshots: dependencies: reusify: 1.0.4 + fflate@0.6.10: {} + + fflate@0.8.2: {} + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -5767,6 +6353,8 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + glsl-noise@0.0.0: {} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 @@ -5793,6 +6381,8 @@ snapshots: dependencies: function-bind: 1.1.2 + hls.js@1.5.17: {} + hosted-git-info@2.8.9: {} html-encoding-sniffer@4.0.0: @@ -5819,8 +6409,12 @@ snapshots: dependencies: safer-buffer: 2.1.2 + ieee754@1.2.1: {} + ignore@5.3.2: {} + immediate@3.0.6: {} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -5909,6 +6503,8 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-promise@2.2.2: {} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -5986,6 +6582,11 @@ snapshots: reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 + its-fine@1.2.5(react@18.3.1): + dependencies: + '@types/react-reconciler': 0.28.8 + react: 18.3.1 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -6064,6 +6665,10 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lie@3.3.0: + dependencies: + immediate: 3.0.6 + lilconfig@2.1.0: {} lilconfig@3.1.2: {} @@ -6092,6 +6697,11 @@ snapshots: dependencies: yallist: 3.1.1 + maath@0.10.8(@types/three@0.170.0)(three@0.170.0): + dependencies: + '@types/three': 0.170.0 + three: 0.170.0 + magic-string@0.30.12: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -6108,6 +6718,12 @@ snapshots: merge2@1.4.1: {} + meshline@3.3.1(three@0.170.0): + dependencies: + three: 0.170.0 + + meshoptimizer@0.18.1: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -6133,8 +6749,6 @@ snapshots: minipass@7.1.2: {} - ms@2.1.2: {} - ms@2.1.3: {} mz@2.7.0: @@ -6362,6 +6976,8 @@ snapshots: picocolors: 1.1.0 source-map-js: 1.2.1 + potpack@1.0.2: {} + prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -6370,6 +6986,11 @@ snapshots: prettier@3.3.3: {} + promise-worker-transferable@1.0.4: + dependencies: + is-promise: 2.2.2 + lie: 3.3.0 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -6380,6 +7001,11 @@ snapshots: queue-microtask@1.2.3: {} + 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 @@ -6388,6 +7014,17 @@ snapshots: react-is@16.13.1: {} + react-reconciler@0.31.0-rc.0(react@18.3.1): + dependencies: + react: 18.3.1 + scheduler: 0.25.0-rc.0 + + react-use-measure@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + debounce: 1.2.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -6423,6 +7060,8 @@ snapshots: globalthis: 1.0.4 which-builtin-type: 1.1.4 + regenerator-runtime@0.14.1: {} + regexp-tree@0.1.27: {} regexp.prototype.flags@1.5.2: @@ -6436,6 +7075,8 @@ snapshots: dependencies: jsesc: 0.5.0 + require-from-string@2.0.2: {} + requireindex@1.2.0: {} resolve-from@4.0.0: {} @@ -6509,6 +7150,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + scheduler@0.25.0-rc.0: {} + semver@5.7.2: {} semver@6.3.1: {} @@ -6607,6 +7250,13 @@ snapshots: stackback@0.0.2: {} + stats-gl@2.4.2(@types/three@0.170.0)(three@0.170.0): + dependencies: + '@types/three': 0.170.0 + three: 0.170.0 + + stats.js@0.17.0: {} + std-env@3.7.0: {} streamsearch@1.1.0: {} @@ -6703,6 +7353,10 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + suspend-react@0.1.3(react@18.3.1): + dependencies: + react: 18.3.1 + symbol-tree@3.2.4: {} synckit@0.9.2: @@ -6753,6 +7407,22 @@ snapshots: dependencies: any-promise: 1.3.0 + three-mesh-bvh@0.7.8(three@0.170.0): + dependencies: + three: 0.170.0 + + three-stdlib@2.34.0(three@0.170.0): + dependencies: + '@types/draco3d': 1.4.10 + '@types/offscreencanvas': 2019.7.3 + '@types/webxr': 0.5.20 + draco3d: 1.5.7 + fflate: 0.6.10 + potpack: 1.0.2 + three: 0.170.0 + + three@0.170.0: {} + tinybench@2.9.0: {} tinyexec@0.3.1: {} @@ -6781,6 +7451,20 @@ snapshots: dependencies: punycode: 2.3.1 + troika-three-text@0.52.0(three@0.170.0): + dependencies: + bidi-js: 1.0.3 + three: 0.170.0 + troika-three-utils: 0.52.0(three@0.170.0) + troika-worker-utils: 0.52.0 + webgl-sdf-generator: 1.1.1 + + troika-three-utils@0.52.0(three@0.170.0): + dependencies: + three: 0.170.0 + + troika-worker-utils@0.52.0: {} + ts-api-utils@1.3.0(typescript@5.6.3): dependencies: typescript: 5.6.3 @@ -6803,6 +7487,14 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tunnel-rat@0.1.2(@types/react@18.3.12)(react@18.3.1): + dependencies: + zustand: 4.5.5(@types/react@18.3.12)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - immer + - react + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -6866,8 +7558,14 @@ snapshots: dependencies: punycode: 2.3.1 + use-sync-external-store@1.2.2(react@18.3.1): + dependencies: + react: 18.3.1 + util-deprecate@1.0.2: {} + utility-types@3.11.0: {} + uuid@9.0.1: {} validate-npm-package-license@3.0.4: @@ -6941,6 +7639,10 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + webgl-constants@1.1.1: {} + + webgl-sdf-generator@1.1.1: {} + webidl-conversions@7.0.0: {} whatwg-encoding@3.1.1: @@ -7026,3 +7728,16 @@ snapshots: yaml@2.5.0: {} yocto-queue@0.1.0: {} + + zustand@4.5.5(@types/react@18.3.12)(react@18.3.1): + dependencies: + use-sync-external-store: 1.2.2(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + react: 18.3.1 + + zustand@5.0.1(@types/react@18.3.12)(react@18.3.1)(use-sync-external-store@1.2.2(react@18.3.1)): + optionalDependencies: + '@types/react': 18.3.12 + react: 18.3.1 + use-sync-external-store: 1.2.2(react@18.3.1) diff --git a/src/app/ref/page.tsx b/src/app/ref/page.tsx new file mode 100644 index 0000000..d3d4ebb --- /dev/null +++ b/src/app/ref/page.tsx @@ -0,0 +1,137 @@ +/** + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +/* eslint-disable react/no-unknown-property, react/no-multi-comp */ +"use client"; +import { VRMLoaderPlugin, type VRM } from "@pixiv/three-vrm"; +import { OrbitControls } from "@react-three/drei"; +// @ts-expect-error -- It seems like the beta version has type-def issues. +import { Canvas } from "@react-three/fiber"; +import { useState, useRef, type ChangeEvent, type JSX, useEffect } from "react"; +import { PerspectiveCamera } from "three"; +// eslint-disable-next-line import/extensions -- We need this apparently. +import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js"; +import { Rule } from "../../components/rule"; +import { MainVRoid, VRoid } from "../../config/Vroid"; + +const concatenated = [ + MainVRoid, + ...VRoid.toSorted((a, b) => { + return a.name.localeCompare(b.name); + }), +]; + +/** + * Scene setup component for lighting and controls. + * @returns The Three.JS scene. + */ +const SceneSetup = (): JSX.Element => { + return ( + <> + {/* Main directional light from front-top */} + { /* @ts-expect-error -- why */} + + {/* Fill light from back */} + { /* @ts-expect-error -- why */} + + {/* Ambient light for overall scene brightness */} + { /* @ts-expect-error -- why */} + + {/* Orbit controls for camera manipulation */} + + + ); +}; + +/** + * Reference component for displaying and interacting with VRM models. + * @returns The reference page. + */ +const Reference = (): JSX.Element => { + const [ selected, setSelected ] = useState(MainVRoid.file); + const aspect = 1920 / 1080; + const { current: camera } + = useRef(new PerspectiveCamera(30, aspect, 0.1, 1000)); + + const handleChange = (event: ChangeEvent): void => { + const { target } = event; + if (target instanceof HTMLSelectElement) { + setSelected(target.value); + } + }; + + const loader = new GLTFLoader(); + loader.register((parser) => { + return new VRMLoaderPlugin(parser); + }); + + const [ model, setModel ] = useState(null); + + useEffect(() => { + loader.load(`https://cdn.nhcarrigan.com/vrm/${selected}`, (gltf) => { + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + const { vrm } = gltf.userData as { vrm: VRM }; + if (vrm.lookAt) { + vrm.lookAt.target = camera; + } + // Center the model + vrm.scene.position.set(0, 0, 0); + // Add rotation if needed + vrm.scene.rotation.y = Math.PI; + + /* @ts-expect-error -- why */ + setModel(); + }); + }, [ selected ]); + + useEffect(() => { + // Position camera to better frame the model + camera.position.set(0, 0, 3); + }, [ camera ]); + + return ( +
+

{`Reference`}

+
+

{`Want to draw art of Naomi? Here's a fully interactive reference page with all of her model's outfits!`}

+ + +
+
+ + + {model} + +
+
+ ); +}; + +export default Reference; diff --git a/src/config/NavItems.ts b/src/config/NavItems.ts index 99df65c..502b56d 100644 --- a/src/config/NavItems.ts +++ b/src/config/NavItems.ts @@ -26,6 +26,7 @@ export const NavItems = [ { href: "/tech", text: "Technologies" }, { href: "/contribute", text: "Contribute to our Projects" }, { href: "/koikatsu", text: "Koikatsu Scenes" }, + { href: "/ref", text: "Reference Sheet" }, ].sort((a, b) => { return a.text.localeCompare(b.text); }); diff --git a/src/config/Vroid.ts b/src/config/Vroid.ts new file mode 100644 index 0000000..e69fa08 --- /dev/null +++ b/src/config/Vroid.ts @@ -0,0 +1,38 @@ +/** + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +/** + * List of vroid models to render. + */ +const VRoid = [ + { + file: "business.vrm", + name: "Business Suit", + }, + { + file: "casual.vrm", + name: "Casual Outfit", + }, + { + file: "formal.vrm", + name: "Formal Outfit", + }, + { + file: "sleep.vrm", + name: "Sleepwear", + }, + { + file: "swim.vrm", + name: "Swimsuit", + }, +]; + +const MainVRoid = { + file: "main.vrm", + name: "Main Outfit", +}; + +export { VRoid, MainVRoid }; diff --git a/test/config/VRoid.spec.ts b/test/config/VRoid.spec.ts new file mode 100644 index 0000000..ddad1dd --- /dev/null +++ b/test/config/VRoid.spec.ts @@ -0,0 +1,36 @@ +/** + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +import { describe, it, expect } from "vitest"; +import { MainVRoid, VRoid } from "../../src/config/Vroid"; + +const concatenated = [ + MainVRoid, + ...VRoid.sort((a, b) => { + return a.name.localeCompare(b.name); + }), +]; + +describe("vroid objects", () => { + it("should have unique names", () => { + expect.assertions(1); + const set = new Set( + concatenated.map((a) => { + return a.name; + }), + ); + expect(set, "are not unique").toHaveLength(concatenated.length); + }); + + it("should have unique file properties", () => { + expect.assertions(1); + const set = new Set( + concatenated.map((a) => { + return a.file; + }), + ); + expect(set, "are not unique").toHaveLength(concatenated.length); + }); +});