语义化主题 Token:品牌色、深浅色与组件一致性
先描述一种熟悉的腐烂过程第一个页面里写了#FF6B35第二个页面复制了它第十个页面里有人凭记忆写成了#FF6835。半年后产品说填充词的橙色微调一下你打开全局搜索发现这个色值有四种写法、三个变体其中两个还藏在三元表达式里。再叠加深色模式适配——恭喜进入还债期。我们的解法是把颜色拆成三层每层都有明确的住处和禁令然后用脚本守住边界。1. 三层结构HEX 的法定住处只有 color.jsonresources/{base,dark}/element/color.json ← HEX 字面量唯一合法住处 ↓ 按资源名引用 common/theme/SpeakLabThemeTokens.ets ← 语义角色 → 资源的映射唯一映射层 ↓ 只许调 token 函数 pages / sheets / common/components ← 业务 UI零 HEX、零裸尺寸第一层资源文件。base/element/color.json里是全部色值dark/element/color.json是深色模式覆盖。HEX 只允许出现在这里{ name: sl_color_transcript_filler, value: #FF6B35 }, { name: sl_color_transcript_hesitation, value: #FFD000 }, { name: sl_color_transcript_vague, value: #FFC107 }, { name: sl_color_transcript_encouragement, value: #45A020 }第二层token 文件。SpeakLabThemeTokens.ets是唯一允许碰资源名的地方把稳定资源名映射成语义角色export function SpeakLabTranscriptFiller(): ResourceColor { return $r(app.color.sl_color_transcript_filler); } export function SpeakLabPageBackground(): ResourceColor { return $r(sys.color.ohos_id_color_sub_background); }第三层业务 UI。组件里只出现SpeakLabTranscriptFiller()这样的调用——读代码的人看到的是填充词色而不是一个色值改色值时只动 color.json 一处。这个结构的关键设计是token 文件里没有任何状态。文件头写明No theme state, no business state——它不是主题引擎只是一张纯映射表。深浅色切换不由它处理而是交给资源系统本身。2. 深浅色能借系统的就不自己造注意到上面两个例子的区别$r(app.color.…)和$r(sys.color.…)。这是我们的第二条规则结构色优先用系统 token品牌/语义色才用自定义资源。页面背景、卡片面、正文/次要/三级文字、分割线——这些结构性颜色直接映射到sys.color.ohos_id_color_*。好处是深浅色适配零成本系统 token 跟随系统色彩模式自动解析dark/color.json 里甚至不需要为它们写覆盖。只有两类颜色进 app 自己的 color.json冻结的品牌/语义色品牌主色#7BB358开口练的品牌绿、逐字稿四色。它们在 base 和 dark 里是同一个值——填充词的橙红在深色模式下依然是那个橙红因为它是业务语义不是界面氛围。确需自定义的结构补充品牌色按钮前景、卡片阴影、遮罩等系统 token 覆盖不到的角色在 base/dark 两份 color.json 里分别取值。固定黄色系语义色带来一个真机问题犹豫词的#FFD000在浅色页面上几乎不可读。解法不是动摇语义色而是给它一个沉浸底色——逐字稿区域固定用近黑底#0A0A0A衬白字语义色在两种系统模式下都保持可读{ name: sl_color_transcript_surface, value: #0A0A0A }, { name: sl_color_transcript_on_surface, value: #FFFFFF }token 注释里写明了设计意图Immersive dark surface so fixed yellow transcript colors stay readable in light mode。语义色的可读性问题用承载面解决而不是修改语义色本身——这条思路在任何彩色标注型产品里都通用。3. 语义隔离四套色族谁也不许客串谁token 文件里其实有四个独立的色族这是最容易被忽略、也最值得抄的设计色族用途例子transcript逐字稿高亮业务语义冻结filler 橙红 / hesitation 黄 / vague 黄 / encouragement 绿reportAI 报告批注highlight-soft / positive / underline / dashedfeedback操作反馈状态info / success / warning / error各有 soft 变体structure页面结构背景 / 卡片 / 文字 / 边框 / 阴影为什么要分开因为绿在不同语境下语义完全不同逐字稿里的绿是这句说得好鼓励反馈里的绿是操作成功。如果共用一个SpeakLabGreen()哪天设计师调整成功色的绿逐字稿的鼓励语义就跟着变了。这条红线有一个真实的反例教训词库数据里情绪词有polaritypositive字段开发时有人顺手想用正向情绪词染鼓励绿。被拦下了——本地文本分析不能推导好句子只有 AI 返回的显式ENCOURAGEMENT标注才允许用绿色。色族的边界本质是业务语义的边界颜色是产品语言不是视觉糖。4. 尺寸同理float.json 禁裸数字颜色之外尺寸走同样的三层float.json存数值资源token 函数按角色引用SpeakLabSpacingM()这类UI 里禁止.fontSize(14)、.padding(8)裸数字。理由和颜色一致——裸数字没有语义无法统一调整也无法审查这里为什么比设计稿大了 2vp。5. 五条门禁把规范从共识变成强制规范写在 Wiki 里等于没有规范。scripts/check-theme-boundaries.sh用 ripgrep python 实现了五条硬规则每次验收必跑正式 ArkTS 拒绝结构性 HEX。扫描common/ pages/ sheets/ entryability/下所有.ets出现#RRGGBB字面量即违规spike 目录在扫描范围之外故意放一马。拒绝裸数字尺寸包括多行对象形式。.fontSize(14)会抓拆成多行写的{ fontSize: 14 }也抓——这条是吃过换行绕过单行正则的亏之后补强的。冻结色精确校验。品牌色和逐字稿四色在 base 和 dark 两份 color.json 里必须同时存在且值精确相等——防止有人顺手优化深色模式下的填充词颜色把冻结语义改了。float 尺寸资源必须齐备。token 引用的尺寸档位必须真实存在于 float.json防止 token 引用悬空资源运行时炸。token 映射锁定 语义样本锁定。token 文件必须映射到冻结资源名另有一个专门的样本组件SpeakLabTranscriptSemanticSample.ets把哪种词用什么颜色、什么装饰实色/虚线下划线写成活的规范门禁校验它与 token 一致——文档会被遗忘能被校验的代码不会。脚本本身还有一个值得一提的细节资源契约永远对真实仓库解析即使SCAN_ROOT指向 mutation 测试的临时夹具树。这是为了配合 B18 会讲的变异测试——变异体会故意破坏源码来验证门禁能否抓住而 color.json 这种基线数据必须锚定真仓库否则变异测试就在跟自己玩过家家。6. 落地清单如果你要给自家项目建这套体系按这个顺序来把全工程现有 HEX 收敛进color.jsonbase dark 两份起稳定资源名建一个零状态的 token 文件按语义角色命名函数不按颜色命名要SpeakLabTranscriptFiller不要SpeakLabOrange结构色能映射sys.color.*的全映射过去深色模式适配瞬间减半按业务语义分色族写下来什么才允许用这个色我们的鼓励绿 仅显式 ENCOURAGEMENT写门禁脚本禁 HEX、禁裸尺寸、冻结色精确校验、资源存在性、样本锁定把门禁挂进验收流程让违规在本地就炸7. 小结三层color.json 是 HEX 唯一住处 → token 纯映射零状态→ UI 只用语义函数。结构色借系统 token深浅色零成本冻结语义色 base/dark 同值。固定语义色的可读性问题用承载面解决不改语义色。色族按业务语义隔离颜色是产品语言边界即语义边界。规范必须配门禁脚本且门禁自身要被变异测试验证。

