diff --git a/docs/superpowers/specs/2026-06-22-merge-print-export-buttons-design.md b/docs/superpowers/specs/2026-06-22-merge-print-export-buttons-design.md
new file mode 100644
index 0000000..e4d1760
--- /dev/null
+++ b/docs/superpowers/specs/2026-06-22-merge-print-export-buttons-design.md
@@ -0,0 +1,113 @@
+# 合并「打印整册」与「导出 MD」按钮设计
+
+## 背景
+
+`WorkspaceToolbar.vue` 当前并排放置两个独立按钮,均在 `lessonCount === 0` 时禁用:
+
+```vue
+
+
+```
+
+此前已经把「批量生成」「生成一篇」合并为一个下拉菜单按钮(`GenerateMenuButton.vue`,2026-06-22 提交)。本次需求是用同样的交互模式合并「打印整册」「导出 MD」,并借此机会把两个下拉菜单共用的逻辑抽取成通用组件,避免重复。
+
+## 交互
+
+- 合并后的主按钮文案为「导出 ▾」。
+- 点击主按钮只展开/收起下拉菜单,不直接触发任何操作。
+- 下拉菜单包含「打印整册」「导出 MD」两项,点击任意一项后触发对应事件并收起菜单。
+- 点击外部区域或按 `Escape` 收起菜单(与生成菜单一致)。
+- 主按钮在 `lessonCount === 0` 时整体禁用(原生 `disabled`),此时无法展开菜单——与现有两个按钮各自禁用的行为等价。
+
+## 组件设计
+
+### 新增通用组件 `src/components/ToolbarMenuButton.vue`
+
+把下拉菜单的通用逻辑(展开状态、点击外部关闭、Escape 关闭、disabled 处理)收进这一个组件,具体菜单项通过默认 slot 传入,slot 透出 `close` 方法供菜单项点击后调用:
+
+```ts
+defineProps<{
+ label: string
+ toggleTestid: string
+ disabled?: boolean
+}>()
+```
+
+行为:
+- 内部 `open = ref(false)`;`toggle()` 切换 `open`(已经走过原生 `disabled` 拦截,无需在 JS 里再判断一次)。
+- 根元素 `ref`,`onMounted` 注册 `document` 的 `click` 监听判断点击是否在组件外部,`onUnmounted` 移除;`keydown` 监听 `Escape` 关闭。
+- 主按钮:``。
+- 菜单:`
`——因为主按钮 disabled 时浏览器不会触发其 click,`open` 永远不会在 disabled 状态下变为 true,不需要在 `v-if` 里重复判断 `!disabled`。
+- 根元素 class 由 `generate-menu` 改名为通用的 `toolbar-menu`。
+
+### `GenerateMenuButton.vue` 改为薄封装
+
+```vue
+
+
+
+
+
+
+
+
+
+
+```
+
+对外接口(`data-testid` 值、按钮文案、`generate` / `batchGenerate` 事件)完全不变,`WorkspaceToolbar.vue` 和 `WorkspaceView.vue` 不需要任何改动。
+
+### 新增 `src/components/ExportMenuButton.vue`
+
+```vue
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### `WorkspaceToolbar.vue` 改动
+
+将原来的 `