Skip to content

Commit 3f673c5

Browse files
Signer demo: react-wallet-ui login/dashboard polish + EIP-5792 batching (#285)
Co-authored-by: Sahil Vasava <sahilvasava@gmail.com>
1 parent 7b7b7d8 commit 3f673c5

14 files changed

Lines changed: 1318 additions & 762 deletions

File tree

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/* eslint-disable @next/next/no-img-element */
2+
"use client";
3+
4+
import { ArrowRight, ChevronDown, ExternalLink, Github } from "lucide-react";
5+
import Link from "next/link";
6+
import { useState } from "react";
7+
8+
const headerLinks = [
9+
{ href: "https://docs.zerodev.app", label: "Documentation", icon: ExternalLink },
10+
{ href: "https://dashboard.zerodev.app", label: "Get your API keys", icon: ExternalLink },
11+
{ href: "https://github.com/zerodevapp/zerodev-wallet-sdk/tree/main/apps/zerodev-signer-demo", label: "GitHub", icon: Github },
12+
{ href: "https://zerodev.app/contact", label: "Contact sales", icon: ArrowRight, emphasis: true },
13+
];
14+
15+
export function AppHeader() {
16+
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
17+
18+
return (
19+
<header className="sticky top-0 z-40 border-b border-[var(--border-warm)] bg-white/95 font-[var(--font-dm-sans)] backdrop-blur">
20+
<div className="mx-auto flex w-full max-w-[1920px] flex-col gap-3 px-4 py-3 sm:px-6 lg:h-[88px] lg:flex-row lg:items-center lg:justify-between lg:px-9 lg:py-0">
21+
<div className="flex items-center justify-between gap-3">
22+
<Link href="/" className="flex w-fit items-center gap-2.5 sm:gap-3">
23+
<img
24+
src="/images/zerodev-logo.png"
25+
alt="ZeroDev Logo"
26+
className="h-8 w-8 shrink-0 sm:h-10 sm:w-10"
27+
/>
28+
<div className="flex min-w-0 items-baseline gap-2 sm:gap-3">
29+
<span className="text-xl font-bold leading-none text-[var(--ink)] sm:text-2xl">
30+
ZeroDev
31+
</span>
32+
<span className="text-[10px] font-bold uppercase tracking-[0.22em] text-[#9c958c] sm:text-xs">
33+
Wallet Demo
34+
</span>
35+
</div>
36+
</Link>
37+
38+
<button
39+
type="button"
40+
onClick={() => setMobileMenuOpen((open) => !open)}
41+
className="inline-flex h-9 items-center gap-1.5 rounded-full border border-[var(--border-warm)] bg-[var(--surface-warm)] px-3 text-sm font-bold text-[var(--ink)] sm:hidden"
42+
aria-expanded={mobileMenuOpen}
43+
>
44+
Links
45+
<ChevronDown className={`h-4 w-4 transition-transform ${mobileMenuOpen ? "rotate-180" : ""}`} />
46+
</button>
47+
</div>
48+
49+
{mobileMenuOpen && (
50+
<nav className="grid gap-1 rounded-xl border border-[var(--border-warm)] bg-white p-1 shadow-sm sm:hidden">
51+
{headerLinks.map((link) => {
52+
const Icon = link.icon;
53+
return (
54+
<a
55+
key={link.href}
56+
href={link.href}
57+
target="_blank"
58+
rel="noopener noreferrer"
59+
className="flex h-10 items-center justify-between rounded-lg px-3 text-sm font-bold text-[var(--ink)] hover:bg-[var(--surface-warm)]"
60+
>
61+
{link.label}
62+
<Icon className="h-4 w-4" />
63+
</a>
64+
);
65+
})}
66+
</nav>
67+
)}
68+
69+
<nav className="hidden w-auto flex-wrap items-center gap-3 sm:flex">
70+
{headerLinks.map((link) => {
71+
const Icon = link.icon;
72+
return (
73+
<a
74+
key={link.href}
75+
href={link.href}
76+
target="_blank"
77+
rel="noopener noreferrer"
78+
className={`inline-flex h-12 min-w-0 items-center justify-center gap-1.5 rounded-full px-5 text-sm font-semibold transition-colors ${
79+
link.emphasis
80+
? "bg-[var(--ink)] text-white hover:bg-[#2a1c13] hover:text-white"
81+
: "bg-[var(--surface-warm)] text-[#423a32] hover:bg-[#eee9e3] hover:text-[var(--ink)]"
82+
}`}
83+
>
84+
<span className="truncate">{link.label}</span>
85+
{link.emphasis ? (
86+
<span className="ml-1 grid h-7 w-7 place-items-center rounded-full bg-white text-[var(--ink)]">
87+
<Icon className="h-4 w-4 shrink-0" />
88+
</span>
89+
) : (
90+
<Icon className="h-4 w-4 shrink-0" />
91+
)}
92+
</a>
93+
);
94+
})}
95+
</nav>
96+
</div>
97+
</header>
98+
);
99+
}

apps/zerodev-signer-demo/src/app/components/ChainSelector.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@ import { ChevronDown, Check } from "lucide-react";
55
import { useAccount, useSwitchChain, useChains } from "wagmi";
66
import { cn } from "../lib/utils";
77

8-
export function ChainSelector() {
8+
export function ChainSelector({ className }: { className?: string }) {
99
const [isOpen, setIsOpen] = useState(false);
1010
const dropdownRef = useRef<HTMLDivElement>(null);
1111

1212
const { chain } = useAccount();
13-
console.log("chain", chain);
1413
const { switchChain, isPending } = useSwitchChain();
1514
const chains = useChains();
16-
console.log("chains", chains);
1715

1816
// Close dropdown when clicking outside
1917
useEffect(() => {
@@ -39,10 +37,11 @@ export function ChainSelector() {
3937
onClick={() => setIsOpen(!isOpen)}
4038
disabled={isPending}
4139
className={cn(
42-
"flex items-center gap-2 px-3 py-1.5 rounded-lg border border-gray-200",
40+
"flex h-12 items-center gap-2 rounded-lg border border-gray-200 px-3",
4341
"bg-white hover:bg-gray-50 transition-colors",
4442
"text-sm font-medium text-gray-700",
45-
isPending && "opacity-50 cursor-not-allowed"
43+
isPending && "opacity-50 cursor-not-allowed",
44+
className,
4645
)}
4746
>
4847
<span className="w-2 h-2 rounded-full bg-green-500" />

apps/zerodev-signer-demo/src/app/components/ExportPrivateKeyModal.tsx

Lines changed: 0 additions & 172 deletions
This file was deleted.

0 commit comments

Comments
 (0)