diff --git a/web/frontend/index.html b/web/frontend/index.html
index 6c1fa3a..b298a54 100644
--- a/web/frontend/index.html
+++ b/web/frontend/index.html
@@ -255,15 +255,23 @@ img { display: block; }
/* Zwei Verläufe statt einer Fläche: die Mitte bleibt frei, und genau dort
ist das Bild. */
+/* Eine gleichmäßige Abdunklung über allem, wie in der App: „genug, damit
+ weiße Schrift auf hellen Szenen lesbar bleibt, wenig genug, dass das Bild
+ nicht verfälscht wirkt." Zwei Verläufe an den Rändern taten das nicht —
+ in der Mitte stehen die Transportknöpfe und hatten nichts hinter sich. */
+.pl-chrome { background: rgba(0,0,0,.35); }
+
.pl-top, .pl-bottom { padding: var(--s-loose) var(--s-section); }
.pl-top {
- display: flex; align-items: center; gap: var(--s-loose);
- background: linear-gradient(to bottom, rgba(0,0,0,.75), transparent);
+ display: flex; align-items: center; gap: var(--s-regular);
padding-top: calc(var(--s-loose) + env(safe-area-inset-top));
}
-.pl-bottom {
- background: linear-gradient(to top, rgba(0,0,0,.85), transparent);
- padding-bottom: calc(var(--s-loose) + env(safe-area-inset-bottom));
+.pl-bottom { padding-bottom: calc(var(--s-loose) + env(safe-area-inset-bottom)); }
+
+/* Die Stufe als Text, deshalb kein rundes Feld. */
+.pl-quality {
+ width: auto; padding: 0 var(--s-regular); border-radius: var(--r-control);
+ font-size: 13px; font-weight: 600; white-space: nowrap;
}
.pl-title { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
@@ -286,7 +294,10 @@ img { display: block; }
.btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; }
.tiny, .pl-icon, .pl-round, .hero-nav { display: inline-flex; align-items: center; justify-content: center; }
-.pl-center { display: flex; align-items: center; justify-content: center; gap: var(--s-section); }
+.pl-center {
+ display: flex; align-items: center; justify-content: center;
+ gap: calc(var(--s-section) * 2);
+}
/* Dunkel statt hell durchscheinend: über einer sonnigen Szene verschwanden
helle Knöpfe vollständig. Ein Schatten hebt sie zusätzlich ab. */
.pl-round {
@@ -298,7 +309,8 @@ img { display: block; }
transition: background .15s ease, transform .15s ease;
}
.pl-round:hover { background: rgba(40,40,46,.8); transform: scale(1.06); }
-.pl-round.pl-play { width: 76px; height: 76px; font-size: 27px; }
+.pl-round.pl-play { width: 84px; height: 84px; }
+.pl-round.pl-play svg { width: 34px; height: 34px; }
/* Die Sekundenzahl als Text, nicht als Ziffer im Pfeil: übereinander war
beides unlesbar, und die Zahl ist die eigentliche Auskunft. */
#pl-back, #pl-fwd { font-size: 15px; font-weight: 600; font-variant-numeric: tabular-nums; }
@@ -366,8 +378,8 @@ img { display: block; }
Ein Blatt würde das Bild verdecken, und man stellt hier etwas ein, das man
am Bild beurteilen will. */
.pl-menu {
- position: absolute; right: var(--s-section); bottom: 96px; z-index: 3;
- min-width: 232px; max-height: 60vh; overflow-y: auto;
+ position: fixed; z-index: 4;
+ min-width: 232px; max-width: 320px; max-height: 60vh; overflow-y: auto;
background: rgba(20,20,23,.92); border: 1px solid var(--separator);
border-radius: var(--r-sheet); padding: var(--s-snug);
backdrop-filter: blur(24px); -webkit-backdrop-filter: blur(24px);
@@ -1584,6 +1596,10 @@ function openPlayer(item) {
${esc(item.SeriesName || item.Name)}
${item.SeriesName ? `${esc(episodeLabel(item))}` : ''}
+
+
+
+
@@ -1603,7 +1619,6 @@ function openPlayer(item) {
-
@@ -1767,70 +1782,75 @@ function openPlayer(item) {
startStream(item, v, fail, lauf);
};
+ /* **Drei Knöpfe, drei Listen** — wie auf dem iPad, und aus demselben Grund:
+ die Tonspur stellt man einmal am Anfang um, die Untertitel mitten im
+ Film, die Qualität, wenn es hakt. Das sind drei verschiedene Fragen, und
+ eine gemeinsame Liste hieße jedes Mal an den beiden anderen vorbeizusuchen. */
const menu = el2('pl-menu');
const closeMenu = () => { menu.hidden = true; };
- el2('pl-more').onclick = () => (menu.hidden ? openMenu() : closeMenu());
- layer.addEventListener('click', (e) => {
- if (!menu.hidden && !menu.contains(e.target) && e.target.closest('#pl-more') === null) closeMenu();
- });
- function openMenu() {
- const spuren = (art) => lauf.streams.filter((x) => x.Type === art);
- const eintrag = (text, gewaehlt, tun) => {
+ const spuren = (art) => lauf.streams.filter((x) => x.Type === art);
+ const beschriftung = (t) => t.DisplayTitle || t.Language || `Spur ${t.Index}`;
+
+ function zeigeListe(knopf, titel, eintraege) {
+ if (!menu.hidden && menu.dataset.von === knopf.id) return closeMenu();
+ menu.dataset.von = knopf.id;
+ menu.innerHTML = `