Skip to content

Feat/landing v2#118

Open
maheswar-dileep wants to merge 9 commits intosunithvs:mainfrom
maheswar-dileep:feat/landing-v2
Open

Feat/landing v2#118
maheswar-dileep wants to merge 9 commits intosunithvs:mainfrom
maheswar-dileep:feat/landing-v2

Conversation

@maheswar-dileep
Copy link

Summary

Revamped the landing page's main Hero section and improved the "Compare" slider's aspect ratio and styling.

Description

This PR introduces a significant visual level-up to AnimatedHeroClient and the Compare slider component:

  • Hero Redesign: Shifted from a left-aligned layout to a prominent, center-aligned typography structure ("Effortless Portfolios for Developers").
  • Social Proof Badge: Added a shiny rounded pill badge ("Trusted by 2k+ Customers") featuring real devb.io contributor GitHub avatars, bordered by custom laurel leaf images.
  • Floating 3D Elements: Replaced static inline text emojis with stylized, slightly rotated, and infinitely floating motion.span elements.
  • Improved CTA: Rebuilt the button row to include a bold primary "Generate Portfolio" button and a secondary layout "Contribute" outline button.
  • Animated Metrics Grid: Consolidated the previous text-based global reach statement into a clean, 3-column stats grid. Repurposed the existing Counter component to add smooth shuffling number animations on mount for the 6010+ Profiles Generated and 8mo Active metrics.
  • Compare Component Refactor: Removed strict square w-[400px] h-[400px] constraints in favor of a responsive 16:9-like wide aspect ratio. Cleaned up styling by applying standard rounded-lg clip-paths and an elegant gray border.

Motivation and Context

The landing page's initial design served its purpose, but moving towards a premium, balanced, and interactive aesthetic helps signal confidence visually. Using real contributor avatars directly inside the "Trusted by" UI establishes immediate social proof, while the floating animations and dynamic counter tickers draw maximum attention to platform velocity.

How has this been tested?

  • Tested locally on different viewport sizes (mobile, tablet, and desktop) to ensure the 3-column stats grid folds properly and the Compare block maintains its new aspect ratio without cutting off inner images.
  • Verified that the <Counter /> component elegantly ticks upwards correctly.
  • Ensured all Next.js <Image /> assets load correctly from /public/images and /public/logo.

Screenshots (if appropriate):

Before After
image
image

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)

Checklist:

  • My code follows the code style of this project.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.

@vercel
Copy link
Contributor

vercel bot commented Mar 7, 2026

@maheswar-dileep is attempting to deploy a commit to the lamsta Team on Vercel.

A member of the Team first needs to authorize it.

@gemini-code-assist
Copy link

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly upgrades the landing page's visual design and interactivity. The primary goal was to transform the main hero section into a more engaging and premium experience, incorporating dynamic elements and social proof. Concurrently, the "Compare" component received a styling overhaul to ensure responsiveness and a polished appearance, contributing to a more modern and confident aesthetic for the platform.

Highlights

  • Hero Section Redesign: The AnimatedHeroClient component was completely revamped, introducing a center-aligned typography, a "Trusted by" social proof badge with GitHub avatars, floating 3D elements, and an animated metrics grid.
  • Compare Component Enhancement: The Compare slider component was refactored to adopt a responsive 16:9-like aspect ratio, along with updated styling including rounded-lg clip-paths and an elegant gray border.
  • Animated Metrics: Integrated a new 3-column stats grid with Counter components for smooth shuffling number animations for key metrics like "Profiles Generated" and "Active Months".

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • www/app/page.tsx
    • The "Analytics Section" was commented out, effectively removing it from the page rendering.
    • The Compare component's className was updated to w-full max-w-5xl h-[350px] md:h-[500px] to improve responsiveness and aspect ratio.
  • www/components/animated-hero/client.tsx
    • Imported Info, Github, GitFork from lucide-react and Counter component.
    • Implemented a new "Trusted by 2k+ Customers" badge featuring GitHub avatars and laurel leaf images.
    • Redesigned the main headline to be center-aligned, incorporating motion.span elements for floating emojis.
    • Updated the subhead text for clarity and added a line break for desktop view.
    • Rebuilt the call-to-action buttons, adding a primary "Generate Portfolio" button with a GitHub icon and a secondary "Contribute" outline button with a GitFork icon.
    • Introduced a new animated metrics section with a 3-column grid displaying "Profiles Generated", "Continuously Active", and "Global Developer Reach" using the Counter component.
    • Removed the previous left-aligned text content and the GitHub illustration.
  • www/components/ui/compare.tsx
    • Modified the root div's className to include w-full h-[400px] md:h-full, border, border-gray-200, rounded-lg, shadow-sm, and bg-gray-50 for improved styling and responsiveness.
    • Updated the className for motion.div and motion.img within the component to use rounded-lg instead of rounded-2xl for consistent corner rounding.
