设计系统启动器 design-system-starter

这个技能提供了全面的指导,用于构建健壮、可扩展的设计系统,确保视觉一致性,提高开发速度,并创造卓越的用户体验。

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

设计系统启动器

概览

这个技能提供了全面的指导,用于构建健壮、可扩展的设计系统,确保视觉一致性,提高开发速度,并创造卓越的用户体验。无论是从头开始还是演进现有系统,这个框架帮助团队有意图地设计和扩展。

何时使用这个技能:

  • 从零开始创建新的设计系统
  • 演进或重构现有设计系统
  • 建立设计令牌标准
  • 定义组件架构
  • 创建设计文档
  • 确保可访问性合规性(WCAG 2.1)
  • 实施主题和暗色模式

捆绑资源:

  • references/component-examples.md - 完整的组件实现
  • templates/design-tokens-template.json - W3C设计令牌格式
  • templates/component-template.tsx - React组件模板
  • checklists/design-system-checklist.md - 设计系统审核清单

设计系统哲学

什么是设计系统?

设计系统不仅仅是组件库——它是以下内容的集合:

  1. 设计令牌:基本设计决策(颜色、间距、排版)
  2. 组件:可重用的UI构建块
  3. 模式:常见的UX解决方案和组合
  4. 指南:规则、原则和最佳实践
  5. 文档:如何有效使用所有内容

核心原则

1. 一致性优于创造力

  • 可预测的模式减少认知负荷
  • 用户一次学习,到处应用
  • 设计师和开发者使用相同的语言

2. 默认可访问性

  • WCAG 2.1 Level AA合规性最低
  • 内置键盘导航
  • 从一开始就支持屏幕阅读器

3. 可扩展和可维护

  • 设计令牌启用全局更改
  • 组件组合减少重复
  • 版本控制和弃用策略

4. 开发者友好

  • 清晰的API契约
  • 全面文档
  • 易于集成和定制

设计令牌

设计令牌是定义您系统视觉语言的原子设计决策。

令牌类别

1. 颜色令牌

原始颜色(原始值):

{
  "color": {
    "primitive": {
      "blue": {
        "50": "#eff6ff",
        "100": "#dbeafe",
        "200": "#bfdbfe",
        "300": "#93c5fd",
        "400": "#60a5fa",
        "500": "#3b82f6",
        "600": "#2563eb",
        "700": "#1d4ed8",
        "800": "#1e40af",
        "900": "#1e3a8a",
        "950": "#172554"
      }
    }
  }
}

语义颜色(上下文含义):

{
  "color": {
    "semantic": {
      "brand": {
        "primary": "{color.primitive.blue.600}",
        "primary-hover": "{color.primitive.blue.700}",
        "primary-active": "{color.primitive.blue.800}"
      },
      "text": {
        "primary": "{color.primitive.gray.900}",
        "secondary": "{color.primitive.gray.600}",
        "tertiary": "{color.primitive.gray.500}",
        "disabled": "{color.primitive.gray.400}",
        "inverse": "{color.primitive.white}"
      },
      "background": {
        "primary": "{color.primitive.white}",
        "secondary": "{color.primitive.gray.50}",
        "tertiary": "{color.primitive.gray.100}"
      },
      "feedback": {
        "success": "{color.primitive.green.600}",
        "warning": "{color.primitive.yellow.600}",
        "error": "{color.primitive.red.600}",
        "info": "{color.primitive.blue.600}"
      }
    }
  }
}

可访问性:确保颜色对比度符合WCAG 2.1 Level AA:

  • 正常文本:4.5:1最低
  • 大号文本(18pt+或14pt+粗体):3:1最低
  • UI组件和图形:3:1最低

2. 排版令牌

{
  "typography": {
    "fontFamily": {
      "sans": "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
      "serif": "'Georgia', 'Times New Roman', serif",
      "mono": "'Fira Code', 'Courier New', monospace"
    },
    "fontSize": {
      "xs": "0.75rem",     // 12px
      "sm": "0.875rem",    // 14px
      "base": "1rem",      // 16px
      "lg": "1.125rem",    // 18px
      "xl": "1.25rem",     // 20px
      "2xl": "1.5rem",     // 24px
      "3xl": "1.875rem",   // 30px
      "4xl": "2.25rem",    // 36px
      "5xl": "3rem"        // 48px
    },
    "fontWeight": {
      "normal": 400,
      "medium": 500,
      "semibold": 600,
      "bold": 700
    },
    "lineHeight": {
      "tight": 1.25,
      "normal": 1.5,
      "relaxed": 1.75,
      "loose": 2
    },
    "letterSpacing": {
      "tight": "-0.025em",
      "normal": "0",
      "wide": "0.025em"
    }
  }
}

3. 间距令牌

比例:使用一致的间距比例(通常为4px或8px基础)

