-
-
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.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