主题化组件设计系统Skill theming-components

这个技能提供了设计令牌系统和主题框架,用于跨所有组件实现一致、可定制的UI样式。它包括完整的令牌分类(颜色、排版、间距、阴影、边框、动画、z索引)、主题切换(亮暗模式、高对比度、自定义品牌)、RTL/i18n支持和可访问性功能,是前端开发中UI设计的基础层。关键词:设计令牌、主题系统、CSS变量、UI样式、前端开发、可访问性、RTL支持、品牌定制。

前端开发 0 次安装 2 次浏览 更新于 3/23/2026

name: 主题化组件 description: 提供设计令牌系统和主题框架,用于跨所有组件实现一致、可定制的UI样式。涵盖完整的令牌分类(颜色、排版、间距、阴影、边框、动画、z索引)、主题切换(CSS自定义属性、主题提供者)、RTL/i18n支持(CSS逻辑属性)和可访问性(WCAG对比度、高对比度主题、减少动画)。这是所有组件技能引用的基础样式层。用于主题化组件、实现亮/暗模式、创建品牌样式、自定义视觉设计、确保设计一致性或支持RTL语言。

设计令牌与主题系统

全面的设计令牌系统,为所有组件技能提供基础样式架构,支持品牌定制、主题切换、RTL支持和一致的视觉设计。

概述

设计令牌是所有视觉设计决策的单一真相来源。此技能提供:

  1. 完整的令牌分类:7个核心类别(颜色、排版、间距、边框、阴影、动画、z索引)
  2. 主题切换:亮/暗模式、高对比度、自定义品牌主题
  3. RTL/i18n支持:CSS逻辑属性用于自动支持从右到左的语言
  4. 多平台导出:CSS变量、SCSS、iOS Swift、Android XML、JavaScript
  5. 组件集成:技能链式架构,确保所有组件样式一致

关键架构原则:

组件技能(行为 + 结构)→ 使用令牌进行所有视觉样式
设计令牌(样式变量)       → 定义颜色、间距、排版
主题文件(令牌覆盖)       → 亮、暗、品牌特定值

快速开始

在组件中使用令牌

步骤1:在组件中引用令牌:

.button {
  background-color: var(--button-bg-primary);
  color: var(--button-text-primary);
  padding-inline: var(--button-padding-inline);
  padding-block: var(--button-padding-block);
  border-radius: var(--button-border-radius);
  transition: var(--transition-fast);
}

步骤2:主题自动应用:

<!-- 亮主题 -->
<html data-theme="light">
  <button class="button">主要按钮</button>
</html>

<!-- 暗主题(相同组件,不同外观) -->
<html data-theme="dark">
  <button class="button">主要按钮</button>
</html>

无需代码更改 - 主题切换是自动的!

基本主题切换

function setTheme(themeName) {
  document.documentElement.setAttribute('data-theme', themeName);
  localStorage.setItem('theme', themeName);
}

function toggleTheme() {
  const current = document.documentElement.getAttribute('data-theme');
  setTheme(current === 'dark' ? 'light' : 'dark');
}

// 页面加载时加载保存的主题
setTheme(localStorage.getItem('theme') || 'light');

令牌分类(7个核心类别)

1. 颜色令牌

3层层次:原始 → 语义 → 组件

/* 原始(9色阶) */
--color-blue-500: #3B82F6;

/* 语义(基于用途) */
--color-primary: var(--color-blue-500);
--color-success: var(--color-green-500);
--color-error: var(--color-red-500);

/* 组件特定 */
--button-bg-primary: var(--color-primary);

完整颜色系统: 参见 references/color-system.md

2. 间距令牌

4px基础比例:

--space-1: 4px;   --space-2: 8px;   --space-4: 16px;
--space-6: 24px;  --space-8: 32px;  --space-12: 48px;

/* 语义 */
--spacing-sm: var(--space-2);   /* 8px */
--spacing-md: var(--space-4);   /* 16px */
--spacing-lg: var(--space-6);   /* 24px */

3. 排版令牌

--font-sans: 'Inter', -apple-system, sans-serif;
--font-mono: 'Fira Code', monospace;

--font-size-sm: 14px;
--font-size-base: 16px;
--font-size-lg: 18px;

--font-weight-normal: 400;
--font-weight-semibold: 600;
--font-weight-bold: 700;

4. 边框与圆角令牌

--border-width-thin: 1px;
--border-width-medium: 2px;

--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-full: 9999px;

5. 阴影令牌

--shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.07);
--shadow-md: 0 4px 8px rgba(0, 0, 0, 0.1);
--shadow-lg: 0 8px 16px rgba(0, 0, 0, 0.12);