{
  "spacing": {
    "0": "0",
    "1": "0.25rem",   // 4px
    "2": "0.5rem",    // 8px
    "3": "0.75rem",   // 12px
    "4": "1rem",      // 16px
    "5": "1.25rem",   // 20px
    "6": "1.5rem",    // 24px
    "8": "2rem",      // 32px
    "10": "2.5rem",   // 40px
    "12": "3rem",     // 48px
    "16": "4rem",     // 64px
    "20": "5rem",     // 80px
    "24": "6rem"      // 96px
  }
}

组件特定间距

{
  "component": {
    "button": {
      "padding-x": "{spacing.4}",
      "padding-y": "{spacing.2}",
      "gap": "{spacing.2}"
    },
    "card": {
      "padding": "{spacing.6}",
      "gap": "{spacing.4}"
    }
  }
}

4. 边框半径令牌

{
  "borderRadius": {
    "none": "0",
    "sm": "0.125rem",   // 2px
    "base": "0.25rem",  // 4px
    "md": "0.375rem",   // 6px
    "lg": "0.5rem",     // 8px
    "xl": "0.75rem",    // 12px
    "2xl": "1rem",      // 16px
    "full": "9999px"
  }
}

5. 阴影令牌

{
  "shadow": {
    "xs": "0 1px 2px 0 rgba(0, 0, 0, 0.05)",
    "sm": "0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)",
    "base": "0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)",
    "md": "0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)",
    "lg": "0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)",
    "xl": "0 25px 50px -12px rgba(0, 0, 0, 0.25)"
  }
}

组件架构

原子设计方法论

原子分子有机体模板页面

原子(原始组件)

基本构建块,不能再进一步分解。

示例:

  • 按钮
  • 输入
  • 标签
  • 图标
  • 徽章
  • 头像

按钮组件:

interface ButtonProps {
  variant?: 'primary' | 'secondary' | 'outline' | 'ghost';
  size?: 'sm' | 'md' | 'lg';
  disabled?: boolean;
  loading?: boolean;
  icon?: React.ReactNode;
  children: React.ReactNode;
}

查看references/component-examples.md以获得完整的按钮实现,包括变体、大小和样式模式。

分子(简单组合)

一组原子,共同发挥作用。

示例:

  • 搜索栏(输入+按钮)
  • 表单字段(标签+输入+错误消息)
  • 卡片(容器+标题+内容+操作)

表单字段分子:

interface FormFieldProps {
  label: string;
  name: string;
  error?: string;
  hint?: string;
  required?: boolean;
  children: React.ReactNode;
}

查看references/component-examples.md以获得表单字段、卡片(复合组件模式)、输入变体、模态框等组合示例。

有机体(复杂组合)

由分子和原子组成的复杂UI组件。

示例:

  • 导航栏
  • 产品卡片网格
  • 用户个人资料部分
  • 模态对话框

模板(页面布局)

定义内容放置的页面级结构。

示例:

  • 仪表板布局(侧边栏+标题栏+主要内容)
  • 营销页面布局(英雄+功能+页脚)
  • 设置页面布局(标签+内容面板)

页面(特定实例)

实际页面,包含真实内容。


组件API设计

道具最佳实践

1. 可预测的道具名称

// ✅ 好:一致的命名
<Button variant="primary" size="md" />
<Input variant="outlined" size="md" />

// ❌ 坏:不一致
<Button type="primary" sizeMode="md" />
<Input style="outlined" inputSize="md" />

2. 合理的默认值

// ✅ 好:提供默认值
interface ButtonProps {
  variant?: 'primary' | 'secondary';  // 默认:primary
  size?: 'sm' | 'md' | 'lg';          // 默认:md
}

// ❌ 坏:全部必需
interface ButtonProps {
  variant: 'primary' | 'secondary';
  size: 'sm' | 'md' | 'lg';
  color: string;
  padding: string;
}

3. 组合优于配置

// ✅ 好:可组合
<Card>
  <Card.Header>
    <Card.Title>Title</Card.Title>
  </Card.Header>
  <Card.Body>Content</Card.Body>
  <Card.Footer>Actions</Card.Footer>
</Card>

// ❌ 坏:太多道具
<Card
  title="Title"
  content="Content"
  footerContent="Actions"
  hasHeader={true}
  hasFooter={true}
/>

4. 多态组件 允许组件作为不同的HTML元素渲染:

<Button as="a" href="/login">Login</Button>
<Button as="button" onClick={handleClick}>Click Me</Button>

查看references/component-examples.md以获得完整的多态组件TypeScript模式。


主题和暗色模式

主题结构

interface Theme {
  colors: {
    brand: {
      primary: string;
      secondary: string;
    };
    text: {
      primary: string;
      secondary: string;
    };
    background: {
      primary: string;
      secondary: string;
    };
    feedback: {
      success: string;
      warning: string;
      error: string;
      info: string;
    };
  };
  typography: {
    fontFamily: {
      sans: string;
      mono: string;
    };
    fontSize: Record<string, string>;
  };
  spacing: Record<string, string>;
  borderRadius: Record<string, string>;
  shadow: Record<string, string>;
}

