generic-react-design-system
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseReact Design System
React设计系统
Design system patterns for React/TypeScript applications.
Extends: Generic Design System - Read base skill for color theory, typography scale, spacing system, and component states.
适用于React/TypeScript应用的设计系统模式。
扩展自: 通用设计系统 - 阅读基础技能文档以了解色彩理论、排版比例、间距系统和组件状态。
Tailwind Configuration
Tailwind配置
js
// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
primary: "var(--primary)",
secondary: "var(--secondary)",
accent: "var(--accent)",
},
spacing: {
18: "72px",
},
borderRadius: {
xl: "16px",
},
},
},
};js
// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
primary: "var(--primary)",
secondary: "var(--secondary)",
accent: "var(--accent)",
},
spacing: {
18: "72px",
},
borderRadius: {
xl: "16px",
},
},
},
};CSS Variables Setup
CSS变量设置
css
:root {
/* Brand - customize per project */
--primary: #3b82f6;
--primary-rgb: 59, 130, 246;
--secondary: #10b981;
--accent: #8b5cf6;
/* Surfaces */
--background: #ffffff;
--foreground: #000000;
--muted: #64748b;
}
[data-theme="dark"] {
--background: #121212;
--foreground: #ffffff;
}css
:root {
/* Brand - customize per project */
--primary: #3b82f6;
--primary-rgb: 59, 130, 246;
--secondary: #10b981;
--accent: #8b5cf6;
/* Surfaces */
--background: #ffffff;
--foreground: #000000;
--muted: #64748b;
}
[data-theme="dark"] {
--background: #121212;
--foreground: #ffffff;
}React Component Patterns
React组件模式
Button Variants
按钮变体
tsx
// Primary
<button className="px-6 py-3 bg-primary text-white rounded-lg shadow
hover:shadow-lg hover:-translate-y-0.5 transition-all">
Primary
</button>
// Secondary
<button className="px-6 py-3 border border-primary text-primary rounded-lg
hover:bg-primary/10 transition-all">
Secondary
</button>
// Ghost
<button className="px-4 py-2 text-muted hover:bg-slate-100 rounded-lg transition-all">
Ghost
</button>tsx
// Primary
<button className="px-6 py-3 bg-primary text-white rounded-lg shadow
hover:shadow-lg hover:-translate-y-0.5 transition-all">
Primary
</button>
// Secondary
<button className="px-6 py-3 border border-primary text-primary rounded-lg
hover:bg-primary/10 transition-all">
Secondary
</button>
// Ghost
<button className="px-4 py-2 text-muted hover:bg-slate-100 rounded-lg transition-all">
Ghost
</button>Input Fields
输入字段
tsx
<input
className="w-full px-4 py-3 bg-white border border-slate-300 rounded-md
focus:border-primary focus:ring-2 focus:ring-primary/50 transition-all"
placeholder="Enter text..."
/>tsx
<input
className="w-full px-4 py-3 bg-white border border-slate-300 rounded-md
focus:border-primary focus:ring-2 focus:ring-primary/50 transition-all"
placeholder="Enter text..."
/>Cards
卡片
tsx
<div className="p-6 bg-white dark:bg-slate-800 rounded-xl shadow-soft">
{/* Card content */}
</div>tsx
<div className="p-6 bg-white dark:bg-slate-800 rounded-xl shadow-soft">
{/* Card content */}
</div>Modals with Framer Motion
使用Framer Motion的模态框
tsx
<motion.div
initial={{ opacity: 0, scale: 0.95 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0.95 }}
className="glass p-8 rounded-2xl max-w-md"
role="dialog"
aria-modal="true"
>
{/* Modal content */}
</motion.div>tsx
<motion.div
initial={{ opacity: 0, scale: 0.95 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0.95 }}
className="glass p-8 rounded-2xl max-w-md"
role="dialog"
aria-modal="true"
>
{/* Modal content */}
</motion.div>Loading Skeleton
加载骨架屏
tsx
<div className="animate-pulse space-y-4">
<div className="h-8 bg-slate-200 dark:bg-slate-700 rounded w-3/4" />
<div className="h-4 bg-slate-200 dark:bg-slate-700 rounded" />
</div>tsx
<div className="animate-pulse space-y-4">
<div className="h-8 bg-slate-200 dark:bg-slate-700 rounded w-3/4" />
<div className="h-4 bg-slate-200 dark:bg-slate-700 rounded" />
</div>Visual Effects
视觉效果
Glassmorphism
毛玻璃效果
css
.glass {
backdrop-filter: blur(12px) saturate(180%);
background: rgba(255, 255, 255, 0.8);
border: 1px solid rgba(148, 163, 184, 0.25);
}
.glass-dark {
background: rgba(255, 255, 255, 0.05);
}css
.glass {
backdrop-filter: blur(12px) saturate(180%);
background: rgba(255, 255, 255, 0.8);
border: 1px solid rgba(148, 163, 184, 0.25);
}
.glass-dark {
background: rgba(255, 255, 255, 0.05);
}Shadows
阴影
css
--shadow-soft: 0 4px 6px rgba(0, 0, 0, 0.1);
--shadow-medium: 0 10px 15px rgba(0, 0, 0, 0.15);
--shadow-floating: 0 25px 50px rgba(0, 0, 0, 0.3);
--shadow-glow: 0 0 20px rgba(var(--primary-rgb), 0.4);css
--shadow-soft: 0 4px 6px rgba(0, 0, 0, 0.1);
--shadow-medium: 0 10px 15px rgba(0, 0, 0, 0.15);
--shadow-floating: 0 25px 50px rgba(0, 0, 0, 0.3);
--shadow-glow: 0 0 20px rgba(var(--primary-rgb), 0.4);Framer Motion Patterns
Framer Motion模式
Hover Lift
悬停抬起效果
tsx
<motion.div
whileHover={{ y: -4 }}
transition={{ type: "spring", stiffness: 300 }}
className="card"
>
{/* Content */}
</motion.div>tsx
<motion.div
whileHover={{ y: -4 }}
transition={{ type: "spring", stiffness: 300 }}
className="card"
>
{/* Content */}
</motion.div>Page Transitions
页面过渡
tsx
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -20 }}
transition={{ duration: 0.2 }}
>
{/* Page content */}
</motion.div>tsx
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -20 }}
transition={{ duration: 0.2 }}
>
{/* Page content */}
</motion.div>Stagger Children
子元素Stagger动画
tsx
const container = {
hidden: { opacity: 0 },
show: {
opacity: 1,
transition: { staggerChildren: 0.1 },
},
};
const item = {
hidden: { opacity: 0, y: 20 },
show: { opacity: 1, y: 0 },
};
<motion.ul variants={container} initial="hidden" animate="show">
{items.map((i) => (
<motion.li key={i} variants={item} />
))}
</motion.ul>;tsx
const container = {
hidden: { opacity: 0 },
show: {
opacity: 1,
transition: { staggerChildren: 0.1 },
},
};
const item = {
hidden: { opacity: 0, y: 20 },
show: { opacity: 1, y: 0 },
};
<motion.ul variants={container} initial="hidden" animate="show">
{items.map((i) => (
<motion.li key={i} variants={item} />
))}
</motion.ul>;Dark Mode Implementation
暗色模式实现
React Context Approach
React Context方案
tsx
// ThemeProvider.tsx
const ThemeContext = createContext<{
theme: "light" | "dark";
toggle: () => void;
}>({ theme: "light", toggle: () => {} });
export function ThemeProvider({ children }: { children: ReactNode }) {
const [theme, setTheme] = useState<"light" | "dark">("light");
useEffect(() => {
document.documentElement.dataset.theme = theme;
}, [theme]);
return (
<ThemeContext.Provider
value={{
theme,
toggle: () => setTheme((t) => (t === "light" ? "dark" : "light")),
}}
>
{children}
</ThemeContext.Provider>
);
}tsx
// ThemeProvider.tsx
const ThemeContext = createContext<{
theme: "light" | "dark";
toggle: () => void;
}>({ theme: "light", toggle: () => {} });
export function ThemeProvider({ children }: { children: ReactNode }) {
const [theme, setTheme] = useState<"light" | "dark">("light");
useEffect(() => {
document.documentElement.dataset.theme = theme;
}, [theme]);
return (
<ThemeContext.Provider
value={{
theme,
toggle: () => setTheme((t) => (t === "light" ? "dark" : "light")),
}}
>
{children}
</ThemeContext.Provider>
);
}System Preference Detection
系统偏好检测
tsx
useEffect(() => {
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)");
setTheme(prefersDark.matches ? "dark" : "light");
prefersDark.addEventListener("change", (e) =>
setTheme(e.matches ? "dark" : "light"),
);
}, []);tsx
useEffect(() => {
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)");
setTheme(prefersDark.matches ? "dark" : "light");
prefersDark.addEventListener("change", (e) =>
setTheme(e.matches ? "dark" : "light"),
);
}, []);Accessibility in React
React中的无障碍设计
Focus States (Tailwind)
焦点状态(Tailwind)
css
*:focus-visible {
@apply outline-2 outline-primary outline-offset-2;
}css
*:focus-visible {
@apply outline-2 outline-primary outline-offset-2;
}Skip Link
跳转链接
tsx
<a
href="#main"
className="sr-only focus:not-sr-only focus:absolute
focus:top-4 focus:left-4 focus:z-50 focus:px-4 focus:py-2
focus:bg-primary focus:text-white focus:rounded"
>
Skip to content
</a>tsx
<a
href="#main"
className="sr-only focus:not-sr-only focus:absolute
focus:top-4 focus:left-4 focus:z-50 focus:px-4 focus:py-2
focus:bg-primary focus:text-white focus:rounded"
>
Skip to content
</a>See Also
另请参阅
- Generic Design System - Tokens, spacing, typography
- Design Patterns - Atomic Design, component docs
- UX Principles - Visual hierarchy, interaction patterns
- 通用设计系统 - 设计令牌、间距、排版
- 设计模式 - 原子设计、组件文档
- UX原则 - 视觉层次、交互模式