From 5dd9a1856246158029a69f15ce4cca5edab0c869 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Tue, 16 Dec 2025 01:38:24 +0100 Subject: [PATCH 01/24] added contract abi to frontend --- frontend/lib/Abi.ts | 901 ++++++++++++++++++++++++++++++++++++++++++ frontend/lib/utils.ts | 11 +- 2 files changed, 903 insertions(+), 9 deletions(-) create mode 100644 frontend/lib/Abi.ts diff --git a/frontend/lib/Abi.ts b/frontend/lib/Abi.ts new file mode 100644 index 0000000..de40ab5 --- /dev/null +++ b/frontend/lib/Abi.ts @@ -0,0 +1,901 @@ +export const PONG_ABI = [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "CannotJoinOwnGame", + "type": "error" + }, + { + "inputs": [], + "name": "GameExpired", + "type": "error" + }, + { + "inputs": [], + "name": "GameNotFound", + "type": "error" + }, + { + "inputs": [], + "name": "GameplayPaused", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientPowerups", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPowerupType", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidStatus", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidStatusTransition", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidWinner", + "type": "error" + }, + { + "inputs": [], + "name": "NotGameParticipant", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "Player2NotJoined", + "type": "error" + }, + { + "inputs": [], + "name": "Player2SlotNotEmpty", + "type": "error" + }, + { + "inputs": [], + "name": "PlayerGamesLimitExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "ReentrancyGuardReentrantCall", + "type": "error" + }, + { + "inputs": [], + "name": "TransferFailed", + "type": "error" + }, + { + "inputs": [], + "name": "Unauthorized", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + } + ], + "name": "FeeWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + }, + { + "indexed": true, + "internalType": "address", + "name": "player1", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "createdAt", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "status", + "type": "uint8" + } + ], + "name": "GameCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + }, + { + "indexed": true, + "internalType": "address", + "name": "winner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "loser", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "winnerAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "devFeeAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "completedAt", + "type": "uint64" + } + ], + "name": "GameEnded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + }, + { + "indexed": true, + "internalType": "address", + "name": "player2", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + } + ], + "name": "GameJoined", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "powerupType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "countGranted", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "totalCount", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + } + ], + "name": "PowerupGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + }, + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "powerupType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + } + ], + "name": "PowerupUsed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + }, + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + } + ], + "name": "RefundClaimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + }, + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + } + ], + "name": "TimeoutRefund", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "paused", + "type": "bool" + }, + { + "indexed": true, + "internalType": "address", + "name": "toggledBy", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + } + ], + "name": "VaultPauseToggled", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + } + ], + "name": "claimTimeoutRefund", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "createGame", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "devFeeVault", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + }, + { + "internalType": "address", + "name": "winner", + "type": "address" + } + ], + "name": "endGame", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + } + ], + "name": "getAllPowerups", + "outputs": [ + { + "internalType": "uint64", + "name": "padStretch", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "multiball", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "shield", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDevFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + } + ], + "name": "getGame", + "outputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + }, + { + "internalType": "address", + "name": "player1", + "type": "address" + }, + { + "internalType": "address", + "name": "player2", + "type": "address" + }, + { + "internalType": "uint256", + "name": "stakeAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "escrowBalance", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, + { + "internalType": "address", + "name": "winner", + "type": "address" + }, + { + "internalType": "uint64", + "name": "createdAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "completedAt", + "type": "uint64" + } + ], + "internalType": "struct PingPong.GameSession", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + } + ], + "name": "getGameEscrow", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + } + ], + "name": "getGameStatus", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + } + ], + "name": "getPlayerGameCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + } + ], + "name": "getPlayerGames", + "outputs": [ + { + "internalType": "uint64[]", + "name": "", + "type": "uint64[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "internalType": "uint8", + "name": "powerupType", + "type": "uint8" + } + ], + "name": "getPowerupCount", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalGames", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint8", + "name": "powerupType", + "type": "uint8" + } + ], + "name": "grantPowerup", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "inventories", + "outputs": [ + { + "internalType": "uint64", + "name": "padStretchCount", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "multiballCount", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "shieldCount", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + } + ], + "name": "isGameExists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isVaultPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + } + ], + "name": "joinGame", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + } + ], + "name": "requestRefund", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "togglePause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalGames", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "gameId", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "powerupType", + "type": "uint8" + } + ], + "name": "usePowerup", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawDevFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] as const; \ No newline at end of file diff --git a/frontend/lib/utils.ts b/frontend/lib/utils.ts index aff5dc8..f736d48 100644 --- a/frontend/lib/utils.ts +++ b/frontend/lib/utils.ts @@ -8,20 +8,13 @@ export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) } -// export const config = getDefaultConfig({ -// appName: 'My RainbowKit App', -// projectId: 'YOUR_PROJECT_ID', -// chains: [base, baseSepolia], -// ssr:true -// }) - export const wagmiAdapter = new WagmiAdapter({ storage: createStorage({ storage: cookieStorage }), ssr: true, - projectId: "project id", + projectId: process.env.NEXT_PUBLIC_PROJECT_ID!, networks: [base, baseSepolia] }) -export const config = wagmiAdapter.wagmiConfig \ No newline at end of file +export const config = wagmiAdapter.wagmiConfig; \ No newline at end of file From 2090178acf6f6fdba08b49677c0125326876d88a Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Tue, 16 Dec 2025 01:45:21 +0100 Subject: [PATCH 02/24] update(integration): add useCOnect hook for game play integration --- frontend/lib/Abi.ts | 2 +- frontend/pages/pongPage.tsx | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/lib/Abi.ts b/frontend/lib/Abi.ts index de40ab5..50f1476 100644 --- a/frontend/lib/Abi.ts +++ b/frontend/lib/Abi.ts @@ -898,4 +898,4 @@ export const PONG_ABI = [ "stateMutability": "payable", "type": "receive" } -] as const; \ No newline at end of file +] as const; diff --git a/frontend/pages/pongPage.tsx b/frontend/pages/pongPage.tsx index f1412b8..8ac0523 100644 --- a/frontend/pages/pongPage.tsx +++ b/frontend/pages/pongPage.tsx @@ -2,12 +2,13 @@ import Navbar from "@/components/commons/navbar"; import BoostPack from "@/components/pong/boostPack"; import BottomCard from "@/components/pong/Bottomcard"; import { motion } from "framer-motion"; - +import useConnect from "@/lib/hooks/useConnect"; export default function PongPage() { + const { connectFreeGame } = useConnect() const games = [ - { texts: "Quick Match", gameType: "Free", action: () => { } }, + { texts: "Quick Match", gameType: "Free", action: connectFreeGame(address)}, { texts: "Create / Join", gameType: "Free", action: () => {} }, { texts: "Friendly Stake", gameType: "Stake", action: () => {} }, { texts: "Compete", gameType: "Stake", action: ()=> {} } From a9ab17205b0197245628b9dcf898d65a550b8a9f Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Tue, 16 Dec 2025 01:49:04 +0100 Subject: [PATCH 03/24] update deprecated useAccount usage --- frontend/pages/pongPage.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/pages/pongPage.tsx b/frontend/pages/pongPage.tsx index 8ac0523..aed0c94 100644 --- a/frontend/pages/pongPage.tsx +++ b/frontend/pages/pongPage.tsx @@ -3,12 +3,14 @@ import BoostPack from "@/components/pong/boostPack"; import BottomCard from "@/components/pong/Bottomcard"; import { motion } from "framer-motion"; import useConnect from "@/lib/hooks/useConnect"; - +import { useAppKitAccount } from "@reown/appkit/react"; export default function PongPage() { - const { connectFreeGame } = useConnect() + const { connectFreeGame } = useConnect(); + const { address } = useAppKitAccount() + const games = [ - { texts: "Quick Match", gameType: "Free", action: connectFreeGame(address)}, + { texts: "Quick Match", gameType: "Free", action: function(){connectFreeGame(address)}}, { texts: "Create / Join", gameType: "Free", action: () => {} }, { texts: "Friendly Stake", gameType: "Stake", action: () => {} }, { texts: "Compete", gameType: "Stake", action: ()=> {} } From 99e2d13089361557fceac7beef1a7ed75f143baa Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Tue, 16 Dec 2025 02:02:23 +0100 Subject: [PATCH 04/24] update: added useAccount hook, added connectFreeGame func --- frontend/lib/hooks/useConnect.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 frontend/lib/hooks/useConnect.ts diff --git a/frontend/lib/hooks/useConnect.ts b/frontend/lib/hooks/useConnect.ts new file mode 100644 index 0000000..e2a9737 --- /dev/null +++ b/frontend/lib/hooks/useConnect.ts @@ -0,0 +1,8 @@ +export default function useConnect() { + const connectFreeGame = (address: `0x${string}`) => { + console.log(address) + } + return { + connectFreeGame + } +} \ No newline at end of file From 5a90e4d7fdb95b14a6bea8d331c0ac9996cd385e Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Tue, 16 Dec 2025 02:10:49 +0100 Subject: [PATCH 05/24] added address validationn before execution for game connection --- frontend/lib/hooks/useConnect.ts | 5 ++++- frontend/pages/pongPage.tsx | 28 +++++++++++++++++++--------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/frontend/lib/hooks/useConnect.ts b/frontend/lib/hooks/useConnect.ts index e2a9737..3d97558 100644 --- a/frontend/lib/hooks/useConnect.ts +++ b/frontend/lib/hooks/useConnect.ts @@ -1,5 +1,8 @@ +import { Hex } from "viem" + export default function useConnect() { - const connectFreeGame = (address: `0x${string}`) => { + const connectFreeGame = (address: Hex) => { + console.log(address) } return { diff --git a/frontend/pages/pongPage.tsx b/frontend/pages/pongPage.tsx index aed0c94..362a0bb 100644 --- a/frontend/pages/pongPage.tsx +++ b/frontend/pages/pongPage.tsx @@ -4,22 +4,32 @@ import BottomCard from "@/components/pong/Bottomcard"; import { motion } from "framer-motion"; import useConnect from "@/lib/hooks/useConnect"; import { useAppKitAccount } from "@reown/appkit/react"; - +import { Hex } from "viem"; +import { toast } from "sonner"; + export default function PongPage() { const { connectFreeGame } = useConnect(); const { address } = useAppKitAccount() - - const games = [ - { texts: "Quick Match", gameType: "Free", action: function(){connectFreeGame(address)}}, - { texts: "Create / Join", gameType: "Free", action: () => {} }, - { texts: "Friendly Stake", gameType: "Stake", action: () => {} }, - { texts: "Compete", gameType: "Stake", action: ()=> {} } + + const games = [ + { + texts: "Quick Match", gameType: "Free", action: function () { + if (!address) { + toast.error("Plese connect our wallet") + return; + } + connectFreeGame(address as Hex) + } + }, + { texts: "Create / Join", gameType: "Free", action: () => { } }, + { texts: "Friendly Stake", gameType: "Stake", action: () => { } }, + { texts: "Compete", gameType: "Stake", action: () => { } } ]; return (
-
+
{games.map((game, idx) => ( -
{game.texts}
({game.gameType})
+
{game.texts}
({game.gameType})
))}
From d3110fe136f3bf417e889296346433bf90f02a67 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Tue, 16 Dec 2025 15:55:00 +0100 Subject: [PATCH 06/24] update checkout --- frontend/components/ui/select.tsx | 190 ++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 frontend/components/ui/select.tsx diff --git a/frontend/components/ui/select.tsx b/frontend/components/ui/select.tsx new file mode 100644 index 0000000..88302a8 --- /dev/null +++ b/frontend/components/ui/select.tsx @@ -0,0 +1,190 @@ +"use client" + +import * as React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Select({ + ...props +}: React.ComponentProps) { + return +} + +function SelectGroup({ + ...props +}: React.ComponentProps) { + return +} + +function SelectValue({ + ...props +}: React.ComponentProps) { + return +} + +function SelectTrigger({ + className, + size = "default", + children, + ...props +}: React.ComponentProps & { + size?: "sm" | "default" +}) { + return ( + + {children} + + + + + ) +} + +function SelectContent({ + className, + children, + position = "item-aligned", + align = "center", + ...props +}: React.ComponentProps) { + return ( + + + + + {children} + + + + + ) +} + +function SelectLabel({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SelectItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function SelectSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SelectScrollUpButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function SelectScrollDownButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +export { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectScrollDownButton, + SelectScrollUpButton, + SelectSeparator, + SelectTrigger, + SelectValue, +} From 7927be126a65326475040bbeb5ea412c06486c33 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:03:22 +0100 Subject: [PATCH 07/24] update(integration): comment out workflow --- .github/workflows/main.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index a731918..0144959 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -1,5 +1,5 @@ -on: - push: - branch: ["main", "dev"] +# on: +# push: +# branch: ["main", "dev"] -jobs: \ No newline at end of file +# jobs: \ No newline at end of file From 76a7c973ee2923c08071ff1b4cf5b4ca1a27d4c3 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:05:44 +0100 Subject: [PATCH 08/24] update(integration): added chess page --- frontend/app/chess/page.tsx | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 frontend/app/chess/page.tsx diff --git a/frontend/app/chess/page.tsx b/frontend/app/chess/page.tsx new file mode 100644 index 0000000..b324c0b --- /dev/null +++ b/frontend/app/chess/page.tsx @@ -0,0 +1,6 @@ + +export default function ChessPage() { + return ( + + ) +} \ No newline at end of file From cde03f77331a84672cefd3b2810df011efb7c9d2 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:06:40 +0100 Subject: [PATCH 09/24] update(integration): added chess page importation --- frontend/app/chess/page.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/app/chess/page.tsx b/frontend/app/chess/page.tsx index b324c0b..84a7d52 100644 --- a/frontend/app/chess/page.tsx +++ b/frontend/app/chess/page.tsx @@ -1,3 +1,4 @@ +import Chess from "@/components/chess"; export default function ChessPage() { return ( From cfc343e3cccc390f2f96d58cef03fe3e3c44f38c Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:12:54 +0100 Subject: [PATCH 10/24] update(integration): added chess component --- frontend/components/chess/index.tsx | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 frontend/components/chess/index.tsx diff --git a/frontend/components/chess/index.tsx b/frontend/components/chess/index.tsx new file mode 100644 index 0000000..b2b2fcc --- /dev/null +++ b/frontend/components/chess/index.tsx @@ -0,0 +1,7 @@ +export default function Chess() { + return ( + <> + + ) +} + \ No newline at end of file From af251249f2ba9a59596fdeab274eadd22cf63e37 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:13:43 +0100 Subject: [PATCH 11/24] update(integration): added piece types --- frontend/lib/utils.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/frontend/lib/utils.ts b/frontend/lib/utils.ts index f736d48..f570548 100644 --- a/frontend/lib/utils.ts +++ b/frontend/lib/utils.ts @@ -17,4 +17,22 @@ export const wagmiAdapter = new WagmiAdapter({ networks: [base, baseSepolia] }) -export const config = wagmiAdapter.wagmiConfig; \ No newline at end of file +export const config = wagmiAdapter.wagmiConfig; +export const pieceSymbols = { + white: { + king: '♔', + queen: '♕', + rook: '♖', + bishop: '♗', + knight: '♘', + pawn: '♙', + }, + black: { + king: '♚', + queen: '♛', + rook: '♜', + bishop: '♝', + knight: '♞', + pawn: '♟', + }, +}; \ No newline at end of file From fc0481441222824e223db8349a2ac2c148c7f9b8 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:18:41 +0100 Subject: [PATCH 12/24] update(integration): added board initializer --- frontend/lib/utils.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/frontend/lib/utils.ts b/frontend/lib/utils.ts index f570548..e785f86 100644 --- a/frontend/lib/utils.ts +++ b/frontend/lib/utils.ts @@ -35,4 +35,22 @@ export const pieceSymbols = { knight: '♞', pawn: '♟', }, -}; \ No newline at end of file +}; +export const initializeBoard = () => { + const board = Array(8) + .fill(null) + .map(() => Array(8).fill(null)); + + for (let i = 0; i < 8; i++) { + board[1][i] = { type: 'pawn', color: 'black' }; + board[6][i] = { type: 'pawn', color: 'white' }; + } + + const setup = ['rook', 'knight', 'bishop', 'queen', 'king', 'bishop', 'knight', 'rook']; + for (let i = 0; i < 8; i++) { + board[0][i] = { type: setup[i], color: 'black' }; + board[7][i] = { type: setup[i], color: 'white' }; + } + + return board; +}; From 12b2c8e7fe76533ea7c66cf0377e1603c674db15 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:53:03 +0100 Subject: [PATCH 13/24] update(integration): added state managements for chess --- frontend/components/chess/index.tsx | 8 ++- frontend/lib/utils.ts | 95 ++++++++++++++++------------- 2 files changed, 59 insertions(+), 44 deletions(-) diff --git a/frontend/components/chess/index.tsx b/frontend/components/chess/index.tsx index b2b2fcc..4f82eef 100644 --- a/frontend/components/chess/index.tsx +++ b/frontend/components/chess/index.tsx @@ -1,7 +1,13 @@ +"use client"; + +import { initializeBoard } from "@/lib/utils"; +import { useState } from "react"; + export default function Chess() { + const [board] = useState(initializeBoard()); + const [selectedSquare, setSelectedSquare] = useState(null); return ( <> ) } - \ No newline at end of file diff --git a/frontend/lib/utils.ts b/frontend/lib/utils.ts index e785f86..297ec29 100644 --- a/frontend/lib/utils.ts +++ b/frontend/lib/utils.ts @@ -1,56 +1,65 @@ -import { clsx, type ClassValue } from "clsx" -import { twMerge } from "tailwind-merge" -import { cookieStorage, createStorage } from '@wagmi/core' -import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' -import { baseSepolia, base } from '@reown/appkit/networks' +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; +import { cookieStorage, createStorage } from "@wagmi/core"; +import { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; +import { baseSepolia, base } from "@reown/appkit/networks"; export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) + return twMerge(clsx(inputs)); } export const wagmiAdapter = new WagmiAdapter({ - storage: createStorage({ - storage: cookieStorage - }), - ssr: true, - projectId: process.env.NEXT_PUBLIC_PROJECT_ID!, - networks: [base, baseSepolia] -}) + storage: createStorage({ + storage: cookieStorage + }), + ssr: true, + projectId: process.env.NEXT_PUBLIC_PROJECT_ID!, + networks: [base, baseSepolia] +}); export const config = wagmiAdapter.wagmiConfig; export const pieceSymbols = { - white: { - king: '♔', - queen: '♕', - rook: '♖', - bishop: '♗', - knight: '♘', - pawn: '♙', - }, - black: { - king: '♚', - queen: '♛', - rook: '♜', - bishop: '♝', - knight: '♞', - pawn: '♟', - }, -}; + white: { + king: "♔", + queen: "♕", + rook: "♖", + bishop: "♗", + knight: "♘", + pawn: "♙" + }, + black: { + king: "♚", + queen: "♛", + rook: "♜", + bishop: "♝", + knight: "♞", + pawn: "♟" + } +}; export const initializeBoard = () => { - const board = Array(8) - .fill(null) - .map(() => Array(8).fill(null)); + const board: {type: string, color:string}[][] = Array(8) + .fill(null) + .map(() => Array(8).fill(null)); - for (let i = 0; i < 8; i++) { - board[1][i] = { type: 'pawn', color: 'black' }; - board[6][i] = { type: 'pawn', color: 'white' }; - } + for (let i = 0; i < 8; i++) { + board[1][i] = { type: "pawn", color: "black" }; + board[6][i] = { type: "pawn", color: "white" }; + } - const setup = ['rook', 'knight', 'bishop', 'queen', 'king', 'bishop', 'knight', 'rook']; - for (let i = 0; i < 8; i++) { - board[0][i] = { type: setup[i], color: 'black' }; - board[7][i] = { type: setup[i], color: 'white' }; - } + const setup = [ + "rook", + "knight", + "bishop", + "queen", + "king", + "bishop", + "knight", + "rook" + ]; + for (let i = 0; i < 8; i++) { + board[0][i] = { type: setup[i], color: "black" }; + board[7][i] = { type: setup[i], color: "white" }; + } - return board; + return board; }; From 35d17d4b7fd53d4d64a840f810bfad9780625066 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:54:34 +0100 Subject: [PATCH 14/24] update(integration): added squareClickHandler --- frontend/components/chess/index.tsx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/frontend/components/chess/index.tsx b/frontend/components/chess/index.tsx index 4f82eef..ebfb846 100644 --- a/frontend/components/chess/index.tsx +++ b/frontend/components/chess/index.tsx @@ -4,8 +4,25 @@ import { initializeBoard } from "@/lib/utils"; import { useState } from "react"; export default function Chess() { + const [board] = useState(initializeBoard()); const [selectedSquare, setSelectedSquare] = useState(null); + + const handleSquareClick = (row, col) => { + const piece = board[row][col]; + + if (selectedSquare) { + const [fromRow, fromCol] = selectedSquare; + handleMakeMove(fromRow, fromCol, row, col); + + setSelectedSquare(null); + } else { + if (piece) { + setSelectedSquare([row, col]); + } + } + }; + return ( <> From f8782b823da23237ea8ba312e3a76b0d9e3cf80c Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:55:02 +0100 Subject: [PATCH 15/24] update(integration): added moveHandler --- frontend/components/chess/index.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/components/chess/index.tsx b/frontend/components/chess/index.tsx index ebfb846..44fb110 100644 --- a/frontend/components/chess/index.tsx +++ b/frontend/components/chess/index.tsx @@ -23,6 +23,11 @@ export default function Chess() { } }; + const handleMakeMove = (fromRow, fromCol, toRow, toCol) => { + console.log(`Move from [${fromRow}, ${fromCol}] to [${toRow}, ${toCol}]`); + }; + + return ( <> From 5278f8204c975dd98011bd63ca89895db5397baf Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:55:39 +0100 Subject: [PATCH 16/24] update(integration): added resetHandler --- frontend/components/chess/index.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/components/chess/index.tsx b/frontend/components/chess/index.tsx index 44fb110..d56c21a 100644 --- a/frontend/components/chess/index.tsx +++ b/frontend/components/chess/index.tsx @@ -27,6 +27,10 @@ export default function Chess() { console.log(`Move from [${fromRow}, ${fromCol}] to [${toRow}, ${toCol}]`); }; + const handleReset = () => { + console.log('Reset board'); + }; + return ( <> From 4f43628f7390048b57d1667bc1b56f37917721c3 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:56:30 +0100 Subject: [PATCH 17/24] update(integration): added chess board header --- frontend/components/chess/index.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/components/chess/index.tsx b/frontend/components/chess/index.tsx index d56c21a..daf82be 100644 --- a/frontend/components/chess/index.tsx +++ b/frontend/components/chess/index.tsx @@ -34,6 +34,11 @@ export default function Chess() { return ( <> +
+

+ Chess Board +

+
) } From 0bb88f48baffa8c2f5e79b7be80e6709148b4f0b Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:58:32 +0100 Subject: [PATCH 18/24] update(integration): added chess board container --- frontend/components/chess/index.tsx | 54 +++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/frontend/components/chess/index.tsx b/frontend/components/chess/index.tsx index daf82be..b54d7dd 100644 --- a/frontend/components/chess/index.tsx +++ b/frontend/components/chess/index.tsx @@ -39,6 +39,60 @@ export default function Chess() { Chess Board
+ +
+ {/* Board Grid */} +
+ {board.map((row, rowIndex) => + row.map((piece, colIndex) => { + // Alternating blue pattern + const isLight = (rowIndex + colIndex) % 2 === 0; + const fileLabel = String.fromCharCode(97 + colIndex); + const rankLabel = 8 - rowIndex; + const showFileLabel = rowIndex === 7; + const showRankLabel = colIndex === 0; + const isSelected = selectedSquare && selectedSquare[0] === rowIndex && selectedSquare[1] === colIndex; + + return ( + + ); + }) + )} +
+
+ + ) } From 9bade0fb29c31a15385c6aa7f8ca80a52b5b6a1d Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:58:54 +0100 Subject: [PATCH 19/24] update(integration): added chess board footer for interactions --- frontend/components/chess/index.tsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/frontend/components/chess/index.tsx b/frontend/components/chess/index.tsx index b54d7dd..b170d1a 100644 --- a/frontend/components/chess/index.tsx +++ b/frontend/components/chess/index.tsx @@ -58,15 +58,15 @@ export default function Chess() { key={`${rowIndex}-${colIndex}`} onClick={() => handleSquareClick(rowIndex, colIndex)} className={`relative aspect-square flex flex-col items-center justify-center transition-all duration-150 cursor-pointer hover:opacity-90 ${isLight - ? 'bg-blue-200' - : 'bg-blue-500' + ? 'bg-blue-200' + : 'bg-blue-500' } ${isSelected ? 'ring-4 ring-yellow-300 ring-inset' : ''}`} > {/* Piece */} {piece && (
{pieceSymbols[piece.color][piece.type]}
@@ -92,7 +92,14 @@ export default function Chess() {
- +
+ +
) } From 880017a49ad51fbbc520838275cfd2a29516c862 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 19:00:16 +0100 Subject: [PATCH 20/24] update(integration): added chess board wrapper --- frontend/components/chess/index.tsx | 120 ++++++++++++++-------------- 1 file changed, 61 insertions(+), 59 deletions(-) diff --git a/frontend/components/chess/index.tsx b/frontend/components/chess/index.tsx index b170d1a..05ba580 100644 --- a/frontend/components/chess/index.tsx +++ b/frontend/components/chess/index.tsx @@ -34,71 +34,73 @@ export default function Chess() { return ( <> -
-

- Chess Board -

-
+
+
+

+ Chess Board +

+
-
- {/* Board Grid */} -
- {board.map((row, rowIndex) => - row.map((piece, colIndex) => { - // Alternating blue pattern - const isLight = (rowIndex + colIndex) % 2 === 0; - const fileLabel = String.fromCharCode(97 + colIndex); - const rankLabel = 8 - rowIndex; - const showFileLabel = rowIndex === 7; - const showRankLabel = colIndex === 0; - const isSelected = selectedSquare && selectedSquare[0] === rowIndex && selectedSquare[1] === colIndex; +
+ {/* Board Grid */} +
+ {board.map((row, rowIndex) => + row.map((piece, colIndex) => { + // Alternating blue pattern + const isLight = (rowIndex + colIndex) % 2 === 0; + const fileLabel = String.fromCharCode(97 + colIndex); + const rankLabel = 8 - rowIndex; + const showFileLabel = rowIndex === 7; + const showRankLabel = colIndex === 0; + const isSelected = selectedSquare && selectedSquare[0] === rowIndex && selectedSquare[1] === colIndex; - return ( - - ); - }) - )} + {/* Rank label (left) */} + {showRankLabel && ( +
+ {rankLabel} +
+ )} + + ); + }) + )} +
-
-
- +
+ +
) From 3b52c928b90a1fb9b9cb39298ae42900a9992cc3 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 19:05:27 +0100 Subject: [PATCH 21/24] update(integration): added chess board topmost wrapper --- .prettierrc | 18 ++++---- frontend/components/chess/index.tsx | 4 +- frontend/tsconfig.json | 64 ++++++++++++++--------------- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/.prettierrc b/.prettierrc index 4216862..354270e 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,10 +1,10 @@ { - "semi": true, - "singleQuote": false, - "trailingComma": "none", - "arrowParens": "always", - "tabWidth": 4, - "useTabs": true, - "bracketSpacing": true, - "bracketSameLine": false -} \ No newline at end of file + "semi": true, + "singleQuote": false, + "trailingComma": "none", + "arrowParens": "always", + "tabWidth": 2, + "useTabs": true, + "bracketSpacing": true, + "bracketSameLine": false +} diff --git a/frontend/components/chess/index.tsx b/frontend/components/chess/index.tsx index 05ba580..0080291 100644 --- a/frontend/components/chess/index.tsx +++ b/frontend/components/chess/index.tsx @@ -33,7 +33,7 @@ export default function Chess() { return ( - <> +

@@ -102,6 +102,6 @@ export default function Chess() {

- +
) } diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 3a13f90..6b4686a 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -1,34 +1,34 @@ { - "compilerOptions": { - "target": "ES2017", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "react-jsx", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": ["./*"] - } - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - ".next/dev/types/**/*.ts", - "**/*.mts" - ], - "exclude": ["node_modules"] + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": ["node_modules"] } From e4338a2d4de03676ac754f8d54b48bb70c83524a Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 19:17:55 +0100 Subject: [PATCH 22/24] chores (integration): type all local vars --- frontend/components/chess/index.tsx | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/frontend/components/chess/index.tsx b/frontend/components/chess/index.tsx index 0080291..2d43300 100644 --- a/frontend/components/chess/index.tsx +++ b/frontend/components/chess/index.tsx @@ -1,14 +1,14 @@ "use client"; -import { initializeBoard } from "@/lib/utils"; +import { initializeBoard, pieceSymbols } from "@/lib/utils"; import { useState } from "react"; export default function Chess() { const [board] = useState(initializeBoard()); - const [selectedSquare, setSelectedSquare] = useState(null); + const [selectedSquare, setSelectedSquare] = useState| null>(null); - const handleSquareClick = (row, col) => { + const handleSquareClick = (row:number, col:number) => { const piece = board[row][col]; if (selectedSquare) { @@ -23,7 +23,7 @@ export default function Chess() { } }; - const handleMakeMove = (fromRow, fromCol, toRow, toCol) => { + const handleMakeMove = (fromRow: number, fromCol: number, toRow: number, toCol: number) => { console.log(`Move from [${fromRow}, ${fromCol}] to [${toRow}, ${toCol}]`); }; @@ -42,11 +42,9 @@ export default function Chess() {
- {/* Board Grid */}
{board.map((row, rowIndex) => row.map((piece, colIndex) => { - // Alternating blue pattern const isLight = (rowIndex + colIndex) % 2 === 0; const fileLabel = String.fromCharCode(97 + colIndex); const rankLabel = 8 - rowIndex; @@ -63,24 +61,21 @@ export default function Chess() { : 'bg-blue-500' } ${isSelected ? 'ring-4 ring-yellow-300 ring-inset' : ''}`} > - {/* Piece */} {piece && (
- {p[piece.color][piece.type]} + {pieceSymbols[piece.color][piece.type]}
)} - {/* File label (bottom) */} {showFileLabel && (
{fileLabel}
)} - {/* Rank label (left) */} {showRankLabel && (
{rankLabel} From cab2c533d47cfd50b7a736e6fd9562a7f65fe7e9 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 23:44:57 +0100 Subject: [PATCH 23/24] chores (integration): edit cheess title --- frontend/components/chess/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/components/chess/index.tsx b/frontend/components/chess/index.tsx index 2d43300..3254f97 100644 --- a/frontend/components/chess/index.tsx +++ b/frontend/components/chess/index.tsx @@ -33,7 +33,7 @@ export default function Chess() { return ( -
+

From 7f332d345d45bb6d83fce00c30909cd56f5b18f6 Mon Sep 17 00:00:00 2001 From: Biokes <106444765+Biokes@users.noreply.github.com> Date: Wed, 17 Dec 2025 23:49:42 +0100 Subject: [PATCH 24/24] update (integration): update --- frontend/components/chess/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/components/chess/index.tsx b/frontend/components/chess/index.tsx index 3254f97..dd1a6ce 100644 --- a/frontend/components/chess/index.tsx +++ b/frontend/components/chess/index.tsx @@ -35,8 +35,8 @@ export default function Chess() { return (
-
-

+
+

Chess Board