--shadow-focus-primary: 0 0 0 3px rgba(59, 130, 246, 0.3);

6. 动画令牌

--duration-fast: 150ms;
--duration-normal: 200ms;

--ease-out: cubic-bezier(0, 0, 0.2, 1);
--transition-fast: all var(--duration-fast) var(--ease-out);

减少动画支持:

@media (prefers-reduced-motion: reduce) {
  :root { --transition-fast: none; }
}

7. Z-Index令牌

--z-dropdown: 1000;
--z-modal-backdrop: 1040;
--z-modal: 1050;
--z-tooltip: 1070;

主题架构

亮/暗主题

/* themes/light.css */
:root {
  --color-primary: #3B82F6;
  --color-background: #FFFFFF;
  --color-text-primary: #1F2937;
}

/* themes/dark.css */
:root[data-theme="dark"] {
  --color-primary: #60A5FA;
  --color-background: #111827;
  --color-text-primary: #F9FAFB;
}

自定义品牌主题

:root[data-theme="my-brand"] {
  --color-primary: #FF6B35;
  --font-sans: 'Poppins', sans-serif;
  --radius-md: 12px;
}

完整主题指南: 参见 references/theme-switching.md


CSS逻辑属性(RTL支持)

使用逻辑属性自动支持RTL语言:

物理(避免) 逻辑(使用)
margin-left margin-inline-start
padding-right padding-inline-end
text-align: left text-align: start
/* 正确 - 在RTL中自动翻转 */
.button {
  padding-inline: var(--button-padding-inline);
  margin-inline-start: var(--spacing-sm);
}

完整RTL指南: 参见 references/logical-properties.md


组件集成

所有组件技能使用此命名约定:

--{component}-{property}-{variant?}-{state?}

示例:

--button-bg-primary
--button-bg-primary-hover
--input-border-color-focus
--chart-color-1

组件使用令牌进行所有样式:

.button {
  background-color: var(--button-bg-primary);
  border-radius: var(--button-border-radius);
}

主题更改自动更新所有组件。

完整集成指南: 参见 references/component-integration.md


可访问性

WCAG 2.1 AA 合规

  • 正常文本:最小对比度4.5:1
  • 大文本(18px+):最小对比度3:1
  • UI组件:最小对比度3:1

高对比度主题

:root[data-theme="high-contrast"] {
  --color-primary: #0000FF;
  --color-text-primary: #000000;
  /* 7:1对比度(WCAG AAA) */
}

减少动画

@media (prefers-reduced-motion: reduce) {
  :root {
    --duration-fast: 0ms;
    --transition-fast: none;
  }
}

完整可访问性指南: 参见 references/accessibility-tokens.md


平台导出(样式字典)

将令牌转换到任何平台:

JSON令牌 → 样式字典 → CSS变量
                               → iOS Swift
                               → Android XML
                               → JavaScript
npm run build-tokens

完整设置指南: 参见 references/style-dictionary-setup.md


W3C令牌格式

{
  "color": {
    "primary": {
      "$value": "#3B82F6",
      "$type": "color"
    }
  }
}

脚本

# 从基础颜色生成颜色比例
python scripts/generate_color_scale.py --base "#3B82F6"

# 验证令牌结构
python scripts/validate_tokens.py

# 检查WCAG对比度比例
python scripts/validate_contrast.py

# 构建所有平台
npm run build-tokens

参考资料

核心系统:

  • references/color-system.md - 完整颜色比例和语义
  • references/typography-system.md - 字体比例和字体
  • references/spacing-system.md - 间距比例和节奏

实现:

  • references/theme-switching.md - 亮/暗模式、自定义主题
  • references/component-integration.md - 技能如何使用令牌
  • references/logical-properties.md - RTL支持模式

工具与可访问性:

  • references/style-dictionary-setup.md - 多平台构建
  • references/accessibility-tokens.md - WCAG合规

关键要点

  1. 设计令牌是基础 - 所有视觉样式从令牌流
  2. 3层层次 - 原始 → 语义 → 组件令牌
  3. 7个核心类别 - 颜色、间距、排版、边框、阴影、动画、z索引
  4. 内置主题切换 - 亮、暗、高对比度、自定义品牌
  5. 自动RTL支持 - CSS逻辑属性支持从右到左语言
  6. 可访问性优先 - WCAG合规、减少动画、高对比度
  7. 被所有技能引用 - 每个组件技能使用设计令牌

渐进披露: 此SKILL.md提供概述和快速开始。详细文档在 references/ 目录中。

技能链式架构: 参见 SKILL_CHAINING_ARCHITECTURE.md