furniture-3d-system-Wu/docs/design-guide.md
WuYongJie ff41839238 feat: 实现Apple风格UI系统和产品上传功能
- 完整实现Apple HIG 2025设计系统
- 添加Modal弹窗组件(毛玻璃效果、流畅动画)
- 添加FileUpload文件上传组件(拖拽、批量上传、进度显示)
- 实现产品上传功能(支持DWG/GLB/GLTF文件)
- 优化产品列表展示(可折叠的产品+SKU结构)
- 实现Tab切换功能(3D模型管理、五金件、BOM、文档)
- 修复主题系统hydration错误
- 优化按钮和间距,符合Apple设计规范
- 添加分享页面的Apple风格重设计
- 创建测试数据脚本
2025-12-12 20:16:41 +08:00

10 KiB
Raw Blame History

Apple 风格 UI 设计系统指南

基于 Apple Human Interface Guidelines 2025 的完整设计系统实现指南。

🎨 设计理念

核心原则

  1. 清晰性 (Clarity) - 文本清晰易读,图标精确表意,装饰恰到好处
  2. 遵从性 (Deference) - 流畅的动效和清晰的界面帮助用户理解内容
  3. 深度感 (Depth) - 视觉层次和逼真的动效传达活力,增强理解

设计价值观

  • 美学完整性 - 外观和行为与功能完美结合
  • 一致性 - 使用熟悉的标准和范式
  • 直接操作 - 直观的界面让用户感觉直接操控内容
  • 反馈 - 确认操作并显示结果
  • 隐喻 - 虚拟对象和操作是现实世界的隐喻
  • 用户控制 - 用户而非应用程序发起和控制操作

🎯 Liquid Glass 材质系统

材质变体

我们的设计系统提供三种 Liquid Glass 材质效果:

1. Subtle Glass (微妙玻璃)

background: rgba(255, 255, 255, 0.60);
backdrop-filter: blur(10px) saturate(150%);
  • 使用场景: 背景元素、次要信息面板
  • 特点: 轻微模糊,不干扰主要内容

2. Standard Glass (标准玻璃)

background: rgba(255, 255, 255, 0.72);
backdrop-filter: blur(20px) saturate(180%);
  • 使用场景: 卡片、模态框、导航栏
  • 特点: 平衡的透明度和模糊效果

3. Enhanced Glass (增强玻璃)

background: rgba(255, 255, 255, 0.85);
backdrop-filter: blur(30px) saturate(200%);
  • 使用场景: 重要的 UI 元素、侧边栏
  • 特点: 更强的视觉层次感

使用指南

  1. 层次结构: 使用不同强度的玻璃效果建立视觉层次
  2. 内容可读性: 确保文本在玻璃背景上清晰可读
  3. 性能考虑: 避免过度使用,影响渲染性能
  4. 深色模式: 自动适配深色背景色值

🌈 颜色系统

系统颜色

我们严格遵循 Apple 系统颜色规范:

颜色 浅色模式 深色模式 用途
Blue #007AFF #0A84FF 主要操作、链接
Green #34C759 #32D74B 成功状态
Red #FF3B30 #FF453A 错误、危险操作
Orange #FF9500 #FF9F0A 警告状态
Yellow #FFCC00 #FFD60A 注意、提醒
Purple #AF52DE #BF5AF2 创意、个性化

语义化颜色

// 背景颜色
--color-background-primary: 主要背景
--color-background-secondary: 次要背景  
--color-background-tertiary: 第三级背景

// 文本颜色
--color-label-primary: 主要文本
--color-label-secondary: 次要文本
--color-label-tertiary: 第三级文本

// 分隔线
--color-separator: 分隔线颜色

对比度标准

  • WCAG AA: 4.5:1 (普通文本), 3:1 (大文本)
  • WCAG AAA: 7:1 (普通文本), 4.5:1 (大文本)

✍️ 字体系统

字体栈

我们使用合法的系统字体栈,避免版权问题:

/* 系统字体栈 */
font-family: -apple-system, BlinkMacSystemFont, Inter, 'Segoe UI', Roboto, sans-serif;

