做方案入口改回两枚模式 chip
上一版把「做方案」做成输入框工具栏里的单个开关,默认不选中。问题是默认态没有 任何文字说明"现在会做游戏",只有"做方案没被选中"——它读起来像筛选标签而不是 模式分叉,把默认态藏了起来;而且模式选择混进了附件/发送那排动作按钮里,层级也 是错的。 改成合并前的形态:输入框上方一排常驻 chip,做游戏(默认)与做方案两个都可见, 选中态填色。两个互斥选项都重要时分段控件才是标准解法,单开关只适用于"关是明显 默认且功能人尽皆知";做方案是这条分支要暴露的新链路,最缺的就是可发现性,而且 点错起的是另一条 runtime 链(委派、澄清 pending、GDD 审批),不该藏在一次猜测 性的点击里。样式与容器沿用合并前已上线的类名。 做素材不加回来:master 已把它并进直连构建,与做游戏同链,再列一枚就是两个按钮 干同一件事。占位文案随模式变(做游戏/做方案各一句),副标题保持 master 的固定 问候语——合并前那版副标题与占位是同一句话,重复两遍。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,8 @@ import {
|
||||
FileText,
|
||||
FolderKanban,
|
||||
FolderOpen,
|
||||
Gamepad2,
|
||||
type LucideIcon,
|
||||
Plus,
|
||||
Sparkles,
|
||||
} from 'lucide-react';
|
||||
@@ -19,6 +21,31 @@ import { type HomeDraft, useLauncherHomeDraftStore } from './useHomeDraftStore';
|
||||
|
||||
export type { HomeAttachmentDraft, HomeDraft } from './useHomeDraftStore';
|
||||
|
||||
// 首页只在做游戏与做方案之间分叉:做素材已被 master 并进直连构建,与做游戏同链,
|
||||
// 再列一枚 chip 就是两个按钮干同一件事。做方案要委派子 Agent、挂澄清 pending、过
|
||||
// GDD 审批,是另一条 runtime 链,必须在建项目之前就把 startMode 定下来,所以两个
|
||||
// 选项都常驻可见,而不是拿一枚开关把默认态藏起来。
|
||||
const HOME_START_MODES: readonly ProjectStartMode[] = [
|
||||
'direct-build',
|
||||
'planning',
|
||||
];
|
||||
|
||||
const HOME_START_MODE_ITEMS: Record<
|
||||
ProjectStartMode,
|
||||
{ label: string; placeholder: string; icon: LucideIcon }
|
||||
> = {
|
||||
'direct-build': {
|
||||
label: '做游戏',
|
||||
placeholder: '今天想把什么灵感做成游戏',
|
||||
icon: Gamepad2,
|
||||
},
|
||||
planning: {
|
||||
label: '做方案',
|
||||
placeholder: '今天有什么设计需要帮你整理',
|
||||
icon: FileText,
|
||||
},
|
||||
};
|
||||
|
||||
export type HomeProjectRow = {
|
||||
path: string;
|
||||
name: string;
|
||||
@@ -56,13 +83,8 @@ export default function HomeView({
|
||||
);
|
||||
const [homeCreationBusy, setHomeCreationBusy] = useState(false);
|
||||
const homeCreationBusyRef = useRef(false);
|
||||
// 首页只保留「做方案」一个开关:做游戏 / 做素材 沿用 master 的直连默认,走
|
||||
// direct-build;立项策划要委派子 Agent、挂澄清 pending、过 GDD 审批,只能由
|
||||
// planning 起链,所以必须在建项目之前就把 startMode 定下来。
|
||||
const [planningSelected, setPlanningSelected] = useState(false);
|
||||
const startMode: ProjectStartMode = planningSelected
|
||||
? 'planning'
|
||||
: 'direct-build';
|
||||
const [startMode, setStartMode] = useState<ProjectStartMode>('direct-build');
|
||||
const activeStartMode = HOME_START_MODE_ITEMS[startMode];
|
||||
|
||||
async function createFromHome() {
|
||||
if (homeCreationBusyRef.current) {
|
||||
@@ -118,6 +140,34 @@ export default function HomeView({
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
className="flex w-[min(488px,calc(100vw-110px))] flex-wrap justify-center gap-2.25 max-[760px]:w-[min(100%,calc(100vw-76px))]"
|
||||
role="group"
|
||||
aria-label="创作模式"
|
||||
>
|
||||
{HOME_START_MODES.map((mode) => {
|
||||
const item = HOME_START_MODE_ITEMS[mode];
|
||||
const ModeIcon = item.icon;
|
||||
const isActive = mode === startMode;
|
||||
return (
|
||||
<button
|
||||
className={`inline-flex min-h-6.75 cursor-pointer items-center gap-1.25 rounded-full border px-3 text-[12px] disabled:cursor-not-allowed disabled:opacity-55 ${
|
||||
isActive
|
||||
? 'border-(--platform-nav-active-border) bg-(image:--platform-nav-active-fill) text-(--platform-warm-text) shadow-(--platform-nav-active-shadow)'
|
||||
: 'border-(--platform-subpanel-border) bg-(image:--platform-subpanel-fill) text-(--platform-neutral-text)'
|
||||
}`}
|
||||
key={mode}
|
||||
type="button"
|
||||
aria-pressed={isActive}
|
||||
disabled={homeCreationBusy}
|
||||
onClick={() => setStartMode(mode)}
|
||||
>
|
||||
<ModeIcon size={14} aria-hidden="true" />
|
||||
{item.label}
|
||||
</button>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
<span className="text-[12px] text-(--platform-text-soft)">
|
||||
{status}
|
||||
</span>
|
||||
@@ -127,38 +177,20 @@ export default function HomeView({
|
||||
>
|
||||
<RichInputArea
|
||||
value={homeRichText}
|
||||
placeholder={
|
||||
planningSelected
|
||||
? '今天有什么设计需要帮你整理'
|
||||
: '告诉陶泥儿你想创建什么'
|
||||
}
|
||||
placeholder={activeStartMode.placeholder}
|
||||
onChange={setHomeRichText}
|
||||
onEnter={() => {
|
||||
void createFromHome();
|
||||
}}
|
||||
>
|
||||
<div className="grid grid-cols-[1fr_auto] items-center gap-2.5 text-[12px] text-(--platform-text-soft)">
|
||||
<span className="flex items-center gap-2">
|
||||
<UploadButton />
|
||||
<button
|
||||
className={`inline-flex cursor-pointer items-center gap-1 rounded-full border px-2 py-0.5 text-[12px] transition disabled:cursor-not-allowed disabled:opacity-55 ${
|
||||
planningSelected
|
||||
? 'border-(--platform-warm-text) bg-(--platform-warm-bg) text-(--platform-warm-text)'
|
||||
: 'border-(--platform-surface-border) bg-transparent text-(--platform-text-soft)'
|
||||
}`}
|
||||
type="button"
|
||||
aria-pressed={planningSelected}
|
||||
disabled={homeCreationBusy}
|
||||
onClick={() => setPlanningSelected((selected) => !selected)}
|
||||
>
|
||||
<FileText size={13} aria-hidden="true" />
|
||||
做方案
|
||||
</button>
|
||||
</span>
|
||||
<UploadButton />
|
||||
<button
|
||||
className="grid size-6 cursor-pointer place-items-center rounded-full border-0 bg-(image:--platform-button-primary-fill) p-0 text-(--platform-button-primary-text) shadow-(--platform-profile-action-shadow) disabled:cursor-not-allowed disabled:opacity-55"
|
||||
type="submit"
|
||||
aria-label={planningSelected ? '进入立项策划' : '开启创作'}
|
||||
aria-label={
|
||||
startMode === 'planning' ? '进入立项策划' : '开启创作'
|
||||
}
|
||||
disabled={homeCreationBusy}
|
||||
>
|
||||
<Plus size={16} aria-hidden="true" />
|
||||
|
||||
Reference in New Issue
Block a user