65 lines
1.8 KiB
TypeScript
65 lines
1.8 KiB
TypeScript
|
|
import { useState } from 'react';
|
|||
|
|
|
|||
|
|
interface RoleSelectorProps {
|
|||
|
|
value: string;
|
|||
|
|
onChange: (role: 'author' | 'editor' | 'operator') => void;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const roles = [
|
|||
|
|
{
|
|||
|
|
key: 'author' as const,
|
|||
|
|
label: '我是作者',
|
|||
|
|
emoji: '🖊️',
|
|||
|
|
desc: '用AI辅助创作,提高效率',
|
|||
|
|
companion: '笔灵',
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
key: 'editor' as const,
|
|||
|
|
label: '我是编辑',
|
|||
|
|
emoji: '📊',
|
|||
|
|
desc: '用AI辅助审稿,高效筛选',
|
|||
|
|
companion: '慧眼',
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
key: 'operator' as const,
|
|||
|
|
label: '我是运营',
|
|||
|
|
emoji: '🤝',
|
|||
|
|
desc: '用AI辅助分析,洞察趋势',
|
|||
|
|
companion: '星图',
|
|||
|
|
},
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
export default function RoleSelector({ value, onChange }: RoleSelectorProps) {
|
|||
|
|
const [hovered, setHovered] = useState<string | null>(null);
|
|||
|
|
|
|||
|
|
return (
|
|||
|
|
<div className="flex flex-col sm:flex-row gap-3 w-full max-w-lg mx-auto">
|
|||
|
|
{roles.map((role) => (
|
|||
|
|
<button
|
|||
|
|
key={role.key}
|
|||
|
|
onClick={() => onChange(role.key)}
|
|||
|
|
onMouseEnter={() => setHovered(role.key)}
|
|||
|
|
onMouseLeave={() => setHovered(null)}
|
|||
|
|
className={`
|
|||
|
|
flex-1 flex flex-col items-center gap-1.5 px-4 py-4 rounded-2xl border-2 transition-all duration-200
|
|||
|
|
${
|
|||
|
|
value === role.key
|
|||
|
|
? 'border-brand-500 bg-brand-50 shadow-glow'
|
|||
|
|
: 'border-ink-200 bg-white hover:border-brand-300 hover:shadow-soft'
|
|||
|
|
}
|
|||
|
|
`}
|
|||
|
|
>
|
|||
|
|
<span className="text-2xl">{role.emoji}</span>
|
|||
|
|
<span className="font-semibold text-ink-800">{role.label}</span>
|
|||
|
|
<span className="text-xs text-ink-500">{role.desc}</span>
|
|||
|
|
{(value === role.key || hovered === role.key) && (
|
|||
|
|
<span className="text-xs text-brand-600 mt-1">
|
|||
|
|
AI伙伴:{role.companion}
|
|||
|
|
</span>
|
|||
|
|
)}
|
|||
|
|
</button>
|
|||
|
|
))}
|
|||
|
|
</div>
|
|||
|
|
);
|
|||
|
|
}
|