32 klassische Skripte in der alten Reihenfolge (01-core … 99-init), ohne Änderung am Code darin: geschnitten nur zwischen Anweisungen, je Datei 'use strict' wie vorher für die ganze Datei. Geprüft (acorn): kein Code, der beim Laden läuft, braucht einen Namen aus einer späteren Datei. Globale Funktionen und let/const bleiben global, die App-Schichten (native.js, native-eink.js, …) umhüllen sie wie bisher. Template und sw.js-SHELL listen die Dateien; diora-android build_web nimmt static/js rekursiv. Getestet: 14 Browser-Tests (e2e), Desktop-App (Buch, Lesestand, Leiste im Reader, Hell/Dunkel). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 lines
2 KiB
JavaScript
44 lines
2 KiB
JavaScript
'use strict';
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Radio sidebar (compact player)
|
|
// ---------------------------------------------------------------------------
|
|
|
|
function openRadioSidebar() {
|
|
const stationName = currentStation ? escapeHtml(currentStation.name) : '— kein Sender —';
|
|
const track = currentTrack ? escapeHtml(currentTrack) : '';
|
|
const vol = document.getElementById('volume')?.value ?? 204;
|
|
|
|
const rows = [...document.querySelectorAll('#saved-tbody tr[data-id]')];
|
|
const stationsHtml = rows.length
|
|
? rows.map(r => `<li><button class="btn btn-sm rsb-play-btn" data-url="${escapeHtml(r.dataset.url || '')}" data-name="${escapeHtml(r.dataset.name || '')}">${escapeHtml(r.dataset.name || '')}</button></li>`).join('')
|
|
: `<li class="muted">Keine gespeicherten Sender.</li>`;
|
|
|
|
const html = `
|
|
<div class="rsb-nowplaying">
|
|
<div class="rsb-station-name">${stationName}</div>
|
|
${track ? `<div class="rsb-track muted">${track}</div>` : ''}
|
|
</div>
|
|
<div class="rsb-controls">
|
|
<button class="btn ${isPlaying ? 'playing' : ''}" id="rsb-playstop">${isPlaying ? '⏹ Stopp' : '▶ Abspielen'}</button>
|
|
<label class="rsb-vol">Lautst. <input type="range" id="rsb-volume" min="0" max="255" value="${vol}"></label>
|
|
</div>
|
|
<ul class="rsb-station-list">${stationsHtml}</ul>
|
|
`;
|
|
|
|
openSidebar('Radio', html);
|
|
|
|
const body = $('sidebar-body');
|
|
body.querySelector('#rsb-playstop').addEventListener('click', togglePlayStop);
|
|
body.querySelector('#rsb-volume').addEventListener('input', function () {
|
|
const v = this.value;
|
|
const mainSlider = document.getElementById('volume');
|
|
const mainNum = document.getElementById('volume-num');
|
|
if (mainSlider) mainSlider.value = v;
|
|
if (mainNum) mainNum.value = v;
|
|
audio.volume = v / 255;
|
|
});
|
|
body.querySelectorAll('.rsb-play-btn').forEach(btn => {
|
|
btn.addEventListener('click', () => playStation(btn.dataset.url, btn.dataset.name, null));
|
|
});
|
|
}
|