Skip to content

Landing page redesign#108

Closed
AshishDev-16 wants to merge 2 commits into
ketankauntia:masterfrom
AshishDev-16:Landing-Page-Redesign
Closed

Landing page redesign#108
AshishDev-16 wants to merge 2 commits into
ketankauntia:masterfrom
AshishDev-16:Landing-Page-Redesign

Conversation

@AshishDev-16
Copy link
Copy Markdown

@AshishDev-16 AshishDev-16 commented Mar 31, 2026

Overview

Redesigns the GSoC Organizations Guide landing page with a clean, premium white-themed SaaS aesthetic (zinc/blue palette) inspired by modern developer tooling sites (Vercel, Linear, Stripe). All original open-source data, content, image assets, and routing logic are strictly preserved — this is a pure UI/UX layer change.

Components Updated

Component Change
hero-component Center-aligned layout with rotating blue animated keyword text, solid underline accent, and centered subtitle
value-blocks Unified ZigZag alternating grid replacing four stacked blocks; all original .webp images and copy preserved
testimonials Multi-card white carousel with star ratings and clean card borders; fixed Chinese character typo in className
latest-articles Minimalist white card grid with hover lift effects and blue "Read more" links
faq Two-column sticky layout (heading pinned left, accordion on right) to reduce vertical scroll footprint
waitlist-cta High-impact full-width blue CTA block with email capture form and radiant glow blobs
Footer Lightweight zinc/white footer integrating cleanly after the blue CTA section
trending-orgs-client Replaced Embla carousel with a dual-track Framer Motion infinite marquee — row 1 scrolls left, row 2 scrolls right; cards have blue hover glow, float animation, and edge gradient fades

Data integrity: No FAQ entries, testimonials, article metadata, org slugs, or image URLs were modified.

Summary

  • Implements a cohesive "Emergent SaaS" design system across the entire landing page
  • Reduces page vertical scroll length via side-by-side layouts (FAQ, value blocks)
  • Replaces the basic Embla org carousel with a visually engaging dual-track Framer Motion marquee
  • Improves perceived performance with loading="lazy" and object-contain on org logos
  • Fixes a pre-existing className typo (text-锌-50text-zinc-50) in testimonials.tsx
  • Zero breaking changes — all routes, API calls, and data fetching remain untouched

Testing

  • Verified locally with pnpm dev — all sections render correctly at desktop and mobile viewports
  • pnpm lint — passes with 0 errors (ESLint auto-fix applied via lint-staged)
  • pnpm type-check — passes with 0 type errors
  • pnpm build — all 9 modified files compiled successfully; no new build errors introduced
  • Dual-track marquee loops seamlessly without jank or layout shift
  • FAQ sticky column behavior verified on large screens; stacks correctly on mobile

Checklist

  • One logical change per PR
  • PR description is complete
  • No refactors without prior discussion
  • Follows existing project structure

Summary by CodeRabbit

Release Notes

  • New Features & UI Updates
    • Enhanced hero section with animated badges, gradient backgrounds, and additional call-to-action buttons
    • Redesigned testimonials with star ratings and larger avatar displays
    • Converted trending organizations section to smooth infinite scrolling marquee layout
    • Improved article cards with image previews and direct per-article navigation
    • Restructured footer navigation with improved organization and layout
    • Updated FAQ section with refined styling and accordion interactions
    • Refined waitlist signup form with enhanced visual design and better error handling

Redesign the GSoC Organizations Guide landing page with a clean,
premium white-themed SaaS aesthetic while strictly preserving all
original open-source data, content, and image assets.

Components updated:
- hero-component: center-aligned layout with rotating blue animated
  keyword text ('Better', 'Smarter', etc.), solid underline accent,
  and centered subtitle
- value-blocks: unified ZigZag alternating grid layout replacing four
  separate stacked blocks; preserves all original .webp images and copy
- testimonials: multi-card white carousel with star ratings and clean
  card borders; fix Chinese character typo in className
- latest-articles: minimalist white card grid with hover effects and
  blue 'Read more' links
- faq: two-column sticky layout (heading left, accordion right) to
  reduce vertical scroll footprint
- waitlist-cta: high-impact full-width blue CTA block with email
  capture form and radiant glow blobs
