news 2026/9/11 3:31:46

DESIGN.md 实战:以 Meridian「制图师图集」为例编写面向 AI Agent 的设计系统规范

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DESIGN.md 实战:以 Meridian「制图师图集」为例编写面向 AI Agent 的设计系统规范

DESIGN.md 实战:以 Meridian「制图师图集」为例编写面向 AI Agent 的设计系统规范

【免费下载链接】design.mdA format specification for describing a visual identity to coding agents. DESIGN.md gives agents a persistent, structured understanding of a design system.项目地址: https://gitcode.com/GitHub_Trending/de/design.md

导读

本文以仓库中完整可用的 DESIGN.md 实例 MERIDIAN.md 为骨架,系统讲解如何在 YAML frontmatter 中定义机器可读的设计令牌(color / typography / spacing),并在 Markdown 正文中为 AI Agent 提供人类可读的品牌叙事、排版原则与组件规范。读完本文,你将掌握 DESIGN.md 的标准结构、令牌命名与引用约定、各章节(Section)的写法要点,以及如何用仓库内置的 lint 命令与源码解析流程校验自己的 DESIGN.md 文件。

一、DESIGN.md 是什么:一个文档、两种语言

根据格式规范 docs/spec.md,DESIGN.md 是"自包含、纯文本"的设计系统描述文件,其核心目标是为编码代理(coding agent)提供持久、结构化的视觉身份理解。一个文件中同时承载两种信息层:

  • YAML frontmatter:以---开始、以---结束的机器可读设计令牌块,规范定义了colorstypographyroundedspacingcomponents等令牌组;
  • Markdown 正文:以##小节组织的人类可读设计原理与使用指南,正文中可以用描述性颜色名(如 "Antique Gold")对应系统性令牌名(如tertiary)。

规范明确:令牌是规范性取值(normative values),正文为应用语境提供上下文。这一点在 MERIDIAN.md 中得到完整示范——frontmatter 里的精确色值、字号、行高,配合正文里 "为什么用这种衬线体" 的叙事,共同构成 Agent 可执行的设计约束。

MERIDIAN.md 是一个虚构品牌 "The Cartographer's Atlas(制图师图集)" 的完整 DESIGN.md 样例,也是本仓库 linter 的 fixtures 之一,与其同级的还有 ALPINE_OBSERVATORY.md 等样例,共同验证解析器与校验规则。

二、MERIDIAN.md 的 YAML 令牌区:逐字段拆解

MERIDIAN.md 的 frontmatter 声明了namecolorstypographyspacing四组顶层内容,完整如下(节选关键结构):

--- name: The Cartographer's Atlas colors: surface: '#0f131c' primary: '#c3c6d7' on-primary: '#2c303d' secondary: '#b9c8dc' tertiary: '#ecc246' error: '#ffb4ab' ... typography: display-xl: fontFamily: Newsreader fontSize: 84px fontWeight: '700' lineHeight: '1.1' letterSpacing: 0.05em ... spacing: unit: 8px gutter: 24px margin: 64px panel-padding: 120px ---

2.1 name 与顶层字段

name是必填字符串,标记设计系统名称。规范 docs/spec.md 还允许可选的version(当前为"alpha")、descriptionomitted(声明有意省略的令牌组,用于抑制 lint 的缺失警告,可写成字符串或带reason的对象)。

2.2 colors 令牌:Material 式表面色体系

MERIDIAN.md 的colors令牌组包含 40+ 个令牌,覆盖了surfacesurface-container-*on-surfaceinverse-surfaceoutlineprimary/secondary/tertiary及其-container-fixed变体、errorbackground等,是一套接近 Material 3 语义的深色表面体系。核心取值如下:

令牌色值设计角色
surface#0f131c页面基底(深色画布)
surface-container-lowest#0a0e16最深一级容器,用于与基底形成分层
surface-container#1c2028常规内容容器
on-surface#dfe2ee基底上的前景文字
outline#909096发丝线边框、分隔线
primary#c3c6d7主强调色(冷银蓝灰)
tertiary#ecc246金褐色点缀色(Antique Gold 的令牌对应)
error#ffb4ab错误态

