Patterns for building design system components using Surface primitives, CVA variants, and consistent styling. Use when building reusable UI components that follow design token architecture. Triggers on Surface component, CVA, class-variance-authority, component variants, design tokens.
构建可复用的组件,利用Surface原语和CVA(class-variance-authority)来使用设计令牌。
适用于所有分层表面的单一组件:
tsx
import { cva, type VariantProps } from class-variance-authority;
import { cn } from @/lib/utils;
const surfaceVariants = cva(
rounded-lg backdrop-blur-sm transition-colors,
{
variants: {
layer: {
panel: bg-tone-cadet/40 border border-tone-jordy/10 shadow-card,
tile: bg-tone-midnight/60 border border-tone-jordy/5,
chip: bg-tone-cyan/10 border border-tone-cyan/20 rounded-full,
deep: bg-tone-void/80,
metric: bg-tone-cadet/20 border border-tone-jordy/8,
glass: bg-glass-bg backdrop-blur-lg border border-glass-border,
},
interactive: {
true: cursor-pointer hover:bg-tone-cadet/50 active:scale-[0.98],
false: ,
},
glow: {
true: shadow-glow,
false: ,
},
},
defaultVariants: {
layer: tile,
interactive: false,
glow: false,
},
}
);
interface SurfaceProps
extends React.HTMLAttributes
VariantProps
export function Surface({
layer,
interactive,
glow,
className,
...props
}: SurfaceProps) {
return (
tsx
仪表盘
活跃
$1,234.56
tsx
const buttonVariants = cva(
inline-flex items-center justify-center rounded-md font-medium transition-all focus-visible:outline-none focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50,
{
variants: {
variant: {
default: bg-primary text-primary-foreground hover:bg-primary/90,
destructive: bg-destructive text-destructive-foreground hover:bg-destructive/90,
outline: border border-input bg-background hover:bg-accent hover:text-accent-foreground,
ghost: hover:bg-accent hover:text-accent-foreground,
link: text-primary underline-offset-4 hover:underline,
cyber: bg-gradient-to-r from-tone-cadet to-tone-azure text-white border border-tone-cyan/30 shadow-glow hover:shadow-glow-lg,
},
size: {
default: h-10 px-4 py-2,
sm: h-9 rounded-md px-3,
lg: h-11 rounded-md px-8,
icon: h-10 w-10,
},
},
defaultVariants: {
variant: default,
size: default,
},
}
);
tsx
const metricVariants = cva(
font-mono tabular-nums,
{
variants: {
size: {
lg: text-3xl font-bold tracking-tight,
md: text-xl font-semibold,
sm: text-base font-medium,
},
trend: {
positive: text-success,
negative: text-destructive,
neutral: text-foreground,
},
},
defaultVariants: {
size: md,
trend: neutral,
},
}
);
interface MetricProps extends VariantProps
value: string | number;
label?: string;
prefix?: string;
suffix?: string;
}
export function Metric({
value,
label,
prefix = ,
suffix = ,
size,
trend,
}: MetricProps) {
return (
tsx
interface CardProps {
title?: string;
description?: string;
action?: React.ReactNode;
children: React.ReactNode;
}
export function Card({ title, description, action, children }: CardProps) { {description}
return (
{(title || action) && (
{title && (
{title}
)}
{description && (
)}
{action}
)}
);
}
tsx
const badgeVariants = cva(
inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium transition-colors,
{
variants: {
variant: {
default: bg-primary/10 text-primary border border-primary/20,
success: bg-success/10 text-success border border-success/20,
warning: bg-warning/10 text-warning border border-warning/20,
destructive: bg-destructive/10 text-destructive border border-destructive/20,
outline: border border-input text-foreground,
},
},
defaultVariants: {
variant: default,
},
}
);
将CVA与条件类结合:
tsx
function StatusIndicator({
status,
size = md
}: {
status: online | offline | away;
size?: sm | md | lg;
}) {
const sizeClasses = {
sm: size-2,
md: size-3,
lg: size-4,
};
const statusClasses = {
online: bg-success animate-pulse,
offline: bg-muted-foreground,
away: bg-warning,
};
return (
className={cn(
rounded-full,
sizeClasses[size],
statusClasses[status]
)}
/>
);
}
相关技能
tsx
// 1. 使用CVA定义变体
const variants = cva(base-classes, {
variants: {
size: { sm: ..., md: ..., lg: ... },
color: { primary: ..., secondary: ... },
},
defaultVariants: { size: md, color: primary },
});
// 2. 从变体类型化props
interface Props extends VariantProps
// 3. 在组件中应用
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 design-system-components-1776419997 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 design-system-components-1776419997 技能
skillhub install design-system-components-1776419997
文件大小: 4.14 KB | 发布时间: 2026-4-17 19:12