
Grab Pro Now
Customize your admin
一致性不是审美纪律,是结构性质:每个视觉决定只在一个地方做一次,然后从 token 一级级长上来——被打破的信念是「UI 要好看,得先有设计师」。
Lesson 07 · 要打破的信念
UI 要好看,得先有设计师。
代码即原型——一致性是从 token 一级级长上来的。
时长
90 分钟
受众
写前端,但觉得设计是别人的事
现场演示
Mark Studio:九个数字的品牌
带走物
从底层进入一个领域的五步
Module 01 · 知识梳理 · 第 1 章
UI 的一致性不是审美问题,是结构问题:每个视觉决定,只允许在一个地方做一次。
机制解剖
先把「好看」拆开。一套 UI 让人觉得专业,九成来自一致:同一个圆角、同一套灰阶、同一种间距节奏,处处相同。而一致不是靠品味守出来的,是靠结构长出来的——这个结构就是阶梯:token(色值、字号、圆角这些最小决定)→ 语义变量(primary、muted——给决定起名字,让「主色」和「蓝色」分开)→ 法典(什么场合用什么)→ 组件 → 区块 → 页面 → 工程,再往上,多个工程共享同一套底层,就是 monorepo。铁律只有一条:每一级只许引用下一级,不许自带值。
换色演示暴露的就是违反这条铁律的代价。47 个字面量意味着「品牌色是什么」这个决定被做了 47 次——而被做了 47 次的决定,改起来就要改 47 处,并且漏掉的那几处不会报错,它们只是安静地错着,直到某个暗色模式的 hover 被客户截图。1 个 token 意味着这个决定只做过一次,于是改动也只有一次。这一课往后的所有内容——组件所有权、代码原型——都建立在这个地基上:决定住在哪,改动就发生在哪。
教学装置 · 靠搜索换色,还是靠一个 token(五步走一遍)
英文版 ↗ /diagrams/versus/token-rebrand分岔就在这里 —— 颜色住在哪
字面量
颜色住在每一处
第 47 个字面量带着错的颜色上了生产。
一个 token
颜色只住一处
这次换色一周前就结束了,在第二步。
一周后客户截来一张暗色 hover 上的旧蓝色。修复只是再改一处——外加一个事实:没有任何办法确认这是最后一处。token 买到的,正是那份确认。
两栏握着同样的 47 个着色表面。差别在于这个决定被做了多少次:47 个字面量就是 47 次决定,漏掉的那次不会报错——它只是安静地错着,直到一个暗色 hover 把它暴露出来。一个 token 是一次决定,所以右边在左边打开编辑器之前就已经完工。一致性要么从阶梯底部长上来,要么根本长不出来。
术语表 —— 课后你会在野外遇到它们
常见误区:「我们有设计规范文档」 — 文档是描述,token 是执行。规范里写着「主色 #2b7eff」而代码里有 47 个字面量,规范就只是一份愿望清单。对照第 5 课的强制力阶梯:文档靠自觉,token 靠结构——把规范从 PDF 挪进 globals.css 的那一天,它才开始被遵守。
Module 02 · 知识梳理 · 第 2 章
传统组件库你在租,shadcn 模式你在拥有——差别在六个具体的星期一爆发。
机制解剖
传统组件库的形态:npm install,组件活在 node_modules 里,你租它——它更新你跟着动,它有 bug 你等修,它的样式你用 !important 去打。shadcn 换了一个前提:组件被复制进你的仓库,从落地那一刻起就是你的代码。这个差别平时看不见,它在六个具体的时刻爆发:出 bug 的那天、换品牌色的那周、只需要一半功能的那次裁剪、上游发大版本的那天、让 agent 改 UI 的每一天、缺一个 prop 的下午。图鉴里那六个星期一,每一个你大概率都亲历过其中的「租」侧。
「归你所有」常被误解成「从零造轮子」,它不是。上游仍然在,但角色变了:它是 diff 的来源,不是要跟随的版本——读它的 changelog,把值得要的能力 merge 进你的组件,跳过对你是破坏的部分。升级的单位是能力,不是版本号。真正贵的从来不是拥有,而是中间那个姿势:既不拥有,又要定制——那才是 wrapper 套 wrapper、CSS 特异性战争和永久 fork 的来源。
教学装置 · 组件属于你的六个时刻(点任意一格自己开合)
英文版 ↗ /diagrams/catalog/owned-source每一格都是同一个组件 —— 唯一的变量是它的源码住在哪
「归你所有」不是从零造轮子,也不是 fork:上游仍然是 diff 的来源——读它的 changelog,把值得要的能力 merge 进你的组件。升级的单位是能力,不是版本号。真正贵的从来不是拥有,而是中间那个姿势:既不拥有,又要定制。
术语表 —— 课后你会在野外遇到它们
常见误区:「自己维护组件,成本太高」 — 你维护的从来不是组件的全部,是你用到的那部分——而用不到的那部分,所有权模式允许你直接删掉(租的模式里它们永远躺在用户的下载里)。反过来算:wrapper 地狱、特异性战争、等上游修 bug 的停工,这些也是维护成本,只是分期付款且不出现在任何账面上。
Module 03 · 知识梳理 · 第 3 章
设计稿回答不了的问题,代码原型第一天就有答案——而 AI 把它的成本压到了草图以下。
机制解剖
一张设计稿本质上是一个承诺:界面大概长这样。而产品要回答的问题它都答不了——能点吗?暗色模式呢?列表为空的时候呢?这个日文名字长到换行的时候呢?加载中和加载失败呢?静态图对这些的回答都是「到时候再说」,而「到时候」就是返工的时候。代码原型用真组件、真 token、真数据形状搭,这些问题在第一天就有答案——因为原型和产品是同一种东西,只是更小。
过去反对代码原型的理由只有一个:写代码比画图慢。AI 把这个前提取消了——一句话让 agent 用你的组件库拼出一版,成本已经低于画一张认真的图,而保真度是生产级的。于是「没有 UI 设计师参与时如何保证质量」这个问题,答案不是雇一个,而是让每个原型都从 token 和法典里长出来:底层保证它不会难看,法典保证它不会走样。你现在看的这份课件,就是这么做出来的——它没有设计稿,它的设计稿就是这个仓库。
教学装置 · 五个设计稿答不出的问题
设计稿的回答
箭头指向第 4 页的另一张图,旁边一行小字:「交互详见原型说明」。
代码原型的回答
点就是了。hover、焦点环、禁用态、加载中的按钮——全是真的,因为按钮是真的。
注意差别不在谁答得好,在谁答得出:静态图对这五个问题的回答,全部是「到时候再说」的某种变体——而「到时候」,就是返工的时候。
术语表 —— 课后你会在野外遇到它们
常见误区:「先画图更快」 — 对第一版是真的,对第三版就不是了:图的每一版都要人肉同步进代码,而代码原型的第三版就是产品的第一版。速度要在整个迭代周期上量,不是在第一笔上量——尤其当第一笔已经可以由 agent 代劳的时候。
Module 04 · 现场演示
参数化设计的活体,真的挂在下面——不是截图。风车、表盘、光圈、月牙,整个门类是一个基元的九个参数;拖一根滑杆,看原型互相变过去。mark 之于九个数字,正如 UI 之于 token。
教学装置 · 就是那个工具本体,当场可玩
英文版 ↗ /tools/mark-studioFavicon
Wordmark
acmelabs.com
acmelabs
Both grounds
Archetypes · coordinates, not templates
Module 05 · 带走物
这五步不只适用于 UI——token、语义层、法典、成品,是任何一个成熟领域都有的四层。UI 只是你手边最容易练的那个。
五步,从底往上;第五步是对前四步的验收。
三个动作,第一个最扎心。
①数一数你的字面量
在你的项目里搜十六进制色值(# 开头)和裸的像素值。得到的数字就是「品牌色是什么」这类决定被重复做的次数——也是你换一次色要付的价钱。
②收归一个组件
挑一个你正在租的组件,把它的源码复制进仓库,然后改一行它原本不让你改的东西。体会一次「这是我的代码」和「这是别人的包」的差别。
③给你的 mark 找出九个数字
用 Mark Studio 把你团队或项目的 mark 参数化——不用像素级还原,找到最接近的坐标就行。那九个数字,就是它的 token。