Skip to content

feat: add scroll-driven animation to About page Timeline section#691

Open
ankitkr104 wants to merge 1 commit intoAOSSIE-Org:mainfrom
ankitkr104:feature/scroll-driven-timeline-animation
Open

feat: add scroll-driven animation to About page Timeline section#691
ankitkr104 wants to merge 1 commit intoAOSSIE-Org:mainfrom
ankitkr104:feature/scroll-driven-timeline-animation

Conversation

@ankitkr104
Copy link
Contributor

@ankitkr104 ankitkr104 commented Mar 18, 2026

  • Add useScroll + useTransform to track scroll progress through timeline
  • Animated yellow vertical line grows/shrinks as user scrolls up/down
  • Travelling yellow dot moves along the line in sync with scroll
  • Dual pulsing rings on the travelling dot for visual depth
  • Background track line added as static reference
  • Pass index prop to TimelineElement for alternating card animations
  • Heading entrance animation updated with scale effect

Closes #690

Recordings:

Aossie.web.mp4

AI Usage Disclosure:

We encourage contributors to use AI tools responsibly when creating Pull Requests. While AI can be a valuable aid, it is essential to ensure that your contributions meet the task requirements, build successfully, include relevant tests, and pass all linters. Submissions that do not meet these standards may be closed without warning to maintain the quality and integrity of the project. Please take the time to understand the changes you are proposing and their impact. AI slop is strongly discouraged and may lead to banning and blocking. Do not spam our repos with AI slop.

Check one of the checkboxes below:

  • This PR does not contain AI-generated code at all.
  • This PR contains AI-generated code. I have read the AI Usage Policy and this PR complies with this policy. I have tested the code locally and I am responsible for it.

I have used the following AI models and tools: TODO

Checklist

  • My PR addresses a single issue, fixes a single bug or makes a single improvement.
  • My code follows the project's code style and conventions
  • If applicable, I have made corresponding changes or additions to the documentation
  • If applicable, I have made corresponding changes or additions to tests
  • My changes generate no new warnings or errors
  • I have joined the Discord server and I will share a link to this PR with the project maintainers there
  • I have read the Contribution Guidelines
  • Once I submit my PR, CodeRabbit AI will automatically review it and I will address CodeRabbit's comments.
  • I have filled this PR template completely and carefully, and I understand that my PR may be closed without review otherwise.

Summary by CodeRabbit

  • New Features
    • Timeline now features scroll-driven animations with enhanced visual effects
    • Added animated visual elements: dynamic progress line, travelling dot with pulsating rings
    • Enhanced header animation that responds to viewport entry
    • Improved overall visual experience with scroll-responsive interactive elements

- Add useScroll + useTransform to track scroll progress through timeline
- Animated yellow vertical line grows/shrinks as user scrolls up/down
- Travelling yellow dot moves along the line in sync with scroll
- Dual pulsing rings on the travelling dot for visual depth
- Background track line added as static reference
- Pass index prop to TimelineElement for alternating card animations
- Heading entrance animation updated with scale effect

Closes AOSSIE-Org#690
@coderabbitai
Copy link

coderabbitai bot commented Mar 18, 2026

📝 Walkthrough

Walkthrough

The Timeline component was refactored to replace static rendering with a scroll-driven animated timeline using Framer Motion. Added scroll tracking hooks (useRef, useScroll, useTransform) to dynamically animate a growing vertical line, traveling dot with pulsating rings, and entry animations synchronized with scroll position.

Changes

Cohort / File(s) Summary
Scroll-Driven Timeline Animation
src/components/about/Timeline.jsx
Replaced static timeline with animated scroll-driven version using Framer Motion. Added useRef, useScroll, and useTransform hooks to track scroll progress and drive line height, dot position, opacity, and glow effects. Updated component structure to use ref-enabled list and propagate indices to TimelineElement components. Introduced animated header with scale and translation effects.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested reviewers

  • Zahnentferner

Poem

