Fix UX audit gaps: tablet nav, footer, wallet connect, legacy demotion.
Some checks failed
Deploy Explorer Live / deploy (push) Failing after 13s
Validate Explorer / frontend (push) Successful in 1m29s
Validate Explorer / smoke-e2e (push) Failing after 2m27s

Close the 1024–1279px nav dead zone, align ops/footer labels, split homepage quick links, route successful wallet connect to /wallet with inline errors, add WETH to ops sub-nav, and demote legacy SPA with noindex plus banner.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
defiQUG
2026-05-22 22:30:35 -07:00
parent b213c6547d
commit 4fac5e4856
8 changed files with 86 additions and 32 deletions

View File

@@ -364,6 +364,7 @@ function UiModeToggle({ mobile = false }: { mobile?: boolean }) {
function AccountButton({
walletSession,
connectingWallet,
connectError,
onConnect,
onCopyAddress,
onSwitchWallet,
@@ -371,6 +372,7 @@ function AccountButton({
}: {
walletSession: WalletAccessSession | null
connectingWallet: boolean
connectError?: string | null
onConnect: () => void
onCopyAddress: () => void
onSwitchWallet: () => void
@@ -385,7 +387,7 @@ function AccountButton({
},
{
href: '/wallet',
label: 'Settings',
label: 'Wallet tools',
description: 'Review network, token-list, and wallet configuration guidance.',
},
{
@@ -407,14 +409,21 @@ function AccountButton({
if (!walletSession) {
return (
<button
type="button"
onClick={onConnect}
className="inline-flex items-center gap-2 rounded-2xl bg-gray-950 px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition-colors hover:bg-black focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 dark:bg-white dark:text-gray-950 dark:hover:bg-gray-100 dark:focus-visible:ring-offset-gray-900"
>
<span className="inline-flex h-2.5 w-2.5 rounded-full bg-emerald-400" aria-hidden />
<span>{connectingWallet ? 'Connecting…' : 'Connect Wallet'}</span>
</button>
<div className="flex flex-col items-end gap-1">
<button
type="button"
onClick={onConnect}
className="inline-flex items-center gap-2 rounded-2xl bg-gray-950 px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition-colors hover:bg-black focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 dark:bg-white dark:text-gray-950 dark:hover:bg-gray-100 dark:focus-visible:ring-offset-gray-900"
>
<span className="inline-flex h-2.5 w-2.5 rounded-full bg-emerald-400" aria-hidden />
<span>{connectingWallet ? 'Connecting…' : 'Connect Wallet'}</span>
</button>
{connectError ? (
<p role="alert" className="max-w-xs text-right text-xs text-red-600 dark:text-red-400">
{connectError}
</p>
) : null}
</div>
)
}
@@ -469,6 +478,7 @@ export default function Navbar() {
const [commandPaletteOpen, setCommandPaletteOpen] = useState(false)
const [walletSession, setWalletSession] = useState<WalletAccessSession | null>(null)
const [connectingWallet, setConnectingWallet] = useState(false)
const [walletConnectError, setWalletConnectError] = useState<string | null>(null)
const mobilePanelId = useId()
const isExploreActive =
@@ -528,13 +538,14 @@ export default function Navbar() {
const handleConnectWallet = async () => {
try {
setConnectingWallet(true)
setWalletConnectError(null)
await accessApi.connectWalletSession()
router.push('/access')
setMobileMenuOpen(false)
router.push('/wallet')
} catch (error) {
console.error('Wallet connect failed', error)
router.push('/access')
setMobileMenuOpen(false)
const message = error instanceof Error ? error.message : 'Wallet connection failed.'
setWalletConnectError(message)
} finally {
setConnectingWallet(false)
}
@@ -588,13 +599,13 @@ export default function Navbar() {
)
const operationsItems: MenuItem[] = useMemo(
() => [
{ href: '/operations', label: 'Operations Hub', description: 'Open the consolidated operator surface for live support workflows.' },
{ href: '/bridge', label: 'Bridge Monitoring', description: 'Inspect relay lanes, queue posture, and bridge trace tooling.' },
{ href: '/operations', label: 'Operations hub', description: 'Open the consolidated operator surface for live support workflows.' },
{ href: '/bridge', label: 'Bridge', description: 'Inspect relay lanes, queue posture, and bridge trace tooling.' },
{ href: '/routes', label: 'Routes', description: 'Review live route coverage, same-chain lanes, and bridge paths.' },
{ href: '/liquidity', label: 'Liquidity', description: 'Check planner-backed route access and live liquidity posture.' },
{ href: '/system', label: 'System', description: 'Inspect topology, RPC capability, and public integration inventory.' },
{ href: '/operator', label: 'Operator Surface', description: 'Open planner, route, and relay shortcuts in one public page.' },
{ href: '/weth', label: 'WETH References', description: 'Review wrapped-asset references and bridge-oriented WETH context.' },
{ href: '/operator', label: 'Operator', description: 'Open planner, route, and relay shortcuts in one public page.' },
{ href: '/weth', label: 'WETH', description: 'Review wrapped-asset references and bridge-oriented WETH context.' },
{ href: '/chain138-command-center.html', label: 'Command Center', description: 'Open the visual command-center reference.', external: true },
],
[],
@@ -727,12 +738,13 @@ export default function Navbar() {
</div>
</nav>
<div className="ml-auto hidden items-center gap-3 lg:flex">
<div className="ml-auto hidden items-center gap-3 xl:flex">
<SearchControl active={isSearchActive} onSelect={() => setCommandPaletteOpen(true)} />
<UiModeToggle />
<AccountButton
walletSession={walletSession}
connectingWallet={connectingWallet}
connectError={walletConnectError}
onConnect={() => void handleConnectWallet()}
onCopyAddress={() => void handleCopyAddress()}
onSwitchWallet={() => void handleSwitchWallet()}
@@ -740,7 +752,7 @@ export default function Navbar() {
/>
</div>
<div className="ml-auto flex items-center gap-2 lg:hidden">
<div className="ml-auto flex items-center gap-2 xl:hidden">
{walletSession ? (
<Link
href="/access"
@@ -793,7 +805,7 @@ export default function Navbar() {
{mobileMenuOpen ? (
<div
id={mobilePanelId}
className="border-t border-gray-200 py-4 dark:border-gray-800 lg:hidden"
className="border-t border-gray-200 py-4 dark:border-gray-800 xl:hidden"
>
<div className="flex flex-col gap-4">
<SearchControl
@@ -806,6 +818,12 @@ export default function Navbar() {
/>
<UiModeToggle mobile />
{walletConnectError ? (
<p role="alert" className="rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 dark:border-red-900/60 dark:bg-red-950/40 dark:text-red-300">
{walletConnectError}
</p>
) : null}
<div className="grid gap-4">
<div>
<div className="mb-2 text-[11px] font-semibold uppercase tracking-[0.18em] text-gray-500 dark:text-gray-400">