Files

15 KiB
Raw Permalink Blame History

Tenant Web 设计系统

适用范围:web/tenant

当前版本:2026-07-27

实现来源:src/styles/main.css、src/views/Layout.vue、src/views/dashboard/DashboardPage.vue

1. 设计定位

租户端采用一套轻量、明亮、低对比度的现代控制台设计语言,核心视觉方向为:

  • 冷白蓝雾背景,避免传统后台常见的纯灰或纯白大面积铺底。
  • 青绿色作为品牌主色,冰青、天蓝、靛蓝、暖橙和珊瑚粉作为功能辅助色,与落地页保持一致。
  • 参考 macOS Liquid Glass 的视觉特征,以半透明材质、环境色折射、镜面高光和柔和阴影表现层级。
  • 卡片边界尽量通过透明度、内高光和冷色阴影区分,避免使用过深边框。
  • 信息密度保持适中,使用大圆角、充足留白和紧凑的数据排版。
  • 动效服务于状态反馈,不使用持续、强烈或影响阅读的装饰动画。

2. 核心视觉原则

2.1 环境先于玻璃

液态玻璃必须建立在具有细微颜色变化的环境背景上。纯白背景没有足够的信息可供玻璃层模糊和折射,因此页面背景及侧栏内部均使用低透明度环境光晕。

2.2 玻璃以中性色为主

玻璃主体保持冷白透明,青绿、青色和少量靛蓝只用于边缘折射或局部光晕,不应形成明显的彩色实心区域。

2.3 层级由材质区分

页面层级按以下顺序增强:

  1. 页面背景:冷白底色与极淡 Mesh Gradient。
  2. 大面积容器:低透明度玻璃与背景模糊。
  3. 普通卡片:更高白色透明度、细描边和轻量阴影。
  4. 激活与悬浮状态:镜面高光、内阴影、边缘虹彩和更明显的悬浮阴影。

2.4 色彩承担语义

  • 青绿:品牌、主要操作、当前状态。
  • 天蓝:请求、数据、信息类功能。
  • 冰青:Token、连接、实时状态。
  • 绿色:成功、安全、余额正常。
  • 暖橙:提醒、费用、需要关注。
  • 红色:错误、危险、超额。
  • 粉色:模型、内容或次级强调。

3. 色彩系统

3.1 品牌主色

主色使用与落地页一致的 Teal 色阶,默认品牌色为 Primary 500。

Token 色值 建议用途
primary-50 #F0FDFA 浅色选中背景、图标底色
primary-100 #CCFBF1 聚焦环、浅色悬停
primary-200 #99F6E4 浅色边框
primary-300 #5EEAD4 装饰、高亮边缘
primary-400 #2DD4BF 次级品牌强调
primary-500 #14B8A6 默认品牌色、主要按钮
primary-600 #0D9488 按钮悬停、链接
primary-700 #0F766E 按压状态、强调文字
primary-800 #115E59 深色品牌元素
primary-900 #134E4A 高对比品牌文字
primary-950 #042F2E 极深品牌背景

品牌渐变:

