/* global React */ const { useState, useEffect, useRef } = React; /* Real Agape Learning Academy photos. */ const IMAGE_MAP = [ // Home hero / warm joyful primaries ["full-bleed", "assets/photos/nature-discovery.jpg"], ["children painting at round table", "assets/photos/nature-discovery.jpg"], ["child at easel", "assets/photos/girls-watercolor.webp"], ["toddler hands building", "assets/photos/boy-green-marigolds.webp"], ["children painting", "assets/photos/group-gardening.webp"], // Programs ["infants", "assets/photos/infants-classroom-baked.webp"], ["infant care", "assets/photos/infants-classroom-baked.webp"], ["toddlers", "assets/photos/swing-laughing.webp"], ["toddler program", "assets/photos/swing-laughing.webp"], ["preschool & pre-k", "assets/photos/girls-watercolor.webp"], ["preschool", "assets/photos/two-kids-planting.webp"], ["pre-k readiness", "assets/photos/boy-green-marigolds.webp"], // About ["founder", "assets/photos/group-gardening.webp"], ["director", "assets/photos/group-gardening.webp"], ["teacher reading", "assets/photos/art-god-loves-me.webp"], ["why we care", "assets/photos/swing-laughing.webp"], // Safety / classroom ["clean, organized classroom", "assets/photos/art-god-loves-me.webp"], ["classroom", "assets/photos/art-god-loves-me.webp"], ["professional development", "assets/photos/parachute-play.webp"], ["secure entry", "assets/photos/playground-running.webp"], ["secure vestibule", "assets/photos/playground-running.webp"], ["parent signing in", "assets/photos/playground-running.webp"], // Activities ["chicken", "assets/photos/chicken-visit-2.jpg"], ["farm", "assets/photos/farm-trip.jpg"], ["garden", "assets/photos/group-gardening.webp"], ["pizza", "assets/photos/group-pizza-day.jpg"], ["cooking", "assets/photos/cooking-pigs-in-blankets.jpg"], ["nature", "assets/photos/nature-discovery.jpg"], ["playground", "assets/photos/playground-running.webp"], ["outside", "assets/photos/playground-running.webp"]]; function resolveImage(label) { if (!label) return null; const low = label.toLowerCase(); for (const [key, url] of IMAGE_MAP) { if (low.includes(key)) return url; } return null; } /* Baked photo overrides — slot id -> file path. Edited by Photo Studio "Save to project". */ const BAKED_PHOTOS = /*BAKED-PHOTOS-BEGIN*/{ "infants-classroom": "assets/photos/infants-classroom-baked.webp", "toddlers-classroom": "assets/photos/swing-laughing.webp", "hero-image-child-at-easel-teacher-guiding-warm": "assets/photos/girls-watercolor.webp", "full-bleed-children-painting-at-round-table-natural": "assets/photos/full-bleed-painting-baked.webp", "infant-care-classroom-children-engaged-in-attachment-sensory": "assets/photos/infant-care-baked.webp", "portrait-founder-director-with-children-in-background-natural": "assets/photos/art-god-loves-me.webp", "teacher-reading-to-small-group-of-preschoolers-on": "assets/photos/teacher-reading-baked.webp", "teachers-in-professional-development-session": "assets/photos/teachers-pd-baked.webp", "clean-organized-classroom-with-labeled-cubbies-and-toys": "assets/photos/classroom-cubbies-baked.webp" } /*BAKED-PHOTOS-END*/; window.__BAKED_PHOTOS__ = BAKED_PHOTOS; /* Library of all known photos in the project — used by the photo studio */ const PHOTO_LIBRARY = [ { src: "assets/photos/girls-watercolor.webp", label: "Girls watercolor painting" }, { src: "assets/photos/group-gardening.webp", label: "Group gardening with teacher" }, { src: "assets/photos/art-god-loves-me.webp", label: "Art class — flower collage" }, { src: "assets/photos/parachute-play.webp", label: "Parachute play outdoors" }, { src: "assets/photos/two-kids-planting.webp", label: "Two kids planting at sunset" }, { src: "assets/photos/boy-green-marigolds.webp", label: "Boy planting marigolds" }, { src: "assets/photos/playground-running.webp", label: "Kids running on playground" }, { src: "assets/photos/swing-laughing.webp", label: "Girl laughing on swing" }, { src: "assets/photos/group-pizza-day.jpg", label: "Group pizza day" }, { src: "assets/photos/cooking-pigs-in-blankets.jpg", label: "Cooking — pigs in blankets" }, { src: "assets/photos/chicken-visit-1.jpg", label: "Chicken visit (1)" }, { src: "assets/photos/chicken-visit-2.jpg", label: "Chicken visit (2)" }, { src: "assets/photos/farm-trip.jpg", label: "Farm field trip" }, { src: "assets/photos/nature-discovery.jpg", label: "Nature discovery" }, { src: "assets/photos/garden-marigold.jpg", label: "Garden — marigold" }, { src: "assets/photos/garden-mamas-boy.jpg", label: "Garden — mama's boy" }, { src: "assets/photos/garden-two-boys.jpg", label: "Garden — two boys" }, { src: "assets/photos/garden-boy-green.jpg", label: "Garden — boy in green" }, { src: "assets/photos/garden-tt-jersey.jpg", label: "Garden — TT jersey" }]; window.__PHOTO_LIBRARY__ = PHOTO_LIBRARY; /* slot id from label */ function slotFromLabel(label) { if (!label) return "unlabeled"; return label. toLowerCase(). replace(/[^a-z0-9]+/g, "-"). replace(/^-|-$/g, ""). split("-"). slice(0, 8). join("-"); } /* Overrides store — localStorage-backed map of slot -> src */ const PHOTO_OVERRIDES_KEY = "agape_photo_overrides_v1"; const photoStore = (() => { let cache = {}; try {cache = JSON.parse(localStorage.getItem(PHOTO_OVERRIDES_KEY) || "{}");} catch (e) {cache = {};} const subs = new Set(); return { get: (slot) => cache[slot], getAll: () => ({ ...cache }), set: (slot, src) => { if (src == null) delete cache[slot];else cache[slot] = src; try {localStorage.setItem(PHOTO_OVERRIDES_KEY, JSON.stringify(cache));} catch (e) {} subs.forEach((fn) => fn()); }, reset: () => { cache = {}; try {localStorage.removeItem(PHOTO_OVERRIDES_KEY);} catch (e) {} subs.forEach((fn) => fn()); }, subscribe: (fn) => {subs.add(fn);return () => subs.delete(fn);} }; })(); window.__PHOTO_STORE__ = photoStore; /* Hook to re-render when overrides change */ function usePhotoOverride(slot) { const [, force] = useState(0); useEffect(() => photoStore.subscribe(() => force((n) => n + 1)), []); return photoStore.get(slot); } /* Placeholder — renders an image (override > src prop > resolved label > stripes). In photo-studio mode, becomes clickable to swap. */ function Placeholder({ label, tone = "green", className = "", style = {}, src, slot: slotProp }) { const slot = slotProp || slotFromLabel(label); const override = usePhotoOverride(slot); const [studioOn, setStudioOn] = useState(!!window.__PHOTO_STUDIO_ON__); useEffect(() => { const handler = (e) => setStudioOn(!!e.detail); window.addEventListener("photo-studio-toggle", handler); return () => window.removeEventListener("photo-studio-toggle", handler); }, []); const url = override || BAKED_PHOTOS[slot] || src || resolveImage(label); const onClick = (e) => { if (!studioOn) return; e.preventDefault(); e.stopPropagation(); window.dispatchEvent(new CustomEvent("photo-studio-pick", { detail: { slot, label, currentSrc: url } })); }; const studioCls = studioOn ? "ph-studio-active" : ""; if (url) { return (
{description}
}{description}
}Tours take about 30 minutes. You'll see the classrooms, meet teachers, and get every question answered.
{p}
)}{a}