🐰 A rabbit hops down the scrolling page,
Where timelines dance upon the stage!
A golden dot leaps to and fro,
While glowing lines steal the show.
History springs alive with grace,
As motion paints each temporal space!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title clearly and concisely describes the main change: adding scroll-driven animations to the About page Timeline section, which directly matches the core functionality implemented.
Linked Issues check ✅ Passed The PR implements all coding requirements from issue #690: animated vertical line growing/shrinking with scroll, yellow travelling dot synchronized with scroll position, and per-element animations via index prop propagation.
Out of Scope Changes check ✅ Passed All changes are focused on implementing scroll-driven timeline animations as specified in issue #690; no unrelated modifications detected beyond the stated objectives.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Tip

CodeRabbit can suggest fixes for GitHub Check annotations.

Configure the reviews.tools.github-checks setting to adjust the time to wait for GitHub Checks to complete.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/components/about/Timeline.jsx (1)

43-59: Travelling dot may overflow at scroll end; consider reduced-motion preference.

Two potential issues:

  1. Overflow at 100%: When glowY reaches "100%", the 15px dot's top edge aligns with the container's bottom, causing the dot to render outside the visible timeline area.

  2. Accessibility: The infinite pulsing animations can be problematic for users with vestibular disorders. Consider respecting prefers-reduced-motion.

Proposed fix for overflow and accessibility
+import { useReducedMotion } from 'framer-motion'

