204 lines
6.5 KiB
TypeScript
204 lines
6.5 KiB
TypeScript
import { motion } from 'framer-motion'
|
|
import {
|
|
RadioTower,
|
|
Square,
|
|
GitFork,
|
|
Sparkles,
|
|
Star,
|
|
LineChart,
|
|
ScanSearch,
|
|
History,
|
|
Signal as SignalIcon,
|
|
Eye,
|
|
FileText,
|
|
} from 'lucide-react'
|
|
import { PageHeader } from '@/components/PageHeader'
|
|
|
|
interface Variant {
|
|
id: string
|
|
name: string
|
|
tagline: string
|
|
hint: string
|
|
icon: React.ComponentType<{ className?: string }>
|
|
iconAccent: string // tailwind text color
|
|
nameClass: string // 文字本身样式(字号/字重/字距/字体)
|
|
glow?: string // 名字下方的发光线条 hex
|
|
}
|
|
|
|
// 同一个名字 "Stock Panel" 在 4 种风格语言里的呈现
|
|
// 长字符串自动用更小字号 + 更窄字距,免得撑爆卡片;但风格语言(字体/字重/配色/图标)保持不变
|
|
const VARIANTS: Variant[] = [
|
|
{
|
|
id: 'pulsar',
|
|
name: 'Stock Panel',
|
|
tagline: 'A-SHARE · SIGNAL TERMINAL',
|
|
hint: '脉冲星、雷达波纹 — 青绿强调色,字重黑体,中等字距',
|
|
icon: RadioTower,
|
|
iconAccent: 'text-[#3DD68C]',
|
|
nameClass: 'font-sans font-black text-base tracking-[0.10em]',
|
|
glow: '#3DD68C',
|
|
},
|
|
{
|
|
id: 'vanta',
|
|
name: 'Stock Panel',
|
|
tagline: 'MARKET · INTELLIGENCE',
|
|
hint: 'Vantablack — 纯白单色,字重最重,字距最宽,monochrome 高级感',
|
|
icon: Square,
|
|
iconAccent: 'text-[#FAFAFA]',
|
|
nameClass: 'font-sans font-black text-base tracking-[0.18em]',
|
|
glow: '#FAFAFA',
|
|
},
|
|
{
|
|
id: 'helix',
|
|
name: 'Stock Panel',
|
|
tagline: 'QUANT · TERMINAL',
|
|
hint: 'DNA 螺旋 — 紫色强调,等宽字体,赛博朋克经典意象',
|
|
icon: GitFork,
|
|
iconAccent: 'text-[#8B5CF6]',
|
|
nameClass: 'font-mono font-bold text-base tracking-[0.08em]',
|
|
glow: '#8B5CF6',
|
|
},
|
|
{
|
|
id: 'aurora',
|
|
name: 'Stock Panel',
|
|
tagline: 'A-SHARE · DASHBOARD',
|
|
hint: '极光 — 青色强调,细字优雅,适中字距,与涨跌语义色不冲突',
|
|
icon: Sparkles,
|
|
iconAccent: 'text-[#22D3EE]',
|
|
nameClass: 'font-sans font-light text-base tracking-[0.12em]',
|
|
glow: '#22D3EE',
|
|
},
|
|
]
|
|
|
|
const MOCK_NAV = [
|
|
{ icon: Star, label: '自选' },
|
|
{ icon: LineChart, label: 'K 线' },
|
|
{ icon: ScanSearch, label: '策略' },
|
|
{ icon: History, label: '回测' },
|
|
{ icon: SignalIcon, label: '信号' },
|
|
{ icon: Eye, label: '监控' },
|
|
{ icon: FileText, label: '财务' },
|
|
]
|
|
|
|
export function Branding() {
|
|
return (
|
|
<>
|
|
<PageHeader
|
|
title="视觉风格预览"
|
|
subtitle="名字保持 Stock Panel,4 种赛博朋克 + 高级感的视觉处理 — 字重、字距、配色、图标各不同。挑你最喜欢的告诉我。"
|
|
/>
|
|
|
|
<div className="px-8 py-6">
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-5">
|
|
{VARIANTS.map((v) => (
|
|
<Sample key={v.id} v={v} />
|
|
))}
|
|
</div>
|
|
|
|
<div className="mt-8 rounded-card border border-border bg-surface p-5 text-sm text-secondary leading-relaxed max-w-2xl">
|
|
<div className="font-medium text-foreground mb-2">挑哪个?</div>
|
|
回复 <code className="font-mono text-accent">pulsar / vanta / helix / aurora</code> 任一,
|
|
我把该风格的字体、配色、图标、发光效果应用到真实侧栏。
|
|
也可以告诉我你想微调哪里(比如"用 VANTA 但换青色"),都行。
|
|
</div>
|
|
</div>
|
|
</>
|
|
)
|
|
}
|
|
|
|
function Sample({ v }: { v: Variant }) {
|
|
const Icon = v.icon
|
|
|
|
return (
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 8 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.3, ease: [0.16, 1, 0.3, 1] }}
|
|
className="rounded-card border border-border overflow-hidden bg-base flex"
|
|
>
|
|
{/* 模拟侧边栏 */}
|
|
<div className="w-56 bg-surface border-r border-border flex flex-col">
|
|
{/* Logo 区 */}
|
|
<div className="px-5 py-5 border-b border-border">
|
|
<div className="flex items-center gap-2.5">
|
|
<div
|
|
className="grid place-items-center h-7 w-7 rounded-md"
|
|
style={{
|
|
background: `${v.glow}1a`,
|
|
boxShadow: `0 0 12px ${v.glow}33`,
|
|
}}
|
|
>
|
|
<Icon className={`h-4 w-4 ${v.iconAccent}`} />
|
|
</div>
|
|
<div className={`${v.nameClass} text-foreground leading-none`}>
|
|
{v.name}
|
|
</div>
|
|
</div>
|
|
<div className="mt-2 text-[10px] uppercase tracking-[0.18em] text-secondary">
|
|
{v.tagline}
|
|
</div>
|
|
<div
|
|
className="mt-3 h-px"
|
|
style={{
|
|
background: `linear-gradient(90deg, ${v.glow}66, transparent)`,
|
|
}}
|
|
/>
|
|
<div className="mt-2 text-xs text-secondary">
|
|
档位 · <span className="text-foreground font-medium font-mono">Pro</span>
|
|
</div>
|
|
</div>
|
|
|
|
{/* 模拟导航 */}
|
|
<nav className="px-2 py-3 space-y-0.5">
|
|
{MOCK_NAV.slice(0, 5).map(({ icon: I, label }, i) => (
|
|
<div
|
|
key={label}
|
|
className={`flex items-center gap-3 px-3 py-2 rounded-btn text-sm ${
|
|
i === 0
|
|
? 'bg-elevated text-foreground font-medium'
|
|
: 'text-foreground/80'
|
|
}`}
|
|
>
|
|
<I className="h-4 w-4" />
|
|
{label}
|
|
</div>
|
|
))}
|
|
</nav>
|
|
</div>
|
|
|
|
{/* 右侧说明 + 大字预览 */}
|
|
<div className="flex-1 p-5 flex flex-col">
|
|
<div className="flex-1">
|
|
<div className="text-xs font-medium text-muted uppercase tracking-widest">{v.id}</div>
|
|
<div className="mt-2 leading-relaxed text-sm text-secondary">
|
|
{v.hint}
|
|
</div>
|
|
</div>
|
|
|
|
{/* 大字 wordmark 预览 */}
|
|
<div className="mt-6 pt-6 border-t border-border">
|
|
<div
|
|
className={`${v.nameClass} text-foreground`}
|
|
style={{
|
|
textShadow: `0 0 24px ${v.glow}55`,
|
|
}}
|
|
>
|
|
{v.name}
|
|
</div>
|
|
<div className="mt-1.5 text-[10px] uppercase tracking-[0.2em] text-secondary">
|
|
{v.tagline}
|
|
</div>
|
|
</div>
|
|
|
|
{/* 模拟一个数据卡片,看与配色协调度 */}
|
|
<div className="mt-5 rounded-btn bg-surface border border-border px-3 py-2 flex items-baseline justify-between">
|
|
<span className="text-xs text-secondary">600519.SH</span>
|
|
<span className="font-mono text-sm" style={{ color: v.glow }}>
|
|
+1.85%
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</motion.div>
|
|
)
|
|
}
|