diff --git a/app/page.tsx b/app/page.tsx index 63eed42..e7642d1 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -72,7 +72,7 @@ export default async function HomePage({ searchParams }: PageProps) { }}> {/* Row 1: Title + park count */}
- {/* Row 2: Week nav + legend */} + {/* Row 2: Week nav + legend (legend hidden on mobile) */}
- +
+ +
{/* ── Main content ───────────────────────────────────────────────────── */} -
+
{scrapedCount === 0 ? ( ) : ( diff --git a/components/MobileCardList.tsx b/components/MobileCardList.tsx index 8c4ad95..8eddd92 100644 --- a/components/MobileCardList.tsx +++ b/components/MobileCardList.tsx @@ -12,7 +12,7 @@ interface MobileCardListProps { export function MobileCardList({ grouped, weekDates, data, today }: MobileCardListProps) { return ( -
+
{Array.from(grouped.entries()).map(([region, parks]) => (
{/* Region heading */} diff --git a/components/ParkCard.tsx b/components/ParkCard.tsx index 97d57a7..508492f 100644 --- a/components/ParkCard.tsx +++ b/components/ParkCard.tsx @@ -4,167 +4,150 @@ import type { DayData } from "@/lib/db"; interface ParkCardProps { park: Park; - weekDates: string[]; // 7 dates YYYY-MM-DD + weekDates: string[]; // 7 dates YYYY-MM-DD, Sun–Sat parkData: Record; today: string; } -const DOW_SHORT = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]; - -function parseDate(iso: string) { - const d = new Date(iso + "T00:00:00"); - return { day: d.getDate(), dow: d.getDay(), isWeekend: d.getDay() === 0 || d.getDay() === 6 }; -} +const DOW = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; export function ParkCard({ park, weekDates, parkData, today }: ParkCardProps) { + const openDays = weekDates.filter((d) => parkData[d]?.isOpen && parkData[d]?.hoursLabel); + const isOpenToday = openDays.includes(today); + return ( -
+
- {/* Park name + location */} -
- - - {park.name} - - -
- {park.location.city}, {park.location.state} -
-
- - {/* 7-day grid */} -
- {weekDates.map((date) => { - const pd = parseDate(date); - const isToday = date === today; - const dayData = parkData[date]; - const isOpen = dayData?.isOpen && dayData?.hoursLabel; - const isPH = dayData?.specialType === "passholder_preview"; - - let cellBg = "transparent"; - let cellBorder = "1px solid var(--color-border-subtle)"; - const cellBorderRadius = "6px"; - - if (isToday) { - cellBg = "var(--color-today-bg)"; - cellBorder = `1px solid var(--color-today-border)`; - } else if (pd.isWeekend) { - cellBg = "var(--color-weekend-header)"; - } - - return ( -
- {/* Day name */} - - {DOW_SHORT[pd.dow]} - - - {/* Date number */} - - {pd.day} - - - {/* Status */} - {!dayData ? ( - - ) : isPH && isOpen ? ( - - PH - - ) : isOpen ? ( - - Open - - ) : ( - · - )} -
- ); - })} -
- - {/* Hours detail row — show the open day hours inline */} - {weekDates.some((d) => parkData[d]?.isOpen && parkData[d]?.hoursLabel) && ( + {/* ── Card header ───────────────────────────────────────────────────── */}
- {weekDates.map((date) => { - const pd = parseDate(date); - const dayData = parkData[date]; - if (!dayData?.isOpen || !dayData?.hoursLabel) return null; - const isPH = dayData.specialType === "passholder_preview"; - return ( - - - {DOW_SHORT[pd.dow]} - - {dayData.hoursLabel} - {isPH && ( - PH - )} - - ); - })} +
+
+ {park.name} +
+
+ {park.location.city}, {park.location.state} +
+
+ + {isOpenToday ? ( +
+ Open today +
+ ) : ( +
+ Closed today +
+ )}
- )} -
+ + {/* ── Open days list ────────────────────────────────────────────────── */} + {openDays.length > 0 && ( +
+ {openDays.map((date, i) => { + const dow = new Date(date + "T00:00:00").getDay(); + const isToday = date === today; + const dayData = parkData[date]; + const isPH = dayData.specialType === "passholder_preview"; + const isLast = i === openDays.length - 1; + + return ( +
+ + {isToday ? "Today" : DOW[dow]} + + +
+ {isPH && ( + + Passholder + + )} + + {dayData.hoursLabel} + +
+
+ ); + })} +
+ )} +
+ ); }