diff --git a/web/bun.lock b/web/bun.lock index d5330ab..5dc891f 100644 --- a/web/bun.lock +++ b/web/bun.lock @@ -5,6 +5,7 @@ "": { "name": "untitledui-vite-starter-kit", "dependencies": { + "@hookform/resolvers": "^5.2.2", "@solana/kit": "^6.1.0", "@solana/react": "^6.1.0", "@tailwindcss/typography": "^0.5.19", @@ -20,6 +21,7 @@ "react-aria": "^3.46.0", "react-aria-components": "^1.15.1", "react-dom": "^19.2.3", + "react-hook-form": "^7.71.2", "react-hotkeys-hook": "^5.2.3", "react-router": "^7.13.0", "solana-kite": "^3.2.1", @@ -27,6 +29,7 @@ "tailwindcss": "^4.1.18", "tailwindcss-animate": "^1.0.7", "tailwindcss-react-aria-components": "^2.0.1", + "zod": "^4.3.6", }, "devDependencies": { "@tailwindcss/postcss": "^4.1.18", @@ -164,6 +167,8 @@ "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.6.2", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA=="], + "@hookform/resolvers": ["@hookform/resolvers@5.2.2", "", { "dependencies": { "@standard-schema/utils": "^0.3.0" }, "peerDependencies": { "react-hook-form": "^7.55.0" } }, "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA=="], + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], @@ -560,6 +565,8 @@ "@solana/wallet-standard-features": ["@solana/wallet-standard-features@1.3.0", "", { "dependencies": { "@wallet-standard/base": "^1.1.0", "@wallet-standard/features": "^1.1.0" } }, "sha512-ZhpZtD+4VArf6RPitsVExvgkF+nGghd1rzPjd97GmBximpnt1rsUxMOEyoIEuH3XBxPyNB6Us7ha7RHWQR+abg=="], + "@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="], + "@swc/core": ["@swc/core@1.15.10", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.25" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.15.10", "@swc/core-darwin-x64": "1.15.10", "@swc/core-linux-arm-gnueabihf": "1.15.10", "@swc/core-linux-arm64-gnu": "1.15.10", "@swc/core-linux-arm64-musl": "1.15.10", "@swc/core-linux-x64-gnu": "1.15.10", "@swc/core-linux-x64-musl": "1.15.10", "@swc/core-win32-arm64-msvc": "1.15.10", "@swc/core-win32-ia32-msvc": "1.15.10", "@swc/core-win32-x64-msvc": "1.15.10" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-udNofxftduMUEv7nqahl2nvodCiCDQ4Ge0ebzsEm6P8s0RC2tBM0Hqx0nNF5J/6t9uagFJyWIDjXy3IIWMHDJw=="], "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.15.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-U72pGqmJYbjrLhMndIemZ7u9Q9owcJczGxwtfJlz/WwMaGYAV/g4nkGiUVk/+QSX8sFCAjanovcU1IUsP2YulA=="], @@ -1254,6 +1261,8 @@ "react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], + "react-hook-form": ["react-hook-form@7.71.2", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-1CHvcDYzuRUNOflt4MOq3ZM46AronNJtQ1S7tnX6YN4y72qhgiUItpacZUAQ0TyWYci3yz1X+rXaSxiuEm86PA=="], + "react-hotkeys-hook": ["react-hotkeys-hook@5.2.3", "", { "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-Q27F8EuImYJOVSXAjSQrQPj9cx4GSNY+WdSdk5tSNN085H8/a00W6LZp0PrytEDwF6iT0pGTJeVEDKPRpEK2Bg=="], "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], diff --git a/web/index.html b/web/index.html index 467b21e..82c2fab 100644 --- a/web/index.html +++ b/web/index.html @@ -4,7 +4,10 @@ - + diff --git a/web/package.json b/web/package.json index c219f18..4f348d0 100644 --- a/web/package.json +++ b/web/package.json @@ -13,6 +13,7 @@ "format:fix": "bunx prettier --write ." }, "dependencies": { + "@hookform/resolvers": "^5.2.2", "@solana/kit": "^6.1.0", "@solana/react": "^6.1.0", "@tailwindcss/typography": "^0.5.19", @@ -28,13 +29,15 @@ "react-aria": "^3.46.0", "react-aria-components": "^1.15.1", "react-dom": "^19.2.3", + "react-hook-form": "^7.71.2", "react-hotkeys-hook": "^5.2.3", "react-router": "^7.13.0", "solana-kite": "^3.2.1", "tailwind-merge": "^3.4.0", "tailwindcss": "^4.1.18", "tailwindcss-animate": "^1.0.7", - "tailwindcss-react-aria-components": "^2.0.1" + "tailwindcss-react-aria-components": "^2.0.1", + "zod": "^4.3.6" }, "devDependencies": { "@tailwindcss/postcss": "^4.1.18", diff --git a/web/src/components/application/app-layout.tsx b/web/src/components/application/app-layout.tsx index b393737..77e4e79 100644 --- a/web/src/components/application/app-layout.tsx +++ b/web/src/components/application/app-layout.tsx @@ -1,12 +1,7 @@ import type { FC } from 'react'; -import { Outlet, useLocation } from 'react-router'; +import { Link, Outlet, useLocation } from 'react-router'; -import { - Globe05, - Monitor04, - Send01, - Signal01, -} from '@untitledui/icons'; +import { Globe05, Monitor04, Send01, Signal01 } from '@untitledui/icons'; import { ConnectWalletMenu } from '@/components/application/connect-wallet-menu'; import { cx } from '@/utils/cx'; @@ -33,26 +28,24 @@ export function AppLayout() {
{/* Logo */} - + Samizdat samizdat - + {/* Nav */}
diff --git a/web/src/components/application/connect-wallet-menu.tsx b/web/src/components/application/connect-wallet-menu.tsx index e526d36..40ebc08 100644 --- a/web/src/components/application/connect-wallet-menu.tsx +++ b/web/src/components/application/connect-wallet-menu.tsx @@ -43,11 +43,7 @@ function ConnectableWalletItem({ const nextAccounts = await connect(); // Prefer first new account for (const next of nextAccounts) { - if ( - !existingAccounts.some(existing => - uiWalletAccountsAreSame(next, existing) - ) - ) { + if (!existingAccounts.some(existing => uiWalletAccountsAreSame(next, existing))) { onAccountSelect(next); return; } @@ -84,9 +80,7 @@ function ConnectableWalletItem({ {wallet.name} - {isConnected && ( - - )} + {isConnected && } {/* Connected accounts */} @@ -172,7 +166,7 @@ export function ConnectWalletMenu() { for (const wallet of wallets) { if ( wallet.features.includes(StandardConnect) && - wallet.features.includes(StandardDisconnect) && + wallet.features.includes(StandardDisconnect) && wallet.chains.includes(chainDetails.chain) ) { connectable.push(wallet); @@ -182,7 +176,7 @@ export function ConnectWalletMenu() { return ( - @@ -186,7 +179,7 @@ export function LandingPage() { {/* Oversized bg accent text */}