azils3 commited on
Commit
155cca5
·
verified ·
1 Parent(s): e0d434e

Upload 49 files

Browse files
Files changed (50) hide show
  1. .gitattributes +7 -0
  2. static/css/home.css +1102 -0
  3. static/css/style.css +684 -0
  4. static/fonts/LilitaOne-Regular.ttf +0 -0
  5. static/fonts/LuckeyGuy.ttf +0 -0
  6. static/fonts/Righteous-Regular.ttf +0 -0
  7. static/fonts/Ubuntu-Bold.ttf +3 -0
  8. static/fonts/bold_font.ttf +0 -0
  9. static/fonts/luckey.ttf +0 -0
  10. static/js/script.js +537 -0
  11. static/media/Image_Generators/Openai/cartoon.jpeg +0 -0
  12. static/media/Image_Generators/Openai/comic.jpeg +0 -0
  13. static/media/Image_Generators/Openai/gta.jpeg +0 -0
  14. static/media/Image_Generators/Openai/realistic.webp +0 -0
  15. static/media/Image_Generators/Openai/watercolor.jpeg +0 -0
  16. static/media/Image_Generators/Prodia/Counterfeit_v30.safetensors [9e2a8f19].jpg +3 -0
  17. static/media/Image_Generators/Prodia/breakdomain_I2428.safetensors [43cc7d2f].jpg +0 -0
  18. static/media/Image_Generators/hercai/animefy.jpg +0 -0
  19. static/media/Image_Generators/hercai/lexica.jpg +0 -0
  20. static/media/Image_Generators/hercai/raava.jpg +0 -0
  21. static/media/Image_Generators/hercai/shonin.jpg +0 -0
  22. static/media/Image_Generators/hercai/simurg.jpg +0 -0
  23. static/media/Image_Generators/hercai/v1.jpg +0 -0
  24. static/media/Image_Generators/hercai/v2.jpg +0 -0
  25. static/media/Image_Generators/hercai/v3__dall-e.jpg +0 -0
  26. static/media/Image_Generators/segmind/flux-1.1_pro_ultra.jpg +0 -0
  27. static/media/Image_Generators/segmind/recraft_v3.jpg +0 -0
  28. static/media/Speech_Generators/edge/en-AU-WilliamNeural.mp3 +0 -0
  29. static/media/Speech_Generators/edge/en-US-SteffanNeural.mp3 +0 -0
  30. static/media/Speech_Generators/edge/hi-IN-MadhurNeural.mp3 +0 -0
  31. static/media/Speech_Generators/edge/ur-PK-AsadNeural.mp3 +0 -0
  32. static/media/Speech_Generators/elevenlabs/justin.mp3 +0 -0
  33. static/media/Speech_Generators/elevenlabs/kendra.mp3 +0 -0
  34. static/media/Speech_Generators/hugging/joanna.mp3 +0 -0
  35. static/media/Speech_Generators/hugging/joey.mp3 +0 -0
  36. static/media/Speech_Generators/openai/geraint.mp3 +0 -0
  37. static/media/Speech_Generators/openai/ivy.mp3 +0 -0
  38. static/media/Speech_Generators/xtts_v2/amy.mp3 +0 -0
  39. static/media/Speech_Generators/xtts_v2/emma.mp3 +0 -0
  40. static/media/default_profile_photo.jpg +0 -0
  41. static/media/icons/google_icon.svg +7 -0
  42. static/media/icons/icon.png +0 -0
  43. static/media/icons/icon.svg +1 -0
  44. static/media/icons/logo.png +0 -0
  45. static/media/images/default_profile_photo.jpg +0 -0
  46. static/media/loading.gif +3 -0
  47. static/music/Track-1.mp3 +3 -0
  48. static/music/Track-2.mp3 +3 -0
  49. static/music/output000.mp3 +3 -0
  50. static/music/output001.mp3 +3 -0
