Plan Your Visit landing page for visit.waterschurch.org

Next.js 16 static export + PHP 8 API for cPanel/Apache hosting.

- Location-aware campus finder (IP estimate, optional precise location, ZIP search)
- Three-step Plan Your Visit form with separate email/SMS consent
- PHP API: validation, anti-spam, rate limiting, SQLite lead store,
  Mailchimp and Sinch Engage adapters, idempotent retries via cron
- Attribution capture (utm_*, gclid/gbraid/wbraid, fbclid, ttclid, twclid) and
  consent-aware analytics hooks
- Vitest and PHP test suites, cPanel deployment script and docs

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Waters Church
2026-09-22 13:22:26 -04:00
co-authored by Claude Fable 5.1
commit 78cd0cc550
109 changed files with 16861 additions and 0 deletions
+73
View File
@@ -0,0 +1,73 @@
/**
* Waters Kids information. Age groups and safety facts are taken from
* waterschurch.org/about/waters-kids (verified 2026-09-22). Items marked
* `placeholder: true` are NOT verified policies and must be confirmed or
* removed by Waters Church before launch.
*/
export const kidsAgeGroups = [
{ id: "0-2", label: "Early Development", ages: "0–2 yrs", rooms: "Blue & Purple Rooms" },
{ id: "3-5", label: "Preschool & Pre-K", ages: "3–5 yrs", rooms: "Green, Yellow & Orange Rooms" },
{ id: "6-10", label: "Elementary", ages: "6–10 yrs", rooms: "Red Room & Ignite" },
{ id: "11-13", label: "Middle School & Pre-Teen", ages: "11–13 yrs", rooms: "Activate Youth Group" },
] as const;
export type KidsAgeRangeId = (typeof kidsAgeGroups)[number]["id"] | "14-18";
/** Age ranges offered in the form (includes high school for planning purposes). */
export const childAgeRangeOptions: { value: KidsAgeRangeId; label: string }[] = [
{ value: "0-2", label: "0–2" },
{ value: "3-5", label: "3–5" },
{ value: "6-10", label: "6–10" },
{ value: "11-13", label: "11–13" },
{ value: "14-18", label: "14–18 (Waters Youth)" },
];
export interface KidsPoint {
id: string;
title: string;
body: string;
placeholder?: boolean;
}
export const kidsPoints: KidsPoint[] = [
{
id: "checkin",
title: "Check-in",
body:
"Head to the Waters Kids check-in area when you arrive. A team member will register your family, print name tags for your kids, and give you a matching security tag for pickup.",
placeholder: true,
},
{
id: "safety",
title: "Safety & security",
body:
"Every Waters Kids volunteer passes a background check. Waters Church also employs its own security team, uses a security tag system for check-in and pickup, and can page you during the service if your child needs you.",
},
{
id: "ages",
title: "Age groups",
body:
"Kids are grouped by age from newborn through middle school, with programs running at every service time and location. High schoolers are invited to Waters Youth.",
},
{
id: "arrive",
title: "When to arrive",
body:
"For a relaxed first visit, plan to arrive about 15 minutes before the service starts so check-in isn't rushed.",
placeholder: true,
},
{
id: "bring",
title: "What to bring",
body:
"Just your kids. If your little one needs diapers, a bottle, or a snack, label them and hand them to the room leader at check-in.",
placeholder: true,
},
{
id: "needs",
title: "Special needs & accessibility",
body:
"If your child has a special need, allergy, or anything the team should know, tell us at check-in or text ahead of your visit. [Waters Church: confirm available accommodations before launch.]",
placeholder: true,
},
];