跳到规范正文
Diqing WuDesign systems / 06 · V2对照 V1 原版EN

一套系统,也留有变化的空间。

从 Deethin 的真实首页出发,延续 Fabrica 式的编辑节奏。把视觉、空间与动作变成可以检查、复用和讨论的规则。

查看真实组件
Deethin × FabricaTokens. Components. Motion.V2 · Proposed · 26 Sep 2026

设计立场。

保留 V1 作为历史对照。正式首页首屏后的内容与 Portfolio 审阅页已按业主要求接入共享 token;项目卡片使用下方的实际组件。新增首页组合保留来源与待审状态,不冒充已批准的 Figma 资产。其他页面未作全站样式迁移。

证据,而非装饰。

项目图像与内容是主角。用大字、留白和尺寸对比组织信息,不把所有内容装进相同卡片。

章节有节奏,组件有规则。

页面章节有展陈节奏;组件内部有明确的 padding、gap、状态与可访问性规则。两种密度不混用。

动效有明确作用。

保留首页的叙事性开场;操作控件即时响应。动效不可成为阅读、键盘或 reduced-motion 用户的门槛。

色彩各有职责。

Primary #FFFFFF 是基底,Secondary #101010 是对比,Accent #73D1F8 是品牌点睛。60–30–10 作为构图参考,不是逐屏像素配额,也不等于 primary button 必须白色。Surface / Ink 描述用途,可以指向相同原色。

60 / Base30 / Contrast10
Aa#ffffff

Surface

--ds-surface

项目、输入、对话框

Deethin source
与#101010:19.03:1
Aa#101010

Ink / contrast

--ds-ink

正文、主按钮、深色章节;构图上的 Secondary

Deethin source / owner direction
与#ffffff:19.03:1
Aa#73d1f8

Accent / identity

--ds-accent

Logo 主色、少量点睛、黑底 data label;不作白底小字

Owner direction
与#101010:11.06:1
Aa#f4f4f2

Canvas

--ds-canvas

页面底色

Deethin source
与#101010:17.28:1
Aa#1d1d1d

Surface / on dark

--ds-surface-dark

黑色章节内的深灰证据卡片,不用白卡制造过强反差

Deethin .caseEvidence
与#ffffff:16.86:1
Aa#0087fb

Accent / on light

--ds-accent-ink

浅底 MONO data label;不替换 Logo 的 #73D1F8

Owner direction
与#ffffff:3.58:1

灰色说明保留 text/muted 职责,不再叫 Secondary。系统状态色不在这组色卡展示;控件暂沿用 V1 的功能色,后续核对 Figma,未擅自覆盖。

Hero light field / source palette

165° / Hero fallback
Inkoklch(.18 .02 255)
Blueoklch(.53 .2 263)
Skyoklch(.81 .108 234)
Mistoklch(.955 .022 226)
Lightoklch(.985 .008 235)

上方完整色带使用主页 CSS fallback 的 165° / 48% / 62% 配方;下方五个色卡来自 smoke-renderer.ts 的真实光场 palette。两者不是同一个算法;Figma 先用静态关键帧或渐变近似,不能只抄五个色值就还原流动光场。

DATA / LABEL · 2026 / 013.58:1 / on white
DATA / LABEL · 2026 / 0111.06:1 / on ink

JetBrains Mono · 12px / 500 / 1.6 / .04em。深底使用 #73D1F8;白底按本轮决定使用 #0087FB。#0087FB 与白底对比为 3.58:1,低于普通小字 4.5:1;当前仅作为 Proposed data label,若承担必要信息需要加深或提升字号/字重。说明段落保持 sans 与中性灰。

排版组织节奏。

Inter / system sans 负责内容;JetBrains Mono 负责代码和测量。复用网站已有字体,不新增字体请求。语义层级与视觉尺寸分开。

Aa
clamp(3rem, 7.5vw, 7rem) · 600
line 0.96 · tracking -.055em

只用于短英文展陈标题;不用于正文

H1
clamp(2.5rem, 5vw, 4.5rem) · 600
line 1.04 · tracking -.04em

页面标题,每页一个语义 h1

H2
clamp(2rem, 3.8vw, 3.5rem) · 600
line 1.1 · tracking -.035em

章节标题

H3
1.5rem · 600
line 1.25 · tracking -.02em

组件和项目标题;允许换行

H4
1.25rem · 600
line 1.35 · tracking -.01em

小节标题

H5
1rem · 600
line 1.5 · tracking 0

组内标题

H6
.875rem · 600
line 1.5 · tracking 0

细分标题,避免深层嵌套

Body
1rem · 400
line 1.7 · tracking 0

中英说明;最长 65ch;中文行高 1.8

Label
.875rem · 500
line 1.4 · tracking 0

按钮与表单标签;不全大写

Caption / code
.75rem · 400
line 1.6 · tracking 0

注解;数值用 JetBrains Mono,不承担核心说明

紧字距只用于英文标题。中文标题恢复 normal tracking / 1.25 行高;中文正文 1.8。禁止用超小标签装载重要信息。

明确空间规则。

space-00px
space-14px
space-28px
space-312px
space-416px
space-520px
space-624px
space-832px
space-1248px
space-1664px
space-2496px
space-32128px

每项都附局部示意。缩略图展示关系,不把1440px页面强行塞入小卡;控件框模型保留实际尺寸,完整响应式网格见下方。

← gutter →
Contentmax 1440px
16–40px

页面边距

16–40px

clamp(16px, 3vw, 40px),内容最多 1440px;不缩放整张页面。

Section A↕ 64–128pxSection B

章节间隔

64–128px

clamp(64px, 8vw, 128px);区分展陈大留白和控件内部小间距。

12 col
6 col
1 col

编辑网格

12 → 6 → 1

≥1200px 为 12 列;700–1199px 为 6 列;<700px 为单列。演示格栅真实响应。

Project 1
Project 2
gap 8 · cover 4:3

项目组合