.gitattributes CHANGED
@@ -33,3 +33,10 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ static/fonts/Ubuntu-Bold.ttf filter=lfs diff=lfs merge=lfs -text
37
+ static/media/Image_Generators/Prodia/Counterfeit_v30.safetensors[[:space:]]\[9e2a8f19\].jpg filter=lfs diff=lfs merge=lfs -text
38
+ static/media/loading.gif filter=lfs diff=lfs merge=lfs -text
39
+ static/music/output000.mp3 filter=lfs diff=lfs merge=lfs -text
40
+ static/music/output001.mp3 filter=lfs diff=lfs merge=lfs -text
41
+ static/music/Track-1.mp3 filter=lfs diff=lfs merge=lfs -text
42
+ static/music/Track-2.mp3 filter=lfs diff=lfs merge=lfs -text
static/css/home.css ADDED
@@ -0,0 +1,1102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ --primary: #4facfe;
3
+ --secondary: #00f2fe;
4
+ --dark: #0a0a0a;
5
+ --gray-dark: #1a1a1a;
6
+ --gray: #333;
7
+ --text-light: #aaa;
8
+ }
9
+
10
+ * {
11
+ margin: 0;
12
+ padding: 0;
13
+ box-sizing: border-box;
14
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
15
+ }
16
+
17
+ body {
18
+ background: var(--dark);
19
+ color: #fff;
20
+ overflow-x: hidden;
21
+ }
22
+
23
+ .container {
24
+ max-width: 1200px;
25
+ margin: 0 auto;
26
+ padding: 0 2rem;
27
+ }
28
+
29
+ /* Navbar */
30
+ .navbar {
31
+ padding: 1rem 0;
32
+ position: fixed;
33
+ width: 100%;
34
+ z-index: 1000;
35
+ transition: all 0.3s;
36
+ }
37
+
38
+ .navbar.scrolled {
39
+ background: rgba(10, 10, 10, 0.95);
40
+ backdrop-filter: blur(10px);
41
+ padding: 0.5rem 0;
42
+ }
43
+
44
+ .nav-container {
45
+ display: flex;
46
+ justify-content: space-between;
47
+ align-items: center;
48
+ padding: 0 2rem;
49
+ }
50
+
51
+ .logo-container {
52
+ display: flex;
53
+ align-items: center;
54
+ gap: 1rem;
55
+ }
56
+
57
+ .logo-img {
58
+ width: 40px;
59
+ height: 40px;
60
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
61
+ border-radius: 10px;
62
+ display: flex;
63
+ align-items: center;
64
+ justify-content: center;
65
+ }
66
+
67
+ .logo-text {
68
+ font-size: 1.5rem;
69
+ font-weight: 700;
70
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
71
+ -webkit-background-clip: text;
72
+ -webkit-text-fill-color: transparent;
73
+ }
74
+
75
+ .nav-links {
76
+ display: flex;
77
+ gap: 2rem;
78
+ list-style: none;
79
+ }
80
+
81
+ .nav-links a {
82
+ color: #fff;
83
+ text-decoration: none;
84
+ font-weight: 500;
85
+ transition: color 0.3s;
86
+ }
87
+
88
+ .nav-links a:hover {
89
+ color: var(--primary);
90
+ }
91
+
92
+ /* Hero Section */
93
+ .hero {
94
+ min-height: 100vh;
95
+ display: flex;
96
+ align-items: center;
97
+ padding: 8rem 0 4rem;
98
+ position: relative;
99
+ overflow: hidden;
100
+ }
101
+
102
+ .hero-content {
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 4rem;
106
+ }
107
+
108
+ .hero-text {
109
+ flex: 1;
110
+ }
111
+
112
+ .hero-title {
113
+ font-size: 3.5rem;
114
+ margin-bottom: 1.5rem;
115
+ line-height: 1.2;
116
+ }
117
+
118
+ .hero-subtitle {
119
+ font-size: 1.2rem;
120
+ color: var(--text-light);
121
+ margin-bottom: 2rem;
122
+ line-height: 1.6;
123
+ }
124
+
125
+ .hero-stats {
126
+ display: flex;
127
+ gap: 2rem;
128
+ margin-top: 2rem;
129
+ }
130
+
131
+ .stat-item {
132
+ text-align: center;
133
+ }
134
+
135
+ .stat-number {
136
+ font-size: 2rem;
137
+ font-weight: 700;
138
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
139
+ -webkit-background-clip: text;
140
+ -webkit-text-fill-color: transparent;
141
+ }
142
+
143
+ .stat-label {
144
+ color: var(--text-light);
145
+ font-size: 0.9rem;
146
+ }
147
+
148
+ .hero-video {
149
+ flex: 1;
150
+ position: relative;
151
+ }
152
+
153
+ .video-preview {
154
+ width: 100%;
155
+ aspect-ratio: 16/9;
156
+ background: var(--gray-dark);
157
+ border-radius: 20px;
158
+ overflow: hidden;
159
+ position: relative;
160
+ }
161
+
162
+ .preview-placeholder {
163
+ position: absolute;
164
+ inset: 0;
165
+ background: linear-gradient(45deg, rgba(79, 172, 254, 0.1), rgba(0, 242, 254, 0.1));
166
+ display: flex;
167
+ align-items: center;
168
+ justify-content: center;
169
+ }
170
+
171
+ .play-button {
172
+ width: 80px;
173
+ height: 80px;
174
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
175
+ border-radius: 50%;
176
+ display: flex;
177
+ align-items: center;
178
+ justify-content: center;
179
+ cursor: pointer;
180
+ transition: transform 0.3s;
181
+ }
182
+
183
+ .play-button:hover {
184
+ transform: scale(1.1);
185
+ }
186
+
187
+ /* Features Section */
188
+ .features {
189
+ padding: 6rem 0;
190
+ background: var(--gray-dark);
191
+ }
192
+
193
+ .section-title {
194
+ text-align: center;
195
+ font-size: 2.5rem;
196
+ margin-bottom: 3rem;
197
+ }
198
+
199
+ .features-grid {
200
+ display: grid;
201
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
202
+ gap: 2rem;
203
+ }
204
+
205
+ .feature-card {
206
+ background: var(--dark);
207
+ padding: 2rem;
208
+ border-radius: 20px;
209
+ transition: transform 0.3s;
210
+ }
211
+
212
+ .feature-card:hover {
213
+ transform: translateY(-10px);
214
+ }
215
+
216
+ .feature-icon {
217
+ width: 60px;
218
+ height: 60px;
219
+ background: linear-gradient(45deg, rgba(79, 172, 254, 0.1), rgba(0, 242, 254, 0.1));
220
+ border-radius: 15px;
221
+ display: flex;
222
+ align-items: center;
223
+ justify-content: center;
224
+ margin-bottom: 1.5rem;
225
+ }
226
+
227
+ .feature-icon i {
228
+ font-size: 1.5rem;
229
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
230
+ -webkit-background-clip: text;
231
+ -webkit-text-fill-color: transparent;
232
+ }
233
+
234
+ .feature-title {
235
+ font-size: 1.2rem;
236
+ margin-bottom: 1rem;
237
+ }
238
+
239
+ .feature-description {
240
+ color: var(--text-light);
241
+ line-height: 1.6;
242
+ }
243
+
244
+ /* Buttons */
245
+ .btn {
246
+ display: inline-flex;
247
+ align-items: center;
248
+ gap: 0.5rem;
249
+ padding: 1rem 2rem;
250
+ border-radius: 50px;
251
+ font-weight: 500;
252
+ cursor: pointer;
253
+ transition: all 0.3s;
254
+ text-decoration: none;
255
+ }
256
+
257
+ .btn-primary {
258
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
259
+ color: #fff;
260
+ border: none;
261
+ }
262
+
263
+ .btn-primary:hover {
264
+ transform: translateY(-3px);
265
+ box-shadow: 0 10px 20px rgba(79, 172, 254, 0.2);
266
+ }
267
+
268
+ .btn-secondary {
269
+ background: transparent;
270
+ border: 2px solid var(--primary);
271
+ color: #fff;
272
+ }
273
+
274
+ .btn-secondary:hover {
275
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
276
+ border-color: transparent;
277
+ }
278
+
279
+ .buttons-container {
280
+ display: flex;
281
+ gap: 1rem;
282
+ margin-top: 2rem;
283
+ }
284
+
285
+ /* Animations */
286
+ @keyframes float {
287
+ 0%, 100% { transform: translateY(0); }
288
+ 50% { transform: translateY(-20px); }
289
+ }
290
+
291
+ .floating {
292
+ animation: float 3s infinite ease-in-out;
293
+ }
294
+
295
+ /* Responsive Design */
296
+ @media (max-width: 968px) {
297
+ .hero-content {
298
+ flex-direction: column;
299
+ text-align: center;
300
+ }
301
+
302
+ .hero-stats {
303
+ justify-content: center;
304
+ }
305
+
306
+ .buttons-container {
307
+ justify-content: center;
308
+ }
309
+
310
+ .hero-title {
311
+ font-size: 2.5rem;
312
+ }
313
+ }
314
+
315
+ @media (max-width: 768px) {
316
+ .nav-links {
317
+ display: none;
318
+ }
319
+
320
+ .section-title {
321
+ font-size: 2rem;
322
+ }
323
+ }
324
+
325
+ /* Pricing Section */
326
+ .pricing {
327
+ padding: 8rem 0;
328
+ background: var(--dark);
329
+ position: relative;
330
+ }
331
+
332
+ .pricing-toggle {
333
+ display: flex;
334
+ align-items: center;
335
+ justify-content: center;
336
+ gap: 1rem;
337
+ margin-bottom: 4rem;
338
+ }
339
+
340
+ .toggle-button {
341
+ position: relative;
342
+ width: 60px;
343
+ height: 30px;
344
+ background: var(--gray);
345
+ border-radius: 15px;
346
+ cursor: pointer;
347
+ transition: all 0.3s;
348
+ }
349
+
350
+ .toggle-button::after {
351
+ content: '';
352
+ position: absolute;
353
+ width: 26px;
354
+ height: 26px;
355
+ background: #fff;
356
+ border-radius: 50%;
357
+ top: 2px;
358
+ left: 2px;
359
+ transition: all 0.3s;
360
+ }
361
+
362
+ .toggle-button.yearly::after {
363
+ left: calc(100% - 28px);
364
+ }
365
+
366
+ .toggle-button.yearly {
367
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
368
+ }
369
+
370
+ .pricing-grid {
371
+ display: grid;
372
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
373
+ gap: 2rem;
374
+ padding: 0 1rem;
375
+ }
376
+
377
+ .pricing-card {
378
+ background: var(--gray-dark);
379
+ border-radius: 20px;
380
+ padding: 2rem;
381
+ transition: all 0.3s;
382
+ position: relative;
383
+ overflow: hidden;
384
+ }
385
+
386
+ .pricing-card.popular::before {
387
+ content: 'Most Popular';
388
+ position: absolute;
389
+ top: 20px;
390
+ right: -35px;
391
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
392
+ padding: 0.5rem 4rem;
393
+ transform: rotate(45deg);
394
+ font-size: 0.8rem;
395
+ font-weight: bold;
396
+ }
397
+
398
+ .pricing-card:hover {
399
+ transform: translateY(-10px);
400
+ }
401
+
402
+ .pricing-header {
403
+ text-align: center;
404
+ margin-bottom: 2rem;
405
+ }
406
+
407
+ .price {
408
+ font-size: 3rem;
409
+ font-weight: bold;
410
+ margin: 1rem 0;
411
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
412
+ -webkit-background-clip: text;
413
+ -webkit-text-fill-color: transparent;
414
+ }
415
+
416
+ .price-period {
417
+ color: var(--text-light);
418
+ font-size: 0.9rem;
419
+ }
420
+
421
+ .pricing-features {
422
+ margin: 2rem 0;
423
+ }
424
+
425
+ .feature-item {
426
+ display: flex;
427
+ align-items: center;
428
+ gap: 0.5rem;
429
+ margin-bottom: 1rem;
430
+ color: var(--text-light);
431
+ }
432
+
433
+ .feature-item i {
434
+ color: var(--primary);
435
+ }
436
+
437
+ /* Modal Styles */
438
+ .auth-modal {
439
+ position: fixed;
440
+ inset: 0;
441
+ background: rgba(0, 0, 0, 0.8);
442
+ backdrop-filter: blur(10px);
443
+ display: flex;
444
+ align-items: center;
445
+ justify-content: center;
446
+ z-index: 1000;
447
+ opacity: 0;
448
+ visibility: hidden;
449
+ transition: all 0.3s;
450
+ }
451
+
452
+ .auth-modal.active {
453
+ opacity: 1;
454
+ visibility: visible;
455
+ }
456
+
457
+ .modal-container {
458
+ width: 90%;
459
+ max-width: 400px;
460
+ background: var(--gray-dark);
461
+ border-radius: 20px;
462
+ padding: 2rem;
463
+ position: relative;
464
+ transform: translateY(20px);
465
+ transition: all 0.3s;
466
+ }
467
+
468
+ .auth-modal.active .modal-container {
469
+ transform: translateY(0);
470
+ }
471
+
472
+ .modal-close {
473
+ position: absolute;
474
+ top: 1rem;
475
+ right: 1rem;
476
+ background: none;
477
+ border: none;
478
+ color: var(--text-light);
479
+ cursor: pointer;
480
+ font-size: 1.5rem;
481
+ transition: color 0.3s;
482
+ }
483
+
484
+ .modal-close:hover {
485
+ color: #fff;
486
+ }
487
+
488
+ .auth-tabs {
489
+ display: flex;
490
+ margin-bottom: 2rem;
491
+ border-bottom: 2px solid var(--gray);
492
+ }
493
+
494
+ .auth-tab {
495
+ flex: 1;
496
+ padding: 1rem;
497
+ text-align: center;
498
+ cursor: pointer;
499
+ color: var(--text-light);
500
+ transition: all 0.3s;
501
+ }
502
+
503
+ .auth-tab.active {
504
+ color: #fff;
505
+ border-bottom: 2px solid var(--primary);
506
+ }
507
+
508
+ .auth-form {
509
+ display: none;
510
+ }
511
+
512
+ .auth-form.active {
513
+ display: block;
514
+ }
515
+
516
+ .form-group {
517
+ margin-bottom: 1.5rem;
518
+ }
519
+
520
+ .form-label {
521
+ display: block;
522
+ margin-bottom: 0.5rem;
523
+ color: var(--text-light);
524
+ }
525
+
526
+ .form-input {
527
+ width: 100%;
528
+ padding: 0.8rem;
529
+ background: var(--dark);
530
+ border: 1px solid var(--gray);
531
+ border-radius: 10px;
532
+ color: #fff;
533
+ transition: all 0.3s;
534
+ }
535
+
536
+ .form-input:focus {
537
+ border-color: var(--primary);
538
+ outline: none;
539
+ }
540
+
541
+ .password-input {
542
+ position: relative;
543
+ }
544
+
545
+ .toggle-password {
546
+ position: absolute;
547
+ right: 1rem;
548
+ top: 50%;
549
+ transform: translateY(-50%);
550
+ color: var(--text-light);
551
+ cursor: pointer;
552
+ transition: color 0.3s;
553
+ }
554
+
555
+ .toggle-password:hover {
556
+ color: #fff;
557
+ }
558
+
559
+ .auth-footer {
560
+ margin-top: 1.5rem;
561
+ text-align: center;
562
+ color: var(--text-light);
563
+ }
564
+
565
+ .auth-footer a {
566
+ color: var(--primary);
567
+ text-decoration: none;
568
+ }
569
+
570
+ .social-auth {
571
+ display: flex;
572
+ flex-direction: column;
573
+ gap: 1rem;
574
+ margin: 1.5rem 0;
575
+ }
576
+
577
+ .social-button {
578
+ display: flex;
579
+ align-items: center;
580
+ justify-content: center;
581
+ gap: 0.5rem;
582
+ padding: 0.8rem;
583
+ background: var(--dark);
584
+ border: 1px solid var(--gray);
585
+ border-radius: 10px;
586
+ color: #fff;
587
+ cursor: pointer;
588
+ transition: all 0.3s;
589
+ }
590
+
591
+ .social-button:hover {
592
+ background: var(--gray);
593
+ }
594
+
595
+ /* Footer Styles */
596
+ .footer {
597
+ background: var(--gray-dark);
598
+ padding: 4rem 0 2rem;
599
+ position: relative;
600
+ overflow: hidden;
601
+ }
602
+
603
+ .footer-grid {
604
+ display: grid;
605
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
606
+ gap: 2rem;
607
+ margin-bottom: 3rem;
608
+ }
609
+
610
+ .footer-col h3 {
611
+ margin-bottom: 1.5rem;
612
+ position: relative;
613
+ display: inline-block;
614
+ }
615
+
616
+ .footer-col h3::after {
617
+ content: '';
618
+ position: absolute;
619
+ left: 0;
620
+ bottom: -5px;
621
+ width: 30px;
622
+ height: 2px;
623
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
624
+ }
625
+
626
+ .footer-links {
627
+ list-style: none;
628
+ }
629
+
630
+ .footer-links li {
631
+ margin-bottom: 0.8rem;
632
+ }
633
+
634
+ .footer-links a {
635
+ color: var(--text-light);
636
+ text-decoration: none;
637
+ transition: color 0.3s;
638
+ display: inline-flex;
639
+ align-items: center;
640
+ gap: 0.5rem;
641
+ }
642
+
643
+ .footer-links a:hover {
644
+ color: var(--primary);
645
+ }
646
+
647
+ .social-auth {
648
+ display: flex;
649
+ flex-direction: column;
650
+ gap: 1rem;
651
+ margin: 1.5rem 0;
652
+ }
653
+
654
+ .social-button {
655
+ display: flex;
656
+ align-items: center;
657
+ justify-content: center;
658
+ gap: 0.5rem;
659
+ padding: 0.8rem;
660
+ background: var(--dark);
661
+ border: 1px solid var(--gray);
662
+ border-radius: 10px;
663
+ color: #fff;
664
+ cursor: pointer;
665
+ transition: all 0.3s;
666
+ }
667
+
668
+ .social-button:hover {
669
+ background: var(--gray);
670
+ }
671
+
672
+ /* Footer Styles */
673
+ .footer {
674
+ background: var(--gray-dark);
675
+ padding: 4rem 0 2rem;
676
+ position: relative;
677
+ overflow: hidden;
678
+ }
679
+
680
+ .footer-grid {
681
+ display: grid;
682
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
683
+ gap: 2rem;
684
+ margin-bottom: 3rem;
685
+ }
686
+
687
+ .footer-col h3 {
688
+ margin-bottom: 1.5rem;
689
+ position: relative;
690
+ display: inline-block;
691
+ }
692
+
693
+ .footer-col h3::after {
694
+ content: '';
695
+ position: absolute;
696
+ left: 0;
697
+ bottom: -5px;
698
+ width: 30px;
699
+ height: 2px;
700
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
701
+ }
702
+
703
+ .footer-links {
704
+ list-style: none;
705
+ }
706
+
707
+ .footer-links li {
708
+ margin-bottom: 0.8rem;
709
+ }
710
+
711
+ .footer-links a {
712
+ color: var(--text-light);
713
+ text-decoration: none;
714
+ transition: color 0.3s;
715
+ display: inline-flex;
716
+ align-items: center;
717
+ gap: 0.5rem;
718
+ }
719
+
720
+ .footer-links a:hover {
721
+ color: var(--primary);
722
+ }
723
+
724
+ .footer-bottom {
725
+ text-align: center;
726
+ padding-top: 2rem;
727
+ border-top: 1px solid var(--gray);
728
+ color: var(--text-light);
729
+ }
730
+
731
+ .social-links {
732
+ display: flex;
733
+ justify-content: center;
734
+ gap: 1rem;
735
+ margin-bottom: 1rem;
736
+ }
737
+
738
+ .social-link {
739
+ width: 40px;
740
+ height: 40px;
741
+ border-radius: 50%;
742
+ background: var(--dark);
743
+ display: flex;
744
+ align-items: center;
745
+ justify-content: center;
746
+ color: var(--text-light);
747
+ transition: all 0.3s;
748
+ }
749
+
750
+ .social-link:hover {
751
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
752
+ color: #fff;
753
+ transform: translateY(-3px);
754
+ }
755
+
756
+ /* Mobile Menu */
757
+ .mobile-menu-button {
758
+ display: none;
759
+ background: none;
760
+ border: none;
761
+ color: #fff;
762
+ font-size: 1.5rem;
763
+ cursor: pointer;
764
+ z-index: 1001;
765
+ }
766
+
767
+ .mobile-menu {
768
+ position: fixed;
769
+ top: 0;
770
+ right: -100%;
771
+ width: 80%;
772
+ max-width: 300px;
773
+ height: 100vh;
774
+ background: var(--gray-dark);
775
+ padding: 2rem;
776
+ transition: all 0.3s;
777
+ z-index: 1000;
778
+ }
779
+
780
+ .mobile-menu.active {
781
+ right: 0;
782
+ }
783
+
784
+ .mobile-nav-links {
785
+ list-style: none;
786
+ margin-top: 3rem;
787
+ }
788
+
789
+ .mobile-nav-links li {
790
+ margin-bottom: 1.5rem;
791
+ }
792
+
793
+ .mobile-nav-links a {
794
+ color: #fff;
795
+ text-decoration: none;
796
+ font-size: 1.2rem;
797
+ display: inline-flex;
798
+ align-items: center;
799
+ gap: 0.5rem;
800
+ }
801
+
802
+ @media (max-width: 768px) {
803
+ .mobile-menu-button {
804
+ display: block;
805
+ }
806
+
807
+ .nav-links {
808
+ display: none;
809
+ }
810
+ }
811
+
812
+ /* Showcase Section */
813
+ .showcase {
814
+ padding: 8rem 0;
815
+ position: relative;
816
+ background: var(--dark);
817
+ }
818
+
819
+ .showcase-grid {
820
+ display: grid;
821
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
822
+ gap: 2rem;
823
+ margin-top: 4rem;
824
+ }
825
+
826
+ .showcase-item {
827
+ position: relative;
828
+ border-radius: 20px;
829
+ overflow: hidden;
830
+ aspect-ratio: 9/16;
831
+ cursor: pointer;
832
+ }
833
+
834
+ .showcase-video {
835
+ position: absolute;
836
+ inset: 0;
837
+ background: var(--gray-dark);
838
+ transition: transform 0.5s;
839
+ }
840
+
841
+ .showcase-item:hover .showcase-video {
842
+ transform: scale(1.05);
843
+ }
844
+
845
+ .showcase-overlay {
846
+ position: absolute;
847
+ inset: 0;
848
+ background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
849
+ display: flex;
850
+ flex-direction: column;
851
+ justify-content: flex-end;
852
+ padding: 2rem;
853
+ opacity: 0;
854
+ transition: opacity 0.3s;
855
+ }
856
+
857
+ .showcase-item:hover .showcase-overlay {
858
+ opacity: 1;
859
+ }
860
+
861
+ .showcase-title {
862
+ font-size: 1.2rem;
863
+ margin-bottom: 0.5rem;
864
+ }
865
+
866
+ .showcase-platform {
867
+ display: flex;
868
+ align-items: center;
869
+ gap: 0.5rem;
870
+ color: var(--text-light);
871
+ }
872
+
873
+ /* How It Works Section */
874
+ .how-it-works {
875
+ padding: 8rem 0;
876
+ background: var(--gray-dark);
877
+ position: relative;
878
+ overflow: hidden;
879
+ }
880
+
881
+ .timeline {
882
+ position: relative;
883
+ max-width: 800px;
884
+ margin: 4rem auto 0;
885
+ }
886
+
887
+ .timeline::before {
888
+ content: '';
889
+ position: absolute;
890
+ left: 50%;
891
+ transform: translateX(-50%);
892
+ width: 2px;
893
+ height: 100%;
894
+ background: linear-gradient(var(--primary), var(--secondary));
895
+ }
896
+
897
+ .timeline-item {
898
+ display: flex;
899
+ justify-content: center;
900
+ padding: 2rem 0;
901
+ opacity: 0;
902
+ transform: translateY(50px);
903
+ transition: all 0.5s;
904
+ }
905
+
906
+ .timeline-item.visible {
907
+ opacity: 1;
908
+ transform: translateY(0);
909
+ }
910
+
911
+ .timeline-content {
912
+ width: 40%;
913
+ padding: 2rem;
914
+ background: var(--dark);
915
+ border-radius: 20px;
916
+ position: relative;
917
+ }
918
+
919
+ .timeline-item:nth-child(odd) .timeline-content {
920
+ margin-right: 50%;
921
+ }
922
+
923
+ .timeline-item:nth-child(even) .timeline-content {
924
+ margin-left: 50%;
925
+ }
926
+
927
+ .timeline-number {
928
+ width: 40px;
929
+ height: 40px;
930
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
931
+ border-radius: 50%;
932
+ position: absolute;
933
+ top: 50%;
934
+ display: flex;
935
+ align-items: center;
936
+ justify-content: center;
937
+ font-weight: bold;
938
+ }
939
+
940
+ .timeline-item:nth-child(odd) .timeline-number {
941
+ right: -60px;
942
+ transform: translateY(-50%);
943
+ }
944
+
945
+ .timeline-item:nth-child(even) .timeline-number {
946
+ left: -60px;
947
+ transform: translateY(-50%);
948
+ }
949
+
950
+ /* Testimonials Section */
951
+ .testimonials {
952
+ padding: 8rem 0;
953
+ background: var(--dark);
954
+ position: relative;
955
+ }
956
+
957
+ .testimonial-container {
958
+ position: relative;
959
+ max-width: 1000px;
960
+ margin: 4rem auto 0;
961
+ height: 400px;
962
+ }
963
+
964
+ .testimonial-card {
965
+ position: absolute;
966
+ width: 100%;
967
+ padding: 2rem;
968
+ background: var(--gray-dark);
969
+ border-radius: 20px;
970
+ opacity: 0;
971
+ transform: translateX(100px);
972
+ transition: all 0.5s;
973
+ }
974
+
975
+ .testimonial-card.active {
976
+ opacity: 1;
977
+ transform: translateX(0);
978
+ }
979
+
980
+ .testimonial-header {
981
+ display: flex;
982
+ align-items: center;
983
+ gap: 1rem;
984
+ margin-bottom: 1.5rem;
985
+ }
986
+
987
+ .testimonial-avatar {
988
+ width: 60px;
989
+ height: 60px;
990
+ border-radius: 50%;
991
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
992
+ display: flex;
993
+ align-items: center;
994
+ justify-content: center;
995
+ }
996
+
997
+ .testimonial-info h3 {
998
+ margin-bottom: 0.25rem;
999
+ }
1000
+
1001
+ .testimonial-company {
1002
+ color: var(--text-light);
1003
+ font-size: 0.9rem;
1004
+ }
1005
+
1006
+ .testimonial-content {
1007
+ font-size: 1.1rem;
1008
+ line-height: 1.6;
1009
+ margin-bottom: 1.5rem;
1010
+ }
1011
+
1012
+ .testimonial-rating {
1013
+ color: var(--primary);
1014
+ }
1015
+
1016
+ .testimonial-nav {
1017
+ display: flex;
1018
+ gap: 1rem;
1019
+ justify-content: center;
1020
+ margin-top: 2rem;
1021
+ }
1022
+
1023
+ .testimonial-dot {
1024
+ width: 12px;
1025
+ height: 12px;
1026
+ border-radius: 50%;
1027
+ background: var(--gray);
1028
+ cursor: pointer;
1029
+ transition: all 0.3s;
1030
+ }
1031
+
1032
+ .testimonial-dot.active {
1033
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
1034
+ }
1035
+
1036
+ /* Parallax Effects */
1037
+ .parallax-bg {
1038
+ position: absolute;
1039
+ inset: 0;
1040
+ pointer-events: none;
1041
+ }
1042
+
1043
+ .parallax-item {
1044
+ position: absolute;
1045
+ opacity: 0.1;
1046
+ filter: blur(2px);
1047
+ }
1048
+
1049
+ /* Floating Elements */
1050
+ @keyframes floatAnimation {
1051
+ 0%, 100% { transform: translateY(0) rotate(0); }
1052
+ 50% { transform: translateY(-20px) rotate(5deg); }
1053
+ }
1054
+
1055
+ .floating-element {
1056
+ animation: floatAnimation 3s infinite ease-in-out;
1057
+ }
1058
+
1059
+ /* Glass Effect */
1060
+ .glass-effect {
1061
+ background: rgba(255, 255, 255, 0.05);
1062
+ backdrop-filter: blur(10px);
1063
+ border: 1px solid rgba(255, 255, 255, 0.1);
1064
+ }
1065
+
1066
+ /* Gradient Text */
1067
+ .gradient-text {
1068
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
1069
+ -webkit-background-clip: text;
1070
+ -webkit-text-fill-color: transparent;
1071
+ }
1072
+
1073
+ /* Hover Effects */
1074
+ .hover-lift {
1075
+ transition: transform 0.3s;
1076
+ }
1077
+
1078
+ .hover-lift:hover {
1079
+ transform: translateY(-5px);
1080
+ }
1081
+
1082
+ /* Glow Effects */
1083
+ .glow {
1084
+ position: relative;
1085
+ }
1086
+
1087
+ .glow::after {
1088
+ content: '';
1089
+ position: absolute;
1090
+ inset: -2px;
1091
+ background: linear-gradient(45deg, var(--primary), var(--secondary));
1092
+ filter: blur(15px);
1093
+ opacity: 0;
1094
+ transition: opacity 0.3s;
1095
+ z-index: -1;
1096
+ }
1097
+
1098
+ .glow:hover::after {
1099
+ opacity: 0.5;
1100
+ }
1101
+
1102
+
static/css/style.css ADDED
@@ -0,0 +1,684 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ --primary-color: #00ffff;
3
+ --background-dark: #0f1115;
4
+ --secondary-dark: #1a1d23;
5
+ --purple: #6c5dd3;
6
+ --text-color: #ffffff;
7
+ --border-color: #2a2e35;
8
+ }
9
+
10
+ * {
11
+ margin: 0;
12
+ padding: 0;
13
+ box-sizing: border-box;
14
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
15
+ }
16
+
17
+ body {
18
+ background-color: var(--background-dark);
19
+ color: var(--text-color);
20
+ position: relative;
21
+ }
22
+
23
+ /* Navbar Styles */
24
+ .navbar {
25
+ display: flex;
26
+ justify-content: space-between;
27
+ align-items: center;
28
+ padding: 1rem 2rem;
29
+ background-color: var(--background-dark);
30
+ border-bottom: 1px solid var(--border-color);
31
+ position: sticky;
32
+ top: 0;
33
+ z-index: 1001;
34
+ }
35
+
36
+ .logo {
37
+ color: var(--primary-color);
38
+ font-size: 2rem;
39
+ font-weight: bold;
40
+ }
41
+
42
+ .nav-right {
43
+ display: flex;
44
+ align-items: center;
45
+ gap: 1.5rem;
46
+ position: relative;
47
+ }
48
+
49
+ .credits {
50
+ display: flex;
51
+ align-items: center;
52
+ gap: 0.5rem;
53
+ }
54
+
55
+ .profile-icon {
56
+ width: 40px;
57
+ height: 40px;
58
+ background-color: #ff5733;
59
+ border-radius: 50%; /* Make it circular */
60
+ display: flex;
61
+ align-items: center;
62
+ justify-content: center;
63
+ font-weight: bold;
64
+ color: white;
65
+ cursor: pointer;
66
+ position: relative;
67
+ }
68
+
69
+ .profile-photo {
70
+ width: 100%;
71
+ height: 100%;
72
+ border-radius: 50%; /* Make it circular */
73
+ object-fit: cover;
74
+ }
75
+
76
+ .profile-menu {
77
+ display: none;
78
+ position: absolute;
79
+ top: calc(100%);
80
+ right: 0;
81
+ background-color: var(--background-dark);
82
+ border: 1px solid var(--border-color);
83
+ border-radius: 8px;
84
+ z-index: 1000;
85
+ }
86
+
87
+ .profile-menu a {
88
+ display: block;
89
+ padding: 0.8rem 1rem;
90
+ color: var(--text-color);
91
+ text-decoration: none;
92
+ }
93
+
94
+ .profile-menu a:hover {
95
+ background-color: var(--secondary-dark);
96
+ }
97
+
98
+ /* Main Content Styles */
99
+ .main-content {
100
+ display: flex;
101
+ height: calc(100vh - 70px);
102
+ }
103
+
104
+ /* Sidebar Styles */
105
+ .sidebar {
106
+ width: 250px;
107
+ background-color: var(--background-dark);
108
+ padding: 1rem;
109
+ border-right: 1px solid var(--border-color);
110
+ }
111
+
112
+ .sidebar-item {
113
+ padding: 0.8rem;
114
+ margin: 0.5rem 0;
115
+ border-radius: 8px;
116
+ cursor: pointer;
117
+ transition: background-color 0.3s;
118
+ display: flex;
119
+ align-items: center;
120
+ justify-content: center;
121
+ gap: 0.5rem;
122
+ }
123
+
124
+ .sidebar-item:hover {
125
+ background-color: var(--secondary-dark);
126
+ }
127
+
128
+ .sidebar-item.active {
129
+ background-color: var(--secondary-dark);
130
+ }
131
+
132
+ /* Content Area Styles */
133
+ .content-area {
134
+ flex: 1;
135
+ padding: 2rem;
136
+ background-color: var(--background-dark);
137
+ overflow-y: auto;
138
+ }
139
+
140
+ .page-title {
141
+ font-size: 1.5rem;
142
+ margin-bottom: 1.5rem;
143
+ display: flex;
144
+ justify-content: space-between;
145
+ align-items: center;
146
+ }
147
+
148
+ .page-title .search-bar {
149
+ width: 200px;
150
+ background-color: var(--secondary-dark);
151
+ border: 1px solid var(--border-color);
152
+ color: var(--text-color);
153
+ padding: 0.5rem;
154
+ border-radius: 8px;
155
+ }
156
+
157
+ .style-grid {
158
+ display: grid;
159
+ grid-template-columns: repeat(4, 1fr);
160
+ gap: 1rem;
161
+ }
162
+
163
+ .style-card {
164
+ aspect-ratio: 9/16;
165
+ border-radius: 12px;
166
+ overflow: hidden;
167
+ position: relative;
168
+ cursor: pointer;
169
+ border: 2px solid transparent;
170
+ background-color: var(--secondary-dark);
171
+ }
172
+
173
+ .style-card:hover {
174
+ border-color: var(--purple);
175
+ }
176
+
177
+ .style-card.selected {
178
+ border-color: var(--purple);
179
+ }
180
+
181
+ .style-card img {
182
+ width: 100%;
183
+ height: 100%;
184
+ object-fit: cover;
185
+ }
186
+
187
+ .style-label {
188
+ position: absolute;
189
+ bottom: 0;
190
+ left: 0;
191
+ right: 0;
192
+ padding: 1rem;
193
+ background: linear-gradient(transparent, rgba(0,0,0,0.7));
194
+ color: white;
195
+ }
196
+
197
+ /* Preview Panel Styles */
198
+ .preview-panel {
199
+ width: 300px;
200
+ padding: 1rem;
201
+ background-color: var(--background-dark);
202
+ border-left: 1px solid var(--border-color);
203
+ }
204
+
205
+ .video-preview {
206
+ width: 100%;
207
+ aspect-ratio: 9/16;
208
+ background-color: var(--secondary-dark);
209
+ border-radius: 12px;
210
+ overflow: hidden;
211
+ margin-bottom: 1rem;
212
+ position: relative;
213
+ }
214
+
215
+ .video-container {
216
+ width: 100%;
217
+ height: 100%;
218
+ position: relative;
219
+ }
220
+
221
+ .video-controls {
222
+ position: absolute;
223
+ bottom: 0;
224
+ left: 0;
225
+ right: 0;
226
+ padding: 1rem;
227
+ background: linear-gradient(transparent, rgba(0,0,0,0.7));
228
+ display: flex;
229
+ align-items: center;
230
+ gap: 1rem;
231
+ }
232
+
233
+ .control-button {
234
+ background: none;
235
+ border: none;
236
+ color: white;
237
+ cursor: pointer;
238
+ }
239
+
240
+ .time-display {
241
+ margin-left: auto;
242
+ font-size: 0.875rem;
243
+ }
244
+
245
+ .action-buttons {
246
+ display: flex;
247
+ flex-direction: column;
248
+ gap: 0.5rem;
249
+ }
250
+
251
+ .button {
252
+ padding: 0.8rem;
253
+ border-radius: 8px;
254
+ cursor: pointer;
255
+ text-align: center;
256
+ font-weight: 500;
257
+ background-color: var(--purple);
258
+ color: white;
259
+ border: none;
260
+ transition: background-color 0.3s;
261
+ width: 100%;
262
+ }
263
+
264
+ .button:hover {
265
+ background-color: #5a45b2;
266
+ }
267
+
268
+ /* Caption Styles */
269
+ .caption-container {
270
+ display: grid;
271
+ grid-template-columns: 1fr 1fr;
272
+ gap: 2rem;
273
+ }
274
+
275
+ .caption-section {
276
+ background-color: var(--secondary-dark);
277
+ padding: 1.5rem;
278
+ border-radius: 12px;
279
+ }
280
+
281
+ .input-group {
282
+ margin-bottom: 1rem;
283
+ }
284
+
285
+ .input-label {
286
+ display: block;
287
+ margin-bottom: 0.5rem;
288
+ }
289
+
290
+ .select-input {
291
+ width: 100%;
292
+ padding: 0.8rem;
293
+ background-color: var(--background-dark);
294
+ border: 1px solid var(--border-color);
295
+ color: var(--text-color);
296
+ border-radius: 8px;
297
+ }
298
+
299
+ .toggle-group {
300
+ display: flex;
301
+ justify-content: space-between;
302
+ align-items: center;
303
+ margin-bottom: 1rem;
304
+ gap: 1rem;
305
+ }
306
+
307
+ .toggle-switch {
308
+ position: relative;
309
+ display: inline-block;
310
+ width: 60px;
311
+ height: 34px;
312
+ }
313
+
314
+ .toggle-switch input {
315
+ opacity: 0;
316
+ width: 0;
317
+ height: 0;
318
+ }
319
+
320
+ .slider {
321
+ position: absolute;
322
+ cursor: pointer;
323
+ top: 0;
324
+ left: 0;
325
+ right: 0;
326
+ bottom: 0;
327
+ background-color: var(--border-color);
328
+ transition: .4s;
329
+ border-radius: 34px;
330
+ }
331
+
332
+ .slider:before {
333
+ position: absolute;
334
+ content: "";
335
+ height: 26px;
336
+ width: 26px;
337
+ left: 4px;
338
+ bottom: 4px;
339
+ background-color: white;
340
+ transition: .4s;
341
+ border-radius: 50%;
342
+ }
343
+
344
+ input:checked + .slider {
345
+ background-color: var(--purple);
346
+ }
347
+
348
+ input:checked + .slider:before {
349
+ transform: translateX(26px);
350
+ }
351
+
352
+ .lines-buttons {
353
+ display: flex;
354
+ gap: 0.5rem;
355
+ }
356
+
357
+ .line-button {
358
+ padding: 0.5rem 1rem;
359
+ background-color: var(--background-dark);
360
+ border: none;
361
+ color: var(--text-color);
362
+ border-radius: 8px;
363
+ cursor: pointer;
364
+ transition: background-color 0.3s;
365
+ }
366
+
367
+ .line-button:hover {
368
+ background-color: #5a45b2;
369
+ }
370
+
371
+ .line-button.active {
372
+ background-color: var(--purple);
373
+ }
374
+
375
+ .color-picker-group {
376
+ margin-bottom: 1rem;
377
+ display: flex;
378
+ align-items: center;
379
+ gap: 1rem;
380
+ }
381
+
382
+ .color-picker {
383
+ width: 40px;
384
+ height: 40px;
385
+ border-radius: 50%;
386
+ border: none;
387
+ cursor: pointer;
388
+ background-color: transparent;
389
+ }
390
+
391
+ .slider-group {
392
+ margin-bottom: 1rem;
393
+ display: flex;
394
+ align-items: center;
395
+ gap: 1rem;
396
+ }
397
+
398
+ .slider-group .toggle-group {
399
+ display: flex;
400
+ flex-direction: column;
401
+ align-items: flex-start;
402
+ gap: 0.25rem;
403
+ }
404
+
405
+ .slider-group .toggle-group span {
406
+ font-weight: 500;
407
+ }
408
+
409
+ .slider-group .toggle-group label {
410
+ margin: 0;
411
+ display: flex;
412
+ align-items: center;
413
+ gap: 0.5rem;
414
+ }
415
+
416
+ /* Audio Section Styles */
417
+ .voice-grid {
418
+ display: grid;
419
+ grid-template-columns: repeat(4, 1fr);
420
+ gap: 1rem;
421
+ }
422
+
423
+ .voice-box {
424
+ background-color: var(--secondary-dark);
425
+ border-radius: 8px;
426
+ padding: 1rem;
427
+ display: flex;
428
+ flex-direction: column;
429
+ align-items: center;
430
+ cursor: pointer;
431
+ border: 2px solid transparent;
432
+ }
433
+
434
+ .voice-box:hover {
435
+ border-color: var(--purple);
436
+ }
437
+
438
+ .voice-box.selected {
439
+ border-color: var(--purple);
440
+ }
441
+
442
+ .voice-profile {
443
+ width: 100px;
444
+ height: 100px;
445
+ border-radius: 50%; /* Make it circular */
446
+ background-color: #ff5733;
447
+ display: flex;
448
+ align-items: center;
449
+ justify-content: center;
450
+ font-weight: bold;
451
+ color: white;
452
+ margin-bottom: 0.5rem;
453
+ }
454
+
455
+ .voice-name {
456
+ font-size: 1rem;
457
+ margin-bottom: 0.5rem;
458
+ }
459
+
460
+ .play-button {
461
+ padding: 0.5rem 1rem;
462
+ border-radius: 8px;
463
+ background-color: var(--purple);
464
+ color: white;
465
+ border: none;
466
+ cursor: pointer;
467
+ transition: background-color 0.3s;
468
+ }
469
+
470
+ .play-button:hover {
471
+ background-color: #5a45b2;
472
+ }
473
+
474
+ /* Music Section Styles */
475
+ .music-grid {
476
+ display: grid;
477
+ grid-template-columns: repeat(4, 1fr);
478
+ gap: 1rem;
479
+ }
480
+
481
+ .music-box {
482
+ background-color: var(--secondary-dark);
483
+ border-radius: 8px;
484
+ padding: 1rem;
485
+ display: flex;
486
+ flex-direction: column;
487
+ align-items: center;
488
+ cursor: pointer;
489
+ border: 2px solid transparent;
490
+ }
491
+
492
+ .music-box:hover {
493
+ border-color: var(--purple);
494
+ }
495
+
496
+ .music-box.selected {
497
+ border-color: var(--purple);
498
+ }
499
+
500
+ .music-profile {
501
+ width: 100px;
502
+ height: 100px;
503
+ border-radius: 50%; /* Make it circular */
504
+ background-color: #ff5733;
505
+ display: flex;
506
+ align-items: center;
507
+ justify-content: center;
508
+ font-weight: bold;
509
+ color: white;
510
+ margin-bottom: 0.5rem;
511
+ }
512
+
513
+ .music-name {
514
+ font-size: 1rem;
515
+ margin-bottom: 0.5rem;
516
+ }
517
+
518
+ .play-stop-button {
519
+ padding: 0.5rem 1rem;
520
+ border-radius: 8px;
521
+ background-color: var(--purple);
522
+ color: white;
523
+ border: none;
524
+ cursor: pointer;
525
+ transition: background-color 0.3s;
526
+ }
527
+
528
+ .play-stop-button:hover {
529
+ background-color: #5a45b2;
530
+ }
531
+
532
+ /* Popup Styles */
533
+ .popup-overlay {
534
+ display: none;
535
+ position: fixed;
536
+ top: 0;
537
+ left: 0;
538
+ width: 100%;
539
+ height: 100%;
540
+ background-color: rgba(0, 0, 0, 0.7);
541
+ justify-content: center;
542
+ align-items: center;
543
+ z-index: 1000;
544
+ }
545
+
546
+ .popup-content {
547
+ background-color: var(--background-dark);
548
+ padding: 2rem;
549
+ border-radius: 12px;
550
+ width: 80%;
551
+ max-width: 500px;
552
+ text-align: center;
553
+ height: 400px;
554
+ overflow-y: auto;
555
+ }
556
+
557
+ .popup-options {
558
+ margin-top: 1rem;
559
+ }
560
+
561
+ .popup-button {
562
+ padding: 0.8rem 1.5rem;
563
+ border-radius: 8px;
564
+ cursor: pointer;
565
+ margin: 0 0.5rem;
566
+ background-color: var(--purple);
567
+ color: white;
568
+ border: none;
569
+ transition: background-color 0.3s;
570
+ }
571
+
572
+ .popup-button:hover {
573
+ background-color: #5a45b2;
574
+ }
575
+
576
+ .popup-button.no {
577
+ background-color: var(--secondary-dark);
578
+ color: white;
579
+ border: 1px solid var(--border-color);
580
+ }
581
+
582
+ .popup-button.no:hover {
583
+ background-color: #5a45b2;
584
+ }
585
+
586
+ /* Upgrade Popup Styles */
587
+ .upgrade-popup-overlay {
588
+ display: none;
589
+ position: fixed;
590
+ top: 0;
591
+ left: 0;
592
+ width: 100%;
593
+ height: 100%;
594
+ background-color: rgba(0, 0, 0, 0.7);
595
+ justify-content: center;
596
+ align-items: center;
597
+ z-index: 1002;
598
+ }
599
+
600
+ .upgrade-popup-content {
601
+ background-color: var(--background-dark);
602
+ padding: 2rem;
603
+ border-radius: 12px;
604
+ width: 80%;
605
+ max-width: 600px;
606
+ text-align: center;
607
+ }
608
+
609
+ .plans-grid {
610
+ display: flex;
611
+ justify-content: space-between;
612
+ gap: 1rem;
613
+ }
614
+
615
+ .plan {
616
+ flex: 1;
617
+ background-color: var(--secondary-dark);
618
+ border-radius: 12px;
619
+ padding: 1rem;
620
+ text-align: center;
621
+ }
622
+
623
+ .plan-header {
624
+ font-size: 1.5rem;
625
+ margin-bottom: 0.5rem;
626
+ }
627
+
628
+ .plan-details {
629
+ font-size: 1rem;
630
+ margin-bottom: 0.5rem;
631
+ }
632
+
633
+ .plan-upgrade-button {
634
+ padding: 0.8rem 1.5rem;
635
+ border-radius: 8px;
636
+ background-color: var(--purple);
637
+ color: white;
638
+ border: none;
639
+ cursor: pointer;
640
+ transition: background-color 0.3s;
641
+ }
642
+
643
+ .plan-upgrade-button:hover {
644
+ background-color: #5a45b2;
645
+ }
646
+
647
+ /* Additional Styles for New Layout */
648
+ .script-dropdowns {
649
+ display: flex;
650
+ justify-content: space-between;
651
+ gap: 1rem;
652
+ margin-bottom: 1rem;
653
+ }
654
+
655
+ .script-area {
656
+ margin-bottom: 1rem;
657
+ }
658
+
659
+ .script-buttons {
660
+ display: flex;
661
+ justify-content: space-between;
662
+ margin-top: 1rem;
663
+ gap: 0.5rem;
664
+ }
665
+
666
+ .task-buttons {
667
+ display: flex;
668
+ justify-content: space-between;
669
+ margin-top: 1rem;
670
+ gap: 0.5rem;
671
+ }
672
+
673
+ .full-width {
674
+ width: 100%;
675
+ }
676
+
677
+ .logs {
678
+ margin-top: 1rem;
679
+ background-color: var(--secondary-dark);
680
+ padding: 1rem;
681
+ border-radius: 8px;
682
+ height: 150px;
683
+ overflow-y: auto;
684
+ }
static/fonts/LilitaOne-Regular.ttf ADDED
Binary file (26.8 kB). View file
 
