news 2026/9/20 2:28:15

OpenDesign Material 设计系统 2.0 包使用契约:从 tokens.css 到组件清单的接入与审计指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenDesign Material 设计系统 2.0 包使用契约:从 tokens.css 到组件清单的接入与审计指南
  • AI 应用
  • 人工智能
  • AI 技能
  • 设计系统
  • 媒体生成

【免费下载链接】open-design

🎨 Best DeepSeek Harness Design Plugin. The open-source Claude Design alternative. 🖥️ Local-first desktop app. 🖼️ Your coding agent becomes the design engine: prototypes, landing pages, dashboards, slides, images & video — real files, HTML/PDF/PPTX/MP4 export. 🤖 Claude Code / Codex / Cursor / DeepSeek Harness / OpenCode & 20+ CLIs via BYOK.

项目地址:https://gitcode.com/gh_mirrors/opend/open-design
点击查看免费下载

本篇指南以 OpenDesign 仓库内 design-systems/material/USAGE.md 为骨架,系统讲解 Material 设计系统 2.0 包(Design System 2.0 package)的文件契约、阅读顺序、设计规范与使用守则。读者将掌握:如何按契约顺序把tokens.css注入产物<style>块、如何用components.manifest.json快速盘点组件并回查components.html选择器、如何借助source/审计证据与 token 契约报告验证包质量,以及避免破坏跨品牌切换稳定性的常见误区。

包定位与核心文件契约

Material 包是 OpenDesign 的「Design System 2.0」体系中的一个品牌包,目录 design-systems/material 内包含一组固定结构的文件,共同构成一份对 Agent 和评审者(reviewers)都有效的「包契约」。从 manifest.json 可以看到该包的自描述信息:

  • idmaterialnameMaterialcategoryProfessional & Corporate
  • source.typebundledoriginOpenDesign curated bundled fixture——即本包基于 OpenDesign 精选的内置 fixture 整理而来,并非对上游品牌仓库或官网的新鲜抓取(这一点在 USAGE.md 的 Avoid 一节中被明确要求不得混淆);
  • files:将语义角色映射到具体文件——designDESIGN.mdtokenstokens.cssdesignTokensdesign-tokens.jsontailwindtailwind-v4.csscomponentscomponents.html
  • usageUSAGE.md,即本指南所讲解的入口文档;
  • componentsManifestcomponents.manifest.json
  • importModenormalized
  • craft:建议配套阅读 craft/color.md 与 craft/accessibility-baseline.md;
  • previewpreview/colors.htmlpreview/typography.htmlpreview/spacing.html三个视觉预览页;
  • sourceFilessource/evidence.mdsource/tokens.source.jsonsource/token-contract.report.json三份审计证据。

整个包的文件组成可以直观列出:

design-systems/material/ ├── USAGE.md # 使用契约(本文主题) ├── DESIGN.md # 视觉意图、约束与反模式 ├── manifest.json # 包自描述清单 ├── tokens.css # 唯一 token 真源(:root 声明) ├── design-tokens.json # 派生输出:结构化 token 清单 ├── tailwind-v4.css # 派生输出:Tailwind v4 @theme 桥接 ├── components.html # 参考组件 fixture(含全部选择器与状态) ├── components.manifest.json # 组件清单(选择器/类/元素/groups 盘点) ├── source/ # 审计证据 │ ├── evidence.md │ ├── tokens.source.json │ └── token-contract.report.json ├── preview/ # 视觉抽查页 │ ├── colors.html │ ├── typography.html │ └── spacing.html └── system/ # 系统页(index.html / kit.html / kit.dark.html)

官方推荐的阅读顺序(Read Order)

USAGE.md 给出了五步阅读/使用顺序,这是任何 Agent 或评审者上手本包的必经路径:

  1. 先读USAGE.md本身,理解包契约;
  2. 再读 DESIGN.md,掌握视觉意图、约束与反模式;
  3. tokens.css粘贴进第一个产物的<style>块,之后才编写组件 CSS;
  4. components.manifest.json获取紧凑的组件清单;当需要精确选择器或状态细节时,打开 components.html;
  5. 需要视觉抽查时,检查preview/页面。