- Footer: lightweight zinc/white template integrating cleanly after
  the blue CTA section
- trending-orgs-client: replace Embla carousel with dual-track Framer
  Motion infinite marquee; row 1 scrolls left, row 2 scrolls right;
  cards feature blue hover glow, float animation, and edge gradient fades

No data mutations: all FAQ entries, testimonials, article metadata,
org slugs, and image URLs remain untouched.
Remove MoveRight, Sparkles (lucide-react) and Heading, Text
(@/components/ui) which were imported but never referenced in
hero-component.tsx.

Resolves no-unused-vars warnings introduced during the landing
page redesign.
@vercel
Copy link
Copy Markdown

vercel Bot commented Mar 31, 2026

@AshishDev-16 is attempting to deploy a commit to the Ketan's Personal Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 31, 2026

Warning

.coderabbit.yaml has a parsing error

The CodeRabbit configuration file in this repository has a parsing error and default settings were used instead. Please fix the error(s) in the configuration file. You can initialize chat with CodeRabbit to get help with the configuration file.

💥 Parsing errors (1)
Validation error: Expected 'de' | 'de-DE' | 'de-AT' | 'de-CH' | 'en' | 'en-US' | 'en-AU' | 'en-GB' | 'en-CA' | 'en-NZ' | 'en-ZA' | 'es' | 'es-AR' | 'fr' | 'fr-CA' | 'fr-CH' | 'fr-BE' | 'nl' | 'nl-BE' | 'pt-AO' | 'pt' | 'pt-BR' | 'pt-MZ' | 'pt-PT' | 'ar' | 'ast-ES' | 'ast' | 'be-BY' | 'be' | 'br-FR' | 'br' | 'ca-ES' | 'ca' | 'ca-ES-valencia' | 'ca-ES-balear' | 'da-DK' | 'da' | 'de-DE-x-simple-language' | 'el-GR' | 'el' | 'eo' | 'fa' | 'ga-IE' | 'ga' | 'gl-ES' | 'gl' | 'it' | 'ja-JP' | 'ja' | 'km-KH' | 'km' | 'ko-KR' | 'ko' | 'pl-PL' | 'pl' | 'ro-RO' | 'ro' | 'ru-RU' | 'ru' | 'sk-SK' | 'sk' | 'sl-SI' | 'sl' | 'sv' | 'ta-IN' | 'ta' | 'tl-PH' | 'tl' | 'tr' | 'uk-UA' | 'uk' | 'zh-CN' | 'zh' | 'crh-UA' | 'crh' | 'cs-CZ' | 'cs' | 'nb' | 'no' | 'nl-NL' | 'de-DE-x-simple-language-DE' | 'es-ES' | 'it-IT' | 'fa-IR' | 'sv-SE' | 'de-LU' | 'fr-FR' | 'bg-BG' | 'bg' | 'he-IL' | 'he' | 'hi-IN' | 'hi' | 'vi-VN' | 'vi' | 'th-TH' | 'th' | 'bn-BD' | 'bn', received object at "language"
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Walkthrough

This pull request delivers a comprehensive UI redesign across the homepage and major components. Changes include consolidating value-block components, restructuring the footer with native HTML elements, integrating framer-motion animations for hero and marquee sections, redesigning article cards with hover interactions, upgrading testimonial carousels with star ratings, converting trending organizations from carousel to infinite marquee, and refreshing spacing and dark-mode styling throughout.

Changes