static/fonts/LuckeyGuy.ttf ADDED
Binary file (58.3 kB). View file
 
static/fonts/Righteous-Regular.ttf ADDED
Binary file (40.9 kB). View file
 
static/fonts/Ubuntu-Bold.ttf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6dbcce3fdd846f3aebc7e1890b5ccca234806cbd84763785f7ced043a99e8268
3
+ size 270164
static/fonts/bold_font.ttf ADDED
Binary file (28.9 kB). View file
 
static/fonts/luckey.ttf ADDED
Binary file (28.9 kB). View file
 
static/js/script.js ADDED
@@ -0,0 +1,537 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Function to log messages to the logs div
2
+ function logMessage(message) {
3
+ const logsDiv = document.getElementById('logs');
4
+ const logEntry = document.createElement('div');
5
+ logEntry.textContent = message;
6
+ logsDiv.appendChild(logEntry);
7
+ logsDiv.scrollTop = logsDiv.scrollHeight; // Scroll to the bottom
8
+ }
9
+
10
+ // Function to generate video
11
+ function generateVideo() {
12
+ const formData = new FormData(document.getElementById('videoForm'));
13
+ const apiKey = document.getElementById('apiKey').value; // Get API key from hidden input
14
+
15
+ fetch('/api/generate-video', {
16
+ method: 'POST',
17
+ headers: {
18
+ 'X-API-Key': apiKey
19
+ },
20
+ body: formData
21
+ })
22
+ .then(response => {
23
+ if (response.ok) {
24
+ return response.blob().then(blob => {
25
+ const url = window.URL.createObjectURL(blob);
26
+ const video = document.getElementById('generatedVideo');
27
+ video.src = url;
28
+ video.load(); // Load the video
29
+ video.play(); // Play the video
30
+ logMessage('Video generation successful!');
31
+ document.getElementById('downloadVideoButton').disabled = false; // Enable download button
32
+ });
33
+ } else {
34
+ return response.json().then(data => {
35
+ throw new Error(data.error || 'Video generation failed');
36
+ });
37
+ }
38
+ })
39
+ .catch(error => {
40
+ console.error('Error:', error);
41
+ alert('Video generation failed: ' + error.message);
42
+ logMessage('Video generation failed: ' + error.message);
43
+ document.getElementById('downloadVideoButton').disabled = true; // Disable download button
44
+ });
45
+ }
46
+
47
+ // Function to show popup
48
+ function showPopup() {
49
+ const textGenerator = document.getElementById('text-generator').value;
50
+ const textGeneratorModel = document.getElementById('text-generator-model').value;
51
+ const imageGenerator = document.getElementById('image-generator').value;
52
+ const imageGeneratorModel = document.querySelector('.style-card.selected') ? document.querySelector('.style-card.selected').querySelector('.style-label').textContent : '';
53
+ const speechGenerator = document.getElementById('speech-generator').value;
54
+ const speechGeneratorVoice = document.querySelector('.voice-box.selected') ? document.querySelector('.voice-box.selected').querySelector('.voice-name').textContent : '';
55
+ const disableSubtitles = document.getElementById('disable-subtitles').checked;
56
+ const subtitlesColor = document.getElementById('subtitles-color').value;
57
+ const subtitleFontName = document.getElementById('subtitle-font-name').value;
58
+ const maxCharacterPerLine = document.getElementById('max-character-per-line').value;
59
+ const subtitleFontSize = document.getElementById('subtitle-font-size').value;
60
+ const subtitleStrokeWidth = document.getElementById('subtitle-stroke-width').value;
61
+ const lines = document.querySelector('.line-button.active').textContent.replace(' Line', '');
62
+ const highlightColor = document.getElementById('highlight-color').value;
63
+ const niche = document.getElementById('niche').value;
64
+ const language = document.getElementById('language').value;
65
+
66
+ const selectedOptions = {
67
+ "text_generator": textGenerator,
68
+ "text_generator_model": textGeneratorModel,
69
+ "image_generator": imageGenerator,
70
+ "image_generator_model": imageGeneratorModel,
71
+ "speech_generator": speechGenerator,
72
+ "speech_generator_voice": speechGeneratorVoice,
73
+ "disable_subtitles": disableSubtitles,
74
+ "subtitles_color": subtitlesColor,
75
+ "subtitle_font_name": subtitleFontName,
76
+ "max_character_per_line": parseInt(maxCharacterPerLine),
77
+ "subtitle_font_size": parseInt(subtitleFontSize),
78
+ "subtitle_stroke_width": parseInt(subtitleStrokeWidth),
79
+ "max_lines": parseInt(lines),
80
+ "highlight_color": highlightColor,
81
+ "niche": niche,
82
+ "language": language
83
+ };
84
+
85
+ document.getElementById('popupOptions').textContent = JSON.stringify(selectedOptions, null, 2);
86
+ document.getElementById('popupOverlay').style.display = 'flex';
87
+
88
+ // Update form data
89
+ document.getElementById('text_generator').value = textGenerator;
90
+ document.getElementById('text_generator_model').value = textGeneratorModel;
91
+ document.getElementById('image_generator').value = imageGenerator;
92
+ document.getElementById('image_generator_model').value = imageGeneratorModel;
93
+ document.getElementById('speech_generator').value = speechGenerator;
94
+ document.getElementById('speech_generator_voice').value = speechGeneratorVoice;
95
+ document.getElementById('disable_subtitles').checked = disableSubtitles;
96
+ document.getElementById('subtitles_color').value = subtitlesColor;
97
+ document.getElementById('subtitle_font_name').value = subtitleFontName;
98
+ document.getElementById('subtitle_font_size').value = subtitleFontSize;
99
+ document.getElementById('subtitle_stroke_color').value = document.getElementById('subtitle-stroke-color').value;
100
+ document.getElementById('subtitle_stroke_width').value = subtitleStrokeWidth;
101
+ document.getElementById('max_character_per_line').value = maxCharacterPerLine;
102
+ document.getElementById('max_lines').value = lines;
103
+ document.getElementById('highlight_color').value = highlightColor;
104
+ document.getElementById('niche_hidden').value = niche;
105
+ document.getElementById('language_hidden').value = language;
106
+ }
107
+
108
+ // Function to play or pause the generated video
109
+ function playPauseVideo() {
110
+ const video = document.getElementById('generatedVideo');
111
+ if (video) {
112
+ if (video.paused) {
113
+ video.play();
114
+ document.querySelector('.video-controls .control-button i').className = 'fas fa-pause';
115
+ } else {
116
+ video.pause();
117
+ document.querySelector('.video-controls .control-button i').className = 'fas fa-play';
118
+ }
119
+ }
120
+ }
121
+
122
+ // Function to hide popup
123
+ function hidePopup() {
124
+ document.getElementById('popupOverlay').style.display = 'none';
125
+ }
126
+
127
+ // Function to show upgrade popup
128
+ function showUpgradePopup() {
129
+ document.getElementById('upgradePopupOverlay').style.display = 'flex';
130
+ }
131
+
132
+ // Function to hide upgrade popup
133
+ function hideUpgradePopup() {
134
+ document.getElementById('upgradePopupOverlay').style.display = 'none';
135
+ }
136
+
137
+ // Tab Switching
138
+ document.querySelectorAll('.sidebar-item[data-tab]').forEach(item => {
139
+ item.addEventListener('click', () => {
140
+ document.querySelectorAll('.sidebar-item').forEach(i => i.classList.remove('active'));
141
+ item.classList.add('active');
142
+
143
+ document.querySelectorAll('.tab-content').forEach(content => content.style.display = 'none');
144
+
145
+ const tabId = item.getAttribute('data-tab') + '-content';
146
+ document.getElementById(tabId).style.display = 'block';
147
+ });
148
+ });
149
+
150
+ // Style Card Selection
151
+ function selectImage(element) {
152
+ document.querySelectorAll('.style-card').forEach(card => {
153
+ card.classList.remove('selected');
154
+ });
155
+ element.classList.add('selected');
156
+
157
+ const imgSrc = element.querySelector('img').src;
158
+ document.getElementById('preview-image').src = imgSrc;
159
+ }
160
+
161
+ // Populate Models Dropdown based on TEXT GENERATOR selection
162
+ document.getElementById('text-generator').addEventListener('change', function() {
163
+ const selectedTextGen = this.value;
164
+ const modelsDropdown = document.getElementById('text-generator-model');
165
+ modelsDropdown.innerHTML = '';
166
+ fetch(`/text-generator-models/${selectedTextGen}`)
167
+ .then(response => response.json())
168
+ .then(data => {
169
+ data.models.forEach(model => {
170
+ const option = document.createElement('option');
171
+ option.value = model;
172
+ option.textContent = model;
173
+ modelsDropdown.appendChild(option);
174
+ });
175
+ })
176
+ .catch(error => {
177
+ console.error('Error fetching text generator models:', error);
178
+ logMessage('Error fetching text generator models: ' + error.message);
179
+ });
180
+ });
181
+
182
+ // Populate Style Cards based on IMAGE GENERATOR selection
183
+ document.getElementById('image-generator').addEventListener('change', function() {
184
+ const selectedImageGen = this.value;
185
+ const styleGrid = document.getElementById('style-grid');
186
+ styleGrid.innerHTML = '';
187
+ fetch(`/image-generator-models/${selectedImageGen}`)
188
+ .then(response => response.json())
189
+ .then(data => {
190
+ data.models.forEach((style, index) => {
191
+ const styleCard = document.createElement('div');
192
+ styleCard.className = 'style-card';
193
+ styleCard.onclick = function() { selectImage(this); };
194
+ styleCard.innerHTML = `
195
+ <img alt="${style} style image" src="/static/media/Image_Generators/${selectedImageGen.toLowerCase()}/${style.replace(/[\s\(]/g, '_').replace(/\)/g, '').toLowerCase()}.jpg"/>
196
+ <div class="style-label">${style}</div>
197
+ `;
198
+ styleGrid.appendChild(styleCard);
199
+ if (index === 0) { // Default to first style
200
+ selectImage(styleCard);
201
+ }
202
+ });
203
+ })
204
+ .catch(error => {
205
+ console.error('Error fetching image generator models:', error);
206
+ logMessage('Error fetching image generator models: ' + error.message);
207
+ });
208
+ });
209
+
210
+ // Populate Voices Grid based on SPEECH GENERATOR selection
211
+ document.getElementById('speech-generator').addEventListener('change', function() {
212
+ const selectedSpeechGen = this.value;
213
+ const voiceGrid = document.getElementById('voice-grid');
214
+ voiceGrid.innerHTML = '';
215
+ fetch(`/speech-generator-models/${selectedSpeechGen}`)
216
+ .then(response => response.json())
217
+ .then(data => {
218
+ data.models.forEach((voice, index) => {
219
+ const voiceBox = document.createElement('div');
220
+ voiceBox.className = 'voice-box';
221
+ voiceBox.onclick = function() { selectVoice(this); };
222
+ voiceBox.innerHTML = `
223
+ <div class="voice-profile" style="background-color: ${index % 2 === 0 ? '#ff5733' : '#3399ff'};">
224
+ ${index % 2 === 0 ? '♀' : '♂'}
225
+ </div>
226
+ <div class="voice-name">${voice}</div>
227
+ <button class="play-button" onclick="playVoice('${voice}')">Play</button>
228
+ `;
229
+ voiceGrid.appendChild(voiceBox);
230
+ if (index === 0) { // Default to first voice
231
+ selectVoice(voiceBox);
232
+ }
233
+ });
234
+ })
235
+ .catch(error => {
236
+ console.error('Error fetching speech generator models:', error);
237
+ logMessage('Error fetching speech generator models: ' + error.message);
238
+ });
239
+ });
240
+
241
+ // Voice Selection
242
+ function selectVoice(element) {
243
+ document.querySelectorAll('.voice-box').forEach(box => {
244
+ box.classList.remove('selected');
245
+ });
246
+ element.classList.add('selected');
247
+
248
+ const selectedVoiceName = element.querySelector('.voice-name').textContent;
249
+ document.getElementById('preview-image').alt = `Preview of the selected voice: ${selectedVoiceName}`;
250
+ }
251
+
252
+ // Function to play voice
253
+ function playVoice(voiceName) {
254
+ const selectedSpeechGen = document.getElementById('speech-generator').value;
255
+ const voiceNameSanitized = voiceName.toLowerCase().replace(/\s+/g, '_');
256
+ const audioUrl = `/static/media/Speech_Generators/${selectedSpeechGen.toLowerCase()}/${voiceNameSanitized}.mp3`;
257
+ const audio = new Audio(audioUrl);
258
+ audio.play();
259
+ }
260
+
261
+ // Function to select music
262
+ function selectMusic(element) {
263
+ document.querySelectorAll('.music-box').forEach(box => {
264
+ box.classList.remove('selected');
265
+ });
266
+ element.classList.add('selected');
267
+
268
+ const selectedMusicName = element.querySelector('.music-name').textContent;
269
+ document.getElementById('preview-image').alt = `Preview of the selected music: ${selectedMusicName}`;
270
+ }
271
+
272
+ // Function to play or stop music
273
+ function playStopMusic(audioUrl, button) {
274
+ const audio = new Audio(audioUrl);
275
+ if (button.textContent === 'Play') {
276
+ audio.play();
277
+ button.textContent = 'Stop';
278
+ } else {
279
+ audio.pause();
280
+ button.textContent = 'Play';
281
+ }
282
+ }
283
+
284
+ // Set lines per caption
285
+ function setLines(lines) {
286
+ document.querySelectorAll('.line-button').forEach(button => {
287
+ button.classList.remove('active');
288
+ });
289
+ document.querySelector(`.line-button:nth-child(${lines})`).classList.add('active');
290
+ document.getElementById('max_lines').value = lines;
291
+ }
292
+
293
+ // Function to generate script
294
+ function generateScript() {
295
+ logMessage('Generating script...');
296
+ const niche = document.getElementById('niche').value;
297
+ const language = document.getElementById('language').value;
298
+ const textGenerator = document.getElementById('text-generator').value;
299
+ const textGeneratorModel = document.getElementById('text-generator-model').value;
300
+
301
+ const request = {
302
+ niche: niche,
303
+ language: language,
304
+ text_generator: textGenerator,
305
+ text_generator_model: textGeneratorModel
306
+ };
307
+
308
+ fetch('/generate-script', {
309
+ method: 'POST',
310
+ headers: {
311
+ 'Content-Type': 'application/json'
312
+ },
313
+ body: JSON.stringify(request)
314
+ })
315
+ .then(response => response.json())
316
+ .then(data => {
317
+ document.getElementById('generated-topic').value = data.topic;
318
+ document.getElementById('generated-script').value = data.script;
319
+ document.getElementById('generated-image-prompts').value = data.image_prompts.join(', ');
320
+ document.getElementById('generated-metadata').value = JSON.stringify(data.metadata, null, 2);
321
+ logMessage('Script generated successfully!');
322
+ })
323
+ .catch(error => {
324
+ console.error('Error:', error);
325
+ alert('Script generation failed: ' + error.message);
326
+ logMessage('Script generation failed: ' + error.message);
327
+ });
328
+ }
329
+
330
+ // Function to start loading
331
+ function startLoading() {
332
+ document.getElementById('popupOverlay').style.display = 'none';
333
+
334
+ // Update video limit
335
+ const videoLimitElement = document.getElementById('videoLimit');
336
+ const currentLimit = parseInt(videoLimitElement.textContent.split('/')[0], 10);
337
+ const maxLimit = parseInt(videoLimitElement.textContent.split('/')[1], 10);
338
+ if (currentLimit < maxLimit) {
339
+ videoLimitElement.textContent = `${currentLimit + 1}/${maxLimit}`;
340
+ } else {
341
+ alert('You have reached your daily video generation limit!');
342
+ return;
343
+ }
344
+
345
+ // Clear previous content in the video-preview div
346
+ const videoContainer = document.querySelector('.video-container');
347
+ videoContainer.innerHTML = '';
348
+
349
+ // Clear logs
350
+ const logsDiv = document.getElementById('logs');
351
+ logsDiv.innerHTML = '';
352
+
353
+ // Call the generateVideo function to trigger video generation
354
+ generateVideo();
355
+ }
356
+
357
+ // Function to download the generated video
358
+ function downloadVideo() {
359
+ const video = document.getElementById('generatedVideo');
360
+ if (video && video.src) {
361
+ const a = document.createElement('a');
362
+ a.href = video.src;
363
+ a.download = 'generated_video.mp4';
364
+ document.body.appendChild(a);
365
+ a.click();
366
+ document.body.removeChild(a);
367
+ } else {
368
+ alert('No video to download.');
369
+ }
370
+ }
371
+
372
+ // Profile Icon Click Event
373
+ document.getElementById('profileIcon').addEventListener('click', function(event) {
374
+ event.stopPropagation();
375
+ const menu = document.getElementById('profileMenu');
376
+ if (menu.style.display === 'block') {
377
+ menu.style.display = 'none';
378
+ } else {
379
+ menu.style.display = 'block';
380
+ }
381
+ });
382
+
383
+ // Close Profile Menu when clicking outside
384
+ document.addEventListener('click', function(event) {
385
+ const profileIcon = document.getElementById('profileIcon');
386
+ const profileMenu = document.getElementById('profileMenu');
387
+ if (!profileIcon.contains(event.target) && !profileMenu.contains(event.target)) {
388
+ profileMenu.style.display = 'none';
389
+ }
390
+ });
391
+
392
+ // Update slider values
393
+ document.getElementById('max-character-per-line').addEventListener('input', function() {
394
+ document.getElementById('max_chars_value').textContent = this.value;
395
+ document.getElementById('max_character_per_line').value = this.value;
396
+ });
397
+
398
+ document.getElementById('subtitle-font-size').addEventListener('input', function() {
399
+ document.getElementById('subtitle-font-size-value').textContent = this.value;
400
+ document.getElementById('subtitle_font_size').value = this.value;
401
+ });
402
+
403
+ document.getElementById('subtitle-stroke-width').addEventListener('input', function() {
404
+ document.getElementById('subtitle-stroke-width-value').textContent = this.value;
405
+ document.getElementById('subtitle_stroke_width').value = this.value;
406
+ });
407
+
408
+ // Search functionality for Image tab
409
+ document.getElementById('image-search').addEventListener('input', function() {
410
+ const query = this.value.toLowerCase();
411
+ const styleCards = document.querySelectorAll('.style-card');
412
+ styleCards.forEach(card => {
413
+ const label = card.querySelector('.style-label').textContent.toLowerCase();
414
+ if (label.includes(query)) {
415
+ card.style.display = 'block';
416
+ } else {
417
+ card.style.display = 'none';
418
+ }
419
+ });
420
+ });
421
+
422
+ // Search functionality for Audio tab
423
+ document.getElementById('audio-search').addEventListener('input', function() {
424
+ const query = this.value.toLowerCase();
425
+ const voiceBoxes = document.querySelectorAll('.voice-box');
426
+ voiceBoxes.forEach(box => {
427
+ const name = box.querySelector('.voice-name').textContent.toLowerCase();
428
+ if (name.includes(query)) {
429
+ box.style.display = 'block';
430
+ } else {
431
+ box.style.display = 'none';
432
+ }
433
+ });
434
+ });
435
+
436
+ // Search functionality for Music tab
437
+ document.getElementById('music-search').addEventListener('input', function() {
438
+ const query = this.value.toLowerCase();
439
+ const musicBoxes = document.querySelectorAll('.music-box');
440
+ musicBoxes.forEach(box => {
441
+ const name = box.querySelector('.music-name').textContent.toLowerCase();
442
+ if (name.includes(query)) {
443
+ box.style.display = 'block';
444
+ } else {
445
+ box.style.display = 'none';
446
+ }
447
+ });
448
+ });
449
+
450
+ // Initialize everything when the page loads
451
+ document.addEventListener('DOMContentLoaded', function() {
452
+ fetchUserData();
453
+ setupSearch();
454
+ populateFonts();
455
+ populateMusics();
456
+ });
457
+
458
+ // Fetch User Data
459
+ async function fetchUserData() {
460
+ try {
461
+ const response = await fetch('/api/user-data');
462
+ const userData = await response.json();
463
+ document.getElementById('user_id').value = userData.uuid;
464
+ document.getElementById('username').value = userData.username;
465
+ document.getElementById('profile_path').value = userData.profile_path;
466
+ document.getElementById('videoLimit').textContent = userData.limit;
467
+ document.getElementById('apiKey').value = userData.api_key; // Set API key in hidden input
468
+ } catch (error) {
469
+ console.error('Failed to fetch user data:', error);
470
+ logMessage('Failed to fetch user data: ' + error.message);
471
+ }
472
+ }
473
+
474
+ // Populate Fonts Dropdown
475
+ async function populateFonts() {
476
+ try {
477
+ const response = await fetch('/available-fonts');
478
+ const fonts = await response.json();
479
+ const fontsDropdown = document.getElementById('subtitle-font-name');
480
+ fonts.fonts.forEach(font => {
481
+ const option = document.createElement('option');
482
+ option.value = font;
483
+ option.textContent = font;
484
+ fontsDropdown.appendChild(option);
485
+ });
486
+ } catch (error) {
487
+ console.error('Error fetching fonts:', error);
488
+ logMessage('Error fetching fonts: ' + error.message);
489
+ }
490
+ }
491
+
492
+ // Populate Musics Grid
493
+ async function populateMusics() {
494
+ try {
495
+ const response = await fetch('/available-musics');
496
+ const musics = await response.json();
497
+ const musicGrid = document.getElementById('music-grid');
498
+ musics.musics.forEach(music => {
499
+ const musicBox = document.createElement('div');
500
+ musicBox.className = 'music-box';
501
+ musicBox.onclick = function() { selectMusic(this); };
502
+ musicBox.innerHTML = `
503
+ <div class="music-profile" style="background-color: #ff5733;">
504
+ 🎶
505
+ </div>
506
+ <div class="music-name">${music}</div>
507
+ <button class="play-stop-button" onclick="playStopMusic('/static/music/${music}', this)">Play</button>
508
+ `;
509
+ musicGrid.appendChild(musicBox);
510
+ });
511
+ } catch (error) {
512
+ console.error('Error fetching musics:', error);
513
+ logMessage('Error fetching musics: ' + error.message);
514
+ }
515
+ }
516
+
517
+ // Search Functionality
518
+ function setupSearch() {
519
+ const searchInput = document.getElementById('videoSearch');
520
+ searchInput.addEventListener('input', function() {
521
+ const query = this.value.toLowerCase();
522
+ document.querySelectorAll('.thumbnail-card').forEach(card => {
523
+ const title = card.querySelector('.thumbnail-label').textContent.toLowerCase();
524
+ card.style.display = title.includes(query) ? 'block' : 'none';
525
+ });
526
+ });
527
+ }
528
+
529
+ // Navigate to different pages
530
+ function navigateToPage(page) {
531
+ window.location.href = `/${page}`;
532
+ }
533
+
534
+ // Logout
535
+ function logout() {
536
+ window.location.href = '/logout';
537
+ }
static/media/Image_Generators/Openai/cartoon.jpeg ADDED
static/media/Image_Generators/Openai/comic.jpeg ADDED
static/media/Image_Generators/Openai/gta.jpeg ADDED
static/media/Image_Generators/Openai/realistic.webp ADDED
static/media/Image_Generators/Openai/watercolor.jpeg ADDED
static/media/Image_Generators/Prodia/Counterfeit_v30.safetensors [9e2a8f19].jpg ADDED