linear-gradient(135deg, #14b8a6, #0d9488)

3.2 功能辅助色

Token 色值 语义
accent-blue #3B82F6 数据、请求、信息
accent-cyan #06B6D4 Token、连接、实时状态
accent-green #10B981 成功、安全、正常
accent-amber #F59E0B 费用、提醒、关注
accent-pink #EC4899 模型、内容、次级强调
accent-violet #8B5CF6 品牌扩展、智能能力

辅助色应优先用于小面积元素,例如图标磁贴、图表线条、状态点和数据趋势。避免在大面积容器中使用高饱和纯色。

3.3 中性色

中性色沿用 Slate/Gray 体系:

用途 推荐颜色
页面主标题 slate-900 / #0F172A
卡片标题 slate-800 / #1E293B
正文 slate-600 / #475569
次级说明 slate-400 / #94A3B8
禁用与占位 slate-300 / #CBD5E1
分隔线 slate-100 或白色透明边框

正文不建议使用纯黑 #000000,以保持整体柔和度。

3.4 页面背景

基础背景:

#F6F8FC

环境 Mesh Gradient:

radial-gradient(at 12% 8%, rgba(20, 184, 166, 0.09) 0, transparent 36%),
radial-gradient(at 72% 0%, rgba(6, 182, 212, 0.07) 0, transparent 40%),
radial-gradient(at 95% 70%, rgba(20, 184, 166, 0.055) 0, transparent 38%),
radial-gradient(at 45% 100%, rgba(99, 102, 241, 0.035) 0, transparent 42%)

背景光晕只用于提供环境色,不应成为页面的视觉主体。

4. 液态玻璃系统

4.1 基础玻璃令牌

--glass-bg: rgba(255, 255, 255, 0.72);
--glass-bg-strong: rgba(255, 255, 255, 0.84);
--glass-bg-subtle: rgba(255, 255, 255, 0.62);
--glass-border: rgba(255, 255, 255, 0.82);
--glass-blur: 28px;
--glass-saturate: 1.18;
--glass-highlight: inset 0 1px 0 rgba(255, 255, 255, 0.9);

4.2 普通玻璃容器

适用于顶栏、悬浮工具栏和大面积弱层级容器:

  • 背景:rgba(255, 255, 255, 0.62)。
  • 模糊:blur(28px)。
  • 饱和度:saturate(1.18)。
  • 描边:半透明白色。
  • 阴影:冷色、低透明度、大扩散范围。

4.3 卡片玻璃

普通内容卡片使用较高的不透明度:

  • 背景:rgba(255, 255, 255, 0.84)。
  • 普通卡片圆角:20px。
  • 登录、主图表等重点卡片圆角:24px。
  • 描边:rgba(255, 255, 255, 0.82)。
  • 阴影:0 10px 34px rgba(91, 104, 151, 0.08)。
  • 内高光:inset 0 1px 0 rgba(255, 255, 255, 0.9)。

卡片不使用厚重灰色边框。悬停时只允许轻微上移,并适度增强阴影。

4.4 侧栏环境玻璃

侧栏不是纯白色容器,而是带有轻微环境色的独立玻璃层:

background:
  radial-gradient(circle at 4% 7%, rgba(6, 182, 212, 0.13), transparent 31%),
  radial-gradient(circle at 105% 62%, rgba(20, 184, 166, 0.11), transparent 35%),
  radial-gradient(circle at 28% 106%, rgba(45, 212, 191, 0.10), transparent 30%),
  rgba(250, 252, 255, 0.62);
backdrop-filter: blur(32px) saturate(1.35);

这些环境色为菜单选中项提供可模糊和折射的内容,同时仍保持侧栏接近冷白色。

4.5 菜单选中玻璃

菜单选中态采用接近 macOS Liquid Glass 的纯 CSS 近似效果:

  • 中性半透明白色为主体。
  • 左下角冰青、右下角青绿作为极淡折射色。
  • blur(26px) saturate(1.7) brightness(1.06) 增强背景折射。
  • 顶部椭圆形高光模拟镜面反射。
  • 底部 1px 虹彩线模拟玻璃边缘色散。
  • 多层内阴影模拟玻璃厚度和弧面。
  • 外阴影表现轻微悬浮,不使用强烈光晕。

所有菜单项默认保留 1px 透明边框,选中时只替换边框颜色,避免状态切换造成布局偏移。

纯 CSS 无法实现真实的动态光线折射。若未来需要内容随背景实时扭曲,应使用 SVG displacement filter 或 WebGL shader。

5. 圆角系统

层级 圆角 使用场景
小 8px 标签、紧凑按钮、序号
中 12px 输入框、小图标容器
常规 15px–16px 菜单项、普通按钮
面板 16px 表格、筛选栏、紧凑内部面板
卡片 20px 普通内容卡片、数据卡片
重点卡片 24px 登录卡片、主图表和大型展示卡片
容器 28px 主侧栏、大型玻璃容器
胶囊 9999px 搜索框、状态标签、圆形操作区

同一区域内圆角应呈现明确层级:外层容器圆角最大,内部元素依次减小。

6. 阴影系统

Token 配方 用途
shadow-glass-sm 0 8px 24px rgba(76, 91, 142, 0.08) 顶栏、轻量浮层
shadow-glass 0 18px 55px rgba(76, 91, 142, 0.11) 大型玻璃容器
shadow-card 冷色外阴影 + 白色内高光 普通卡片
shadow-card-hover 0 18px 48px rgba(91, 104, 151, 0.14) 卡片悬停
shadow-glow 青绿色柔光 品牌图标和少量强调

阴影颜色使用蓝灰或品牌色透明值,不使用纯黑重阴影。

7. 字体与排版

字体栈:

system-ui,
-apple-system,
BlinkMacSystemFont,
'Segoe UI',
Roboto,
'Helvetica Neue',
Arial,
'PingFang SC',
'Hiragino Sans GB',
'Microsoft YaHei',
sans-serif

推荐排版层级:

类型 建议规格
页面标题 28px,700,紧凑字距
区块标题 16px,600
卡片关键数据 28px–30px,700,等宽数字
正文 14px,400–500
次级说明 12px,400
辅助标签 10px–11px,500–700

金额、百分比、Token 和请求数量应使用 tabular-nums,防止数字变化时宽度跳动。

8. 图标与渐变磁贴

图标以线性 SVG 为主,常规尺寸为 16px–20px。统计卡片和快捷入口可使用渐变图标磁贴:

类型 渐变方向
Violet #8E7DFF → #6D5CE7
Blue #5DB9FF → #3889EB
Cyan #48D5D5 → #22B3BD
Green #64DCB0 → #2CB887
Amber #FFC861 → #F0A335
Pink #FF8EB5 → #EB6394

磁贴应使用白色内高光和低透明度同色阴影,避免使用纯色平面图标块。

9. 图表配色

推荐图表序列:

#14B8A6  青绿,主数据
#06B6D4  冰青,次数据
#6366F1  靛蓝
#F59E0B  暖橙
#EC4899  珊瑚粉
#3B82F6  天蓝
#10B981  薄荷绿
#EF4444  珊瑚红

图表使用规范:

  • 主曲线使用青绿,第二曲线使用天蓝或冰青。
  • 填充区域透明度控制在 0.04–0.12。
  • 网格线使用低透明度 Slate 色。
  • Tooltip 使用深蓝灰半透明背景,不使用纯黑。
  • 环形图扇区之间使用半透明白色描边,保持玻璃环境下的分离度。

10. 动效规范

基础动效时长:

  • 快速反馈:180ms–200ms。
  • 页面与卡片进入:300ms。
  • 图表加载:约 650ms。
  • 持续装饰动画:应谨慎使用,并控制在低频、低幅度范围。

推荐缓动:

ease-out

允许的悬停变化:

  • 上移 1px–3px。
  • 轻微增强阴影。
  • 提升玻璃背景白色透明度。
  • 图标或文字改变为品牌色。

禁止通过增加边框宽度、内边距或字体粗细改变元素尺寸,避免页面发生布局抖动。

所有非必要动画必须兼容:

@media (prefers-reduced-motion: reduce)

11. 响应式规范

  • < 1024px:侧栏使用抽屉模式,完全移出视口并显示遮罩。
  • >= 1024px:侧栏固定悬浮,主内容根据展开状态调整左边距。
  • 指标卡:手机单列、平板双列、宽屏四列。
  • 图表区:常规屏幕单列,超宽屏采用主趋势图与占比图组合布局。
  • 快捷操作:根据容器宽度使用两列或三列。
  • 顶栏搜索框在小屏幕隐藏,保留关键操作按钮。

12. 可访问性与降级

  • 玻璃背景上的正文必须保持足够对比度,正文不使用低于 slate-500 的颜色。
  • 状态不能只依赖颜色表达,应同时提供图标、文字或百分比。
  • 交互元素应提供清晰的键盘聚焦环。
  • 不支持 backdrop-filter 时,玻璃组件降级为高不透明度白色背景。
  • 禁用状态降低透明度,但仍应保留可读文字。
  • 动画应支持 prefers-reduced-motion。

13. 使用建议

推荐

  • 使用透明白色、内高光和冷色阴影建立材质层次。
  • 让背景保留极淡的环境色,为玻璃提供折射内容。
  • 使用青绿色表达品牌和主要状态。
  • 使用功能色区分数据类别和业务状态。
  • 保持大圆角、低对比边界和充足留白。

避免

  • 避免大面积高饱和青绿渐变。
  • 避免纯黑阴影、纯黑正文和深灰粗边框。
  • 避免在同一视图中使用过多发光元素。
  • 避免所有卡片都设置悬浮动画,静态信息卡可保持稳定。
  • 避免只有透明白色、没有环境色的“假玻璃”效果。
  • 避免通过选中态边框改变元素实际尺寸。

14. 实现位置

内容 文件
全局主题、色彩和玻璃组件 src/styles/main.css
租户端侧栏与顶栏 src/views/Layout.vue
仪表盘信息架构与数据卡片 src/views/dashboard/DashboardPage.vue
趋势图 src/components/charts/TokenTrendChart.vue
模型费用环形图 src/components/charts/ModelDistChart.vue

后续新增页面应优先复用全局 .card、.glass、.glass-card、.sidebar-link、按钮和输入框样式,避免在页面内部重新定义相似但不一致的颜色与材质配方。

15. 表格规范

租户端表格统一使用 .table-container 和 .table,列表分页使用 .table-pagination。

15.1 表格容器

  • 圆角:16px。
  • 背景:半透明冷白玻璃,叠加极淡的冰青和青绿环境光。
  • 模糊:blur(22px) saturate(1.2)。
  • 描边:半透明白色,不使用传统灰色实线外框。
  • 阴影:冷色轻阴影与顶部内高光。
  • 横向滚动条使用冰青到青绿的渐变滑块,宽表格在移动端保持横向滚动。

当表格已经位于带有 overflow-hidden 的卡片内部时,使用 .table-container-flush 移除重复的圆角、描边和阴影。

15.2 表头

  • 高度由 14px 上下内边距构成。
  • 字号:12px。
  • 字重:650。
  • 文字颜色:#64748B。
  • 背景:冷白玻璃叠加低透明度冰青到青绿渐变。
  • 使用顶部镜面高光和底部柔和分隔线表现玻璃厚度。
  • 相邻表头之间使用短竖向渐变分隔,不使用贯穿整行的深色边框。
  • 表头内容默认不换行,长表格通过横向滚动查看。

15.3 数据行

  • 单元格默认背景为低透明度白色。
  • 偶数行使用极淡蓝灰背景,形成弱斑马纹。
  • 行分隔线使用低透明度 Slate 色。
  • 悬停或行内元素获得焦点时,整行显示冰青至淡青绿的液态渐变。
  • 悬停行首显示 3px 青绿色内侧指示条。
  • 数字统一使用 tabular-nums,避免金额和计数变化造成宽度跳动。
  • 表格内普通链接使用 primary-600,悬停时切换为 primary-800。

15.4 行内操作

  • 操作按钮优先使用小尺寸幽灵按钮。
  • 默认背景保持透明或极淡白色。
  • 悬停时增加白色玻璃背景、浅色描边和轻量阴影。
  • 状态使用圆角徽章,不通过纯文本颜色单独表达。
  • 危险操作继续使用红色语义,但避免大面积红色按钮。

15.5 分页栏

  • 使用 .table-pagination 与表格卡片连接。
  • 背景为冷白半透明渐变,与表头形成上下呼应。
  • 顶部分隔使用白色透明边缘,而不是旧式灰色边框。
  • 翻页按钮使用小型玻璃按钮,悬停时显示品牌色。
  • 禁用按钮降低对比度并移除阴影。
  • 手机端允许分页信息和按钮自动换行。

15.6 使用示例

<div class="table-container">
  <table class="table">
    <thead>
      <tr>
        <th>名称</th>
        <th>状态</th>
        <th class="text-right">操作</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="item in items" :key="item.id">
        <td>{{ item.name }}</td>
        <td><span class="badge badge-success">正常</span></td>
        <td class="text-right"><button class="btn btn-ghost btn-sm">查看</button></td>
      </tr>
    </tbody>
  </table>
</div>

<div class="table-pagination">
  <span>共 {{ total }} 条记录</span>
  <div class="flex items-center gap-2">
    <button class="btn btn-ghost btn-sm">上一页</button>
    <span>{{ page }} / {{ totalPages }}</span>
    <button class="btn btn-ghost btn-sm">下一页</button>
  </div>
</div>