Guymy97 commited on
Commit
cdd4e94
·
verified ·
1 Parent(s): 9904c1c

Update via AnyCoder

Browse files
Files changed (1) hide show
  1. index.html +94 -116
index.html CHANGED
@@ -32,6 +32,7 @@
32
  --blur: 14px;
33
  --gap: clamp(14px, 2vw, 22px);
34
  --card-w: 220px;
 
35
  }
36
 
37
  @media (prefers-color-scheme: light) {
@@ -66,11 +67,11 @@
66
  border-bottom: 1px solid color-mix(in oklab, var(--txt) 8%, transparent);
67
  }
68
  .appbar-inner {
69
- max-width: 1200px; margin: 0 auto;
70
  padding: 14px clamp(14px, 3vw, 28px);
71
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 12px;
72
  }
73
- .brand { display: flex; align-items: center; gap: 12px; }
74
  .logo { width: 40px; height: 40px; background: linear-gradient(135deg, var(--primary), var(--accent)); border-radius: 14px; box-shadow: var(--shadow); position: relative; isolation: isolate; }
75
  .logo::after { content: ""; position: absolute; inset: 2px; background: conic-gradient(from 180deg at 50% 50%, rgba(255,255,255,.18), transparent 30%, rgba(255,255,255,.18) 60%, transparent 85%); mix-blend-mode: overlay; border-radius: 12px; filter: blur(6px); }
76
  .brand h1 { margin: 0; font-size: clamp(16px, 2.3vw, 20px); letter-spacing: .3px; font-weight: 800; }
@@ -90,8 +91,8 @@
90
  .theme-toggle { width: 42px; height: 42px; border-radius: 12px; display: grid; place-items: center; border: 1px solid color-mix(in oklab, var(--txt) 8%, transparent); background: linear-gradient(180deg, color-mix(in oklab, var(--surface) 86%, transparent), transparent); cursor: pointer; color: var(--muted); }
91
 
92
  main {
93
- max-width: 1200px; margin: 0 auto; padding: clamp(18px, 3vw, 28px);
94
- display: grid; grid-template-columns: 1fr; gap: var(--gap);
95
  }
96
 
