diff --git a/RocketControlUnitGUI/package-lock.json b/RocketControlUnitGUI/package-lock.json index 0468104..4cee8d2 100644 --- a/RocketControlUnitGUI/package-lock.json +++ b/RocketControlUnitGUI/package-lock.json @@ -1,18 +1,33 @@ { - "name": "Rocket-Control-Unit", + "name": "rocket-control-unit-gui", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "Rocket-Control-Unit", + "name": "rocket-control-unit-gui", "version": "0.1.0", "dependencies": { + "@dimforge/rapier3d-compat": "^0.14.0", "@floating-ui/dom": "1.5.3", - "pocketbase": "^0.20.3" + "@theatre/core": "^0.7.2", + "@theatre/studio": "^0.7.2", + "@threlte/core": "^7.3.1", + "@threlte/extras": "^8.12.0", + "@threlte/flex": "^1.0.3", + "@threlte/rapier": "^2.0.1", + "@threlte/theatre": "^2.1.8", + "@threlte/xr": "^0.1.4", + "@types/three": "^0.170.0", + "chart.js": "^4.4.6", + "leaflet": "^1.9.4", + "pocketbase": "^0.20.3", + "three": "^0.169.0", + "threlte": "^3.13.1", + "troika-three-text": "^0.52.0", + "troika-three-utils": "^0.52.0" }, "devDependencies": { - "@playwright/test": "^1.28.1", "@skeletonlabs/skeleton": "2.5.1", "@skeletonlabs/tw-plugin": "0.2.4", "@sveltejs/adapter-node": "^4.0.1", @@ -62,7 +77,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -71,14 +85,20 @@ "node": ">=6.0.0" } }, + "node_modules/@dimforge/rapier3d-compat": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.14.0.tgz", + "integrity": "sha512-/uHrUzS+CRQ+NQrrJCEDUkhwHlNsAAexbNXgbN9sHY+GwR+SFFAFrxRr8Llf5/AJZzqiLANdQIfJ63Cw4gJVqw==" + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -89,13 +109,14 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -106,13 +127,14 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -123,13 +145,14 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -140,13 +163,14 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -157,13 +181,14 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -174,13 +199,14 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -191,13 +217,14 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -208,13 +235,14 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -225,13 +253,14 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -242,13 +271,14 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -259,13 +289,14 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -276,13 +307,14 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -293,13 +325,14 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -310,13 +343,14 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -327,13 +361,14 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -344,13 +379,14 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -361,13 +397,14 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -378,13 +415,14 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -395,13 +433,14 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -412,13 +451,14 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -429,13 +469,14 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -446,13 +487,14 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -670,7 +712,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -684,7 +725,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -693,7 +733,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -701,19 +740,22 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -759,21 +801,6 @@ "node": ">=14" } }, - "node_modules/@playwright/test": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.0.tgz", - "integrity": "sha512-Ebw0+MCqoYflop7wVKj711ccbNlrwTBCtjY5rlbiY9kHL2bCYxq+qltK6uPsVBGGAOb033H2VO0YobcQVxoW7Q==", - "dev": true, - "dependencies": { - "playwright": "1.43.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/@polka/url": { "version": "1.0.0-next.25", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", @@ -874,195 +901,224 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.1.tgz", - "integrity": "sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.1.tgz", - "integrity": "sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.1.tgz", - "integrity": "sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.1.tgz", - "integrity": "sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.1.tgz", - "integrity": "sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.1.tgz", - "integrity": "sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.1.tgz", - "integrity": "sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.1.tgz", - "integrity": "sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", "cpu": [ - "ppc64le" + "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.1.tgz", - "integrity": "sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.1.tgz", - "integrity": "sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.1.tgz", - "integrity": "sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.1.tgz", - "integrity": "sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.1.tgz", - "integrity": "sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.1.tgz", - "integrity": "sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.1.tgz", - "integrity": "sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1205,6 +1261,199 @@ "tailwindcss": ">=3.0.0 || insiders" } }, + "node_modules/@theatre/core": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@theatre/core/-/core-0.7.2.tgz", + "integrity": "sha512-IDQa/6WY7mIJAtsSd4EgNcM0IUZkl+FrqZ8DdYiCVTFap9ARDNmrngJOeFjJOsnnaHlc5GdEB/jj7fsjbIrAzQ==", + "dependencies": { + "@theatre/dataverse": "0.7.2" + } + }, + "node_modules/@theatre/dataverse": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@theatre/dataverse/-/dataverse-0.7.2.tgz", + "integrity": "sha512-YyfoyX7EyhFUY2OM5fsM0LPrs1SdgLwpiTMkkvTIoZLdOwvQhstjYq4Yz/8ZncJlRoTWvakfmgvCaBN+QuBYxg==", + "dependencies": { + "lodash-es": "^4.17.21" + } + }, + "node_modules/@theatre/studio": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@theatre/studio/-/studio-0.7.2.tgz", + "integrity": "sha512-p6LTKzJWVlcHkpGzIlNHh9AkGbB3E+0q9Pjxv+OJoTDe1IK+CMKW695Wp+1//lB4vfC9qShe4z/p+Zaj1q8KtA==", + "dependencies": { + "@theatre/dataverse": "0.7.2" + }, + "peerDependencies": { + "@theatre/core": "*" + } + }, + "node_modules/@threlte/core": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@threlte/core/-/core-7.3.1.tgz", + "integrity": "sha512-qGfpboBL5PWYGqPIpnRmvp0ssW551ULRZsXRpWAwSPWGughiOSL9dBZjiwWQTQHUFMEErgquo6hbFJCuWE0uTg==", + "dependencies": { + "mitt": "^3.0.1" + }, + "peerDependencies": { + "svelte": ">=4", + "three": ">=0.152" + } + }, + "node_modules/@threlte/extras": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/@threlte/extras/-/extras-8.12.0.tgz", + "integrity": "sha512-rWlY9xWCcr5+KkPFcV5K2lHxshM9QjpfJK98Vhsm+VnL7/tLq4FEnghalrz2289cY9ZiiD0soO34WGqFYu7ZyA==", + "dependencies": { + "@threejs-kit/instanced-sprite-mesh": "^2.4.6", + "three-mesh-bvh": "^0.7.1", + "three-perf": "^1.0.10", + "troika-three-text": "^0.49.0" + }, + "peerDependencies": { + "svelte": ">=4", + "three": ">=0.152" + } + }, + "node_modules/@threlte/extras/node_modules/@threejs-kit/instanced-sprite-mesh": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@threejs-kit/instanced-sprite-mesh/-/instanced-sprite-mesh-2.4.7.tgz", + "integrity": "sha512-31erNfFEF+msFyWH46sIbjaACXqBke/8qMr/xhv9E3INPCLTrLuN4C4W93znnyTiyuCQ3Waf5UOCT18OBWTUtw==", + "dependencies": { + "diet-sprite": "^0.0.1", + "earcut": "^2.2.4", + "maath": "^0.10.7", + "three-instanced-uniforms-mesh": "^0.49.0", + "troika-three-utils": "^0.49.0" + }, + "peerDependencies": { + "three": ">=0.151.0" + } + }, + "node_modules/@threlte/extras/node_modules/three-mesh-bvh": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz", + "integrity": "sha512-rCjsnxEqR9r1/C/lCqzGLS67NDty/S/eT6rAJfDvsanrIctTWdNoR4ZOGWewCB13h1QkVo2BpmC0wakj1+0m8A==", + "peerDependencies": { + "three": ">= 0.151.0" + } + }, + "node_modules/@threlte/extras/node_modules/three-perf": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/three-perf/-/three-perf-1.0.10.tgz", + "integrity": "sha512-lCur/i8U6m0ysWYhQ1yFGWOZB0QA2oVsDsfynYd65HhXxLxJfiAt8OsXmpv9PnTLacfaZclBcZHUOB9QKk3eaw==", + "dependencies": { + "troika-three-text": "^0.47.2", + "tweakpane": "^3.1.10" + }, + "peerDependencies": { + "three": ">=0.151" + } + }, + "node_modules/@threlte/extras/node_modules/three-perf/node_modules/troika-three-text": { + "version": "0.47.2", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.47.2.tgz", + "integrity": "sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng==", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.47.2", + "troika-worker-utils": "^0.47.2", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/@threlte/extras/node_modules/three-perf/node_modules/troika-three-utils": { + "version": "0.47.2", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.47.2.tgz", + "integrity": "sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg==", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/@threlte/extras/node_modules/three-perf/node_modules/troika-worker-utils": { + "version": "0.47.2", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.47.2.tgz", + "integrity": "sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA==" + }, + "node_modules/@threlte/extras/node_modules/troika-three-text": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.1.tgz", + "integrity": "sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.49.0", + "troika-worker-utils": "^0.49.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/@threlte/extras/node_modules/troika-three-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.49.0.tgz", + "integrity": "sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/@threlte/extras/node_modules/troika-worker-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz", + "integrity": "sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==" + }, + "node_modules/@threlte/flex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@threlte/flex/-/flex-1.0.3.tgz", + "integrity": "sha512-PEkHBMAgVk6MUXwNX2R29JtD5do9f8c+mTYLiPR9iYGwoRVzvcYrHqUisAdFD8K+joGysOPz9grM4LlStpyzaA==", + "dependencies": { + "mitt": "^3.0.1", + "yoga-layout": "^2.0.1" + }, + "peerDependencies": { + "svelte": ">=4", + "three": ">=0.152" + } + }, + "node_modules/@threlte/rapier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@threlte/rapier/-/rapier-2.0.1.tgz", + "integrity": "sha512-fT2bZ+eae0O9jVvkvW4NxryDUhhIO7DJWb7UJfcssX3NmFVwTpf9okzza03Iu2d6p69OPEfVFSe16XrdrohOfA==", + "peerDependencies": { + "@dimforge/rapier3d-compat": ">=0.11", + "svelte": ">=4", + "three": ">=0.152" + } + }, + "node_modules/@threlte/theatre": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@threlte/theatre/-/theatre-2.1.8.tgz", + "integrity": "sha512-Wi0GYmTa2vxJelDt0rvGzL+xUaQozi7RPNZkpvmIA4hnwqewKoMgwQfCI8Gi3yATvUodtVvFigxEO26H6pwySA==", + "peerDependencies": { + "@theatre/core": ">=0.6", + "@theatre/studio": ">=0.6", + "@threlte/core": ">=6.0.3", + "@threlte/extras": ">=5.1.0", + "svelte": ">=4", + "three": ">=0.152" + } + }, + "node_modules/@threlte/xr": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@threlte/xr/-/xr-0.1.4.tgz", + "integrity": "sha512-eYVypXkXX4tafYjmez6ZxC3EHj1TrUAX/VklWL3BxIxQzwS4sI4lSBdCIum1VKKhXq66Ne2+/zQE7xw+gpNCCQ==", + "peerDependencies": { + "svelte": ">=4", + "three": ">=0.152" + } + }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==" + }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", @@ -1213,10 +1462,10 @@ "peer": true }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -1251,6 +1500,29 @@ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, + "node_modules/@types/stats.js": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==" + }, + "node_modules/@types/three": { + "version": "0.170.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.170.0.tgz", + "integrity": "sha512-CUm2uckq+zkCY7ZbFpviRttY+6f9fvwm6YqSqPfA5K22s9w7R4VnA3rzJse8kHVvuzLcTx+CjNCs2NYe0QFAyg==", + "dependencies": { + "@tweenjs/tween.js": "~23.1.3", + "@types/stats.js": "*", + "@types/webxr": "*", + "@webgpu/types": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/@types/webxr": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.20.tgz", + "integrity": "sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", @@ -1447,11 +1719,15 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@webgpu/types": { + "version": "0.1.51", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.51.tgz", + "integrity": "sha512-ktR3u64NPjwIViNCck+z9QeyN0iPkQCUOQ07ZCV1RzlkfP+olLTeEZ95O1QHS+v4w9vJeY9xj/uJuSphsHy5rQ==" + }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -1543,7 +1819,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, "dependencies": { "dequal": "^2.0.3" } @@ -1598,7 +1873,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", - "dev": true, "dependencies": { "dequal": "^2.0.3" } @@ -1609,6 +1883,14 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -1631,12 +1913,13 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1714,9 +1997,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001607", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001607.tgz", - "integrity": "sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==", + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", "dev": true, "funding": [ { @@ -1749,6 +2032,17 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chart.js": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.6.tgz", + "integrity": "sha512-8Y406zevUPbbIBA/HRk33khEmQPk5+cxeflWE/2rx1NJsjVWMPw/9mSP9rxHP5eqi6LNoPBVMfZHxbwLSgldYA==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -1789,7 +2083,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", - "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@types/estree": "^1.0.1", @@ -1802,7 +2095,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, "dependencies": { "@types/estree": "^1.0.0" } @@ -1874,7 +2166,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -1931,7 +2222,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, "engines": { "node": ">=6" } @@ -1958,6 +2248,11 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, + "node_modules/diet-sprite": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/diet-sprite/-/diet-sprite-0.0.1.tgz", + "integrity": "sha512-zSHI2WDAn1wJqJYxcmjWfJv3Iw8oL9reQIbEyx2x2/EZ4/qmUTIo8/5qOCurnAcq61EwtJJaZ0XTy2NRYqpB5A==" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1988,6 +2283,11 @@ "node": ">=6.0.0" } }, + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2013,11 +2313,12 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "peer": true, "bin": { "esbuild": "bin/esbuild" @@ -2026,29 +2327,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -2406,6 +2707,11 @@ "reusify": "^1.0.4" } }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2419,10 +2725,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2790,6 +3097,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -2900,6 +3208,11 @@ "integrity": "sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==", "dev": true }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2931,8 +3244,7 @@ "node_modules/locate-character": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" }, "node_modules/locate-path": { "version": "6.0.0", @@ -2949,6 +3261,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "node_modules/lodash.castarray": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", @@ -2979,11 +3296,19 @@ "node": ">=10" } }, + "node_modules/maath": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", + "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "peerDependencies": { + "@types/three": ">=0.134.0", + "three": ">=0.134.0" + } + }, "node_modules/magic-string": { "version": "0.30.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==", - "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -2994,8 +3319,7 @@ "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" }, "node_modules/merge2": { "version": "1.4.1", @@ -3006,13 +3330,19 @@ "node": ">= 8" } }, + "node_modules/meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==" + }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -3070,6 +3400,11 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -3323,7 +3658,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dev": true, "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^3.0.0", @@ -3334,7 +3668,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, "dependencies": { "@types/estree": "^1.0.0" } @@ -3343,16 +3676,16 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dev": true, "dependencies": { "@types/estree": "*" } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -3384,36 +3717,6 @@ "node": ">= 6" } }, - "node_modules/playwright": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.0.tgz", - "integrity": "sha512-SiOKHbVjTSf6wHuGCbqrEyzlm6qvXcv7mENP+OZon1I07brfZLGdfWV0l/efAzVx7TF3Z45ov1gPEkku9q25YQ==", - "dev": true, - "dependencies": { - "playwright-core": "1.43.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.0.tgz", - "integrity": "sha512-iWFjyBUH97+pUFiyTqSLd8cDMMOS0r2ZYz2qEsPjH8/bX++sbIJT35MSwKnp1r/OQBAqC5XO99xFbJ9XClhf4w==", - "dev": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/pocketbase": { "version": "0.20.3", "resolved": "https://registry.npmjs.org/pocketbase/-/pocketbase-0.20.3.tgz", @@ -3735,6 +4038,14 @@ "node": ">=8.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -3829,12 +4140,13 @@ } }, "node_modules/rollup": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.1.tgz", - "integrity": "sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -3844,21 +4156,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.14.1", - "@rollup/rollup-android-arm64": "4.14.1", - "@rollup/rollup-darwin-arm64": "4.14.1", - "@rollup/rollup-darwin-x64": "4.14.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.14.1", - "@rollup/rollup-linux-arm64-gnu": "4.14.1", - "@rollup/rollup-linux-arm64-musl": "4.14.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.14.1", - "@rollup/rollup-linux-riscv64-gnu": "4.14.1", - "@rollup/rollup-linux-s390x-gnu": "4.14.1", - "@rollup/rollup-linux-x64-gnu": "4.14.1", - "@rollup/rollup-linux-x64-musl": "4.14.1", - "@rollup/rollup-win32-arm64-msvc": "4.14.1", - "@rollup/rollup-win32-ia32-msvc": "4.14.1", - "@rollup/rollup-win32-x64-msvc": "4.14.1", + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", "fsevents": "~2.3.2" } }, @@ -4058,10 +4371,10 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -4249,10 +4562,10 @@ } }, "node_modules/svelte": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.12.tgz", - "integrity": "sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==", - "dev": true, + "version": "4.2.19", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", + "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.1", "@jridgewell/sourcemap-codec": "^1.4.15", @@ -4430,7 +4743,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, "dependencies": { "@types/estree": "^1.0.0" } @@ -4439,7 +4751,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dev": true, "dependencies": { "@types/estree": "*" } @@ -4580,6 +4891,66 @@ "node": ">=0.8" } }, + "node_modules/three": { + "version": "0.169.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.169.0.tgz", + "integrity": "sha512-Ed906MA3dR4TS5riErd4QBsRGPcx+HBDX2O5yYE5GqJeFQTPU+M56Va/f/Oph9X7uZo3W3o4l2ZhBZ6f6qUv0w==" + }, + "node_modules/three-instanced-uniforms-mesh": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/three-instanced-uniforms-mesh/-/three-instanced-uniforms-mesh-0.49.1.tgz", + "integrity": "sha512-qPgPLA6JR2nQau2zAODwiVRknYndXNE6aYmTe5zESiwg9hO8AaNq1xC0hWDYOyyH+NbN2G8278NxX1hpZ+2ZgQ==", + "dependencies": { + "troika-three-utils": "^0.49.0" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/three-instanced-uniforms-mesh/node_modules/troika-three-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.49.0.tgz", + "integrity": "sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/threlte": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/threlte/-/threlte-3.13.1.tgz", + "integrity": "sha512-9Yfw3qHfHA8O9p28oBnPFFlnBVYaqoxx78bzC5xAbDmwuUJhdBRhuzPY2ZEdjrOXk+15TIIYaKr84MoGtwgnMw==", + "deprecated": "threlte is now available as @threlte/core and @threlte/extras", + "dependencies": { + "troika-three-text": "^0.46.4" + } + }, + "node_modules/threlte/node_modules/troika-three-text": { + "version": "0.46.4", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.46.4.tgz", + "integrity": "sha512-Qsv0HhUKTZgSmAJs5wvO7YlBoJSP9TGPLmrg+K9pbQq4lseQdcevbno/WI38bwJBZ/qS56hvfqEzY0zUEFzDIw==", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.46.0", + "troika-worker-utils": "^0.46.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.103.0" + } + }, + "node_modules/threlte/node_modules/troika-three-utils": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.46.0.tgz", + "integrity": "sha512-llHyrXAcwzr0bpg80GxsIp73N7FuImm4WCrKDJkAqcAsWmE5pfP9+Qzw+oMWK1P/AdHQ79eOrOl9NjyW4aOw0w==", + "peerDependencies": { + "three": ">=0.103.0" + } + }, + "node_modules/threlte/node_modules/troika-worker-utils": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.46.0.tgz", + "integrity": "sha512-bzOx5f2ZBxkFhXtIvDJlLn2AI3bzCkGVbCndl/2dL5QZrwHEKl45OEIilCxYQQWJG1rEbOD9O80tMjoYjw19OA==" + }, "node_modules/tiny-glob": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", @@ -4596,6 +4967,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -4613,6 +4985,33 @@ "node": ">=6" } }, + "node_modules/troika-three-text": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.0.tgz", + "integrity": "sha512-4rywfbPxayE5ktmdkCMdnq5BZl5LPVgNElQnJZ9/DAW6JYnY2ft9teCqof4qwdzLMZ7QaIS5NziJRs2XRsQpDg==", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.52.0", + "troika-worker-utils": "^0.52.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.0.tgz", + "integrity": "sha512-00oxqIIehtEKInOTQekgyknBuRUj1POfOUE2q1OmL+Xlpp4gIu+S0oA0schTyXsDS4d9DkR04iqCdD40rF5R6w==", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.52.0.tgz", + "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==" + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -4637,6 +5036,14 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, + "node_modules/tweakpane": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/tweakpane/-/tweakpane-3.1.10.tgz", + "integrity": "sha512-rqwnl/pUa7+inhI2E9ayGTqqP0EPOOn/wVvSWjZsRbZUItzNShny7pzwL3hVlaN4m9t/aZhsP0aFQ9U5VVR2VQ==", + "funding": { + "url": "https://github.com/sponsors/cocopon" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -4726,15 +5133,16 @@ "dev": true }, "node_modules/vite": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz", - "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==", + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -4753,6 +5161,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -4770,6 +5179,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -4819,9 +5231,9 @@ } }, "node_modules/vite/node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "dev": true, "funding": [ { @@ -4837,11 +5249,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "peer": true, "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -4862,6 +5275,11 @@ } } }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5003,6 +5421,11 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yoga-layout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-2.0.1.tgz", + "integrity": "sha512-tT/oChyDXelLo2A+UVnlW9GU7CsvFMaEnd9kVFsaiCQonFAXd3xrHhkLYu+suwwosrAEQ746xBU+HvYtm1Zs2Q==" } } } diff --git a/RocketControlUnitGUI/package.json b/RocketControlUnitGUI/package.json index 0c9c660..ca20b8e 100644 --- a/RocketControlUnitGUI/package.json +++ b/RocketControlUnitGUI/package.json @@ -1,19 +1,17 @@ { - "name": "Rocket-Control-Unit", + "name": "rocket-control-unit-gui", "version": "0.1.0", "private": true, "scripts": { "dev": "vite dev", "build": "vite build", "preview": "vite preview", - "test": "playwright test", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "lint": "prettier --check . && eslint .", "format": "prettier --write ." }, "devDependencies": { - "@playwright/test": "^1.28.1", "@skeletonlabs/skeleton": "2.5.1", "@skeletonlabs/tw-plugin": "0.2.4", "@sveltejs/adapter-node": "^4.0.1", @@ -39,7 +37,23 @@ }, "type": "module", "dependencies": { + "@dimforge/rapier3d-compat": "^0.14.0", "@floating-ui/dom": "1.5.3", - "pocketbase": "^0.20.3" + "@theatre/core": "^0.7.2", + "@theatre/studio": "^0.7.2", + "@threlte/core": "^7.3.1", + "@threlte/extras": "^8.12.0", + "@threlte/flex": "^1.0.3", + "@threlte/rapier": "^2.0.1", + "@threlte/theatre": "^2.1.8", + "@threlte/xr": "^0.1.4", + "@types/three": "^0.170.0", + "chart.js": "^4.4.6", + "leaflet": "^1.9.4", + "pocketbase": "^0.20.3", + "three": "^0.169.0", + "threlte": "^3.13.1", + "troika-three-text": "^0.52.0", + "troika-three-utils": "^0.52.0" } } diff --git a/RocketControlUnitGUI/src/DataService.ts b/RocketControlUnitGUI/src/DataService.ts new file mode 100644 index 0000000..107a87c --- /dev/null +++ b/RocketControlUnitGUI/src/DataService.ts @@ -0,0 +1,32 @@ +// src/data/DataService.ts +import PocketBase from 'pocketbase'; + + + +export class DataService { + private pocketBaseInstance = new PocketBase('http://127.0.0.1:8090'); + private isAuthenticated = false; + + + async authenticate(email: string, password: string) { + if (!this.isAuthenticated) { + await this.pocketBaseInstance.admins.authWithPassword(email, password); + this.isAuthenticated = true; + + } + } + + async fetchPaginatedData(collectionName: string, page: number, batchSize: number) { + return await this.pocketBaseInstance.collection(collectionName).getList(page, batchSize); + } + + subscribeToCollection(collectionName: string, callback: (data: any) => void) { + this.pocketBaseInstance.collection(collectionName).subscribe('*', (e) => callback(e.record)); + console.log(`Subscribed to real-time updates for collection: ${collectionName}`); + } + + unsubscribeFromCollection(collectionName: string) { + this.pocketBaseInstance.collection(collectionName).unsubscribe('*'); + console.log(`Unsubscribed from real-time updates for collection: ${collectionName}`); + } +} diff --git a/RocketControlUnitGUI/src/StoreService.ts b/RocketControlUnitGUI/src/StoreService.ts new file mode 100644 index 0000000..50a9971 --- /dev/null +++ b/RocketControlUnitGUI/src/StoreService.ts @@ -0,0 +1,90 @@ +// StoreService.ts +import PocketBase from 'pocketbase'; + +const pb = new PocketBase('http://127.0.0.1:8090'); +let isAuthenticated = false; +pb.autoCancellation(false); + +// Define the RecordData type explicitly for PocketBase records +export type RecordData = { [key: string]: any }; + +// Function to authenticate PocketBase before any data fetch or subscription +async function authenticate() { + if (!isAuthenticated) { + const email = import.meta.env.VITE_EMAIL; + const password = import.meta.env.VITE_PASSWORD; + + try { + await pb.admins.authWithPassword(email, password); + isAuthenticated = true; + console.log('Authenticated successfully'); + } catch (error) { + console.error('Authentication failed:', error); + throw new Error('Authentication failed'); + } + } +} + +/** + * Fetch paginated data from the specified collection in PocketBase. + * @param collectionName The name of the collection to fetch data from. + * @param batchSize The number of records to fetch per page. + * @param onPageFetched Callback function to process fetched records. + */ +export async function getCollectionData( + collectionName: string, + batchSize: number, + onPageFetched: (data: RecordData[]) => void +): Promise { + await authenticate(); + + try { + const response = await pb.collection(collectionName).getList(1, batchSize, { + sort: '-created', // Fetch the most recent records first + }); + + if (response.items.length > 0) { + onPageFetched(response.items); // Send data to the callback + } else { + console.warn(`No data found for collection: ${collectionName}`); + } + } catch (error) { + console.error(`Error fetching data for collection ${collectionName}:`, error); + } +} + +/** + * Subscribe to a collection in PocketBase for real-time updates. + * @param collectionName The name of the collection to subscribe to. + * @param callback Callback function to process new real-time updates. + */ +export async function subscribeToCollection(collectionName: string, callback: (data: RecordData) => void) { + await authenticate(); + + try { + pb.collection(collectionName).subscribe('*', (e) => { + if (e.record) { + callback(e.record); + } else { + console.warn(`Received empty record in collection ${collectionName} real-time update.`); + } + }); + console.log(`Subscribed to real-time updates for collection: ${collectionName}`); + } catch (error) { + console.error(`Error subscribing to collection ${collectionName}:`, error); + } +} + +/** + * Unsubscribe from a collection in PocketBase to stop real-time updates. + * @param collectionName The name of the collection to unsubscribe from. + */ +export function unsubscribeFromCollection(collectionName: string) { + try { + pb.collection(collectionName).unsubscribe('*'); + console.log(`Unsubscribed from real-time updates for collection: ${collectionName}`); + } catch (error) { + console.error(`Error unsubscribing from collection ${collectionName}:`, error); + } +} + \ No newline at end of file diff --git a/RocketControlUnitGUI/src/app.html b/RocketControlUnitGUI/src/app.html index 0297ac7..ac90ea0 100644 --- a/RocketControlUnitGUI/src/app.html +++ b/RocketControlUnitGUI/src/app.html @@ -1,4 +1,4 @@ - + diff --git a/RocketControlUnitGUI/src/data.ts b/RocketControlUnitGUI/src/data.ts new file mode 100644 index 0000000..f4c4845 --- /dev/null +++ b/RocketControlUnitGUI/src/data.ts @@ -0,0 +1,107 @@ + // data.ts + import PocketBase from 'pocketbase'; + + + const ADMIN_EMAIL: string = import.meta.env.VITE_EMAIL; + const ADMIN_PASSWORD: string = import.meta.env.VITE_PASSWORD; + + + const pb = new PocketBase('http://127.0.0.1:8090'); + pb.autoCancellation(false); + + let isAuthenticated = false; + + + + // Function to authenticate the admin user + export async function authenticate() { + if (!isAuthenticated) { + await pb.admins.authWithPassword(ADMIN_EMAIL, ADMIN_PASSWORD); + isAuthenticated = true; + } + } + + type RecordData = { [key: string]: any }; + export type AllData = { [collectionName: string]: RecordData[] }; + + // Fetch paginated data with existing logic + export async function fetchPaginatedData( + collectionName: string, + sendToChart: (data: RecordData[]) => void, + batchSize: number = 10 + ) { + console.log(`Fetching data from collection: ${collectionName}`); + let page = 1; + let hasMoreData = true; + + try { + await authenticate(); // Authenticate once before fetching data + + while (hasMoreData) { + console.log('Fetching data from collection:', collectionName, 'Page:', page); + const records = await pb.collection(collectionName).getList(page, batchSize); + console.log('Fetched records:', records.items); + + if (records.items.length === 0) { + console.warn(`No records found for ${collectionName} on page ${page}.`); + break; + } + + const dynamicKeys = Object.keys(records.items[0]).filter(key => key !== 'id' && key !== 'created'); + + const transformedBatch: RecordData[] = records.items.map((record: RecordData) => { + const transformedRecord: RecordData = {}; + dynamicKeys.forEach(key => { + transformedRecord[key] = record[key]; + }); + return transformedRecord; + }); + + console.log('Transformed batch:', transformedBatch); + sendToChart(transformedBatch); + + if (records.items.length < batchSize) { + hasMoreData = false; + } else { + page += 1; + } + } + console.log('All data fetched for collection:', collectionName); + } catch (error) { + console.error('Error fetching paginated data for collection:', collectionName, error); + } + } + + // Real-time subscription to a collection + export async function subscribeToCollection( + collectionName: string, + handleDataUpdate: (data: RecordData) => void + ) { + try { + await authenticate(); // Ensure we're authenticated before subscribing + + // Subscribe to the collection for any changes + pb.collection(collectionName).subscribe('*', function (e) { + console.log(`Received real-time update for collection ${collectionName}:`, e.record); + handleDataUpdate(e.record); + }); + + console.log(`Subscribed to real-time updates for collection: ${collectionName}`); + } catch (error) { + console.error(`Error subscribing to collection ${collectionName}:`, error); + } + } + + // Function to unsubscribe from a collection (optional) + export async function unsubscribeFromCollection(collectionName: string) { + try { + await authenticate(); // Ensure we're authenticated before unsubscribing + + // Unsubscribe from the collection + pb.collection(collectionName).unsubscribe('*'); + + console.log(`Unsubscribed from real-time updates for collection: ${collectionName}`); + } catch (error) { + console.error(`Error unsubscribing from collection ${collectionName}:`, error); + } + } diff --git a/RocketControlUnitGUI/src/lib/components/Diagram.svelte b/RocketControlUnitGUI/src/lib/components/Diagram.svelte new file mode 100644 index 0000000..2a5b7e5 --- /dev/null +++ b/RocketControlUnitGUI/src/lib/components/Diagram.svelte @@ -0,0 +1,2576 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RocketControlUnitGUI/src/lib/components/PausablePromptModal.svelte b/RocketControlUnitGUI/src/lib/components/PausablePromptModal.svelte new file mode 100644 index 0000000..32c76e3 --- /dev/null +++ b/RocketControlUnitGUI/src/lib/components/PausablePromptModal.svelte @@ -0,0 +1,39 @@ + + + + + \ No newline at end of file diff --git a/RocketControlUnitGUI/src/lib/components/ReadOnlySvg.svelte b/RocketControlUnitGUI/src/lib/components/ReadOnlySvg.svelte new file mode 100644 index 0000000..cc0e8fd --- /dev/null +++ b/RocketControlUnitGUI/src/lib/components/ReadOnlySvg.svelte @@ -0,0 +1,5 @@ + + + + ic_fluent_read_only_24_regular Created with Sketch. + \ No newline at end of file diff --git a/RocketControlUnitGUI/src/lib/hooks/useInteraction.ts b/RocketControlUnitGUI/src/lib/hooks/useInteraction.ts new file mode 100644 index 0000000..3e9614a --- /dev/null +++ b/RocketControlUnitGUI/src/lib/hooks/useInteraction.ts @@ -0,0 +1,169 @@ +import { getModalStore, type ModalComponent, type ModalSettings } from '@skeletonlabs/skeleton'; +import type { PocketbaseHook } from './usePocketbase'; +import PausablePromptModal, { type PausablePromptResponse } from '$lib/components/PausablePromptModal.svelte'; + +const stateToCommand: { [key: string]: string } = { + RS_ABORT: 'RSC_ANY_TO_ABORT', + RS_PRELAUNCH: 'RSC_GOTO_PRELAUNCH', + RS_FILL: 'RSC_GOTO_FILL', + RS_ARM: 'RSC_GOTO_ARM', + RS_IGNITION: 'RSC_GOTO_IGNITION', + RS_LAUNCH: 'RSC_IGNITION_TO_LAUNCH', + RS_BURN: 'RSC_GOTO_BURN', + RS_COAST: 'RSC_GOTO_COAST', + RS_DESCENT: 'RSC_GOTO_DESCENT', + RS_RECOVERY: 'RSC_GOTO_RECOVERY', + RS_TEST: 'RSC_GOTO_TEST' +}; + +const commandToState = Object.fromEntries( + Object.entries(stateToCommand).map(([key, value]) => [value, key]) +); + +Object.freeze(stateToCommand); +Object.freeze(commandToState); + +interface LoadCellPromptStates { + [loadcell: string]: { + numberOfWeights: number, + onResume?: (loadcell: string) => void + } +} + +export const useInteraction = (pocketbaseHook: PocketbaseHook) => { + const modalStore = getModalStore(); + + let nextStatePending: string = ''; + + const confirmStateChange = (state: string) => { + nextStatePending = state; + + const modal: ModalSettings = { + type: 'confirm', + title: 'Please Confirm', + body: `Are you sure you wish to proceed to ${commandToState[state]}?`, + response: (r: boolean) => { + if (r) { + pocketbaseHook.writeStateChange(nextStatePending); + } + + nextStatePending = ''; + } + }; + + modalStore.trigger(modal); + }; + + const instantStateChange = (state: string) => { + nextStatePending = state; + pocketbaseHook.writeStateChange(nextStatePending); + nextStatePending = ''; + }; + + let promptStates: LoadCellPromptStates = {} + + const confirmRemoveWeight = (loadcell: string) => { + const modal: ModalSettings = { + type: 'confirm', + title: 'Remove All Weight', + response: (r: boolean) => { + if (r) { + pocketbaseHook.writeLoadCellCommand(loadcell, 'CALIBRATE', 0); + promptEnterNumberOfWeights(loadcell); + } else { + pocketbaseHook.writeLoadCellCommand(loadcell, 'CANCEL', 0); + } + } + }; + + modalStore.trigger(modal); + }; + + const promptEnterNumberOfWeights = (loadcell: string) => { + const modal: ModalSettings = { + type: 'prompt', + title: 'Enter number of weights', + valueAttr: { type: 'number', required: true }, + response: async (r: any) => { + if (r) { + // The modal was confirmed, set the number of weights + promptStates[loadcell] = { + numberOfWeights: parseInt(r) + }; + + if (promptStates[loadcell].numberOfWeights > 0) { + promptEnterWeight(loadcell); + } + } + else { + delete promptStates[loadcell]; + } + } + }; + + modalStore.trigger(modal); + }; + + const promptEnterWeight = (loadcell: string) => { + const modalComponent: ModalComponent = { + ref: PausablePromptModal, + props: { + heading: `Enter Weight (kg) (${promptStates[loadcell].numberOfWeights} remaining)`, + } + }; + + let shouldReRun = false; + + const modal: ModalSettings = { + type: 'component', + component: modalComponent, + response: (res: PausablePromptResponse) => { + switch (res[0]) { + case 'submit': + // If this is the last weight, send the finish command + if (promptStates[loadcell].numberOfWeights === 1) { + pocketbaseHook.writeLoadCellCommand(loadcell, 'FINISH', parseFloat(res[1])); + + delete promptStates[loadcell]; + return; + } else { + // The modal was confirmed, send the calibrate command + pocketbaseHook.writeLoadCellCommand(loadcell, 'CALIBRATE', parseFloat(res[1])); + } + + // Decrease the number of weights and open the modal again if there are more weights to enter + promptStates[loadcell].numberOfWeights--; + if (promptStates[loadcell].numberOfWeights > 0) { + promptEnterWeight(loadcell); + } + + break; + case 'pause': + promptStates[loadcell].onResume = promptEnterWeight; + break; + default: // 'cancel' | undefined + pocketbaseHook.writeLoadCellCommand(loadcell, 'CANCEL', 0); + delete promptStates[loadcell]; + break; + } + } + }; + + modalStore.trigger(modal); + }; + + const resumeConfirmRemoveWeight = (loadcell: string) => { + if (!promptStates[loadcell] || !promptStates[loadcell].onResume) { + confirmRemoveWeight(loadcell); + return; + } + + promptStates[loadcell].onResume!(loadcell); + } + + return { + confirmStateChange, + instantStateChange, + resumeConfirmRemoveWeight, + }; +}; diff --git a/RocketControlUnitGUI/src/lib/hooks/usePocketbase.ts b/RocketControlUnitGUI/src/lib/hooks/usePocketbase.ts new file mode 100644 index 0000000..f4e3453 --- /dev/null +++ b/RocketControlUnitGUI/src/lib/hooks/usePocketbase.ts @@ -0,0 +1,200 @@ +import PocketBase from 'pocketbase'; +import type { Timestamps } from '../timestamps'; +import type { Stores } from '../stores'; +import { currentState } from '../stores'; + +export type PocketbaseHook = ReturnType; + +export const usePocketbase = (timestamps: Timestamps, stores: Stores) => { + const pocketbase = new PocketBase('http://192.168.0.69:8090'); + + const authenticate = async () => { + const email = import.meta.env.VITE_EMAIL; + const password = import.meta.env.VITE_PASSWORD; + + if (email && password) { + pocketbase.authStore.clear(); + await pocketbase.admins.authWithPassword(email, password); + + return true; + } + + return false; + }; + + const sendHeartbeat = async () => { + await pocketbase.collection('Heartbeat').create({ + message: 'heartbeat' + }); + }; + + const writeStateChange = async (state: string) => { + await pocketbase.collection('CommandMessage').create({ + target: 'NODE_DMB', + command: state + }); + }; + + const writeCommandMessage = async (target: string, command: string) => { + await pocketbase.collection('CommandMessage').create({ + target, + command + }); + }; + + const writeLoadCellCommand = async (target: string, command: string, weight_kg: number) => { + await pocketbase.collection('LoadCellCommands').create({ + target: target, + command: command, + weight: weight_kg + }); + }; + + const subscribeToCollections = () => { + // Subscribe to changes in the 'RelayStatus' collection + pocketbase.collection('RelayStatus').subscribe('*', (e) => { + stores.ac1_open.set(e.record.ac1_open); + + stores.pbv1_open.set(e.record.pbv1_open); + stores.pbv2_open.set(e.record.pbv2_open); + stores.pbv3_open.set(e.record.pbv3_open); + stores.pbv4_open.set(e.record.pbv4_open); + + stores.sol5_open.set(e.record.sol5_open); + stores.sol6_open.set(e.record.sol6_open); + stores.sol7_open.set(e.record.sol7_open); + stores.sol8a_open.set(e.record.sol8a_open); + stores.sol8b_open.set(e.record.sol8b_open); + + timestamps.relay_status = Date.now(); + }); + + // Subscribe to changes in the 'CombustionControlStatus' collection + pocketbase.collection('CombustionControlStatus').subscribe('*', (e) => { + stores.vent_open.set(e.record.vent_open); + stores.drain_open.set(e.record.drain_open); + stores.mev_open.set(e.record.mev_open); + + timestamps.combustion_control_status = Date.now(); + }); + + // Subscribe to changes in the 'RcuTemperature' collection + pocketbase.collection('RcuTemperature').subscribe('*', (e) => { + stores.rcu_tc1_temperature.set( + e.record.tc1_temperature === 9999 ? 'DC' : Math.round(e.record.tc1_temperature / 100) + ); + stores.rcu_tc2_temperature.set( + e.record.tc2_temperature === 9999 ? 'DC' : Math.round(e.record.tc2_temperature / 100) + ); + + timestamps.rcu_temp = Date.now(); + }); + + // Subscribe to changes in the 'PadBoxStatus' collection + pocketbase.collection('PadBoxStatus').subscribe('*', (e) => { + stores.continuity1.set(e.record.continuity_1); + stores.continuity2.set(e.record.continuity_2); + stores.box1_on.set(e.record.box1_on); + stores.box2_on.set(e.record.box2_on); + + timestamps.pad_box_status = Date.now(); + }); + + // Subscribe to changes in the 'Battery' collection + pocketbase.collection('Battery').subscribe('*', (e) => { + stores.battery_voltage.set(e.record.voltage); + stores.power_source.set(e.record.power_source); + + timestamps.battery = Date.now(); + }); + + // Subscribe to changes in the 'DmbPressure' collection + pocketbase.collection('DmbPressure').subscribe('*', (e) => { + stores.upper_pv_pressure.set( + e.record.upper_pv_pressure < -100000 ? 'DC' : Math.round(e.record.upper_pv_pressure / 1000) + ); + timestamps.dmb_pressure = Date.now(); + }); + + // Subscribe to changes in the 'LaunchRailLoadCell' collection + pocketbase.collection('LaunchRailLoadCell').subscribe('*', (e) => { + stores.rocket_mass.set(e.record.rocket_mass); + timestamps.launch_rail_load_cell = Date.now(); + }); + + // Subscribe to changes in the 'NosLoadCell' collection + pocketbase.collection('NosLoadCell').subscribe('*', (e) => { + stores.nos1_mass.set(e.record.nos1_mass); + stores.nos2_mass.set(e.record.nos2_mass); + + timestamps.nos_load_cell = Date.now(); + }); + + // Subscribe to changes in the 'PbbPressure' collection + pocketbase.collection('PbbPressure').subscribe('*', (e) => { + stores.ib_pressure.set( + e.record.ib_pressure < -100000 ? 'DC' : Math.round(e.record.ib_pressure / 1000) + ); + stores.lower_pv_pressure.set( + e.record.lower_pv_pressure < -100000 ? 'DC' : Math.round(e.record.lower_pv_pressure / 1000) + ); + + timestamps.pbb_pressure = Date.now(); + }); + + // Subscribe to changes in the 'PbbTemperature' collection + pocketbase.collection('PbbTemperature').subscribe('*', (e) => { + stores.pv_temperature.set( + e.record.ib_temperature === 9999 ? 'DC' : Math.round(e.record.ib_temperature / 100) + ); + timestamps.pbb_temperature = Date.now(); + }); + + // Subscribe to changes in the 'RcuPressure' collection + pocketbase.collection('RcuPressure').subscribe('*', (e) => { + stores.pt1_pressure.set(e.record.pt1_pressure < -100 ? 'DC' : e.record.pt1_pressure); + stores.pt2_pressure.set(e.record.pt2_pressure < -100 ? 'DC' : e.record.pt2_pressure); + stores.pt3_pressure.set(e.record.pt3_pressure < -100 ? 'DC' : e.record.pt3_pressure); + stores.pt4_pressure.set(e.record.pt4_pressure < -100 ? 'DC' : e.record.pt4_pressure); + + timestamps.rcu_pressure = Date.now(); + }); + + // Subscribe to changes in the 'SobTemperature' collection + pocketbase.collection('SobTemperature').subscribe('*', (e) => { + stores.sob_tc1_temperature.set( + e.record.tc1_temperature === 9999 ? 'DC' : Math.round(e.record.tc1_temperature / 100) + ); + stores.sob_tc2_temperature.set( + e.record.tc2_temperature === 9999 ? 'DC' : Math.round(e.record.tc2_temperature / 100) + ); + + timestamps.sob_temperature = Date.now(); + }); + + // Subscribe to changes in the 'sys_state' collection + pocketbase.collection('sys_state').subscribe('*', (e) => { + stores.system_state.set(e.record.sys_state); + currentState.set(e.record.rocket_state); + timestamps.sys_state = Date.now(); + }); + + // Subscribe to changes in the 'HeartbeatTelemetry' collection + pocketbase.collection('hb_state').subscribe('*', (e) => { + stores.timer_state.set(e.record.timer_state); + stores.timer_period.set(e.record.timer_period); + stores.timer_remaining.set(e.record.timer_remaining); + + timestamps.heartbeat = Date.now(); + }); + }; + + return { + authenticate, + sendHeartbeat, + writeStateChange, + writeArbitraryCommand: writeCommandMessage, + writeLoadCellCommand, + subscribeToCollections + }; +}; diff --git a/RocketControlUnitGUI/src/lib/stores.ts b/RocketControlUnitGUI/src/lib/stores.ts new file mode 100644 index 0000000..8afde5f --- /dev/null +++ b/RocketControlUnitGUI/src/lib/stores.ts @@ -0,0 +1,88 @@ +import { writable, type Writable } from 'svelte/store'; + +export const currentState = writable('N/A'); +export const auth = writable(false); + +export interface Stores { + ac1_open: Writable; + pbv1_open: Writable; + pbv2_open: Writable; + pbv3_open: Writable; + pbv4_open: Writable; + sol5_open: Writable; + sol6_open: Writable; + sol7_open: Writable; + sol8a_open: Writable; + sol8b_open: Writable; + continuity1: Writable; + continuity2: Writable; + box1_on: Writable; + box2_on: Writable; + vent_open: Writable; + drain_open: Writable; + mev_open: Writable; + rcu_tc1_temperature: Writable; + rcu_tc2_temperature: Writable; + battery_voltage: Writable; + power_source: Writable; + upper_pv_pressure: Writable; + rocket_mass: Writable; + nos1_mass: Writable; + nos2_mass: Writable; + ib_pressure: Writable; + lower_pv_pressure: Writable; + pv_temperature: Writable; + pt1_pressure: Writable; + pt2_pressure: Writable; + pt3_pressure: Writable; + pt4_pressure: Writable; + sob_tc1_temperature: Writable; + sob_tc2_temperature: Writable; + system_state: Writable; + timer_state: Writable; + timer_period: Writable; + timer_remaining: Writable; +} + +export const initStores = () => { + return { + ac1_open: writable(undefined), + pbv1_open: writable(undefined), + pbv2_open: writable(undefined), + pbv3_open: writable(undefined), + pbv4_open: writable(undefined), + sol5_open: writable(undefined), + sol6_open: writable(undefined), + sol7_open: writable(undefined), + sol8a_open: writable(undefined), + sol8b_open: writable(undefined), + continuity1: writable(undefined), + continuity2: writable(undefined), + box1_on: writable(undefined), + box2_on: writable(undefined), + vent_open: writable(undefined), + drain_open: writable(undefined), + mev_open: writable(undefined), + rcu_tc1_temperature: writable(undefined), + rcu_tc2_temperature: writable(undefined), + battery_voltage: writable(undefined), + power_source: writable(undefined), + upper_pv_pressure: writable(undefined), + rocket_mass: writable(undefined), + nos1_mass: writable(undefined), + nos2_mass: writable(undefined), + ib_pressure: writable(undefined), + lower_pv_pressure: writable(undefined), + pv_temperature: writable(undefined), + pt1_pressure: writable(undefined), + pt2_pressure: writable(undefined), + pt3_pressure: writable(undefined), + pt4_pressure: writable(undefined), + sob_tc1_temperature: writable(undefined), + sob_tc2_temperature: writable(undefined), + system_state: writable(undefined), + timer_state: writable(undefined), + timer_period: writable(undefined), + timer_remaining: writable(undefined) + }; +}; diff --git a/RocketControlUnitGUI/src/lib/theme.ts b/RocketControlUnitGUI/src/lib/theme.ts new file mode 100644 index 0000000..e7e5911 --- /dev/null +++ b/RocketControlUnitGUI/src/lib/theme.ts @@ -0,0 +1,37 @@ +import { browser } from "$app/environment"; + +export enum ThemeType { + LIGHT = 'light', + DARK = 'dark', +} + +export class ThemeData { + private logo: string = ''; + + get logoSrc() { + return this.logo; + } + + constructor(initialTheme: ThemeType) { + this.setTheme(initialTheme); + } + + private setTheme = (theme: ThemeType) => { + if (!browser) { + return; + } + + this.logo = `/logo/soar-logo-${theme}.svg`; + + let rootStyle = document.documentElement.style; + + rootStyle.setProperty('--icon-filter', `var(--icon-filter-${theme})`); + + rootStyle.setProperty('--diagram-outline-color', `var(--diagram-outline-color-${theme})`); + rootStyle.setProperty('--diagram-nos-color', `var(--diagram-nos-color-${theme})`); + rootStyle.setProperty('--diagram-fill-color', `var(--diagram-fill-color-${theme})`); + rootStyle.setProperty('--diagram-insul-color', `var(--diagram-insul-color-${theme})`); + rootStyle.setProperty('--diagram-pv-color', `var(--diagram-pv-color-${theme})`); + rootStyle.setProperty('--diagram-ignitor-color', `var(--diagram-ignitor-color-${theme})`); + } +} \ No newline at end of file diff --git a/RocketControlUnitGUI/src/lib/timestamps.ts b/RocketControlUnitGUI/src/lib/timestamps.ts new file mode 100644 index 0000000..470101b --- /dev/null +++ b/RocketControlUnitGUI/src/lib/timestamps.ts @@ -0,0 +1,37 @@ +export interface Timestamps { + relay_status: number; + combustion_control_status: number; + rcu_temp: number; + pad_box_status: number; + battery: number; + dmb_pressure: number; + launch_rail_load_cell: number; + nos_load_cell: number; + pbb_pressure: number; + pbb_temperature: number; + rcu_pressure: number; + sob_temperature: number; + sys_state: number; + heartbeat: number; +} + +export const initTimestamps = () => { + const now = Date.now(); + + return { + relay_status: now, + combustion_control_status: now, + rcu_temp: now, + pad_box_status: now, + battery: now, + dmb_pressure: now, + launch_rail_load_cell: now, + nos_load_cell: now, + pbb_pressure: now, + pbb_temperature: now, + rcu_pressure: now, + sob_temperature: now, + sys_state: now, + heartbeat: now + }; +}; diff --git a/RocketControlUnitGUI/src/routes/+layout.svelte b/RocketControlUnitGUI/src/routes/+layout.svelte index 5b1a2f0..afeb5ac 100644 --- a/RocketControlUnitGUI/src/routes/+layout.svelte +++ b/RocketControlUnitGUI/src/routes/+layout.svelte @@ -1,5 +1,10 @@ @@ -39,7 +34,7 @@
SOAR Logo {#if $auth === false} - Read Only + {/if} @@ -68,31 +58,35 @@ - Icon + + Icon + - Icon + + Icon + - Icon + + Icon + - Icon + + Icon + - - + Some Slot \ No newline at end of file diff --git a/RocketControlUnitGUI/src/routes/+page.svelte b/RocketControlUnitGUI/src/routes/+page.svelte index 7b89663..31176b1 100644 --- a/RocketControlUnitGUI/src/routes/+page.svelte +++ b/RocketControlUnitGUI/src/routes/+page.svelte @@ -1,129 +1,96 @@
- +
handleSliderChange(e, 'NODE_RCU', 'RCU_OPEN_AC1', 'RCU_CLOSE_AC1')} > - {ac1_display} + {ac1_display} +
@@ -657,8 +277,8 @@ bind:checked={$pbv1_open} on:click={(e) => handleSliderChange(e, 'NODE_RCU', 'RCU_OPEN_PBV1', 'RCU_CLOSE_PBV1')} > - {pbv1_display} + {pbv1_display} +
@@ -669,8 +289,8 @@ bind:checked={$pbv2_open} on:click={(e) => handleSliderChange(e, 'NODE_RCU', 'RCU_OPEN_PBV2', 'RCU_CLOSE_PBV2')} > - {pbv2_display} + {pbv2_display} +
@@ -681,8 +301,8 @@ bind:checked={$pbv3_open} on:click={(e) => handleSliderChange(e, 'NODE_RCU', 'RCU_OPEN_PBV3', 'RCU_CLOSE_PBV3')} > - {pbv3_display} + {pbv3_display} +
@@ -693,8 +313,8 @@ bind:checked={$pbv4_open} on:click={(e) => handleSliderChange(e, 'NODE_RCU', 'RCU_OPEN_PBV4', 'RCU_CLOSE_PBV4')} > - {pbv4_display} + {pbv4_display} +
@@ -705,8 +325,8 @@ bind:checked={$sol5_open} on:click={(e) => handleSliderChange(e, 'NODE_RCU', 'RCU_OPEN_SOL5', 'RCU_CLOSE_SOL5')} > - {sol5_display} + {sol5_display} +
@@ -717,8 +337,8 @@ bind:checked={$sol6_open} on:click={(e) => handleSliderChange(e, 'NODE_RCU', 'RCU_OPEN_SOL6', 'RCU_CLOSE_SOL6')} > - {sol6_display} + {sol6_display} +
@@ -729,8 +349,8 @@ bind:checked={$sol7_open} on:click={(e) => handleSliderChange(e, 'NODE_RCU', 'RCU_OPEN_SOL7', 'RCU_CLOSE_SOL7')} > - {sol7_display} + {sol7_display} +
@@ -741,8 +361,8 @@ bind:checked={$sol8a_open} on:click={(e) => handleSliderChange(e, 'NODE_RCU', 'RCU_OPEN_SOL8A', 'RCU_CLOSE_SOL8A')} > - {sol8a_display} + {sol8a_display} +
@@ -753,8 +373,8 @@ bind:checked={$sol8b_open} on:click={(e) => handleSliderChange(e, 'NODE_RCU', 'RCU_OPEN_SOL8B', 'RCU_CLOSE_SOL8B')} > - {sol8b_display} + {sol8b_display} +
@@ -765,8 +385,8 @@ bind:checked={$vent_open} on:click={(e) => handleSliderChange(e, 'NODE_DMB', 'RSC_OPEN_VENT', 'RSC_CLOSE_VENT')} > - {vent_display} + {vent_display} +
@@ -777,8 +397,8 @@ bind:checked={$drain_open} on:click={(e) => handleSliderChange(e, 'NODE_DMB', 'RSC_OPEN_DRAIN', 'RSC_CLOSE_DRAIN')} > - {drain_display} + {drain_display} +
@@ -795,8 +415,8 @@ 'RSC_POWER_TRANSITION_EXTERNAL' )} > - {power_display} + {power_display} +
{#if $currentState === "RS_IGNITION" || $currentState === "RS_TEST" || $currentState === "RS_ABORT" || $currentState === "RS_LAUNCH" || $currentState === "RS_BURN" || $currentState === "RS_COAST" || $currentState === "RS_RECOVERY"} @@ -809,8 +429,8 @@ on:click={handleIgnition} disabled={$currentState === "RS_IGNITION" || $currentState === "RS_ABORT" || $currentState === "RS_LAUNCH" || $currentState === "RS_BURN" || $currentState === "RS_COAST" || $currentState === "RS_RECOVERY"} > - {box1_display} + {box1_display} +
@@ -822,8 +442,8 @@ on:click={handleIgnition} disabled={$currentState === "RS_IGNITION" || $currentState === "RS_ABORT" || $currentState === "RS_LAUNCH" || $currentState === "RS_BURN" || $currentState === "RS_COAST" || $currentState === "RS_RECOVERY"} > - {box2_display} + {box2_display} +
{/if} @@ -842,8 +462,8 @@ type="button" class="btn btn-sm variant-filled-error" on:click={() => { - writeLoadCellCommandMessage("NOS1", "CANCEL", 0); - confirmRemoveWeight("NOS1");}} + writeLoadCellCommand("NOS1", "CANCEL", 0); + resumeConfirmRemoveWeight("NOS1");}} > CAL @@ -864,8 +484,8 @@ type="button" class="btn btn-sm variant-filled-error" on:click={() => { - writeLoadCellCommandMessage("NOS2", "CANCEL", 0); - confirmRemoveWeight("NOS2");}} + writeLoadCellCommand("NOS2", "CANCEL", 0); + resumeConfirmRemoveWeight("NOS2");}} > CAL @@ -886,8 +506,8 @@ type="button" class="btn btn-sm variant-filled-error" on:click={() => { - writeLoadCellCommandMessage("LAUNCHRAIL", "CANCEL", 0); - confirmRemoveWeight("LAUNCHRAIL");}} + writeLoadCellCommand("LAUNCHRAIL", "CANCEL", 0); + resumeConfirmRemoveWeight("LAUNCHRAIL");}} > CAL @@ -988,99 +608,135 @@ confirmStateChange("RSC_GOTO_FILL")} > + Go to Fill + instantStateChange("RSC_ANY_TO_ABORT")} > + Go to Abort + {:else if $currentState == "RS_FILL"} confirmStateChange("RSC_GOTO_PRELAUNCH")} > + Go to Pre-Launch + instantStateChange("RSC_ARM_CONFIRM_1")} > + ARM CONFIRM 1 + instantStateChange("RSC_ARM_CONFIRM_2")} > + ARM CONFIRM 2 + confirmStateChange("RSC_GOTO_ARM")} > + Go to Arm + instantStateChange("RSC_ANY_TO_ABORT")} > + Go to Abort + {:else if $currentState == "RS_ARM"} confirmStateChange("RSC_GOTO_FILL")} > + Go to Fill + confirmStateChange("RSC_GOTO_IGNITION")} > + Go to Ignition + instantStateChange("RSC_ANY_TO_ABORT")} > + Go to Abort + {:else if $currentState == "RS_IGNITION"} handleLaunchSequence()} > + LAUNCH + confirmStateChange("RSC_GOTO_ARM")} > + Go to Arm + {:else if $currentState == "RS_ABORT"} confirmStateChange("RSC_GOTO_PRELAUNCH")} > + Go to Pre-Launch + confirmStateChange("RSC_GOTO_TEST")} > + Go to Test + {:else if $currentState == "RS_RECOVERY"} instantStateChange("RSC_ANY_TO_ABORT")} > + Go to Abort + {:else if $currentState == "RS_TEST"} instantStateChange("RSC_ANY_TO_ABORT")} > + Go to Abort + instantStateChange("RSC_TEST_MEV_OPEN")} > + Open MEV + instantStateChange("RSC_MEV_CLOSE")} > + Close MEV + {/if}
@@ -1096,378 +752,4 @@ max-width: 100%; } } - - .next-state-btn { - position: absolute; - left: 8%; - width: 200px; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1600)); - } - - .arm_button { - position: absolute; - left: 21%; - width: 200px; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1600)); - } - - .ac1_slider { - position: absolute; - top: calc(var(--container-width) * 0.025); - left: 8.6%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - .pbv1_slider { - position: absolute; - top: calc(var(--container-width) * 0.118); - left: 35.5%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .pbv2_slider { - position: absolute; - top: calc(var(--container-width) * 0.188); - left: 35.5%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .pbv3_slider { - position: absolute; - top: calc(var(--container-width) * 0.275); - left: 35.5%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .pbv4_slider { - position: absolute; - top: calc(var(--container-width) * 0.144); - left: 47.5%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .sol5_slider { - position: absolute; - top: calc(var(--container-width) * 0.269); - left: 63.3%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .sol6_slider { - position: absolute; - top: calc(var(--container-width) * 0.313); - left: 63.3%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .sol7_slider { - position: absolute; - top: calc(var(--container-width) * 0.356); - left: 63.3%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .sol8a_slider { - position: absolute; - top: calc(var(--container-width) * 0.396); - left: 63.3%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .sol8b_slider { - position: absolute; - top: calc(var(--container-width) * 0.44); - left: 63.3%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .vent_slider { - position: absolute; - top: calc(var(--container-width) * 0.152); - left: 85.3%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .drain_slider { - position: absolute; - top: calc(var(--container-width) * 0.265); - left: 85.3%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .power_source_slider { - position: absolute; - top: calc(var(--container-width) * 0.025); - left: 95.5%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .box1_slider { - position: absolute; - top: calc(var(--container-width) * 0.415); - left: 12.5%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .box2_slider { - position: absolute; - top: calc(var(--container-width) * 0.433); - left: 12.5%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - font-size: 16px; - } - - .nos1_tare_button { - position: absolute; - top: calc(var(--container-width) * 0.176); - left: 11.1%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - } - - .nos1_cal_button { - position: absolute; - top: calc(var(--container-width) * 0.195); - left: 11.0%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - } - - .nos2_tare_button { - color: #04AA6D; - position: absolute; - top: calc(var(--container-width) * 0.246); - left: 11.1%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - } - - .nos2_cal_button { - color: #04AA6D; - position: absolute; - top: calc(var(--container-width) * 0.265); - left: 11.0%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - } - - .rail_tare_button { - position: absolute; - top: calc(var(--container-width) * 0.078); - left: 69.1%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - } - - .rail_cal_button { - position: absolute; - top: calc(var(--container-width) * 0.097); - left: 69.1%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); - } - - .rcu_tc1 { - position: absolute; - top: calc(var(--container-width) * 0.065); - left: 5.6%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .rcu_tc2 { - position: absolute; - top: calc(var(--container-width) * 0.065); - left: 9.2%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .nos1 { - position: absolute; - top: calc(var(--container-width) * 0.187); - left: 7.6%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .nos2 { - position: absolute; - top: calc(var(--container-width) * 0.255); - left: 7.6%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .pt1_pressure { - position: absolute; - top: calc(var(--container-width) * 0.117); - left: 14.7%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .pt2_pressure { - position: absolute; - top: calc(var(--container-width) * 0.1882); - left: 14.7%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .pt3_pressure { - position: absolute; - top: calc(var(--container-width) * 0.2743); - left: 14.9%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .pt4_pressure { - position: absolute; - top: calc(var(--container-width) * 0.188); - left: 42%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .box1_continuity { - position: absolute; - top: calc(var(--container-width) * 0.372); - left: 14.7%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - width: 1em; - height: 1em; - background-color: green; - border-radius: 10%; - } - - .box2_continuity { - position: absolute; - top: calc(var(--container-width) * 0.386); - left: 14.7%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - width: 1em; - height: 1em; - background-color: green; - border-radius: 10%; - } - - .mev_status { - position: absolute; - top: calc(var(--container-width) * 0.069); - left: 93.9%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .battery_voltage { - position: absolute; - top: calc(var(--container-width) * 0.049); - left: 93.9%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .upper_pv_pressure { - position: absolute; - top: calc(var(--container-width) * 0.104); - left: 92.9%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .rocket_mass { - position: absolute; - top: calc(var(--container-width) * 0.09); - left: 74.3%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .ib_pressure { - position: absolute; - top: calc(var(--container-width) * 0.391); - left: 93.1%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .lower_pv_pressure { - position: absolute; - top: calc(var(--container-width) * 0.345); - left: 90.3%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .pv_temperature { - position: absolute; - top: calc(var(--container-width) * 0.345); - left: 95.5%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .sob_tc1 { - position: absolute; - top: calc(var(--container-width) * 0.1405); - left: 69%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .sob_tc2 { - position: absolute; - top: calc(var(--container-width) * 0.179); - left: 69%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 14px; - } - - .system_state { - position: absolute; - top: calc(var(--container-width) * 0.373); - left: 42%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 12px; - } - - .timer_state { - position: absolute; - top: calc(var(--container-width) * 0.386); - left: 42%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 12px; - } - - .timer_period { - position: absolute; - top: calc(var(--container-width) * 0.399); - left: 44%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 12px; - } - - .timer_remaining { - position: absolute; - top: calc(var(--container-width) * 0.413); - left: 45%; - transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); - font-size: 12px; - } - - .outdated { - color: #d4163c - - } \ No newline at end of file diff --git a/RocketControlUnitGUI/src/routes/data/+page.svelte b/RocketControlUnitGUI/src/routes/data/+page.svelte index cb522b9..c942eeb 100644 --- a/RocketControlUnitGUI/src/routes/data/+page.svelte +++ b/RocketControlUnitGUI/src/routes/data/+page.svelte @@ -1,11 +1,38 @@ - + +
+
+ +
+ +
+ + + +
- - - - - -
-

DATA

-
\ No newline at end of file + + + +
+ + + \ No newline at end of file diff --git a/RocketControlUnitGUI/src/routes/data/LineChart.svelte b/RocketControlUnitGUI/src/routes/data/LineChart.svelte new file mode 100644 index 0000000..a377afa --- /dev/null +++ b/RocketControlUnitGUI/src/routes/data/LineChart.svelte @@ -0,0 +1,150 @@ + + +
+ +
+ + diff --git a/RocketControlUnitGUI/src/routes/data/MapChart.svelte b/RocketControlUnitGUI/src/routes/data/MapChart.svelte new file mode 100644 index 0000000..f0c3606 --- /dev/null +++ b/RocketControlUnitGUI/src/routes/data/MapChart.svelte @@ -0,0 +1,171 @@ + + + + + + +
+
+
diff --git a/RocketControlUnitGUI/src/routes/data/RocketChart.svelte b/RocketControlUnitGUI/src/routes/data/RocketChart.svelte new file mode 100644 index 0000000..c529225 --- /dev/null +++ b/RocketControlUnitGUI/src/routes/data/RocketChart.svelte @@ -0,0 +1,113 @@ + + + +
+ + ref.lookAt(0, 0, 0)} + /> + + + + + + +
+ + diff --git a/RocketControlUnitGUI/src/routes/data/Temp.svelte b/RocketControlUnitGUI/src/routes/data/Temp.svelte new file mode 100644 index 0000000..30e7bc5 --- /dev/null +++ b/RocketControlUnitGUI/src/routes/data/Temp.svelte @@ -0,0 +1,158 @@ + + + +
+

{collection} graph

+ +
+ + diff --git a/RocketControlUnitGUI/src/styles/app.postcss b/RocketControlUnitGUI/src/styles/app.postcss new file mode 100644 index 0000000..cf8e175 --- /dev/null +++ b/RocketControlUnitGUI/src/styles/app.postcss @@ -0,0 +1,50 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; +@tailwind variants; + +:root { + --loading-color: rgba(0, 0, 0, 0); + + --icon-filter-light: invert(0%); + --icon-filter-dark: invert(100%); + + --icon-filter: var(--icon-filter-light); + + --diagram-outline-color-dark: #dfe0e2; + --diagram-outline-color-light: #15171f; + + --diagram-nos-color-dark: #ffb5a1; + --diagram-nos-color-light: #cf462d; + + --diagram-fill-color-dark: #92bcf7; + --diagram-fill-color-light: #2277f0; + + --diagram-insul-color-dark: #c4a0ff; + --diagram-insul-color-light: #6a2dff; + + --diagram-pv-color-dark: #4bb1bf; + --diagram-pv-color-light: #0a7a8a; + + --diagram-ignitor-color-dark: #008000; + --diagram-ignitor-color-light: #004000; + + --diagram-outline-color: var(--loading-color); + --diagram-nos-color: var(--loading-color); + --diagram-fill-color: var(--loading-color); + --diagram-insul-color: var(--loading-color); + --diagram-pv-color: var(--loading-color); + --diagram-ignitor-color: var(--loading-color); +} + +html, +body { + @apply h-full overflow-hidden; +} + +/* modern theme */ +@font-face { + font-family: 'Quicksand'; + src: url('/fonts/Quicksand.ttf'); + font-display: swap; +} diff --git a/RocketControlUnitGUI/src/styles/display.postcss b/RocketControlUnitGUI/src/styles/display.postcss new file mode 100644 index 0000000..4cb12dc --- /dev/null +++ b/RocketControlUnitGUI/src/styles/display.postcss @@ -0,0 +1,372 @@ +.next-state-btn { + position: absolute; + left: 8%; + width: 200px; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1600)); +} + +.arm_button { + position: absolute; + left: 21%; + width: 200px; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1600)); +} + +.ac1_slider { + position: absolute; + top: calc(var(--container-width) * 0.025); + left: 8.6%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} +.pbv1_slider { + position: absolute; + top: calc(var(--container-width) * 0.118); + left: 35.5%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.pbv2_slider { + position: absolute; + top: calc(var(--container-width) * 0.188); + left: 35.5%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.pbv3_slider { + position: absolute; + top: calc(var(--container-width) * 0.275); + left: 35.5%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.pbv4_slider { + position: absolute; + top: calc(var(--container-width) * 0.144); + left: 47.5%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.sol5_slider { + position: absolute; + top: calc(var(--container-width) * 0.269); + left: 63.3%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.sol6_slider { + position: absolute; + top: calc(var(--container-width) * 0.313); + left: 63.3%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.sol7_slider { + position: absolute; + top: calc(var(--container-width) * 0.356); + left: 63.3%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.sol8a_slider { + position: absolute; + top: calc(var(--container-width) * 0.396); + left: 63.3%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.sol8b_slider { + position: absolute; + top: calc(var(--container-width) * 0.44); + left: 63.3%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.vent_slider { + position: absolute; + top: calc(var(--container-width) * 0.152); + left: 85.3%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.drain_slider { + position: absolute; + top: calc(var(--container-width) * 0.265); + left: 85.3%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.power_source_slider { + position: absolute; + top: calc(var(--container-width) * 0.025); + left: 95.5%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.box1_slider { + position: absolute; + top: calc(var(--container-width) * 0.415); + left: 12.5%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.box2_slider { + position: absolute; + top: calc(var(--container-width) * 0.433); + left: 12.5%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); + font-size: 16px; +} + +.nos1_tare_button { + position: absolute; + top: calc(var(--container-width) * 0.176); + left: 11.1%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); +} + +.nos1_cal_button { + position: absolute; + top: calc(var(--container-width) * 0.195); + left: 11%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); +} + +.nos2_tare_button { + color: #04aa6d; + position: absolute; + top: calc(var(--container-width) * 0.246); + left: 11.1%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); +} + +.nos2_cal_button { + color: #04aa6d; + position: absolute; + top: calc(var(--container-width) * 0.265); + left: 11%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); +} + +.rail_tare_button { + position: absolute; + top: calc(var(--container-width) * 0.078); + left: 69.1%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); +} + +.rail_cal_button { + position: absolute; + top: calc(var(--container-width) * 0.097); + left: 69.1%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1900)); +} + +.rcu_tc1 { + position: absolute; + top: calc(var(--container-width) * 0.065); + left: 5.6%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.rcu_tc2 { + position: absolute; + top: calc(var(--container-width) * 0.065); + left: 9.2%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.nos1 { + position: absolute; + top: calc(var(--container-width) * 0.187); + left: 7.6%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.nos2 { + position: absolute; + top: calc(var(--container-width) * 0.255); + left: 7.6%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.pt1_pressure { + position: absolute; + top: calc(var(--container-width) * 0.117); + left: 14.7%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.pt2_pressure { + position: absolute; + top: calc(var(--container-width) * 0.1882); + left: 14.7%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.pt3_pressure { + position: absolute; + top: calc(var(--container-width) * 0.2743); + left: 14.9%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.pt4_pressure { + position: absolute; + top: calc(var(--container-width) * 0.188); + left: 42%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.box1_continuity { + position: absolute; + top: calc(var(--container-width) * 0.372); + left: 14.7%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; + width: 1em; + height: 1em; + background-color: green; + border-radius: 10%; +} + +.box2_continuity { + position: absolute; + top: calc(var(--container-width) * 0.386); + left: 14.7%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; + width: 1em; + height: 1em; + background-color: green; + border-radius: 10%; +} + +.mev_status { + position: absolute; + top: calc(var(--container-width) * 0.069); + left: 93.9%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.battery_voltage { + position: absolute; + top: calc(var(--container-width) * 0.049); + left: 93.9%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.upper_pv_pressure { + position: absolute; + top: calc(var(--container-width) * 0.104); + left: 92.9%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.rocket_mass { + position: absolute; + top: calc(var(--container-width) * 0.09); + left: 74.3%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.ib_pressure { + position: absolute; + top: calc(var(--container-width) * 0.391); + left: 93.1%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.lower_pv_pressure { + position: absolute; + top: calc(var(--container-width) * 0.345); + left: 90.3%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.pv_temperature { + position: absolute; + top: calc(var(--container-width) * 0.345); + left: 95.5%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.sob_tc1 { + position: absolute; + top: calc(var(--container-width) * 0.1405); + left: 69%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.sob_tc2 { + position: absolute; + top: calc(var(--container-width) * 0.179); + left: 69%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 14px; +} + +.system_state { + position: absolute; + top: calc(var(--container-width) * 0.373); + left: 42%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 12px; +} + +.timer_state { + position: absolute; + top: calc(var(--container-width) * 0.386); + left: 42%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 12px; +} + +.timer_period { + position: absolute; + top: calc(var(--container-width) * 0.399); + left: 44%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 12px; +} + +.timer_remaining { + position: absolute; + top: calc(var(--container-width) * 0.413); + left: 45%; + transform: translate(-50%, -50%) scale(calc(var(--container-width-unitless) / 1500)); + font-size: 12px; +} + +.outdated { + color: #d4163c; +} diff --git a/RocketControlUnitGUI/static/Pegasus_XL.glb b/RocketControlUnitGUI/static/Pegasus_XL.glb new file mode 100644 index 0000000..245905e Binary files /dev/null and b/RocketControlUnitGUI/static/Pegasus_XL.glb differ diff --git a/RocketControlUnitGUI/static/icons/camera.png b/RocketControlUnitGUI/static/icons/camera.png new file mode 100644 index 0000000..e3ecf25 Binary files /dev/null and b/RocketControlUnitGUI/static/icons/camera.png differ diff --git a/RocketControlUnitGUI/static/icons/info.png b/RocketControlUnitGUI/static/icons/info.png new file mode 100644 index 0000000..bbaff80 Binary files /dev/null and b/RocketControlUnitGUI/static/icons/info.png differ diff --git a/RocketControlUnitGUI/static/icons/rocket.png b/RocketControlUnitGUI/static/icons/rocket.png new file mode 100644 index 0000000..55afb86 Binary files /dev/null and b/RocketControlUnitGUI/static/icons/rocket.png differ diff --git a/RocketControlUnitGUI/static/icons/stats.png b/RocketControlUnitGUI/static/icons/stats.png new file mode 100644 index 0000000..6ac63d9 Binary files /dev/null and b/RocketControlUnitGUI/static/icons/stats.png differ diff --git a/RocketControlUnitGUI/static/logo/soar-logo-dark.svg b/RocketControlUnitGUI/static/logo/soar-logo-dark.svg new file mode 100644 index 0000000..6bb21b8 --- /dev/null +++ b/RocketControlUnitGUI/static/logo/soar-logo-dark.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RocketControlUnitGUI/static/logo/soar-logo-light.svg b/RocketControlUnitGUI/static/logo/soar-logo-light.svg new file mode 100644 index 0000000..54336f4 --- /dev/null +++ b/RocketControlUnitGUI/static/logo/soar-logo-light.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RocketControlUnitGUI/static/model/Pegasus_XL.glb b/RocketControlUnitGUI/static/model/Pegasus_XL.glb new file mode 100644 index 0000000..245905e Binary files /dev/null and b/RocketControlUnitGUI/static/model/Pegasus_XL.glb differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9cbdf58 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,34 @@ +{ + "name": "RocketControlUnit", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "chart.js": "^4.4.4", + "leaflet": "^1.9.4" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, + "node_modules/chart.js": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.4.tgz", + "integrity": "sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c7b95c7 --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "chart.js": "^4.4.4", + "leaflet": "^1.9.4" + } +}