Then in the component:

 export function Timeline() {
   const containerRef = useRef(null)
+  const prefersReducedMotion = useReducedMotion()
   const { scrollYProgress } = useScroll({

Fix the overflow by accounting for dot height:

-  const glowY = useTransform(scrollYProgress, [0, 1], ["0%", "100%"])
+  const glowY = useTransform(scrollYProgress, [0, 1], ["0%", "calc(100% - 15px)"])

Conditionally disable pulsing animations:

           {/* pulsing ring 1 */}
-            <motion.span
-              animate={{ scale: [1, 2.5, 1], opacity: [0.7, 0, 0.7] }}
-              transition={{ duration: 1.6, repeat: Infinity, ease: "easeOut" }}
-              className="absolute inset-0 rounded-full bg-yellow-400"
-            />
+            {!prefersReducedMotion && (
+              <motion.span
+                animate={{ scale: [1, 2.5, 1], opacity: [0.7, 0, 0.7] }}
+                transition={{ duration: 1.6, repeat: Infinity, ease: "easeOut" }}
+                className="absolute inset-0 rounded-full bg-yellow-400"
+              />
+            )}
           {/* pulsing ring 2 — offset */}
-            <motion.span
-              animate={{ scale: [1, 2, 1], opacity: [0.4, 0, 0.4] }}
-              transition={{ duration: 1.6, repeat: Infinity, ease: "easeOut", delay: 0.5 }}
-              className="absolute inset-0 rounded-full bg-yellow-300"
-            />
+            {!prefersReducedMotion && (
+              <motion.span
+                animate={{ scale: [1, 2, 1], opacity: [0.4, 0, 0.4] }}
+                transition={{ duration: 1.6, repeat: Infinity, ease: "easeOut", delay: 0.5 }}
+                className="absolute inset-0 rounded-full bg-yellow-300"
+              />
+            )}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/about/Timeline.jsx` around lines 43 - 59, The moving dot can
overflow when glowY is "100%" and its pulsing is inaccessible; clamp or adjust
glowY so the dot stays fully inside the timeline (e.g., cap the value at
calc(100% - 15px) or compute a numeric max before passing to style top) and
respect reduced-motion by disabling the pulsing animations when the user prefers
reduced motion (use framer-motion's useReducedMotion or matchMedia to
skip/replace the animate/transition props on the motion.div/motion.span elements
and avoid infinite repeats).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/about/Timeline.jsx`:
- Around line 61-88: The TimelineElement instances are being passed an unused
index prop; either remove index from all TimelineElement usages or update the
TimelineElement component (where it destructures {title, description, time}) to
also accept index and apply it to its animation/staggering logic (e.g., use
index to compute animation delay, alternate side placement, or conditional
classes). Locate the TimelineElement component and either delete index from the
props list and from all TimelineElement JSX here, or add index to the
destructured props and incorporate it into the animation/timing/position
calculations so the staggered/alternating behavior mentioned in the PR works.

---

Nitpick comments:
In `@src/components/about/Timeline.jsx`:
- Around line 43-59: The moving dot can overflow when glowY is "100%" and its
pulsing is inaccessible; clamp or adjust glowY so the dot stays fully inside the
timeline (e.g., cap the value at calc(100% - 15px) or compute a numeric max
before passing to style top) and respect reduced-motion by disabling the pulsing
animations when the user prefers reduced motion (use framer-motion's
useReducedMotion or matchMedia to skip/replace the animate/transition props on
the motion.div/motion.span elements and avoid infinite repeats).

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: cbff1e9f-79a6-4552-b1f5-44400a78c3fa

📥 Commits

Reviewing files that changed from the base of the PR and between 56b324c and c54db8c.

📒 Files selected for processing (1)
  • src/components/about/Timeline.jsx

Comment on lines +61 to +88
<TimelineElement index={0}
title="AOSSIE's First Projects" time="2011"
description="3 of AOSSIE's first projects (Skeptik/Scavenger, Carbon Footprint for Google Maps and Mind the Word) were started by Dr. Bruno Woltzenlogel Paleo and started participating in GSoC under the CSE@TU-Wien org."
/>
<TimelineElement index={1}
title="AOSSIE's Creation" time="2016"
description="Dr. Bruno Woltzenlogel Paleo created the Australian Open Source Software Innovation and Education (AOSSIE) while he was a researcher at the Australian National University."
/>
<TimelineElement index={2}
title="First GSoC Participation" time="2016"
description="We participated in Google Summer of Code for the first time, mentoring students from around the world. Our Agora voting project became our fourth project."
/>
<TimelineElement index={3}
title="AOSSIE's Independence" time="2017"
description="AOSSIE was established as an independent not-for-profit charity organization."
/>
<TimelineElement index={4}
title="Pace Acceleration" time="2020"
description="In 2020, AOSSIE accelerated its innovation pace and started several new projects, especially using emerging technologies such as blockchains and AI."
/>
<TimelineElement index={5}
title="Stability Nexus Spin-Off" time="2022"
description="In 2022, AOSSIE's blockchain projects were grouped under the Stability Nexus sub-organization."
/>
<TimelineElement index={6}
title="Becoming an AI-Powered AI-Ready Organization" time="2025--2026"
description="AOSSIE is radically transforming its processes to fully benefit from AI productivity boosts while protecting itself from AI slop."
/>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify TimelineElement's function signature and whether index is used
echo "=== TimelineElement function signature ==="
rg -n "function TimelineElement|const TimelineElement|export.*TimelineElement" src/components/about/TimelineElement.jsx

echo ""
echo "=== Check if 'index' is referenced anywhere in TimelineElement ==="
rg -n "index" src/components/about/TimelineElement.jsx || echo "No references to 'index' found"

Repository: AOSSIE-Org/Website

Length of output: 269


Remove unused index props or implement them for staggered animations in TimelineElement.

The index prop is passed to TimelineElement in lines 61–88 but the component only destructures {title, description, time} and never uses index. If these props were intended to enable alternating or staggered animations (as mentioned in the PR description), update TimelineElement to actually reference the index in its animation logic. Otherwise, remove the index props from all TimelineElement instances.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/about/Timeline.jsx` around lines 61 - 88, The TimelineElement
instances are being passed an unused index prop; either remove index from all
TimelineElement usages or update the TimelineElement component (where it
destructures {title, description, time}) to also accept index and apply it to
its animation/staggering logic (e.g., use index to compute animation delay,
alternate side placement, or conditional classes). Locate the TimelineElement
component and either delete index from the props list and from all
TimelineElement JSX here, or add index to the destructured props and incorporate
it into the animation/timing/position calculations so the staggered/alternating
behavior mentioned in the PR works.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE]: Add scroll-driven animation to the About page Timeline section

1 participant