From 3501ecffe18315d54b977828d2008486051d126f Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Wed, 22 May 2024 14:52:41 +0200 Subject: [PATCH 01/24] [Examples/Move] Tic-tac-toe ## Description Port Move code for the tic tac toe example into the `sui/examples` directory, modernising it in the process: - Standardise the implementation between the owned, shared and multi-sig variants, so that the only differences are relevant to what they need to do differently. In doing this, the owned and multi-sig variants become identical (at least at the level of Move code). - Use transfer-to-object in the "owned" example, to send potential moves to the `Game` object, instead of the admin that owns the game. - Use more Move 2024 features (`syntax(index)`, receiver function aliases, etc). - Improve test coverage ## Test plan New unit tests: ``` tic_tac_toe/move$ sui move test ``` --- examples/tic-tac-toe/move/Move.toml | 9 + examples/tic-tac-toe/move/sources/owned.move | 326 ++++++++++++++++++ examples/tic-tac-toe/move/sources/shared.move | 248 +++++++++++++ .../tic-tac-toe/move/tests/owned_tests.move | 323 +++++++++++++++++ .../tic-tac-toe/move/tests/shared_tests.move | 321 +++++++++++++++++ 5 files changed, 1227 insertions(+) create mode 100644 examples/tic-tac-toe/move/Move.toml create mode 100644 examples/tic-tac-toe/move/sources/owned.move create mode 100644 examples/tic-tac-toe/move/sources/shared.move create mode 100644 examples/tic-tac-toe/move/tests/owned_tests.move create mode 100644 examples/tic-tac-toe/move/tests/shared_tests.move diff --git a/examples/tic-tac-toe/move/Move.toml b/examples/tic-tac-toe/move/Move.toml new file mode 100644 index 0000000000000..30f33c34a5aab --- /dev/null +++ b/examples/tic-tac-toe/move/Move.toml @@ -0,0 +1,9 @@ +[package] +name = "tic_tac_toe" +edition = "2024.beta" + +[dependencies] +Sui = { local = "../../../crates/sui-framework/packages/sui-framework" } + +[addresses] +tic_tac_toe = "0x0" diff --git a/examples/tic-tac-toe/move/sources/owned.move b/examples/tic-tac-toe/move/sources/owned.move new file mode 100644 index 0000000000000..6562b16aa86f0 --- /dev/null +++ b/examples/tic-tac-toe/move/sources/owned.move @@ -0,0 +1,326 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// An implementation of Tic Tac Toe, using owned objects. +/// +/// The `Game` object is owned by an admin, so players cannot mutate the game +/// board directly. Instead, they convey their intention to place a mark by +/// transferring a `Mark` object to the `Game`. +/// +/// This means that every move takes two owned object fast path operations -- +/// one by the player, and one by the admin. The admin could be a third party +/// running a centralized service that monitors marker placement events and +/// responds to them, or it could be a 1-of-2 multisig address shared between +/// the two players, as demonstrated in the demo app. +/// +/// The `shared` module shows a variant of this game implemented using shared +/// objects, which provides different trade-offs: Using shared objects is more +/// expensive, however the implementation is more straightforward and each move +/// only requires one transaction. +module tic_tac_toe::owned { + use sui::event; + use sui::transfer::Receiving; + + // === Object Types === + + /// The state of an active game of tic-tac-toe. + public struct Game has key, store { + id: UID, + + /// Marks on the board. + board: vector, + + /// The next turn to be played. + turn: u8, + + /// The address expected to send moves on behalf of X. + x: address, + + /// The address expected to send moves on behalf of O. + o: address, + + /// Public key of the admin address. + admin: vector, + } + + /// The player that the next turn is expected from is given a `TurnCap`. + public struct TurnCap has key { + id: UID, + game: ID, + } + + /// A request to make a play -- only the player with the `TurnCap` can + /// create and send `Mark`s. + public struct Mark has key, store { + id: UID, + player: address, + row: u8, + col: u8, + } + + /// An NFT representing a finished game. Sent to the winning player if there + /// is one, or to both players in the case of a draw. + public struct Trophy has key { + id: UID, + + /// Whether the game was won or drawn. + status: u8, + + /// The state of the board at the end of the game. + board: vector, + + /// The number of turns played + turn: u8, + + /// The other player (relative to the player who owns this Trophy). + other: address, + } + + // === Event Types === + + public struct MarkSent has copy, drop { + game: ID, + mark: ID, + } + + public struct GameEnd has copy, drop { + game: ID, + } + + // === Constants === + + // Marks + const MARK__: u8 = 0; + const MARK_X: u8 = 1; + const MARK_O: u8 = 2; + + // Trophy status + const TROPHY_NONE: u8 = 0; + const TROPHY_DRAW: u8 = 1; + const TROPHY_WIN: u8 = 2; + + // === Errors === + + /// Move was for a position that doesn't exist on the board. + const EInvalidLocation: u64 = 0; + + /// Game expected a move from another player. + const EWrongPlayer: u64 = 1; + + /// Game has not reached an end condition. + const ENotFinished: u64 = 2; + + /// Can't place a mark on a finished game. + const EAlreadyFinished: u64 = 3; + + /// Game reached an end state that wasn't expected. + const EInvalidEndState: u64 = 4; + + // === Public Functions === + + /// Create a new game, played by `x` and `o`. The game should be + /// transfered to the address that will administrate the game. If + /// that address is a multi-sig of the two players, its public key + /// should be passed as `admin`. + public fun new(x: address, o: address, admin: vector, ctx: &mut TxContext): Game { + let game = Game { + id: object::new(ctx), + board: vector[ + MARK__, MARK__, MARK__, + MARK__, MARK__, MARK__, + MARK__, MARK__, MARK__, + ], + + turn: 0, + x, + o, + admin, + }; + + let turn = TurnCap { + id: object::new(ctx), + game: object::id(&game), + }; + + // X is the first player, so send the capability to them. + transfer::transfer(turn, x); + game + } + + /// Called by the active player to express their intention to make a move. + /// This consumes the `TurnCap` to prevent a player from making more than + /// one move on their turn. + public fun send_mark(cap: TurnCap, row: u8, col: u8, ctx: &mut TxContext) { + assert!(row < 3 && col < 3, EInvalidLocation); + + let TurnCap { id, game } = cap; + id.delete(); + + let mark = Mark { + id: object::new(ctx), + player: ctx.sender(), + row, + col, + }; + + event::emit(MarkSent { game, mark: object::id(&mark) }); + transfer::transfer(mark, game.to_address()); + } + + /// Called by the admin (who owns the `Game`), to commit a player's + /// intention to make a move. If the game should end, `Trophy`s are sent to + /// the appropriate players, if the game should continue, a new `TurnCap` is + /// sent to the player who should make the next move. + public fun place_mark( + game: &mut Game, + mark: Receiving, + ctx: &mut TxContext, + ) { + assert!(game.ended() == TROPHY_NONE, EAlreadyFinished); + + // Fetch the mark on behalf of the game -- only works if the mark in + // question was sent to this game. + let Mark { id, row, col, player } = transfer::receive(&mut game.id, mark); + id.delete(); + + // Confirm that the mark is from the player we expect -- it should not + // be possible to hit this assertion, because the `Mark`s can only be + // created by the address that owns the `TurnCap` which cannot be + // transferred, and is always held by `game.next_player()`. + let (me, them, sentinel) = game.next_player(); + assert!(me == player, EWrongPlayer); + + if (game[row, col] == MARK__) { + *(&mut game[row, col]) = sentinel; + game.turn = game.turn + 1; + }; + + // Check win condition -- if there is a winner, send them the trophy, + // otherwise, create a new turn cap and send that to the next player. + let end = game.ended(); + if (end == TROPHY_WIN) { + transfer::transfer(game.mint_trophy(end, them, ctx), me); + event::emit(GameEnd { game: object::id(game) }); + } else if (end == TROPHY_DRAW) { + transfer::transfer(game.mint_trophy(end, them, ctx), me); + transfer::transfer(game.mint_trophy(end, me, ctx), them); + event::emit(GameEnd { game: object::id(game) }); + } else if (end == TROPHY_NONE) { + let cap = TurnCap { id: object::new(ctx), game: object::id(game) }; + let (to, _, _) = game.next_player(); + transfer::transfer(cap, to); + } else { + abort EInvalidEndState + } + } + + public fun burn(game: Game) { + assert!(game.ended() != TROPHY_NONE, ENotFinished); + let Game { id, .. } = game; + id.delete(); + } + + /// Test whether the game has reached an end condition or not. + public fun ended(game: &Game): u8 { + if ( + // Test rows + test_triple(game, 0, 1, 2) || + test_triple(game, 3, 4, 5) || + test_triple(game, 6, 7, 8) || + // Test columns + test_triple(game, 0, 3, 6) || + test_triple(game, 1, 4, 7) || + test_triple(game, 2, 5, 8) || + // Test diagonals + test_triple(game, 0, 4, 8) || + test_triple(game, 2, 4, 6) + ) { + TROPHY_WIN + } else if (game.turn == 9) { + TROPHY_DRAW + } else { + TROPHY_NONE + } + } + + #[syntax(index)] + public fun mark(game: &Game, row: u8, col: u8): &u8 { + &game.board[(row * 3 + col) as u64] + } + + #[syntax(index)] + fun mark_mut(game: &mut Game, row: u8, col: u8): &mut u8 { + &mut game.board[(row * 3 + col) as u64] + } + + // === Private Helpers === + + /// Address of the player the move is expected from, the address of the + /// other player, and the mark to use for the upcoming move. + fun next_player(game: &Game): (address, address, u8) { + if (game.turn % 2 == 0) { + (game.x, game.o, MARK_X) + } else { + (game.o, game.x, MARK_O) + } + } + + /// Test whether the values at the triple of positions all match each other + /// (and are not all EMPTY). + fun test_triple(game: &Game, x: u8, y: u8, z: u8): bool { + let x = game.board[x as u64]; + let y = game.board[y as u64]; + let z = game.board[z as u64]; + + MARK__ != x && x == y && y == z + } + + /// Create a trophy from the current state of the `game`, that indicates + /// that a player won or drew against `other` player. + fun mint_trophy( + game: &Game, + status: u8, + other: address, + ctx: &mut TxContext, + ): Trophy { + Trophy { + id: object::new(ctx), + status, + board: game.board, + turn: game.turn, + other, + } + } + + // === Test Helpers === + #[test_only] public use fun game_board as Game.board; + #[test_only] public use fun trophy_status as Trophy.status; + #[test_only] public use fun trophy_board as Trophy.board; + #[test_only] public use fun trophy_turn as Trophy.turn; + #[test_only] public use fun trophy_other as Trophy.other; + + #[test_only] + public fun game_board(game: &Game): vector { + game.board + } + + #[test_only] + public fun trophy_status(trophy: &Trophy): u8 { + trophy.status + } + + #[test_only] + public fun trophy_board(trophy: &Trophy): vector { + trophy.board + } + + #[test_only] + public fun trophy_turn(trophy: &Trophy): u8 { + trophy.turn + } + + #[test_only] + public fun trophy_other(trophy: &Trophy): address { + trophy.other + } +} diff --git a/examples/tic-tac-toe/move/sources/shared.move b/examples/tic-tac-toe/move/sources/shared.move new file mode 100644 index 0000000000000..22e5efd60013f --- /dev/null +++ b/examples/tic-tac-toe/move/sources/shared.move @@ -0,0 +1,248 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/// An implementation of Tic Tac Toe, using shared objects. +/// +/// The `Game` object is shared so both players can mutate it, and +/// contains authorization logic to only accept a move from the +/// correct player. +/// +/// The `owned` module shows a variant of this game implemented using +/// only fast path transactions, which should be cheaper and lower +/// latency, but either requires a centralized service or a multi-sig +/// set-up to own the game. +module tic_tac_toe::shared { + /// The state of an active game of tic-tac-toe. + public struct Game has key { + id: UID, + + /// Marks on the board. + board: vector, + + /// The next turn to be played. + turn: u8, + + /// The address expected to send moves on behalf of X. + x: address, + + /// The address expected to send moves on behalf of O. + o: address, + } + + /// An NFT representing a finished game. Sent to the winning player if there + /// is one, or to both players in the case of a draw. + public struct Trophy has key { + id: UID, + + /// Whether the game was won or drawn. + status: u8, + + /// The state of the board at the end of the game. + board: vector, + + /// The number of turns played + turn: u8, + + /// The other player (relative to the player who owns this Trophy). + other: address, + } + + // === Constants === + + // Marks + const MARK__: u8 = 0; + const MARK_X: u8 = 1; + const MARK_O: u8 = 2; + + // Trophy status + const TROPHY_NONE: u8 = 0; + const TROPHY_DRAW: u8 = 1; + const TROPHY_WIN: u8 = 2; + + // === Errors === + + /// Move was for a position that doesn't exist on the board. + const EInvalidLocation: u64 = 0; + + /// Game expected a move from another player. + const EWrongPlayer: u64 = 1; + + /// Attempt to place mark on a filled slot. + const EAlreadyFilled: u64 = 2; + + /// Game has not reached an end condition. + const ENotFinished: u64 = 3; + + /// Can't place a mark on a finished game. + const EAlreadyFinished: u64 = 4; + + /// Game reached an end state that wasn't expected. + const EInvalidEndState: u64 = 5; + + // === Public Functions === + + /// Create a new game, played by `x` and `o`. This function should be called + /// by the address responsible for administrating the game. + public fun new(x: address, o: address, ctx: &mut TxContext) { + transfer::share_object(Game { + id: object::new(ctx), + board: vector[ + MARK__, MARK__, MARK__, + MARK__, MARK__, MARK__, + MARK__, MARK__, MARK__, + ], + + turn: 0, + x, + o, + }); + } + + /// Called by the next player to add a new mark. + public fun place_mark( + game: &mut Game, + row: u8, + col: u8, + ctx: &mut TxContext, + ) { + assert!(game.ended() == TROPHY_NONE, EAlreadyFinished); + assert!(row < 3 && col < 3, EInvalidLocation); + + // Confirm that the mark is from the player we expect -- it should not + // be possible to hit this assertion, because the `Mark`s can only be + // created by the address that owns the `TurnCap` which cannot be + // transferred, and is always held by `game.next_player()`. + let (me, them, sentinel) = game.next_player(); + assert!(me == ctx.sender(), EWrongPlayer); + + if (game[row, col] != MARK__) { + abort EAlreadyFilled + }; + + *(&mut game[row, col]) = sentinel; + game.turn = game.turn + 1; + + // Check win condition -- if there is a winner, send them the trophy, + // otherwise, create a new turn cap and send that to the next player. + let end = game.ended(); + if (end == TROPHY_WIN) { + transfer::transfer(game.mint_trophy(end, them, ctx), me); + } else if (end == TROPHY_DRAW) { + transfer::transfer(game.mint_trophy(end, them, ctx), me); + transfer::transfer(game.mint_trophy(end, me, ctx), them); + } else if (end != TROPHY_NONE) { + abort EInvalidEndState + } + } + + + // === Private Helpers === + + /// Address of the player the move is expected from, the address of the + /// other player, and the mark to use for the upcoming move. + fun next_player(game: &Game): (address, address, u8) { + if (game.turn % 2 == 0) { + (game.x, game.o, MARK_X) + } else { + (game.o, game.x, MARK_O) + } + } + + /// Test whether the values at the triple of positions all match each other + /// (and are not all EMPTY). + fun test_triple(game: &Game, x: u8, y: u8, z: u8): bool { + let x = game.board[x as u64]; + let y = game.board[y as u64]; + let z = game.board[z as u64]; + + MARK__ != x && x == y && y == z + } + + /// Create a trophy from the current state of the `game`, that indicates + /// that a player won or drew against `other` player. + fun mint_trophy( + game: &Game, + status: u8, + other: address, + ctx: &mut TxContext, + ): Trophy { + Trophy { + id: object::new(ctx), + status, + board: game.board, + turn: game.turn, + other, + } + } + + public fun burn(game: Game) { + assert!(game.ended() != TROPHY_NONE, ENotFinished); + let Game { id, .. } = game; + id.delete(); + } + + /// Test whether the game has reached an end condition or not. + public fun ended(game: &Game): u8 { + if ( + // Test rows + test_triple(game, 0, 1, 2) || + test_triple(game, 3, 4, 5) || + test_triple(game, 6, 7, 8) || + // Test columns + test_triple(game, 0, 3, 6) || + test_triple(game, 1, 4, 7) || + test_triple(game, 2, 5, 8) || + // Test diagonals + test_triple(game, 0, 4, 8) || + test_triple(game, 2, 4, 6) + ) { + TROPHY_WIN + } else if (game.turn == 9) { + TROPHY_DRAW + } else { + TROPHY_NONE + } + } + + #[syntax(index)] + public fun mark(game: &Game, row: u8, col: u8): &u8 { + &game.board[(row * 3 + col) as u64] + } + + #[syntax(index)] + fun mark_mut(game: &mut Game, row: u8, col: u8): &mut u8 { + &mut game.board[(row * 3 + col) as u64] + } + + // === Test Helpers === + #[test_only] public use fun game_board as Game.board; + #[test_only] public use fun trophy_status as Trophy.status; + #[test_only] public use fun trophy_board as Trophy.board; + #[test_only] public use fun trophy_turn as Trophy.turn; + #[test_only] public use fun trophy_other as Trophy.other; + + #[test_only] + public fun game_board(game: &Game): vector { + game.board + } + + #[test_only] + public fun trophy_status(trophy: &Trophy): u8 { + trophy.status + } + + #[test_only] + public fun trophy_board(trophy: &Trophy): vector { + trophy.board + } + + #[test_only] + public fun trophy_turn(trophy: &Trophy): u8 { + trophy.turn + } + + #[test_only] + public fun trophy_other(trophy: &Trophy): address { + trophy.other + } +} diff --git a/examples/tic-tac-toe/move/tests/owned_tests.move b/examples/tic-tac-toe/move/tests/owned_tests.move new file mode 100644 index 0000000000000..76576db201508 --- /dev/null +++ b/examples/tic-tac-toe/move/tests/owned_tests.move @@ -0,0 +1,323 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module tic_tac_toe::owned_tests { + use sui::test_scenario::{Self as ts, Scenario}; + use sui::transfer::Receiving; + use tic_tac_toe::owned as ttt; + + const ADMIN: address = @0xAD; + const ALICE: address = @0xA; + const BOB: address = @0xB; + + // Dummy key -- this field is only relevant off-chain. + const KEY: vector = vector[]; + + const MARK__: u8 = 0; + const MARK_X: u8 = 1; + const MARK_O: u8 = 2; + + const TROPHY_DRAW: u8 = 1; + const TROPHY_WIN: u8 = 2; + + #[test] + fun x_wins() { + let mut ts = ts::begin(ADMIN); + + let game = ttt::new(ALICE, BOB, KEY, ts.ctx()); + transfer::public_transfer(game, ADMIN); + + ts.place_mark(ALICE, 1, 1); + // . . . + // . X . + // . . . + + ts.place_mark(BOB, 0, 0); + // O . . + // . X . + // . . . + + ts.place_mark(ALICE, 0, 2); + // O . X + // . X . + // . . . + + ts.place_mark(BOB, 1, 0); + // O . X + // O X . + // . . . + + ts.place_mark(ALICE, 2, 0); + // O . X + // O X . + // X . . + + ts.next_tx(ALICE); + assert!(!ts::has_most_recent_for_address(BOB)); + assert!(!ts::has_most_recent_for_address(ALICE)); + assert!(!ts::has_most_recent_for_address(BOB)); + + let trophy: ttt::Trophy = ts.take_from_sender(); + assert!(trophy.other() == BOB); + assert!(trophy.status() == TROPHY_WIN); + assert!(trophy.turn() == 5); + assert!(trophy.board() == vector[ + MARK_O, MARK__, MARK_X, + MARK_O, MARK_X, MARK__, + MARK_X, MARK__, MARK__, + ]); + + ts.return_to_sender(trophy); + + ts.next_tx(ADMIN); + let game: ttt::Game = ts.take_from_sender(); + game.burn(); + + ts.end(); + } + + #[test] + fun o_wins() { + let mut ts = ts::begin(ADMIN); + + let game = ttt::new(ALICE, BOB, KEY, ts.ctx()); + transfer::public_transfer(game, ADMIN); + + ts.place_mark(ALICE, 1, 1); + // . . . + // . X . + // . . . + + ts.place_mark(BOB, 2, 2); + // . . . + // . X . + // . . O + + ts.place_mark(ALICE, 0, 2); + // . . X + // . X . + // . . O + + ts.place_mark(BOB, 2, 0); + // . . X + // . X . + // O . O + + ts.place_mark(ALICE, 0, 0); + // X . X + // . X . + // O . O + + ts.place_mark(BOB, 2, 1); + // X . X + // . X . + // O O O + + ts.next_tx(BOB); + assert!(!ts::has_most_recent_for_address(ALICE)); + assert!(!ts::has_most_recent_for_address(ALICE)); + assert!(!ts::has_most_recent_for_address(BOB)); + + let trophy: ttt::Trophy = ts.take_from_sender(); + assert!(trophy.other() == ALICE); + assert!(trophy.status() == TROPHY_WIN); + assert!(trophy.turn() == 6); + assert!(trophy.board() == vector[ + MARK_X, MARK__, MARK_X, + MARK__, MARK_X, MARK__, + MARK_O, MARK_O, MARK_O, + ]); + + ts.return_to_sender(trophy); + + ts.next_tx(ADMIN); + let game: ttt::Game = ts.take_from_sender(); + game.burn(); + + ts.end(); + } + + #[test] + fun draw() { + let mut ts = ts::begin(ADMIN); + + let game = ttt::new(ALICE, BOB, KEY, ts.ctx()); + transfer::public_transfer(game, ADMIN); + + ts.place_mark(ALICE, 1, 1); + // . . . + // . X . + // . . . + + ts.place_mark(BOB, 0, 0); + // O . . + // . X . + // . . . + + ts.place_mark(ALICE, 0, 2); + // O . X + // . X . + // . . . + + ts.place_mark(BOB, 2, 0); + // O . X + // . X . + // O . . + + ts.place_mark(ALICE, 1, 0); + // O . X + // X X . + // O . . + + ts.place_mark(BOB, 1, 2); + // O . X + // X X O + // O . . + + ts.place_mark(ALICE, 0, 1); + // O X X + // X X O + // O . . + + ts.place_mark(BOB, 2, 1); + // O X X + // X X O + // O O . + + ts.place_mark(ALICE, 2, 2); + // O X X + // X X O + // O O X + + ts.next_tx(ALICE); + assert!(!ts::has_most_recent_for_address(ALICE)); + assert!(!ts::has_most_recent_for_address(BOB)); + + let trophy: ttt::Trophy = ts.take_from_sender(); + assert!(trophy.other() == BOB); + assert!(trophy.status() == TROPHY_DRAW); + assert!(trophy.turn() == 9); + assert!(trophy.board() == vector[ + MARK_O, MARK_X, MARK_X, + MARK_X, MARK_X, MARK_O, + MARK_O, MARK_O, MARK_X, + ]); + + ts.return_to_sender(trophy); + ts.next_tx(BOB); + + let trophy: ttt::Trophy = ts.take_from_sender(); + assert!(trophy.other() == ALICE); + assert!(trophy.status() == TROPHY_DRAW); + assert!(trophy.turn() == 9); + assert!(trophy.board() == vector[ + MARK_O, MARK_X, MARK_X, + MARK_X, MARK_X, MARK_O, + MARK_O, MARK_O, MARK_X, + ]); + + ts.return_to_sender(trophy); + + ts.next_tx(ADMIN); + let game: ttt::Game = ts.take_from_sender(); + game.burn(); + + ts.end(); + } + + #[test] + /// Only one player has the TurnCap at any one time. + fun turn_cap_conservation() { + let mut ts = ts::begin(ADMIN); + + let game = ttt::new(ALICE, BOB, KEY, ts.ctx()); + transfer::public_transfer(game, ADMIN); + + ts.next_tx(ADMIN); + assert!(ts::has_most_recent_for_address(ALICE)); + assert!(!ts::has_most_recent_for_address(BOB)); + + ts.place_mark(ALICE, 1, 1); + ts.next_tx(ADMIN); + assert!(!ts::has_most_recent_for_address(ALICE)); + assert!(ts::has_most_recent_for_address(BOB)); + + ts.end(); + } + + #[test] + #[expected_failure(abort_code = ttt::EInvalidLocation)] + fun location_out_of_bounds() { + let mut ts = ts::begin(ADMIN); + + let game = ttt::new(ALICE, BOB, KEY, ts.ctx()); + transfer::public_transfer(game, ADMIN); + + ts.place_mark(ALICE, 3, 3); + abort 0 + } + + #[test] + /// When a position is already marked, the turn cap is returned to + /// the player who made the "false" move, rather than the next + /// player. + fun already_marked() { + let mut ts = ts::begin(ADMIN); + + let game = ttt::new(ALICE, BOB, KEY, ts.ctx()); + transfer::public_transfer(game, ADMIN); + + ts.place_mark(ALICE, 1, 1); + ts.place_mark(BOB, 1, 1); + + ts.next_tx(ADMIN); + assert!(ts::has_most_recent_for_address(BOB)); + assert!(!ts::has_most_recent_for_address(ALICE)); + + let game: ttt::Game = ts.take_from_sender(); + assert!(game.board() == vector[ + MARK__, MARK__, MARK__, + MARK__, MARK_X, MARK__, + MARK__, MARK__, MARK__, + ]); + + ts.return_to_sender(game); + ts.end(); + } + + #[test] + #[expected_failure(abort_code = ttt::ENotFinished)] + fun burn_unfinished_game() { + let mut ts = ts::begin(ADMIN); + + let game = ttt::new(ALICE, BOB, KEY, ts.ctx()); + transfer::public_transfer(game, ADMIN); + + ts.place_mark(ALICE, 1, 1); + + ts.next_tx(ADMIN); + let game: ttt::Game = ts.take_from_sender(); + + game.burn(); + abort 0 + } + + // === Test Helpers === + use fun place_mark as Scenario.place_mark; + + // The current player places a mark at the given location. + fun place_mark(ts: &mut Scenario, player: address, row: u8, col: u8) { + ts.next_tx(player); + + let cap: ttt::TurnCap = ts.take_from_sender(); + cap.send_mark(row, col, ts.ctx()); + + ts.next_tx(ADMIN); + let mut game: ttt::Game = ts.take_from_sender(); + let rcv: Receiving = + ts::most_recent_receiving_ticket(&object::id(&game)); + + game.place_mark(rcv, ts.ctx()); + ts.return_to_sender(game); + } +} diff --git a/examples/tic-tac-toe/move/tests/shared_tests.move b/examples/tic-tac-toe/move/tests/shared_tests.move new file mode 100644 index 0000000000000..a9f53b345b03b --- /dev/null +++ b/examples/tic-tac-toe/move/tests/shared_tests.move @@ -0,0 +1,321 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +module tic_tac_toe::shared_tests { + use sui::test_scenario::{Self as ts, Scenario}; + use tic_tac_toe::shared as ttt; + + const ALICE: address = @0xA; + const BOB: address = @0xB; + + const MARK__: u8 = 0; + const MARK_X: u8 = 1; + const MARK_O: u8 = 2; + + const TROPHY_DRAW: u8 = 1; + const TROPHY_WIN: u8 = 2; + + #[test] + fun x_wins() { + let mut ts = ts::begin(ALICE); + + ttt::new(ALICE, BOB, ts.ctx()); + + ts.place_mark(ALICE, 1, 1); + // . . . + // . X . + // . . . + + ts.place_mark(BOB, 0, 0); + // O . . + // . X . + // . . . + + ts.place_mark(ALICE, 0, 2); + // O . X + // . X . + // . . . + + ts.place_mark(BOB, 1, 0); + // O . X + // O X . + // . . . + + ts.place_mark(ALICE, 2, 0); + // O . X + // O X . + // X . . + + ts.next_tx(ALICE); + assert!(!ts::has_most_recent_for_address(BOB)); + + let trophy: ttt::Trophy = ts.take_from_sender(); + assert!(trophy.other() == BOB); + assert!(trophy.status() == TROPHY_WIN); + assert!(trophy.turn() == 5); + assert!(trophy.board() == vector[ + MARK_O, MARK__, MARK_X, + MARK_O, MARK_X, MARK__, + MARK_X, MARK__, MARK__, + ]); + + ts.return_to_sender(trophy); + + let game: ttt::Game = ts.take_shared(); + game.burn(); + ts.end(); + } + + #[test] + fun o_wins() { + let mut ts = ts::begin(ALICE); + + ttt::new(ALICE, BOB, ts.ctx()); + + ts.place_mark(ALICE, 1, 1); + // . . . + // . X . + // . . . + + ts.place_mark(BOB, 2, 2); + // . . . + // . X . + // . . O + + ts.place_mark(ALICE, 0, 2); + // . . X + // . X . + // . . O + + ts.place_mark(BOB, 2, 0); + // . . X + // . X . + // O . O + + ts.place_mark(ALICE, 0, 0); + // X . X + // . X . + // O . O + + ts.place_mark(BOB, 2, 1); + // X . X + // . X . + // O O O + + ts.next_tx(BOB); + assert!(!ts::has_most_recent_for_address(ALICE)); + + let trophy: ttt::Trophy = ts.take_from_sender(); + assert!(trophy.other() == ALICE); + assert!(trophy.status() == TROPHY_WIN); + assert!(trophy.turn() == 6); + assert!(trophy.board() == vector[ + MARK_X, MARK__, MARK_X, + MARK__, MARK_X, MARK__, + MARK_O, MARK_O, MARK_O, + ]); + + ts.return_to_sender(trophy); + + let game: ttt::Game = ts.take_shared(); + game.burn(); + ts.end(); + } + + #[test] + fun draw() { + let mut ts = ts::begin(ALICE); + + ttt::new(ALICE, BOB, ts.ctx()); + + ts.place_mark(ALICE, 1, 1); + // . . . + // . X . + // . . . + + ts.place_mark(BOB, 0, 0); + // O . . + // . X . + // . . . + + ts.place_mark(ALICE, 0, 2); + // O . X + // . X . + // . . . + + ts.place_mark(BOB, 2, 0); + // O . X + // . X . + // O . . + + ts.place_mark(ALICE, 1, 0); + // O . X + // X X . + // O . . + + ts.place_mark(BOB, 1, 2); + // O . X + // X X O + // O . . + + ts.place_mark(ALICE, 0, 1); + // O X X + // X X O + // O . . + + ts.place_mark(BOB, 2, 1); + // O X X + // X X O + // O O . + + ts.place_mark(ALICE, 2, 2); + // O X X + // X X O + // O O X + + ts.next_tx(ALICE); + + let trophy: ttt::Trophy = ts.take_from_sender(); + assert!(trophy.other() == BOB); + assert!(trophy.status() == TROPHY_DRAW); + assert!(trophy.turn() == 9); + assert!(trophy.board() == vector[ + MARK_O, MARK_X, MARK_X, + MARK_X, MARK_X, MARK_O, + MARK_O, MARK_O, MARK_X, + ]); + + ts.return_to_sender(trophy); + ts.next_tx(BOB); + + let trophy: ttt::Trophy = ts.take_from_sender(); + assert!(trophy.other() == ALICE); + assert!(trophy.status() == TROPHY_DRAW); + assert!(trophy.turn() == 9); + assert!(trophy.board() == vector[ + MARK_O, MARK_X, MARK_X, + MARK_X, MARK_X, MARK_O, + MARK_O, MARK_O, MARK_X, + ]); + + ts.return_to_sender(trophy); + + let game: ttt::Game = ts.take_shared(); + game.burn(); + ts.end(); + } + + #[test] + #[expected_failure(abort_code = ttt::EWrongPlayer)] + /// Moves from the wrong player are rejected + fun wrong_player() { + let mut ts = ts::begin(ALICE); + + ttt::new(ALICE, BOB, ts.ctx()); + ts.place_mark(BOB, 0, 0); + abort 0 + } + + #[test] + #[expected_failure(abort_code = ttt::EWrongPlayer)] + /// Moves from a player not in the game are rejected + fun random_player() { + let mut ts = ts::begin(ALICE); + + ttt::new(ALICE, BOB, ts.ctx()); + ts.place_mark(@0xC, 0, 0); + abort 0 + } + + #[test] + #[expected_failure(abort_code = ttt::EInvalidLocation)] + fun location_out_of_bounds() { + let mut ts = ts::begin(ALICE); + + ttt::new(ALICE, BOB, ts.ctx()); + ts.place_mark(ALICE, 3, 3); + abort 0 + } + + #[test] + #[expected_failure(abort_code = ttt::EAlreadyFilled)] + /// When a position is already marked, the turn cap is returned to + /// the player who made the "false" move, rather than the next + /// player. + fun already_marked() { + let mut ts = ts::begin(ALICE); + + ttt::new(ALICE, BOB, ts.ctx()); + + ts.place_mark(ALICE, 1, 1); + ts.place_mark(BOB, 1, 1); + abort 0 + } + + #[test] + #[expected_failure(abort_code = ttt::EAlreadyFinished)] + fun already_finished() { + let mut ts = ts::begin(ALICE); + + ttt::new(ALICE, BOB, ts.ctx()); + + ts.place_mark(ALICE, 1, 1); + // . . . + // . X . + // . . . + + ts.place_mark(BOB, 0, 0); + // O . . + // . X . + // . . . + + ts.place_mark(ALICE, 0, 2); + // O . X + // . X . + // . . . + + ts.place_mark(BOB, 1, 0); + // O . X + // O X . + // . . . + + ts.place_mark(ALICE, 2, 0); + // O . X + // O X . + // X . . + + // Shouldn't work because the game has already finished. + ts.place_mark(BOB, 2, 0); + // O . X + // O X . + // X . O + + abort 0 + } + + #[test] + #[expected_failure(abort_code = ttt::ENotFinished)] + fun burn_unfinished_game() { + let mut ts = ts::begin(ALICE); + + ttt::new(ALICE, BOB, ts.ctx()); + ts.place_mark(ALICE, 1, 1); + + ts.next_tx(BOB); + let game: ttt::Game = ts.take_shared(); + game.burn(); + abort 0 + } + + // === Test Helpers === + use fun place_mark as Scenario.place_mark; + + // The current player places a mark at the given location. + fun place_mark(ts: &mut Scenario, player: address, row: u8, col: u8) { + ts.next_tx(player); + + let mut game: ttt::Game = ts.take_shared(); + game.place_mark(row, col, ts.ctx()); + ts::return_shared(game); + } +} From e8fc1d39d4bab8f75f8ec8aa3abde3e886c7c098 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Mon, 8 Jul 2024 14:35:48 +0100 Subject: [PATCH 02/24] fixup: Smart contract -- stale comments in shared.move --- examples/tic-tac-toe/move/sources/shared.move | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/examples/tic-tac-toe/move/sources/shared.move b/examples/tic-tac-toe/move/sources/shared.move index 22e5efd60013f..94edcb9cd6bc6 100644 --- a/examples/tic-tac-toe/move/sources/shared.move +++ b/examples/tic-tac-toe/move/sources/shared.move @@ -108,10 +108,7 @@ module tic_tac_toe::shared { assert!(game.ended() == TROPHY_NONE, EAlreadyFinished); assert!(row < 3 && col < 3, EInvalidLocation); - // Confirm that the mark is from the player we expect -- it should not - // be possible to hit this assertion, because the `Mark`s can only be - // created by the address that owns the `TurnCap` which cannot be - // transferred, and is always held by `game.next_player()`. + // Confirm that the mark is from the player we expect. let (me, them, sentinel) = game.next_player(); assert!(me == ctx.sender(), EWrongPlayer); @@ -122,8 +119,7 @@ module tic_tac_toe::shared { *(&mut game[row, col]) = sentinel; game.turn = game.turn + 1; - // Check win condition -- if there is a winner, send them the trophy, - // otherwise, create a new turn cap and send that to the next player. + // Check win condition -- if there is a winner, send them the trophy. let end = game.ended(); if (end == TROPHY_WIN) { transfer::transfer(game.mint_trophy(end, them, ctx), me); From 7bb12a4b833f0cc084af2c3707b1aebf85cbd533 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Tue, 9 Jul 2024 13:05:59 +0100 Subject: [PATCH 03/24] fixup: clever errors --- examples/tic-tac-toe/move/sources/owned.move | 25 +++++++++------- examples/tic-tac-toe/move/sources/shared.move | 30 +++++++++++-------- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/examples/tic-tac-toe/move/sources/owned.move b/examples/tic-tac-toe/move/sources/owned.move index 6562b16aa86f0..18e0ecbcd3ebb 100644 --- a/examples/tic-tac-toe/move/sources/owned.move +++ b/examples/tic-tac-toe/move/sources/owned.move @@ -101,20 +101,25 @@ module tic_tac_toe::owned { // === Errors === - /// Move was for a position that doesn't exist on the board. - const EInvalidLocation: u64 = 0; + #[error] + const EInvalidLocation: vector = + b"Move was for a position that doesn't exist on the board"; - /// Game expected a move from another player. - const EWrongPlayer: u64 = 1; + #[error] + const EWrongPlayer: vector = + b"Game expected a move from another player"; - /// Game has not reached an end condition. - const ENotFinished: u64 = 2; + #[error] + const ENotFinished: vector = + b"Game has not reached an end condition"; - /// Can't place a mark on a finished game. - const EAlreadyFinished: u64 = 3; + #[error] + const EAlreadyFinished: vector = + b"Can't place a mark on a finished game"; - /// Game reached an end state that wasn't expected. - const EInvalidEndState: u64 = 4; + #[error] + const EInvalidEndState: vector = + b"Game reached an end state that wasn't expected"; // === Public Functions === diff --git a/examples/tic-tac-toe/move/sources/shared.move b/examples/tic-tac-toe/move/sources/shared.move index 94edcb9cd6bc6..5e3ffa7e0c22d 100644 --- a/examples/tic-tac-toe/move/sources/shared.move +++ b/examples/tic-tac-toe/move/sources/shared.move @@ -61,23 +61,29 @@ module tic_tac_toe::shared { // === Errors === - /// Move was for a position that doesn't exist on the board. - const EInvalidLocation: u64 = 0; + #[error] + const EInvalidLocation: vector = + b"Move was for a position that doesn't exist on the board."; - /// Game expected a move from another player. - const EWrongPlayer: u64 = 1; + #[error] + const EWrongPlayer: vector = + b"Game expected a move from another player"; - /// Attempt to place mark on a filled slot. - const EAlreadyFilled: u64 = 2; + #[error] + const EAlreadyFilled: vector = + b"Attempted to place a mark on a filled slot."; - /// Game has not reached an end condition. - const ENotFinished: u64 = 3; + #[error] + const ENotFinished: vector = + b"Game has not reached an end condition."; - /// Can't place a mark on a finished game. - const EAlreadyFinished: u64 = 4; + #[error] + const EAlreadyFinished: vector = + b"Can't place a mark on a finished game."; - /// Game reached an end state that wasn't expected. - const EInvalidEndState: u64 = 5; + #[error] + const EInvalidEndState: vector = + b"Game reached an end state that wasn't expected."; // === Public Functions === From 53cd199b3583daaa2d88101c6deeb77b68c5107e Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Wed, 10 Jul 2024 20:29:45 +0100 Subject: [PATCH 04/24] [Move] fixup: remove some vertical whitespace --- examples/tic-tac-toe/move/sources/owned.move | 10 ---------- examples/tic-tac-toe/move/sources/shared.move | 9 --------- 2 files changed, 19 deletions(-) diff --git a/examples/tic-tac-toe/move/sources/owned.move b/examples/tic-tac-toe/move/sources/owned.move index 18e0ecbcd3ebb..5d4a4955192cf 100644 --- a/examples/tic-tac-toe/move/sources/owned.move +++ b/examples/tic-tac-toe/move/sources/owned.move @@ -26,19 +26,14 @@ module tic_tac_toe::owned { /// The state of an active game of tic-tac-toe. public struct Game has key, store { id: UID, - /// Marks on the board. board: vector, - /// The next turn to be played. turn: u8, - /// The address expected to send moves on behalf of X. x: address, - /// The address expected to send moves on behalf of O. o: address, - /// Public key of the admin address. admin: vector, } @@ -62,16 +57,12 @@ module tic_tac_toe::owned { /// is one, or to both players in the case of a draw. public struct Trophy has key { id: UID, - /// Whether the game was won or drawn. status: u8, - /// The state of the board at the end of the game. board: vector, - /// The number of turns played turn: u8, - /// The other player (relative to the player who owns this Trophy). other: address, } @@ -135,7 +126,6 @@ module tic_tac_toe::owned { MARK__, MARK__, MARK__, MARK__, MARK__, MARK__, ], - turn: 0, x, o, diff --git a/examples/tic-tac-toe/move/sources/shared.move b/examples/tic-tac-toe/move/sources/shared.move index 5e3ffa7e0c22d..50725aeb7efbe 100644 --- a/examples/tic-tac-toe/move/sources/shared.move +++ b/examples/tic-tac-toe/move/sources/shared.move @@ -15,16 +15,12 @@ module tic_tac_toe::shared { /// The state of an active game of tic-tac-toe. public struct Game has key { id: UID, - /// Marks on the board. board: vector, - /// The next turn to be played. turn: u8, - /// The address expected to send moves on behalf of X. x: address, - /// The address expected to send moves on behalf of O. o: address, } @@ -33,16 +29,12 @@ module tic_tac_toe::shared { /// is one, or to both players in the case of a draw. public struct Trophy has key { id: UID, - /// Whether the game was won or drawn. status: u8, - /// The state of the board at the end of the game. board: vector, - /// The number of turns played turn: u8, - /// The other player (relative to the player who owns this Trophy). other: address, } @@ -97,7 +89,6 @@ module tic_tac_toe::shared { MARK__, MARK__, MARK__, MARK__, MARK__, MARK__, ], - turn: 0, x, o, From 16836c602b4b3bbbb9457f919e1ec8cc11741d26 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Thu, 11 Jul 2024 11:47:33 +0100 Subject: [PATCH 05/24] fixup: test_only for tests --- examples/tic-tac-toe/move/tests/owned_tests.move | 1 + examples/tic-tac-toe/move/tests/shared_tests.move | 1 + 2 files changed, 2 insertions(+) diff --git a/examples/tic-tac-toe/move/tests/owned_tests.move b/examples/tic-tac-toe/move/tests/owned_tests.move index 76576db201508..4cc55f0f94de6 100644 --- a/examples/tic-tac-toe/move/tests/owned_tests.move +++ b/examples/tic-tac-toe/move/tests/owned_tests.move @@ -1,6 +1,7 @@ // Copyright (c) Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 +#[test_only] module tic_tac_toe::owned_tests { use sui::test_scenario::{Self as ts, Scenario}; use sui::transfer::Receiving; diff --git a/examples/tic-tac-toe/move/tests/shared_tests.move b/examples/tic-tac-toe/move/tests/shared_tests.move index a9f53b345b03b..dbc86c0dfbfb7 100644 --- a/examples/tic-tac-toe/move/tests/shared_tests.move +++ b/examples/tic-tac-toe/move/tests/shared_tests.move @@ -1,6 +1,7 @@ // Copyright (c) Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 +#[test_only] module tic_tac_toe::shared_tests { use sui::test_scenario::{Self as ts, Scenario}; use tic_tac_toe::shared as ttt; From 56d308ad1831c2df305a610be6d30b8eb97be36f Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Thu, 4 Jul 2024 14:26:55 +0100 Subject: [PATCH 06/24] [Examples/Tic-Tac-Toe] Front-end ## Description Build front-ends for shared and multi-sig tic-tac-toe, using `create-react-dapp`. ## Test plan Manually tested, (screenshots TBD). --- examples/tic-tac-toe/scripts/publish.sh | 71 + examples/tic-tac-toe/ui/README.md | 47 + examples/tic-tac-toe/ui/index.html | 59 + examples/tic-tac-toe/ui/package.json | 39 + examples/tic-tac-toe/ui/pnpm-lock.yaml | 3798 +++++++++++++++++ examples/tic-tac-toe/ui/prettier.config.cjs | 3 + examples/tic-tac-toe/ui/src/App.css | 4 + examples/tic-tac-toe/ui/src/App.tsx | 79 + examples/tic-tac-toe/ui/src/MultiSig.ts | 26 + .../tic-tac-toe/ui/src/components/Board.tsx | 70 + .../ui/src/components/ComputedField.css | 3 + .../ui/src/components/ComputedField.tsx | 52 + .../tic-tac-toe/ui/src/components/Error.tsx | 33 + .../tic-tac-toe/ui/src/components/IDLink.tsx | 53 + .../tic-tac-toe/ui/src/components/Loading.tsx | 27 + .../ui/src/components/NewMultiSigGame.tsx | 137 + .../ui/src/components/NewSharedGame.tsx | 117 + examples/tic-tac-toe/ui/src/config.ts | 42 + examples/tic-tac-toe/ui/src/env.localnet.ts | 7 + .../tic-tac-toe/ui/src/hooks/useExecutor.ts | 46 + .../tic-tac-toe/ui/src/hooks/useGameQuery.ts | 109 + .../ui/src/hooks/useObjectQuery.ts | 29 + .../ui/src/hooks/useTransactions.ts | 119 + .../ui/src/hooks/useTrophyQuery.ts | 61 + .../ui/src/hooks/useTurnCapQuery.ts | 78 + examples/tic-tac-toe/ui/src/main.tsx | 35 + examples/tic-tac-toe/ui/src/pages/Game.css | 25 + examples/tic-tac-toe/ui/src/pages/Game.tsx | 414 ++ examples/tic-tac-toe/ui/src/pages/Root.tsx | 56 + examples/tic-tac-toe/ui/src/vite-env.d.ts | 1 + examples/tic-tac-toe/ui/tsconfig.json | 26 + examples/tic-tac-toe/ui/tsconfig.node.json | 10 + examples/tic-tac-toe/ui/vite.config.ts | 8 + pnpm-workspace.yaml | 1 + 34 files changed, 5685 insertions(+) create mode 100755 examples/tic-tac-toe/scripts/publish.sh create mode 100644 examples/tic-tac-toe/ui/README.md create mode 100644 examples/tic-tac-toe/ui/index.html create mode 100644 examples/tic-tac-toe/ui/package.json create mode 100644 examples/tic-tac-toe/ui/pnpm-lock.yaml create mode 100644 examples/tic-tac-toe/ui/prettier.config.cjs create mode 100644 examples/tic-tac-toe/ui/src/App.css create mode 100644 examples/tic-tac-toe/ui/src/App.tsx create mode 100644 examples/tic-tac-toe/ui/src/MultiSig.ts create mode 100644 examples/tic-tac-toe/ui/src/components/Board.tsx create mode 100644 examples/tic-tac-toe/ui/src/components/ComputedField.css create mode 100644 examples/tic-tac-toe/ui/src/components/ComputedField.tsx create mode 100644 examples/tic-tac-toe/ui/src/components/Error.tsx create mode 100644 examples/tic-tac-toe/ui/src/components/IDLink.tsx create mode 100644 examples/tic-tac-toe/ui/src/components/Loading.tsx create mode 100644 examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx create mode 100644 examples/tic-tac-toe/ui/src/components/NewSharedGame.tsx create mode 100644 examples/tic-tac-toe/ui/src/config.ts create mode 100644 examples/tic-tac-toe/ui/src/env.localnet.ts create mode 100644 examples/tic-tac-toe/ui/src/hooks/useExecutor.ts create mode 100644 examples/tic-tac-toe/ui/src/hooks/useGameQuery.ts create mode 100644 examples/tic-tac-toe/ui/src/hooks/useObjectQuery.ts create mode 100644 examples/tic-tac-toe/ui/src/hooks/useTransactions.ts create mode 100644 examples/tic-tac-toe/ui/src/hooks/useTrophyQuery.ts create mode 100644 examples/tic-tac-toe/ui/src/hooks/useTurnCapQuery.ts create mode 100644 examples/tic-tac-toe/ui/src/main.tsx create mode 100644 examples/tic-tac-toe/ui/src/pages/Game.css create mode 100644 examples/tic-tac-toe/ui/src/pages/Game.tsx create mode 100644 examples/tic-tac-toe/ui/src/pages/Root.tsx create mode 100644 examples/tic-tac-toe/ui/src/vite-env.d.ts create mode 100644 examples/tic-tac-toe/ui/tsconfig.json create mode 100644 examples/tic-tac-toe/ui/tsconfig.node.json create mode 100644 examples/tic-tac-toe/ui/vite.config.ts diff --git a/examples/tic-tac-toe/scripts/publish.sh b/examples/tic-tac-toe/scripts/publish.sh new file mode 100755 index 0000000000000..4550f4e3a4066 --- /dev/null +++ b/examples/tic-tac-toe/scripts/publish.sh @@ -0,0 +1,71 @@ +#! /usr/bin/env bash +# Copyright (c) Mysten Labs, Inc. +# SPDX-License-Identifier: Apache-2.0 + +set -e + +# Change to the script's directory. +cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null + +# Check dependencies are available. +SUI=${SUI:-sui} +for i in jq $SUI; do + if ! command -V ${i} &>/dev/null; then + echo "${i} is not installed" + exit 1 + fi +done + +# Make sure an environment was provided, and switch to it +if [ -z "$1" ]; then + echo "Error: No environment provided." + exit 1 +fi +ENV=$1 +$SUI client switch --env $ENV + +MOVE_PACKAGE_PATH=../move +PUBLISH=$( + $SUI client ptb \ + --publish ../move --assign cap \ + --transfer-objects [cap] "@$($SUI client active-address)" \ + --json +) + +STATUS=$( + echo $PUBLISH | + jq -r '.effects.status.status' +) + +if [[ $STATUS != "success" ]]; then + echo "Error: Move contract publishing failed. Status:" + echo $PUBLISH | jq '.effects.status' + exit 1 +fi + +PACKAGE_ID=$( + echo $PUBLISH | + jq -r '.objectChanges[] | select(.type == "published") | .packageId' +) + +UPGRADE_CAP=$( + echo $PUBLISH | + jq -r '.objectChanges[] + | select(.type == "created") + | select(.objectType | contains("0x2::package::UpgradeCap")) + | .objectId' +) + +CONFIG="$(readlink -f ../ui/src)/env.$ENV.ts" +cat > $CONFIG <<-EOF +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +export default { + packageId: "$PACKAGE_ID", + upgradeCap: "$UPGRADE_CAP", +}; +EOF + +echo "Contract Deployment finished!" +echo "Details written to $CONFIG" diff --git a/examples/tic-tac-toe/ui/README.md b/examples/tic-tac-toe/ui/README.md new file mode 100644 index 0000000000000..08fbd7706ccaa --- /dev/null +++ b/examples/tic-tac-toe/ui/README.md @@ -0,0 +1,47 @@ +# Tic-Tac-Toe Front-end + +This demo app showcases two versions of on-chain tic-tac-toe. One version +utilizes shared objects for coordination between players, while the other uses +owned objects and multi-sigs functionality. + +This part of the demo illustrates how to: + +- Set-up an application to interact with a blockchain, using the Sui + TypeScript SDK and dApp-kit, including deploying its Move packages. +- Build UIs that represent on-chain data, and update in response to running + transactions. +- Interact with multi-sig accounts. + +This dApp was created using `@mysten/create-dapp` that sets up a basic React +Client dApp using the following tools: + +- [React](https://react.dev/) as the UI framework +- [TypeScript](https://www.typescriptlang.org/) for type checking +- [Vite](https://vitejs.dev/) for build tooling +- [Radix UI](https://www.radix-ui.com/) for pre-built UI components +- [ESLint](https://eslint.org/) +- [`@mysten/dapp-kit`](https://sdk.mystenlabs.com/dapp-kit) for connecting to + wallets and loading data +- [pnpm](https://pnpm.io/) for package management + +## Starting your dApp + +To install dependencies you can run + +```bash +pnpm install +``` + +To start your dApp in development mode run + +```bash +pnpm dev +``` + +## Building + +To build your app for deployment you can run + +```bash +pnpm build +``` diff --git a/examples/tic-tac-toe/ui/index.html b/examples/tic-tac-toe/ui/index.html new file mode 100644 index 0000000000000..c8cc615bf2590 --- /dev/null +++ b/examples/tic-tac-toe/ui/index.html @@ -0,0 +1,59 @@ + + + + + + + Tic Tac Toe + + + + +
+ + + diff --git a/examples/tic-tac-toe/ui/package.json b/examples/tic-tac-toe/ui/package.json new file mode 100644 index 0000000000000..06c528cfb551b --- /dev/null +++ b/examples/tic-tac-toe/ui/package.json @@ -0,0 +1,39 @@ +{ + "name": "tic-tac-toe", + "private": true, + "version": "0.0.0", + "type": "module", + "license": "Apache-2.0", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@mysten/dapp-kit": "0.14.9", + "@mysten/sui": "1.1.2", + "@radix-ui/colors": "^3.0.0", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/themes": "^3.0.0", + "@tanstack/react-query": "^5.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hot-toast": "^2.4.1" + }, + "devDependencies": { + "@tanstack/react-query-devtools": "^5.0.0", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.1.0", + "@typescript-eslint/parser": "^6.1.0", + "@vitejs/plugin-react-swc": "^3.3.2", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "prettier": "^3.0.0", + "typescript": "^5.3.3", + "vite": "^4.4.4", + "vite-tsconfig-paths": "^4.3.2" + } +} diff --git a/examples/tic-tac-toe/ui/pnpm-lock.yaml b/examples/tic-tac-toe/ui/pnpm-lock.yaml new file mode 100644 index 0000000000000..f2f9d1b09f4de --- /dev/null +++ b/examples/tic-tac-toe/ui/pnpm-lock.yaml @@ -0,0 +1,3798 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@mysten/dapp-kit': + specifier: 0.14.3 + version: 0.14.3(@tanstack/react-query@5.40.0(react@18.3.1))(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(svelte@4.2.17)(typescript@5.4.5) + '@mysten/sui': + specifier: 1.0.3 + version: 1.0.3(svelte@4.2.17)(typescript@5.4.5) + '@radix-ui/colors': + specifier: ^3.0.0 + version: 3.0.0 + '@radix-ui/react-icons': + specifier: ^1.3.0 + version: 1.3.0(react@18.3.1) + '@radix-ui/themes': + specifier: ^2.0.0 + version: 2.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.0.0 + version: 5.40.0(react@18.3.1) + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + devDependencies: + '@types/react': + specifier: ^18.2.15 + version: 18.3.3 + '@types/react-dom': + specifier: ^18.2.7 + version: 18.3.0 + '@typescript-eslint/eslint-plugin': + specifier: ^6.1.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^6.1.0 + version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@vitejs/plugin-react-swc': + specifier: ^3.3.2 + version: 3.7.0(vite@4.5.3) + eslint: + specifier: ^8.45.0 + version: 8.57.0 + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.2(eslint@8.57.0) + eslint-plugin-react-refresh: + specifier: ^0.4.3 + version: 0.4.7(eslint@8.57.0) + prettier: + specifier: ^3.0.0 + version: 3.2.5 + typescript: + specifier: ^5.3.3 + version: 5.4.5 + vite: + specifier: ^4.4.4 + version: 4.5.3 + +packages: + + '@0no-co/graphql.web@1.0.7': + resolution: {integrity: sha512-E3Qku4mTzdrlwVWGPxklDnME5ANrEGetvYw4i2GCRlppWXXE4QD66j7pwb8HelZwS6LnqEChhrSOGCXpbiu6MQ==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + + '@0no-co/graphqlsp@1.12.5': + resolution: {integrity: sha512-YS9s8sf3XLaVdBt33u1mbUdfUSLiarQW1SFd3ITh2CLWz1nVnVTN0oCrpepuFHUJ7rt+b6Gk14sgjP4ONdeZfQ==} + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/helper-string-parser@7.24.6': + resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.6': + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.6': + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.24.6': + resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.6': + resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} + engines: {node: '>=6.9.0'} + + '@emotion/hash@0.9.1': + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@floating-ui/core@1.6.2': + resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + + '@floating-ui/dom@1.6.5': + resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} + + '@floating-ui/react-dom@2.1.0': + resolution: {integrity: sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.2': + resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + + '@gql.tada/cli-utils@1.3.9': + resolution: {integrity: sha512-oRb7SG/+csx9CiypSJTI21KaLfulOUnhX1vxg4FXi2snub9XShkGR2XnnlJVTAOZXY9Vcxti1NutAElxdDkycA==} + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + + '@gql.tada/internal@1.0.0': + resolution: {integrity: sha512-B55aIYyZn5ewdgMqoJciPAwF5DKYX6HBabTU+ap/dpNH3EgJrLomc8Y8w+MCxCyOx+dXL9OduT6eWnVr7J7Eyg==} + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@mysten/bcs@1.0.0': + resolution: {integrity: sha512-GhdAFPJZztnlFF2bFrjprjreCGpYtN3LMVCrWjLTT44xwwafphFqTYQEgCHkqGobg05P2EBoG7cMcF3skmkPwg==} + + '@mysten/dapp-kit@0.14.3': + resolution: {integrity: sha512-iOEOBJ7VR/zkaA5rkYliUNtZAOP7scEDHBpq2Px5rApleEkoMGX09fgxRPDfIj3dZ467NyvEOKgebU+kpfvj4w==} + peerDependencies: + '@tanstack/react-query': ^5.0.0 + react: '*' + + '@mysten/sui@1.0.3': + resolution: {integrity: sha512-mkz0QwbHvhuXtiPhdQA47nXeH4M2aKMNeFBE7F+4RSWeMXa4g4ojrXURI2OAc9KZc1qFxas7ZcZKAbF3qto72w==} + engines: {node: '>=18'} + + '@mysten/wallet-standard@0.12.3': + resolution: {integrity: sha512-bbObcLV0gVdH56kbCZ8ZoSU+6ll4Ihvh1ShigPgKcpfvRCHMd16VOQ8X6WwPC8RoQx26rcQVxrejmH8H8ATBrw==} + + '@mysten/zksend@0.9.3': + resolution: {integrity: sha512-MkVCUCG7xLky3lYDf0ZgX7Vif3PA4yGYo8J1YpQiJ6XYnHh/kNVxkJFc8M9pCfDGko6neCzYVVXdGscCfAKHPg==} + + '@noble/curves@1.4.0': + resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@radix-ui/colors@3.0.0': + resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} + + '@radix-ui/number@1.0.1': + resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} + + '@radix-ui/primitive@1.0.1': + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + + '@radix-ui/react-accessible-icon@1.0.3': + resolution: {integrity: sha512-duVGKeWPSUILr/MdlPxV+GeULTc2rS1aihGdQ3N2qCUPMgxYLxvAsHJM3mCVLF8d5eK+ympmB22mb1F3a5biNw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-alert-dialog@1.0.5': + resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-arrow@1.0.3': + resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-aspect-ratio@1.0.3': + resolution: {integrity: sha512-fXR5kbMan9oQqMuacfzlGG/SQMcmMlZ4wrvpckv8SgUulD0MMpspxJrxg/Gp/ISV3JfV1AeSWTYK9GvxA4ySwA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-avatar@1.0.4': + resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-checkbox@1.0.4': + resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.0.3': + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.0.1': + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context-menu@2.1.5': + resolution: {integrity: sha512-R5XaDj06Xul1KGb+WP8qiOh7tKJNz2durpLBXAGZjSVtctcRFCuEvy2gtMwRJGePwQQE5nV77gs4FwRi8T+r2g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-context@1.0.1': + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.0.5': + resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.0.1': + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.0.5': + resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.0.6': + resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.0.1': + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.0.4': + resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-form@0.0.3': + resolution: {integrity: sha512-kgE+Z/haV6fxE5WqIXj05KkaXa3OkZASoTDy25yX2EIp/x0c54rOH/vFr5nOZTg7n7T1z8bSyXmiVIFP9bbhPQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-hover-card@1.0.7': + resolution: {integrity: sha512-OcUN2FU0YpmajD/qkph3XzMcK/NmSk9hGWnjV68p6QiZMgILugusgQwnLSDs3oFSJYGKf3Y49zgFedhGh04k9A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-icons@1.3.0': + resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==} + peerDependencies: + react: ^16.x || ^17.x || ^18.x + + '@radix-ui/react-id@1.0.1': + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.0.2': + resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menu@2.0.6': + resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.0.7': + resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.1.3': + resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.0.4': + resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.0.1': + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@1.0.3': + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-radio-group@1.1.3': + resolution: {integrity: sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.0.4': + resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-scroll-area@1.0.5': + resolution: {integrity: sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.0.0': + resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.0.3': + resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slider@1.1.2': + resolution: {integrity: sha512-NKs15MJylfzVsCagVSWKhGGLNR1W9qWs+HtgbmjjVUB3B9+lb3PYoXxVju3kOrpf0VKyVCtZp+iTwVoqpa1Chw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.0.2': + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.0.3': + resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tabs@1.0.4': + resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.0.7': + resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.0.1': + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.0.1': + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.0.3': + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.0.1': + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.0.1': + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.0.1': + resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.0.1': + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.0.3': + resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.0.1': + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + + '@radix-ui/themes@2.0.3': + resolution: {integrity: sha512-yaXQ8aWT2P1CQ0Xe6YCRD9HXsfMTvKkrIYkrc4aitCzhGTLS0sjtTqKmrxIWMVA+3DIbEuG9K/8aAMRJBhep8g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@scure/base@1.1.6': + resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} + + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + + '@suchipi/femver@1.0.0': + resolution: {integrity: sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==} + + '@swc/core-darwin-arm64@1.5.24': + resolution: {integrity: sha512-M7oLOcC0sw+UTyAuL/9uyB9GeO4ZpaBbH76JSH6g1m0/yg7LYJZGRmplhDmwVSDAR5Fq4Sjoi1CksmmGkgihGA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.5.24': + resolution: {integrity: sha512-MfcFjGGYognpSBSos2pYUNYJSmqEhuw5ceGr6qAdME7ddbjGXliza4W6FggsM+JnWwpqa31+e7/R+GetW4WkaQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.5.24': + resolution: {integrity: sha512-amI2pwtcWV3E/m/nf+AQtn1LWDzKLZyjCmWd3ms7QjEueWYrY8cU1Y4Wp7wNNsxIoPOi8zek1Uj2wwFD/pttNQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.5.24': + resolution: {integrity: sha512-sTSvmqMmgT1ynH/nP75Pc51s+iT4crZagHBiDOf5cq+kudUYjda9lWMs7xkXB/TUKFHPCRK0HGunl8bkwiIbuw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.5.24': + resolution: {integrity: sha512-vd2/hfOBGbrX21FxsFdXCUaffjkHvlZkeE2UMRajdXifwv79jqOHIJg3jXG1F3ZrhCghCzirFts4tAZgcG8XWg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.5.24': + resolution: {integrity: sha512-Zrdzi7NqzQxm2BvAG5KyOSBEggQ7ayrxh599AqqevJmsUXJ8o2nMiWQOBvgCGp7ye+Biz3pvZn1EnRzAp+TpUg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.5.24': + resolution: {integrity: sha512-1F8z9NRi52jdZQCGc5sflwYSctL6omxiVmIFVp8TC9nngjQKc00TtX/JC2Eo2HwvgupkFVl5YQJidAck9YtmJw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.5.24': + resolution: {integrity: sha512-cKpP7KvS6Xr0jFSTBXY53HZX/YfomK5EMQYpCVDOvfsZeYHN20sQSKXfpVLvA/q2igVt1zzy1XJcOhpJcgiKLg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.5.24': + resolution: {integrity: sha512-IoPWfi0iwqjZuf7gE223+B97/ZwkKbu7qL5KzGP7g3hJrGSKAvv7eC5Y9r2iKKtLKyv5R/T6Ho0kFR/usi7rHw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.5.24': + resolution: {integrity: sha512-zHgF2k1uVJL8KIW+PnVz1To4a3Cz9THbh2z2lbehaF/gKHugH4c3djBozU4das1v35KOqf5jWIEviBLql2wDLQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.5.24': + resolution: {integrity: sha512-Eph9zvO4xvqWZGVzTdtdEJ0Vqf0VIML/o/e4Qd2RLOqtfgnlRi7avmMu5C0oqciJ0tk+hqdUKVUZ4JPoPaiGvQ==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.7': + resolution: {integrity: sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ==} + + '@tanstack/query-core@5.40.0': + resolution: {integrity: sha512-eD8K8jsOIq0Z5u/QbvOmfvKKE/XC39jA7yv4hgpl/1SRiU+J8QCIwgM/mEHuunQsL87dcvnHqSVLmf9pD4CiaA==} + + '@tanstack/react-query@5.40.0': + resolution: {integrity: sha512-iv/W0Axc4aXhFzkrByToE1JQqayxTPNotCoSCnarR/A1vDIHaoKpg7FTIfP3Ev2mbKn1yrxq0ZKYUdLEJxs6Tg==} + peerDependencies: + react: ^18.0.0 + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vanilla-extract/css@1.15.2': + resolution: {integrity: sha512-Bi61iCAtojCuqvV+FYaF5i69vBjuMQJpHPdpgKYyQvx+e2Hp79V0ELglyYOdcyg9Wh0k0MFwgCDipVd7EloTXQ==} + + '@vanilla-extract/dynamic@2.1.1': + resolution: {integrity: sha512-iqf736036ujEIKsIq28UsBEMaLC2vR2DhwKyrG3NDb/fRy9qL9FKl1TqTtBV4daU30Uh3saeik4vRzN8bzQMbw==} + + '@vanilla-extract/private@1.0.5': + resolution: {integrity: sha512-6YXeOEKYTA3UV+RC8DeAjFk+/okoNz/h88R+McnzA2zpaVqTR/Ep+vszkWYlGBcMNO7vEkqbq5nT/JMMvhi+tw==} + + '@vanilla-extract/recipes@0.5.3': + resolution: {integrity: sha512-SPREq1NmaoKuvJeOV0pppOkwy3pWZUoDufsyQ6iHrbkHhAU7XQqG9o0iZSmg5JoVgDLIiOr9djQb0x9wuxig7A==} + peerDependencies: + '@vanilla-extract/css': ^1.0.0 + + '@vitejs/plugin-react-swc@3.7.0': + resolution: {integrity: sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==} + peerDependencies: + vite: ^4 || ^5 + + '@volar/language-core@2.2.5': + resolution: {integrity: sha512-2htyAuxRrAgETmFeUhT4XLELk3LiEcqoW/B8YUXMF6BrGWLMwIR09MFaZYvrA2UhbdAeSyeQ726HaWSWkexUcQ==} + + '@volar/source-map@2.2.5': + resolution: {integrity: sha512-wrOEIiZNf4E+PWB0AxyM4tfhkfldPsb3bxg8N6FHrxJH2ohar7aGu48e98bp3pR9HUA7P/pR9VrLmkTrgCCnWQ==} + + '@vue/compiler-core@3.4.27': + resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} + + '@vue/compiler-dom@3.4.27': + resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} + + '@vue/language-core@2.0.19': + resolution: {integrity: sha512-A9EGOnvb51jOvnCYoRLnMP+CcoPlbZVxI9gZXE/y2GksRWM6j/PrLEIC++pnosWTN08tFpJgxhSS//E9v/Sg+Q==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/shared@3.4.27': + resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} + + '@wallet-standard/app@1.0.1': + resolution: {integrity: sha512-LnLYq2Vy2guTZ8GQKKSXQK3+FRGPil75XEdkZqE6fiLixJhZJoJa5hT7lXxwe0ykVTt9LEThdTbOpT7KadS26Q==} + engines: {node: '>=16'} + + '@wallet-standard/base@1.0.1': + resolution: {integrity: sha512-1To3ekMfzhYxe0Yhkpri+Fedq0SYcfrOfJi3vbLjMwF2qiKPjTGLwZkf2C9ftdQmxES+hmxhBzTwF4KgcOwf8w==} + engines: {node: '>=16'} + + '@wallet-standard/core@1.0.3': + resolution: {integrity: sha512-Jb33IIjC1wM1HoKkYD7xQ6d6PZ8EmMZvyc8R7dFgX66n/xkvksVTW04g9yLvQXrLFbcIjHrCxW6TXMhvpsAAzg==} + engines: {node: '>=16'} + + '@wallet-standard/features@1.0.3': + resolution: {integrity: sha512-m8475I6W5LTatTZuUz5JJNK42wFRgkJTB0I9tkruMwfqBF2UN2eomkYNVf9RbrsROelCRzSFmugqjKZBFaubsA==} + engines: {node: '>=16'} + + '@wallet-standard/wallet@1.0.1': + resolution: {integrity: sha512-qkhJeuQU2afQTZ02yMZE5SFc91Fo3hyFjFkpQglHudENNyiSG0oUKcIjky8X32xVSaumgTZSQUAzpXnCTWHzKQ==} + engines: {node: '>=16'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + axobject-query@4.0.0: + resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@4.0.0: + resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} + + bech32@2.0.0: + resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + code-red@1.0.4: + resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dedent-js@1.0.1: + resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} + + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react-refresh@0.4.7: + resolution: {integrity: sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw==} + peerDependencies: + eslint: '>=7' + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gql.tada@1.7.5: + resolution: {integrity: sha512-GepPTee+FWSVVZQ7GiJHzsGNo7gOb59kcn4mUPYLlkbpeJfOUwpuoB05ZNaXG0W4qZVPd1I7R2UgMHBjY1lGlQ==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql@16.8.1: + resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + media-query-parser@2.0.2: + resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + modern-ahocorasick@1.0.1: + resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanostores@0.9.5: + resolution: {integrity: sha512-Z+p+g8E7yzaWwOe5gEUB2Ox0rCEeXWYIZWmYvw/ajNYX8DlXdMvMDj8DWfM/subqPAcsf8l8Td4iAwO1DeIIRQ==} + engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-remove-scroll-bar@2.3.6: + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.5.5: + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.1: + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + 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'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + svelte2tsx@0.7.9: + resolution: {integrity: sha512-Rm+0LAwg9wT4H2IsR8EaM9EWErTzi9LmuZKxkH5b1ua94XjQmwHstBP4VabLgA9AE6XmwBg+xK7Cjzwfm6ustQ==} + peerDependencies: + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 + typescript: ^4.9.4 || ^5.0.0 + + svelte@4.2.17: + resolution: {integrity: sha512-N7m1YnoXtRf5wya5Gyx3TWuTddI4nAyayyIWFojiWV5IayDYNV5i2mRp/7qNGol4DtxEYxljmrbgp1HM6hUbmQ==} + engines: {node: '>=16'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-callback-ref@1.3.2: + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.2: + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + valibot@0.25.0: + resolution: {integrity: sha512-cmD0ca15oyAbT75iYLNW6uU6doAeIwYfOshpXka/E1Bx4frzbkrgb7gvkI7K0YK/DVOksei4FfxWfRoBP3NFTg==} + + vite@4.5.3: + resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zustand@4.5.2: + resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} + 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 + +snapshots: + + '@0no-co/graphql.web@1.0.7(graphql@16.8.1)': + optionalDependencies: + graphql: 16.8.1 + + '@0no-co/graphqlsp@1.12.5(graphql@16.8.1)(typescript@5.4.5)': + dependencies: + '@gql.tada/internal': 1.0.0(graphql@16.8.1)(typescript@5.4.5) + graphql: 16.8.1 + typescript: 5.4.5 + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/helper-string-parser@7.24.6': {} + + '@babel/helper-validator-identifier@7.24.6': {} + + '@babel/parser@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/runtime@7.24.6': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/types@7.24.6': + dependencies: + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + to-fast-properties: 2.0.0 + + '@emotion/hash@0.9.1': {} + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@floating-ui/core@1.6.2': + dependencies: + '@floating-ui/utils': 0.2.2 + + '@floating-ui/dom@1.6.5': + dependencies: + '@floating-ui/core': 1.6.2 + '@floating-ui/utils': 0.2.2 + + '@floating-ui/react-dom@2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.2': {} + + '@gql.tada/cli-utils@1.3.9(graphql@16.8.1)(svelte@4.2.17)(typescript@5.4.5)': + dependencies: + '@0no-co/graphqlsp': 1.12.5(graphql@16.8.1)(typescript@5.4.5) + '@gql.tada/internal': 1.0.0(graphql@16.8.1)(typescript@5.4.5) + '@vue/compiler-dom': 3.4.27 + '@vue/language-core': 2.0.19(typescript@5.4.5) + graphql: 16.8.1 + svelte2tsx: 0.7.9(svelte@4.2.17)(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - svelte + + '@gql.tada/internal@1.0.0(graphql@16.8.1)(typescript@5.4.5)': + dependencies: + '@0no-co/graphql.web': 1.0.7(graphql@16.8.1) + graphql: 16.8.1 + typescript: 5.4.5 + + '@graphql-typed-document-node/core@3.2.0(graphql@16.8.1)': + dependencies: + graphql: 16.8.1 + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@mysten/bcs@1.0.0': + dependencies: + bs58: 5.0.0 + + '@mysten/dapp-kit@0.14.3(@tanstack/react-query@5.40.0(react@18.3.1))(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(svelte@4.2.17)(typescript@5.4.5)': + dependencies: + '@mysten/sui': 1.0.3(svelte@4.2.17)(typescript@5.4.5) + '@mysten/wallet-standard': 0.12.3(svelte@4.2.17)(typescript@5.4.5) + '@mysten/zksend': 0.9.3(svelte@4.2.17)(typescript@5.4.5) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dropdown-menu': 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@tanstack/react-query': 5.40.0(react@18.3.1) + '@vanilla-extract/css': 1.15.2 + '@vanilla-extract/dynamic': 2.1.1 + '@vanilla-extract/recipes': 0.5.3(@vanilla-extract/css@1.15.2) + clsx: 2.1.1 + react: 18.3.1 + zustand: 4.5.2(@types/react@18.3.3)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - babel-plugin-macros + - immer + - react-dom + - svelte + - typescript + + '@mysten/sui@1.0.3(svelte@4.2.17)(typescript@5.4.5)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + '@mysten/bcs': 1.0.0 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + '@suchipi/femver': 1.0.0 + bech32: 2.0.0 + gql.tada: 1.7.5(graphql@16.8.1)(svelte@4.2.17)(typescript@5.4.5) + graphql: 16.8.1 + tweetnacl: 1.0.3 + valibot: 0.25.0 + transitivePeerDependencies: + - svelte + - typescript + + '@mysten/wallet-standard@0.12.3(svelte@4.2.17)(typescript@5.4.5)': + dependencies: + '@mysten/sui': 1.0.3(svelte@4.2.17)(typescript@5.4.5) + '@wallet-standard/core': 1.0.3 + transitivePeerDependencies: + - svelte + - typescript + + '@mysten/zksend@0.9.3(svelte@4.2.17)(typescript@5.4.5)': + dependencies: + '@mysten/sui': 1.0.3(svelte@4.2.17)(typescript@5.4.5) + '@mysten/wallet-standard': 0.12.3(svelte@4.2.17)(typescript@5.4.5) + mitt: 3.0.1 + nanostores: 0.9.5 + valibot: 0.25.0 + transitivePeerDependencies: + - svelte + - typescript + + '@noble/curves@1.4.0': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/hashes@1.4.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@radix-ui/colors@3.0.0': {} + + '@radix-ui/number@1.0.1': + dependencies: + '@babel/runtime': 7.24.6 + + '@radix-ui/primitive@1.0.1': + dependencies: + '@babel/runtime': 7.24.6 + + '@radix-ui/react-accessible-icon@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-aspect-ratio@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-avatar@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-collection@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-context-menu@2.1.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-context@1.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-dialog@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-direction@1.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-form@0.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-label': 2.0.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-hover-card@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-icons@1.3.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@radix-ui/react-id@1.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-label@2.0.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-menu@2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-popover@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-popper@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/rect': 1.0.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-portal@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-radio-group@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-scroll-area@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-select@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-separator@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-slider@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-slot@1.0.2(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-switch@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-tabs@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-previous@1.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-rect@1.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/rect': 1.0.1 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-size@1.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/rect@1.0.1': + dependencies: + '@babel/runtime': 7.24.6 + + '@radix-ui/themes@2.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/colors': 3.0.0 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-accessible-icon': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-alert-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-aspect-ratio': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-avatar': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-checkbox': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-context-menu': 2.1.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dropdown-menu': 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-form': 0.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-hover-card': 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popover': 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-radio-group': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-scroll-area': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-select': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slider': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-switch': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tabs': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tooltip': 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@scure/base@1.1.6': {} + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.6 + + '@scure/bip39@1.3.0': + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.6 + + '@suchipi/femver@1.0.0': {} + + '@swc/core-darwin-arm64@1.5.24': + optional: true + + '@swc/core-darwin-x64@1.5.24': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.5.24': + optional: true + + '@swc/core-linux-arm64-gnu@1.5.24': + optional: true + + '@swc/core-linux-arm64-musl@1.5.24': + optional: true + + '@swc/core-linux-x64-gnu@1.5.24': + optional: true + + '@swc/core-linux-x64-musl@1.5.24': + optional: true + + '@swc/core-win32-arm64-msvc@1.5.24': + optional: true + + '@swc/core-win32-ia32-msvc@1.5.24': + optional: true + + '@swc/core-win32-x64-msvc@1.5.24': + optional: true + + '@swc/core@1.5.24': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.7 + optionalDependencies: + '@swc/core-darwin-arm64': 1.5.24 + '@swc/core-darwin-x64': 1.5.24 + '@swc/core-linux-arm-gnueabihf': 1.5.24 + '@swc/core-linux-arm64-gnu': 1.5.24 + '@swc/core-linux-arm64-musl': 1.5.24 + '@swc/core-linux-x64-gnu': 1.5.24 + '@swc/core-linux-x64-musl': 1.5.24 + '@swc/core-win32-arm64-msvc': 1.5.24 + '@swc/core-win32-ia32-msvc': 1.5.24 + '@swc/core-win32-x64-msvc': 1.5.24 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.7': + dependencies: + '@swc/counter': 0.1.3 + + '@tanstack/query-core@5.40.0': {} + + '@tanstack/react-query@5.40.0(react@18.3.1)': + dependencies: + '@tanstack/query-core': 5.40.0 + react: 18.3.1 + + '@types/estree@1.0.5': {} + + '@types/json-schema@7.0.15': {} + + '@types/prop-types@15.7.12': {} + + '@types/react-dom@18.3.0': + dependencies: + '@types/react': 18.3.3 + + '@types/react@18.3.3': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@types/semver@7.5.8': {} + + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.4 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + eslint: 8.57.0 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + '@vanilla-extract/css@1.15.2': + dependencies: + '@emotion/hash': 0.9.1 + '@vanilla-extract/private': 1.0.5 + css-what: 6.1.0 + cssesc: 3.0.0 + csstype: 3.1.3 + dedent: 1.5.3 + deep-object-diff: 1.1.9 + deepmerge: 4.3.1 + media-query-parser: 2.0.2 + modern-ahocorasick: 1.0.1 + picocolors: 1.0.1 + transitivePeerDependencies: + - babel-plugin-macros + + '@vanilla-extract/dynamic@2.1.1': + dependencies: + '@vanilla-extract/private': 1.0.5 + + '@vanilla-extract/private@1.0.5': {} + + '@vanilla-extract/recipes@0.5.3(@vanilla-extract/css@1.15.2)': + dependencies: + '@vanilla-extract/css': 1.15.2 + + '@vitejs/plugin-react-swc@3.7.0(vite@4.5.3)': + dependencies: + '@swc/core': 1.5.24 + vite: 4.5.3 + transitivePeerDependencies: + - '@swc/helpers' + + '@volar/language-core@2.2.5': + dependencies: + '@volar/source-map': 2.2.5 + + '@volar/source-map@2.2.5': + dependencies: + muggle-string: 0.4.1 + + '@vue/compiler-core@3.4.27': + dependencies: + '@babel/parser': 7.24.6 + '@vue/shared': 3.4.27 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-dom@3.4.27': + dependencies: + '@vue/compiler-core': 3.4.27 + '@vue/shared': 3.4.27 + + '@vue/language-core@2.0.19(typescript@5.4.5)': + dependencies: + '@volar/language-core': 2.2.5 + '@vue/compiler-dom': 3.4.27 + '@vue/shared': 3.4.27 + computeds: 0.0.1 + minimatch: 9.0.4 + path-browserify: 1.0.1 + vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.4.5 + + '@vue/shared@3.4.27': {} + + '@wallet-standard/app@1.0.1': + dependencies: + '@wallet-standard/base': 1.0.1 + + '@wallet-standard/base@1.0.1': {} + + '@wallet-standard/core@1.0.3': + dependencies: + '@wallet-standard/app': 1.0.1 + '@wallet-standard/base': 1.0.1 + '@wallet-standard/features': 1.0.3 + '@wallet-standard/wallet': 1.0.1 + + '@wallet-standard/features@1.0.3': + dependencies: + '@wallet-standard/base': 1.0.1 + + '@wallet-standard/wallet@1.0.1': + dependencies: + '@wallet-standard/base': 1.0.1 + + acorn-jsx@5.3.2(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn@8.11.3: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.6.2 + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + array-union@2.1.0: {} + + axobject-query@4.0.0: + dependencies: + dequal: 2.0.3 + + balanced-match@1.0.2: {} + + base-x@4.0.0: {} + + bech32@2.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bs58@5.0.0: + dependencies: + base-x: 4.0.0 + + callsites@3.1.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + classnames@2.5.1: {} + + clsx@2.1.1: {} + + code-red@1.0.4: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + '@types/estree': 1.0.5 + acorn: 8.11.3 + estree-walker: 3.0.3 + periscopic: 3.1.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + computeds@0.0.1: {} + + concat-map@0.0.1: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + de-indent@1.0.2: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + dedent-js@1.0.1: {} + + dedent@1.5.3: {} + + deep-is@0.1.4: {} + + deep-object-diff@1.1.9: {} + + deepmerge@4.3.1: {} + + dequal@2.0.3: {} + + detect-node-es@1.1.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + entities@4.5.0: {} + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-react-refresh@0.4.7(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + get-nonce@1.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + gql.tada@1.7.5(graphql@16.8.1)(svelte@4.2.17)(typescript@5.4.5): + dependencies: + '@0no-co/graphql.web': 1.0.7(graphql@16.8.1) + '@gql.tada/cli-utils': 1.3.9(graphql@16.8.1)(svelte@4.2.17)(typescript@5.4.5) + '@gql.tada/internal': 1.0.0(graphql@16.8.1)(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - graphql + - svelte + + graphemer@1.4.0: {} + + graphql@16.8.1: {} + + has-flag@4.0.0: {} + + he@1.2.0: {} + + ignore@5.3.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-reference@3.0.2: + dependencies: + '@types/estree': 1.0.5 + + isexe@2.0.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-character@3.0.0: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lower-case@2.0.2: + dependencies: + tslib: 2.6.2 + + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + mdn-data@2.0.30: {} + + media-query-parser@2.0.2: + dependencies: + '@babel/runtime': 7.24.6 + + merge2@1.4.1: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + mitt@3.0.1: {} + + modern-ahocorasick@1.0.1: {} + + ms@2.1.2: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.7: {} + + nanostores@0.9.5: {} + + natural-compare@1.4.0: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-type@4.0.0: {} + + periscopic@3.1.0: + dependencies: + '@types/estree': 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prelude-ls@1.2.1: {} + + prettier@3.2.5: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-remove-scroll-bar@2.3.6(@types/react@18.3.3)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) + tslib: 2.6.2 + optionalDependencies: + '@types/react': 18.3.3 + + react-remove-scroll@2.5.5(@types/react@18.3.3)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) + tslib: 2.6.2 + use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + + react-style-singleton@2.2.1(@types/react@18.3.3)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.3.1 + tslib: 2.6.2 + optionalDependencies: + '@types/react': 18.3.3 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + regenerator-runtime@0.14.1: {} + + resolve-from@4.0.0: {} + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@3.29.4: + optionalDependencies: + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver@7.6.2: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + slash@3.0.0: {} + + source-map-js@1.2.0: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + svelte2tsx@0.7.9(svelte@4.2.17)(typescript@5.4.5): + dependencies: + dedent-js: 1.0.1 + pascal-case: 3.1.2 + svelte: 4.2.17 + typescript: 5.4.5 + + svelte@4.2.17: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + '@types/estree': 1.0.5 + acorn: 8.11.3 + aria-query: 5.3.0 + axobject-query: 4.0.0 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.10 + periscopic: 3.1.0 + + text-table@0.2.0: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@1.3.0(typescript@5.4.5): + dependencies: + typescript: 5.4.5 + + tslib@2.6.2: {} + + tweetnacl@1.0.3: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + typescript@5.4.5: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): + dependencies: + react: 18.3.1 + tslib: 2.6.2 + optionalDependencies: + '@types/react': 18.3.3 + + use-sidecar@1.1.2(@types/react@18.3.3)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.6.2 + optionalDependencies: + '@types/react': 18.3.3 + + use-sync-external-store@1.2.0(react@18.3.1): + dependencies: + react: 18.3.1 + + valibot@0.25.0: {} + + vite@4.5.3: + dependencies: + esbuild: 0.18.20 + postcss: 8.4.38 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + + vue-template-compiler@2.7.16: + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + yocto-queue@0.1.0: {} + + zustand@4.5.2(@types/react@18.3.3)(react@18.3.1): + dependencies: + use-sync-external-store: 1.2.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + react: 18.3.1 diff --git a/examples/tic-tac-toe/ui/prettier.config.cjs b/examples/tic-tac-toe/ui/prettier.config.cjs new file mode 100644 index 0000000000000..417103858dd46 --- /dev/null +++ b/examples/tic-tac-toe/ui/prettier.config.cjs @@ -0,0 +1,3 @@ +module.exports = { + proseWrap: "always", +}; diff --git a/examples/tic-tac-toe/ui/src/App.css b/examples/tic-tac-toe/ui/src/App.css new file mode 100644 index 0000000000000..6d143ee723a8e --- /dev/null +++ b/examples/tic-tac-toe/ui/src/App.css @@ -0,0 +1,4 @@ +a.home { + color: var(--color-foreground); + text-decoration: none; +} diff --git a/examples/tic-tac-toe/ui/src/App.tsx b/examples/tic-tac-toe/ui/src/App.tsx new file mode 100644 index 0000000000000..bafb401192946 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/App.tsx @@ -0,0 +1,79 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import './App.css'; + +import { ConnectButton, useCurrentAccount, useSuiClientContext } from '@mysten/dapp-kit'; +import { isValidSuiObjectId, normalizeSuiObjectId } from '@mysten/sui/utils'; +import { FrameIcon } from '@radix-ui/react-icons'; +import { Box, Container, Flex, Heading, Link, Text } from '@radix-ui/themes'; +import { Error } from 'components/Error'; +import { networkConfig, useNetworkVariable } from 'config'; +import Game from 'pages/Game'; +import Root from 'pages/Root'; + +function App() { + // Ensure the app's network config matches the wallet's available networks, if the wallet is connected. + const account = useCurrentAccount(); + const ctx = useSuiClientContext(); + + const chain = account?.chains?.find((c) => c.startsWith('sui:'))?.replace(/^sui:/, ''); + if (chain) { + console.debug('Configuring app for', chain); + ctx.selectNetwork(chain); + } + + return ( + <> + + + + + + Tic Tac Toe + + + + + + + + + + + + + ); +} + +function Content() { + const packageId = useNetworkVariable('packageId'); + + const path = location.pathname.slice(1); + const addr = normalizeSuiObjectId(path); + + if (packageId === null) { + const availableNetworks = Object.keys(networkConfig).filter( + (n) => (networkConfig as any)[n]?.variables?.packageId, + ); + + return ( + + This app is only available on {availableNetworks.join(', ')}. Please switch your wallet to a + supported network. + + ); + } else if (path === '') { + return ; + } else if (isValidSuiObjectId(addr)) { + return ; + } else { + return ( + + "{path}" is not a valid SUI object ID. + + ); + } +} + +export default App; diff --git a/examples/tic-tac-toe/ui/src/MultiSig.ts b/examples/tic-tac-toe/ui/src/MultiSig.ts new file mode 100644 index 0000000000000..f0f89454ef9df --- /dev/null +++ b/examples/tic-tac-toe/ui/src/MultiSig.ts @@ -0,0 +1,26 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { PublicKey } from '@mysten/sui/cryptography'; +import { MultiSigPublicKey } from '@mysten/sui/multisig'; + +/** + * Generate the public key corresponding to a 1-of-N multi-sig + * composed of `keys` (all with equal weighting). + */ +export function multiSigPublicKey(keys: PublicKey[]): MultiSigPublicKey { + // Multi-sig addresses cannot contain the same public keys multiple + // times. In our case, it's fine to de-duplicate them because all + // keys get equal weight and the threshold is 1. + const deduplicated: { [key: string]: PublicKey } = {}; + for (const key of keys) { + deduplicated[key.toSuiAddress()] = key; + } + + return MultiSigPublicKey.fromPublicKeys({ + threshold: 1, + publicKeys: Object.values(deduplicated).map((publicKey) => { + return { publicKey, weight: 1 }; + }), + }); +} diff --git a/examples/tic-tac-toe/ui/src/components/Board.tsx b/examples/tic-tac-toe/ui/src/components/Board.tsx new file mode 100644 index 0000000000000..52b84f63aba4f --- /dev/null +++ b/examples/tic-tac-toe/ui/src/components/Board.tsx @@ -0,0 +1,70 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { CircleIcon, Cross1Icon } from '@radix-ui/react-icons'; +import { Box, Flex } from '@radix-ui/themes'; +import { Mark } from 'hooks/useGameQuery'; +import { ReactElement } from 'react'; + +/** + * Represents a Tic-Tac-Toe board. + * + * `marks` is a linear array containing the marks on the board, in + * row-major order, `empty` is the Mark to display when hovering over + * an empty cell, and `onMove` is a callback to be called when an + * empty cell is clicked. Setting `empty` to `Mark._` will make empty + * cells non-interactive. + */ +export function Board({ + marks, + empty, + onMove, +}: { + marks: Mark[]; + empty: Mark; + onMove: (i: number, j: number) => void; +}): ReactElement { + const board = Array.from({ length: 3 }, (_, i) => marks.slice(i * 3, (i + 1) * 3)); + + return ( + + {board.map((row, r) => ( + + {row.map((cell, c) => ( + onMove(r, c)} /> + ))} + + ))} + + ); +} + +function Cell({ + mark, + empty, + onMove, +}: { + mark: Mark; + empty: Mark; + onMove: () => void; +}): ReactElement { + switch (mark) { + case Mark.X: + return ; + case Mark.O: + return ; + case Mark._: + return ; + } +} + +function EmptyCell({ empty, onMove }: { empty: Mark; onMove: () => void }): ReactElement | null { + switch (empty) { + case Mark.X: + return ; + case Mark.O: + return ; + case Mark._: + return ; + } +} diff --git a/examples/tic-tac-toe/ui/src/components/ComputedField.css b/examples/tic-tac-toe/ui/src/components/ComputedField.css new file mode 100644 index 0000000000000..61a5751639136 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/components/ComputedField.css @@ -0,0 +1,3 @@ +.filledField input { + text-overflow: ellipsis; +} diff --git a/examples/tic-tac-toe/ui/src/components/ComputedField.tsx b/examples/tic-tac-toe/ui/src/components/ComputedField.tsx new file mode 100644 index 0000000000000..807dc1f87d1aa --- /dev/null +++ b/examples/tic-tac-toe/ui/src/components/ComputedField.tsx @@ -0,0 +1,52 @@ +import './ComputedField.css'; + +import { CheckIcon, CopyIcon } from '@radix-ui/react-icons'; +import { IconButton, TextField, Tooltip } from '@radix-ui/themes'; +import { ReactElement, useState } from 'react'; +import toast from 'react-hot-toast'; + +/** + * A TextField that displays a value that is already generated (cannot + * be edited). + * + * If `value` is not provided, the `label` will be shown as a + * placeholder, otherwise, the value will be shown, a tooltip will be + * added with the label and value, and a copy button is included to + * copy the value. + */ +export function ComputedField({ label, value }: { label: string; value?: string }): ReactElement { + const tooltip = value ? `${label}: ${value}` : undefined; + const [copied, setCopied] = useState(false); + + async function onClick() { + await navigator.clipboard.writeText(value!!); + setCopied(true); + setTimeout(() => setCopied(false), 1000); + toast.success('Copied ID to clipboard!'); + } + + const field = ( + + {value && ( + + + {copied ? : } + + + )} + + ); + + if (!tooltip) { + return field; + } + + return {field}; +} diff --git a/examples/tic-tac-toe/ui/src/components/Error.tsx b/examples/tic-tac-toe/ui/src/components/Error.tsx new file mode 100644 index 0000000000000..63bbcafb0b8eb --- /dev/null +++ b/examples/tic-tac-toe/ui/src/components/Error.tsx @@ -0,0 +1,33 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { ExclamationTriangleIcon } from '@radix-ui/react-icons'; +import { Callout, Container, Strong } from '@radix-ui/themes'; +import { ReactElement, ReactNode } from 'react'; + +interface Props { + title: string; + children: ReactNode; +} + +/** + * Component for displaying an error message as a call-out. The + * `title` is displayed as a heading and the `children` are displayed + * underneath. + */ +export function Error({ title, children }: Props): ReactElement { + return ( + + + + + + + {title} +
+ {children} +
+
+
+ ); +} diff --git a/examples/tic-tac-toe/ui/src/components/IDLink.tsx b/examples/tic-tac-toe/ui/src/components/IDLink.tsx new file mode 100644 index 0000000000000..b1c178c4f6230 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/components/IDLink.tsx @@ -0,0 +1,53 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { formatAddress } from '@mysten/sui/utils'; +import { CheckIcon, CopyIcon } from '@radix-ui/react-icons'; +import { Button, Flex, Link, Tooltip } from '@radix-ui/themes'; +import { useNetworkVariable } from 'config'; +import { ReactElement, useState } from 'react'; +import toast from 'react-hot-toast'; + +type Props = { + id: string; + size?: '1' | '2' | '3' | '4'; + display?: 'none' | 'flex' | 'inline-flex'; +}; + +/** + * Renders an Object ID. + * + * The ID is represented in a contracted form and acts as a link to + * view the object in an explorer. It also has a tooltip to show its + * full value and a button to copy that value to the clipboard. + * + * The optional `size` parameter controls how big the ID is, in + * Radix's size units. + */ +export function IDLink({ id, size, display }: Props): ReactElement { + const explorer = useNetworkVariable('explorer'); + size = size ?? '1'; + + const [copied, setCopied] = useState(false); + const onClick = async () => { + await navigator.clipboard.writeText(id); + setCopied(true); + setTimeout(() => setCopied(false), 1000); + toast.success('Copied ID to clipboard!'); + }; + + return ( + + + + {formatAddress(id)} + + + + + + + ); +} diff --git a/examples/tic-tac-toe/ui/src/components/Loading.tsx b/examples/tic-tac-toe/ui/src/components/Loading.tsx new file mode 100644 index 0000000000000..b3a6b62e53332 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/components/Loading.tsx @@ -0,0 +1,27 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { Flex, Spinner, Text } from '@radix-ui/themes'; +import { Board } from 'components/Board'; +import { Mark } from 'hooks/useGameQuery'; + +/** + * Component designed to represent the null-state of a Game, to be + * used as a loading screen while the game is being fetched from + * RPC. + */ +export function Loading() { + return ( + <> + Mark._)} + empty={Mark._} + onMove={(_r, _c) => {}} + /> + + + Loading... + + + ); +} diff --git a/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx b/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx new file mode 100644 index 0000000000000..436bfc0ed6249 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx @@ -0,0 +1,137 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { useCurrentAccount } from '@mysten/dapp-kit'; +import { PublicKey } from '@mysten/sui/cryptography'; +import { fromB64, toB64 } from '@mysten/sui/utils'; +import { publicKeyFromRawBytes } from '@mysten/sui/verify'; +import { ExclamationTriangleIcon } from '@radix-ui/react-icons'; +import { Box, Button, Em, Flex, Separator, Text, TextField } from '@radix-ui/themes'; +import { ComputedField } from 'components/ComputedField'; +import { useExecutor } from 'hooks/useExecutor'; +import { useTransactions } from 'hooks/useTransactions'; +import { ReactElement, useState } from 'react'; + +/** + * Form for creating a new multi-sig game. + */ +export function NewMultiSigGame() { + // SAFETY: tests that a package exists, so Transactions + // builder should be available. + const tx = useTransactions()!!; + const signAndExecute = useExecutor(); + + const { address, publicKey: bytes } = useCurrentAccount() || {}; + const [opponent, setOpponent] = useState(null); + + const publicKey = bytes && publicKeyFromRawBytes('ED25519', bytes); + const hasPlayer = publicKey != null; + const hasOpponent = opponent != null; + + function onClick() { + signAndExecute( + { + // SAFETY: Button is only enabled when player and opponent are + // available. + tx: tx.newMultiSigGame(publicKey!!, opponent!!), + options: { showObjectChanges: true }, + }, + ({ objectChanges }) => { + const game = objectChanges?.find( + (c) => c.type === 'created' && c.objectType.endsWith('::Game'), + ); + + if (game && game.type === 'created') { + window.location.href = `/${game.objectId}`; + } + }, + ); + } + + return ( + <> + + + setOpponent(parsePublicKey(e.target.value))} + /> + + + + + + + + + Create a 1-of-2 multi-sig address to own the new game. Each move in the game requires two + fast path (single-owner) transactions: One from the player's address to authorize the + move, and one from the multi-sig, signed by the player's address, to make the move. + + + In order to construct the multi-sig, we need to know the public keys of the two players. + Although addresses on Sui are derived from public keys, the derivation cannot be reversed, + so to start a multi-sig game, we ask for the public keys directly. + + + + ); +} + +function Validation({ + hasPlayer, + hasOpponent, +}: { + hasPlayer: boolean; + hasOpponent: boolean; +}): ReactElement { + if (!hasPlayer) { + return ( + + + Wallet not connected. + + ); + } else if (!hasOpponent) { + return ( + + + Invalid opponent public key. + + ); + } else { + return ; + } +} + +/** + * If `key` is a valid base64 encoded Sui public key, return it as a + * Uint8Array, otherwise return null. + */ +function parsePublicKey(key?: string): PublicKey | null { + if (key == null) { + return null; + } + + key = key.trim(); + if (key == '') { + return null; + } + + try { + return publicKeyFromRawBytes('ED25519', fromB64(key)); + } catch (e) { + console.error('Failed to get public key from raw bytes', e); + return null; + } +} diff --git a/examples/tic-tac-toe/ui/src/components/NewSharedGame.tsx b/examples/tic-tac-toe/ui/src/components/NewSharedGame.tsx new file mode 100644 index 0000000000000..a065e00ec62de --- /dev/null +++ b/examples/tic-tac-toe/ui/src/components/NewSharedGame.tsx @@ -0,0 +1,117 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { useCurrentAccount } from '@mysten/dapp-kit'; +import { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils'; +import { ExclamationTriangleIcon } from '@radix-ui/react-icons'; +import { Box, Button, Em, Flex, Separator, Text, TextField } from '@radix-ui/themes'; +import { useExecutor } from 'hooks/useExecutor'; +import { useTransactions } from 'hooks/useTransactions'; +import { ReactElement, useState } from 'react'; + +import { ComputedField } from './ComputedField'; + +/** + * Form for creating a new shared game. + */ +export function NewSharedGame() { + // SAFETY: tests that a package exists, so Transactions + // builder should be available. + const tx = useTransactions()!!; + const signAndExecute = useExecutor(); + + const player = useCurrentAccount()?.address; + const [opponent, setOpponent] = useState(null); + + const hasPlayer = player != null; + const hasOpponent = opponent != null; + + function onClick() { + signAndExecute( + { + // SAFETY: Button is only enabled when player and opponent are + // available. + tx: tx.newSharedGame(player!!, opponent!!), + options: { showEffects: true }, + }, + ({ effects }) => { + const gameId = effects?.created?.[0].reference?.objectId; + if (gameId) { + window.location.href = `/${gameId}`; + } + }, + ); + } + + return ( + <> + + setOpponent(normalizedAddress(e.target.value))} + /> + + + + + + + + Create the game as a shared object that both players can access. Each move is a single + transaction, but it requires going through consensus. + + + + ); +} + +function Validation({ + hasPlayer, + hasOpponent, +}: { + hasPlayer: boolean; + hasOpponent: boolean; +}): ReactElement { + if (!hasPlayer) { + return ( + + + Wallet not connected. + + ); + } else if (!hasOpponent) { + return ( + + + Invalid opponent address. + + ); + } else { + return ; + } +} + +/** + * If `address` is a valid denormalized address, return it in its + * normalized form, and otherwise return null. + */ +function normalizedAddress(address?: string): string | null { + if (address == null) { + return null; + } + + address = address.trim(); + if (address == '') { + return null; + } + + address = normalizeSuiAddress(address); + return isValidSuiAddress(address) ? address : null; +} diff --git a/examples/tic-tac-toe/ui/src/config.ts b/examples/tic-tac-toe/ui/src/config.ts new file mode 100644 index 0000000000000..83fb3962be12b --- /dev/null +++ b/examples/tic-tac-toe/ui/src/config.ts @@ -0,0 +1,42 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { createNetworkConfig } from '@mysten/dapp-kit'; +import { getFullnodeUrl } from '@mysten/sui/client'; + +import LocalnetPackage from './env.localnet.ts'; + +const NoPackage = { packageId: null, upgradeCap: null }; + +const { networkConfig, useNetworkVariable } = createNetworkConfig({ + localnet: { + url: getFullnodeUrl('localnet'), + variables: { + explorer: (id: string) => `https://suiscan.xyz/custom/object/${id}/?network=0.0.0.0%3A9000`, + ...LocalnetPackage, + }, + }, + devnet: { + url: getFullnodeUrl('devnet'), + variables: { + explorer: (id: string) => `https://suiscan.xyz/devnet/object/${id}/`, + ...NoPackage, + }, + }, + testnet: { + url: getFullnodeUrl('testnet'), + variables: { + explorer: (id: string) => `https://suiscan.xyz/testnet/object/${id}/`, + ...NoPackage, + }, + }, + mainnet: { + url: getFullnodeUrl('mainnet'), + variables: { + explorer: (id: string) => `https://suiscan.xyz/mainnet/object/${id}/`, + ...NoPackage, + }, + }, +}); + +export { networkConfig, useNetworkVariable }; diff --git a/examples/tic-tac-toe/ui/src/env.localnet.ts b/examples/tic-tac-toe/ui/src/env.localnet.ts new file mode 100644 index 0000000000000..d1eb7fb9171d4 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/env.localnet.ts @@ -0,0 +1,7 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +export default { + packageId: '0x44e5164c24e21f28d91deb0ace10d5ec24d38a639e949cc6ac3358b563bb946c', + upgradeCap: '0xc96d3b69ee99f85ff7561c990741d297adcc83551126b1c09cc44520f75b4e20', +}; diff --git a/examples/tic-tac-toe/ui/src/hooks/useExecutor.ts b/examples/tic-tac-toe/ui/src/hooks/useExecutor.ts new file mode 100644 index 0000000000000..b342927d9137b --- /dev/null +++ b/examples/tic-tac-toe/ui/src/hooks/useExecutor.ts @@ -0,0 +1,46 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { useSignAndExecuteTransaction, useSuiClient } from '@mysten/dapp-kit'; +import { SuiClient, SuiTransactionBlockResponse } from '@mysten/sui/client'; +import { Transaction } from '@mysten/sui/transactions'; + +type Options = Omit[0], 'digest'> & { + tx: Transaction; +}; +type ExecuteResponse = { digest: string; rawEffects?: number[] }; +type ExecuteCallback = ({ + bytes, + signature, +}: { + bytes: string; + signature: string; +}) => Promise; +type ResponseCallback = (tx: SuiTransactionBlockResponse) => void | Promise; +type Executor = (options: Options, then: ResponseCallback) => void; + +/** + * Hook encapsulating running a transaction, waiting for its effects + * and then doing something with them. + */ +export function useExecutor({ execute }: { execute?: ExecuteCallback } = {}): Executor { + const client = useSuiClient(); + const { mutate: signAndExecute } = useSignAndExecuteTransaction({ execute }); + + return ({ tx, ...options }, then) => { + signAndExecute( + { + transaction: tx, + }, + { + onSuccess: ({ digest }) => { + client.waitForTransaction({ digest, ...options }).then(then); + }, + + onError: (error) => { + console.error('Failed to execute transaction', tx, error); + }, + }, + ); + }; +} diff --git a/examples/tic-tac-toe/ui/src/hooks/useGameQuery.ts b/examples/tic-tac-toe/ui/src/hooks/useGameQuery.ts new file mode 100644 index 0000000000000..e0660f1fe7e9f --- /dev/null +++ b/examples/tic-tac-toe/ui/src/hooks/useGameQuery.ts @@ -0,0 +1,109 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { UseQueryResult } from '@tanstack/react-query'; +import { useNetworkVariable } from 'config'; +import { useObjectQuery, UseObjectQueryResponse } from 'hooks/useObjectQuery'; + +/** Variants of the tic-tac-toe protocol */ +export type Kind = 'shared' | 'owned'; + +/** Marks on the game baord */ +export enum Mark { + /** No mark */ + _ = 0, + /** Marked by player X */ + X, + /** Marked by player O */ + O, +} + +/** State of the game, deserialized from its Move Object */ +export type Game = { + /** The game's Object ID */ + id: string; + + /** Whether it's a 'shared' or an 'owned' game */ + kind: Kind; + + /** Current state of the game board, 9 marks in row-major order. */ + board: Mark[]; + + /** Number of turns played so far. */ + turn: number; + + /** Address of the player controlling X */ + x: string; + + /** Address of the player controlling O */ + o: string; + + /** The multi-sig public-key of the game admin */ + admin?: number[]; +}; + +export type UseGameQueryResult = UseQueryResult; +export type InvalidateGameQuery = () => void; + +/** Refetch games every 5 seconds */ +const REFETCH_INTERVAL = 5000; + +/** + * Hook to fetch a Game object from RPC by its ID. + * + * Will return an error if the object cannot be fetched, or is the + * incorrect type. Returns a query result and a function to invalidate + * the query. + */ +export function useGameQuery(id: string): [UseGameQueryResult, InvalidateGameQuery] { + const packageId = useNetworkVariable('packageId'); + const [response, invalidate] = useObjectQuery( + { + id, + options: { showType: true, showContent: true }, + }, + { + refetchInterval: REFETCH_INTERVAL, + }, + ); + + // Wait for the query to succeed before doing any further work. + if (response.status != 'success') { + return [response as UseGameQueryResult, invalidate]; + } + + const data = response.data.data; + if (!data) { + return [toError(response, 'Failed to fetch game'), invalidate]; + } + + const reType = new RegExp(`^${packageId}::(shared|owned)::Game`); + const { type, content } = data; + + let mType; + if (!type || !(mType = type.match(reType)) || !content || content.dataType != 'moveObject') { + return [toError(response, 'Object is not a Game'), invalidate]; + } + + const kind = mType[1] as Kind; + const { board, turn, x, o, admin } = content.fields as Game; + + const success = { + ...response, + data: { id, kind, board, turn, x, o, admin }, + }; + + return [success as UseGameQueryResult, invalidate]; +} + +function toError(response: UseObjectQueryResponse, message: string): UseGameQueryResult { + return { + ...response, + data: undefined, + error: Error(message), + isError: true, + isLoadingError: true, + isSuccess: false, + status: 'error', + } as UseGameQueryResult; +} diff --git a/examples/tic-tac-toe/ui/src/hooks/useObjectQuery.ts b/examples/tic-tac-toe/ui/src/hooks/useObjectQuery.ts new file mode 100644 index 0000000000000..f565e4c710377 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/hooks/useObjectQuery.ts @@ -0,0 +1,29 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { useSuiClientContext, useSuiClientQuery, UseSuiClientQueryOptions } from '@mysten/dapp-kit'; +import { GetObjectParams, SuiObjectResponse } from '@mysten/sui/client'; +import { useQueryClient, UseQueryResult } from '@tanstack/react-query'; + +export type UseObjectQueryOptions = UseSuiClientQueryOptions<'getObject', SuiObjectResponse>; +export type UseObjectQueryResponse = UseQueryResult; +export type InvalidateUseObjectQuery = () => void; + +/** + * Fetches an object, returning the response from RPC and a callback + * to invalidate it. + */ +export function useObjectQuery( + params: GetObjectParams, + options?: UseObjectQueryOptions, +): [UseObjectQueryResponse, InvalidateUseObjectQuery] { + const ctx = useSuiClientContext(); + const client = useQueryClient(); + const response = useSuiClientQuery('getObject', params, options); + + const invalidate = async () => { + await client.invalidateQueries({ queryKey: [ctx.network, 'getObject', params] }); + }; + + return [response, invalidate]; +} diff --git a/examples/tic-tac-toe/ui/src/hooks/useTransactions.ts b/examples/tic-tac-toe/ui/src/hooks/useTransactions.ts new file mode 100644 index 0000000000000..1f5f7b910d509 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/hooks/useTransactions.ts @@ -0,0 +1,119 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { bcs } from '@mysten/sui/bcs'; +import { PublicKey } from '@mysten/sui/cryptography'; +import { ObjectRef, Transaction } from '@mysten/sui/transactions'; +import { useNetworkVariable } from 'config'; +import { Game } from 'hooks/useGameQuery'; +import { TurnCap } from 'hooks/useTurnCapQuery'; +import { multiSigPublicKey } from 'MultiSig'; + +/** Hook to provide an instance of the Transactions builder. */ +export function useTransactions(): Transactions | null { + const packageId = useNetworkVariable('packageId'); + return packageId ? new Transactions(packageId) : null; +} + +/** + * Builds on-chain transactions for the Tic-Tac-Toe game. + */ +export class Transactions { + readonly packageId: string; + + constructor(packageId: string) { + this.packageId = packageId; + } + + newSharedGame(player: string, opponent: string): Transaction { + const tx = new Transaction(); + + tx.moveCall({ + target: `${this.packageId}::shared::new`, + arguments: [tx.pure.address(player), tx.pure.address(opponent)], + }); + + return tx; + } + + newMultiSigGame(player: PublicKey, opponent: PublicKey): Transaction { + const admin = multiSigPublicKey([player, opponent]); + const tx = new Transaction(); + + const game = tx.moveCall({ + target: `${this.packageId}::owned::new`, + arguments: [ + tx.pure.address(player.toSuiAddress()), + tx.pure.address(opponent.toSuiAddress()), + tx.pure(bcs.vector(bcs.u8()).serialize(admin.toRawBytes()).toBytes()), + ], + }); + + tx.transferObjects([game], admin.toSuiAddress()); + + return tx; + } + + placeMark(game: Game, row: number, col: number): Transaction { + if (game.kind !== 'shared') { + throw new Error('Cannot place mark directly on owned game'); + } + + const tx = new Transaction(); + + tx.moveCall({ + target: `${this.packageId}::shared::place_mark`, + arguments: [tx.object(game.id), tx.pure.u8(row), tx.pure.u8(col)], + }); + + return tx; + } + + sendMark(cap: TurnCap, row: number, col: number): Transaction { + const tx = new Transaction(); + + tx.moveCall({ + target: `${this.packageId}::owned::send_mark`, + arguments: [tx.object(cap.id.id), tx.pure.u8(row), tx.pure.u8(col)], + }); + + return tx; + } + + receiveMark(game: Game, mark: ObjectRef): Transaction { + if (game.kind !== 'owned') { + throw new Error('Cannot receive mark on shared game'); + } + + const tx = new Transaction(); + + tx.moveCall({ + target: `${this.packageId}::owned::place_mark`, + arguments: [tx.object(game.id), tx.receivingRef(mark)], + }); + + return tx; + } + + ended(game: Game): Transaction { + const tx = new Transaction(); + + tx.moveCall({ + target: `${this.packageId}::${game.kind}::ended`, + arguments: [tx.object(game.id)], + }); + + return tx; + } + + burn(game: Game): Transaction { + const tx = new Transaction(); + + tx.moveCall({ + target: `${this.packageId}::${game.kind}::burn`, + arguments: [tx.object(game.id)], + }); + + return tx; + } +} diff --git a/examples/tic-tac-toe/ui/src/hooks/useTrophyQuery.ts b/examples/tic-tac-toe/ui/src/hooks/useTrophyQuery.ts new file mode 100644 index 0000000000000..d9614dd447934 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/hooks/useTrophyQuery.ts @@ -0,0 +1,61 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { useSuiClient } from '@mysten/dapp-kit'; +import { normalizeSuiAddress } from '@mysten/sui/utils'; +import { useQuery, useQueryClient, UseQueryResult } from '@tanstack/react-query'; +import { Game } from 'hooks/useGameQuery'; +import { useTransactions } from 'hooks/useTransactions'; + +export enum Trophy { + None = 0, + Draw, + Win, +} + +export type UseTrophyQueryResponse = UseQueryResult; +export type InvalidateTrophyQuery = () => void; + +/** Refetch trophy status every 5 seconds */ +const REFETCH_INTERVAL = 5000; + +/** + * Query the trophy state of the game (whether the game has a winner + * or not). + * + * `id` is the Object ID of the game, and `kind` is what kind of game + * it is (whether it is shared or owned). The query in this hook + * depends on the value of `kind` (will not be enabled unless `kind` + * is available). + */ +export function useTrophyQuery(game?: Game): [UseTrophyQueryResponse, InvalidateTrophy] { + const client = useSuiClient(); + const queryClient = useQueryClient(); + const tx = useTransactions()!!; + + const response = useQuery({ + enabled: !!game, + refetchInterval: REFETCH_INTERVAL, + queryKey: ['game-end-state', game?.id], + queryFn: async () => { + const { results } = await client.devInspectTransactionBlock({ + // It doesn't matter who's sending this query. + sender: normalizeSuiAddress('0x0'), + transactionBlock: tx.ended(game!!), + }); + + const trophy = results?.[0]?.returnValues?.[0]?.[0]?.[0]; + if (trophy === undefined) { + throw new Error('Failed to get game state'); + } + + return trophy as Trophy; + }, + }); + + const invalidate = async () => { + await queryClient.invalidateQueries({ queryKey: ['game-end-state', game?.id] }); + }; + + return [response, invalidate]; +} diff --git a/examples/tic-tac-toe/ui/src/hooks/useTurnCapQuery.ts b/examples/tic-tac-toe/ui/src/hooks/useTurnCapQuery.ts new file mode 100644 index 0000000000000..8a7baf1f748a6 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/hooks/useTurnCapQuery.ts @@ -0,0 +1,78 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { useCurrentAccount, useSuiClient, useSuiClientContext } from '@mysten/dapp-kit'; +import { useQuery, useQueryClient, UseQueryResult } from '@tanstack/react-query'; +import { useNetworkVariable } from 'config'; + +export type TurnCap = { + id: { id: string }; + game: string; +}; + +export type UseTurnCapResult = UseQueryResult; +export type InvalidateTurnCapQuery = () => void; + +/** Refetch TurnCaps every 5 seconds */ +const REFETCH_INTERVAL = 5000; + +/** + * Hook to fetch the `TurnCap` owned by `address` associated with + * `game`, if there is one. + */ +export function useTurnCapQuery(game?: string): [UseTurnCapResult, InvalidateTurnCapQuery] { + const suiClient = useSuiClient(); + const queryClient = useQueryClient(); + const ctx = useSuiClientContext(); + const packageId = useNetworkVariable('packageId'); + const account = useCurrentAccount(); + + const queryKey = [ctx.network, 'turn-cap', account?.address, game]; + const response = useQuery({ + enabled: !!game, + refetchInterval: REFETCH_INTERVAL, + queryKey, + queryFn: async () => { + const owner = account?.address; + if (!owner) { + return null; + } + + for (;;) { + const resp = await suiClient.getOwnedObjects({ + owner, + filter: { + StructType: `${packageId}::owned::TurnCap`, + }, + options: { + showContent: true, + }, + }); + + for (const obj of resp.data) { + const content = obj.data?.content; + if (content?.dataType !== 'moveObject') { + continue; + } + + const cap = content.fields as TurnCap; + if (cap.game === game) { + return cap; + } + } + + if (!resp.hasNextPage) { + break; + } + } + + return null; + }, + }); + + const invalidate = async () => { + await queryClient.invalidateQueries({ queryKey }); + }; + + return [response, invalidate]; +} diff --git a/examples/tic-tac-toe/ui/src/main.tsx b/examples/tic-tac-toe/ui/src/main.tsx new file mode 100644 index 0000000000000..57ee14a634b0f --- /dev/null +++ b/examples/tic-tac-toe/ui/src/main.tsx @@ -0,0 +1,35 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import React from 'react'; +import ReactDOM from 'react-dom/client'; + +import '@mysten/dapp-kit/dist/index.css'; +import '@radix-ui/themes/styles.css'; + +import { SuiClientProvider, WalletProvider } from '@mysten/dapp-kit'; +import { Theme } from '@radix-ui/themes'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { Toaster } from 'react-hot-toast'; + +import App from './App.tsx'; +import { networkConfig } from './config'; + +const queryClient = new QueryClient(); + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + +
+ + +
+
+
+
+
+
, +); diff --git a/examples/tic-tac-toe/ui/src/pages/Game.css b/examples/tic-tac-toe/ui/src/pages/Game.css new file mode 100644 index 0000000000000..576b65213893c --- /dev/null +++ b/examples/tic-tac-toe/ui/src/pages/Game.css @@ -0,0 +1,25 @@ +@import '@radix-ui/colors/gray.css'; + +.board { + background-color: var(--gray-12); +} + +.board .cell { + background-color: var(--color-background); + color: var(--gray-12); + width: 100%; +} + +.board .cell::before { + content: ''; + display: block; + padding-top: 100%; +} + +.board .cell.empty { + color: var(--color-background); +} + +.board .cell.empty:hover { + color: var(--gray-8); +} diff --git a/examples/tic-tac-toe/ui/src/pages/Game.tsx b/examples/tic-tac-toe/ui/src/pages/Game.tsx new file mode 100644 index 0000000000000..9903b85ccb58d --- /dev/null +++ b/examples/tic-tac-toe/ui/src/pages/Game.tsx @@ -0,0 +1,414 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import './Game.css'; + +import { useCurrentAccount, useSuiClient } from '@mysten/dapp-kit'; +import { MultiSigPublicKey } from '@mysten/sui/multisig'; +import { TrashIcon } from '@radix-ui/react-icons'; +import { AlertDialog, Badge, Button, Flex } from '@radix-ui/themes'; +import { Board } from 'components/Board'; +import { Error } from 'components/Error'; +import { IDLink } from 'components/IDLink'; +import { Loading } from 'components/Loading'; +import { useExecutor } from 'hooks/useExecutor'; +import { Game as GameData, InvalidateGameQuery, Mark, useGameQuery } from 'hooks/useGameQuery'; +import { useTransactions } from 'hooks/useTransactions'; +import { InvalidateTrophyQuery, Trophy, useTrophyQuery } from 'hooks/useTrophyQuery'; +import { useTurnCapQuery } from 'hooks/useTurnCapQuery'; +import { ReactElement } from 'react'; + +type Props = { + id: string; +}; + +enum Turn { + Spectating, + Yours, + Theirs, +} + +enum Winner { + /** Nobody has won yet */ + None, + + /** X has won, and you are not a player */ + X, + + /** O has won, and you are not a player */ + O, + + /** You won */ + You, + + /** The other player won */ + Them, + + /** Game ended in a draw */ + Draw, +} + +/** + * Render the game at the given ID. + * + * Displays the noughts and crosses board, as well as a toolbar with: + * + * - An indicator of whose turn it is. + * - A button to delete the game. + * - The ID of the game being played. + */ +export default function Game({ id }: Props): ReactElement { + const [game, invalidateGame] = useGameQuery(id); + const [trophy, invalidateTrophy] = useTrophyQuery(game?.data); + + if (game.status === 'pending') { + return ; + } else if (game.status === 'error') { + return ( + + Could not load game at . +
+ {game.error.message} +
+ ); + } + + if (trophy.status === 'pending') { + return ; + } else if (trophy.status === 'error') { + return ( + + Could not check win for : +
+ {trophy.error.message} +
+ ); + } + + return game.data.kind === 'shared' ? ( + + ) : ( + + ); +} + +function SharedGame({ + game, + trophy, + invalidateGame, + invalidateTrophy, +}: { + game: GameData; + trophy: Trophy; + invalidateGame: InvalidateGameQuery; + invalidateTrophy: InvalidateTrophyQuery; +}): ReactElement { + const account = useCurrentAccount(); + const signAndExecute = useExecutor(); + const tx = useTransactions()!!; + + const { id, board, turn, x, o } = game; + const [mark, curr, next] = turn % 2 == 0 ? [Mark.X, x, o] : [Mark.O, o, x]; + + // If it's the current account's turn, then empty cells should show + // the current player's mark on hover. Otherwise show nothing, and + // disable interactivity. + const player = whoseTurn({ curr, next, addr: account?.address }); + const winner = whoWon({ curr, next, addr: account?.address, turn, trophy }); + const empty = Turn.Yours == player && trophy === Trophy.None ? mark : Mark._; + + const onMove = (row: number, col: number) => { + signAndExecute({ tx: tx.placeMark(game, row, col) }, () => { + invalidateGame(); + invalidateTrophy(); + }); + }; + + const onDelete = (andThen: () => void) => { + signAndExecute({ tx: tx.burn(game) }, andThen); + }; + + return ( + <> + + + {trophy !== Trophy.None ? ( + + ) : ( + + )} + {trophy !== Trophy.None && account ? : null} + + + + ); +} + +function OwnedGame({ + game, + trophy, + invalidateGame, + invalidateTrophy, +}: { + game: GameData; + trophy: Trophy; + invalidateGame: InvalidateGameQuery; + invalidateTrophy: InvalidateTrophyQuery; +}): ReactElement { + const adminKey = game.admin ? new MultiSigPublicKey(new Uint8Array(game.admin)) : null; + + const client = useSuiClient(); + const signAndExecute = useExecutor(); + const multiSignAndExecute = useExecutor({ + execute: ({ bytes, signature }) => { + // SAFETY: We check below whether the admin key is available, + // and only allow moves to be submitted when it is. + const multiSig = adminKey!!.combinePartialSignatures([signature]); + return client.executeTransactionBlock({ + transactionBlock: bytes, + // The multi-sig authorizes access to the game object, while + // the original signature authorizes access to the player's + // gas object, because the player is sponsoring the + // transaction. + signature: [multiSig, signature], + options: { + showRawEffects: true, + }, + }); + }, + }); + + const [turnCap, invalidateTurnCap] = useTurnCapQuery(game.id); + const account = useCurrentAccount(); + const tx = useTransactions()!!; + + if (adminKey == null) { + return ( + + Could not load game at . +
+ Game has no admin. +
+ ); + } + + if (turnCap.status === 'pending') { + return ; + } else if (turnCap.status === 'error') { + return ( + + Could not load turn capability. +
+ {turnCap.error?.message} +
+ ); + } + + const { id, board, turn, x, o } = game; + const [mark, curr, next] = turn % 2 == 0 ? [Mark.X, x, o] : [Mark.O, o, x]; + + // If it's the current account's turn, then empty cells should show + // the current player's mark on hover. Otherwise show nothing, and + // disable interactivity. + const player = whoseTurn({ curr, next, addr: account?.address }); + const winner = whoWon({ curr, next, addr: account?.address, turn, trophy }); + const empty = Turn.Yours == player && trophy === Trophy.None ? mark : Mark._; + + const onMove = (row: number, col: number) => { + signAndExecute( + { + // SAFETY: TurnCap should only be unavailable if the game is over. + tx: tx.sendMark(turnCap?.data!!, row, col), + options: { showObjectChanges: true }, + }, + ({ objectChanges }) => { + const mark = objectChanges?.find( + (c) => c.type === 'created' && c.objectType.endsWith('::Mark'), + ); + + if (mark && mark.type === 'created') { + // SAFETY: UI displays error if the admin key is not + // available, and interactivity is disabled if there is not a + // valid account. + // + // The transaction to make the actual move is made by the + // multi-sig account (which owns the game), and is sponsored + // by the player (as the multi-sig account doesn't have coins + // of its own). + const recv = tx.receiveMark(game, mark); + recv.setSender(adminKey!!.toSuiAddress()); + recv.setGasOwner(account?.address!!); + + multiSignAndExecute({ tx: recv }, () => { + invalidateGame(); + invalidateTrophy(); + invalidateTurnCap(); + }); + } + }, + ); + }; + + const onDelete = (andThen: () => void) => { + // Just like with making a move, deletion has to be implemented as + // a sponsored multi-sig transaction. This means only one of the + // two players can clean up a finished game. + const burn = tx.burn(game); + burn.setSender(adminKey!!.toSuiAddress()); + burn.setGasOwner(account?.address!!); + + multiSignAndExecute({ tx: burn }, andThen); + }; + + return ( + <> + + + {trophy !== Trophy.None ? ( + + ) : ( + + )} + {trophy !== Trophy.None && player !== Turn.Spectating ? ( + + ) : null} + + + + ); +} + +/** + * Figure out whose turn it should be based on who the `curr`ent + * player is, who the `next` player is, and what the `addr`ess of the + * current account is. + */ +function whoseTurn({ curr, next, addr }: { curr: string; next: string; addr?: string }): Turn { + if (addr === curr) { + return Turn.Yours; + } else if (addr === next) { + return Turn.Theirs; + } else { + return Turn.Spectating; + } +} + +/** + * Figure out who won the game, out of the `curr`ent, and `next` + * players, relative to whose asking (`addr`). `turns` indicates the + * number of turns we've seen so far, which is used to determine which + * address corresponds to player X and player O. + */ +function whoWon({ + curr, + next, + addr, + turn: turn, + trophy, +}: { + curr: string; + next: string; + addr?: string; + turn: number; + trophy: Trophy; +}): Winner { + switch (trophy) { + case Trophy.None: + return Winner.None; + case Trophy.Draw: + return Winner.Draw; + case Trophy.Win: + // These tests are "backwards" because the game advances to the + // next turn after the win has happened. Nevertheless, make sure + // to test for the "you" case before the "them" case to handle a + // situation where a player is playing themselves. + if (addr === next) { + return Winner.You; + } else if (addr === curr) { + return Winner.Them; + } else if (turn % 2 == 0) { + return Winner.O; + } else { + return Winner.X; + } + } +} + +function MoveIndicator({ turn }: { turn: Turn }): ReactElement { + switch (turn) { + case Turn.Yours: + return Your turn; + case Turn.Theirs: + return Their turn; + case Turn.Spectating: + return Spectating; + } +} + +function WinIndicator({ winner }: { winner: Winner }): ReactElement | null { + switch (winner) { + case Winner.None: + return null; + case Winner.Draw: + return Draw!; + case Winner.You: + return You Win!; + case Winner.Them: + return You Lose!; + case Winner.X: + return X Wins!; + case Winner.O: + return O Wins!; + } +} + +/** + * "Delete" button with a confirmation dialog. On confirmation, the + * button calls `onDelete`, passing in an action to perform after + * deletion has completed (returning to the homepage). + */ +function DeleteButton({ onDelete }: { onDelete: (andThen: () => void) => void }): ReactElement { + const redirect = () => { + // Navigate back to homepage, because the game is gone now. + window.location.href = '/'; + }; + + return ( + + + + + + Delete Game + + Are you sure you want to delete this game? This will delete the object from the blockchain + and cannot be undone. + + + + + + onDelete(redirect)}> + + + + + + ); +} diff --git a/examples/tic-tac-toe/ui/src/pages/Root.tsx b/examples/tic-tac-toe/ui/src/pages/Root.tsx new file mode 100644 index 0000000000000..da9efc69eaac7 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/pages/Root.tsx @@ -0,0 +1,56 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { GlobeIcon, LockClosedIcon } from '@radix-ui/react-icons'; +import { Container, Heading, Tabs, Text } from '@radix-ui/themes'; +import { NewMultiSigGame } from 'components/NewMultiSigGame'; +import { NewSharedGame } from 'components/NewSharedGame'; +import { ReactElement } from 'react'; + +/** + * Landing page for the root path. Displays a form for creating a new game. + */ +export default function Root(): ReactElement { + return ( + + + New game + + + + } label="Multi-sig" /> + } label="Shared" /> + + + + + + + + + + ); +} + +/** + * Re-usable component for defining a single "kind" tab. + * + * Each "kind" option is a tab, with a value, icon, and label. The tab + content is handled separately. + */ +function Kind({ + value, + icon, + label, +}: { + value: string; + icon: ReactElement; + label: string; +}): ReactElement { + return ( + + {icon} + {label} + + ); +} diff --git a/examples/tic-tac-toe/ui/src/vite-env.d.ts b/examples/tic-tac-toe/ui/src/vite-env.d.ts new file mode 100644 index 0000000000000..11f02fe2a0061 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/tic-tac-toe/ui/tsconfig.json b/examples/tic-tac-toe/ui/tsconfig.json new file mode 100644 index 0000000000000..cd647dfa4c7cb --- /dev/null +++ b/examples/tic-tac-toe/ui/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "baseUrl": "./src", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/examples/tic-tac-toe/ui/tsconfig.node.json b/examples/tic-tac-toe/ui/tsconfig.node.json new file mode 100644 index 0000000000000..42872c59f5b01 --- /dev/null +++ b/examples/tic-tac-toe/ui/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/tic-tac-toe/ui/vite.config.ts b/examples/tic-tac-toe/ui/vite.config.ts new file mode 100644 index 0000000000000..a9d569e46d718 --- /dev/null +++ b/examples/tic-tac-toe/ui/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vite"; +import tsconfigPaths from "vite-tsconfig-paths"; +import react from "@vitejs/plugin-react-swc"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), tsconfigPaths()], +}); diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 908c7ee00ae94..cc3ce9beb1928 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,6 +5,7 @@ packages: - 'examples/**' - '!**/dist/**' - '!**/.next/**' + - '!examples/tic-tac-toe/**' - '!sdk/create-dapp/templates' - '!sdk/typescript/scripts' - '!sdk/typescript/transactions' From e9d57a43d22881cb8a932b9214e96c8aa841298e Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Thu, 4 Jul 2024 16:49:57 +0100 Subject: [PATCH 07/24] fixup: stale doc comment --- examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx b/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx index 436bfc0ed6249..cb8d49d1319ac 100644 --- a/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx +++ b/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx @@ -116,7 +116,7 @@ function Validation({ /** * If `key` is a valid base64 encoded Sui public key, return it as a - * Uint8Array, otherwise return null. + * `PublicKey`, otherwise return null. */ function parsePublicKey(key?: string): PublicKey | null { if (key == null) { From f919dc5477982c6702c5c0a7886a357850091335 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Thu, 4 Jul 2024 16:50:11 +0100 Subject: [PATCH 08/24] fixup: README: Explain use of devInspectTransactionBlock --- examples/tic-tac-toe/ui/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/tic-tac-toe/ui/README.md b/examples/tic-tac-toe/ui/README.md index 08fbd7706ccaa..e5c99538405ae 100644 --- a/examples/tic-tac-toe/ui/README.md +++ b/examples/tic-tac-toe/ui/README.md @@ -11,6 +11,8 @@ This part of the demo illustrates how to: - Build UIs that represent on-chain data, and update in response to running transactions. - Interact with multi-sig accounts. +- Using `devInspectTransactionBlock` to run Move code to extract more complex + state from on-chain. This dApp was created using `@mysten/create-dapp` that sets up a basic React Client dApp using the following tools: From faad2c29c7dbb7160e325a28f31cb444af734b00 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Thu, 4 Jul 2024 16:50:37 +0100 Subject: [PATCH 09/24] fixup: License headers --- examples/tic-tac-toe/ui/prettier.config.cjs | 3 +++ examples/tic-tac-toe/ui/src/components/ComputedField.tsx | 3 +++ examples/tic-tac-toe/ui/src/vite-env.d.ts | 3 ++- examples/tic-tac-toe/ui/vite.config.ts | 3 +++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/examples/tic-tac-toe/ui/prettier.config.cjs b/examples/tic-tac-toe/ui/prettier.config.cjs index 417103858dd46..7a8fc06f2bf84 100644 --- a/examples/tic-tac-toe/ui/prettier.config.cjs +++ b/examples/tic-tac-toe/ui/prettier.config.cjs @@ -1,3 +1,6 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + module.exports = { proseWrap: "always", }; diff --git a/examples/tic-tac-toe/ui/src/components/ComputedField.tsx b/examples/tic-tac-toe/ui/src/components/ComputedField.tsx index 807dc1f87d1aa..01526207df172 100644 --- a/examples/tic-tac-toe/ui/src/components/ComputedField.tsx +++ b/examples/tic-tac-toe/ui/src/components/ComputedField.tsx @@ -1,3 +1,6 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + import './ComputedField.css'; import { CheckIcon, CopyIcon } from '@radix-ui/react-icons'; diff --git a/examples/tic-tac-toe/ui/src/vite-env.d.ts b/examples/tic-tac-toe/ui/src/vite-env.d.ts index 11f02fe2a0061..40a8edabb3265 100644 --- a/examples/tic-tac-toe/ui/src/vite-env.d.ts +++ b/examples/tic-tac-toe/ui/src/vite-env.d.ts @@ -1 +1,2 @@ -/// +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 diff --git a/examples/tic-tac-toe/ui/vite.config.ts b/examples/tic-tac-toe/ui/vite.config.ts index a9d569e46d718..4e73d3252754d 100644 --- a/examples/tic-tac-toe/ui/vite.config.ts +++ b/examples/tic-tac-toe/ui/vite.config.ts @@ -1,3 +1,6 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + import { defineConfig } from "vite"; import tsconfigPaths from "vite-tsconfig-paths"; import react from "@vitejs/plugin-react-swc"; From f061124f54e5343c9b3c47c8e940d28ef20bcea5 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Thu, 4 Jul 2024 21:17:28 +0100 Subject: [PATCH 10/24] fixup: pnpm install --ignore-workspace --- examples/tic-tac-toe/ui/pnpm-lock.yaml | 1381 ++++++++++++++++++------ 1 file changed, 1053 insertions(+), 328 deletions(-) diff --git a/examples/tic-tac-toe/ui/pnpm-lock.yaml b/examples/tic-tac-toe/ui/pnpm-lock.yaml index f2f9d1b09f4de..48e4c3dbb2555 100644 --- a/examples/tic-tac-toe/ui/pnpm-lock.yaml +++ b/examples/tic-tac-toe/ui/pnpm-lock.yaml @@ -9,11 +9,11 @@ importers: .: dependencies: '@mysten/dapp-kit': - specifier: 0.14.3 - version: 0.14.3(@tanstack/react-query@5.40.0(react@18.3.1))(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(svelte@4.2.17)(typescript@5.4.5) + specifier: 0.14.9 + version: 0.14.9(@tanstack/react-query@5.40.0(react@18.3.1))(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(svelte@4.2.17)(typescript@5.4.5) '@mysten/sui': - specifier: 1.0.3 - version: 1.0.3(svelte@4.2.17)(typescript@5.4.5) + specifier: 1.1.2 + version: 1.1.2(svelte@4.2.17)(typescript@5.4.5) '@radix-ui/colors': specifier: ^3.0.0 version: 3.0.0 @@ -21,8 +21,8 @@ importers: specifier: ^1.3.0 version: 1.3.0(react@18.3.1) '@radix-ui/themes': - specifier: ^2.0.0 - version: 2.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^3.0.0 + version: 3.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': specifier: ^5.0.0 version: 5.40.0(react@18.3.1) @@ -32,7 +32,13 @@ importers: react-dom: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) + react-hot-toast: + specifier: ^2.4.1 + version: 2.4.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: + '@tanstack/react-query-devtools': + specifier: ^5.0.0 + version: 5.49.2(@tanstack/react-query@5.40.0(react@18.3.1))(react@18.3.1) '@types/react': specifier: ^18.2.15 version: 18.3.3 @@ -66,6 +72,9 @@ importers: vite: specifier: ^4.4.4 version: 4.5.3 + vite-tsconfig-paths: + specifier: ^4.3.2 + version: 4.3.2(typescript@5.4.5)(vite@4.5.3) packages: @@ -322,24 +331,24 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@mysten/bcs@1.0.0': - resolution: {integrity: sha512-GhdAFPJZztnlFF2bFrjprjreCGpYtN3LMVCrWjLTT44xwwafphFqTYQEgCHkqGobg05P2EBoG7cMcF3skmkPwg==} + '@mysten/bcs@1.0.2': + resolution: {integrity: sha512-haHT0km/9yIIe8lwo8gDFxGLnoxfRF4WmEVCz4lDXbEVQRsZkF0zB97kukiwMjDuFBaGVUhrOMCLz6td8tSMaQ==} - '@mysten/dapp-kit@0.14.3': - resolution: {integrity: sha512-iOEOBJ7VR/zkaA5rkYliUNtZAOP7scEDHBpq2Px5rApleEkoMGX09fgxRPDfIj3dZ467NyvEOKgebU+kpfvj4w==} + '@mysten/dapp-kit@0.14.9': + resolution: {integrity: sha512-QatDVBkstuYpKw7mXgeyzXfTzHUAqE9KLhHrD/hcX/zkJ7e2x7XFZbbFQzr7PU6IYuuswAE+aemQEiQoRDiwww==} peerDependencies: '@tanstack/react-query': ^5.0.0 react: '*' - '@mysten/sui@1.0.3': - resolution: {integrity: sha512-mkz0QwbHvhuXtiPhdQA47nXeH4M2aKMNeFBE7F+4RSWeMXa4g4ojrXURI2OAc9KZc1qFxas7ZcZKAbF3qto72w==} + '@mysten/sui@1.1.2': + resolution: {integrity: sha512-S1MfGvbkUxKGd39bfA6G21UVwJSSgJW8uKHinSByjt86+YKvSZxlF5zr6RVKcP4Rn8gl5ytMbZQfCPn+0nuGTg==} engines: {node: '>=18'} - '@mysten/wallet-standard@0.12.3': - resolution: {integrity: sha512-bbObcLV0gVdH56kbCZ8ZoSU+6ll4Ihvh1ShigPgKcpfvRCHMd16VOQ8X6WwPC8RoQx26rcQVxrejmH8H8ATBrw==} + '@mysten/wallet-standard@0.12.9': + resolution: {integrity: sha512-7UDiu11VkA8phWf/EVjZMSQqqQ6KzaZGr5OiqG1RsbrnVmAz3DApNLxHbBiH3rOJZL8CG0c+V6mHlenCVLrSDg==} - '@mysten/zksend@0.9.3': - resolution: {integrity: sha512-MkVCUCG7xLky3lYDf0ZgX7Vif3PA4yGYo8J1YpQiJ6XYnHh/kNVxkJFc8M9pCfDGko6neCzYVVXdGscCfAKHPg==} + '@mysten/zksend@0.9.9': + resolution: {integrity: sha512-8xUz4Alz4s8c0p36AlHiGzJkiedYK1CjZG5FojEoZY7v3Vu+0nvOIjS9fixCTGlUGHvBKpQuIKuuX3bEl6XESA==} '@noble/curves@1.4.0': resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} @@ -363,32 +372,35 @@ packages: '@radix-ui/colors@3.0.0': resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} - '@radix-ui/number@1.0.1': - resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} + '@radix-ui/number@1.1.0': + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} '@radix-ui/primitive@1.0.1': resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} - '@radix-ui/react-accessible-icon@1.0.3': - resolution: {integrity: sha512-duVGKeWPSUILr/MdlPxV+GeULTc2rS1aihGdQ3N2qCUPMgxYLxvAsHJM3mCVLF8d5eK+ympmB22mb1F3a5biNw==} + '@radix-ui/primitive@1.1.0': + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + + '@radix-ui/react-accessible-icon@1.1.0': + resolution: {integrity: sha512-i9Zg4NOSXlfUva0agzI2DjWrvFJm9uO4L6CMW7nmMa5CIOOX/Yin894W7WwjodFQWPwe5kmAJ4JF33R8slKI2g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-alert-dialog@1.0.5': - resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} + '@radix-ui/react-alert-dialog@1.1.1': + resolution: {integrity: sha512-wmCoJwj7byuVuiLKqDLlX7ClSUU0vd9sdCeM+2Ls+uf13+cpSJoMgwysHq1SGVVkJj5Xn0XWi1NoRCdkMpr6Mw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -408,39 +420,52 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-aspect-ratio@1.0.3': - resolution: {integrity: sha512-fXR5kbMan9oQqMuacfzlGG/SQMcmMlZ4wrvpckv8SgUulD0MMpspxJrxg/Gp/ISV3JfV1AeSWTYK9GvxA4ySwA==} + '@radix-ui/react-arrow@1.1.0': + resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-avatar@1.0.4': - resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} + '@radix-ui/react-aspect-ratio@1.1.0': + resolution: {integrity: sha512-dP87DM/Y7jFlPgUZTlhx6FF5CEzOiaxp2rBCKlaXlpH5Ip/9Fg5zZ9lDOQ5o/MOfUlf36eak14zoWYpgcgGoOg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-checkbox@1.0.4': - resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} + '@radix-ui/react-avatar@1.1.0': + resolution: {integrity: sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-checkbox@1.1.0': + resolution: {integrity: sha512-3+kSzVfMONtP3B6CvaOrXLVTyGYws7tGmG5kOY0AfyH9sexkLytIwciNwjZhY0RoGOEbxI7bMS21XYB8H5itWQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -460,6 +485,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-collection@1.1.0': + resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-compose-refs@1.0.1': resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: @@ -469,13 +507,22 @@ packages: '@types/react': optional: true - '@radix-ui/react-context-menu@2.1.5': - resolution: {integrity: sha512-R5XaDj06Xul1KGb+WP8qiOh7tKJNz2durpLBXAGZjSVtctcRFCuEvy2gtMwRJGePwQQE5nV77gs4FwRi8T+r2g==} + '@radix-ui/react-compose-refs@1.1.0': + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context-menu@2.2.1': + resolution: {integrity: sha512-wvMKKIeb3eOrkJ96s722vcidZ+2ZNfcYZWBPRHIB1VWrF+fiF851Io6LX0kmK5wTDQFKdulCCKJk2c3SBaQHvA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -491,6 +538,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-context@1.1.0': + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dialog@1.0.5': resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} peerDependencies: @@ -504,6 +560,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dialog@1.1.1': + resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-direction@1.0.1': resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: @@ -513,6 +582,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dismissable-layer@1.0.5': resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: @@ -526,6 +604,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dismissable-layer@1.1.0': + resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-dropdown-menu@2.0.6': resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} peerDependencies: @@ -539,6 +630,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dropdown-menu@2.1.1': + resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-guards@1.0.1': resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: @@ -548,6 +652,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-focus-guards@1.1.0': + resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-focus-scope@1.0.4': resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: @@ -561,26 +674,39 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-form@0.0.3': - resolution: {integrity: sha512-kgE+Z/haV6fxE5WqIXj05KkaXa3OkZASoTDy25yX2EIp/x0c54rOH/vFr5nOZTg7n7T1z8bSyXmiVIFP9bbhPQ==} + '@radix-ui/react-focus-scope@1.1.0': + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-hover-card@1.0.7': - resolution: {integrity: sha512-OcUN2FU0YpmajD/qkph3XzMcK/NmSk9hGWnjV68p6QiZMgILugusgQwnLSDs3oFSJYGKf3Y49zgFedhGh04k9A==} + '@radix-ui/react-form@0.1.0': + resolution: {integrity: sha512-1/oVYPDjbFILOLIarcGcMKo+y6SbTVT/iUKVEw59CF4offwZgBgC3ZOeSBewjqU0vdA6FWTPWTN63obj55S/tQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-hover-card@1.1.1': + resolution: {integrity: sha512-IwzAOP97hQpDADYVKrEEHUH/b2LA+9MgB0LgdmnbFO2u/3M5hmEofjjr2M6CyzUblaAqJdFm6B7oFtU72DPXrA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -601,13 +727,22 @@ packages: '@types/react': optional: true - '@radix-ui/react-label@2.0.2': - resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.0': + resolution: {integrity: sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -627,13 +762,39 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popover@1.0.7': - resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} + '@radix-ui/react-menu@2.1.1': + resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-navigation-menu@1.2.0': + resolution: {integrity: sha512-OQ8tcwAOR0DhPlSY3e4VMXeHiol7la4PPdJWhhwJiJA+NLX0SaCaonOkRnI3gCDHoZ7Fo7bb/G6q25fRM2Y+3Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.1': + resolution: {integrity: sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -653,6 +814,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-popper@1.2.0': + resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-portal@1.0.4': resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: @@ -666,6 +840,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-portal@1.1.1': + resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-presence@1.0.1': resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: @@ -679,6 +866,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-presence@1.1.0': + resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-primitive@1.0.3': resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: @@ -692,13 +892,39 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-radio-group@1.1.3': - resolution: {integrity: sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==} + '@radix-ui/react-primitive@2.0.0': + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-progress@1.1.0': + resolution: {integrity: sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-radio-group@1.2.0': + resolution: {integrity: sha512-yv+oiLaicYMBpqgfpSPw6q+RyXlLdIpQWDHZbUKURxe+nEh53hFXPPlfhfQQtYkS5MMK/5IWIa76SksleQZSzw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -718,52 +944,52 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-scroll-area@1.0.5': - resolution: {integrity: sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==} + '@radix-ui/react-roving-focus@1.1.0': + resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-select@2.0.0': - resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} + '@radix-ui/react-scroll-area@1.1.0': + resolution: {integrity: sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-separator@1.0.3': - resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} + '@radix-ui/react-select@2.1.1': + resolution: {integrity: sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-slider@1.1.2': - resolution: {integrity: sha512-NKs15MJylfzVsCagVSWKhGGLNR1W9qWs+HtgbmjjVUB3B9+lb3PYoXxVju3kOrpf0VKyVCtZp+iTwVoqpa1Chw==} + '@radix-ui/react-slider@1.2.0': + resolution: {integrity: sha512-dAHCDA4/ySXROEPaRtaMV5WHL8+JB/DbtyTbJjYkY0RXmKMO2Ln8DFZhywG5/mVQ4WqHDBc8smc14yPXPqZHYA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -779,39 +1005,74 @@ packages: '@types/react': optional: true - '@radix-ui/react-switch@1.0.3': - resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} + '@radix-ui/react-slot@1.1.0': + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.1.0': + resolution: {integrity: sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-tabs@1.0.4': - resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} + '@radix-ui/react-tabs@1.1.0': + resolution: {integrity: sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-tooltip@1.0.7': - resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} + '@radix-ui/react-toggle-group@1.1.0': + resolution: {integrity: sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle@1.1.0': + resolution: {integrity: sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.1.1': + resolution: {integrity: sha512-LLE8nzNE4MzPMw3O2zlVlkLFid3y9hMUs7uCbSHyKSo+tCN4yMCf+ZCCcfrYgsOC0TiHBPQ1mtpJ2liY3ZT3SQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -827,6 +1088,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-controllable-state@1.0.1': resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: @@ -836,6 +1106,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-escape-keydown@1.0.3': resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: @@ -845,6 +1124,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-layout-effect@1.0.1': resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: @@ -854,11 +1142,20 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-previous@1.0.1': - resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.0': + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -872,6 +1169,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-size@1.0.1': resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: @@ -881,13 +1187,22 @@ packages: '@types/react': optional: true - '@radix-ui/react-visually-hidden@1.0.3': - resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.1.0': + resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -897,13 +1212,16 @@ packages: '@radix-ui/rect@1.0.1': resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} - '@radix-ui/themes@2.0.3': - resolution: {integrity: sha512-yaXQ8aWT2P1CQ0Xe6YCRD9HXsfMTvKkrIYkrc4aitCzhGTLS0sjtTqKmrxIWMVA+3DIbEuG9K/8aAMRJBhep8g==} + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + + '@radix-ui/themes@3.1.1': + resolution: {integrity: sha512-G+j+x+7kyqQXnn+ftlNPgk1DdZ8h/vVZnLsG4hZB0Mxw4fdKCh1tThQuXDSBNWhFt/vTG79BMzRMiflovENrmA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: 16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: 16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -1000,6 +1318,15 @@ packages: '@tanstack/query-core@5.40.0': resolution: {integrity: sha512-eD8K8jsOIq0Z5u/QbvOmfvKKE/XC39jA7yv4hgpl/1SRiU+J8QCIwgM/mEHuunQsL87dcvnHqSVLmf9pD4CiaA==} + '@tanstack/query-devtools@5.49.1': + resolution: {integrity: sha512-9mBtuq76fp+OE780ImoNG109bM7lucZ9MLPLzAkQ2OMx+X6s3BfVATySTxm1Mrtui3qJIFo05ZI4zv9A44+GAg==} + + '@tanstack/react-query-devtools@5.49.2': + resolution: {integrity: sha512-ARQ8GXaTcwXyXIv215sfFqT9s87Jj8vP8jAc9LlC28M+4RbexfBRvm+cra3Cn/xlXJrUEjijf+vUf1Ju9F1XJQ==} + peerDependencies: + '@tanstack/react-query': ^5.49.2 + react: ^18 || ^19 + '@tanstack/react-query@5.40.0': resolution: {integrity: sha512-iv/W0Axc4aXhFzkrByToE1JQqayxTPNotCoSCnarR/A1vDIHaoKpg7FTIfP3Ev2mbKn1yrxq0ZKYUdLEJxs6Tg==} peerDependencies: @@ -1214,8 +1541,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - classnames@2.5.1: - resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + classnames@2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} @@ -1435,7 +1762,15 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gql.tada@1.7.5: + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + goober@2.1.14: + resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==} + peerDependencies: + csstype: ^3.0.10 + + gql.tada@1.7.5: resolution: {integrity: sha512-GepPTee+FWSVVZQ7GiJHzsGNo7gOb59kcn4mUPYLlkbpeJfOUwpuoB05ZNaXG0W4qZVPd1I7R2UgMHBjY1lGlQ==} hasBin: true peerDependencies: @@ -1671,6 +2006,23 @@ packages: peerDependencies: react: ^18.3.1 + react-hot-toast@2.4.1: + resolution: {integrity: sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16' + react-dom: '>=16' + + react-remove-scroll-bar@2.3.4: + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-remove-scroll-bar@2.3.6: resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} engines: {node: '>=10'} @@ -1691,6 +2043,16 @@ packages: '@types/react': optional: true + react-remove-scroll@2.5.7: + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-style-singleton@2.2.1: resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} @@ -1792,6 +2154,16 @@ packages: peerDependencies: typescript: '>=4.2.0' + tsconfck@3.1.1: + resolution: {integrity: sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -1842,6 +2214,14 @@ packages: valibot@0.25.0: resolution: {integrity: sha512-cmD0ca15oyAbT75iYLNW6uU6doAeIwYfOshpXka/E1Bx4frzbkrgb7gvkI7K0YK/DVOksei4FfxWfRoBP3NFTg==} + vite-tsconfig-paths@4.3.2: + resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + vite@4.5.3: resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2098,15 +2478,15 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@mysten/bcs@1.0.0': + '@mysten/bcs@1.0.2': dependencies: bs58: 5.0.0 - '@mysten/dapp-kit@0.14.3(@tanstack/react-query@5.40.0(react@18.3.1))(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(svelte@4.2.17)(typescript@5.4.5)': + '@mysten/dapp-kit@0.14.9(@tanstack/react-query@5.40.0(react@18.3.1))(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(svelte@4.2.17)(typescript@5.4.5)': dependencies: - '@mysten/sui': 1.0.3(svelte@4.2.17)(typescript@5.4.5) - '@mysten/wallet-standard': 0.12.3(svelte@4.2.17)(typescript@5.4.5) - '@mysten/zksend': 0.9.3(svelte@4.2.17)(typescript@5.4.5) + '@mysten/sui': 1.1.2(svelte@4.2.17)(typescript@5.4.5) + '@mysten/wallet-standard': 0.12.9(svelte@4.2.17)(typescript@5.4.5) + '@mysten/zksend': 0.9.9(svelte@4.2.17)(typescript@5.4.5) '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dropdown-menu': 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) @@ -2126,10 +2506,10 @@ snapshots: - svelte - typescript - '@mysten/sui@1.0.3(svelte@4.2.17)(typescript@5.4.5)': + '@mysten/sui@1.1.2(svelte@4.2.17)(typescript@5.4.5)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@mysten/bcs': 1.0.0 + '@mysten/bcs': 1.0.2 '@noble/curves': 1.4.0 '@noble/hashes': 1.4.0 '@scure/bip32': 1.4.0 @@ -2144,18 +2524,18 @@ snapshots: - svelte - typescript - '@mysten/wallet-standard@0.12.3(svelte@4.2.17)(typescript@5.4.5)': + '@mysten/wallet-standard@0.12.9(svelte@4.2.17)(typescript@5.4.5)': dependencies: - '@mysten/sui': 1.0.3(svelte@4.2.17)(typescript@5.4.5) + '@mysten/sui': 1.1.2(svelte@4.2.17)(typescript@5.4.5) '@wallet-standard/core': 1.0.3 transitivePeerDependencies: - svelte - typescript - '@mysten/zksend@0.9.3(svelte@4.2.17)(typescript@5.4.5)': + '@mysten/zksend@0.9.9(svelte@4.2.17)(typescript@5.4.5)': dependencies: - '@mysten/sui': 1.0.3(svelte@4.2.17)(typescript@5.4.5) - '@mysten/wallet-standard': 0.12.3(svelte@4.2.17)(typescript@5.4.5) + '@mysten/sui': 1.1.2(svelte@4.2.17)(typescript@5.4.5) + '@mysten/wallet-standard': 0.12.9(svelte@4.2.17)(typescript@5.4.5) mitt: 3.0.1 nanostores: 0.9.5 valibot: 0.25.0 @@ -2183,33 +2563,31 @@ snapshots: '@radix-ui/colors@3.0.0': {} - '@radix-ui/number@1.0.1': - dependencies: - '@babel/runtime': 7.24.6 + '@radix-ui/number@1.1.0': {} '@radix-ui/primitive@1.0.1': dependencies: '@babel/runtime': 7.24.6 - '@radix-ui/react-accessible-icon@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/primitive@1.1.0': {} + + '@radix-ui/react-accessible-icon@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-alert-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -2226,40 +2604,46 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-aspect-ratio@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-avatar@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-aspect-ratio@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-avatar@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-checkbox@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -2279,6 +2663,18 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2286,15 +2682,20 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@radix-ui/react-context-menu@2.1.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-context-menu@2.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -2308,6 +2709,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-context@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-dialog@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2331,6 +2738,28 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-direction@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2338,6 +2767,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-direction@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2352,6 +2787,19 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2368,6 +2816,21 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2375,6 +2838,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2387,33 +2856,42 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-form@0.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-label': 2.0.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-hover-card@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-form@0.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-label': 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-hover-card@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -2432,10 +2910,16 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@radix-ui/react-label@2.0.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-id@1.1.0(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -2469,26 +2953,73 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-popover@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-navigation-menu@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-popover@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.3)(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 @@ -2512,6 +3043,24 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-portal@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2522,6 +3071,16 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2533,6 +3092,16 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2543,115 +3112,137 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-radio-group@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-progress@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-scroll-area@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/number': 1.0.1 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-radio-group@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-select@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 - '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-separator@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-slider@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/number': 1.0.1 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-scroll-area@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-select@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-slider@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -2666,54 +3257,84 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@radix-ui/react-switch@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-slot@1.1.0(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-switch@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-tabs@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tabs@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-toggle-group@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-toggle@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-tooltip@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -2727,6 +3348,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2735,6 +3362,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2743,6 +3377,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2750,9 +3391,14 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@radix-ui/react-use-previous@1.0.1(@types/react@18.3.3)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 react: 18.3.1 optionalDependencies: '@types/react': 18.3.3 @@ -2765,6 +3411,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-use-size@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.6 @@ -2773,10 +3426,16 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -2787,37 +3446,47 @@ snapshots: dependencies: '@babel/runtime': 7.24.6 - '@radix-ui/themes@2.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/rect@1.1.0': {} + + '@radix-ui/themes@3.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/colors': 3.0.0 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-accessible-icon': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-alert-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-aspect-ratio': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-avatar': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-checkbox': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-context-menu': 2.1.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-dropdown-menu': 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-form': 0.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-hover-card': 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popover': 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-radio-group': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-scroll-area': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-select': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slider': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-switch': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-tabs': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-tooltip': 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-accessible-icon': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-alert-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-aspect-ratio': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-avatar': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-checkbox': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context-menu': 2.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dropdown-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-form': 0.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-hover-card': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-navigation-menu': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popover': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-progress': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-radio-group': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-scroll-area': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-select': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slider': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-switch': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tabs': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle-group': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tooltip': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.3.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + react-remove-scroll-bar: 2.3.4(@types/react@18.3.3)(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 @@ -2891,6 +3560,14 @@ snapshots: '@tanstack/query-core@5.40.0': {} + '@tanstack/query-devtools@5.49.1': {} + + '@tanstack/react-query-devtools@5.49.2(@tanstack/react-query@5.40.0(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/query-devtools': 5.49.1 + '@tanstack/react-query': 5.40.0(react@18.3.1) + react: 18.3.1 + '@tanstack/react-query@5.40.0(react@18.3.1)': dependencies: '@tanstack/query-core': 5.40.0 @@ -3155,7 +3832,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - classnames@2.5.1: {} + classnames@2.3.2: {} clsx@2.1.1: {} @@ -3409,6 +4086,12 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + globrex@0.1.2: {} + + goober@2.1.14(csstype@3.1.3): + dependencies: + csstype: 3.1.3 + gql.tada@1.7.5(graphql@16.8.1)(svelte@4.2.17)(typescript@5.4.5): dependencies: '@0no-co/graphql.web': 1.0.7(graphql@16.8.1) @@ -3618,6 +4301,22 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 + react-hot-toast@2.4.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + goober: 2.1.14(csstype@3.1.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - csstype + + react-remove-scroll-bar@2.3.4(@types/react@18.3.3)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) + tslib: 2.6.2 + optionalDependencies: + '@types/react': 18.3.3 + react-remove-scroll-bar@2.3.6(@types/react@18.3.3)(react@18.3.1): dependencies: react: 18.3.1 @@ -3637,6 +4336,17 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + react-remove-scroll@2.5.7(@types/react@18.3.3)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) + tslib: 2.6.2 + use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + react-style-singleton@2.2.1(@types/react@18.3.3)(react@18.3.1): dependencies: get-nonce: 1.0.1 @@ -3730,6 +4440,10 @@ snapshots: dependencies: typescript: 5.4.5 + tsconfck@3.1.1(typescript@5.4.5): + optionalDependencies: + typescript: 5.4.5 + tslib@2.6.2: {} tweetnacl@1.0.3: {} @@ -3767,6 +4481,17 @@ snapshots: valibot@0.25.0: {} + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@4.5.3): + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 3.1.1(typescript@5.4.5) + optionalDependencies: + vite: 4.5.3 + transitivePeerDependencies: + - supports-color + - typescript + vite@4.5.3: dependencies: esbuild: 0.18.20 From 292785be5b49555e99e19b2ededec85359cd4fcf Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Thu, 4 Jul 2024 21:17:59 +0100 Subject: [PATCH 11/24] fixup: pnpm workspace unignore tic-tac-toe Use --ignore-workspace when installing instead. --- pnpm-workspace.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index cc3ce9beb1928..908c7ee00ae94 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,7 +5,6 @@ packages: - 'examples/**' - '!**/dist/**' - '!**/.next/**' - - '!examples/tic-tac-toe/**' - '!sdk/create-dapp/templates' - '!sdk/typescript/scripts' - '!sdk/typescript/transactions' From 5139b2f54d972d7eb44de4409c09b48fadcd2e50 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Mon, 8 Jul 2024 14:42:54 +0100 Subject: [PATCH 12/24] fixup: Use `sui client publish` to perform publish command. --- examples/tic-tac-toe/scripts/publish.sh | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/examples/tic-tac-toe/scripts/publish.sh b/examples/tic-tac-toe/scripts/publish.sh index 4550f4e3a4066..652859eeb013f 100755 --- a/examples/tic-tac-toe/scripts/publish.sh +++ b/examples/tic-tac-toe/scripts/publish.sh @@ -24,13 +24,7 @@ fi ENV=$1 $SUI client switch --env $ENV -MOVE_PACKAGE_PATH=../move -PUBLISH=$( - $SUI client ptb \ - --publish ../move --assign cap \ - --transfer-objects [cap] "@$($SUI client active-address)" \ - --json -) +PUBLISH=$($SUI client publish --json ../move) STATUS=$( echo $PUBLISH | @@ -57,7 +51,7 @@ UPGRADE_CAP=$( ) CONFIG="$(readlink -f ../ui/src)/env.$ENV.ts" -cat > $CONFIG <<-EOF +cat > $CONFIG < Date: Mon, 8 Jul 2024 14:46:55 +0100 Subject: [PATCH 13/24] fixup: Allow extra arguments to be passed to publish script --- examples/tic-tac-toe/scripts/publish.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/tic-tac-toe/scripts/publish.sh b/examples/tic-tac-toe/scripts/publish.sh index 652859eeb013f..fd1b7c8d86d85 100755 --- a/examples/tic-tac-toe/scripts/publish.sh +++ b/examples/tic-tac-toe/scripts/publish.sh @@ -21,10 +21,10 @@ if [ -z "$1" ]; then echo "Error: No environment provided." exit 1 fi -ENV=$1 +ENV=$1; shift $SUI client switch --env $ENV -PUBLISH=$($SUI client publish --json ../move) +PUBLISH=$($SUI client publish ../move --json $@) STATUS=$( echo $PUBLISH | From d65e3b4357ee032cefce3decf4434eef8ae9bdf6 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Mon, 8 Jul 2024 16:19:43 +0100 Subject: [PATCH 14/24] fixup: publish to testnet --- examples/tic-tac-toe/cli/testnet.env | 2 ++ examples/tic-tac-toe/ui/src/config.ts | 3 ++- examples/tic-tac-toe/ui/src/env.testnet.ts | 7 +++++++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 examples/tic-tac-toe/cli/testnet.env create mode 100644 examples/tic-tac-toe/ui/src/env.testnet.ts diff --git a/examples/tic-tac-toe/cli/testnet.env b/examples/tic-tac-toe/cli/testnet.env new file mode 100644 index 0000000000000..ef820a9f2fa66 --- /dev/null +++ b/examples/tic-tac-toe/cli/testnet.env @@ -0,0 +1,2 @@ +PKG=0x4e646af16d0eb9bf31585bb04df1220bd176e9fb6c17234088f808664bdf10df +CAP=0x3027130b6a9a1a43e661093a7c09aeea1a34224bf38be5eb310d727d9d54da4b diff --git a/examples/tic-tac-toe/ui/src/config.ts b/examples/tic-tac-toe/ui/src/config.ts index 83fb3962be12b..cb0e1b0384198 100644 --- a/examples/tic-tac-toe/ui/src/config.ts +++ b/examples/tic-tac-toe/ui/src/config.ts @@ -5,6 +5,7 @@ import { createNetworkConfig } from '@mysten/dapp-kit'; import { getFullnodeUrl } from '@mysten/sui/client'; import LocalnetPackage from './env.localnet.ts'; +import TestnetPackage from './env.testnet.ts'; const NoPackage = { packageId: null, upgradeCap: null }; @@ -27,7 +28,7 @@ const { networkConfig, useNetworkVariable } = createNetworkConfig({ url: getFullnodeUrl('testnet'), variables: { explorer: (id: string) => `https://suiscan.xyz/testnet/object/${id}/`, - ...NoPackage, + ...TestnetPackage, }, }, mainnet: { diff --git a/examples/tic-tac-toe/ui/src/env.testnet.ts b/examples/tic-tac-toe/ui/src/env.testnet.ts new file mode 100644 index 0000000000000..36c911f8fc21b --- /dev/null +++ b/examples/tic-tac-toe/ui/src/env.testnet.ts @@ -0,0 +1,7 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +export default { + packageId: '0x4e646af16d0eb9bf31585bb04df1220bd176e9fb6c17234088f808664bdf10df', + upgradeCap: '0x3027130b6a9a1a43e661093a7c09aeea1a34224bf38be5eb310d727d9d54da4b', +}; From 782d41094bb62a83582e59cb01b59821e8f35d4a Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Mon, 8 Jul 2024 16:20:19 +0100 Subject: [PATCH 15/24] fixup: Use Polymedia for local explorer Couldn't get SuiScan's local explorer to work. --- examples/tic-tac-toe/ui/src/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tic-tac-toe/ui/src/config.ts b/examples/tic-tac-toe/ui/src/config.ts index cb0e1b0384198..0483192decb66 100644 --- a/examples/tic-tac-toe/ui/src/config.ts +++ b/examples/tic-tac-toe/ui/src/config.ts @@ -13,7 +13,7 @@ const { networkConfig, useNetworkVariable } = createNetworkConfig({ localnet: { url: getFullnodeUrl('localnet'), variables: { - explorer: (id: string) => `https://suiscan.xyz/custom/object/${id}/?network=0.0.0.0%3A9000`, + explorer: (id: string) => `https://explorer.polymedia.app/object/${id}/?network=local`, ...LocalnetPackage, }, }, From bb5302d34f3899696b6e627194119f78492c7165 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Mon, 8 Jul 2024 16:20:40 +0100 Subject: [PATCH 16/24] fixup: Default to testnet in UI. --- examples/tic-tac-toe/ui/src/main.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tic-tac-toe/ui/src/main.tsx b/examples/tic-tac-toe/ui/src/main.tsx index 57ee14a634b0f..16573f290bc92 100644 --- a/examples/tic-tac-toe/ui/src/main.tsx +++ b/examples/tic-tac-toe/ui/src/main.tsx @@ -21,7 +21,7 @@ ReactDOM.createRoot(document.getElementById('root')!).render( - +
From 370f92f742060dc80d3efab965eddf94a080be62 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Mon, 8 Jul 2024 16:20:55 +0100 Subject: [PATCH 17/24] fixup: InvalidateTrophyQuery typo --- examples/tic-tac-toe/ui/src/hooks/useTrophyQuery.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tic-tac-toe/ui/src/hooks/useTrophyQuery.ts b/examples/tic-tac-toe/ui/src/hooks/useTrophyQuery.ts index d9614dd447934..49a31dde04c3f 100644 --- a/examples/tic-tac-toe/ui/src/hooks/useTrophyQuery.ts +++ b/examples/tic-tac-toe/ui/src/hooks/useTrophyQuery.ts @@ -28,7 +28,7 @@ const REFETCH_INTERVAL = 5000; * depends on the value of `kind` (will not be enabled unless `kind` * is available). */ -export function useTrophyQuery(game?: Game): [UseTrophyQueryResponse, InvalidateTrophy] { +export function useTrophyQuery(game?: Game): [UseTrophyQueryResponse, InvalidateTrophyQuery] { const client = useSuiClient(); const queryClient = useQueryClient(); const tx = useTransactions()!!; From 5b2554832126ccbca09b7c53e07e16537814a0ab Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Mon, 8 Jul 2024 16:25:59 +0100 Subject: [PATCH 18/24] fixup: Stub configs for devnet/mainnet. --- examples/tic-tac-toe/ui/src/config.ts | 8 ++++---- examples/tic-tac-toe/ui/src/env.devnet.ts | 7 +++++++ examples/tic-tac-toe/ui/src/env.mainnet.ts | 7 +++++++ 3 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 examples/tic-tac-toe/ui/src/env.devnet.ts create mode 100644 examples/tic-tac-toe/ui/src/env.mainnet.ts diff --git a/examples/tic-tac-toe/ui/src/config.ts b/examples/tic-tac-toe/ui/src/config.ts index 0483192decb66..d24b71575cd1a 100644 --- a/examples/tic-tac-toe/ui/src/config.ts +++ b/examples/tic-tac-toe/ui/src/config.ts @@ -4,11 +4,11 @@ import { createNetworkConfig } from '@mysten/dapp-kit'; import { getFullnodeUrl } from '@mysten/sui/client'; +import DevnetPackage from './env.devnet.ts'; import LocalnetPackage from './env.localnet.ts'; +import MainnetPackage from './env.mainnet.ts'; import TestnetPackage from './env.testnet.ts'; -const NoPackage = { packageId: null, upgradeCap: null }; - const { networkConfig, useNetworkVariable } = createNetworkConfig({ localnet: { url: getFullnodeUrl('localnet'), @@ -21,7 +21,7 @@ const { networkConfig, useNetworkVariable } = createNetworkConfig({ url: getFullnodeUrl('devnet'), variables: { explorer: (id: string) => `https://suiscan.xyz/devnet/object/${id}/`, - ...NoPackage, + ...DevnetPackage, }, }, testnet: { @@ -35,7 +35,7 @@ const { networkConfig, useNetworkVariable } = createNetworkConfig({ url: getFullnodeUrl('mainnet'), variables: { explorer: (id: string) => `https://suiscan.xyz/mainnet/object/${id}/`, - ...NoPackage, + ...MainnetPackage, }, }, }); diff --git a/examples/tic-tac-toe/ui/src/env.devnet.ts b/examples/tic-tac-toe/ui/src/env.devnet.ts new file mode 100644 index 0000000000000..233779ffc0f33 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/env.devnet.ts @@ -0,0 +1,7 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +export default { + packageId: null, + upgradeCap: null, +}; diff --git a/examples/tic-tac-toe/ui/src/env.mainnet.ts b/examples/tic-tac-toe/ui/src/env.mainnet.ts new file mode 100644 index 0000000000000..233779ffc0f33 --- /dev/null +++ b/examples/tic-tac-toe/ui/src/env.mainnet.ts @@ -0,0 +1,7 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +export default { + packageId: null, + upgradeCap: null, +}; From 2d536640dcd89cb0b8333223dd03985fc58e81d1 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Mon, 8 Jul 2024 16:27:45 +0100 Subject: [PATCH 19/24] fixup: stub out localnet env This will change for each person, so don't check-in an actual package. --- examples/tic-tac-toe/ui/src/env.localnet.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/tic-tac-toe/ui/src/env.localnet.ts b/examples/tic-tac-toe/ui/src/env.localnet.ts index d1eb7fb9171d4..233779ffc0f33 100644 --- a/examples/tic-tac-toe/ui/src/env.localnet.ts +++ b/examples/tic-tac-toe/ui/src/env.localnet.ts @@ -2,6 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 export default { - packageId: '0x44e5164c24e21f28d91deb0ace10d5ec24d38a639e949cc6ac3358b563bb946c', - upgradeCap: '0xc96d3b69ee99f85ff7561c990741d297adcc83551126b1c09cc44520f75b4e20', + packageId: null, + upgradeCap: null, }; From 32bd53758b888ed31a2cd7495181fedec1647288 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Tue, 9 Jul 2024 12:21:16 +0100 Subject: [PATCH 20/24] fixup: Address some more comments. - useExecutor exposes more info about mutation status, we leverage this for the play buttons. - Early return style for validation labels. - Strict equality for address validation. - `<>` instead of `
` --- .../ui/src/components/NewMultiSigGame.tsx | 18 +++++---- .../ui/src/components/NewSharedGame.tsx | 20 +++++----- .../tic-tac-toe/ui/src/hooks/useExecutor.ts | 37 +++++++++++++++++-- examples/tic-tac-toe/ui/src/main.tsx | 4 +- examples/tic-tac-toe/ui/src/pages/Game.tsx | 6 +-- 5 files changed, 60 insertions(+), 25 deletions(-) diff --git a/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx b/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx index cb8d49d1319ac..d85a3fa86e3f1 100644 --- a/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx +++ b/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx @@ -6,7 +6,7 @@ import { PublicKey } from '@mysten/sui/cryptography'; import { fromB64, toB64 } from '@mysten/sui/utils'; import { publicKeyFromRawBytes } from '@mysten/sui/verify'; import { ExclamationTriangleIcon } from '@radix-ui/react-icons'; -import { Box, Button, Em, Flex, Separator, Text, TextField } from '@radix-ui/themes'; +import { Box, Button, Em, Flex, Separator, Spinner, Text, TextField } from '@radix-ui/themes'; import { ComputedField } from 'components/ComputedField'; import { useExecutor } from 'hooks/useExecutor'; import { useTransactions } from 'hooks/useTransactions'; @@ -15,11 +15,11 @@ import { ReactElement, useState } from 'react'; /** * Form for creating a new multi-sig game. */ -export function NewMultiSigGame() { +export function NewMultiSigGame(): ReactElement { // SAFETY: tests that a package exists, so Transactions // builder should be available. const tx = useTransactions()!!; - const signAndExecute = useExecutor(); + const { mutate: signAndExecute, isPending } = useExecutor(); const { address, publicKey: bytes } = useCurrentAccount() || {}; const [opponent, setOpponent] = useState(null); @@ -67,8 +67,8 @@ export function NewMultiSigGame() { /> - @@ -102,16 +102,18 @@ function Validation({ Wallet not connected. ); - } else if (!hasOpponent) { + } + + if (!hasOpponent) { return ( Invalid opponent public key. ); - } else { - return ; } + + return ; } /** diff --git a/examples/tic-tac-toe/ui/src/components/NewSharedGame.tsx b/examples/tic-tac-toe/ui/src/components/NewSharedGame.tsx index a065e00ec62de..6b50e7176d40a 100644 --- a/examples/tic-tac-toe/ui/src/components/NewSharedGame.tsx +++ b/examples/tic-tac-toe/ui/src/components/NewSharedGame.tsx @@ -4,7 +4,7 @@ import { useCurrentAccount } from '@mysten/dapp-kit'; import { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils'; import { ExclamationTriangleIcon } from '@radix-ui/react-icons'; -import { Box, Button, Em, Flex, Separator, Text, TextField } from '@radix-ui/themes'; +import { Box, Button, Em, Flex, Separator, Spinner, Text, TextField } from '@radix-ui/themes'; import { useExecutor } from 'hooks/useExecutor'; import { useTransactions } from 'hooks/useTransactions'; import { ReactElement, useState } from 'react'; @@ -14,11 +14,11 @@ import { ComputedField } from './ComputedField'; /** * Form for creating a new shared game. */ -export function NewSharedGame() { +export function NewSharedGame(): ReactElement { // SAFETY: tests that a package exists, so Transactions // builder should be available. const tx = useTransactions()!!; - const signAndExecute = useExecutor(); + const { mutate: signAndExecute, isPending } = useExecutor(); const player = useCurrentAccount()?.address; const [opponent, setOpponent] = useState(null); @@ -57,8 +57,8 @@ export function NewSharedGame() { /> - @@ -86,16 +86,18 @@ function Validation({ Wallet not connected. ); - } else if (!hasOpponent) { + } + + if (!hasOpponent) { return ( Invalid opponent address. ); - } else { - return ; } + + return ; } /** @@ -108,7 +110,7 @@ function normalizedAddress(address?: string): string | null { } address = address.trim(); - if (address == '') { + if (address === '') { return null; } diff --git a/examples/tic-tac-toe/ui/src/hooks/useExecutor.ts b/examples/tic-tac-toe/ui/src/hooks/useExecutor.ts index b342927d9137b..5cc3401ecf4c4 100644 --- a/examples/tic-tac-toe/ui/src/hooks/useExecutor.ts +++ b/examples/tic-tac-toe/ui/src/hooks/useExecutor.ts @@ -8,7 +8,9 @@ import { Transaction } from '@mysten/sui/transactions'; type Options = Omit[0], 'digest'> & { tx: Transaction; }; + type ExecuteResponse = { digest: string; rawEffects?: number[] }; + type ExecuteCallback = ({ bytes, signature, @@ -16,18 +18,37 @@ type ExecuteCallback = ({ bytes: string; signature: string; }) => Promise; + type ResponseCallback = (tx: SuiTransactionBlockResponse) => void | Promise; type Executor = (options: Options, then: ResponseCallback) => void; +type ExecutorResult = { + mutate: Executor; + status: string; + isIdle: boolean; + isPending: boolean; + isSuccess: boolean; + isError: boolean; + isPaused: boolean; +}; + /** * Hook encapsulating running a transaction, waiting for its effects * and then doing something with them. */ -export function useExecutor({ execute }: { execute?: ExecuteCallback } = {}): Executor { +export function useExecutor({ execute }: { execute?: ExecuteCallback } = {}): ExecutorResult { const client = useSuiClient(); - const { mutate: signAndExecute } = useSignAndExecuteTransaction({ execute }); + const { + mutate: signAndExecute, + status, + isIdle, + isPending, + isSuccess, + isError, + isPaused, + } = useSignAndExecuteTransaction({ execute }); - return ({ tx, ...options }, then) => { + const mutate: Executor = ({ tx, ...options }, then) => { signAndExecute( { transaction: tx, @@ -43,4 +64,14 @@ export function useExecutor({ execute }: { execute?: ExecuteCallback } = {}): Ex }, ); }; + + return { + mutate, + status, + isIdle, + isPending, + isSuccess, + isError, + isPaused, + }; } diff --git a/examples/tic-tac-toe/ui/src/main.tsx b/examples/tic-tac-toe/ui/src/main.tsx index 16573f290bc92..99542241ee971 100644 --- a/examples/tic-tac-toe/ui/src/main.tsx +++ b/examples/tic-tac-toe/ui/src/main.tsx @@ -23,10 +23,10 @@ ReactDOM.createRoot(document.getElementById('root')!).render( -
+ <> -
+
diff --git a/examples/tic-tac-toe/ui/src/pages/Game.tsx b/examples/tic-tac-toe/ui/src/pages/Game.tsx index 9903b85ccb58d..e5f6d7cf28f61 100644 --- a/examples/tic-tac-toe/ui/src/pages/Game.tsx +++ b/examples/tic-tac-toe/ui/src/pages/Game.tsx @@ -114,7 +114,7 @@ function SharedGame({ invalidateTrophy: InvalidateTrophyQuery; }): ReactElement { const account = useCurrentAccount(); - const signAndExecute = useExecutor(); + const { mutate: signAndExecute } = useExecutor(); const tx = useTransactions()!!; const { id, board, turn, x, o } = game; @@ -168,8 +168,8 @@ function OwnedGame({ const adminKey = game.admin ? new MultiSigPublicKey(new Uint8Array(game.admin)) : null; const client = useSuiClient(); - const signAndExecute = useExecutor(); - const multiSignAndExecute = useExecutor({ + const { mutate: signAndExecute } = useExecutor(); + const { mutate: multiSignAndExecute } = useExecutor({ execute: ({ bytes, signature }) => { // SAFETY: We check below whether the admin key is available, // and only allow moves to be submitted when it is. From 5c56895694699a560c09be7c7b34ec29ae5173b7 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Tue, 9 Jul 2024 12:26:12 +0100 Subject: [PATCH 21/24] fixup: Move useExecutor to a mutations directory --- .../tic-tac-toe/ui/src/components/NewMultiSigGame.tsx | 8 ++++++-- examples/tic-tac-toe/ui/src/components/NewSharedGame.tsx | 2 +- .../ui/src/{hooks => mutations}/useExecutor.ts | 0 examples/tic-tac-toe/ui/src/pages/Game.tsx | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) rename examples/tic-tac-toe/ui/src/{hooks => mutations}/useExecutor.ts (100%) diff --git a/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx b/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx index d85a3fa86e3f1..fc37d6cafabfa 100644 --- a/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx +++ b/examples/tic-tac-toe/ui/src/components/NewMultiSigGame.tsx @@ -8,8 +8,8 @@ import { publicKeyFromRawBytes } from '@mysten/sui/verify'; import { ExclamationTriangleIcon } from '@radix-ui/react-icons'; import { Box, Button, Em, Flex, Separator, Spinner, Text, TextField } from '@radix-ui/themes'; import { ComputedField } from 'components/ComputedField'; -import { useExecutor } from 'hooks/useExecutor'; import { useTransactions } from 'hooks/useTransactions'; +import { useExecutor } from 'mutations/useExecutor'; import { ReactElement, useState } from 'react'; /** @@ -67,7 +67,11 @@ export function NewMultiSigGame(): ReactElement { /> - diff --git a/examples/tic-tac-toe/ui/src/components/NewSharedGame.tsx b/examples/tic-tac-toe/ui/src/components/NewSharedGame.tsx index 6b50e7176d40a..613a6d77db842 100644 --- a/examples/tic-tac-toe/ui/src/components/NewSharedGame.tsx +++ b/examples/tic-tac-toe/ui/src/components/NewSharedGame.tsx @@ -5,8 +5,8 @@ import { useCurrentAccount } from '@mysten/dapp-kit'; import { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils'; import { ExclamationTriangleIcon } from '@radix-ui/react-icons'; import { Box, Button, Em, Flex, Separator, Spinner, Text, TextField } from '@radix-ui/themes'; -import { useExecutor } from 'hooks/useExecutor'; import { useTransactions } from 'hooks/useTransactions'; +import { useExecutor } from 'mutations/useExecutor'; import { ReactElement, useState } from 'react'; import { ComputedField } from './ComputedField'; diff --git a/examples/tic-tac-toe/ui/src/hooks/useExecutor.ts b/examples/tic-tac-toe/ui/src/mutations/useExecutor.ts similarity index 100% rename from examples/tic-tac-toe/ui/src/hooks/useExecutor.ts rename to examples/tic-tac-toe/ui/src/mutations/useExecutor.ts diff --git a/examples/tic-tac-toe/ui/src/pages/Game.tsx b/examples/tic-tac-toe/ui/src/pages/Game.tsx index e5f6d7cf28f61..37dd9c89cee55 100644 --- a/examples/tic-tac-toe/ui/src/pages/Game.tsx +++ b/examples/tic-tac-toe/ui/src/pages/Game.tsx @@ -11,11 +11,11 @@ import { Board } from 'components/Board'; import { Error } from 'components/Error'; import { IDLink } from 'components/IDLink'; import { Loading } from 'components/Loading'; -import { useExecutor } from 'hooks/useExecutor'; import { Game as GameData, InvalidateGameQuery, Mark, useGameQuery } from 'hooks/useGameQuery'; import { useTransactions } from 'hooks/useTransactions'; import { InvalidateTrophyQuery, Trophy, useTrophyQuery } from 'hooks/useTrophyQuery'; import { useTurnCapQuery } from 'hooks/useTurnCapQuery'; +import { useExecutor } from 'mutations/useExecutor'; import { ReactElement } from 'react'; type Props = { From 5cb33460d588d41ac841518671ddbaabc9ef0eac Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Tue, 9 Jul 2024 13:06:53 +0100 Subject: [PATCH 22/24] fixup: re-publish to testnet --- examples/tic-tac-toe/cli/testnet.env | 4 ++-- examples/tic-tac-toe/ui/src/env.testnet.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/tic-tac-toe/cli/testnet.env b/examples/tic-tac-toe/cli/testnet.env index ef820a9f2fa66..82f064b8a08ed 100644 --- a/examples/tic-tac-toe/cli/testnet.env +++ b/examples/tic-tac-toe/cli/testnet.env @@ -1,2 +1,2 @@ -PKG=0x4e646af16d0eb9bf31585bb04df1220bd176e9fb6c17234088f808664bdf10df -CAP=0x3027130b6a9a1a43e661093a7c09aeea1a34224bf38be5eb310d727d9d54da4b +PKG=0xd35ada3fa1a85b111c72865e5f60edc692aa98401e2f95a7449365bbb6d3f1a0 +CAP=0x42a239e01cfdf5b7176e9d9de434f4490e01621f04156d1992c67b3f3d431b4f diff --git a/examples/tic-tac-toe/ui/src/env.testnet.ts b/examples/tic-tac-toe/ui/src/env.testnet.ts index 36c911f8fc21b..f779317798c40 100644 --- a/examples/tic-tac-toe/ui/src/env.testnet.ts +++ b/examples/tic-tac-toe/ui/src/env.testnet.ts @@ -2,6 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 export default { - packageId: '0x4e646af16d0eb9bf31585bb04df1220bd176e9fb6c17234088f808664bdf10df', - upgradeCap: '0x3027130b6a9a1a43e661093a7c09aeea1a34224bf38be5eb310d727d9d54da4b', + packageId: '0xd35ada3fa1a85b111c72865e5f60edc692aa98401e2f95a7449365bbb6d3f1a0', + upgradeCap: '0x42a239e01cfdf5b7176e9d9de434f4490e01621f04156d1992c67b3f3d431b4f', }; From 09152854181095310b573577611515b14987ac40 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Wed, 10 Jul 2024 20:31:33 +0100 Subject: [PATCH 23/24] fixup: re-publish to testnet --- examples/tic-tac-toe/cli/testnet.env | 4 ++-- examples/tic-tac-toe/ui/src/env.testnet.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/tic-tac-toe/cli/testnet.env b/examples/tic-tac-toe/cli/testnet.env index 82f064b8a08ed..1a5b4c62fb5dc 100644 --- a/examples/tic-tac-toe/cli/testnet.env +++ b/examples/tic-tac-toe/cli/testnet.env @@ -1,2 +1,2 @@ -PKG=0xd35ada3fa1a85b111c72865e5f60edc692aa98401e2f95a7449365bbb6d3f1a0 -CAP=0x42a239e01cfdf5b7176e9d9de434f4490e01621f04156d1992c67b3f3d431b4f +PKG=0x1812951b018fcd9f2262d160acdaff5b432011c58fae80eb981c7be3370167da +CAP=0x71a69d9d7319c0c86e0a5266746f85481840064e19fdb491ce83843851f5fe9d diff --git a/examples/tic-tac-toe/ui/src/env.testnet.ts b/examples/tic-tac-toe/ui/src/env.testnet.ts index f779317798c40..9c47a9a46aa39 100644 --- a/examples/tic-tac-toe/ui/src/env.testnet.ts +++ b/examples/tic-tac-toe/ui/src/env.testnet.ts @@ -2,6 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 export default { - packageId: '0xd35ada3fa1a85b111c72865e5f60edc692aa98401e2f95a7449365bbb6d3f1a0', - upgradeCap: '0x42a239e01cfdf5b7176e9d9de434f4490e01621f04156d1992c67b3f3d431b4f', + packageId: '0x1812951b018fcd9f2262d160acdaff5b432011c58fae80eb981c7be3370167da', + upgradeCap: '0x71a69d9d7319c0c86e0a5266746f85481840064e19fdb491ce83843851f5fe9d', }; From f308c58f066141ebabc85bb5442206252edc9b49 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Thu, 11 Jul 2024 00:31:45 +0100 Subject: [PATCH 24/24] fixup: Exclude from workspace --- pnpm-workspace.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 908c7ee00ae94..9bc321c5d61b2 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,6 +3,7 @@ packages: - 'apps/**' - 'dapps/**' - 'examples/**' + - '!examples/tic-tac-toe/**' - '!**/dist/**' - '!**/.next/**' - '!sdk/create-dapp/templates'