-
{selectedRoute.number}
- {selectedRoute.name}
+ {selectedRoute.name}
-
-
🏁 Start: {selectedRoute.from} ({selectedRoute.departureTime})
-
🏫 Destination: RIT Campus ({selectedRoute.arrivalTime})
-
📍 Total Stops: {selectedRoute.stops.length} mapped stops
+
+
+ 🏁 Start: {selectedRoute.from} ({selectedRoute.departureTime})
+
+
+ 🏫 Destination: RIT Campus ({selectedRoute.arrivalTime})
+
+
+ 📍 Stops: {selectedRoute.stops.length} mapped stops
+
)}
diff --git a/src/pages/BusRoutes/BusRoutes.tsx b/src/pages/BusRoutes/BusRoutes.tsx
index faf32fa..9e89725 100644
--- a/src/pages/BusRoutes/BusRoutes.tsx
+++ b/src/pages/BusRoutes/BusRoutes.tsx
@@ -1,9 +1,8 @@
import { useState, useEffect } from 'react';
-import { motion } from 'framer-motion';
-import { Search, Loader2, ChevronRight } from 'lucide-react';
+import { motion, AnimatePresence } from 'framer-motion';
+import { Search, Loader2, ChevronRight, Menu, X, MapPin, Navigation, Compass, Radio } from 'lucide-react';
import BusCard from '@/components/BusCard/BusCard';
import BusRouteMap from '@/components/BusRouteMap/BusRouteMap';
-import { StaggerContainer, StaggerItem } from '@/components/AnimatedContainer/AnimatedContainer';
import type { BusRoute } from '@/types';
import { getBackendUrl } from '@/lib/utils';
import { Link } from 'react-router-dom';
@@ -13,6 +12,7 @@ export default function BusRoutes() {
const [busRoutes, setBusRoutes] = useState
([]);
const [loadingBus, setLoadingBus] = useState(true);
const [selectedBusRoute, setSelectedBusRoute] = useState(null);
+ const [isSidebarOpen, setIsSidebarOpen] = useState(false);
useEffect(() => {
setLoadingBus(true);
@@ -44,88 +44,173 @@ export default function BusRoutes() {
});
}, []);
- const filteredRoutes = busRoutes.filter((r) =>
- r.name.toLowerCase().includes(busSearch.toLowerCase()) ||
- r.from.toLowerCase().includes(busSearch.toLowerCase()) ||
- r.number.toLowerCase().includes(busSearch.toLowerCase())
+ const filteredRoutes = busRoutes.filter(
+ (r) =>
+ r.name.toLowerCase().includes(busSearch.toLowerCase()) ||
+ r.from.toLowerCase().includes(busSearch.toLowerCase()) ||
+ r.number.toLowerCase().includes(busSearch.toLowerCase())
);
return (
-
-
- {/* Header */}
-
-
-
-
Home
+
+ {/* Sleek Dark Header */}
+
+
+
+
+ Home
- Bus Routes
+ Live Bus Tracking
-
- RIT{' '}
-
- Bus Routes
+
+
+ RIT Live Transport Map
+
+
+
+ Live GPS Sync
-
-
- View all campus bus routes, timings, and pickup locations at a glance.
+
+
+
+ {/* Controls: Search + Toggle Drawer Button */}
+
+
+
+ setBusSearch(e.target.value)}
+ className="w-full pl-9 pr-4 py-2 rounded-xl bg-slate-800 border border-slate-700 text-xs text-white placeholder-slate-400 focus:outline-none focus:border-orange-500 transition-colors"
+ style={{ fontFamily: 'Inter, sans-serif' }}
+ />
+
+
+
+
+
+
+
+ {/* Main Map Viewport */}
+
+ {loadingBus ? (
+
+
+
+ Initializing Live GPS Bus Tracking Map...
-
+ ) : (
+ <>
+ {/* Quick Horizontal Route Chips Bar on top of Map */}
+
+
-
-
-
- setBusSearch(e.target.value)}
- className="w-full pl-11 pr-4 py-3 rounded-xl border border-[#E5E7EB] bg-white text-sm text-[#1E293B] placeholder-[#94A3B8] focus:outline-none focus:border-[#F97316] transition-colors"
- style={{ fontFamily: 'Inter, sans-serif' }}
- />
-
+ {filteredRoutes.map((route) => {
+ const isSelected = selectedBusRoute?.number === route.number;
+ return (
+
+ );
+ })}
+
- {loadingBus ? (
-
-
-
- Loading live bus routes from RIT Transport...
-
-
- ) : filteredRoutes.length === 0 ? (
-
-
- No bus routes found matching "{busSearch}"
-
-
- ) : (
-
- {/* Routes List */}
-
-
- {filteredRoutes.map((route) => (
-
- setSelectedBusRoute(route)}
- />
-
- ))}
-
-
+ {/* The Fullscreen Map Component */}
+
- {/* Interactive Map */}
-
-
-
-
- )}
-
+ {/* Sidebar / Bottom Sheet Overlay */}
+
+ {isSidebarOpen && (
+ <>
+ {/* Backdrop on mobile */}
+ setIsSidebarOpen(false)}
+ className="absolute inset-0 bg-slate-950/60 backdrop-blur-xs z-30 lg:hidden"
+ />
+
+ {/* Drawer Panel: Floating Panel on Desktop, Bottom Sheet on Mobile */}
+
+ {/* Drawer Header */}
+
+
+
+
+ Select Bus Route ({filteredRoutes.length})
+
+
+
+
+
+ {/* Route List inside Drawer */}
+
+ {filteredRoutes.map((route) => (
+ {
+ setSelectedBusRoute(route);
+ // Auto close sidebar on mobile for instant map view
+ if (window.innerWidth < 1024) {
+ setIsSidebarOpen(false);
+ }
+ }}
+ />
+ ))}
+
+
+ >
+ )}
+
+ >
+ )}
);