mcpField
T
tui-design

tui-design

github.com/hyperb1iss设计与 UI361.3k 次安装1 天前更新
代码仓库

关于 tui-design

用于规划终端用户界面的设计技能,围绕实际任务、终端能力和无障碍交互提供建议。内容涉及布局、输入焦点、异步状态、渲染、生命周期和验证,不限定具体框架。

主要功能

  1. 01以任务为中心的终端布局
  2. 02键盘、焦点与模态交互
  3. 03异步状态和请求处理
  4. 04终端能力与生命周期指引
  5. 05无障碍和验证实践

适用场景

  1. 01设计终端选择器或仪表板
  2. 02处理缓慢或过时的异步结果
  3. 03支持不同终端能力
  4. 04测试尺寸变化、输入和终端恢复

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/hyperb1iss/hyperskills --skill tui-design

安装后在 Claude Code 中输入/tui-design确认已加载。

附带文件references/app-patterns.mdreferences/visual-catalog.md

详细介绍

TUI 设计系统

围绕用户反复执行的操作、必须始终查看的数据,以及终端实际具备的能力进行设计。在 I/O 较慢时保持输入响应灵敏,并明确显示选择、焦点和操作状态。

主要文档核对日期:2026-09-04。 框架 API 会变化;请使用项目所采用的版本。遵循项目的视觉标识(Bliss 个人工具使用 SilkCircuit Neon),不要把示例调色板当作通用主题。

根据任务选择布局

任务布局实用原则
浏览相关列表和详情持久化多面板面板职责稳定,焦点清晰可见
浏览层级结构Miller 列或逐层深入堆栈返回时恢复选择和滚动位置
监控不断变化的测量值小组件仪表板显示标签、单位、数据新鲜度,并提供查看详情的路径
编辑请求、查询或配置侧边栏、编辑器、结果切换面板时保留编辑状态
为 shell 命令选择值内联选择器或浮层返回干净的值,并保留 shell 滚动历史
阅读日志或事件固定控件加虚拟化列表明确显示跟随模式;向上滚动后停止自动跟随

阅读 app-patterns.md 了解示例和权衡。仅在选择字形、边框、图表或指示器时阅读 visual-catalog.md。

响应式行为

使用约束和内容优先级。收起次要面板时,确保所选项目仍然可见;面板重新出现时保留状态。调整窗口大小时重新计算布局,不要将短暂的零尺寸区域视为错误。筛选、删除或视口缩小时,应限制滚动范围。

测试窄屏、常规屏幕和宽屏布局,包括快速调整窗口大小的情况。最低可用尺寸取决于任务;80x24 是实用的测试用例,但这不意味着可以禁用在 40 列宽度下仍能工作的选择器。尺寸提示应保留退出和恢复操作的输入。

输入、焦点与编辑

关注点决策
基本导航支持方向键、Enter、Escape,并确保焦点移动方式易于发现
专家快捷键在能提升重复操作效率时,添加 vim 操作或命令面板
文本字段可打印按键用于编辑文本;q、j、/ 和助记操作不得全局触发
多键快捷键显示待处理上下文,并通过输入库处理 Escape/前缀歧义
模态对话框仅将输入路由到模态对话框;关闭时恢复先前有效的焦点目标
破坏性操作显示确切目标及后果;根据操作的可逆性选择适当的确认方式
鼠标支持与键盘操作保持一致,并提供禁用捕获的方式,以便在终端中选择文本

输入解析只能由一个组件负责。使用 Crossterm 时,不要混用 EventStream 与 read/poll,也不要运行相互竞争的读取器。应有意处理按键按下、重复和释放事件;一次物理按键不得提交两次。

增强型键盘协议可以区分传统终端编码相同的按键。应协商支持情况,并保留可用的备用按键绑定。切勿假定 Ctrl+I 在所有地方都不同于 Tab,或 Ctrl+M 不同于 Enter。将括号括起的粘贴内容视为文本事件;粘贴的换行符不得意外提交破坏性命令。

原始模式可能会禁用终端的常规信号处理。应通过框架妥善实现 Ctrl+C 和挂起/恢复;不要假定操作系统会按原样处理它们。将控制权交给编辑器、分页器、Shell 或挂起的进程前,应恢复终端状态;之后重新获取终端并重绘。

为当前可用操作显示简短页脚,并提供上下文帮助视图。任务运行期间,应保持必要说明可见。持久错误必须有可供检索的位置;消失的 Toast 不能是唯一记录。

状态与异步工作

将输入事件、状态转换、效果和渲染分开。渲染状态快照时,不要从绘图函数发起网络调用或修改领域模型。

digraph tui_state {
    rankdir=LR;
    event -> update;
    update -> state;
    update -> effect;
    effect -> event [label="result + request identity"];
    state -> render;
}
故障模式设计应对
搜索 A 在搜索 B 之后完成为请求添加标记,并丢弃与当前活动查询不再匹配的结果
刷新后某行位置发生变化根据稳定标识跟踪所选项,而不只依赖行索引
工作进行期间视图关闭取消由该视图负责的工作,或有意将其分离;延迟返回的结果不得使视图重新出现
已取消的写入可能已到达服务端区分已取消的等待与已确认的回滚;协调远程状态
日志到达速度快于屏幕更新速度在数据层保留必需事件,并渲染虚拟化视口
尽管使用了 async 语法,工作仍阻塞界面找出阻塞调用或 CPU 密集型工作,并将其移出输入/渲染路径
重复操作会启动重复写入跟踪待处理操作的标识,并在接受冲突操作前显示其结果