Git LFS Details

  • SHA256: 67f99adf16aed24eb2320f3149587108e83112213609a322b75ecb47904581b1
  • Pointer size: 131 Bytes
  • Size of remote file: 117 kB
static/media/Image_Generators/Prodia/breakdomain_I2428.safetensors [43cc7d2f].jpg ADDED
static/media/Image_Generators/hercai/animefy.jpg ADDED
static/media/Image_Generators/hercai/lexica.jpg ADDED
static/media/Image_Generators/hercai/raava.jpg ADDED
static/media/Image_Generators/hercai/shonin.jpg ADDED
static/media/Image_Generators/hercai/simurg.jpg ADDED
static/media/Image_Generators/hercai/v1.jpg ADDED
static/media/Image_Generators/hercai/v2.jpg ADDED
static/media/Image_Generators/hercai/v3__dall-e.jpg ADDED
static/media/Image_Generators/segmind/flux-1.1_pro_ultra.jpg ADDED
static/media/Image_Generators/segmind/recraft_v3.jpg ADDED
static/media/Speech_Generators/edge/en-AU-WilliamNeural.mp3 ADDED
Binary file (26.7 kB). View file
 
static/media/Speech_Generators/edge/en-US-SteffanNeural.mp3 ADDED
Binary file (32.5 kB). View file
 