Cohort / File(s) Summary
Homepage & Value Blocks Consolidation
app/page.tsx, components/value-blocks.tsx
Replaced four separate value-block component imports and exports (OrganizationsBlock, PreviousEditionsBlock, TechStackBlock, AnalyticsBlock) with a single ValueBlocks component that renders features dynamically via .map(). Refactored static layouts into unified image handling with next/image, added dynamic link routing, and restructured section styling with new container classes.
Hero & CTA Section Updates
components/hero-component.tsx, components/waitlist-cta.tsx
Upgraded hero component with framer-motion animations (animated pill badge, entrance animations for heading/paragraph), replaced MoveRight icon with ArrowRight, added gradient background blob elements, and introduced new CTA button structure. Redesigned waitlist CTA by removing Section wrapper, adding gradient-overlay backgrounds, and updating form styling with translucent containers.
Layout & Structure Refactoring
components/Footer.tsx, components/faq.tsx
Replaced Section wrapper with native HTML elements (<footer>, <section>), restructured footer navigation from grid divs to semantic <h4>/<ul>/<li> lists with updated link styling, and reworked FAQ layout with custom Tailwind classes. Updated typography rendering and adjusted spacing/padding throughout both components.
Content Display & Carousel Enhancements
components/latest-articles.tsx, components/testimonials.tsx, components/trending-orgs-client.tsx
Redesigned article cards with image overlays, hover effects, and per-article routing (/blog/${article.slug}). Upgraded testimonials with 5-star rating display, Heading/Text typography, and changed carousel timing from setTimeout to setInterval. Replaced trending organizations carousel with dual-row infinite marquee animation using framer-motion and added new OrgCard subcomponent with image/fallback rendering.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • PR #71: Also modifies components/Footer.tsx with markup and styling updates including dark-mode class changes and social-links restructuring.
  • PR #57: Modifies components/hero-component.tsx with layout and animation enhancements to the HeroComponent.
  • PR #76: Modifies app/page.tsx and components/value-blocks.tsx with the same component consolidation and refactoring approach.

Poem

🐰 A rabbit's ode to the grand redesign:

With framer-motion spins and marquee glides so fine,
Footer tags now semantic, hero animations divine,
Value blocks collapse to one, carousels transform,
Star ratings twinkle bright in testimonial form,
The homepage hops renewed, dark and light in perfect rhyme! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.29% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Landing page redesign' is concise and accurately reflects the primary change—a comprehensive redesign of the landing page UI. It is clear, specific, and directly related to the main changeset.
Description check ✅ Passed The PR description comprehensively addresses all template requirements: the Overview section summarizes the redesign and data preservation; a detailed Components Updated table explains each change; Testing covers local verification, linting, type-checking, and build results; and the Checklist confirms all four items are completed.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@ketankauntia
Copy link
Copy Markdown
Owner

@AshishDev-16 can we have an ss of the wepage? will be easier for ui changes, and then i can deploy it in dev env and check.

Copy link
Copy Markdown

@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: 5

🧹 Nitpick comments (4)
components/value-blocks.tsx (1)

88-88: Remove unnecessary comment.

This comment restates the obvious and doesn't add value. As per coding guidelines, avoid comments that restate what the code does.

🧹 Remove comment
-                  {/* Optional: We can keep the link if desired, or skip it. Retaining for a premium look. */}
                   <div>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/value-blocks.tsx` at line 88, Remove the redundant JSX comment
("Optional: We can keep the link if desired, or skip it. Retaining for a premium
look.") in components/value-blocks.tsx; locate the comment inside the
ValueBlocks (or ValueBlock) JSX render and delete that comment node so the code
is cleaner and follows the guideline to avoid comments that restate the obvious.
components/testimonials.tsx (1)

72-88: Auto-advance interval is recreated on every slide change.

The useEffect depends on current, so every time the carousel advances, the interval is cleared and recreated. This works but is inefficient—the interval callback could use a ref to always access the latest current value instead.

♻️ Optional: Use ref for stable interval
+"use client";
+
+import { useEffect, useState, useRef } from "react";
 ...
 
 export function Testimonials() {
   const [api, setApi] = useState<CarouselApi>();
   const [current, setCurrent] = useState(0);
+  const currentRef = useRef(current);
+
+  useEffect(() => {
+    currentRef.current = current;
+  }, [current]);

   useEffect(() => {
     if (!api) {
       return;
     }

     const timer = setInterval(() => {
       if (api.selectedScrollSnap() + 1 === api.scrollSnapList().length) {
         api.scrollTo(0);
         setCurrent(0);
       } else {
         api.scrollNext();
-        setCurrent(current + 1);
+        setCurrent(currentRef.current + 1);
       }
     }, 4000);

     return () => clearInterval(timer);
-  }, [api, current]);
+  }, [api]);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/testimonials.tsx` around lines 72 - 88, The effect recreates the
interval on every `current` change; change it to a stable interval by removing
`current` from the dependency array of the `useEffect` that creates `timer` and
have the interval callback read the latest slide index from a ref. Add a
`currentRef` (via `useRef`) and update `currentRef.current` whenever
`setCurrent` is called (or in a small `useEffect` that syncs `current` to the
ref), then inside the `setInterval` callback use `api` and `currentRef.current`
to decide whether to `api.scrollNext()` / `api.scrollTo(0)` and call
`setCurrent(...)`; keep clearing the interval in the effect cleanup as before.
components/hero-component.tsx (1)

