Skip to content

Conversation

@mahatolalit
Copy link

@mahatolalit mahatolalit commented Dec 8, 2025

#15 This pull request is a major overhaul of the Resonate website, transforming it from a basic React template into a polished, feature-rich landing page for the open-source social voice platform. The update introduces a modern tech stack, new modular components, advanced animations, and an improved user experience. Key changes are grouped below by theme.

Demo
resonate_web_demo

Project Structure & Documentation

  • Completely rewrote the README.md to provide a comprehensive overview of Resonate, its features, tech stack, installation steps, project structure, and contribution guidelines.

Tech Stack & Dependencies

  • Added gsap, lenis, and react-icons to package.json for animations, smooth scrolling, and icon support, respectively.

UI/UX & Branding

  • Updated public/index.html to use a custom favicon, improved meta description, and set a relevant page title for branding and SEO. [1] [2]
  • Overhauled global styles in App.css to use the Inter font and modern layout practices.

Component Architecture & Features

  • Refactored App.js to use new modular components (Navbar, Hero, Features, TechStack, About, DownloadApp, Footer), and implemented GSAP-based section animations and Lenis smooth scrolling.
  • Added new feature-rich components:
    • Hero section with branding and call-to-action.
    • Features section showcasing platform capabilities. [1] [2]
    • TechStack and About sections highlighting technologies and the AOSSIE organization. [1] [2]
    • DownloadApp section with app store buttons. [1] [2]
    • Footer with social links and copyright. [1] [2]

These changes collectively modernize the Resonate landing page, improve maintainability, and provide a strong foundation for further development.

Summary by CodeRabbit

Release Notes

  • New Features

    • Redesigned landing page with new navigation bar, hero section, features showcase, and footer
    • Added smooth scrolling animations throughout the site
    • Introduced download app section with mobile store links
    • Added about section with social media links and project maintainer information
  • Documentation

    • Expanded README with comprehensive project overview, tech stack details, installation instructions, and contribution guidelines
  • Style

    • Updated branding with new favicon and page title
    • Enhanced visual design with improved responsive layouts for all screen sizes

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Dec 8, 2025

Walkthrough

This PR restructures the application into a complete landing page with multiple sections (Navbar, Hero, Features, TechStack, About, DownloadApp, Footer), adds smooth scrolling via Lenis and scroll-triggered animations via GSAP, and introduces three new npm dependencies for enhanced visual effects and icons.

Changes

