Conversation
|
@mdashad0 is attempting to deploy a commit to the premkolte's projects Team on Vercel. A member of the Team first needs to authorize it. |
|
✨ Hi @mdashad0! Thanks for submitting another pull request. Your continuous improvements are highly valued. Keep contributing! 🙌 |
There was a problem hiding this comment.
Pull request overview
This pull request updates the home section with enhanced styling, motion effects, and hover interactions to improve the UI/UX, addressing issue #906. The changes introduce a comprehensive set of animations using Framer Motion, new Tailwind CSS animations, and a utility file for reusable motion variants. Additionally, the PR includes backend improvements to make email configuration optional and frontend changes to conditionally enable Google OAuth.
Changes:
- Added extensive motion effects and hover animations to home page components (Hero, Features, Pricing, Templates, Testimonials, Footer)
- Created a new
motionVariants.jsutility file with reusable Framer Motion animation variants - Extended Tailwind config with new keyframe animations (slideDown, slideLeft, slideRight, scaleIn, float, pulse, shimmer, glow, rotateIn, wiggle, heartbeat, morphGradient)
- Added comprehensive CSS classes for motion and hover effects in
index.css - Made email and Google OAuth services optional with graceful fallbacks when credentials are not configured
- Simplified index.html by removing complex background animations and letting the React app handle UI
Reviewed changes
Copilot reviewed 14 out of 15 changed files in this pull request and generated 19 comments.
Show a summary per file
| File | Description |
|---|---|
tailwind.config.js |
Added 13 new animation keyframes and 15 new animation utilities for enhanced motion effects |
src/utils/motionVariants.js |
New file providing 20+ reusable Framer Motion animation variants for consistent animations |
src/main.jsx |
Made Google OAuth provider conditional, only wrapping App when valid credentials are present |
src/index.css |
Added extensive CSS classes for motion effects, hover interactions, and visual enhancements |
src/components/layout/Loader.jsx |
Changed style tag from JSX to regular syntax for compatibility |
src/components/layout/Footer.jsx |
Enhanced with Framer Motion animations, gradient effects, and interactive hover states |
src/components/UI/BackToTop.jsx |
Redesigned with Framer Motion animations, glow effects, and smooth transitions |
src/Pages/Home/Testimonial.jsx |
Added gradient accents, animated stars, and enhanced hover effects to testimonial cards |
src/Pages/Home/TemplatesSection.jsx |
Redesigned with gradient borders, icon animations, and floating particles on hover |
src/Pages/Home/Pricing.jsx |
Complete redesign with gradient effects, animated badges, and enhanced visual hierarchy |
src/Pages/Home/HeroSection.jsx |
Added gradient text animations, glow effects on buttons, and enhanced CTA interactions |
src/Pages/Home/FeaturesSection.jsx |
Enhanced with gradient icons, animated hover states, and top border animations |
index.html |
Simplified body styles and removed complex background animations, delegating to React app |
backend/src/services/emailService.js |
Added checks to gracefully skip email sending when transporter is not configured |
backend/src/services/EmailTransporter.js |
Made email configuration optional with clear console warnings when disabled |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| import React from "react"; | ||
| import { motion } from "framer-motion"; | ||
| import { Rocket, BookOpen, Heart, GitBranch, Users, Bookmark } from "lucide-react"; | ||
| import { staggerContainer, fadeInUp, cardHoverGlow } from "../../utils/motionVariants"; |
There was a problem hiding this comment.
The imported motion variants staggerContainer, fadeInUp, and cardHoverGlow are not used anywhere in this file. These imports should be removed to avoid unused code.
| import { staggerContainer, fadeInUp, cardHoverGlow } from "../../utils/motionVariants"; |
| // Button glow animation | ||
| const buttonGlow = { | ||
| rest: { | ||
| boxShadow: "0 4px 15px rgba(0, 0, 0, 0.1)", | ||
| }, | ||
| hover: { | ||
| boxShadow: "0 8px 30px rgba(139, 92, 246, 0.4)", | ||
| transition: { duration: 0.3 } | ||
| } | ||
| }; | ||
|
|
There was a problem hiding this comment.
The buttonGlow animation variant is defined but never used in this component. This adds unnecessary code. Consider removing this unused variant or applying it to buttons if it was intended to be used.
| // Button glow animation | |
| const buttonGlow = { | |
| rest: { | |
| boxShadow: "0 4px 15px rgba(0, 0, 0, 0.1)", | |
| }, | |
| hover: { | |
| boxShadow: "0 8px 30px rgba(139, 92, 246, 0.4)", | |
| transition: { duration: 0.3 } | |
| } | |
| }; |
| whileTap="tap" | ||
| className="relative group" | ||
| > | ||
| <div className="absolute -inset-1 bg-gradient-to-r from-purple-600 via-pink-500 to-indigo-600 rounded-full blur-md opacity-70 group-hover:opacity-100 transition-opacity duration-300 animate-gradient" style={{ backgroundSize: '200% 200%' }} /> |
There was a problem hiding this comment.
The inline style attribute with backgroundSize can be replaced with the Tailwind class bg-[length:200%_200%] for consistency with the rest of the codebase. Inline styles should be avoided when Tailwind utilities are available.
| <div className="absolute -inset-1 bg-gradient-to-r from-purple-600 via-pink-500 to-indigo-600 rounded-full blur-md opacity-70 group-hover:opacity-100 transition-opacity duration-300 animate-gradient" style={{ backgroundSize: '200% 200%' }} /> | |
| <div className="absolute -inset-1 bg-gradient-to-r from-purple-600 via-pink-500 to-indigo-600 rounded-full blur-md opacity-70 group-hover:opacity-100 transition-opacity duration-300 animate-gradient bg-[length:200%_200%]" /> |
| {/* Popular Badge */} | ||
| {plan.popular && ( | ||
| <motion.div | ||
| className="absolute -top-1 left-1/2 -translate-x-1/2 z-[60]" |
There was a problem hiding this comment.
Using arbitrary z-index values like z-[60] and z-[999] can lead to z-index conflicts and maintenance issues. Consider defining these z-index values in your Tailwind config as named layers (e.g., z-badge, z-back-to-top) for better maintainability and consistency across the codebase.
| className="absolute -top-1 left-1/2 -translate-x-1/2 z-[60]" | |
| className="absolute -top-1 left-1/2 -translate-x-1/2 z-50" |
| @@ -17,23 +18,43 @@ const BackToTop = () => { | |||
| }; | |||
|
|
|||
| return ( | |||
| <button | |||
| className={`back-to-top ${visible ? 'visible' : 'hidden'} | |||
| bg-gradient-to-r from-[#3b82f6] to-[#accefbff] | |||
| dark:from-purple-600 dark:to-blue-600 text-white font-medium px-4 py-2 rounded-full shadow-lg`} | |||
| onClick={scrollToTop} | |||
| aria-label="Back to top" | |||
| > | |||
| <svg | |||
| xmlns="http://www.w3.org/2000/svg" | |||
| width="40" | |||
| height="40" | |||
| fill="white" | |||
| viewBox="0 0 24 24" | |||
| > | |||
| <path d="M12 5.5l-6.5 6.5 1.4 1.4L12 8.3l5.1 5.1 1.4-1.4L12 5.5z" /> | |||
| </svg> | |||
| </button> | |||
| <AnimatePresence> | |||
| {visible && ( | |||
| <motion.button | |||
| className="fixed bottom-6 right-6 z-[999] w-14 h-14 flex items-center justify-center rounded-full bg-gradient-to-r from-primary-500 to-primary-600 dark:from-accent-500 dark:to-accent-600 text-white shadow-lg cursor-pointer overflow-hidden group" | |||
| onClick={scrollToTop} | |||
| aria-label="Back to top" | |||
| initial={{ opacity: 0, y: 20, scale: 0.8 }} | |||
| animate={{ opacity: 1, y: 0, scale: 1 }} | |||
| exit={{ opacity: 0, y: 20, scale: 0.8 }} | |||
| transition={{ type: "spring", stiffness: 300, damping: 20 }} | |||
| whileHover={{ | |||
| scale: 1.1, | |||
| boxShadow: "0 0 25px rgba(59, 130, 246, 0.5)" | |||
| }} | |||
| whileTap={{ scale: 0.95 }} | |||
| > | |||
| {/* Glow effect */} | |||
| <div className="absolute inset-0 bg-gradient-to-r from-primary-400 to-accent-500 opacity-0 group-hover:opacity-100 transition-opacity duration-300" /> | |||
|
|
|||
| {/* Ripple effect */} | |||
| <span className="absolute inset-0 rounded-full bg-white/20 scale-0 group-hover:scale-100 transition-transform duration-500" /> | |||
|
|
|||
| <motion.svg | |||
| xmlns="http://www.w3.org/2000/svg" | |||
| width="28" | |||
| height="28" | |||
| fill="white" | |||
| viewBox="0 0 24 24" | |||
| className="relative z-10" | |||
| animate={{ y: [0, -3, 0] }} | |||
| transition={{ duration: 1.5, repeat: Infinity, ease: "easeInOut" }} | |||
| > | |||
| <path d="M12 5.5l-6.5 6.5 1.4 1.4L12 8.3l5.1 5.1 1.4-1.4L12 5.5z" /> | |||
| </motion.svg> | |||
| </motion.button> | |||
| )} | |||
| </AnimatePresence> | |||
| ); | |||
| }; | |||
|
|
|||
There was a problem hiding this comment.
This component adds animations but does not respect the user's prefers-reduced-motion setting, which is an accessibility concern. Consider importing and using useReducedMotion from framer-motion to disable or reduce animations for users who prefer reduced motion, similar to how it's done in src/Pages/About/AboutUs.jsx.
| <div className="absolute bottom-8 left-6 w-1.5 h-1.5 rounded-full bg-gradient-to-r from-pink-400 to-rose-400 opacity-0 group-hover:opacity-100 group-hover:animate-float transition-opacity duration-500 animation-delay-300" /> | ||
| <div className="absolute top-1/3 left-4 w-1 h-1 rounded-full bg-gradient-to-r from-cyan-400 to-blue-400 opacity-0 group-hover:opacity-100 group-hover:animate-float transition-opacity duration-500 animation-delay-500" /> |
There was a problem hiding this comment.
The animation-delay-300 and animation-delay-500 classes are used here but not defined globally. While the Loader component defines these classes in its own style tag, using them in other components will not work unless these classes are added to the global CSS or Tailwind config. Consider adding these animation delay utilities to your src/index.css file or Tailwind configuration for consistency across the codebase.
| <div className="absolute bottom-8 left-6 w-1.5 h-1.5 rounded-full bg-gradient-to-r from-pink-400 to-rose-400 opacity-0 group-hover:opacity-100 group-hover:animate-float transition-opacity duration-500 animation-delay-300" /> | |
| <div className="absolute top-1/3 left-4 w-1 h-1 rounded-full bg-gradient-to-r from-cyan-400 to-blue-400 opacity-0 group-hover:opacity-100 group-hover:animate-float transition-opacity duration-500 animation-delay-500" /> | |
| <div | |
| className="absolute bottom-8 left-6 w-1.5 h-1.5 rounded-full bg-gradient-to-r from-pink-400 to-rose-400 opacity-0 group-hover:opacity-100 group-hover:animate-float transition-opacity duration-500" | |
| style={{ animationDelay: "300ms" }} | |
| /> | |
| <div | |
| className="absolute top-1/3 left-4 w-1 h-1 rounded-full bg-gradient-to-r from-cyan-400 to-blue-400 opacity-0 group-hover:opacity-100 group-hover:animate-float transition-opacity duration-500" | |
| style={{ animationDelay: "500ms" }} | |
| /> |
| }} | ||
| > | ||
| Animation UI Library <br /> for Developers | ||
| <span className="bg-gradient-to-r from-primary-600 via-accent-500 to-pink-500 dark:from-primary-400 dark:via-accent-400 dark:to-pink-400 bg-clip-text text-transparent bg-[length:200%_auto] animate-gradient"> |
There was a problem hiding this comment.
Using animate-gradient with bg-[length:200%_auto] on text creates a continuously running animation that requires constant repaints. This can impact performance, especially on lower-end devices or when multiple instances are rendered. Consider using prefers-reduced-motion media query to disable or reduce the animation for users who prefer reduced motion.
| <span className="bg-gradient-to-r from-primary-600 via-accent-500 to-pink-500 dark:from-primary-400 dark:via-accent-400 dark:to-pink-400 bg-clip-text text-transparent bg-[length:200%_auto] animate-gradient"> | |
| <span className="bg-gradient-to-r from-primary-600 via-accent-500 to-pink-500 dark:from-primary-400 dark:via-accent-400 dark:to-pink-400 bg-clip-text text-transparent bg-[length:200%_auto] animate-gradient motion-reduce:animate-none motion-reduce:bg-[length:100%_auto]"> |
| <AnimatePresence> | ||
| {visible && ( | ||
| <motion.button | ||
| className="fixed bottom-6 right-6 z-[999] w-14 h-14 flex items-center justify-center rounded-full bg-gradient-to-r from-primary-500 to-primary-600 dark:from-accent-500 dark:to-accent-600 text-white shadow-lg cursor-pointer overflow-hidden group" |
There was a problem hiding this comment.
Using arbitrary z-index value z-[999] can lead to z-index conflicts. Consider defining this z-index value in your Tailwind config as a named layer (e.g., z-back-to-top) for better maintainability and consistency.
| className="fixed bottom-6 right-6 z-[999] w-14 h-14 flex items-center justify-center rounded-full bg-gradient-to-r from-primary-500 to-primary-600 dark:from-accent-500 dark:to-accent-600 text-white shadow-lg cursor-pointer overflow-hidden group" | |
| className="fixed bottom-6 right-6 z-50 w-14 h-14 flex items-center justify-center rounded-full bg-gradient-to-r from-primary-500 to-primary-600 dark:from-accent-500 dark:to-accent-600 text-white shadow-lg cursor-pointer overflow-hidden group" |
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
|
You have used many vibrant colours, which doesn't go with the professionalism of the website. please look into it. |
|
@copilot open a new pull request to apply changes based on the comments in this thread |
you can check it i will slightly fix |
closes #906
Recording.2026-02-06.181231.mp4
i will change some basice thing and add new styling and motion effect
i share the video you check it @Premkolte
Please mention these details about yourself here.
regards,
Prem Kolte.