78-80: Remove commented-out code.

The commented underline div should be removed if it's not being used. Dead code creates confusion about intent.

🧹 Remove commented code
               ))}
-              {/* Dynamic width underline based on parent block */}
-              {/* <div className="absolute bottom-1 left-0 right-0 h-1.5 bg-[`#3b82f6`] dark:bg-blue-500" /> */}
             </span>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/hero-component.tsx` around lines 78 - 80, Remove the dead
commented underline div inside the Hero component's JSX (the commented line
containing <div className="absolute bottom-1 left-0 right-0 h-1.5 bg-[`#3b82f6`]
dark:bg-blue-500" />) so the markup under the closing </span> is clean; locate
the commented block in components/hero-component.tsx within the Hero (or
similar) JSX and delete the commented lines and surrounding comment markers to
avoid leftover dead code.
components/trending-orgs-client.tsx (1)

48-53: Trim the narrating comments in this component.

Most of these comments just label the JSX or repeat what the next line already says. I’d keep the non-obvious note about tripling the arrays for the seamless loop and drop the rest.

As per coding guidelines: **/*.{ts,tsx,js,jsx}: Do NOT add comments that restate the obvious or explain what the code does if clear. ONLY add comments for non-obvious decisions, workarounds, edge cases, and architectural reasoning

Also applies to: 59-65, 70-85, 100-100

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

In `@components/trending-orgs-client.tsx` around lines 48 - 53, Remove redundant
narrating comments in the TrendingOrgs component: delete comments that merely
restate JSX or obvious behavior (e.g., labels for rows or directions) around the
component header and the blocks referenced (the comment groups near lines 59-65,
70-85, and 100), and keep only the non-obvious explanatory comment that
documents why we triple the org arrays to create a seamless looping marquee
(retain that single comment next to the array-tripling logic in the TrendingOrgs
component). Ensure references in the code (component name TrendingOrgs, the
array-tripling variable/logic) remain clear and that no other explanatory
comments that merely repeat code are left behind.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@components/hero-component.tsx`:
- Around line 40-50: The pill badge (the motion.div containing the "Read our
launch article" text and the ArrowRight icon) currently looks clickable but is a
static div; either wrap that element in a real interactive component (e.g., a
Link or anchor) pointing to the launch article URL so the ArrowRight and
affordance are accurate, or remove the ArrowRight icon and any
cursor/pseudo-interactive styles to avoid misleading users; update the JSX
around motion.div (and the ArrowRight usage) accordingly and ensure
accessibility attributes (role/aria-label) are added if you make it a non-anchor
interactive element.

In `@components/latest-articles.tsx`:
- Around line 72-75: The Link in latest-articles.tsx uses
href={`/blog/${article.slug}`} (Link, article.slug) but you haven't implemented
a dynamic blog page to handle those slugs; either add a dynamic blog page
component that exports generateStaticParams (to enumerate article slugs) and
generateMetadata (to set per-article metadata) and a page component that renders
the article by slug, or change the Link target in latest-articles.tsx to a
non-dynamic route (e.g., /blog) until the dynamic route is implemented so links
do not 404.

In `@components/trending-orgs-client.tsx`:
- Around line 89-92: The marquee currently always animates via the motion.div
animate/transition props (see motion.div with animate={{ x: [...] }} and
transition={{ ... }}), so add a reduced-motion fallback: use framer-motion's
useReducedMotion() (or a CSS `@media` (prefers-reduced-motion: reduce)
alternative) and, when reduced motion is requested, remove the
animate/transition (or set animate to a static x: "0%") so the track remains
static; additionally pause the animation on hover/focus by applying
whileHover/whileFocus to stop movement (or conditionally disable those when
reduced motion is true). Apply the same change to the other marquee block
referenced (the second motion.div around lines 104-107).
- Around line 25-27: The outer container's hover shadow contains a hardcoded
RGBA (shadow-[0_12px_40px_rgba(59,130,246,0.15)]) which violates the token-only
rule; replace that literal with a semantic utility or CSS variable backed by the
shared design tokens (e.g., change the class on the div containing
"group-hover:shadow-[0_12px_40px_rgba(59,130,246,0.15)]" to a token-based class
like "group-hover:shadow-glow" or
"group-hover:shadow-[var(--token-shadow-glow)]" and ensure the corresponding
--token-shadow-glow is defined in the shared tokens/styles so theme changes
propagate).
- Around line 12-46: Replace the one-off OrgCard with the shared
OrganizationCard component: remove the OrgCard function and reuse
OrganizationCard (the component currently in organization-card.tsx) by importing
it and passing org and index props, and add/consume a compact variant prop
(e.g., variant="compact" or size="sm") on OrganizationCard to apply the smaller
layout (w-28/h-28, hover effects, rounded-2xl, image fallback, lazy loading,
etc.) instead of duplicating markup; update OrganizationCard to accept and
handle that variant (adjust classes for container, image/span, and hover glow)
so the marquee uses the compact style while other lists keep the default.

---

Nitpick comments:
In `@components/hero-component.tsx`:
- Around line 78-80: Remove the dead commented underline div inside the Hero
component's JSX (the commented line containing <div className="absolute bottom-1
left-0 right-0 h-1.5 bg-[`#3b82f6`] dark:bg-blue-500" />) so the markup under the
closing </span> is clean; locate the commented block in
components/hero-component.tsx within the Hero (or similar) JSX and delete the
commented lines and surrounding comment markers to avoid leftover dead code.

In `@components/testimonials.tsx`:
- Around line 72-88: The effect recreates the interval on every `current`
change; change it to a stable interval by removing `current` from the dependency
array of the `useEffect` that creates `timer` and have the interval callback
read the latest slide index from a ref. Add a `currentRef` (via `useRef`) and
update `currentRef.current` whenever `setCurrent` is called (or in a small
`useEffect` that syncs `current` to the ref), then inside the `setInterval`
callback use `api` and `currentRef.current` to decide whether to
`api.scrollNext()` / `api.scrollTo(0)` and call `setCurrent(...)`; keep clearing
the interval in the effect cleanup as before.

In `@components/trending-orgs-client.tsx`:
- Around line 48-53: Remove redundant narrating comments in the TrendingOrgs
component: delete comments that merely restate JSX or obvious behavior (e.g.,
labels for rows or directions) around the component header and the blocks
referenced (the comment groups near lines 59-65, 70-85, and 100), and keep only
the non-obvious explanatory comment that documents why we triple the org arrays
to create a seamless looping marquee (retain that single comment next to the
array-tripling logic in the TrendingOrgs component). Ensure references in the
code (component name TrendingOrgs, the array-tripling variable/logic) remain
clear and that no other explanatory comments that merely repeat code are left
behind.

In `@components/value-blocks.tsx`:
- Line 88: Remove the redundant JSX comment ("Optional: We can keep the link if
desired, or skip it. Retaining for a premium look.") in
components/value-blocks.tsx; locate the comment inside the ValueBlocks (or
ValueBlock) JSX render and delete that comment node so the code is cleaner and
follows the guideline to avoid comments that restate the obvious.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8a235021-0abd-4655-90e1-618e79856b12

📥 Commits

Reviewing files that changed from the base of the PR and between 9c816a8 and e0eeda7.

📒 Files selected for processing (9)
  • app/page.tsx
  • components/Footer.tsx
  • components/faq.tsx
  • components/hero-component.tsx
  • components/latest-articles.tsx
  • components/testimonials.tsx
  • components/trending-orgs-client.tsx
  • components/value-blocks.tsx
  • components/waitlist-cta.tsx

Comment on lines +40 to +50
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, ease: "easeOut" }}
className="mb-8"
>
<div className="inline-flex items-center gap-2 rounded-full bg-blue-50 dark:bg-blue-950/50 px-4 py-1.5 text-sm font-semibold text-blue-600 dark:text-blue-400 border border-blue-100 dark:border-blue-900">
<span>Read our launch article</span>
<ArrowRight className="w-4 h-4" />
</div>
</motion.div>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Pill badge appears clickable but isn't interactive.

The badge displays "Read our launch article" with an ArrowRight icon, which signals to users that it's a clickable link. However, it's just a static <div>. Either wrap it in a <Link> to the actual article or remove the arrow icon to avoid misleading affordance.

🔗 Suggested fix: Make it a link or remove arrow

Option A: Make it a link

         <motion.div
           initial={{ opacity: 0, y: 20 }}
           animate={{ opacity: 1, y: 0 }}
           transition={{ duration: 0.5, ease: "easeOut" }}
           className="mb-8"
         >
-          <div className="inline-flex items-center gap-2 rounded-full bg-blue-50 dark:bg-blue-950/50 px-4 py-1.5 text-sm font-semibold text-blue-600 dark:text-blue-400 border border-blue-100 dark:border-blue-900">
+          <Link href="/blog" className="inline-flex items-center gap-2 rounded-full bg-blue-50 dark:bg-blue-950/50 px-4 py-1.5 text-sm font-semibold text-blue-600 dark:text-blue-400 border border-blue-100 dark:border-blue-900 hover:bg-blue-100 dark:hover:bg-blue-900/50 transition-colors">
             <span>Read our launch article</span>
             <ArrowRight className="w-4 h-4" />
-          </div>
+          </Link>
         </motion.div>

Option B: Remove the arrow if not linking

-          <div className="inline-flex items-center gap-2 rounded-full bg-blue-50 dark:bg-blue-950/50 px-4 py-1.5 text-sm font-semibold text-blue-600 dark:text-blue-400 border border-blue-100 dark:border-blue-900">
-            <span>Read our launch article</span>
-            <ArrowRight className="w-4 h-4" />
+          <div className="inline-flex items-center rounded-full bg-blue-50 dark:bg-blue-950/50 px-4 py-1.5 text-sm font-semibold text-blue-600 dark:text-blue-400 border border-blue-100 dark:border-blue-900">
+            <span>Coming Soon</span>
           </div>
📝 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
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, ease: "easeOut" }}
className="mb-8"
>
<div className="inline-flex items-center gap-2 rounded-full bg-blue-50 dark:bg-blue-950/50 px-4 py-1.5 text-sm font-semibold text-blue-600 dark:text-blue-400 border border-blue-100 dark:border-blue-900">
<span>Read our launch article</span>
<ArrowRight className="w-4 h-4" />
</div>
</motion.div>
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, ease: "easeOut" }}
className="mb-8"
>
<Link href="/blog" className="inline-flex items-center gap-2 rounded-full bg-blue-50 dark:bg-blue-950/50 px-4 py-1.5 text-sm font-semibold text-blue-600 dark:text-blue-400 border border-blue-100 dark:border-blue-900 hover:bg-blue-100 dark:hover:bg-blue-900/50 transition-colors">
<span>Read our launch article</span>
<ArrowRight className="w-4 h-4" />
</Link>
</motion.div>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/hero-component.tsx` around lines 40 - 50, The pill badge (the
motion.div containing the "Read our launch article" text and the ArrowRight
icon) currently looks clickable but is a static div; either wrap that element in
a real interactive component (e.g., a Link or anchor) pointing to the launch
article URL so the ArrowRight and affordance are accurate, or remove the
ArrowRight icon and any cursor/pseudo-interactive styles to avoid misleading
users; update the JSX around motion.div (and the ArrowRight usage) accordingly
and ensure accessibility attributes (role/aria-label) are added if you make it a
non-anchor interactive element.

Comment on lines 72 to +75
<Link
key={article.id}
href="/blog"
className="flex flex-col gap-2 hover:opacity-75 cursor-pointer transition-opacity"
href={`/blog/${article.slug}`}
className="group flex flex-col h-full bg-zinc-50 dark:bg-zinc-900 rounded-2xl overflow-hidden border border-zinc-200/50 dark:border-zinc-800 hover:border-blue-200 dark:hover:border-blue-900/50 hover:shadow-lg hover:shadow-blue-900/5 transition-all duration-300"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Check if a dynamic blog route exists for article slugs

# Search for any [slug] dynamic route under app/blog
fd -t f 'page.tsx' app/blog --exec echo "Found: {}"

# Check directory structure under app/blog
find app/blog -type f -name "*.tsx" 2>/dev/null || echo "No files found"

# Look for any dynamic route pattern
rg -l '\[slug\]' app/blog 2>/dev/null || echo "No dynamic slug route found"

Repository: ketankauntia/gsoc-orgs

Length of output: 136


🏁 Script executed:

#!/bin/bash
# Check the content of app/blog/page.tsx to see if it's truly static
echo "=== app/blog/page.tsx content ==="
cat app/blog/page.tsx

echo ""
echo "=== components/latest-articles.tsx lines 70-80 ==="
sed -n '70,80p' components/latest-articles.tsx

Repository: ketankauntia/gsoc-orgs

Length of output: 3490


Create dynamic blog route or update article links.

The component links to /blog/${article.slug} but no dynamic route handler exists at app/blog/[slug]/page.tsx. Users will encounter a broken link or fall back to the static "Coming Soon" page. Either implement the dynamic route with generateStaticParams and generateMetadata, or change links to /blog until individual article pages are ready.

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

In `@components/latest-articles.tsx` around lines 72 - 75, The Link in
latest-articles.tsx uses href={`/blog/${article.slug}`} (Link, article.slug) but
you haven't implemented a dynamic blog page to handle those slugs; either add a
dynamic blog page component that exports generateStaticParams (to enumerate
article slugs) and generateMetadata (to set per-article metadata) and a page
component that renders the article by slug, or change the Link target in
latest-articles.tsx to a non-dynamic route (e.g., /blog) until the dynamic route
is implemented so links do not 404.

Comment on lines +12 to +46
interface OrgCardProps {
org: FeaturedOrg;
index: number;
}

function OrgCard({ org, index }: OrgCardProps) {
return (
<a
href={`/organizations/${org.slug}`}
key={`${org.id}-${index}`}
className="group shrink-0"
aria-label={`View ${org.name} details`}
>
<div className="relative flex w-28 h-28 md:w-36 md:h-36 rounded-2xl bg-white dark:bg-zinc-950 border border-zinc-200 dark:border-zinc-800 shadow-sm items-center justify-center p-4 transition-all duration-300 group-hover:shadow-[0_12px_40px_rgba(59,130,246,0.15)] group-hover:-translate-y-1.5 group-hover:border-blue-200 dark:group-hover:border-blue-900">
{/* Subtle hover glow bg */}
<div className="absolute inset-0 rounded-2xl bg-blue-50 dark:bg-blue-950/30 opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
{org.img_r2_url ? (
<Image
src={org.img_r2_url}
alt={org.name}
width={100}
height={100}
className="relative z-10 w-full h-full object-contain transition-all duration-300 group-hover:scale-110"
unoptimized={true}
loading="lazy"
/>
) : (
<span className="relative z-10 text-3xl md:text-4xl font-extrabold text-zinc-300 dark:text-zinc-700 transition-colors group-hover:text-blue-500">
{org.name.charAt(0)}
</span>
)}
</div>
</a>
);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Extend OrganizationCard instead of introducing OrgCard.

