105 lines
4.0 KiB
HTML
105 lines
4.0 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<meta name="color-scheme" content="dark" />
|
|
<meta name="theme-color" content="#0a0a0f" />
|
|
<title>Transmission Manager</title>
|
|
<link rel="icon" href="/icon.png" type="image/png" sizes="128x128" />
|
|
<link rel="stylesheet" href="/styles.css" />
|
|
</head>
|
|
|
|
<body>
|
|
<header class="app-header">
|
|
<div class="header-inner">
|
|
<div class="brand">
|
|
<div class="logo" aria-hidden="true">
|
|
<img src="/icon.png" alt="" />
|
|
</div>
|
|
<div class="brand-text">
|
|
<h1>Transmission</h1>
|
|
<span class="brand-sub">Manager</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="header-stats" id="header-stats" aria-live="polite">
|
|
<div class="stat-pill" data-stat="torrents">
|
|
<span class="stat-ico" aria-hidden="true">▦</span>
|
|
<span class="stat-label">Torrents</span>
|
|
<span class="stat-value" id="stat-torrents">—</span>
|
|
</div>
|
|
<div class="stat-pill download" data-stat="dl">
|
|
<span class="stat-ico" aria-hidden="true">↓</span>
|
|
<span class="stat-label">Down</span>
|
|
<span class="stat-value" id="stat-dl">—</span>
|
|
</div>
|
|
<div class="stat-pill upload" data-stat="ul">
|
|
<span class="stat-ico" aria-hidden="true">↑</span>
|
|
<span class="stat-label">Up</span>
|
|
<span class="stat-value" id="stat-ul">—</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
<main class="container">
|
|
<div class="toolbar">
|
|
<input type="search" id="filter" class="filter-input" placeholder="Filter torrents…" autocomplete="off" />
|
|
<div class="sort-group" role="group" aria-label="Sort torrents">
|
|
<button class="sort-btn" data-sort="name">Name</button>
|
|
<button class="sort-btn" data-sort="progress">Progress</button>
|
|
<button class="sort-btn active" data-sort="status">Status</button>
|
|
<button class="sort-btn" data-sort="ratio">Ratio</button>
|
|
<button class="sort-btn" data-sort="size">Size</button>
|
|
<button class="sort-btn" data-sort="speed">Speed</button>
|
|
<button class="sort-btn" data-sort="availability">Availability</button>
|
|
</div>
|
|
<div class="toolbar-actions">
|
|
<label class="interval-control" for="refresh-interval">
|
|
<span class="sr-only">Refresh interval</span>
|
|
<select id="refresh-interval" class="refresh-select" aria-label="Refresh interval">
|
|
<option value="1000">1s</option>
|
|
<option value="3000" selected>3s</option>
|
|
<option value="5000">5s</option>
|
|
<option value="10000">10s</option>
|
|
</select>
|
|
</label>
|
|
<div class="refresh-indicator" id="refresh-indicator" title="Auto-refreshes every 3s" role="status"
|
|
aria-label="Auto-refresh active">
|
|
<span class="dot" aria-hidden="true"></span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<section id="torrents" class="torrent-list" aria-live="polite"></section>
|
|
|
|
<div id="empty-state" class="empty-state hidden">
|
|
<div class="empty-box">
|
|
<svg viewBox="0 0 100 100" aria-hidden="true">
|
|
<path d="M50 8 L20 78 L80 78 Z" fill="none" stroke="currentColor" stroke-width="5" stroke-linejoin="round"
|
|
opacity="0.4" />
|
|
</svg>
|
|
</div>
|
|
<p class="empty-title">No torrents</p>
|
|
<p class="empty-sub">Add torrents to your Transmission client to see them here.</p>
|
|
</div>
|
|
|
|
<div id="error-state" class="error-state hidden">
|
|
<p class="error-title">Connection error</p>
|
|
<p class="error-sub" id="error-msg">Could not reach the Transmission daemon.</p>
|
|
<p class="error-hint" id="error-hint">Retrying in 3s…</p>
|
|
</div>
|
|
</main>
|
|
|
|
<footer class="app-footer">
|
|
<span>transmission-manager</span>
|
|
<span class="footer-sep">·</span>
|
|
<span id="last-updated">—</span>
|
|
</footer>
|
|
|
|
<script src="/app.js"></script>
|
|
</body>
|
|
|
|
</html> |