2 → 1

≥700px 两列,gap 8px;<700px 单列。V2 封面 4:3,标题常驻,辅助标签按交互显示。

↕12 / ↔20 / gap8

组件框模型

48 / 20 / 8

按钮 min-height 48px,padding 12px 20px,图文 gap 8px;长标签可换行增高。

← max 65ch →

让文字自然呼吸。
让信息按顺序被阅读。
行高 1.8,不缩小字号。

阅读宽度

65ch

长文单列,中文行高 1.8;只给数值加 mono,不给整段说明加 mono。

320pxAa
200%Aa

小屏与缩放

320px / 200%

导航换行、表格转堆叠、弹窗可滚动;不隐藏溢出来伪装适配。

123456789101112
padding-block 12 · inline 20min-height 48 · gap 8 · pill

这里的按钮与状态库用同一个 class 和 token;不是另外画的一张框模型图。控件有最小高度,没有固定高度锁死放大的文字。

克制的视觉语言。

Iconography
Lucide,24px 画布、1.5px 描边;按钮内 18px。单独图标的点击区 ≥44×44px,必须有 action label。
Identity
使用现有 Diqing Wu 文字身份,不从 Fabrica 复制 logo。不新增注册标识。标识四周至少留出一个字高。
Project imagery
只使用仓库批准素材。封面 object-fit: cover;证据图 contain、不裁内容;语言配对只显示对应 EN/CN。
Illustration
本轮不造装饰插画。不把 HMI、AI 视觉当作通用背景;需要插画时先定义具体叙事目的。
浅色环境
WhiteInkAccent

灰底承托白卡。黑卡用于章节对比;蓝卡只作极少量重点,不替代所有内容背景。

反相环境
ResultEvidence first.
ArchitectureA nested system.
WorkflowReview together.

黑底承托 #1D1D1D 卡片;白色主要用于文字,accent 用于少量 MONO 标记。

Control8px

小型精确控件:输入框、菜单、参数面板。边缘更利落,不让每个小控件都像一张大卡片。

Project18px

中型内容容器:项目封面+标题、深灰证据卡片。圆角负责成组,不表示可以点击。

Chapter28px

大型章节或独立舞台:与页面形成更明显的空间边界,不套在每个内部元素上。

Actionpill

按钮由高度决定胶囊轮廓。它是动作形状,不与卡片圆角竞争;嵌套圆角按内距协调,不盲目18套18。

Elevation ≠ stacking order

Elevation 是“浮在页面上方”的视觉提示,靠阴影表达;z-index 只是网页重叠顺序,不是阴影大小,也不是 Figma 的坐标深度。静态卡片用明暗表面区分,无需投影。弹窗才使用两层阴影;content 0 / sticky 20 / toast 40 是本地层级约定,native dialog 在浏览器 top layer,不能拿一个更大的 z-index 等同它。

状态也是系统。

下面是可对照的视觉状态样本;hover / focus / pressed 被固定展示,真实交互请用下方演示。不可用与加载状态不能重复触发。

primary

default
hover
focus
pressed
disabled
loading

secondary

default
hover
focus
pressed
disabled
loading

quiet

default
hover
focus
pressed
disabled
loading

保持焦点、固定最小宽度、900ms 后返回反馈。

Focus 不是可删除的装饰:键盘 Tab、触屏外接键盘都需要知道当前位置。输入框可与 hover 共用深色边界,但 focus-visible 额外保留细 2px 环;普通鼠标/触屏按钮不常驻粗环。浏览器也可能为正在输入的文本框显示焦点,这是有意保留的定位信息。

文本输入 / 6 种状态

请输入有效的邮箱地址。

label→input 8px;input padding 12×16px、min-height 48px;helper gap 8px;font-size 16px 防止 iOS 聚焦缩放。disabled 与 read-only 不等价。

选择 / 原生控件

预览密度(改变下面的样本宽度)

从组件到作品集。

封面增至 4:3,正文精简为项目类型、年份与标题。白底 tags 与箭头在封面底部同排,hover / focus 出现;触屏常驻。长标题可换行,200% 文字时辅助信息移至正常文流,避免压住图像。

展开内容

哪些值来自参考,哪些是新设计?

页面色、18px 项目圆角、16:9 封面和编辑式动效在 Deethin 源码中可追溯;状态色、完整字号阶梯、控件尺寸和交互补全属于 Proposed。Fabrica 的提取数据独立保存,不自动替换语义 token。

为什么不直接替换现有 design system?

首页、case study 与实验组件职责不同。需要你先确认第 6 版方向,再逐组件迁移、核对状态与内容,不把实验值悄悄变成全站规范。

表单与反馈

不会发送邮件,也不会保存你的地址。

有明确作用的动效。

首页复杂开场保留在生产页面;这里用独立舞台检验相同的编辑节奏,不重复播放整段 WebGL 开场。

证据。结构。动作。
01 / Icon feedback

图文按钮

hover 图标 translate(3px,−3px),320ms。移出可反向;按下缩至.98;键盘定位立即可见。

02 / Quiet link

下划线揭示

hover 下划线 scaleX(0→1),240ms,左侧为原点。focus 立即显示,触屏始终有线。

04 / Editorial mask

章节文字揭示

精选作品。

点击重播:translateY(110%→0),1050ms (.16,1,.3,1)。无循环、无阅读等待;减少动态效果时直接显示。

05 / Evidence stagger

证据卡片顺序

01 / Observe
02 / Define
03 / Refine

点击重播:opacity + translateY(16px→0),240ms、间隔70ms。帮助理解阅读顺序,不动画尺寸或模糊。

控件反馈
150ms · ease-out

hover 改底色;pointer pressed scale .98;键盘 focus 无延迟。离开/松开平滑回到 resting。

叙事揭示
800ms · (.22,1,.36,1)

仅点击重播的舞台:opacity 0→1、translateY 24→0、stagger 70ms;内容默认可见,不设滚动门槛。

