OpenMetadata UI 圆角设计规范:深入解析--om-radius-*Token 体系与边框圆角最佳实践
【免费下载链接】OpenMetadataThe Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, and agents.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMetadata
本篇技术指南围绕 OpenMetadata 开源仓库中设计系统基础规范文档 radius.md 展开,系统讲解 OpenMetadata UI 边框圆角(border-radius)Token 的完整刻度表、三层架构、离刻度历史值与正确用法。读者读完将掌握:在既有.less/.css组件中应如何使用var(--om-radius-*)替代硬编码像素值、如何规避yarn token-audit的告警,以及如何理解 Token 与上游设计原语之间的映射关系。
一、为什么需要一套圆角 Token 体系
在 OpenMetadata UI 中,圆角(Radius)与颜色、字号、间距、阴影一样,属于设计系统的基础原语(Foundation)。直接书写border-radius: 8px;这样的裸像素值看似简单,却会带来三方面问题:
- 视觉不一致:不同组件各自为政,圆角取值随意,无法形成统一的视觉语言;
- 不可主题化:无法随品牌或暗色主题全局调整,任何变更都需要逐文件修改;
- 无法被工具审计:仓库中的
yarn token-audit脚本会把"裸border-radius值"标记为警告,强制开发者回归 Token 化写法。
这正是 radius 规范文档存在的意义:它定义了完整的圆角刻度表,并规定了 Token 的分层引用方式,让组件代码只依赖语义化的--om-radius-*变量,而不是具体的像素数字。从仓库中 specs/README.md 可以看到,这套--om-*Token 层服务于遗留(Legacy)Ant Design + Less 技术栈(新工作优先使用 UntitledUI + Tailwind 的tw:工具类),但该层在迁移期间仍在持续维护,是所有存量 UI 的圆角标准。
二、标准圆角刻度表(Scale)
radius 规范文档给出了完整的圆角刻度表,共 9 个标准 Token。下表在继承原文档的基础上,补充了各 Token 的推荐使用场景说明:
| Token | 值 | 用途 |
|---|---|---|
--om-radius-none | 0 | 直角(square),如无圆角的容器或分隔场景 |
--om-radius-xs | 2px | 微妙圆角(subtle),几乎不可感知的轻微倒角 |
--om-radius-sm | 4px | 输入框、小型控件、标签(inputs, small controls, tags) |
--om-radius-md | 6px | 按钮(buttons) |
--om-radius-lg | 8px | 卡片、菜单、浮层(cards, menus, popovers) |
--om-radius-xl | 12px | 大卡片、模态框(large cards, modals) |
--om-radius-2xl | 16px | 更大尺寸的容器级圆角 |
--om-radius-3xl | 24px | 超大圆角容器 |
--om-radius-full | 9999px | 胶囊、头像、圆形控件(pills, avatars, circular controls) |
这套刻度在仓库源码 src/styles/tokens.css 中有精确对应实现,例如:
/* -- Radius -- */ --om-radius-none: var(--radius-none, 0px); --om-radius-xs: var(--radius-xs, 2px); --om-radius-sm: var(--radius-sm, 4px); --om-radius-md: var(--radius-md, 6px); --om-radius-lg: var(--radius-lg, 8px); --om-radius-xl: var(--radius-xl, 12px); --om-radius-2xl: var(--radius-2xl, 16px); --om-radius-3xl: var(--radius-3xl, 24px); --om-radius-full: var(--radius-full, 9999px);注意这里的声明模式:每个--om-*Token 都以var(--radius-*, <原始回退值>)的形式引用上游原语,即"优先取上游 Token,取不到时回退到原始像素值"。这种写法保证了即使上游globals.css的--radius-*未加载,UI 依然能正常渲染。
三、离刻度值(Off-scale Values)与历史遗留 Token
规范文档明确指出:当前实际使用的 Token 中存在若干不在标准刻度表上的离刻度值(off-scale values),例如--om-radius-10、--om-radius-999,以及小数形式的--om-radius-3_2(3.2px)。这些值存在于 tokens.css 的生成块中,属于历史遗留或局部特殊需求。
在 src/styles/tokens.css 中,"Extended radius — off-scale values in use" 注释下集中列出了这批扩展 Token:
/* Extended radius — off-scale values in use. */ --om-radius-1: 1px; --om-radius-3: 3px; --om-radius-3_2: 3.2px; --om-radius-5: 5px; --om-radius-7: 7px; --om-radius-9: 9px; --om-radius-10: 10px; --om-radius-13: 13px; --om-radius-14: 14px; --om-radius-15: 15px; --om-radius-18: 18px; --om-radius-20: 20px; --om-radius-30: 30px; --om-radius-200: 200px; --om-radius-999: 999px;与之对应,specs/tokens/token-reference.md 的 "Radius (24)" 一节共收录了 24 个圆角 Token 的完整清单,包括 9 个标准 Token 与 15 个扩展/离刻度 Token,可直接作为查阅手册。
关于离刻度值,规范给出了一条关键约束:
--om-radius-999与--om-radius-full都能产生胶囊(pill)效果,但优先使用--om-radius-full。
原因在于--om-radius-full是标准刻度成员,语义更明确、可被统一管理;而--om-radius-999只是历史上为了"足够大"而随手写出的数值。对新代码而言,应尽量收敛到标准刻度,减少离刻度 Token 的进一步扩散。
四、三层架构:从上游原语到组件使用
radius 规范将整个圆角 Token 体系划分为三个层级,这与 specs/README.md 中描述的遗留 Less 系统分层完全一致:
Layer 1 globals.css 上游原语 --radius-*(来源为 @openmetadata/ui-core-components) 是圆角数值的"唯一事实来源"(source of truth) Layer 2 --om-* 项目别名层(tokens.css),引用 Layer 1 Token 并带原始回退值; 离刻度 / 遗留值直接持有原始值 Components (.less/.css) 组件层通过 var(--om-*) 引用 Layer 2,绝不书写裸像素值逐层解读:
- Layer 1 ——
globals.css:定义上游--radius-*原语(以及--color-*、--text-*、--shadow-*等),是整个设计系统的数值源头。规范文档中写为 "globals.cssupstream--radius-*"。 - Layer 2 ——
--om-*别名层:在 tokens.css 的:root中,通过--om-radius-*: var(--radius-*, <raw>)的形式建立项目别名。组件只认识这一层,不直接依赖上游命名。 - Components —— 组件层:在组件样式(
.less/.css)中写作border-radius: var(--om-radius-lg);,实现"只看语义、不看数值"的解耦。此外,遗留 Less 桥接文件 src/styles/variables.less 同样承担 Token 定义职责,存量@variable用法不算违规,但新代码应优先使用var(--om-*)。
五、正确用法与反例(Do / Don't)
radius 规范用一段精简的 Less 代码示例明确了正反两种写法,这也是每个组件开发/审查时必须遵守的硬性规则:
/* DO */ border-radius: var(--om-radius-lg); border-radius: var(--om-radius-full); /* DON'T */ border-radius: 8px; border-radius: 50%; /* prefer --om-radius-full for pills; 50% only for true circles */要点拆解:
- 优先使用 Token:所有圆角必须通过
var(--om-*)引用,禁止在组件中硬编码8px之类的像素值,否则会触发yarn token-audit告警。 - 胶囊(pill)用
--om-radius-full:需要胶囊按钮、头像等"两头圆"的形态时使用--om-radius-full(9999px),它能让任意尺寸的元素都呈现完美胶囊形。 50%仅限真圆:border-radius: 50%只应出现在"本来就是圆形"的控件(如圆形头像、圆形状态点)上,用于确保正圆;若元素是矩形或胶囊形,用百分比会随宽高比例产生椭圆,此时应改用--om-radius-full。
六、用yarn token-audit验证圆角合规
原文档提到裸border-radius值会被yarn token-audit标记为警告。在 package.json 中可以看到该工具的真实入口:
"token-audit": "node scripts/token-audit.js", "token-audit:report": "node scripts/token-audit.js --report",在openmetadata-ui/src/main/resources/ui目录下运行:
yarn token-audit # 常规审计,报告硬编码 / 离刻度用法 yarn token-audit:report # 生成详细审计报告其工作逻辑可理解为:扫描组件样式中的border-radius声明,凡是未通过var(--om-*)引用的裸值(包括直接像素值、50%等)都会被标记。因此,在提交涉及圆角的 UI 改动前运行一次审计,是保证代码符合设计规范的最直接手段。
七、与相邻基础规范的关系
圆角不是孤立存在的基础原语,它与 Elevation(阴影/层级)共同塑造组件的空间层次。radius 规范文档末尾的交叉引用指向两个文件(已转换为仓库根目录相对路径):
- elevation.md:阴影与层级规范,与圆角配合定义卡片、菜单、浮层的视觉身份;
- token-reference.md:完整的
--om-*Token 参考手册(含全部 24 个圆角 Token),是组件开发时的速查表。
同目录下的其他基础规范(color.md、spacing.md、typography.md、motion.md)与本文共同构成 OpenMetadata UI 设计系统的基础层,建议在编写 UI 代码前先通读 specs/README.md 了解整体架构。
八、实践小结
在 OpenMetadata UI 中处理边框圆角时,请遵循以下决策路径:
- 标准场景:从 9 个标准 Token(
none/xs/sm/md/lg/xl/2xl/3xl/full)中按用途表选择,如按钮用--om-radius-md、卡片用--om-radius-lg、模态框用--om-radius-xl; - 胶囊与圆形:胶囊一律用
--om-radius-full;只有真正的圆形控件才允许border-radius: 50%; - 遗留代码:若在存量代码中发现离刻度值(如
--om-radius-10、--om-radius-3_2),理解其历史来源,新代码不要继续扩散;--om-radius-999与--om-radius-full等价时优先选用后者; - 提交前验证:在
openmetadata-ui/src/main/resources/ui下运行yarn token-audit,确保没有裸border-radius告警; - 查阅手册:需要确认任意 Token 的确切取值时,查阅 token-reference.md 的 Radius 章节。
通过遵循上述规范,OpenMetadata UI 的圆角体系得以保持全局一致、可主题化、可审计,这也是设计系统 Token 化改造的核心目标。
【免费下载链接】OpenMetadataThe Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, and agents.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMetadata
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考