/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.
$ npx -y skills add mastra-ai/mastra --skill tailwind-v4 --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/tailwind-v4
Context preview
The summary Claude sees to decide when to auto-load this skill.
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.
SKILL.md
tailwind-v4.SKILL.mdname: tailwind-v4
description: 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.
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
Read more
name: tailwind-v4 description: 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.
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
Mastra is a framework for building AI-powered applications and agents with a modern TypeScript stack. It includes everything you need to go from early prototypes to production-ready applications.
Repo: mastra-ai/mastra
Other skills on mastra.
- /builder-smoke-test
Smoke test the Agent Builder feature branch end-to-end against a hermetic project scaffolded by the skill (linked to the current worktree). Covers workspace reconciliation, stored agents/skills CRUD, ownership, visibility, stars, registry/library Copy flow, picker allowlists,
Open skill - /debugging-difficult-bugs
Use early when debugging a medium or hard bug, especially when tests alone may not reveal the real runtime failure. Trigger this before extended TDD iteration when a bug involves runtime state, ordering, persistence, streaming, concurrency, UI/manual reproduction, external
Open skill - /docs-audit
Interactive documentation quality review for Mastra docs. Use when auditing, reviewing, or critiquing Mastra documentation; checking docs against source code; validating code examples, API accuracy, or property completeness; checking whether docs follow the styleguide and
Open skill - /e2e-tests-studio
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,
Open skill - /mastra-docs
Documentation guidelines for Mastra. This skill should be used when writing or editing documentation for Mastra. Triggers on tasks involving documentation creation or updates.
Open skill - /mastra-frontend
How to build Mastra frontend interfaces with the @mastra/playground-ui design system. This skill should be used when creating or modifying any application UI — pages, components, styling, or tokens — in this repo or in an external consumer of the design system. The docs site has
Open skill

