做方案入口改回两枚模式 chip
Project CI / Backend tests (pull_request) Failing after 14s
Project CI / Repository checks (pull_request) Failing after 15s
Project CI / Frontend tests (pull_request) Successful in 3m41s
Project CI / Native shell tests (pull_request) Successful in 16m20s

上一版把「做方案」做成输入框工具栏里的单个开关,默认不选中。问题是默认态没有
任何文字说明"现在会做游戏",只有"做方案没被选中"——它读起来像筛选标签而不是
模式分叉,把默认态藏了起来;而且模式选择混进了附件/发送那排动作按钮里,层级也
是错的。

改成合并前的形态:输入框上方一排常驻 chip,做游戏(默认)与做方案两个都可见,
选中态填色。两个互斥选项都重要时分段控件才是标准解法,单开关只适用于"关是明显
默认且功能人尽皆知";做方案是这条分支要暴露的新链路,最缺的就是可发现性,而且
点错起的是另一条 runtime 链(委派、澄清 pending、GDD 审批),不该藏在一次猜测
性的点击里。样式与容器沿用合并前已上线的类名。

做素材不加回来:master 已把它并进直连构建,与做游戏同链,再列一枚就是两个按钮
干同一件事。占位文案随模式变(做游戏/做方案各一句),副标题保持 master 的固定
问候语——合并前那版副标题与占位是同一句话,重复两遍。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-22 04:52:00 +00:00
parent ab6070e8e3
commit 8e5e0a7fea
@@ -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" />