+
{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 */}
-
+
+ {/* ── Open days list ────────────────────────────────────────────────── */}
+ {openDays.length > 0 && (
+
-
-
- {park.name}
-
-
-
-
- {/* 7-day grid */}
-
- {park.location.city}, {park.location.state}
-
-
- {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 (
-
-
- {/* Hours detail row — show the open day hours inline */}
- {weekDates.some((d) => parkData[d]?.isOpen && parkData[d]?.hoursLabel) && (
+ {/* ── Card header ───────────────────────────────────────────────────── */}
- {/* Day name */}
-
- {DOW_SHORT[pd.dow]}
-
-
- {/* Date number */}
-
- {pd.day}
-
-
- {/* Status */}
- {!dayData ? (
- —
- ) : isPH && isOpen ? (
-
- PH
-
- ) : isOpen ? (
-
- Open
-
- ) : (
- ·
- )}
-
- );
- })}
-
- {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
- )}
-
- );
- })}
+
- )}
-
+
+
+ {isOpenToday ? (
+
+ {park.name}
+
+
+ {park.location.city}, {park.location.state}
+
+
+ Open today
+
+ ) : (
+
+ Closed today
+
+ )}
+ {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}
+
+
+