Skip to content

Commit 788a2d3

Browse files
committed
feat(landing): add smooth scroll + enhanced animations
- install Lenis for butter-smooth momentum scrolling - hero: scroll-linked parallax on gradient orbs - hero: staggered text reveal with blur effect - hero: grid pattern background - hero: search box glow pulse - features: spring-based hover lift + colored shadows - features: icon scale+rotate on hover - pricing: enhanced card lift animations - all: better spring physics throughout - reduced whitespace for tighter flow
1 parent 95b2a66 commit 788a2d3

7 files changed

Lines changed: 281 additions & 221 deletions

File tree

frontend/bun.lock

Lines changed: 4 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@
2222
"@radix-ui/react-switch": "^1.2.6",
2323
"@radix-ui/react-tabs": "^1.1.13",
2424
"@radix-ui/react-tooltip": "^1.2.8",
25+
"@studio-freight/lenis": "^1.0.42",
2526
"@supabase/supabase-js": "^2.39.0",
2627
"@tanstack/react-query": "^5.90.12",
2728
"@types/dagre": "^0.7.53",
2829
"@types/react-syntax-highlighter": "^15.5.13",
2930
"class-variance-authority": "^0.7.1",
3031
"clsx": "^2.1.1",
3132
"dagre": "^0.8.5",
32-
"framer-motion": "^12.25.0",
33+
"framer-motion": "^12.29.0",
3334
"lucide-react": "^0.554.0",
3435
"next-themes": "^0.4.6",
3536
"react": "^18.2.0",

frontend/src/components/landing/Features.tsx

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4955
const 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

5763
const 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

6273
export 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

Comments
 (0)