Files
ftb-project-management/apps/web/components/product/ProductForm.tsx
Script Generator 0099b23a86 style: 重做整体视觉系统(编辑设计 × 建筑精度)
- Fraunces 衬线 display + DM Sans body + JetBrains Mono 数字标签
- 暖米白主题(#f7f4ee)+ 蓝色强调色(#2563eb)
- 引入 lucide-react 图标库替代 emoji
- Sidebar 加入编号索引、Logo、用户区域、杂志风分组标题
- 产品列表页加入大号 display 标题、搜索、卡片悬浮动画
- 产品详情页面包屑、tab 编号、需求表格重做
- 状态徽章改为色点 + 文字,"已拒绝"用红色避免与"评审中"冲突
- 全局加入 grain 噪点纹理、入场交错动画

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-08 12:37:17 +08:00

65 lines
2.4 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.

'use client';
import { useState } from 'react';
interface Props {
initialData?: { name: string; description: string };
onSubmit: (data: { name: string; description: string }) => void;
onCancel: () => void;
}
export function ProductForm({ initialData, onSubmit, onCancel }: Props) {
const [name, setName] = useState(initialData?.name || '');
const [description, setDescription] = useState(initialData?.description || '');
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
if (!name.trim()) return;
onSubmit({ name: name.trim(), description: description.trim() });
};
return (
<form onSubmit={handleSubmit} className="space-y-5">
<div>
<label className="font-mono text-[10px] uppercase tracking-[0.2em] text-[var(--ink-muted)]">
</label>
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
placeholder="例如FTB 智能项目管理"
className="mt-2 block w-full border-0 border-b border-[var(--line)] bg-transparent pb-2 font-display text-2xl text-[var(--ink)] placeholder:font-display placeholder:text-[var(--ink-muted)] focus:border-[var(--accent)] focus:outline-none"
/>
</div>
<div>
<label className="font-mono text-[10px] uppercase tracking-[0.2em] text-[var(--ink-muted)]">
</label>
<textarea
value={description}
onChange={(e) => setDescription(e.target.value)}
rows={3}
placeholder="一句话讲清楚这个产品做什么"
className="mt-2 block w-full resize-none border-0 border-b border-[var(--line)] bg-transparent pb-2 text-[14px] leading-relaxed text-[var(--ink-soft)] placeholder:text-[var(--ink-muted)] focus:border-[var(--accent)] focus:outline-none"
/>
</div>
<div className="flex justify-end gap-2 pt-2">
<button
type="button"
onClick={onCancel}
className="rounded-md px-4 py-2 text-[13px] text-[var(--ink-soft)] hover:bg-[var(--line-soft)]"
>
</button>
<button
type="submit"
className="rounded-md bg-[var(--ink)] px-5 py-2 text-[13px] font-medium text-[var(--bg)] transition-colors hover:bg-[var(--accent)]"
>
{initialData ? '保存修改' : '创建产品'}
</button>
</div>
</form>
);
}