mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-07-13 07:46:54 +08:00
style(web): 对齐币安风格—移除渐变/发光,固化深色/面板色,新增 header 样式,按钮与卡片统一
This commit is contained in:
@@ -7,7 +7,6 @@ import {
|
|||||||
GitBranch,
|
GitBranch,
|
||||||
Shield,
|
Shield,
|
||||||
ArrowRight,
|
ArrowRight,
|
||||||
ChevronDown,
|
|
||||||
Sparkles,
|
Sparkles,
|
||||||
Target,
|
Target,
|
||||||
Rocket,
|
Rocket,
|
||||||
@@ -61,52 +60,13 @@ export function LandingPage() {
|
|||||||
color: 'var(--brand-light-gray)',
|
color: 'var(--brand-light-gray)',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{/* Animated Background */}
|
|
||||||
<div className='fixed inset-0 overflow-hidden pointer-events-none'>
|
|
||||||
<motion.div
|
|
||||||
className='absolute top-0 right-0 w-[800px] h-[800px] rounded-full opacity-10'
|
|
||||||
style={{
|
|
||||||
background:
|
|
||||||
'radial-gradient(circle, var(--brand-yellow) 0%, transparent 70%)',
|
|
||||||
}}
|
|
||||||
animate={{
|
|
||||||
scale: [1, 1.2, 1],
|
|
||||||
opacity: [0.1, 0.15, 0.1],
|
|
||||||
}}
|
|
||||||
transition={{ duration: 8, repeat: Infinity }}
|
|
||||||
/>
|
|
||||||
<motion.div
|
|
||||||
className='absolute bottom-0 left-0 w-[600px] h-[600px] rounded-full opacity-10'
|
|
||||||
style={{
|
|
||||||
background: 'radial-gradient(circle, #6366F1 0%, transparent 70%)',
|
|
||||||
}}
|
|
||||||
animate={{
|
|
||||||
scale: [1, 1.3, 1],
|
|
||||||
opacity: [0.1, 0.2, 0.1],
|
|
||||||
}}
|
|
||||||
transition={{ duration: 10, repeat: Infinity, delay: 1 }}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Navbar */}
|
{/* Navbar */}
|
||||||
<motion.nav
|
<nav className='fixed top-0 w-full z-50 header-bar'>
|
||||||
className='fixed top-0 w-full z-50 backdrop-blur-xl'
|
|
||||||
style={{
|
|
||||||
background: 'rgba(12, 14, 18, 0.8)',
|
|
||||||
borderBottom: '1px solid rgba(240, 185, 11, 0.1)',
|
|
||||||
}}
|
|
||||||
initial={{ y: -100 }}
|
|
||||||
animate={{ y: 0 }}
|
|
||||||
transition={{ duration: 0.6 }}
|
|
||||||
>
|
|
||||||
<div className='max-w-7xl mx-auto px-4 sm:px-6 lg:px-8'>
|
<div className='max-w-7xl mx-auto px-4 sm:px-6 lg:px-8'>
|
||||||
<div className='flex items-center justify-between h-16'>
|
<div className='flex items-center justify-between h-16'>
|
||||||
{/* Logo */}
|
{/* Logo */}
|
||||||
<motion.div
|
<div className='flex items-center gap-3'>
|
||||||
className='flex items-center gap-3'
|
|
||||||
whileHover={{ scale: 1.05 }}
|
|
||||||
transition={{ type: 'spring', stiffness: 400 }}
|
|
||||||
>
|
|
||||||
<img src='/images/logo.png' alt='NOFX Logo' className='w-8 h-8' />
|
<img src='/images/logo.png' alt='NOFX Logo' className='w-8 h-8' />
|
||||||
<span
|
<span
|
||||||
className='text-xl font-bold'
|
className='text-xl font-bold'
|
||||||
@@ -120,12 +80,12 @@ export function LandingPage() {
|
|||||||
>
|
>
|
||||||
Agentic Trading OS
|
Agentic Trading OS
|
||||||
</span>
|
</span>
|
||||||
</motion.div>
|
</div>
|
||||||
|
|
||||||
{/* Desktop Menu */}
|
{/* Desktop Menu */}
|
||||||
<div className='hidden md:flex items-center gap-6'>
|
<div className='hidden md:flex items-center gap-6'>
|
||||||
{['功能', '如何运作', 'GitHub', '社区'].map((item, index) => (
|
{['功能', '如何运作', 'GitHub', '社区'].map((item) => (
|
||||||
<motion.a
|
<a
|
||||||
key={item}
|
key={item}
|
||||||
href={
|
href={
|
||||||
item === 'GitHub'
|
item === 'GitHub'
|
||||||
@@ -144,33 +104,24 @@ export function LandingPage() {
|
|||||||
}
|
}
|
||||||
className='text-sm transition-colors relative group'
|
className='text-sm transition-colors relative group'
|
||||||
style={{ color: 'var(--brand-light-gray)' }}
|
style={{ color: 'var(--brand-light-gray)' }}
|
||||||
initial={{ opacity: 0, y: -20 }}
|
|
||||||
animate={{ opacity: 1, y: 0 }}
|
|
||||||
transition={{ delay: index * 0.1 }}
|
|
||||||
whileHover={{ color: 'var(--brand-yellow)' }}
|
|
||||||
>
|
>
|
||||||
{item}
|
{item}
|
||||||
<motion.span
|
<span
|
||||||
className='absolute -bottom-1 left-0 w-0 h-0.5 group-hover:w-full transition-all duration-300'
|
className='absolute -bottom-1 left-0 w-0 h-0.5 group-hover:w-full transition-all duration-300'
|
||||||
style={{ background: 'var(--brand-yellow)' }}
|
style={{ background: 'var(--brand-yellow)' }}
|
||||||
/>
|
/>
|
||||||
</motion.a>
|
</a>
|
||||||
))}
|
))}
|
||||||
<motion.button
|
<button
|
||||||
onClick={() => setShowLoginModal(true)}
|
onClick={() => setShowLoginModal(true)}
|
||||||
className='px-4 py-2 rounded font-semibold text-sm'
|
className='px-4 py-2 rounded font-semibold text-sm'
|
||||||
style={{
|
style={{
|
||||||
background: 'var(--brand-yellow)',
|
background: 'var(--brand-yellow)',
|
||||||
color: 'var(--brand-black)',
|
color: 'var(--brand-black)',
|
||||||
}}
|
}}
|
||||||
whileHover={{
|
|
||||||
scale: 1.05,
|
|
||||||
boxShadow: '0 0 20px rgba(240, 185, 11, 0.4)',
|
|
||||||
}}
|
|
||||||
whileTap={{ scale: 0.95 }}
|
|
||||||
>
|
>
|
||||||
登录 / 注册
|
登录 / 注册
|
||||||
</motion.button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Mobile Menu Button */}
|
{/* Mobile Menu Button */}
|
||||||
@@ -230,10 +181,10 @@ export function LandingPage() {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</motion.nav>
|
</nav>
|
||||||
|
|
||||||
{/* Hero Section */}
|
{/* Hero Section */}
|
||||||
<section className='relative pt-32 pb-20 px-4 overflow-hidden'>
|
<section className='relative pt-32 pb-20 px-4'>
|
||||||
<div className='max-w-7xl mx-auto'>
|
<div className='max-w-7xl mx-auto'>
|
||||||
<div className='grid lg:grid-cols-2 gap-12 items-center'>
|
<div className='grid lg:grid-cols-2 gap-12 items-center'>
|
||||||
{/* Left Content */}
|
{/* Left Content */}
|
||||||
@@ -269,27 +220,14 @@ export function LandingPage() {
|
|||||||
</motion.div>
|
</motion.div>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
||||||
<motion.h1
|
<h1
|
||||||
className='text-5xl lg:text-7xl font-bold leading-tight'
|
className='text-5xl lg:text-7xl font-bold leading-tight'
|
||||||
style={{ color: 'var(--brand-light-gray)' }}
|
style={{ color: 'var(--brand-light-gray)' }}
|
||||||
variants={fadeInUp}
|
|
||||||
>
|
>
|
||||||
Read the Market.
|
Read the Market.
|
||||||
<br />
|
<br />
|
||||||
<motion.span
|
<span style={{ color: 'var(--brand-yellow)' }}>Write the Trade.</span>
|
||||||
style={{ color: 'var(--brand-yellow)' }}
|
</h1>
|
||||||
animate={{
|
|
||||||
textShadow: [
|
|
||||||
'0 0 20px rgba(240, 185, 11, 0.5)',
|
|
||||||
'0 0 40px rgba(240, 185, 11, 0.8)',
|
|
||||||
'0 0 20px rgba(240, 185, 11, 0.5)',
|
|
||||||
],
|
|
||||||
}}
|
|
||||||
transition={{ duration: 2, repeat: Infinity }}
|
|
||||||
>
|
|
||||||
Write the Trade.
|
|
||||||
</motion.span>
|
|
||||||
</motion.h1>
|
|
||||||
|
|
||||||
<motion.p
|
<motion.p
|
||||||
className='text-xl leading-relaxed'
|
className='text-xl leading-relaxed'
|
||||||
@@ -302,10 +240,7 @@ export function LandingPage() {
|
|||||||
为你自动决策、执行和优化交易。
|
为你自动决策、执行和优化交易。
|
||||||
</motion.p>
|
</motion.p>
|
||||||
|
|
||||||
<motion.div
|
<div className='flex items-center gap-3 flex-wrap'>
|
||||||
className='flex items-center gap-3 flex-wrap'
|
|
||||||
variants={fadeInUp}
|
|
||||||
>
|
|
||||||
<motion.a
|
<motion.a
|
||||||
href='https://github.com/tinkle-community/nofx'
|
href='https://github.com/tinkle-community/nofx'
|
||||||
target='_blank'
|
target='_blank'
|
||||||
@@ -345,7 +280,7 @@ export function LandingPage() {
|
|||||||
className='h-7'
|
className='h-7'
|
||||||
/>
|
/>
|
||||||
</motion.a>
|
</motion.a>
|
||||||
</motion.div>
|
</div>
|
||||||
|
|
||||||
<motion.p
|
<motion.p
|
||||||
className='text-xs pt-4'
|
className='text-xs pt-4'
|
||||||
@@ -366,9 +301,8 @@ export function LandingPage() {
|
|||||||
<motion.div
|
<motion.div
|
||||||
className='rounded-2xl p-8 relative z-10'
|
className='rounded-2xl p-8 relative z-10'
|
||||||
style={{
|
style={{
|
||||||
background:
|
background: 'var(--panel-bg)',
|
||||||
'linear-gradient(135deg, rgba(240, 185, 11, 0.1) 0%, rgba(99, 102, 241, 0.1) 100%)',
|
border: '1px solid var(--panel-border)',
|
||||||
border: '1px solid rgba(240, 185, 11, 0.2)',
|
|
||||||
}}
|
}}
|
||||||
animate={floatingAnimation}
|
animate={floatingAnimation}
|
||||||
>
|
>
|
||||||
@@ -385,17 +319,7 @@ export function LandingPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Scroll Indicator */}
|
{/* Scroll Indicator removed for cleaner Binance-like style */}
|
||||||
<motion.div
|
|
||||||
className='absolute bottom-8 left-1/2 transform -translate-x-1/2'
|
|
||||||
animate={{ y: [0, 10, 0] }}
|
|
||||||
transition={{ duration: 1.5, repeat: Infinity }}
|
|
||||||
>
|
|
||||||
<ChevronDown
|
|
||||||
className='w-8 h-8'
|
|
||||||
style={{ color: 'var(--brand-yellow)' }}
|
|
||||||
/>
|
|
||||||
</motion.div>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{/* About Section */}
|
{/* About Section */}
|
||||||
@@ -481,21 +405,12 @@ export function LandingPage() {
|
|||||||
</motion.div>
|
</motion.div>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
||||||
<motion.div
|
<div className='relative'>
|
||||||
className='relative'
|
<div
|
||||||
initial={{ opacity: 0, x: 50 }}
|
|
||||||
whileInView={{ opacity: 1, x: 0 }}
|
|
||||||
viewport={{ once: true }}
|
|
||||||
transition={{ duration: 0.6 }}
|
|
||||||
>
|
|
||||||
<motion.div
|
|
||||||
className='rounded-2xl p-8'
|
className='rounded-2xl p-8'
|
||||||
style={{
|
style={{
|
||||||
background: 'var(--brand-black)',
|
background: 'var(--brand-black)',
|
||||||
border: '1px solid rgba(240, 185, 11, 0.2)',
|
border: '1px solid var(--panel-border)',
|
||||||
}}
|
|
||||||
whileHover={{
|
|
||||||
boxShadow: '0 20px 60px rgba(240, 185, 11, 0.2)',
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Typewriter
|
<Typewriter
|
||||||
@@ -508,13 +423,13 @@ export function LandingPage() {
|
|||||||
'✓ API服务器启动在端口 8080',
|
'✓ API服务器启动在端口 8080',
|
||||||
'🌐 Web 控制台 http://localhost:3000',
|
'🌐 Web 控制台 http://localhost:3000',
|
||||||
]}
|
]}
|
||||||
typingSpeed={65}
|
typingSpeed={70}
|
||||||
lineDelay={800}
|
lineDelay={900}
|
||||||
className='text-sm font-mono'
|
className='text-sm font-mono'
|
||||||
style={{ color: '#00FF41', textShadow: '0 0 6px rgba(0,255,65,0.6)' }}
|
style={{ color: '#00FF41', textShadow: '0 0 6px rgba(0,255,65,0.6)' }}
|
||||||
/>
|
/>
|
||||||
</motion.div>
|
</div>
|
||||||
</motion.div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
@@ -713,7 +628,7 @@ export function LandingPage() {
|
|||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
{/* CTA Section */}
|
{/* CTA Section */}
|
||||||
<AnimatedSection backgroundColor='linear-gradient(135deg, rgba(240, 185, 11, 0.15) 0%, rgba(99, 102, 241, 0.15) 100%)'>
|
<AnimatedSection backgroundColor='var(--panel-bg)'>
|
||||||
<div className='max-w-4xl mx-auto text-center'>
|
<div className='max-w-4xl mx-auto text-center'>
|
||||||
<motion.h2
|
<motion.h2
|
||||||
className='text-5xl font-bold mb-6'
|
className='text-5xl font-bold mb-6'
|
||||||
@@ -961,11 +876,7 @@ function StepCard({ number, title, description, delay }: any) {
|
|||||||
>
|
>
|
||||||
<motion.div
|
<motion.div
|
||||||
className='flex-shrink-0 w-14 h-14 rounded-full flex items-center justify-center font-bold text-2xl'
|
className='flex-shrink-0 w-14 h-14 rounded-full flex items-center justify-center font-bold text-2xl'
|
||||||
style={{
|
style={{ background: 'var(--binance-yellow)', color: 'var(--brand-black)' }}
|
||||||
background:
|
|
||||||
'linear-gradient(135deg, var(--brand-yellow) 0%, #FCD535 100%)',
|
|
||||||
color: 'var(--brand-black)',
|
|
||||||
}}
|
|
||||||
whileHover={{ scale: 1.2, rotate: 360 }}
|
whileHover={{ scale: 1.2, rotate: 360 }}
|
||||||
transition={{ type: 'spring', stiffness: 260, damping: 20 }}
|
transition={{ type: 'spring', stiffness: 260, damping: 20 }}
|
||||||
>
|
>
|
||||||
@@ -1011,10 +922,7 @@ function TestimonialCard({ quote, author, delay }: any) {
|
|||||||
<div className='flex items-center gap-2'>
|
<div className='flex items-center gap-2'>
|
||||||
<motion.div
|
<motion.div
|
||||||
className='w-8 h-8 rounded-full'
|
className='w-8 h-8 rounded-full'
|
||||||
style={{
|
style={{ background: 'var(--binance-yellow)' }}
|
||||||
background:
|
|
||||||
'linear-gradient(135deg, var(--brand-yellow) 0%, #FCD535 100%)',
|
|
||||||
}}
|
|
||||||
whileHover={{ rotate: 180 }}
|
whileHover={{ rotate: 180 }}
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
|
|||||||
@@ -20,7 +20,8 @@
|
|||||||
--binance-yellow-light: #FCD535;
|
--binance-yellow-light: #FCD535;
|
||||||
--binance-yellow-glow: rgba(240, 185, 11, 0.2);
|
--binance-yellow-glow: rgba(240, 185, 11, 0.2);
|
||||||
|
|
||||||
--background: #0C0E12;
|
--background: #181A20; /* Binance body bg */
|
||||||
|
--header-bg: #0B0E11; /* Binance header bg */
|
||||||
--background-elevated: #181A20;
|
--background-elevated: #181A20;
|
||||||
--foreground: #EAECEF;
|
--foreground: #EAECEF;
|
||||||
--panel-bg: #1E2329;
|
--panel-bg: #1E2329;
|
||||||
@@ -179,12 +180,9 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Glass effect - Binance header style */
|
/* Glass effect - Binance header style */
|
||||||
.glass {
|
.header-bar {
|
||||||
background: var(--background-elevated);
|
background: var(--header-bg);
|
||||||
backdrop-filter: blur(12px);
|
|
||||||
-webkit-backdrop-filter: blur(12px);
|
|
||||||
border-bottom: 1px solid var(--panel-border);
|
border-bottom: 1px solid var(--panel-border);
|
||||||
box-shadow: var(--shadow-sm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Monospace numbers */
|
/* Monospace numbers */
|
||||||
|
|||||||
Reference in New Issue
Block a user