301 lines
15 KiB
HTML
301 lines
15 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>WaifuBoard</title>
|
||
<link rel="stylesheet" href="/views/css/globals.css">
|
||
<link rel="stylesheet" href="/views/css/components/navbar.css">
|
||
<link rel="stylesheet" href="/views/css/components/hero.css">
|
||
<link rel="stylesheet" href="/views/css/components/anilist-modal.css">
|
||
<link rel="stylesheet" href="/views/css/components/updateNotifier.css">
|
||
<link rel="stylesheet" href="/views/css/components/local-library.css">
|
||
<link rel="icon" href="/public/assets/waifuboards.ico" type="image/x-icon">
|
||
</head>
|
||
<body>
|
||
<nav class="navbar" id="navbar">
|
||
<a href="#" class="nav-brand">
|
||
<div class="brand-icon">
|
||
<img src="/public/assets/waifuboards.ico" alt="WF Logo">
|
||
</div>
|
||
WaifuBoard
|
||
</a>
|
||
|
||
<div class="nav-center">
|
||
<button class="nav-button active">Anime</button>
|
||
<button class="nav-button" onclick="window.location.href='/books'">Books</button>
|
||
<button class="nav-button" onclick="window.location.href='/gallery'">Gallery</button>
|
||
<button class="nav-button" onclick="window.location.href='/schedule'">Schedule</button>
|
||
<button class="nav-button" onclick="window.location.href='/my-list'">My List</button>
|
||
<button class="nav-button" onclick="window.location.href='/marketplace'">Marketplace</button>
|
||
</div>
|
||
|
||
<div class="nav-right">
|
||
<div class="search-wrapper">
|
||
<svg class="search-icon" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
|
||
<circle cx="11" cy="11" r="8"/>
|
||
<path d="M21 21l-4.35-4.35"/>
|
||
</svg>
|
||
<input type="text" class="search-input" id="search-input" placeholder="Search anime..." autocomplete="off">
|
||
<div class="search-results" id="search-results"></div>
|
||
</div>
|
||
|
||
<div class="nav-user" id="nav-user" style="display:none;">
|
||
<div class="user-avatar-btn">
|
||
<img id="nav-avatar" src="/public/assets/waifuboards.ico" alt="avatar">
|
||
<div class="online-indicator"></div>
|
||
</div>
|
||
|
||
<div class="nav-dropdown" id="nav-dropdown">
|
||
<div class="dropdown-header">
|
||
<img id="dropdown-avatar" src="/public/assets/waifuboards.ico" alt="avatar" class="dropdown-avatar">
|
||
<div class="dropdown-user-info">
|
||
<div class="dropdown-username" id="nav-username"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<button class="dropdown-item" id="nav-settings">
|
||
<svg width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
|
||
<circle cx="12" cy="12" r="3"/>
|
||
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06A1.65 1.65 0 0 0 15 19.4a1.65 1.65 0 0 0-1 .6 1.65 1.65 0 0 0-.33 1.82V22a2 2 0 1 1-4 0v-.18a1.65 1.65 0 0 0-.33-1.82 1.65 1.65 0 0 0-1-.6 1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.6 15a1.65 1.65 0 0 0-.6-1 1.65 1.65 0 0 0-1.82-.33H2a2 2 0 1 1 0-4h.18a1.65 1.65 0 0 0 1.82-.33 1.65 1.65 0 0 0 .6-1 1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.6c.37 0 .72-.14 1-.6A1.65 1.65 0 0 0 10.33 2.18V2a2 2 0 1 1 4 0v.18a1.65 1.65 0 0 0 .33 1.82c.28.46.63.6 1 .6a1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9c0 .37.14.72.6 1 .46.28.6.63.6 1z"/>
|
||
</svg>
|
||
<span>Settings</span>
|
||
</button>
|
||
|
||
<a href="/my-list" class="dropdown-item">
|
||
<svg width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
|
||
<path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"/>
|
||
<polyline points="17 21 17 13 7 13 7 21"/>
|
||
<polyline points="7 3 7 8 15 8"/>
|
||
</svg>
|
||
<span>My List</span>
|
||
</a>
|
||
<button class="dropdown-item logout-item" id="nav-logout">
|
||
<svg width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
|
||
<path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/>
|
||
<polyline points="16 17 21 12 16 7"/>
|
||
<line x1="21" y1="12" x2="9" y2="12"/>
|
||
</svg>
|
||
<span>Logout</span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<div class="hero-wrapper">
|
||
<div class="hero-background">
|
||
<img id="hero-bg-media" alt="">
|
||
<div id="player" style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 120vw; height: 120vh; pointer-events: none; opacity: 0; transition: opacity 1s;"></div>
|
||
</div>
|
||
<div class="hero-vignette"></div>
|
||
|
||
<div class="hero-content">
|
||
<div class="hero-poster-card">
|
||
<div class="skeleton poster-skeleton" id="hero-poster-skeleton"></div>
|
||
<img id="hero-poster" alt="" style="display: none;" onload="this.style.display='block'; document.getElementById('hero-poster-skeleton').style.display='none'">
|
||
</div>
|
||
<div class="hero-text">
|
||
<div id="hero-loading-ui">
|
||
<div class="skeleton title-skeleton"></div>
|
||
<div class="skeleton text-skeleton" style="width: 40%"></div>
|
||
<div class="skeleton text-skeleton" style="width: 100%; height: 4em;"></div>
|
||
</div>
|
||
|
||
<div id="hero-real-ui" style="display: none;">
|
||
<h1 class="hero-title" id="hero-title"></h1>
|
||
<div class="hero-meta">
|
||
<span class="score-badge" id="hero-score"></span>
|
||
<span id="hero-year"></span>
|
||
<span id="hero-type"></span>
|
||
</div>
|
||
<p class="hero-desc" id="hero-desc"></p>
|
||
<div class="hero-buttons">
|
||
<button class="btn-primary" id="watch-btn">Watch Now</button>
|
||
<button class="btn-blur">+ Add to List</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<button class="library-mode-btn icon-only" id="library-mode-btn" onclick="toggleLibraryMode()" title="Switch library mode">
|
||
<svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
|
||
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
|
||
<polyline points="9 22 9 12 15 12 15 22"/>
|
||
</svg>
|
||
</button>
|
||
|
||
</div>
|
||
|
||
<!-- Online Mode Content -->
|
||
<main id="online-content">
|
||
<section class="section">
|
||
<div class="section-header">
|
||
<div class="section-title">Continue watching</div>
|
||
</div>
|
||
<div class="carousel-wrapper">
|
||
<button class="scroll-btn left" onclick="scrollCarousel('my-status', -1)">‹</button>
|
||
<div class="carousel" id="my-status">
|
||
<div class="card"><div class="card-img-wrap skeleton"></div></div>
|
||
<div class="card"><div class="card-img-wrap skeleton"></div></div>
|
||
<div class="card"><div class="card-img-wrap skeleton"></div></div>
|
||
<div class="card"><div class="card-img-wrap skeleton"></div></div>
|
||
</div>
|
||
<button class="scroll-btn right" onclick="scrollCarousel('my-status', 1)">›</button>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="section">
|
||
<div class="section-header"><div class="section-title">Trending This Season</div></div>
|
||
<div class="carousel-wrapper">
|
||
<button class="scroll-btn left" onclick="scrollCarousel('trending', -1)">‹</button>
|
||
<div class="carousel" id="trending">
|
||
<div class="card"><div class="card-img-wrap skeleton"></div></div>
|
||
<div class="card"><div class="card-img-wrap skeleton"></div></div>
|
||
<div class="card"><div class="card-img-wrap skeleton"></div></div>
|
||
<div class="card"><div class="card-img-wrap skeleton"></div></div>
|
||
</div>
|
||
<button class="scroll-btn right" onclick="scrollCarousel('trending', 1)">›</button>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="section">
|
||
<div class="section-header"><div class="section-title">Top Airing Now</div></div>
|
||
<div class="carousel-wrapper">
|
||
<button class="scroll-btn left" onclick="scrollCarousel('top-airing', -1)">‹</button>
|
||
<div class="carousel" id="top-airing">
|
||
<div class="card"><div class="card-img-wrap skeleton"></div></div>
|
||
<div class="card"><div class="card-img-wrap skeleton"></div></div>
|
||
<div class="card"><div class="card-img-wrap skeleton"></div></div>
|
||
<div class="card"><div class="card-img-wrap skeleton"></div></div>
|
||
</div>
|
||
<button class="scroll-btn right" onclick="scrollCarousel('top-airing', 1)">›</button>
|
||
</div>
|
||
</section>
|
||
</main>
|
||
|
||
<!-- Local Library Mode Content -->
|
||
<main id="local-content" class="hidden">
|
||
<section class="section">
|
||
<div class="section-header">
|
||
<div class="section-title">Local Anime Library</div>
|
||
<button class="btn-secondary" onclick="scanLocalLibrary()">
|
||
<svg width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
|
||
<path d="M21 12a9 9 0 1 1-9-9"/>
|
||
<path d="M21 3v6h-6"/>
|
||
</svg>
|
||
<span id="scan-text">Scan Library</span>
|
||
</button>
|
||
</div>
|
||
<div class="local-filters">
|
||
<div class="filter-group">
|
||
<button class="filter-btn active" data-filter="all">All</button>
|
||
<button class="filter-btn" data-filter="watching">Watching</button>
|
||
<button class="filter-btn" data-filter="completed">Completed</button>
|
||
<button class="filter-btn" data-filter="unwatched">Unwatched</button>
|
||
<button class="filter-btn" data-filter="unlinked">Unlinked</button>
|
||
</div>
|
||
|
||
<div class="filter-group">
|
||
<button class="filter-btn" data-sort="az">A–Z</button>
|
||
<button class="filter-btn" data-sort="recent">Recent</button>
|
||
</div>
|
||
</div>
|
||
<div class="local-library-grid" id="local-entries-grid">
|
||
<div class="skeleton-card"></div>
|
||
<div class="skeleton-card"></div>
|
||
<div class="skeleton-card"></div>
|
||
<div class="skeleton-card"></div>
|
||
<div class="skeleton-card"></div>
|
||
<div class="skeleton-card"></div>
|
||
<div class="skeleton-card"></div>
|
||
<div class="skeleton-card"></div>
|
||
</div>
|
||
</section>
|
||
</main>
|
||
|
||
<div class="modal-overlay" id="add-list-modal">
|
||
<div class="modal-content modal-list">
|
||
<button class="modal-close" onclick="closeAddToListModal()">✕</button>
|
||
<h2 class="modal-title" id="modal-title">Add to List</h2>
|
||
|
||
<div class="modal-body">
|
||
<div class="modal-fields-grid">
|
||
<div class="form-group">
|
||
<label>Status</label>
|
||
<select id="entry-status" class="form-input">
|
||
<option value="WATCHING"><Watchi></Watchi>ng/Reading</option>
|
||
<option value="COMPLETED">Completed</option>
|
||
<option value="PLANNING">Planning</option>
|
||
<option value="PAUSED">Paused</option>
|
||
<option value="DROPPED">Dropped</option>
|
||
<option value="REPEATING">Rewatching</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="form-group">
|
||
<label>Episodes Watched</label>
|
||
<input type="number" id="entry-progress" class="form-input" min="0" placeholder="0">
|
||
</div>
|
||
|
||
<div class="form-group">
|
||
<label>Your Score (0-10)</label>
|
||
<input type="number" id="entry-score" class="form-input" min="0" max="10" step="0.1" placeholder="Optional">
|
||
</div>
|
||
|
||
<div class="form-group full-width">
|
||
<div class="date-group">
|
||
<div class="date-input-pair">
|
||
<label for="entry-start-date">Start Date</label>
|
||
<input type="date" id="entry-start-date" class="form-input">
|
||
</div>
|
||
<div class="date-input-pair">
|
||
<label for="entry-end-date">End Date</label>
|
||
<input type="date" id="entry-end-date" class="form-input">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="form-group">
|
||
<label for="entry-repeat-count">Rewatch Count</label>
|
||
<input type="number" id="entry-repeat-count" class="form-input" min="0">
|
||
</div>
|
||
|
||
<div class="form-group notes-group">
|
||
<label for="entry-notes">Notes</label>
|
||
<textarea id="entry-notes" class="form-input notes-textarea" rows="4" placeholder="Personal notes..."></textarea>
|
||
</div>
|
||
|
||
<div class="form-group checkbox-group">
|
||
<input type="checkbox" id="entry-is-private" class="form-checkbox">
|
||
<label for="entry-is-private">Mark as Private</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="modal-actions">
|
||
<button class="btn-danger" id="modal-delete-btn" onclick="deleteFromList()">Remove</button>
|
||
<button class="btn-secondary" onclick="closeAddToListModal()">Cancel</button>
|
||
<button class="btn-primary" onclick="saveToList()">Save Changes</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="updateToast" class="hidden">
|
||
<p>Update available: <span id="latestVersionDisplay">v1.x</span></p>
|
||
<a id="downloadButton" href="https://git.waifuboard.app/ItsSkaiya/WaifuBoard/releases" target="_blank">
|
||
Click To Download
|
||
</a>
|
||
</div>
|
||
<script src="/src/scripts/utils/auth-utils.js"></script>
|
||
<script src="/src/scripts/utils/notification-utils.js"></script>
|
||
<script src="/src/scripts/utils/search-manager.js"></script>
|
||
<script src="/src/scripts/utils/list-modal-manager.js"></script>
|
||
<script src="/src/scripts/utils/continue-watching-manager.js"></script>
|
||
<script src="/src/scripts/utils/youtube-player-utils.js"></script>
|
||
<script src="/src/scripts/anime/animes.js"></script>
|
||
<script src="/src/scripts/local-library.js"></script>
|
||
<script src="/src/scripts/updateNotifier.js"></script>
|
||
<script src="/src/scripts/auth-guard.js"></script>
|
||
<script src="/src/scripts/settings.js"></script>
|
||
</body>
|
||
</html> |