feat: UI redesign with park detail pages and ride status
Some checks failed
Build and Deploy / Build & Push (push) Failing after 22s

Visual overhaul:
- Warmer color system with amber accent for Today, better text hierarchy
- Row hover highlighting, sticky column shadow on horizontal scroll
- Closed cells replaced with dot (·) instead of "Closed" text
- Regional grouping (Northeast/Southeast/Midwest/Texas & South/West)
- Two-row header with park count badge and WeekNav on separate lines
- Amber "Today" button in WeekNav when off current week
- Mobile card layout (< 1024px) with 7-day grid per park; table on desktop
- Skeleton loading state via app/loading.tsx

Park detail pages (/park/[id]):
- Month calendar view with ← → navigation via ?month= param
- Live ride status fetched from Six Flags API (cached 1h)
- Ride hours only shown when they differ from park operating hours
- Fallback to nearest upcoming open day when today is dropped by API,
  including cross-month fallback for end-of-month edge case

Data layer:
- Park type gains region field; parks.ts exports groupByRegion()
- db.ts gains getParkMonthData() for single-park month queries
- sixflags.ts gains scrapeRidesForDay() returning RidesFetchResult
  with rides, dataDate, isExact, and parkHoursLabel

Removed: CalendarGrid.tsx, MonthNav.tsx (dead code)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-04 11:53:06 -04:00
parent 5f82407fea
commit e48038c399
17 changed files with 1605 additions and 442 deletions

View File

