You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Once the Privacy Policy page has been redesigned into a modern, sectioned layout (see prerequisite issue below), this issue tracks the addition of scroll-triggered and entrance animations to the Privacy Policy page β matching the animation quality and style already established on the Landing Page.
β οΈDEPENDENCY β DO NOT START THIS ISSUE UNTIL THE FOLLOWING IS FULLY MERGED: # β Redesign Privacy Policy Page: Replace Accordion with Modern Sectioned Layout
This issue requires the sectioned component architecture from that issue. Working on animations before the layout redesign is complete will result in wasted effort and merge conflicts.
You have reviewed how the Landing Page implements its animations and understand the libraries/patterns used (e.g., Framer Motion, CSS transitions, Intersection Observer β check LandingPage.jsx to confirm which approach the project uses).
π¨ Animation Requirements
Per-Section Entrance Animation
Each section component should animate in when it enters the viewport. Suggested animation for each section:
Fade in from 0 β 1 opacity.
Slide up from translateY(40px) β translateY(0).
Duration: 0.6s β 0.8s with an ease-out curve.
Delay: Stagger child elements within a section (heading first, then body text) by ~100msβ150ms.
Section Heading Animation
Large section headings should animate with a slightly more dramatic entrance β e.g., slide in from the left (translateX(-30px) β translateX(0)) while the body fades up from below.
Scroll-Triggered (not all-at-once)
Animations must be triggered by scroll position (Intersection Observer or equivalent), not on page load.
Sections that are not yet in the viewport should be invisible until they scroll into view.
Once a section has animated in, it should remain visible β do not re-animate on scroll-up.
Performance
Use CSS will-change: transform, opacity sparingly and only on animated elements.
Prefer transform and opacity for animations (GPU-composited) β avoid animating height, margin, or padding.
Animations must not cause Cumulative Layout Shift (CLS > 0).
Respect User Preference
Wrap all animations in a prefers-reduced-motion media query check (or Framer Motion's useReducedMotion hook). Users who have reduced motion enabled must see the final state instantly with no animation.
π οΈ Implementation Notes
Study the Landing Page first. Open frontend/src/pages/LandingPage.jsx and identify:
Which animation library or approach is used (Framer Motion, GSAP, CSS keyframes, Intersection Observer API, etc.).
How scroll-triggered animations are wired up.
The exact easing curves, durations, and transform values.
Reuse the same approach β do not introduce a new animation library if the Landing Page already uses one.
If the project uses Framer Motion, use motion components with viewport prop on each section wrapper:
If the project uses Intersection Observer with CSS classes, add an is-visible class toggle and define the animation in CSS.
Apply animations inside each individual section component (e.g., PrivacyIntro.jsx, PrivacyInfoCollect.jsx) β not in the parent PrivacyPage.jsx β to keep components self-contained.
π Overview
Once the Privacy Policy page has been redesigned into a modern, sectioned layout (see prerequisite issue below), this issue tracks the addition of scroll-triggered and entrance animations to the Privacy Policy page β matching the animation quality and style already established on the Landing Page.
π― Goals
π Prerequisites
Before starting this issue, ensure:
LandingPage.jsxto confirm which approach the project uses).π¨ Animation Requirements
Per-Section Entrance Animation
Each section component should animate in when it enters the viewport. Suggested animation for each section:
translateY(40px)βtranslateY(0).0.6sβ0.8swith an ease-out curve.~100msβ150ms.Section Heading Animation
translateX(-30px)βtranslateX(0)) while the body fades up from below.Scroll-Triggered (not all-at-once)
Performance
will-change: transform, opacitysparingly and only on animated elements.transformandopacityfor animations (GPU-composited) β avoid animatingheight,margin, orpadding.Respect User Preference
prefers-reduced-motionmedia query check (or Framer Motion'suseReducedMotionhook). Users who have reduced motion enabled must see the final state instantly with no animation.π οΈ Implementation Notes
frontend/src/pages/LandingPage.jsxand identify:motioncomponents withviewportprop on each section wrapper:is-visibleclass toggle and define the animation in CSS.PrivacyIntro.jsx,PrivacyInfoCollect.jsx) β not in the parentPrivacyPage.jsxβ to keep components self-contained.β Acceptance Criteria
whileInView) β not on initial page load.transformandopacity(no layout-shift-inducing properties).prefers-reduced-motionis respected β reduced-motion users see the final state immediately.π References
frontend/src/pages/LandingPage.jsx