@@ -8,71 +8,82 @@ const FEATURES = [
88 description : 'Find code by what it does, not what it\'s named. Ask "retry logic with exponential backoff" and get exactly that.' ,
99 color : 'text-blue-400' ,
1010 bg : 'bg-blue-500/10' ,
11+ glow : 'group-hover:shadow-blue-500/20' ,
1112 } ,
1213 {
1314 icon : Brain ,
1415 title : 'Understands Context' ,
1516 description : 'Knows the difference between a Flask route handler and a FastAPI dependency. Context-aware results every time.' ,
1617 color : 'text-violet-400' ,
1718 bg : 'bg-violet-500/10' ,
19+ glow : 'group-hover:shadow-violet-500/20' ,
1820 } ,
1921 {
2022 icon : Zap ,
2123 title : 'Instant Results' ,
2224 description : 'Sub-100ms search across your entire codebase. No waiting, no spinning, just answers.' ,
2325 color : 'text-amber-400' ,
2426 bg : 'bg-amber-500/10' ,
27+ glow : 'group-hover:shadow-amber-500/20' ,
2528 } ,
2629 {
2730 icon : GitBranch ,
2831 title : 'Dependency Graph' ,
2932 description : 'See how code connects. Trace imports, find usages, understand impact before you change anything.' ,
3033 color : 'text-emerald-400' ,
3134 bg : 'bg-emerald-500/10' ,
35+ glow : 'group-hover:shadow-emerald-500/20' ,
3236 } ,
3337 {
3438 icon : Terminal ,
3539 title : 'MCP Integration' ,
3640 description : 'Works with Claude, Cursor, and any MCP-compatible AI. Your AI assistant finally understands your code.' ,
3741 color : 'text-cyan-400' ,
3842 bg : 'bg-cyan-500/10' ,
43+ glow : 'group-hover:shadow-cyan-500/20' ,
3944 } ,
4045 {
4146 icon : Lock ,
4247 title : 'Self-Host Option' ,
4348 description : 'Keep your code private. Run CodeIntel on your own infrastructure with full control.' ,
4449 color : 'text-rose-400' ,
4550 bg : 'bg-rose-500/10' ,
51+ glow : 'group-hover:shadow-rose-500/20' ,
4652 } ,
4753]
4854
4955const containerVariants = {
5056 hidden : { opacity : 0 } ,
5157 visible : {
5258 opacity : 1 ,
53- transition : { staggerChildren : 0.1 }
59+ transition : { staggerChildren : 0.08 , delayChildren : 0. 1 }
5460 }
5561}
5662
5763const itemVariants = {
58- hidden : { opacity : 0 , y : 20 } ,
59- visible : { opacity : 1 , y : 0 }
64+ hidden : { opacity : 0 , y : 30 , scale : 0.95 } ,
65+ visible : {
66+ opacity : 1 ,
67+ y : 0 ,
68+ scale : 1 ,
69+ transition : { type : 'spring' , stiffness : 200 , damping : 20 }
70+ }
6071}
6172
6273export function Features ( ) {
6374 return (
64- < section id = "features" className = "py-24 px-6 relative" >
75+ < section id = "features" className = "py-20 px-6 relative" >
6576 { /* Subtle gradient background */ }
6677 < div className = "absolute inset-0 bg-gradient-to-b from-transparent via-accent/[0.02] to-transparent pointer-events-none" />
6778
6879 < div className = "max-w-6xl mx-auto relative" >
6980 { /* Section header */ }
7081 < motion . div
71- className = "text-center mb-16 "
82+ className = "text-center mb-14 "
7283 initial = { { opacity : 0 , y : 20 } }
7384 whileInView = { { opacity : 1 , y : 0 } }
7485 viewport = { { once : true , margin : "-100px" } }
75- transition = { { duration : 0.5 } }
86+ transition = { { duration : 0.6 , ease : [ 0.25 , 0.4 , 0.25 , 1 ] } }
7687 >
7788 < h2 className = "text-3xl md:text-4xl font-bold text-foreground mb-4" >
7889 Built for how developers actually work
@@ -84,31 +95,43 @@ export function Features() {
8495
8596 { /* Features grid */ }
8697 < motion . div
87- className = "grid md:grid-cols-2 lg:grid-cols-3 gap-6 "
98+ className = "grid md:grid-cols-2 lg:grid-cols-3 gap-5 "
8899 variants = { containerVariants }
89100 initial = "hidden"
90101 whileInView = "visible"
91102 viewport = { { once : true , margin : "-50px" } }
92103 >
93- { FEATURES . map ( ( feature ) => (
104+ { FEATURES . map ( ( feature , index ) => (
94105 < motion . div
95106 key = { feature . title }
96107 variants = { itemVariants }
97- className = "group relative p-6 rounded-xl border border-white/[0.06] dark:border-white/[0.06] light:border-black/[0.06] bg-card/30 hover:bg-card/50 transition-all duration-300"
108+ whileHover = { {
109+ y : - 8 ,
110+ transition : { type : 'spring' , stiffness : 400 , damping : 25 }
111+ } }
112+ className = { `group relative p-6 rounded-xl border border-white/[0.06] bg-card/30
113+ hover:bg-card/50 hover:border-white/[0.1] transition-colors duration-300
114+ hover:shadow-xl ${ feature . glow } ` }
98115 >
99- { /* Hover glow */ }
100- < div className = "absolute inset-0 rounded-xl bg-gradient-to-br from-accent/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
101-
102- < div className = "relative" >
103- < div className = { `w-10 h-10 rounded-lg ${ feature . bg } flex items-center justify-center mb-4` } >
104- < feature . icon className = { `w-5 h-5 ${ feature . color } ` } />
105- </ div >
106- < h3 className = "text-lg font-semibold text-foreground mb-2" >
107- { feature . title }
108- </ h3 >
109- < p className = "text-sm text-muted-foreground leading-relaxed" >
110- { feature . description }
111- </ p >
116+ { /* Icon */ }
117+ < motion . div
118+ className = { `w-11 h-11 rounded-xl ${ feature . bg } flex items-center justify-center mb-4` }
119+ whileHover = { { scale : 1.1 , rotate : 5 } }
120+ transition = { { type : 'spring' , stiffness : 400 , damping : 15 } }
121+ >
122+ < feature . icon className = { `w-5 h-5 ${ feature . color } ` } />
123+ </ motion . div >
124+
125+ < h3 className = "text-lg font-semibold text-foreground mb-2 group-hover:text-accent transition-colors" >
126+ { feature . title }
127+ </ h3 >
128+ < p className = "text-sm text-muted-foreground leading-relaxed" >
129+ { feature . description }
130+ </ p >
131+
132+ { /* Subtle corner accent on hover */ }
133+ < div className = "absolute top-0 right-0 w-20 h-20 opacity-0 group-hover:opacity-100 transition-opacity duration-500" >
134+ < div className = { `absolute top-3 right-3 w-1.5 h-1.5 rounded-full ${ feature . bg } ` } />
112135 </ div >
113136 </ motion . div >
114137 ) ) }
0 commit comments