# 方案比选指南 本文档指导 AI Agent 如何为用户提供多方案比选,以及如何引导用户进行决策收敛。 ## 🎯 目标 通过结构化的比选流程,确保: 1. 为用户提供有价值的备选方案 2. 方案数量可控,便于用户决策 3. 及时引导用户进行收敛决策 4. 使用 `VariantSwitcher` 组件进行方案展示 ## 📋 核心规则 ### 1. 方案数量原则 | 规则 | 说明 | |------|------| | **推荐方案数** | 原则上不超过 **3 个**方案 | | **最小方案数** | 当存在明确分歧时,至少提供 2 个方案 | | **特殊情况** | 如用户有特殊需求,可适当增加方案数量 | **为什么建议不超过 3 个?** - 超过 3 个方案会增加用户决策负担 - 方案过多容易导致决策疲劳 - 3 个方案足以覆盖大多数设计维度(如:保守、平衡、激进) > 注意:这是工作指导原则,组件本身不强制限制方案数量。 ### 2. 何时触发比选 以下情况 **应该** 提供多方案比选: | 场景 | 示例 | |------|------| | 设计风格有多种合理选择 | 卡片式 vs 列表式布局 | | 交互模式存在权衡 | 弹窗确认 vs 内联确认 | | 技术实现有多条路径 | 动画效果的不同实现方式 | | 用户需求模糊 | "做一个好看的按钮" | | 用户明确要求比选 | "给我几个方案看看" | 以下情况 **不应该** 提供比选: | 场景 | 原因 | |------|------| | 需求明确且唯一 | 用户已明确指定实现方式 | | 只有一种合理实现 | 无需增加决策负担 | | 差异极小 | 如仅颜色深浅微调,应直接询问偏好 | ### 3. 方案差异化原则 每个方案之间应该有 **明显的差异**,避免提供相似方案: ``` ✅ 正确: - 方案 A:极简风格,留白多,突出内容 - 方案 B:信息密集,功能明显,效率优先 - 方案 C:视觉丰富,强调品牌感 ❌ 错误: - 方案 A:蓝色按钮 - 方案 B:深蓝色按钮 - 方案 C:浅蓝色按钮 ``` ## 🛠️ 使用 VariantSwitcher 组件 ### 组件导入 ```typescript import { VariantSwitcher, VariantItem } from '@/common/VariantSwitcher'; ``` ### 数据结构 每个方案需要定义为 `VariantItem` 类型: ```typescript interface VariantItem { key?: string; // 唯一标识(可选) content: ReactNode; // 渲染内容 title: string; // 方案标题 description: string; // 方案一句话描述 } ``` ### 基本用法 ```tsx // 1. 定义方案数据 const CARD_VARIANTS: VariantItem[] = [ { key: 'minimal', content: , title: '极简风格', description: '大量留白,突出内容本身' }, { key: 'dense', content: , title: '信息密集', description: '功能区块明显,操作便捷' }, { key: 'visual', content: , title: '视觉冲击', description: '强调视觉效果,品牌感强' } ]; // 2. 使用组件 { console.log(`用户选择了: ${item.title}`); }} /> ``` ### Props 说明 | 属性 | 类型 | 必填 | 说明 | |------|------|------|------| | `id` | string | 否 | 唯一标识符,用于全局寻址 | | `name` | string | 否 | **中文名称**,显示在全局面板中(如"头部设计"、"登录页布局") | | `variants` | VariantItem[] | 是 | 方案列表 | | `defaultIndex` | number | 否 | 默认选中索引,默认 0 | | `onConfirm` | function | 否 | 确认回调,参数为 (index, item) | | `onReset` | function | 否 | 重置回调 | | `style` | CSSProperties | 否 | 容器样式 | | `className` | string | 否 | 容器类名 | ### 组件特性 #### 1. 轻量化入口 - 鼠标悬停在组件上时,右上角显示切换图标 - 点击图标弹出方案选择面板 - 面板显示每个方案的标题和描述 #### 2. 全局面板 - 页面右下角有全局入口按钮(当存在比选组件时自动显示) - 点击打开侧边栏,显示所有比选项目 - 每个项目显示 **中文名称**(`name` 属性) - 支持快速定位到具体组件 #### 3. 快捷键支持 - `Ctrl + .` 或 `Cmd + .`:显示/隐藏比选入口 ### 外部控制 ```javascript // 在浏览器控制台或 AI Agent 中 const manager = window.AXHUB_VARIANT_MANAGER; // 获取实例 const switcher = manager.instances['card-style']; // 切换方案 switcher.select(1); // 选择第 2 个方案 // 确认选择 switcher.confirm(); // 定位到组件 switcher.focus(); // 获取所有实例 Object.values(manager.instances).forEach(inst => { console.log(`${inst.name}: 当前选择 ${inst.variants[inst.currentIndex].title}`); }); ``` ## 💬 用户交互规则 ### 1. 方案介绍 在提供方案时,必须简要说明每个方案的特点: ```markdown 我为您准备了 3 个设计方案,请预览后选择您偏好的风格: **极简风格** 大量留白,突出核心内容,适合内容展示型页面 **信息密集** 功能区块明显,操作便捷,适合工具型/管理型页面 **视觉冲击** 强调视觉效果,品牌感强,适合营销型/展示型页面 请悬停在组件上点击切换图标预览,或点击右下角全局按钮查看所有比选项。 选定后点击"确认"按钮。 ``` ### 2. 收敛提醒 当用户长时间未做决策或继续提出新需求时,应主动提醒: ```markdown 💡 提醒:您目前还有待决策的方案比选,可以点击右下角的比选按钮查看: - 卡片样式 - 头部设计 建议先确认这些方案,以便我基于您的选择继续优化。 ``` ### 3. 决策后确认 用户确认方案后,应给予反馈: ```markdown ✅ 已记录您的选择: - 卡片样式:**极简风格** 我将基于这个选择继续后续开发。如需调整,可随时点击组件上的切换图标重新选择。 ``` ## 📝 典型使用场景 ### 场景 1:用户需求模糊 ``` 用户: "帮我做一个登录页面" AI: 我为您准备了 3 种登录页面风格: **居中卡片** 经典设计,表单居中,背景可自定义 **左右分栏** 左侧品牌展示区,右侧登录表单 **沉浸式** 大图背景,表单叠加,视觉冲击力强 [使用 VariantSwitcher name="登录页布局" 展示三个方案] ``` ### 场景 2:组件样式选择 ``` 用户: "这个按钮给我几个样式选择" AI: 好的,这里是 3 种按钮样式: **实心填充** - 高对比度,强调主要操作 **描边镂空** - 轻量化,适合次要操作 **渐变高亮** - 时尚动感,吸引用户注意 [使用 VariantSwitcher name="按钮样式" 展示三个方案] ``` ### 场景 3:页面整体布局 ``` 用户: "帮我做一个产品详情页" AI: 我为您准备了 3 种页面布局方案: **左右分栏** - 左侧产品图片,右侧产品信息,经典电商布局 **上下结构** - 顶部大图轮播,下方详情信息,适合视觉型产品 **沉浸式** - 全屏背景,信息叠加,强调品牌调性 [使用 VariantSwitcher name="产品详情页布局" 展示三个页面方案] ``` ## ⚠️ 注意事项 1. **命名规范**:`name` 属性应使用清晰的中文名称,便于用户在全局面板中识别 2. **方案描述**:每个 `VariantItem` 的 `title` 和 `description` 应简洁明了 3. **布局影响**:组件外层是 relative 定位的 div,确保父容器正确设置尺寸 4. **事件冒泡**:控制条按钮已阻止事件冒泡,不会触发下层点击事件 5. **层级覆盖**:全局面板 z-index 为 100000,注意与其他 Modal 的层级冲突 6. **快捷键**:使用 `Ctrl + .` 可以隐藏/显示比选入口,适合演示场景 ## ✅ 检查清单 ### 提供比选前 - [ ] 确认确实存在多种合理方案 - [ ] 方案之间有明显差异 - [ ] 原则上方案数量不超过 3 个 - [ ] 每个方案都有清晰的标题和描述 ### 比选进行中 - [ ] 使用 `VariantSwitcher` 组件展示方案 - [ ] 设置有意义的 `name` 属性(中文名称) - [ ] 为每个方案提供 `title` 和 `description` - [ ] 向用户说明如何切换和确认 ### 比选完成后 - [ ] 确认用户的选择 - [ ] 基于选择继续后续工作 - [ ] 如有多个待决策项,提醒用户收敛 ## 🔗 相关文档 - `src/common/VariantSwitcher.tsx` - 组件实现代码 - `src/prototypes/ref-variant-switcher-demo/` - 演示页面 - `skills/third-party/brainstorming/SKILL.md` - 需求对齐规则 - `development-guide.md` - 开发指南