项目媒体
800ms · (.22,1,.36,1)

细指针 hover 图像 scale 1→1.04;键盘 focus 立即显示辅助信息,不延迟定位;touch 不依赖 hover 才出现文字。

Disclosure / dialog
即时状态切换

本轮使用 native details 与 dialog;不伪造未实现的高度/退出动画。Escape 关闭 dialog、焦点回触发器。

Loading
900ms · linear

实际保存演示延迟 900ms;aria-busy、禁止重复触发,结束以 status 文本宣布;仅本地、不发送数据。

Reduced motion
0ms

系统偏好或本页开关任一开启即禁用动画、变换和过渡;仍显示保存状态,不让 spinner 承担唯一反馈。

内容超出预期时。

这是组件压力样本,不冒充整页浏览器缩放测试。也请在真实 320px viewport 检查导航与布局。

首页覆盖与待审扩展

规范页与 Figma 资产不是实时同步的。这里分别列出已有规范、线上首页源码与本轮待定项,避免把网页里出现的值自动算作批准。

首页组合也要有规范

已对照 www.deethin.site 的部署 CSS 与本地生产源码。首屏保留原有设计;正式首页首屏后的组合、项目卡片、Portfolio 审阅页与本目录现在使用同一个 token 入口。下方保留来源与待定状态,补充值不自动算作 Figma 批准。

Evidence / inverse

fabrica.module.css / .caseSection · .caseEvidence

黑色章节 / 深灰卡片 / 4 → 2 → 1 列 / 18px 圆角

深色表面与证据内容组合;不等同于所有页面 dark mode

查看首页组合

Contact / inverse + light

fabrica.module.css / .contactSection · .contactStory

并置深浅表面 / 24px 面板 / 28px 内距 / 独立表单

完整 Contact 组合;控件复用规范现有 form 与 button

查看首页组合

Scroll / editorial reveal

FabricaMotion.tsx + fabrica.module.css:699–717

800/950ms · 40px 位移 · 7px 模糊 · 一次进入

滚动到每组内容时揭示;默认可见、减少动态直接显示

查看首页组合

Hero / interactive field

HeroExperience.tsx / smoke-renderer.ts

WebGL 光场 / 开场时序 / 静态 fallback

已有 Hero 拆解继续保留;fallback 不代表完整交互复刻

查看首页组合

Evidence / inverse

产品

已部署的双语 Portfolio 门户,并保留历史版本作为比较与恢复依据

内容

从 Obsidian factual master 到中英文模块与项目页面的来源驱动流程

协作

一次有范围、有验收、有返回材料的 Codex → WorkBuddy 任务配置实践

质量

本地 Design System V2、Figma Inuse 资产与代表页面组成的可检查 pilot

聊一聊。

告诉我产品、最困难的部分,以及什么样的结果才真正有用。

查看线上组合 token(Current source,不冒充 Figma 批准)
--home-evidence-canvas
#0d0d0d
--home-evidence-card
var(--ds-surface-dark)
--home-evidence-text
var(--ds-surface)
--home-evidence-muted
#aaaaaa
--home-evidence-label
#8a8a86
--home-evidence-radius
var(--ds-radius-panel)
--home-evidence-card-radius
var(--ds-radius-card)
--home-evidence-card-padding
22px
--home-evidence-card-height
200px
--home-evidence-card-gap
var(--ds-space-2)
--home-evidence-title-size
var(--ds-type-h3)
--home-evidence-title-leading
1.15
--home-evidence-title-gap
50px
--home-contact-canvas
#111111
--home-contact-muted
#b2b2ae
--home-contact-radius
var(--ds-space-6)
--home-contact-padding
var(--ds-radius-panel)
--home-contact-title-leading
.9
--home-contact-title-tracking
-.07em
--home-contact-title-size
clamp(76px,10vw,140px)

当前 Figma 使用的是 Paint Style 链

  1. Inuse numeric COLOR primitive
  2. Semantic Paint Style
  3. Node Fill / Stroke
  4. Manual CSS mapping
  5. Representative page + states

来源:2026-10-04 绑定清单及 2026-09-27 foundation 审计。Light / Inverse 是使用环境,不是自动 mode。下方旧 Semantic-Colors / Component-colors variable manifest 是历史提案,不作为当前 Figma 资产。

小型判断卡片与现有按钮

内容常驻可读,细指针 hover 显示既有 Overlay/Modal 阴影;这是本轮业主要求的用法,不新增阴影色值。

新增与待定项:状态不能混用

浅蓝辅助表面已按业主最新反馈撤销,不再作为可用扩展。现有按钮、muted 与 focus 从规范复用;尚未确认的映射和组合独立列出。Figma 本轮因调用额度限制没有重新读取,不能据此声明缺少资产。

primary-cta
var(--ds-ink)Existing component reusedV2 / .button

恢复黑色 pill 主按钮;不再使用自造蓝色大面板

muted-text
var(--ds-muted)Existing web token / Figma mapping pendingV2 tokens.ts / muted

网页已有角色;实时 Figma Paint Style 尚未核对

focus
var(--ds-focus)Existing web token / Figma mapping pendingV2 tokens.ts / focus;Figma 另有 propose/System/Focus/Light

复用规范焦点环,不把不同数值当成一致

mono-strong
700Pending / not usedPrevious candidate

页面改回 Data/Label 500;700 保留待定,不使用

closing-24
var(--ds-type-h3)Existing size / role pendingV2 / H3 24px

尺寸已有,收尾文字角色仍待确认

responsive-type
var(--ds-type-h1) / var(--ds-type-h2)Existing interpolationV2 / typeScale

中英取消 ch 限宽;中文按规范恢复 1.25 行高

breakpoints
900 / 640 / 400pxPendingPrevious candidate

从本 registry 生成媒体规则

gallery-width
min(85%, 48rem)PendingOwner requested galleries

两轮 gallery 同一宽度,不限制文字行数

bottom-blur
112px / 4,8,16pxPendingPrevious candidate

