From 6dbb8f9e3db6a268a8febd71162089ca31f96c13 Mon Sep 17 00:00:00 2001 From: guiltygyoza <59590480+guiltygyoza@users.noreply.github.com> Date: Thu, 19 Sep 2024 12:01:35 +0800 Subject: [PATCH] example: grid world (#159) Co-authored-by: Oak --- examples/grid/README.md | 16 ++ examples/grid/asconfig.json | 27 ++ examples/grid/index.html | 42 +++ examples/grid/package.json | 36 +++ examples/grid/src/index.ts | 269 +++++++++++++++++ examples/grid/src/objects/grid.ts | 100 +++++++ examples/grid/src/util/color.ts | 70 +++++ examples/grid/tsconfig.json | 14 + examples/grid/vite.config.mts | 20 ++ pnpm-lock.yaml | 461 +++++++++++++++++++++++++++++- 10 files changed, 1041 insertions(+), 14 deletions(-) create mode 100644 examples/grid/README.md create mode 100644 examples/grid/asconfig.json create mode 100644 examples/grid/index.html create mode 100644 examples/grid/package.json create mode 100644 examples/grid/src/index.ts create mode 100644 examples/grid/src/objects/grid.ts create mode 100644 examples/grid/src/util/color.ts create mode 100644 examples/grid/tsconfig.json create mode 100644 examples/grid/vite.config.mts diff --git a/examples/grid/README.md b/examples/grid/README.md new file mode 100644 index 00000000..0684a01f --- /dev/null +++ b/examples/grid/README.md @@ -0,0 +1,16 @@ +# Topology Protocol Example + +This is an example that uses Topology Protocol to implement a 2D grid space where users appear to be circles and can move around the integer grid one grid at a time. + +## Specifics + +The Grid CRO has a mapping from user id (node id concacenated with a randomly assigned color string) to the user's position on the grid. The CRO leverages the underlying hash graph for conflict-free consistency. The mergeCallback function receives the linearised operations returned from the underlying hash graph, and recomputes the user-position mapping from those operations. + +## How to run locally + +After cloning the repository, run the following commands: + +```bash +cd ts-topology/examples/grid +pnpm dev +``` diff --git a/examples/grid/asconfig.json b/examples/grid/asconfig.json new file mode 100644 index 00000000..5c4b430f --- /dev/null +++ b/examples/grid/asconfig.json @@ -0,0 +1,27 @@ +{ + "entries": ["./src/objects/chat.ts"], + "targets": { + "debug": { + "outFile": "dist/asc/debug.wasm", + "textFile": "dist/asc/debug.wat", + "sourceMap": true, + "debug": true + }, + "release": { + "outFile": "dist/asc/release.wasm", + "textFile": "dist/asc/release.wat", + "sourceMap": false, + "optimizeLevel": 3, + "shrinkLevel": 0, + "converge": false, + "noAssert": false + } + }, + "options": { + "lib": { + "@topology-foundation/blueprints": [ + "../node_modules/@topology-foundation/blueprints/src/index.asc.ts" + ] + } + } +} diff --git a/examples/grid/index.html b/examples/grid/index.html new file mode 100644 index 00000000..c43df353 --- /dev/null +++ b/examples/grid/index.html @@ -0,0 +1,42 @@ + + + + + + Topology - Grid + + +
+

A 2D grid made with CRO

+

Your Peer ID:

+

Peers on dRAM:

+

Discovery Peers:

+ + + | + + +

+ Connected to Grid CRO ID: + + +

+

Peers in CRO:

+
+ +
+ +
+ + + + diff --git a/examples/grid/package.json b/examples/grid/package.json new file mode 100644 index 00000000..a23b91f1 --- /dev/null +++ b/examples/grid/package.json @@ -0,0 +1,36 @@ +{ + "name": "topology-example-grid", + "version": "0.1.1", + "description": "Topology Protocol Grid Exmaple", + "main": "src/index.ts", + "repository": "https://github.com/topology-foundation/ts-topology.git", + "license": "MIT", + "scripts": { + "asbuild": "asc --config asconfig.json --target release", + "build": "vite build", + "clean": "rm -rf dist/ node_modules/", + "dev": "vite serve", + "start": "ts-node ./src/index.ts" + }, + "dependencies": { + "@topology-foundation/network": "0.1.1", + "@topology-foundation/node": "0.1.1", + "@topology-foundation/object": "0.1.1", + "assemblyscript": "^0.27.29", + "crypto-browserify": "^3.12.0", + "memfs": "^4.11.1", + "process": "^0.11.10", + "react-spring": "^9.7.4", + "stream-browserify": "^3.0.0", + "ts-node": "^10.9.2", + "uint8arrays": "^5.1.0", + "vm-browserify": "^1.1.2" + }, + "devDependencies": { + "@types/node": "^22.5.4", + "ts-loader": "^9.5.1", + "typescript": "^5.5.4", + "vite": "^5.4.3", + "vite-plugin-node-polyfills": "^0.22.0" + } +} diff --git a/examples/grid/src/index.ts b/examples/grid/src/index.ts new file mode 100644 index 00000000..d8c84e69 --- /dev/null +++ b/examples/grid/src/index.ts @@ -0,0 +1,269 @@ +import { TopologyNode } from "@topology-foundation/node"; +import type { TopologyObject } from "@topology-foundation/object"; +import { Grid } from "./objects/grid"; +import { hslToRgb, rgbToHex, rgbToHsl } from "./util/color"; + +const node = new TopologyNode(); +let topologyObject: TopologyObject; +let gridCRO: Grid; +let peers: string[] = []; +let discoveryPeers: string[] = []; +let objectPeers: string[] = []; + +const formatNodeId = (id: string): string => { + return `${id.slice(0, 4)}...${id.slice(-4)}`; +}; + +const colorMap: Map = new Map(); + +const hashCode = (str: string): number => { + let hash = 0; + for (let i = 0; i < str.length; i++) { + hash = (hash << 5) - hash + str.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + return hash; +}; + +const getColorForNodeId = (id: string): string => { + if (!colorMap.has(id)) { + const hash = hashCode(id); + let r = (hash & 0xff0000) >> 16; + let g = (hash & 0x00ff00) >> 8; + let b = hash & 0x0000ff; + + // Convert to HSL and adjust lightness to be below 50% + let [h, s, l] = rgbToHsl(r, g, b); + l = l * 0.5; // Set lightness to below 50% + + // Convert back to RGB + [r, g, b] = hslToRgb(h, s, l); + const color = rgbToHex(r, g, b); // Convert RGB to hex + colorMap.set(id, color); + } + return colorMap.get(id) || "#000000"; +}; + +const render = () => { + if (topologyObject) { + const gridIdElement = document.getElementById("gridId"); + gridIdElement.innerText = topologyObject.id; + const copyGridIdButton = document.getElementById("copyGridId"); + if (copyGridIdButton) { + copyGridIdButton.style.display = "inline"; // Show the button + } + } else { + const copyGridIdButton = document.getElementById("copyGridId"); + if (copyGridIdButton) { + copyGridIdButton.style.display = "none"; // Hide the button + } + } + + const element_peerId = document.getElementById("peerId"); + element_peerId.innerHTML = `${formatNodeId(node.networkNode.peerId)}`; + + const element_peers = document.getElementById("peers"); + element_peers.innerHTML = `[${peers.map((peer) => `${formatNodeId(peer)}`).join(", ")}]`; + + const element_discoveryPeers = ( + document.getElementById("discoveryPeers") + ); + element_discoveryPeers.innerHTML = `[${discoveryPeers.map((peer) => `${formatNodeId(peer)}`).join(", ")}]`; + + const element_objectPeers = ( + document.getElementById("objectPeers") + ); + element_objectPeers.innerHTML = `[${objectPeers.map((peer) => `${formatNodeId(peer)}`).join(", ")}]`; + + if (!gridCRO) return; + const users = gridCRO.getUsers(); + const element_grid = document.getElementById("grid"); + element_grid.innerHTML = ""; + + const gridWidth = element_grid.clientWidth; + const gridHeight = element_grid.clientHeight; + const centerX = Math.floor(gridWidth / 2); + const centerY = Math.floor(gridHeight / 2); + + // Draw grid lines + const numLinesX = Math.floor(gridWidth / 50); + const numLinesY = Math.floor(gridHeight / 50); + + for (let i = -numLinesX; i <= numLinesX; i++) { + const line = document.createElement("div"); + line.style.position = "absolute"; + line.style.left = `${centerX + i * 50}px`; + line.style.top = "0"; + line.style.width = "1px"; + line.style.height = "100%"; + line.style.backgroundColor = "lightgray"; + element_grid.appendChild(line); + } + + for (let i = -numLinesY; i <= numLinesY; i++) { + const line = document.createElement("div"); + line.style.position = "absolute"; + line.style.left = "0"; + line.style.top = `${centerY + i * 50}px`; + line.style.width = "100%"; + line.style.height = "1px"; + line.style.backgroundColor = "lightgray"; + element_grid.appendChild(line); + } + + for (const userColorString of users) { + const [id, color] = userColorString.split(":"); + const position = gridCRO.getUserPosition(userColorString); + + if (position) { + const div = document.createElement("div"); + div.style.position = "absolute"; + div.style.left = `${centerX + position.x * 50 + 5}px`; // Center the circle + div.style.top = `${centerY - position.y * 50 + 5}px`; // Center the circle + if (id === node.networkNode.peerId) { + div.style.width = `${34}px`; + div.style.height = `${34}px`; + } else { + div.style.width = `${34 + 6}px`; + div.style.height = `${34 + 6}px`; + } + div.style.backgroundColor = color; + div.style.borderRadius = "50%"; + div.style.transition = "background-color 1s ease-in-out"; + div.style.animation = `glow-${id} 0.5s infinite alternate`; + + // Add black border for the current user's circle + if (id === node.networkNode.peerId) { + div.style.border = "3px solid black"; + } + + // Create dynamic keyframes for the glow effect + const style = document.createElement("style"); + style.innerHTML = ` + @keyframes glow-${id} { + 0% { + background-color: ${hexToRgba(color, 0.5)}; + } + 100% { + background-color: ${hexToRgba(color, 1)}; + } + }`; + document.head.appendChild(style); + + element_grid.appendChild(div); + } + } +}; + +// Helper function to convert hex color to rgba +function hexToRgba(hex: string, alpha: number) { + const bigint = Number.parseInt(hex.slice(1), 16); + const r = (bigint >> 16) & 255; + const g = (bigint >> 8) & 255; + const b = bigint & 255; + return `rgba(${r}, ${g}, ${b}, ${alpha})`; +} + +async function addUser() { + if (!gridCRO) { + console.error("Grid CRO not initialized"); + alert("Please create or join a grid first"); + return; + } + + gridCRO.addUser( + node.networkNode.peerId, + getColorForNodeId(node.networkNode.peerId), + ); + render(); +} + +async function moveUser(direction: string) { + if (!gridCRO) { + console.error("Grid CRO not initialized"); + alert("Please create or join a grid first"); + return; + } + + gridCRO.moveUser(node.networkNode.peerId, direction); + render(); +} + +async function createConnectHandlers() { + node.addCustomGroupMessageHandler(topologyObject.id, (e) => { + if (topologyObject) + objectPeers = node.networkNode.getGroupPeers(topologyObject.id); + render(); + }); + + node.objectStore.subscribe(topologyObject.id, (_, obj) => { + render(); + }); +} + +async function main() { + await node.start(); + render(); + + node.addCustomGroupMessageHandler("", (e) => { + peers = node.networkNode.getAllPeers(); + discoveryPeers = node.networkNode.getGroupPeers("topology::discovery"); + render(); + }); + + const button_create = ( + document.getElementById("createGrid") + ); + button_create.addEventListener("click", async () => { + topologyObject = await node.createObject(new Grid()); + gridCRO = topologyObject.cro as Grid; + createConnectHandlers(); + await addUser(); + render(); + }); + + const button_connect = document.getElementById("joinGrid"); + button_connect.addEventListener("click", async () => { + const croId = (document.getElementById("gridInput")) + .value; + try { + topologyObject = await node.createObject( + new Grid(), + croId, + undefined, + true, + ); + gridCRO = topologyObject.cro as Grid; + createConnectHandlers(); + await addUser(); + render(); + console.log("Succeeded in connecting with CRO", croId); + } catch (e) { + console.error("Error while connecting with CRO", croId, e); + } + }); + + document.addEventListener("keydown", (event) => { + if (event.key === "w") moveUser("U"); + if (event.key === "a") moveUser("L"); + if (event.key === "s") moveUser("D"); + if (event.key === "d") moveUser("R"); + }); + + const copyButton = document.getElementById("copyGridId"); + copyButton.addEventListener("click", () => { + const gridIdText = (document.getElementById("gridId")) + .innerText; + navigator.clipboard + .writeText(gridIdText) + .then(() => { + // alert("Grid CRO ID copied to clipboard!"); + console.log("Grid CRO ID copied to clipboard"); + }) + .catch((err) => { + console.error("Failed to copy: ", err); + }); + }); +} + +main(); diff --git a/examples/grid/src/objects/grid.ts b/examples/grid/src/objects/grid.ts new file mode 100644 index 00000000..70e9f286 --- /dev/null +++ b/examples/grid/src/objects/grid.ts @@ -0,0 +1,100 @@ +import { + ActionType, + type CRO, + type Operation, + type ResolveConflictsType, + SemanticsType, + type Vertex, +} from "@topology-foundation/object"; + +export class Grid implements CRO { + operations: string[] = ["addUser", "moveUser"]; + semanticsType: SemanticsType = SemanticsType.pair; + positions: Map; + + constructor() { + this.positions = new Map(); + } + + addUser(userId: string, color: string): void { + this._addUser(userId, color); + } + + private _addUser(userId: string, color: string): void { + const userColorString = `${userId}:${color}`; + this.positions.set(userColorString, { x: 0, y: 0 }); + } + + moveUser(userId: string, direction: string): void { + this._moveUser(userId, direction); + } + + private _moveUser(userId: string, direction: string): void { + const userColorString = [...this.positions.keys()].find((u) => + u.startsWith(`${userId}:`), + ); + if (userColorString) { + const position = this.positions.get(userColorString); + if (position) { + switch (direction) { + case "U": + position.y += 1; + break; + case "D": + position.y -= 1; + break; + case "L": + position.x -= 1; + break; + case "R": + position.x += 1; + break; + } + } + } + } + + getUsers(): string[] { + return [...this.positions.keys()]; + } + + getUserPosition( + userColorString: string, + ): { x: number; y: number } | undefined { + const position = this.positions.get(userColorString); + if (position) { + return position; + } + return undefined; + } + + resolveConflicts(vertices: Vertex[]): ResolveConflictsType { + return { action: ActionType.Nop }; + } + + mergeCallback(operations: Operation[]): void { + // reset this.positions + this.positions = new Map(); + + // apply operations to this.positions + for (const op of operations) { + if (!op.value) continue; + switch (op.type) { + case "addUser": { + const [userId, color] = op.value; + this._addUser(userId, color); + break; + } + case "moveUser": { + const [userId, direction] = op.value; + this._moveUser(userId, direction); + break; + } + } + } + } +} + +export function createGrid(): Grid { + return new Grid(); +} diff --git a/examples/grid/src/util/color.ts b/examples/grid/src/util/color.ts new file mode 100644 index 00000000..a5243339 --- /dev/null +++ b/examples/grid/src/util/color.ts @@ -0,0 +1,70 @@ +export const rgbToHsl = ( + rInt: number, + gInt: number, + bInt: number, +): [number, number, number] => { + const r = rInt / 255; + const g = gInt / 255; + const b = bInt / 255; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + let h = 0; + let s: number; + const l = (max + min) / 2; // Initialize h with a default value + + if (max === min) { + h = s = 0; // achromatic + } else { + const chromaticity = max - min; + s = l > 0.5 ? chromaticity / (2 - max - min) : chromaticity / (max + min); + switch (max) { + case r: + h = (g - b) / chromaticity + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / chromaticity + 2; + break; + case b: + h = (r - g) / chromaticity + 4; + break; + } + h /= 6; + } + return [h * 360, s, l]; +}; + +export const hslToRgb = ( + h: number, + s: number, + l: number, +): [number, number, number] => { + let r: number; + let g: number; + let b: number; + + if (s === 0) { + r = g = b = l; // achromatic + } else { + const hue2rgb = (p: number, q: number, t_: number) => { + let t = t_; + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + }; + + const q = l < 0.5 ? l * (1 + s) : l + s - l * s; + const p = 2 * l - q; + r = hue2rgb(p, q, h / 360 + 1 / 3); + g = hue2rgb(p, q, h / 360); + b = hue2rgb(p, q, h / 360 - 1 / 3); + } + + return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]; +}; + +export const rgbToHex = (r: number, g: number, b: number): string => { + return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`; +}; diff --git a/examples/grid/tsconfig.json b/examples/grid/tsconfig.json new file mode 100644 index 00000000..23d99aec --- /dev/null +++ b/examples/grid/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "rootDir": ".", + "strict": true, + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "allowJs": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + } +} diff --git a/examples/grid/vite.config.mts b/examples/grid/vite.config.mts new file mode 100644 index 00000000..e3518486 --- /dev/null +++ b/examples/grid/vite.config.mts @@ -0,0 +1,20 @@ +import path from "node:path"; +import { defineConfig } from "vite"; +import { nodePolyfills } from "vite-plugin-node-polyfills"; + +export default defineConfig({ + build: { + target: "esnext", + }, + plugins: [nodePolyfills()], + optimizeDeps: { + esbuildOptions: { + target: "esnext", + }, + }, + resolve: { + alias: { + "@topology-foundation": path.resolve(__dirname, "../../packages"), + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cae7283a..b8b3f43f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,9 +44,9 @@ importers: examples/canvas: dependencies: - '@topology-foundation/crdt': + '@topology-foundation/blueprints': specifier: 0.1.1 - version: 0.1.1 + version: link:../../packages/blueprints '@topology-foundation/network': specifier: 0.1.1 version: link:../../packages/network @@ -89,6 +89,61 @@ importers: version: 0.22.0(rollup@4.21.1)(vite@5.4.3(@types/node@22.5.4)(terser@5.31.6)) examples/chat: + dependencies: + '@topology-foundation/blueprints': + specifier: 0.1.1 + version: link:../../packages/blueprints + '@topology-foundation/network': + specifier: 0.1.1 + version: link:../../packages/network + '@topology-foundation/node': + specifier: 0.1.1 + version: link:../../packages/node + '@topology-foundation/object': + specifier: 0.1.1 + version: link:../../packages/object + assemblyscript: + specifier: ^0.27.29 + version: 0.27.29 + crypto-browserify: + specifier: ^3.12.0 + version: 3.12.0 + memfs: + specifier: ^4.11.1 + version: 4.11.1 + process: + specifier: ^0.11.10 + version: 0.11.10 + stream-browserify: + specifier: ^3.0.0 + version: 3.0.0 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.5.4)(typescript@5.5.4) + uint8arrays: + specifier: ^5.1.0 + version: 5.1.0 + vm-browserify: + specifier: ^1.1.2 + version: 1.1.2 + devDependencies: + '@types/node': + specifier: ^22.5.4 + version: 22.5.4 + ts-loader: + specifier: ^9.5.1 + version: 9.5.1(typescript@5.5.4)(webpack@5.94.0) + typescript: + specifier: ^5.5.4 + version: 5.5.4 + vite: + specifier: ^5.4.3 + version: 5.4.3(@types/node@22.5.4)(terser@5.31.6) + vite-plugin-node-polyfills: + specifier: ^0.22.0 + version: 0.22.0(rollup@4.21.1)(vite@5.4.3(@types/node@22.5.4)(terser@5.31.6)) + + examples/grid: dependencies: '@topology-foundation/crdt': specifier: 0.1.1 @@ -114,6 +169,9 @@ importers: process: specifier: ^0.11.10 version: 0.11.10 + react-spring: + specifier: ^9.7.4 + version: 9.7.4(@react-three/fiber@8.17.7(react-dom@18.3.1(react@18.3.1))(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4))(react@18.3.1)(three@0.168.0))(konva@9.3.15)(react-dom@18.3.1(react@18.3.1))(react-konva@18.2.10(konva@9.3.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4))(react-zdog@1.2.2)(react@18.3.1)(three@0.168.0)(zdog@1.1.3) stream-browserify: specifier: ^3.0.0 version: 3.0.0 @@ -205,7 +263,7 @@ importers: version: 10.0.2 '@libp2p/webrtc': specifier: ^4.1.8 - version: 4.1.8(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(react@18.3.1)(typescript@5.5.4)) + version: 4.1.8(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4)) '@libp2p/websockets': specifier: ^8.1.2 version: 8.2.0 @@ -239,7 +297,7 @@ importers: version: 1.7.0 react-native-webrtc: specifier: ^124.0.3 - version: 124.0.4(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(react@18.3.1)(typescript@5.5.4)) + version: 124.0.4(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4)) packages/node: dependencies: @@ -1754,6 +1812,86 @@ packages: '@types/react': optional: true + '@react-spring/animated@9.7.4': + resolution: {integrity: sha512-7As+8Pty2QlemJ9O5ecsuPKjmO0NKvmVkRR1n6mEotFgWar8FKuQt2xgxz3RTgxcccghpx1YdS1FCdElQNexmQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@react-spring/core@9.7.4': + resolution: {integrity: sha512-GzjA44niEJBFUe9jN3zubRDDDP2E4tBlhNlSIkTChiNf9p4ZQlgXBg50qbXfSXHQPHak/ExYxwhipKVsQ/sUTw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@react-spring/konva@9.7.4': + resolution: {integrity: sha512-B2IRytWM2ixifoKxE5DXTUXxNAhPsPqozrZEXXkwKhet1P2xvxXpTYrmDi0NnqTijVbAA3n1hUv8/DqqMKoI0Q==} + peerDependencies: + konva: '>=2.6' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-konva: ^16.8.0 || ^16.8.7-0 || ^16.9.0-0 || ^16.10.1-0 || ^16.12.0-0 || ^16.13.0-0 || ^17.0.0-0 || ^17.0.1-0 || ^17.0.2-0 || ^18.0.0-0 + + '@react-spring/native@9.7.4': + resolution: {integrity: sha512-mBaDq8MA1O42QS1vlw06cf+GiwWZWPi0n6reZAjAfpO1mShi63uHCBcRrez8JGw2F/JSMaRQ5Ya1n5s47S3VlQ==} + peerDependencies: + react: 16.8.0 || >=17.0.0 || >=18.0.0 + react-native: '>=0.58' + + '@react-spring/rafz@9.7.4': + resolution: {integrity: sha512-mqDI6rW0Ca8IdryOMiXRhMtVGiEGLIO89vIOyFQXRIwwIMX30HLya24g9z4olDvFyeDW3+kibiKwtZnA4xhldA==} + + '@react-spring/shared@9.7.4': + resolution: {integrity: sha512-bEPI7cQp94dOtCFSEYpxvLxj0+xQfB5r9Ru1h8OMycsIq7zFZon1G0sHrBLaLQIWeMCllc4tVDYRTLIRv70C8w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@react-spring/three@9.7.4': + resolution: {integrity: sha512-HKUhrrvWW7F/MAroObOloqcYyFqsUHp1ANIDvPVxk9cSh7veW7gQbJm2Sc7Ka+L4gVJEwSkS+MRfr8kk+sRZBw==} + peerDependencies: + '@react-three/fiber': '>=6.0' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + three: '>=0.126' + + '@react-spring/types@9.7.4': + resolution: {integrity: sha512-iQVztO09ZVfsletMiY+DpT/JRiBntdsdJ4uqk3UJFhrhS8mIC9ZOZbmfGSRs/kdbNPQkVyzucceDicQ/3Mlj9g==} + + '@react-spring/web@9.7.4': + resolution: {integrity: sha512-UMvCZp7I5HCVIleSa4BwbNxynqvj+mJjG2m20VO2yPoi2pnCYANy58flvz9v/YcXTAvsmL655FV3pm5fbr6akA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@react-spring/zdog@9.7.4': + resolution: {integrity: sha512-uKAzQqKXxHYyGo36EYQEIZzNB60gxQsCG6aaXO2LY5aa7kq44pJX/92D1YigOIhJ/sbfJOXYfdJC/ntvATvzCQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-zdog: '>=1.0' + zdog: '>=1.0' + + '@react-three/fiber@8.17.7': + resolution: {integrity: sha512-52/TZ0pGdEtjs1bSCePrJe8+5hzYzC8/O4bwx0NXc3GZ3uRCr5Eu+CVsr7BUn2uxd825Zjbup0OXKSDRQ70qiQ==} + peerDependencies: + expo: '>=43.0' + expo-asset: '>=8.4' + expo-file-system: '>=11.0' + expo-gl: '>=11.0' + react: '>=18.0' + react-dom: '>=18.0' + react-native: '>=0.64' + three: '>=0.133' + peerDependenciesMeta: + expo: + optional: true + expo-asset: + optional: true + expo-file-system: + optional: true + expo-gl: + optional: true + react-dom: + optional: true + react-native: + optional: true + '@release-it-plugins/workspaces@4.2.0': resolution: {integrity: sha512-hzQMdYWFnLBS/7dfasIWyeD2LUKeL7LT8ldxZgpzon90lW1cEU4Kpad78KmpZl1L188YHAbwVnboE+6i14jlEQ==} engines: {node: '>= 16'} @@ -1925,6 +2063,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/debounce@1.2.4': + resolution: {integrity: sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==} + '@types/dns-packet@5.6.5': resolution: {integrity: sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==} @@ -1964,12 +2105,27 @@ packages: '@types/node@22.5.4': resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-reconciler@0.26.7': + resolution: {integrity: sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==} + + '@types/react-reconciler@0.28.8': + resolution: {integrity: sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==} + + '@types/react@18.3.5': + resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} + '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/webxr@0.5.20': + resolution: {integrity: sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==} + '@types/ws@8.5.12': resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} @@ -2553,6 +2709,9 @@ packages: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -2567,6 +2726,9 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -3477,6 +3639,11 @@ packages: resolution: {integrity: sha512-uWjMtpy5HqhSd/LlrlP3fhYrr7rUfJFFMABv0F5d6n13Q+0glhZthwUKpEAVhDrXY95Tb1RB5lLqqef+QbVNaw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} + its-fine@1.2.5: + resolution: {integrity: sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==} + peerDependencies: + react: '>=18.0' + jest-environment-node@29.7.0: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3581,6 +3748,9 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + konva@9.3.15: + resolution: {integrity: sha512-6jceV1u75a41Fwky7HIg7Xr092sn9g+emE/F4KrkNey9j5IwM/No91z4g13P9kbh0NePzC20YvfyGVS5EzliUA==} + ky@1.7.1: resolution: {integrity: sha512-KJ/IXXkFhTDqxcN8wKqMXk1/UoOpc0UnOB6H7QcqlPInh/M2B5Mlj+i9exez1w4RSwJhNFmHiUDPriAYFwb5VA==} engines: {node: '>=18'} @@ -4379,12 +4549,24 @@ packages: react-devtools-core@5.3.1: resolution: {integrity: sha512-7FSb9meX0btdBQLwdFOwt6bGqvRPabmVMMslv8fgoSPqXyuGpgQe36kx8gR86XPw7aV1yVouTp6fyZ0EH+NfUw==} + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-konva@18.2.10: + resolution: {integrity: sha512-ohcX1BJINL43m4ynjZ24MxFI1syjBdrXhqVxYVDw2rKgr3yuS0x/6m1Y2Z4sl4T/gKhfreBx8KHisd0XC6OT1g==} + peerDependencies: + konva: ^8.0.1 || ^7.2.5 || ^9.0.0 + react: '>=18.0.0' + react-dom: '>=18.0.0' + react-native-webrtc@118.0.7: resolution: {integrity: sha512-odgd4CNSGQmI8n/pEbxlUtJBTJ8uqE51B1/NUEAvO1AQbeXsyFNHEG0H2T27eMefo5u0GKcRpNkZpXi6fctTkQ==} peerDependencies: @@ -4406,10 +4588,31 @@ packages: '@types/react': optional: true + react-reconciler@0.27.0: + resolution: {integrity: sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^18.0.0 + + react-reconciler@0.29.2: + resolution: {integrity: sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^18.3.1 + react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} + react-spring@9.7.4: + resolution: {integrity: sha512-ypxdsOwmCfbDZGTBRyBo7eLjF55xNFN86e/QkflZ1Rfo8QMzVjCAWocrEEbsuFKkQAg2RRdhNkinWJ6BpCvJoQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-zdog@1.2.2: + resolution: {integrity: sha512-Ix7ALha91aOEwiHuxumCeYbARS5XNpc/w0v145oGkM6poF/CvhKJwzLhM5sEZbtrghMA+psAhOJkCTzJoseicA==} + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -4476,6 +4679,9 @@ packages: require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -4559,6 +4765,12 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + scheduler@0.21.0: + resolution: {integrity: sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.24.0-canary-efb381bbf-20230505: resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} @@ -4822,6 +5034,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' + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -4864,6 +5081,9 @@ packages: peerDependencies: tslib: ^2 + three@0.168.0: + resolution: {integrity: sha512-6m6jXtDwMJEK/GGMbAOTSAmxNdzKvvBzgd7q8bE/7Tr6m7PaBh5kKLrN7faWtlglXbzj7sVba48Idwx+NRsZXw==} + throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} @@ -5374,6 +5594,18 @@ packages: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} + zdog@1.1.3: + resolution: {integrity: sha512-raRj6r0gPzopFm5XWBJZr/NuV4EEnT4iE+U3dp5FV5pCb588Gmm3zLIp/j9yqqcMiHH8VNQlerLTgOqL7krh6w==} + + zustand@3.7.2: + resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} + engines: {node: '>=12.7.0'} + peerDependencies: + react: '>=16.8' + peerDependenciesMeta: + react: + optional: true + snapshots: '@ampproject/remapping@2.3.0': @@ -6882,7 +7114,7 @@ snapshots: uint8arraylist: 2.4.8 uint8arrays: 5.1.0 - '@libp2p/webrtc@4.1.8(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(react@18.3.1)(typescript@5.5.4))': + '@libp2p/webrtc@4.1.8(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4))': dependencies: '@chainsafe/libp2p-noise': 15.1.2 '@libp2p/interface': 1.7.0 @@ -6905,7 +7137,7 @@ snapshots: progress-events: 1.0.1 protons-runtime: 5.5.0 race-signal: 1.1.0 - react-native-webrtc: 118.0.7(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(react@18.3.1)(typescript@5.5.4)) + react-native-webrtc: 118.0.7(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4)) uint8arraylist: 2.4.8 uint8arrays: 5.1.0 transitivePeerDependencies: @@ -7389,12 +7621,106 @@ snapshots: '@react-native/normalize-colors@0.75.2': {} - '@react-native/virtualized-lists@0.75.2(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(react@18.3.1)(typescript@5.5.4))(react@18.3.1)': + '@react-native/virtualized-lists@0.75.2(@types/react@18.3.5)(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4))(react@18.3.1)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 18.3.1 - react-native: 0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(react@18.3.1)(typescript@5.5.4) + react-native: 0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4) + optionalDependencies: + '@types/react': 18.3.5 + + '@react-spring/animated@9.7.4(react@18.3.1)': + dependencies: + '@react-spring/shared': 9.7.4(react@18.3.1) + '@react-spring/types': 9.7.4 + react: 18.3.1 + + '@react-spring/core@9.7.4(react@18.3.1)': + dependencies: + '@react-spring/animated': 9.7.4(react@18.3.1) + '@react-spring/shared': 9.7.4(react@18.3.1) + '@react-spring/types': 9.7.4 + react: 18.3.1 + + '@react-spring/konva@9.7.4(konva@9.3.15)(react-konva@18.2.10(konva@9.3.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-spring/animated': 9.7.4(react@18.3.1) + '@react-spring/core': 9.7.4(react@18.3.1) + '@react-spring/shared': 9.7.4(react@18.3.1) + '@react-spring/types': 9.7.4 + konva: 9.3.15 + react: 18.3.1 + react-konva: 18.2.10(konva@9.3.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@react-spring/native@9.7.4(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4))(react@18.3.1)': + dependencies: + '@react-spring/animated': 9.7.4(react@18.3.1) + '@react-spring/core': 9.7.4(react@18.3.1) + '@react-spring/shared': 9.7.4(react@18.3.1) + '@react-spring/types': 9.7.4 + react: 18.3.1 + react-native: 0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4) + + '@react-spring/rafz@9.7.4': {} + + '@react-spring/shared@9.7.4(react@18.3.1)': + dependencies: + '@react-spring/rafz': 9.7.4 + '@react-spring/types': 9.7.4 + react: 18.3.1 + + '@react-spring/three@9.7.4(@react-three/fiber@8.17.7(react-dom@18.3.1(react@18.3.1))(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4))(react@18.3.1)(three@0.168.0))(react@18.3.1)(three@0.168.0)': + dependencies: + '@react-spring/animated': 9.7.4(react@18.3.1) + '@react-spring/core': 9.7.4(react@18.3.1) + '@react-spring/shared': 9.7.4(react@18.3.1) + '@react-spring/types': 9.7.4 + '@react-three/fiber': 8.17.7(react-dom@18.3.1(react@18.3.1))(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4))(react@18.3.1)(three@0.168.0) + react: 18.3.1 + three: 0.168.0 + + '@react-spring/types@9.7.4': {} + + '@react-spring/web@9.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-spring/animated': 9.7.4(react@18.3.1) + '@react-spring/core': 9.7.4(react@18.3.1) + '@react-spring/shared': 9.7.4(react@18.3.1) + '@react-spring/types': 9.7.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-spring/zdog@9.7.4(react-dom@18.3.1(react@18.3.1))(react-zdog@1.2.2)(react@18.3.1)(zdog@1.1.3)': + dependencies: + '@react-spring/animated': 9.7.4(react@18.3.1) + '@react-spring/core': 9.7.4(react@18.3.1) + '@react-spring/shared': 9.7.4(react@18.3.1) + '@react-spring/types': 9.7.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-zdog: 1.2.2 + zdog: 1.1.3 + + '@react-three/fiber@8.17.7(react-dom@18.3.1(react@18.3.1))(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4))(react@18.3.1)(three@0.168.0)': + dependencies: + '@babel/runtime': 7.25.4 + '@types/debounce': 1.2.4 + '@types/react-reconciler': 0.26.7 + '@types/webxr': 0.5.20 + base64-js: 1.5.1 + buffer: 6.0.3 + debounce: 1.2.1 + its-fine: 1.2.5(react@18.3.1) + react: 18.3.1 + react-reconciler: 0.27.0(react@18.3.1) + scheduler: 0.21.0 + suspend-react: 0.1.3(react@18.3.1) + three: 0.168.0 + zustand: 3.7.2(react@18.3.1) + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + react-native: 0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4) '@release-it-plugins/workspaces@4.2.0(release-it@17.6.0(typescript@5.5.4))': dependencies: @@ -7524,6 +7850,8 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@types/debounce@1.2.4': {} + '@types/dns-packet@5.6.5': dependencies: '@types/node': 22.5.4 @@ -7565,10 +7893,27 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/prop-types@15.7.12': {} + + '@types/react-reconciler@0.26.7': + dependencies: + '@types/react': 18.3.5 + + '@types/react-reconciler@0.28.8': + dependencies: + '@types/react': 18.3.5 + + '@types/react@18.3.5': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + '@types/stack-utils@2.0.3': {} '@types/unist@3.0.3': {} + '@types/webxr@0.5.20': {} + '@types/ws@8.5.12': dependencies: '@types/node': 22.5.4 @@ -8271,6 +8616,8 @@ snapshots: dependencies: type-fest: 1.4.0 + csstype@3.1.3: {} + data-uri-to-buffer@4.0.1: {} data-uri-to-buffer@6.0.2: {} @@ -8292,6 +8639,8 @@ snapshots: dayjs@1.11.13: {} + debounce@1.2.1: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -9209,6 +9558,11 @@ snapshots: - bufferutil - utf-8-validate + its-fine@1.2.5(react@18.3.1): + dependencies: + '@types/react-reconciler': 0.28.8 + react: 18.3.1 + jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 @@ -9351,6 +9705,8 @@ snapshots: kleur@3.0.3: {} + konva@9.3.15: {} + ky@1.7.1: {} latest-version@9.0.0: @@ -10303,29 +10659,45 @@ snapshots: - bufferutil - utf-8-validate + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + react-is@17.0.2: {} react-is@18.3.1: {} - react-native-webrtc@118.0.7(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(react@18.3.1)(typescript@5.5.4)): + react-konva@18.2.10(konva@9.3.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@types/react-reconciler': 0.28.8 + its-fine: 1.2.5(react@18.3.1) + konva: 9.3.15 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-reconciler: 0.29.2(react@18.3.1) + scheduler: 0.23.2 + + react-native-webrtc@118.0.7(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4)): dependencies: base64-js: 1.5.1 debug: 4.3.4 event-target-shim: 6.0.2 - react-native: 0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(react@18.3.1)(typescript@5.5.4) + react-native: 0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4) transitivePeerDependencies: - supports-color - react-native-webrtc@124.0.4(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(react@18.3.1)(typescript@5.5.4)): + react-native-webrtc@124.0.4(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4)): dependencies: base64-js: 1.5.1 debug: 4.3.4 event-target-shim: 6.0.2 - react-native: 0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(react@18.3.1)(typescript@5.5.4) + react-native: 0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4) transitivePeerDependencies: - supports-color - react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(react@18.3.1)(typescript@5.5.4): + react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native-community/cli': 14.0.0(typescript@5.5.4) @@ -10337,7 +10709,7 @@ snapshots: '@react-native/gradle-plugin': 0.75.2 '@react-native/js-polyfills': 0.75.2 '@react-native/normalize-colors': 0.75.2 - '@react-native/virtualized-lists': 0.75.2(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(react@18.3.1)(typescript@5.5.4))(react@18.3.1) + '@react-native/virtualized-lists': 0.75.2(@types/react@18.3.5)(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4))(react@18.3.1) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -10366,6 +10738,8 @@ snapshots: whatwg-fetch: 3.6.20 ws: 6.2.3 yargs: 17.7.2 + optionalDependencies: + '@types/react': 18.3.5 transitivePeerDependencies: - '@babel/core' - '@babel/preset-env' @@ -10375,8 +10749,45 @@ snapshots: - typescript - utf-8-validate + react-reconciler@0.27.0(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.21.0 + + react-reconciler@0.29.2(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + react-refresh@0.14.2: {} + react-spring@9.7.4(@react-three/fiber@8.17.7(react-dom@18.3.1(react@18.3.1))(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4))(react@18.3.1)(three@0.168.0))(konva@9.3.15)(react-dom@18.3.1(react@18.3.1))(react-konva@18.2.10(konva@9.3.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4))(react-zdog@1.2.2)(react@18.3.1)(three@0.168.0)(zdog@1.1.3): + dependencies: + '@react-spring/core': 9.7.4(react@18.3.1) + '@react-spring/konva': 9.7.4(konva@9.3.15)(react-konva@18.2.10(konva@9.3.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@react-spring/native': 9.7.4(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4))(react@18.3.1) + '@react-spring/three': 9.7.4(@react-three/fiber@8.17.7(react-dom@18.3.1(react@18.3.1))(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.5)(react@18.3.1)(typescript@5.5.4))(react@18.3.1)(three@0.168.0))(react@18.3.1)(three@0.168.0) + '@react-spring/web': 9.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-spring/zdog': 9.7.4(react-dom@18.3.1(react@18.3.1))(react-zdog@1.2.2)(react@18.3.1)(zdog@1.1.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@react-three/fiber' + - konva + - react-konva + - react-native + - react-zdog + - three + - zdog + + react-zdog@1.2.2: + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + resize-observer-polyfill: 1.5.1 + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -10481,6 +10892,8 @@ snapshots: require-main-filename@2.0.0: {} + resize-observer-polyfill@1.5.1: {} + resolve-alpn@1.2.1: {} resolve-from@3.0.0: {} @@ -10571,6 +10984,14 @@ snapshots: safer-buffer@2.1.2: {} + scheduler@0.21.0: + dependencies: + loose-envify: 1.4.0 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + scheduler@0.24.0-canary-efb381bbf-20230505: dependencies: loose-envify: 1.4.0 @@ -10835,6 +11256,10 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + suspend-react@0.1.3(react@18.3.1): + dependencies: + react: 18.3.1 + tapable@2.2.1: {} tar-fs@2.1.1: @@ -10876,6 +11301,8 @@ snapshots: dependencies: tslib: 2.7.0 + three@0.168.0: {} + throat@5.0.0: {} through2@2.0.5: @@ -11380,3 +11807,9 @@ snapshots: yocto-queue@0.1.0: {} yoctocolors-cjs@2.1.2: {} + + zdog@1.1.3: {} + + zustand@3.7.2(react@18.3.1): + optionalDependencies: + react: 18.3.1