2321 字
12 分钟
Fuwari 博客模板 Design Tokens 完整指南
概述
Fuwari 是一个基于 Astro 的现代化静态博客模板,采用了一套完整的设计令牌(Design Tokens)系统来管理颜色、间距、排版和其他设计元素。该系统结合了 CSS 变量、Tailwind CSS 和动态色相调整,提供了高度可定制的主题体验。
核心 CSS 变量列表
颜色相关 (Colors)
主要色彩变量
| 变量名 | 描述 | 定义方式 | 使用场景 |
|---|---|---|---|
--hue | 主题色相值 (0-360) | JavaScript 动态设置 | 所有使用 OKLCH 颜色的元素 |
--primary | 主要品牌色 | 基于 --hue 的 OKLCH 颜色 | 链接、按钮强调色、图标 |
背景色
| 变量名 | 描述 | 浅色模式 | 深色模式 |
|---|---|---|---|
--page-bg | 页面背景色 | oklch(0.95 0.01 var(—hue)) | oklch(0.16 0.014 var(—hue)) |
--card-bg | 卡片/面板背景色 | white | oklch(0.23 0.015 var(—hue)) |
--float-panel-bg | 浮动面板背景色 | white | oklch(0.23 0.015 var(—hue)) |
--codeblock-bg | 代码块背景色 | oklch(0.17 0.015 var(—hue)) | oklch(0.17 0.015 var(—hue)) |
--codeblock-topbar-bg | 代码块顶部条背景色 | oklch(0.3 0.02 var(—hue)) | oklch(0.12 0.015 var(—hue)) |
--inline-code-bg | 内联代码背景色 | 引用 —btn-regular-bg | 引用 —btn-regular-bg |
--license-block-bg | 许可证块背景色 | rgba(0,0,0,0.03) | 引用 —codeblock-bg |
按钮状态色
| 变量名 | 亮色值 | 深色值 | 说明 |
|---|---|---|---|
--btn-content | oklch(0.55 0.12 var(—hue)) | oklch(0.75 0.1 var(—hue)) | 按钮内容(文字)颜色 |
--btn-regular-bg | oklch(0.95 0.025 var(—hue)) | oklch(0.33 0.035 var(—hue)) | 普通按钮背景色 |
--btn-regular-bg-hover | oklch(0.9 0.05 var(—hue)) | oklch(0.38 0.04 var(—hue)) | 普通按钮悬停色 |
--btn-regular-bg-active | oklch(0.85 0.08 var(—hue)) | oklch(0.43 0.045 var(—hue)) | 普通按钮激活色 |
--btn-plain-bg-hover | oklch(0.95 0.025 var(—hue)) | oklch(0.30 0.035 var(—hue)) | 文字按钮悬停背景 |
--btn-plain-bg-active | oklch(0.98 0.01 var(—hue)) | oklch(0.27 0.025 var(—hue)) | 文字按钮激活背景 |
--btn-card-bg-hover | oklch(0.98 0.005 var(—hue)) | oklch(0.3 0.03 var(—hue)) | 卡片按钮悬停背景色 |
--btn-card-bg-active | oklch(0.9 0.03 var(—hue)) | oklch(0.35 0.035 var(—hue)) | 卡片按钮激活背景色 |
文本相关色
| 变量名 | 亮色值 | 深色值 | 说明 |
|---|---|---|---|
| —deep-text | oklch(0.25 0.02 var(—hue)) | - | 深色文本(暗色主题用) |
| —title-active | oklch(0.6 0.1 var(—hue)) | - | 活跃标题颜色 |
| —inline-code-color | 引用 —btn-content | 引用 —btn-content | 内联代码文字颜色 |
链接相关色
| 变量名 | 描述 | 用途 |
|---|---|---|
--link-underline | 链接下划线色 | 默认链接样式 |
--link-hover | 链接悬停色 | 链接悬停下划线 |
--link-active | 链接激活色 | 链接点击色 |
其他元素色
| 变量名 | 描述 | 用途 |
|---|---|---|
--line-color | 线条颜色 | 虚线分割线等 |
--selection-bg | 文本选中背景 | 文本被选中时的背景 |
--codeblock-selection | 代码块选中背景 | 代码块中选中文本 |
目录 (TOC) 相关色
| 变量名 | 描述 | 用途 |
|---|---|---|
--toc-btn-hover | 目录项悬停色 | TOC 链接悬停状态 |
--toc-btn-active | 目录项激活色 | 当前页面对应 TOC 项 |
--toc-badge-bg | 目录徽章背景 | 标记当前深度的徽章 |
--title-active | 标题激活色 | 当前目录标题 |
--enter-btn-bg | 进入按钮背景 | TOC 进入按钮 |
--enter-btn-bg-active | 进入按钮激活色 | TOC 进入按钮激活 |
滚动条相关色
| 变量名 | 描述 | 模式 |
|---|---|---|
--scrollbar-bg | 自动滚动条颜色 | Auto |
--scrollbar-bg-hover | 自动滚动条悬停 | Auto |
--scrollbar-bg-active | 自动滚动条激活 | Auto |
--scrollbar-bg-dark | 深色模式滚动条 | Dark |
--scrollbar-bg-hover-dark | 深色模式悬停 | Dark |
--scrollbar-bg-active-dark | 深色模式激活 | Dark |
--scrollbar-bg-light | 浅色模式滚动条 | Light |
--scrollbar-bg-hover-light | 浅色模式悬停 | Light |
--scrollbar-bg-active-light | 浅色模式激活 | Light |
布局和间距相关变量
尺寸变量 (Dimensions)
| 变量名 | 值 | 描述 | 文件位置 |
|---|---|---|---|
--page-width | 75rem | 页面最大宽度 | Layout.astro (define |
--radius-large | - | 大圆角尺寸 | 组件中使用 |
--coverWidth | - | 封面宽度 | 组件中使用 |
动画和过渡变量
| 变量名 | 值 | 描述 |
|---|---|---|
--content-delay | 默认/0ms | 内容进入延迟 |
--banner-height | 35vh | Banner 正常高度 |
--banner-height-home | 65vh | 首页 Banner 高度 |
--banner-height-extend | 30vh | Banner 扩展高度 |
--collapsedHeight | - | 折叠元素的高度 |
颜色定义方案
OKLCH 颜色模型
该项目广泛使用 OKLCH(Oklch)颜色模型,这是一种基于色相 (Hue) 的现代颜色空间:
/* OKLCH 语法: oklch(lightness saturation hue) */oklch(0.75 0.14 var(--hue)) /* 明度 75%,饱和度 14%,色相变量 */常见的 OKLCH 配置
| 用途 | OKLCH 值 | 说明 |
|---|---|---|
| 主要强调色 | oklch(0.75 0.14 var(--hue)) | 用于成功/确认类按钮 |
| 常规按钮背景 (浅) | oklch(0.45 0.01 var(--hue)) | 浅色模式按钮 |
| 常规按钮背景 (深) | oklch(0.30 0.02 var(--hue)) | 深色模式默认 |
| 常规按钮悬停 (深) | oklch(0.35 0.03 var(--hue)) | 深色模式悬停 |
| 常规按钮激活 (深) | oklch(0.40 0.03 var(--hue)) | 深色模式激活 |
| 代码块语言标签 | oklch(0.75 0.1 var(--hue)) | 文本颜色 |
| 代码块语言标签背景 | oklch(0.33 0.035 var(--hue)) | 背景颜色 |
主题系统架构
1. 文件组织结构
src/├── styles/│ ├── main.css # 主要 CSS 变量使用和组件定义│ ├── markdown.css # Markdown 内容样式│ ├── scrollbar.css # 滚动条样式│ ├── transition.css # 页面过渡动画│ ├── expressive-code.css # 代码块样式│ └── photoswipe.css # 图片查看器样式├── components/│ ├── GlobalStyles.astro # 全局样式容器│ ├── ConfigCarrier.astro # 主题配置传递│ └── widget/DisplaySettings.svelte # 主题色选择器├── layouts/│ └── Layout.astro # 根布局,定义核心 CSS 变量├── utils/│ └── setting-utils.ts # 主题设置工具函数└── config.ts # 网站配置(包含默认色相值)2. CSS 变量定义层级
第一层:根元素变量定义 (Layout.astro)
// 内联脚本在页面加载时执行document.documentElement.style.setProperty('--hue', hueValue);document.documentElement.style.setProperty('--banner-height-extend', `${offset}px`);第二层:Astro define 动态生成
<style define:vars={{ configHue, 'page-width': `${PAGE_WIDTH}rem`,}}></style>第三层:CSS 中的 var() 引用
.card-base { @apply rounded-[var(--radius-large)] overflow-hidden bg-[var(--card-bg)] transition;}3. 主题切换流程
用户交互 ↓LightDarkSwitch/DisplaySettings 组件 ↓setTheme() / setHue() 函数 (setting-utils.ts) ↓localStorage 存储 ↓修改 DOM (添加/移除 .dark 类) ↓修改 CSS 变量 (--hue) ↓Tailwind dark: 修饰符 + CSS 变量响应式更新 ↓界面即时更新Tailwind CSS 集成
主题配置 (tailwind.config.cjs)
module.exports = { darkMode: "class", // 使用 class 模式实现 dark 主题 theme: { extend: { fontFamily: { sans: ["Roboto", "sans-serif", ...defaultTheme.fontFamily.sans], }, }, }, plugins: [require("@tailwindcss/typography")],}关键特性
-
Dark Mode 实现
- 通过
html.darkclass 控制 - Tailwind
dark:前缀修饰符 - 自动响应
prefers-color-scheme系统偏好
- 通过
-
动态颜色生成
- 使用 CSS 变量 + OKLCH 颜色模型
- 用户可通过滑块调整 0-360° 的色相值
- 保持饱和度和明度不变,只改变色相
-
Typography 插件
- 增强 Markdown 排版样式
- 自动适配 dark/light 模式
详细的颜色定义和变量用途
光明模式 (Light Mode) 默认值
浅色模式通过移除 html.dark class 实现,使用较浅的背景和较深的文字。
/* 代表性颜色值 (概念性,实际通过变量) */--page-bg: 白色 (#ffffff)--card-bg: 浅灰色 (#f5f5f5)--primary: 基于 hue 的 OKLCH 颜色--text: 深灰色 (#333333)深色模式 (Dark Mode) 默认值
深色模式通过添加 html.dark class 实现,使用较深的背景和较浅的文字。
/* 深色模式特定变量 */--page-bg: 黑色 (#000000)--card-bg: 深灰色 (#1a1a1a)--primary: 基于 hue 的 OKLCH 颜色 (更亮)--text: 白色/浅灰色交互状态颜色
| 状态 | 按钮类型 | 变量 | 颜色值 |
|---|---|---|---|
| Normal | Regular | --btn-regular-bg | oklch(0.45 0.01 var(—hue)) |
| Hover | Regular | --btn-regular-bg-hover | oklch(0.50 0.01 var(—hue)) |
| Active | Regular | --btn-regular-bg-active | oklch(0.55 0.01 var(—hue)) |
| Normal (Dark) | Regular | --btn-regular-bg | oklch(0.30 0.02 var(—hue)) |
| Hover (Dark) | Regular | --btn-regular-bg-hover | oklch(0.35 0.03 var(—hue)) |
| Active (Dark) | Regular | --btn-regular-bg-active | oklch(0.40 0.03 var(—hue)) |
实际使用示例
示例 1: 使用 CSS 变量的卡片组件
<div class="card-base"> <!-- 使用 --card-bg 变量设置背景色 --> <!-- 自动适应 light/dark 模式 --></div>对应的 CSS:
.card-base { @apply rounded-[var(--radius-large)] overflow-hidden bg-[var(--card-bg)] transition;}示例 2: 链接样式
a:not(.no-styling) { @apply relative bg-none link font-medium text-[var(--primary)] underline decoration-[var(--link-underline)] decoration-1 decoration-dashed underline-offset-4;
&:hover, &:active { @apply decoration-transparent; background: var(--btn-plain-bg-hover); border-bottom: 1px dashed var(--link-hover); text-decoration: none; }}示例 3: 按钮状态
.btn-plain { @apply transition relative flex items-center justify-center bg-none text-black/75 hover:text-[var(--primary)] dark:text-white/75 dark:hover:text-[var(--primary)];
&:not(.scale-animation) { @apply hover:bg-[var(--btn-plain-bg-hover)] active:bg-[var(--btn-plain-bg-active)] }}代码块 (Expressive Code) 样式
CSS 变量覆盖
在 astro.config.mjs 中定义:
styleOverrides: { codeBackground: "var(--codeblock-bg)", borderRadius: "0.75rem", codeFontSize: "0.875rem", frames: { editorBackground: "var(--codeblock-bg)", terminalBackground: "var(--codeblock-bg)", terminalTitlebarBackground: "var(--codeblock-topbar-bg)", editorTabBarBackground: "var(--codeblock-topbar-bg)", editorActiveTabIndicatorBottomColor: "var(--primary)", }, textMarkers: { delHue: 0, // 删除标记色相 (红色) insHue: 180, // 插入标记色相 (青色) markHue: 250 // 高亮标记色相 (紫色) }}代码块语言标签
使用 OKLCH 颜色和 --hue 变量动态着色:
[data-language]::before { color: oklch(0.75 0.1 var(--hue)); background: oklch(0.33 0.035 var(--hue));}数据持久化
localStorage 键值对
| 键名 | 类型 | 范围 | 示例 |
|---|---|---|---|
theme | String | ”light” | “dark” | “auto" | "dark” |
hue | String | ”0” - “360" | "250” |
初始化流程
- 页面加载时的内联脚本读取 localStorage
- 如果无记录,使用默认值 (auto + config.hue)
- 立即应用到 DOM,防止页面闪烁
const theme = localStorage.getItem('theme') || DEFAULT_THEME;const hue = localStorage.getItem('hue') || configHue;document.documentElement.style.setProperty('--hue', hue);响应式设计
Breakpoints (Tailwind 默认)
sm: 640pxmd: 768pxlg: 1024pxxl: 1280px
布局相关变量
| 变量名 | 值 | 用途 |
|---|---|---|
--page-width | 75rem (1200px) | 内容最大宽度 |
--banner-height | 35vh | 非首页 Banner 高度 |
--banner-height-home | 65vh | 首页 Banner 高度 |
--banner-height-extend | 30vh | Banner 扩展空间 |
字体和排版
字体定义
| 用途 | 字体 | 来源 |
|---|---|---|
| 正文 | Roboto 400/500/700 | @fontsource/roboto |
| 代码块 | JetBrains Mono Variable | Tailwind 配置 |
| 数学公式 | KaTeX Fonts | KaTeX CSS |
字号设置
<html class="text-[14px] md:text-[16px]">- 移动端: 14px
- 桌面端: 16px
动画和过渡
CSS 变量控制
| 变量名 | 值 | 用途 |
|---|---|---|
--content-delay | 150ms | 内容加载延迟 |
关键动画
Fade-in-up 动画
@keyframes fade-in-up { 0% { transform: translateY(2rem); opacity: 0; } 100% { transform: translateY(0); opacity: 1; }}Swup 页面过渡
html.is-changing .transition-swup-fade { @apply transition-all duration-200}html.is-animating .transition-swup-fade { @apply opacity-0 translate-y-4}最佳实践
1. 变量命名规范
--[category]-[element]-[state]--btn-regular-bg-hover--card-bg--primary2. 颜色系统架构
- 基础色:
--primary(通过 hue 变量动态) - 背景色:
--*-bg系列 - 文字色: 通过 dark: 修饰符
- 交互态:
-hover,-active后缀
3. 响应式应用
<!-- Tailwind 提供响应式前缀 --><div class="text-sm md:text-base lg:text-lg"> Dynamic sizing</div>4. 动态颜色计算
// 在 JavaScript 中设置 hueconst hue = 250; // 用户选择的值document.documentElement.style.setProperty('--hue', hue);
// 在 CSS 中引用生成颜色background: oklch(0.45 0.01 var(--hue));总结
Fuwari 博客模板的 Design Tokens 系统是一个完整的、现代化的设计系统,具有以下特点:
- 灵活性: CSS 变量 + JavaScript 动态设置,支持实时主题切换
- 一致性: 统一的变量命名规范和颜色系统
- 可访问性: 支持系统偏好检测和用户自定义
- 性能: 高效的 CSS 变量和 Tailwind CSS 编译
- 可维护性: 清晰的文件组织和模块化设计
所有 CSS 变量都遵循同一套规范,确保整个项目的视觉一致性和易维护性。
Fuwari 博客模板 Design Tokens 完整指南
https://martinlevine.vercel.app/posts/daisy/