跳到正文
册页

图示

DiagramInspector - 检查面板

读者刚刚选中的东西,写在图旁边。

用法

什么时候用它

一个节点大概能装八个词,再多它就不是节点了。超出这八个的——端口、归属团队、它参与的六条关系——都归这里。

来自@misoto22/folio/diagrams

TSX
import { DiagramInspector } from '@misoto22/folio/diagrams'

说明

读者刚刚选中的东西,写出来。

一张图里每个节点大概能装八个词,再多它就不是图、而是一份画了线的文档。超出这八个的一切——端口、归属团队、它是从哪个文件读出来的、它参与的那六条关系——都属于图旁边而不是图里面,而这里就是那个地方。

不是对话框,而且这是刻意的。检查面板是一个随选择变化的区域,不是一个模态。给它 role="dialog" 会为一个读者从未打开过的东西劫持焦点、索要关闭——他们点的是一个节点,面板是跟过来的。所以它是一个带 aria-live="polite" 的具名区域,这正是让读屏软件播报新选择、同时不把光标从读者手上的事情里抢走的做法。

关系带了 onSelect 时是真按钮,这就是这张图变得可用键盘导航的方式:读者可以一个邻居一个邻居地走完整张图,全程不碰那张画。

结构

DiagramInspector anatomy
部件说明
区域必填一个名为「<title> details」、带 aria-live="polite" 的 <section>,落在一块面板底上。是区域而不是对话框:没有任何东西困住焦点,也没有任何东西要求被关掉,因为读者点的是一个节点,不是打开了一扇窗。
标题必填标题上方的眉标——先说这是哪一类东西,再说它叫什么。板块自己的那个引导词就该落在这个眉标里,这样面板和画面对同一个节点说的是同一句话。
事实一份定义列表,一行一个词条和一个值,遇到 id、路径、端口时值可以设成等宽。是列表而不是一堆 div 摆出来的网格,因为网格不会告诉读屏软件哪个值属于哪个标签。
关系节点参与的每一条边各占一行,带了 onSelect 就各自变成真按钮。箭头字形是隐藏的,方向在它旁边写成文字,所以「to」和「from」是听得见的,不用猜。
关闭一个按它所做的事命名的小控件——清掉选择,不是关掉一扇窗。它是唯一能把这块面板清空的东西。
操作事实下方一排会换行的、由调用方提供的按钮:复制 id,打开这个节点是从哪里读出来的那份源。

实践建议

推荐

  • 把它和图的 onSelectNode 配起来用。正是那一下把隐藏的摘要列表变成真按钮;没有它,这块面板永远只能靠指针填满——图里的板块按设计就是纯装饰的。
  • 每一条关系都要给 onSelect。这些行会变成按钮,整张图也就能一个邻居一个邻居地走下去——键盘读者正是这样从一个节点走到与它相连的那个节点,而不必再回到列表里去。
  • 长的事实挪到这里来,板块上留大约八个词。一个要装端口、归属团队和文件路径的方框,会长大到把三样都装下,而不是把它们裁掉;而由这么大的方框组成的图,就是一份画了几条线的文档。

避免

  • 两条共用一个标签的事实,就是两行用了同一个 key——这份列表是拿标签本身当 key 的,所以出现两次「Source」的面板得到的是一个协调 bug,而不是两行。要么给第二条另起一个名字,要么让一行同时装下两个值。
  • floating 把这块面板钉在界面上方,所以只要它还挂着,就一直盖着图的那个角。它自己没有任何关闭契约——不传 onClose,读者就没有任何东西可按,那个角也一直被盖到选择发生变化为止。

示例

default

一次选择会往屏幕上放的东西:它是哪一类东西、它的名字、那些长到印不进板子里的事实,以及它参与的每一条关系,方向都写明白。它是一个带 aria-live 的具名区域,不是一个对话框——读者点的是一个节点,不是打开了一块面板,所以这里没有任何东西劫持焦点,也没有什么必须先关掉页面才重新能用。mono 是给读者可能会重新敲一遍的值用的;那些事实是一份定义列表,所以读屏软件能说清哪个值属于哪个标签。

Service

API

FastAPI, behind the load balancer. Owns every read the cache misses.

Port
8000
Region
ap-southeast-2
Id
api
Relationships
  • fromCloudFrontHTTPS
  • toRedisread-through
  • toPostgresSQL

nothing selected

这块面板自己没有空状态——title 是必填的,所以根本没法渲染一个里面什么都没有的它,而读者在挑中任何东西之前看到的是什么,归调用方去画。一定要画点什么:一根在选择被清空时就消失的列,每次有人关掉面板都会把布局的其余部分一起带走。关系那一行是一个真的按钮,因为它带着 onSelect,而正是这一点让键盘可以一个邻居一个邻居地走完整张图,全程不碰那幅画;onClose 回到那个空的情形。

Pick a component to see what it is and what reaches it.

pinned over the figure

floating 会把这块面板变成一块钉在最近的定位祖先左下角的板,所以那层容器必须自己建立一个定位上下文,否则它会把自己钉到页面更上方的某个东西上。当图形占据整个视口、而排在文档流下面的面板在最需要它的那一刻却在屏幕之外时,就把它钉住;当图形只是一篇文章里的一项时,就让它留在文档流里。activeIds 会点亮这块面板正在讲的那个节点,而两者谁也不伸手去够对方——画面和面板是同一份选择的两个消费方。actions 是「读者拿这次选择去做什么」的去处。这个区域的无障碍名称取自 title,所以一页上的两块面板绝不能检查同一个节点——这一块选的是那个数据存储,而不是第一个例子所讲的那个服务。

Request path3 elements and 2 relationships.CLOUDCloudFrontCDNSERVICEAPIFastAPIDATAPostgres

3 elements and 2 relationships.

  • CloudFront (cloud) — CDN
  • API (backend) — FastAPI
  • Postgres (database)
  • CloudFront → API: HTTPS
  • API → Postgres: SQL
1 highlighted
Datastore

Postgres

The primary, and the end of the request path above it.

Id
db
Links
1

无障碍

  • 是一个带 aria-live="polite" 的具名区域,不是对话框:读者点的是节点,他们没有“打开”任何东西,所以焦点从不被劫持或索要。
  • 关系带了 onSelect 时是真按钮,这样这张图就能用键盘一个邻居一个邻居地走下去。