
tailwind-v4
Tailwind CSS v4 usage guide and v3-to-v4 differences. This skill should be used when writing, reviewing, or refactoring any Tailwind CSS code in this repo. Triggers on tasks involving Tailwind classes, @theme blocks, CSS-first configuration, or cleanup of v3-era syntax.
- Installs
- 105
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/mastra-ai/mastra --skill tailwind-v4- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads tailwind-v4 automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Tailwind CSS v4
How to write idiomatic Tailwind v4 and spot v3-era syntax that still compiles but should not appear in new code.
Version and sources
Check the pinned version before using recent utilities: the playground packages pin tailwindcss in their package.json (4.3.3 at the time of writing, including v4.3 utilities like scrollbar-*, zoom-*, and tab-*). When unsure whether a utility, variant, or directive exists in the pinned version, verify against the docs instead of guessing:
- Utility/variant reference: https://tailwindcss.com/docs
- v3 → v4 migration: https://tailwindcss.com/docs/upgrade-guide
- What each minor added: https://tailwindcss.com/blog/tailwindcss-v4 (and
/tailwindcss-v4-1,/tailwindcss-v4-3, ...)
CSS-first configuration
Tailwind v4 is configured in CSS, not JavaScript.
| Use | Never use (v3-era) |
|---|---|
@import 'tailwindcss' | @tailwind base/components/utilities |
@theme { --color-x: ...; } for tokens that should generate utilities | tailwind.config.ts for new work |
@utility name { ... } for custom utilities (works with variants) | @layer utilities { .name { ... } } |
@custom-variant dark (&:is(.dark *)) | JS plugins / addVariant |
@source "path" / @source inline("...") for extra sources / safelisting | content array / safelist config |
@variant dark { ... } to apply a Tailwind variant inside custom CSS | duplicating media queries / selectors |
@reference "app.css" for @apply in scoped styles (Vue, CSS Modules) | duplicating stylesheet imports |
var(--color-x) in CSS, getComputedStyle in JS | theme() function, resolveConfig |
@config "…" / @plugin "…" only for existing JS-config integrations | adding new JS configs or plugins |
@theme variables are API: each one emits a native CSS variable AND generates utilities (--color-* → bg-*/text-*/border-*/..., --text-* → text-*, --shadow-* → shadow-*, --animate-* → animate-*, --breakpoint-* → responsive variants). A plain :root { --x: ...; } variable generates nothing — use it for runtime-only values. When a token's value references another variable (--color-x: var(--y)), declare it in @theme inline so the utility resolves the reference at the declaration site. In custom CSS, --alpha(var(--color-x) / 50%) and --spacing(4) replace v3 theme() math.
v3 → v4 renames
Bare names shifted one step down the scale, so the v3 spelling silently renders smaller or lighter:
| v3 | v4 |
|---|---|
shadow-sm / shadow | shadow-xs / shadow-sm |
drop-shadow-sm / drop-shadow | drop-shadow-xs / drop-shadow-sm |
blur-sm / blur | blur-xs / blur-sm |
rounded-sm / rounded | rounded-xs / rounded-sm |
outline-none | outline-hidden (a11y-safe); outline-none now truly removes it |
ring (3px) | ring-3; the default ring is now 1px currentColor |
bg-opacity-50, text-opacity-* | opacity modifier: bg-black/50, text-white/50 |
bg-gradient-to-r | bg-linear-to-r (plus new bg-conic-*, bg-radial-*) |
!bg-red-500 (prefix) | bg-red-500! (suffix) |
flex-shrink-* / flex-grow-* | shrink-* / grow-* |
bg-[--var] | bg-(--var); brackets now require bg-[var(--var)] |
grid-cols-[a,b] (commas) | underscores: grid-cols-[max-content_auto] |
Prefer generated utilities over arbitrary values
The spacing scale is infinite — every number compiles via calc(var(--spacing) * n) — so most v3-era arbitrary values have a named form:
| Don't | Do |
|---|---|
min-w-[400px], w-[600px] | min-w-100, w-150 |
h-[1.5rem] w-[1.5rem] | size-6 |
mt-[68px] | mt-17 |
grid-cols-[repeat(15,minmax(0,1fr))] | grid-cols-15 |
h-[100dvh], w-[100dvw], h-[1lh] | h-dvh, w-dvw, h-lh |
max-w-[80rem] | max-w-7xl (container scale) |
data-[current]:opacity-100 | data-current:opacity-100 (values keep brackets: data-[state=open]:) |
bg-[var(--row-bg)] | bg-(--row-bg); type hints when ambiguous: text-(color:--fg), text-(length:--size) |
Square brackets remain correct for true one-offs: max-h-[calc(100dvh-3rem)], grid-cols-[200px_minmax(0,1fr)], and arbitrary properties like [mask-type:luminance].
Class strings must stay complete and statically detectable: map props to full strings ({ success: 'bg-positive1' }[tone]), never build fragments like `bg-${tone}-500`.
Don't hand-write CSS or JS for what a variant covers
Before writing a stylesheet rule, a style prop, or an event handler for styling, check for a variant:
| Hand-written | Tailwind |
|---|---|
.btn:active { ... } in CSS | active:bg-surface5 |
:focus-visible rules | focus-visible:outline-accent1 |
[aria-expanded="true"] selectors | aria-expanded:rotate-180 (any aria-* boolean or value) |
[data-state="open"] selectors | data-[state=open]:opacity-100, boolean: data-current: |
| JS hover/focus state to style a sibling/child | group/group-hover:, peer/peer-checked:, in-focus: |
| parent-state selectors / JS "has child" checks | has-checked:bg-accent1, has-[>svg]:pl-8 |
mask-image / fade-out gradients in CSS | mask-b-from-80%, mask-t-from-* |
@media (hover: none) blocks | pointer-coarse:/pointer-fine: |
| first/last/nth rules in CSS | first:, last:, odd:, nth-3:, not-first: |
| styling all children from CSS | *:rounded-full (children), **:data-avatar:rounded-full (descendants) |
New capabilities — reach for these before hacks or JS
field-sizing-content— auto-growing textarea without a JS resize listener.wrap-anywhere/wrap-break-word— long-word breaking inside flex without themin-w-0hack.items-center-safe,justify-center-safe— centering that falls back tostarton overflow.pointer-coarse:/pointer-fine:— adapt touch targets without user-agent sniffing.user-valid:/user-invalid:— validation styling only after user interaction (unlike:valid).starting:(+transition-discretefordisplay/popover) — enter transitions without JS mount tricks.text-shadow-*,mask-t-from-*/mask-b-to-*(fade-out edges),scheme-dark(native controls/scrollbars), 3D transforms (rotate-x-*,perspective-*).
Behavior changes to remember
- Transforms use individual CSS properties: custom transition lists need
transition-[opacity,scale], nottransition-[opacity,transform]; reset withscale-none/rotate-none/translate-none. hover:only applies on hover-capable devices (@media (hover: hover)) — never gate required touch functionality behind hover.- Default
border-*,divide-*, ring, and outline colors arecurrentColor— set an explicit color when the color matters. - Variant stacking applies left to right: v3
first:*:pt-0is now*:first:pt-0. space-x/y-*changed selectors (:not(:last-child)); prefer flex/grid withgap-*.- Container queries are built in:
@containeron the parent,@sm:/@max-md:on children. - Useful v4 variants:
starting:(enter transitions),not-*,in-*(likegroup-*without thegroupclass),nth-*,*:(direct children),**:(descendants),inert:.
Motion
- Gate decorative animation:
motion-safe:animate-spin motion-reduce:animate-none. - Reusable animations are
--animate-*tokens with their@keyframesinside@theme; local one-offs useanimate-(--local-animation)oranimate-[...].
FAQ
What does the tailwind-v4 skill do?
Tailwind CSS v4 usage guide and v3-to-v4 differences. This skill should be used when writing, reviewing, or refactoring any Tailwind CSS code in this repo. Triggers on tasks involving Tailwind classes, @theme blocks, CSS-first configuration, or cleanup of v3-era syntax.
How do I install tailwind-v4?
Run npx skills add https://github.com/mastra-ai/mastra --skill tailwind-v4 in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/tailwind-v4/ (personal) or .claude/skills/tailwind-v4/ (project).
Which AI agents can use tailwind-v4?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is tailwind-v4 safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains tailwind-v4?
It is published by mastra-ai in mastra-ai/mastra. It has 105 recorded installs.
More from mastra-ai/mastra
react-best-practices
mastra-ai/mastra
React performance optimization guidelines from Mastra Engineering. This skill should be used when writing, reviewing, or refactoring React code to ensure optimal performance patterns. Triggers on tasks involving React components, data fetching, bundle optimization, or performance improvements.
ralph-plan
mastra-ai/mastra
Interactive planning assistant that helps create focused, well-structured ralph-loop commands through collaborative conversation
smoke-test
mastra-ai/mastra
Create a Mastra project using create-mastra and smoke test the studio in Chrome using Chrome MCP server
e2e-tests-studio
mastra-ai/mastra
REQUIRED when modifying any file in packages/playground-ui or packages/playground. Triggers on: React component creation/modification/refactoring, UI changes, new playground features, bug fixes affecting studio UI. Generates Playwright E2E tests that validate PRODUCT BEHAVIOR, not just UI states.
tailwind-best-practices
mastra-ai/mastra
Tailwind CSS styling guidelines for Mastra Playground UI. This skill should be used when writing, reviewing, or refactoring styling code in packages/playground-ui and packages/playground to ensure design system consistency. Triggers on tasks involving Tailwind classes, component styling, or design tokens.
mastra-docs
mastra-ai/mastra
Open the skill to read its SKILL.md instructions.
Popular frontend & design skills
setup-matt-pocock-skills
mattpocock/skills
Configure this repo for the engineering skills: set up its issue tracker, triage label vocabulary, and domain doc layout. Run once before first use of the other engineering skills.
frontend-design
anthropics/skills
Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.
hyperframes-animation
heygen-com/hyperframes
All animation knowledge for HyperFrames — atomic motion rules, multi-phase scene blueprints, scene transitions, broader motion-design techniques, AND the seven runtime adapters (GSAP default, plus Lottie, Three.js, Anime.js, CSS keyframes, Web Animations API, TypeGPU). Use for any motion or animation task: pick 2-4 rules and compose, or load a blueprint, or look up runtime-specific API (e.g. GSAP eases / Lottie player / Three.js mixer). Also covers auditing an existing composition's choreography (animation map) and 24 named text-animation effects. HyperFrames-native: single paused timeline, seek-safe, deterministic.
prototype
mattpocock/skills
Build a throwaway prototype to answer a design question. Use when the user wants to sanity-check whether a state model or logic feels right, or explore what a UI should look like.
hyperframes-core
heygen-com/hyperframes
The HyperFrames composition contract — build one renderable project. Use for composition structure, the data- timing attributes, class="clip", tracks, sub-compositions, variables, framework-owned media playback, deterministic-render rules, and validation. Read before writing composition HTML.
vercel-react-best-practices
vercel-labs/agent-skills
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.