feat: coaster filter toggle on homepage
All checks were successful
Build and Deploy / Build & Push (push) Successful in 1m14s

- 🎢 Coasters button in nav bar (URL-driven: ?coasters=1)
- When active, swaps ride counts for coaster counts per park
- Label switches between "X rides operating" / "X coasters operating"
- Arrow key navigation preserves coaster filter state
- Only shown when coaster data exists in park-meta

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-04 21:03:00 -04:00
parent f1fec2355c
commit 7456ead430
5 changed files with 78 additions and 16 deletions

View File

@@ -7,6 +7,8 @@ interface WeekNavProps {
weekStart: string; // YYYY-MM-DD (Sunday)
weekDates: string[]; // 7 dates YYYY-MM-DD
isCurrentWeek: boolean;
coastersOnly: boolean;
hasCoasterData: boolean;
}
const MONTHS = [
@@ -31,10 +33,16 @@ function shiftWeek(weekStart: string, delta: number): string {
return d.toISOString().slice(0, 10);
}
export function WeekNav({ weekStart, weekDates, isCurrentWeek }: WeekNavProps) {
export function WeekNav({ weekStart, weekDates, isCurrentWeek, coastersOnly, hasCoasterData }: WeekNavProps) {
const router = useRouter();
const nav = (delta: number) =>
router.push(`/?week=${shiftWeek(weekStart, delta)}`);
const weekParam = `week=${weekStart}`;
const nav = (delta: number) => {
const base = `/?week=${shiftWeek(weekStart, delta)}`;
router.push(coastersOnly ? `${base}&coasters=1` : base);
};
const toggleCoasters = () => {
router.push(coastersOnly ? `/?${weekParam}` : `/?${weekParam}&coasters=1`);
};
useEffect(() => {
const onKey = (e: KeyboardEvent) => {
@@ -91,6 +99,30 @@ export function WeekNav({ weekStart, weekDates, isCurrentWeek }: WeekNavProps) {
>
</button>
{hasCoasterData && (
<button
onClick={toggleCoasters}
style={{
marginLeft: 8,
display: "flex",
alignItems: "center",
gap: 5,
padding: "4px 12px",
borderRadius: 20,
border: coastersOnly ? "1px solid var(--color-accent)" : "1px solid var(--color-border)",
background: coastersOnly ? "var(--color-accent-muted)" : "var(--color-surface)",
color: coastersOnly ? "var(--color-accent)" : "var(--color-text-muted)",
fontSize: "0.72rem",
fontWeight: 600,
cursor: "pointer",
transition: "background 150ms ease, border-color 150ms ease, color 150ms ease",
whiteSpace: "nowrap",
}}
>
🎢 Coasters
</button>
)}
</div>
);
}