底部模糊保持隔离,不作为已批准 Figma Effect Style

scroll-choreography
800ms / 950ms / 40px / 7pxProduction-source pattern / Pending adoptionFabricaMotion.tsx / fabrica.module.css:699

逐组进入;reduced motion 与键盘定位即时显示

首页、当前 Portfolio 审阅页与本目录使用同一个 portfolioTokens 对象。以下补充项来自现有首页:记录原值,不代表已写回 Figma 或获得新的批准。

工具横向条
用户指定

所有宽度下保持单行;空间不足时原生横向滚动;不显示标题。

项目卡片
现有 V2 组件

4:3 媒体、项目元信息和标题;悬停或聚焦时显示标签和箭头,触屏下直接显示。

研究
现有样式与用户指定布局

所有宽度下每张卡片占完整一行;缩略图、本地化标题和摘要保留共享的标题与表面职责。

能力
现有样式与用户指定交互

每项只有一个随展开移动的标题,配合图片、描述和标签;不重复标题或分类说明。按用户要求使用 650ms 缓入缓出的布局过渡;减少动态效果时即时切换。

证据与联系
现有首页

现有反相组合、卡片和表单使用共享语义 token。

通用页脚
用户指定的共享组件

每条路由只显示一个通用页脚;本地化导航返回相应语言的首页章节。

工具横向条 · 实际组件

能力展开 · 单一标题 / 001–004

根据每类内容承担的任务定义移动端文本输入规则。

交互设计内容设计校验汽车

通用 Footer · 实际组件

