Opera8 commited on
Commit
54872e6
·
verified ·
1 Parent(s): 96e14ad

Upload index (1) (4).html

Browse files
Files changed (1) hide show
  1. index (1) (4).html +519 -0
index (1) (4).html ADDED
@@ -0,0 +1,519 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="fa" dir="rtl">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
6
+ <title>آوا هوش - جعبه ابزار صدا</title>
7
+
8
+ <!-- Tailwind CSS -->
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+
11
+ <!-- Fonts -->
12
+ <link rel="preconnect" href="https://fonts.googleapis.com">
13
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
14
+ <link href="https://fonts.googleapis.com/css2?family=Vazirmatn:wght@100..900&display=swap" rel="stylesheet">
15
+
16
+ <!-- Babel for JSX transformation in browser -->
17
+ <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
18
+
19
+ <style>
20
+ body {
21
+ font-family: 'Vazirmatn', sans-serif;
22
+ background-color: #0f172a;
23
+ color: white;
24
+ -webkit-tap-highlight-color: transparent;
25
+ overflow-x: hidden;
26
+ }
27
+ ::-webkit-scrollbar {
28
+ width: 6px;
29
+ }
30
+ ::-webkit-scrollbar-track {
31
+ background: #0f172a;
32
+ }
33
+ ::-webkit-scrollbar-thumb {
34
+ background: #334155;
35
+ border-radius: 3px;
36
+ }
37
+ ::-webkit-scrollbar-thumb:hover {
38
+ background: #475569;
39
+ }
40
+ /* Custom Animations */
41
+ @keyframes gradient {
42
+ 0% { background-position: 0% 50%; }
43
+ 50% { background-position: 100% 50%; }
44
+ 100% { background-position: 0% 50%; }
45
+ }
46
+ .animate-gradient-x {
47
+ animation: gradient 3s ease infinite;
48
+ }
49
+ </style>
50
+
51
+ <!-- Import Map to resolve modules -->
52
+ <script type="importmap">
53
+ {
54
+ "imports": {
55
+ "react": "https://esm.sh/react@18.2.0",
56
+ "react-dom/client": "https://esm.sh/react-dom@18.2.0/client",
57
+ "framer-motion": "https://esm.sh/framer-motion@10.16.4",
58
+ "lucide-react": "https://esm.sh/lucide-react@0.292.0",
59
+ "react-dom/": "https://esm.sh/react-dom@^19.2.4/",
60
+ "react/": "https://esm.sh/react@^19.2.4/"
61
+ }
62
+ }
63
+ </script>
64
+ </head>
65
+ <body>
66
+ <div id="root"></div>
67
+
68
+ <!-- MAIN APPLICATION SCRIPT -->
69
+ <script type="text/babel" data-type="module">
70
+ import React, { useState, useEffect } from 'react';
71
+ import ReactDOM from 'react-dom/client';
72
+ import { motion, AnimatePresence } from 'framer-motion';
73
+ import {
74
+ Mic2,
75
+ Wand2,
76
+ Podcast,
77
+ Fingerprint,
78
+ Activity,
79
+ Music,
80
+ Settings,
81
+ User,
82
+ Bell,
83
+ ArrowLeft,
84
+ Sparkles
85
+ } from 'lucide-react';
86
+
87
+ // --- CONSTANTS & DATA ---
88
+ const APP_NAME = "آوا هوش";
89
+
90
+ const FEATURES = [
91
+ {
92
+ id: 'tts',
93
+ title: 'تبدیل متن به گفتار',
94
+ subtitle: '۳۰ گوینده حرفه‌ای',
95
+ icon: Mic2,
96
+ colorFrom: 'from-blue-500',
97
+ colorTo: 'to-cyan-400',
98
+ isHot: true
99
+ },
100
+ {
101
+ id: 'voice-changer',
102
+ title: 'تغییر صدا',
103
+ subtitle: 'مدل‌های جذاب فارسی',
104
+ icon: Wand2,
105
+ colorFrom: 'from-violet-500',
106
+ colorTo: 'to-purple-500'
107
+ },
108
+ {
109
+ id: 'podcast',
110
+ title: 'ساخت پادکست',
111
+ subtitle: 'تولید خودکار با هوش مصنوعی',
112
+ icon: Podcast,
113
+ colorFrom: 'from-pink-500',
114
+ colorTo: 'to-rose-500'
115
+ },
116
+ {
117
+ id: 'clone',
118
+ title: 'کلون کردن صدا',
119
+ subtitle: 'شبیه‌سازی دقیق صدا',
120
+ icon: Fingerprint,
121
+ colorFrom: 'from-amber-500',
122
+ colorTo: 'to-orange-500',
123
+ isNew: true
124
+ },
125
+ {
126
+ id: 'enhance',
127
+ title: 'افزایش کیفیت',
128
+ subtitle: 'حذف نویز و شفاف‌سازی',
129
+ icon: Activity,
130
+ colorFrom: 'from-emerald-500',
131
+ colorTo: 'to-green-400'
132
+ }
133
+ ];
134
+
135
+ const SPECIAL_FEATURE = {
136
+ id: 'ai-gen',
137
+ title: 'تولید صدا Ai',
138
+ subtitle: 'خلق افکت‌های صوتی خاص',
139
+ icon: Music,
140
+ colorFrom: 'from-indigo-600',
141
+ colorTo: 'to-blue-600'
142
+ };
143
+
144
+ // --- COMPONENTS ---
145
+
146
+ // 1. Background Effects
147
+ const Particle = ({ index }) => {
148
+ const randomX = Math.random() * 100;
149
+ const randomDelay = Math.random() * 5;
150
+ const randomDuration = 10 + Math.random() * 10;
151
+
152
+ return (
153
+ <motion.div
154
+ className="absolute w-1 h-1 bg-white rounded-full opacity-0"
155
+ initial={{ x: `${randomX}vw`, y: '110vh', opacity: 0 }}
156
+ animate={{
157
+ y: '-10vh',
158
+ opacity: [0, 0.3, 0]
159
+ }}
160
+ transition={{
161
+ duration: randomDuration,
162
+ repeat: Infinity,
163
+ delay: randomDelay,
164
+ ease: "linear"
165
+ }}
166
+ style={{
167
+ left: 0,
168
+ filter: 'blur(1px)'
169
+ }}
170
+ />
171
+ );
172
+ };
173
+
174
+ const BackgroundEffects = () => {
175
+ return (
176
+ <div className="fixed inset-0 z-0 overflow-hidden pointer-events-none bg-[#0B0F19]">
177
+ <div
178
+ className="absolute inset-0 opacity-[0.04]"
179
+ style={{
180
+ backgroundImage: `linear-gradient(#fff 1px, transparent 1px), linear-gradient(90deg, #fff 1px, transparent 1px)`,
181
+ backgroundSize: '50px 50px'
182
+ }}
183
+ ></div>
184
+
185
+ {[...Array(15)].map((_, i) => (
186
+ <Particle key={i} index={i} />
187
+ ))}
188
+
189
+ <motion.div
190
+ animate={{
191
+ scale: [1, 1.15, 1],
192
+ opacity: [0.15, 0.35, 0.15],
193
+ rotate: [0, 20, 0]
194
+ }}
195
+ transition={{
196
+ duration: 12,
197
+ repeat: Infinity,
198
+ ease: "easeInOut"
199
+ }}
200
+ className="absolute -top-[10%] -right-[20%] w-[600px] h-[600px] bg-gradient-to-br from-violet-600/20 to-indigo-600/20 rounded-full blur-[120px]"
201
+ />
202
+
203
+ <motion.div
204
+ animate={{
205
+ scale: [1, 1.25, 1],
206
+ opacity: [0.1, 0.25, 0.1],
207
+ x: [0, 30, 0]
208
+ }}
209
+ transition={{
210
+ duration: 15,
211
+ repeat: Infinity,
212
+ ease: "easeInOut",
213
+ delay: 1
214
+ }}
215
+ className="absolute top-[40%] -left-[20%] w-[500px] h-[500px] bg-gradient-to-tr from-blue-600/15 to-cyan-500/15 rounded-full blur-[100px]"
216
+ />
217
+
218
+ <motion.div
219
+ animate={{
220
+ scale: [1, 1.2, 1],
221
+ opacity: [0.1, 0.2, 0.1],
222
+ }}
223
+ transition={{
224
+ duration: 18,
225
+ repeat: Infinity,
226
+ ease: "easeInOut",
227
+ delay: 2
228
+ }}
229
+ className="absolute -bottom-20 -right-20 w-80 h-80 bg-emerald-500/5 rounded-full blur-[80px]"
230
+ />
231
+
232
+ <div className="absolute inset-0 bg-gradient-to-b from-transparent via-[#0B0F19]/60 to-[#0B0F19] pointer-events-none"></div>
233
+ </div>
234
+ );
235
+ };
236
+
237
+ // 2. Header
238
+ const Header = () => {
239
+ return (
240
+ <header className="relative z-20 flex flex-col items-center justify-center pt-8 pb-4">
241
+ <motion.div
242
+ initial={{ y: -20, opacity: 0 }}
243
+ animate={{ y: 0, opacity: 1 }}
244
+ transition={{ duration: 0.6, ease: "easeOut" }}
245
+ className="flex flex-col items-center gap-4"
246
+ >
247
+ <div className="relative group cursor-pointer">
248
+ <div className="w-16 h-16 rounded-2xl bg-gradient-to-br from-violet-600 to-indigo-600 flex items-center justify-center shadow-2xl shadow-indigo-500/40 ring-4 ring-white/5 transition-transform duration-500 hover:scale-105">
249
+ <span className="text-4xl font-black text-white pb-2">آ</span>
250
+ </div>
251
+ <span className="absolute -top-1 -right-1 flex h-4 w-4">
252
+ <span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-cyan-400 opacity-75"></span>
253
+ <span className="relative inline-flex rounded-full h-4 w-4 bg-cyan-500 border-4 border-[#0B0F19]"></span>
254
+ </span>
255
+ </div>
256
+ <h1 className="text-xl font-bold text-slate-200 tracking-wide opacity-90">{APP_NAME}</h1>
257
+ </motion.div>
258
+ </header>
259
+ );
260
+ };
261
+
262
+ // 3. Hero
263
+ const Hero = () => {
264
+ return (
265
+ <div className="px-6 pt-2 pb-8 mb-2 relative z-10 text-center">
266
+ <motion.div
267
+ initial={{ opacity: 0, y: 20 }}
268
+ animate={{ opacity: 1, y: 0 }}
269
+ transition={{ duration: 0.8, ease: "easeOut", delay: 0.2 }}
270
+ >
271
+ <h2 className="text-[2.2rem] font-black text-white mb-4 leading-[1.3] tracking-tight">
272
+ دنیای صدا را <br />
273
+ <span className="relative inline-block px-2">
274
+ <span className="absolute inset-0 bg-indigo-500/10 blur-xl rounded-full transform rotate-3"></span>
275
+ <span
276
+ className="relative text-transparent bg-clip-text bg-gradient-to-r from-indigo-300 via-purple-300 to-cyan-300 animate-gradient-x"
277
+ style={{ backgroundSize: '200% auto' }}
278
+ >
279
+ با هوش مصنوعی
280
+ </span>
281
+ </span>
282
+ <br/>
283
+ <span className="text-white">متحول کنید</span>
284
+ </h2>
285
+
286
+ <p className="text-slate-400 text-sm leading-7 font-light max-w-[80%] mx-auto opacity-80">
287
+ تکنولوژی پیشرفته برای خلق، ویرایش و تبدیل صدا
288
+ </p>
289
+ </motion.div>
290
+ </div>
291
+ );
292
+ };
293
+
294
+ // 4. Feature Card
295
+ const FeatureCard = ({ item, index }) => {
296
+ return (
297
+ <motion.div
298
+ initial={{ opacity: 0, scale: 0.9, y: 30 }}
299
+ animate={{ opacity: 1, scale: 1, y: 0 }}
300
+ transition={{ delay: index * 0.1 + 0.2, duration: 0.5, type: "spring", stiffness: 100, damping: 20 }}
301
+ whileTap={{ scale: 0.96 }}
302
+ className="relative group cursor-pointer"
303
+ >
304
+ <div className={`absolute -inset-[1px] rounded-[24px] bg-gradient-to-b ${item.colorFrom} ${item.colorTo} opacity-0 group-hover:opacity-40 blur-md transition duration-500`}></div>
305
+
306
+ <div className="relative h-full flex flex-col justify-between bg-[#131722]/80 backdrop-blur-xl border border-white/5 p-5 rounded-[24px] shadow-2xl overflow-hidden hover:border-white/15 transition-all duration-300">
307
+
308
+ <div className="absolute inset-0 z-0 translate-x-[-100%] group-hover:translate-x-[100%] transition-transform duration-1000 bg-gradient-to-r from-transparent via-white/5 to-transparent skew-x-12"></div>
309
+
310
+ <div className="flex justify-between items-start mb-5 relative z-10">
311
+ <div className={`relative p-3.5 rounded-2xl bg-gradient-to-br ${item.colorFrom} ${item.colorTo} shadow-lg ring-1 ring-white/20 group-hover:scale-105 transition-transform duration-300`}>
312
+ <motion.div
313
+ animate={{ rotate: [0, 5, -5, 0] }}
314
+ transition={{ duration: 4, repeat: Infinity, ease: "easeInOut", delay: index * 0.5 }}
315
+ >
316
+ <item.icon className="text-white w-6 h-6 relative z-10" strokeWidth={2} />
317
+ </motion.div>
318
+ <div className="absolute inset-0 rounded-2xl bg-white/30 blur opacity-40"></div>
319
+ </div>
320
+
321
+ {(item.isNew || item.isHot) && (
322
+ <motion.div
323
+ initial={{ scale: 0 }}
324
+ animate={{ scale: 1 }}
325
+ transition={{ delay: 0.5 + index * 0.1, type: "spring" }}
326
+ className="flex flex-col items-end gap-1"
327
+ >
328
+ {item.isNew && (
329
+ <span className="px-2.5 py-1 text-[9px] font-bold bg-gradient-to-r from-amber-400 to-orange-500 text-white rounded-full shadow-lg shadow-amber-500/20">
330
+ جدید
331
+ </span>
332
+ )}
333
+ {item.isHot && (
334
+ <span className="px-2.5 py-1 text-[9px] font-bold bg-gradient-to-r from-rose-500 to-pink-600 text-white rounded-full shadow-lg shadow-rose-500/20">
335
+ داغ
336
+ </span>
337
+ )}
338
+ </motion.div>
339
+ )}
340
+ </div>
341
+
342
+ <div className="relative z-10">
343
+ <h3 className="text-[17px] font-bold text-white mb-1.5 tracking-tight group-hover:text-transparent group-hover:bg-clip-text group-hover:bg-gradient-to-r group-hover:from-white group-hover:to-slate-300 transition-colors">
344
+ {item.title}
345
+ </h3>
346
+ <p className="text-[11px] text-slate-400 font-medium leading-relaxed opacity-80 group-hover:opacity-100 transition-opacity">
347
+ {item.subtitle}
348
+ </p>
349
+ </div>
350
+
351
+ <div className="absolute bottom-4 left-4 w-8 h-8 rounded-full bg-white/5 border border-white/5 flex items-center justify-center opacity-0 translate-y-4 group-hover:opacity-100 group-hover:translate-y-0 transition-all duration-300 shadow-lg">
352
+ <ArrowLeft size={14} className="text-white" />
353
+ </div>
354
+ </div>
355
+ </motion.div>
356
+ );
357
+ };
358
+
359
+ // 5. Special Card
360
+ const SpecialCard = ({ item }) => {
361
+ return (
362
+ <motion.div
363
+ initial={{ opacity: 0, scale: 0.95, y: 20 }}
364
+ animate={{ opacity: 1, scale: 1, y: 0 }}
365
+ transition={{ delay: 0.6, duration: 0.6, ease: "easeOut" }}
366
+ whileTap={{ scale: 0.98 }}
367
+ className="relative w-full cursor-pointer group"
368
+ >
369
+ <div className="absolute -inset-[2px] bg-gradient-to-r from-indigo-500 via-purple-500 to-pink-500 rounded-[26px] opacity-70 blur-sm group-hover:opacity-100 group-hover:blur-md transition duration-500 animate-pulse"></div>
370
+
371
+ <div className="relative overflow-hidden p-6 bg-[#0f1219] rounded-[24px] border border-white/10">
372
+
373
+ <div className="absolute inset-0 opacity-20">
374
+ <div className="absolute top-0 right-0 w-64 h-64 bg-indigo-600 rounded-full blur-[80px] animate-pulse"></div>
375
+ <div className="absolute bottom-0 left-0 w-64 h-64 bg-purple-600 rounded-full blur-[80px] animate-pulse" style={{ animationDelay: '1s' }}></div>
376
+ </div>
377
+
378
+ <div className="relative z-10 flex flex-col sm:flex-row sm:items-center justify-between gap-4">
379
+ <div className="flex items-center gap-5">
380
+ <div className="relative">
381
+ <div className={`w-16 h-16 rounded-2xl bg-gradient-to-br ${item.colorFrom} ${item.colorTo} flex items-center justify-center shadow-lg shadow-indigo-500/30 ring-4 ring-indigo-500/10 group-hover:scale-105 transition-transform duration-300`}>
382
+ <motion.div
383
+ animate={{ rotate: [0, 10, -10, 0] }}
384
+ transition={{ duration: 5, repeat: Infinity, ease: "easeInOut" }}
385
+ >
386
+ <item.icon className="text-white w-8 h-8" strokeWidth={2.5} />
387
+ </motion.div>
388
+ </div>
389
+ <div className="absolute -top-2 -right-2 bg-white text-indigo-700 text-[10px] font-black px-2 py-0.5 rounded-full shadow-md border-2 border-[#0f1219]">
390
+ Ai
391
+ </div>
392
+ </div>
393
+
394
+ <div>
395
+ <div className="flex items-center gap-2 mb-1">
396
+ <h3 className="text-xl font-black text-white">{item.title}</h3>
397
+ <motion.div
398
+ animate={{ opacity: [0.5, 1, 0.5], scale: [1, 1.2, 1] }}
399
+ transition={{ duration: 2, repeat: Infinity }}
400
+ >
401
+ <Sparkles className="w-5 h-5 text-yellow-400 fill-yellow-400" />
402
+ </motion.div>
403
+ </div>
404
+ <p className="text-sm text-slate-300 font-medium opacity-90 max-w-[200px] leading-relaxed">{item.subtitle}</p>
405
+ </div>
406
+ </div>
407
+
408
+ <div className="self-end sm:self-center">
409
+ <div className="w-12 h-12 rounded-full bg-white/10 hover:bg-white text-white hover:text-indigo-900 flex items-center justify-center border border-white/10 transition-all duration-300 group-hover:rotate-[-45deg]">
410
+ <ArrowLeft className="w-5 h-5" strokeWidth={3} />
411
+ </div>
412
+ </div>
413
+ </div>
414
+
415
+ <div className="absolute top-1/2 right-10 -translate-y-1/2 opacity-5 pointer-events-none">
416
+ <Wand2 size={120} />
417
+ </div>
418
+ </div>
419
+ </motion.div>
420
+ );
421
+ };
422
+
423
+ // 6. Image Slider
424
+ const IMAGES = [
425
+ "https://app.puzzley.net/uploads/user/Jydo/%D8%AA%D8%BA%DB%8C%D8%B1%20%D8%B5%D8%AF%D8%A7%20%D8%A8%D8%A7%20%D9%87%D9%88%D8%B4%20%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C/tmpxposlxsv.png?_t=1769590682",
426
+ "https://app.puzzley.net/uploads/user/Jydo/%D8%AA%D8%BA%DB%8C%D8%B1%20%D8%B5%D8%AF%D8%A7%20%D8%A8%D8%A7%20%D9%87%D9%88%D8%B4%20%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C/tmpnv5v143z.png?_t=1769590682",
427
+ "https://app.puzzley.net/uploads/user/Jydo/%D8%AA%D8%BA%DB%8C%D8%B1%20%D8%B5%D8%AF%D8%A7%20%D8%A8%D8%A7%20%D9%87%D9%88%D8%B4%20%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C/tmpkqpm8k8l.png?_t=1769590756"
428
+ ];
429
+
430
+ const ImageSlider = () => {
431
+ const [currentIndex, setCurrentIndex] = useState(0);
432
+
433
+ useEffect(() => {
434
+ const timer = setInterval(() => {
435
+ setCurrentIndex((prev) => (prev + 1) % IMAGES.length);
436
+ }, 4000);
437
+ return () => clearInterval(timer);
438
+ }, []);
439
+
440
+ return (
441
+ <div className="relative w-full aspect-[2/1] rounded-[24px] overflow-hidden shadow-2xl ring-1 ring-white/10 mb-2 group z-20">
442
+ <AnimatePresence mode='popLayout'>
443
+ <motion.img
444
+ key={currentIndex}
445
+ src={IMAGES[currentIndex]}
446
+ alt={`Slide ${currentIndex + 1}`}
447
+ initial={{ opacity: 0, scale: 1.1 }}
448
+ animate={{ opacity: 1, scale: 1 }}
449
+ exit={{ opacity: 0 }}
450
+ transition={{ duration: 0.7 }}
451
+ className="absolute inset-0 w-full h-full object-cover"
452
+ />
453
+ </AnimatePresence>
454
+
455
+ <div className="absolute inset-0 bg-gradient-to-t from-[#0B0F19]/80 via-transparent to-transparent opacity-80"></div>
456
+
457
+ <div className="absolute bottom-3 left-1/2 -translate-x-1/2 flex gap-1.5 z-10">
458
+ {IMAGES.map((_, index) => (
459
+ <div
460
+ key={index}
461
+ className={`h-1.5 rounded-full transition-all duration-300 ${
462
+ index === currentIndex ? 'w-6 bg-white' : 'w-1.5 bg-white/40'
463
+ }`}
464
+ />
465
+ ))}
466
+ </div>
467
+ </div>
468
+ );
469
+ };
470
+
471
+ // --- MAIN APP COMPONENT ---
472
+ const App = () => {
473
+ return (
474
+ <div className="min-h-screen relative overflow-x-hidden pb-10">
475
+ <BackgroundEffects />
476
+
477
+ <main className="relative z-10 pt-2">
478
+ {/* Added Header Component Here */}
479
+ <Header />
480
+
481
+ <div className="px-6 mb-4">
482
+ <ImageSlider />
483
+ </div>
484
+
485
+ <Hero />
486
+
487
+ <div className="px-6 mt-4">
488
+ <div className="grid grid-cols-2 gap-5">
489
+ {FEATURES.map((item, index) => (
490
+ <FeatureCard key={item.id} item={item} index={index} />
491
+ ))}
492
+ </div>
493
+
494
+ <div className="mt-8 mb-4">
495
+ <SpecialCard item={SPECIAL_FEATURE} />
496
+ </div>
497
+
498
+ <div className="text-center mt-8 opacity-40">
499
+ <p className="text-[10px] text-slate-300 font-light tracking-widest">
500
+ POWERED BY ALPHA • VER 2.0
501
+ </p>
502
+ </div>
503
+ </div>
504
+ </main>
505
+ </div>
506
+ );
507
+ };
508
+
509
+ // --- RENDER ---
510
+ const rootElement = document.getElementById('root');
511
+ const root = ReactDOM.createRoot(rootElement);
512
+ root.render(
513
+ <React.StrictMode>
514
+ <App />
515
+ </React.StrictMode>
516
+ );
517
+ </script>
518
+ </body>
519
+ </html>