static/media/Speech_Generators/edge/hi-IN-MadhurNeural.mp3 ADDED
Binary file (26.7 kB). View file
 
static/media/Speech_Generators/edge/ur-PK-AsadNeural.mp3 ADDED
Binary file (26.7 kB). View file
 
static/media/Speech_Generators/elevenlabs/justin.mp3 ADDED
Binary file (31.1 kB). View file
 
static/media/Speech_Generators/elevenlabs/kendra.mp3 ADDED
Binary file (31.5 kB). View file
 
static/media/Speech_Generators/hugging/joanna.mp3 ADDED
Binary file (28.4 kB). View file
 
static/media/Speech_Generators/hugging/joey.mp3 ADDED
Binary file (32.3 kB). View file
 
static/media/Speech_Generators/openai/geraint.mp3 ADDED
Binary file (31.7 kB). View file
 
static/media/Speech_Generators/openai/ivy.mp3 ADDED
Binary file (30.6 kB). View file
 
static/media/Speech_Generators/xtts_v2/amy.mp3 ADDED
Binary file (30.5 kB). View file
 
static/media/Speech_Generators/xtts_v2/emma.mp3 ADDED
Binary file (31.7 kB). View file
 
static/media/default_profile_photo.jpg ADDED
static/media/icons/google_icon.svg ADDED
static/media/icons/icon.png ADDED
static/media/icons/icon.svg ADDED
static/media/icons/logo.png ADDED
static/media/images/default_profile_photo.jpg ADDED
static/media/loading.gif ADDED

Git LFS Details

  • SHA256: a09ed1b0faef256b281b3811b07c0c0d2318e5f4be5fbf242f680a63f110f080
  • Pointer size: 131 Bytes
  • Size of remote file: 586 kB
static/music/Track-1.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9bae80da9326e87d4e0c96b08f0f1ee4911c1697ef9b5237ef51351a44453e49
3
+ size 2249517
static/music/Track-2.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:bcdfed1366cfbcf146b99c9f303b8d699ff78e78b0d2b2a406ef07a0a4894741
3
+ size 2091189
static/music/output000.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9bae80da9326e87d4e0c96b08f0f1ee4911c1697ef9b5237ef51351a44453e49
3
+ size 2249517
static/music/output001.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:bcdfed1366cfbcf146b99c9f303b8d699ff78e78b0d2b2a406ef07a0a4894741
3
+ size 2091189