Files
mail/doc/003-inbox-ui-redesign.md
titor c9b77feabe feat: 收件箱功能新增按回车查看详情面板
- 添加邮件详情面板显示(主题、发件人、收件人、抄送、账户、时间、正文)
- 优化邮件列表卡片样式,增加选中高亮效果
- 窗口宽度 >= 80 时启用双面板布局,左侧列表右侧详情
- 简化依赖包,从 charm.land 使用统一导入路径
- 删除未使用的 golangci/goreleaser 配置文件
2026-04-10 04:41:22 +08:00

6.9 KiB
Raw Permalink Blame History

第3次收件箱界面改版讨论

日期

2026-04-10

背景

参考 charmbracelet/glow 的 TUI 设计,将 inbox 界面改为更现代化的双栏布局。

最终实现效果

双栏布局(终端宽度 ≥ 80

┌───────────────────────────────────────────────────────────────────────┐
│  收件箱 (5 封新邮件)                   │  邮件详情                          │
├─────────────────────────────────────────┴────────────────────────────────┤
│ 新设备登录提醒                           │  主题:新设备登录提醒               │
│ ▣ 163 · 11小时前                       │  发件人: xxx@163.com              │
│─────────────────────────────────────────│  账户: 163                       │
│ 您的账号正在一台新设备上登录              │  时间: 2026-04-10 10:30          │
│ ▣ 163 · 11小时前                       │                                   │
│─────────────────────────────────────────│  预览: 您的账号正在一台新设备上登录... │
│ 项目进度更新                             │                                   │
│ ▣ work · 昨天                           │                                   │
├─────────────────────────────────────────┴────────────────────────────────┤
│ ↑ 上移  ·  ↓ 下移  ·  enter 查看详情  ·  / 搜索  ·  q 退出            │
└───────────────────────────────────────────────────────────────────────┘

布局说明

  • 整体布局:全屏 TTY 模式,清屏后占满整个终端窗口
  • 列表区域:占窗口宽度的 45%,高度的 80%
  • 详情区域:占窗口宽度的 55%
  • 帮助栏:固定在窗口最底部,使用系统内置帮助组件

卡片样式

卡片结构(每封邮件两行)

┌─────────────────────────────────────────┐
│ 主题:邮件标题内容...                     │ ← 第一行白色主题Bold
│ ▣ 账户 · 11小时前                       │ ← 第二行:灰色账户+时间,有▣标记
└─────────────────────────────────────────┘

样式细节

  • 未选中卡片
    • 主题行白色前景无背景上内边距1左右内边距1下内边距0
    • 元信息行:灰色前景(#241无背景上内边距0左右内边距1下内边距1
  • 选中卡片
    • 主题行:白色前景,浅紫色背景(#99上内边距1左右内边距1下内边距0
    • 元信息行:浅紫色前景(#186浅紫色背景#99上内边距0左右内边距1下内边距1

主题色

  • 背景色:#99(浅紫色)
  • 选中背景:#99
  • 标题前景:#219(粉色紫)

功能需求

功能 状态 说明
双栏布局(列表 + 详情) 列表45%详情55%
全屏 TTY 模式 使用 AltScreen清屏
卡片式邮件列表 两行结构:主题 + 元信息
选中高亮 浅紫色背景
帮助栏固定底部 使用系统内置帮助组件
列表高度80% 根据窗口高度动态计算
搜索过滤功能 待实现
详情面板显示完整邮件 待实现(需要按需获取)

功能需求

功能 状态 说明
双栏布局(列表 + 详情) 列表45%详情55%
全屏 TTY 模式 使用 AltScreen清屏
卡片式邮件列表 两行结构:主题 + 元信息
选中高亮 浅紫色背景
帮助栏固定底部 使用系统内置帮助组件
列表高度80% 根据窗口高度动态计算
搜索过滤功能 待实现
详情面板显示完整邮件 按回车获取完整邮件内容

技术要点

关键实现

  1. TTY 模式v.AltScreen = true 在 View() 方法中设置
  2. 宽度计算int(float64(totalWidth) * 0.45) 计算列表宽度
  3. 高度计算int(float64(msg.Height) * 0.8) 设置列表高度为窗口的80%
  4. 帮助栏
    • l.SetShowHelp(true) 启用内置帮助
    • 自定义 inboxHelpKeyMap 实现 ShortHelp()FullHelp() 接口
  5. 卡片渲染
    • emailDelegate.Height() 返回 2每卡片2行
    • emailDelegate.Spacing() 返回 0卡片间无间距
    • 使用 lipgloss.NewStyle().Width(width) 固定宽度
    • 使用 truncateString() 函数实现超出截断

按回车获取详情实现

  1. InboxModel 新增字段
    • loadingDetail bool - 是否正在加载详情
    • selectedDetail *EmailDetail - 已获取的详情数据
    • detailFetcher DetailFetcher - 详情获取回调函数
  2. DetailFetcher 模式:通过回调函数解耦获取逻辑,便于测试和扩展
  3. DetailResultMsg 消息:异步获取完成后通过消息传递结果
  4. Spinner 加载动画:使用 bubbles spinner 组件显示加载状态
  5. IMAP ID 命令QQ 邮箱需要发送 ID 命令通过 "Unsafe Login" 检查

文件修改

  • inbox/model.go:主要实现文件
  • inbox.go:使用 tea.NewProgram() 创建程序
  • imap.go:新增 FetchEmailDetailByUID 函数获取完整邮件内容

实施步骤

步骤 描述 状态
1 创建讨论文档
2 升级 charm.land v2 依赖
3 实现双栏布局基础结构
4 实现 View() 全屏渲染
5 实现卡片样式(两行结构)
6 实现选中高亮效果
7 添加帮助栏(系统内置)
8 调整列表高度为80%
9 移除边框,优化间距
10 实现右侧详情面板
11 添加搜索过滤功能
12 实现按需获取完整邮件内容

待优化项

  1. 搜索功能:启用 list.SetFilteringEnabled(true) 后需要实现过滤逻辑
  2. 邮件数量:当前只显示未读邮件,可扩展为支持所有邮件
  3. 邮件操作:查看、删除、标记已读等操作待实现