Um cheat sheet do Tailwind CSS v4 com busca: digite qualquer classe ou palavra comum e veja o CSS exato que a v4 gera, de múltiplos de var(--spacing) a tokens de cor em OKLCH. Também cobre tokens do @theme, breakpoints, container queries, caixas flex e grid ao vivo, a paleta de cores completa, o modo escuro e as renomeações da v3 para a v4.
Este guia cobre o Tailwind CSS v4 (a v4.3 é a versão atual no momento em que escrevemos, outubro de 2026). Para cada classe, ele mostra o CSS que a v4 realmente gera, o que importa porque a v4 mudou a forma como os valores são produzidos: o espaçamento é um múltiplo de uma única variável --spacing, as cores são variáveis --color-* definidas em OKLCH, e tamanhos como raio, sombra e texto vêm de variáveis de tema nomeadas. Digite na caixa para filtrar. A busca funciona com nomes de classes, com o CSS que elas geram e com palavras comuns como "center", "gradient" ou "sticky".
Mostrando todos os 243
| Classe | CSS gerado na v4 |
|---|---|
| Layout e display | |
block | display: block; |
inline-block | display: inline-block; |
inline | display: inline; |
flex | display: flex; |
inline-flex | display: inline-flex; |
grid | display: grid; |
inline-grid | display: inline-grid; |
contents | display: contents; |
hidden | display: none; |
container | width: 100%; plus max-width: var(--breakpoint-sm) at sm, and so on for each breakpoint |
box-border | box-sizing: border-box; |
box-content | box-sizing: content-box; |
static | position: static; |
relative | position: relative; |
absolute | position: absolute; |
fixed | position: fixed; |
sticky | position: sticky; |
inset-0 | inset: calc(var(--spacing) * 0); |
inset-x-0 | inset-inline: calc(var(--spacing) * 0); |
top-4 | top: calc(var(--spacing) * 4); /* 1rem */ |
-top-2 | top: calc(var(--spacing) * -2); |
left-1/2 | left: calc(1/2 * 100%); |
z-10 | z-index: 10; |
z-50 | z-index: 50; |
isolate | isolation: isolate; |
overflow-hidden | overflow: hidden; |
overflow-auto | overflow: auto; |
overflow-x-auto | overflow-x: auto; |
aspect-video | aspect-ratio: var(--aspect-video); /* 16 / 9 */ |
aspect-square | aspect-ratio: 1 / 1; |
object-cover | object-fit: cover; |
object-contain | object-fit: contain; |
visible | visibility: visible; |
invisible | visibility: hidden; |
sr-only | position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border-width: 0; |
| Flexbox | |
flex-row | flex-direction: row; |
flex-col | flex-direction: column; |
flex-row-reverse | flex-direction: row-reverse; |
flex-wrap | flex-wrap: wrap; |
flex-nowrap | flex-wrap: nowrap; |
flex-1 | flex: 1; |
flex-auto | flex: auto; |
flex-initial | flex: 0 auto; |
flex-none | flex: none; |
grow | flex-grow: 1; |
grow-0 | flex-grow: 0; |
shrink-0 | flex-shrink: 0; |
basis-64 | flex-basis: calc(var(--spacing) * 64); |
basis-1/3 | flex-basis: calc(1/3 * 100%); |
order-2 | order: 2; |
order-first | order: -9999; |
order-last | order: 9999; |
| Alinhamento e gap | |
justify-start | justify-content: flex-start; |
justify-center | justify-content: center; |
justify-end | justify-content: flex-end; |
justify-between | justify-content: space-between; |
justify-around | justify-content: space-around; |
justify-evenly | justify-content: space-evenly; |
items-start | align-items: flex-start; |
items-center | align-items: center; |
items-end | align-items: flex-end; |
items-baseline | align-items: baseline; |
items-stretch | align-items: stretch; |
self-center | align-self: center; |
self-end | align-self: flex-end; |
content-center | align-content: center; |
place-items-center | place-items: center; |
place-content-center | place-content: center; |
justify-items-center | justify-items: center; |
gap-4 | gap: calc(var(--spacing) * 4); /* 1rem */ |
gap-x-6 | column-gap: calc(var(--spacing) * 6); |
gap-y-2 | row-gap: calc(var(--spacing) * 2); |
| Grid | |
grid-cols-3 | grid-template-columns: repeat(3, minmax(0, 1fr)); |
grid-cols-12 | grid-template-columns: repeat(12, minmax(0, 1fr)); |
grid-cols-[200px_1fr] | grid-template-columns: 200px 1fr; |
grid-cols-subgrid | grid-template-columns: subgrid; |
grid-rows-3 | grid-template-rows: repeat(3, minmax(0, 1fr)); |
col-span-2 | grid-column: span 2 / span 2; |
col-span-full | grid-column: 1 / -1; |
col-start-2 | grid-column-start: 2; |
row-span-2 | grid-row: span 2 / span 2; |
grid-flow-col | grid-auto-flow: column; |
grid-flow-dense | grid-auto-flow: dense; |
auto-rows-fr | grid-auto-rows: minmax(0, 1fr); |
auto-cols-max | grid-auto-columns: max-content; |
| Espaçamento | |
p-4 | padding: calc(var(--spacing) * 4); /* 1rem */ |
p-px | padding: 1px; |
p-[13px] | padding: 13px; |
p-(--card-pad) | padding: var(--card-pad); |
px-6 | padding-inline: calc(var(--spacing) * 6); |
py-2 | padding-block: calc(var(--spacing) * 2); |
pt-8 | padding-top: calc(var(--spacing) * 8); |
ps-4 | padding-inline-start: calc(var(--spacing) * 4); |
m-0 | margin: calc(var(--spacing) * 0); |
mx-auto | margin-inline: auto; |
mt-6 | margin-top: calc(var(--spacing) * 6); |
-mt-2 | margin-top: calc(var(--spacing) * -2); |
ms-auto | margin-inline-start: auto; |
space-y-4 | margin-block-end: calc(var(--spacing) * 4) on every child except the last (selector: > :not(:last-child)) |
space-x-2 | margin-inline-end: calc(var(--spacing) * 2) on every child except the last |
| Dimensionamento | |
w-64 | width: calc(var(--spacing) * 64); /* 16rem */ |
w-full | width: 100%; |
w-1/2 | width: calc(1/2 * 100%); |
w-screen | width: 100vw; |
w-fit | width: fit-content; |
w-auto | width: auto; |
size-10 | width: calc(var(--spacing) * 10); height: calc(var(--spacing) * 10); |
h-12 | height: calc(var(--spacing) * 12); |
h-dvh | height: 100dvh; |
h-screen | height: 100vh; |
min-h-screen | min-height: 100vh; |
min-w-0 | min-width: calc(var(--spacing) * 0); |
max-w-md | max-width: var(--container-md); /* 28rem */ |
max-w-7xl | max-width: var(--container-7xl); /* 80rem */ |
max-w-prose | max-width: 65ch; |
max-w-screen-lg | max-width: var(--breakpoint-lg); |
| Tipografia | |
text-xs | font-size: var(--text-xs); /* 0.75rem */ line-height: var(--tw-leading, var(--text-xs--line-height)); |
text-sm | font-size: var(--text-sm); /* 0.875rem */ line-height: var(--tw-leading, var(--text-sm--line-height)); |
text-base | font-size: var(--text-base); /* 1rem */ line-height: var(--tw-leading, var(--text-base--line-height)); |
text-xl | font-size: var(--text-xl); /* 1.25rem */ line-height: var(--tw-leading, var(--text-xl--line-height)); |
text-4xl | font-size: var(--text-4xl); /* 2.25rem */ line-height: var(--tw-leading, var(--text-4xl--line-height)); |
text-sm/6 | font-size: var(--text-sm); line-height: calc(var(--spacing) * 6); |
font-sans | font-family: var(--font-sans); |
font-mono | font-family: var(--font-mono); |
font-medium | font-weight: var(--font-weight-medium); /* 500 */ |
font-semibold | font-weight: var(--font-weight-semibold); /* 600 */ |
font-bold | font-weight: var(--font-weight-bold); /* 700 */ |
leading-tight | line-height: var(--leading-tight); /* 1.25 */ |
leading-6 | line-height: calc(var(--spacing) * 6); |
tracking-tight | letter-spacing: var(--tracking-tight); /* -0.025em */ |
tracking-wide | letter-spacing: var(--tracking-wide); |
text-left | text-align: left; |
text-center | text-align: center; |
text-right | text-align: right; |
uppercase | text-transform: uppercase; |
capitalize | text-transform: capitalize; |
italic | font-style: italic; |
underline | text-decoration-line: underline; |
no-underline | text-decoration-line: none; |
underline-offset-4 | text-underline-offset: 4px; |
decoration-2 | text-decoration-thickness: 2px; |
truncate | overflow: hidden; text-overflow: ellipsis; white-space: nowrap; |
line-clamp-3 | overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; |
text-balance | text-wrap: balance; |
text-pretty | text-wrap: pretty; |
whitespace-nowrap | white-space: nowrap; |
wrap-break-word | overflow-wrap: break-word; /* added in v4.1 */ |
tabular-nums | font-variant-numeric: tabular-nums; |
antialiased | -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; |
| Cores e fundos | |
text-blue-600 | color: var(--color-blue-600); /* oklch(54.6% 0.245 262.881) */ |
bg-white | background-color: var(--color-white); /* #fff */ |
bg-slate-900 | background-color: var(--color-slate-900); |
bg-black/50 | background-color: color-mix(in oklab, var(--color-black) 50%, transparent); |
bg-[#4f98fb] | background-color: #4f98fb; |
bg-(--brand) | background-color: var(--brand); |
text-current | color: currentColor; |
bg-transparent | background-color: transparent; |
border-gray-200 | border-color: var(--color-gray-200); |
fill-current | fill: currentColor; |
accent-blue-600 | accent-color: var(--color-blue-600); |
caret-pink-500 | caret-color: var(--color-pink-500); |
bg-linear-to-r | background-image: linear-gradient(to right in oklab, var(--tw-gradient-stops)); /* simplified */ |
from-blue-500 | --tw-gradient-from: var(--color-blue-500); /* first stop */ |
to-violet-500 | --tw-gradient-to: var(--color-violet-500); |
bg-radial | background-image: radial-gradient(...stops); /* new in v4 */ |
bg-cover | background-size: cover; |
bg-center | background-position: center; |
bg-no-repeat | background-repeat: no-repeat; |
bg-clip-text | background-clip: text; |
| Bordas, raios, rings e outlines | |
border | border-style: var(--tw-border-style); border-width: 1px; /* color is currentColor in v4 */ |
border-2 | border-style: var(--tw-border-style); border-width: 2px; |
border-t | border-top-style: var(--tw-border-style); border-top-width: 1px; |
border-dashed | --tw-border-style: dashed; border-style: dashed; |
rounded-xs | border-radius: var(--radius-xs); /* 0.125rem */ |
rounded-sm | border-radius: var(--radius-sm); /* 0.25rem */ |
rounded-md | border-radius: var(--radius-md); /* 0.375rem */ |
rounded-lg | border-radius: var(--radius-lg); /* 0.5rem */ |
rounded-2xl | border-radius: var(--radius-2xl); /* 1rem */ |
rounded-full | border-radius: calc(infinity * 1px); |
rounded-t-lg | border-top-left-radius: var(--radius-lg); border-top-right-radius: var(--radius-lg); |
divide-y | border-bottom-width: 1px on every child except the last (selector: > :not(:last-child)) |
ring-1 | box-shadow: 0 0 0 1px currentColor; /* simplified; v4 default ring width is 1px */ |
ring-3 | box-shadow: 0 0 0 3px currentColor; /* the old v3 ring */ |
ring-blue-500 | --tw-ring-color: var(--color-blue-500); |
ring-offset-2 | --tw-ring-offset-width: 2px; |
outline | outline-style: var(--tw-outline-style); outline-width: 1px; |
outline-2 | outline-style: var(--tw-outline-style); outline-width: 2px; |
outline-offset-2 | outline-offset: 2px; |
outline-hidden | outline: 2px solid transparent; outline-offset: 2px; /* still visible in forced colors */ |
outline-none | --tw-outline-style: none; outline-style: none; |
| Efeitos e filtros | |
shadow-2xs | box-shadow: 0 1px rgb(0 0 0 / 0.05); |
shadow-xs | box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); |
shadow-sm | box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); |
shadow-md | box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); |
shadow-lg | box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); |
shadow-2xl | box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); |
shadow-none | box-shadow: 0 0 #0000; |
inset-shadow-sm | box-shadow: inset 0 2px 4px rgb(0 0 0 / 0.05); /* new in v4 */ |
opacity-50 | opacity: 50%; |
mix-blend-multiply | mix-blend-mode: multiply; |
blur-sm | filter: blur(var(--blur-sm)); /* 8px */ |
blur-xs | filter: blur(var(--blur-xs)); /* 4px */ |
backdrop-blur-md | backdrop-filter: blur(var(--blur-md)); /* 12px, frosted glass */ |
grayscale | filter: grayscale(100%); |
| Transições, animações e transforms | |
transition | transition-property: color, background-color, border-color, outline-color, opacity, box-shadow, transform, translate, scale, rotate, filter and more; transition-duration: 150ms; |
transition-colors | transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke and gradient stops; 150ms |
duration-200 | transition-duration: 200ms; |
ease-out | transition-timing-function: var(--ease-out); /* cubic-bezier(0, 0, 0.2, 1) */ |
animate-spin | animation: var(--animate-spin); /* spin 1s linear infinite */ |
animate-pulse | animation: var(--animate-pulse); |
motion-reduce:animate-none | @media (prefers-reduced-motion: reduce) { animation: none; } |
scale-95 | --tw-scale-x: 95%; --tw-scale-y: 95%; scale: var(--tw-scale-x) var(--tw-scale-y); |
rotate-45 | rotate: 45deg; |
translate-x-4 | --tw-translate-x: calc(var(--spacing) * 4); translate: var(--tw-translate-x) var(--tw-translate-y); |
-translate-y-1/2 | --tw-translate-y: calc(calc(1/2 * 100%) * -1); translate: var(--tw-translate-x) var(--tw-translate-y); |
| Interatividade | |
cursor-pointer | cursor: pointer; /* v4 buttons default to cursor: default */ |
cursor-not-allowed | cursor: not-allowed; |
pointer-events-none | pointer-events: none; |
select-none | user-select: none; |
appearance-none | appearance: none; |
scroll-smooth | scroll-behavior: smooth; |
snap-x | scroll-snap-type: x var(--tw-scroll-snap-strictness); |
snap-start | scroll-snap-align: start; |
scroll-mt-20 | scroll-margin-top: calc(var(--spacing) * 20); |
resize-y | resize: vertical; |
touch-manipulation | touch-action: manipulation; |
| Variantes de estado e de mídia | |
hover:bg-blue-700 | @media (hover: hover) { &:hover { background-color: var(--color-blue-700); } } |
focus-visible:outline-2 | &:focus-visible { outline-width: 2px; ... } |
active:scale-95 | &:active { scale: 95%; } |
disabled:opacity-50 | &:disabled { opacity: 50%; } |
aria-disabled:opacity-50 | &[aria-disabled="true"] { opacity: 50%; } |
group-hover:underline | .group:hover & { text-decoration-line: underline; } (inside @media (hover: hover)) |
peer-checked:bg-blue-600 | .peer:checked ~ & { background-color: var(--color-blue-600); } |
md:flex | @media (width >= 48rem) { display: flex; } |
max-md:hidden | @media (width < 48rem) { display: none; } |
@md:flex-row | @container (width >= 28rem) { flex-direction: row; } |
dark:bg-slate-900 | @media (prefers-color-scheme: dark) { background-color: var(--color-slate-900); } |
print:hidden | @media print { display: none; } |
motion-safe:animate-spin | @media (prefers-reduced-motion: no-preference) { ... } |
*:p-2 | :where(& > *) { padding: calc(var(--spacing) * 2); } |
not-last:mb-2 | &:not(:last-child) { margin-bottom: ... } |
supports-[display:grid]:grid | @supports (display: grid) { display: grid; } |
bg-red-500! | background-color: var(--color-red-500) !important; |
Como ler a tabela: calc(var(--spacing) * 4) equivale a 1rem porque o --spacing padrão é 0.25rem. Mude essa única variável no @theme e todo padding, margin, gap, largura e altura que usa a escala numérica muda junto. Onde o CSS gerado é longo (gradientes, rings, transições), a tabela mostra uma versão simplificada e avisa.
Há quatro formas de dar um valor a um utilitário na v4, e saber qual delas você está usando explica a maioria das surpresas:
p-4, w-64, gap-3. Qualquer número inteiro funciona, assim como passos de um quarto como p-2.5, sem configuração. O valor é calc(var(--spacing) * n).rounded-lg, shadow-md, text-xl, max-w-md. Cada um lê uma variável como --radius-lg ou --container-md.p-[13px], grid-cols-[200px_1fr], bg-[#4f98fb]. Sublinhados substituem os espaços.bg-(--brand) é a forma abreviada da v4 para bg-[var(--brand)]. Na v3 você escrevia bg-[--brand].Frações como w-1/2 viram calc(1/2 * 100%), e um sufixo de opacidade como bg-black/50 vira um color-mix() com transparent, então funciona com qualquer formato de cor.
Na v4 você configura o design system em CSS. Variáveis declaradas dentro de @theme viram ao mesmo tempo propriedades personalizadas CSS em :root e a fonte das classes utilitárias. O prefixo da variável decide quais utilitários ela alimenta:
@import "tailwindcss";
@theme {
--font-display: "Satoshi", sans-serif; /* font-display */
--color-brand-500: oklch(65% 0.17 255); /* bg-brand-500, text-brand-500 ... */
--breakpoint-3xl: 120rem; /* 3xl: variant */
--spacing: 0.25rem; /* p-4 = 1rem */
--radius-card: 0.875rem; /* rounded-card */
}
| Namespace | Alimenta | Exemplo |
|---|---|---|
--color-* | todos os utilitários de cor (bg, text, border, fill, ring, cor de shadow...) | bg-red-500 |
--spacing | padding, margin, gap, largura, altura, inset, translate | px-4 |
--font-* | família de fonte | font-sans |
--text-* | tamanho de fonte (mais o opcional --text-*--line-height) | text-xl |
--font-weight-* | peso de fonte | font-bold |
--tracking-* / --leading-* | espaçamento entre letras / altura de linha | tracking-wide |
--breakpoint-* | variantes responsivas | sm:* |
--container-* | variantes de container query e max-w-* | @sm:*, max-w-md |
--radius-* | raio da borda | rounded-sm |
--shadow-*, --inset-shadow-*, --drop-shadow-* | sombras | shadow-md |
--blur-* | blur e backdrop blur | blur-md |
--ease-* / --animate-* | funções de timing / animações | ease-out, animate-spin |
--perspective-* / --aspect-* | perspectiva 3D / proporção | perspective-near, aspect-video |
Para descartar um namespace padrão inteiro, defina-o primeiro como initial, por exemplo --color-*: initial;, e depois declare apenas as suas cores. Se você ainda tem uma configuração em JavaScript, a v4 pode carregá-la com @config "./tailwind.config.js";, mas as opções corePlugins, safelist e separator não são suportadas.
Os breakpoints são mobile first: uma classe sem prefixo vale em qualquer largura, e md:flex vale a partir de 48rem. A v4 os escreve com a sintaxe de intervalo width >= ....
| Prefixo | Largura mínima | CSS | Abaixo dele (max-*) |
|---|---|---|---|
sm: | 40rem (640px) | @media (width >= 40rem) | max-sm: = @media (width < 40rem) |
md: | 48rem (768px) | @media (width >= 48rem) | max-md: |
lg: | 64rem (1024px) | @media (width >= 64rem) | max-lg: |
xl: | 80rem (1280px) | @media (width >= 80rem) | max-xl: |
2xl: | 96rem (1536px) | @media (width >= 96rem) | max-2xl: |
Empilhe-os para mirar um intervalo: md:max-xl:flex vale apenas de 48rem até 80rem (sem incluir). Para um breakpoint pontual, use min-[900px]:grid ou max-[600px]:hidden. Adicione ou altere breakpoints com --breakpoint-* no @theme e mantenha todos em rem para que sejam ordenados corretamente.
As container queries vêm embutidas na v4 (na v3 elas precisavam de um plugin). Marque um elemento pai com @container e estilize os filhos com @sm:, @md: e assim por diante. Elas reagem à largura do pai, e não à da janela, que é o que você quer para um card que aparece tanto numa barra lateral quanto numa coluna principal larga.
<div class="@container">
<article class="flex flex-col @md:flex-row gap-4">
<img class="w-full @md:w-48 rounded-lg" src="..." alt="">
<div>...</div>
</article>
</div>
| Variante | Largura do container | Variante | Largura do container |
|---|---|---|---|
@3xs | 16rem (256px) | @2xl | 42rem (672px) |
@2xs | 18rem (288px) | @3xl | 48rem (768px) |
@xs | 20rem (320px) | @4xl | 56rem (896px) |
@sm | 24rem (384px) | @5xl | 64rem (1024px) |
@md | 28rem (448px) | @6xl | 72rem (1152px) |
@lg | 32rem (512px) | @7xl | 80rem (1280px) |
@xl | 36rem (576px) |
Cada uma compila para @container (width >= ...). Use @max-md: para "abaixo de", empilhe @sm:@max-md: para um intervalo, dê nome aos containers com @container/sidebar e mire neles com @md/sidebar:, e use tamanhos arbitrários como @min-[475px]:. Observe que os tamanhos de container não são os mesmos números dos breakpoints: @md é 28rem, enquanto md: é 48rem.
Escolha um layout abaixo e veja as caixas se moverem. A string de classes é atualizada a cada clique, então você pode copiá-la direto para o seu markup.
Os padrões que você vai usar com mais frequência:
flex items-center justify-between: linha de navbarflex items-center justify-center (ou grid place-items-center): centralizar um elementogrid grid-cols-3 gap-2 com col-span-2shrink-0 no item fixo, flex-1 no item que preenche| Objetivo | Classes |
|---|---|
| Grade de cards responsiva sem breakpoints | grid grid-cols-[repeat(auto-fill,minmax(16rem,1fr))] gap-6 |
| Barra lateral mais conteúdo | grid md:grid-cols-[16rem_1fr] gap-8 |
| Rodapé preso no fim de uma página curta | flex min-h-dvh flex-col no wrapper, flex-1 no main |
| Texto que é truncado dentro de uma linha flex | min-w-0 no filho flex, truncate no texto |
| Empilhado no celular, em linha no desktop | flex flex-col md:flex-row gap-4 |
| Empurrar o último item para a direita | ms-auto (ou ml-auto) nesse item |
A v4 define a paleta padrão em OKLCH, que consegue exibir cores mais saturadas em telas de gama ampla. Cada amostra abaixo é pintada com o valor exato do próprio arquivo de tema do Tailwind; clique em uma para copiar o valor oklch(). Os tons vão de 50 a 950. As paletas marcadas com * (mauve, olive, mist e taupe) foram adicionadas na v4.2.0, então não existem nas versões anteriores da v4. Preto e branco são #000 e #fff.
Use-as como bg-sky-500, text-sky-500/80 ou, no seu próprio CSS, var(--color-sky-500). Para conferir se uma combinação é legível, passe-a pelo verificador de contraste de cores, e para uma escala personalizada no mesmo formato experimente o gerador de paleta de cores Tailwind.
Por padrão, dark: segue o sistema operacional por meio de @media (prefers-color-scheme: dark). Para controlá-lo por uma classe ou atributo (para um botão manual), sobrescreva a variante no seu CSS com @custom-variant. Não existe mais a chave de configuração darkMode.
/* Class strategy: <html class="dark"> */
@custom-variant dark (&:where(.dark, .dark *));
/* Or a data attribute: <html data-theme="dark"> */
@custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *));
<div class="bg-white text-slate-900 dark:bg-slate-900 dark:text-slate-100">...</div>
Com um botão manual, defina a classe antes de a página ser pintada (um pequeno script inline no <head> que lê a escolha salva) para que os visitantes não vejam um piscar do tema errado. Uma terceira opção é dispensar totalmente as classes dark:: defina tokens semânticos como --color-surface no @theme e troque os valores deles em .dark, para que uma única classe como bg-surface funcione nos dois temas.
Estas vêm do guia oficial de atualização. As renomeações são as mais importantes porque os nomes antigos ainda existem e produzem silenciosamente um resultado diferente (menor).
| v3 | v4 | Por quê |
|---|---|---|
shadow-sm | shadow-xs | A escala desceu um passo para que todo tamanho tenha um nome |
shadow | shadow-sm | Mesmo deslocamento |
drop-shadow-sm / drop-shadow | drop-shadow-xs / drop-shadow-sm | Mesmo deslocamento |
blur-sm / blur | blur-xs / blur-sm | Mesmo deslocamento (também backdrop-blur-*) |
rounded-sm | rounded-xs | Mesmo deslocamento |
rounded | rounded-sm | Mesmo deslocamento |
outline-none | outline-hidden | Na v4, outline-none agora define de fato outline-style: none |
ring (3px, blue-500) | ring-3 mais uma cor | ring sozinho agora tem 1px em currentColor |
outline outline-2 | outline-2 | Os utilitários de largura agora definem um estilo sólido por conta própria |
bg-opacity-50 (e text-, border-, ring-, divide-, placeholder-opacity) | bg-black/50 | Removido; use o modificador com barra |
flex-shrink-0 / flex-grow | shrink-0 / grow | Aliases removidos |
overflow-ellipsis | text-ellipsis | Alias removido |
decoration-slice / decoration-clone | box-decoration-slice / box-decoration-clone | Aliases removidos |
bg-[--brand] | bg-(--brand) | Nova forma abreviada para variáveis CSS |
!bg-red-500 | bg-red-500! | O important vai no final (a forma antiga está obsoleta) |
first:*:pt-0 | *:first:pt-0 | Variantes empilhadas agora são lidas da esquerda para a direita |
tw-flex (prefixo) | tw:flex | Prefixos parecem uma variante e vêm primeiro |
Mudanças de comportamento sem renomeação, que pegam muita gente durante a atualização:
currentColor em vez de gray-200, então um border sozinho fica escuro. Adicione uma cor como border-gray-200.hover: fica envolvido em @media (hover: hover), então um toque não dispara mais estilos de hover que ficam presos.cursor: default, como o navegador faz. Adicione cursor-pointer se quiser a mãozinha.> :not(:last-child) e a margem passou para o lado final. Se o espaçamento parecer errado, troque para flex ou grid com gap.center e padding não existem mais; estenda-o com @utility container { margin-inline: auto; padding-inline: 2rem; }.bg-linear-to-r e adiciona bg-radial e bg-conic.A ferramenta oficial npx @tailwindcss/upgrade cuida automaticamente da maioria das renomeações. Rode-a em um branch limpo e revise o diff, já que ela não tem como saber quais classes shadow você queria que continuassem com a mesma aparência.
Esta página tem estilos de impressão: as caixas de busca e os botões ficam ocultos, as tabelas encolhem para uma fonte menor e a grade de cores mantém as amostras juntas. Na maioria dos navegadores, ative "Gráficos de plano de fundo" na caixa de diálogo de impressão, ou as amostras saem em branco. Se você filtrou a tabela antes, só as linhas visíveis são impressas, o que é um jeito rápido de montar uma folha de uma página só com os utilitários que você usa.
A mesma variante print: funciona nos seus próprios projetos: print:hidden na navegação, print:text-black em textos claros e print:break-inside-avoid em cards mantêm as páginas impressas legíveis.
A v4 é configurada em CSS. Você importa o Tailwind com @import "tailwindcss" e declara os design tokens dentro de um bloco @theme, como --color-brand-500 ou --breakpoint-3xl. Uma configuração em JavaScript ainda pode ser carregada com a diretiva @config, mas as opções corePlugins, safelist e separator não são suportadas.
sm é 40rem (640px), md é 48rem (768px), lg é 64rem (1024px), xl é 80rem (1280px) e 2xl é 96rem (1536px). Eles são mobile first, então md:flex vale a partir de 48rem. Use max-md: para estilos abaixo de um breakpoint e empilhe-os, como em md:max-xl:, para um intervalo.
As escalas de shadow, radius e blur desceram um passo. O shadow-sm da v3 é o shadow-xs da v4, o shadow da v3 é o shadow-sm da v4, o rounded-sm da v3 é o rounded-xs da v4 e o rounded da v3 é o rounded-sm da v4. Os nomes antigos ainda compilam, então nada dá erro; eles só produzem o tamanho imediatamente menor.
Adicione @custom-variant dark (&:where(.dark, .dark *)); ao seu CSS. Os utilitários dark: passam a valer sempre que um ancestral tiver a classe dark. Use [data-theme=dark] no seletor se preferir um atributo data.
Não. As container queries vêm embutidas. Coloque @container no elemento pai e use variantes como @sm:, @md: e @max-md: nos filhos. Os tamanhos de container começam em @3xs (16rem) e são diferentes dos breakpoints da página; por exemplo, @md é 28rem.
padding: calc(var(--spacing) * 4). Com o --spacing padrão de 0.25rem, isso dá 1rem (16px no tamanho de fonte padrão). Qualquer número inteiro funciona na escala de espaçamento sem configuração, e mudar --spacing redimensiona todos de uma vez.
Display
Itens
Direção
Quebra
Eixo principal
Colunas
Eixo transversal
Gap
Copiado
Copiar classes
Imprimir este cheat sheet
Comece grátis · Sem cartão de crédito