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
+48
View File
@@ -0,0 +1,48 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Waters Church campuses",
"type": "object",
"required": ["campuses"],
"properties": {
"campuses": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "name", "label", "status", "address", "coordinates", "serviceTimes", "phone", "campusUrl", "directionsUrl"],
"properties": {
"id": { "type": "string", "pattern": "^[a-z0-9-]+$" },
"name": { "type": "string" },
"label": { "type": "string" },
"status": { "enum": ["open", "launching", "hidden"] },
"isCentral": { "type": "boolean" },
"address": {
"type": "object",
"required": ["line1", "city", "state", "postalCode"],
"properties": {
"line1": { "type": "string" }, "city": { "type": "string" },
"state": { "type": "string" }, "postalCode": { "type": "string" }
}
},
"coordinates": { "type": "object", "required": ["lat", "lng"], "properties": { "lat": { "type": "number" }, "lng": { "type": "number" } } },
"timezone": { "type": "string" },
"serviceTimes": {
"type": "array",
"items": { "type": "object", "required": ["day", "times"], "properties": { "day": { "type": "string" }, "times": { "type": "array", "items": { "type": "string" } }, "note": { "type": ["string", "null"] } } }
},
"phone": { "type": "string", "pattern": "^\\+[1-9][0-9]{6,14}$" },
"smsNumber": { "type": ["string", "null"], "pattern": "^\\+[1-9][0-9]{6,14}$" },
"sinchAccountId": { "type": ["string", "null"] },
"email": { "type": ["string", "null"] },
"campusUrl": { "type": "string", "format": "uri" },
"directionsUrl": { "type": "string", "format": "uri" },
"leader": { "type": ["object", "null"], "properties": { "title": { "type": "string" }, "name": { "type": "string" } } },
"arrivalNotes": { "type": ["string", "null"] },
"parkingNotes": { "type": ["string", "null"] },
"kidsNotes": { "type": ["string", "null"] },
"image": { "type": ["string", "null"] },
"verify": { "type": "array", "items": { "type": "string" } }
}
}
}
}
}