Files
smt/docs/design-system.md
2026-03-31 21:29:54 +08:00

397 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 戒烟助手 - 设计语言文档
> 所有页面和组件必须遵循此文档,确保视觉一致性。
---
## 1. 色彩体系
### 品牌色 — 薄荷绿
| 用途 | 色值 | 示例场景 |
|------|------|---------|
| 主色 | `#34C8A0` | 按钮、进度条、选中态边框 |
| 主色深 | `#1a8c62` | 选中文字、强调文字 |
| 主色最深 | `#0D3D2E` | 页面标题、数值文字 |
| 辅助文字 | `#52806E` | 副标题 |
| 次要文字 | `#7aA898` | 说明文字、标签、单位 |
| 淡底色 | `#9CC5B5` | placeholder 文字 |
### 功能色
| 用途 | 色值 | 场景 |
|------|------|------|
| 成功/正向 | `#1a8c62` | 下降趋势、达成状态 |
| 警告 | `#B45309` | 上升趋势、需注意 |
| 警告背景 | `rgba(251, 191, 36, 0.14)` | 警告标签底色 |
| 危险 | `#DC2626` | 高数值指标 |
| 信息蓝 | `#2563EB` | 对比数据(实际值) |
### 背景与表面
| 用途 | 色值 |
|------|------|
| 页面背景渐变 | `linear-gradient(180deg, #E6F7F2 0%, #F0FBF7 40%, #FAFFFE 100%)` |
| 卡片底色 | `rgba(255, 255, 255, 0.88)` |
| 卡片边框 | `rgba(52, 200, 160, 0.14)` |
| 卡片阴影 | `0 4rpx 18rpx rgba(52, 200, 160, 0.07)` |
| 浅底色块 | `rgba(52, 200, 160, 0.06)` |
| 选中底色 | `rgba(52, 200, 160, 0.09)` |
| 选中边框 | `rgba(52, 200, 160, 0.45)` |
---
## 2. 字体规范
### 字体栈
```css
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
```
### 字号层级
| 级别 | 字号 | 字重 | 颜色 | 用途 |
|------|------|------|------|------|
| H1 | 38rpx | 700 | `#0D3D2E` | 页面大标题 |
| H2 | 28rpx | 600 | `#0D3D2E` | 卡片标题 |
| H3 | 26rpx | 600 | `#1a5c45` | 区块标签(section-label |
| 数值大 | 52rpx | 700 | `#0D3D2E` | 核心指标数字 |
| 数值中 | 38-42rpx | 700 | `#0D3D2E` | 次要指标数字 |
| 正文 | 25rpx | 400 | `#52806E` | 描述文字 |
| 辅助 | 21-22rpx | 400 | `#7aA898` | 标签、单位、说明 |
| 小字 | 20rpx | 500 | `#7aA898` | 注释、补充信息 |
---
## 3. 间距与圆角
### 间距
| 级别 | 数值 | 用途 |
|------|------|------|
| xs | 6-8rpx | 元素内部微间距 |
| sm | 14-16rpx | 标签之间、紧凑元素间距 |
| md | 20rpx | 卡片之间、区块之间 |
| lg | 28rpx | 页面侧边距 |
### 圆角
| 元素 | 圆角 |
|------|------|
| 卡片 | 24rpx |
| 选项卡片 | 20rpx |
| 标签(pill | 999rpx |
| 按钮 | 48rpx(大按钮)/ 999rpx(小标签) |
| 输入框/选择器 | 12-14rpx |
| 圆形按钮/圆环 | 50% |
| 数据色块 | 14rpx |
---
## 4. 组件样式规范
### 4.1 卡片(Card
所有独立内容区域使用卡片包裹。
```css
.card {
background: rgba(255, 255, 255, 0.88);
border-radius: 24rpx;
border: 1.5rpx solid rgba(52, 200, 160, 0.14);
box-shadow: 0 4rpx 18rpx rgba(52, 200, 160, 0.07);
padding: 24rpx;
margin-bottom: 20rpx;
}
```
**禁止**:使用旧版灰蓝阴影 `rgba(15, 23, 42, 0.06)`,统一使用薄荷绿阴影。
### 4.2 选择卡片(Mode Card / Option Card
```css
/* 默认态 */
.option-card {
background: rgba(255, 255, 255, 0.72);
border: 2rpx solid rgba(52, 200, 160, 0.1);
border-radius: 20rpx;
box-shadow: 0 2rpx 10rpx rgba(52, 200, 160, 0.04);
}
/* 选中态 */
.option-card-active {
background: rgba(52, 200, 160, 0.09);
border-color: rgba(52, 200, 160, 0.45);
box-shadow: 0 4rpx 16rpx rgba(52, 200, 160, 0.14);
}
```
### 4.3 标签选项(Pill Tag
```css
/* 默认态 */
.tag {
padding: 14rpx 26rpx;
border-radius: 999rpx;
background: rgba(255, 255, 255, 0.9);
font-size: 25rpx;
color: #4a7a66;
border: 1.5rpx solid rgba(52, 200, 160, 0.18);
}
/* 选中态 */
.tag-active {
background: rgba(52, 200, 160, 0.12);
border-color: rgba(52, 200, 160, 0.45);
color: #1a7f61;
font-weight: 600;
}
```
### 4.4 按钮
```css
/* 主按钮 */
.btn-primary {
height: 96rpx;
background: linear-gradient(180deg, #3DD9AE 0%, #34C8A0 100%);
border-radius: 48rpx;
color: #FFFFFF;
font-size: 32rpx;
font-weight: 600;
box-shadow: 0 12rpx 28rpx rgba(52, 200, 160, 0.28);
}
/* 圆形操作按钮(+/- */
.btn-circle {
width: 60rpx;
height: 60rpx;
border-radius: 50%;
background: rgba(52, 200, 160, 0.1);
color: #34C8A0;
font-size: 38rpx;
border: 1.5rpx solid rgba(52, 200, 160, 0.25);
}
```
### 4.5 输入框
```css
.input {
background: rgba(52, 200, 160, 0.06);
border: 1.5rpx solid rgba(52, 200, 160, 0.2);
border-radius: 12rpx;
color: #0D3D2E;
font-weight: 600;
}
/* placeholder */
placeholder-style: "color: #9CC5B5"
```
### 4.6 进度条
```css
.progress-bar {
height: 10rpx;
background: rgba(52, 200, 160, 0.1);
border-radius: 999rpx;
}
.progress-fill {
background: linear-gradient(90deg, #34C8A0, #3DD9AE);
border-radius: 999rpx;
}
/* 未完成态 */
.progress-fill-pending {
background: rgba(52, 200, 160, 0.3);
}
```
### 4.7 圆环指标(Ring
```css
.ring {
width: 110rpx;
height: 110rpx;
border-radius: 50%;
/* 使用 conic-gradient 动态渲染 */
/* 主色: #34C8A0, 底色: #E8F8F3 */
}
.ring-inner {
width: 82rpx;
height: 82rpx;
border-radius: 50%;
background: #FFFFFF;
box-shadow: 0 4rpx 12rpx rgba(52, 200, 160, 0.1);
}
```
### 4.8 状态标签(Chip
```css
/* 正向 */
.chip-good {
background: rgba(52, 200, 160, 0.12);
color: #1a8c62;
}
/* 警告 */
.chip-warn {
background: rgba(251, 191, 36, 0.14);
color: #B45309;
}
/* 中性 */
.chip-neutral {
background: rgba(52, 200, 160, 0.06);
color: #7aA898;
}
```
### 4.9 SegmentTab 切换)
```css
.segment {
background: rgba(255, 255, 255, 0.82);
padding: 6rpx;
border-radius: 22rpx;
border: 1.5rpx solid rgba(52, 200, 160, 0.14);
box-shadow: 0 4rpx 16rpx rgba(52, 200, 160, 0.07);
}
.segment-item {
font-size: 24rpx;
font-weight: 600;
color: #7aA898;
border-radius: 16rpx;
}
.segment-active {
background: #FFFFFF;
color: #0D3D2E;
box-shadow: 0 4rpx 12rpx rgba(52, 200, 160, 0.12);
}
```
### 4.10 空状态
```css
.empty-block {
padding: 32rpx;
border-radius: 16rpx;
background: rgba(52, 200, 160, 0.04);
}
/* 虚线边框变体 */
.empty-block-dashed {
border: 2rpx dashed rgba(52, 200, 160, 0.2);
background: transparent;
}
.empty-text {
font-size: 24rpx;
color: #7aA898;
}
```
### 4.11 底部安全区
```css
.bottom-safe {
height: calc(32rpx + env(safe-area-inset-bottom));
}
/* 固定底部按钮区域 */
.footer-fixed {
position: fixed;
left: 0; right: 0; bottom: 0;
padding: 20rpx 28rpx;
padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
background: linear-gradient(180deg, transparent 0%, rgba(240, 251, 247, 0.97) 35%);
}
```
---
## 5. 数据可视化配色
| 数据类型 | 色值/色阶 |
|---------|----------|
| 0 / 无数据 | `rgba(52, 200, 160, 0.06)` |
| 低(1-3 | `rgba(52, 200, 160, 0.18)` |
| 中(4-8 | `rgba(251, 191, 36, 0.2)` |
| 高(9+ | `rgba(239, 68, 68, 0.15)` |
| 圆环已完成 | `#34C8A0` |
| 圆环未完成 | `#E8F8F3` |
---
## 6. 禁止事项
| 禁止 | 替代方案 |
|------|---------|
| 灰蓝色阴影 `rgba(15, 23, 42, *)` | 薄荷绿阴影 `rgba(52, 200, 160, *)` |
| 旧主色 `#1AA37A` / `#1aa37a` | 新主色 `#34C8A0`(按钮/进度条)或 `#1a8c62`(文字) |
| 灰色文字 `#6B7280` / `#94A3B8` | 绿调文字 `#7aA898` / `#52806E` |
| 灰色背景 `#F1F5F9` / `#F8FAFC` | 绿调背景 `rgba(52, 200, 160, 0.06)` |
| 纯白卡片背景 `#FFFFFF` | 半透明白 `rgba(255, 255, 255, 0.88)` |
| `backdrop-filter: blur()` | 不再使用模糊滤镜(性能考虑),用不透明度代替 |
| 旧页面背景渐变 `#edf2f8 → #fbfdff` | 薄荷绿渐变 `#E6F7F2 → #FAFFFE` |
---
## 7. 快速参考
开发新页面时复制此基础结构:
```vue
<template>
<view class="page">
<view class="status-bar" :style="{ height: navBarHeight + 'px' }"></view>
<view class="card">
<text class="card-title">标题</text>
<!-- 内容 -->
</view>
<view class="bottom-safe"></view>
</view>
</template>
<style scoped>
.page {
min-height: 100vh;
background: linear-gradient(180deg, #E6F7F2 0%, #F0FBF7 40%, #FAFFFE 100%);
padding: 0 28rpx;
box-sizing: border-box;
}
.status-bar {
background: transparent;
}
.card {
background: rgba(255, 255, 255, 0.88);
border-radius: 24rpx;
padding: 24rpx;
margin-bottom: 20rpx;
border: 1.5rpx solid rgba(52, 200, 160, 0.14);
box-shadow: 0 4rpx 18rpx rgba(52, 200, 160, 0.07);
}
.card-title {
font-size: 28rpx;
font-weight: 600;
color: #0D3D2E;
}
.bottom-safe {
height: calc(32rpx + env(safe-area-inset-bottom));
}
</style>
```