tailwind-4 — скилл для Claude Code: правила Tailwind CSS 4
Скилл ведёт агента по стилизации на Tailwind CSS 4: что писать в className, когда нужен style, а когда cn(). Пригодится, если в проекте есть CSS-переменные и условные классы.
npx skills add prowler-cloud/prowler --skill tailwind-4 -a claude-codeЧто делает tailwind-4
Скилл включается, когда агент правит стили на Tailwind CSS 4: классы в className, варианты, утилита cn(). В основе дерево решений. Есть класс в Tailwind — пиши его в className. Значение меняется в рантайме: уходи в style. Нужны условные классы: бери cn().
Дальше идут жёсткие запреты с примерами. Не тащить var(--...) и hex-цвета в className: вместо bg-[#1e293b] берётся семантический класс вроде bg-slate-800. Утилиту cn() скилл описывает как обёртку над clsx и tailwind-merge. Оба пакета должны быть в проекте, сам скилл их не ставит — это первое, что стоит проверить.
Отдельный блок про библиотеки, которые не принимают className: для графиков вроде Recharts предлагаются константы с var() в пропсах style и fill. Потом паттерны вёрстки: flex, grid, отступы, типографика, состояния, тёмная тема. Arbitrary values вроде w-[327px] разрешены для разовых размеров, но не для цветов. Если cn() в проекте не заведён, примеры с условными классами придётся переписать под свою обёртку.
Какие задачи решает
- выбрать между
className,styleиcn()для конкретного элемента - убрать
var(--...)и hex-цвета изclassName - смержить конфликтующие утилиты на кнопке с вариантами
- прокинуть цвета темы в Recharts через константы
- задать ширину или прозрачность из состояния без arbitrary-класса
Примеры запросов агенту
- Перепиши стили карточки на Tailwind 4 и убери `var()` из `className`.
- Собери классы для кнопки с вариантами primary и secondary через `cn()`.
- Задай в Recharts цвета осей и сетки из CSS-переменных темы.
Как установить tailwind-4
1Через Skills CLI (Vercel)
npx skills add prowler-cloud/prowler --skill tailwind-4 -a claude-code2Вручную: положить файлы
~/.claude/skills/tailwind-4/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/tailwind-4/
1Через Skills CLI (Vercel)
npx skills add prowler-cloud/prowler --skill tailwind-4 -a codex2Вручную: положить файлы
.agents/skills/tailwind-4/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add prowler-cloud/prowler --skill tailwind-4 -a cursor2Вручную: положить файлы
.cursor/skills/tailwind-4/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install prowler-cloud/prowler tailwind-42Вручную: положить файлы
.github/skills/tailwind-4/SKILL.md1Через Skills CLI (Vercel)
npx skills add prowler-cloud/prowler --skill tailwind-4 -a gemini-cli2Командой платформы
gemini skills install https://github.com/prowler-cloud/prowler --path skills/tailwind-4Вручную: положить файлы
.devin/skills/tailwind-4/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add prowler-cloud/prowler --skill tailwind-4 -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
Из того же набора4
Весь набор →Похожие
Вопросы о tailwind-4
Как установить tailwind-4 в Claude Code?
Командой npx skills add prowler-cloud/prowler --skill tailwind-4 -a claude-code. Файл скилла появится по пути ~/.claude/skills/tailwind-4/SKILL.md.
Что делает скилл tailwind-4?
Задаёт агенту правила работы с Tailwind CSS 4: дерево выбора между className, style и cn(), запрет var() и hex-цветов в классах, примеры для библиотек без поддержки className.
Что нужно, чтобы примеры с `cn()` заработали?
Пакеты clsx и tailwind-merge в проекте и сама функция cn(), собранная на их основе. Скилл показывает, как её устроить, но зависимости не устанавливает.
Исходный текст
SKILL.md · Apache-2.0
---
name: tailwind-4
description: >
Tailwind CSS 4 patterns and best practices.
Trigger: When styling with Tailwind (className, variants, cn()), especially when dynamic styling or CSS variables are involved (no var() in className).
license: Apache-2.0
metadata:
author: prowler-cloud
version: "1.0"
scope: [root, ui]
auto_invoke: "Working with Tailwind classes"
allowed-tools: Read, Edit, Write, Glob, Grep, Bash, WebFetch, WebSearch, Task
---
## Styling Decision Tree
```text
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
```
## Critical Rules
### Never Use var() in className
```typescript
// ❌ 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 Use Hex Colors
```typescript
// ❌ 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" />
```
## The cn() Utility
```typescript
import { clsx } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
```
### When to Use cn()
```typescript
// ✅ 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"
)} />
```
### When NOT to Use cn()
```typescript
// ❌ Static classes - unnecessary wrapper
<div className={cn("flex items-center gap-2")} />
// ✅ Just use className directly
<div className="flex items-center gap-2" />
```
## Style Constants for Charts/Libraries
When libraries don't accept className (like Recharts):
```typescript
// ✅ 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} />
```
## Dynamic Values
```typescript
// ✅ 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} />
```
## Common Patterns
### Flexbox
```typescript
<div className="flex items-center justify-between gap-4" />
<div className="flex flex-col gap-2" />
<div className="inline-flex items-center" />
```
### Grid
```typescript
<div className="grid grid-cols-3 gap-4" />
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6" />
```
### Spacing
```typescript
// 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" />
```
### Typography
```typescript
<h1 className="text-2xl font-bold text-white" />
<p className="text-sm text-slate-400" />
<span className="text-xs font-medium uppercase tracking-wide" />
```
### Borders & Shadows
```typescript
<div className="rounded-lg border border-slate-700" />
<div className="rounded-full shadow-lg" />
<div className="ring-2 ring-blue-500 ring-offset-2" />
```
### States
```typescript
<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" />
```
### Responsive
```typescript
<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" />
```
### Dark Mode
```typescript
<div className="bg-white dark:bg-slate-900" />
<p className="text-gray-900 dark:text-white" />
```
## Arbitrary Values (Escape Hatch)
```typescript
// ✅ 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
```
© prowler-cloud · Apache-2.0 · prowler-cloud/prowler