Skip to content

feat: redesign testimonial marquee with manual controls, add security,headers, and fix SEO issues#335

Open
HEETMEHTA18 wants to merge 6 commits intokeploy:mainfrom
HEETMEHTA18:feat/testimonial-marquee-redesign
Open

feat: redesign testimonial marquee with manual controls, add security,headers, and fix SEO issues#335
HEETMEHTA18 wants to merge 6 commits intokeploy:mainfrom
HEETMEHTA18:feat/testimonial-marquee-redesign

Conversation

@HEETMEHTA18
Copy link
Copy Markdown

Related Tickets & Documents

Fixes: #3440

Description

This PR revamps the blog landing page’s testimonial section to provide a "flawless" user experience, addressing community feedback regarding UI aesthetics and security. It replaces the legacy marquee with a modern dual-row scrolling layout.

GDG CHARUSAT TEAM ID: <Team 143>

Changes

  • Implemented a modern dual-row infinite scroll marquee for community testimonials.
  • Enhanced card design with quote icons, hover effects, and skeleton loaders.
  • Implemented core security headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy) in next.config.js.
  • Fixed relative paths for favicons and RSS feeds in meta.tsx to ensure they load correctly under the /blog base path.
  • Standardized SEO tokens and fixed variable typos in pages/index.tsx.

Type of Change

  • Chore (maintenance, refactoring, tooling updates)
  • Bug fix (non-breaking change that fixes an issue)
  • New feature (change that adds functionality)
  • Breaking Change (may require updates in existing code)
  • UI improvement (visual or design changes)
  • Performance improvement (optimization or efficiency enhancements)
  • Documentation update (changes to README, guides, etc.)
  • CI (updates to continuous integration workflows)
  • Revert (undo a previous commit or merge)

Testing

  • Performed local verification using npm run dev.
  • Verified the marquee functionality and edge-blending aesthetics.
  • Checked responsiveness on mobile and tablet views.
  • Ran npm run build to ensure no production regressions or hydration errors.

Demo

  • Testimonial Section: Now features dual-row scrolling with edge-blending gradients for a premium feel.
  • Security: Headers verified in browser dev tools.
  • SEO: Favicons and metadata links now correctly resolve to the /blog subdirectory.
    -Before:
Engineering._.Keploy.Blog.-.Google.Chrome.2026-02-24.21-44-31.mp4

After:

localhost_3000_blog.-.Google.Chrome.2026-02-24.21-51-45.mp4
image

Environment and Dependencies

  • New Dependencies: None.
  • Configuration Changes: Updated next.config.js to include standard security headers.

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have made corresponding changes to the documentation
  • I have added corresponding tests
  • I have run the build command to ensure there are no build errors
  • My changes have been tested across relevant browsers/devices
  • For UI changes, I've included visual evidence of my changes (Verified locally)

… headers, and fix SEO issues

Signed-off-by: Heet Mehta <heetmehta18125@gmail.com>
… issues

Signed-off-by: Heet Mehta <heetmehta18125@gmail.com>
@kilo-code-bot
Copy link
Copy Markdown

kilo-code-bot bot commented Feb 24, 2026

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Overview

This PR includes several quality improvements:

  • Security: Added security headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy) in next.config.js
  • Bug Fix: Fixed missing leading slashes in favicon/manifest paths in meta.tsx
  • Accessibility: Added aria-hidden="true" to decorative SVG icons in footer.tsx
  • Robustness: Added fallback handling for missing title and coverImage in cover-image.tsx
  • UX: Improved testimonials component with hydration-safe mounting, better avatar fallback handling via image proxy, and enhanced styling
  • Code Quality: Fixed typo allTehcnologyPostsallTechnologyPosts and removed duplicate <Head> tag in pages/index.tsx
Files Reviewed (6 files)
  • components/cover-image.tsx - Fallback handling improvements
  • components/footer.tsx - Accessibility improvements
  • components/meta.tsx - Path fixes
  • components/testimonials.tsx - Major refactor with improved UX
  • next.config.js - Security headers added
  • pages/index.tsx - Typo fix and duplicate removal

Signed-off-by: Heet Mehta <heetmehta18125@gmail.com>
Signed-off-by: Heet Mehta <heetmehta18125@gmail.com>
@HEETMEHTA18
Copy link
Copy Markdown
Author

hey @amaan-bhati i have proposed a solution to the given issue of the testimonial marquee which is redesigned to the design which you have mentioned in the issue

@dhananjay6561
Copy link
Copy Markdown
Member

Hi @HEETMEHTA18.
Thank you for contributing and taking the initiative to work on this!
However, the issue mentioned in this PR has already been fixed in the repository. Because of that, we won’t be able to proceed with merging this one.

Feel free to look into other open issues in the repository and pick one that hasn’t been addressed yet. We’d be happy to review another contribution from you. Thanks again for your effort!

@HEETMEHTA18
Copy link
Copy Markdown
Author

@dhananjay6561 however but still in the website no furthur changes are made till i just made changes into this so that the avatar was not loading but in the given pr the changes are made.
image