Cohort / File(s) Summary
Documentation & Configuration
README.md, package.json, public/index.html
Expanded README with project overview and setup instructions; added three dependencies (gsap, lenis, react-icons); updated HTML metadata, favicon, and page title for Resonate branding.
Core App Restructuring
src/App.js, src/App.css
Replaced inline header markup with component composition (Navbar, Hero, Features, TechStack, About, DownloadApp, Footer); added Lenis-based smooth scrolling with requestAnimationFrame loop; introduced extensive GSAP scroll-triggered animations for sections and components; restructured global CSS with reset and flex-based layout.
Component Suite
src/components/Hero/*, src/components/Navbar/*, src/components/Features/*, src/components/TechStack/*, src/components/About/*, src/components/DownloadApp/*, src/components/Footer/*
Created seven new presentation components (each with JS and CSS file) rendering landing page sections: Hero with two-column layout and CTA buttons; Navbar with branding and external links; Features with alternating item layout; TechStack logo display; About with social links; DownloadApp with store buttons; Footer with copyright and social icons.

Sequence Diagram

sequenceDiagram
    participant App as App.js
    participant Lenis as Lenis
    participant RAF as requestAnimationFrame
    participant DOM as DOM/ScrollTrigger
    participant GSAP as GSAP
    
    App->>Lenis: Initialize Lenis instance
    Lenis-->>App: ScrollTrigger context ready
    
    App->>RAF: Start animation loop
    
    loop On Each Frame
        RAF->>Lenis: lenis.raf(time)
        Lenis->>DOM: Update scroll position
        DOM->>GSAP: Trigger registered animations
        GSAP->>DOM: Update element transforms
    end
    
    Note over GSAP: Animations registered for:<br/>Hero (heading, buttons, image)<br/>Features (per-item stagger)<br/>TechStack, About, DownloadApp
    
    App->>App: useEffect cleanup
    App->>Lenis: lenis.destroy()
    App->>GSAP: ScrollTrigger.getAll().forEach(kill)
    RAF-->>App: Stop animation loop
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

  • App.js complexity: Lenis initialization, GSAP animation chains across multiple sections (Hero, Features, TechStack, About, DownloadApp), requestAnimationFrame loop management, and ScrollTrigger cleanup lifecycle
  • New dependencies: Verify gsap (^3.14.0), lenis (^1.3.15), and react-icons (^5.5.0) compatibility and no security issues
  • Animation logic verification: Ensure GSAP animations execute correctly on scroll, stagger timing for features, and scroll-trigger targets properly selected
  • Component rendering order: Confirm component composition and data flow (static content, icon usage, responsive CSS media queries)
  • Cleanup logic: Verify Lenis destruction and ScrollTrigger cleanup prevent memory leaks on unmount

Poem

🐰 A landing page blooms with seven new friends,
Smooth scrolling journeys where Lenis descends,
GSAP weaves magic as users scroll down,
Resonate's voice now adorns the whole town!
With icons and buttons, the hero takes flight,
Our open-source stage shines bold and bright. ✨

Pre-merge checks and finishing touches

❌ 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%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly and accurately reflects the main objective: developing a full static landing page for Resonate, which is the core change across all files.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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.

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: 6

🧹 Nitpick comments (8)
README.md (1)

1-92: Strong README overhaul; consider two small polish tweaks

  • Wording: in Line 3, consider “open-source social voice platform” to match standard compound-adjective style.
  • Project structure block (Lines 59–73): add a language to the fence (for example ```text) to satisfy markdownlint (MD040) and improve rendering.

Example for the structure block:

-```
+```text
 src/
 ...

</blockquote></details>
<details>
<summary>src/components/Footer/Footer.css (1)</summary><blockquote>

`1-42`: **Footer styles are clean; consider slightly larger icon hit areas**

The layout/hover effects look good. If you want to nudge accessibility, consider increasing `.footer-socials a` width/height to ~40–44px to better match recommended touch target sizes.

```diff
-.footer-socials a {
-  width: 30px;
-  height: 30px;
+.footer-socials a {
+  width: 40px;
+  height: 40px;
src/components/NavBar/Navbar.css (1)

1-105: Add focus styles for links/button to improve keyboard accessibility

Navbar visuals and responsiveness look solid. To help keyboard users, add explicit :focus-visible (or :focus) styles for .nav-link and .download-btn, not just :hover.

For example:

 .nav-link:hover {
   color: #FFC107;
 }
+
+.nav-link:focus-visible {
+  outline: 2px solid #FFC107;
+  outline-offset: 2px;
+}

 .download-btn:hover {
   background-color: #ffca2c;
   transform: scale(1.05);
 }
+
+.download-btn:focus-visible {
+  outline: 2px solid #FFC107;
+  outline-offset: 2px;
+}
src/components/TechStack/TechStack.js (1)

1-24: TechStack component is straightforward; consider normalizing asset filenames

The section markup and alt texts look good and match the CSS. As a small maintainability tweak, consider renaming Flutter svg.png / Appwrite svg.png to filenames without spaces (e.g. flutter-logo.png, appwrite-logo.png) and updating the imports accordingly—this tends to play nicer with tooling and shell usage over time.

src/components/Features/Features.js (1)

5-30: Consider using unique images for each feature.

All four features currently use the same image (featureImage). While this may be intentional for the initial launch, consider using unique visuals for each feature to better illustrate their distinct functionality and improve visual variety.

src/components/Hero/Hero.js (2)

4-4: Consider renaming the asset to avoid spaces in the filename.

The image path contains a space (resonate1 1.png), which can cause issues in some build systems, URLs, or deployment environments. Renaming to resonate1-1.png or resonate1.png would be more robust.


16-16: Add target="_blank" and rel="noopener noreferrer" to the external link.

For consistency with other external links in the codebase (e.g., Navbar.js uses these attributes for external links) and to prevent potential tabnabbing, consider adding these attributes.

-          <p className="maintained-by">A Project Maintained by <a href="https://aossie.org" className="aossie-link">AOSSIE</a></p>
+          <p className="maintained-by">A Project Maintained by <a href="https://aossie.org" target="_blank" rel="noopener noreferrer" className="aossie-link">AOSSIE</a></p>
src/App.js (1)

72-93: Consider null checks when querying child elements.

If a .feature-item element doesn't have .feature-image or .feature-content h3 children (e.g., due to future refactoring), querySelector returns null, and GSAP will silently skip the animation. This is acceptable behavior, but adding a guard could make debugging easier.

     gsap.utils.toArray('.feature-item').forEach((feature, i) => {
       const image = feature.querySelector('.feature-image');
       const text = feature.querySelector('.feature-content h3');
+      
+      if (!image || !text) return;

       const tl = gsap.timeline({
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c0b8506 and a7be852.

⛔ Files ignored due to path filters (12)
  • package-lock.json is excluded by !**/package-lock.json
  • public/resonate_logo_white.svg is excluded by !**/*.svg
  • src/assets/Appwrite svg.png is excluded by !**/*.png
  • src/assets/Button-1.png is excluded by !**/*.png
  • src/assets/Button.png is excluded by !**/*.png
  • src/assets/Flutter svg.png is excluded by !**/*.png
  • src/assets/Group 35899.png is excluded by !**/*.png
  • src/assets/Vector.png is excluded by !**/*.png
  • src/assets/aossie_logo.png is excluded by !**/*.png
  • src/assets/image 1.png is excluded by !**/*.png
  • src/assets/resonate1 1.png is excluded by !**/*.png
  • src/assets/resonate_logo_white.svg is excluded by !**/*.svg
📒 Files selected for processing (19)
  • README.md (1 hunks)
  • package.json (1 hunks)
  • public/index.html (2 hunks)
  • src/App.css (1 hunks)
  • src/App.js (1 hunks)
  • src/components/About/About.css (1 hunks)
  • src/components/About/About.js (1 hunks)
  • src/components/DownloadApp/DownloadApp.css (1 hunks)
  • src/components/DownloadApp/DownloadApp.js (1 hunks)
  • src/components/Features/Features.css (1 hunks)
  • src/components/Features/Features.js (1 hunks)
  • src/components/Footer/Footer.css (1 hunks)
  • src/components/Footer/Footer.js (1 hunks)
  • src/components/Hero/Hero.css (1 hunks)
  • src/components/Hero/Hero.js (1 hunks)
  • src/components/NavBar/Navbar.css (1 hunks)
  • src/components/NavBar/Navbar.js (1 hunks)
  • src/components/TechStack/TechStack.css (1 hunks)
  • src/components/TechStack/TechStack.js (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
src/App.js (7)
src/components/NavBar/Navbar.js (1)
  • Navbar (6-26)
src/components/Hero/Hero.js (1)
  • Hero (6-36)
src/components/Features/Features.js (1)
  • Features (32-47)
src/components/TechStack/TechStack.js (1)
  • TechStack (6-22)
src/components/About/About.js (1)
  • About (7-30)
src/components/DownloadApp/DownloadApp.js (1)
  • DownloadApp (6-22)
src/components/Footer/Footer.js (1)
  • Footer (5-21)
🪛 LanguageTool
README.md

[uncategorized] ~3-~3: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...cial landing page for Resonate - an Open Source social voice platform maintained by [AO...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

🪛 markdownlint-cli2 (0.18.1)
README.md

59-59: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🔇 Additional comments (12)
public/index.html (1)

5-27: Branding/meta updates look good; confirm favicon asset

The new title/description are aligned with the landing page. Please just confirm %PUBLIC_URL%/resonate_logo_white.svg exists in public/ so the favicon doesn’t 404 in production.

src/components/TechStack/TechStack.css (1)

1-41: Solid, simple styling for the tech stack section

Layout, spacing, and logo sizing look good and should behave well across viewports given the flex-wrap.

src/components/Features/Features.css (1)

1-64: Features layout and responsive behavior look good

Alternating row layout, image treatment, and the mobile column fallback are coherent with a modern marketing page section.

package.json (1)

9-15: Dependency versions are current and compatible

The specified versions for gsap (^3.14.0), lenis (^1.3.15), and react-icons (^5.5.0) are all at their latest releases and compatible with your React 18 / Create React App setup.

src/components/About/About.css (1)

1-71: LGTM!

The styling is well-structured with good use of flexbox layout, appropriate spacing, hover states, and mobile responsiveness. The breakpoint at 768px appropriately adjusts the layout for smaller screens.

src/App.css (1)

1-19: LGTM!

The global styles provide a clean foundation with a proper CSS reset, modern font stack (Inter), and appropriate base layout for the app container. The font smoothing properties enhance text rendering across browsers.

src/components/DownloadApp/DownloadApp.css (1)

1-39: LGTM!

The styling provides a clean, centered card design with appropriate spacing, responsive flex layout for store buttons, and a subtle hover effect that enhances user interaction.

src/components/Hero/Hero.js (1)

18-25: Buttons lack click handlers — verify if this is intentional.

Both buttons are rendered without onClick handlers or navigation logic. If they're placeholders for future functionality, consider adding disabled state or TODO comments. If they should be functional:

  • "Create/Join Room" might need to link to the app or a specific route.
  • "Contribute to the Project" could link to the GitHub repository.
-            <button className="btn btn-primary">
+            <a href="#download-app" className="btn btn-primary">
               Create/Join Room <FaArrowRight />
-            </button>
-            <button className="btn btn-secondary">
+            </a>
+            <a href="https://github.com/AOSSIE/Resonate" target="_blank" rel="noopener noreferrer" className="btn btn-secondary">
               Contribute to the Project <FaGithub />
-            </button>
+            </a>
src/components/Hero/Hero.css (1)

1-112: Well-structured responsive layout.

The CSS follows good practices with flexbox layout, proper use of max-width for content containment, and a clean mobile breakpoint. The color palette is consistent and the overall styling aligns well with modern landing page patterns.

src/App.js (3)

40-69: Hero animation is well-structured with proper sequencing.

The staggered timeline approach for the hero section creates a polished entrance animation. The use of negative offsets ("-=0.8") provides smooth overlap between animations.


169-174: Cleanup logic is mostly correct but incomplete.

The cleanup properly destroys Lenis and kills all ScrollTrigger instances. However, as noted above, the requestAnimationFrame loop should also be cancelled to fully prevent memory leaks.


176-186: Clean component composition.

The component tree is well-organized with a logical ordering of sections. The modular approach with separate components for each section improves maintainability.

Comment on lines +30 to +35
function raf(time) {
lenis.raf(time);
requestAnimationFrame(raf);
}

requestAnimationFrame(raf);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Memory leak: requestAnimationFrame loop continues after unmount.

The recursive requestAnimationFrame loop is never cancelled in the cleanup function. While lenis.destroy() is called, the rAF callback continues to run and calls lenis.raf() on a destroyed instance, potentially causing errors or memory leaks.

Store the frame ID and cancel it during cleanup:

+    let rafId;
+
     function raf(time) {
       lenis.raf(time);
-      requestAnimationFrame(raf);
+      rafId = requestAnimationFrame(raf);
     }

-    requestAnimationFrame(raf);
+    rafId = requestAnimationFrame(raf);

     // ... animations ...

     // Cleanup function
     return () => {
+      cancelAnimationFrame(rafId);
       lenis.destroy();
       ScrollTrigger.getAll().forEach(t => t.kill());
     };

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In src/App.js around lines 30 to 35, the recursive requestAnimationFrame loop is
started but never cancelled, so it continues after unmount and may call
lenis.raf on a destroyed instance; fix by storing the rAF id (e.g., let rafId =
requestAnimationFrame(raf)) and updating raf to reassign rafId each tick, then
in the component cleanup call cancelAnimationFrame(rafId) (and keep
lenis.destroy()) and optionally guard lenis.raf with a check that the lenis
instance still exists to prevent calls after destruction.

<a href="mailto:contact@aossie.org"><FaEnvelope /></a>
<a href="https://gitlab.com/aossie"><SiGitlab /></a>
<a href="https://github.com/AOSSIE"><FaGithub /></a>
<a href="https://discord.gg/yourlink"><FaDiscord /></a>
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

Update the Discord invite link.

The Discord link currently uses a placeholder URL (https://discord.gg/yourlink) that won't work for users trying to join your community.

🤖 Prompt for AI Agents
In src/components/About/About.js at line 23 the Discord anchor uses a
placeholder URL ("https://discord.gg/yourlink"); replace that href with the real
Discord invite link (or read it from a config/prop or environment variable so it
can be changed without code edits) and ensure the value is a valid, well-formed
invite URL before deploying.

Comment on lines +12 to +17
<a href="#" className="store-btn">
<img src={appStoreBtn} alt="Download on App Store" />
</a>
<a href="#" className="store-btn">
<img src={playStoreBtn} alt="Get it on Google Play" />
</a>
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

Add actual app store URLs.

Both store button links use placeholder href="#" values, which means they won't navigate to the app stores when clicked. Update these with the actual App Store and Google Play URLs once the apps are published.

🤖 Prompt for AI Agents
In src/components/DownloadApp/DownloadApp.js around lines 12 to 17, the anchor
tags for the App Store and Google Play buttons use placeholder href="#" values;
replace these with the actual App Store and Google Play URLs (or configurable
env/props values) so the buttons navigate to the correct store pages. Update the
first anchor href to the App Store URL and the second to the Google Play URL, or
read them from a config/props so they can be set when the apps are published;
keep the existing className and img elements unchanged.

Comment on lines +13 to +16
<a href="#"><FaInstagram /></a>
<a href="#"><FaFacebookF /></a>
<a href="#"><FaTwitter /></a>
<a href="#"><FaLinkedinIn /></a>
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

Add actual social media URLs.

All social media links currently use placeholder href="#" values. Update these with the actual social media profile URLs for your organization.

🤖 Prompt for AI Agents
In src/components/Footer/Footer.js around lines 13 to 16 the social anchor tags
use placeholder href="#" values; replace each href with the actual organization
social profile URLs (e.g., Instagram, Facebook, Twitter, LinkedIn) ensuring they
are absolute URLs (https://...), keep existing icon components, and verify each
link opens in a new tab with rel="noopener noreferrer" if desired for external
links and update tests or snapshots accordingly.

Comment on lines +86 to +88
.btn:hover {
transform: scale(1.02);
}
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

Add focus styles for keyboard accessibility.

The buttons have hover states but lack corresponding focus styles for keyboard navigation. This is an accessibility concern for users who navigate via keyboard.

 .btn:hover {
   transform: scale(1.02);
 }
+
+.btn:focus {
+  outline: 2px solid #1a1a1a;
+  outline-offset: 2px;
+}
+
+.btn:focus:not(:focus-visible) {
+  outline: none;
+}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.btn:hover {
transform: scale(1.02);
}
.btn:hover {
transform: scale(1.02);
}
.btn:focus {
outline: 2px solid #1a1a1a;
outline-offset: 2px;
}
.btn:focus:not(:focus-visible) {
outline: none;
}
🤖 Prompt for AI Agents
In src/components/Hero/Hero.css around lines 86 to 88, the .btn rule adds a
hover transform but omits keyboard focus styles; add a matching :focus-visible
(and :focus fallback) rule that applies the same transform and a visible focus
outline or box-shadow for accessibility, ensure it uses the same transition
timing as hover and does not remove default focus unless replaced with an
accessible custom outline, and scope the selector to .btn:focus-visible (and
.btn:focus) so keyboard users receive the same visual feedback as mouse users.

<a href="https://github.com/AOSSIE/Resonate" target="_blank" rel="noopener noreferrer" className="nav-link">
<FaGithub size={20} />
</a>
<button className="download-btn">Download Now</button>
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

Add functionality to the Download button.

The "Download Now" button currently has no onClick handler or link. Consider adding functionality to either navigate to the download section (e.g., using smooth scroll) or link to an external download page.

Would you like me to suggest an implementation that smoothly scrolls to the DownloadApp section when clicked?

🤖 Prompt for AI Agents
In src/components/NavBar/Navbar.js around line 21, the "Download Now" button
lacks an onClick or href so it does nothing; add functionality to either
navigate to the DownloadApp section via smooth scroll or link to an external
download URL. Implement by giving the button an onClick that finds the target
element (e.g., document.getElementById('download-app') or a React ref) and calls
scrollIntoView({ behavior: 'smooth' }); alternatively, use an anchor <a
href="https://example.com/download"> for external downloads; ensure the handler
is added in the component, the target section has the matching id, and include
an accessible aria-label and cursor styling.

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.

1 participant