这套顺序的本质是「契约 → 意图 → token → 组件 → 视觉验证」的自上而下工作流:先确立设计与技术边界,再让所有样式落在统一的 token 语义上,最后用组件 fixture 和预览页做一致性校验。

设计亮点与色彩立场

USAGE.md 用三条要点概括 Material 包的视觉身份,DESIGN.md 又对其展开为九个维度。核心立场如下:

  • 视觉风格:modern, minimal, clean(现代、极简、干净);
  • 色彩立场:primary / secondary / neutral / success / warning / danger 六类语义色;
  • 设计意图:让产物可被识别为该风格家族(recognizable to this style family),同时保持可用性与可读性;
  • Primary 主色#6442D6,来自 style foundations 的 token。

DESIGN.md 补充了其余语义色的取值:Secondary#C8B3FD、Success#16A34A、Warning#D97706、Danger#DC2626、Surface#FFFFFF、Text#111827、Neutral#FFFFFF(由 surface token 派生以兼容官方格式)。这些值属于 DESIGN.md 层面的「意图描述」,而实际落地到 CSS 变量时,tokens.css 采用了 Google-blue 交互色体系(accent#1a73e8等),体现了「意图文档」与「可执行 token」之间的差异——这也是理解本包时需要注意的一点:DESIGN.md 负责风格叙事,tokens.css 负责可运行的事实。

Typography 层面:字号阶梯 12/14/16/20/24/32,字体族 primary=Inter、display=Roboto、mono=Fira Code(DESIGN.md 侧);实际 tokens.css 的字体族为"Google Sans", RobotoRoboto, Arial"Roboto Mono", ui-monospace, Menlo。间距刻度为 4/8/12/16/24/32。布局上强调清晰内容块、稳定内边距、headline → support text → primary action的层级,并优先用留白而非边框/阴影来切分区块。

tokens.css:56 个 token 的结构化绑定

tokens.css 是整个包唯一的 token 真源(source of truth),所有派生产物(design-tokens.json、tailwind-v4.css)都由它生成,而不是反向手改。文件头部注释明确了定位:Structured token bindings for Material. material design surface logic with soft elevation, rounded controls, and accessible blue interaction.

