Prakhar Singh commited on
Commit
a3b81fa
·
1 Parent(s): 70060bb

Frontend Home Page added

Browse files
Frontend/.gitignore ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+
15
+ # Editor directories and files
16
+ .vscode/*
17
+ !.vscode/extensions.json
18
+ .idea
19
+ .DS_Store
20
+ *.suo
21
+ *.ntvs*
22
+ *.njsproj
23
+ *.sln
24
+ *.sw?
Frontend/README.md ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # React + TypeScript + Vite
2
+
3
+ This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4
+
5
+ Currently, two official plugins are available:
6
+
7
+ - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
8
+ - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9
+
10
+ ## React Compiler
11
+
12
+ The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
13
+
14
+ ## Expanding the ESLint configuration
15
+
16
+ If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
17
+
18
+ ```js
19
+ export default defineConfig([
20
+ globalIgnores(['dist']),
21
+ {
22
+ files: ['**/*.{ts,tsx}'],
23
+ extends: [
24
+ // Other configs...
25
+
26
+ // Remove tseslint.configs.recommended and replace with this
27
+ tseslint.configs.recommendedTypeChecked,
28
+ // Alternatively, use this for stricter rules
29
+ tseslint.configs.strictTypeChecked,
30
+ // Optionally, add this for stylistic rules
31
+ tseslint.configs.stylisticTypeChecked,
32
+
33
+ // Other configs...
34
+ ],
35
+ languageOptions: {
36
+ parserOptions: {
37
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
38
+ tsconfigRootDir: import.meta.dirname,
39
+ },
40
+ // other options...
41
+ },
42
+ },
43
+ ])
44
+ ```
45
+
46
+ You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
47
+
48
+ ```js
49
+ // eslint.config.js
50
+ import reactX from 'eslint-plugin-react-x'
51
+ import reactDom from 'eslint-plugin-react-dom'
52
+
53
+ export default defineConfig([
54
+ globalIgnores(['dist']),
55
+ {
56
+ files: ['**/*.{ts,tsx}'],
57
+ extends: [
58
+ // Other configs...
59
+ // Enable lint rules for React
60
+ reactX.configs['recommended-typescript'],
61
+ // Enable lint rules for React DOM
62
+ reactDom.configs.recommended,
63
+ ],
64
+ languageOptions: {
65
+ parserOptions: {
66
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
67
+ tsconfigRootDir: import.meta.dirname,
68
+ },
69
+ // other options...
70
+ },
71
+ },
72
+ ])
73
+ ```
Frontend/eslint.config.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import js from '@eslint/js'
2
+ import globals from 'globals'
3
+ import reactHooks from 'eslint-plugin-react-hooks'
4
+ import reactRefresh from 'eslint-plugin-react-refresh'
5
+ import tseslint from 'typescript-eslint'
6
+ import { defineConfig, globalIgnores } from 'eslint/config'
7
+
8
+ export default defineConfig([
9
+ globalIgnores(['dist']),
10
+ {
11
+ files: ['**/*.{ts,tsx}'],
12
+ extends: [
13
+ js.configs.recommended,
14
+ tseslint.configs.recommended,
15
+ reactHooks.configs['recommended-latest'],
16
+ reactRefresh.configs.vite,
17
+ ],
18
+ languageOptions: {
19
+ ecmaVersion: 2020,
20
+ globals: globals.browser,
21
+ },
22
+ },
23
+ ])
Frontend/index.html ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>package</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.tsx"></script>
12
+ </body>
13
+ </html>
Frontend/package-lock.json ADDED
The diff for this file is too large to render. See raw diff
 
Frontend/package.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "package",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "tsc -b && vite build",
9
+ "lint": "eslint .",
10
+ "preview": "vite preview"
11
+ },
12
+ "dependencies": {
13
+ "@tailwindcss/vite": "^4.1.17",
14
+ "lucide-react": "^0.553.0",
15
+ "react": "^19.2.0",
16
+ "react-dom": "^19.2.0",
17
+ "react-router-dom": "^7.9.5",
18
+ "tailwindcss": "^4.1.17"
19
+ },
20
+ "devDependencies": {
21
+ "@eslint/js": "^9.39.1",
22
+ "@types/node": "^24.10.0",
23
+ "@types/react": "^19.2.2",
24
+ "@types/react-dom": "^19.2.2",
25
+ "@vitejs/plugin-react": "^5.1.0",
26
+ "eslint": "^9.39.1",
27
+ "eslint-plugin-react-hooks": "^5.2.0",
28
+ "eslint-plugin-react-refresh": "^0.4.24",
29
+ "globals": "^16.5.0",
30
+ "typescript": "~5.9.3",
31
+ "typescript-eslint": "^8.46.3",
32
+ "vite": "^7.2.2"
33
+ }
34
+ }
Frontend/public/vite.svg ADDED
Frontend/src/App.tsx ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { BrowserRouter } from 'react-router-dom'
2
+ import Home from './pages/home'
3
+
4
+ function App() {
5
+ return (
6
+ <BrowserRouter>
7
+ <div className="w-full min-h-screen">
8
+ <Home />
9
+ </div>
10
+ </BrowserRouter>
11
+ )
12
+ }
13
+
14
+ export default App
Frontend/src/index.css ADDED
@@ -0,0 +1 @@
 
 
1
+ @import "tailwindcss";
Frontend/src/main.tsx ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { StrictMode } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import './index.css'
4
+ import App from './App.tsx'
5
+
6
+ createRoot(document.getElementById('root')!).render(
7
+ <StrictMode>
8
+ <App />
9
+ </StrictMode>,
10
+ )
Frontend/src/pages/home.tsx ADDED
@@ -0,0 +1,322 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from 'react';
2
+ import { Sparkles, Zap, Target, Clock, Award, ChevronRight, Menu, X } from 'lucide-react';
3
+
4
+ interface Feature {
5
+ icon: React.ReactNode;
6
+ title: string;
7
+ description: string;
8
+ }
9
+
10
+ interface Step {
11
+ step: string;
12
+ title: string;
13
+ desc: string;
14
+ }
15
+
16
+ const AIInterviewPlatform: React.FC = () => {
17
+ const [isMenuOpen, setIsMenuOpen] = useState<boolean>(false);
18
+ const [scrolled, setScrolled] = useState<boolean>(false);
19
+
20
+ useEffect(() => {
21
+ const handleScroll = (): void => {
22
+ setScrolled(window.scrollY > 50);
23
+ };
24
+ window.addEventListener('scroll', handleScroll);
25
+ return () => window.removeEventListener('scroll', handleScroll);
26
+ }, []);
27
+
28
+ const features: Feature[] = [
29
+ {
30
+ icon: <Sparkles className="w-8 h-8" />,
31
+ title: "AI-Powered Questions",
32
+ description: "Dynamic questions adapted to your skill level and role"
33
+ },
34
+ {
35
+ icon: <Zap className="w-8 h-8" />,
36
+ title: "Instant Feedback",
37
+ description: "Get real-time analysis and improvement suggestions"
38
+ },
39
+ {
40
+ icon: <Target className="w-8 h-8" />,
41
+ title: "Role-Specific Prep",
42
+ description: "Tailored scenarios for your target position"
43
+ },
44
+ {
45
+ icon: <Clock className="w-8 h-8" />,
46
+ title: "Practice Anytime",
47
+ description: "24/7 access to unlimited mock interviews"
48
+ },
49
+ {
50
+ icon: <Award className="w-8 h-8" />,
51
+ title: "Performance Analytics",
52
+ description: "Track your progress with detailed insights"
53
+ }
54
+ ];
55
+
56
+ const steps: Step[] = [
57
+ { step: "01", title: "Choose Your Role", desc: "Select the job position you're preparing for" },
58
+ { step: "02", title: "Practice Interview", desc: "Answer AI-generated questions in real-time" },
59
+ { step: "03", title: "Get Feedback", desc: "Receive detailed analysis and improvement tips" }
60
+ ];
61
+
62
+ return (
63
+ <div className="w-full min-h-screen bg-gradient-to-br from-slate-900 via-purple-900 to-slate-900 text-white **overflow-x-hidden**">
64
+ {/* Navigation Bar */}
65
+ <nav className={`fixed top-0 left-0 right-0 w-full z-50 transition-all duration-300 ${scrolled ? 'bg-slate-900/95 backdrop-blur-md shadow-xl' : 'bg-slate-900/80 backdrop-blur-sm'}`}>
66
+ <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
67
+ <div className="flex justify-between items-center h-20">
68
+ {/* Logo */}
69
+ <div className="flex items-center space-x-3">
70
+ <div className="bg-gradient-to-br from-purple-500 to-pink-500 p-2 rounded-lg">
71
+ <Sparkles className="w-6 h-6 text-white" />
72
+ </div>
73
+ <span className="text-2xl font-bold bg-gradient-to-r from-purple-400 to-pink-400 bg-clip-text text-transparent">
74
+ InterviewAI
75
+ </span>
76
+ </div>
77
+
78
+ {/* Desktop Navigation */}
79
+ <div className="hidden lg:flex items-center space-x-8">
80
+ <a href="#home" className="text-gray-200 hover:text-purple-400 transition-colors font-medium">
81
+ Home
82
+ </a>
83
+ <a href="#about" className="text-gray-200 hover:text-purple-400 transition-colors font-medium">
84
+ About
85
+ </a>
86
+ <a href="#features" className="text-gray-200 hover:text-purple-400 transition-colors font-medium">
87
+ Features
88
+ </a>
89
+ <a href="#how-it-works" className="text-gray-200 hover:text-purple-400 transition-colors font-medium">
90
+ How It Works
91
+ </a>
92
+ <button className="px-6 py-2.5 rounded-lg border-2 border-purple-400 text-purple-400 hover:bg-purple-400/10 transition-all font-medium">
93
+ Sign In
94
+ </button>
95
+ <button className="px-6 py-2.5 rounded-lg bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 transition-all shadow-lg shadow-purple-500/30 font-medium">
96
+ Sign Up
97
+ </button>
98
+ </div>
99
+ {/* Mobile Menu Button */}
100
+ <button
101
+ className="lg:hidden p-2 rounded-lg hover:bg-white/10 transition-colors"
102
+ onClick={() => setIsMenuOpen(!isMenuOpen)}
103
+ >
104
+ {isMenuOpen ? <X className="w-6 h-6" /> : <Menu className="w-6 h-6" />}
105
+ </button>
106
+ </div>
107
+ </div>
108
+ {/* Mobile Menu */}
109
+ {isMenuOpen && (
110
+ <div className="lg:hidden border-t border-white/10 bg-slate-900/98 backdrop-blur-md">
111
+ <div className="px-4 py-4 space-y-3 max-w-7xl mx-auto">
112
+ <a
113
+ href="#home"
114
+ className="block py-3 px-4 rounded-lg text-gray-200 hover:bg-purple-500/10 hover:text-purple-400 transition-all font-medium"
115
+ onClick={() => setIsMenuOpen(false)}
116
+ >
117
+ Home
118
+ </a>
119
+ <a
120
+ href="#about"
121
+ className="block py-3 px-4 rounded-lg text-gray-200 hover:bg-purple-500/10 hover:text-purple-400 transition-all font-medium"
122
+ onClick={() => setIsMenuOpen(false)}
123
+ >
124
+ About
125
+ </a>
126
+ <a
127
+ href="#features"
128
+ className="block py-3 px-4 rounded-lg text-gray-200 hover:bg-purple-500/10 hover:text-purple-400 transition-all font-medium"
129
+ onClick={() => setIsMenuOpen(false)}
130
+ >
131
+ Features
132
+ </a>
133
+ <a
134
+ href="#how-it-works"
135
+ className="block py-3 px-4 rounded-lg text-gray-200 hover:bg-purple-500/10 hover:text-purple-400 transition-all font-medium"
136
+ onClick={() => setIsMenuOpen(false)}
137
+ >
138
+ How It Works
139
+ </a>
140
+ <button className="w-full py-3 rounded-lg border-2 border-purple-400 text-purple-400 hover:bg-purple-400/10 transition-all font-medium">
141
+ Sign In
142
+ </button>
143
+ <button className="w-full py-3 rounded-lg bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 transition-all font-medium">
144
+ Sign Up
145
+ </button>
146
+ </div>
147
+ </div>
148
+ )}
149
+ </nav>
150
+ {/* Hero Section */}
151
+ <section id="home" className="min-h-screen flex items-center pt-20 pb-20 px-4 sm:px-6 lg:px-8">
152
+ <div className="max-w-7xl mx-auto text-center">
153
+ <div className="inline-block mb-4 px-4 py-2 bg-purple-500/20 rounded-full border border-purple-500/50">
154
+ <span className="text-sm font-semibold text-purple-300">✨ AI-Powered Interview Practice</span>
155
+ </div>
156
+
157
+ <h1 className="text-5xl sm:text-6xl lg:text-7xl font-bold mb-6 leading-tight">
158
+ Master Your Next
159
+ <span className="block bg-gradient-to-r from-purple-400 via-pink-400 to-purple-400 bg-clip-text text-transparent">
160
+ Interview with AI
161
+ </span>
162
+ </h1>
163
+
164
+ <p className="text-xl text-gray-300 mb-10 max-w-3xl mx-auto">
165
+ Practice with our intelligent AI interviewer, get instant feedback, and land your dream job with confidence.
166
+ </p>
167
+
168
+ <div className="flex flex-col sm:flex-row gap-4 justify-center items-center">
169
+ <button className="px-8 py-4 rounded-lg bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 transition shadow-lg shadow-purple-500/50 flex items-center gap-2 text-lg font-semibold">
170
+ Start Free Trial
171
+ <ChevronRight className="w-5 h-5" />
172
+ </button>
173
+ <button className="px-8 py-4 rounded-lg border-2 border-purple-400 hover:bg-purple-400/10 transition text-lg font-semibold">
174
+ Watch Demo
175
+ </button>
176
+ </div>
177
+ {/* Stats */}
178
+ <div className="mt-20 grid grid-cols-1 sm:grid-cols-3 gap-8 max-w-4xl mx-auto">
179
+ <div className="bg-white/5 backdrop-blur-sm rounded-xl p-6 border border-white/10">
180
+ <div className="text-4xl font-bold text-purple-400 mb-2">50K+</div>
181
+ <div className="text-gray-400">Successful Interviews</div>
182
+ </div>
183
+ <div className="bg-white/5 backdrop-blur-sm rounded-xl p-6 border border-white/10">
184
+ <div className="text-4xl font-bold text-pink-400 mb-2">95%</div>
185
+ <div className="text-gray-400">Success Rate</div>
186
+ </div>
187
+ <div className="bg-white/5 backdrop-blur-sm rounded-xl p-6 border border-white/10">
188
+ <div className="text-4xl font-bold text-purple-400 mb-2">24/7</div>
189
+ <div className="text-gray-400">AI Availability</div>
190
+ </div>
191
+ </div>
192
+ </div>
193
+ </section>
194
+ {/* About Section */}
195
+ <section id="about" className="py-20 px-4 sm:px-6 lg:px-8 bg-black/20">
196
+ <div className="max-w-6xl mx-auto">
197
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
198
+ <div>
199
+ <h2 className="text-4xl sm:text-5xl font-bold mb-6">
200
+ About InterviewAI
201
+ </h2>
202
+ <p className="text-lg text-gray-300 mb-6">
203
+ We're revolutionizing interview preparation with cutting-edge AI technology. Our platform helps candidates practice, learn, and succeed in their job interviews.
204
+ </p>
205
+ <p className="text-lg text-gray-300 mb-6">
206
+ Founded by industry experts and powered by advanced machine learning, InterviewAI provides personalized interview experiences that adapt to your unique needs and goals.
207
+ </p>
208
+ <div className="space-y-4">
209
+ <div className="flex items-center gap-3">
210
+ <div className="w-2 h-2 bg-purple-400 rounded-full"></div>
211
+ <span className="text-gray-300">Advanced AI interview simulations</span>
212
+ </div>
213
+ <div className="flex items-center gap-3">
214
+ <div className="w-2 h-2 bg-pink-400 rounded-full"></div>
215
+ <span className="text-gray-300">Personalized feedback and coaching</span>
216
+ </div>
217
+ <div className="flex items-center gap-3">
218
+ <div className="w-2 h-2 bg-purple-400 rounded-full"></div>
219
+ <span className="text-gray-300">Industry-leading success rates</span>
220
+ </div>
221
+ </div>
222
+ </div>
223
+ <div className="bg-gradient-to-br from-purple-900/50 to-pink-900/50 rounded-2xl p-8 border border-purple-500/30">
224
+ <div className="space-y-6">
225
+ <div className="bg-white/5 backdrop-blur-sm rounded-lg p-6">
226
+ <div className="text-3xl font-bold text-purple-400 mb-2">2020</div>
227
+ <div className="text-gray-400">Founded</div>
228
+ </div>
229
+ <div className="bg-white/5 backdrop-blur-sm rounded-lg p-6">
230
+ <div className="text-3xl font-bold text-pink-400 mb-2">50K+</div>
231
+ <div className="text-gray-400">Happy Users</div>
232
+ </div>
233
+ <div className="bg-white/5 backdrop-blur-sm rounded-lg p-6">
234
+ <div className="text-3xl font-bold text-purple-400 mb-2">500+</div>
235
+ <div className="text-gray-400">Companies Trust Us</div>
236
+ </div>
237
+ </div>
238
+ </div>
239
+ </div>
240
+ </div>
241
+ </section>
242
+ {/* Features Section */}
243
+ <section id="features" className="py-20 px-4 sm:px-6 lg:px-8">
244
+ <div className="max-w-7xl mx-auto">
245
+ <div className="text-center mb-16">
246
+ <h2 className="text-4xl sm:text-5xl font-bold mb-4">
247
+ Why Choose InterviewAI?
248
+ </h2>
249
+ <p className="text-xl text-gray-400">
250
+ Everything you need to ace your next interview
251
+ </p>
252
+ </div>
253
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
254
+ {features.map((feature: Feature, index: number) => (
255
+ <div
256
+ key={index}
257
+ className="bg-gradient-to-br from-purple-900/30 to-pink-900/30 backdrop-blur-sm rounded-xl p-8 border border-purple-500/20 hover:border-purple-500/50 transition-all duration-300 hover:transform hover:scale-105"
258
+ >
259
+ <div className="bg-gradient-to-br from-purple-500 to-pink-500 w-16 h-16 rounded-lg flex items-center justify-center mb-4 shadow-lg shadow-purple-500/50">
260
+ {feature.icon}
261
+ </div>
262
+ <h3 className="text-xl font-bold mb-3">{feature.title}</h3>
263
+ <p className="text-gray-400">{feature.description}</p>
264
+ </div>
265
+ ))}
266
+ </div>
267
+ </div>
268
+ </section>
269
+ {/* How It Works */}
270
+ <section id="how-it-works" className="py-20 px-4 sm:px-6 lg:px-8 bg-black/20">
271
+ <div className="max-w-7xl mx-auto">
272
+ <div className="text-center mb-16">
273
+ <h2 className="text-4xl sm:text-5xl font-bold mb-4">
274
+ How It Works
275
+ </h2>
276
+ <p className="text-xl text-gray-400">
277
+ Get started in three simple steps
278
+ </p>
279
+ </div>
280
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-8">
281
+ {steps.map((item: Step, index: number) => (
282
+ <div key={index} className="relative text-center">
283
+ <div className="text-7xl font-bold text-purple-500/20 mb-4">{item.step}</div>
284
+ <h3 className="text-2xl font-bold mb-3">{item.title}</h3>
285
+ <p className="text-gray-400">{item.desc}</p>
286
+ {index < 2 && (
287
+ <ChevronRight className="hidden md:block absolute top-12 -right-12 w-8 h-8 text-purple-500/50" />
288
+ )}
289
+ </div>
290
+ ))}
291
+ </div>
292
+ </div>
293
+ </section>
294
+ {/* CTA Section */}
295
+ <section className="py-20 px-4 sm:px-6 lg:px-8 bg-gradient-to-r from-purple-900/50 to-pink-900/50">
296
+ <div className="max-w-4xl mx-auto text-center">
297
+ <h2 className="text-4xl sm:text-5xl font-bold mb-6">
298
+ Ready to Ace Your Interview?
299
+ </h2>
300
+ <p className="text-xl text-gray-300 mb-10">
301
+ Join thousands of successful candidates who prepared with InterviewAI
302
+ </p>
303
+ <button className="px-10 py-5 rounded-lg bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 transition shadow-lg shadow-purple-500/50 text-lg font-semibold">
304
+ Start Your Free Trial Today
305
+ </button>
306
+ </div>
307
+ </section>
308
+ {/* Footer */}
309
+ <footer className="py-12 px-4 sm:px-6 lg:px-8 bg-black/40">
310
+ <div className="max-w-7xl mx-auto text-center text-gray-400">
311
+ <div className="flex items-center justify-center space-x-2 mb-4">
312
+ <Sparkles className="w-6 h-6 text-purple-400" />
313
+ <span className="text-xl font-bold text-white">InterviewAI</span>
314
+ </div>
315
+ <p>&copy; 2025 InterviewAI. All rights reserved.</p>
316
+ </div>
317
+ </footer>
318
+ </div>
319
+ );
320
+ };
321
+
322
+ export default AIInterviewPlatform;
Frontend/tailwind.config.cjs ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ /** @type {import('tailwindcss').Config} */
2
+ module.exports = {
3
+ content: [
4
+ "./src/**/*.{js,jsx,ts,tsx}",
5
+ ],
6
+ theme: {
7
+ extend: {},
8
+ },
9
+ plugins: [],
10
+ }
Frontend/tsconfig.app.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
+ "target": "ES2022",
5
+ "useDefineForClassFields": true,
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "module": "ESNext",
8
+ "types": ["vite/client"],
9
+ "skipLibCheck": true,
10
+
11
+ /* Bundler mode */
12
+ "moduleResolution": "bundler",
13
+ "allowImportingTsExtensions": true,
14
+ "verbatimModuleSyntax": true,
15
+ "moduleDetection": "force",
16
+ "noEmit": true,
17
+ "jsx": "react-jsx",
18
+
19
+ /* Linting */
20
+ "strict": true,
21
+ "noUnusedLocals": true,
22
+ "noUnusedParameters": true,
23
+ "erasableSyntaxOnly": true,
24
+ "noFallthroughCasesInSwitch": true,
25
+ "noUncheckedSideEffectImports": true
26
+ },
27
+ "include": ["src"]
28
+ }
Frontend/tsconfig.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./tsconfig.app.json" },
5
+ { "path": "./tsconfig.node.json" }
6
+ ]
7
+ }
Frontend/tsconfig.node.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
+ "target": "ES2023",
5
+ "lib": ["ES2023"],
6
+ "module": "ESNext",
7
+ "types": ["node"],
8
+ "skipLibCheck": true,
9
+
10
+ /* Bundler mode */
11
+ "moduleResolution": "bundler",
12
+ "allowImportingTsExtensions": true,
13
+ "verbatimModuleSyntax": true,
14
+ "moduleDetection": "force",
15
+ "noEmit": true,
16
+
17
+ /* Linting */
18
+ "strict": true,
19
+ "noUnusedLocals": true,
20
+ "noUnusedParameters": true,
21
+ "erasableSyntaxOnly": true,
22
+ "noFallthroughCasesInSwitch": true,
23
+ "noUncheckedSideEffectImports": true
24
+ },
25
+ "include": ["vite.config.ts"]
26
+ }
Frontend/vite.config.ts ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from 'vite'
2
+ import tailwindcss from '@tailwindcss/vite'
3
+ import react from '@vitejs/plugin-react'
4
+
5
+ // https://vite.dev/config/
6
+ export default defineConfig({
7
+ plugins: [
8
+ react(),
9
+ tailwindcss()
10
+ ],
11
+ })