@@ -15,6 +15,7 @@ export const PARKS: Park[] = [
shortName: "Great Adventure",
chain: "sixflags",
slug: "greatadventure",
region: "Northeast",
location: { lat: 40.1376, lng: -74.4388, city: "Jackson", state: "NJ" },
timezone: "America/New_York",
website: "https://www.sixflags.com",
@@ -25,6 +26,7 @@ export const PARKS: Park[] = [
shortName: "Magic Mountain",
chain: "sixflags",
slug: "magicmountain",
region: "West & International",
location: { lat: 34.4252, lng: -118.5973, city: "Valencia", state: "CA" },
timezone: "America/Los_Angeles",
website: "https://www.sixflags.com",
@@ -35,6 +37,7 @@ export const PARKS: Park[] = [
shortName: "Great America",
chain: "sixflags",
slug: "greatamerica",
region: "Midwest",
location: { lat: 42.3702, lng: -87.9358, city: "Gurnee", state: "IL" },
timezone: "America/Chicago",
website: "https://www.sixflags.com",
@@ -45,6 +48,7 @@ export const PARKS: Park[] = [
shortName: "Over Georgia",
chain: "sixflags",
slug: "overgeorgia",
region: "Southeast",
location: { lat: 33.7718, lng: -84.5494, city: "Austell", state: "GA" },
timezone: "America/New_York",
website: "https://www.sixflags.com",
@@ -55,6 +59,7 @@ export const PARKS: Park[] = [
shortName: "Over Texas",
chain: "sixflags",
slug: "overtexas",
region: "Texas & South",
location: { lat: 32.7554, lng: -97.0639, city: "Arlington", state: "TX" },
timezone: "America/Chicago",
website: "https://www.sixflags.com",
@@ -65,6 +70,7 @@ export const PARKS: Park[] = [
shortName: "St. Louis",
chain: "sixflags",
slug: "stlouis",
region: "Midwest",
location: { lat: 38.5153, lng: -90.6751, city: "Eureka", state: "MO" },
timezone: "America/Chicago",
website: "https://www.sixflags.com",
@@ -75,6 +81,7 @@ export const PARKS: Park[] = [
shortName: "Fiesta Texas",
chain: "sixflags",
slug: "fiestatexas",
region: "Texas & South",
location: { lat: 29.6054, lng: -98.622, city: "San Antonio", state: "TX" },
timezone: "America/Chicago",
website: "https://www.sixflags.com",
@@ -85,6 +92,7 @@ export const PARKS: Park[] = [
shortName: "New England",
chain: "sixflags",
slug: "newengland",
region: "Northeast",
location: { lat: 42.037, lng: -72.6151, city: "Agawam", state: "MA" },
timezone: "America/New_York",
website: "https://www.sixflags.com",
@@ -95,6 +103,7 @@ export const PARKS: Park[] = [
shortName: "Discovery Kingdom",
chain: "sixflags",
slug: "discoverykingdom",
region: "West & International",
location: { lat: 38.136, lng: -122.2314, city: "Vallejo", state: "CA" },
timezone: "America/Los_Angeles",
website: "https://www.sixflags.com",
@@ -105,6 +114,7 @@ export const PARKS: Park[] = [
shortName: "Mexico",
chain: "sixflags",
slug: "mexico",
region: "West & International",
location: { lat: 19.2982, lng: -99.2146, city: "Mexico City", state: "Mexico" },
timezone: "America/Mexico_City",
website: "https://www.sixflags.com",
@@ -115,6 +125,7 @@ export const PARKS: Park[] = [
shortName: "Great Escape",
chain: "sixflags",
slug: "greatescape",
region: "Northeast",
location: { lat: 43.3537, lng: -73.6776, city: "Queensbury", state: "NY" },
timezone: "America/New_York",
website: "https://www.sixflags.com",
@@ -125,6 +136,7 @@ export const PARKS: Park[] = [
shortName: "Darien Lake",
chain: "sixflags",
slug: "darienlake",
region: "Northeast",
location: { lat: 42.9915, lng: -78.3895, city: "Darien Center", state: "NY" },
timezone: "America/New_York",
website: "https://www.sixflags.com",
@@ -136,6 +148,7 @@ export const PARKS: Park[] = [
shortName: "Cedar Point",
chain: "sixflags",
slug: "cedarpoint",
region: "Midwest",
location: { lat: 41.4784, lng: -82.6832, city: "Sandusky", state: "OH" },
timezone: "America/New_York",
website: "https://www.sixflags.com",
@@ -146,6 +159,7 @@ export const PARKS: Park[] = [
shortName: "Knott's",
chain: "sixflags",
slug: "knotts",
region: "West & International",
location: { lat: 33.8442, lng: -117.9989, city: "Buena Park", state: "CA" },
timezone: "America/Los_Angeles",
website: "https://www.sixflags.com",
@@ -156,6 +170,7 @@ export const PARKS: Park[] = [
shortName: "Canada's Wonderland",
chain: "sixflags",
slug: "canadaswonderland",
region: "Northeast",
location: { lat: 43.8426, lng: -79.5396, city: "Vaughan", state: "ON" },
timezone: "America/Toronto",
website: "https://www.sixflags.com",
@@ -166,6 +181,7 @@ export const PARKS: Park[] = [
shortName: "Carowinds",
chain: "sixflags",
slug: "carowinds",
region: "Southeast",
location: { lat: 35.1043, lng: -80.9394, city: "Charlotte", state: "NC" },
timezone: "America/New_York",
website: "https://www.sixflags.com",
@@ -176,6 +192,7 @@ export const PARKS: Park[] = [
shortName: "Kings Dominion",
chain: "sixflags",
slug: "kingsdominion",
region: "Southeast",
location: { lat: 37.8357, lng: -77.4463, city: "Doswell", state: "VA" },
timezone: "America/New_York",
website: "https://www.sixflags.com",
@@ -186,6 +203,7 @@ export const PARKS: Park[] = [
shortName: "Kings Island",
chain: "sixflags",
slug: "kingsisland",
region: "Midwest",
location: { lat: 39.3442, lng: -84.2696, city: "Mason", state: "OH" },
timezone: "America/New_York",
website: "https://www.sixflags.com",
@@ -196,6 +214,7 @@ export const PARKS: Park[] = [
shortName: "Valleyfair",
chain: "sixflags",
slug: "valleyfair",
region: "Midwest",
location: { lat: 44.7227, lng: -93.4691, city: "Shakopee", state: "MN" },
timezone: "America/Chicago",
website: "https://www.sixflags.com",
@@ -206,6 +225,7 @@ export const PARKS: Park[] = [
shortName: "Worlds of Fun",
chain: "sixflags",
slug: "worldsoffun",
region: "Midwest",
location: { lat: 39.1947, lng: -94.5194, city: "Kansas City", state: "MO" },
timezone: "America/Chicago",
website: "https://www.sixflags.com",
@@ -216,6 +236,7 @@ export const PARKS: Park[] = [
shortName: "Michigan's Adventure",
chain: "sixflags",
slug: "miadventure",
region: "Midwest",
location: { lat: 43.3281, lng: -86.2694, city: "Muskegon", state: "MI" },
timezone: "America/Detroit",
website: "https://www.sixflags.com",
@@ -226,6 +247,7 @@ export const PARKS: Park[] = [
shortName: "Dorney Park",
chain: "sixflags",
slug: "dorneypark",
region: "Northeast",
location: { lat: 40.5649, lng: -75.6063, city: "Allentown", state: "PA" },
timezone: "America/New_York",
website: "https://www.sixflags.com",
@@ -236,6 +258,7 @@ export const PARKS: Park[] = [
shortName: "CA Great America",
chain: "sixflags",
slug: "cagreatamerica",
region: "West & International",
location: { lat: 37.3979, lng: -121.9751, city: "Santa Clara", state: "CA" },
timezone: "America/Los_Angeles",
website: "https://www.sixflags.com",
@@ -246,6 +269,7 @@ export const PARKS: Park[] = [
shortName: "Frontier City",
chain: "sixflags",
slug: "frontiercity",
region: "Texas & South",
location: { lat: 35.5739, lng: -97.4731, city: "Oklahoma City", state: "OK" },
timezone: "America/Chicago",
website: "https://www.sixflags.com",
@@ -253,3 +277,25 @@ export const PARKS: Park[] = [
];
export const PARK_MAP = new Map<string, Park>(PARKS.map((p) => [p.id, p]));
export const REGIONS = [
"Northeast",
"Southeast",
"Midwest",
"Texas & South",
"West & International",
] as const;
export type Region = (typeof REGIONS)[number];
export function groupByRegion(parks: Park[]): Map<Region, Park[]> {
const map = new Map<Region, Park[]>(REGIONS.map((r) => [r, []]));
for (const park of parks) {
map.get(park.region as Region)!.push(park);
}
// Remove empty regions
for (const [region, list] of map) {
if (list.length === 0) map.delete(region);
}
return map;
}