diff --git a/docs/superpowers/specs/2026-06-27-message-card-component-design.md b/docs/superpowers/specs/2026-06-27-message-card-component-design.md new file mode 100644 index 0000000..4ca5f49 --- /dev/null +++ b/docs/superpowers/specs/2026-06-27-message-card-component-design.md @@ -0,0 +1,158 @@ +--- +author: claude +created_at: 2026-06-27 +purpose: 提取 MessageCard 组件,统一所有 AI 消息卡片样式,按内容长度阈值(100 字)决定是否显示完整功能按钮 +--- + +# MessageCard 组件统一设计 + +## 背景 + +在上一轮实现中,result-chat-list 中的 assistant 消息使用了 `.chat-bubble.system` 气泡样式,与 `story-card` 的卡片样式不一致。用户要求: + +1. 所有 AI 回复消息卡片的样式、功能、布局、按钮等,都与第一次生成剧本的 `story-card` 完全一致 +2. 内容 < 100 字的 assistant 消息:只显示消息内容,无功能按钮 +3. 内容 ≥ 100 字的 assistant 消息:必须与 `story-card` 完全一致 + +## 目标 + +- 提取独立的 `MessageCard.vue` 组件 +- story-card 和 result-chat-list 都复用该组件 +- 按 100 字阈值自动切换显示模式 + +## 方案选择 + +采用 **方案 B:提取独立 MessageCard.vue 组件** + +- 代码复用,维护性好 +- 改动范围:新建 1 个组件 + 修改 ScriptView.vue + +## 详细设计 + +### 1. 组件接口 + +**文件**:`mini-program/src/components/MessageCard.vue` + +**Props:** + +| Prop | 类型 | 必填 | 说明 | +|---|---|---|---| +| `content` | String | 是 | 消息/故事正文内容 | +| `title` | String | 否 | 卡片标题,默认 `'我的人生剧本'` | +| `tags` | Array | 否 | 标签列表 | +| `collapsed` | Boolean | 是 | 当前折叠状态 | +| `contentLength` | Number | 是 | 内容字数(用于阈值判断) | +| `isShortMessage` | Boolean | 是 | `contentLength < 100` 时为 true | +| `ttsIcon` | String | 否 | TTS 按钮图标(`▶` 或 `Ⅱ`) | +| `ttsText` | String | 否 | TTS 按钮文字(`播放` 或 `暂停`) | + +**Events:** + +| 事件 | 说明 | +|---|---| +| `toggle-collapse` | 展开/收起 | +| `copy` | 复制内容 | +| `change-direction` | 换个方向 | +| `not-like-me` | 不像我 | +| `continue` | 继续生成 | +| `play-tts` | 播放 TTS | + +### 2. 组件内部结构 + +**短消息(`isShortMessage = true`)**: + +```vue + + {{ content }} + +``` + +只显示纯文本气泡,无标题、无标签、无按钮。 + +**长消息(`isShortMessage = false`)**: + +完整复用现有 `story-card` 的 HTML 结构: + +- 标题(`.story-title`)+ 标签(`.tag-row`) +- 头部操作区:展开/收起按钮 + 复制按钮 +- 正文:展开时用 scroll-view,收起时用 text +- 底部:展开全文/收起全文按钮 +- 功能按钮组(2 列网格):换个方向、不像我、继续生成、播放 + +### 3. ScriptView.vue 中的使用 + +**替换现有 story-card**: + +```vue + +``` + +**替换 result-chat-list 中的 assistant 消息**: + +```vue + + + + {{ message.content }} + {{ message.time }} + + +``` + +### 4. 样式迁移 + +将以下 CSS 类从 `ScriptView.vue` 迁移到 `MessageCard.vue` 的 `