查看补充的首页 token
--home-evidence-canvas
#0d0d0d
--home-evidence-card
var(--ds-surface-dark)
--home-evidence-text
var(--ds-surface)
--home-evidence-muted
#aaaaaa
--home-evidence-label
#8a8a86
--home-evidence-radius
var(--ds-radius-panel)
--home-evidence-card-radius
var(--ds-radius-card)
--home-evidence-card-padding
22px
--home-evidence-card-height
200px
--home-evidence-card-gap
var(--ds-space-2)
--home-evidence-title-size
var(--ds-type-h3)
--home-evidence-title-leading
1.15
--home-evidence-title-gap
50px
--home-contact-canvas
#111111
--home-contact-muted
#b2b2ae
--home-contact-radius
var(--ds-space-6)
--home-contact-padding
var(--ds-radius-panel)
--home-contact-title-leading
.9
--home-contact-title-tracking
-.07em
--home-contact-title-size
clamp(76px,10vw,140px)
--home-frame-inset
6px
--home-frame-inset-compact
var(--ds-space-1)
--home-gutter
30px
--home-gutter-tablet
22px
--home-gutter-compact
var(--ds-space-4)
--home-section-space
138px
--home-section-space-compact
94px
--home-display
clamp(84px,11.25vw,144px)
--home-display-compact
clamp(62px,19vw,112px)
--home-display-leading
.92
--home-display-tracking
-.06em
--home-study-heading
clamp(56px,7vw,92px)
--home-study-heading-compact
clamp(52px,17vw,76px)
--home-heading
clamp(50px,6vw,78px)
--home-heading-compact
clamp(42px,13vw,68px)
--home-heading-leading
1.08
--home-heading-tracking
-.055em
--home-intro-size
20px
--home-intro-size-compact
17px
--home-copy-leading
1.45
--home-copy-measure
560px
--home-header-gap
100px
--home-header-gap-compact
60px
--home-heading-gap
90px
--home-heading-gap-compact
var(--ds-space-12)
--home-study-space-start
56px
--home-study-space-end
170px
--home-study-space-end-compact
110px
--home-study-card-height
220px
--home-study-card-height-compact
190px
--home-study-thumb
76px
--home-study-thumb-compact
68px
--home-study-card-radius
22px
--home-study-title
clamp(20px,2.1vw,30px)
--home-study-title-leading
1.05
--home-media-placeholder
#dededb
--home-services-canvas
#0f0f0f
--home-services-text
#f8f8f5
--home-inverse-line
rgb(255 255 255 / .18)
--home-inverse-muted
#aaaaaa
--home-service-index
#b1b1ad
--home-inverse-control-line
rgb(255 255 255 / .25)
--home-services-space-start
110px
--home-services-space-end
90px
--home-services-list-gap
86px
--home-services-list-gap-compact
54px
--home-service-height
92px
--home-service-height-compact
76px
--home-service-title
clamp(24px,3vw,40px)
--home-service-title-compact
21px
--home-service-expanded-title
var(--ds-type-h2)
--home-service-inset
24%
--home-service-inset-compact
72px
--home-service-index-width
62px
--home-service-toggle
46px
--home-service-toggle-compact
40px
--home-service-fan-height
160px
--home-service-image-width
112px
--home-service-image-height
84px
--home-service-image-step
44px
--home-service-image-turn
7deg
--home-service-image-top
20px
--home-tag-padding-block
9px
--home-tag-padding-inline
13px
--home-wordmark-weight
650
--home-section-extended-space
180px
--home-case-title
clamp(44px,5vw,68px)
--home-case-wordmark
clamp(66px,10vw,140px)
--home-case-wordmark-compact
18vw
--home-case-height
min(67vw,800px)
--home-case-height-compact
120vw
--home-case-height-max-compact
650px
--home-case-overlay
linear-gradient(180deg,rgb(0 0 0 / .05),rgb(0 0 0 / .62))
--home-case-media-inset
-7%
--home-case-media-height
114%
--home-case-media-scale
1.05
--home-case-media-travel
5%
--home-contact-height
760px
--home-contact-height-compact
690px
--home-contact-heading
clamp(38px,4vw,58px)
--home-contact-heading-gap
96px
--home-contact-form-gap
7px
--home-contact-textarea-height
110px
--home-contact-muted-note
#999999
--home-contact-border
rgb(255 255 255 / .2)
--home-footer-statement
clamp(32px,4vw,54px)
--home-footer-statement-tracking
-.045em
--home-footer-email
clamp(24px,3vw,42px)
--home-footer-wordmark
clamp(110px,20vw,270px)
--home-footer-wordmark-compact
26vw
--home-footer-wordmark-leading
.7
--home-footer-wordmark-tracking
-.085em
--home-footer-title
clamp(20px,3vw,42px)
--home-footer-label
#92928f
--home-footer-legal
#888888
--home-footer-columns-gap
120px
--home-footer-wordmark-gap
160px
--home-footer-columns-gap-compact
86px
--home-footer-wordmark-gap-compact
110px
--home-heading-reveal-duration
1050ms
--home-heading-reveal-ease
cubic-bezier(.16,1,.3,1)
--home-heading-reveal-travel
110%
--home-study-hover-scale
1.06
--home-hover-travel
3px
--home-hover-duration
320ms
--project-media-ratio
4 / 3
--project-arrow-size
52px
--project-arrow-size-compact
44px
--project-media-hover-scale
1.04
--project-arrow-rest-scale
.75
--project-arrow-rest-turn
-20deg
--project-arrow-duration
500ms
--project-arrow-icon-size
22px
--project-tag-size
11px
--project-tag-padding
6px 10px
--project-tag-padding-compact
5px 8px
--home-tools-gap
var(--ds-space-8)
--home-tools-padding
var(--ds-space-6)
--home-tools-item-width
var(--ds-space-32)
--home-capability-open-padding
76px
--home-capability-index-top
36px
--home-capability-toggle-top
var(--ds-space-6)
--home-capability-index-top-compact
30px
--home-capability-toggle-top-compact
var(--ds-space-4)
--home-blur-layer
30
--home-blur-mask-small
linear-gradient(to bottom, transparent, rgb(0 0 0 / .12) 20%, black 62%)
--home-blur-mask-medium
linear-gradient(to bottom, transparent 25%, rgb(0 0 0 / .15) 48%, black 82%)
--home-blur-mask-large
linear-gradient(to bottom, transparent 48%, rgb(0 0 0 / .2) 72%, black)
--home-grid-projects-heading
minmax(0, 1fr) minmax(260px, .65fr)
--home-grid-studies-heading
minmax(0, 1fr) minmax(240px, .65fr)
--home-grid-service-legacy
minmax(120px, 24%) minmax(0, 1fr) 52px
--home-grid-service-panel-legacy
minmax(120px, 24%) minmax(0, 1fr) minmax(250px, .8fr)
--home-grid-service-compact
62px minmax(0, 1fr) 42px
--home-grid-study-card
var(--home-study-thumb) minmax(0, 1fr)
--home-grid-study-card-compact
var(--home-study-thumb-compact) minmax(0, 1fr)
--home-study-line
rgb(16 16 16 / .16)
--home-study-letter-spacing-heading-3
-.035em
--home-study-padding
0 6px
--home-study-outline
2px solid #0b6eff
--home-section-padding
138px 30px
--home-kicker-font-size
14px
--home-kicker-line-height
1
--home-kicker-width
15px
--home-kicker-padding
2px
--home-heading-suffix-padding-right
22%
--home-item-tag-font-weight
700
--home-item-tag-letter-spacing
.08em
--home-case-hero-inset
-7% 0
--home-case-hero-transition
transform 800ms cubic-bezier(.22,1,.36,1)
--home-studies-header-line-height
.95
--home-studies-header-max-width
38ch
--home-study-card-padding
24px 26px
--home-study-thumb-transition
transform 300ms cubic-bezier(.32,.72,0,1)
--home-study-card-body-letter-spacing
-.04em
--home-study-card-body-margin-top
10px
--home-study-card-body-line-height
1.35
--home-pill-action-gap
36px
--home-pill-action-margin-top
28px
--home-pill-action-padding
0 22px
--home-pill-action-border-radius
999px
--home-pill-action-width
18px
--home-services-section-padding
110px 30px 90px
--home-services-section-box-shadow
0 18px 32px rgb(0 0 0 / .18)
--home-services-section-color
#777
--home-service-list-border-bottom
1px solid rgb(255 255 255 / .18)
--home-service-toggle-border
1px solid rgb(255 255 255 / .25)
--home-service-fan-border
2px solid #111
--home-service-copy-max-width
14ch
--home-service-copy-font-weight
550
--home-service-copy-max-width-1
40ch
--home-service-copy-color
#aaa
--home-service-tags-color
#888
--home-service-tags-padding
9px 13px
--home-service-tags-color-2
#111
--home-case-section-padding
42px 30px 80px
--home-case-section-background
#0d0d0d
--home-case-meta-color
#a7a7a3
--home-case-hero-margin-top
38px
--home-case-hero-background
#1f1f1f
--home-case-wordmark-inset
auto 34px 28px
--home-case-wordmark-line-height
.9
--home-case-wordmark-letter-spacing
-.07em
--home-case-intro-padding-top
42px
--home-case-intro-border-bottom
1px solid currentColor
--home-case-intro-max-width
16ch
--home-case-intro-letter-spacing
-.05em
--home-case-evidence-margin-top
80px
--home-case-evidence-min-height
200px
--home-case-evidence-background
#1d1d1d
--home-case-evidence-color
#8a8a86
--home-case-evidence-margin-top-3
50px
--home-case-evidence-line-height
1.15
--home-insights-header-gap
8%
--home-insights-header-max-width
12ch
--home-contact-section-padding
180px 30px 8px
--home-contact-panel-max-width
10ch
--home-contact-form-padding
12px 0
--home-contact-form-border-bottom
1px
--home-contact-form-width
19px
--home-contact-form-line-height
1.4
--home-contact-story-font-size
clamp(76px, 10vw, 140px)
--home-contact-story-max-width
34ch
--home-contact-story-color
#b2b2ae
--home-contact-notes-border-top
1px solid rgb(255 255 255 / .2)
--home-contact-notes-color
#999
--home-footer-padding
80px 30px 28px
--home-footer-border-radius
28px 28px 0 0
--home-footer-statement-max-width
22ch
--home-study-transform
translate3d(0, 40px, 0)
--home-study-filter
blur(7px)
--home-study-transition
800ms
--home-study-transition-4
950ms
--home-study-transform-5
translate3d(0, 0, 0)
--home-study-filter-6
blur(0)
--home-study-transform-7
translateY(110%)
--home-study-transform-8
translateY(0)
--home-study-card-transform
scale(1.06)
--home-pill-action-transform
translate(3px, -3px)
--home-pill-action-transition
transform 320ms cubic-bezier(.22,1,.36,1)
--home-section-padding-compact
94px 16px
--home-why-section-padding-compact
32px 16px 110px
--home-studies-header-margin-bottom-compact
34px
--home-study-card-padding-compact
20px 22px
--home-services-section-padding-compact
80px 16px 70px
--home-service-panel-margin-bottom-compact
26px
--home-service-fan-min-height-compact
116px
--home-case-section-padding-compact
28px 16px 60px
--home-contact-section-padding-compact
110px 4px 4px
--home-contact-story-font-size-compact
20vw
--home-footer-padding-compact
70px 20px 24px
--home-footer-border-radius-compact
22px 22px 0 0
--home-study-transition-duration
.01ms
--home-service-item-top
-236px
--home-service-item-top-9
-248px
--home-service-item-top-compact
-232px
--home-service-item-top-compact-10
-246px

