Files
nofx/web/src/components/trader/TraderLaunchGuestPage.tsx
2026-06-28 11:36:56 +08:00

242 lines
9.7 KiB
TypeScript

import { Link } from 'react-router-dom'
import {
ArrowRight,
CheckCircle2,
CircleDollarSign,
Download,
ExternalLink,
KeyRound,
ShieldCheck,
Wallet,
Zap,
} from 'lucide-react'
import { ROUTES } from '../../router/paths'
const setupSteps = [
{
title: 'Create your NOFX account',
detail:
'Your account keeps the Autopilot configuration, wallet authorization state, and trading dashboard in one place.',
icon: KeyRound,
action: 'Create account',
to: ROUTES.register,
},
{
title: 'Fund the AI fee wallet',
detail:
'NOFX prepares a Base USDC wallet for Claw402.ai data and model calls. This wallet is separate from trading collateral.',
icon: CircleDollarSign,
action: 'Open deposit QR',
to: ROUTES.login,
returnUrl: `${ROUTES.traders}?setup=claw402`,
},
{
title: 'Authorize Hyperliquid',
detail:
'Connect your trading wallet, approve the NOFX Agent, and approve the builder fee. Funds remain in your Hyperliquid account.',
icon: Wallet,
action: 'Connect exchange',
to: ROUTES.login,
returnUrl: `${ROUTES.traders}?setup=hyperliquid`,
},
{
title: 'Deposit trading USDC',
detail:
'Add USDC on Hyperliquid, then start NOFX Autopilot. The strategy is created and launched automatically.',
icon: Zap,
action: 'Open Hyperliquid',
href: 'https://app.hyperliquid.xyz/',
},
]
const pipeline = [
'Read the live Claw402.ai board, with US stocks prioritized before crypto.',
'Fetch Signal Lab and cost/liquidation heatmap details for each candidate.',
'Confirm with raw OHLCV candles, then trade full-size 10x only when the setup is strong enough.',
]
export function TraderLaunchGuestPage() {
return (
<div className="min-h-[calc(100vh-4rem)] overflow-hidden bg-[#06080B] px-4 py-10 md:px-8">
<div className="mx-auto flex w-full max-w-7xl flex-col gap-8">
<section className="grid gap-8 rounded-2xl border border-white/10 bg-[linear-gradient(135deg,rgba(16,18,25,0.94),rgba(7,10,14,0.92)_52%,rgba(18,15,3,0.78))] p-6 shadow-[0_24px_100px_rgba(0,0,0,0.45)] md:p-8 xl:grid-cols-[1.02fr_0.98fr]">
<div className="flex flex-col justify-center">
<div className="mb-5 inline-flex w-fit items-center gap-2 rounded-full border border-nofx-gold/25 bg-nofx-gold/10 px-3 py-1 text-[11px] font-semibold uppercase tracking-[0.2em] text-nofx-gold">
<ShieldCheck className="h-3.5 w-3.5" />
NOFX Autopilot
</div>
<h1 className="max-w-3xl text-4xl font-bold tracking-tight text-white md:text-5xl">
One strategy. Four setup steps. Then it trades.
</h1>
<p className="mt-5 max-w-2xl text-base leading-7 text-zinc-400">
NOFX runs a single Claw402-driven strategy: board, per-market
details, liquidation structure, candles, execution. No strategy
picker, no manual symbol picking required.
</p>
<div className="mt-7 flex flex-col gap-3 sm:flex-row">
<Link
to={ROUTES.login}
onClick={() =>
sessionStorage.setItem(
'returnUrl',
`${ROUTES.traders}?setup=claw402`
)
}
className="inline-flex items-center justify-center gap-2 rounded-xl bg-nofx-gold px-5 py-3 text-sm font-bold text-black transition hover:bg-yellow-400"
>
Start setup
<ArrowRight className="h-4 w-4" />
</Link>
<Link
to={ROUTES.register}
className="inline-flex items-center justify-center rounded-xl border border-white/10 bg-white/[0.04] px-5 py-3 text-sm font-semibold text-zinc-200 transition hover:border-white/20 hover:bg-white/[0.07]"
>
Create account
</Link>
</div>
</div>
<div className="grid gap-3 sm:grid-cols-2">
{setupSteps.map((step, index) => {
const Icon = step.icon
const cardClass =
'group rounded-xl border border-white/10 bg-black/24 p-4 text-left transition hover:border-nofx-gold/35 hover:bg-nofx-gold/[0.04]'
const content = (
<>
<div className="mb-4 flex items-center justify-between">
<div className="flex h-10 w-10 items-center justify-center rounded-xl border border-nofx-gold/20 bg-nofx-gold/10 text-nofx-gold">
<Icon className="h-4 w-4" />
</div>
<span className="font-mono text-xs text-zinc-600">
0{index + 1}
</span>
</div>
<h2 className="text-base font-semibold text-white">
{step.title}
</h2>
<p className="mt-2 text-sm leading-6 text-zinc-500">
{step.detail}
</p>
<div className="mt-4 inline-flex items-center gap-2 text-xs font-bold text-nofx-gold transition group-hover:text-yellow-300">
{step.action}
{step.href ? (
<ExternalLink className="h-3.5 w-3.5" />
) : (
<ArrowRight className="h-3.5 w-3.5" />
)}
</div>
</>
)
if (step.href) {
return (
<a
key={step.title}
href={step.href}
target="_blank"
rel="noreferrer"
className={cardClass}
>
{content}
</a>
)
}
return (
<Link
key={step.title}
to={step.to || ROUTES.login}
onClick={() => {
if (step.returnUrl) {
sessionStorage.setItem('returnUrl', step.returnUrl)
}
}}
className={cardClass}
>
{content}
</Link>
)
})}
</div>
</section>
<section className="grid gap-5 rounded-2xl border border-white/10 bg-[#0A0D12] p-5 md:grid-cols-[0.78fr_1.22fr] md:p-6">
<div>
<div className="text-sm font-semibold uppercase tracking-[0.18em] text-nofx-gold">
No trading wallet yet?
</div>
<p className="mt-3 text-sm leading-6 text-zinc-500">
NOFX does not need your main-wallet private key. Install or unlock
an EVM wallet, fund Hyperliquid with USDC, then authorize the NOFX
Agent after sign-in.
</p>
</div>
<div className="grid gap-3 lg:grid-cols-3">
<a
href="https://rabby.io/"
target="_blank"
rel="noreferrer"
className="group rounded-xl border border-white/10 bg-white/[0.03] p-4 transition hover:border-nofx-gold/30 hover:bg-nofx-gold/[0.04]"
>
<Download className="mb-3 h-4 w-4 text-nofx-gold" />
<div className="font-semibold text-white">Install Rabby</div>
<p className="mt-2 text-sm leading-6 text-zinc-500">
Create or import an EVM wallet before connecting to Hyperliquid.
</p>
</a>
<a
href="https://metamask.io/download/"
target="_blank"
rel="noreferrer"
className="group rounded-xl border border-white/10 bg-white/[0.03] p-4 transition hover:border-nofx-gold/30 hover:bg-nofx-gold/[0.04]"
>
<ExternalLink className="mb-3 h-4 w-4 text-nofx-gold" />
<div className="font-semibold text-white">MetaMask</div>
<p className="mt-2 text-sm leading-6 text-zinc-500">
Already use MetaMask? Unlock it, then continue setup inside
NOFX.
</p>
</a>
<a
href="https://app.hyperliquid.xyz/"
target="_blank"
rel="noreferrer"
className="group rounded-xl border border-nofx-gold/20 bg-nofx-gold/10 p-4 transition hover:bg-nofx-gold/15"
>
<ExternalLink className="mb-3 h-4 w-4 text-nofx-gold" />
<div className="font-semibold text-white">Open Hyperliquid</div>
<p className="mt-2 text-sm leading-6 text-zinc-400">
Deposit USDC there. Trading funds stay in your Hyperliquid
account.
</p>
</a>
</div>
</section>
<section className="grid gap-4 rounded-2xl border border-white/10 bg-[#0A0D12] p-5 md:grid-cols-[0.72fr_1.28fr] md:p-6">
<div>
<div className="text-sm font-semibold uppercase tracking-[0.18em] text-nofx-gold">
What runs after launch
</div>
<p className="mt-3 text-sm leading-6 text-zinc-500">
The same production path runs every cycle. The interface only asks
you to fund, authorize, and start.
</p>
</div>
<div className="grid gap-3 lg:grid-cols-3">
{pipeline.map((item) => (
<div
key={item}
className="flex gap-3 rounded-xl border border-white/8 bg-white/[0.03] p-4"
>
<CheckCircle2 className="mt-0.5 h-4 w-4 shrink-0 text-emerald-300" />
<p className="text-sm leading-6 text-zinc-300">{item}</p>
</div>
))}
</div>
</section>
</div>
</div>
)
}