/* 中文优化字体栈 */
font-family: -apple-system, BlinkMacSystemFont, Inter, 'Noto Sans CJK SC', 'PingFang SC', sans-serif;

/* 等宽字体栈 */
font-family: 'SF Mono', Monaco, Consolas, 'Liberation Mono', monospace;

文本样式层次

样式 尺寸 行高 用途
Large Title 34px 41px 页面主标题
Title 1 28px 34px 章节标题
Title 2 22px 28px 子章节标题
Title 3 20px 25px 小标题
Headline 17px 22px 强调文本
Body 17px 25px 正文内容
Callout 16px 21px 突出信息
Subhead 15px 20px 副标题
Footnote 13px 18px 脚注
Caption 1 12px 16px 说明文字
Caption 2 11px 13px 最小说明文字

📐 间距系统

4px 基础网格

所有间距都基于 4px 的基础网格:

const spacing = {
  1: '4px',   // 最小间距
  2: '8px',   // 紧密间距
  3: '12px',  // 小间距
  4: '16px',  // 标准间距
  5: '20px',  // 中等间距
  6: '24px',  // 大间距
  8: '32px',  // 很大间距
  12: '48px', // 超大间距
}

圆角系统

尺寸 值 用途
Small 6px 小组件
Medium 10px 中等组件
Large 16px 大组件
XLarge 20px 超大组件

触摸目标

  • 最小尺寸: 44px × 44px (Apple 标准)
  • 舒适尺寸: 48px × 48px
  • 大尺寸: 56px × 56px

🎬 动画系统

动画时长

const duration = {
  fast: '150ms',    // 快速交互
  normal: '250ms',  // 标准动画
  slow: '350ms',    // 慢速动画
  slower: '500ms',  // 很慢动画
}

缓动函数

/* Apple 标准缓动 */
--ease-out: cubic-bezier(0.25, 0.1, 0.25, 1);
--ease-in-out: cubic-bezier(0.42, 0, 0.58, 1);
--spring: cubic-bezier(0.5, 1.5, 0.5, 1);

动画原则

  1. 有意义: 每个动画都应该有明确的目的
  2. 自然: 模拟现实世界的物理规律
  3. 快速: 不阻碍用户操作
  4. 一致: 相似的操作使用相似的动画

📱 响应式设计

断点系统

const breakpoints = {
  mobile: '375px',    // iPhone 标准宽度
  tablet: '768px',    // iPad 竖屏
  desktop: '1024px',  // iPad 横屏 / 小桌面
  large: '1440px',    // 大桌面
}

安全区域

支持 iPhone 刘海屏和 iPad 圆角:

padding-top: env(safe-area-inset-top);
padding-right: env(safe-area-inset-right);
padding-bottom: env(safe-area-inset-bottom);
padding-left: env(safe-area-inset-left);

♿ 可访问性

键盘导航

  • Tab: 在可聚焦元素间导航
  • Enter/Space: 激活按钮和链接
  • Arrow Keys: 在列表和菜单中导航
  • Escape: 关闭模态框和菜单

ARIA 属性

// 基本 ARIA 属性
aria-label="描述性标签"
aria-describedby="详细描述ID"
aria-expanded="true/false"
aria-selected="true/false"
role="button/dialog/menu"

对比度要求

  • 确保文本与背景的对比度符合 WCAG AA 标准
  • 提供高对比度模式支持
  • 使用图标和形状辅助颜色信息

🧩 组件使用指南

Button 按钮

// 基本用法
<Button variant="filled">主要操作</Button>
<Button variant="tinted">次要操作</Button>
<Button variant="gray">中性操作</Button>
<Button variant="plain">文本按钮</Button>

// 尺寸和状态
<Button size="large" loading>加载中...</Button>
<Button disabled>禁用状态</Button>

// 可访问性
<Button 
  ariaLabel="保存文档"
  shortcut="Cmd+S"
  primary
>
  保存
</Button>

Input 输入框

