跳到正文
册页

反馈

ErrorState - 错误状态

一个没能显示出来的页面。

用法

TSX
import { ErrorState } from '@misoto22/folio'

说明

一个无法显示的页面。

状态码排在字号阶梯的最顶端,并标了 aria-hidden——念出来的话,在解释它的那句话之前先来一个“404”只是噪音,而紧随其后的标题已经用文字说了同一件事。

结构

ErrorState anatomy
部件说明
屏必填一个至少一屏高的 section,自己铺 --paper 底色,并给页头留出 96px 的净空。它是一个页面,不是一个区块。
状态码必填code,坐在字号阶梯的最顶端,aria-hidden。它是屏幕上最大的东西,也是读屏用户唯一永远听不到的东西。
标题必填heading,经由 Heading 以 --fs-heading 渲染,也是第一句被念出来的话。level 默认是 1,因为它顶替的是整个页面;字号是固定的,所以被降成 h2 的错误状态,看上去还是原来那么大。
说明必填message,行长为 --measure-record,「发生了什么」的解释写在这里。
操作必填回去的路。它是必填而不是可选的,也是这一屏上唯一可聚焦的东西。

实践建议

推荐

  • 用它顶替页面,而不是放进页面里。它是一整屏,自带底色和顶部净空,所以嵌在一个已经有页头的布局里,它会在首屏之下再添一屏空白。
  • 客户端失败时要播报它,或者把焦点移进去。这里没有 role、也没有 live region,所以一条把整屏换成它的路由,改掉了看得见的读者眼前的一切,却什么也没说。
  • action 要指向一个真实的目的地,而不是浏览历史。读者常常是冷启动、或者顺着一个链接到达错误页的,所以返回会把他送回刚刚失败的那个页面,或者送回什么都没有的地方。

避免

  • 在一个已经有 h1 的应用外壳里,不要把 level 留在 1。一份文档上两个 h1,会让标题列表再也说不清哪一个才是这个页面——渲染进外壳、而不是顶替外壳的状态,要传 level={2}。
  • 不要把请求 id、调用链或者一整句话塞进 code。它是 --fs-title 加 leading-none,而且 aria-hidden,所以任何长内容都会变成页面上最大的一块,同时又对最可能需要复述它的那位读者完全不可见。
  • 只有一个面板失败、页面其余部分还能用时,不要用它。换掉整屏就把读者赖以脱身的导航一起扔了;把 Alert 放进那个面板里,错误和绕过它的路才都还在。

示例

not found

那个显示不出来的页面。要用它代替这个页面来渲染,而不是渲染在页面里面:它是一整屏视口,自带底色和顶部净空,所以嵌进一个已经有页头的布局里,会在首屏以下再加一屏空白——这里的例子传了 min-h-0 来适配画布,也传了 level={2},因为本页自己的 h1 就在它们上面。code 位于字号梯子的顶端,而且是 aria-hidden 的,所以紧随其后的标题必须用文字把同一件事再说一遍。这里也没有实时区域,所以一个把整屏换成它的路由,改掉了看得见的读者能看见的一切,却什么都没说。

Page not found

The page you're looking for has moved, or never existed.

Back home

a way back

action 是必填而不是可选,因为它是这一屏上唯一可聚焦的东西——而且它必须指向一个真实的目的地,而不是指向历史记录。一个读者从冷启动、或者从别人给的链接到达一个错误页的次数,至少和从应用内部到达一样多,所以「返回」会把他送回刚刚失败的那个页面,或者送到什么都没有的地方。两条链接差不多就是它该承载的上限:回家的路,以及那个能说明「是不是只有我这样」的页面。

Something went wrong at our end

The request reached us and failed while it was being handled. Nothing you sent was lost.

the trace id

那串编号该去哪里:写进消息里,绝不写进 code。code 是按 --fs-title 配 leading-none 排的,而且是 aria-hidden 的,所以一个放在那儿的 request id 会成为整页上最大的物体,同时又对那个最可能要在电话里念出它的读者完全隐形。那个槽位的尺寸是照着三个字符定的;编号属于句子里,在那儿它可被选中、可被复制,也会和其余的解释一起被念出来。

We could not load this deploy

The build service timed out. Quote req_8f31c0 if you report it — it identifies this request.

Contact support

再导出

ERROR_ACTION_CLASS = 'text-sm text-(--ink) underline decoration-(--rule-2) underline-offset-4 transition-colors duration-(--duration-fast) hover:decoration-(--ink)'

恢复入口的样子,导出出来,好让每个错误页提供的都是同一个,而不是各自发明一种链接样式。

无障碍

  • 巨大的状态码是 aria-hidden 的;紧随其后的标题用文字说了同一件事。