diff --git a/docs/superpowers/specs/2026-06-22-merge-generate-buttons-design.md b/docs/superpowers/specs/2026-06-22-merge-generate-buttons-design.md new file mode 100644 index 0000000..0cda13a --- /dev/null +++ b/docs/superpowers/specs/2026-06-22-merge-generate-buttons-design.md @@ -0,0 +1,76 @@ +# 合并「批量生成」与「生成一篇」按钮设计 + +## 背景 + +`WorkspaceToolbar.vue` 当前并排放置两个独立按钮: + +```vue + + +``` + +需求:把这两个按钮合并成一个按钮,点击后通过下拉菜单选择具体执行哪种生成方式。 + +## 交互 + +- 合并后的主按钮文案为「生成教案 ▾」。 +- 点击主按钮**只**展开/收起下拉菜单,本身不直接触发任何生成动作。 +- 下拉菜单包含两个选项:「生成一篇」「批量生成」。点击任意一项后: + 1. 触发对应事件(`generate` / `batchGenerate`)。 + 2. 自动收起菜单。 +- 点击组件外部区域、或按下 `Escape` 键,菜单自动收起。 + +## 组件设计 + +### 新增 `src/components/GenerateMenuButton.vue` + +负责封装下拉菜单的全部状态与交互,对外接口与现状保持一致: + +```ts +defineEmits<{ + generate: [] + batchGenerate: [] +}>() +``` + +行为: +- 内部 `open = ref(false)` 控制展开状态。 +- 根元素绑定 `ref`,`onMounted` 时在 `document` 上注册 `click` 监听,点击目标不在根元素内时关闭菜单;`onUnmounted` 时移除监听。 +- 监听 `keydown` 的 `Escape` 关闭菜单。 +- 菜单项按钮保留 `data-testid="generate"` 与 `data-testid="batch-generate"`,点击后 `emit` 对应事件并将 `open` 置为 `false`。 +- 主按钮 `data-testid="generate-menu-toggle"`,点击切换 `open`,并设置 `aria-expanded` 反映状态;下拉 `