系统背后的架构。

历史变量架构提案(不是当前 Inuse 的实施方式)Token & Style Architecture v1.1 · Proposed

以本地生产主页源码及浏览器实测为证据,以 V2 为可检查的提案。这里先把 Figma 会看到的 variable type、name path、scope、mode 和 alias 分开:Variable 管单值与别名,Style 管组合配方,Component 管结构与状态。本页是手工绑定说明,不宣称 Figma 已同步,也不把任意 JSON 当成 Figma 通用导入格式。

Primitive-colors / blue / 500 = #0087FB [Light]
Primitive-colors / sky / 300 = #73D1F8 [Inverse]
  ↑ Semantic-Colors / color / text / accent
    ↑ Component-colors / data-label / text
      ↑ DataLabel instance · text fill

Text Style / Data / Label = family + size + weight + line-height + tracking
Effect Style / Overlay = shadow layers + offsets + blur + alpha
Paint Style / Hero / Fallback = gradient stops + angle + positions

Modes 是上下文选择器,不是 alias 链的第四级。
原料 / 单一值

01 · Primitive-colors

只存色值,不表达用途。所有条目的 Figma variable type 都是 COLOR,只有 Value 一个 mode,scope 留空以避免设计师在组件上直接选原色。

  • neutral 系列承担白、纸色、灰、深灰和近黑;brand 系列承担 #73D1F8 / #0087FB。
  • 半透明边界和阴影保留 RGBA primitive,不要压成不透明灰。
  • 当前命名混有 neutral/ink 这类角色名与 neutral/900 这类色阶名;下一步完善色板时应统一,但本轮不悄悄改现有 Figma ID。
用途 / Light + Inverse

02 · Semantic-Colors

