diff --git a/src/App.tsx b/src/App.tsx index 8eafb448..d9ae67ea 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -17,7 +17,7 @@ function App() { {!isFullscreen && } -
+
diff --git a/src/components/Features.tsx b/src/components/Features.tsx index 8125cb42..5300ba97 100644 --- a/src/components/Features.tsx +++ b/src/components/Features.tsx @@ -1,92 +1,240 @@ +import { motion, useMotionValue, useTransform, useSpring } from 'framer-motion'; import { BarChart3, Users, Search, Zap, Shield, Globe } from 'lucide-react'; +import { useRef, useState } from 'react'; -const Features = () => { - const features = [ - { - icon: BarChart3, - title: 'Activity Analytics', - description: 'Comprehensive charts and graphs showing commit patterns, contribution streaks, and repository activity over time.', - bgColor: 'bg-blue-100', - iconColor: 'text-blue-600', - hoverColor: 'hover:bg-blue-400/50 dark:hover:bg-blue-900/30', - borderColor: 'hover:border-blue-200 dark:hover:border-blue-700' - }, - { - icon: Users, - title: 'Multi-User Tracking', - description: 'Monitor multiple GitHub users simultaneously and compare their activity levels and contribution patterns.', - bgColor: 'bg-green-100', - iconColor: 'text-green-600', - hoverColor: 'hover:bg-green-400/50 dark:hover:bg-green-900/30', - borderColor: 'hover:border-green-200 dark:hover:border-green-700' - }, - { - icon: Search, - title: 'Smart Search', - description: 'Quickly find and add users to your tracking list with intelligent search and auto-suggestions.', - bgColor: 'bg-purple-100', - iconColor: 'text-purple-600', - hoverColor: 'hover:bg-purple-400/50 dark:hover:bg-purple-900/30', - borderColor: 'hover:border-purple-200 dark:hover:border-purple-700' - }, - { - icon: Zap, - title: 'Real-time Updates', - description: 'Get instant notifications and updates when tracked users make new contributions or repositories.', - bgColor: 'bg-orange-100', - iconColor: 'text-orange-600', - hoverColor: 'hover:bg-orange-400/50 dark:hover:bg-orange-900/30', - borderColor: 'hover:border-orange-200 dark:hover:border-orange-700' - }, - { - icon: Shield, - title: 'Privacy First', - description: 'All data is fetched from public GitHub APIs. We don\'t store personal information or require GitHub access.', - bgColor: 'bg-red-100', - iconColor: 'text-red-600', - hoverColor: 'hover:bg-red-400/50 dark:hover:bg-red-900/30', - borderColor: 'hover:border-red-200 dark:hover:border-red-700' - }, - { - icon: Globe, - title: 'Export & Share', - description: 'Export activity reports and share insights with your team through various formats and integrations.', - bgColor: 'bg-indigo-100', - iconColor: 'text-indigo-600', - hoverColor: 'hover:bg-indigo-400/50 dark:hover:bg-indigo-900/30', - borderColor: 'hover:border-indigo-200 dark:hover:border-indigo-700' - } - ]; +const features = [ + { + icon: BarChart3, + title: 'Activity Analytics', + description: 'Comprehensive charts showing commit patterns, contribution streaks, and repository activity over time.', + iconBg: 'bg-blue-500/15 dark:bg-blue-500/20', + iconColor: 'text-blue-600 dark:text-blue-400', + glow: '59,130,246', + border: 'hover:border-blue-400/50 dark:hover:border-blue-500/50', + }, + { + icon: Users, + title: 'Multi-User Tracking', + description: 'Monitor multiple GitHub users simultaneously and compare contribution patterns side by side.', + iconBg: 'bg-emerald-500/15 dark:bg-emerald-500/20', + iconColor: 'text-emerald-600 dark:text-emerald-400', + glow: '16,185,129', + border: 'hover:border-emerald-400/50 dark:hover:border-emerald-500/50', + }, + { + icon: Search, + title: 'Smart Search', + description: 'Intelligent search with auto-suggestions to instantly find and add users to your dashboard.', + iconBg: 'bg-violet-500/15 dark:bg-violet-500/20', + iconColor: 'text-violet-600 dark:text-violet-400', + glow: '139,92,246', + border: 'hover:border-violet-400/50 dark:hover:border-violet-500/50', + }, + { + icon: Zap, + title: 'Real-time Updates', + description: 'Instant notifications when tracked users push commits, open PRs, or create repositories.', + iconBg: 'bg-amber-500/15 dark:bg-amber-500/20', + iconColor: 'text-amber-600 dark:text-amber-400', + glow: '245,158,11', + border: 'hover:border-amber-400/50 dark:hover:border-amber-500/50', + }, + { + icon: Shield, + title: 'Privacy First', + description: 'Public GitHub APIs only. Zero personal data stored, no authentication required from users.', + iconBg: 'bg-rose-500/15 dark:bg-rose-500/20', + iconColor: 'text-rose-600 dark:text-rose-400', + glow: '244,63,94', + border: 'hover:border-rose-400/50 dark:hover:border-rose-500/50', + }, + { + icon: Globe, + title: 'Export & Share', + description: 'Export activity reports and share insights with your team through various formats and integrations.', + iconBg: 'bg-cyan-500/15 dark:bg-cyan-500/20', + iconColor: 'text-cyan-600 dark:text-cyan-400', + glow: '6,182,212', + border: 'hover:border-cyan-400/50 dark:hover:border-cyan-500/50', + }, +]; + +const containerVariants = { + hidden: {}, + visible: { transition: { staggerChildren: 0.08 } }, +}; + +const cardVariants = { + hidden: { opacity: 0, y: 28, filter: 'blur(6px)' }, + visible: { + opacity: 1, + y: 0, + filter: 'blur(0px)', + transition: { type: 'spring', stiffness: 70, damping: 18 }, + }, +}; + +const FeatureCard = ({ feature }: { feature: typeof features[0] }) => { + const ref = useRef(null); + const [hovered, setHovered] = useState(false); + + const x = useMotionValue(0); + const y = useMotionValue(0); + + const rotateX = useSpring(useTransform(y, [-0.5, 0.5], [5, -5]), { + stiffness: 250, + damping: 28, + }); + const rotateY = useSpring(useTransform(x, [-0.5, 0.5], [-5, 5]), { + stiffness: 250, + damping: 28, + }); + + const handleMouseMove = (e: React.MouseEvent) => { + if (!ref.current) return; + const rect = ref.current.getBoundingClientRect(); + x.set((e.clientX - rect.left) / rect.width - 0.5); + y.set((e.clientY - rect.top) / rect.height - 0.5); + }; + + const handleMouseLeave = () => { + x.set(0); + y.set(0); + setHovered(false); + }; + + const Icon = feature.icon; + + return ( + setHovered(true)} + onMouseLeave={handleMouseLeave} + style={{ rotateX, rotateY, transformStyle: 'preserve-3d' }} + whileHover={{ y: -8, scale: 1.02 }} + transition={{ type: 'spring', stiffness: 280, damping: 22 }} + className={`group relative rounded-2xl border border-gray-200 dark:border-white/[0.08] ${feature.border} + bg-white dark:bg-white/[0.03] backdrop-blur-md + shadow-sm hover:shadow-2xl + transition-colors duration-300 cursor-default overflow-hidden`} + > + {/* Strong ambient glow on hover */} +
+ {/* Bottom glow puddle */} +
+ + {/* Top accent line */} +
+ + {/* Card content */} +
+ {/* Icon */} + + + + + {/* Title */} +

+ {feature.title} +

+ + {/* Description */} +

+ {feature.description} +

+
+ + ); +}; + +const Features = () => { return ( -
-
-
-

Powerful Features

-

- Everything you need to track, analyze, and understand GitHub activity patterns -

-
- -
- {features.map((feature, index) => { - const IconComponent = feature.icon; - return ( -
-
- -
-

{feature.title}

-

- {feature.description} -

-
- ); - })} -
+
+ {/* Dot grid */} +
+ + {/* Ambient blobs */} +
+
+
+ +
+ {/* Header */} + +

+ Powerful Features +

+ + {/* Premium pill subtitle — no eyebrow badge */} +
+ +

+ Everything you need to track, analyze, and understand GitHub activity patterns +

+ +
+
+ + {/* Cards grid */} + + {features.map((feature) => ( + + ))} +
); }; -export default Features; +export default Features; \ No newline at end of file diff --git a/src/components/HowItWorks.tsx b/src/components/HowItWorks.tsx index 86224f9d..5d23dbc5 100644 --- a/src/components/HowItWorks.tsx +++ b/src/components/HowItWorks.tsx @@ -1,111 +1,298 @@ -import { useContext } from 'react'; -import { ArrowDown, ArrowRight, BarChart3, Activity, Search } from 'lucide-react'; -import { ThemeContext } from '../context/ThemeContext'; -import type { ThemeContextType } from '../context/ThemeContext'; +import { motion } from 'framer-motion'; +import { Search, Activity, BarChart3 } from 'lucide-react'; -const HowItWorks = () => { - const themeContext = useContext(ThemeContext) as ThemeContextType | null; - const mode = themeContext?.mode ?? 'light'; - - const steps = [ - { - number: 1, - title: 'Search Users', - description: 'Enter GitHub usernames or search for users by name. Add them to your tracking dashboard.', - icon: Search, - }, - { - number: 2, - title: 'Monitor Activity', - description: 'Watch insights of commits, pull requests, issues, and other GitHub activities.', - icon: Activity, - }, - { - number: 3, - title: 'Analyze Insights', - description: 'Review detailed analytics, export reports, and gain valuable insights into development patterns.', - icon: BarChart3, - } - ]; - - const sectionBgClass = mode === 'dark' - ? 'bg-[#1e2130] text-white' - : 'bg-gradient-to-b from-gray-50 via-white to-slate-100 text-gray-900'; - const cardSurfaceClass = mode === 'dark' ? 'bg-white/[0.04]' : 'bg-white'; - const cardBorderClass = mode === 'dark' ? 'border-white/10' : 'border-gray-200'; - const titleTextClass = mode === 'dark' ? 'text-white' : 'text-gray-900'; - const bodyTextClass = mode === 'dark' ? 'text-gray-300' : 'text-gray-600'; - const connectorBubbleClass = mode === 'dark' - ? 'rounded-full border border-blue-400/25 bg-[#1e2130] p-2 text-blue-300 shadow-[0_0_20px_rgba(59,130,246,0.28)]' - : 'rounded-full border border-blue-200 bg-white p-2 text-blue-600 shadow-[0_0_18px_rgba(59,130,246,0.14)]'; - const connectorLineClass = mode === 'dark' - ? 'how-it-works-flow-line' - : 'how-it-works-flow-line light'; +const steps = [ + { + number: '01', + title: 'Search Users', + description: 'Enter GitHub usernames or search by name. Add them instantly to your tracking dashboard.', + icon: Search, + glow: '59,130,246', + gradientFrom: 'rgba(59,130,246,0.12)', + iconBg: 'bg-blue-500/10 dark:bg-blue-500/15', + iconColor: 'text-blue-600 dark:text-blue-400', + numberColor: 'text-blue-500', + numberShadow: '59,130,246', + numberBorder: 'rgba(59,130,246,0.25)', + numberBg: 'rgba(59,130,246,0.06)', + accentLine: 'rgba(59,130,246,0.7)', + hoverBorder: 'rgba(59,130,246,0.3)', + hoverShadow: '0 12px 40px rgba(59,130,246,0.10), 0 2px 12px rgba(59,130,246,0.06)', + arrowColor: '99,120,230', + }, + { + number: '02', + title: 'Monitor Activity', + description: 'Watch real-time insights of commits, pull requests, issues, and other GitHub activities.', + icon: Activity, + glow: '139,92,246', + gradientFrom: 'rgba(139,92,246,0.12)', + iconBg: 'bg-violet-500/10 dark:bg-violet-500/15', + iconColor: 'text-violet-600 dark:text-violet-400', + numberColor: 'text-violet-500', + numberShadow: '139,92,246', + numberBorder: 'rgba(139,92,246,0.25)', + numberBg: 'rgba(139,92,246,0.06)', + accentLine: 'rgba(139,92,246,0.7)', + hoverBorder: 'rgba(139,92,246,0.3)', + hoverShadow: '0 12px 40px rgba(139,92,246,0.10), 0 2px 12px rgba(139,92,246,0.06)', + arrowColor: '100,160,140', + }, + { + number: '03', + title: 'Analyze Insights', + description: 'Review detailed analytics, export reports, and gain valuable insights into development patterns.', + icon: BarChart3, + glow: '16,185,129', + gradientFrom: 'rgba(16,185,129,0.12)', + iconBg: 'bg-emerald-500/10 dark:bg-emerald-500/15', + iconColor: 'text-emerald-600 dark:text-emerald-400', + numberColor: 'text-emerald-500', + numberShadow: '16,185,129', + numberBorder: 'rgba(16,185,129,0.25)', + numberBg: 'rgba(16,185,129,0.06)', + accentLine: 'rgba(16,185,129,0.7)', + hoverBorder: 'rgba(16,185,129,0.3)', + hoverShadow: '0 12px 40px rgba(16,185,129,0.10), 0 2px 12px rgba(16,185,129,0.06)', + arrowColor: null, + }, +]; + +const containerVariants = { + hidden: {}, + visible: { transition: { staggerChildren: 0.13 } }, +}; + +const cardVariants = { + hidden: { opacity: 0, y: 28, filter: 'blur(6px)' }, + visible: { + opacity: 1, + y: 0, + filter: 'blur(0px)', + transition: { type: 'spring', stiffness: 65, damping: 18 }, + }, +}; + +// Arrow bubble shown between cards (no line, just the circle+arrow) +const ArrowBubble = ({ color }) => ( + +
+ + + +
+
+); + +// Down arrow for mobile +const DownArrowBubble = ({ color }) => ( + +
+ + + +
+
+); +const StepCard = ({ step, className = '' }) => { + const Icon = step.icon; return ( -
-
-
-

How It Works

-

- Get started in minutes with our simple three-step process -

-
+ { + e.currentTarget.style.borderColor = step.hoverBorder; + e.currentTarget.style.boxShadow = step.hoverShadow; + }} + onMouseLeave={(e) => { + e.currentTarget.style.borderColor = ''; + e.currentTarget.style.boxShadow = ''; + }} + > + {/* Subtle top accent line on hover */} +
-
-
-
- - - - - - - -
-
+
+ {/* Number badge + Icon row */} +
-
- - - - - + {/* Number inside rounded square */} +
+ + {step.number} -
-
- {steps.map((step, index) => { - const IconComponent = step.icon; - - return ( -
-
-
- {step.number} -
-
- -
- -
- -

{step.title}

-

- {step.description} -

-
- ); - })} -
+ {/* Icon */} + + +
+ + {/* Text */} +

+ {step.title} +

+

+ {step.description} +

+
+ + ); +}; + +const HowItWorks = () => { + return ( +
+ {/* Dot grid */} +
+ + {/* Ambient blobs */} +
+
+ +
+ + {/* Header */} + +

+ How It Works +

+
+ +

+ Get started in minutes with our simple three-step process +

+ +
+
+ + {/* Desktop: cards + arrow bubbles in a flex row */} + + {steps.map((step, i) => ( + <> +
+ +
+ {i < steps.length - 1 && ( + + )} + + ))} +
+ + {/* Mobile: stacked cards + down arrows */} + + {steps.map((step, i) => ( + <> + + + + {i < steps.length - 1 && ( + + )} + + ))} + +
); }; -export default HowItWorks; +export default HowItWorks; \ No newline at end of file