展示
StatusPill - 状态胶囊
一种活着的状态:一个点,加一行大写等宽标签。
用法
import { StatusPill } from '@misoto22/folio'说明
一个有名字的实时状态:一个点,加一个描边药丸里的等宽大写标签。
做成一个组件,而不是每个调用处自己拿点和药丸拼一遍——同一个“可接洽”的小标签,正是那样在一个站点里长出了三种点的尺寸和两种脉动节奏。
warning 和 danger 这两种 tone 会由一个视觉隐藏的严重程度词再说一遍,所以那个点被藏起来时,tone 还在。它熬不过单色:药丸自己的文字在每种 tone 下都是 --ink-2,而状态本身,依然属于调用处写下的那些字。
结构
| 部件 | 说明 |
|---|---|
| 胶囊必填 | 那个描边的 <span>:--radius-pill、一条 --rule-2 细线、--paper 底色,以及一份刻意不对称的内边距——点之前 10px,标签之后 12px——好让这一对在视觉上居中,而不是在算术上居中。 |
| 点必填 | 一个被交了 tone 和 pulse 的 StatusDot。它是 aria-hidden 的,所以 tone 并不是从这里抵达一个看不见颜色的读者。 |
| 标签文字必填 | children,用眉标那套写法——11px 大写等宽字,字距从 0.2em 收回到 0.12em,因为一个胶囊比一条章节眉标要短。 |
| 严重度 | warning 和 danger 两档下一个视觉上隐藏的“Warning”或“Error”,好让这两档能通过颜色之外的东西抵达读者——而不是靠一个被隐藏的点上的颜色。success 和 neutral 什么都不加:它们是“没有警报”,而这本来就是读者默认的前提。 |
实践建议
推荐
- 状态还是要写进字里。那个严重度词只到读屏软件为止,别处都到不了——胶囊自己的文字在每一档 tone 下都是 --ink-2,所以在单色屏幕上,警告胶囊里的「Degraded」和中性胶囊里的「Degraded」仍然是同一个胶囊。
- 状态一旦落定就 pulse={false}——默认那圈光晕的意思是“此刻”,而一个已归档、已发布的胶囊永远脉动下去,是在告诉读者有什么东西还活着,而其实什么都没有。
- 整个胶囊拿去用,不要在调用处拿一个点加一个 span 自己拼:正是这种拼法,让同一个“接受合作”的标记在同一个站点上长出三种点尺寸和两种脉冲节奏。
避免
- 它不是 live region。这个胶囊就是一个普通的 <span>,所以读者还停在页面上时,状态从 Available 翻成 Degraded 是悄无声息的——如果这次变化本身就是新闻,那么外面那个 role="status" 归调用处管。
- 一屏一个,不是一行一个。这个标签是 0.12em 字距的大写眉标——这套系统里最响的小字——而顺着表格排下来的一整列是 Badge 的活,这也正是 Badge 用朴素的 12px 等宽字带着同样那几种状态色的原因。
示例
default
整枚药丸,而不是在调用处拿一个点和一个 span 拼起来,后者正是同一枚「接受委托中」的芯片在同一个站点上长出三种点尺寸、两种脉动节奏的经过。tone 只够得着那个点,而点是 aria-hidden 的,所以那些字必须自己把状态说出来:「部分故障」放在一枚 warning 药丸里和放在一枚 neutral 药丸里,对任何看不见颜色的人来说是同一句话。
Available for workWarningPartial outage
settled and live
每一种 tone,而脉动只花在那个真正正在发生的状态上。光晕的意思是「此刻」,所以一枚已归档或已发布的药丸还留着脉动,是在告诉读者有什么是活的,而其实什么都没有。这枚药丸还只是一个普通的 span,不是一个实时区域:一个在读者停留期间从 Live 翻到 Degraded 的状态,除非调用处把它包进 role="status",否则是悄悄变过去的。
LiveWarningDegradedErrorIncident openArchived
one per view
一个视图配一枚药丸,它底下那些行配徽标。这个标签是一行 0.12em 字距的大写引题——这套系统里最响的小字号——所以一列药丸顺着列表排下去,就是每一行都在用同样的方式喊。Badge 用朴素的 12px 等宽字承载同样那几种状态色,而那才是一条记录级的状态该有的样子。
Deploy pipelineWarningDegraded
- Build Passed
- Typecheck Passed
- Visual diff 2 changed
无障碍
- warning 和 danger 两档由一个视觉上隐藏的严重度词重复表达,因为承载颜色的那个点是 aria-hidden 的,它没有名字可给。
- success 和 neutral 保持沉默是故意的:在每一个已经落定的胶囊前面播报一句「OK」,是把噪音记在那两档真正值得打断人的状态账上。
- 不是 live region。读者还停在页面上时翻掉的状态是悄无声息的,除非调用处自己在外面套一个 role="status"。