tailwind-4 by prowler-cloud/prowler
npx skills add https://github.com/prowler-cloud/prowler --skill tailwind-4Tailwind 类是否存在? → className="..."
动态值? → style={{ width: `${x}%` }}
条件样式? → cn("base", condition && "variant")
仅静态样式? → className="..." (无需 cn())
库无法使用类? → 使用带有 var() 常量的 style 属性
// ❌ 绝不允许:在 className 中使用 var()
<div className="bg-[var(--color-primary)]" />
<div className="text-[var(--text-color)]" />
// ✅ 始终:使用 Tailwind 语义类
<div className="bg-primary" />
<div className="text-slate-400" />
// ❌ 绝不允许:在 className 中使用十六进制颜色
<p className="text-[#ffffff]" />
<div className="bg-[#1e293b]" />
// ✅ 始终:使用 Tailwind 颜色类
<p className="text-white" />
<div className="bg-slate-800" />
import { clsx } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
// ✅ 条件类
<div className={cn("base-class", isActive && "active-class")} />
// ✅ 合并可能冲突的类
<button className={cn("px-4 py-2", className)} /> // className 可能会覆盖
// ✅ 多个条件
<div className={cn(
"rounded-lg border",
variant === "primary" && "bg-blue-500 text-white",
variant === "secondary" && "bg-gray-200 text-gray-800",
disabled && "opacity-50 cursor-not-allowed"
)} />
// ❌ 静态类 - 不必要的包装器
<div className={cn("flex items-center gap-2")} />
// ✅ 直接使用 className
<div className="flex items-center gap-2" />
当库不接受 className 时(例如 Recharts):
// ✅ 使用 var() 的常量 - 仅用于库的属性
const CHART_COLORS = {
primary: "var(--color-primary)",
secondary: "var(--color-secondary)",
text: "var(--color-text)",
gridLine: "var(--color-border)",
};
// 在 Recharts 中使用(无法使用 className)
<XAxis tick={{ fill: CHART_COLORS.text }} />
<CartesianGrid stroke={CHART_COLORS.gridLine} />
// ✅ 使用 style 属性处理真正的动态值
<div style={{ width: `${percentage}%` }} />
<div style={{ opacity: isVisible ? 1 : 0 }} />
// ✅ 使用 CSS 自定义属性进行主题化
<div style={{ "--progress": `${value}%` } as React.CSSProperties} />
<div className="flex items-center justify-between gap-4" />
<div className="flex flex-col gap-2" />
<div className="inline-flex items-center" />
<div className="grid grid-cols-3 gap-4" />
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6" />
// 内边距
<div className="p-4" /> // 所有边
<div className="px-4 py-2" /> // 水平,垂直
<div className="pt-4 pb-2" /> // 顶部,底部
// 外边距
<div className="m-4" />
<div className="mx-auto" /> // 水平居中
<div className="mt-8 mb-4" />
<h1 className="text-2xl font-bold text-white" />
<p className="text-sm text-slate-400" />
<span className="text-xs font-medium uppercase tracking-wide" />
<div className="rounded-lg border border-slate-700" />
<div className="rounded-full shadow-lg" />
<div className="ring-2 ring-blue-500 ring-offset-2" />
<button className="hover:bg-blue-600 focus:ring-2 active:scale-95" />
<input className="focus:border-blue-500 focus:outline-none" />
<div className="group-hover:opacity-100" />
<div className="w-full md:w-1/2 lg:w-1/3" />
<div className="hidden md:block" />
<div className="text-sm md:text-base lg:text-lg" />
<div className="bg-white dark:bg-slate-900" />
<p className="text-gray-900 dark:text-white" />
// ✅ 可用于设计系统中没有的一次性值
<div className="w-[327px]" />
<div className="top-[117px]" />
<div className="grid-cols-[1fr_2fr_1fr]" />
// ❌ 不要用于颜色 - 应使用主题
<div className="bg-[#1e293b]" /> // 禁止
每周安装量
169
代码仓库
GitHub 星标
13.4K
首次出现
2026年1月20日
安全审计
安装于
opencode156
gemini-cli149
claude-code144
cursor143
codex141
github-copilot136
Tailwind class exists? → className="..."
Dynamic value? → style={{ width: `${x}%` }}
Conditional styles? → cn("base", condition && "variant")
Static only? → className="..." (no cn() needed)
Library can't use class?→ style prop with var() constants
// ❌ NEVER: var() in className
<div className="bg-[var(--color-primary)]" />
<div className="text-[var(--text-color)]" />
// ✅ ALWAYS: Use Tailwind semantic classes
<div className="bg-primary" />
<div className="text-slate-400" />
// ❌ NEVER: Hex colors in className
<p className="text-[#ffffff]" />
<div className="bg-[#1e293b]" />
// ✅ ALWAYS: Use Tailwind color classes
<p className="text-white" />
<div className="bg-slate-800" />
import { clsx } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
// ✅ Conditional classes
<div className={cn("base-class", isActive && "active-class")} />
// ✅ Merging with potential conflicts
<button className={cn("px-4 py-2", className)} /> // className might override
// ✅ Multiple conditions
<div className={cn(
"rounded-lg border",
variant === "primary" && "bg-blue-500 text-white",
variant === "secondary" && "bg-gray-200 text-gray-800",
disabled && "opacity-50 cursor-not-allowed"
)} />
// ❌ Static classes - unnecessary wrapper
<div className={cn("flex items-center gap-2")} />
// ✅ Just use className directly
<div className="flex items-center gap-2" />
When libraries don't accept className (like Recharts):
// ✅ Constants with var() - ONLY for library props
const CHART_COLORS = {
primary: "var(--color-primary)",
secondary: "var(--color-secondary)",
text: "var(--color-text)",
gridLine: "var(--color-border)",
};
// Usage with Recharts (can't use className)
<XAxis tick={{ fill: CHART_COLORS.text }} />
<CartesianGrid stroke={CHART_COLORS.gridLine} />
// ✅ style prop for truly dynamic values
<div style={{ width: `${percentage}%` }} />
<div style={{ opacity: isVisible ? 1 : 0 }} />
// ✅ CSS custom properties for theming
<div style={{ "--progress": `${value}%` } as React.CSSProperties} />
<div className="flex items-center justify-between gap-4" />
<div className="flex flex-col gap-2" />
<div className="inline-flex items-center" />
<div className="grid grid-cols-3 gap-4" />
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6" />
// Padding
<div className="p-4" /> // All sides
<div className="px-4 py-2" /> // Horizontal, vertical
<div className="pt-4 pb-2" /> // Top, bottom
// Margin
<div className="m-4" />
<div className="mx-auto" /> // Center horizontally
<div className="mt-8 mb-4" />
<h1 className="text-2xl font-bold text-white" />
<p className="text-sm text-slate-400" />
<span className="text-xs font-medium uppercase tracking-wide" />
<div className="rounded-lg border border-slate-700" />
<div className="rounded-full shadow-lg" />
<div className="ring-2 ring-blue-500 ring-offset-2" />
<button className="hover:bg-blue-600 focus:ring-2 active:scale-95" />
<input className="focus:border-blue-500 focus:outline-none" />
<div className="group-hover:opacity-100" />
<div className="w-full md:w-1/2 lg:w-1/3" />
<div className="hidden md:block" />
<div className="text-sm md:text-base lg:text-lg" />
<div className="bg-white dark:bg-slate-900" />
<p className="text-gray-900 dark:text-white" />
// ✅ OK for one-off values not in design system
<div className="w-[327px]" />
<div className="top-[117px]" />
<div className="grid-cols-[1fr_2fr_1fr]" />
// ❌ Don't use for colors - use theme instead
<div className="bg-[#1e293b]" /> // NO
Weekly Installs
169
Repository
GitHub Stars
13.4K
First Seen
Jan 20, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode156
gemini-cli149
claude-code144
cursor143
codex141
github-copilot136
Android 整洁架构指南:模块化设计、依赖注入与数据层实现
1,200 周安装
d3k 开发调试工具 - 统一日志捕获、错误分析与浏览器自动化
106 周安装
Pine Script 调试器 - TradingView Pine Script 代码调试与问题排查工具
106 周安装
小红书自动化控制工具 - 使用Playwright实现内容发布、搜索、评论等自动化操作
106 周安装
PostgreSQL只读查询技能 - 安全数据库连接与数据分析工具
106 周安装
RealityKit API 参考手册 - 按类别整理的完整 AR 开发指南
107 周安装
阿里云函数计算FC Serverless Devs技能测试指南 - 冒烟测试与部署验证
107 周安装