Activity
  • No specific activity was recorded for this pull request.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request significantly revamps the landing page's hero section and improves the 'Compare' slider, resulting in a more modern and interactive user experience. A security audit found no significant vulnerabilities, with only minor, low-risk issues like potential client-side request manipulation noted. However, there are opportunities to improve maintainability, accessibility, and functionality, including suggestions to remove dead code, refactor hardcoded values, fix a non-functional button, and enhance accessibility.

Comment on lines +143 to +145
<button className="bg-white border text-gray-700 border-gray-200 px-8 py-3.5 rounded-full text-base font-medium hover:bg-gray-50 transition-colors flex items-center justify-center gap-2 shadow-sm">
<GitFork className="w-4 h-4 text-black" /> Contribute
</button>

Choose a reason for hiding this comment

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

high

The 'Contribute' button is currently a non-interactive <button> element. To make it functional, it should be an anchor (<a>) tag that links to the project's GitHub repository. This is important for encouraging community contributions.

                <a href="https://github.com/sunithvs/devb.io" target="_blank" rel="noopener noreferrer" className="bg-white border text-gray-700 border-gray-200 px-8 py-3.5 rounded-full text-base font-medium hover:bg-gray-50 transition-colors flex items-center justify-center gap-2 shadow-sm">
                    <GitFork className="w-4 h-4 text-black" /> Contribute
                </a>

import Image from 'next/image';
import { useEffect, useState } from 'react';
import GitHubModal from '../github-modal/client';
import { Info, Github, GitFork } from 'lucide-react';

Choose a reason for hiding this comment

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

medium

The Info icon is imported from lucide-react but is not used within the component. To maintain a clean codebase, it's best to remove unused imports.

Suggested change
import { Info, Github, GitFork } from 'lucide-react';
import { Github, GitFork } from 'lucide-react';

Comment on lines +40 to +65
<div className="flex -space-x-3 shrink-0">
<Image
src="https://avatars.githubusercontent.com/u/63339782?v=4"
alt="Customer 1"
width={36}
height={36}
priority
className="w-7 h-7 md:w-9 md:h-9 rounded-full border-2 border-white object-cover shadow-sm relative z-0"
/>
<Image
src="https://avatars.githubusercontent.com/u/93549213?v=4"
alt="Customer 2"
width={36}
height={36}
priority
className="w-7 h-7 md:w-9 md:h-9 rounded-full border-2 border-white object-cover shadow-sm relative z-10"
/>
<Image
src="https://avatars.githubusercontent.com/u/135146135?v=4"
alt="Customer 3"
width={36}
height={36}
priority
className="w-7 h-7 md:w-9 md:h-9 rounded-full border-2 border-white bg-purple-100 object-cover shadow-sm relative z-20"
/>
</div>

Choose a reason for hiding this comment

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

medium

The contributor avatars are hardcoded, which makes them difficult to update. To improve maintainability, you could define them as an array of objects and then map over them to render the Image components. This also makes the JSX cleaner.

For example, you could define a constant outside your component:

const contributorAvatars = [
    {
        src: "https://avatars.githubusercontent.com/u/63339782?v=4",
        alt: "Customer 1",
        zIndex: "z-0",
        extraClass: ""
    },
    {
        src: "https://avatars.githubusercontent.com/u/93549213?v=4",
        alt: "Customer 2",
        zIndex: "z-10",
        extraClass: ""
    },
    {
        src: "https://avatars.githubusercontent.com/u/135146135?v=4",
        alt: "Customer 3",
        zIndex: "z-20",
        extraClass: "bg-purple-100"
    },
];

