主题
设计系统使用规范(DH Design System)
基于数字海南 DH 设计体系。所有颜色、字体、间距等视觉属性必须严格遵循本规范,禁止使用任何未经规范定义的硬编码值。
一、Design Token 优先原则
- 颜色、字号、字重、行高、圆角、阴影、间距,全部使用设计 Token 变量
- 禁止硬编码任何色值、字号数值
- 主题切换(亮/暗)必须通过 Semantic Token 实现,不依赖具体色值 Token
css
/* ✅ 正确 */
color: var(--dh-color-primary);
font-size: var(--dh-font-size-md);
/* ❌ 错误 */
color: #075AED;
font-size: 14px;二、色彩规范
DH 色彩系统遵循感知均匀、过渡自然、层级清晰、无障碍兼容原则,采用 0–9 十级渐变色阶,严格遵循 WCAG 2.1 AA 级无障碍标准。
2.1 品牌色(自贸蓝)
品牌主色为 #075AED(blue-5),源于数字海南官方 Logo,代表科技感与信任感。
| 用途 | Token | 色值 |
|---|---|---|
| 主按钮、导航高亮、核心入口 | --dh-color-primary | blue-5 #075AED |
| 悬停态 | --dh-color-primary-hover | blue-4 #3A8AFF |
| 按下态 | --dh-color-primary-active | blue-7 #0542B3 |
| 浅色背景 | --dh-color-primary-bg | blue-0 #F2F7FF |
| 浅色描边 | --dh-color-primary-border | blue-2 #B9D5FF |
css
/* 主按钮 */
.btn-primary {
background: var(--dh-color-primary); /* #075AED */
border-color: var(--dh-color-primary);
color: #fff;
}
.btn-primary:hover {
background: var(--dh-color-primary-hover); /* #3A8AFF */
}
.btn-primary:active {
background: var(--dh-color-primary-active);/* #0542B3 */
}2.2 功能色(状态反馈)
功能色用于界面状态反馈,遵循用户通用认知,全系统统一,不得随意替换或混用。
| 功能类型 | 名称 | Token | 色值 | 适用场景 |
|---|---|---|---|---|
| 品牌/信息 | 自贸蓝 | --dh-color-primary | blue-5 #075AED | 强调、选中态 |
| 错误 | 丹黎红 | --dh-color-danger | red-5 #E23F3F | 删除、驳回、高危操作、错误提示 |
| 告警 | 落日橙 | --dh-color-warning | sunset-5 #F78B3C | 待办、提醒、风险提示、中期状态 |
| 成功 | 雨林绿 | --dh-color-success | green-5 #17B864 | 操作完成、审核通过、合规 |
css
/* 状态反馈示例 */
.tag-success { color: var(--dh-color-success); } /* #17B864 */
.tag-warning { color: var(--dh-color-warning); } /* #F78B3C */
.tag-danger { color: var(--dh-color-danger); } /* #E23F3F */
.tag-info { color: var(--dh-color-primary); } /* #075AED */
/* 浅色背景配套 */
.tag-success-bg { background: var(--dh-green-0); border-color: var(--dh-green-2); }
.tag-warning-bg { background: var(--dh-sunset-0); border-color: var(--dh-sunset-2); }
.tag-danger-bg { background: var(--dh-red-0); border-color: var(--dh-red-2); }2.3 扩展色板(12色)
扩展色共 12 色,每色 10 级色阶(0 最浅 → 9 最深),主色为第 5 级。
| 色板 | 命名 | 主色(5级) | 典型用途 |
|---|---|---|---|
| 丹黎红 | red | #E23F3F | 错误、删除、高危 |
| 熔礁橙 | coral | #E65C3C | 热度、活跃 |
| 落日橙 | sunset | #F78B3C | 告警、提醒 |
| 自贸金 | gold | #F5B800 | 价值标签、VIP |
| 清柠黄绿 | lime | #C8E02F | 环保、生态辅助 |
| 雨林绿 | green | #17B864 | 成功、通过、合规 |
| 潮汐青 | cyan | #00C2A8 | 数据辅助、海洋 |
| 海岛蓝 | sky | #00B4D8 | 信息辅助、天空 |
| 自贸蓝 | blue | #075AED | 品牌主色 |
| 琼韵蓝 | legacy | #334BE4 | 政务、传统科技 |
| 科创紫 | purple | #6B46D1 | 科技创新、AI |
| 云境紫 | magenta | #B74FD1 | 高端、创意 |
色阶命名规则:var(--dh-{色板名}-{0~9})
css
/* 色阶使用示例 */
.chart-item-1 { color: var(--dh-blue-5); } /* #075AED */
.chart-item-2 { color: var(--dh-cyan-5); } /* #00C2A8 */
.chart-item-3 { color: var(--dh-green-5); } /* #17B864 */
.hover-bg { background: var(--dh-blue-0); } /* #F2F7FF */
.deep-accent { background: var(--dh-blue-7); } /* #0542B3 */扩展色色阶速查(部分):
| 色阶 | blue | red | green | sunset | cyan | purple |
|---|---|---|---|---|---|---|
| 0 | #F2F7FF | #FFF6F6 | #F2FFF7 | #FFF9F0 | #F0FFFB | #F8F5FF |
| 1 | #E0ECFF | #FFE8E8 | #D9F9E8 | #FFF0DC | #CFF9F0 | #EDE4FF |
| 2 | #B9D5FF | #FFCFCF | #AFF0D0 | #FFE1B9 | #9FF0E1 | #D3C2FF |
| 3 | #84B8FF | #FFB3B3 | #86E7B8 | #FFD296 | #6FE7D2 | #B9A0FF |
| 4 | #3A8AFF | #F47A7A | #4FD693 | #FFB35C | #1FD4B8 | #8D6AE7 |
| 5 | #075AED | #E23F3F | #17B864 | #F78B3C | #00C2A8 | #6B46D1 |
| 6 | #064ED0 | #B81B1B | #129E54 | #E67728 | #00A892 | #5A39B8 |
| 7 | #0542B3 | #901111 | #0D8444 | #CC6218 | #008E7C | #492C9F |
| 8 | #043696 | #660A0A | #086A34 | #A34D08 | #007466 | #311870 |
| 9 | #032A79 | #3D0404 | #035024 | #7A3800 | #005A50 | #23105A |
2.4 中性色(礁石灰)
中性色用于文本、背景、边框、分割线等基础元素,保证界面层级清晰、可读性强。
| 色阶 | 色值 | 典型用途 |
|---|---|---|
| grey-0 | #FFFFFF | 纯白,卡片/容器背景 |
| grey-1 | #F7F7F7 | 页面底色、斑马纹底 |
| grey-2 | #F2F2F2 | 输入框禁用背景 |
| grey-3 | #EBEBEB | 分割线、描边 |
| grey-4 | #E0E0E0 | 骨架屏、占位 |
| grey-5 | #CCCCCC | 禁用态边框 |
| grey-6 | #A6A6A6 | 占位文字、次要图标 |
| grey-7 | #858585 | 辅助说明文字 |
| grey-8 | #525252 | 次要文字 |
| grey-9 | #1A1A1A | 主要文字(深色) |
黑色透明度色阶(适配亮暗双模式):
| 透明度 | 色值 | Token | 用途 |
|---|---|---|---|
| 90% | rgba(0,0,0,0.90) | --dh-color-text-primary | 正文内容 |
| 68% | rgba(0,0,0,0.68) | --dh-color-text-secondary | 辅助说明 |
| 48% | rgba(0,0,0,0.48) | --dh-color-text-tertiary | 提示信息 |
| 35% | rgba(0,0,0,0.35) | --dh-color-text-disabled | 禁用状态 |
主要文字(90%)和次要文字(68%)均满足 WCAG 2.1 AA 级(对比度 ≥ 4.5:1)。
css
/* 文字色使用 */
.text-primary { color: var(--dh-color-text-primary); } /* rgba(0,0,0,0.90) */
.text-secondary { color: var(--dh-color-text-secondary); } /* rgba(0,0,0,0.68) */
.text-hint { color: var(--dh-color-text-tertiary); } /* rgba(0,0,0,0.48) */
.text-disabled { color: var(--dh-color-text-disabled); } /* rgba(0,0,0,0.35) */2.5 色彩使用禁忌
- 禁止将告警色(橙)与错误色(红)互换使用
- 禁止仅凭色相区分关键状态(需配合图标/文字),确保色盲友好
- 禁止在白色背景上使用 0~3 级浅色作为独立文字色(对比度不足)
- 数据可视化多系列配色,优先使用扩展色中不同色系的 5 级主色,语义保持一致
三、字体规范
3.1 字体家族
| 场景 | 字体栈 | 说明 |
|---|---|---|
| 常规中文界面 | 'PingFang SC', 'Hiragino Sans GB', 'Segoe UI', 'Microsoft YaHei', 'OPPO Sans', sans-serif | 跨端优先系统字体 |
| 数字/金额/统计 | 'Roboto', 'Helvetica Neue', Helvetica, Arial, sans-serif | 强化数字字体,清晰易读 |
css
/* 基础文本 */
body {
font-family: 'PingFang SC', 'Hiragino Sans GB', 'Segoe UI',
'Microsoft YaHei', 'OPPO Sans', sans-serif;
}
/* 数据面板、金额、统计数值 */
.data-number,
.amount,
.stat-value {
font-family: 'Roboto', 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-weight: 700; /* OPPO-Sans Bold 风格 */
}3.2 字重
仅使用三段式字重,不使用其他字重。
| 字重值 | 名称 | Token | 用途 |
|---|---|---|---|
| 400 | Regular(常规) | --dh-font-weight-regular | 正文、说明 |
| 500 | Medium(中等) | --dh-font-weight-medium | 副标题、强调正文 |
| 600 | Semibold(半粗) | --dh-font-weight-semibold | 标题、数据大字 |
css
.body-text { font-weight: var(--dh-font-weight-regular); } /* 400 */
.label-text { font-weight: var(--dh-font-weight-medium); } /* 500 */
.heading-text { font-weight: var(--dh-font-weight-semibold); } /* 600 */3.3 行高规则
行高以固定数值 8 为基础变量递进,公式为:line-height = font-size + N×8,保证各字号呼吸空间均衡、排版节奏统一。
| 字号 | 行高 | 计算关系 |
|---|---|---|
| 12px | 20px | 12 + 8 |
| 14px | 22px | 14 + 8 |
| 16px | 24px | 16 + 8 |
| 18px | 28px | 18 + 8×1.25 |
| 20px | 28px | 20 + 8 |
| 24px | 32px | 24 + 8 |
| 28px | 36px | 28 + 8 |
| 32px | 40px | 32 + 8 |
3.4 字阶标准
移动端(Mobile)
| 级别 | 字号 | 字重 | 行高 | 用途 |
|---|---|---|---|---|
| Display | 28px | 600 | 36px | 大标题 |
| H1 | 24px | 600 | 32px | 页面主标题 |
| H2 | 20px | 600 | 28px | 章节标题 |
| H3 | 18px | 500 | 28px | 卡片标题 |
| Body-L | 16px | 400 | 24px | 大号正文 |
| Body | 14px | 400 | 22px | 标准正文 |
| Caption | 12px | 400 | 20px | 辅助说明、标签 |
PC 端
| 级别 | 字号 | 字重 | 行高 | 用途 |
|---|---|---|---|---|
| Display | 40px | 600 | 48px | 大屏展示标题 |
| H1 | 32px | 600 | 40px | 页面主标题 |
| H2 | 28px | 600 | 36px | 章节标题 |
| H3 | 24px | 500 | 32px | 三级标题 |
| H4 | 20px | 500 | 28px | 卡片/面板标题 |
| Body-L | 16px | 400 | 24px | 大号正文 |
| Body | 14px | 400 | 22px | 标准正文(默认) |
| Caption | 12px | 400 | 20px | 辅助说明、提示 |
css
/* PC端标准正文 */
.text-body {
font-size: var(--dh-font-size-body); /* 14px */
font-weight: var(--dh-font-weight-regular);/* 400 */
line-height: var(--dh-line-height-body); /* 22px */
color: var(--dh-color-text-primary); /* rgba(0,0,0,0.9) */
}
/* 页面标题 */
.text-h1 {
font-size: var(--dh-font-size-h1); /* 32px */
font-weight: var(--dh-font-weight-semibold);/* 600 */
line-height: var(--dh-line-height-h1); /* 40px */
color: var(--dh-color-text-primary);
}3.5 文字色彩规范
文字采用基于 #000000 透明度的四级色阶,适配亮暗双模式,不使用固定 HEX 文字色。
| 级别 | Token | 色值 | 用途 | WCAG |
|---|---|---|---|---|
| 主要文字 | --dh-color-text-primary | rgba(0,0,0,0.90) | 正文内容、标题 | AA ✅ |
| 次要文字 | --dh-color-text-secondary | rgba(0,0,0,0.68) | 辅助说明、描述 | AA ✅ |
| 辅助文字 | --dh-color-text-tertiary | rgba(0,0,0,0.48) | 提示信息、占位 | — |
| 禁用文字 | --dh-color-text-disabled | rgba(0,0,0,0.35) | 禁用状态 | — |
四、组件库使用原则
- 优先使用 DH 设计系统中已有组件,不重复造轮子
- 通过 Props / Slots 定制样式,禁止直接修改组件库源码
- 需要扩展时,创建**包装组件(Wrapper)**而非 Fork 源码
- 组件内颜色、字体必须通过 Token 覆盖,不写内联样式硬编码值
vue
<!-- ✅ 正确:通过 Token 覆盖主色 -->
<Button type="primary">提交</Button>
<!-- ✅ 正确:包装扩展 -->
<template>
<Button v-bind="$attrs" :style="{ '--dh-color-primary': customColor }">
<slot />
</Button>
</template>
<!-- ❌ 错误:直接修改组件样式 -->
<style>
.dh-btn { background: #075AED !important; }
</style>五、响应式设计
- Mobile First:先写移动端样式,再用媒体查询向上扩展
- 使用 DH 规范断点变量
| 断点名 | 尺寸 | Token |
|---|---|---|
| xs | < 480px | --dh-bp-xs |
| sm | 480px | --dh-bp-sm |
| md | 768px | --dh-bp-md |
| lg | 1024px | --dh-bp-lg |
| xl | 1280px | --dh-bp-xl |
| 2xl | 1600px | --dh-bp-2xl |
- 避免固定宽高,优先用弹性布局(Flexbox / Grid)
css
/* Mobile First 示例 */
.card-grid {
display: grid;
grid-template-columns: 1fr;
gap: 12px;
}
@media (min-width: 768px) {
.card-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1024px) {
.card-grid { grid-template-columns: repeat(3, 1fr); }
}六、暗黑模式
- 必须使用 Semantic Token(如
--dh-color-text-primary)而非具体色值 Token(如--dh-grey-9),确保主题切换自动生效 - 文字色使用透明度色阶(
rgba(0,0,0,N)),暗黑模式下自动映射为rgba(255,255,255,N) - 禁止使用
filter: invert()模拟暗黑模式 - 背景色层级(亮色模式):页面底色
grey-1 #F7F7F7→ 卡片grey-0 #FFFFFF→ 弹层grey-0 #FFFFFF
七、无障碍(A11y)规范
- 主要文字 / 次要文字必须满足 WCAG 2.1 AA 级(对比度 ≥ 4.5:1)
- 大字号(≥ 18px 或加粗 ≥ 14px)满足 AA Large(对比度 ≥ 3:1)
- 禁止仅用颜色传递状态信息,必须同时配合图标或文字
- 支持红绿色盲友好:错误(红)与成功(绿)场景必须额外使用图标区分
- 交互元素(按钮、链接、表单)必须有明确的 focus 样式
css
/* focus 样式示例 */
:focus-visible {
outline: 2px solid var(--dh-color-primary);
outline-offset: 2px;
}八、图标规范
- 统一使用 DH 图标库(
@szhn/dh-icons),不混用多套图标库 - 图标必须配合文字标签或
aria-label(纯图标按钮必须有aria-label) - 图标尺寸使用 Token:
16px / 20px / 24px / 32px - 图标颜色继承文字色(
currentColor),不单独硬编码
vue
<!-- ✅ 正确 -->
<Icon name="search" :size="20" aria-label="搜索" />
<!-- ❌ 错误:硬编码颜色 -->
<Icon name="search" style="color: #075AED" />九、数据可视化配色
数据大屏 / 图表场景,使用以下推荐配色序列(基于扩展色 5 级主色),确保视觉区分度最大:
| 序号 | 色板 | 色值 | 名称 |
|---|---|---|---|
| 1 | blue-5 | #075AED | 自贸蓝 |
| 2 | cyan-5 | #00C2A8 | 潮汐青 |
| 3 | green-5 | #17B864 | 雨林绿 |
| 4 | sunset-5 | #F78B3C | 落日橙 |
| 5 | purple-5 | #6B46D1 | 科创紫 |
| 6 | sky-5 | #00B4D8 | 海岛蓝 |
| 7 | gold-5 | #F5B800 | 自贸金 |
| 8 | legacy-5 | #334BE4 | 琼韵蓝 |
- 同一图表中不同系列颜色对比度需清晰区分
- 避免相邻序号使用相近色相(如 blue 与 legacy)
- 热力图、连续数据使用同色系 0→9 渐变,不混用色系
