Mousco commited on
Commit
61f6c7a
·
verified ·
1 Parent(s): adfb281

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +744 -19
index.html CHANGED
@@ -1,19 +1,744 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>NaruStream - Regarder Naruto Shippuden</title>
7
+ <!-- Importation de polices et d'icônes -->
8
+ <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600;700&display=swap" rel="stylesheet">
9
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
10
+
11
+ <style>
12
+ :root {
13
+ --primary-orange: #FF8C00;
14
+ --primary-hover: #e07b00;
15
+ --dark-bg: #0a0a0a;
16
+ --card-bg: #161616;
17
+ --text-main: #ffffff;
18
+ --text-secondary: #a0a0a0;
19
+ --overlay-color: rgba(0, 0, 0, 0.85);
20
+ --transition: all 0.3s ease;
21
+ --shadow: 0 4px 20px rgba(0,0,0,0.5);
22
+ }
23
+
24
+ * {
25
+ margin: 0;
26
+ padding: 0;
27
+ box-sizing: border-box;
28
+ }
29
+
30
+ body {
31
+ font-family: 'Poppins', sans-serif;
32
+ background-color: var(--dark-bg);
33
+ color: var(--text-main);
34
+ overflow-x: hidden;
35
+ }
36
+
37
+ /* --- Header --- */
38
+ header {
39
+ display: flex;
40
+ justify-content: space-between;
41
+ align-items: center;
42
+ padding: 1rem 5%;
43
+ background: linear-gradient(to bottom, rgba(0,0,0,0.9), transparent);
44
+ position: fixed;
45
+ width: 100%;
46
+ top: 0;
47
+ z-index: 1000;
48
+ transition: var(--transition);
49
+ }
50
+
51
+ header.scrolled {
52
+ background-color: var(--dark-bg);
53
+ box-shadow: var(--shadow);
54
+ }
55
+
56
+ .logo {
57
+ font-size: 1.8rem;
58
+ font-weight: 700;
59
+ color: var(--primary-orange);
60
+ text-decoration: none;
61
+ display: flex;
62
+ align-items: center;
63
+ gap: 10px;
64
+ }
65
+
66
+ .logo i {
67
+ font-size: 1.5rem;
68
+ }
69
+
70
+ nav ul {
71
+ display: flex;
72
+ list-style: none;
73
+ gap: 2rem;
74
+ }
75
+
76
+ nav a {
77
+ color: var(--text-main);
78
+ text-decoration: none;
79
+ font-weight: 500;
80
+ transition: var(--transition);
81
+ position: relative;
82
+ }
83
+
84
+ nav a:hover {
85
+ color: var(--primary-orange);
86
+ }
87
+
88
+ nav a::after {
89
+ content: '';
90
+ position: absolute;
91
+ width: 0;
92
+ height: 2px;
93
+ bottom: -5px;
94
+ left: 0;
95
+ background-color: var(--primary-orange);
96
+ transition: var(--transition);
97
+ }
98
+
99
+ nav a:hover::after {
100
+ width: 100%;
101
+ }
102
+
103
+ .anycoder-link {
104
+ font-size: 0.8rem;
105
+ color: var(--text-secondary);
106
+ text-decoration: none;
107
+ border: 1px solid var(--text-secondary);
108
+ padding: 5px 10px;
109
+ border-radius: 20px;
110
+ transition: var(--transition);
111
+ }
112
+
113
+ .anycoder-link:hover {
114
+ color: var(--primary-orange);
115
+ border-color: var(--primary-orange);
116
+ }
117
+
118
+ /* --- Hero Section --- */
119
+ .hero {
120
+ height: 80vh;
121
+ background: linear-gradient(to top, var(--dark-bg), transparent),
122
+ url('https://picsum.photos/seed/narutohero/1920/1080') no-repeat center center/cover;
123
+ display: flex;
124
+ flex-direction: column;
125
+ justify-content: center;
126
+ padding: 0 5%;
127
+ margin-top: 60px;
128
+ position: relative;
129
+ }
130
+
131
+ .hero-content {
132
+ max-width: 600px;
133
+ z-index: 2;
134
+ }
135
+
136
+ .hero h1 {
137
+ font-size: 3.5rem;
138
+ line-height: 1.2;
139
+ margin-bottom: 1rem;
140
+ text-shadow: 2px 2px 10px rgba(0,0,0,0.8);
141
+ }
142
+
143
+ .hero h1 span {
144
+ color: var(--primary-orange);
145
+ }
146
+
147
+ .hero p {
148
+ color: var(--text-secondary);
149
+ margin-bottom: 2rem;
150
+ font-size: 1.1rem;
151
+ text-shadow: 1px 1px 5px rgba(0,0,0,0.8);
152
+ }
153
+
154
+ .btn-primary {
155
+ background-color: var(--primary-orange);
156
+ color: white;
157
+ padding: 12px 30px;
158
+ border: none;
159
+ border-radius: 5px;
160
+ font-size: 1rem;
161
+ font-weight: 600;
162
+ cursor: pointer;
163
+ transition: var(--transition);
164
+ text-decoration: none;
165
+ display: inline-flex;
166
+ align-items: center;
167
+ gap: 10px;
168
+ }
169
+
170
+ .btn-primary:hover {
171
+ background-color: var(--primary-hover);
172
+ transform: translateY(-2px);
173
+ box-shadow: 0 5px 15px rgba(255, 140, 0, 0.4);
174
+ }
175
+
176
+ /* --- Main Content --- */
177
+ main {
178
+ padding: 4rem 5%;
179
+ }
180
+
181
+ .section-title {
182
+ font-size: 1.8rem;
183
+ margin-bottom: 2rem;
184
+ border-left: 4px solid var(--primary-orange);
185
+ padding-left: 15px;
186
+ }
187
+
188
+ /* --- Controls & Search --- */
189
+ .controls {
190
+ display: flex;
191
+ justify-content: space-between;
192
+ align-items: center;
193
+ margin-bottom: 2rem;
194
+ flex-wrap: wrap;
195
+ gap: 1rem;
196
+ }
197
+
198
+ .search-box {
199
+ position: relative;
200
+ width: 300px;
201
+ }
202
+
203
+ .search-box input {
204
+ width: 100%;
205
+ padding: 10px 40px 10px 15px;
206
+ border-radius: 25px;
207
+ border: 1px solid #333;
208
+ background-color: #222;
209
+ color: white;
210
+ outline: none;
211
+ transition: var(--transition);
212
+ }
213
+
214
+ .search-box input:focus {
215
+ border-color: var(--primary-orange);
216
+ }
217
+
218
+ .search-box i {
219
+ position: absolute;
220
+ right: 15px;
221
+ top: 50%;
222
+ transform: translateY(-50%);
223
+ color: var(--text-secondary);
224
+ }
225
+
226
+ .filter-buttons {
227
+ display: flex;
228
+ gap: 10px;
229
+ }
230
+
231
+ .filter-btn {
232
+ background: transparent;
233
+ border: 1px solid #333;
234
+ color: var(--text-secondary);
235
+ padding: 8px 16px;
236
+ border-radius: 20px;
237
+ cursor: pointer;
238
+ transition: var(--transition);
239
+ }
240
+
241
+ .filter-btn.active, .filter-btn:hover {
242
+ background-color: var(--primary-orange);
243
+ color: white;
244
+ border-color: var(--primary-orange);
245
+ }
246
+
247
+ /* --- Episode Grid --- */
248
+ .episode-grid {
249
+ display: grid;
250
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
251
+ gap: 2rem;
252
+ }
253
+
254
+ .episode-card {
255
+ background-color: var(--card-bg);
256
+ border-radius: 10px;
257
+ overflow: hidden;
258
+ transition: var(--transition);
259
+ cursor: pointer;
260
+ position: relative;
261
+ box-shadow: 0 4px 10px rgba(0,0,0,0.2);
262
+ }
263
+
264
+ .episode-card:hover {
265
+ transform: translateY(-10px);
266
+ box-shadow: 0 10px 20px rgba(255, 140, 0, 0.15);
267
+ }
268
+
269
+ .card-image {
270
+ height: 130px;
271
+ background-color: #333;
272
+ position: relative;
273
+ overflow: hidden;
274
+ }
275
+
276
+ .card-image img {
277
+ width: 100%;
278
+ height: 100%;
279
+ object-fit: cover;
280
+ transition: var(--transition);
281
+ }
282
+
283
+ .episode-card:hover .card-image img {
284
+ transform: scale(1.1);
285
+ }
286
+
287
+ .play-overlay {
288
+ position: absolute;
289
+ top: 0;
290
+ left: 0;
291
+ width: 100%;
292
+ height: 100%;
293
+ background: rgba(0,0,0,0.5);
294
+ display: flex;
295
+ justify-content: center;
296
+ align-items: center;
297
+ opacity: 0;
298
+ transition: var(--transition);
299
+ }
300
+
301
+ .episode-card:hover .play-overlay {
302
+ opacity: 1;
303
+ }
304
+
305
+ .play-overlay i {
306
+ font-size: 2rem;
307
+ color: var(--primary-orange);
308
+ }
309
+
310
+ .card-content {
311
+ padding: 1rem;
312
+ }
313
+
314
+ .episode-number {
315
+ font-size: 0.8rem;
316
+ color: var(--primary-orange);
317
+ font-weight: 700;
318
+ margin-bottom: 5px;
319
+ display: block;
320
+ }
321
+
322
+ .episode-title {
323
+ font-size: 1rem;
324
+ font-weight: 600;
325
+ margin-bottom: 0.5rem;
326
+ line-height: 1.4;
327
+ display: -webkit-box;
328
+ -webkit-line-clamp: 2;
329
+ -webkit-box-orient: vertical;
330
+ overflow: hidden;
331
+ }
332
+
333
+ .episode-meta {
334
+ display: flex;
335
+ justify-content: space-between;
336
+ font-size: 0.8rem;
337
+ color: var(--text-secondary);
338
+ }
339
+
340
+ /* --- Video Player Modal --- */
341
+ .modal {
342
+ position: fixed;
343
+ top: 0;
344
+ left: 0;
345
+ width: 100%;
346
+ height: 100%;
347
+ background-color: var(--overlay-color);
348
+ z-index: 2000;
349
+ display: flex;
350
+ justify-content: center;
351
+ align-items: center;
352
+ opacity: 0;
353
+ pointer-events: none;
354
+ transition: opacity 0.3s ease;
355
+ backdrop-filter: blur(5px);
356
+ }
357
+
358
+ .modal.active {
359
+ opacity: 1;
360
+ pointer-events: all;
361
+ }
362
+
363
+ .modal-content {
364
+ width: 90%;
365
+ max-width: 1000px;
366
+ background-color: #1a1a1a;
367
+ border-radius: 10px;
368
+ overflow: hidden;
369
+ box-shadow: 0 0 30px rgba(0,0,0,0.8);
370
+ transform: scale(0.9);
371
+ transition: transform 0.3s ease;
372
+ }
373
+
374
+ .modal.active .modal-content {
375
+ transform: scale(1);
376
+ }
377
+
378
+ .player-header {
379
+ padding: 1rem;
380
+ display: flex;
381
+ justify-content: space-between;
382
+ align-items: center;
383
+ border-bottom: 1px solid #333;
384
+ }
385
+
386
+ .close-btn {
387
+ background: none;
388
+ border: none;
389
+ color: white;
390
+ font-size: 1.5rem;
391
+ cursor: pointer;
392
+ transition: var(--transition);
393
+ }
394
+
395
+ .close-btn:hover {
396
+ color: var(--primary-orange);
397
+ }
398
+
399
+ .video-container {
400
+ width: 100%;
401
+ aspect-ratio: 16/9;
402
+ background: black;
403
+ display: flex;
404
+ justify-content: center;
405
+ align-items: center;
406
+ position: relative;
407
+ }
408
+
409
+ .placeholder-content {
410
+ text-align: center;
411
+ color: var(--text-secondary);
412
+ }
413
+
414
+ .placeholder-content i {
415
+ font-size: 4rem;
416
+ margin-bottom: 1rem;
417
+ color: var(--primary-orange);
418
+ }
419
+
420
+ .player-controls {
421
+ padding: 1rem;
422
+ background: #222;
423
+ display: flex;
424
+ justify-content: space-between;
425
+ align-items: center;
426
+ }
427
+
428
+ .progress-bar {
429
+ flex-grow: 1;
430
+ height: 5px;
431
+ background: #444;
432
+ margin: 0 1rem;
433
+ border-radius: 5px;
434
+ cursor: pointer;
435
+ position: relative;
436
+ }
437
+
438
+ .progress-fill {
439
+ width: 0%;
440
+ height: 100%;
441
+ background: var(--primary-orange);
442
+ border-radius: 5px;
443
+ }
444
+
445
+ /* --- Footer --- */
446
+ footer {
447
+ background-color: #050505;
448
+ padding: 3rem 5%;
449
+ text-align: center;
450
+ margin-top: 4rem;
451
+ border-top: 1px solid #222;
452
+ }
453
+
454
+ .footer-text {
455
+ color: var(--text-secondary);
456
+ font-size: 0.9rem;
457
+ }
458
+
459
+ /* --- Responsive --- */
460
+ @media (max-width: 768px) {
461
+ .hero h1 {
462
+ font-size: 2.5rem;
463
+ }
464
+
465
+ nav {
466
+ display: none; /* Simplification pour mobile */
467
+ }
468
+
469
+ .controls {
470
+ flex-direction: column;
471
+ align-items: flex-start;
472
+ }
473
+
474
+ .search-box {
475
+ width: 100%;
476
+ }
477
+
478
+ .filter-buttons {
479
+ width: 100%;
480
+ overflow-x: auto;
481
+ padding-bottom: 10px;
482
+ }
483
+ }
484
+ </style>
485
+ </head>
486
+ <body>
487
+
488
+ <!-- Header -->
489
+ <header id="navbar">
490
+ <a href="#" class="logo">
491
+ <i class="fas fa-fire"></i> NaruStream
492
+ </a>
493
+ <nav>
494
+ <ul>
495
+ <li><a href="#" class="active">Accueil</a></li>
496
+ <li><a href="#episodes">Épisodes</a></li>
497
+ <li><a href="#">Arcs</a></li>
498
+ <li><a href="#">Personnages</a></li>
499
+ </ul>
500
+ </nav>
501
+ <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" class="anycoder-link">
502
+ Built with anycoder
503
+ </a>
504
+ </header>
505
+
506
+ <!-- Hero Section -->
507
+ <section class="hero">
508
+ <div class="hero-content">
509
+ <h1>Naruto <span>Shippuden</span></h1>
510
+ <p>Deux ans et demi après son départ du village de Konoha, Naruto Uzumaki revient. Il est plus fort, plus rapide, et prêt à affronter l'Organisation Akatsuki.</p>
511
+ <button class="btn-primary" onclick="scrollToEpisodes()">
512
+ <i class="fas fa-play"></i> Commencer le visionnage
513
+ </button>
514
+ </div>
515
+ </section>
516
+
517
+ <!-- Main Content -->
518
+ <main id="episodes">
519
+ <div class="controls">
520
+ <h2 class="section-title">Tous les épisodes</h2>
521
+
522
+ <div class="search-box">
523
+ <input type="text" id="searchInput" placeholder="Rechercher un épisode...">
524
+ <i class="fas fa-search"></i>
525
+ </div>
526
+
527
+ <div class="filter-buttons">
528
+ <button class="filter-btn active" data-filter="all">Tous</button>
529
+ <button class="filter-btn" data-filter="1">Saison 1</button>
530
+ <button class="filter-btn" data-filter="2">Saison 2</button>
531
+ <button class="filter-btn" data-filter="3">Saison 3</button>
532
+ </div>
533
+ </div>
534
+
535
+ <div class="episode-grid" id="episodeGrid">
536
+ <!-- Les épisodes seront générés ici par JavaScript -->
537
+ </div>
538
+ </main>
539
+
540
+ <!-- Video Player Modal -->
541
+ <div class="modal" id="videoModal">
542
+ <div class="modal-content">
543
+ <div class="player-header">
544
+ <h3 id="modalTitle">Titre de l'épisode</h3>
545
+ <button class="close-btn" onclick="closeModal()">
546
+ <i class="fas fa-times"></i>
547
+ </button>
548
+ </div>
549
+ <div class="video-container" id="videoContainer">
550
+ <div class="placeholder-content">
551
+ <i class="fas fa-play-circle"></i>
552
+ <h3>Lecteur de simulation</h3>
553
+ <p>Le chargement de la vidéo commence...</p>
554
+ <p style="font-size: 0.8rem; margin-top: 10px; color: #666;">(Pour des raisons de droits d'auteur, il s'agit d'une démo technique)</p>
555
+ </div>
556
+ </div>
557
+ <div class="player-controls">
558
+ <button class="btn-primary" style="padding: 5px 15px; background: #333;" onclick="togglePlay()">
559
+ <i class="fas fa-play" id="playIcon"></i>
560
+ </button>
561
+ <div class="progress-bar">
562
+ <div class="progress-fill" style="width: 0%"></div>
563
+ </div>
564
+ <span style="color: #aaa; font-size: 0.8rem;">23:40</span>
565
+ <i class="fas fa-volume-up" style="color: #aaa; margin-left: 10px;"></i>
566
+ </div>
567
+ </div>
568
+ </div>
569
+
570
+ <!-- Footer -->
571
+ <footer>
572
+ <p class="footer-text">© 2023 NaruStream Demo. Projet de démonstration frontend.</p>
573
+ <p class="footer-text" style="margin-top: 5px; font-size: 0.8rem;">Ce site ne stocke aucun fichier vidéo sur ses serveurs.</p>
574
+ </footer>
575
+
576
+ <script>
577
+ // --- Données simulées des épisodes ---
578
+ // Dans une application réelle, cela viendrait d'une API.
579
+ const episodesData = [
580
+ { id: 1, title: "Retour à la maison", season: 1, img: "https://picsum.photos/seed/naruto1/300/200" },
581
+ { id: 2, title: "L'organisation Akatsuki", season: 1, img: "https://picsum.photos/seed/naruto2/300/200" },
582
+ { id: 3, title: "Résultat de l'entraînement", season: 1, img: "https://picsum.photos/seed/naruto3/300/200" },
583
+ { id: 4, title: "Le Jinchūriki de la Sable", season: 1, img: "https://picsum.photos/seed/naruto4/300/200" },
584
+ { id: 5, title: "Le pacte de Kazekage", season: 1, img: "https://picsum.photos/seed/naruto5/300/200" },
585
+ { id: 6, title: "Mission spéciale", season: 1, img: "https://picsum.photos/seed/naruto6/300/200" },
586
+ { id: 7, title: "Départ en mission", season: 1, img: "https://picsum.photos/seed/naruto7/300/200" },
587
+ { id: 8, title: "L'équipe de Kakashi", season: 1, img: "https://picsum.photos/seed/naruto8/300/200" },
588
+ { id: 9, title: "Le deuil", season: 2, img: "https://picsum.photos/seed/naruto9/300/200" },
589
+ { id: 10, title: "Code de conjuration", season: 2, img: "https://picsum.photos/seed/naruto10/300/200" },
590
+ { id: 11, title: "La bête médicale", season: 2, img: "https://picsum.photos/seed/naruto11/300/200" },
591
+ { id: 12, title: "La rencontre", season: 2, img: "https://picsum.photos/seed/naruto12/300/200" },
592
+ { id: 13, title: "Une honnête différence", season: 2, img: "https://picsum.photos/seed/naruto13/300/200" },
593
+ { id: 14, title: "L'histoire de Naruto", season: 3, img: "https://picsum.photos/seed/naruto14/300/200" },
594
+ { id: 15, title: "Le secret de jutsu", season: 3, img: "https://picsum.photos/seed/naruto15/300/200" },
595
+ { id: 16, title: "Les pouvoirs cachés", season: 3, img: "https://picsum.photos/seed/naruto16/300/200" },
596
+ { id: 17, title: "La mort d'un proche", season: 3, img: "https://picsum.photos/seed/naruto17/300/200" },
597
+ { id: 18, title: "Les cinq scellages", season: 3, img: "https://picsum.photos/seed/naruto18/300/200" },
598
+ { id: 19, title: "L'entraînement de Sasuke", season: 3, img: "https://picsum.photos/seed/naruto19/300/200" },
599
+ { id: 20, title: "Hiruko vs les deux ninja", season: 3, img: "https://picsum.photos/seed/naruto20/300/200" },
600
+ ];
601
+
602
+ const grid = document.getElementById('episodeGrid');
603
+ const searchInput = document.getElementById('searchInput');
604
+ const filterBtns = document.querySelectorAll('.filter-btn');
605
+ const modal = document.getElementById('videoModal');
606
+ const modalTitle = document.getElementById('modalTitle');
607
+ const navbar = document.getElementById('navbar');
608
+
609
+ // --- Fonctions d'affichage ---
610
+
611
+ function renderEpisodes(filter = 'all', searchTerm = '') {
612
+ grid.innerHTML = '';
613
+
614
+ const filtered = episodesData.filter(ep => {
615
+ const matchesSeason = filter === 'all' || ep.season === parseInt(filter);
616
+ const matchesSearch = ep.title.toLowerCase().includes(searchTerm.toLowerCase());
617
+ return matchesSeason && matchesSearch;
618
+ });
619
+
620
+ if (filtered.length === 0) {
621
+ grid.innerHTML = '<p style="color: #666; grid-column: 1/-1; text-align: center; padding: 2rem;">Aucun épisode trouvé.</p>';
622
+ return;
623
+ }
624
+
625
+ filtered.forEach(ep => {
626
+ const card = document.createElement('div');
627
+ card.className = 'episode-card';
628
+ card.onclick = () => openPlayer(ep);
629
+
630
+ card.innerHTML = `
631
+ <div class="card-image">
632
+ <img src="${ep.img}" alt="Episode ${ep.id}" loading="lazy">
633
+ <div class="play-overlay">
634
+ <i class="fas fa-play"></i>
635
+ </div>
636
+ </div>
637
+ <div class="card-content">
638
+ <span class="episode-number">Épisode ${ep.id}</span>
639
+ <h3 class="episode-title">${ep.title}</h3>
640
+ <div class="episode-meta">
641
+ <span>Saison ${ep.season}</span>
642
+ <span>24min</span>
643
+ </div>
644
+ </div>
645
+ `;
646
+ grid.appendChild(card);
647
+ });
648
+ }
649
+
650
+ // --- Gestion du Modal / Lecteur ---
651
+
652
+ function openPlayer(episode) {
653
+ modalTitle.textContent = `Épisode ${episode.id} : ${episode.title}`;
654
+ modal.classList.add('active');
655
+
656
+ // Simulation de chargement
657
+ const container = document.getElementById('videoContainer');
658
+ container.innerHTML = `
659
+ <div class="placeholder-content">
660
+ <i class="fas fa-circle-notch fa-spin"></i>
661
+ <p>Chargement du flux...</p>
662
+ </div>
663
+ `;
664
+
665
+ setTimeout(() => {
666
+ container.innerHTML = `
667
+ <div class="placeholder-content">
668
+ <i class="fas fa-play-circle"></i>
669
+ <h3>Simulation de lecture</h3>
670
+ <p>Vous regardez : ${episode.title}</p>
671
+ <button class="btn-primary" style="margin-top:15px" onclick="alert('Dans une vraie app, le lecteur démarrerait ici !')">Lancer le flux</button>
672
+ </div>
673
+ `;
674
+ }, 1000);
675
+ }
676
+
677
+ function closeModal() {
678
+ modal.classList.remove('active');
679
+ }
680
+
681
+ function togglePlay() {
682
+ const icon = document.getElementById('playIcon');
683
+ if (icon.classList.contains('fa-play')) {
684
+ icon.classList.remove('fa-play');
685
+ icon.classList.add('fa-pause');
686
+ } else {
687
+ icon.classList.remove('fa-pause');
688
+ icon.classList.add('fa-play');
689
+ }
690
+ }
691
+
692
+ // --- Événements ---
693
+
694
+ // Filtres par saison
695
+ filterBtns.forEach(btn => {
696
+ btn.addEventListener('click', () => {
697
+ // Gestion de la classe active
698
+ filterBtns.forEach(b => b.classList.remove('active'));
699
+ btn.classList.add('active');
700
+
701
+ // Rendu
702
+ renderEpisodes(btn.dataset.filter, searchInput.value);
703
+ });
704
+ });
705
+
706
+ // Recherche
707
+ searchInput.addEventListener('input', (e) => {
708
+ const activeFilter = document.querySelector('.filter-btn.active').dataset.filter;
709
+ renderEpisodes(activeFilter, e.target.value);
710
+ });
711
+
712
+ // Scroll Navbar effect
713
+ window.addEventListener('scroll', () => {
714
+ if (window.scrollY > 50) {
715
+ navbar.classList.add('scrolled');
716
+ } else {
717
+ navbar.classList.remove('scrolled');
718
+ }
719
+ });
720
+
721
+ function scrollToEpisodes() {
722
+ document.getElementById('episodes').scrollIntoView({ behavior: 'smooth' });
723
+ }
724
+
725
+ // Fermer modal avec Esc
726
+ document.addEventListener('keydown', (e) => {
727
+ if (e.key === "Escape" && modal.classList.contains('active')) {
728
+ closeModal();
729
+ }
730
+ });
731
+
732
+ // Fermer modal en cliquant à l'extérieur
733
+ modal.addEventListener('click', (e) => {
734
+ if (e.target === modal) {
735
+ closeModal();
736
+ }
737
+ });
738
+
739
+ // Initialisation
740
+ renderEpisodes();
741
+
742
+ </script>
743
+ </body>
744
+ </html>