This forks organization-listing markup/behavior into a second component, which will drift from components/organization-card.tsx over time. If the marquee needs a smaller presentation, please add a compact variant or adapt the shared selector instead of maintaining a one-off card here.

As per coding guidelines: **/?(app|components)/**/*.{tsx,ts}: Reuse the existing OrganizationCard component for all organization listings

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

In `@components/trending-orgs-client.tsx` around lines 12 - 46, Replace the
one-off OrgCard with the shared OrganizationCard component: remove the OrgCard
function and reuse OrganizationCard (the component currently in
organization-card.tsx) by importing it and passing org and index props, and
add/consume a compact variant prop (e.g., variant="compact" or size="sm") on
OrganizationCard to apply the smaller layout (w-28/h-28, hover effects,
rounded-2xl, image fallback, lazy loading, etc.) instead of duplicating markup;
update OrganizationCard to accept and handle that variant (adjust classes for
container, image/span, and hover glow) so the marquee uses the compact style
while other lists keep the default.

Comment on lines +25 to +27
<div className="relative flex w-28 h-28 md:w-36 md:h-36 rounded-2xl bg-white dark:bg-zinc-950 border border-zinc-200 dark:border-zinc-800 shadow-sm items-center justify-center p-4 transition-all duration-300 group-hover:shadow-[0_12px_40px_rgba(59,130,246,0.15)] group-hover:-translate-y-1.5 group-hover:border-blue-200 dark:group-hover:border-blue-900">
{/* Subtle hover glow bg */}
<div className="absolute inset-0 rounded-2xl bg-blue-50 dark:bg-blue-950/30 opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Replace the one-off RGBA glow with a shared token.

