/* VideoKonverter TV - Streaming-Frontend */ /* Optimiert fuer TV (Fernbedienung), Handy, Tablet */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { --bg: #0f0f0f; --bg-card: #1a1a1a; --bg-hover: #252525; --bg-input: #1e1e1e; --text: #e0e0e0; --text-muted: #888; --accent: #64b5f6; --accent-hover: #90caf9; --danger: #ef5350; --success: #66bb6a; --radius: 8px; --focus-ring: 3px solid var(--accent); } html { font-size: clamp(14px, 1.2vw, 20px); } body { background: var(--bg); color: var(--text); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; line-height: 1.5; min-height: 100vh; overflow-x: hidden; -webkit-font-smoothing: antialiased; } a { color: var(--accent); text-decoration: none; } /* === Focus-Management fuer D-Pad === */ [data-focusable]:focus { outline: var(--focus-ring); outline-offset: 4px; z-index: 10; } /* === Navigation === */ .tv-nav { position: sticky; top: 0; z-index: 100; background: rgba(15, 15, 15, 0.95); backdrop-filter: blur(10px); display: flex; align-items: center; justify-content: space-between; padding: 0.6rem 1.5rem; border-bottom: 1px solid #222; } .tv-nav-links { display: flex; gap: 0.3rem; } .tv-nav-right { display: flex; align-items: center; gap: 0.8rem; } .tv-nav-item { color: var(--text-muted); padding: 0.5rem 1rem; border-radius: var(--radius); font-size: 0.95rem; transition: background 0.2s, color 0.2s; white-space: nowrap; } .tv-nav-item:hover, .tv-nav-item:focus { background: var(--bg-hover); color: var(--text); } .tv-nav-item.active { color: var(--text); background: var(--bg-card); font-weight: 600; } .tv-nav-user { color: var(--text-muted); font-size: 0.85rem; } .tv-nav-logout { color: var(--danger); font-size: 0.85rem; } /* === Main Content === */ .tv-main { padding: 1.5rem; max-width: 1600px; margin: 0 auto; } /* === Sections === */ .tv-section { margin-bottom: 2rem; } .tv-section-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.8rem; } .tv-section-title { font-size: 1.3rem; font-weight: 600; margin-bottom: 0.5rem; } .tv-section-more { font-size: 0.85rem; color: var(--accent); padding: 0.3rem 0.6rem; border-radius: var(--radius); } .tv-section-more:focus { outline: var(--focus-ring); } .tv-page-title { font-size: 1.6rem; font-weight: 700; margin-bottom: 1rem; } /* === Horizontale Scroll-Reihen (Netflix-Style) === */ .tv-row { display: flex; gap: 12px; overflow-x: auto; scroll-behavior: smooth; scroll-snap-type: x mandatory; padding: 8px 0; -webkit-overflow-scrolling: touch; } .tv-row::-webkit-scrollbar { height: 4px; } .tv-row::-webkit-scrollbar-track { background: transparent; } .tv-row::-webkit-scrollbar-thumb { background: #333; border-radius: 2px; } .tv-row .tv-card { scroll-snap-align: start; flex-shrink: 0; width: 180px; } .tv-row .tv-card-wide { width: 260px; } /* === Poster-Grid === */ .tv-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 12px; } /* === Poster-Karten === */ .tv-card { display: block; background: var(--bg-card); border-radius: var(--radius); overflow: hidden; transition: transform 0.2s, box-shadow 0.2s; cursor: pointer; } .tv-card:hover, .tv-card:focus { transform: scale(1.04); box-shadow: 0 4px 20px rgba(0,0,0,0.5); } .tv-card:focus { outline: var(--focus-ring); outline-offset: 2px; } .tv-card-img { width: 100%; aspect-ratio: 2/3; object-fit: cover; display: block; background: #222; } .tv-card-placeholder { width: 100%; aspect-ratio: 2/3; display: flex; align-items: center; justify-content: center; background: #1e1e1e; color: var(--text-muted); font-size: 0.85rem; text-align: center; padding: 0.5rem; } .tv-card-info { padding: 0.5rem 0.6rem; } .tv-card-title { display: block; font-size: 0.85rem; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--text); } .tv-card-meta { display: block; font-size: 0.75rem; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /* Wiedergabe-Fortschritt auf Karte */ .tv-card-progress { height: 3px; background: #333; } .tv-card-progress-bar { height: 100%; background: var(--accent); transition: width 0.3s; } /* === Detail-Ansicht === */ .tv-detail-header { display: flex; gap: 1.5rem; margin-bottom: 1.5rem; } .tv-detail-poster { width: 200px; border-radius: var(--radius); flex-shrink: 0; object-fit: cover; } .tv-detail-info { flex: 1; min-width: 0; } .tv-detail-genres { color: var(--text-muted); font-size: 0.9rem; margin-bottom: 0.5rem; } .tv-detail-year { color: var(--text-muted); font-size: 0.9rem; margin-bottom: 0.3rem; } .tv-detail-overview { font-size: 0.9rem; line-height: 1.6; color: #ccc; max-height: 8rem; overflow: hidden; margin-bottom: 1rem; } .tv-detail-actions { margin-top: 1rem; } /* Play-Button (gross, fuer TV) */ .tv-play-btn { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.8rem 2rem; background: var(--accent); color: #000; font-size: 1.1rem; font-weight: 700; border: none; border-radius: var(--radius); cursor: pointer; transition: background 0.2s; } .tv-play-btn:hover, .tv-play-btn:focus { background: var(--accent-hover); outline: var(--focus-ring); outline-offset: 4px; } /* === Staffel-Tabs === */ .tv-tabs { display: flex; gap: 0.3rem; margin-bottom: 1rem; overflow-x: auto; padding-bottom: 4px; } .tv-tab { padding: 0.5rem 1.2rem; background: var(--bg-card); color: var(--text-muted); border: 1px solid #333; border-radius: var(--radius); cursor: pointer; font-size: 0.9rem; white-space: nowrap; transition: background 0.2s, color 0.2s; } .tv-tab:hover, .tv-tab:focus { background: var(--bg-hover); color: var(--text); } .tv-tab.active { background: var(--accent); color: #000; border-color: var(--accent); font-weight: 600; } /* === Episoden-Liste === */ .tv-episode-list { display: flex; flex-direction: column; gap: 2px; } .tv-episode { display: flex; align-items: center; gap: 0.8rem; padding: 0.8rem 1rem; background: var(--bg-card); border-radius: var(--radius); transition: background 0.2s; color: var(--text); } .tv-episode:hover, .tv-episode:focus { background: var(--bg-hover); } .tv-episode:focus { outline: var(--focus-ring); outline-offset: -2px; } .tv-episode-num { color: var(--text-muted); font-weight: 600; min-width: 3rem; font-size: 0.9rem; } .tv-episode-title { flex: 1; font-size: 0.9rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .tv-episode-meta { color: var(--text-muted); font-size: 0.8rem; white-space: nowrap; } .tv-episode-play { color: var(--accent); font-size: 1.2rem; } /* === Suche === */ .tv-search-form { display: flex; gap: 0.5rem; margin-bottom: 1.5rem; } .tv-search-input { flex: 1; padding: 0.8rem 1rem; background: var(--bg-input); border: 1px solid #333; border-radius: var(--radius); color: var(--text); font-size: 1rem; } .tv-search-input:focus { border-color: var(--accent); outline: none; } .tv-search-btn { padding: 0.8rem 1.5rem; background: var(--accent); color: #000; border: none; border-radius: var(--radius); font-weight: 600; cursor: pointer; font-size: 1rem; } /* === Empty State === */ .tv-empty { text-align: center; color: var(--text-muted); padding: 3rem 1rem; font-size: 1rem; } /* === Login === */ .login-body { display: flex; align-items: center; justify-content: center; min-height: 100vh; background: var(--bg); } .login-container { width: 100%; max-width: 400px; padding: 1rem; } .login-card { background: var(--bg-card); border-radius: 12px; padding: 2.5rem; text-align: center; } .login-title { font-size: 1.8rem; font-weight: 700; margin-bottom: 0.2rem; } .login-subtitle { color: var(--text-muted); margin-bottom: 1.5rem; font-size: 1rem; } .login-error { background: rgba(239, 83, 80, 0.15); color: var(--danger); padding: 0.6rem 1rem; border-radius: var(--radius); margin-bottom: 1rem; font-size: 0.9rem; } .login-form { text-align: left; } .login-field { margin-bottom: 1rem; } .login-field label { display: block; font-size: 0.85rem; color: var(--text-muted); margin-bottom: 0.3rem; } .login-field input { width: 100%; padding: 0.8rem 1rem; background: var(--bg-input); border: 1px solid #333; border-radius: var(--radius); color: var(--text); font-size: 1rem; } .login-field input:focus { border-color: var(--accent); outline: none; } .login-btn { width: 100%; padding: 0.9rem; background: var(--accent); color: #000; border: none; border-radius: var(--radius); font-size: 1.1rem; font-weight: 700; cursor: pointer; margin-top: 0.5rem; } .login-btn:hover, .login-btn:focus { background: var(--accent-hover); } /* === Video-Player === */ .player-body { background: #000; overflow: hidden; } .player-wrapper { position: fixed; inset: 0; display: flex; flex-direction: column; background: #000; } .player-wrapper video { flex: 1; width: 100%; height: 100%; object-fit: contain; background: #000; } .player-header { position: absolute; top: 0; left: 0; right: 0; padding: 1rem 1.5rem; background: linear-gradient(to bottom, rgba(0,0,0,0.8), transparent); display: flex; align-items: center; gap: 1rem; z-index: 10; transition: opacity 0.3s; } .player-back { color: var(--text); font-size: 1rem; padding: 0.4rem 0.8rem; border-radius: var(--radius); } .player-back:focus { outline: var(--focus-ring); } .player-title { color: var(--text); font-size: 1rem; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .player-controls { position: absolute; bottom: 0; left: 0; right: 0; padding: 0.5rem 1.5rem 1rem; background: linear-gradient(to top, rgba(0,0,0,0.8), transparent); z-index: 10; transition: opacity 0.3s; } .player-progress { height: 6px; background: rgba(255,255,255,0.2); border-radius: 3px; cursor: pointer; margin-bottom: 0.5rem; } .player-progress-bar { height: 100%; background: var(--accent); border-radius: 3px; transition: width 0.2s; pointer-events: none; } .player-buttons { display: flex; align-items: center; gap: 0.8rem; } .player-btn { background: none; border: none; color: var(--text); font-size: 1.4rem; cursor: pointer; padding: 0.4rem; border-radius: var(--radius); } .player-btn:focus { outline: var(--focus-ring); } .player-time { color: var(--text-muted); font-size: 0.85rem; } .player-spacer { flex: 1; } /* Controls ausblenden nach Inaktivitaet */ .player-hide-controls .player-header, .player-hide-controls .player-controls { opacity: 0; pointer-events: none; } /* === Responsive === */ @media (max-width: 768px) { .tv-nav { padding: 0.4rem 0.8rem; } .tv-nav-item { padding: 0.4rem 0.6rem; font-size: 0.85rem; } .tv-main { padding: 1rem; } .tv-grid { grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 8px; } .tv-row .tv-card { width: 140px; } .tv-row .tv-card-wide { width: 200px; } .tv-detail-header { flex-direction: column; } .tv-detail-poster { width: 150px; } .tv-page-title { font-size: 1.3rem; } .tv-nav-user { display: none; } } @media (max-width: 480px) { .tv-nav-links { gap: 0; } .tv-nav-item { padding: 0.3rem 0.5rem; font-size: 0.8rem; } .tv-grid { grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); } .tv-row .tv-card { width: 120px; } .tv-detail-poster { width: 120px; } } /* TV/Desktop (grosse Bildschirme) */ @media (min-width: 1280px) { .tv-grid { grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; } .tv-row .tv-card { width: 200px; } .tv-row .tv-card-wide { width: 300px; } .tv-episode { padding: 1rem 1.5rem; } .tv-play-btn { padding: 1rem 3rem; font-size: 1.3rem; } }