Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
134 lines (125 loc) · 6.1 KB
/
Copy pathindex.html
File metadata and controls
134 lines (125 loc) · 6.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<!DOCTYPE html>
<html lang="en" data-theme="auto">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>IPRD · International Public Radio Directory</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="style.css">
</head>
<body>
<header class="site-header">
<div class="container header-inner">
<div class="brand">
<svg class="brand-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="10"/>
<path d="M12 8v4l3 3"/>
<path d="M2 12h2M20 12h2M12 2v2M12 20v2"/>
</svg>
<span class="brand-name">IPRD</span>
<span class="brand-sub">International Public Radio Directory</span>
</div>
<div class="header-actions">
<button class="theme-toggle" id="themeToggle" title="Toggle theme" aria-label="Toggle dark/light mode">
<svg class="icon-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="5"/>
<line x1="12" y1="1" x2="12" y2="3"/>
<line x1="12" y1="21" x2="12" y2="23"/>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/>
<line x1="1" y1="12" x2="3" y2="12"/>
<line x1="21" y1="12" x2="23" y2="12"/>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/>
</svg>
<svg class="icon-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
</svg>
</button>
</div>
</div>
</header>
<!-- Sticky mini-player -->
<div class="player-bar" id="playerBar" hidden>
<div class="container player-inner">
<div class="player-info">
<div class="player-wave">
<span></span><span></span><span></span><span></span><span></span>
</div>
<div>
<div class="player-name" id="playerName">—</div>
<div class="player-meta" id="playerMeta">—</div>
</div>
</div>
<div class="player-controls">
<button class="btn-icon" id="playPauseBtn" title="Play/Pause">
<svg id="iconPlay" viewBox="0 0 24 24" fill="currentColor"><path d="M8 5v14l11-7z"/></svg>
<svg id="iconPause" viewBox="0 0 24 24" fill="currentColor" hidden><path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z"/></svg>
</button>
<button class="btn-icon" id="stopBtn" title="Stop">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M6 6h12v12H6z"/></svg>
</button>
<input type="range" id="volumeSlider" min="0" max="1" step="0.05" value="0.8" class="volume-slider" title="Volume">
<span class="player-error" id="playerError" hidden>⚠ Stream unavailable (CORS/network)</span>
</div>
</div>
<audio id="audioEl"></audio>
</div>
<main class="container main-content">
<section class="hero">
<h2 class="hero-title">Discover Radio Stations</h2>
<p class="hero-sub">Browse thousands of public internet radio streams from around the world.</p>
</section>
<div class="search-wrap">
<svg class="search-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<input id="search" class="search-input" placeholder="Search by name, genre, country…" autocomplete="off">
</div>
<div class="filters">
<select id="country">
<option value="">🌍 All countries</option>
</select>
<select id="category">
<option value="">🎵 All genres</option>
</select>
<span class="results-count" id="resultsCount"></span>
</div>
<div id="results" class="grid"></div>
<div id="emptyState" class="empty-state" hidden>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
<path d="M9 19V6l12-3v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="15" r="3"/>
</svg>
<p>No stations found for your search.</p>
</div>
</main>
<footer class="site-footer">
<div class="container footer-inner">
<div class="footer-brand">
<span class="brand-name">IPRD</span>
<span class="footer-tagline">Open radio data for everyone.</span>
</div>
<nav class="footer-links">
<a href="https://github.com/iprd-org/iprd" target="_blank" rel="noopener">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.48 2 2 6.48 2 12c0 4.42 2.87 8.17 6.84 9.49.5.09.68-.22.68-.48v-1.7c-2.78.6-3.37-1.34-3.37-1.34-.45-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.89 1.52 2.34 1.08 2.91.83.09-.65.35-1.08.63-1.33-2.22-.25-4.56-1.11-4.56-4.94 0-1.09.39-1.98 1.03-2.68-.1-.25-.45-1.27.1-2.64 0 0 .84-.27 2.75 1.02A9.56 9.56 0 0 1 12 6.8c.85.004 1.71.115 2.51.337 1.91-1.29 2.75-1.02 2.75-1.02.55 1.37.2 2.39.1 2.64.64.7 1.03 1.59 1.03 2.68 0 3.84-2.34 4.69-4.57 4.93.36.31.68.92.68 1.85v2.74c0 .27.18.58.69.48A10.01 10.01 0 0 0 22 12c0-5.52-4.48-10-10-10z"/></svg>
GitHub
</a>
<a href="https://iprd-org.github.io/iprd/" target="_blank" rel="noopener">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/><polyline points="10 9 9 9 8 9"/></svg>
Documentation
</a>
<a href="https://iprd-org.github.io" target="_blank" rel="noopener">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="7" width="20" height="15" rx="2"/><path d="M16 3H8"/></svg>
iprd-org
</a>
</nav>
<p class="footer-copy">© 2026 IPRD · Data under open license</p>
</div>
</footer>
<script src="app.js"></script>
<script src="theme.js"></script>
<script src="player.js"></script>
</body>
</html>