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:
+
+
Spawn a new Grid CRO
+
|
+
+
Connect to existing Grid CRO
+
+ Connected to Grid CRO ID:
+
+ Copy
+
+
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