相关新闻

AI生成3D模型在建筑施工中的应用与挑战

AI生成3D模型在建筑施工中的应用与挑战

1. AI生成3D模型在施工领域的可行性探讨最近有个甲方朋友拿着AI生成的建筑模型问我:"这玩意儿能直接拿去工地施工吗?"这个问题其实反映了当前建筑行业数字化转型过程中的典型困惑。作为从业15年的BIM工程师,我经手过上百个从概念到…

2026/7/24 2:19:08 阅读更多 →
每天节省2.8小时编码时间,但92%工程师漏掉了这1个关键验证步骤:AI代码交付前的SAST+SBOM双校验协议

每天节省2.8小时编码时间,但92%工程师漏掉了这1个关键验证步骤:AI代码交付前的SAST+SBOM双校验协议

更多请点击: https://codechina.net 第一章:每天节省2.8小时编码时间,但92%工程师漏掉了这1个关键验证步骤:AI代码交付前的SASTSBOM双校验协议 当AI编程助手(如GitHub Copilot、CodeWhisperer)生成一段功能…

2026/7/24 2:18:08 阅读更多 →
仅限本周开放!通义千问多模态私有化部署方案(含Docker镜像+GPU显存优化脚本+安全审计清单)

仅限本周开放!通义千问多模态私有化部署方案(含Docker镜像+GPU显存优化脚本+安全审计清单)