规范要求colors至少必须定义primary,多调色板时推荐按primarysecondarytertiaryneutral的次序命名;MERIDIAN.md 正是按此约定组织。所有颜色值会在内部统一转换为 sRGB 用于 WCAG 对比度校验,原文格式则保留用于展示与导出(见 docs/spec.md 的 Color 一节)。

2.3 typography 令牌:三层字体系统

typography令牌组为每个文本层级定义fontFamilyfontSizefontWeightlineHeightletterSpacing

层级令牌字体字号字重行高用途
display-xlNewsreader84px7001.1巨幅展示标题
headline-lgNewsreader48px6001.2一级标题
headline-mdNewsreader32px5001.3二级标题
body-lgNoto Serif20px4001.7长文正文
body-mdNoto Serif17px4001.7常规正文
label-capsSpace Grotesk12px5001.5全大写标注、标签
quote-editorialNewsreader28px4001.4编辑性引言

注意fontWeight在 YAML 中写成带引号的'700',解析器会将其规范化为数字(测试 fixture.test.ts 断言'700'解析为700);lineHeight'1.1'这类无单位数字被解释为相对fontSize的倍数——这是规范推荐的 CSS 写法。

2.4 spacing 令牌:4 级间距尺度

spacing: unit: 8px gutter: 24px margin: 64px panel-padding: 120px

spacingmap<string, Dimension | number>,既接受带单位的维度(px/em/rem),也接受无单位数字(如列数、比例)。MERIDIAN.md 用语义化键名unit/gutter/margin/panel-padding而非sm/md/lg刻度——规范允许任意描述性字符串作为键,这印证了令牌命名的灵活性。

三、正文 Section:从 Brand & Style 到 Components 的叙事骨架

规范定义了 8 个标准小节及其顺序(Overview/Brand & StyleColorsTypographyLayoutElevation & DepthShapesComponentsDo's and Don'ts),MERIDIAN.md 依次实现了前七个,可作为照抄的模板。

3.1 Brand & Style:一锤定音的总体气质

MERIDIAN.md 的开篇用两段话定义了品牌基调:知性权威与发现感,目标受众是重视长篇调查报道、历史语境与精确数据的受众;美学路线是High-Contrast / Minimalist(高对比 / 极简),拒绝柔和阴影与圆角,追求"被一盏高亮度台灯照亮的幽暗图书馆"般的专注情绪。规范指出,该小节是 Agent 在"没有明确规则或令牌时"做高层级风格决策的兜底语境,因此值得用明确形容词写透。

3.2 Colors:四色叙事的正文版

