🧩 Exercícios: Estilização Moderna: Tailwind CSS e CSS Modules
Spec Frontend Com React • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 12.1 — Estilização Atômica com Classes Utilitárias do Tailwind CSS
Contexto: Estilização Atômica com Classes Utilitárias do Tailwind CSS no contexto de Estilização Moderna: Tailwind CSS e CSS Modules.
Requisitos de Execução:
- Criar componente de Card responsivo usando classes Tailwind (
flex,p-6,bg-white,rounded-xl,shadow-md).
Resultado Esperado
Card estilizado responsivamente com Tailwind CSS.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_12_1_SeuNome - Envie na tarefa:
Atividade Cap 12 - Estilização Moderna: Tailwind CSS e CSS Modules
🔑 Gabarito de Código & Solução Comentada
// TailwindCard.tsx
import React from 'react';
export const TailwindCard: React.FC<{ titulo: string; desc: string }> = ({ titulo, desc }) => {
return (
<div className="p-6 max-w-sm mx-auto bg-white rounded-xl shadow-lg flex items-center space-x-4">
<div>
<div className="text-xl font-medium text-black">{titulo}</div>
<p className="text-slate-500">{desc}</p>
</div>
</div>
);
};
🔍 Nível 2: Prática
Problema 12.2 — Variantes de Componente com clsx e tailwind-merge (cn helper)
Contexto: Variantes de Componente com clsx e tailwind-merge (cn helper) no contexto de Estilização Moderna: Tailwind CSS e CSS Modules.
Requisitos de Execução:
- Criar utilitário
cn(...inputs)para mesclar classes condicionais e resolver conflitos de classes Tailwind.
Resultado Esperado
Utilitário `cn()` combinando classes sem conflito de especificidade.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_12_2_SeuNome - Envie na tarefa:
Atividade Cap 12 - Estilização Moderna: Tailwind CSS e CSS Modules
🔑 Gabarito de Código & Solução Comentada
// utils/cn.ts
import { clsx, type ClassValue } from 'clsx';
import { twMerge } from 'tailwind-merge';
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
⚡ Nível 3: Integração
Problema 12.3 — Escopo Local de Estilos com CSS Modules (.module.css)
Contexto: Escopo Local de Estilos com CSS Modules (.module.css) no contexto de Estilização Moderna: Tailwind CSS e CSS Modules.
Requisitos de Execução:
- Criar arquivo
Botao.module.csscom classes.botaoPrimarioe importar como objeto de estilos.
Resultado Esperado
Classes com hash único geradas evitando vazamento de estilos globais.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_12_3_SeuNome - Envie na tarefa:
Atividade Cap 12 - Estilização Moderna: Tailwind CSS e CSS Modules
🔑 Gabarito de Código & Solução Comentada
// BotaoModule.tsx
import React from 'react';
import styles from './Botao.module.css';
export const BotaoModule: React.FC<{ texto: string }> = ({ texto }) => {
return <button className={styles.botaoPrimario}>{texto}</button>;
};
🏆 Nível 4: Desafio Corporativo
Problema 12.4 — Design System com CVA (class-variance-authority)
Contexto: Design System com CVA (class-variance-authority) no contexto de Estilização Moderna: Tailwind CSS e CSS Modules.
Requisitos de Execução:
- Criar componente de botão corporativo com variantes
primary,secondary,destructivee tamanhossm,md,lgusando CVA.
Resultado Esperado
Design System corporativo com tipagem estrita de variantes visuais.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_12_4_SeuNome - Envie na tarefa:
Atividade Cap 12 - Estilização Moderna: Tailwind CSS e CSS Modules
🔑 Gabarito de Código & Solução Comentada
// ButtonCVA.tsx
import { cva, type VariantProps } from 'class-variance-authority';
import React from 'react';
const buttonVariants = cva('inline-flex items-center justify-center rounded-md font-medium transition-colors', {
variants: {
variant: {
primary: 'bg-blue-600 text-white hover:bg-blue-700',
destructive: 'bg-red-600 text-white hover:bg-red-700',
},
size: { sm: 'h-8 px-3 text-sm', md: 'h-10 px-4' },
},
defaultVariants: { variant: 'primary', size: 'md' },
});
export const CvaButton = ({ variant, size, ...props }: VariantProps<typeof buttonVariants> & React.ButtonHTMLAttributes<HTMLButtonElement>) => (
<button className={buttonVariants({ variant, size })} {...props} />
);