diff --git a/web/frontend/index.html b/web/frontend/index.html index 9f8d2c6..59720c0 100644 --- a/web/frontend/index.html +++ b/web/frontend/index.html @@ -124,11 +124,22 @@ img { display: block; } .island button.active { background: var(--elevated); color: var(--accent); } .island .sep { width: 1px; height: 22px; background: var(--separator); margin: 0 var(--s-tight); } +/* Der Umschalter zwischen oben und seitlich — wie auf dem iPad ein Knopf in + der Leiste selbst. Ihn in die Einstellungen zu verbannen hieße, für einen + Handgriff zwei Ebenen tief zu gehen. */ +.island .toggle-nav { + padding: var(--s-snug); color: var(--text-2); display: flex; align-items: center; + border-radius: var(--r-control); flex: 0 0 auto; +} +.island .toggle-nav:hover { color: var(--text); background: var(--elevated); } +.island .toggle-nav svg { width: 18px; height: 18px; display: block; } +#app.side .island .toggle-nav { align-self: flex-end; margin: 0 var(--s-snug) var(--s-snug); } + /* ---- Aufmacher ----------------------------------------------------------- Randlos bis an den oberen Rand, die Insel schwebt darüber. Genau die Entscheidung, die in der App getroffen wurde. */ #hero { - position: relative; height: 82vh; min-height: 420px; overflow: hidden; + position: relative; height: var(--hero-h, 82vh); min-height: 380px; overflow: hidden; } #hero .shot { position: absolute; inset: 0; background-size: cover; background-position: center; @@ -278,7 +289,12 @@ img { display: block; } .seg button.on { background: var(--accent); color: #fff; } input[type=range] { width: 100%; accent-color: var(--accent); } .range-row { display: flex; align-items: center; gap: var(--s-regular); } -.range-row output { min-width: 56px; text-align: right; color: var(--text-2); font-size: 13px; } +.range-row output { min-width: 82px; text-align: right; color: var(--text-2); font-size: 13px; } +.check { + display: flex; align-items: center; gap: var(--s-snug); + padding: var(--s-snug) 0; font-size: 14px; color: var(--text-2); cursor: pointer; +} +.check input { accent-color: var(--accent); width: 17px; height: 17px; } /* ---- Zustände ------------------------------------------------------------ */ #content { padding-bottom: var(--s-section); } @@ -444,14 +460,22 @@ const PALETTE = [ const P = { accent: localStorage.getItem('flixy.accent') || '#C04AC9', - nav: localStorage.getItem('flixy.nav') || 'top', // 'top' | 'side' + nav: localStorage.getItem('flixy.nav') || 'top', // 'top' | 'side' cardW: +(localStorage.getItem('flixy.cardW') || 150), + // Startseite — dieselben Stellschrauben wie in der App. + heroSource: localStorage.getItem('flixy.heroSource') || 'continueFirst', + heroCount: +(localStorage.getItem('flixy.heroCount') || 5), + heroHeight: +(localStorage.getItem('flixy.heroHeight') || 82), + combineContinue: localStorage.getItem('flixy.combineContinue') !== 'false', + hideWatched: localStorage.getItem('flixy.hideWatched') === 'true', + rowLayout: localStorage.getItem('flixy.rowLayout') || 'poster', // 'poster' | 'wide' }; function applyPrefs() { const r = document.documentElement.style; r.setProperty('--accent', P.accent); r.setProperty('--card-w', P.cardW + 'px'); + r.setProperty('--hero-h', P.heroHeight + 'vh'); el('app').classList.toggle('side', P.nav === 'side'); // An der Seite fährt nichts weg — die Regel gilt nur für die Insel oben. if (P.nav === 'side') el('chrome').classList.remove('away'); @@ -498,6 +522,24 @@ function buildIsland() { isl.appendChild(d); }; + // Der Umschalter zuerst, wie auf dem iPad: an der Seite oben in der Ecke, + // oben ganz links vor den Einträgen. + const nav = document.createElement('button'); + nav.className = 'toggle-nav'; + nav.title = P.nav === 'side' ? 'Leiste nach oben' : 'Leiste an die Seite'; + nav.setAttribute('aria-label', nav.title); + nav.innerHTML = P.nav === 'side' + // Rechteck mit Balken oben — die Leiste zieht nach oben. + ? '' + // Rechteck mit Spalte links — die Leiste zieht an die Seite. + : ''; + nav.onclick = () => { + setPref('nav', P.nav === 'side' ? 'top' : 'side'); + buildIsland(); + go(current); + }; + isl.appendChild(nav); + // Die Marke steht nur in der Spalte — oben nähme sie Platz weg, den die // Einträge brauchen. bit('brand', 'Flixy'); @@ -540,12 +582,33 @@ function renderSettings() {
Oben als schwebende Insel oder links als Spalte. Oben blendet sie - beim Scrollen aus, an der Seite bleibt sie stehen.
- + +Wie die Startseite darunter aufgebaut ist.
+ + +