正文将调色板收敛为四种核心色调,与令牌一一对应:

  • Obsidian Canvas(#080C14):基础地面,深色空洞,让内容浮现;
  • Ink Navy(#0A0E1A):主要内容容器与标题,与背景形成微妙层次;
  • Slate Structure(#2C3A4A):技术性色彩,用于发丝线边框、网格线与功能性 UI;
  • Antique Gold(#C9A227):唯一的强强调色,必须克制使用,理想情况每屏仅出现一次,充当最重要操作或数据点的"灯塔"。

注意正文色值与 frontmatter 色值存在有意差异(如正文写#C9A227,令牌tertiary#ecc246)。这正是规范反复强调的:令牌是规范性取值,正文中的描述性色名仅提供语义参照。

3.3 Typography:衬线叙事 × 无衬线标注

正文将字体分为三层,与令牌一一对应:

  • Headlines — Newsreader:高对比笔画的锐利衬线,大字号下加宽字距(tracking)强化"纪念碑式"体量;
  • Body — Noto Serif:长时间阅读的温暖与易读性,1.7 行高是强制要求,防止文本块显得密集;
  • Labels & UI — Space Grotesk:全大写 + 宽字距,模仿地形图上的坐标标注。

3.4 Layout & Spacing:全出血面板网格

布局采用Full-Bleed Panel Grid(全出血面板网格)并配合 scroll-snap,每个面板代表体验中的一个"章节 / 地图页":

  • 偏移文本块:避免居中,内容应偏置在垂直中线左侧或右侧,营造编辑性节奏;
  • 交替面板:视觉重量在面板间轮换(如文字密集的 Slate 面板之后接全屏图像 / 数据可视化);
  • 边距:慷慨的 64px+ 边距保证内容不拥挤,维持"图集"的辽阔感。

3.5 Elevation & Depth:扁平制图学,严禁阴影

与制图学的扁平性质一致,阴影被严格禁止,深度只通过三种手段构建:

  • 色调阶梯(Tonal Stepping):将 Ink Navy 层叠于 Obsidian 之上;
  • 发丝线边框:1px 实线 Slate 定义面板或组件边界;
  • Z 轴分层:固定导航、标签等元素以 100% 不透明度浮于内容之上,靠色彩对比而非模糊/阴影突出。

3.6 Shapes:0px 圆角,直角即精度

形状语言定义为0px border radius:所有容器、按钮与装饰元素必须使用锐利直角,体现制图工具的精度与建筑制图的刚性线条。没有例外——连圆形头像与图标也应置于方形/矩形容器中。

3.7 Components:五个组件的精修细节

  • Buttons:主按钮用 Antique Gold 填充 + Navy 文字,矩形(0px 圆角),无 hover 阴影,hover 态以 1px Slate 描边或金色轻微偏移表示;
  • Pull Quotes:大字 Newsreader 斜体,左侧 2px 竖向金色边框锚定,常置于"偏移"布局区以打破正文流;
  • Lists & Annotations:项目符号/编号用 Label 字体(Space Grotesk),条目间以 Slate 水平发丝线分隔;
  • Input Fields:Navy 表面上的 1px Slate 描边,聚焦时边框变金,标签恒位于字段上方,全大写宽字距 Space Grotesk;
  • Data Panels:独特的"Coordinate Panel"(坐标面板)——视口角落的小型固定 UI,以 Label 字体展示进度或元数据,模仿地图图例。

四、源码侧印证:令牌如何被解析与校验

4.1 解析器:frontmatter 与 fenced yaml 双模式

解析入口是 packages/cli/src/linter/parser/handler.ts。ParserHandler.execute()使用unified+remark-parse+remark-frontmatter构建 AST,然后遍历节点收集三类信息:

  1. yaml 节点---frontmatter)与fenced yaml/yml 代码块,均作为令牌来源;
  2. ##二级标题,作为 Section 列表(sections);
  3. 每个 Section 的原文切片(documentSections)。

随后mergeCodeBlocks()会检测跨块重复的顶层键并返回DUPLICATE_SECTION错误(对应规范中 "Duplicate section heading → Error" 的消费者行为表)。toDesignSystem()将原始 YAML 映射为结构化的colors/typography/rounded/spacing/components/omitted字段。也就是说,MERIDIAN.md 的 frontmatter 会先经过这一层校验性解析,才能进入 lint 阶段。

4.2 校验规则:11 条默认规则的靶向检查

解析后的设计系统状态会交给 packages/cli/src/linter/linter/runner.ts 的runLinter(),它按序执行 packages/cli/src/linter/linter/rules/index.ts 中注册的 11 条默认规则:

brokenRefmissingPrimarycontrastCheckorphanedTokenstokenSummarymissingSectionsmissingTypographysectionOrderunknownKeytokenLikeIgnoredomitted

对 MERIDIAN.md 这类规范文件,最有意义的检查包括:missingPrimarycolors必须含primary)、sectionOrder(Section 必须按规范顺序出现)、contrastCheck(颜色转 sRGB 后做 WCAG 对比度评估)、brokenRef{path.to.token}引用是否悬空)。每项 rule 都有独立测试文件(如 missing-primary.test.ts、section-order.test.ts),fixture 级测试则通过 fixture.test.ts 对整份 DESIGN.md 做端到端断言。

4.3 CLI 实战:校验你自己的 DESIGN.md

仓库提供lint命令用于验证文件的"结构正确性",入口见 packages/cli/src/commands/lint.ts:

bun run cli lint path/to/DESIGN.md # JSON 输出(默认) bun run cli lint path/to/DESIGN.md -f text # 纯文本输出 cat path/to/DESIGN.md | bun run cli lint - # 从 stdin 读取

命令行为:读取文件 → 调用lint(content)得到{ findings, summary }→ 打印报告;只要存在error级别 finding,进程退出码即为 1process.exitCode = report.summary.errors > 0 ? 1 : 0),适合接入 CI 门槛。

五、从样例到自己的 DESIGN.md:可复用的写作清单

对照 MERIDIAN.md 与仓库其他示例,编写一份合格 DESIGN.md 的检查清单如下:

  1. frontmatter 必填name+ 至少colors.primary;无 YAML 时解析器返回NO_YAML_FOUND错误(见 parser/handler.ts);
  2. 令牌优先:所有正文提到的关键色值、字号都要在令牌区有对应取值,正文中的命名色只作语义注释;
  3. Section 顺序:按 Overview → Colors → Typography → Layout → Elevation → Shapes → Components → Do's and Don'ts 排列,避免sectionOrder规则报警;不需要的小节可省略;
  4. 深色 / 浅色体系都要定义on-*container层级:MERIDIAN.md 与 ALPINE_OBSERVATORY.md 都提供了完整的 Material 式表面色阶梯,可当作深色主题模板直接改写;
  5. 无圆角 / 禁阴影等极端约束要写成"禁止"句式:规范与正文都以明确的 "strictly prohibited"、"No exceptions" 句式约束 Agent 行为,避免歧义;
  6. 写完立即 lint:用上文 CLI 命令验证零 error,再提交。

如需参考浅色主题与不同字体组合,可对比 examples/paws-and-paths/DESIGN.md(Material 风格浅色色板 + Plus Jakarta Sans / Space Grotesk);该文件同时被 Tailwind v4 导出测试引用(见 packages/cli/src/linter/tailwind/v4/fixture.test.ts),说明同一份 DESIGN.md 令牌还可流向 Tailwind@theme生成。

结语

MERIDIAN.md 的价值在于它完整演示了 DESIGN.md 的"双轨"写法:机器可读的令牌区给出精确数值,人类可读的正文区给出审美意图与使用边界,二者互为表里。对 Agent 而言,前者是可执行的规则,后者是决策的语境;对设计团队而言,这是一份既能进 CI 校验、又能被模型消费的"活的设计真源"。以它为模板,配合本仓库的 lint 工具与解析源码,任何人都能在几小时内产出一份高质量、可验证、可被 AI 代理稳定消费的设计系统文档。

【免费下载链接】design.mdA format specification for describing a visual identity to coding agents. DESIGN.md gives agents a persistent, structured understanding of a design system.项目地址: https://gitcode.com/GitHub_Trending/de/design.md

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 3:23:32

GitHub热榜项目实战:从AI应用到效率工具的上手指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 3:23:15

MuJoCo 物体总滑动?用摩擦参数速查表快速定位原因

MuJoCo 物体总滑动&#xff1f;用摩擦参数速查表快速定位原因 【免费下载链接】mujoco Multi-Joint dynamics with Contact. A general purpose physics simulator. 项目地址: https://gitcode.com/GitHub_Trending/mu/mujoco MuJoCo 是一款通用物理仿真器&#xff0c;接…

作者头像 李华
网站建设 2026/9/11 3:21:56

功耗优化工程师如何转向Linux内核驱动开发

1. 这不是转行&#xff0c;是功耗优化工程师的自然演进路径干了两年功耗优化&#xff0c;现在该不该转Linux驱动&#xff1f;——这个问题我听到过不下二十次&#xff0c;每次都是在茶水间、技术分享会后&#xff0c;或者深夜改完最后一版PMIC寄存器配置时&#xff0c;同事靠过…

作者头像 李华
网站建设 2026/9/11 3:19:43

四方向控制底层逻辑与工程实践:键盘、摇杆与状态机全解析

很多人第一次接触“上下左右四个方向”这种需求时&#xff0c;脑海里浮现的往往是几个if-else判断、四个键盘按键&#xff0c;顶多再加一个摇杆模块。这东西看起来毫无技术含量&#xff0c;但真正动手去做一个网格游戏、一台遥控小车&#xff0c;或者一个带方向控制的Web控制面…

作者头像 李华
网站建设 2026/9/11 3:19:39

2026 年最好用的在线 Ping 检测工具推荐:kkce.com(KKCE 快快测)

2026 年再说“在线 Ping 检测”&#xff0c;得先把命令行那套扔掉&#xff1a; 本地 ping 1.2.3.4 只代表你这台机器 → 目标一条链路&#xff1b;而真正的连通性排障&#xff0c;要回答的是——电信南通、联通哈尔滨、移动海口、教育网南京、法兰克福机房&#xff0c;各自看到…

作者头像 李华
网站建设 2026/9/11 3:19:35

DNESP32P4 USB Host实战:U盘识别与FAT32读写全链路解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华