---
name: tailwind-css
description: Set up and use Tailwind CSS v4 only with Next.js (App Router), Vite, or CLI; no tailwind.config.js—theme via @theme in CSS. Use when styling with Tailwind, configuring Tailwind, installing Tailwind, utility classes, @theme, @layer, @utility, or when the user mentions Tailwind CSS or Tailwind v4.
---
# Tailwind CSS (v4)
## Overview
Tailwind CSS is a utility-first CSS framework. Style by combining single-purpose classes in markup.
**We use Tailwind v4 only.** There is no `tailwind.config.js`, `tailwind.config.ts`, or `tailwind.config.mjs`. Configuration is done in CSS via `@import "tailwindcss"` and the `@theme` directive, plus the Vite or PostCSS plugin.
- **Entry**: One main CSS file with `@import "tailwindcss";`
- **Build**: `@tailwindcss/vite` (Vite) or `@tailwindcss/postcss` (Next.js)
- **Theme**: `@theme { ... }` in that same CSS file (or imported CSS). No JS config.
**Core principle**: Prefer utility classes in markup; extend with `@theme` and custom CSS when needed. Never suggest or create `tailwind.config.*` or `content`/`theme` in a config file.
---
## Installation
### Next.js (App Router, 15+)
1. Create project (if needed): `npx create-next-app@latest my-project --typescript --eslint --app`
2. Install: `npm install tailwindcss @tailwindcss/postcss postcss`
3. Create `postcss.config.mjs` in project root:
```js
const config = {
plugins: {
"@tailwindcss/postcss": {},
},
};
export default config;
```
4. In `./app/globals.css`:
```css
@import "tailwindcss";
```
5. Run: `npm run dev`
Use `className` in React/TSX (e.g. in `app/page.tsx`):
```tsx
export default function Home() {
return (
Hello world!
);
}
```
Ensure `app/globals.css` is imported in `app/layout.tsx` (Create Next App does this by default).
### Vite (React, Vue, Qwik, etc.)
1. Install: `npm install tailwindcss @tailwindcss/vite`
2. In `vite.config.ts`:
```ts
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [tailwindcss(), /* ... */],
})
```
3. Main CSS (e.g. `src/index.css`): `@import "tailwindcss";`
### Tailwind CLI (standalone)
1. Install: `npm install tailwindcss @tailwindcss/cli`
2. Main CSS: `@import "tailwindcss";`
3. Build: `npx @tailwindcss/cli -i ./src/input.css -o ./src/output.css --watch`
---
## Using Tailwind
- Use **utility classes** in markup: `className` in React/Next.js, `class` in Qwik/Vue.
- Prefer design tokens (theme) over arbitrary values when possible.
- Group related utilities for readability (layout → spacing → typography → colors → effects).
Examples: `text-3xl font-bold underline`, `flex items-center gap-4`, `p-6 rounded-xl bg-white shadow-lg`, `max-w-sm mx-auto`.
---
## Theme: @theme only (no config file)
**Only in CSS.** Use `@theme` in the same file as `@import "tailwindcss"` (or in CSS imported by it).
### Extending the default theme
```css
@import "tailwindcss";
@theme {
--font-display: "Satoshi", "sans-serif";
--breakpoint-3xl: 120rem;
--color-avocado-500: oklch(0.84 0.18 117.33);
--ease-fluid: cubic-bezier(0.3, 0, 0, 1);
}
```
Use: `font-display`, `3xl:`, `bg-avocado-500`, `ease-fluid`.
### Overriding defaults
Redefine a variable inside `@theme` to override:
```css
@theme {
--breakpoint-sm: 30rem;
}
```
### Theme variable namespaces (quick reference)
| Namespace | Use for | Examples |
|----------------|----------------------------------|-----------------------------|
| `--color-*` | Colors | `bg-*, text-*, border-*` |
| `--font-*` | Font family | `font-sans`, `font-mono` |
| `--text-*` | Font size | `text-xl`, `text-base` |
| `--font-weight-*` | Font weight | `font-bold` |
| `--breakpoint-*` | Responsive variants | `sm:`, `md:`, `lg:` |
| `--spacing-*` | Spacing/sizing | `p-4`, `gap-2`, `m-6` |
| `--radius-*` | Border radius | `rounded-lg` |
| `--shadow-*` | Box shadow | `shadow-md` |
| `--ease-*` | Transition timing | `ease-out` |
| `--animate-*` | Animations | `animate-spin` |
### Referencing other variables
Use `@theme inline` when a token should reference another variable:
```css
@theme inline {
--font-sans: var(--font-inter);
}
```
### Custom keyframes
Define keyframes inside `@theme` so they are used by `--animate-*`:
```css
@theme {
--animate-fade-in-scale: fade-in-scale 0.3s ease-out;
@keyframes fade-in-scale {
0% { opacity: 0; transform: scale(0.95); }
100% { opacity: 1; transform: scale(1); }
}
}
```
For more theme options (overriding full namespaces, custom theme, sharing across projects), see [reference.md](reference.md).
---
## Custom styles
### Plain CSS
Add any custom CSS in the same file as `@import "tailwindcss"` or in imported files:
```css
@import "tailwindcss";
.my-custom-style {
/* ... */
}
```
### Base layer
Use `@layer base` for element defaults:
```css
@layer base {
h1 { font-size: var(--text-2xl); }
h2 { font-size: var(--text-xl); }
}
```
### Component layer
Use `@layer components` for reusable component-like classes (override with utilities when needed):
```css
@layer components {
.card {
background-color: var(--color-white);
border-radius: var(--radius-lg);
padding: var(--spacing-6);
box-shadow: var(--shadow-xl);
}
}
```
### Custom utilities: @utility
Simple utility:
```css
@utility content-auto {
content-visibility: auto;
}
```
Complex (e.g. scrollbar hidden):
```css
@utility scrollbar-hidden {
&::-webkit-scrollbar {
display: none;
}
}
```
### Custom variants: @variant
Use `@variant` inside custom CSS:
```css
.my-element {
background: white;
@variant dark {
background: black;
}
}
```
Or register a named variant with `@custom-variant`:
```css
@custom-variant theme-midnight (&:where([data-theme="midnight"] *));
```
Then use: `theme-midnight:bg-black`.
---
## Arbitrary values and properties
- **Arbitrary value**: `top-[117px]`, `bg-[#bada55]`, `text-[22px]`, `lg:top-[344px]`.
- **CSS variable in arbitrary value**: `fill-(--my-brand-color)` (shorthand for `fill-[var(--my-brand-color)]`).
- **Arbitrary property**: `[mask-type:luminance]`, `[--scroll-offset:56px]`.
- **Whitespace in value**: Use underscore `_` for space, e.g. `grid-cols-[1fr_500px_2fr]`.
- **Ambiguity**: Use a type hint: `text-(length:--my-var)` vs `text-(color:--my-var)`.
---
## Compatibility
- **Browsers**: Tailwind v4 targets modern browsers (Chrome 111+, Safari 16.4+, Firefox 128+). Some utilities use newer features; avoid those if you need older support.
- **Preprocessors**: Do not use Tailwind with Sass/Less/Stylus in the same pipeline; use Tailwind as the main styling layer.
---
## Quick reference
| Task | Action |
|---------------|--------|
| Entry | One CSS file with `@import "tailwindcss";` |
| Next.js | `@tailwindcss/postcss` in `postcss.config.mjs`, no Tailwind config file |
| Vite | `tailwindcss()` from `@tailwindcss/vite` |
| Theme | `@theme { ... }` in CSS only |
| Base styles | `@layer base { ... }` |
| Components | `@layer components { ... }` |
| Custom util | `@utility name { ... }` |
| Custom variant| `@custom-variant name (selector);` |
---
## Common mistakes
- **Wrong attribute**: React/Next use `className`; Qwik/Vue use `class`.
- **Missing import**: The file with `@import "tailwindcss"` must be the one loaded by the app (e.g. in root layout).
- **Config file**: Do not create or suggest `tailwind.config.js`, `tailwind.config.ts`, or any `tailwind.config.*`. Do not suggest `content: []`, `theme: {}`, or plugins in a JS config. Tailwind v4 uses only CSS (`@import "tailwindcss"` + `@theme`) and the Vite/PostCSS plugin.
---
## Additional resources
- [reference.md](reference.md) — Theme options, official doc links, default theme summary.
- Official: [Tailwind CSS v4 Docs](https://tailwindcss.com/docs) — Installation, theme, adding custom styles, compatibility.