Then use it in your component like this:

                    <div className="flex -space-x-3 shrink-0">
                        {contributorAvatars.map((avatar, index) => (
                            <Image
                                key={index}
                                src={avatar.src}
                                alt={avatar.alt}
                                width={36}
                                height={36}
                                priority
                                className={`w-7 h-7 md:w-9 md:h-9 rounded-full border-2 border-white object-cover shadow-sm relative ${avatar.zIndex} ${avatar.extraClass}`}
                            />
                        ))}
                    </div>

Comment on lines +88 to +94
<motion.span
animate={{ y: [4, -8, 4] }}
transition={{ repeat: Infinity, duration: 4, ease: "easeInOut" }}
className="inline-flex relative -top-1 md:-top-2 border-2 md:border-[3px] border-white rotate-6 items-center justify-center bg-indigo-50 w-10 h-10 md:w-16 md:h-16 rounded-xl md:rounded-2xl mx-1 shadow-inner text-[22px] md:text-3xl shadow-md"
>
👨‍💻
</motion.span>

Choose a reason for hiding this comment

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

medium

This floating emoji is decorative. To prevent screen readers from announcing it and potentially confusing users with visual impairments, you should add aria-hidden="true" to the motion.span element. This accessibility improvement should also be applied to the other decorative emojis in this component (lines 99-105 and 109-115).

                    <motion.span
                        aria-hidden="true"
                        animate={{ y: [4, -8, 4] }}
                        transition={{ repeat: Infinity, duration: 4, ease: "easeInOut" }}
                        className="inline-flex relative -top-1 md:-top-2 border-2 md:border-[3px] border-white rotate-6 items-center justify-center bg-indigo-50 w-10 h-10 md:w-16 md:h-16 rounded-xl md:rounded-2xl mx-1 shadow-inner text-[22px] md:text-3xl shadow-md"
                    >
                        👨‍💻
                    </motion.span>

Comment on lines +154 to +180
<div className="grid grid-cols-1 md:grid-cols-3 gap-8 md:gap-4 divide-y md:divide-y-0 md:divide-x divide-gray-100">
<div className="flex flex-col items-center justify-center pt-4 md:pt-0">
<span className="text-4xl md:text-5xl font-bold tracking-tight text-[#111] mb-2 flex items-center">
<Counter from={0} to={6010} duration={2} />+
</span>
<span className="text-xs md:text-sm font-medium text-gray-500 uppercase tracking-widest text-center">
Profiles Generated
</span>
</div>
<div className="flex flex-col items-center justify-center pt-8 md:pt-0">
<span className="text-4xl md:text-5xl font-bold tracking-tight text-[#111] mb-2 flex items-baseline">
<Counter from={0} to={8} duration={2} />
<span className="text-3xl font-semibold text-gray-300 ml-1">mo</span>
</span>
<span className="text-xs md:text-sm font-medium text-gray-500 uppercase tracking-widest text-center">
Continuously Active
</span>
</div>
<div className="flex flex-col items-center justify-center pt-8 md:pt-0">
<span className="text-4xl md:text-5xl font-bold tracking-tight text-[#111] mb-2">
Global
</span>
<span className="text-xs md:text-sm font-medium text-gray-500 uppercase tracking-widest text-center">
Developer Reach
</span>
</div>
</div>

Choose a reason for hiding this comment

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

medium

The metrics in this section are hardcoded. To improve maintainability and readability, consider defining this data in an array of objects and then mapping over it to render the metric items. This makes it easier to add, remove, or update stats in the future.

For example, you could create a data structure like this:

const metrics = [
  {
    value: { from: 0, to: 6010, duration: 2 },
    suffix: '+',
    label: 'Profiles Generated',
  },
  {
    value: { from: 0, to: 8, duration: 2 },
    suffix: <span className="text-3xl font-semibold text-gray-300 ml-1">mo</span>,
    label: 'Continuously Active',
  },
  {
    value: 'Global',
    label: 'Developer Reach',
  },
];

Then you can loop through metrics to render each stat, which would make this section much cleaner and easier to manage.

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