shadow-[0_12px_40px_rgba(59,130,246,0.15)] hardcodes a blue outside the design system, so theme/token changes will miss this component. Please switch this to an existing semantic shadow utility or a CSS variable backed by the shared tokens.

As per coding guidelines: **/*.{tsx,ts,css,scss}: Use ONLY existing color tokens and design variables, do NOT hardcode colors, do NOT introduce new colors without explicit instruction

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

In `@components/trending-orgs-client.tsx` around lines 25 - 27, The outer
container's hover shadow contains a hardcoded RGBA
(shadow-[0_12px_40px_rgba(59,130,246,0.15)]) which violates the token-only rule;
replace that literal with a semantic utility or CSS variable backed by the
shared design tokens (e.g., change the class on the div containing
"group-hover:shadow-[0_12px_40px_rgba(59,130,246,0.15)]" to a token-based class
like "group-hover:shadow-glow" or
"group-hover:shadow-[var(--token-shadow-glow)]" and ensure the corresponding
--token-shadow-glow is defined in the shared tokens/styles so theme changes
propagate).

Comment on lines +89 to +92
<motion.div
className="flex gap-5 md:gap-7 w-max pr-5 md:pr-7"
animate={{ x: ["0%", "-33.333333%"] }}
transition={{ ease: "linear", duration: 45, repeat: Infinity }}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Add a reduced-motion fallback for the marquee.

Both tracks loop forever with no static path for users who opt out of motion. Since the moving elements are also links, please disable the animation under prefers-reduced-motion (and ideally pause it on hover/focus as well).

Also applies to: 104-107

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

In `@components/trending-orgs-client.tsx` around lines 89 - 92, The marquee
currently always animates via the motion.div animate/transition props (see
motion.div with animate={{ x: [...] }} and transition={{ ... }}), so add a
reduced-motion fallback: use framer-motion's useReducedMotion() (or a CSS `@media`
(prefers-reduced-motion: reduce) alternative) and, when reduced motion is
requested, remove the animate/transition (or set animate to a static x: "0%") so
the track remains static; additionally pause the animation on hover/focus by
applying whileHover/whileFocus to stop movement (or conditionally disable those
when reduced motion is true). Apply the same change to the other marquee block
referenced (the second motion.div around lines 104-107).

@AshishDev-16
Copy link
Copy Markdown
Author

Hey @ketankauntia 👋, here are the screenshots from the local dev server

Screenshot 2026-03-31 144607 Screenshot 2026-03-31 144556 Screenshot 2026-03-31 144545 Screenshot 2026-03-31 144531 Screenshot 2026-03-31 144516 Screenshot 2026-03-31 144504 Screenshot 2026-03-31 144451 Screenshot 2026-03-31 144439

Happy to address any feedback once you test it in the dev env! 🙌

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 1, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
gsoc-orgs Ready Ready Preview, Comment Apr 1, 2026 6:41am

@ketankauntia
Copy link
Copy Markdown
Owner

@AshishDev-16 thank you for taking the initiative to contribute. But, tbh, what i can see is just some ai output code. nothing else.

You have not used the styling theme that we follow in the project ( the teal shade we are using. )

and it is very obvious because of the blue shade that is on the ui is by ai.

Incase you want to contribute meaningfully, please have a plan, explore the repo, understand the repo using ai and then start to work.

it's just that. Closing the pr, feel free to raise a new one if you can contribute to any other issue.

@AshishDev-16 AshishDev-16 deleted the Landing-Page-Redesign branch April 1, 2026 06:48
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.

2 participants