Fix UX audit gaps: tablet nav, footer, wallet connect, legacy demotion.
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:
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user