// 基本用法
<Input
  label="用户名"
  placeholder="请输入用户名"
  helperText="用户名必须唯一"
/>

// 状态和验证
<Input
  label="邮箱"
  type="email"
  state="error"
  errorText="请输入有效的邮箱地址"
  required
/>

Card 卡片

// 基本卡片
<Card variant="standard">
  <div className="p-6">
    <Title3>卡片标题</Title3>
    <Body>卡片内容</Body>
  </div>
</Card>

// 交互式卡片
<Card interactive onClick={handleClick}>
  <div className="p-6">
    <Title3>可点击卡片</Title3>
  </div>
</Card>

🚀 性能优化

组件优化

  1. React.memo: 避免不必要的重渲染
  2. useCallback: 优化事件处理器
  3. useMemo: 缓存计算结果
  4. 懒加载: 按需加载组件

动画优化

/* GPU 加速 */
will-change: transform;
transform: translateZ(0);

/* 避免重排重绘 */
transform: scale(0.95); /* 而不是改变 width/height */
opacity: 0.8; /* 而不是改变 background-color */

虚拟滚动

对于大数据量列表,使用 VirtualList 组件:

<VirtualList
  items={largeDataSet}
  itemHeight={60}
  height={400}
  renderItem={(item, index) => (
    <div key={item.id}>
      {item.name}
    </div>
  )}
/>

📚 最佳实践

1. 组件组合

优先使用组件组合而不是复杂的单一组件:

// 好的做法
<Card>
  <CardHeader>
    <CardTitle>标题</CardTitle>
  </CardHeader>
  <CardContent>
    内容
  </CardContent>
  <CardActions>
    <Button>操作</Button>
  </CardActions>
</Card>

// 避免的做法
<ComplexCard 
  title="标题"
  content="内容"
  actions={[{label: "操作"}]}
/>

2. 状态管理

使用适当的状态管理模式:

// 简单状态
const [isOpen, setIsOpen] = useState(false)

// 复杂状态
const modal = useModal()
const toast = useToast()

3. 错误处理

提供友好的错误状态:

<ErrorEmptyState 
  onRetry={handleRetry}
/>

4. 加载状态

使用骨架屏而不是简单的加载指示器:

{loading ? (
  <CardSkeleton />
) : (
  <Card>内容</Card>
)}

🔧 开发工具

设计令牌

import { 
  appleTypographyTokens,
  appleColorTokens,
  appleSpacingTokens,
  appleAnimationTokens 
} from '@/lib/design-tokens'

工具函数

import { cn } from '@/lib/utils'
import { validateTouchTarget, validateContrastRatio } from '@/lib/accessibility'
import { useDebounce, useVirtualScroll } from '@/lib/performance'

响应式工具

import { 
  useBreakpoint,
  useMediaQuery,
  useSafeArea 
} from '@/lib/responsive'

📖 迁移指南

从传统 CSS 迁移

  1. 替换内联样式:

    // 之前
    <div style={{padding: '16px', borderRadius: '8px'}}>
    
    // 之后
    <div className="p-apple-4 rounded-apple-md">
    
  2. 使用设计令牌:

    // 之前
    <div style={{color: '#007AFF'}}>
    
    // 之后
    <div className="text-apple-blue-light">
    
  3. 应用组件:

    // 之前
    <button className="btn btn-primary">
    
    // 之后
    <Button variant="filled">
    

渐进式升级

  1. 从最常用的组件开始(Button、Input)
  2. 逐步替换页面级组件
  3. 最后处理复杂的交互组件

🎯 总结

这个 Apple 风格 UI 设计系统提供了:

  • ✅ 完整的设计令牌系统
  • ✅ 19+ 个高质量组件
  • ✅ 完整的可访问性支持
  • ✅ 性能优化最佳实践
  • ✅ 响应式设计支持
  • ✅ 深色模式支持

通过遵循这些指南,您可以创建出符合 Apple 标准、用户友好、性能优秀的现代 Web 应用程序。


最后更新: 2025-12-11 版本: 1.0.0