* { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Courier New', monospace; background-color: #000; color: #FFED00; min-height: 100vh; overflow-x: hidden; -webkit-tap-highlight-color: transparent; } .container { max-width: 100%; padding: 10px; } @media (min-width: 768px) { .container { padding: 15px 20px; } } .header { text-align: center; padding: 20px 10px 15px; background-color: #000; position: sticky; top: 0; z-index: 10000; border-bottom: 2px solid #FFED00; } .header-content { display: flex; justify-content: space-between; align-items: center; max-width: 100%; } .header-title { flex: 1; text-align: left; padding-left: 15px; max-width: calc(100% - 100px); } .header h1 { font-size: 26px; letter-spacing: 2px; margin-bottom: 6px; } .header .subtitle { font-size: 11px; opacity: 0.7; letter-spacing: 1px; margin-bottom: 6px; } .header .author { font-size: 9px; opacity: 0.5; font-style: italic; } .menu-btn { position: absolute; right: 15px; top: 50%; transform: translateY(-50%); background: none; border: 2px solid #FFED00; color: #FFED00; font-size: 24px; padding: 8px 12px; cursor: pointer; border-radius: 6px; transition: background-color 0.2s; line-height: 1; z-index: 10001; } .menu-btn:active { background-color: #FFED00; color: #000; } /* Navigation Menu */ .nav-menu { position: fixed; top: 0; right: -300px; width: 280px; height: 100%; background-color: #000; border-left: 2px solid #FFED00; z-index: 10003; transition: right 0.3s ease; } .nav-menu.active { right: 0; } .nav-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.7); z-index: 10002; display: none; } .nav-overlay.active { display: block; } .nav-header { padding: 20px; border-bottom: 1px solid #333; display: flex; justify-content: space-between; align-items: center; } .nav-header h3 { font-size: 18px; color: #FFED00; } .nav-close { background: none; border: none; color: #FFED00; font-size: 32px; cursor: pointer; padding: 0; line-height: 1; } .nav-items { padding: 10px 0; } .nav-item { width: 100%; padding: 18px 20px; background: none; border: none; color: #FFED00; text-align: left; cursor: pointer; display: flex; align-items: center; gap: 15px; font-family: 'Courier New', monospace; font-size: 16px; transition: background-color 0.2s; border-left: 4px solid transparent; } .nav-item:active, .nav-item.active { background-color: #1a1a1a; border-left-color: #FFED00; } .nav-icon { font-size: 24px; } .nav-label { flex: 1; } /* View Container */ .view-container { display: none; } .view-container.active { display: block; } .controls { background-color: #0a0a0a; padding: 15px; border-radius: 8px; margin: 15px 0; border: 1px solid #222; } .search-row { display: flex; gap: 10px; margin-bottom: 15px; align-items: stretch; } .search-container { position: relative; flex: 1; } .search-input { width: 100%; padding: 12px 45px 12px 12px; font-family: 'Courier New', monospace; font-size: 16px; background-color: #000 !important; color: #FFED00; border: 2px solid #FFED00; border-radius: 6px; outline: none; transition: border-color 0.2s; height: 48px; box-sizing: border-box; } .search-input:focus { border-color: #fff; } .search-input::placeholder { color: rgba(255, 237, 0, 0.5); } /* Webkit Auto-fill Override */ .search-input:-webkit-autofill, .search-input:-webkit-autofill:hover, .search-input:-webkit-autofill:focus { -webkit-box-shadow: 0 0 0 1000px #000 inset !important; -webkit-text-fill-color: #FFED00 !important; } .clear-btn { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); background: none; border: none; color: #FFED00; font-size: 24px; cursor: pointer; padding: 4px 6px; display: none; line-height: 1; opacity: 0.7; transition: opacity 0.2s; } .clear-btn:hover, .clear-btn:active { opacity: 1; } .search-input:not(:placeholder-shown) ~ .clear-btn { display: block; } .suggestions { position: absolute; top: 100%; left: 0; right: 0; background-color: #0a0a0a; border: 2px solid #FFED00; border-top: none; border-radius: 0 0 6px 6px; max-height: 300px; overflow-y: auto; z-index: 1000; display: none; } .suggestions.active { display: block; } .suggestion-item { padding: 12px; cursor: pointer; border-bottom: 1px solid #222; transition: background-color 0.15s; } .suggestion-item:last-child { border-bottom: none; } .suggestion-item:hover, .suggestion-item:active { background-color: #FFED00; color: #000; } .suggestion-name { font-size: 14px; font-weight: bold; } .suggestion-products { font-size: 11px; opacity: 0.7; margin-top: 4px; } .button-group { display: flex; flex-direction: column; gap: 0; margin-top: 0; } .btn { flex: 1; padding: 12px; font-family: 'Courier New', monospace; font-size: 14px; background-color: #FFED00; color: #000; border: none; border-radius: 6px; cursor: pointer; font-weight: bold; transition: background-color 0.15s; } .btn-full-width { width: 100%; } .btn:active { background-color: #FFD700; } .btn:disabled { opacity: 0.4; cursor: not-allowed; background-color: #666; } .departures-container { margin-top: 20px; } .station-info { background-color: #0a0a0a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #FFED00; } .station-name { font-size: 22px; font-weight: bold; margin-bottom: 6px; } .last-update { font-size: 13px; opacity: 0.6; } .departure-item { background-color: #0a0a0a; padding: 14px; margin-bottom: 10px; border-radius: 8px; border-left: 4px solid #666; display: flex; justify-content: space-between; align-items: center; cursor: pointer; transition: background-color 0.15s; } .departure-item:active { background-color: #111; } .departure-info { flex: 1; } .departure-header { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; flex-wrap: wrap; } .line-badge { display: inline-block; padding: 6px 12px; border-radius: 4px; font-weight: bold; font-size: 16px; } .departure-destination { font-size: 18px; margin-bottom: 4px; } .departure-platform { display: inline-flex; align-items: center; gap: 4px; padding: 4px 10px; background-color: #1a1a1a; border-radius: 3px; font-size: 13px; border: 1px solid #333; } .platform-icon { font-size: 12px; opacity: 0.7; } .platform-text { font-weight: bold; color: #FFED00; } .departure-time { text-align: right; font-size: 24px; font-weight: bold; min-width: 70px; } .departure-delay { font-size: 13px; color: #ff5555; margin-top: 4px; font-weight: bold; } /* Journey Planner */ .journey-inputs { margin-bottom: 15px; } .journey-input-group { margin-bottom: 12px; } .journey-label { display: block; font-size: 16px; margin-bottom: 8px; font-weight: bold; } .swap-btn { width: 100%; padding: 12px; margin: 15px 0; background-color: #0a0a0a; color: #FFED00; border: 1px solid #333; border-radius: 6px; font-size: 20px; cursor: pointer; transition: background-color 0.2s; } .swap-btn:active { background-color: #1a1a1a; } .journey-container { margin-top: 15px; } .journey-result { background-color: #0a0a0a; border: 1px solid #222; border-radius: 8px; padding: 15px; margin-bottom: 12px; } .journey-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; padding-bottom: 12px; border-bottom: 1px solid #222; } .journey-time { font-size: 20px; font-weight: bold; } .journey-duration { font-size: 14px; opacity: 0.7; } .journey-legs { margin-top: 12px; } .journey-leg { margin-bottom: 12px; padding: 16px; background-color: #050505; border-radius: 6px; border-left: 4px solid #666; } .journey-leg-header { display: flex; align-items: center; gap: 15px; margin-bottom: 15px; } .journey-leg-icon { font-size: 28px; min-width: 32px; } .journey-leg-line { font-weight: bold; font-size: 20px; flex: 1; } .journey-leg-duration { font-size: 16px; opacity: 0.6; } .journey-leg-stop { display: grid; grid-template-columns: 1fr auto auto; gap: 30px; align-items: center; padding: 10px 0; border-bottom: 1px solid #111; } .journey-leg-stop:last-child { border-bottom: none; } .journey-leg-station { font-size: 18px; font-weight: 500; } .journey-leg-platform { font-size: 16px; color: #FFED00; font-weight: bold; min-width: 100px; text-align: right; } .journey-leg-time { font-size: 20px; font-weight: bold; text-align: right; min-width: 70px; } .journey-transfer { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 16px; margin: 10px 0; background-color: #1a1a00; border-radius: 4px; font-size: 14px; border-left: 3px solid #FFED00; } .journey-transfer.tight { background-color: #2a1a00; border-left-color: #ff9900; } .journey-transfer.very-tight { background-color: #2a0000; border-left-color: #ff3333; } .journey-transfer-time { font-weight: bold; color: #FFED00; font-size: 16px; margin-left: auto; } .journey-transfer.tight .journey-transfer-time { color: #ff9900; } .journey-transfer.very-tight .journey-transfer-time { color: #ff3333; } .loading { text-align: center; padding: 40px; font-size: 18px; animation: pulse 1.5s ease-in-out infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .error { background: linear-gradient(135deg, #ff4444 0%, #cc0000 100%); color: #fff; padding: 18px; border-radius: 12px; margin: 15px 0; text-align: center; box-shadow: 0 4px 20px rgba(255, 68, 68, 0.4); border: 1px solid rgba(255, 255, 255, 0.1); } .empty-state { text-align: center; padding: 50px 20px; opacity: 0.7; } .empty-state-icon { font-size: 56px; margin-bottom: 20px; animation: float 3s ease-in-out infinite; } @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } } .offline-indicator { background: linear-gradient(135deg, #ff4444 0%, #cc0000 100%); color: #fff; padding: 12px; text-align: center; font-size: 12px; position: fixed; top: 0; left: 0; right: 0; z-index: 200; display: none; box-shadow: 0 2px 10px rgba(255, 68, 68, 0.5); font-weight: bold; letter-spacing: 0.5px; } .offline-indicator.show { display: block; animation: slideDown 0.3s ease-out; } @keyframes slideDown { from { transform: translateY(-100%); } to { transform: translateY(0); } } /* Detail Modal */ .detail-modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.97); z-index: 10005; display: none; overflow-y: auto; -webkit-overflow-scrolling: touch; } .detail-modal.active { display: block; } .detail-header { position: sticky; top: 0; background-color: #000; padding: 15px; border-bottom: 2px solid #FFED00; display: flex; justify-content: space-between; align-items: center; z-index: 10006; } .detail-back-btn { background: none; border: 1px solid #FFED00; color: #FFED00; font-size: 22px; cursor: pointer; padding: 6px 12px; font-family: 'Courier New', monospace; border-radius: 6px; transition: background-color 0.15s; } .detail-back-btn:active { background-color: #FFED00; color: #000; } .detail-title { flex: 1; text-align: center; font-size: 16px; font-weight: bold; } .detail-content { padding: 15px; } .detail-section { background-color: #0a0a0a; padding: 15px; margin-bottom: 12px; border-radius: 8px; border-left: 4px solid #FFED00; } .detail-section-title { font-size: 13px; font-weight: bold; margin-bottom: 10px; opacity: 0.8; text-transform: uppercase; letter-spacing: 0.5px; } .detail-row { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #222; } .detail-row:last-child { border-bottom: none; } .detail-label { font-size: 12px; opacity: 0.7; } .detail-value { font-size: 12px; font-weight: bold; text-align: right; } .stop-list { margin-top: 10px; } .stop-item { padding: 10px; margin-bottom: 8px; background-color: #050505; border-radius: 6px; border-left: 3px solid #555; transition: background-color 0.15s; } .stop-item.current { border-left-color: #FFED00; background-color: #0f0f0a; } .stop-name { font-size: 13px; font-weight: bold; margin-bottom: 4px; } .stop-time { font-size: 11px; opacity: 0.7; } .stop-delay { color: #ff5555; font-size: 11px; margin-left: 8px; font-weight: bold; } .remark-item { background-color: #0a0500; padding: 10px; margin-bottom: 8px; border-radius: 6px; border-left: 3px solid #ff8800; } .remark-type { font-size: 10px; opacity: 0.7; text-transform: uppercase; margin-bottom: 4px; color: #ff8800; font-weight: bold; } .remark-text { font-size: 12px; line-height: 1.3; } .loading-detail { text-align: center; padding: 50px 20px; font-size: 16px; opacity: 0.7; } /* Journey Detail Modal */ .journey-detail-leg { margin-bottom: 20px; padding: 15px; background-color: #050505; border-radius: 6px; } .journey-detail-leg-header { display: flex; align-items: center; gap: 10px; margin-bottom: 15px; padding-bottom: 10px; border-bottom: 1px solid #222; } .journey-detail-stop { padding: 10px 0; margin-left: 30px; } .journey-detail-stop-time { font-size: 18px; font-weight: bold; color: #FFED00; margin-bottom: 4px; } .journey-detail-stop-name { font-size: 14px; margin-bottom: 3px; } .journey-detail-platform { font-size: 11px; color: #FFED00; opacity: 0.8; } .journey-detail-intermediate { margin: 8px 0 8px 30px; padding: 8px; background-color: #0a0a0a; border-radius: 4px; } .journey-detail-transfer { display: flex; flex-direction: column; gap: 4px; padding: 12px; margin: 10px 0; background-color: #1a1a00; border-radius: 4px; border-left: 3px solid #FFED00; font-size: 12px; } .journey-detail-transfer.tight { background-color: #2a1a00; border-left-color: #ff9900; } .journey-detail-transfer.very-tight { background-color: #2a0000; border-left-color: #ff3333; } /* Touch improvements */ .departure-item { min-height: 70px; -webkit-tap-highlight-color: rgba(255, 237, 0, 0.1); } .suggestion-item { min-height: 50px; -webkit-tap-highlight-color: rgba(255, 237, 0, 0.1); } /* Better scrolling */ .suggestions { -webkit-overflow-scrolling: touch; scrollbar-width: thin; scrollbar-color: #FFED00 #1a1a1a; } .suggestions::-webkit-scrollbar { width: 6px; } .suggestions::-webkit-scrollbar-track { background: #1a1a1a; } .suggestions::-webkit-scrollbar-thumb { background-color: #FFED00; border-radius: 3px; } /* Improved button spacing */ .btn { min-height: 48px; } .location-btn-side { width: 48px; height: 48px; min-width: 48px; min-height: 48px; padding: 0; font-size: 20px; background-color: #000; color: #FFED00; border: 2px solid #FFED00; border-radius: 6px; cursor: pointer; transition: background-color 0.15s, color 0.15s; -webkit-appearance: none; -moz-appearance: none; appearance: none; outline: none; display: flex; align-items: center; justify-content: center; flex-shrink: 0; box-sizing: border-box; } .location-btn-side:active { background-color: #FFED00; color: #000; } .location-btn-side:disabled { opacity: 0.4; cursor: not-allowed; } /* KEIN Scale/Transform - nur Emoji ändert sich */ .location-btn-side.loading { /* Button bleibt gleich, nur Emoji wird gewechselt */ } /* Status badge */ .status-badge { display: inline-block; padding: 4px 8px; border-radius: 4px; font-size: 10px; margin-left: 8px; font-weight: bold; } .status-cancelled { background-color: #cc0000; color: #fff; } .status-ontime { background-color: #00cc00; color: #000; } @media (min-width: 768px) { .container { max-width: 600px; margin: 0 auto; padding: 20px; } } /* Pull-to-refresh styles */ .ptr-container { position: fixed; top: 0; left: 0; right: 0; height: 60px; display: flex; align-items: center; justify-content: center; background-color: #000; transform: translateY(-100%); transition: transform 0.3s; z-index: 99; } .ptr-container.pulling { transform: translateY(0); } .ptr-spinner { width: 30px; height: 30px; border: 3px solid #333; border-top-color: #FFED00; border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* ============================================ RESPONSIVE DESIGN ============================================ */ /* Tablet & Desktop */ @media (min-width: 768px) { .container { max-width: 1200px; margin: 0 auto; padding: 20px 30px; } .header h1 { font-size: 32px; letter-spacing: 3px; } .header .subtitle { font-size: 13px; } .menu-btn { font-size: 28px; padding: 10px 16px; right: 20px; } /* Hover-Effekte für Desktop */ .menu-btn:hover { background-color: rgba(255, 237, 0, 0.1); } .nav-item:hover { background-color: #1a1a1a; } .departure-item:hover { background-color: #111; transform: translateX(4px); transition: transform 0.2s; } .journey-result:hover { background-color: #111; border-color: #333; } .btn:hover { background-color: rgba(255, 237, 0, 0.1); } .swap-btn:hover { background-color: #1a1a1a; } .suggestion-item:hover { background-color: #2a2a2a; } .nav-menu { width: 280px; } /* Header größer auf Desktop */ .header h1 { font-size: 36px; letter-spacing: 3px; } .header .subtitle { font-size: 14px; } .header .author { font-size: 11px; } /* Controls größer */ .controls { padding: 20px; background-color: rgba(10, 10, 10, 0.5); border-radius: 8px; } .search-input { height: 56px; font-size: 18px; padding: 14px 50px 14px 14px; } .location-btn-side { width: 56px; height: 56px; min-width: 56px; min-height: 56px; font-size: 22px; } .btn { padding: 18px; font-size: 18px; min-height: 60px; } .btn-full-width { width: 100%; font-size: 18px; } /* Journey Input - 2 Column Layout */ .journey-inputs { display: grid; grid-template-columns: 1fr auto 1fr; gap: 20px; align-items: start; } .journey-input-group { margin-bottom: 0; } .swap-btn { margin: 45px 0 0 0; width: auto; padding: 12px 20px; } .journey-label { font-size: 18px; } /* Station Info größer */ .station-info { padding: 25px; background: linear-gradient(135deg, #0a0a0a 0%, #1a1a00 100%); } .station-name { font-size: 28px; } .last-update { font-size: 15px; } /* Departure Items größer */ .departure-item { padding: 24px; margin-bottom: 18px; cursor: pointer; } .line-badge { padding: 8px 16px; font-size: 20px; } .departure-destination { font-size: 22px; } .departure-platform { font-size: 16px; padding: 5px 12px; } .platform-icon { font-size: 14px; } .departure-time { font-size: 32px; } .departure-delay { font-size: 16px; } /* Journey Results */ .journey-result { padding: 25px; margin-bottom: 20px; cursor: pointer; transition: all 0.2s; } .journey-time { font-size: 32px; } .journey-duration { font-size: 20px; } .journey-leg { padding: 25px; } .journey-leg-header { margin-bottom: 20px; } .journey-leg-icon { font-size: 36px; } .journey-leg-line { font-size: 28px; } .journey-leg-duration { font-size: 20px; } .journey-leg-stop { padding: 14px 0; gap: 40px; } .journey-leg-station { font-size: 22px; } .journey-leg-platform { font-size: 20px; min-width: 120px; } .journey-leg-time { font-size: 24px; min-width: 80px; } .journey-transfer { padding: 18px 24px; font-size: 20px; } .journey-transfer-time { font-size: 22px; } /* Detail Modal */ .detail-header { padding: 28px; } .detail-title { font-size: 26px; } .detail-content { padding: 32px 28px; } .detail-section { padding: 24px; } .stop-item { padding: 16px; } .stop-name { font-size: 18px; } /* Journey Detail Modal */ .journey-detail-leg { padding: 22px; } .journey-detail-stop-time { font-size: 24px; } .journey-detail-stop-name { font-size: 20px; } .journey-detail-platform { font-size: 16px; } .journey-detail-transfer { font-size: 18px; } } /* Large Desktop - 2 Column Layout */ @media (min-width: 1200px) { .container { padding: 30px 40px; } /* Journey auch größer */ .journey-result { padding: 30px; } .journey-leg { padding: 16px; } } /* Extra Large Desktop */ @media (min-width: 1600px) { .container { max-width: 820px; /* Lesebreite statt Riesenfläche */ } } /* Mobile Optimierungen */ @media (max-width: 767px) { /* Mobile Design mit größerer Schrift */ .container { padding: 10px; } .header { padding: 15px 10px 12px; } .header-title { max-width: calc(100% - 80px); padding-left: 10px; } .header h1 { font-size: 24px; letter-spacing: 1.5px; } .header .subtitle { font-size: 12px; } .header .author { font-size: 10px; } .menu-btn { font-size: 26px; padding: 8px 12px; right: 10px; } .controls { padding: 12px; } .search-input { font-size: 18px; padding: 12px 44px 12px 12px; height: 48px; } .location-btn-side { width: 48px; height: 48px; min-width: 48px; min-height: 48px; font-size: 20px; } .btn { padding: 14px; font-size: 18px; } .btn-full-width { width: 100%; font-size: 18px; } .station-info { padding: 14px; } .station-name { font-size: 20px; } .last-update { font-size: 12px; } .departure-item { padding: 16px; margin-bottom: 12px; } .line-badge { padding: 6px 12px; font-size: 16px; } .departure-destination { font-size: 18px; } .departure-platform { font-size: 14px; padding: 4px 10px; } .platform-icon { font-size: 13px; } .departure-time { font-size: 26px; } .departure-delay { font-size: 14px; } .journey-result { padding: 16px; margin-bottom: 12px; } .journey-header { margin-bottom: 12px; padding-bottom: 12px; } .journey-time { font-size: 20px; } .journey-duration { font-size: 16px; } .journey-leg { padding: 14px; } .journey-leg-header { margin-bottom: 10px; gap: 10px; } .journey-leg-icon { font-size: 22px; } .journey-leg-line { font-size: 17px; } .journey-leg-duration { font-size: 13px; } .journey-leg-stop { padding: 6px 0; gap: 12px; } .journey-leg-station { font-size: 15px; } .journey-leg-platform { font-size: 13px; min-width: 70px; } .journey-leg-time { font-size: 16px; min-width: 55px; } .journey-transfer { padding: 12px 14px; font-size: 15px; } .journey-transfer-time { font-size: 17px; } .journey-label { font-size: 16px; } .swap-btn { margin: 12px 0; font-size: 20px; } body { overflow-x: hidden; } /* Text truncation für lange Namen */ .departure-destination { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } } /* Extra Small Mobile (SE, kleine Geräte) */ @media (max-width: 360px) { .header h1 { font-size: 20px; } .departure-item { padding: 10px; } .line-badge { font-size: 11px; } .departure-destination { font-size: 13px; } .departure-time { font-size: 16px; } } /* Live-Map Styles */ .livemap-container { width: 100%; height: calc(100vh - 140px); position: relative; overflow: hidden; } #liveMap { width: 100%; height: 100%; } .livemap-controls { position: absolute; top: 10px; left: 10px; right: 10px; z-index: 1000; display: flex; flex-direction: column; gap: 10px; } .livemap-info { background-color: rgba(0, 0, 0, 0.85); padding: 12px 16px; border-radius: 8px; border: 2px solid #FFED00; font-size: 16px; font-weight: bold; text-align: center; color: #FFED00; } .livemap-filters { display: flex; gap: 8px; flex-wrap: wrap; justify-content: center; } .filter-btn { background-color: rgba(0, 0, 0, 0.85); border: 2px solid #666; color: #FFED00; padding: 8px 14px; border-radius: 6px; font-family: 'Courier New', monospace; font-size: 14px; cursor: pointer; transition: all 0.2s; font-weight: bold; } .filter-btn.active { background-color: #FFED00; color: #000; border-color: #FFED00; } .filter-btn:active { transform: scale(0.95); } /* Leaflet Marker Styling */ .vehicle-marker-container { display: flex; flex-direction: column; align-items: center; animation: pulse-marker 2s ease-in-out infinite; cursor: pointer; } .vehicle-emoji { font-size: 28px; line-height: 1; margin-bottom: 3px; text-shadow: 2px 2px 4px rgba(0,0,0,0.8); filter: drop-shadow(0 0 3px rgba(255,237,0,0.3)); } .vehicle-line { font-family: 'Courier New', monospace; font-size: 11px; font-weight: bold; padding: 3px 6px; border-radius: 4px; border: 2px solid #000; min-width: 28px; text-align: center; box-shadow: 0 2px 6px rgba(0,0,0,0.6); white-space: nowrap; line-height: 1; } @keyframes pulse-marker { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.1); } } .vehicle-popup { font-family: 'Courier New', monospace; background-color: #000 !important; color: #fff; } .vehicle-popup .popup-line { font-size: 16px; font-weight: bold; text-align: center; } .vehicle-popup .popup-direction { font-size: 14px; margin-bottom: 6px; color: #fff; text-align: center; } .vehicle-popup .popup-delay { font-size: 12px; color: #ff5555; font-weight: bold; text-align: center; } /* Leaflet Popup Dark Mode */ .leaflet-popup-content-wrapper { background-color: #000 !important; border: 2px solid #FFED00 !important; border-radius: 8px !important; padding: 12px !important; } .leaflet-popup-tip { background-color: #000 !important; } .leaflet-popup-content { margin: 0 !important; } /* Popup über alles andere (Header hat z-index: 10000, Nav: 10003) */ .leaflet-popup-pane { z-index: 10010 !important; } .leaflet-popup { z-index: 10010 !important; } @media (max-width: 767px) { .livemap-controls { top: 5px; left: 5px; right: 5px; } .livemap-info { padding: 10px 12px; font-size: 14px; } .filter-btn { padding: 6px 10px; font-size: 12px; } .vehicle-emoji { font-size: 24px; } .vehicle-line { font-size: 10px; padding: 2px 5px; min-width: 24px; } } @media (min-width: 768px) { .vehicle-emoji { font-size: 32px; } .vehicle-line { font-size: 12px; padding: 4px 8px; min-width: 32px; } } /* ========================================== HOME VIEW STYLING - COMBINED HERO! ========================================== */ .home-container { max-width: 900px; margin: 0 auto; padding: 0; padding-bottom: 70px; } /* Combined Hero + Navigation Box - ALLES IN EINER BOX! */ .home-hero-combined { background: linear-gradient(135deg, #000 0%, #1a1a1a 100%); border: 3px solid #FFED00; border-radius: 12px; padding: 20px; margin: 20px 20px 20px 20px; } /* Navigation Hint - OBEN in der Box */ .home-nav-hint { margin-bottom: 20px; padding-bottom: 20px; border-bottom: 2px solid #333; } .home-hint-text { flex: 1; color: #fff; line-height: 1.6; font-size: 14px; } .home-hint-text strong { color: #FFED00; } /* Hero Title - UNTEN in der Box */ .home-hero-title { text-align: center; } .home-hero-title h1 { font-family: 'Courier New', monospace; font-size: 32px; color: #FFED00; margin: 0 0 8px 0; letter-spacing: 2px; } .home-hero-title p { font-size: 15px; color: #fff; margin: 0 0 12px 0; } .home-version { display: inline-block; background: #FFED00; color: #000; padding: 4px 10px; border-radius: 20px; font-size: 11px; font-weight: bold; } /* Quick Info Cards */ .home-quick-info { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin: 0 20px 20px 20px; } .home-info-card { background: #1a1a1a; border: 1px solid #333; border-radius: 8px; padding: 15px 12px; text-align: center; } .home-info-icon { font-size: 32px; margin-bottom: 8px; } .home-info-text strong { display: block; color: #FFED00; font-size: 13px; margin-bottom: 4px; } .home-info-text p { margin: 0; color: #999; font-size: 11px; line-height: 1.3; } /* Two Column Layout */ .home-columns { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin: 0 20px 20px 20px; } .home-box { background: #1a1a1a; border: 1px solid #333; border-radius: 8px; padding: 18px; } .home-box-title { font-family: 'Courier New', monospace; font-size: 18px; color: #FFED00; margin: 0 0 15px 0; padding-bottom: 8px; border-bottom: 2px solid #333; } /* Update/Changelog Items */ .home-update { margin-bottom: 12px; padding: 10px; background: #000; border-radius: 6px; border: 1px solid #333; } .home-update-latest { border: 2px solid #FFED00; } .home-update-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px; } .home-update-version { background: #FFED00; color: #000; padding: 2px 8px; border-radius: 4px; font-weight: bold; font-size: 11px; } .home-update-date { color: #888; font-size: 10px; } .home-update h3 { font-size: 13px; color: #FFED00; margin: 0 0 6px 0; } .home-update ul { margin: 0; padding-left: 16px; color: #ccc; } .home-update li { margin-bottom: 3px; font-size: 12px; line-height: 1.4; } /* Details/Summary (Collapsible) */ .home-details { margin-top: 10px; } .home-summary { cursor: pointer; padding: 8px; background: #000; border: 1px solid #333; border-radius: 6px; color: #FFED00; font-weight: bold; font-size: 12px; user-select: none; text-align: center; } .home-summary:hover { background: #1a1a1a; } .home-details[open] .home-summary { border-bottom-left-radius: 0; border-bottom-right-radius: 0; margin-bottom: 10px; } /* Credit Items */ .home-credit { margin-bottom: 10px; padding: 8px; background: #000; border-radius: 6px; border: 1px solid #333; } .home-credit:last-child { margin-bottom: 0; } .home-credit strong { color: #FFED00; display: block; margin-bottom: 3px; font-size: 12px; } .home-credit p { margin: 0; color: #ccc; font-size: 12px; line-height: 1.4; } .home-credit a { color: #FFED00; text-decoration: none; } .home-credit a:hover { text-decoration: underline; } /* Features Box */ .home-features-box { background: #1a1a1a; border: 1px solid #333; border-radius: 8px; padding: 18px; margin: 0 20px 20px 20px; } .home-features-box h3 { font-family: 'Courier New', monospace; font-size: 18px; color: #FFED00; margin: 0 0 12px 0; padding-bottom: 8px; border-bottom: 2px solid #333; } .home-features-box ul { margin: 0; padding-left: 20px; color: #ccc; } .home-features-box li { margin-bottom: 8px; font-size: 13px; line-height: 1.5; } .home-features-box li:last-child { margin-bottom: 0; } .home-features-box strong { color: #FFED00; } /* Footer */ .home-footer { text-align: center; padding: 20px; margin: 0 20px; color: #888; border-top: 1px solid #333; } .home-footer p { margin: 5px 0; font-size: 13px; } .home-footer strong { color: #FFED00; } .home-footer-small { font-size: 11px; color: #666; } .home-footer-github { margin-top: 15px !important; } .home-footer-github a { display: inline-block; padding: 8px 16px; background: #1a1a1a; color: #FFED00; text-decoration: none; border-radius: 5px; border: 1px solid #333; font-size: 13px; transition: all 0.2s ease; } .home-footer-github a:hover { background: #FFED00; color: #000; border-color: #FFED00; } /* GitHub Link Button */ .home-github-link { text-align: center; margin: 20px 0; padding-bottom: 20px; border-bottom: 2px solid #333; } .home-github-btn { display: inline-block; padding: 12px 24px; background: #1a1a1a; color: #FFED00; text-decoration: none; border-radius: 5px; border: 2px solid #FFED00; font-size: 14px; font-weight: bold; transition: all 0.2s ease; } .home-github-btn:hover { background: #FFED00; color: #000; transform: translateY(-2px); } /* Mobile Responsive */ @media (max-width: 767px) { .home-container { padding-bottom: 60px; } .home-hero-combined { padding: 15px; margin: 15px 15px 15px 15px; } .home-nav-hint { text-align: center; margin-bottom: 15px; padding-bottom: 15px; } .home-hint-text { font-size: 13px; } .home-hero-title h1 { font-size: 26px; } .home-hero-title p { font-size: 13px; } /* Quick Info Cards - Single Row on Mobile */ .home-quick-info { grid-template-columns: 1fr; gap: 10px; margin: 0 15px 15px 15px; } .home-info-card { display: flex; align-items: center; gap: 12px; text-align: left; padding: 12px; } .home-info-icon { font-size: 28px; margin-bottom: 0; } .home-info-text strong { font-size: 14px; } .home-info-text p { font-size: 12px; } /* Single Column on Mobile */ .home-columns { grid-template-columns: 1fr; gap: 12px; margin: 0 15px 15px 15px; } .home-box { padding: 15px; } .home-box-title { font-size: 16px; } .home-features-box { padding: 15px; margin: 0 15px 15px 15px; } .home-features-box h3 { font-size: 16px; } .home-footer { margin: 0 15px; } .home-github-btn { font-size: 13px; padding: 10px 18px; } .home-footer-github a { font-size: 12px; padding: 7px 14px; } } /* ========================================== FILTER STYLES - Abfahrten & Routenplaner ========================================== */ .departure-filters, .journey-transport-filters { padding: 12px; background-color: #0a0a0a; border-radius: 8px; margin-top: 12px; } .filter-label { color: #FFED00; font-size: 13px; font-weight: bold; margin-bottom: 8px; } /* Einheitliche Chip-Reihe für ALLE Filtergruppen */ .filter-chips { display: flex; gap: 8px; flex-wrap: wrap; } .filter-btn, .transport-filter-btn { background-color: #1a1a1a; border: 2px solid #333; color: #fff; padding: 8px 14px; border-radius: 6px; font-family: var(--font-stack); font-size: 13px; cursor: pointer; transition: all 0.2s; flex-shrink: 0; } /* (Sondergröße entfernt - Journey-Chips waren doppelt so groß wie alle anderen Filter und brachen unruhig um) */ .filter-btn.active, .transport-filter-btn.active { background-color: #FFED00; color: #000; border-color: #FFED00; } .filter-btn:hover, .transport-filter-btn:hover { border-color: #FFED00; } .filter-btn:active, .transport-filter-btn:active { transform: scale(0.95); } /* ========================================== DEVELOPER VIEW - PREMIUM DESIGN (NO GLOW) Ersetze die bestehenden .developer-* und .dev-* Regeln ========================================== */ /* Developer Header - Schöner Gradient */ .developer-header { text-align: center; padding: 30px 20px; margin-bottom: 25px; background: linear-gradient(135deg, #000 0%, #1a1a00 50%, #000 100%); border: 3px solid #FFED00; border-radius: 16px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5); } .developer-header h2 { font-size: 32px; color: #FFED00; margin: 0 0 10px 0; font-family: 'Courier New', monospace; letter-spacing: 2px; } .developer-subtitle { font-size: 15px; color: #aaa; margin: 0; opacity: 0.9; } /* Developer Tabs - Premium Look */ .developer-tabs { display: flex; gap: 10px; margin-bottom: 0; overflow-x: auto; padding: 15px; background: linear-gradient(180deg, #0a0a0a 0%, #000 100%); border-radius: 12px 12px 0 0; border: 2px solid #222; border-bottom: none; -webkit-overflow-scrolling: touch; scrollbar-width: thin; scrollbar-color: #FFED00 #1a1a1a; box-shadow: inset 0 2px 10px rgba(0, 0, 0, 0.5); } .developer-tabs::-webkit-scrollbar { height: 8px; } .developer-tabs::-webkit-scrollbar-track { background: #0a0a0a; border-radius: 4px; } .developer-tabs::-webkit-scrollbar-thumb { background: linear-gradient(90deg, #FFED00 0%, #FFD700 100%); border-radius: 4px; } .developer-tabs::-webkit-scrollbar-thumb:hover { background: #FFED00; } /* Developer Tab - Schöne 3D Buttons */ .dev-tab { background: linear-gradient(180deg, #1a1a1a 0%, #0a0a0a 100%); border: 2px solid #333; color: #FFED00; padding: 14px 24px; border-radius: 10px 10px 0 0; font-family: 'Courier New', monospace; font-size: 14px; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); white-space: nowrap; flex-shrink: 0; min-width: 130px; text-align: center; -webkit-tap-highlight-color: transparent; position: relative; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.4); } /* Tab Hover Effect */ .dev-tab::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(180deg, rgba(255, 237, 0, 0) 0%, rgba(255, 237, 0, 0.05) 100%); border-radius: 10px 10px 0 0; opacity: 0; transition: opacity 0.3s ease; } .dev-tab:hover::before { opacity: 1; } /* Active Tab */ .dev-tab.active { background: linear-gradient(180deg, #FFED00 0%, #FFD700 100%); color: #000; border-color: #FFED00; border-bottom-color: transparent; font-weight: bold; transform: translateY(3px); box-shadow: 0 2px 15px rgba(0, 0, 0, 0.3); } .dev-tab.active::before { display: none; } .dev-tab:active { transform: scale(0.97) translateY(1px); } /* Tab Content */ .dev-tab-content { display: none; padding: 25px 15px; background: linear-gradient(180deg, #0a0a0a 0%, #000 100%); border: 2px solid #222; border-top: 3px solid #FFED00; border-radius: 0 0 12px 12px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5); position: relative; } .dev-tab-content.active { display: block; animation: fadeInContent 0.4s cubic-bezier(0.4, 0, 0.2, 1); } @keyframes fadeInContent { from { opacity: 0; transform: translateY(-15px); } to { opacity: 1; transform: translateY(0); } } /* ========================================== CHANGELOG - VERBESSERTE FORMATIERUNG ========================================== */ .changelog-container { padding: 0; } /* Changelog Item - Große Card */ .changelog-item { background: linear-gradient(135deg, #0a0a0a 0%, #000 100%); border: 2px solid #333; border-radius: 12px; padding: 0; margin-bottom: 20px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); overflow: hidden; transition: all 0.3s ease; } .changelog-item:hover { transform: translateY(-2px); box-shadow: 0 8px 30px rgba(0, 0, 0, 0.5); border-color: #444; } .changelog-item.latest { border: 3px solid #FFED00; background: linear-gradient(135deg, #0a0a00 0%, #000 100%); } /* Changelog Header - Gelber Top-Bar */ .changelog-header { background: linear-gradient(90deg, #1a1a1a 0%, #0a0a0a 100%); padding: 15px 20px; display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #333; } .changelog-item.latest .changelog-header { background: linear-gradient(90deg, #FFED00 0%, #FFD700 100%); } .changelog-version { background: #000; color: #FFED00; padding: 6px 16px; border-radius: 20px; font-weight: bold; font-size: 14px; border: 2px solid #FFED00; } .changelog-item.latest .changelog-version { background: #000; color: #FFED00; border-color: #000; animation: pulse 2s ease-in-out infinite; } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } } .changelog-date { color: #888; font-size: 13px; font-weight: bold; } .changelog-item.latest .changelog-date { color: #000; } /* Changelog Body */ .changelog-body { padding: 20px; } .changelog-title { font-size: 20px; color: #FFED00; margin: 0 0 15px 0; font-weight: bold; padding-bottom: 10px; border-bottom: 1px solid #222; } /* Changelog Changes - Grid Layout */ .changelog-changes { margin: 0; padding: 0; list-style: none; display: grid; gap: 12px; } .changelog-changes li { background: #0a0a0a; padding: 12px 15px; border-radius: 8px; border-left: 4px solid #555; font-size: 14px; line-height: 1.6; color: #ccc; display: flex; align-items: flex-start; gap: 10px; transition: all 0.2s ease; } .changelog-changes li:hover { background: #111; border-left-color: #FFED00; transform: translateX(3px); } /* Change Type Icons */ .changelog-changes li::before { content: '✓'; display: inline-block; width: 20px; height: 20px; background: #FFED00; color: #000; border-radius: 50%; text-align: center; line-height: 20px; font-weight: bold; font-size: 12px; flex-shrink: 0; margin-top: 2px; } .changelog-changes li strong { color: #FFED00; font-weight: bold; } /* Spezielle Change Types */ .changelog-changes li[data-type="new"]::before { content: '★'; background: #FFED00; } .changelog-changes li[data-type="fix"]::before { content: '🔧'; background: none; font-size: 16px; } .changelog-changes li[data-type="improve"]::before { content: '↑'; background: #00cc00; } .changelog-changes li[data-type="remove"]::before { content: '✗'; background: #cc0000; } /* Info Boxes */ .dev-info-container { display: grid; grid-template-columns: 1fr; gap: 18px; } .dev-info-box { background: linear-gradient(135deg, #0a0a0a 0%, #000 100%); border: 1px solid #333; border-radius: 12px; padding: 20px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); transition: all 0.3s ease; } .dev-info-box:hover { transform: translateY(-3px); box-shadow: 0 8px 30px rgba(0, 0, 0, 0.5); border-color: #FFED00; } .dev-info-box h3 { font-size: 19px; color: #FFED00; margin: 0 0 15px 0; padding-bottom: 12px; border-bottom: 2px solid #333; font-family: 'Courier New', monospace; } .dev-info-table { width: 100%; border-collapse: collapse; } .dev-info-table tr { border-bottom: 1px solid #1a1a1a; transition: background-color 0.2s ease; } .dev-info-table tr:hover { background-color: #0a0a0a; } .dev-info-table tr:last-child { border-bottom: none; } .dev-info-table td { padding: 12px 0; font-size: 13px; color: #ccc; } .dev-info-table td:first-child { color: #888; width: 40%; } .dev-info-table td:last-child { color: #fff; font-weight: bold; } .status-badge-dev { display: inline-block; padding: 4px 12px; border-radius: 20px; font-size: 11px; font-weight: bold; background: linear-gradient(135deg, #00cc00 0%, #00aa00 100%); } /* GitHub Link Button */ .github-link-btn { display: block; text-align: center; padding: 16px 28px; margin: 25px 0 0 0; background: linear-gradient(135deg, #1a1a1a 0%, #0a0a0a 100%); color: #FFED00; text-decoration: none; border-radius: 12px; border: 2px solid #FFED00; font-size: 16px; font-weight: bold; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); font-family: 'Courier New', monospace; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); position: relative; overflow: hidden; } .github-link-btn::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 237, 0, 0.1), transparent); transition: left 0.5s ease; } .github-link-btn:hover::before { left: 100%; } .github-link-btn:hover { background: linear-gradient(135deg, #FFED00 0%, #FFD700 100%); color: #000; transform: translateY(-3px); box-shadow: 0 8px 30px rgba(0, 0, 0, 0.5); } .github-link-btn:active { transform: translateY(-1px); } /* Features Details */ .dev-features-container { padding: 0; } .feature-detail { background: linear-gradient(135deg, #0a0a0a 0%, #000 100%); border: 1px solid #333; border-radius: 12px; margin-bottom: 15px; overflow: hidden; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); transition: all 0.3s ease; } .feature-detail:hover { border-color: #444; box-shadow: 0 6px 25px rgba(0, 0, 0, 0.5); } .feature-detail[open] { border-color: #FFED00; box-shadow: 0 8px 30px rgba(0, 0, 0, 0.5); } .feature-detail summary { background: linear-gradient(135deg, #1a1a1a 0%, #0a0a0a 100%); padding: 16px 20px; cursor: pointer; font-size: 16px; font-weight: bold; color: #FFED00; user-select: none; transition: all 0.3s ease; -webkit-tap-highlight-color: transparent; list-style: none; position: relative; } .feature-detail summary::-webkit-details-marker { display: none; } .feature-detail summary::after { content: '▼'; position: absolute; right: 20px; transition: transform 0.3s ease; font-size: 12px; } .feature-detail[open] summary::after { transform: rotate(180deg); } .feature-detail summary:hover { background: linear-gradient(135deg, #222 0%, #111 100%); padding-left: 25px; box-shadow: inset 4px 0 0 #FFED00; } .feature-detail[open] summary { background: linear-gradient(135deg, #000 0%, #0a0a0a 100%); border-bottom: 1px solid #333; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); } .feature-content { padding: 18px 20px; animation: expandContent 0.3s ease; } @keyframes expandContent { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } .feature-content p { margin: 0 0 14px 0; color: #ccc; font-size: 14px; line-height: 1.6; } .feature-content strong { color: #FFED00; } .feature-content ul { margin: 0 0 16px 0; padding-left: 22px; color: #ccc; } .feature-content li { margin-bottom: 8px; font-size: 13px; line-height: 1.6; } .feature-api { background: linear-gradient(135deg, #0a0a0a 0%, #000 100%); padding: 12px 15px; border-radius: 8px; border-left: 4px solid #FFED00; font-size: 12px; margin: 0; box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5); } .feature-api code { font-family: 'Courier New', monospace; color: #0f0; background-color: #000; padding: 3px 8px; border-radius: 4px; } /* ========================================== RESPONSIVE - MOBILE (max-width: 767px) ========================================== */ @media (max-width: 767px) { .developer-header { padding: 20px 15px; margin-bottom: 20px; } .developer-header h2 { font-size: 24px; } .developer-subtitle { font-size: 13px; } .developer-tabs { padding: 12px 10px; gap: 8px; } .dev-tab { padding: 11px 18px; font-size: 13px; min-width: 110px; } .dev-tab-content { padding: 18px 12px; } .changelog-item { margin-bottom: 18px; } .changelog-header { padding: 12px 15px; flex-direction: column; gap: 8px; align-items: flex-start; } .changelog-version { font-size: 12px; padding: 4px 12px; } .changelog-date { font-size: 11px; } .changelog-body { padding: 15px; } .changelog-title { font-size: 17px; margin-bottom: 12px; } .changelog-changes { gap: 10px; } .changelog-changes li { padding: 10px 12px; font-size: 13px; } .dev-info-box { padding: 16px; } .dev-info-box h3 { font-size: 17px; } .github-link-btn { padding: 14px 24px; font-size: 15px; } .feature-detail summary { font-size: 15px; padding: 14px 18px; } .feature-content { padding: 15px 16px; } } /* ========================================== RESPONSIVE - TABLET (768px - 1023px) ========================================== */ @media (min-width: 768px) and (max-width: 1023px) { .developer-header { padding: 25px 20px; } .developer-header h2 { font-size: 30px; } .developer-tabs { padding: 14px 12px; gap: 10px; } .dev-tab { padding: 13px 24px; font-size: 14px; min-width: 140px; } .dev-tab-content { padding: 22px 16px; } .dev-info-container { grid-template-columns: repeat(2, 1fr); gap: 18px; } .github-link-btn { grid-column: 1 / -1; } .changelog-changes { gap: 14px; } } /* ========================================== RESPONSIVE - DESKTOP (min-width: 1024px) ========================================== */ @media (min-width: 1024px) { .developer-header { padding: 35px 25px; } .developer-header h2 { font-size: 36px; } .developer-subtitle { font-size: 16px; } .developer-tabs { padding: 16px 15px; gap: 12px; } .dev-tab { padding: 15px 30px; font-size: 15px; min-width: 160px; } .dev-tab:hover { transform: translateY(-3px); box-shadow: 0 8px 25px rgba(0, 0, 0, 0.5); } .dev-tab.active:hover { transform: translateY(3px); } .dev-tab-content { padding: 30px 25px; } .dev-info-container { grid-template-columns: repeat(2, 1fr); gap: 20px; } .dev-info-box { padding: 24px; } .github-link-btn { grid-column: 1 / -1; padding: 18px 32px; font-size: 17px; } .changelog-item { margin-bottom: 24px; } .changelog-header { padding: 18px 24px; } .changelog-version { font-size: 15px; padding: 7px 18px; } .changelog-body { padding: 24px; } .changelog-title { font-size: 22px; margin-bottom: 18px; } .changelog-changes { gap: 14px; } .changelog-changes li { padding: 14px 18px; font-size: 15px; } .feature-detail summary { font-size: 17px; padding: 18px 24px; } .feature-content { padding: 20px 24px; } } /* Extra Small Mobile */ @media (max-width: 360px) { .developer-header h2 { font-size: 22px; } .dev-tab { padding: 9px 14px; font-size: 12px; min-width: 95px; } .changelog-changes li { font-size: 12px; padding: 8px 10px; } } /* ========================================== CHANGELOG - MARKDOWN-STYLE FORMATIERUNG Für automatisches Rendering von CHANGELOG.md ========================================== */ /* Changelog Container für Markdown Content */ .changelog-container { font-family: 'Courier New', monospace; line-height: 1.6; color: #ccc; padding: 0; } /* Überschriften - GitHub Style */ .changelog-container h1 { font-size: 28px; color: #FFED00; font-weight: bold; margin: 0 0 20px 0; padding-bottom: 10px; border-bottom: 3px solid #FFED00; letter-spacing: 1px; } .changelog-container h2 { font-size: 22px; color: #FFED00; font-weight: bold; margin: 30px 0 15px 0; padding-bottom: 8px; border-bottom: 2px solid #333; letter-spacing: 0.5px; } .changelog-container h3 { font-size: 18px; color: #fff; font-weight: bold; margin: 20px 0 12px 0; } .changelog-container h4 { font-size: 16px; color: #fff; font-weight: bold; margin: 15px 0 10px 0; } /* Absätze */ .changelog-container p { margin: 0 0 15px 0; color: #ccc; font-size: 14px; line-height: 1.7; } /* Fetter Text */ .changelog-container strong, .changelog-container b { color: #FFED00; font-weight: bold; } /* Kursiver Text */ .changelog-container em, .changelog-container i { font-style: italic; color: #ddd; } /* Listen */ .changelog-container ul { margin: 0 0 15px 0; padding-left: 25px; list-style-type: disc; } .changelog-container ol { margin: 0 0 15px 0; padding-left: 25px; } .changelog-container li { margin-bottom: 8px; color: #ccc; font-size: 14px; line-height: 1.6; } /* Nested Listen */ .changelog-container ul ul, .changelog-container ul ol, .changelog-container ol ul, .changelog-container ol ol { margin-top: 8px; margin-bottom: 0; } .changelog-container ul ul { list-style-type: circle; } .changelog-container ul ul ul { list-style-type: square; } /* Links */ .changelog-container a { color: #FFED00; text-decoration: none; border-bottom: 1px solid transparent; transition: border-color 0.2s; } .changelog-container a:hover { border-bottom-color: #FFED00; } /* Code-Blöcke */ .changelog-container code { background-color: #0a0a0a; color: #0f0; padding: 2px 6px; border-radius: 3px; font-family: 'Courier New', monospace; font-size: 13px; border: 1px solid #222; } .changelog-container pre { background-color: #0a0a0a; padding: 12px; border-radius: 6px; border: 1px solid #222; overflow-x: auto; margin: 0 0 15px 0; } .changelog-container pre code { background: none; border: none; padding: 0; color: #0f0; } /* Horizontale Linie */ .changelog-container hr { border: none; border-top: 2px solid #333; margin: 30px 0; } /* Blockquote */ .changelog-container blockquote { border-left: 4px solid #FFED00; padding-left: 15px; margin: 15px 0; color: #aaa; font-style: italic; } /* Tabellen */ .changelog-container table { width: 100%; border-collapse: collapse; margin: 0 0 15px 0; } .changelog-container th, .changelog-container td { border: 1px solid #333; padding: 8px 12px; text-align: left; } .changelog-container th { background-color: #1a1a1a; color: #FFED00; font-weight: bold; } .changelog-container tr:hover { background-color: #0a0a0a; } /* Checkboxen in Listen (für Task Lists) */ .changelog-container input[type="checkbox"] { margin-right: 8px; cursor: pointer; } /* Responsive - Markdown Changelog */ @media (max-width: 767px) { .changelog-container h1 { font-size: 24px; } .changelog-container h2 { font-size: 20px; } .changelog-container h3 { font-size: 17px; } .changelog-container h4 { font-size: 15px; } .changelog-container p, .changelog-container li { font-size: 13px; } .changelog-container pre { font-size: 12px; padding: 10px; } } @media (min-width: 1024px) { .changelog-container h1 { font-size: 32px; } .changelog-container h2 { font-size: 26px; } .changelog-container h3 { font-size: 20px; } .changelog-container h4 { font-size: 18px; } .changelog-container p, .changelog-container li { font-size: 15px; } } /* ========================================== DEVELOPER VIEW - MOBILE OPTIMIERUNGEN Füge diese Regeln zu styles-complete.css hinzu ========================================== */ /* Mobile-First Verbesserungen */ @media (max-width: 767px) { /* Developer Header - Kompakter auf Mobile */ .developer-header { padding: 20px 15px; margin: 15px 10px 20px 10px; border-radius: 12px; } .developer-header h2 { font-size: 22px; letter-spacing: 1px; margin-bottom: 8px; } .developer-subtitle { font-size: 12px; } /* Tabs - Besseres Touch-Target */ .developer-tabs { padding: 10px 8px; gap: 6px; border-radius: 10px 10px 0 0; } .dev-tab { padding: 12px 16px; font-size: 13px; min-width: 100px; border-radius: 8px 8px 0 0; } /* Tab Content - Mehr Padding für Lesbarkeit */ .dev-tab-content { padding: 20px 12px; border-radius: 0 0 10px 10px; } /* Changelog Container - Bessere Lesbarkeit */ .changelog-container { font-size: 14px; line-height: 1.7; } .changelog-container h1 { font-size: 22px; margin-bottom: 16px; padding-bottom: 8px; } .changelog-container h2 { font-size: 18px; margin: 25px 0 12px 0; padding-bottom: 6px; } .changelog-container h3 { font-size: 16px; margin: 16px 0 10px 0; } .changelog-container h4 { font-size: 14px; margin: 12px 0 8px 0; } .changelog-container p { font-size: 13px; margin-bottom: 12px; line-height: 1.6; } .changelog-container ul, .changelog-container ol { padding-left: 20px; margin-bottom: 12px; } .changelog-container li { font-size: 13px; margin-bottom: 6px; line-height: 1.5; } .changelog-container code { font-size: 12px; padding: 2px 5px; } .changelog-container pre { padding: 10px; font-size: 11px; overflow-x: auto; } .changelog-container hr { margin: 20px 0; } /* Info Boxes - Stack on Mobile */ .dev-info-container { grid-template-columns: 1fr; gap: 12px; } .dev-info-box { padding: 15px; } .dev-info-box h3 { font-size: 16px; margin-bottom: 12px; padding-bottom: 10px; } .dev-info-table td { padding: 10px 0; font-size: 12px; } .dev-info-table td:first-child { width: 45%; } /* GitHub Link - Full Width auf Mobile */ .github-link-btn { padding: 14px 20px; font-size: 14px; margin: 20px 0; } /* Feature Details - Kompakter */ .feature-detail { margin-bottom: 12px; border-radius: 10px; } .feature-detail summary { padding: 14px 16px; font-size: 14px; } .feature-detail summary::after { right: 16px; font-size: 11px; } .feature-content { padding: 14px 16px; } .feature-content p { font-size: 13px; margin-bottom: 12px; } .feature-content li { font-size: 12px; margin-bottom: 6px; } .feature-api { padding: 10px 12px; font-size: 11px; } .feature-api code { font-size: 11px; padding: 2px 6px; } /* Links - Größere Touch-Targets */ .changelog-container a { display: inline-block; padding: 2px 0; min-height: 30px; line-height: 1.5; } /* Blockquotes - Kompakter */ .changelog-container blockquote { padding-left: 12px; margin: 12px 0; font-size: 13px; border-left-width: 3px; } /* Tabellen - Horizontal Scroll */ .changelog-container table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; } .changelog-container th, .changelog-container td { padding: 8px 10px; font-size: 12px; white-space: nowrap; } /* Bessere Touch-Feedback */ .dev-tab:active { transform: scale(0.96) translateY(1px); background-color: #222; } .feature-detail summary:active { background: linear-gradient(135deg, #222 0%, #111 100%); } /* Scroll-Hint für Tabs */ .developer-tabs::after { content: '→'; position: absolute; right: 5px; top: 50%; transform: translateY(-50%); color: #FFED00; font-size: 20px; opacity: 0.5; pointer-events: none; animation: scrollHint 2s ease-in-out infinite; } @keyframes scrollHint { 0%, 100% { opacity: 0.5; transform: translateY(-50%) translateX(0); } 50% { opacity: 0.8; transform: translateY(-50%) translateX(5px); } } /* Verstecke Scroll-Hint wenn am Ende */ .developer-tabs::-webkit-scrollbar-thumb:hover ~ .developer-tabs::after { opacity: 0; } } /* Extra Small Mobile - Weitere Anpassungen */ @media (max-width: 360px) { .developer-header h2 { font-size: 20px; } .developer-subtitle { font-size: 11px; } .dev-tab { padding: 10px 14px; font-size: 12px; min-width: 90px; } .dev-tab-content { padding: 16px 10px; } .changelog-container h1 { font-size: 20px; } .changelog-container h2 { font-size: 16px; } .changelog-container h3 { font-size: 15px; } .changelog-container h4 { font-size: 13px; } .changelog-container p, .changelog-container li { font-size: 12px; } .dev-info-box { padding: 12px; } .github-link-btn { font-size: 13px; padding: 12px 16px; } } /* Landscape Mobile - Horizontal Optimierung */ @media (max-width: 767px) and (orientation: landscape) { .developer-header { padding: 15px; margin: 10px; } .developer-header h2 { font-size: 20px; } .dev-tab-content { max-height: calc(100vh - 200px); overflow-y: auto; -webkit-overflow-scrolling: touch; } } /* ========================================== v33: Favoriten, Zeitwahl, Offline-Banner, Tastatur-Navigation ========================================== */ /* Favoriten auf dem Home-Screen */ .home-favorites { background: rgba(255, 237, 0, 0.06); border: 1px solid rgba(255, 237, 0, 0.25); border-radius: 16px; padding: 16px; margin-bottom: 20px; } .home-favorites-title { font-size: 14px; font-weight: bold; color: #FFED00; margin-bottom: 12px; } .home-favorites-list { display: flex; flex-direction: column; gap: 8px; } .home-favorite-item { display: flex; justify-content: space-between; align-items: center; width: 100%; padding: 12px 14px; background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 10px; color: #fff; font-size: 14px; text-align: left; cursor: pointer; transition: background 0.2s ease, border-color 0.2s ease; } .home-favorite-item:hover, .home-favorite-item:focus-visible { background: rgba(255, 237, 0, 0.12); border-color: rgba(255, 237, 0, 0.5); outline: none; } .home-favorite-arrow { color: #FFED00; font-weight: bold; } /* Station-Header mit Aktions-Buttons */ .station-info-row { display: flex; justify-content: space-between; align-items: center; gap: 10px; flex-wrap: wrap; } .station-actions { display: flex; gap: 8px; } /* Offline-Banner ("Stand: vor X min") */ .stale-data-banner { background: rgba(255, 165, 0, 0.15); border: 1px solid rgba(255, 165, 0, 0.5); color: #FFC966; border-radius: 10px; padding: 10px 14px; margin-bottom: 12px; font-size: 13px; text-align: center; } /* Zeitwahl in der Routensuche */ .journey-time-row { margin: 12px 0; } .journey-time-controls { display: flex; gap: 8px; align-items: center; margin-top: 6px; } .journey-time-select, .journey-time-input { background: rgba(255, 255, 255, 0.08); border: 1px solid rgba(255, 255, 255, 0.2); border-radius: 8px; color: #fff; padding: 10px; font-size: 14px; font-family: inherit; } .journey-time-select option { background: #1a1a1a; color: #fff; } .journey-time-input { flex: 1; min-width: 0; color-scheme: dark; } .journey-time-clear { position: static; flex-shrink: 0; } .journey-time-hint { font-size: 11px; opacity: 0.6; margin-top: 4px; } /* Tastatur-Navigation in Vorschlägen */ .suggestion-item.kb-active { background: rgba(255, 237, 0, 0.2); outline: 2px solid rgba(255, 237, 0, 0.6); outline-offset: -2px; } /* Sichtbarer Fokus für Tastaturnutzer */ button:focus-visible, input:focus-visible, select:focus-visible { outline: 2px solid #FFED00; outline-offset: 2px; } /* ========================================== v33.2: Störungs-Banner & Such-Fehlerhinweis ========================================== */ .api-outage-banner { position: sticky; top: 0; z-index: 9999; background: linear-gradient(135deg, #8B0000 0%, #B22222 100%); color: #fff; padding: 10px 16px; text-align: center; font-size: 13px; border-bottom: 2px solid #FFED00; animation: outage-slide-in 0.3s ease-out; } @keyframes outage-slide-in { from { transform: translateY(-100%); } to { transform: translateY(0); } } .suggestion-error { color: #FFC966; cursor: default; pointer-events: none; } /* ========================================== v35: Live-Map-Animation & GUI-Politur ========================================== */ /* Flüssige Fahrzeug-Bewegung: 1s-Transition passt exakt zum 1s-Animationstakt -> Fahrzeuge GLEITEN statt zu springen */ .leaflet-marker-icon.custom-marker { transition: transform 1s linear; } /* Pulsierender Live-Punkt am Fahrzeugzähler */ .live-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: #4CAF50; animation: live-pulse 2s ease-in-out infinite; vertical-align: middle; margin-right: 4px; } @keyframes live-pulse { 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(76, 175, 80, 0.5); } 50% { opacity: 0.6; box-shadow: 0 0 0 5px rgba(76, 175, 80, 0); } } /* Abfahrten: ruhige, gleichbleibende Zahlendarstellung (keine Layout-Sprünge, wenn "9 min" zu "10 min" wird) */ .departure-time { font-variant-numeric: tabular-nums; min-width: 64px; text-align: right; } /* Verspätungs-Badge dezenter und konsistenter */ .departure-delay { font-size: 11px; color: #FF6B6B; white-space: nowrap; } /* Sanfter Übergang bei Wert-Updates durch Auto-Refresh */ .departure-item { transition: background-color 0.3s ease; } /* Vorschlags-Dropdown: klarere Trennung, sanftes Einblenden */ .suggestions.active { animation: sug-fade-in 0.15s ease-out; } @keyframes sug-fade-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } } /* Reduzierte Bewegung respektieren (Barrierefreiheit) */ @media (prefers-reduced-motion: reduce) { .leaflet-marker-icon.custom-marker, .departure-item, .suggestions.active { transition: none; animation: none; } .live-dot { animation: none; } } /* ========================================== v36: Desktop-Layout - Ergänzungen (Basis-Desktop-Regeln existieren bereits im 768px-Block weiter oben: Journey-Grid, Header-Größen, Hover-Effekte. Hier nur die Lücken.) ========================================== */ @media (min-width: 768px) { /* Header-Inhalt und Pull-to-Refresh am zentrierten Layout ausrichten */ .header-content, .ptr-container { max-width: 720px; margin: 0 auto; } /* Home: Info-Karten und Favoriten als 2-Spalten-Raster */ .home-quick-info { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; } .home-favorites-list { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; } /* Live-Map: mehr sichtbare Kartenfläche */ .livemap-container { height: calc(100vh - 110px); } } /* --- Große Desktops (ab 1100px): breiterer Inhalt, luftigere Listen --- */ @media (min-width: 1100px) { .container, .header-content, .ptr-container { max-width: 780px; } .container { padding: 28px 24px; } .departure-item { padding: 16px 18px; } .line-badge { font-size: 15px; padding: 5px 12px; } .departure-time { font-size: 18px; min-width: 76px; } .livemap-container { height: calc(100vh - 100px); } } /* v37: "Mehr Abfahrten laden"-Button */ .load-more-btn { margin-top: 14px; background: rgba(255, 237, 0, 0.08); border: 1px dashed rgba(255, 237, 0, 0.4); color: #FFED00; font-size: 14px; } .load-more-btn:hover, .load-more-btn:focus-visible { background: rgba(255, 237, 0, 0.15); border-style: solid; } /* ========================================== v37.1: Detail-Modal auf Desktop Overlay bleibt Vollbild (nichts scheint durch), Inhalt zentriert auf Lesebreite. ========================================== */ @media (min-width: 768px) { .detail-content { max-width: 680px; margin: 0 auto; padding-left: 20px; padding-right: 20px; } .detail-header { padding-left: calc(50% - 340px); padding-right: calc(50% - 340px); } } /* v37.1.1: Entwickler-Kachel im Quick-Info-Raster (Button erbt die Kachel-Optik von .home-info-card, hier nur der Button-Reset + Klick-Feedback) */ .home-info-card-btn { font-family: inherit; font-size: inherit; color: inherit; text-align: center; cursor: pointer; width: 100%; transition: background 0.2s ease, border-color 0.2s ease; } .home-info-card-btn:hover, .home-info-card-btn:focus-visible { background: rgba(255, 237, 0, 0.08); border-color: rgba(255, 237, 0, 0.5); outline: none; } .home-info-card-btn .home-info-text p span { color: #FFED00; font-weight: bold; } /* ========================================== v37.1.1: Filter als wischbare Chip-Reihe auf Mobile Gilt einheitlich für Abfahrten-, Routenplaner- und Live-Map-Filter. ========================================== */ @media (max-width: 767px) { .filter-chips, .livemap-filters { flex-wrap: nowrap; overflow-x: auto; justify-content: flex-start; padding-bottom: 4px; /* Platz, falls Scrollbar auftaucht */ -webkit-overflow-scrolling: touch; scrollbar-width: none; /* Firefox */ } .filter-chips::-webkit-scrollbar, .livemap-filters::-webkit-scrollbar { display: none; /* Chrome/Safari */ } .filter-btn, .transport-filter-btn, .fav-chip { white-space: nowrap; /* Chips brechen nie intern um */ min-height: 40px; /* Touch-Ziel */ } } /* ========================================== v37.2: Favoriten-Chips in der Abfahrten-View (nutzt .filter-chips -> auf Mobile wischbare Reihe wie die Filter) ========================================== */ .departure-favorites { padding: 12px; background-color: #0a0a0a; border: 1px solid rgba(255, 237, 0, 0.2); border-radius: 8px; margin-bottom: 12px; } .fav-chip { background-color: #1a1a1a; border: 2px solid #333; color: #fff; padding: 8px 14px; border-radius: 999px; /* Pillenform: unterscheidet Stationen von Filtern */ font-family: var(--font-stack); font-size: 13px; cursor: pointer; transition: all 0.2s; flex-shrink: 0; white-space: nowrap; min-height: 40px; } .fav-chip:hover, .fav-chip:focus-visible { border-color: #FFED00; outline: none; } .fav-chip.active { background-color: #FFED00; color: #000; border-color: #FFED00; font-weight: bold; } /* "Alle anzeigen" auf der Startseite dezent abheben */ .home-favorites-more { border-style: dashed; opacity: 0.85; } /* ========================================== v37.3: Blätter-Buttons, Zwischenhalte, Stations-Popups ========================================== */ /* "Früher"/"Später"-Blättern in der Routensuche */ .journey-pager { display: flex; justify-content: space-between; gap: 10px; margin: 12px 0; } .journey-pager-btn { background: rgba(255, 237, 0, 0.08); border: 1px dashed rgba(255, 237, 0, 0.4); color: #FFED00; padding: 10px 14px; border-radius: 8px; font-family: var(--font-stack); font-size: 13px; cursor: pointer; transition: background 0.2s ease; } .journey-pager-btn:hover, .journey-pager-btn:focus-visible { background: rgba(255, 237, 0, 0.15); border-style: solid; outline: none; } /* Ausklappbare Zwischenhalte (natives
) */ .journey-detail-intermediate { margin: 8px 0 8px 12px; } .journey-detail-intermediate summary { cursor: pointer; opacity: 0.65; font-size: 12px; padding: 4px 0; list-style-position: inside; } .journey-detail-intermediate summary:hover, .journey-detail-intermediate summary:focus-visible { opacity: 1; color: #FFED00; outline: none; } .intermediate-stops-list { list-style: none; margin: 6px 0 4px 6px; padding: 0; border-left: 2px dotted rgba(255, 255, 255, 0.25); } .intermediate-stops-list li { padding: 4px 0 4px 12px; font-size: 13px; opacity: 0.85; } .intermediate-time { display: inline-block; min-width: 44px; font-variant-numeric: tabular-nums; opacity: 0.7; } /* Stations-Popups auf der Live-Map */ .stop-popup-name { font-weight: bold; margin-bottom: 8px; } .stop-popup-dep { display: flex; align-items: center; gap: 8px; padding: 3px 0; font-size: 13px; } .stop-popup-line { padding: 2px 8px; border-radius: 4px; font-weight: bold; font-size: 12px; flex-shrink: 0; } .stop-popup-dir { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .stop-popup-min { font-weight: bold; flex-shrink: 0; } .stop-popup-loading { opacity: 0.6; font-size: 12px; padding: 6px 0; } .map-stop-open { display: block; width: 100%; margin-top: 10px; padding: 8px; background: #FFED00; color: #000; border: none; border-radius: 6px; font-family: var(--font-stack); font-weight: bold; font-size: 13px; cursor: pointer; } /* v37.4: Route-merken-Button + Standort-Button */ .save-route-btn { display: block; width: 100%; text-align: center; margin-bottom: 4px; } .save-route-btn.active { background: rgba(255, 237, 0, 0.2); border-style: solid; } .locate-btn { font-size: 15px; } /* v37.5: Preis-Badge, Erinnerung, Via/Optionen */ .journey-fare { background: rgba(76, 175, 80, 0.15); border: 1px solid rgba(76, 175, 80, 0.5); color: #7ED321; padding: 2px 8px; border-radius: 6px; font-size: 12px; margin-right: 8px; } .reminder-btn { background: none; border: 1px solid rgba(255, 237, 0, 0.35); border-radius: 6px; color: #FFED00; padding: 3px 8px; margin-left: 8px; font-size: 13px; cursor: pointer; font-family: var(--font-stack); } .reminder-btn:hover, .reminder-btn:focus-visible { background: rgba(255, 237, 0, 0.12); outline: none; } .reminder-btn.active { background: rgba(255, 237, 0, 0.2); border-style: solid; font-weight: bold; } .journey-via-row, .journey-options-row { margin: 12px 0; } .journey-option-chip[aria-pressed="true"], .journey-option-chip.active { background-color: #FFED00; color: #000; border-color: #FFED00; font-weight: bold; }