维护者文档 · Design System

介绍页的设计系统

这一页把 /(介绍页)用到的东西列全:颜色变量、字体栈、玻璃材质、 环境光与颗粒、组件、动效与可达性。它的来历是 PR #4(作者的设计)——我们收下了他的视觉语言与结构, 这一页也是"改介绍页时要跟着改"的对照物

给维护者看:不索引(noindex)、不在主导航里,页脚有个小入口。

← 返回首页

01 · 色板

对比度是按本页画布 #eae9e7 用 WCAG 公式实算的(不是估的)。

画布--bg #eae9e7 · 页面底色
画布深处--bg-deep #dcdad6 · 备用
正文--fg #2b2b2b · 11.67:1 ✓
次要文字--muted #5d5b57 · 5.58:1 ✓
单点红--accent 大字号/线条/按钮底 · 4.62:1 ✓
小字红--accent-strong 链接与小号红字 · 6.56:1 ✓
完成绿--ok-ink #0d5b41 · 6.68:1 ✓
注意琥珀--warn #8a5a12 · 4.87:1 ✓
荧光笔--mark 首屏那句话的底(压在深色字下)
环境光·蓝--glow-blue 光斑用,不当文字
环境光·灰--glow-grey 光斑用,不当文字
深色收尾--ink-dark #141414 · 其上是 #f2f1ef(16.32:1 ✓)

我们故意没照抄的两支(同一个设计,不同的底线)

他们那支问题我们怎么做
--link #1eaedb「链接青」 当文字色只有 2.13:1(设计规格里按它的底层色实测 1.71:1)——远低于 AA 的 4.5:1 链接一律用 --accent-strong(6.56:1);青色只留在环境光斑里(不当文字)
#fff200 当状态色(量表/圆点) 在浅底上只有 1.01:1,等于看不见 荧光笔只当背景(深色字压在上面),状态一律用文字 + 形状(我们的 chip)

02 · 字体

不引外部字体:CSP 是 default-src 'self'(外部字体根本加载不出来), 而且不该把访客 IP 交给字体 CDN。中文本来就走系统字体。

正文 / 界面

系统无衬线栈:--sans。 中文依次落到 PingFang SC / 微软雅黑。

落款 / 引用

衬线栈:--serif。 介绍页里只用在信末落款那一行。

代码 / 编号

等宽栈:--mono。 用在 code 与 bento 卡的编号(01 · 重要)。

标题阶梯

首屏 clamp(38px,7.4vw,76px)/章节 clamp(25px,3.6vw,40px)/ 小标题 18px。字距负一点(-.028em-.04em)。

03 · 玻璃材质

外壳 40px / 内芯 32px 的同心圆角,磨砂 backdrop-filter: blur(18px) saturate(1.7), 一圈内亮边 + 一层细边。镜面高光用两个可插值属性 --gx/--gy 跟着指针走。

外壳 + 内芯

把鼠标移到这块卡片上,高光会跟着走(300ms 过渡; 系统里选了「减少动态效果」时不动)。

bento 卡

同一个材质的小号版本,圆角用内芯那一档(32px), hover 抬升 3px(.lift)。

04 · 环境光与颗粒

玻璃要有可折射的东西才存在:四个模糊光斑在漂移 + 一层 SVG 噪点当颗粒 (feTurbulence,opacity .11)。没有这一层,backdrop-filter 磨的就是一片纯色。

参数
光斑640–820px 圆,filter: blur(30px),27–42s alternate 漂移
颗粒data URI 的 SVG 噪点,opacity:.11(CSP 允许 img-src data:
层级光斑在 z-index:0,内容在 z-index:1 之上;减少动效时停漂移

05 · 组件

按钮

主按钮 次按钮 文字链

主按钮实心红(白字 5.6:1);次按钮白底描边;第三条是文字链。 首屏只放"一个实心 + 一个白底 + 一条文字链" —— 三颗实心会有一个被挤到第二行,看不出主次。

状态胶囊(chip)

重要一般已跳过

三档来自应用界面真实的分法( app.jsimportanceLabel):重要 / 一般 / 低。 不是作者设计里那套「紧急 / 较急 / 常规」。

量表

先看这些
今天顺手办
之后再说

编号步骤

  1. 下载:套件会量圆点的 content、宽度、背景与文字留白
  2. 安装:浏览器自带编号让位给圆点(list-style:none

发件人首字徽章 (2026-09-23 收,出处 PR #6)

教务处 图书馆

一行 22px 的方块,只用首字(不写全名): 它让「这几封是同一个人发的」一眼看得出来,又不会因为名字长短把行撑开。 它是纯装饰(aria-hidden)——同一行里紧跟着就是发件人的名字。

判定依据卡(档位 + 三格刻度 + 提示 + 条目)

一般 今天顺手办
判定依据
  • 先写「谁发的、什么时候截止」这两类能核对的事实
  • 刻度是三格,不是一个百分比:数得出来的东西不需要假精确

要点清单(带对勾)

表单 / 输入控件

` 包着。) -->

表单只有三件事要说清:标签在控件上方 (不拿 placeholder 当标签——输入之后它就没了)、输入框字号 16px (iOS 上小于 16px 会在聚焦时把整页放大)、聚焦描边用 --accent 加一层柔光 (:focus-visible,所以鼠标点击不会平白多一个框)。

06 · 布局

整页只有三种骨架,尺寸都是量出来的:单列正文.wrap 1250px、24px 边距)、首屏两栏1fr 1fr,窄屏并成一栏)、 以及 bento 六列(跨列 span-2/3/4、跨行 row-2)。 窄屏那一档必须把 grid-row 一起 reset,否则一张跨行卡会空出一大块。

悬浮玻璃导航 · 比正文略窄(1180px vs 1250px)· 胶囊圆角 --r-pill
首屏左栏:标题 + 两条 CTA
1.06fr
首屏右栏:收件箱演示卡
.94fr
span-2 · row-2跨两行

旁边两张各占一行,bento 的错落感就是这么来的。

22:00日报默认时刻
span-2两列

默认宽度。

span-2两列

默认宽度。

span-4四列

与上面那张 row-2 的第二行并排。

span-3 · dark深色变体

同一个材质、反过来的墨色。

span-3三列

介绍页里给「宽卡」用的那一档。

07 · 动效

用途曲线
一般过渡(颜色、位移)--ease: cubic-bezier(.32,.72,0,1)(长尾)
回弹(按钮、卡片、抽屉)--spring: cubic-bezier(.16,1.16,.3,1)
玻璃高光跟随两个 @property 注册的属性,300ms 过渡(不注册就没法插值、会跳变)
滚动进入纯 CSS 的 animation-timeline: view();不支持就当静态页(没有把内容默认设成透明)
减少动效prefers-reduced-motion 下:光斑停漂移、高光不跟指针、跑马灯停

08 · 深色收尾

别再让学校邮件决定你的今天。

深色块用 --ink-dark,正文 --ink-dark-fg(16.32:1)。