diff --git a/templates/adsb_dashboard.html b/templates/adsb_dashboard.html index 9b7f954..222bde8 100644 --- a/templates/adsb_dashboard.html +++ b/templates/adsb_dashboard.html @@ -27,6 +27,8 @@ --accent-red: #ff4444; --accent-yellow: #ffcc00; --grid-line: rgba(0, 255, 136, 0.1); + --radar-cyan: #00ffff; + --radar-bg: #1a1a2e; } body { @@ -75,7 +77,7 @@ .header { position: relative; z-index: 10; - padding: 15px 30px; + padding: 12px 20px; background: linear-gradient(180deg, rgba(0,255,136,0.1) 0%, transparent 100%); border-bottom: 1px solid rgba(0,255,136,0.3); display: flex; @@ -85,7 +87,7 @@ .logo { font-family: 'Orbitron', monospace; - font-size: 28px; + font-size: 24px; font-weight: 900; letter-spacing: 4px; color: var(--accent-green); @@ -95,22 +97,23 @@ .logo span { color: var(--text-secondary); font-weight: 400; - font-size: 16px; + font-size: 14px; margin-left: 15px; letter-spacing: 2px; } .status-bar { display: flex; - gap: 30px; + gap: 20px; + align-items: center; font-family: 'JetBrains Mono', monospace; - font-size: 12px; + font-size: 11px; } .status-item { display: flex; align-items: center; - gap: 8px; + gap: 6px; } .status-dot { @@ -132,30 +135,62 @@ 50% { opacity: 0.5; } } + /* Stats badges in header */ + .stats-badges { + display: flex; + gap: 12px; + } + + .stat-badge { + background: rgba(0,255,136,0.1); + border: 1px solid rgba(0,255,136,0.3); + border-radius: 4px; + padding: 4px 10px; + font-family: 'JetBrains Mono', monospace; + font-size: 11px; + } + + .stat-badge .value { + color: var(--accent-green); + font-weight: 600; + } + + .stat-badge .label { + color: var(--text-secondary); + margin-left: 4px; + } + .datetime { font-family: 'Orbitron', monospace; - font-size: 14px; + font-size: 12px; color: var(--accent-green); } + .back-link { + color: var(--accent-green); + text-decoration: none; + font-size: 11px; + padding: 4px 10px; + border: 1px solid var(--accent-green); + border-radius: 4px; + } + /* Main dashboard grid */ .dashboard { position: relative; z-index: 10; display: grid; - grid-template-columns: 1fr 380px; - grid-template-rows: 1fr; - gap: 20px; - padding: 20px; - height: calc(100vh - 80px); - min-height: 600px; + grid-template-columns: 1fr 340px; + grid-template-rows: 1fr auto; + gap: 0; + height: calc(100vh - 60px); + min-height: 500px; } /* Panels */ .panel { background: var(--bg-panel); border: 1px solid rgba(0,255,136,0.2); - border-radius: 8px; overflow: hidden; position: relative; } @@ -171,11 +206,11 @@ } .panel-header { - padding: 12px 20px; + padding: 10px 15px; background: rgba(0,255,136,0.05); border-bottom: 1px solid rgba(0,255,136,0.1); font-family: 'Orbitron', monospace; - font-size: 12px; + font-size: 11px; font-weight: 500; letter-spacing: 2px; text-transform: uppercase; @@ -203,22 +238,44 @@ to { opacity: 1; transform: translateX(-50%) translateY(0); } } - .panel-content { - padding: 0; - height: calc(100% - 45px); - overflow: hidden; - } - - /* Map container */ - .map-container { + /* Main display container (map + radar scope) */ + .main-display { grid-column: 1; grid-row: 1; + position: relative; + } + + .display-container { + position: relative; + width: 100%; + height: 100%; } #radarMap { width: 100%; height: 100%; - border-radius: 0 0 8px 8px; + display: block; + } + + #radarScope { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: none; + background: var(--radar-bg); + } + + #radarScope.active { + display: flex; + justify-content: center; + align-items: center; + } + + #radarCanvas { + max-width: 100%; + max-height: 100%; } /* Right sidebar */ @@ -227,63 +284,114 @@ grid-row: 1; display: flex; flex-direction: column; - gap: 12px; - overflow-y: auto; + border-left: 1px solid rgba(0,255,136,0.2); + overflow: hidden; } - .sidebar .panel { - flex-shrink: 0; + /* View toggle */ + .view-toggle { + display: flex; + padding: 10px; + gap: 8px; + background: var(--bg-panel); + border-bottom: 1px solid rgba(0,255,136,0.2); } - /* Stats panel */ - .stats-grid { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 10px; - padding: 15px; - } - - .stat-box { - background: rgba(0,0,0,0.3); - border: 1px solid rgba(0,255,136,0.15); - border-radius: 6px; - padding: 12px; - text-align: center; - } - - .stat-value { + .view-btn { + flex: 1; + padding: 10px; + border: 1px solid rgba(0,255,136,0.3); + background: transparent; + color: var(--text-secondary); font-family: 'Orbitron', monospace; - font-size: 24px; + font-size: 11px; font-weight: 600; + text-transform: uppercase; + letter-spacing: 2px; + border-radius: 4px; + cursor: pointer; + transition: all 0.2s ease; + } + + .view-btn:hover { + border-color: var(--accent-green); color: var(--accent-green); } - .stat-label { - font-size: 10px; + .view-btn.active { + background: var(--accent-green); + border-color: var(--accent-green); + color: var(--bg-dark); + } + + /* Selected aircraft panel */ + .selected-aircraft { + flex-shrink: 0; + max-height: 280px; + overflow-y: auto; + } + + .selected-info { + padding: 12px; + } + + .selected-callsign { + font-family: 'Orbitron', monospace; + font-size: 20px; + font-weight: 700; + color: var(--accent-green); + text-shadow: 0 0 15px var(--accent-green); + text-align: center; + margin-bottom: 12px; + } + + .telemetry-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 6px; + } + + .telemetry-item { + background: rgba(0,0,0,0.3); + border-radius: 4px; + padding: 8px; + border-left: 2px solid var(--accent-green); + } + + .telemetry-label { + font-size: 9px; text-transform: uppercase; letter-spacing: 1px; color: var(--text-secondary); - margin-top: 4px; + margin-bottom: 2px; + } + + .telemetry-value { + font-family: 'JetBrains Mono', monospace; + font-size: 12px; + color: var(--accent-cyan); } /* Aircraft list */ .aircraft-list { flex: 1; - min-height: 200px; + min-height: 0; + display: flex; + flex-direction: column; } .aircraft-list-content { - max-height: 350px; + flex: 1; overflow-y: auto; - padding: 10px; + padding: 8px; } .aircraft-item { background: rgba(0,0,0,0.3); border: 1px solid rgba(0,255,136,0.15); - border-radius: 6px; - padding: 10px 12px; - margin-bottom: 8px; + border-radius: 4px; + padding: 8px 10px; + margin-bottom: 6px; cursor: pointer; transition: all 0.2s ease; } @@ -303,30 +411,30 @@ display: flex; justify-content: space-between; align-items: center; - margin-bottom: 6px; + margin-bottom: 4px; } .aircraft-callsign { font-family: 'Orbitron', monospace; - font-size: 14px; + font-size: 12px; font-weight: 600; color: var(--accent-green); } .aircraft-icao { font-family: 'JetBrains Mono', monospace; - font-size: 10px; + font-size: 9px; color: var(--text-secondary); background: rgba(0,255,136,0.1); - padding: 2px 6px; + padding: 2px 5px; border-radius: 3px; } .aircraft-details { display: grid; grid-template-columns: repeat(3, 1fr); - gap: 8px; - font-size: 11px; + gap: 6px; + font-size: 10px; } .aircraft-detail { @@ -336,109 +444,117 @@ .aircraft-detail-value { font-family: 'JetBrains Mono', monospace; color: var(--accent-cyan); - font-size: 12px; + font-size: 11px; } .aircraft-detail-label { color: var(--text-secondary); - font-size: 9px; + font-size: 8px; text-transform: uppercase; } - /* Selected aircraft panel */ - .selected-aircraft { - background: linear-gradient(135deg, rgba(0,255,136,0.1) 0%, rgba(0,212,255,0.05) 100%); + /* Bottom controls bar */ + .controls-bar { + grid-column: 1 / -1; + grid-row: 2; + display: flex; + align-items: center; + gap: 20px; + padding: 10px 20px; + background: var(--bg-panel); + border-top: 1px solid rgba(0,255,136,0.3); } - .selected-info { - padding: 15px; - } - - .selected-callsign { - font-family: 'Orbitron', monospace; - font-size: 24px; - font-weight: 700; - color: var(--accent-green); - text-shadow: 0 0 15px var(--accent-green); - text-align: center; - margin-bottom: 15px; - } - - .telemetry-grid { - display: grid; - grid-template-columns: repeat(2, 1fr); + .control-group { + display: flex; + align-items: center; gap: 8px; } - .telemetry-item { - background: rgba(0,0,0,0.3); - border-radius: 4px; - padding: 10px; - border-left: 2px solid var(--accent-green); + .control-group label { + display: flex; + align-items: center; + gap: 6px; + cursor: pointer; + font-size: 11px; + color: var(--text-primary); } - .telemetry-label { + .control-group input[type="checkbox"] { + accent-color: var(--accent-green); + } + + .control-group select { + padding: 6px 10px; + background: rgba(0,0,0,0.3); + border: 1px solid rgba(0,255,136,0.3); + border-radius: 4px; + color: var(--accent-green); + font-family: 'JetBrains Mono', monospace; + font-size: 11px; + } + + .control-group input[type="text"] { + width: 80px; + padding: 6px 8px; + background: rgba(0,0,0,0.3); + border: 1px solid rgba(0,255,136,0.3); + border-radius: 4px; + color: var(--accent-green); + font-family: 'JetBrains Mono', monospace; + font-size: 11px; + } + + .control-label { font-size: 10px; text-transform: uppercase; letter-spacing: 1px; color: var(--text-secondary); - margin-bottom: 4px; } - .telemetry-value { - font-family: 'JetBrains Mono', monospace; - font-size: 14px; - color: var(--accent-cyan); + /* Start/stop button */ + .start-btn { + padding: 8px 20px; + border: 1px solid var(--accent-green); + background: rgba(0,255,136,0.1); + color: var(--accent-green); + font-family: 'Orbitron', monospace; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 2px; + border-radius: 4px; + cursor: pointer; + transition: all 0.2s ease; + margin-left: auto; } - /* Altitude indicator */ - .altitude-indicator { - padding: 15px; + .start-btn:hover { + background: var(--accent-green); + color: var(--bg-dark); + box-shadow: 0 0 20px rgba(0,255,136,0.3); } - .altitude-bar { - height: 200px; - background: rgba(0,0,0,0.3); - border-radius: 6px; - position: relative; - overflow: hidden; + .start-btn.active { + background: var(--accent-red); + border-color: var(--accent-red); + color: #fff; } - .altitude-fill { - position: absolute; - bottom: 0; - left: 0; - right: 0; - background: linear-gradient(to top, var(--accent-green), var(--accent-cyan)); - transition: height 0.5s ease; - border-radius: 0 0 6px 6px; + .start-btn.active:hover { + box-shadow: 0 0 20px rgba(255,68,68,0.3); } - .altitude-markers { - position: absolute; - top: 0; - right: 10px; - bottom: 0; - display: flex; - flex-direction: column; - justify-content: space-between; - padding: 10px 0; - } - - .altitude-marker { + /* GPS button */ + .gps-btn { + padding: 6px 10px; + background: rgba(0,255,136,0.2); + border: 1px solid rgba(0,255,136,0.3); + border-radius: 4px; + color: var(--accent-green); font-family: 'JetBrains Mono', monospace; font-size: 10px; - color: var(--text-secondary); - } - - .altitude-current { - position: absolute; - left: 10px; - font-family: 'Orbitron', monospace; - font-size: 18px; - color: var(--accent-green); - text-shadow: 0 0 10px var(--accent-green); - transition: bottom 0.5s ease; + cursor: pointer; } /* Leaflet overrides */ @@ -475,67 +591,35 @@ /* No aircraft message */ .no-aircraft { text-align: center; - padding: 40px 20px; + padding: 30px 15px; color: var(--text-secondary); } .no-aircraft-icon { - font-size: 48px; - margin-bottom: 15px; + font-size: 36px; + margin-bottom: 10px; opacity: 0.5; } - /* Start tracking button */ - .start-btn { - display: block; - width: calc(100% - 30px); - margin: 15px; - padding: 12px; - border: 1px solid var(--accent-green); - background: rgba(0,255,136,0.1); - color: var(--accent-green); - font-family: 'Orbitron', monospace; - font-size: 12px; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 2px; - border-radius: 6px; - cursor: pointer; - transition: all 0.2s ease; - } - - .start-btn:hover { - background: var(--accent-green); - color: var(--bg-dark); - box-shadow: 0 0 20px rgba(0,255,136,0.3); - } - - .start-btn.active { - background: var(--accent-red); - border-color: var(--accent-red); - color: #fff; - } - - .start-btn.active:hover { - box-shadow: 0 0 20px rgba(255,68,68,0.3); - } - /* Responsive */ - @media (max-width: 1200px) { + @media (max-width: 1000px) { .dashboard { grid-template-columns: 1fr; - grid-template-rows: 1fr auto; - height: auto; + grid-template-rows: 1fr auto auto; } - .map-container { + .main-display { min-height: 400px; } .sidebar { - flex-direction: row; - flex-wrap: wrap; + grid-column: 1; + grid-row: 2; + border-left: none; + border-top: 1px solid rgba(0,255,136,0.2); + max-height: 300px; } - .sidebar .panel { - flex: 1 1 300px; + .controls-bar { + grid-row: 3; + flex-wrap: wrap; } } @@ -549,105 +633,47 @@ AIRCRAFT RADAR // INTERCEPT +
+
+ 0 + aircraft +
+
+ 0 + nm max +
+
+ 0 + msg/s +
+
-
+
STANDBY
-
- 0 AIRCRAFT -
-
--:--:-- UTC
- ← Main Dashboard +
--:--:-- UTC
+ Main Dashboard
- -
-
- RADAR DISPLAY // LIVE TRACKING -
-
-
+ +
+
+
+ +
@@ -670,20 +696,72 @@ TRACKED AIRCRAFT
-
-
-
-
No aircraft detected
-
Start tracking to detect aircraft
-
+
+
+
No aircraft detected
+
Start tracking to begin
+ + +
+
+ +
+
+ +
+
+ +
+
+ Filter: + +
+
+ Range: + +
+
+ Lat: + +
+
+ Lon: + +
+
+ +
+ +