97
  .card {
@@ -181,7 +182,7 @@
181
 
182
  .empty { padding: 30px; text-align: center; color: var(--muted); border: 1px dashed color-mix(in oklab, var(--txt) 14%, transparent); border-radius: var(--radius-xl); background: linear-gradient(180deg, color-mix(in oklab, var(--surface) 86%, transparent), transparent); }
183
 
184
- footer { max-width: 1200px; margin: 20px auto 60px; padding: 0 clamp(18px, 3vw, 28px); color: var(--muted); font-size: 12px; display: grid; gap: 10px; }
185
  .credits { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
186
  .tag { border: 1px solid color-mix(in oklab, var(--txt) 10%, transparent); border-radius: 999px; padding: 6px 10px; background: color-mix(in oklab, var(--bg-soft) 60%, transparent); }
187
 
@@ -287,22 +288,58 @@
287
  .ia-status { font-size: 12px; color: var(--muted); }
288
  .kbd { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 11px; border: 1px solid color-mix(in oklab, var(--txt) 16%, transparent); border-bottom-width: 3px; background: color-mix(in oklab, var(--bg-soft) 70%, transparent); padding: 2px 6px; border-radius: 6px; color: var(--txt); }
289
 
290
- /* Stick catalog toolbar when IA opened on mobile (avoid overlay) */
291
- @media (max-width: 640px) {
292
- .ia-results { max-height: 52vh; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
293
  }
 
294
  </style>
295
  </head>
296
  <body>
297
  <header class="appbar">
298
  <div class="appbar-inner">
299
- <div class="brand">
300
  <div class="logo" aria-hidden="true"></div>
301
  <div>
302
  <h1>NeoIPTV</h1>
303
  <small>Connexion & Catalogue</small>
304
  </div>
305
- </div>
306
 
307
  <div class="top-actions">
308
  <a href="#" id="scanBtn"><i class='bx bx-qr-scan'></i> Scanner QR</a>
@@ -347,7 +384,8 @@
347
  </div>
348
  </div>
349
 
350
- <section id="grid-connect" class="card" aria-label="Connexion" style="padding: clamp(16px, 2.5vw, 22px);">
 
351
  <div class="connect-wrap">
352
  <div class="connect-panel">
353
  <div class="connect-tabs" role="tablist" aria-label="Modes de connexion">
@@ -485,112 +523,52 @@
485
  </div>
486
  </section>
487
 
488
- <div id="grid-live" class="grid hidden" role="region" aria-label="Chaînes en direct"></div>
489
- <div id="grid-vod" class="grid hidden" role="region" aria-label="Films VOD"></div>
490
- <div id="grid-series" class="grid hidden" role="region" aria-label="Séries TV"></div>
491
- <div id="grid-favs" class="grid hidden" role="region" aria-label="Favoris">
492
- <div class="empty" id="emptyFavs">
493
- <i class='bx bx-star' style="font-size: 32px;"></i>
494
- <div>Aucun favori pour le moment. Ajoutez-en depuis Direct, Films ou Séries.</div>
495
- </div>
496
- </div>
497
- <div id="grid-recent" class="grid hidden" role="region" aria-label="Récents">
498
- <div class="empty" id="emptyRecent">
499
- <i class='bx bx-time-five' style="font-size: 32px;"></i>
500
- <div>Votre historique de lecture apparaîtra ici.</div>
 
501
  </div>
502
- </div>
503
- </section>
504
- </main>
505
 
506
- <dialog class="player" id="playerDialog">
507
- <div class="player-card">
508
- <div class="player-top">
509
- <video id="video" controls playsinline></video>
510
- </div>
511
- <div class="player-bottom">
512
- <div class="player-actions">
513
- <span class="chip" id="chipTitle">Lecture</span>
514
- <span class="chip" id="chipType">Type</span>
515
- <span class="chip" id="chipRes">Auto</span>
516
- <button class="btn" id="pipBtn"><i class='bx bx-window-open'></i> PiP</button>
517
- <button class="btn" id="castBtn"><i class='bx bx-cast'></i> Cast</button>
518
- <button class="btn" id="muteBtn"><i class='bx bx-volume-full'></i> Mute</button>
519
- <button class="close" id="closePlayer"><i class='bx bx-x'></i> Fermer</button>
520
  </div>
521
- </div>
522
- </div>
523
- </dialog>
524
-
525
- <!-- Assistant IA floating button -->
526
- <button class="fab" id="aiFab" title="Assistant IA recommandations">
527
- <i class='bx bx-bot' style="font-size:24px"></i>
528
- </button>
529
-
530
- <!-- Assistant IA panel -->
531
- <section class="ia-panel hidden" id="aiPanel" aria-live="polite">
532
- <div class="ia-header">
533
- <i class='bx bx-bot' style="font-size:22px;color:var(--accent)"></i>
534
- <div>
535
- <div class="title">Assistant IA</div>
536
- <div class="muted">Demandez des sélections de films/séries selon vos envies</div>
537
- </div>
538
- <button id="aiClose" class="btn secondary" style="margin-left:auto"><i class='bx bx-chevron-down'></i> Fermer</button>
539
- </div>
540
-
541
- <div class="ia-actions">
542
- <button class="ia-chip" data-prompt="films d'action récents en 4K"><i class='bx bx-bolt'></i> Action 4K</button>
543
- <button class="ia-chip" data-prompt="comédies familiales"><i class='bx bx-happy'></i> Comédies familiales</button>
544
- <button class="ia-chip" data-prompt="séries de science-fiction"><i class='bx bx-planet'></i> Sci‑Fi</button>
545
- <button class="ia-chip" data-prompt="documentaires nature en HD"><i class='bx bx-leaf'></i> Nature</button>
546
- </div>
547
-
548
- <div class="ia-prompt">
549
- <input id="aiInput" placeholder="Ex: propose-moi des thrillers français récents" />
550
- <button id="aiAsk" class="btn"><i class='bx bx-magic-wand'></i> Générer</button>
551
- </div>
552
-
553
- <div class="ia-results" id="aiResults">
554
- <div class="empty"><i class='bx bx-sparkles' style="font-size:26px"></i>
555
- <div>Astuce: utilisez des mots-clés précis (genre, qualité, année, langue…).</div>
556
- </div>
557
- </div>
558
-
559
- <div class="ia-footer">
560
- <div class="ia-status" id="aiStatus">Prêt</div>
561
- <div class="ia-shortcuts">
562
- <span class="kbd">↵</span> pour générer • <span class="kbd">Esc</span> pour fermer
563
- </div>
564
- </div>
565
- </section>
566
 
567
- <footer>
568
- <div class="credits">
569
- <span class="tag">Démo UI IPTV</span>
570
- <span class="tag">HLS natif</span>
571
- <span class="tag">Responsive</span>
572
- </div>
573
- <div>Note: Cette application est une démonstration côté client. Branchez vos API et flux sécurisés côté serveur pour une vraie intégration.</div>
574
- </footer>
575
-
576
- <script>
577
- // Theme toggle
578
- const themeToggle = document.getElementById('themeToggle');
579
- const prefersDark = window.matchMedia('(prefers-color-scheme: dark)');
580
- function setTheme(mode) {
581
- document.documentElement.style.colorScheme = mode;
582
- themeToggle.innerHTML = mode === 'dark' ? "<i class='bx bx-moon'></i>" : "<i class='bx bx-sun'></i>";
583
- localStorage.setItem('theme', mode);
584
- }
585
- const savedTheme = localStorage.getItem('theme');
586
- setTheme(savedTheme || (prefersDark.matches ? 'dark' : 'light'));
587
- themeToggle.addEventListener('click', () => {
588
- const now = document.documentElement.style.colorScheme === 'dark' ? 'light' : 'dark';
589
- setTheme(now);
590
- });
591
-
592
- // Demo data
593
- const data = {
594
- live: [
595
- { id: 'l1', title: 'Infos 24', group: 'News', logo: 'https://picsum.photos/seed/news1/800/450', url: 'https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8', tag: 'HD' },
596
- { id: 'l2', title: 'Sport+ Arena', group: 'Sports', logo:
 
32
  --blur: 14px;
33
  --gap: clamp(14px, 2vw, 22px);
34
  --card-w: 220px;
35
+ --page-w: 1200px;
36
  }
37
 
38
  @media (prefers-color-scheme: light) {
 
67
  border-bottom: 1px solid color-mix(in oklab, var(--txt) 8%, transparent);
68
  }
69
  .appbar-inner {
70
+ max-width: var(--page-w); margin: 0 auto;
71
  padding: 14px clamp(14px, 3vw, 28px);
72
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 12px;
73
  }
74
+ .brand { display: flex; align-items: center; gap: 12px; text-decoration: none; color: inherit; }
75
  .logo { width: 40px; height: 40px; background: linear-gradient(135deg, var(--primary), var(--accent)); border-radius: 14px; box-shadow: var(--shadow); position: relative; isolation: isolate; }
76
  .logo::after { content: ""; position: absolute; inset: 2px; background: conic-gradient(from 180deg at 50% 50%, rgba(255,255,255,.18), transparent 30%, rgba(255,255,255,.18) 60%, transparent 85%); mix-blend-mode: overlay; border-radius: 12px; filter: blur(6px); }
77
  .brand h1 { margin: 0; font-size: clamp(16px, 2.3vw, 20px); letter-spacing: .3px; font-weight: 800; }
 
91
  .theme-toggle { width: 42px; height: 42px; border-radius: 12px; display: grid; place-items: center; border: 1px solid color-mix(in oklab, var(--txt) 8%, transparent); background: linear-gradient(180deg, color-mix(in oklab, var(--surface) 86%, transparent), transparent); cursor: pointer; color: var(--muted); }
92
 
93
  main {
94
+ max-width: var(--page-w); margin: 0 auto; padding: clamp(18px, 3vw, 28px);
95
+ display: grid; gap: var(--gap);
96
  }
97
 
98
  .card {
 
182
 
183
  .empty { padding: 30px; text-align: center; color: var(--muted); border: 1px dashed color-mix(in oklab, var(--txt) 14%, transparent); border-radius: var(--radius-xl); background: linear-gradient(180deg, color-mix(in oklab, var(--surface) 86%, transparent), transparent); }
184
 
185
+ footer { max-width: var(--page-w); margin: 20px auto 60px; padding: 0 clamp(18px, 3vw, 28px); color: var(--muted); font-size: 12px; display: grid; gap: 10px; }
186
  .credits { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
187
  .tag { border: 1px solid color-mix(in oklab, var(--txt) 10%, transparent); border-radius: 999px; padding: 6px 10px; background: color-mix(in oklab, var(--bg-soft) 60%, transparent); }
188
 
 
288
  .ia-status { font-size: 12px; color: var(--muted); }
289
  .kbd { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 11px; border: 1px solid color-mix(in oklab, var(--txt) 16%, transparent); border-bottom-width: 3px; background: color-mix(in oklab, var(--bg-soft) 70%, transparent); padding: 2px 6px; border-radius: 6px; color: var(--txt); }
290
 
291
+ /* Détail page (sheet) */
292
+ .detail-sheet {
293
+ position: fixed; inset: auto 0 0 0; z-index: 80;
294
+ width: min(980px, 96vw); margin: 0 auto;
295
+ border: 1px solid color-mix(in oklab, var(--txt) 10%, transparent);
296
+ border-bottom: none;
297
+ background: linear-gradient(180deg, color-mix(in oklab, var(--surface) 86%, transparent), transparent);
298
+ border-top-left-radius: 16px; border-top-right-radius: 16px;
299
+ box-shadow: 0 -20px 60px rgba(0,0,0,.35);
300
+ transform: translateY(110%); opacity: 0; transition: .35s ease;
301
+ }
302
+ .detail-sheet.open { transform: translateY(0); opacity: 1; }
303
+ .detail-header {
304
+ display: grid; grid-template-columns: 120px 1fr auto; gap: 14px; padding: 14px;
305
+ border-bottom: 1px solid color-mix(in oklab, var(--txt) 10%, transparent);
306
+ }
307
+ .detail-thumb { width: 120px; aspect-ratio: 16/9; border-radius: 12px; object-fit: cover; }
308
+ .detail-title { font-weight: 900; font-size: 18px; margin: 2px 0; }
309
+ .detail-sub { color: var(--muted); font-size: 13px; }
310
+ .detail-actions { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
311
+ .detail-body { padding: 14px; display: grid; gap: 12px; }
312
+ .pill { padding: 6px 10px; border-radius: 999px; background: color-mix(in oklab, var(--bg-soft) 60%, transparent); border: 1px solid color-mix(in oklab, var(--txt) 12%, transparent); color: var(--muted); font-weight: 700; font-size: 12px; }
313
+ .detail-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
314
+ @media (max-width: 700px){ .detail-header { grid-template-columns: 1fr auto; } .detail-thumb{ display:none;} .detail-grid{ grid-template-columns: 1fr; } }
315
+ .overlay {
316
+ position: fixed; inset: 0; background: rgba(0,0,0,.5); backdrop-filter: blur(4px);
317
+ opacity: 0; pointer-events: none; transition: .35s; z-index: 79;
318
+ }
319
+ .overlay.show { opacity: 1; pointer-events: all; }
320
+
321
+ /* Pagination */
322
+ .pager {
323
+ display: flex; justify-content: center; align-items: center; gap: 8px; padding: 8px;
324
+ }
325
+ .page-btn {
326
+ border-radius: 10px; padding: 8px 10px; cursor: pointer; font-weight: 800;
327
+ border: 1px solid color-mix(in oklab, var(--txt) 12%, transparent);
328
+ background: color-mix(in oklab, var(--bg-soft) 60%, transparent); color: var(--txt);
329
  }
330
+ .page-btn[disabled] { opacity: .5; cursor: not-allowed; }
331
  </style>
332
  </head>
333
  <body>
334
  <header class="appbar">
335
  <div class="appbar-inner">
336
+ <a class="brand" href="#" id="brandHome">
337
  <div class="logo" aria-hidden="true"></div>
338
  <div>
339
  <h1>NeoIPTV</h1>
340
  <small>Connexion & Catalogue</small>
341
  </div>
342
+ </a>
343
 
344
  <div class="top-actions">
345
  <a href="#" id="scanBtn"><i class='bx bx-qr-scan'></i> Scanner QR</a>
 
384
  </div>
385
  </div>
386
 
387
+ <!-- PAGE: Connexion -->
388
+ <section id="grid-connect" class="card page" aria-label="Connexion" style="padding: clamp(16px, 2.5vw, 22px);">
389
  <div class="connect-wrap">
390
  <div class="connect-panel">
391
  <div class="connect-tabs" role="tablist" aria-label="Modes de connexion">
 
523
  </div>
524
  </section>
525
 
526
+ <!-- PAGE: Direct -->
527
+ <section id="page-live" class="page hidden">
528
+ <div class="card" style="padding:14px; margin-bottom:12px;">
529
+ <div style="display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap">
530
+ <div style="display:flex;align-items:center;gap:10px">
531
+ <i class='bx bx-broadcast' style="color:var(--accent)"></i>
532
+ <strong>Direct Chaînes TV</strong>
533
+ </div>
534
+ <div class="pager">
535
+ <button class="page-btn" id="livePrev"><i class='bx bx-left-arrow'></i></button>
536
+ <span class="pill" id="livePageInfo">Page 1</span>
537
+ <button class="page-btn" id="liveNext"><i class='bx bx-right-arrow'></i></button>
538
+ </div>
539
+ </div>
540
  </div>
541
+ <div id="grid-live" class="grid" role="region" aria-label="Chaînes en direct"></div>
542
+ </section>
 
543
 
544
+ <!-- PAGE: Films -->
545
+ <section id="page-vod" class="page hidden">
546
+ <div class="card" style="padding:14px; margin-bottom:12px;">
547
+ <div style="display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap">
548
+ <div style="display:flex;align-items:center;gap:10px">
549
+ <i class='bx bx-film' style="color:var(--primary)"></i>
550
+ <strong>Films — VOD</strong>
551
+ </div>
552
+ <div class="pager">
553
+ <button class="page-btn" id="vodPrev"><i class='bx bx-left-arrow'></i></button>
554
+ <span class="pill" id="vodPageInfo">Page 1</span>
555
+ <button class="page-btn" id="vodNext"><i class='bx bx-right-arrow'></i></button>
556
+ </div>
557
+ </div>
558
  </div>
559
+ <div id="grid-vod" class="grid" role="region" aria-label="Films VOD"></div>
560
+ </section>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
561
 
562
+ <!-- PAGE: Séries -->
563
+ <section id="page-series" class="page hidden">
564
+ <div class="card" style="padding:14px; margin-bottom:12px;">
565
+ <div style="display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap">
566
+ <div style="display:flex;align-items:center;gap:10px">
567
+ <i class='bx bx-collection' style="color:var(--warn)"></i>
568
+ <strong>Séries TV</strong>
569
+ </div>
570
+ <div class="pager">
571
+ <button class="page-btn" id="seriesPrev"><i class='bx bx-left-arrow'></i></button>
572
+ <span class="pill" id="seriesPageInfo">Page 1</span>
573
+ <button class="page-btn" id="seriesNext"><i class='bx bx-right-arrow'></i></button>
574
+ </div