Update via AnyCoder
Browse files- 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:
|
| 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:
|
| 94 |
-
display: grid;
|
| 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:
|
| 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 |
-
/*
|
| 291 |
-
|
| 292 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 293 |
}
|
|
|
|
| 294 |
</style>
|
| 295 |
</head>
|
| 296 |
<body>
|
| 297 |
<header class="appbar">
|
| 298 |
<div class="appbar-inner">
|
| 299 |
-
<
|
| 300 |
<div class="logo" aria-hidden="true"></div>
|
| 301 |
<div>
|
| 302 |
<h1>NeoIPTV</h1>
|
| 303 |
<small>Connexion & Catalogue</small>
|
| 304 |
</div>
|
| 305 |
-
</
|
| 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 |
-
|
|
|
|
| 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 |
-
|
| 489 |
-
<
|
| 490 |
-
|
| 491 |
-
|
| 492 |
-
|
| 493 |
-
|
| 494 |
-
|
| 495 |
-
|
| 496 |
-
|
| 497 |
-
|
| 498 |
-
|
| 499 |
-
|
| 500 |
-
|
|
|
|
| 501 |
</div>
|
| 502 |
-
|
| 503 |
-
|
| 504 |
-
</main>
|
| 505 |
|
| 506 |
-
|
| 507 |
-
|
| 508 |
-
|
| 509 |
-
|
| 510 |
-
|
| 511 |
-
|
| 512 |
-
|
| 513 |
-
|
| 514 |
-
|
| 515 |
-
|
| 516 |
-
|
| 517 |
-
|
| 518 |
-
|
| 519 |
-
|
| 520 |
</div>
|
| 521 |
-
|
| 522 |
-
|
| 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 |
-
|
| 568 |
-
|
| 569 |
-
|
| 570 |
-
|
| 571 |
-
|
| 572 |
-
|
| 573 |
-
|
| 574 |
-
|
| 575 |
-
|
| 576 |
-
|
| 577 |
-
|
| 578 |
-
|
| 579 |
-
|
| 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|