这一层仍然全是 COLOR;color/text/primary 中的 text 是“给文字使用”,不是 String/Text 变量类型。每个 mode 的值都必须是指向 Primitive-colors 的 VARIABLE_ALIAS,不是手输路径字符串。

  • color/surface/* 的 scope 是 FRAME_FILL + SHAPE_FILL;color/text/* 是 TEXT_FILL;color/border/* 是 STROKE_COLOR。
  • Light 和 Inverse 切换同一个用途在浅、深背景下应解析到哪个 primitive。
  • 语义名不写具体颜色:不用 black-text / white-card,而用 text/primary / surface/card。
空间、形状、字体、时间

03 · Foundation / numbers

存储可绑定的 FLOAT / STRING 单值,不与颜色 mode 混在一起。

  • spacing/4…128 使用 GAP scope;radius/control=8、card=18、chapter=28 使用 CORNER_RADIUS。
  • size/control/min-height=48 使用 WIDTH_HEIGHT;font family 是 STRING,font size / line height / weight 是 FLOAT。
  • duration/feedback=150 记录为毫秒,描述中必须写明单位,防止被当成 150px。
Compact + Wide 独立于色彩

04 · Layout / viewport

响应式采样值与 Light / Inverse 是两条独立维度。

  • Figma 用 Compact-390 / Wide-1440 记录固定画板采样;网页继续用 clamp 和 breakpoint。
  • 不要在一个 collection 中创建 Light-Mobile、Light-Desktop、Dark-Mobile、Dark-Desktop,否则颜色与布局无法独立切换。
只为真实复用需要加别名

05 · Component-colors

把组件部位指向语义用途,不指向 hex,也不跳过 Semantic-Colors 直接连 Primitive-colors。

  • button/primary/background → color/action/primary/background;project-card/background → color/surface/card。
  • data-label/text → color/text/accent;tag/text → color/text/primary。切换父容器 mode 后,组件别名会继续向下解析。
  • 只有当组件需要独立分叉时才建这层;普通正文直接绑 color/text/primary。
TYPE / NAME / SCOPE

先分清:variable type ≠ name path ≠ scope

color/text/primary 是变量名:color 是领域,text 是使用位置,primary 是优先级。它的 Figma variable type 必须是 COLOR,不是 STRING。

TEXT_FILL 是 scope:它只让这个颜色出现在文字填充的选择器中。同理,color/border/subtle 仍是 COLOR,但 scope 是 STROKE_COLOR。

如果导入后变量显示为 String/Text,说明导入器把 neutral/ink 当成了文本值,没有建立 VARIABLE_ALIAS。Figma 中已创建变量的 resolved type 不应靠改名修补;重建为 Color,再用变量选择器绑到 primitive。

浅色上下文

Light

#F4F4F2 canvas + #FFFFFF card

适用于首页浅色章节、白色项目卡、输入和普通内容区。父 Frame / Section 设为 Light,text/primary 解析为 #101010。

深色上下文

Inverse

#101010 canvas + #1D1D1D card

适用于黑色章节、深灰证据卡和深色舞台。只给该父容器设 Inverse,text/primary 自动解析为白色;不表示全站进入 dark mode。

手工映射表:每一项都是 Color variable

表中的 text / surface / border 是语义用途,不是变量类型。Light / Inverse 两列应通过 Figma variable alias 选择器指向 primitive,不要复制名称为文本值。

语义变量Figma typeScopeLight → primitiveInverse → primitive为什么 / 用在哪
color/surface/canvasCOLORFRAME_FILL, SHAPE_FILLneutral/paper · #F4F4F2neutral/ink · #101010章节的大面积基底;浅色纸面与深色舞台是同一职责的两个 mode。
color/surface/cardCOLORFRAME_FILL, SHAPE_FILLneutral/white · #FFFFFFneutral/900 · #1D1D1D大底上的内容表面;深色环境使用深灰而不是白卡。
color/text/primaryCOLORTEXT_FILLneutral/ink · #101010neutral/white · #FFFFFF主要正文、标题和高优先级信息。text 只是用途分组。
color/text/mutedCOLORTEXT_FILLneutral/muted · #686866neutral/inverse-muted · #AAAAAA辅助说明和 placeholder;不用透明度临时稀释 primary。
color/text/accentCOLORTEXT_FILLblue/500 · #0087FBsky/300 · #73D1F8浅底 MONO data label 与深底品牌点缀。白底 12px 小字的对比度仍需谨慎。
color/action/primary/backgroundCOLORFRAME_FILL, SHAPE_FILLneutral/ink · #101010neutral/white · #FFFFFF主要按钮背景;在深色容器内反转为白底。
color/action/primary/textCOLORTEXT_FILLneutral/white · #FFFFFFneutral/ink · #101010与主按钮背景成对,确保 Light / Inverse 中都有可读对比。
color/border/subtleCOLORSTROKE_COLORneutral/ink-alpha-16neutral/white-alpha-16结构分隔线和弱边界;保留 alpha,让边界随背景混合。
color/border/controlCOLORSTROKE_COLORneutral/boundary · #858581neutral/inverse-muted · #AAAAAA输入与次级控件的可见边界;不作正文颜色。
color/focus/ringCOLORSTROKE_COLORblue/focus · #185BC1blue/500 · #0087FB键盘 focus-visible 指示。当前仍是临时映射,应以 Figma 现有 focus 定义为准。
color/feedback/errorCOLORTEXT_FILL, STROKE_COLORred/error · #B42318red/error · #B42318错误文字与边界。深色 mode 的对比尚未核实,不应直接发布。
color/feedback/successCOLORTEXT_FILL, STROKE_COLORgreen/success · #17663Bgreen/success · #17663B完成状态。待从 Figma 已有色板确认浅/深对应色。
color/feedback/warningCOLORTEXT_FILL, STROKE_COLORamber/warning · #825300amber/warning · #825300提醒与待确认状态。待从 Figma 已有色板确认浅/深对应色。
color/effect/shadowCOLOREFFECT_COLORneutral/ink-alpha-10neutral/ink-alpha-45只给 overlay / modal effect style 使用。Inverse 阴影是待验证占位,静态卡片不绑它。
ONE COMPLETE EXAMPLE

一条别名链应该长这样

Semantic-Colors / color/text/primary
  variable type: COLOR
  scopes: TEXT_FILL
  Light value: VARIABLE_ALIAS → Primitive-colors / neutral/ink
  Inverse value: VARIABLE_ALIAS → Primitive-colors / neutral/white

Component-colors / data-label/text
  variable type: COLOR
  Light + Inverse: VARIABLE_ALIAS → Semantic-Colors / color/text/accent
  1. 先建 primitive

    在 Primitive-colors 中创建 COLOR 变量,mode 只有 Value。填入 RGBA,scope 留空。

  2. 再建 semantic

    在 Semantic-Colors 中创建 color/text/primary,创建时明确选 Color,添加 Light 和 Inverse 两个 mode。

  3. 用 alias 选择器绑定

    不要在值里输入 neutral/ink 文字。点击变量图标 / Apply variable,Light 选 Primitive-colors/neutral/ink,Inverse 选 neutral/white。

  4. 设 scope

    text/* 用 TEXT_FILL,surface/* 用 FRAME_FILL + SHAPE_FILL,border/* 用 STROKE_COLOR。这一步决定它在哪个 Figma picker 出现。

  5. 在父容器切 mode

    浅色章节的 Frame 设 Semantic-Colors=Light;黑色章节的 Frame 设 Inverse。内部文字仍绑同一个 color/text/primary。

  6. 最后才建 component alias

    只对 Button、ProjectCard、DataLabel 等稳定复用部位创建 Component-colors,并让它 alias 到 Semantic-Colors。

当前色板的完成度

已确认的视觉锚点
#FFFFFF、#F4F4F2、#101010、#1D1D1D、#73D1F8、#0087FB。可先完成 canvas / card / primary text / accent 映射。
可用但需重整命名
#E4E4DF、#AAAAAA、#858581、#686866 当前分别承担 disabled、inverse muted、boundary、muted。它们应在补齐 neutral scale 时统一为色阶名,语义用途留在 Semantic-Colors。
暂不应锁定
focus、error、success、warning 及它们的 Inverse 版本尚未与 Figma 现有色板完整对齐。不建议为了“补全”而自动插值出一整条色阶。
Text styles
Homepage / Hero、Editorial / Section、Project / Title、Body / ZH、Data / Label。字体、字号、字重、行高、tracking 组成一个配方;文本 fill 单独绑定 text/*。不靠字体样式命名暗藏颜色。
Effect styles
Overlay / Modal:两层真实阴影 0 8 24 / ink 10% + 0 32 80 / ink 16%。Blur 属于 effect,不是灰色色块。网页 z-index 不写入 shadow style。
Paint styles
Hero / Fallback 用渐变配方;stop 色可来自 primitive / hero-local。单色直接绑定 semantic variable 即可,不强制复制成相同名字的 Paint Style。WebGL 光场不是一条 CSS 渐变。
Layout guides + Auto Layout
Layout guide 负责辅助列网格;Auto Layout 负责真实 padding、gap、hug/fill、对齐。Component/variant 负责宽窄结构与交互状态。不能用 Grid Style 代替 Auto Layout。
Current source → Proposed mapping

Hero

page.module.css .heroHeading / HeroExperience.tsx / smoke-renderer.ts
Typography

Inter 500;clamp(96px,13.9vw,220px);line .85;tracking −.04em。≤700px:clamp(66px,13.4vw,96px),line .95。

Text Style / Homepage / Hero;字号进入 Layout,字重进入 Foundation。1440px 画板约 200.16px,390px 画板 66px。

Space / shape

标题区 padding 40×38px,gap 24px;≤700px padding 30×24px。标题自身没有圆角、边框或阴影。

Component / hero / heading-padding;Auto Layout 横排→窄屏重排。不用系统文档页的 gutter 去替代主页。

Paint / motion

白字;WebGL 5 个主调色值。开场 name .65s、popup 2.95s、typing 3.95s,每字42ms;dock 1.35s。

文字 → text/on-hero;光场归 local/hero,静态 fallback Paint Style;时间线记为 choreography,不泛化为所有组件动画。

Current source → Proposed mapping

Section Heading

fabrica.module.css .section / .displayRow / .projectsHeader
Typography

Inter 600;clamp(84px,11.25vw,144px);line .92;实际 tracking −.055em。源码局部写−.06em,但全局 !important 经变量覆盖,浏览器实测为准。≤700px:clamp(62px,19vw,112px)。

Text Style / Editorial / Section;1440px→144px / line132.48 / tracking−7.92px;390px→74.1px / line68.172 / tracking−4.0755px。本规范页 H2 刻意较小,不冒充首页章节尺寸。

Space / layout

section padding 138×30px;≤1000px inline22px;≤700px 94×16px。displayRow gap30;Work 标题下100px / 窄屏60px。

Layout / section-padding + Component / section-heading / gap;Work 是局部例外,不强行统一成 128px。

Paint / motion

ink 文字;标题没有投影。源码 masked title 110%→0,1050ms (.16,1,.3,1);外层 reveal 800/950ms。

fill → text/primary;mask + timeline 属于组件动效。V2 演示取消 blur,仅 transform / opacity,属 Proposed 性能取舍。

Current source + owner-requested V2 changes

Project Card

fabrica.module.css .project / .projectImage / .projectCaption / .imageArrow
Typography

源码标题 Inter 18px/600/1.1;继承 tracking −.035em;标签11px/700/.08em,年份13px。V2 用18px/1.25可换行标题,12px MONO data label。

Text Style / Project / Title 与 Data / Label 分开。MONO 与可读行高属于本轮 Proposed;实际元数据仍来自项目内容。

Space / shape

源码两列 gap8;封面16:9;radius18;caption padding20×24,小屏inline18。V2 封面4:3、caption20×24、小屏20;cover overlay inset16、gap8。

4:3 是你要求更大图片后的提案,不假称原站值。Component / project-card 引用 spacing、radius;Auto Layout 标题hug、宽度fill,媒体裁切。

Paint / motion

白底、无静态投影;源码 cover scale1.06→1.1 /800ms;箭头52px,opacity260ms、scale.75 rotate−20°→rest /500ms。

V2 cover1→1.04 /800ms;白 tags+箭头同排显现240ms,标题常驻、删除 Read case study。hover/focus/touch/reduced 均有替代状态。

  1. 先清点,不重建

    以你现有 Primitive-colors + Semantic-Colors 为候选主库。Portfolio / Semantic / Draft 先做迁移适配层,指向唯一语义来源;确认现有消费者后再讨论退役,绝不这轮删除。

  2. 绑定与透明度检查

    逐个记录 stable ID、alias target、type、mode、scope、sourceRevision、Current/Proposed 与 replacement ID。填色只走 semantic/component;text、border、effect alpha 分别核对,禁止循环别名。

  3. 三个组件做实

    Hero → SectionHeading → ProjectCard,分别记录图层结构、变量绑定、styles、variants、内容来源。先复刻同一画板静态关键帧,再扩展状态;不是堆一页色块就算设计系统。

  4. 验收后再采用

    网页与 Figma 用同一字体文件、内容、图像裁切与宽度(1440 / 390 / 320)比较;关键尺寸建议偏差≤1px、无换行漂移。动效另验时序与降级,不承诺 WebGL 在 Figma 中逐帧完全一致。V1 始终可回看。

可追溯的交付。

来源:2026-10-04 绑定清单及 2026-09-27 foundation 审计。Light / Inverse 是使用环境,不是自动 mode。下方旧 Semantic-Colors / Component-colors variable manifest 是历史提案,不作为当前 Figma 资产。

<button className={styles.button} type="button">
  Review project
</button>

/* tokens.ts → tokenVariables → scoped CSS */
.button {
  min-height: var(--ds-control-height);
  padding: var(--ds-space-3) var(--ds-control-padding);
  gap: var(--ds-control-gap);
  border-radius: var(--ds-radius-pill);
}
历史变量架构提案(不是当前 Inuse 的实施方式)
LEGACY MANIFEST INTERNALLY VALID5 collections · 75 variables

内部名称、mode 值和 alias 目标完整;这只验证历史提案本身,不代表当前 Inuse 采用该架构。

审阅后再采用。

这里只演示受保护的决策界面。确认不会修改生产系统,也不会标记方向已通过;实际采用需要你的明确反馈。