@import "tailwindcss/base"; @import "tailwindcss/components"; @import "tailwindcss/utilities"; /* This file is for your main application CSS */ /* Ensure full height layout for map pages */ html, body { height: 100%; margin: 0; padding: 0; } /* Main content container for map pages */ main { height: 100vh; overflow: hidden; } #map { height: calc(100vh - 60px); /* Adjust based on header height */ width: 100%; } /* Full page map for APRS home page and callsign pages */ #aprs-map { position: fixed !important; top: 0 !important; left: 0 !important; right: 0 !important; bottom: 0 !important; height: 100vh !important; width: 100vw !important; z-index: 1 !important; transition: right 0.3s ease-in-out !important; } /* Desktop slideover behavior for map */ @media (min-width: 1024px) { #aprs-map.slideover-open { right: 352px !important; } #aprs-map.slideover-closed { right: 0 !important; } } /* Mobile slideover behavior for map */ @media (max-width: 1023px) { #aprs-map { right: 0 !important; } } /* Ensure the map container div has proper dimensions */ .phx-main { position: relative; height: 100vh; overflow: hidden; } /* Fix for LiveView containers */ div[data-phx-main="true"] { height: 100vh; overflow: hidden; } /* Hide header on home page */ body.home-page header { display: none; } /* Adjust main content area for full page map */ body.home-page main { padding: 0; max-width: none; height: 100vh; } body.home-page main > div { max-width: none; height: 100%; } /* Marker cluster styles */ .marker-cluster-small { background-color: rgba(16, 185, 129, 0.8); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .marker-cluster-small div { background-color: rgba(16, 185, 129, 0.9); box-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.3); } .marker-cluster-medium { background-color: rgba(59, 130, 246, 0.8); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .marker-cluster-medium div { background-color: rgba(59, 130, 246, 0.9); box-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.3); } .marker-cluster-large { background-color: rgba(239, 68, 68, 0.8); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .marker-cluster-large div { background-color: rgba(239, 68, 68, 0.9); box-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.3); } /* Custom cluster icon styles */ .marker-cluster { background-clip: padding-box; border-radius: 50%; border: 2px solid rgba(255, 255, 255, 0.8); } .marker-cluster div { width: 30px; height: 30px; margin-left: 5px; margin-top: 5px; text-align: center; border-radius: 50%; font: 13px "Helvetica Neue", Arial, Helvetica, sans-serif; color: white; font-weight: bold; line-height: 30px; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); } .marker-cluster span { line-height: 30px; } /* Cluster animations */ .leaflet-cluster-anim .leaflet-marker-icon, .leaflet-cluster-anim .leaflet-marker-shadow { transition: transform 0.3s ease-out, opacity 0.3s ease-out; } /* Hover effect for clusters */ .marker-cluster:hover { transform: scale(1.1); z-index: 1000 !important; } /* APRS marker styles */ .aprs-marker { transition: transform 0.2s ease-out; } .aprs-marker:hover { transform: scale(1.2); z-index: 1000 !important; } /* High-DPI support for APRS symbols */ @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { .aprs-marker div[style*="aprs-symbols-24-0.png"] { background-image: url("/aprs-symbols/aprs-symbols-24-0@2x.png") !important; background-size: 384px 144px !important; } .aprs-marker div[style*="aprs-symbols-24-1.png"] { background-image: url("/aprs-symbols/aprs-symbols-24-1@2x.png") !important; background-size: 384px 144px !important; } .aprs-marker div[style*="aprs-symbols-24-2.png"] { background-image: url("/aprs-symbols/aprs-symbols-24-2@2x.png") !important; background-size: 384px 144px !important; } } /* Trail visualization styles */ .trail-tooltip { background-color: rgba(0, 0, 0, 0.8); border: 1px solid #1e90ff; color: white; font-size: 11px; padding: 2px 6px; border-radius: 3px; white-space: nowrap; } /* Trail polyline hover effect */ .leaflet-interactive:hover { stroke-width: 5; stroke-opacity: 1 !important; } /* Historical trail lines */ .leaflet-interactive[stroke="#1E90FF"] { stroke-width: 3; stroke-opacity: 0.8; stroke-linecap: round; stroke-linejoin: round; } .leaflet-interactive[stroke="#1E90FF"]:hover { stroke-width: 5; stroke-opacity: 1; filter: drop-shadow(0 0 4px #1e90ff); } /* Position dot hover effect */ .leaflet-marker-icon.leaflet-interactive:hover { transform: scale(1.5); transition: transform 0.2s ease-out; } /* Trail controls styling */ .trail-toggle-control { background-color: white; border: 2px solid rgba(0, 0, 0, 0.2); border-radius: 4px; padding: 5px 10px; font-size: 14px; cursor: pointer; transition: background-color 0.2s ease; } .trail-toggle-control:hover { background-color: #f0f0f0; } .trail-toggle-control.active { background-color: #1e90ff; color: white; } /* Historical dot marker styles */ .historical-dot-marker { cursor: pointer; transition: transform 0.2s ease-out; } .historical-dot-marker:hover { transform: scale(1.5); z-index: 1000 !important; } .historical-dot-marker div { box-shadow: 0 0 4px rgba(0, 0, 0, 0.4); transition: all 0.2s ease-out; } .historical-dot-marker:hover div { box-shadow: 0 0 8px rgba(255, 107, 107, 0.8); border-color: #ff6b6b !important; } /* Historical trail line styling */ .historical-trail-line { stroke: #1e90ff; stroke-width: 3; stroke-opacity: 0.8; stroke-linecap: round; stroke-linejoin: round; fill: none; transition: all 0.2s ease-out; z-index: 1; } .historical-trail-line:hover { stroke-width: 5; stroke-opacity: 1; filter: drop-shadow(0 0 4px #1e90ff); z-index: 2; } /* Ensure markers are above trail lines */ .leaflet-marker-icon { z-index: 10 !important; } .historical-dot-marker { z-index: 15 !important; } /* Slideover toggle button styles */ .slideover-toggle { position: fixed !important; right: 10px; top: 10px; z-index: 1001; background: white; border: 2px solid rgba(0, 0, 0, 0.2); border-radius: 8px; padding: 10px; cursor: pointer; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); transition: all 0.2s ease; display: flex; align-items: center; justify-content: center; } .slideover-toggle:hover { background: #f8fafc; box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2); transform: translateY(-1px); } .slideover-toggle:active { transform: translateY(0); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); } /* Hide toggle on desktop when slideover is open */ @media (min-width: 1024px) { .slideover-toggle.slideover-open { display: none; } } /* Mobile toggle adjustments */ @media (max-width: 1023px) { .slideover-toggle { right: 15px; top: 15px; padding: 12px; border-radius: 50%; width: 48px; height: 48px; } } /* Slideover panel responsive styles */ .slideover-panel { position: fixed; top: 0; right: 0; height: 100vh; width: 352px; background: white; box-shadow: -4px 0 24px rgba(0, 0, 0, 0.15); z-index: 1000; transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); overflow-y: auto; } /* Desktop slideover behavior */ @media (min-width: 1024px) { .slideover-panel.slideover-open { transform: translateX(0); } .slideover-panel.slideover-closed { transform: translateX(100%); } } /* Mobile slideover behavior */ @media (max-width: 1023px) { .slideover-panel { width: 100vw; max-width: 400px; box-shadow: -8px 0 32px rgba(0, 0, 0, 0.2); } .slideover-panel.slideover-open { transform: translateX(0); } .slideover-panel.slideover-closed { transform: translateX(100%); } } /* Mobile panel improvements */ @media (max-width: 1023px) { .slideover-panel { display: flex; flex-direction: column; } } /* Improve scrolling on mobile */ @media (max-width: 1023px) { .slideover-panel { -webkit-overflow-scrolling: touch; overscroll-behavior: contain; } .slideover-panel .flex-1 { min-height: 0; } }