更多请点击: https://codechina.net 第一章:通义千问多模态私有化部署概览 通义千问多模态版本(Qwen-VL、Qwen2-VL)支持图像理解、图文生成、视觉问答等能力,其私有化部署需兼顾模型推理性能、数据安全合规与企业级运…

2026/7/24 2:18:08 阅读更多 →

最新新闻

TI TMUXHS4212高速开关评估模块实战:信号完整性测试与多协议兼容性设计

TI TMUXHS4212高速开关评估模块实战:信号完整性测试与多协议兼容性设计

1. 项目概述与核心价值在当今追求极致性能和紧凑设计的硬件世界里,高速数字接口的灵活切换能力变得至关重要。想象一下,你的设备只有一个USB Type-C接口,却需要同时或分时连接高速存储、高清显示和高速网络,这背后就需要一个“交通…

2026/7/24 2:27:10 阅读更多 →
OSS ChatGPT WebUI v4:从对话管理到AI工程化实践指南

OSS ChatGPT WebUI v4:从对话管理到AI工程化实践指南

最近在折腾各种 AI 工具时,我发现了一个挺有意思的现象:很多开发者其实并不满足于直接使用 ChatGPT 的官方界面。他们要么需要更灵活的对话管理,要么想把 AI 能力集成到自己的项目里,要么就是想找一个能自由部署、不受官方限制的替…

2026/7/24 2:27:10 阅读更多 →
OpenRouter大语言模型API成本优化实战指南

OpenRouter大语言模型API成本优化实战指南

在AI应用开发中,调用大语言模型API的成本控制一直是开发者关注的重点。特别是对于需要频繁调用GPT-4、Claude等高端模型的场景,直接使用官方API往往面临较高的费用压力。本文将介绍如何通过OpenRouter这一聚合平台来优化成本,同时保持模型性能…

2026/7/24 2:27:10 阅读更多 →
Substack推出AI检测工具:识别Claudefishing与AI生成内容

Substack推出AI检测工具:识别Claudefishing与AI生成内容

Substack 近期正式推出了 AI 检测工具,旨在帮助平台用户识别以“Claudefishing”为代表的 AI 生成内容。这类内容通常模仿真实作者的写作风格或身份,诱导读者误认为是人工创作,对内容可信度构成潜在威胁。该工具面向 Substack 作者和读者开放…

2026/7/24 2:27:10 阅读更多 →
OpenClaw管理面板与大模型集成实践指南

OpenClaw管理面板与大模型集成实践指南

1. OpenClaw管理面板与大模型集成实践最近在折腾OpenClaw的web管理面板,经过一番调试终于跑通了基础功能。作为一个支持多AI Agent框架的可视化管理工具,ClawPanel确实为OpenClaw和Hermes Agent提供了相当完善的管理能力。不过最让我兴奋的是&#xff0c…

2026/7/24 2:27:10 阅读更多 →
大模型智能体评估:从功能验证到可信测试

大模型智能体评估:从功能验证到可信测试

1. 大模型智能体评估的现状与挑战在人工智能领域,大模型智能体正从实验室走向实际应用,但评估这些智能体的表现却面临诸多挑战。传统NLP任务中,我们有BLEU、ROUGE等明确指标,但智能体的评估要复杂得多——它们不仅要生成文本&…

2026/7/24 2:26:10 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