Skip to content

Commit edeba2a

Browse files
Deploy frontend to production - Sat Feb 28 11:39:16 IST 2026
1 parent b04587c commit edeba2a

32 files changed

+8589
-0
lines changed

frontend/Dockerfile

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
FROM node:20-alpine AS deps
2+
WORKDIR /app
3+
COPY package.json package-lock.json ./
4+
RUN npm ci
5+
6+
FROM node:20-alpine AS builder
7+
WORKDIR /app
8+
COPY --from=deps /app/node_modules ./node_modules
9+
COPY . .
10+
RUN npm run build
11+
12+
FROM node:20-alpine AS runner
13+
WORKDIR /app
14+
ENV NODE_ENV=production
15+
COPY --from=builder /app/.next/standalone ./
16+
COPY --from=builder /app/.next/static ./.next/static
17+
COPY --from=builder /app/public ./public
18+
EXPOSE 3000
19+
CMD ["node", "server.js"]
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
export function Hero() {
2+
const pills = ["10-Question Mock Test", "Deep Reasoning Engine", "Hindi and English"];
3+
return (
4+
<section className="w-full bg-white border-b border-brand-200 relative overflow-hidden">
5+
{/* Grid background */}
6+
<div
7+
className="absolute inset-0 pointer-events-none"
8+
style={{
9+
backgroundImage:
10+
"linear-gradient(rgba(202,244,255,0.04) 1px,transparent 1px)," +
11+
"linear-gradient(90deg,rgba(202,244,255,0.04) 1px,transparent 1px)",
12+
backgroundSize: "80px 80px",
13+
}}
14+
/>
15+
<div className="max-w-screen-xl mx-auto px-6 md:px-12 py-16 grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
16+
{/* Left copy */}
17+
<div className="relative z-10">
18+
<span className="inline-flex items-center bg-brand-50 border border-brand-200 rounded-full px-4 py-1.5 text-[11px] font-bold text-brand-600 uppercase tracking-widest mb-5">
19+
Built for Indian Students
20+
</span>
21+
<p className="text-sm font-bold text-brand-500 mb-3 tracking-wide">Learn Smarter, Not Harder</p>
22+
<h1 className="font-display text-5xl font-black text-slate-900 leading-[1.08] mb-5">
23+
Meet Your Personal<br />
24+
<span className="text-brand-500">AI Tutor</span>
25+
</h1>
26+
<p className="text-[15px] text-slate-500 leading-relaxed mb-8 max-w-[440px]">
27+
Master any subject with an AI tutor that explains concepts in simple language,
28+
uses relatable Indian examples, and tests you with a custom mock test.
29+
</p>
30+
<div className="flex flex-wrap gap-2.5">
31+
{pills.map((p) => (
32+
<span key={p} className="text-[12px] font-semibold text-brand-600 bg-brand-50 border border-brand-200 rounded-full px-4 py-1.5">
33+
{p}
34+
</span>
35+
))}
36+
</div>
37+
</div>
38+
39+
{/* Right decorative */}
40+
<div className="relative z-10 flex justify-center items-center">
41+
<div className="relative w-[360px] h-[300px]">
42+
{/* Score card */}
43+
<div className="absolute top-2 left-0 bg-white border border-brand-200 rounded-2xl p-5 shadow-lg shadow-brand-500/10 z-20 min-w-[155px]">
44+
<p className="text-[10px] font-bold text-slate-400 uppercase tracking-widest mb-1.5">Current Score</p>
45+
<p className="font-display text-3xl font-black text-brand-500">8 / 10</p>
46+
<div className="h-1.5 bg-brand-100 rounded-full mt-3">
47+
<div className="h-full w-4/5 bg-gradient-to-r from-brand-500 to-brand-400 rounded-full" />
48+
</div>
49+
</div>
50+
{/* Mascot */}
51+
<div className="absolute top-5 right-0 w-[175px] h-[175px] bg-gradient-to-br from-brand-100 to-brand-50 rounded-full flex items-center justify-center text-[84px] ring-1 ring-brand-200 shadow-xl shadow-brand-500/12 animate-float z-10">
52+
🤖
53+
</div>
54+
{/* Badge */}
55+
<div className="absolute bottom-5 right-0 bg-white border border-green-200 rounded-xl px-4 py-3 shadow-md shadow-green-500/10 z-20">
56+
<p className="text-[10px] font-bold text-green-700 uppercase tracking-wider mb-1">Topic Mastered</p>
57+
<p className="text-[13px] font-bold text-slate-800">Photosynthesis</p>
58+
</div>
59+
{/* Decorative books */}
60+
<div className="absolute bottom-2 left-2 flex gap-2 items-end z-0">
61+
<div className="w-12 h-2 rounded-sm bg-gradient-to-r from-yellow-300 to-yellow-400 -rotate-3" />
62+
<div className="w-16 h-3.5 rounded bg-gradient-to-r from-indigo-300 to-indigo-400" />
63+
</div>
64+
</div>
65+
</div>
66+
</div>
67+
</section>
68+
);
69+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
export function Navbar() {
2+
return (
3+
<nav className="sticky top-0 z-50 w-full bg-white border-b border-brand-200 shadow-sm shadow-brand-500/5">
4+
<div className="max-w-screen-xl mx-auto px-6 md:px-12 h-16 flex items-center">
5+
{/* Logo */}
6+
<div className="flex items-center gap-2.5 mr-12 flex-shrink-0">
7+
<div className="w-8 h-8 rounded-lg bg-gradient-to-br from-brand-500 to-brand-400 flex items-center justify-center shadow-md shadow-brand-500/30">
8+
<svg width="14" height="14" viewBox="0 0 14 14" fill="none">
9+
<path d="M7 1L13 12H1L7 1Z" fill="white" />
10+
</svg>
11+
</div>
12+
<span className="font-display text-[17px] font-black text-slate-900 tracking-tight">
13+
AITutor
14+
</span>
15+
</div>
16+
17+
{/* Links */}
18+
<div className="hidden md:flex gap-7">
19+
{["How It Works", "Features", "Who It's For", "Why Us", "FAQ"].map((l) => (
20+
<a key={l} href="#" className="text-[13px] text-slate-500 font-medium hover:text-brand-500 transition-colors">
21+
{l}
22+
</a>
23+
))}
24+
</div>
25+
26+
{/* CTA */}
27+
<div className="ml-auto">
28+
<button className="text-[13px] font-bold text-white bg-brand-500 hover:bg-brand-600 px-5 py-2 rounded-full transition-all shadow-md shadow-brand-500/25 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-brand-500/35 active:translate-y-0">
29+
Try It Free
30+
</button>
31+
</div>
32+
</div>
33+
</nav>
34+
);
35+
}

0 commit comments

Comments
 (0)