* { margin: 0; padding: 0; box-sizing: border-box; } /* Default styles (Light mode) */ body { font-family: 'IBM Plex Mono', monospace; background-color: #ffffff; color: #000000; min-height: 100vh; min-height: -webkit-fill-available; overflow: hidden; } html { height: -webkit-fill-available; } .container { display: flex; flex-direction: column; height: 100vh; } /* Header Styles */ header { background-color: #f6f6f6; border-bottom: 1px solid #e0e0e0; padding: 1.5rem 2rem; display: flex; justify-content: space-between; align-items: center; } .header-content { display: flex; flex-direction: column; gap: 0.25rem; } .header-title { font-size: 0.875rem; color: #666666; } .prompt { color: #bb86fc; font-weight: bold; } .josie { color: #bb86fc; } header h1 { font-size: 1.5rem; font-weight: 700; color: #bb86fc; } /* Controls Container */ .controls { display: flex; align-items: center; gap: 1.5rem; } /* Filter Controls */ .filter-controls { display: flex; align-items: center; gap: 0.75rem; } /* Navigation Links */ .nav-links { display: flex; gap: 0.75rem; } .nav-link { color: #bb86fc; text-decoration: none; font-size: 0.875rem; padding: 0.5rem 0.75rem; border: 1px solid #bb86fc; border-radius: 4px; transition: all 0.2s ease; } .nav-link:hover { background-color: #bb86fc; color: #ffffff; } .filter-controls label { font-size: 0.875rem; color: #000000; } #year-filter { padding: 0.5rem 0.75rem; border: 1px solid #e0e0e0; border-radius: 4px; background-color: #ffffff; color: #000000; font-family: 'IBM Plex Mono', monospace; font-size: 0.875rem; cursor: pointer; transition: all 0.2s ease; } #year-filter:hover { border-color: #bb86fc; background-color: rgba(187, 134, 252, 0.05); } #year-filter:focus { outline: none; border-color: #bb86fc; background-color: rgba(187, 134, 252, 0.05); } #year-filter option { background-color: #ffffff; color: #000000; } /* Map Container */ #map { flex: 1; width: 100%; background-color: #ffffff; } /* Custom Marker Styles */ .custom-marker { background: transparent; border: none; } .custom-marker svg { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2)); transition: transform 0.2s ease; } .custom-marker:hover svg { transform: scale(1.1); } /* Leaflet Popup Customization */ .leaflet-popup-content-wrapper { background-color: #ffffff; color: #000000; border: 1px solid #e0e0e0; border-radius: 4px; font-family: 'IBM Plex Mono', monospace; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } .leaflet-popup-content { margin: 0.75rem; } .leaflet-popup-tip { background-color: #ffffff; border: 1px solid #e0e0e0; } .popup-content h3 { margin-bottom: 0.5rem; color: #bb86fc; font-size: 1rem; font-weight: 700; } .popup-content p { margin: 0.25rem 0; font-size: 0.875rem; color: #000000; } .popup-content strong { color: #bb86fc; font-weight: 700; } .popup-content .flight-route { font-size: 0.875rem; color: #000000; margin-bottom: 0.5rem; font-weight: 600; } .popup-content .flight-info { font-size: 0.75rem; color: #666666; margin: 0.25rem 0; } .popup-content .flight-info strong { color: #bb86fc; font-weight: 700; } /* Leaflet Controls Customization */ .leaflet-control-zoom a { background-color: #ffffff; color: #bb86fc; border: 1px solid #e0e0e0; } .leaflet-control-zoom a:hover { background-color: rgba(187, 134, 252, 0.1); color: #000000; } .leaflet-control-attribution { background-color: rgba(255, 255, 255, 0.9); color: #666666; font-family: 'IBM Plex Mono', monospace; font-size: 0.75rem; } .leaflet-control-attribution a { color: #bb86fc; text-decoration: none; } .leaflet-control-attribution a:hover { color: #000000; text-decoration: underline; } /* Leaflet Marker Popup Close Button */ .leaflet-popup-close-button { color: #bb86fc; font-size: 1.25rem; font-weight: bold; } .leaflet-popup-close-button:hover { color: #000000; } /* Responsive Design */ @media (max-width: 768px) { header { flex-direction: column; gap: 1rem; align-items: flex-start; padding: 1rem; } .filter-controls { width: 100%; justify-content: space-between; } #year-filter { flex: 1; max-width: 200px; } header h1 { font-size: 1.25rem; } .header-title { font-size: 0.75rem; } } @media (max-width: 480px) { header { padding: 0.75rem; } .filter-controls { flex-direction: column; align-items: flex-start; gap: 0.5rem; } #year-filter { max-width: 100%; } } /* Dark Mode */ @media (prefers-color-scheme: dark) { body { background-color: #121212; color: #ffffff; } header { background-color: #1a1a1a; border-bottom: 1px solid #333333; } .header-title { color: #a0a0a0; } .filter-controls label { color: #e0e0e0; } #year-filter { background-color: #1a1a1a; color: #e0e0e0; border-color: #333333; } #year-filter option { background-color: #1a1a1a; color: #e0e0e0; } #map { background-color: #121212; } .leaflet-popup-content-wrapper { background-color: #1a1a1a; color: #e0e0e0; border-color: #333333; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.4); } .leaflet-popup-tip { background-color: #1a1a1a; border-color: #333333; } .popup-content p { color: #e0e0e0; } .leaflet-control-zoom a { background-color: #1a1a1a; border-color: #333333; } .leaflet-control-zoom a:hover { color: #ffffff; } .leaflet-control-attribution { background-color: rgba(26, 26, 26, 0.9); color: #a0a0a0; } .leaflet-control-attribution a:hover { color: #ffffff; } .leaflet-popup-close-button:hover { color: #ffffff; } .custom-marker svg { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.6)); } .nav-link { border-color: #bb86fc; color: #bb86fc; } .nav-link:hover { background-color: #bb86fc; color: #121212; } .popup-content .flight-route { color: #e0e0e0; } .popup-content .flight-info { color: #a0a0a0; } } /* ======================================== Stats Panel Styles ======================================== */ .stats-panel { display: none; background-color: #f6f6f6; border-bottom: 1px solid #e0e0e0; padding: 1rem 2rem; font-size: 0.875rem; } .stats-panel.visible { display: block; } .stats-summary { display: flex; gap: 2rem; margin-bottom: 1rem; padding-bottom: 1rem; border-bottom: 1px solid #e0e0e0; } .stat-item { display: flex; flex-direction: column; gap: 0.25rem; } .stat-label { color: #666666; font-size: 0.75rem; } .stat-value { color: #bb86fc; font-size: 1.25rem; font-weight: 700; } .stats-detail { display: grid; grid-template-columns: repeat(3, 1fr); gap: 2rem; } .stat-column h4 { color: #bb86fc; font-size: 0.75rem; font-weight: 700; margin-bottom: 0.5rem; text-transform: lowercase; } .stat-column ul { list-style: none; padding: 0; margin: 0; } .stat-column li { display: flex; justify-content: space-between; padding: 0.25rem 0; font-size: 0.75rem; color: #000000; } .stat-column li span:last-child { color: #666666; } #stats-toggle { background: transparent; cursor: pointer; font-family: 'IBM Plex Mono', monospace; } #stats-toggle:hover { background-color: #bb86fc; color: #ffffff; } #stats-toggle:active { background-color: #9a67ea; } #stats-toggle:focus { outline: none; box-shadow: 0 0 0 2px rgba(187, 134, 252, 0.4); } @media (max-width: 768px) { .stats-panel { padding: 1rem; } .stats-summary { flex-wrap: wrap; gap: 1rem; } .stat-item { min-width: calc(50% - 0.5rem); } .stats-detail { grid-template-columns: 1fr; gap: 1rem; } } @media (prefers-color-scheme: dark) { .stats-panel { background-color: #1a1a1a; border-color: #333333; } .stats-summary { border-color: #333333; } .stat-label { color: #a0a0a0; } .stat-column li { color: #e0e0e0; } .stat-column li span:last-child { color: #a0a0a0; } #stats-toggle:hover { background-color: #bb86fc; color: #121212; } #stats-toggle:active { background-color: #9a67ea; } #stats-toggle:focus { box-shadow: 0 0 0 2px rgba(187, 134, 252, 0.5); } } /* ======================================== SPA Layout Styles ======================================== */ .app { display: flex; flex-direction: column; min-height: 100vh; min-height: -webkit-fill-available; } .app-header { display: flex; align-items: center; justify-content: space-between; padding: 0.75rem 1.5rem; background: #f6f6f6; border-bottom: 1px solid #e0e0e0; gap: 1rem; } .header-left .logo { font-size: 1.25rem; font-weight: 700; color: #bb86fc; text-decoration: none; } .nav { display: flex; gap: 0.5rem; } .nav .nav-link { padding: 0.375rem 0.75rem; font-size: 0.875rem; color: #666; text-decoration: none; border-radius: 4px; transition: all 0.2s; border: none; } .nav .nav-link:hover { color: #bb86fc; background: rgba(187, 134, 252, 0.1); } .nav .nav-link.active { color: #bb86fc; background: rgba(187, 134, 252, 0.15); } .header-right { display: flex; align-items: center; } .user-badge { display: flex; align-items: center; gap: 0.5rem; font-size: 0.75rem; color: #666; } .user-name { color: #bb86fc; } .logout-btn { background: none; border: 1px solid #cf6679; color: #cf6679; width: 1.5rem; height: 1.5rem; border-radius: 4px; cursor: pointer; font-size: 0.75rem; line-height: 1; } .logout-btn:hover { background: #cf6679; color: #fff; } .view-container { flex: 1; display: flex; flex-direction: column; overflow: hidden; } /* ======================================== Share View Styles ======================================== */ .share-view { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 2rem; gap: 1.5rem; } .share-header { font-size: 0.875rem; color: #666; } .auth-section { display: flex; flex-direction: column; gap: 0.75rem; width: 100%; max-width: 300px; } .instance-input { padding: 0.75rem; border: 1px solid #e0e0e0; border-radius: 4px; font-family: inherit; font-size: 1rem; text-align: center; background: #fff; color: #000; } .instance-input:focus { outline: none; border-color: #bb86fc; } .btn { padding: 0.75rem 1.5rem; border: none; border-radius: 4px; font-family: inherit; font-size: 0.875rem; cursor: pointer; transition: all 0.2s; } .login-btn { background: #bb86fc; color: #121212; } .login-btn:hover { background: #9a67ea; } .login-btn:disabled { opacity: 0.5; cursor: not-allowed; } .user-section { text-align: center; } .logged-in-text { color: #666; font-size: 0.875rem; } .share-toggle { width: 120px; height: 120px; border-radius: 50%; border: 3px solid #bb86fc; background: transparent; color: #bb86fc; font-family: inherit; font-size: 1.25rem; font-weight: 700; cursor: pointer; transition: all 0.3s; } .share-toggle:hover:not(:disabled) { background: rgba(187, 134, 252, 0.1); } .share-toggle:disabled { opacity: 0.3; cursor: not-allowed; } .share-toggle.active { background: #bb86fc; color: #121212; } .url-section { display: flex; gap: 0.5rem; width: 100%; max-width: 400px; opacity: 0; transform: translateY(10px); transition: all 0.3s; pointer-events: none; } .url-section.visible { opacity: 1; transform: translateY(0); pointer-events: auto; } .url-section input { flex: 1; padding: 0.5rem; border: 1px solid #e0e0e0; border-radius: 4px; font-family: inherit; font-size: 0.75rem; background: #f6f6f6; color: #000; } .copy-btn { background: #333; color: #fff; padding: 0.5rem 1rem; } .copy-btn:hover { background: #444; } .copy-btn.copied { background: #03dac6; color: #121212; } .status { font-size: 0.875rem; color: #666; } .status .coords { font-size: 0.75rem; color: #888; margin-top: 0.25rem; } .error { color: #cf6679; font-size: 0.875rem; min-height: 1.25rem; } /* ======================================== Friends View Styles ======================================== */ .friends-view { flex: 1; display: flex; flex-direction: column; position: relative; } .friends-header { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem 1rem; font-size: 0.875rem; color: #666; background: #f6f6f6; border-bottom: 1px solid #e0e0e0; } .friend-count { color: #bb86fc; } .friends-status-bar { display: flex; justify-content: flex-end; align-items: center; padding: 0.5rem 1rem; font-size: 0.875rem; background: #f6f6f6; border-bottom: 1px solid #e0e0e0; } .map-container { flex: 1; min-height: 300px; } .friend-list { position: absolute; top: 2.5rem; right: 1rem; background: rgba(255, 255, 255, 0.95); border-radius: 4px; padding: 0.5rem; font-size: 0.75rem; z-index: 1000; max-height: 200px; overflow-y: auto; min-width: 150px; } .friend-list-item { padding: 0.25rem 0.5rem; cursor: pointer; border-radius: 2px; } .friend-list-item:hover { background: rgba(187, 134, 252, 0.2); } .friend-list-item .acct { color: #bb86fc; } .friend-list-item .time { color: #999; font-size: 0.65rem; } .no-friends { color: #666; text-align: center; padding: 1rem; } /* ======================================== Lists View Styles ======================================== */ .lists-view { flex: 1; padding: 1rem; max-width: 600px; margin: 0 auto; width: 100%; overflow-y: auto; } .section { margin-bottom: 2rem; } .section-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; } .section-title { color: #bb86fc; font-size: 0.875rem; } .btn-small { padding: 0.25rem 0.5rem; font-size: 0.75rem; } .btn-danger { background: #cf6679; color: #fff; } .btn-danger:hover { background: #b55464; } .btn-secondary { background: #333; color: #e0e0e0; } .btn-secondary:hover { background: #444; } .card { background: #f6f6f6; border-radius: 4px; padding: 1rem; margin-bottom: 0.5rem; } .card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem; } .card-title { font-weight: bold; color: #000; } .card-meta { font-size: 0.75rem; color: #888; } .card-actions { display: flex; gap: 0.5rem; } .member-list { margin-top: 0.75rem; padding-top: 0.75rem; border-top: 1px solid #e0e0e0; } .member-item { display: flex; justify-content: space-between; align-items: center; padding: 0.25rem 0; font-size: 0.875rem; } .member-acct { color: #03dac6; } .member-status { font-size: 0.75rem; padding: 0.125rem 0.375rem; border-radius: 2px; } .status-pending { background: #665c00; color: #ffb74d; } .status-accepted { background: #1b5e20; color: #81c784; } .status-declined { background: #4a1c1c; color: #cf6679; } .empty-state { color: #666; text-align: center; padding: 2rem; } .incoming-card { background: #e8f5e9; border-left: 3px solid #03dac6; } .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.7); display: flex; align-items: center; justify-content: center; z-index: 2000; } .modal { background: #fff; border-radius: 8px; padding: 1.5rem; width: 90%; max-width: 400px; } .modal-title { color: #bb86fc; margin-bottom: 1rem; } .form-group { margin-bottom: 1rem; } .form-label { display: block; font-size: 0.75rem; color: #888; margin-bottom: 0.25rem; } .form-input, .form-select { width: 100%; padding: 0.5rem; background: #f6f6f6; border: 1px solid #e0e0e0; border-radius: 4px; color: #000; font-family: inherit; font-size: 0.875rem; box-sizing: border-box; } .form-input:focus, .form-select:focus { outline: none; border-color: #bb86fc; } .form-actions { display: flex; gap: 0.5rem; justify-content: flex-end; margin-top: 1rem; } /* ======================================== Live View Styles ======================================== */ .live-view { flex: 1; display: flex; flex-direction: column; } .live-header { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem 1rem; font-size: 0.875rem; color: #666; background: #f6f6f6; border-bottom: 1px solid #e0e0e0; } .status-bar { display: flex; align-items: center; gap: 0.5rem; } .status-dot { width: 10px; height: 10px; border-radius: 50%; background: #888; } .status-dot.active { background: #03dac6; animation: pulse 2s infinite; } .status-dot.inactive { background: #cf6679; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .status-text { font-size: 0.75rem; color: #888; } .location-info { padding: 0.5rem 1rem; font-size: 0.75rem; color: #888; background: #f6f6f6; border-top: 1px solid #e0e0e0; } .error-container { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: 2rem; } .error-container h2 { color: #cf6679; margin-bottom: 0.5rem; } .error-container p { color: #888; } /* ======================================== SPA Dark Mode Additions ======================================== */ @media (prefers-color-scheme: dark) { .app-header { background: #1a1a1a; border-color: #333; } .nav .nav-link { color: #a0a0a0; } .nav .nav-link:hover, .nav .nav-link.active { color: #bb86fc; } .user-badge { color: #a0a0a0; } .instance-input { background: #1a1a1a; border-color: #333; color: #e0e0e0; } .url-section input { background: #1a1a1a; border-color: #333; color: #e0e0e0; } .friends-header, .friends-status-bar, .live-header, .location-info { background: #1a1a1a; border-color: #333; } .friend-list { background: rgba(26, 26, 26, 0.95); } .friend-list-item .time { color: #666; } .no-friends { color: #a0a0a0; } .card { background: #1e1e1e; } .card-title { color: #e0e0e0; } .member-list { border-color: #333; } .incoming-card { background: #1a2a1a; } .modal { background: #1e1e1e; } .form-input, .form-select { background: #121212; border-color: #333; color: #e0e0e0; } .btn-secondary { background: #333; color: #e0e0e0; } .btn-secondary:hover { background: #444; } }