关于 tailwind-ui-patterns
为使用 Tailwind CSS v4 构建界面的开发者提供组件、布局、响应式、动画和暗色模式范例,并包含设计令牌与样式组织建议。
主要功能
- 01Tailwind v4 主题令牌
- 02按钮与卡片模式
- 03响应式网格与排版
- 04容器查询
- 05过渡效果与关键帧动画
- 06暗色模式与布局模式
适用场景
- 01设置共享颜色设计令牌
- 02构建按钮变体与卡片
- 03创建移动优先的响应式布局
- 04添加过渡效果与暗色模式样式
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ autohandai/ community-skills --skill tailwind-ui-patterns安装后在 Claude Code 中输入/tailwind-ui-patterns确认已加载。
详细介绍
Tailwind UI 模式
Tailwind v4 设置
/* app.css */
@import "tailwindcss";
/* Custom theme tokens */
@theme {
--color-brand-50: oklch(0.97 0.01 250);
--color-brand-500: oklch(0.55 0.15 250);
--color-brand-900: oklch(0.25 0.08 250);
--font-display: "Cal Sans", system-ui, sans-serif;
--spacing-18: 4.5rem;
}
组件模式
按钮变体
const buttonVariants = {
base: "inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
variant: {
primary: "bg-brand-500 text-white hover:bg-brand-600 focus-visible:ring-brand-500",
secondary: "bg-gray-100 text-gray-900 hover:bg-gray-200 focus-visible:ring-gray-500",
outline: "border border-gray-300 bg-transparent hover:bg-gray-50 focus-visible:ring-gray-500",
ghost: "hover:bg-gray-100 focus-visible:ring-gray-500",
destructive: "bg-red-500 text-white hover:bg-red-600 focus-visible:ring-red-500",
},
size: {
sm: "h-8 px-3 text-sm rounded-md",
md: "h-10 px-4 text-sm rounded-lg",
lg: "h-12 px-6 text-base rounded-lg",
icon: "h-10 w-10 rounded-lg",
},
};
function Button({ variant = "primary", size = "md", className, ...props }) {
return (
<button
className={cn(
buttonVariants.base,
buttonVariants.variant[variant],
buttonVariants.size[size],
className
)}
{...props}
/>
);
}
卡片组件
function Card({ className, ...props }) {
return (
<div
className={cn(
"rounded-xl border border-gray-200 bg-white shadow-sm",
"dark:border-gray-800 dark:bg-gray-950",
className
)}
{...props}
/>
);
}
function CardHeader({ className, ...props }) {
return <div className={cn("p-6 pb-4", className)} {...props} />;
}
function CardContent({ className, ...props }) {
return <div className={cn("p-6 pt-0", className)} {...props} />;
}
function CardFooter({ className, ...props }) {
return (
<div
className={cn("flex items-center p-6 pt-0", className)}
{...props}
/>
);
}
带标签的输入框
function FormField({ label, error, children, className }) {
return (
<div className={cn("space-y-2", className)}>
<label className="text-sm font-medium text-gray-700 dark:text-gray-300">
{label}
</label>
{children}
{error && (
<p className="text-sm text-red-500">{error}</p>
)}
</div>
);
}
function Input({ className, ...props }) {
return (
<input
className={cn(
"flex h-10 w-full rounded-lg border border-gray-300 bg-white px-3 py-2",
"text-sm placeholder:text-gray-400",
"focus:outline-none focus:ring-2 focus:ring-brand-500 focus:border-transparent",
"disabled:cursor-not-allowed disabled:opacity-50",
"dark:border-gray-700 dark:bg-gray-900",
className
)}
{...props}
/>
);
}
响应式模式
移动端优先网格
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
{items.map(item => <Card key={item.id} {...item} />)}
</div>
响应式排版
<h1 className="text-2xl font-bold sm:text-3xl lg:text-4xl xl:text-5xl">
Responsive Heading
</h1>
<p className="text-sm sm:text-base lg:text-lg leading-relaxed">
Body text that scales appropriately
</p>
容器查询
<div className="@container">
<div className="flex flex-col @md:flex-row @md:items-center gap-4">
<img className="w-full @md:w-48 rounded-lg" src={image} alt="" />
<div className="flex-1">
<h3 className="text-lg @lg:text-xl font-semibold">{title}</h3>
<p className="text-gray-600 @lg:text-lg">{description}</p>
</div>
</div>
</div>
动画模式
过渡效果
// Hover transition
<button className="transition-colors duration-200 hover:bg-gray-100">
Hover me
</button>
// Scale on hover
<div className="transition-transform duration-200 hover:scale-105">
Card
</div>
// Combined transitions
<a className="transition-all duration-200 hover:text-brand-500 hover:translate-x-1">
Link with arrow →
</a>
关键帧动画
@theme {
--animate-fade-in: fade-in 0.3s ease-out;
--animate-slide-up: slide-up 0.3s ease-out;
--animate-spin-slow: spin 3s linear infinite;
}
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slide-up {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
<div className="animate-fade-in">Fading content</div>
<div className="animate-slide-up">Sliding content</div>
深色模式
// Toggle component
<div className="bg-white dark:bg-gray-900">
<h1 className="text-gray-900 dark:text-gray-100">
Adaptive heading
</h1>
<p className="text-gray-600 dark:text-gray-400">
Adaptive text
</p>
</div>
// Using CSS variables for theming
@theme {
--color-surface: white;
--color-on-surface: #111827;
}
@media (prefers-color-scheme: dark) {
@theme {
--color-surface: #111827;
--color-on-surface: #f9fafb;
}
}
布局模式
粘性页眉
<header className="sticky top-0 z-50 w-full border-b bg-white/80 backdrop-blur-sm">
<nav className="container mx-auto flex h-16 items-center px-4">
{/* Nav content */}
</nav>
</header>
侧边栏布局
<div className="flex min-h-screen">
<aside className="hidden w-64 border-r bg-gray-50 lg:block">
{/* Sidebar */}
</aside>
<main className="flex-1 p-6">
{/* Main content */}
</main>
</div>
居中的最大宽度内容
<main className="mx-auto max-w-3xl px-4 py-8 sm:px-6 lg:px-8">
{/* Content */}
</main>
最佳实践
- 使用设计令牌,通过 @theme 保持一致性
- 移动端优先——从移动端开始,逐步添加断点
- 使用 cn() 组合——干净地合并类
- 提取组件——当模式重复出现 3 次或以上时
- 使用语义化颜色(brand、surface、error),而非原始值
- 尽可能优先使用工具类,而非自定义 CSS
- 按逻辑对相关工具类分组,以提高可读性
评论
支持 Markdown