Files
intercept/static/css/ais_dashboard.css
Smittix 5e9fcc5c49 feat: Switch application font to Roboto Condensed
Replace IBM Plex Mono, Space Mono, and JetBrains Mono with Roboto
Condensed across all CSS variables, inline styles, canvas ctx.font
references, and Google Fonts CDN links. Updates 28 files covering
templates, stylesheets, and JS modules for consistent typography.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 23:29:05 +00:00

1355 lines
28 KiB
CSS

/* AIS Dashboard - Vessel Tracking Interface */
/* Styled to match ADSB Dashboard */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--font-sans: 'Roboto Condensed', 'Arial Narrow', Roboto, 'Helvetica Neue', Arial, sans-serif;
--font-mono: 'Roboto Condensed', 'Arial Narrow', Roboto, 'Helvetica Neue', Arial, sans-serif;
--bg-dark: #0b1118;
--bg-panel: #101823;
--bg-card: #151f2b;
--border-color: #263246;
--border-glow: #4aa3ff;
--text-primary: #d7e0ee;
--text-secondary: #9fb0c7;
--text-dim: #6f7f94;
--accent-green: #38c180;
--accent-cyan: #4aa3ff;
--accent-orange: #d6a85e;
--accent-red: #e25d5d;
--accent-yellow: #e1c26b;
--accent-amber: #d6a85e;
--grid-line: rgba(74, 163, 255, 0.1);
--noise-image: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='40'%20height='40'%20viewBox='0%200%2040%2040'%3E%3Cg%20fill='%23ffffff'%20fill-opacity='0.05'%3E%3Ccircle%20cx='3'%20cy='5'%20r='1'/%3E%3Ccircle%20cx='11'%20cy='9'%20r='1'/%3E%3Ccircle%20cx='18'%20cy='3'%20r='1'/%3E%3Ccircle%20cx='26'%20cy='12'%20r='1'/%3E%3Ccircle%20cx='34'%20cy='6'%20r='1'/%3E%3Ccircle%20cx='7'%20cy='19'%20r='1'/%3E%3Ccircle%20cx='15'%20cy='24'%20r='1'/%3E%3Ccircle%20cx='28'%20cy='22'%20r='1'/%3E%3Ccircle%20cx='36'%20cy='18'%20r='1'/%3E%3Ccircle%20cx='5'%20cy='33'%20r='1'/%3E%3Ccircle%20cx='19'%20cy='32'%20r='1'/%3E%3Ccircle%20cx='31'%20cy='34'%20r='1'/%3E%3C/g%3E%3C/svg%3E");
--radar-cyan: #4aa3ff;
--radar-bg: #101823;
}
body {
font-family: var(--font-sans);
background: var(--bg-dark);
color: var(--text-primary);
min-height: 100vh;
overflow-x: hidden;
}
/* Animated radar sweep background */
.radar-bg {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-image:
var(--noise-image),
linear-gradient(var(--grid-line) 1px, transparent 1px),
linear-gradient(90deg, var(--grid-line) 1px, transparent 1px);
background-size: 40px 40px, 50px 50px, 50px 50px;
pointer-events: none;
z-index: 0;
}
/* Scan line effect - subtle */
.scanline {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
color: var(--accent-cyan);
animation: scan 6s linear infinite;
pointer-events: none;
z-index: 1000;
opacity: 0.25;
box-shadow: 0 0 8px currentColor;
}
@keyframes scan {
0% {
top: -4px;
}
100% {
top: 100vh;
}
}
/* Header - Mobile first */
.header {
position: relative;
z-index: 10;
padding: 10px 12px;
background: var(--bg-panel);
border-bottom: 1px solid var(--border-color);
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 8px;
min-height: 52px;
}
.header::after {
content: '';
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 2px;
background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
opacity: 0.6;
pointer-events: none;
}
@media (min-width: 768px) {
.header {
padding: 12px 20px;
flex-wrap: nowrap;
}
}
.logo {
font-family: var(--font-sans);
font-size: 16px;
font-weight: 700;
letter-spacing: 2px;
color: var(--text-primary);
text-transform: uppercase;
}
@media (min-width: 768px) {
.logo {
font-size: 20px;
letter-spacing: 3px;
}
}
.logo span {
display: none;
color: var(--text-secondary);
font-weight: 400;
font-size: 12px;
margin-left: 10px;
letter-spacing: 1px;
}
@media (min-width: 768px) {
.logo span {
display: inline;
font-size: 14px;
margin-left: 15px;
letter-spacing: 2px;
}
}
.status-bar {
display: flex;
gap: 12px;
align-items: center;
font-family: var(--font-mono);
font-size: 11px;
flex-wrap: nowrap;
}
.agent-selector-compact {
display: flex;
align-items: center;
gap: 8px;
}
.agent-selector-compact .agent-select-sm {
padding: 4px 8px;
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: 4px;
color: var(--text-primary);
font-size: 11px;
font-family: var(--font-mono);
}
.agent-selector-compact .agent-status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--accent-green);
box-shadow: 0 0 6px var(--accent-green);
}
.agent-selector-compact .agent-status-dot.offline {
background: var(--accent-red);
box-shadow: 0 0 6px var(--accent-red);
}
.agent-selector-compact .show-all-label {
display: flex;
align-items: center;
gap: 4px;
font-size: 11px;
color: var(--text-secondary);
cursor: pointer;
}
.back-link {
color: var(--accent-cyan);
text-decoration: none;
font-size: 11px;
padding: 4px 10px;
border: 1px solid var(--accent-cyan);
border-radius: 4px;
}
/* ============================================
STATISTICS STRIP
============================================ */
.stats-strip {
background: linear-gradient(180deg, var(--bg-panel) 0%, var(--bg-dark) 100%);
border-bottom: 1px solid var(--border-color);
padding: 6px 12px;
position: relative;
z-index: 9;
overflow-x: auto;
}
.stats-strip-inner {
display: flex;
align-items: center;
gap: 4px;
min-width: max-content;
}
.strip-stat {
display: flex;
flex-direction: column;
align-items: center;
padding: 4px 10px;
background: rgba(74, 158, 255, 0.05);
border: 1px solid rgba(74, 158, 255, 0.15);
border-radius: 4px;
min-width: 55px;
}
.strip-stat:hover {
background: rgba(74, 158, 255, 0.1);
border-color: rgba(74, 158, 255, 0.3);
}
.strip-value {
font-family: var(--font-mono);
font-size: 14px;
font-weight: 600;
color: var(--accent-cyan);
line-height: 1.2;
}
.strip-label {
font-size: 8px;
font-weight: 600;
color: var(--text-dim);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-top: 1px;
}
.strip-stat.session-stat {
background: rgba(34, 197, 94, 0.05);
border-color: rgba(34, 197, 94, 0.2);
}
.strip-stat.session-stat .strip-value {
color: var(--accent-green);
}
/* Signal quality states */
.strip-stat.signal-stat .strip-value {
letter-spacing: 2px;
}
.strip-stat.signal-stat.good {
background: rgba(34, 197, 94, 0.1);
border-color: rgba(34, 197, 94, 0.3);
}
.strip-stat.signal-stat.good .strip-value {
color: var(--accent-green);
}
.strip-stat.signal-stat.warning {
background: rgba(245, 158, 11, 0.1);
border-color: rgba(245, 158, 11, 0.3);
}
.strip-stat.signal-stat.warning .strip-value {
color: var(--accent-orange);
}
.strip-stat.signal-stat.poor {
background: rgba(239, 68, 68, 0.1);
border-color: rgba(239, 68, 68, 0.3);
}
.strip-stat.signal-stat.poor .strip-value {
color: var(--accent-red);
}
.strip-divider {
width: 1px;
height: 24px;
background: rgba(74, 158, 255, 0.2);
margin: 0 4px;
}
.strip-status {
display: flex;
align-items: center;
gap: 6px;
padding: 0 8px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-secondary);
}
.strip-status .status-dot {
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--accent-red);
transition: all 0.3s ease;
}
.strip-status .status-dot.active {
background: var(--accent-green);
box-shadow: 0 0 10px var(--accent-green);
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.5;
}
}
.strip-time {
font-size: 11px;
font-weight: 500;
color: var(--accent-cyan);
font-family: var(--font-mono);
padding-left: 8px;
border-left: 1px solid rgba(74, 158, 255, 0.2);
white-space: nowrap;
}
.strip-btn {
position: relative;
z-index: 10;
background: rgba(74, 158, 255, 0.1);
border: 1px solid rgba(74, 158, 255, 0.2);
color: var(--text-primary);
padding: 6px 10px;
border-radius: 4px;
font-size: 10px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
white-space: nowrap;
}
.strip-btn:hover:not(:disabled) {
background: rgba(74, 158, 255, 0.2);
border-color: rgba(74, 158, 255, 0.4);
}
.strip-btn.primary {
background: linear-gradient(135deg, var(--accent-cyan) 0%, #2b6fb8 100%);
border: none;
color: white;
}
/* Main dashboard grid - Mobile first */
/* Header ~52px + Nav 44px + Stats strip ~55px = ~151px, using 160px for safety */
.dashboard {
position: relative;
z-index: 10;
display: flex;
flex-direction: column;
gap: 0;
height: calc(100dvh - 160px);
height: calc(100vh - 160px);
min-height: 400px;
}
/* Tablet: Two-column layout */
@media (min-width: 768px) {
.dashboard {
display: grid;
grid-template-columns: 1fr 300px;
grid-template-rows: 1fr auto;
min-height: 500px;
}
}
/* Main display container (map) */
.main-display {
position: relative;
flex: 1;
min-height: 300px;
}
@media (min-width: 768px) {
.main-display {
grid-column: 1;
grid-row: 1;
min-height: 400px;
}
}
#vesselMap {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
/* Leaflet overrides - Dark map styling */
.leaflet-container {
background: var(--bg-dark) !important;
font-family: var(--font-mono);
}
/* Using actual dark tiles now - no filter needed */
.leaflet-control-zoom a {
background: var(--bg-panel) !important;
color: var(--accent-cyan) !important;
border-color: var(--border-color) !important;
}
.leaflet-control-attribution {
background: rgba(0, 0, 0, 0.7) !important;
color: var(--text-secondary) !important;
font-size: 9px !important;
}
.leaflet-popup-content-wrapper {
background: var(--bg-panel);
color: var(--text-primary);
border-radius: 4px;
border: 1px solid rgba(74, 158, 255, 0.2);
}
.leaflet-popup-tip {
background: var(--bg-panel);
}
/* Right sidebar - Mobile first */
.sidebar {
display: flex;
flex-direction: column;
border-left: none;
border-top: 1px solid rgba(74, 158, 255, 0.2);
overflow: hidden;
max-height: 40vh;
background: var(--bg-panel);
}
@media (min-width: 768px) {
.sidebar {
grid-column: 2;
grid-row: 1;
border-left: 1px solid rgba(74, 158, 255, 0.2);
border-top: none;
max-height: none;
}
}
/* Panels */
.panel {
background: var(--bg-panel);
border: 1px solid rgba(74, 158, 255, 0.2);
overflow: hidden;
position: relative;
}
.panel::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
}
.panel-header {
padding: 10px 15px;
background: rgba(74, 158, 255, 0.05);
border-bottom: 1px solid rgba(74, 158, 255, 0.1);
font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif;
font-size: 11px;
font-weight: 500;
letter-spacing: 2px;
text-transform: uppercase;
color: var(--accent-cyan);
display: flex;
justify-content: space-between;
align-items: center;
}
.panel-indicator {
width: 6px;
height: 6px;
background: var(--text-dim);
border-radius: 50%;
opacity: 0.5;
}
.panel-indicator.active {
background: var(--accent-green);
opacity: 1;
animation: blink 1s ease-in-out infinite;
}
@keyframes blink {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.3;
}
}
/* Selected vessel panel */
.selected-vessel {
flex-shrink: 0;
max-height: 480px;
overflow-y: auto;
border-bottom: 1px solid rgba(74, 158, 255, 0.2);
}
.selected-info {
padding: 12px;
}
.no-vessel {
text-align: center;
padding: 30px 15px;
color: var(--text-secondary);
}
.no-vessel-icon {
margin-bottom: 10px;
color: var(--accent-cyan);
}
.vessel-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 15px;
}
.vessel-icon {
display: flex;
align-items: center;
justify-content: center;
}
.vessel-name {
font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif;
font-size: 16px;
font-weight: 700;
color: var(--accent-cyan);
text-shadow: 0 0 15px var(--accent-cyan);
}
.vessel-mmsi {
font-family: var(--font-mono);
font-size: 10px;
color: var(--text-secondary);
background: rgba(74, 158, 255, 0.1);
padding: 2px 5px;
border-radius: 3px;
}
.vessel-details {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 6px;
}
.detail-item {
background: rgba(0, 0, 0, 0.3);
border-radius: 4px;
padding: 8px;
border-left: 2px solid var(--accent-cyan);
}
.detail-label {
font-size: 9px;
text-transform: uppercase;
letter-spacing: 1px;
color: var(--text-secondary);
margin-bottom: 2px;
}
.detail-value {
font-family: var(--font-mono);
font-size: 12px;
color: var(--accent-cyan);
}
/* Vessel list */
.vessel-list {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
}
.vessel-list-content {
flex: 1;
overflow-y: auto;
padding: 8px;
}
.vessel-item {
position: relative;
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(74, 158, 255, 0.15);
border-radius: 4px;
padding: 8px 10px;
margin-bottom: 6px;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
align-items: center;
gap: 10px;
}
.vessel-item:hover {
border-color: var(--accent-cyan);
background: rgba(74, 158, 255, 0.05);
}
.vessel-item.selected {
border-color: var(--accent-cyan);
box-shadow: 0 0 15px rgba(74, 158, 255, 0.2);
background: rgba(74, 158, 255, 0.1);
}
.vessel-item-icon {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
}
.vessel-item-info {
flex: 1;
}
.vessel-item-name {
font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif;
font-size: 12px;
font-weight: 600;
color: var(--accent-cyan);
}
.vessel-item-type {
font-family: var(--font-mono);
font-size: 9px;
color: var(--text-secondary);
}
.vessel-item-speed {
font-family: var(--font-mono);
font-size: 11px;
color: var(--accent-cyan);
text-align: right;
}
/* Bottom controls bar */
.controls-bar {
grid-column: 1 / -1;
grid-row: 2;
display: flex;
align-items: stretch !important;
flex-wrap: nowrap;
gap: 8px;
padding: 8px 15px;
background: var(--bg-panel);
border-top: 1px solid rgba(74, 158, 255, 0.3);
font-size: 11px;
overflow: hidden;
}
.controls-bar > .control-group {
flex: 0 0 auto;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
gap: 4px;
padding: 6px 10px;
background: rgba(74, 158, 255, 0.03);
border: 1px solid rgba(74, 158, 255, 0.1);
border-radius: 6px;
}
.controls-bar > .control-group > .control-group-items {
margin-top: auto;
}
.control-group {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 4px;
padding: 6px 10px;
background: rgba(74, 158, 255, 0.03);
border: 1px solid rgba(74, 158, 255, 0.1);
border-radius: 6px;
}
.control-group-label {
font-size: 8px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1px;
color: var(--accent-cyan);
opacity: 0.7;
}
.control-group-items {
display: flex;
align-items: center;
gap: 6px;
flex-wrap: wrap;
}
.control-group label {
display: flex;
align-items: center;
gap: 4px;
cursor: pointer;
font-size: 10px;
color: var(--text-primary);
white-space: nowrap;
}
.control-group input[type="checkbox"] {
accent-color: var(--accent-cyan);
width: 12px;
height: 12px;
}
.control-group select {
padding: 4px 8px;
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(74, 158, 255, 0.3);
border-radius: 4px;
color: var(--accent-cyan);
font-family: var(--font-mono);
font-size: 10px;
}
.control-group input[type="text"],
.control-group input[type="number"] {
padding: 4px 6px;
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(74, 158, 255, 0.3);
border-radius: 4px;
color: var(--accent-cyan);
font-family: var(--font-mono);
font-size: 10px;
}
.control-group.tracking-group {
background: rgba(34, 197, 94, 0.05);
border-color: rgba(34, 197, 94, 0.2);
}
.control-group.tracking-group .control-group-label {
color: var(--accent-green);
}
/* Start/stop button */
.start-btn {
padding: 6px 16px;
border: none;
background: var(--accent-green);
color: #fff;
font-family: var(--font-mono);
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s ease;
}
.start-btn:hover {
background: #1db954;
box-shadow: 0 0 20px rgba(34, 197, 94, 0.3);
}
.start-btn.active {
background: var(--accent-red);
color: #fff;
}
.start-btn.active:hover {
background: #dc2626;
box-shadow: 0 0 20px rgba(239, 68, 68, 0.3);
}
/* Vessel markers */
.vessel-marker {
background: transparent;
border: none;
}
.vessel-marker svg {
transition: filter 0.2s ease;
}
.vessel-marker.selected svg {
filter: drop-shadow(0 0 8px rgba(255,255,255,0.8)) !important;
}
/* ============================================
TRACKED VESSEL PULSATING RING
============================================ */
.vessel-marker.selected {
position: relative;
}
.tracking-ring {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 40px;
height: 40px;
border: 2px solid var(--accent-cyan);
border-radius: 50%;
animation: tracking-pulse 1.5s ease-out infinite;
pointer-events: none;
}
.tracking-ring-inner {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 28px;
height: 28px;
border: 1px solid var(--accent-cyan);
border-radius: 50%;
animation: tracking-pulse 1.5s ease-out infinite 0.3s;
pointer-events: none;
}
@keyframes tracking-pulse {
0% {
transform: translate(-50%, -50%) scale(0.8);
opacity: 1;
border-color: rgba(74, 158, 255, 1);
}
50% {
opacity: 0.6;
}
100% {
transform: translate(-50%, -50%) scale(1.8);
opacity: 0;
border-color: rgba(74, 158, 255, 0);
}
}
/* Range rings */
.range-ring {
fill: none;
stroke: var(--accent-cyan);
stroke-opacity: 0.3;
stroke-width: 1;
stroke-dasharray: 4 4;
}
/* Custom scrollbar */
::-webkit-scrollbar {
width: 6px;
}
::-webkit-scrollbar-track {
background: var(--bg-dark);
}
::-webkit-scrollbar-thumb {
background: var(--accent-cyan);
border-radius: 3px;
}
/* ============== MOBILE/TABLET FIXES ============== */
@media (max-width: 767px) {
.dashboard {
display: flex !important;
flex-direction: column !important;
height: auto !important;
min-height: calc(100dvh - 160px);
overflow-y: auto !important;
overflow-x: hidden;
-webkit-overflow-scrolling: touch;
}
.main-display {
flex: none !important;
height: 50vh;
min-height: 300px;
width: 100%;
}
.sidebar {
max-height: none !important;
overflow: visible !important;
flex-shrink: 0;
width: 100%;
}
.panel {
overflow: visible !important;
}
.selected-vessel {
max-height: none !important;
overflow: visible !important;
}
.selected-info {
overflow: visible !important;
}
.vessel-list-content {
max-height: 250px;
overflow-y: auto !important;
-webkit-overflow-scrolling: touch;
}
.controls-bar {
flex-wrap: wrap;
gap: 8px;
padding: 10px;
width: 100%;
}
.back-link {
white-space: nowrap;
font-size: 10px;
padding: 6px 8px;
}
.strip-time {
font-size: 10px;
}
.control-group {
flex-wrap: wrap;
}
.start-btn {
width: 100%;
margin-left: 0;
margin-top: 8px;
}
.vessel-details {
grid-template-columns: 1fr;
}
}
/* Mobile responsiveness for stats strip */
@media (max-width: 768px) {
.stats-strip {
padding: 4px 8px;
}
.strip-stat {
padding: 3px 6px;
min-width: 45px;
}
.strip-value {
font-size: 12px;
}
.strip-label {
font-size: 7px;
}
.strip-btn {
padding: 6px 10px;
font-size: 9px;
}
}
/* Leaflet touch fixes for mobile */
.leaflet-container {
touch-action: pan-x pan-y;
-webkit-tap-highlight-color: transparent;
}
.leaflet-control-zoom a {
min-width: 44px !important;
min-height: 44px !important;
line-height: 44px !important;
font-size: 18px !important;
}
/* ============================================
DSC (Digital Selective Calling) Styles
============================================ */
/* DSC Control Group - Orange accent (warning/distress theme) */
.control-group.dsc-group {
background: rgba(245, 158, 11, 0.05);
border-color: rgba(245, 158, 11, 0.2);
}
.control-group.dsc-group .control-group-label {
color: var(--accent-orange);
}
.control-group.dsc-group select,
.control-group.dsc-group input[type="number"] {
border-color: rgba(245, 158, 11, 0.3);
color: var(--accent-orange);
}
.dsc-btn {
background: var(--accent-orange) !important;
font-size: 9px !important;
padding: 6px 12px !important;
}
.dsc-btn:hover {
background: #d97706 !important;
box-shadow: 0 0 20px rgba(245, 158, 11, 0.3) !important;
}
.dsc-btn.active {
background: var(--accent-red) !important;
}
/* DSC Panel */
.panel.dsc-messages {
flex: 0 0 auto;
max-height: 250px;
display: flex;
flex-direction: column;
border-top: 1px solid rgba(245, 158, 11, 0.2);
}
.panel.dsc-messages::before {
background: linear-gradient(90deg, transparent, var(--accent-orange), transparent);
}
.panel.dsc-messages .panel-header {
background: rgba(245, 158, 11, 0.05);
border-bottom-color: rgba(245, 158, 11, 0.1);
color: var(--accent-orange);
}
/* DSC Alert Summary */
.dsc-alert-summary {
display: flex;
gap: 8px;
padding: 6px 12px;
background: rgba(0, 0, 0, 0.2);
border-bottom: 1px solid rgba(245, 158, 11, 0.1);
font-family: var(--font-mono);
font-size: 9px;
}
.dsc-alert-count {
padding: 2px 6px;
border-radius: 3px;
font-weight: 600;
}
.dsc-alert-count.distress {
background: rgba(239, 68, 68, 0.2);
color: var(--accent-red);
}
.dsc-alert-count.urgency {
background: rgba(245, 158, 11, 0.2);
color: var(--accent-orange);
}
/* DSC List Content */
.dsc-list-content {
flex: 1;
overflow-y: auto;
padding: 8px;
}
.no-messages {
text-align: center;
padding: 20px 15px;
color: var(--text-secondary);
font-size: 11px;
}
/* DSC Message Items */
.dsc-message-item {
position: relative;
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(245, 158, 11, 0.15);
border-radius: 4px;
padding: 8px 10px;
margin-bottom: 6px;
cursor: pointer;
transition: all 0.2s ease;
}
.dsc-message-item:hover {
border-color: var(--accent-orange);
background: rgba(245, 158, 11, 0.05);
}
.dsc-message-item.distress {
border-color: var(--accent-red);
background: rgba(239, 68, 68, 0.1);
animation: distress-pulse 1.5s ease-in-out infinite;
}
.dsc-message-item.urgency {
border-color: var(--accent-orange);
background: rgba(245, 158, 11, 0.1);
}
@keyframes distress-pulse {
0%, 100% { box-shadow: 0 0 5px rgba(239, 68, 68, 0.3); }
50% { box-shadow: 0 0 15px rgba(239, 68, 68, 0.6); }
}
.dsc-message-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 4px;
}
.dsc-message-category {
font-family: var(--font-mono);
font-size: 9px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 2px 6px;
border-radius: 3px;
background: rgba(245, 158, 11, 0.2);
color: var(--accent-orange);
}
.dsc-message-item.distress .dsc-message-category {
background: rgba(239, 68, 68, 0.2);
color: var(--accent-red);
}
.dsc-message-time {
font-family: var(--font-mono);
font-size: 9px;
color: var(--text-dim);
}
.dsc-message-mmsi {
font-family: var(--font-mono);
font-size: 11px;
color: var(--accent-orange);
}
.dsc-message-country {
font-size: 9px;
color: var(--text-secondary);
}
.dsc-message-nature {
font-size: 10px;
color: var(--accent-red);
font-weight: 500;
margin-top: 2px;
}
.dsc-message-pos {
font-family: var(--font-mono);
font-size: 9px;
color: var(--text-secondary);
}
/* DSC Distress Alert Overlay */
.dsc-distress-alert {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 10000;
background: rgba(15, 18, 24, 0.98);
border: 2px solid var(--accent-red);
border-radius: 8px;
padding: 24px 32px;
min-width: 300px;
text-align: center;
box-shadow: 0 0 40px rgba(239, 68, 68, 0.5);
animation: alert-flash 0.5s ease-in-out 3;
}
@keyframes alert-flash {
0%, 100% { border-color: var(--accent-red); box-shadow: 0 0 40px rgba(239, 68, 68, 0.5); }
50% { border-color: #ff6b6b; box-shadow: 0 0 60px rgba(239, 68, 68, 0.8); }
}
.dsc-distress-alert .dsc-alert-header {
font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif;
font-size: 24px;
font-weight: 700;
color: var(--accent-red);
margin-bottom: 16px;
letter-spacing: 3px;
}
.dsc-distress-alert .dsc-alert-mmsi {
font-family: var(--font-mono);
font-size: 16px;
color: var(--accent-cyan);
margin-bottom: 8px;
}
.dsc-distress-alert .dsc-alert-country {
font-size: 14px;
color: var(--text-secondary);
margin-bottom: 8px;
}
.dsc-distress-alert .dsc-alert-nature {
font-size: 18px;
font-weight: 600;
color: var(--accent-orange);
margin-bottom: 12px;
}
.dsc-distress-alert .dsc-alert-position {
font-family: var(--font-mono);
font-size: 14px;
color: var(--accent-cyan);
margin-bottom: 16px;
}
.dsc-distress-alert button {
background: var(--accent-red);
border: none;
color: white;
padding: 10px 24px;
font-family: var(--font-mono);
font-size: 12px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s ease;
}
.dsc-distress-alert button:hover {
background: #dc2626;
box-shadow: 0 0 20px rgba(239, 68, 68, 0.5);
}
/* DSC Map Markers */
.dsc-marker {
background: transparent;
border: none;
}
.dsc-marker-inner {
width: 28px;
height: 28px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
color: white;
border: 2px solid white;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);
}
.dsc-marker-inner.distress {
animation: distress-marker-pulse 1s ease-in-out infinite;
}
@keyframes distress-marker-pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.2); }
}
/* Mobile adjustments for DSC */
@media (max-width: 767px) {
.panel.dsc-messages {
max-height: 200px;
}
.dsc-distress-alert {
width: 90%;
min-width: auto;
padding: 16px 20px;
}
.dsc-distress-alert .dsc-alert-header {
font-size: 18px;
}
}
/* GPS Indicator */
.gps-indicator {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
background: rgba(34, 197, 94, 0.15);
border: 1px solid #22c55e;
border-radius: 12px;
font-size: 10px;
font-weight: 600;
color: #22c55e;
text-transform: uppercase;
letter-spacing: 0.5px;
margin-left: 10px;
}
.gps-indicator .gps-dot {
width: 6px;
height: 6px;
background: #22c55e;
border-radius: 50%;
animation: gps-pulse 2s ease-in-out infinite;
}
@keyframes gps-pulse {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.5; transform: scale(0.8); }
}