Mousco commited on
Commit
8d7d71b
·
verified ·
1 Parent(s): a9cc9ce

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +724 -839
index.html CHANGED
@@ -1,852 +1,737 @@
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>CineStream - Streaming Gratuit</title>
7
-
8
- <!-- Importation d'une police moderne -->
9
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;800&display=swap" rel="stylesheet">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
- <!-- Importation des icônes (Phosphor Icons via CDN) -->
12
- <script src="https://unpkg.com/@phosphor-icons/web"></script>
13
-
14
- <style>
15
- /* --- VARIABLES CSS & RESET --- */
16
- :root {
17
- --primary-color: #e50914; /* Rouge style Netflix */
18
- --background-dark: #141414;
19
- --background-light: #1f1f1f;
20
- --text-white: #ffffff;
21
- --text-gray: #b3b3b3;
22
- --transition-speed: 0.3s;
23
- --header-height: 70px;
24
- }
25
-
26
- * {
27
- margin: 0;
28
- padding: 0;
29
- box-sizing: border-box;
30
- }
31
-
32
- body {
33
- font-family: 'Inter', sans-serif;
34
- background-color: var(--background-dark);
35
- color: var(--text-white);
36
- overflow-x: hidden;
37
- }
38
-
39
- a { text-decoration: none; color: inherit; }
40
- ul { list-style: none; }
41
- button { cursor: pointer; border: none; outline: none; font-family: inherit; }
42
-
43
- /* --- HEADER --- */
44
- header {
45
- position: fixed;
46
- top: 0;
47
- width: 100%;
48
- height: var(--header-height);
49
- display: flex;
50
- justify-content: space-between;
51
- align-items: center;
52
- padding: 0 4%;
53
- background: linear-gradient(to bottom, rgba(0,0,0,0.9) 0%, rgba(0,0,0,0) 100%);
54
- z-index: 1000;
55
- transition: background-color var(--transition-speed);
56
- }
57
-
58
- header.scrolled {
59
- background-color: var(--background-dark);
60
- box-shadow: 0 2px 10px rgba(0,0,0,0.5);
61
- }
62
-
63
- .logo {
64
- font-size: 1.8rem;
65
- font-weight: 800;
66
- color: var(--primary-color);
67
- text-transform: uppercase;
68
- letter-spacing: 1px;
69
- }
70
-
71
- .nav-links {
72
- display: flex;
73
- gap: 20px;
74
- }
75
-
76
- .nav-links li a {
77
- color: var(--text-white);
78
- font-size: 0.9rem;
79
- transition: color var(--transition-speed);
80
- }
81
-
82
- .nav-links li a:hover {
83
- color: var(--text-gray);
84
- }
85
-
86
- .right-section {
87
- display: flex;
88
- align-items: center;
89
- gap: 15px;
90
- }
91
-
92
- /* Barre de recherche */
93
- .search-box {
94
- background: rgba(0,0,0,0.75);
95
- border: 1px solid var(--text-white);
96
- display: flex;
97
- align-items: center;
98
- padding: 5px 10px;
99
- border-radius: 4px;
100
- transition: width 0.3s;
101
- }
102
-
103
- .search-box input {
104
- background: transparent;
105
- border: none;
106
- color: white;
107
- padding: 5px;
108
- width: 0; /* Caché par défaut */
109
- opacity: 0;
110
- transition: all 0.3s ease;
111
- }
112
-
113
- .search-box.active input {
114
- width: 200px;
115
- opacity: 1;
116
- padding-left: 10px;
117
- }
118
-
119
- .search-box i {
120
- font-size: 1.2rem;
121
- cursor: pointer;
122
- }
123
-
124
- .user-avatar {
125
- width: 32px;
126
- height: 32px;
127
- border-radius: 4px;
128
- background-color: #333;
129
- background-image: url('https://picsum.photos/seed/user/200/200');
130
- background-size: cover;
131
- }
132
-
133
- /* --- HERO SECTION --- */
134
- .hero {
135
- position: relative;
136
- height: 80vh;
137
- width: 100%;
138
- background-size: cover;
139
- background-position: center;
140
- display: flex;
141
- align-items: center;
142
- padding-left: 4%;
143
- }
144
-
145
- .hero::after {
146
- content: '';
147
- position: absolute;
148
- top: 0; left: 0; width: 100%; height: 100%;
149
- background: linear-gradient(to top, var(--background-dark) 0%, transparent 60%, rgba(0,0,0,0.4) 100%);
150
- }
151
-
152
- .hero-content {
153
- position: relative;
154
- z-index: 10;
155
- max-width: 500px;
156
- margin-top: 50px;
157
- }
158
-
159
- .hero-title {
160
- font-size: 3.5rem;
161
- font-weight: 800;
162
- margin-bottom: 15px;
163
- line-height: 1.1;
164
- text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
165
- }
166
-
167
- .hero-desc {
168
- font-size: 1.1rem;
169
- margin-bottom: 25px;
170
- text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
171
- }
172
-
173
- .hero-buttons {
174
- display: flex;
175
- gap: 15px;
176
- }
177
-
178
- .btn {
179
- padding: 10px 24px;
180
- border-radius: 4px;
181
- font-weight: 600;
182
- font-size: 1rem;
183
- display: flex;
184
- align-items: center;
185
- gap: 8px;
186
- transition: transform 0.2s, background-color 0.2s;
187
- }
188
-
189
- .btn:hover {
190
- transform: scale(1.05);
191
- }
192
-
193
- .btn-play {
194
- background-color: var(--text-white);
195
- color: black;
196
- }
197
-
198
- .btn-info {
199
- background-color: rgba(109, 109, 110, 0.7);
200
- color: var(--text-white);
201
- }
202
-
203
- /* --- MAIN CONTENT --- */
204
- main {
205
- padding: 20px 4%;
206
- position: relative;
207
- z-index: 20;
208
- margin-top: -50px; /* Chevauchement sur le hero */
209
- }
210
-
211
- .category-section {
212
- margin-bottom: 40px;
213
- }
214
-
215
- .category-title {
216
- font-size: 1.2rem;
217
- font-weight: 600;
218
- margin-bottom: 15px;
219
- color: #e5e5e5;
220
- }
221
-
222
- /* Carrousel horizontal */
223
- .movies-row {
224
- display: flex;
225
- gap: 10px;
226
- overflow-x: auto;
227
- padding-bottom: 20px;
228
- scroll-behavior: smooth;
229
- }
230
-
231
- .movies-row::-webkit-scrollbar {
232
- height: 8px;
233
- }
234
-
235
- .movies-row::-webkit-scrollbar-track {
236
- background: transparent;
237
- }
238
-
239
- .movies-row::-webkit-scrollbar-thumb {
240
- background: #333;
241
- border-radius: 4px;
242
- }
243
-
244
- .movies-row::-webkit-scrollbar-thumb:hover {
245
- background: #555;
246
- }
247
-
248
- .movie-card {
249
- min-width: 200px;
250
- height: 300px;
251
- border-radius: 4px;
252
- overflow: hidden;
253
- position: relative;
254
- cursor: pointer;
255
- transition: transform 0.3s ease, z-index 0.3s;
256
- background-color: #222;
257
- }
258
-
259
- .movie-card:hover {
260
- transform: scale(1.1);
261
- z-index: 100;
262
- box-shadow: 0 4px 15px rgba(0,0,0,0.5);
263
- }
264
-
265
- .movie-card img {
266
- width: 100%;
267
- height: 100%;
268
- object-fit: cover;
269
- }
270
-
271
- .card-info {
272
- position: absolute;
273
- bottom: 0;
274
- left: 0;
275
- width: 100%;
276
- padding: 10px;
277
- background: linear-gradient(to top, rgba(0,0,0,0.9), transparent);
278
- opacity: 0;
279
- transition: opacity 0.3s;
280
- }
281
-
282
- .movie-card:hover .card-info {
283
- opacity: 1;
284
- }
285
-
286
- .card-title {
287
- font-size: 0.9rem;
288
- font-weight: 600;
289
- }
290
-
291
- .card-meta {
292
- font-size: 0.7rem;
293
- color: #46d369; /* Vert pour le score */
294
- margin-top: 5px;
295
- display: flex;
296
- align-items: center;
297
- gap: 5px;
298
- }
299
-
300
- /* --- FOOTER --- */
301
- footer {
302
- margin-top: 50px;
303
- padding: 50px 4%;
304
- color: var(--text-gray);
305
- font-size: 0.8rem;
306
- text-align: center;
307
- border-top: 1px solid #333;
308
- }
309
-
310
- .anycoder-link {
311
- color: var(--primary-color);
312
- font-weight: bold;
313
- margin-top: 10px;
314
- display: inline-block;
315
- }
316
-
317
- /* --- MODAL (PLAYER & DETAILS) --- */
318
- .modal-overlay {
319
- position: fixed;
320
- top: 0; left: 0; width: 100%; height: 100%;
321
- background: rgba(0,0,0,0.8);
322
- display: flex;
323
- justify-content: center;
324
- align-items: center;
325
- z-index: 2000;
326
- opacity: 0;
327
- pointer-events: none;
328
- transition: opacity 0.3s;
329
- }
330
-
331
- .modal-overlay.active {
332
- opacity: 1;
333
- pointer-events: all;
334
- }
335
-
336
- .modal-content {
337
- background: #181818;
338
- width: 90%;
339
- max-width: 800px;
340
- border-radius: 8px;
341
- overflow: hidden;
342
- position: relative;
343
- box-shadow: 0 10px 30px rgba(0,0,0,0.5);
344
- transform: translateY(50px);
345
- transition: transform 0.3s;
346
- }
347
-
348
- .modal-overlay.active .modal-content {
349
- transform: translateY(0);
350
- }
351
-
352
- .close-modal {
353
- position: absolute;
354
- top: 15px;
355
- right: 15px;
356
- background: rgba(0,0,0,0.5);
357
- color: white;
358
- border-radius: 50%;
359
- width: 35px;
360
- height: 35px;
361
- display: flex;
362
- justify-content: center;
363
- align-items: center;
364
- cursor: pointer;
365
- z-index: 10;
366
- }
367
-
368
- .video-placeholder {
369
- width: 100%;
370
- aspect-ratio: 16/9;
371
- background: black;
372
- display: flex;
373
- justify-content: center;
374
- align-items: center;
375
- position: relative;
376
- }
377
-
378
- .play-btn-large {
379
- font-size: 4rem;
380
- color: var(--primary-color);
381
- opacity: 0.8;
382
- cursor: pointer;
383
- transition: transform 0.2s;
384
- }
385
-
386
- .play-btn-large:hover {
387
- transform: scale(1.1);
388
- opacity: 1;
389
- }
390
-
391
- .modal-details {
392
- padding: 20px;
393
- }
394
-
395
- .modal-title {
396
- font-size: 1.5rem;
397
- margin-bottom: 10px;
398
- }
399
-
400
- .modal-meta {
401
- display: flex;
402
- gap: 15px;
403
- color: var(--text-gray);
404
- font-size: 0.9rem;
405
- margin-bottom: 15px;
406
- }
407
-
408
- .match-score { color: #46d369; font-weight: bold; }
409
-
410
- .modal-desc {
411
- line-height: 1.5;
412
- color: #fff;
413
- }
414
-
415
- /* --- RESPONSIVE --- */
416
- @media (max-width: 768px) {
417
- .hero-title { font-size: 2rem; }
418
- .nav-links { display: none; } /* Menu caché sur mobile pour simplifier */
419
- .search-box.active input { width: 150px; }
420
- }
421
- </style>
422
  </head>
 
423
  <body>
424
 
425
- <!-- Header -->
426
- <header id="main-header">
427
- <div class="logo">CineStream</div>
428
- <ul class="nav-links">
429
- <li><a href="#" class="active">Accueil</a></li>
430
- <li><a href="#">Séries</a></li>
431
- <li><a href="#">Films</a></li>
432
- <li><a href="#">Nouveautés</a></li>
433
- <li><a href="#">Ma liste</a></li>
 
 
434
  </ul>
435
- <div class="right-section">
436
- <div class="search-box" id="search-box">
437
- <i class="ph ph-magnifying-glass" id="search-icon"></i>
438
- <input type="text" id="search-input" placeholder="Titres, personnages, genres...">
439
- </div>
440
- <div class="user-avatar"></div>
441
- </div>
442
- </header>
443
-
444
- <!-- Hero Section -->
445
- <section class="hero" id="hero-section">
446
- <div class="hero-content">
447
- <h1 class="hero-title" id="hero-title">Chargement...</h1>
448
- <p class="hero-desc" id="hero-desc">...</p>
449
- <div class="hero-buttons">
450
- <button class="btn btn-play" onclick="playHeroMovie()">
451
- <i class="ph ph-play-fill"></i> Lecture
452
- </button>
453
- <button class="btn btn-info" onclick="showHeroDetails()">
454
- <i class="ph ph-info"></i> Plus d'infos
455
- </button>
456
- </div>
457
- </div>
458
- </section>
459
-
460
- <!-- Main Content -->
461
- <main id="main-content">
462
- <!-- Les catégories seront injectées ici par JS -->
463
- </main>
464
-
465
- <!-- Modal Player -->
466
- <div class="modal-overlay" id="movie-modal">
467
- <div class="modal-content">
468
- <div class="close-modal" onclick="closeModal()">
469
- <i class="ph ph-x"></i>
470
- </div>
471
-
472
- <div class="video-placeholder" id="modal-video-area">
473
- <!-- Simulation du lecteur -->
474
- <img src="" id="modal-bg-img" style="position:absolute; width:100%; height:100%; object-fit:cover; opacity:0.3;">
475
- <i class="ph ph-play-circle play-btn-large" onclick="startFakePlayback()"></i>
476
- <div id="video-status" style="position:absolute; bottom:20px; color:white; display:none;">Chargement du flux...</div>
477
- </div>
478
-
479
- <div class="modal-details">
480
- <h2 class="modal-title" id="modal-title">Titre du film</h2>
481
- <div class="modal-meta">
482
- <span class="match-score">98% pour vous</span>
483
- <span id="modal-year">2023</span>
484
- <span style="border:1px solid #666; padding:0 4px; font-size:0.7rem;">HD</span>
485
- </div>
486
- <p class="modal-desc" id="modal-desc">Description du film...</p>
487
- </div>
488
- </div>
489
  </div>
490
 
491
- <!-- Footer -->
492
- <footer>
493
- <p>© 2023 CineStream. Tous droits réservés. Ceci est une démo technique.</p>
494
- <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" class="anycoder-link">
495
- Built with anycoder
496
- </a>
497
- </footer>
498
-
499
- <script>
500
- // --- DONNÉES SIMULÉES (Base de données locale) ---
501
- // J'utilise des images de placeholder avec du texte pour garantir qu'elles fonctionnent toujours.
502
- const database = [
503
- {
504
- id: 1,
505
- title: "Naruto Shippuden",
506
- category: "Anime",
507
- year: 2007,
508
- rating: "4.8",
509
- desc: "Naruto Uzumaki veut devenir le meilleur Hokage de tous les temps. Un anime d'action et d'aventure épique.",
510
- image: "https://placehold.co/300x450/FF4500/white?text=Naruto",
511
- hero: true
512
- },
513
- {
514
- id: 2,
515
- title: "One Piece",
516
- category: "Anime",
517
- year: 1999,
518
- rating: "4.9",
519
- desc: "Luffy et son équipage naviguent sur la Grand Line à la recherche du légendaire trésor One Piece.",
520
- image: "https://placehold.co/300x450/1e90ff/white?text=One+Piece",
521
- hero: false
522
- },
523
- {
524
- id: 3,
525
- title: "Stranger Things",
526
- category: "Séries TV",
527
- year: 2016,
528
- rating: "4.7",
529
- desc: "Quand un jeune garçon disparaît, une petite ville découvre une affaire mystérieuse, des expériences secrètes et des forces surnaturelles.",
530
- image: "https://placehold.co/300x450/8b0000/white?text=Stranger+Things",
531
- hero: false
532
- },
533
- {
534
- id: 4,
535
- title: "Spider-Man: No Way Home",
536
- category: "Films",
537
- year: 2021,
538
- rating: "4.8",
539
- desc: "Avec l'identité de Spider-Man désormais révélée, Peter Parker demande de l'aide au Docteur Strange.",
540
- image: "https://placehold.co/300x450/daa520/white?text=Spiderman",
541
- hero: false
542
- },
543
- {
544
- id: 5,
545
- title: "Attack on Titan",
546
- category: "Anime",
547
- year: 2013,
548
- rating: "4.9",
549
- desc: "L'humanité vit à l'intérieur de villes entourées de murs géants qui les protègent des Titans mangeurs d'hommes.",
550
- image: "https://placehold.co/300x450/708090/white?text=AOT",
551
- hero: false
552
- },
553
- {
554
- id: 6,
555
- title: "Breaking Bad",
556
- category: "Séries TV",
557
- year: 2008,
558
- rating: "5.0",
559
- desc: "Un professeur de chimie de lycée atteint d'un cancer se tourne vers la fabrication de méthamphétamine.",
560
- image: "https://placehold.co/300x450/228b22/white?text=Breaking+Bad",
561
- hero: false
562
- },
563
- {
564
- id: 7,
565
- title: "The Witcher",
566
- category: "Séries TV",
567
- year: 2019,
568
- rating: "4.5",
569
- desc: "Le sorceleur Geralt, un chasseur de monstres mutant, se bat pour trouver sa place dans un monde.",
570
- image: "https://placehold.co/300x450/556b2f/white?text=The+Witcher",
571
- hero: false
572
- },
573
- {
574
- id: 8,
575
- title: "Demon Slayer",
576
- category: "Anime",
577
- year: 2019,
578
- rating: "4.8",
579
- desc: "Tanjiro Kamado devient un chasseur de démons après que sa famille a été massacrée.",
580
- image: "https://placehold.co/300x450/800080/white?text=Demon+Slayer",
581
- hero: false
582
- },
583
- {
584
- id: 9,
585
- title: "Inception",
586
- category: "Films",
587
- year: 2010,
588
- rating: "4.9",
589
- desc: "Un voleur qui vole les secrets d'entreprise grâce à l'utilisation de la technologie de partage de rêves.",
590
- image: "https://placehold.co/300x450/000000/white?text=Inception",
591
- hero: false
592
- },
593
- {
594
- id: 10,
595
- title: "Arcane",
596
- category: "Séries TV",
597
- year: 2021,
598
- rating: "4.9",
599
- desc: "Sœurs jumelles Vi et Jinx se retrouvent dans les deux côtés opposés d'une guerre entre technologies magiques.",
600
- image: "https://placehold.co/300x450/00ced1/white?text=Arcane",
601
- hero: false
602
- },
603
- {
604
- id: 11,
605
- title: "Jujutsu Kaisen",
606
- category: "Anime",
607
- year: 2020,
608
- rating: "4.7",
609
- desc: "Yuji Itadori rejoint une organisation secrète de Sorciers pour tuer un Puissant Sorcier nommé Ryomen Sukuna.",
610
- image: "https://placehold.co/300x450/9932cc/white?text=JJK",
611
- hero: false
612
- },
613
- {
614
- id: 12,
615
- title: "Avatar 2",
616
- category: "Films",
617
- year: 2022,
618
- rating: "4.6",
619
- desc: "Jake Sully vit avec sa nouvelle famille sur la planète Pandora. Une menace familière revient pour finir ce qu'il a commencé.",
620
- image: "https://placehold.co/300x450/4682b4/white?text=Avatar+2",
621
- hero: false
622
- }
623
- ];
624
-
625
- // --- DOM ELEMENTS ---
626
- const heroSection = document.getElementById('hero-section');
627
- const heroTitle = document.getElementById('hero-title');
628
- const heroDesc = document.getElementById('hero-desc');
629
- const mainContent = document.getElementById('main-content');
630
- const searchInput = document.getElementById('search-input');
631
- const searchBox = document.getElementById('search-box');
632
- const searchIcon = document.getElementById('search-icon');
633
- const header = document.getElementById('main-header');
634
-
635
- // Modal elements
636
- const modal = document.getElementById('movie-modal');
637
- const modalTitle = document.getElementById('modal-title');
638
- const modalDesc = document.getElementById('modal-desc');
639
- const modalYear = document.getElementById('modal-year');
640
- const modalBgImg = document.getElementById('modal-bg-img');
641
- const videoStatus = document.getElementById('video-status');
642
-
643
- // --- INITIALISATION ---
644
-
645
- // 1. Configurer le Hero (Film mis en avant)
646
- function initHero() {
647
- const heroMovie = database.find(m => m.hero) || database[0];
648
- // On utilise l'image du film mais en mode sombre pour le fond
649
- heroSection.style.backgroundImage = `url('https://placehold.co/1920x1080/222/white?text=${encodeURIComponent(heroMovie.title)}')`;
650
- heroTitle.innerText = heroMovie.title;
651
- heroDesc.innerText = heroMovie.desc;
652
-
653
- // Stocker l'ID du hero pour les boutons
654
- heroSection.dataset.id = heroMovie.id;
655
- }
656
-
657
- // 2. Afficher les catégories
658
- function initCategories() {
659
- // Extraire les catégories uniques
660
- const categories = [...new Set(database.map(item => item.category))];
661
-
662
- mainContent.innerHTML = ''; // Reset
663
-
664
- categories.forEach(cat => {
665
- const section = document.createElement('div');
666
- section.className = 'category-section';
667
-
668
- const title = document.createElement('h3');
669
- title.className = 'category-title';
670
- title.innerText = cat;
671
-
672
- const row = document.createElement('div');
673
- row.className = 'movies-row';
674
-
675
- // Filtrer les films de cette catégorie
676
- const movies = database.filter(m => m.category === cat);
677
-
678
- movies.forEach(movie => {
679
- const card = createMovieCard(movie);
680
- row.appendChild(card);
681
- });
682
-
683
- section.appendChild(title);
684
- section.appendChild(row);
685
- mainContent.appendChild(section);
686
- });
687
- }
688
-
689
- // Créer une carte HTML pour un film
690
- function createMovieCard(movie) {
691
- const card = document.createElement('div');
692
- card.className = 'movie-card';
693
- card.onclick = () => openModal(movie);
694
-
695
- const img = document.createElement('img');
696
- img.src = movie.image;
697
- img.alt = movie.title;
698
- img.loading = "lazy";
699
-
700
- const info = document.createElement('div');
701
- info.className = 'card-info';
702
-
703
- const title = document.createElement('div');
704
- title.className = 'card-title';
705
- title.innerText = movie.title;
706
-
707
- const meta = document.createElement('div');
708
- meta.className = 'card-meta';
709
- meta.innerHTML = `<span>98% Match</span> <span>${movie.year}</span>`;
710
-
711
- info.appendChild(title);
712
- info.appendChild(meta);
713
- card.appendChild(img);
714
- card.appendChild(info);
715
-
716
- return card;
717
- }
718
-
719
- // --- RECHERCHE ---
720
-
721
- // Activer la barre de recherche
722
- searchIcon.addEventListener('click', () => {
723
- searchBox.classList.toggle('active');
724
- if(searchBox.classList.contains('active')) {
725
- searchInput.focus();
726
- }
727
- });
728
-
729
- // Logique de recherche
730
- searchInput.addEventListener('input', (e) => {
731
- const query = e.target.value.toLowerCase();
732
-
733
- if (query.length > 0) {
734
- displaySearchResults(query);
735
- } else {
736
- initCategories(); // Retour à l'accueil si vide
737
- heroSection.style.display = 'flex'; // Réafficher le hero
738
- }
739
- });
740
-
741
- function displaySearchResults(query) {
742
- // Cacher le hero pour une meilleure lisibilité
743
- heroSection.style.display = 'none';
744
- mainContent.innerHTML = '';
745
-
746
- const results = database.filter(movie =>
747
- movie.title.toLowerCase().includes(query)
748
- );
749
-
750
- if (results.length === 0) {
751
- mainContent.innerHTML = '<h3 style="color:#666; margin-top:50px;">Aucun résultat trouvé.</h3>';
752
- return;
753
- }
754
-
755
- const section = document.createElement('div');
756
- section.className = 'category-section';
757
-
758
- const title = document.createElement('h3');
759
- title.className = 'category-title';
760
- title.innerText = `Résultats pour "${query}"`;
761
-
762
- const row = document.createElement('div');
763
- row.className = 'movies-row';
764
-
765
- results.forEach(movie => {
766
- row.appendChild(createMovieCard(movie));
767
- });
768
-
769
- section.appendChild(title);
770
- section.appendChild(row);
771
- mainContent.appendChild(section);
772
- }
773
-
774
- // --- MODAL & PLAYER ---
775
-
776
- function openModal(movie) {
777
- modalTitle.innerText = movie.title;
778
- modalDesc.innerText = movie.desc;
779
- modalYear.innerText = movie.year;
780
- modalBgImg.src = movie.image;
781
-
782
- // Reset player state
783
- videoStatus.style.display = 'none';
784
-
785
- modal.classList.add('active');
786
- }
787
-
788
- function closeModal() {
789
- modal.classList.remove('active');
790
- // Arrêter la vidéo si elle était en lecture (simulation)
791
- videoStatus.innerText = "";
792
- videoStatus.style.display = 'none';
793
- }
794
-
795
- // Fermer la modale si on clique en dehors
796
- modal.addEventListener('click', (e) => {
797
- if (e.target === modal) {
798
- closeModal();
799
- }
800
- });
801
-
802
- // Gestion des boutons Hero
803
- function playHeroMovie() {
804
- const id = parseInt(heroSection.dataset.id);
805
- const movie = database.find(m => m.id === id);
806
- if(movie) openModal(movie);
807
- }
808
 
809
- function showHeroDetails() {
810
- playHeroMovie(); // Pour simplifier, les deux font la même chose ici
811
- }
812
-
813
- // Simulation de lecture
814
- function startFakePlayback() {
815
- const status = document.getElementById('video-status');
816
- const btn = document.querySelector('.play-btn-large');
817
-
818
- btn.style.display = 'none';
819
- status.style.display = 'block';
820
- status.innerText = "Chargement du serveur...";
821
-
822
- setTimeout(() => {
823
- status.innerText = "Buffering...";
824
- }, 1000);
825
-
826
- setTimeout(() => {
827
- status.innerText = "⚠ Ceci est une démo UI. Aucun flux vidéo réel n'est disponible.";
828
- status.style.color = "#e50914";
829
- status.style.fontWeight = "bold";
830
-
831
- // Simuler l'interface de lecture
832
- document.getElementById('modal-video-area').style.backgroundColor = "#000";
833
- document.getElementById('modal-bg-img').style.opacity = "0";
834
- }, 2500);
835
- }
836
-
837
- // --- EFFET SCROLL HEADER ---
838
- window.addEventListener('scroll', () => {
839
- if (window.scrollY > 50) {
840
- header.classList.add('scrolled');
841
- } else {
842
- header.classList.remove('scrolled');
843
- }
844
- });
845
-
846
- // Lancer l'app
847
- initHero();
848
- initCategories();
849
-
850
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
851
  </body>
852
  </html>
 
1
  <!DOCTYPE html>
2
  <html lang="fr">
3
+
4
  <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>StreamFree - Films, Séries & Animes en HD</title>
8
+
9
+ <!-- Police Google Fonts (Inter) -->
10
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;900&display=swap" rel="stylesheet">
11
+
12
+ <!-- Icônes (Phosphor Icons) -->
13
+ <script src="https://unpkg.com/@phosphor-icons/web"></script>
14
+
15
+ <style>
16
+ /* --- VARIABLES & RESET --- */
17
+ :root {
18
+ --primary: #E50914; /* Rouge Netflix */
19
+ --primary-hover: #b20710;
20
+ --bg-dark: #141414;
21
+ --bg-card: #1f1f1f;
22
+ --text-white: #ffffff;
23
+ --text-gray: #a3a3a3;
24
+ --gradient-dark: linear-gradient(to top, #141414 10%, transparent 90%);
25
+ --shadow-card: 0 4px 6px rgba(0,0,0,0.3);
26
+ --transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
27
+ --header-height: 80px;
28
+ }
29
+
30
+ * {
31
+ margin: 0;
32
+ padding: 0;
33
+ box-sizing: border-box;
34
+ }
35
+
36
+ body {
37
+ font-family: 'Inter', sans-serif;
38
+ background-color: var(--bg-dark);
39
+ color: var(--text-white);
40
+ overflow-x: hidden;
41
+ -webkit-font-smoothing: antialiased;
42
+ }
43
+
44
+ a { text-decoration: none; color: inherit; }
45
+ ul { list-style: none; }
46
+ button { border: none; outline: none; cursor: pointer; background: none; font-family: inherit; }
47
+
48
+ /* --- HEADER --- */
49
+ header {
50
+ position: fixed;
51
+ top: 0;
52
+ width: 100%;
53
+ height: var(--header-height);
54
+ display: flex;
55
+ justify-content: space-between;
56
+ align-items: center;
57
+ padding: 0 4%;
58
+ z-index: 1000;
59
+ transition: background-color 0.4s ease;
60
+ background: linear-gradient(to bottom, rgba(0,0,0,0.7) 10%, transparent);
61
+ }
62
+
63
+ header.scrolled {
64
+ background-color: #141414;
65
+ box-shadow: 0 2px 10px rgba(0,0,0,0.5);
66
+ }
67
+
68
+ .logo {
69
+ font-size: 1.8rem;
70
+ font-weight: 900;
71
+ color: var(--primary);
72
+ letter-spacing: -1px;
73
+ text-transform: uppercase;
74
+ margin-right: 40px;
75
+ }
76
+
77
+ .nav-menu {
78
+ display: flex;
79
+ gap: 25px;
80
+ }
81
+
82
+ .nav-link {
83
+ font-size: 0.9rem;
84
+ color: var(--text-white);
85
+ font-weight: 500;
86
+ transition: color 0.2s;
87
+ }
88
+
89
+ .nav-link:hover, .nav-link.active {
90
+ color: var(--text-gray);
91
+ font-weight: 700;
92
+ }
93
+
94
+ .header-right {
95
+ display: flex;
96
+ align-items: center;
97
+ gap: 20px;
98
+ }
99
+
100
+ /* Search Bar */
101
+ .search-container {
102
+ display: flex;
103
+ align-items: center;
104
+ background: rgba(0,0,0,0.5);
105
+ border: 1px solid rgba(255,255,255,0.3);
106
+ padding: 6px 12px;
107
+ border-radius: 20px;
108
+ transition: var(--transition);
109
+ }
110
+
111
+ .search-container:focus-within {
112
+ background: black;
113
+ border-color: var(--text-white);
114
+ }
115
+
116
+ .search-input {
117
+ background: transparent;
118
+ border: none;
119
+ color: white;
120
+ width: 0;
121
+ opacity: 0;
122
+ transition: var(--transition);
123
+ font-size: 0.9rem;
124
+ }
125
+
126
+ .search-container.open .search-input {
127
+ width: 200px;
128
+ opacity: 1;
129
+ margin-left: 8px;
130
+ }
131
+
132
+ .search-icon { font-size: 1.2rem; cursor: pointer; }
133
+
134
+ .user-profile {
135
+ width: 35px;
136
+ height: 35px;
137
+ border-radius: 6px;
138
+ background-image: url('https://picsum.photos/seed/user123/100/100');
139
+ background-size: cover;
140
+ cursor: pointer;
141
+ }
142
+
143
+ /* --- HERO SECTION --- */
144
+ .hero {
145
+ position: relative;
146
+ height: 85vh;
147
+ width: 100%;
148
+ background-size: cover;
149
+ background-position: center top;
150
+ display: flex;
151
+ align-items: center;
152
+ padding-left: 4%;
153
+ }
154
+
155
+ .hero-overlay {
156
+ position: absolute;
157
+ top: 0; left: 0; width: 100%; height: 100%;
158
+ background: linear-gradient(to right, rgba(20,20,20,0.9) 0%, rgba(20,20,20,0.6) 40%, transparent 100%),
159
+ linear-gradient(to top, #141414 0%, transparent 20%);
160
+ }
161
+
162
+ .hero-content {
163
+ position: relative;
164
+ z-index: 10;
165
+ max-width: 600px;
166
+ margin-top: 60px;
167
+ opacity: 0;
168
+ animation: fadeIn Up 1s forwards 0.5s;
169
+ }
170
+
171
+ .hero-badge {
172
+ display: inline-block;
173
+ background: rgba(255,255,255,0.2);
174
+ padding: 5px 10px;
175
+ border-radius: 4px;
176
+ font-size: 0.8rem;
177
+ font-weight: 600;
178
+ margin-bottom: 15px;
179
+ backdrop-filter: blur(5px);
180
+ }
181
+
182
+ .hero-title {
183
+ font-size: 4rem;
184
+ font-weight: 900;
185
+ line-height: 1;
186
+ margin-bottom: 20px;
187
+ text-shadow: 2px 2px 10px rgba(0,0,0,0.5);
188
+ }
189
+
190
+ .hero-desc {
191
+ font-size: 1.1rem;
192
+ line-height: 1.6;
193
+ margin-bottom: 30px;
194
+ color: #ddd;
195
+ text-shadow: 1px 1px 4px rgba(0,0,0,0.8);
196
+ }
197
+
198
+ .hero-buttons {
199
+ display: flex;
200
+ gap: 15px;
201
+ }
202
+
203
+ .btn {
204
+ padding: 12px 30px;
205
+ border-radius: 5px;
206
+ font-weight: 600;
207
+ font-size: 1.1rem;
208
+ display: flex;
209
+ align-items: center;
210
+ gap: 10px;
211
+ transition: var(--transition);
212
+ }
213
+
214
+ .btn-primary {
215
+ background-color: var(--text-white);
216
+ color: black;
217
+ }
218
+ .btn-primary:hover { background-color: rgba(255,255,255,0.75); }
219
+
220
+ .btn-secondary {
221
+ background-color: rgba(109,109,110,0.7);
222
+ color: white;
223
+ backdrop-filter: blur(4px);
224
+ }
225
+ .btn-secondary:hover { background-color: rgba(109,109,110,0.4); }
226
+
227
+ /* --- MAIN CONTENT (SLIDERS) --- */
228
+ main {
229
+ position: relative;
230
+ z-index: 20;
231
+ margin-top: -100px; /* Chevauchement */
232
+ padding-bottom: 50px;
233
+ }
234
+
235
+ .category-row {
236
+ margin-bottom: 40px;
237
+ padding-left: 4%;
238
+ }
239
+
240
+ .row-header {
241
+ font-size: 1.4rem;
242
+ font-weight: 600;
243
+ margin-bottom: 15px;
244
+ color: #e5e5e5;
245
+ display: flex;
246
+ align-items: center;
247
+ gap: 10px;
248
+ }
249
+
250
+ .row-header:hover { color: white; cursor: pointer; }
251
+
252
+ .slider-container {
253
+ display: flex;
254
+ gap: 10px;
255
+ overflow-x: auto;
256
+ padding-right: 4%;
257
+ padding-bottom: 30px; /* Espace pour l'hover */
258
+ scroll-behavior: smooth;
259
+ }
260
+
261
+ .slider-container::-webkit-scrollbar { height: 0px; } /* Cacher scrollbar */
262
+
263
+ .movie-card {
264
+ flex: 0 0 auto;
265
+ width: 220px;
266
+ height: 330px;
267
+ border-radius: 6px;
268
+ overflow: hidden;
269
+ position: relative;
270
+ cursor: pointer;
271
+ transition: transform 0.3s ease, z-index 0s 0.3s;
272
+ background-color: #222;
273
+ }
274
+
275
+ .movie-card:hover {
276
+ transform: scale(1.15);
277
+ z-index: 100;
278
+ box-shadow: 0 10px 20px rgba(0,0,0,0.7);
279
+ transition: transform 0.3s ease, z-index 0s;
280
+ }
281
+
282
+ .card-img {
283
+ width: 100%;
284
+ height: 100%;
285
+ object-fit: cover;
286
+ }
287
+
288
+ .card-details {
289
+ position: absolute;
290
+ bottom: 0; left: 0; width: 100%;
291
+ padding: 15px;
292
+ background: linear-gradient(to top, rgba(0,0,0,0.95), transparent);
293
+ opacity: 0;
294
+ transition: opacity 0.3s;
295
+ }
296
+
297
+ .movie-card:hover .card-details { opacity: 1; }
298
+
299
+ .card-title {
300
+ font-size: 0.95rem;
301
+ font-weight: 700;
302
+ margin-bottom: 5px;
303
+ }
304
+
305
+ .card-meta {
306
+ display: flex;
307
+ justify-content: space-between;
308
+ font-size: 0.75rem;
309
+ color: #46d369;
310
+ font-weight: 600;
311
+ }
312
+
313
+ .match-score { color: #46d369; }
314
+ .hd-badge { border: 1px solid #666; padding: 0 4px; color: #ddd; }
315
+
316
+ /* --- MODAL PLAYER --- */
317
+ .modal-backdrop {
318
+ position: fixed;
319
+ top: 0; left: 0; width: 100%; height: 100%;
320
+ background: rgba(0,0,0,0.8);
321
+ z-index: 2000;
322
+ display: flex;
323
+ justify-content: center;
324
+ align-items: center;
325
+ opacity: 0;
326
+ pointer-events: none;
327
+ transition: opacity 0.3s;
328
+ }
329
+
330
+ .modal-backdrop.active {
331
+ opacity: 1;
332
+ pointer-events: all;
333
+ }
334
+
335
+ .modal-container {
336
+ background: #181818;
337
+ width: 90%;
338
+ max-width: 900px;
339
+ border-radius: 10px;
340
+ overflow: hidden;
341
+ position: relative;
342
+ transform: scale(0.9);
343
+ transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
344
+ box-shadow: 0 15px 40px rgba(0,0,0,0.6);
345
+ }
346
+
347
+ .modal-backdrop.active .modal-container { transform: scale(1); }
348
+
349
+ .close-btn {
350
+ position: absolute;
351
+ top: 15px; right: 15px;
352
+ width: 40px; height: 40px;
353
+ background: rgba(0,0,0,0.6);
354
+ color: white;
355
+ border-radius: 50%;
356
+ display: flex; justify-content: center; align-items: center;
357
+ cursor: pointer;
358
+ z-index: 20;
359
+ font-size: 1.2rem;
360
+ transition: background 0.2s;
361
+ }
362
+ .close-btn:hover { background: white; color: black; }
363
+
364
+ .player-area {
365
+ width: 100%;
366
+ aspect-ratio: 16/9;
367
+ background: black;
368
+ position: relative;
369
+ display: flex;
370
+ justify-content: center;
371
+ align-items: center;
372
+ }
373
 
374
+ .player-bg {
375
+ position: absolute; top:0; left:0; width:100%; height:100%;
376
+ object-fit: cover; opacity: 0.4;
377
+ }
378
+
379
+ .play-overlay-btn {
380
+ font-size: 5rem;
381
+ color: var(--primary);
382
+ cursor: pointer;
383
+ transition: transform 0.2s;
384
+ filter: drop-shadow(0 0 10px rgba(0,0,0,0.5));
385
+ }
386
+ .play-overlay-btn:hover { transform: scale(1.1); color: white; }
387
+
388
+ .modal-info { padding: 25px; }
389
+ .modal-title { font-size: 2rem; font-weight: 800; margin-bottom: 10px; }
390
+ .modal-meta-line { display: flex; gap: 15px; color: var(--text-gray); font-size: 0.9rem; margin-bottom: 15px; align-items: center; }
391
+ .modal-desc { line-height: 1.6; color: #fff; font-size: 1rem; max-width: 90%; }
392
+
393
+ /* --- FOOTER --- */
394
+ footer {
395
+ margin-top: 80px;
396
+ padding: 50px 4%;
397
+ text-align: center;
398
+ color: var(--text-gray);
399
+ font-size: 0.9rem;
400
+ border-top: 1px solid #333;
401
+ }
402
+ .footer-link { color: var(--primary); text-decoration: underline; margin-top: 10px; display: inline-block; }
403
+
404
+ /* --- RESPONSIVE --- */
405
+ @media (max-width: 768px) {
406
+ .hero-title { font-size: 2.5rem; }
407
+ .nav-menu { display: none; } /* Simplification mobile */
408
+ .search-container.open .search-input { width: 140px; }
409
+ .movie-card { width: 160px; height: 240px; }
410
+ .hero { height: 60vh; }
411
+ }
412
+
413
+ /* Animations */
414
+ @keyframes fadeInUp {
415
+ from { opacity: 0; transform: translateY(20px); }
416
+ to { opacity: 1; transform: translateY(0); }
417
+ }
418
+ </style>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
419
  </head>
420
+
421
  <body>
422
 
423
+ <!-- Header -->
424
+ <header id="header">
425
+ <div style="display: flex; align-items: center;">
426
+ <div class="logo">StreamFree</div>
427
+ <nav>
428
+ <ul class="nav-menu">
429
+ <li><a href="#" class="nav-link active" onclick="resetHome()">Accueil</a></li>
430
+ <li><a href="#" class="nav-link">Séries</a></li>
431
+ <li><a href="#" class="nav-link">Films</a></li>
432
+ <li><a href="#" class="nav-link">Animes</a></li>
433
+ <li><a href="#" class="nav-link">Ma Liste</a></li>
434
  </ul>
435
+ </nav>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
436
  </div>
437
 
438
+ <div class="header-right">
439
+ <div class="search-container" id="search-box">
440
+ <i class="ph ph-magnifying-glass search-icon" id="search-trigger"></i>
441
+ <input type="text" class="search-input" id="search-input" placeholder="Titres, genres, personnes...">
442
+ </div>
443
+ <div class="user-profile"></div>
444
+ </div>
445
+ </header>
446
+
447
+ <!-- Hero Section -->
448
+ <section class="hero" id="hero">
449
+ <div class="hero-overlay"></div>
450
+ <div class="hero-content">
451
+ <span class="hero-badge" id="hero-badge">N°1 en France aujourd'hui</span>
452
+ <h1 class="hero-title" id="hero-title">Chargement...</h1>
453
+ <p class="hero-desc" id="hero-desc">...</p>
454
+ <div class="hero-buttons">
455
+ <button class="btn btn-primary" onclick="playHero()">
456
+ <i class="ph-fill ph-play"></i> Lecture
457
+ </button>
458
+ <button class="btn btn-secondary" onclick="playHero()">
459
+ <i class="ph ph-info"></i> Plus d'infos
460
+ </button>
461
+ </div>
462
+ </div>
463
+ </section>
464
+
465
+ <!-- Main Content -->
466
+ <main id="main-content">
467
+ <!-- Catégories générées par JS -->
468
+ </main>
469
+
470
+ <!-- Modal Player -->
471
+ <div class="modal-backdrop" id="modal">
472
+ <div class="modal-container">
473
+ <div class="close-btn" onclick="closeModal()">
474
+ <i class="ph ph-x"></i>
475
+ </div>
476
+
477
+ <div class="player-area">
478
+ <img src="" class="player-bg" id="modal-bg">
479
+ <i class="ph-fill ph-play-circle play-overlay-btn" id="modal-play-btn" onclick="startStream()"></i>
480
+ <div id="stream-msg" style="display:none; color:white; font-weight:bold; font-size:1.2rem; background:rgba(0,0,0,0.8); padding:10px 20px; border-radius:5px;"></div>
481
+ </div>
482
+
483
+ <div class="modal-info">
484
+ <h2 class="modal-title" id="modal-title">Titre</h2>
485
+ <div class="modal-meta-line">
486
+ <span class="match-score" id="modal-match">98% Match</span>
487
+ <span id="modal-year">2023</span>
488
+ <span class="hd-badge">HD</span>
489
+ <span id="modal-duration">2h 15m</span>
490
+ </div>
491
+ <p class="modal-desc" id="modal-desc">Description...</p>
492
+ </div>
493
+ </div>
494
+ </div>
495
+
496
+ <!-- Footer -->
497
+ <footer>
498
+ <p>© 2024 StreamFree. Application de démonstration UI. Aucun contenu réel n'est hébergé.</p>
499
+ <p>Les images sont générées automatiquement.</p>
500
+ <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" class="footer-link">
501
+ Built with anycoder
502
+ </a>
503
+ </footer>
504
+
505
+ <script>
506
+ // --- BASE DE DONNÉES ÉTENDUE (Simulant un catalogue réel) ---
507
+ const catalog = [
508
+ // Anime
509
+ { id: 1, title: "Naruto Shippuden", type: "Anime", year: 2007, match: 99, desc: "Naruto Uzumaki continue son voyage pour devenir Hokage, tout en affrontant l'organisation Akatsuki.", img: "https://placehold.co/600x900/FF8C00/white?text=Naruto", hero: true },
510
+ { id: 2, title: "One Piece", type: "Anime", year: 1999, match: 99, desc: "Luffy et son équipage des Chapeaux de Paille naviguent vers la Grand Line pour trouver le One Piece.", img: "https://placehold.co/600x900/1E90FF/white?text=One+Piece", hero: false },
511
+ { id: 3, title: "Jujutsu Kaisen", type: "Anime", year: 2020, match: 98, desc: "Yuji Itadori avalé un doigt maudit et devient l'hôte du roi des malédictions, Sukuna.", img: "https://placehold.co/600x900/800080/white?text=JJK", hero: false },
512
+ { id: 4, title: "Demon Slayer", type: "Anime", year: 2019, match: 97, desc: "Tanjiro Kamado devient un pourfendeur de démons pour sauver sa sœur transformée en démon.", img: "https://placehold.co/600x900/006400/white?text=Demon+Slayer", hero: false },
513
+ { id: 5, title: "Attack on Titan", type: "Anime", year: 2013, match: 99, desc: "L'humanité se bat pour survivre derrière des murs géants contre des Titans anthropophages.", img: "https://placehold.co/600x900/2F4F4F/white?text=AOT", hero: false },
514
+ { id: 6, title: "Dragon Ball Super", type: "Anime", year: 2015, match: 95, desc: "Goku et ses amis défendent l'univers contre des dieux de la destruction puissants.", img: "https://placehold.co/600x900/FFD700/white?text=DB+Super", hero: false },
515
+
516
+ // Séries TV
517
+ { id: 7, title: "Breaking Bad", type: "Série", year: 2008, match: 99, desc: "Un professeur de chimie atteint d'un cancer se lance dans la fabrication de méthamphétamine.", img: "https://placehold.co/600x900/228B22/white?text=Breaking+Bad", hero: false },
518
+ { id: 8, title: "Stranger Things", type: "Série", year: 2016, match: 96, desc: "Un groupe d'enfants découvre des forces surnaturelles et une fille aux pouvoirs psychiques.", img: "https://placehold.co/600x900/8B0000/white?text=Stranger+Things", hero: true },
519
+ { id: 9, title: "The Last of Us", type: "Série", year: 2023, match: 98, desc: "Joel, un survivant endurci, est chargé d'escorter Ellie, une adolescente, à travers une Amérique post-apocalyptique.", img: "https://placehold.co/600x900/556B2F/white?text=TLOU", hero: false },
520
+ { id: 10, title: "Wednesday", type: "Série", year: 2022, match: 94, desc: "Wednesday Addams enquête sur des meurtres tout en naviguant dans sa nouvelle école.", img: "https://placehold.co/600x900/000000/white?text=Wednesday", hero: false },
521
+ { id: 11, title: "Squid Game", type: "Série", year: 2021, match: 95, desc: "Des joueurs désespérés risquent leur vie dans un jeu mortel d'enfants pour une grosse somme d'argent.", img: "https://placehold.co/600x900/FF69B4/white?text=Squid+Game", hero: false },
522
+
523
+ // Films
524
+ { id: 12, title: "Spider-Man: No Way Home", type: "Film", year: 2021, match: 98, desc: "Peter Parker demande l'aide de Doctor Strange pour faire oublier son identité secrète au monde entier.", img: "https://placehold.co/600x900/DC143C/white?text=Spiderman", hero: false },
525
+ { id: 13, title: "Oppenheimer", type: "Film", year: 2023, match: 97, desc: "L'histoire du physicien américain J. Robert Oppenheimer et son rôle dans le développement de la bombe atomique.", img: "https://placehold.co/600x900/191970/white?text=Oppenheimer", hero: true },
526
+ { id: 14, title: "Avatar 2", type: "Film", year: 2022, match: 95, desc: "Jake Sully et Ney'tiri font tout pour rester ensemble et protéger leur famille sur la planète Pandora.", img: "https://placehold.co/600x900/008080/white?text=Avatar+2", hero: false },
527
+ { id: 15, title: "The Batman", type: "Film", year: 2022, match: 96, desc: "Batman enquête sur la corruption à Gotham City tout en poursuivant le Riddler.", img: "https://placehold.co/600x900/2c3e50/white?text=The+Bats", hero: false },
528
+ { id: 16, title: "Dune", type: "Film", year: 2021, match: 97, desc: "Paul Atreides, un jeune brillant, doit se rendre sur la planète la plus dangereuse de l'univers.", img: "https://placehold.co/600x900/DAA520/white?text=Dune", hero: false },
529
+ { id: 17, title: "John Wick 4", type: "Film", year: 2023, match: 96, desc: "John Wick découvre un chemin pour vaincre La Table Haute, mais doit affronter un nouvel ennemi.", img: "https://placehold.co/600x900/696969/white?text=John+Wick", hero: false }
530
+ ];
531
+
532
+ // --- DOM ELEMENTS ---
533
+ const header = document.getElementById('header');
534
+ const searchBox = document.getElementById('search-box');
535
+ const searchTrigger = document.getElementById('search-trigger');
536
+ const searchInput = document.getElementById('search-input');
537
+ const hero = document.getElementById('hero');
538
+ const mainContent = document.getElementById('main-content');
539
+ const modal = document.getElementById('modal');
540
+
541
+ // --- INITIALIZATION ---
542
+
543
+ function init() {
544
+ setupHero();
545
+ renderCategories();
546
+ setupEventListeners();
547
+ }
548
+
549
+ // 1. Configurer le Hero (Film aléatoire ou marqué 'hero')
550
+ function setupHero() {
551
+ const heroMovies = catalog.filter(m => m.hero);
552
+ const movie = heroMovies[Math.floor(Math.random() * heroMovies.length)];
553
+
554
+ // Utilisation d'une image haute qualité placeholder
555
+ hero.style.backgroundImage = `url('https://placehold.co/1920x1080/111/white?text=${encodeURIComponent(movie.title)}')`;
556
+ document.getElementById('hero-title').innerText = movie.title;
557
+ document.getElementById('hero-desc').innerText = movie.desc;
558
+ hero.dataset.id = movie.id;
559
+ }
560
+
561
+ // 2. Rendu des Catégories
562
+ function renderCategories() {
563
+ mainContent.innerHTML = '';
564
+
565
+ // On crée des catégories virtuelles basées sur les types
566
+ const categories = [
567
+ { name: "Tendances Actuelles", filter: m => m.match >= 97 },
568
+ { name: "Animes Populaires", filter: m => m.type === "Anime" },
569
+ { name: "Séries TV Binge-watch", filter: m => m.type === "Série" },
570
+ { name: "Films au Cinéma", filter: m => m.type === "Film" }
571
+ ];
572
+
573
+ categories.forEach(cat => {
574
+ const movies = catalog.filter(cat.filter);
575
+ if(movies.length > 0) {
576
+ createSection(cat.name, movies);
577
+ }
578
+ });
579
+ }
580
+
581
+ // Créer une section HTML
582
+ function createSection(title, movies) {
583
+ const section = document.createElement('section');
584
+ section.className = 'category-row';
585
+
586
+ const header = document.createElement('div');
587
+ header.className = 'row-header';
588
+ header.innerHTML = `${title} <i class="ph ph-caret-right"></i>`;
589
+
590
+ const slider = document.createElement('div');
591
+ slider.className = 'slider-container';
592
+
593
+ movies.forEach(movie => {
594
+ const card = createCard(movie);
595
+ slider.appendChild(card);
596
+ });
597
+
598
+ section.appendChild(header);
599
+ section.appendChild(slider);
600
+ mainContent.appendChild(section);
601
+ }
602
+
603
+ // Créer une carte
604
+ function createCard(movie) {
605
+ const card = document.createElement('div');
606
+ card.className = 'movie-card';
607
+ card.onclick = () => openModal(movie);
608
+
609
+ card.innerHTML = `
610
+ <img src="${movie.img}" class="card-img" alt="${movie.title}" loading="lazy">
611
+ <div class="card-details">
612
+ <div class="card-title">${movie.title}</div>
613
+ <div class="card-meta">
614
+ <span class="match-score">${movie.match}% Match</span>
615
+ <span class="hd-badge">HD</span>
616
+ </div>
617
+ </div>
618
+ `;
619
+ return card;
620
+ }
621
+
622
+ // --- SEARCH FUNCTIONALITY ---
623
+
624
+ function setupEventListeners() {
625
+ // Scroll Header Effect
626
+ window.addEventListener('scroll', () => {
627
+ if(window.scrollY > 50) header.classList.add('scrolled');
628
+ else header.classList.remove('scrolled');
629
+ });
630
+
631
+ // Search Toggle
632
+ searchTrigger.addEventListener('click', () => {
633
+ searchBox.classList.toggle('open');
634
+ if(searchBox.classList.contains('open')) searchInput.focus();
635
+ });
636
+
637
+ // Search Input
638
+ searchInput.addEventListener('input', (e) => {
639
+ const query = e.target.value.toLowerCase().trim();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
640
 
641
+ if(query.length > 0) {
642
+ performSearch(query);
643
+ } else {
644
+ resetHome();
645
+ }
646
+ });
647
+
648
+ // Close modal on outside click
649
+ modal.addEventListener('click', (e) => {
650
+ if(e.target === modal) closeModal();
651
+ });
652
+ }
653
+
654
+ function performSearch(query) {
655
+ // Cacher le Hero
656
+ hero.style.display = 'none';
657
+ mainContent.innerHTML = '';
658
+
659
+ // Filtrer
660
+ const results = catalog.filter(m =>
661
+ m.title.toLowerCase().includes(query) ||
662
+ m.type.toLowerCase().includes(query) ||
663
+ m.desc.toLowerCase().includes(query)
664
+ );
665
+
666
+ if(results.length === 0) {
667
+ mainContent.innerHTML = `
668
+ <div style="text-align:center; padding: 50px; color:#666;">
669
+ <h2>Aucun résultat pour "${query}"</h2>
670
+ <p>Essayez "Naruto", "Série", ou "Marvel".</p>
671
+ </div>
672
+ `;
673
+ return;
674
+ }
675
+
676
+ createSection(`Résultats pour "${query}"`, results);
677
+ }
678
+
679
+ function resetHome() {
680
+ hero.style.display = 'flex';
681
+ renderCategories();
682
+ searchBox.classList.remove('open');
683
+ searchInput.value = '';
684
+ }
685
+
686
+ // --- PLAYER LOGIC ---
687
+
688
+ function openModal(movie) {
689
+ document.getElementById('modal-title').innerText = movie.title;
690
+ document.getElementById('modal-desc').innerText = movie.desc;
691
+ document.getElementById('modal-year').innerText = movie.year;
692
+ document.getElementById('modal-match').innerText = `${movie.match}% Match`;
693
+ document.getElementById('modal-bg').src = movie.img;
694
+
695
+ // Reset Player UI
696
+ document.getElementById('modal-play-btn').style.display = 'block';
697
+ document.getElementById('stream-msg').style.display = 'none';
698
+
699
+ modal.classList.add('active');
700
+ }
701
+
702
+ function closeModal() {
703
+ modal.classList.remove('active');
704
+ }
705
+
706
+ function playHero() {
707
+ const id = parseInt(hero.dataset.id);
708
+ const movie = catalog.find(m => m.id === id);
709
+ if(movie) openModal(movie);
710
+ }
711
+
712
+ function startStream() {
713
+ const btn = document.getElementById('modal-play-btn');
714
+ const msg = document.getElementById('stream-msg');
715
+ const bg = document.getElementById('modal-bg');
716
+
717
+ btn.style.display = 'none';
718
+ msg.style.display = 'block';
719
+ msg.innerText = "Connexion au serveur sécurisé...";
720
+
721
+ setTimeout(() => {
722
+ msg.innerText = "Chargement du flux vidéo (HD)...";
723
+ }, 1000);
724
+
725
+ setTimeout(() => {
726
+ msg.innerText = "Désolé, ceci est une démo UI. Aucun flux vidéo réel n'est connecté.";
727
+ msg.style.color = "#e50914";
728
+ bg.style.opacity = "0"; // Dim background to focus on text
729
+ }, 2500);
730
+ }
731
+
732
+ // Démarrage
733
+ init();
734
+
735
+ </script>
736
  </body>
737
  </html>