AverageAiLiker commited on
Commit
2a2a4a0
·
verified ·
1 Parent(s): 78dbfbe

Upload app.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. app.py +866 -0
app.py ADDED
@@ -0,0 +1,866 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === index.html ===
2
+ <!DOCTYPE html>
3
+ <html lang="en">
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Open-Sora v2 Text to Video | AI Video Generation</title>
8
+ <meta name="description" content="Transform text into stunning videos using hpcai-tech/Open-Sora-v2 AI model optimized for CPU">
9
+ <meta name="keywords" content="AI video, text to video, Open-Sora, video generation, artificial intelligence">
10
+ <link rel="stylesheet" href="assets/css/styles.css">
11
+ <link rel="preconnect" href="https://fonts.googleapis.com">
12
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
13
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
14
+ </head>
15
+ <body>
16
+ <header class="header">
17
+ <div class="container">
18
+ <div class="header-content">
19
+ <div class="logo">
20
+ <svg width="32" height="32" viewBox="0 0 32 32" fill="none">
21
+ <rect width="32" height="32" rx="8" fill="url(#gradient)"/>
22
+ <path d="M8 12L16 8L24 12L16 16L8 12Z" fill="white" opacity="0.9"/>
23
+ <path d="M8 20L16 16L24 20L16 24L8 20Z" fill="white" opacity="0.7"/>
24
+ <defs>
25
+ <linearGradient id="gradient" x1="0" y1="0" x2="32" y2="32">
26
+ <stop stop-color="#667eea"/>
27
+ <stop offset="1" stop-color="#764ba2"/>
28
+ </linearGradient>
29
+ </defs>
30
+ </svg>
31
+ <span>Open-Sora</span>
32
+ </div>
33
+ <nav class="nav">
34
+ <a href="#generate" class="nav-link active">Generate</a>
35
+ <a href="#gallery" class="nav-link">Gallery</a>
36
+ <a href="#about" class="nav-link">About</a>
37
+ </nav>
38
+ <div class="header-actions">
39
+ <span class="built-with">Built with <a href="https://huggingface.co/hpcai-tech/Open-Sora-v2" target="_blank">Open-Sora-v2</a></span>
40
+ </div>
41
+ </div>
42
+ </div>
43
+ </header>
44
+
45
+ <main class="main">
46
+ <section class="hero">
47
+ <div class="container">
48
+ <div class="hero-content">
49
+ <h1 class="hero-title">Transform Text Into Video</h1>
50
+ <p class="hero-subtitle">Powered by hpcai-tech/Open-Sora-v2 - Create stunning videos from simple text descriptions using CPU-optimized AI</p>
51
+ <div class="stats">
52
+ <div class="stat">
53
+ <span class="stat-value">4K</span>
54
+ <span class="stat-label">Resolution</span>
55
+ </div>
56
+ <div class="stat">
57
+ <span class="stat-value">16s</span>
58
+ <span class="stat-label">Max Duration</span>
59
+ </div>
60
+ <div class="stat">
61
+ <span class="stat-value">CPU</span>
62
+ <span class="stat-label">Ready</span>
63
+ </div>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </section>
68
+
69
+ <section id="generate" class="generate-section">
70
+ <div class="container">
71
+ <div class="generate-card">
72
+ <h2 class="section-title">Create Your Video</h2>
73
+ <form id="generateForm" class="generate-form">
74
+ <div class="form-group">
75
+ <label for="prompt">Video Description</label>
76
+ <textarea id="prompt" placeholder="Describe the video you want to create... e.g., A serene sunset over mountains with birds flying" rows="3"></textarea>
77
+ <div class="prompt-suggestions">
78
+ <span class="suggestion-label">Try:</span>
79
+ <button type="button" class="suggestion-btn" data-prompt="A futuristic city with flying cars at night">Futuristic City</button>
80
+ <button type="button" class="suggestion-btn" data-prompt="Ocean waves crashing on a tropical beach">Ocean Waves</button>
81
+ <button type="button" class="suggestion-btn" data-prompt="A forest in autumn with falling leaves">Autumn Forest</button>
82
+ </div>
83
+ </div>
84
+
85
+ <div class="form-row">
86
+ <div class="form-group">
87
+ <label for="duration">Duration</label>
88
+ <select id="duration">
89
+ <option value="2">2 seconds</option>
90
+ <option value="4" selected>4 seconds</option>
91
+ <option value="8">8 seconds</option>
92
+ <option value="16">16 seconds</option>
93
+ </select>
94
+ </div>
95
+ <div class="form-group">
96
+ <label for="resolution">Resolution</label>
97
+ <select id="resolution">
98
+ <option value="144p">144p (Fast)</option>
99
+ <option value="240p">240p</option>
100
+ <option value="480p" selected>480p</option>
101
+ <option value="720p">720p (Slow)</option>
102
+ </select>
103
+ </div>
104
+ <div class="form-group">
105
+ <label for="aspectRatio">Aspect Ratio</label>
106
+ <select id="aspectRatio">
107
+ <option value="16:9" selected>16:9 (Widescreen)</option>
108
+ <option value="9:16">9:16 (Portrait)</option>
109
+ <option value="1:1">1:1 (Square)</option>
110
+ <option value="4:3">4:3 (Standard)</option>
111
+ </select>
112
+ </div>
113
+ </div>
114
+
115
+ <button type="submit" class="generate-btn" id="generateBtn">
116
+ <span class="btn-text">Generate Video</span>
117
+ <span class="btn-loader" style="display: none;">Generating...</span>
118
+ </button>
119
+ </form>
120
+ </div>
121
+
122
+ <div id="resultSection" class="result-section" style="display: none;">
123
+ <div class="result-card">
124
+ <h3>Your Generated Video</h3>
125
+ <div class="video-container">
126
+ <div class="video-placeholder">
127
+ <div class="play-button">
128
+ <svg width="64" height="64" viewBox="0 0 64 64" fill="none">
129
+ <circle cx="32" cy="32" r="32" fill="white" opacity="0.9"/>
130
+ <path d="M24 20L44 32L24 44V20Z" fill="#667eea"/>
131
+ </svg>
132
+ </div>
133
+ <img id="resultImage" src="" alt="Generated video frame" style="width: 100%; height: 100%; object-fit: cover;">
134
+ </div>
135
+ </div>
136
+ <div class="video-info">
137
+ <p class="video-prompt" id="resultPrompt"></p>
138
+ <div class="video-actions">
139
+ <button class="action-btn download-btn">
140
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor">
141
+ <path d="M10 3v10m0 0l-3-3m3 3l3-3m-7 5h14"/>
142
+ </svg>
143
+ Download
144
+ </button>
145
+ <button class="action-btn share-btn">
146
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor">
147
+ <path d="M15 8a3 3 0 10-2.977-2.63l-4.94 2.47a3 3 0 100 4.319l4.94 2.47a3 3 0 10.895-1.789l-4.94-2.47a3.027 3.027 0 000-.74l4.94-2.47C13.456 7.68 14.19 8 15 8z"/>
148
+ </svg>
149
+ Share
150
+ </button>
151
+ </div>
152
+ </div>
153
+ </div>
154
+ </div>
155
+ </div>
156
+ </section>
157
+
158
+ <section id="gallery" class="gallery-section">
159
+ <div class="container">
160
+ <h2 class="section-title">Recent Generations</h2>
161
+ <div class="gallery-grid" id="galleryGrid">
162
+ <!-- Gallery items will be populated by JavaScript -->
163
+ </div>
164
+ </div>
165
+ </section>
166
+
167
+ <section id="about" class="about-section">
168
+ <div class="container">
169
+ <div class="about-content">
170
+ <div class="about-text">
171
+ <h2 class="section-title">About Open-Sora v2</h2>
172
+ <p>hpcai-tech/Open-Sora-v2 is an open-source text-to-video generation model optimized for CPU execution. It transforms textual descriptions into video content using efficient diffusion technology, making AI video generation accessible without requiring powerful GPUs.</p>
173
+ <div class="features">
174
+ <div class="feature">
175
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
176
+ <path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/>
177
+ </svg>
178
+ <span>Fast CPU Generation</span>
179
+ </div>
180
+ <div class="feature">
181
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
182
+ <rect x="3" y="3" width="18" height="18" rx="2"/>
183
+ <path d="M9 9h6v6H9z"/>
184
+ </svg>
185
+ <span>High Quality Output</span>
186
+ </div>
187
+ <div class="feature">
188
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
189
+ <path d="M12 2v20M17 7l-5-5-5 5M17 17l-5 5-5-5"/>
190
+ </svg>
191
+ <span>Multiple Styles</span>
192
+ </div>
193
+ </div>
194
+ </div>
195
+ <div class="about-visual">
196
+ <div class="model-card">
197
+ <div class="model-header">
198
+ <span class="model-name">Open-Sora v2</span>
199
+ <span class="model-status active">CPU Ready</span>
200
+ </div>
201
+ <div class="model-stats">
202
+ <div class="model-stat">
203
+ <span class="label">Model</span>
204
+ <span class="value">hpcai-tech</span>
205
+ </div>
206
+ <div class="model-stat">
207
+ <span class="label">Hardware</span>
208
+ <span class="value">CPU Optimized</span>
209
+ </div>
210
+ <div class="model-stat">
211
+ <span class="label">Frame Rate</span>
212
+ <span class="value">24 fps</span>
213
+ </div>
214
+ </div>
215
+ </div>
216
+ </div>
217
+ </div>
218
+ </div>
219
+ </section>
220
+ </main>
221
+
222
+ <footer class="footer">
223
+ <div class="container">
224
+ <div class="footer-content">
225
+ <div class="footer-section">
226
+ <h4>Open-Sora</h4>
227
+ <p>Advanced AI video generation technology</p>
228
+ </div>
229
+ <div class="footer-section">
230
+ <h4>Resources</h4>
231
+ <a href="#" class="footer-link">Documentation</a>
232
+ <a href="#" class="footer-link">API Reference</a>
233
+ <a href="#" class="footer-link">Examples</a>
234
+ </div>
235
+ <div class="footer-section">
236
+ <h4>Community</h4>
237
+ <a href="#" class="footer-link">GitHub</a>
238
+ <a href="#" class="footer-link">Discord</a>
239
+ <a href="#" class="footer-link">Twitter</a>
240
+ </div>
241
+ </div>
242
+ <div class="footer-bottom">
243
+ <p>&copy; 2024 Open-Sora v2. Powered by hpcai-tech.</p>
244
+ </div>
245
+ </div>
246
+ </footer>
247
+
248
+ <script src="assets/js/main.js"></script>
249
+ </body>
250
+ </html>
251
+
252
+ === assets/css/styles.css ===
253
+ * {
254
+ margin: 0;
255
+ padding: 0;
256
+ box-sizing: border-box;
257
+ }
258
+
259
+ :root {
260
+ --primary: #667eea;
261
+ --primary-dark: #5a67d8;
262
+ --secondary: #764ba2;
263
+ --dark: #1a202c;
264
+ --gray: #718096;
265
+ --light-gray: #e2e8f0;
266
+ --white: #ffffff;
267
+ --background: #f7fafc;
268
+ --card-bg: #ffffff;
269
+ --border: #e2e8f0;
270
+ --shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
271
+ --shadow-sm: 0 2px 10px rgba(0, 0, 0, 0.05);
272
+ }
273
+
274
+ body {
275
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
276
+ line-height: 1.6;
277
+ color: var(--dark);
278
+ background: var(--background);
279
+ }
280
+
281
+ .container {
282
+ max-width: 1200px;
283
+ margin: 0 auto;
284
+ padding: 0 20px;
285
+ }
286
+
287
+ /* Header */
288
+ .header {
289
+ background: var(--white);
290
+ border-bottom: 1px solid var(--border);
291
+ position: sticky;
292
+ top: 0;
293
+ z-index: 100;
294
+ backdrop-filter: blur(10px);
295
+ background: rgba(255, 255, 255, 0.95);
296
+ }
297
+
298
+ .header-content {
299
+ display: flex;
300
+ align-items: center;
301
+ justify-content: space-between;
302
+ padding: 1rem 0;
303
+ }
304
+
305
+ .logo {
306
+ display: flex;
307
+ align-items: center;
308
+ gap: 0.5rem;
309
+ font-weight: 700;
310
+ font-size: 1.25rem;
311
+ color: var(--dark);
312
+ }
313
+
314
+ .nav {
315
+ display: flex;
316
+ gap: 2rem;
317
+ }
318
+
319
+ .nav-link {
320
+ text-decoration: none;
321
+ color: var(--gray);
322
+ font-weight: 500;
323
+ transition: color 0.3s;
324
+ position: relative;
325
+ }
326
+
327
+ .nav-link.active,
328
+ .nav-link:hover {
329
+ color: var(--primary);
330
+ }
331
+
332
+ .nav-link.active::after {
333
+ content: '';
334
+ position: absolute;
335
+ bottom: -1rem;
336
+ left: 0;
337
+ right: 0;
338
+ height: 2px;
339
+ background: var(--primary);
340
+ }
341
+
342
+ .built-with {
343
+ font-size: 0.875rem;
344
+ color: var(--gray);
345
+ }
346
+
347
+ .built-with a {
348
+ color: var(--primary);
349
+ text-decoration: none;
350
+ font-weight: 500;
351
+ }
352
+
353
+ .built-with a:hover {
354
+ text-decoration: underline;
355
+ }
356
+
357
+ /* Hero Section */
358
+ .hero {
359
+ padding: 4rem 0;
360
+ background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
361
+ color: var(--white);
362
+ text-align: center;
363
+ }
364
+
365
+ .hero-title {
366
+ font-size: 3rem;
367
+ font-weight: 700;
368
+ margin-bottom: 1rem;
369
+ background: linear-gradient(135deg, #ffffff 0%, #e0e7ff 100%);
370
+ -webkit-background-clip: text;
371
+ -webkit-text-fill-color: transparent;
372
+ background-clip: text;
373
+ }
374
+
375
+ .hero-subtitle {
376
+ font-size: 1.25rem;
377
+ opacity: 0.9;
378
+ margin-bottom: 2rem;
379
+ max-width: 600px;
380
+ margin-left: auto;
381
+ margin-right: auto;
382
+ }
383
+
384
+ .stats {
385
+ display: flex;
386
+ justify-content: center;
387
+ gap: 4rem;
388
+ margin-top: 2rem;
389
+ }
390
+
391
+ .stat {
392
+ text-align: center;
393
+ }
394
+
395
+ .stat-value {
396
+ display: block;
397
+ font-size: 2rem;
398
+ font-weight: 700;
399
+ margin-bottom: 0.25rem;
400
+ }
401
+
402
+ .stat-label {
403
+ font-size: 0.875rem;
404
+ opacity: 0.8;
405
+ }
406
+
407
+ /* Generate Section */
408
+ .generate-section {
409
+ padding: 4rem 0;
410
+ }
411
+
412
+ .generate-card {
413
+ background: var(--card-bg);
414
+ border-radius: 16px;
415
+ padding: 2rem;
416
+ box-shadow: var(--shadow);
417
+ margin-bottom: 2rem;
418
+ }
419
+
420
+ .section-title {
421
+ font-size: 2rem;
422
+ font-weight: 700;
423
+ margin-bottom: 2rem;
424
+ color: var(--dark);
425
+ }
426
+
427
+ .generate-form {
428
+ display: flex;
429
+ flex-direction: column;
430
+ gap: 1.5rem;
431
+ }
432
+
433
+ .form-group {
434
+ display: flex;
435
+ flex-direction: column;
436
+ gap: 0.5rem;
437
+ }
438
+
439
+ .form-group label {
440
+ font-weight: 600;
441
+ color: var(--dark);
442
+ }
443
+
444
+ .form-group textarea,
445
+ .form-group select {
446
+ padding: 0.75rem;
447
+ border: 2px solid var(--border);
448
+ border-radius: 8px;
449
+ font-size: 1rem;
450
+ transition: border-color 0.3s;
451
+ font-family: inherit;
452
+ }
453
+
454
+ .form-group textarea:focus,
455
+ .form-group select:focus {
456
+ outline: none;
457
+ border-color: var(--primary);
458
+ }
459
+
460
+ .form-group textarea {
461
+ resize: vertical;
462
+ min-height: 100px;
463
+ }
464
+
465
+ .prompt-suggestions {
466
+ display: flex;
467
+ align-items: center;
468
+ gap: 0.5rem;
469
+ flex-wrap: wrap;
470
+ }
471
+
472
+ .suggestion-label {
473
+ font-size: 0.875rem;
474
+ color: var(--gray);
475
+ }
476
+
477
+ .suggestion-btn {
478
+ padding: 0.25rem 0.75rem;
479
+ background: var(--light-gray);
480
+ border: none;
481
+ border-radius: 20px;
482
+ font-size: 0.875rem;
483
+ cursor: pointer;
484
+ transition: all 0.3s;
485
+ }
486
+
487
+ .suggestion-btn:hover {
488
+ background: var(--primary);
489
+ color: var(--white);
490
+ }
491
+
492
+ .form-row {
493
+ display: grid;
494
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
495
+ gap: 1rem;
496
+ }
497
+
498
+ .generate-btn {
499
+ padding: 1rem 2rem;
500
+ background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
501
+ color: var(--white);
502
+ border: none;
503
+ border-radius: 8px;
504
+ font-size: 1.125rem;
505
+ font-weight: 600;
506
+ cursor: pointer;
507
+ transition: transform 0.3s, box-shadow 0.3s;
508
+ position: relative;
509
+ overflow: hidden;
510
+ }
511
+
512
+ .generate-btn:hover {
513
+ transform: translateY(-2px);
514
+ box-shadow: 0 10px 30px rgba(102, 126, 234, 0.4);
515
+ }
516
+
517
+ .generate-btn:disabled {
518
+ opacity: 0.6;
519
+ cursor: not-allowed;
520
+ transform: none;
521
+ }
522
+
523
+ .btn-loader {
524
+ display: inline-flex;
525
+ align-items: center;
526
+ gap: 0.5rem;
527
+ }
528
+
529
+ .btn-loader::before {
530
+ content: '';
531
+ width: 16px;
532
+ height: 16px;
533
+ border: 2px solid var(--white);
534
+ border-top-color: transparent;
535
+ border-radius: 50%;
536
+ animation: spin 0.8s linear infinite;
537
+ }
538
+
539
+ @keyframes spin {
540
+ to { transform: rotate(360deg); }
541
+ }
542
+
543
+ /* Result Section */
544
+ .result-section {
545
+ margin-top: 2rem;
546
+ }
547
+
548
+ .result-card {
549
+ background: var(--card-bg);
550
+ border-radius: 16px;
551
+ padding: 2rem;
552
+ box-shadow: var(--shadow);
553
+ }
554
+
555
+ .result-card h3 {
556
+ font-size: 1.5rem;
557
+ margin-bottom: 1.5rem;
558
+ color: var(--dark);
559
+ }
560
+
561
+ .video-container {
562
+ position: relative;
563
+ width: 100%;
564
+ padding-bottom: 56.25%;
565
+ background: var(--dark);
566
+ border-radius: 12px;
567
+ overflow: hidden;
568
+ margin-bottom: 1.5rem;
569
+ }
570
+
571
+ .video-placeholder {
572
+ position: absolute;
573
+ top: 0;
574
+ left: 0;
575
+ width: 100%;
576
+ height: 100%;
577
+ display: flex;
578
+ align-items: center;
579
+ justify-content: center;
580
+ background: linear-gradient(135deg, #1a202c 0%, #2d3748 100%);
581
+ }
582
+
583
+ .play-button {
584
+ position: absolute;
585
+ z-index: 10;
586
+ opacity: 0.9;
587
+ transition: opacity 0.3s, transform 0.3s;
588
+ }
589
+
590
+ .play-button:hover {
591
+ opacity: 1;
592
+ transform: scale(1.1);
593
+ }
594
+
595
+ .video-info {
596
+ display: flex;
597
+ justify-content: space-between;
598
+ align-items: center;
599
+ flex-wrap: wrap;
600
+ gap: 1rem;
601
+ }
602
+
603
+ .video-prompt {
604
+ color: var(--gray);
605
+ font-style: italic;
606
+ flex: 1;
607
+ }
608
+
609
+ .video-actions {
610
+ display: flex;
611
+ gap: 0.5rem;
612
+ }
613
+
614
+ .action-btn {
615
+ display: flex;
616
+ align-items: center;
617
+ gap: 0.5rem;
618
+ padding: 0.5rem 1rem;
619
+ background: var(--white);
620
+ border: 2px solid var(--border);
621
+ border-radius: 8px;
622
+ cursor: pointer;
623
+ transition: all 0.3s;
624
+ font-weight: 500;
625
+ }
626
+
627
+ .action-btn:hover {
628
+ background: var(--primary);
629
+ color: var(--white);
630
+ border-color: var(--primary);
631
+ }
632
+
633
+ /* Gallery Section */
634
+ .gallery-section {
635
+ padding: 4rem 0;
636
+ background: var(--white);
637
+ }
638
+
639
+ .gallery-grid {
640
+ display: grid;
641
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
642
+ gap: 1.5rem;
643
+ }
644
+
645
+ .gallery-item {
646
+ position: relative;
647
+ border-radius: 12px;
648
+ overflow: hidden;
649
+ background: var(--dark);
650
+ aspect-ratio: 16/9;
651
+ cursor: pointer;
652
+ transition: transform 0.3s;
653
+ }
654
+
655
+ .gallery-item:hover {
656
+ transform: scale(1.02);
657
+ }
658
+
659
+ .gallery-item img {
660
+ width: 100%;
661
+ height: 100%;
662
+ object-fit: cover;
663
+ }
664
+
665
+ .gallery-item-overlay {
666
+ position: absolute;
667
+ bottom: 0;
668
+ left: 0;
669
+ right: 0;
670
+ padding: 1rem;
671
+ background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
672
+ color: var(--white);
673
+ opacity: 0;
674
+ transition: opacity 0.3s;
675
+ }
676
+
677
+ .gallery-item:hover .gallery-item-overlay {
678
+ opacity: 1;
679
+ }
680
+
681
+ /* About Section */
682
+ .about-section {
683
+ padding: 4rem 0;
684
+ }
685
+
686
+ .about-content {
687
+ display: grid;
688
+ grid-template-columns: 1fr 1fr;
689
+ gap: 4rem;
690
+ align-items: center;
691
+ }
692
+
693
+ .about-text p {
694
+ font-size: 1.125rem;
695
+ color: var(--gray);
696
+ margin-bottom: 2rem;
697
+ line-height: 1.8;
698
+ }
699
+
700
+ .features {
701
+ display: flex;
702
+ flex-direction: column;
703
+ gap: 1rem;
704
+ }
705
+
706
+ .feature {
707
+ display: flex;
708
+ align-items: center;
709
+ gap: 1rem;
710
+ font-weight: 500;
711
+ }
712
+
713
+ .feature svg {
714
+ color: var(--primary);
715
+ }
716
+
717
+ .model-card {
718
+ background: var(--card-bg);
719
+ border-radius: 16px;
720
+ padding: 2rem;
721
+ box-shadow: var(--shadow);
722
+ }
723
+
724
+ .model-header {
725
+ display: flex;
726
+ justify-content: space-between;
727
+ align-items: center;
728
+ margin-bottom: 1.5rem;
729
+ }
730
+
731
+ .model-name {
732
+ font-size: 1.25rem;
733
+ font-weight: 700;
734
+ color: var(--dark);
735
+ }
736
+
737
+ .model-status {
738
+ padding: 0.25rem 0.75rem;
739
+ background: #10b981;
740
+ color: var(--white);
741
+ border-radius: 20px;
742
+ font-size: 0.875rem;
743
+ font-weight: 500;
744
+ }
745
+
746
+ .model-stats {
747
+ display: flex;
748
+ flex-direction: column;
749
+ gap: 1rem;
750
+ }
751
+
752
+ .model-stat {
753
+ display: flex;
754
+ justify-content: space-between;
755
+ padding: 0.75rem 0;
756
+ border-bottom: 1px solid var(--border);
757
+ }
758
+
759
+ .model-stat:last-child {
760
+ border-bottom: none;
761
+ }
762
+
763
+ .model-stat .label {
764
+ color: var(--gray);
765
+ }
766
+
767
+ .model-stat .value {
768
+ font-weight: 600;
769
+ color: var(--dark);
770
+ }
771
+
772
+ /* Footer */
773
+ .footer {
774
+ background: var(--dark);
775
+ color: var(--white);
776
+ padding: 3rem 0 1rem;
777
+ }
778
+
779
+ .footer-content {
780
+ display: grid;
781
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
782
+ gap: 2rem;
783
+ margin-bottom: 2rem;
784
+ }
785
+
786
+ .footer-section h4 {
787
+ margin-bottom: 1rem;
788
+ color: var(--white);
789
+ }
790
+
791
+ .footer-section p {
792
+ color: var(--gray);
793
+ font-size: 0.875rem;
794
+ }
795
+
796
+ .footer-link {
797
+ display: block;
798
+ color: var(--gray);
799
+ text-decoration: none;
800
+ margin-bottom: 0.5rem;
801
+ transition: color 0.3s;
802
+ }
803
+
804
+ .footer-link:hover {
805
+ color: var(--primary);
806
+ }
807
+
808
+ .footer-bottom {
809
+ padding-top: 2rem;
810
+ border-top: 1px solid #374151;
811
+ text-align: center;
812
+ color: var(--gray);
813
+ font-size: 0.875rem;
814
+ }
815
+
816
+ /* Responsive Design */
817
+ @media (max-width: 768px) {
818
+ .hero-title {
819
+ font-size: 2rem;
820
+ }
821
+
822
+ .hero-subtitle {
823
+ font-size: 1rem;
824
+ }
825
+
826
+ .stats {
827
+ gap: 2rem;
828
+ }
829
+
830
+ .nav {
831
+ display: none;
832
+ }
833
+
834
+ .about-content {
835
+ grid-template-columns: 1fr;
836
+ gap: 2rem;
837
+ }
838
+
839
+ .video-info {
840
+ flex-direction: column;
841
+ align-items: flex-start;
842
+ }
843
+
844
+ .form-row {
845
+ grid-template-columns: 1fr;
846
+ }
847
+ }
848
+
849
+ @media (max-width: 480px) {
850
+ .container {
851
+ padding: 0 15px;
852
+ }
853
+
854
+ .generate-card,
855
+ .result-card {
856
+ padding: 1.5rem;
857
+ }
858
+
859
+ .hero {
860
+ padding: 2rem 0;
861
+ }
862
+
863
+ .gallery-grid {
864
+ grid-template-columns: 1fr;
865
+ }
866
+ }