mirror of
https://github.com/smittix/intercept.git
synced 2026-07-25 01:08:11 -07:00
feat: Add pulsating ring effect for tracked aircraft/vessels
Makes it much clearer which vehicle is being tracked on the map by adding two animated concentric rings that pulse outward from the selected marker. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1146,6 +1146,55 @@ body {
|
|||||||
50% { opacity: 0.5; transform: scale(0.8); }
|
50% { opacity: 0.5; transform: scale(0.8); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ============================================
|
||||||
|
TRACKED AIRCRAFT PULSATING RING
|
||||||
|
============================================ */
|
||||||
|
.aircraft-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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ============== MOBILE/TABLET FIXES ============== */
|
/* ============== MOBILE/TABLET FIXES ============== */
|
||||||
@media (max-width: 1023px) {
|
@media (max-width: 1023px) {
|
||||||
/* Dashboard - allow scrolling */
|
/* Dashboard - allow scrolling */
|
||||||
|
|||||||
@@ -759,6 +759,55 @@ body {
|
|||||||
filter: drop-shadow(0 0 8px rgba(255,255,255,0.8)) !important;
|
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 rings */
|
||||||
.range-ring {
|
.range-ring {
|
||||||
fill: none;
|
fill: none;
|
||||||
|
|||||||
@@ -2970,9 +2970,11 @@ sudo make install</code>
|
|||||||
const size = iconType === 'helicopter' ? 22 : 24;
|
const size = iconType === 'helicopter' ? 22 : 24;
|
||||||
const glowColor = isSelected ? 'rgba(255,255,255,0.9)' : color;
|
const glowColor = isSelected ? 'rgba(255,255,255,0.9)' : color;
|
||||||
const glowSize = isSelected ? '10px' : '5px';
|
const glowSize = isSelected ? '10px' : '5px';
|
||||||
|
const trackingRing = isSelected ?
|
||||||
|
'<div class="tracking-ring"></div><div class="tracking-ring-inner"></div>' : '';
|
||||||
return L.divIcon({
|
return L.divIcon({
|
||||||
className: `aircraft-marker aircraft-${iconType}${isSelected ? ' selected' : ''}`,
|
className: `aircraft-marker aircraft-${iconType}${isSelected ? ' selected' : ''}`,
|
||||||
html: `<svg width="${size}" height="${size}" viewBox="0 0 24 24" style="transform: rotate(${rotation}deg); color: ${color}; filter: drop-shadow(0 0 ${glowSize} ${glowColor});">
|
html: `${trackingRing}<svg width="${size}" height="${size}" viewBox="0 0 24 24" style="transform: rotate(${rotation}deg); color: ${color}; filter: drop-shadow(0 0 ${glowSize} ${glowColor});">
|
||||||
<path fill="currentColor" d="${path}"/>
|
<path fill="currentColor" d="${path}"/>
|
||||||
</svg>`,
|
</svg>`,
|
||||||
iconSize: [size, size],
|
iconSize: [size, size],
|
||||||
|
|||||||
@@ -329,10 +329,12 @@
|
|||||||
const size = 24;
|
const size = 24;
|
||||||
const glowColor = isSelected ? 'rgba(255,255,255,0.8)' : color;
|
const glowColor = isSelected ? 'rgba(255,255,255,0.8)' : color;
|
||||||
const glowSize = isSelected ? '8px' : '4px';
|
const glowSize = isSelected ? '8px' : '4px';
|
||||||
|
const trackingRing = isSelected ?
|
||||||
|
'<div class="tracking-ring"></div><div class="tracking-ring-inner"></div>' : '';
|
||||||
|
|
||||||
return L.divIcon({
|
return L.divIcon({
|
||||||
className: 'vessel-marker' + (isSelected ? ' selected' : ''),
|
className: 'vessel-marker' + (isSelected ? ' selected' : ''),
|
||||||
html: `<svg width="${size}" height="${size}" viewBox="0 0 24 24" style="transform: rotate(${rotation}deg); filter: drop-shadow(0 0 ${glowSize} ${glowColor});">
|
html: `${trackingRing}<svg width="${size}" height="${size}" viewBox="0 0 24 24" style="transform: rotate(${rotation}deg); filter: drop-shadow(0 0 ${glowSize} ${glowColor});">
|
||||||
<path fill="${color}" d="${path}"/>
|
<path fill="${color}" d="${path}"/>
|
||||||
</svg>`,
|
</svg>`,
|
||||||
iconSize: [size, size],
|
iconSize: [size, size],
|
||||||
|
|||||||
Reference in New Issue
Block a user