Conversation
There was a problem hiding this comment.
Oi @Luana-lua ,
Você poderia melhorar a descrição deste PR, incluindo mais detalhes sobre as mudanças e o impacto delas no projeto? Além disso, seria importante adicionar uma seção explicando como testar as alterações, passo a passo, para que os revisores consigam validar o funcionamento corretamente.
Quando adicionar, só solicitar minha revisão novamente.
Obrigado!
There was a problem hiding this comment.
Pull request overview
Este PR cria a “Motion Base” do projeto: uma camada de hooks para padronizar animações de scroll com GSAP/ScrollTrigger, além de componentes de demo para validação visual e stress test.
Changes:
- Adiciona hooks de animação com ScrollTrigger (
useScrollTrigger,useStaggerScroll,useScrollTimeline,useScrollPin). - Adiciona componentes de demonstração (
MotionDemo,LaptopSection) para validar efeitos (fade/translate, stagger, timeline, pin/scrub). - Atualiza
App.tsxpara importar os componentes de demo (com bloco comentado) e atualizapackage-lock.json.
Reviewed changes
Copilot reviewed 4 out of 5 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| lp-code/src/hooks/scrollHooks.ts | Introduz hooks de abstração para animações com ScrollTrigger e timeline/pin. |
| lp-code/src/components/MotionDemo.tsx | Implementa página de demo para validar animações simples, stagger e timeline. |
| lp-code/src/components/LaptopSection.tsx | Implementa demo de pin + scrub com timeline (stress test). |
| lp-code/src/App.tsx | Importa componentes de demo e adiciona bloco de instruções/comentários (atualmente dentro do JSX). |
| lp-code/package-lock.json | Ajustes no lockfile (metadados como peer). |
Files not reviewed (1)
- lp-code/package-lock.json: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
oEnzoRibas
left a comment
There was a problem hiding this comment.
Os hooks funcionaram bem, mas faltou ter responsividade para Desktop.
Ainda é preciso:
- Documentar os componentes e hooks com dockstring para melhor versionamento e registro
- Fazer testes para cada componente utilizado, vide exemplo em #71
lp-code/src/hooks/scrollHooks.ts
Outdated
|
|
||
|
|
||
| //hook animacao stagger p multiplos elementos | ||
| export const useStaggerScroll = ( |
There was a problem hiding this comment.
Adicionada nova task para melhorar a flexibilidade desse hook, em #74. Pode incluir no mesmo PR.
…ing-page-code into feature/motion-base
|
Concluí as alterações solicitadas na revisão: Hooks personalizados: Implementada a Task #74 no useStaggerScroll (agora aceita scrollVars) e removido o uso de any no useScrollPin, que agora retorna a tl (timeline) de forma tipada Responsividade: Adicionado suporte a Mobile/Tablet através de ajustes de layout via Tailwind (grid adaptável e tipografia) e lógica condicional nos hooks Segurança (TypeScript): Adicionadas guards (null checks) para garantir que os refs existam antes de iniciar as animações, evitando erros em Strict Mode Documentação: Todos os hooks e componentes agora possuem Docstrings |
oEnzoRibas
left a comment
There was a problem hiding this comment.
Oi, @Luana-lua! Ficou muito bom, especialmente o notebook. Agora só preciso dos testes unitários utilizando a @testing-library/react. Achei que já tinha pedido isso no outro review, mas aparentemente me esqueci.
O @pedrolucasvsr está utilizando essa biblioteca também, na branch dele tem um exemplo que eu deixei de como fazer os testes para cada componente e hook.
Só clicar aqui.
Um exemplo do formato do teste esperado:
import { render, screen, fireEvent } from "@testing-library/react";
import { Button } from "./Button";
/**
* Test suite do componente Button.
* Garante renderização correta, comportamento de clique e estado desabilitado.
*/
describe("Button", () => {
/**
* Deve renderizar o texto passado como children no botão.
*/
it("renderiza o texto corretamente", () => {
render(<Button>Salvar</Button>);
expect(screen.getByText("Salvar")).toBeInTheDocument();
});
/**
* Deve chamar a função onClick exatamente uma vez ao clicar no botão.
*/
it("chama onClick quando clicado", () => {
const handleClick = vi.fn();
render(<Button onClick={handleClick}>Clique</Button>);
fireEvent.click(screen.getByText("Clique"));
expect(handleClick).toHaveBeenCalledTimes(1);
});
/**
* Deve impedir interação quando o botão estiver desabilitado.
*/
it("está desabilitado quando disabled é true", () => {
render(<Button disabled>Desativado</Button>);
expect(screen.getByRole("button")).toBeDisabled();
});
});e para hooks:
import { render, screen, fireEvent } from "@testing-library/react";
import { Button } from "./Button";
/**
* Test suite do componente Button.
* Garante renderização correta, comportamento de clique e estado desabilitado.
*/
describe("Button", () => {
/**
* Deve renderizar o texto passado como children no botão.
*/
it("renderiza o texto corretamente", () => {
render(<Button>Salvar</Button>);
expect(screen.getByText("Salvar")).toBeInTheDocument();
});
/**
* Deve chamar a função onClick exatamente uma vez ao clicar no botão.
*/
it("chama onClick quando clicado", () => {
const handleClick = vi.fn();
render(<Button onClick={handleClick}>Clique</Button>);
fireEvent.click(screen.getByText("Clique"));
expect(handleClick).toHaveBeenCalledTimes(1);
});
/**
* Deve impedir interação quando o botão estiver desabilitado.
*/
it("está desabilitado quando disabled é true", () => {
render(<Button disabled>Desativado</Button>);
expect(screen.getByRole("button")).toBeDisabled();
});
});
lp-code/src/hooks/scrollHooks.ts
Outdated
|
|
||
|
|
||
| //hook animacao stagger p multiplos elementos | ||
| export const useStaggerScroll = ( |
Convert scroll hooks to generic, typed refs and add dependency tracking for useGSAP calls. useScrollTrigger, useScrollTimeline and useScrollPin now accept generic HTMLElement types, perform safer null checks, and include dependencies so animations update correctly. useStaggerScroll was refactored to take a containerRef plus from/to animation vars and uses gsap.fromTo with stagger and overwrite handling (and no longer creates an internal ref). MotionDemo was updated to use the new APIs: added cardsRef, updated useStaggerScroll invocation, switched timeline step to scaleX with transformOrigin, increased card count/styling (9 cards, binary labels, style tweaks), and minor layout/accessibility tweaks (will-change hint). These changes improve type safety, reusability, and correct stagger/scroll-trigger behavior.
OverviewAproveitei pra me familirizar um pouco mais com o GSAP, então corrigi um bug da animação do hook de stagger. O que foi feito:Arquitetura e Hooks (scrollHooks.ts):
Bugfix Crítico:
Anexos:Antes:Desktop.2026.04.04.-.11.43.57.04.mp4Depois:Desktop.2026.04.04.-.11.52.54.07.mp4Problemas sabidosAinda existem alguns bugs da animação no Stagger, que precisão de manuntenção futura. |
📝 Resumo das Mudanças
Este PR estabelece a base de animação (Motion Base) do projeto, criando uma camada de abstração sobre o GSAP. O objetivo é padronizar a implementação de animações, garantindo que sejam reutilizáveis e livres de vazamento de memória.
🛠 Detalhes Técnicos & Impacto
🧪 Como Validar (Passo a Passo)
Para validar estas alterações, siga os passos abaixo:
import MotionDemo from './components/MotionDemo';
import LaptopSection from './components/LaptopSection';