批量更新状态,并仅渲染发生变化的帧。合并可替换的视觉快照,而不是审计事件或变更。在丢弃数据或限制并发前,应先诊断队列增长、索引和内存分配成本。

终端能力策略

显式应用设置优先。在自动模式下,进行颜色检测前先遵循非空的 NO_COLOR。颜色覆盖设置可以有意重新启用颜色;禁用颜色并不意味着必须禁用粗体、下划线、布局或所有终端功能。

能力依据与回退方案
交互式终端检查实际的输入/输出 TTY;支持纯文本输出,或说明为何需要 TTY
真彩色使用库的检测、terminfo 或协商后的支持;COLORTERM 是提示,而非要求
256/16 色将语义色位映射到受支持的颜色,并在没有色相时保留标签和焦点
图像、超链接、剪贴板通过复用器协商协议;提供文本或文件替代方案
Nerd Font 图标明确提供或允许用户配置;没有可移植且可靠的字体检测 API
Unicode 布局按字素簇分段并测量终端单元格宽度;不要使用字节长度或码点长度

仅在字素簇边界处截断,并考虑宽字符单元格、组合标记、变体选择符和表情符号序列。宽度库和终端模拟器的结果可能不一致;请测试有代表性的用户文本,并在渲染不确定时提供 ASCII 指示符。

将文件名、日志和远程字符串视为不可信的显示数据。通过原始输出 API 写入前,应对控制序列进行转义;否则,显示的值可能移动光标、更改标题或触发 OSC 操作。请使用框架支持的文本处理/净化路径。

终端查询与按键输入共用输入流。应由一个解析器关联响应,限制对不支持查询的等待时间,并选择回退方案,避免吞掉用户输入。

视觉层级与无障碍

定义语义色位,例如前景色、弱化文本、焦点、选中、警告和错误。不要在控件代码中放置主题值。先提供稳定的间距和标签,再引入更多边框。当应用设置自己的背景时,请提供深色和浅色变体;透明/默认背景需要针对用户主题进行测试。

状态颜色应搭配文本或形状。使用在单色模式下仍有效的焦点指示,并避免将重要值调暗到难以辨认。WCAG 的普通文本 4.5:1 对比度是有用的设计目标,但终端字体大小和 ANSI 颜色由用户控制;终端标题加粗并不自动符合大文本例外条件。不要仅凭调色板就声称符合正式的无障碍标准。

当全屏界面妨碍屏幕阅读器导航时,请提供纯文本或线性呈现方式。仍需使用预期的终端和辅助技术测试有意义的标签、键盘操作和非动画模式。避免闪烁警告或快速闪烁的状态。允许用户减少动态效果;动画不得延迟输入或隐藏最终状态。

渲染与终端生命周期

使用框架的缓冲渲染和单元格差异比较。批量写入;仅在支持时使用同步输出,并确保即使发生错误也始终成对调用 begin/end。单次写入并不能证明渲染是原子的;同步输出是增强功能,而非 TUI 可用的前提。

在状态变化或动画截止时间到达时进行渲染。在预期数据速率下测量输入延迟、输出带宽和重绘成本,包括 SSH 和复用器。根据实际工作负载选择刷新频率;不要强制设定通用 FPS 上限,也不要人为延迟流式文本。

通过作用域限定的所有者获取终端模式,并恢复应用启用的所有设置:原始模式、备用屏幕、光标可见性、鼠标捕获、括号粘贴和键盘协议状态。涵盖正常退出、初始化失败、异常/崩溃以及已处理的信号。框架的恢复辅助函数可能只涵盖其中一部分;请检查其约定。SIGKILL 无法执行清理。

能提升信心的验证

针对删除后的选中项、过期的异步结果、模态窗口焦点恢复以及已取消的操作,编写确定性的状态转换测试。使用框架的测试后端检查布局边界;至少检查一次真实 PTY 会话,因为快照不会测试终端模式或输入协议。

测试启动、输入、粘贴、调整大小、打开/关闭模态窗口、缓慢或失败的 I/O,以及退出。涵盖浅色/深色主题、禁用颜色、宽字符/组合字符,以及实际支持的终端/复用器路径。退出后,验证 shell 的光标和回显行为已恢复。只有在可移植性要求或故障情况确有需要时,才扩展测试矩阵。

反模式

反模式更好的做法
在检测真彩色后才检查 NO_COLOR在选择终端能力前解析用户偏好
全局快捷键占用文本输入根据焦点和活动模式路由事件
将 Unicode 版本的发布截止时间当作兼容性依据测量字素/单元格,并测试受支持的模拟器
异步请求完成时覆盖较新的状态将结果标识与当前视图/查询关联
后台日志记录清屏或转义码通过状态或独立接收端发送日志
降低 FPS 或并发度来掩盖过载队列分别分析生产者、状态处理和渲染器
仅在正常退出时恢复终端使用生命周期保护机制以及框架的崩溃/信号处理

主要来源

核查日期:2026-09-04:Ratatui 应用模式、Ratatui 恢复约定、Crossterm 输入所有权、kitty 键盘协议、NO_COLOR、Unicode 字素分段以及对比度指南。

关于状态所有权和验证的指导,是基于这些约定综合得出的工程建议,并不意味着协议能保证应用正确性。

此技能不是什么

  • 不是框架 API 手册,也不要求采用新工具包。
  • 不是给简单选择器添加动画、图标或模式的理由。
  • 不能替代对实际终端和无障碍操作路径的测试。

评论

支持 Markdown