Estilização
O Angular tem um sistema de encapsulamento CSS embutido via ViewEncapsulation. O Next.js oferece múltiplas abordagens — CSS Modules, Tailwind, CSS global — todas com escopo diferente.
ViewEncapsulation vs. CSS Modules
O equivalente mais direto do styles: [] do Angular são os CSS Modules — arquivos .module.css que isolam automaticamente os estilos por componente:
// Angular — CSS encapsulado por componente
@Component({
selector: 'app-button',
standalone: true,
template: `<button class="btn">{{ label }}</button>`,
styles: [`
.btn {
background: #6366f1;
color: white;
padding: 8px 16px;
border-radius: 8px;
border: none;
cursor: pointer;
}
.btn:hover {
background: #4f46e5;
}
`],
// ViewEncapsulation.Emulated (padrão) —
// adiciona atributo único para isolar estilos
encapsulation: ViewEncapsulation.Emulated,
})
export class ButtonComponent {
@Input() label = 'Clique';
}/* Button.module.css */
.btn {
background: #6366f1;
color: white;
padding: 8px 16px;
border-radius: 8px;
border: none;
cursor: pointer;
}
.btn:hover {
background: #4f46e5;
}
/* --------------------------------- */
/* Button.tsx */
import styles from "./Button.module.css";
type Props = { label?: string };
export default function Button({ label = "Clique" }: Props) {
// styles.btn → nome único em runtime (ex: Button_btn__xKf3a)
return <button className={styles.btn}>{label}</button>;
}Classes dinâmicas: [ngClass] vs. className
O [ngClass] tem equivalente direto em JSX. Para casos complexos, a biblioteca clsx oferece a mesma DX:
Classes condicionais
<!-- Classes dinâmicas no Angular -->
<div
[ngClass]="{
'active': isActive,
'error': hasError,
'disabled': isDisabled
}"
[class.loading]="isLoading"
>
Conteúdo
</div>
<!-- Estilo inline dinâmico -->
<div [style.color]="textColor" [style.fontSize.px]="fontSize">
Texto colorido
</div>// Classes dinâmicas no Next.js
// Template literals (simples)
<div
className={[
"base-class",
isActive ? "active" : "",
hasError ? "error" : "",
].filter(Boolean).join(" ")}
>
Conteúdo
</div>
// Com a lib 'clsx' (recomendado — npm install clsx)
import clsx from "clsx";
<div
className={clsx("base-class", {
active: isActive,
error: hasError,
disabled: isDisabled,
})}
>
Conteúdo
</div>
// Estilo inline
<div style={{ color: textColor, fontSize: fontSize + "px" }}>
Texto colorido
</div>Tailwind CSS
Este projeto já usa Tailwind CSS v4 — é a abordagem mais comum no ecossistema Next.js. Em vez de escrever CSS separado, você aplica classes utilitárias diretamente no JSX:
// Tailwind CSS — utilitários inline
// Já configurado neste projeto!
type ButtonProps = {
label: string;
variant?: "primary" | "secondary";
};
export default function Button({
label,
variant = "primary",
}: ButtonProps) {
return (
<button
className={
variant === "primary"
? "bg-indigo-600 hover:bg-indigo-700 text-white px-4 py-2 rounded-lg font-medium transition-colors"
: "bg-zinc-100 hover:bg-zinc-200 text-zinc-800 px-4 py-2 rounded-lg font-medium transition-colors"
}
>
{label}
</button>
);
}py-2 = padding-top: 0.5rem; padding-bottom: 0.5rem.Estilos globais
/* styles.scss — Angular */
/* Importado em angular.json */
* {
box-sizing: border-box;
}
body {
font-family: 'Inter', sans-serif;
background: #fafafa;
margin: 0;
}
/* Variáveis globais */
:root {
--primary: #6366f1;
--surface: #ffffff;
}
/* Para "furar" o encapsulamento */
::ng-deep .third-party-component {
color: red;
}/* app/globals.css — Next.js */
/* Importado em app/layout.tsx */
@import "tailwindcss"; /* Tailwind v4 */
:root {
--primary: #6366f1;
--surface: #ffffff;
}
@media (prefers-color-scheme: dark) {
:root {
--surface: #09090b;
}
}
body {
font-family: var(--font-geist-sans), sans-serif;
}
/* Para sobrescrever lib de terceiros */
.third-party-component {
color: red;
}
/* Não há ::ng-deep — CSS global funciona normalmente */::ng-deep. Para sobrescrever estilos de bibliotecas externas, simplesmente use seletores CSS globais em globals.css ou CSS Modules com :global(.class).Comparativo de abordagens
CSS Modules
styles: [] + ViewEncapsulation.EmulatedPadrão do Next.js. Arquivo .module.css colocado com o componente. Escopo automático.
Melhor para: Componentes com estilos específicos, migração de Angular styles
Tailwind CSS
Bootstrap + classes utilitáriasUtilitários CSS. Configurado neste projeto. Sem arquivos CSS separados.
Melhor para: Desenvolvimento rápido, UIs responsivas, design systems
CSS Global
styles.scss no angular.jsonapp/globals.css importado no layout. Funciona como styles.scss do Angular.
Melhor para: Reset, variáveis CSS, estilos de bibliotecas terceiras
CSS-in-JS (styled-components, emotion)
Não tem equivalente diretoEstilos em JavaScript. Requer 'use client' ou configuração especial com SSR.
Melhor para: Temas dinâmicos, componentes altamente reutilizáveis
Referências: CSS — Next.js Docs ↗ · Tailwind CSS Docs ↗ · Component Styling — Angular Docs ↗