暗色模式实现

方法1:CSS变量

:root {
  --color-bg-primary: #ffffff;
  --color-text-primary: #000000;
}

[data-theme="dark"] {
  --color-bg-primary: #1a1a1a;
  --color-text-primary: #ffffff;
}

方法2:Tailwind CSS暗色模式

<div className="bg-white dark:bg-gray-900 text-gray-900 dark:text-white">
  Content
</div>

方法3:Styled Components ThemeProvider

const lightTheme = { background: '#fff', text: '#000' };
const darkTheme = { background: '#000', text: '#fff' };

<ThemeProvider theme={isDark ? darkTheme : lightTheme}>
  <App />
</ThemeProvider>

可访问性指南

WCAG 2.1 Level AA合规性

颜色对比度

  • 正常文本(< 18pt):4.5:1最低
  • 大号文本(≥ 18pt或≥ 14pt粗体):3:1最低
  • UI组件:3:1最低

工具:使用对比度检查器,如WebAIM Contrast Checker

键盘导航

// ✅ 所有交互元素必须可通过键盘访问
<button
  onClick={handleClick}
  onKeyDown={(e) => e.key === 'Enter' && handleClick()}
>
  Click me
</button>

// ✅ 焦点管理
<Modal>
  <FocusTrap>
    {/* 模态框内容 */}
  </FocusTrap>
</Modal>

ARIA属性

基本ARIA模式:

  • aria-label:提供可访问名称
  • aria-expanded:传达展开/折叠状态
  • aria-controls:关联控件与内容
  • aria-live:宣布动态内容变化

屏幕阅读器支持

  • 使用语义HTML元素(<button>, <nav>, <main>
  • 避免为交互元素使用div/span汤
  • 为所有控件提供有意义的标签

查看references/component-examples.md以获得包括跳过链接、焦点陷阱和ARIA模式在内的完整可访问性示例。


文档标准

组件文档模板

每个组件应记录:

  • 目的:组件的作用
  • 用法:导入语句和基本示例
  • 变体:可用的视觉样式
  • 道具:完整的道具表,包括类型、默认值、描述
  • 可访问性:键盘支持、ARIA属性、屏幕阅读器行为
  • 示例:常见用例及代码

使用Storybook、Docusaurus或类似工具进行交互式文档。

查看templates/component-template.tsx以获得标准组件结构。


设计系统工作流程

1. 设计阶段

  • 审核现有模式:识别不一致性
  • 定义设计令牌:颜色、排版、间距
  • 创建组件清单:列出所有需要的组件
  • 在Figma中设计:创建组件库

2. 开发阶段

  • 设置工具:Storybook、TypeScript、测试
  • 实施令牌:CSS变量或主题配置
  • 首先构建原子:从原语开始
  • 向上组合:构建分子、有机体
  • 边做边记录:编写文档

3. 采用阶段

  • 创建迁移指南:帮助团队采用
  • 提供codemods:尽可能自动化迁移
  • 举办研讨会:培训团队使用
  • 收集反馈:根据实际使用进行迭代

4. 维护阶段

  • 语义化版本控制:主要/次要/补丁版本
  • 弃用策略:逐步淘汰旧组件
  • 更改日志:记录所有更改
  • 监控采用情况:跟踪产品中的使用情况

与代理集成

快速UI设计器

  • 使用设计令牌创建一致的界面
  • 引用组件库进行快速原型设计
  • 自动应用可访问性指南

前端UI开发人员

  • 根据设计系统模式实现组件
  • 确保与现有设计语言保持一致
  • 验证颜色对比度和可访问性

代码质量审查员

  • 检查组件是否遵循设计系统标准
  • 验证设计令牌的适当使用
  • 确保满足可访问性要求

快速开始清单

创建新设计系统时:

  • [ ] 定义设计原则和价值观
  • [ ] 建立设计令牌结构(颜色、排版、间距)
  • [ ] 创建原始色彩调色板(50-950规模)
  • [ ] 定义语义色彩令牌(品牌、文本、背景、反馈)
  • [ ] 设置排版规模和字体系列
  • [ ] 建立间距比例(4px或8px基础)
  • [ ] 设计原子组件(按钮、输入、标签等)
  • [ ] 实施主题系统(浅色/暗色模式)
  • [ ] 确保WCAG 2.1 Level AA合规性
  • [ ] 设置文档(Storybook或类似)
  • [ ] 为每个组件创建使用示例
  • [ ] 建立版本控制和发布策略
  • [ ] 为采用团队创建迁移指南

技能版本:1.0.0 最后更新:2025-10-31 维护者:AI代理中心团队