From 0bb789ea6b71e8900bd968d897d0466403438396 Mon Sep 17 00:00:00 2001 From: Rob Colbert Date: Fri, 1 May 2026 22:28:22 -0400 Subject: [PATCH] welcome to The Grid --- gadget-code/docs/ui-design-guide.md | 7 +- .../frontend/src/components/GadgetGrid.tsx | 443 +++++++++++++++ gadget-code/frontend/src/pages/Home.tsx | 230 ++++---- gadget-code/package.json | 3 + pnpm-lock.yaml | 532 ++++++++++++++++++ 5 files changed, 1115 insertions(+), 100 deletions(-) create mode 100644 gadget-code/frontend/src/components/GadgetGrid.tsx diff --git a/gadget-code/docs/ui-design-guide.md b/gadget-code/docs/ui-design-guide.md index 1a07b89..b37041e 100644 --- a/gadget-code/docs/ui-design-guide.md +++ b/gadget-code/docs/ui-design-guide.md @@ -92,17 +92,16 @@ Between the header and status bars is the Content Area. It uses React Router for ## Unauthenticated Home View -The logged-out home view displays a retro-styled "GADGET CODE" wordmark in ANSI Art style: +The logged-out home view displays a "System Ready" prompt dialog. -- VGA color palette: #0000AA, #00AA00, #00AAAA, #AA0000, #AA00AA, #AAAA00, #AAAAAA, #555555 - Font: Courier New (monospace) - Background: #0a0a0a (pure black) - Boxed with 2px border using border-default color -- [Sign In] button styled as `[ Sign In ]` bracket format +- Sign In button Users do not "sign up" for Gadget Code - accounts are administered via CLI (`pnpm cli`). -Implementation: `frontend/src/pages/Home.tsx` - AnsiLogo component +Implementation: `frontend/src/pages/Home.tsx` - SystemReady component ## Authenticated Home View (Dashboard) diff --git a/gadget-code/frontend/src/components/GadgetGrid.tsx b/gadget-code/frontend/src/components/GadgetGrid.tsx new file mode 100644 index 0000000..ab455e1 --- /dev/null +++ b/gadget-code/frontend/src/components/GadgetGrid.tsx @@ -0,0 +1,443 @@ +import { useRef, useMemo, useEffect } from 'react'; +import { Canvas, useFrame, useThree } from '@react-three/fiber'; +import * as THREE from 'three'; + +const BOARD_SIZE = 200; +const GRID_DIVISIONS = 16; +const JUNCTION_SPACING = BOARD_SIZE / GRID_DIVISIONS; +const HALF_BOARD = BOARD_SIZE / 2; +const ORB_COUNT = 20; +const PULSE_COUNT = 10; + +interface Junction { + x: number; + z: number; + connections: number[]; +} + +interface Trace { + start: number; + end: number; +} + +interface ParticleData { + pos: THREE.Vector3; + target: THREE.Vector3; + junctionIndex: number; + targetJunctionIndex: number; + progress: number; + speed: number; + type: 'orb' | 'pulse'; +} + +function seededRandom(seed: number): () => number { + let s = seed; + return () => { + s = (s * 9301 + 49297) % 233280; + return s / 233280; + }; +} + +function createGlowTexture(color: string): THREE.CanvasTexture { + const canvas = document.createElement('canvas'); + canvas.width = 64; + canvas.height = 64; + const ctx = canvas.getContext('2d')!; + + const gradient = ctx.createRadialGradient(32, 32, 0, 32, 32, 32); + gradient.addColorStop(0, color); + gradient.addColorStop(0.3, color.replace(')', ', 0.8)').replace('rgb', 'rgba')); + gradient.addColorStop(0.6, color.replace(')', ', 0.3)').replace('rgb', 'rgba')); + gradient.addColorStop(1, 'rgba(0,0,0,0)'); + + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, 64, 64); + + return new THREE.CanvasTexture(canvas); +} + +function generateBoardData() { + const rand = seededRandom(42); + const junctions: Junction[] = []; + const indexMap: Map = new Map(); + + for (let gx = 0; gx <= GRID_DIVISIONS; gx++) { + for (let gz = 0; gz <= GRID_DIVISIONS; gz++) { + const x = -HALF_BOARD + gx * JUNCTION_SPACING; + const z = -HALF_BOARD + gz * JUNCTION_SPACING; + const idx = junctions.length; + junctions.push({ x, z, connections: [] }); + indexMap.set(`${gx},${gz}`, idx); + } + } + + for (let gx = 0; gx <= GRID_DIVISIONS; gx++) { + for (let gz = 0; gz <= GRID_DIVISIONS; gz++) { + const idx = indexMap.get(`${gx},${gz}`); + if (idx === undefined) continue; + + if (gx < GRID_DIVISIONS) { + const rightIdx = indexMap.get(`${gx + 1},${gz}`); + if (rightIdx !== undefined) { + junctions[idx].connections.push(rightIdx); + junctions[rightIdx].connections.push(idx); + } + } + + if (gz < GRID_DIVISIONS) { + const downIdx = indexMap.get(`${gx},${gz + 1}`); + if (downIdx !== undefined) { + junctions[idx].connections.push(downIdx); + junctions[downIdx].connections.push(idx); + } + } + + if (gx < GRID_DIVISIONS && gz < GRID_DIVISIONS && rand() > 0.85) { + const diagIdx = indexMap.get(`${gx + 1},${gz + 1}`); + if (diagIdx !== undefined) { + junctions[idx].connections.push(diagIdx); + junctions[diagIdx].connections.push(idx); + } + } + } + } + + const traceSet = new Set(); + const traces: Trace[] = []; + for (const j of junctions) { + const jIdx = junctions.indexOf(j); + for (const c of j.connections) { + const key = j.x < junctions[c].x || (j.x === junctions[c].x && j.z <= junctions[c].z) + ? `${jIdx},${c}` + : `${c},${jIdx}`; + if (!traceSet.has(key)) { + traceSet.add(key); + traces.push({ start: jIdx, end: c }); + } + } + } + + const chips: Array<{ x: number; z: number; width: number; depth: number }> = []; + const usedIndices = new Set(); + for (let i = 0; i < 22; i++) { + let attempts = 0; + while (attempts < 50) { + const idx = Math.floor(rand() * junctions.length); + if (!usedIndices.has(idx) && junctions[idx].connections.length >= 2) { + usedIndices.add(idx); + chips.push({ + x: junctions[idx].x, + z: junctions[idx].z, + width: 5 + rand() * 7, + depth: 5 + rand() * 7, + }); + break; + } + attempts++; + } + } + + const capacitors: Array<{ x: number; z: number; radius: number; height: number }> = []; + for (let i = 0; i < 45; i++) { + const idx = Math.floor(rand() * junctions.length); + capacitors.push({ + x: junctions[idx].x + (rand() - 0.5) * 3, + z: junctions[idx].z + (rand() - 0.5) * 3, + radius: 0.35 + rand() * 0.45, + height: 1.2 + rand() * 2.2, + }); + } + + const ics: Array<{ x: number; z: number; width: number; depth: number }> = []; + const icCandidates = junctions.filter(j => j.connections.length > 2); + for (let i = 0; i < Math.min(16, icCandidates.length); i++) { + const j = icCandidates[i]; + ics.push({ + x: j.x, + z: j.z, + width: 10 + rand() * 6, + depth: 6 + rand() * 4, + }); + } + + return { junctions, traces, chips, capacitors, ics }; +} + +function TraceLines({ traces, junctions }: { traces: Trace[]; junctions: Junction[] }) { + const geometry = useMemo(() => { + const positions: number[] = []; + for (const t of traces) { + const start = junctions[t.start]; + const end = junctions[t.end]; + positions.push(start.x, 0.1, start.z); + positions.push(end.x, 0.1, end.z); + } + const geo = new THREE.BufferGeometry(); + geo.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3)); + return geo; + }, [traces, junctions]); + + return ( + + + + ); +} + +function Chips({ chips }: { chips: Array<{ x: number; z: number; width: number; depth: number }> }) { + return ( + + {chips.map((chip, i) => ( + + + + + + + + + + {[-1, 1].map((side) => + Array.from({ length: Math.floor(chip.width / 1.2) }).map((_, pi) => ( + + + + + )) + )} + {[-1, 1].map((side) => + Array.from({ length: Math.floor(chip.depth / 1.2) }).map((_, pi) => ( + + + + + )) + )} + + ))} + + ); +} + +function Capacitors({ capacitors }: { capacitors: Array<{ x: number; z: number; radius: number; height: number }> }) { + return ( + + {capacitors.map((cap, i) => ( + + + + + ))} + + ); +} + +function ICs({ ics }: { ics: Array<{ x: number; z: number; width: number; depth: number }> }) { + return ( + + {ics.map((ic, i) => ( + + + + + + + + + + + ))} + + ); +} + +function ParticleSystem({ junctions }: { junctions: Junction[] }) { + const orbRefs = useRef<(THREE.Mesh | null)[]>([]); + const pulseRefs = useRef<(THREE.Mesh | null)[]>([]); + const particles = useRef([]); + const initialized = useRef(false); + const glowTexture = useMemo(() => createGlowTexture('rgb(0, 255, 68)'), []); + const pulseGlowTexture = useMemo(() => createGlowTexture('rgb(0, 255, 255)'), []); + + useEffect(() => { + if (initialized.current) return; + initialized.current = true; + + const rand = seededRandom(Date.now()); + const initial: ParticleData[] = []; + + for (let i = 0; i < ORB_COUNT; i++) { + const idx = Math.floor(rand() * junctions.length); + const conn = junctions[idx].connections; + const target = conn.length > 0 ? conn[Math.floor(rand() * conn.length)] : idx; + initial.push({ + pos: new THREE.Vector3(junctions[idx].x, 0.4, junctions[idx].z), + target: new THREE.Vector3(junctions[target].x, 0.4, junctions[target].z), + junctionIndex: idx, + targetJunctionIndex: target, + progress: rand(), + speed: 0.002 + rand() * 0.003, + type: 'orb', + }); + } + + for (let i = 0; i < PULSE_COUNT; i++) { + const idx = Math.floor(rand() * junctions.length); + const conn = junctions[idx].connections; + const target = conn.length > 0 ? conn[Math.floor(rand() * conn.length)] : idx; + initial.push({ + pos: new THREE.Vector3(junctions[idx].x, 0.4, junctions[idx].z), + target: new THREE.Vector3(junctions[target].x, 0.4, junctions[target].z), + junctionIndex: idx, + targetJunctionIndex: target, + progress: rand(), + speed: 0.01 + rand() * 0.015, + type: 'pulse', + }); + } + + particles.current = initial; + }, [junctions]); + + useFrame(() => { + const p = particles.current; + if (!p.length) return; + + for (let i = 0; i < p.length; i++) { + const particle = p[i]; + particle.progress += particle.speed; + + if (particle.progress >= 1) { + const conn = junctions[particle.junctionIndex].connections; + if (conn.length > 0) { + particle.junctionIndex = particle.targetJunctionIndex; + const nextConn = junctions[particle.targetJunctionIndex].connections.filter(c => c !== particle.junctionIndex); + particle.targetJunctionIndex = nextConn.length > 0 + ? nextConn[Math.floor(Math.random() * nextConn.length)] + : conn[Math.floor(Math.random() * conn.length)]; + particle.progress = 0; + particle.target.set( + junctions[particle.targetJunctionIndex].x, + 0.4, + junctions[particle.targetJunctionIndex].z + ); + } else { + particle.progress = 0; + } + } + + const startJ = junctions[particle.junctionIndex]; + particle.pos.x = startJ.x + (particle.target.x - startJ.x) * particle.progress; + particle.pos.z = startJ.z + (particle.target.z - startJ.z) * particle.progress; + particle.pos.y = 0.4 + Math.sin(particle.progress * Math.PI) * 0.6; + + if (particle.type === 'orb') { + const mesh = orbRefs.current[i]; + if (mesh) { + mesh.position.copy(particle.pos); + } + } else { + const mesh = pulseRefs.current[i - ORB_COUNT]; + if (mesh) { + mesh.position.copy(particle.pos); + const scale = 1 - Math.abs(particle.progress - 0.5) * 2; + mesh.scale.setScalar(0.4 + scale * 0.6); + (mesh.material as THREE.MeshStandardMaterial).emissiveIntensity = 2 + scale * 4; + } + } + } + }); + + return ( + + {Array.from({ length: ORB_COUNT }).map((_, i) => ( + { orbRefs.current[i] = el; }} + > + + + + ))} + {Array.from({ length: PULSE_COUNT }).map((_, i) => ( + { pulseRefs.current[i] = el; }} + rotation={[-Math.PI / 2, 0, 0]} + > + + + + ))} + + ); +} + +function CameraDrift() { + const { camera } = useThree(); + const timeRef = useRef(0); + + useFrame((_, delta) => { + timeRef.current += delta; + const t = timeRef.current; + + camera.position.x = Math.sin(t * 0.05) * 3; + camera.position.y = 80 + Math.sin(t * 0.07) * 2.5; + camera.position.z = Math.cos(t * 0.04) * 5; + + camera.lookAt(0, 0, 0); + }); + + return null; +} + +function Scene() { + const boardData = useMemo(() => generateBoardData(), []); + + return ( + <> + + + + + + + + + + + + + + + + + + ); +} + +export default function GadgetGrid() { + return ( +
+ + + +
+ ); +} \ No newline at end of file diff --git a/gadget-code/frontend/src/pages/Home.tsx b/gadget-code/frontend/src/pages/Home.tsx index d73240a..088cf56 100644 --- a/gadget-code/frontend/src/pages/Home.tsx +++ b/gadget-code/frontend/src/pages/Home.tsx @@ -1,39 +1,17 @@ -import { useState, useEffect } from 'react'; -import { Link, useNavigate } from 'react-router-dom'; -import type { User, Project, DroneRegistration } from '../lib/api'; -import { projectApi, droneApi } from '../lib/api'; -import Clock from '../components/Clock'; +import { useState, useEffect } from "react"; +import { Link, useNavigate } from "react-router-dom"; +import type { User, Project, DroneRegistration } from "../lib/api"; +import { projectApi, droneApi } from "../lib/api"; +import Clock from "../components/Clock"; +import GadgetGrid from "../components/GadgetGrid"; -const ansiColors = [ - '#0000AA', '#00AA00', '#00AAAA', '#AA0000', - '#AA00AA', '#AAAA00', '#AAAAAA', '#555555', -]; - -function AnsiLogo() { - const word = 'GADGET CODE'; +function SystemReady() { return (
-
- {word.split('').map((char, i) => ( - - {char} - - ))} -
-
- Agentic Engineering IDE v1.0.0 -
-
// SYSTEM READY
-
Please sign in to continue.
+
// SYSTEM READY
+
Please sign in to continue.
Accounts are administered. Contact your administrator for access.
@@ -55,7 +33,13 @@ interface DashboardSidebarProps { onSelectDrone: (drone: DroneRegistration | null) => void; } -function DroneInspector({ drone, onClose }: { drone: DroneRegistration; onClose: () => void }) { +function DroneInspector({ + drone, + onClose, +}: { + drone: DroneRegistration; + onClose: () => void; +}) { return (
@@ -75,21 +59,25 @@ function DroneInspector({ drone, onClose }: { drone: DroneRegistration; onClose:
Workspace
-
{drone.workspaceDir}
+
+ {drone.workspaceDir} +
Status
- {drone.status} + + {drone.status} +
@@ -104,7 +92,11 @@ function DroneInspector({ drone, onClose }: { drone: DroneRegistration; onClose: ); } -function DashboardSidebar({ onNavigate, selectedDrone, onSelectDrone }: DashboardSidebarProps) { +function DashboardSidebar({ + onNavigate, + selectedDrone, + onSelectDrone, +}: DashboardSidebarProps) { const navigate = useNavigate(); const [projects, setProjects] = useState([]); const [drones, setDrones] = useState([]); @@ -123,7 +115,7 @@ function DashboardSidebar({ onNavigate, selectedDrone, onSelectDrone }: Dashboar setProjects(projectsData); setDrones(dronesData); } catch (err) { - console.error('Failed to load dashboard data', err); + console.error("Failed to load dashboard data", err); } finally { setLoading(false); } @@ -170,9 +162,24 @@ function DashboardSidebar({ onNavigate, selectedDrone, onSelectDrone }: Dashboar className="text-text-secondary hover:text-text-primary transition-colors" title="Drone Manager" > - - - + + +
@@ -183,40 +190,42 @@ function DashboardSidebar({ onNavigate, selectedDrone, onSelectDrone }: Dashboar ) : (
{drones.map((drone) => ( - - ))} +
+ + ))}
)}
@@ -239,21 +248,42 @@ interface HomeProps { export default function Home({ user }: HomeProps) { const navigate = useNavigate(); - const [selectedDrone, setSelectedDrone] = useState(null); + const [selectedDrone, setSelectedDrone] = useState( + null, + ); if (!user) { return ( -
- +
+
+ +
+
+ +
); } - return ( -
- {selectedDrone ? ( - setSelectedDrone(null)} /> - ) : ( + const mainContent = selectedDrone ? ( +
+ setSelectedDrone(null)} + /> + { + if (view === "project" && typeof navigate === "function") { + navigate("/projects"); + } + }} + selectedDrone={selectedDrone} + onSelectDrone={setSelectedDrone} + /> +
+ ) : ( +
+

@@ -275,17 +305,25 @@ export default function Home({ user }: HomeProps) {

- )} - - { - if (view === 'project' && typeof navigate === 'function') { - navigate('/projects'); - } - }} - selectedDrone={selectedDrone} - onSelectDrone={setSelectedDrone} - /> + { + if (view === "project" && typeof navigate === "function") { + navigate("/projects"); + } + }} + selectedDrone={selectedDrone} + onSelectDrone={setSelectedDrone} + /> +
); -} \ No newline at end of file + + return ( +
+
+ +
+ {mainContent} +
+ ); +} diff --git a/gadget-code/package.json b/gadget-code/package.json index 811c3a5..89e1a95 100644 --- a/gadget-code/package.json +++ b/gadget-code/package.json @@ -29,6 +29,8 @@ "@gadget/ai": "workspace:*", "@gadget/api": "workspace:*", "@gadget/config": "workspace:*", + "@react-three/drei": "^10.7.7", + "@react-three/fiber": "^9.6.1", "ansicolor": "^2.0.3", "bull": "^4.16.5", "chart.js": "^4.5.0", @@ -63,6 +65,7 @@ "slug": "^11.0.1", "socket.io": "^4.8.3", "socket.io-client": "^4.8.3", + "three": "^0.184.0", "uikit": "^3.23.11", "undici": "^8.1.0", "uuid": "^11.1.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index acedf6b..2c87b15 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,6 +22,12 @@ importers: '@gadget/config': specifier: workspace:* version: link:../packages/config + '@react-three/drei': + specifier: ^10.7.7 + version: 10.7.7(@react-three/fiber@9.6.1(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(three@0.184.0))(@types/react@19.2.14)(@types/three@0.184.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(three@0.184.0) + '@react-three/fiber': + specifier: ^9.6.1 + version: 9.6.1(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(three@0.184.0) ansicolor: specifier: ^2.0.3 version: 2.0.3 @@ -124,6 +130,9 @@ importers: socket.io-client: specifier: ^4.8.3 version: 4.8.3 + three: + specifier: ^0.184.0 + version: 0.184.0 uikit: specifier: ^3.23.11 version: 3.25.16 @@ -441,6 +450,9 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} + '@dimforge/rapier3d-compat@0.12.0': + resolution: {integrity: sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==} + '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -931,9 +943,17 @@ packages: '@kurkle/color@0.3.4': resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} + '@mediapipe/tasks-vision@0.10.17': + resolution: {integrity: sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==} + '@mongodb-js/saslprep@1.4.9': resolution: {integrity: sha512-RXSxsokhAF/4nWys8An8npsqOI33Ex1Hlzqjw2pZOO+GKtMAR2noGnUdsFiGwsaO/xXI+56mtjTmDA3JXJsvmA==} + '@monogrid/gainmap-js@3.4.0': + resolution: {integrity: sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==} + peerDependencies: + three: '>= 0.159.0' + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} cpu: [arm64] @@ -993,6 +1013,42 @@ packages: engines: {node: '>=18'} hasBin: true + '@react-three/drei@10.7.7': + resolution: {integrity: sha512-ff+J5iloR0k4tC++QtD/j9u3w5fzfgFAWDtAGQah9pF2B1YgOq/5JxqY0/aVoQG5r3xSZz0cv5tk2YuBob4xEQ==} + peerDependencies: + '@react-three/fiber': ^9.0.0 + react: ^19 + react-dom: ^19 + three: '>=0.159' + peerDependenciesMeta: + react-dom: + optional: true + + '@react-three/fiber@9.6.1': + resolution: {integrity: sha512-zF0rsKcVYpcJwbFEnv2HkHX9cvOEgsfQo/X8lwmR2dn13S4qEQJXir9fxf5js2LQFoXqxOY7MDkOkYx2uZ4gSg==} + peerDependencies: + expo: '>=43.0' + expo-asset: '>=8.4' + expo-file-system: '>=11.0' + expo-gl: '>=11.0' + react: '>=19 <19.3' + react-dom: '>=19 <19.3' + react-native: '>=0.78' + three: '>=0.156' + peerDependenciesMeta: + expo: + optional: true + expo-asset: + optional: true + expo-file-system: + optional: true + expo-gl: + optional: true + react-dom: + optional: true + react-native: + optional: true + '@rolldown/binding-android-arm64@1.0.0-rc.17': resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1215,6 +1271,9 @@ packages: '@types/react-dom': optional: true + '@tweenjs/tween.js@23.1.3': + resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -1247,6 +1306,9 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/draco3d@1.4.10': + resolution: {integrity: sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1306,6 +1368,9 @@ packages: '@types/numeral@2.0.5': resolution: {integrity: sha512-kH8I7OSSwQu9DS9JYdFWbuvhVzvFRoCPCkGxNwoGgaPeDfEPJlcxNvEOypZhQ3XXHsGbfIuYcxcJxKUfJHnRfw==} + '@types/offscreencanvas@2019.7.3': + resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + '@types/parse-glob@3.0.32': resolution: {integrity: sha512-n4xmml2WKR12XeQprN8L/sfiVPa8FHS3k+fxp4kSr/PA2GsGUgFND+bvISJxM0y5QdvzNEGjEVU3eIrcKks/pA==} @@ -1315,6 +1380,11 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/react-reconciler@0.28.9': + resolution: {integrity: sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==} + peerDependencies: + '@types/react': '*' + '@types/react@19.2.14': resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} @@ -1330,6 +1400,12 @@ packages: '@types/slug@5.0.9': resolution: {integrity: sha512-6Yp8BSplP35Esa/wOG1wLNKiqXevpQTEF/RcL/NV6BBQaMmZh4YlDwCgrrFSoUE4xAGvnKd5c+lkQJmPrBAzfQ==} + '@types/stats.js@0.17.4': + resolution: {integrity: sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==} + + '@types/three@0.184.0': + resolution: {integrity: sha512-4mY2tZAu0y0B0567w7013BBXSpsP0+Z48NJvmNo4Y/Pf76yCyz6Jw4P3tUVs10WuYNXXZ+wmHyGWpCek3amJxA==} + '@types/uikit@3.23.0': resolution: {integrity: sha512-GTn8/K+f4AjFxtLqRKWzjaVKckQp/rHcl20IO09salh2VjyFb9CqeFugL95skO6qbbJLil3PE1MmNajrSj5gMg==} @@ -1339,12 +1415,23 @@ packages: '@types/webidl-conversions@7.0.3': resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + '@types/webxr@0.5.24': + resolution: {integrity: sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==} + '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@use-gesture/core@10.3.1': + resolution: {integrity: sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==} + + '@use-gesture/react@10.3.1': + resolution: {integrity: sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==} + peerDependencies: + react: '>= 16.8.0' + '@vitejs/plugin-react@6.0.1': resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1470,6 +1557,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64id@2.0.0: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} @@ -1547,6 +1637,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bull@4.16.5: resolution: {integrity: sha512-lDsx2BzkKe7gkCYiT5Acj02DpTwDznl/VNN7Psn7M3USPG7Vs/BaClZJJTAG+ufAR9++N1/NiUTdaFBWDIl5TQ==} engines: {node: '>=12'} @@ -1567,6 +1660,12 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} + camera-controls@3.1.2: + resolution: {integrity: sha512-xkxfpG2ECZ6Ww5/9+kf4mfg1VEYAoe9aDSY+IwF0UEs7qEzwy0aVRfs2grImIECs/PoBtWFrh7RXsQkwG922JA==} + engines: {node: '>=22.0.0', npm: '>=10.5.1'} + peerDependencies: + three: '>=0.126.1' + caniuse-lite@1.0.30001791: resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} @@ -1699,6 +1798,15 @@ packages: resolution: {integrity: sha512-fkdfq+b+AHI4cKdhZlppHveI/mgz2qpiYxcm+t5E5TsxX7QrLS1VE0+7GENEk9z0EeGPcpSciGv6ez24duWhwQ==} engines: {node: '>=18.x'} + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + css-tree@3.2.1: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} @@ -1768,6 +1876,9 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-gpu@5.0.70: + resolution: {integrity: sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -1793,6 +1904,9 @@ packages: dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + draco3d@1.5.7: + resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} + drange@1.1.1: resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==} engines: {node: '>=4'} @@ -1953,6 +2067,12 @@ packages: picomatch: optional: true + fflate@0.6.10: + resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2051,6 +2171,9 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + glsl-noise@0.0.0: + resolution: {integrity: sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -2078,6 +2201,9 @@ packages: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} + hls.js@1.6.16: + resolution: {integrity: sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA==} + html-encoding-sniffer@6.0.0: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -2106,6 +2232,9 @@ packages: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2115,6 +2244,9 @@ packages: engines: {node: '>=0.10.0'} hasBin: true + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + immutable@3.8.3: resolution: {integrity: sha512-AUY/VyX0E5XlibOmWt10uabJzam1zlYjwiEgQSDc5+UIkFNaF9WM0JxXKaNMGf+F/ffUF+7kRKXM9A7C0xXqMg==} engines: {node: '>=0.10.0'} @@ -2197,9 +2329,17 @@ packages: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} engines: {node: '>=4'} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isnumber@1.0.0: resolution: {integrity: sha512-JLiSz/zsZcGFXPrB4I/AGBvtStkt+8QmksyZBZnVXnnK9XdTEyz0tX8CRYljtwYDuIuZzih6DpHQdi+3Q6zHPw==} + its-fine@2.0.0: + resolution: {integrity: sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==} + peerDependencies: + react: ^19.0.0 + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -2255,6 +2395,9 @@ packages: engines: {node: '>=18'} hasBin: true + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -2377,6 +2520,12 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + maath@0.10.8: + resolution: {integrity: sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==} + peerDependencies: + '@types/three': '>=0.134.0' + three: '>=0.134.0' + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -2415,6 +2564,14 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + meshline@3.3.1: + resolution: {integrity: sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==} + peerDependencies: + three: '>=0.137' + + meshoptimizer@1.1.1: + resolution: {integrity: sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g==} + method-override@3.0.0: resolution: {integrity: sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==} engines: {node: '>= 0.10'} @@ -2642,6 +2799,10 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -2698,6 +2859,9 @@ packages: resolution: {integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==} engines: {node: ^10 || ^12 || >=14} + potpack@1.0.2: + resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} + prettier@3.8.3: resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} @@ -2707,6 +2871,9 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + promise-worker-transferable@1.0.4: + resolution: {integrity: sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==} + promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} @@ -2817,6 +2984,15 @@ packages: react-dom: optional: true + react-use-measure@2.1.7: + resolution: {integrity: sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==} + peerDependencies: + react: '>=16.13' + react-dom: '>=16.13' + peerDependenciesMeta: + react-dom: + optional: true + react@19.2.5: resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} engines: {node: '>=0.10.0'} @@ -2958,6 +3134,14 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + shoetest@1.2.2: resolution: {integrity: sha512-iT8kIEFcGfUwo53VUFckm+glTkc0oLycRe+YqU/W4wQuIHGIWc5KMIpDnJVdavKCyEZKQTi8IDq27rDmB09QjA==} @@ -3034,10 +3218,19 @@ packages: standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + stats-gl@2.4.2: + resolution: {integrity: sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==} + peerDependencies: + '@types/three': '*' + three: '*' + stats-lite@2.2.0: resolution: {integrity: sha512-/Kz55rgUIv2KP2MKphwYT/NCuSfAlbbMRv2ZWw7wyXayu230zdtzhxxuXXcvsc6EmmhS8bSJl3uS1wmMHFumbA==} engines: {node: '>=2.0.0'} + stats.js@0.17.0: + resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} + statuses@1.3.1: resolution: {integrity: sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==} engines: {node: '>= 0.6'} @@ -3101,6 +3294,11 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + suspend-react@0.1.3: + resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==} + peerDependencies: + react: '>=17.0' + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -3111,6 +3309,19 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} + three-mesh-bvh@0.8.3: + resolution: {integrity: sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg==} + peerDependencies: + three: '>= 0.159.0' + + three-stdlib@2.36.1: + resolution: {integrity: sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==} + peerDependencies: + three: '>=0.128.0' + + three@0.184.0: + resolution: {integrity: sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg==} + through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} @@ -3159,6 +3370,19 @@ packages: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} + troika-three-text@0.52.4: + resolution: {integrity: sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==} + peerDependencies: + three: '>=0.125.0' + + troika-three-utils@0.52.4: + resolution: {integrity: sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==} + peerDependencies: + three: '>=0.125.0' + + troika-worker-utils@0.52.0: + resolution: {integrity: sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==} + tsc-alias@1.8.16: resolution: {integrity: sha512-QjCyu55NFyRSBAl6+MTFwplpFcnm2Pq01rR/uxfqJoLMm6X3O14KEGtaSDZpJYaE1bJBGDjD0eSuiIWPe2T58g==} engines: {node: '>=16.20.2'} @@ -3172,6 +3396,9 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tunnel-rat@0.1.2: + resolution: {integrity: sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -3232,9 +3459,18 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -3343,6 +3579,12 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + webgl-constants@1.1.1: + resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==} + + webgl-sdf-generator@1.1.1: + resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -3366,6 +3608,11 @@ packages: resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -3428,6 +3675,39 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + zustand@4.5.7: + resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + + zustand@5.0.12: + resolution: {integrity: sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + snapshots: '@adobe/css-tools@4.4.4': {} @@ -3503,6 +3783,8 @@ snapshots: '@csstools/css-tokenizer@4.0.0': {} + '@dimforge/rapier3d-compat@0.12.0': {} + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -3821,10 +4103,17 @@ snapshots: '@kurkle/color@0.3.4': {} + '@mediapipe/tasks-vision@0.10.17': {} + '@mongodb-js/saslprep@1.4.9': dependencies: sparse-bitfield: 3.0.3 + '@monogrid/gainmap-js@3.4.0(three@0.184.0)': + dependencies: + promise-worker-transferable: 1.0.4 + three: 0.184.0 + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': optional: true @@ -3870,6 +4159,59 @@ snapshots: dependencies: playwright: 1.59.1 + '@react-three/drei@10.7.7(@react-three/fiber@9.6.1(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(three@0.184.0))(@types/react@19.2.14)(@types/three@0.184.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(three@0.184.0)': + dependencies: + '@babel/runtime': 7.29.2 + '@mediapipe/tasks-vision': 0.10.17 + '@monogrid/gainmap-js': 3.4.0(three@0.184.0) + '@react-three/fiber': 9.6.1(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(three@0.184.0) + '@use-gesture/react': 10.3.1(react@19.2.5) + camera-controls: 3.1.2(three@0.184.0) + cross-env: 7.0.3 + detect-gpu: 5.0.70 + glsl-noise: 0.0.0 + hls.js: 1.6.16 + maath: 0.10.8(@types/three@0.184.0)(three@0.184.0) + meshline: 3.3.1(three@0.184.0) + react: 19.2.5 + stats-gl: 2.4.2(@types/three@0.184.0)(three@0.184.0) + stats.js: 0.17.0 + suspend-react: 0.1.3(react@19.2.5) + three: 0.184.0 + three-mesh-bvh: 0.8.3(three@0.184.0) + three-stdlib: 2.36.1(three@0.184.0) + troika-three-text: 0.52.4(three@0.184.0) + tunnel-rat: 0.1.2(@types/react@19.2.14)(react@19.2.5) + use-sync-external-store: 1.6.0(react@19.2.5) + utility-types: 3.11.0 + zustand: 5.0.12(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5)) + optionalDependencies: + react-dom: 19.2.5(react@19.2.5) + transitivePeerDependencies: + - '@types/react' + - '@types/three' + - immer + + '@react-three/fiber@9.6.1(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(three@0.184.0)': + dependencies: + '@babel/runtime': 7.29.2 + '@types/webxr': 0.5.24 + base64-js: 1.5.1 + buffer: 6.0.3 + its-fine: 2.0.0(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-use-measure: 2.1.7(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + scheduler: 0.27.0 + suspend-react: 0.1.3(react@19.2.5) + three: 0.184.0 + use-sync-external-store: 1.6.0(react@19.2.5) + zustand: 5.0.12(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5)) + optionalDependencies: + react-dom: 19.2.5(react@19.2.5) + transitivePeerDependencies: + - '@types/react' + - immer + '@rolldown/binding-android-arm64@1.0.0-rc.17': optional: true @@ -4025,6 +4367,8 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + '@tweenjs/tween.js@23.1.3': {} + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -4068,6 +4412,8 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/draco3d@1.4.10': {} + '@types/estree@1.0.8': {} '@types/express-serve-static-core@5.1.1': @@ -4134,12 +4480,18 @@ snapshots: '@types/numeral@2.0.5': {} + '@types/offscreencanvas@2019.7.3': {} + '@types/parse-glob@3.0.32': {} '@types/qs@6.15.0': {} '@types/range-parser@1.2.7': {} + '@types/react-reconciler@0.28.9(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + '@types/react@19.2.14': dependencies: csstype: 3.2.3 @@ -4159,12 +4511,25 @@ snapshots: '@types/slug@5.0.9': {} + '@types/stats.js@0.17.4': {} + + '@types/three@0.184.0': + dependencies: + '@dimforge/rapier3d-compat': 0.12.0 + '@tweenjs/tween.js': 23.1.3 + '@types/stats.js': 0.17.4 + '@types/webxr': 0.5.24 + fflate: 0.8.2 + meshoptimizer: 1.1.1 + '@types/uikit@3.23.0': {} '@types/uuid@10.0.0': {} '@types/webidl-conversions@7.0.3': {} + '@types/webxr@0.5.24': {} + '@types/whatwg-url@11.0.5': dependencies: '@types/webidl-conversions': 7.0.3 @@ -4173,6 +4538,13 @@ snapshots: dependencies: '@types/node': 25.6.0 + '@use-gesture/core@10.3.1': {} + + '@use-gesture/react@10.3.1(react@19.2.5)': + dependencies: + '@use-gesture/core': 10.3.1 + react: 19.2.5 + '@vitejs/plugin-react@6.0.1(vite@8.0.10(@types/node@24.12.2)(esbuild@0.25.12)(jiti@2.6.1)(less@4.6.4)(tsx@4.21.0))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 @@ -4287,6 +4659,8 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: {} + base64id@2.0.0: {} baseline-browser-mapping@2.10.23: {} @@ -4408,6 +4782,11 @@ snapshots: buffer-from@1.1.2: {} + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + bull@4.16.5: dependencies: cron-parser: 4.9.0 @@ -4436,6 +4815,10 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 + camera-controls@3.1.2(three@0.184.0): + dependencies: + three: 0.184.0 + caniuse-lite@1.0.30001791: {} chai@6.2.2: {} @@ -4571,6 +4954,16 @@ snapshots: '@types/luxon': 3.7.1 luxon: 3.7.2 + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + css-tree@3.2.1: dependencies: mdn-data: 2.27.1 @@ -4615,6 +5008,10 @@ snapshots: destroy@1.2.0: {} + detect-gpu@5.0.70: + dependencies: + webgl-constants: 1.1.1 + detect-libc@2.1.2: {} dev-ip@1.0.1: {} @@ -4631,6 +5028,8 @@ snapshots: dom-accessibility-api@0.6.3: {} + draco3d@1.5.7: {} + drange@1.1.1: {} dtp-cleantext@1.0.0: @@ -4886,6 +5285,10 @@ snapshots: optionalDependencies: picomatch: 4.0.4 + fflate@0.6.10: {} + + fflate@0.8.2: {} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -5001,6 +5404,8 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + glsl-noise@0.0.0: {} + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -5019,6 +5424,8 @@ snapshots: dependencies: function-bind: 1.1.2 + hls.js@1.6.16: {} + html-encoding-sniffer@6.0.0: dependencies: '@exodus/bytes': 1.15.0 @@ -5061,11 +5468,15 @@ snapshots: dependencies: safer-buffer: 2.1.2 + ieee754@1.2.1: {} + ignore@5.3.2: {} image-size@0.5.5: optional: true + immediate@3.0.6: {} + immutable@3.8.3: {} indent-string@4.0.0: {} @@ -5145,8 +5556,17 @@ snapshots: is-wsl@1.1.0: {} + isexe@2.0.0: {} + isnumber@1.0.0: {} + its-fine@2.0.0(@types/react@19.2.14)(react@19.2.5): + dependencies: + '@types/react-reconciler': 0.28.9(@types/react@19.2.14) + react: 19.2.5 + transitivePeerDependencies: + - '@types/react' + jiti@2.6.1: {} js-stringify@1.0.2: {} @@ -5235,6 +5655,10 @@ snapshots: needle: 3.5.0 source-map: 0.6.1 + lie@3.3.0: + dependencies: + immediate: 3.0.6 + lightningcss-android-arm64@1.32.0: optional: true @@ -5314,6 +5738,11 @@ snapshots: lz-string@1.5.0: {} + maath@0.10.8(@types/three@0.184.0)(three@0.184.0): + dependencies: + '@types/three': 0.184.0 + three: 0.184.0 + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -5340,6 +5769,12 @@ snapshots: merge2@1.4.1: {} + meshline@3.3.1(three@0.184.0): + dependencies: + three: 0.184.0 + + meshoptimizer@1.1.1: {} + method-override@3.0.0: dependencies: debug: 3.1.0 @@ -5546,6 +5981,8 @@ snapshots: path-is-absolute@1.0.1: {} + path-key@3.1.1: {} + path-parse@1.0.7: {} path-to-regexp@8.4.2: {} @@ -5590,6 +6027,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + potpack@1.0.2: {} + prettier@3.8.3: {} pretty-format@27.5.1: @@ -5598,6 +6037,11 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + promise-worker-transferable@1.0.4: + dependencies: + is-promise: 2.2.2 + lie: 3.3.0 + promise@7.3.1: dependencies: asap: 2.0.6 @@ -5738,6 +6182,12 @@ snapshots: optionalDependencies: react-dom: 19.2.5(react@19.2.5) + react-use-measure@2.1.7(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + dependencies: + react: 19.2.5 + optionalDependencies: + react-dom: 19.2.5(react@19.2.5) + react@19.2.5: {} readable-stream@3.6.2: @@ -5927,6 +6377,12 @@ snapshots: setprototypeof@1.2.0: {} + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + shoetest@1.2.2: dependencies: randexp: 0.5.3 @@ -6027,10 +6483,17 @@ snapshots: standard-as-callback@2.1.0: {} + stats-gl@2.4.2(@types/three@0.184.0)(three@0.184.0): + dependencies: + '@types/three': 0.184.0 + three: 0.184.0 + stats-lite@2.2.0: dependencies: isnumber: 1.0.0 + stats.js@0.17.0: {} + statuses@1.3.1: {} statuses@1.5.0: {} @@ -6082,12 +6545,32 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + suspend-react@0.1.3(react@19.2.5): + dependencies: + react: 19.2.5 + symbol-tree@3.2.4: {} tailwindcss@4.2.4: {} tapable@2.3.3: {} + three-mesh-bvh@0.8.3(three@0.184.0): + dependencies: + three: 0.184.0 + + three-stdlib@2.36.1(three@0.184.0): + dependencies: + '@types/draco3d': 1.4.10 + '@types/offscreencanvas': 2019.7.3 + '@types/webxr': 0.5.24 + draco3d: 1.5.7 + fflate: 0.6.10 + potpack: 1.0.2 + three: 0.184.0 + + three@0.184.0: {} + through2@4.0.2: dependencies: readable-stream: 3.6.2 @@ -6129,6 +6612,20 @@ snapshots: dependencies: punycode: 2.3.1 + troika-three-text@0.52.4(three@0.184.0): + dependencies: + bidi-js: 1.0.3 + three: 0.184.0 + troika-three-utils: 0.52.4(three@0.184.0) + troika-worker-utils: 0.52.0 + webgl-sdf-generator: 1.1.1 + + troika-three-utils@0.52.4(three@0.184.0): + dependencies: + three: 0.184.0 + + troika-worker-utils@0.52.0: {} + tsc-alias@1.8.16: dependencies: chokidar: 3.6.0 @@ -6148,6 +6645,14 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tunnel-rat@0.1.2(@types/react@19.2.14)(react@19.2.5): + dependencies: + zustand: 4.5.7(@types/react@19.2.14)(react@19.2.5) + transitivePeerDependencies: + - '@types/react' + - immer + - react + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -6191,8 +6696,14 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + use-sync-external-store@1.6.0(react@19.2.5): + dependencies: + react: 19.2.5 + util-deprecate@1.0.2: {} + utility-types@3.11.0: {} + utils-merge@1.0.1: {} uuid@11.1.0: {} @@ -6250,6 +6761,10 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + webgl-constants@1.1.1: {} + + webgl-sdf-generator@1.1.1: {} + webidl-conversions@7.0.0: {} webidl-conversions@8.0.1: {} @@ -6271,6 +6786,10 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' + which@2.0.2: + dependencies: + isexe: 2.0.0 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -6324,3 +6843,16 @@ snapshots: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 + + zustand@4.5.7(@types/react@19.2.14)(react@19.2.5): + dependencies: + use-sync-external-store: 1.6.0(react@19.2.5) + optionalDependencies: + '@types/react': 19.2.14 + react: 19.2.5 + + zustand@5.0.12(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5)): + optionalDependencies: + '@types/react': 19.2.14 + react: 19.2.5 + use-sync-external-store: 1.6.0(react@19.2.5)