2026-05-10 13:12:44 +08:00

151 lines
5.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
import { Pen, BarChart3, Handshake } from 'lucide-react';
import AICompanion from '../components/AICompanion';
const WELCOME_TEXT =
'你好我是你的AI创作伙伴。\n无论你是作者、编辑还是运营\n我都能陪你一起工作。';
function useTypewriter(text: string, speed = 60) {
const [displayed, setDisplayed] = useState('');
const [done, setDone] = useState(false);
useEffect(() => {
setDisplayed('');
setDone(false);
let i = 0;
const timer = setInterval(() => {
i++;
setDisplayed(text.slice(0, i));
if (i >= text.length) {
clearInterval(timer);
setDone(true);
}
}, speed);
return () => clearInterval(timer);
}, [text, speed]);
return { displayed, done };
}
const features = [
{
icon: Pen,
title: 'AI码字',
sub: 'AI陪你写',
desc: '不代替你写',
color: 'from-brand-400 to-brand-600',
},
{
icon: BarChart3,
title: '透明追踪',
sub: '全程留痕',
desc: '创意归你',
color: 'from-emerald-400 to-emerald-600',
},
{
icon: Handshake,
title: '跨平台',
sub: '自由合作',
desc: '信誉说话',
color: 'from-amber-400 to-amber-600',
},
];
export default function LandingPage() {
const navigate = useNavigate();
const { displayed, done } = useTypewriter(WELCOME_TEXT, 50);
const handleRoleClick = (role: string) => {
navigate(`/register?role=${role}`);
};
return (
<div className="min-h-screen pt-16">
{/* Hero section */}
<section className="relative px-4 py-16 sm:py-24 flex flex-col items-center text-center overflow-hidden">
{/* Background gradient */}
<div className="absolute inset-0 bg-gradient-to-b from-brand-50/60 via-white to-white -z-10" />
<AICompanion name="AI创作伙伴" size="lg" />
{/* Typewriter welcome */}
<div className="mt-8 mb-10 min-h-[5rem]">
<p className="text-lg sm:text-xl text-ink-700 leading-relaxed whitespace-pre-line">
"{displayed}
{!done && <span className="animate-pulse">|</span>}"
</p>
</div>
{/* Role selection buttons */}
<div className="flex flex-col sm:flex-row gap-3">
{[
{ key: 'author', label: '我是作者', emoji: '🖊️' },
{ key: 'editor', label: '我是编辑', emoji: '📊' },
{ key: 'operator', label: '我是运营', emoji: '🤝' },
].map((r) => (
<button
key={r.key}
onClick={() => handleRoleClick(r.key)}
className="px-8 py-3 bg-white border-2 border-ink-200 hover:border-brand-400 hover:shadow-soft rounded-2xl text-ink-700 hover:text-brand-600 transition-all duration-200 font-medium"
>
<span className="mr-2">{r.emoji}</span>
{r.label}
</button>
))}
</div>
</section>
{/* Features section */}
<section className="px-4 py-16 bg-white">
<div className="max-w-4xl mx-auto">
<h2 className="text-center text-2xl font-bold text-ink-800 mb-10">
</h2>
<div className="grid grid-cols-1 sm:grid-cols-3 gap-6">
{features.map((f) => (
<div
key={f.title}
className="flex flex-col items-center text-center p-6 rounded-2xl border border-ink-100 hover:shadow-soft transition-shadow"
>
<div
className={`w-14 h-14 rounded-xl bg-gradient-to-br ${f.color} flex items-center justify-center text-white mb-4`}
>
<f.icon size={28} />
</div>
<h3 className="font-bold text-ink-800 text-lg">{f.title}</h3>
<p className="text-sm text-ink-500 mt-1">{f.sub}</p>
<p className="text-xs text-ink-400 mt-0.5">{f.desc}</p>
</div>
))}
</div>
</div>
</section>
{/* Stats section */}
<section className="px-4 py-12 bg-ink-50">
<div className="max-w-4xl mx-auto text-center">
<h2 className="text-lg font-semibold text-ink-600 mb-6">📈 </h2>
<div className="flex flex-col sm:flex-row justify-center gap-8 sm:gap-16">
{[
{ label: '注册作者', value: '--' },
{ label: '今日新作', value: '--' },
{ label: 'AI使用透明度', value: '100%' },
].map((s) => (
<div key={s.label} className="flex flex-col items-center">
<span className="text-3xl font-bold text-brand-600">{s.value}</span>
<span className="text-sm text-ink-500 mt-1">{s.label}</span>
</div>
))}
</div>
</div>
</section>
{/* Footer */}
<footer className="px-4 py-8 text-center text-sm text-ink-400 border-t border-ink-100">
© 2026 · -2026-A-00037559
</footer>
</div>
);
}