:root块按语义分组,可划分为以下几类(括号内为默认值):

  • 背景与表面--bg(#f8fafd)、--surface(#ffffff)、--surface-warm(#e8f0fe);
  • 文本--fg(#202124)、--fg-2(#3c4043)、--muted(#5f6368);
  • 交互与状态--meta(#1a73e8)、--accent(#1a73e8)、--accent-on(#ffffff)、--accent-hover/--accent-active(用color-mix(in oklab, var(--accent), black 8%/14%)派生,而非硬编码色值)、--success(#188038)、--warn(#f9ab00)、--danger(#d93025);
  • 边框--border(#dadce0)、--border-soft(#edf0f2);
  • 字体--font-display--font-body--font-mono
  • 字号/行高/字距--text-xs(12px) 至--text-4xl(64px) 共 8 档,--leading-body(1.5)、--leading-tight(1.12)、--tracking-display(0);
  • 间距--space-1(4px) 至--space-12(48px) 共 8 档,另有--section-y-desktop/tablet/phone(96/68/48px);
  • 圆角--radius-sm(4px)、--radius-md(12px)、--radius-lg(24px)、--radius-pill(9999px);
  • 阴影/焦点--elev-flat(none)、--elev-ring(0 0 0 1px var(--border))、--elev-raised(0 3px 8px rgba(60,64,67,.18))、--focus-ring(0 0 0 4px rgba(26,115,232,.24));
  • 动效--motion-fast(150ms)、--motion-base(250ms)、--ease-standard(cubic-bezier(0.2,0,0,1));
  • 容器--container-max(1200px)、--container-gutter-desktop/tablet/phone(36/24/16px)。

值得注意的实现细节:hover/active 色通过color-mix()--accent计算而来,圆角与间距全部走变量,页面内不存在游离的硬编码色值——这正是 USAGE.md「Avoid raw hex values outside the copied :root token block」规则能够成立的技术前提。

组件清单:components.manifest.json 与 components.html

USAGE.md 要求优先复用组件组,而不是发明新控件。组件的事实来源是 components.manifest.json(紧凑盘点)与 components.html(精确选择器与状态)。

manifest 的fixture汇总了参考页规模:styleBlockCount: 1selectorCount: 48classCount: 26elementCount: 19。其groups字段将 48 个选择器归并为组件组:

组件组 id说明关键选择器
buttons按钮与 CTA.btn.btn-primary.btn-primary:hover.btn-secondary.btn:focus-visible
inputs表单字段与控件.fieldinputinput:focuslabel
cards卡片与面板.card-row.panel.panel-head.tile
badges徽标/状态标签.status.status::before
links行内链接a
keyboard键盘提示未实现(present: false
icons图标槽位未实现(present: false
typography字号刻度与文本工具.eyebrow.leadh1h2h3
layout布局原语.containersection.metric-grid

每个组件组还记录了其消费的 token 引用(tokenReferences),例如 buttons 组引用--accent--accent-on--border--ease-standard--elev-ring--radius-md--motion-fast--space-5等,从数据层面证明了「组件样式完全由 token 驱动」。

manifest 的 token 一致性分析同样值得评审者关注:tokens段列出了declared(56 个声明)、referenced(组件实际引用)与undeclaredReferenced(引用但未声明,当前为空数组,即零悬空引用)。unusedDeclared--accent-active--danger--elev-flat--motion-base--space-1--space-12--warn——这些 token 已声明但未被当前组件 fixture 引用,属于「为状态与语义预留」的 token,并非错误。

在 components.html 中可以实际看到这些组件如何组装:hero 区块由.eyebrow眉标 +h1标题 +.lead引导语 +.actions双按钮构成;右侧.panel面板内含.panel-head(含.status在线状态)、三列.metric-grid指标、.card-row.mini-card(Palette 色板与 Control 输入框);底部.lower三枚.tile分别演示 Typography / Surface / Interaction 主题。交互状态在 CSS 中均有显式表达:.btn-primary:hover上移 1px 并切换 hover 色,:focus-visible统一使用--focus-ringinput:focus同时改边框色与焦点环。

派生产物:design-tokens.json 与 tailwind-v4.css

design-tokens.json 是 token 的结构化机器可读输出,formatod-design-tokens/v1contractTOKEN_SCHEMA。其summary字段给出关键质量指标:totalTokens: 56declaredTokens: 56sourceBackedTokens: 56(全部 token 都有源码声明支撑)、aliasTokens: 0score: 100grade: "excellent"recommendRebuild: false。按层分布为A1-identity: 8B-slot: 4A2: 26A1-structure: 18。每个 token 条目都带有layerconfidence(本包均为high)、sources(指向tokens.css的具体声明行,如tokens.css:7)与sourceName

tailwind-v4.css 则是 Tailwind v4 桥接层:文件头部明确「Derived from tokens.css. Keep tokens.css as the source of truth.」,通过@import "./tokens.css"引入真源,再用@theme { ... }--color-*--font-*--text-*--spacing-*--radius-*--shadow-*--duration-*--ease-standard--container-*等命名空间全部映射到 tokens.css 变量。这意味着在 Tailwind 项目中可以直接写bg-accenttext-fg-2rounded-mdshadow-raisedduration-fast等工具类,且值始终与:root同步。

source/ 审计证据与 token 契约报告

USAGE.md 要求把source/文件当作「bundled fixture backfill 的审计证据」。source/evidence.md 明确了证据范围:本包派生自 OpenDesign 精选内置 fixture,不声称对上游品牌仓库/网站的新鲜抓取;包含的 fixture 文件即DESIGN.mdtokens.csscomponents.html三个;并规定design-tokens.jsontailwind-v4.css属于派生输出,应通过报告与 token 样式表再生成,而非手工编辑。

source/token-contract.report.json 是TOKEN_SCHEMA契约的逐条映射表:它把每个 schema 绑定映射回提交的tokens.css声明行(如tokens.css:16声明--accent)。sourceScopeopen-design-bundled-fixture,与 evidence.md 的表述一致。评审者可以用它快速核验「声称的 token 是否真的存在于源码」。

底层机制:TOKEN_SCHEMA 的分层与校验

Material 包的 token 分层并非随意设计,而是受设计系统 2.0 的 schema 约束。从 design-systems/_schema/AGENTS.md 可见 token 的四层体系:

归属违约后果示例
A1-identitybrandguard 失败--bg--fg--accent--font-display
A1-structurebrandguard 失败字号刻度、--container-max--section-y-*
B-slotbrand 或 schema 建议别名guard 失败——brand 必须声明--fg-2--surface-warm--meta--border-soft
A2可回退可默认间距、圆角、阴影、动效、状态色等

B-slot 的引入是为了保证跨品牌切换的可靠性:当共享槽位(如--surface-warm)在某个品牌包中缺失时,产物内对它的引用将静默失效;因此 B-slot 要求品牌必须声明,要么以var(--sibling)折叠到同族 token,要么给出独立值。schema 还定义了「C-extension → B-slot → A2 → A1」的晋升路径:当 ≥2 个品牌声明了同名 token 时晋升为 B-slot,当 B-slot 开始独立绑定时晋升为 A2,A2 晋升 A1 则较罕见。这正是 USAGE.md「Preserve the schema token names exactly so cross-brand switching stays reliable」的底层原因——token 名是跨品牌契约的一部分,改名即破坏契约。

仓库侧还配套了校验脚本 scripts/check-design-system-manifests.ts:它通过design-systems/_schema/manifest.schema.tsparseDesignSystemProjectManifest解析每个包的 manifest,用TOKEN_SCHEMA校验 token,并调用 packages/contracts/src/design-systems/components-manifest.ts 提取组件清单、packages/contracts/src/design-systems/derived-token-outputs.ts 派生 token 输出。可在仓库根目录运行pnpm exec tsx scripts/check-design-system-manifests.ts做全量校验——Material 包的grade: "excellent"score: 100recommendRebuild: false正是这类契约检查的预期结果。

Do:接入本包时的四件必做事项

USAGE.md 的 Do 清单定义了正确用法:

  1. 精确保留 schema token 名称,让跨品牌切换保持可靠——token 名属于契约而非实现细节,改名会破坏其他品牌包的复用与校验;
  2. --accent承载主行动、链接、焦点态以及唯一视觉焦点元素——accent 是本包的交互信号中心,应避免引入第二强调色;
  3. 优先复用components.manifest.json中的组件组,再考虑发明新控件——如按钮组、输入组、卡片组、徽标组都已覆盖,新增控件应先确认无法复用现有组;
  4. source/文件当作 bundled fixture backfill 的审计证据——评审与溯源时以 source/ 下的 evidence 与契约报告为准。

Avoid:四条必须规避的陷阱

USAGE.md 的 Avoid 清单定义了负面边界:

  1. 不要在被复制的:roottoken 块之外使用裸十六进制色值——所有颜色都应落在 token 上;
  2. 不要脱离tokens.css单独重定义 Tailwind 或 design-token 值——tailwind-v4.cssdesign-tokens.json是派生产物,手改会导致与真源漂移;
  3. 不要声称存在上游原始源码证据——本包基于精选内置 fixture,source/evidence.md已明确不主张新鲜抓取,对外表述必须一致;
  4. 不要添加components.htmlDESIGN.md中未体现的新组件配方——包契约以这两个文件为组件事实源,超出即超出契约。

实战:三步把 Material 包接进你的产物

综合 USAGE.md 的阅读顺序与 Do 清单,一次合规的接入流程如下:

第一步:注入 token 真源。将 tokens.css 中完整:root块粘贴到第一个产物的<style>块顶部(保持变量名与值完全一致),之后所有组件样式都只引用这些变量。

第二步:按组件组复用结构。打开 components.manifest.json 对照groups,需要按钮就用.btn/.btn-primary/.btn-secondary语义,需要表单就用.field+label+input结构,需要面板就用.panel/.panel-head/.metric-grid;若需精确复刻状态(hover、focus-visible、disabled、loading),以 components.html 的实现为准。

第三步:视觉抽查与自查。若部署环境支持,可打开preview/colors.htmlpreview/typography.htmlpreview/spacing.html三个预览页比对色彩、字号与间距是否与预期一致;同时对照 DESIGN.md 的 Anti-patterns 自查:不引入调色板外颜色、不扁平化层级(同一字号/字重贯穿全文)、不加损害可读性的装饰效果、不混用无关视觉隐喻。

按此流程产出的页面,将同时满足「识别为该风格家族」「token 驱动」「可跨品牌切换」三个包级要求,也就能通过 scripts/check-design-system-manifests.ts 所代表的那类契约校验。

  • AI 应用
  • 人工智能
  • AI 技能
  • 设计系统
  • 媒体生成

【免费下载链接】open-design

🎨 Best DeepSeek Harness Design Plugin. The open-source Claude Design alternative. 🖥️ Local-first desktop app. 🖼️ Your coding agent becomes the design engine: prototypes, landing pages, dashboards, slides, images & video — real files, HTML/PDF/PPTX/MP4 export. 🤖 Claude Code / Codex / Cursor / DeepSeek Harness / OpenCode & 20+ CLIs via BYOK.

项目地址:https://gitcode.com/gh_mirrors/opend/open-design
点击查看免费下载

相关推荐

上一篇:3分钟搞懂Godot热更新安全:从0到1实现资源防篡改方案
下一篇:FineTune Studio:用 MCP 在 Claude 中零代码微调 Hugging Face 模型的全流程实战

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

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

从0到1自研CRM系统:以沟通为中心的客户关系管理实战

先说个背景。DeskcommCRM并不是那种大而全、从营销到财务全都管的通用CRM&#xff0c;它更像一个以“坐席日常沟通”为中心拧紧的客户关系管理工具。项目名字拆开看&#xff0c;Desk是桌面&#xff0c;Comm是Communication&#xff0c;一眼就能明白它的定位&#xff1a;把客户沟…

作者头像 李华
网站建设 2026/9/20 2:26:22

AssetRipper完整指南:如何快速提取Unity游戏资源

AssetRipper完整指南&#xff1a;如何快速提取Unity游戏资源 【免费下载链接】AssetRipper GUI application to analyze game files 项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper 手里只有一个 Unity 游戏的发布目录&#xff0c;看不到工程源码&#…

作者头像 李华
网站建设 2026/9/20 2:25:57

IEC 61508-2010功能安全母标准:SIL定级与工程落地全解析

简介&#xff1a;这是一份S IEC 61508-2010功能安全完整英文版标准文档&#xff0c;共669页&#xff0c;面向工业自动化、汽车电子、医疗设备等安全相关系统的设计、开发与认证工程师。资源覆盖IEC 61508全部七个部分&#xff0c;从一般要求、电气/电子/可编程电子安全相关系统…

作者头像 李华
网站建设 2026/9/20 2:25:19

NextAI Translator:3 条命令跑通 ChatGPT 划词翻译工具

NextAI Translator&#xff1a;3 条命令跑通 ChatGPT 划词翻译工具 【免费下载链接】nextai-translator 基于 ChatGPT API 的划词翻译浏览器插件和跨平台桌面端应用 - Browser extension and cross-platform desktop application for translation based on ChatGPT API. 项目…

作者头像 李华