Signed-off-by: Heet Mehta <heetmehta18125@gmail.com>
@dhananjay6561 dhananjay6561 requested a review from Copilot April 6, 2026 12:06
@dhananjay6561
Copy link
Copy Markdown
Member

Hey @HEETMEHTA18 👋 — thanks for putting this PR together, we appreciate the effort!

We've gone ahead and requested a Copilot review on this. Here's some context from the reviewer:

Too many unrelated changes — split into 2-3 PRs. Invalid transition-scale class. Title says 'manual controls' but none exist.

Once you've had a chance to go through the comments, please address the feedback and resolve the threads — and we'll get this across the line. Feel free to ask if anything's unclear. Happy coding! 💙

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR modernizes the blog landing page experience by redesigning the testimonials marquee, tightening security headers at the Next.js edge, and fixing SEO-related asset paths under the /blog basePath.

Changes:

  • Replaced the legacy testimonials marquee with a dual-row, hover-pausing infinite scroll layout (with a skeleton fallback during initial mount).
  • Added standard security headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy) via next.config.js.
  • Fixed SEO/meta asset URLs to be basePath-correct and cleaned up SEO token/typo issues on the homepage.

Reviewed changes

Copilot reviewed 5 out of 6 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
pages/index.tsx Removes inline <Head> title usage (relying on Layout/Meta) and fixes a typo in technology posts variable naming.
next.config.js Adds additional security headers alongside the existing CSP.
components/testimonials.tsx Implements the redesigned dual-row marquee testimonial UI and avatar proxy/fallback handling.
components/meta.tsx Corrects favicon/manifest/RSS/browserconfig paths to work under /blog basePath.
components/footer.tsx Adds aria-hidden to decorative social SVG icons.
components/cover-image.tsx Adds safer fallbacks for alt/src and refactors className handling (but currently introduces a critical build issue).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +26 to +28
className={cn("rounded-md transition-border duration-300", imgClassName, {
" transition-scale duration-300": slug,
})}
Copy link

Copilot AI Apr 6, 2026

Choose a reason for hiding this comment

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

CoverImage now uses cn(...) but the helper isn’t imported in this file, which will cause a runtime/compile failure. Also, the Tailwind classes transition-border and transition-scale don’t exist in this repo’s Tailwind config, so the intended transitions won’t apply; use valid Tailwind transition utilities (or extend Tailwind) instead.

Suggested change
className={cn("rounded-md transition-border duration-300", imgClassName, {
" transition-scale duration-300": slug,
})}
className={[
"rounded-md transition-colors duration-300",
slug ? "transition-transform duration-300" : "",
imgClassName ?? "",
]
.filter(Boolean)
.join(" ")}

Copilot uses AI. Check for mistakes.
Comment on lines +20 to 26
/** Fallback avatar component – renders a user icon/initials in a branded circle */
const FallbackAvatar = ({ name }: { name: string }) => (
<div className="flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-slate-100 text-slate-500 ring-2 ring-gray-100 p-1">
<User className="h-full w-full opacity-60" />
</div>
);

Copy link

Copilot AI Apr 6, 2026

Choose a reason for hiding this comment

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

getInitials is declared but never used, and FallbackAvatar accepts a name prop but doesn’t render initials (only the icon). This is dead code / misleading intent—either remove the unused helper/prop or render initials as the fallback so the behavior matches the comment.

Suggested change
/** Fallback avatar component – renders a user icon/initials in a branded circle */
const FallbackAvatar = ({ name }: { name: string }) => (
<div className="flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-slate-100 text-slate-500 ring-2 ring-gray-100 p-1">
<User className="h-full w-full opacity-60" />
</div>
);
/** Fallback avatar component – renders initials when available, otherwise a user icon */
const FallbackAvatar = ({ name }: { name: string }) => {
const initials = name.trim() ? getInitials(name) : "";
return (
<div className="flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-slate-100 text-slate-500 ring-2 ring-gray-100 p-1">
{initials ? (
<span className="text-sm font-medium leading-none">{initials}</span>
) : (
<User className="h-full w-full opacity-60" />
)}
</div>
);
};

Copilot uses AI. Check for mistakes.
Comment thread pages/index.tsx
Comment on lines 26 to 36
return (

<Layout
preview={preview}
featuredImage={HOME_OG_IMAGE_URL}
Title={`Blog - Keploy`}
Description={"The Keploy Blog offers in-depth articles and expert insights on software testing, automation, and quality assurance, empowering developers to enhance their testing strategies and deliver robust applications."}
structuredData={structuredData}
>
<Head>
<title>{`Engineering | Keploy Blog`}</title>
</Head>
<Header />
<Container>
Copy link

Copilot AI Apr 6, 2026

Choose a reason for hiding this comment

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

After removing the inline <Head> usage, the Head import at the top of this file is now unused and will be flagged by next lint. Please remove the unused import to keep CI/lint clean.

Copilot uses AI. Check for mistakes.
Signed-off-by: Heet Mehta <heetmehta18125@gmail.com>
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.

3 participants