{"version":3,"file":"Locale.HEFGukfl.mjs","names":["useState","startTransition","useMemo"],"sources":["https:/framerusercontent.com/modules/4bF8A6ZMq4ppWk8VkkUZ/C2EnUfypS1IG5sojEial/Registry.js","https:/framerusercontent.com/modules/Iv0MMy2ACWxJ6H3uqlZJ/71SkvbPzEshaPHCCQQd4/Locale.js"],"sourcesContent":["import{startTransition,useEffect,useState}from\"react\";// Page-wide data registry: CMS feeders (CampusData, CampusPageData) publish one record per CMS item, and any code component\n// reads the full set and filters it for its own use. One registry, one event, so components never keep private copies.\n//\n//   window.__viveCampusRegistry[dataKey].campuses[slug] = record\n//   window \"vive-campus-data\" event, detail: { dataKey }  — fires on every change\n//\n// Data keys in use: \"campuses\" (Locations, in the site footer) and one per campus-page collection, e.g. \"christmas\",\n// \"easter\" or \"royal-kids\" (fed by CampusPageData inside #_campus_pages_data).\nconst EVENT=\"vive-campus-data\";function slotFor(dataKey){const root=window.__viveCampusRegistry||={};return(root[dataKey]||={campuses:{}}).campuses;}export function slugify(value){return(value||\"\").trim().toLowerCase();}/** Publish one record. Returns the cleanup that removes it again (use as an effect's return value). */export function writeRecord(dataKey,slug,value){if(typeof window===\"undefined\"||!slug)return()=>{};const records=slotFor(dataKey);records[slug]=value;window.dispatchEvent(new CustomEvent(EVENT,{detail:{dataKey}}));return()=>{if(records[slug]===value)delete records[slug];window.dispatchEvent(new CustomEvent(EVENT,{detail:{dataKey}}));};}export function readRecords(dataKey){if(typeof window===\"undefined\")return[];const records=window.__viveCampusRegistry?.[dataKey]?.campuses||{};return Object.values(records);}/** All records under a data key, kept current. Every CMS item announces itself on mount; those are batched into one update. */export function useRecords(dataKey,enabled=true){const[records,setRecords]=useState([]);useEffect(()=>{if(!enabled||typeof window===\"undefined\")return;let timer=0;// A timer (not requestAnimationFrame) so it still runs when the page loads in a background tab.\nconst sync=()=>{window.clearTimeout(timer);timer=window.setTimeout(()=>startTransition(()=>setRecords(readRecords(dataKey))),0);};const onData=event=>{const key=event.detail?.dataKey;if(!key||key===dataKey)sync();};setRecords(readRecords(dataKey));window.addEventListener(EVENT,onData);return()=>{window.clearTimeout(timer);window.removeEventListener(EVENT,onData);};},[dataKey,enabled]);return records;}/** The Locations \"Static Links\" a picker can send visitors to (the CMS field each one comes from). */export const CAMPUS_LINKS={connectForm:\"Connect Form\",nextSteps:\"Next Steps\",joinAGroup:\"Join A Group\",newsletter:\"Newsletter\",newGuestLunch:\"New Guest Lunch\",discipleship:\"Discipleship\",serve:\"Serve\"};/** Campuses hidden site-wide (Launch Status \"🔴 Hidden\") never appear in pickers. */export function isListed(campus){return Boolean(campus?.slug&&campus.name)&&!/hidden/i.test(campus.status||\"\");}\nexport const __FramerMetadata__ = {\"exports\":{\"useRecords\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CAMPUS_LINKS\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"readRecords\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"writeRecord\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CampusLink\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"BankRow\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"BankInfo\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"slugify\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CampusPageEntry\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CheckInfo\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"isListed\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"Campus\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Registry.map","import{useMemo}from\"react\";import{useLocaleInfo}from\"framer\";/**\n * Locale-aware internal links for code components.\n *\n * Framer's own links keep the visitor in their language, but paths built in code\n * (\"/locations/milano\") don't. Run them through here: \"/locations/milano\" becomes\n * \"/de/locations/milano\" on the German site. The default locale (English) has an\n * empty slug, so English paths are unchanged. External URLs, hashes and paths that\n * already carry the prefix pass through untouched.\n */export function localizePath(path,slug){if(!slug||!path||!path.startsWith(\"/\")||path.startsWith(\"//\"))return path;if(path===`/${slug}`||path.startsWith(`/${slug}/`))return path;return`/${slug}${path}`;}export function useLocalePath(){const{activeLocale}=useLocaleInfo();const slug=activeLocale?.slug||\"\";return path=>localizePath(path,slug);}const LANGUAGES=[\"en\",\"de\",\"es\",\"it\"];/** \"de-DE\" → \"de\". A language the site doesn't have falls back to English. */export function languageOf(code){const language=(code||\"\").slice(0,2).toLowerCase();return LANGUAGES.includes(language)?language:\"en\";}export function useLanguage(){const{activeLocale}=useLocaleInfo();return languageOf(activeLocale?.code);}export function useCopy(translations){const language=useLanguage();return useMemo(()=>language===\"en\"?translations.en:{...translations.en,...translations[language]},[language,translations]);}\nexport const __FramerMetadata__ = {\"exports\":{\"Language\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useLocalePath\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useCopy\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useLanguage\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"localizePath\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"languageOf\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"Translations\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Locale.map"],"mappings":"yLAQ+B,SAAS,EAAQ,EAAQ,CAAC,IAAM,EAAK,EAAO,uBAAuB,CAAC,EAAE,OAAO,EAAK,KAAW,CAAC,SAAS,CAAC,CAAC,EAAA,CAAG,QAAS,CAAC,SAAgB,EAAQ,EAAM,CAAC,OAAO,GAAO,GAAA,CAAI,KAAK,CAAC,CAAC,YAAY,CAAE,CAAwG,SAAgB,EAAY,EAAQ,EAAK,EAAM,CAAC,GAAU,IAAS,QAAa,CAAC,EAAK,UAAU,CAAC,EAAE,IAAM,EAAQ,EAAQ,CAAO,EAAsF,MAApF,GAAQ,GAAM,EAAM,EAAO,cAAc,IAAI,YAAY,EAAM,CAAC,OAAO,CAAC,SAAO,CAAC,CAAC,CAAC,MAAY,CAAI,EAAQ,KAAQ,GAAM,OAAO,EAAQ,GAAM,EAAO,cAAc,IAAI,YAAY,EAAM,CAAC,OAAO,CAAC,SAAO,CAAC,CAAC,CAAC,CAAE,CAAE,CAAC,SAAgB,EAAY,EAAQ,CAAC,GAAU,IAAS,OAAY,MAAM,CAAC,EAAE,IAAM,EAAQ,EAAO,uBAAuB,EAAQ,EAAE,UAAU,CAAC,EAAE,OAAO,OAAO,OAAO,CAAO,CAAE,CAAgI,SAAgB,EAAW,EAAQ,EAAQ,GAAK,CAAC,GAAK,CAAC,EAAQ,GAAYA,EAAS,CAAC,CAAC,EACrpB,OADupB,MAAc,CAAC,GAAG,CAAC,GAAgB,IAAS,OAAY,OAAO,IAAI,EAAM,EAC9lC,MAAS,CAAC,EAAO,aAAa,CAAK,EAAE,EAAM,EAAO,eAAeC,MAAoB,EAAW,EAAY,CAAO,CAAC,CAAC,EAAE,CAAC,CAAE,EAAQ,EAAO,GAAO,CAAC,IAAM,EAAI,EAAM,QAAQ,SAAW,CAAC,GAAK,IAAM,IAAQ,EAAK,CAAE,EAAyE,OAAvE,EAAW,EAAY,CAAO,CAAC,EAAE,EAAO,iBAAiB,EAAM,CAAM,MAAY,CAAC,EAAO,aAAa,CAAK,EAAE,EAAO,oBAAoB,EAAM,CAAM,CAAE,CAAE,EAAE,CAAC,EAAQ,CAAO,CAAC,EAAS,CAAQ,CAAsY,SAAgB,EAAS,EAAO,CAAC,MAAO,GAAQ,GAAQ,MAAM,EAAO,OAAO,CAAC,UAAU,KAAK,EAAO,QAAQ,EAAE,CAAE,yBATn1B,EAQ/C,EAAM,mBAC2f,EAAa,CAAC,YAAY,eAAe,UAAU,aAAa,WAAW,eAAe,WAAW,aAAa,cAAc,kBAAkB,aAAa,eAAe,MAAM,OAAO,KCD/rB,SAAgB,EAAa,EAAK,EAAK,CAA0I,MAAtI,CAAC,GAAM,CAAC,GAAM,CAAC,EAAK,WAAW,GAAG,GAAG,EAAK,WAAW,IAAI,GAAiB,IAAO,IAAI,KAAQ,EAAK,WAAW,IAAI,EAAK,EAAE,EAAS,EAAW,IAAI,IAAO,GAAO,CAAC,SAAgB,GAAe,CAAC,GAAK,CAAC,gBAAc,EAAc,EAAQ,EAAK,GAAc,MAAM,GAAG,MAAO,IAAM,EAAa,EAAK,CAAI,CAAE,CAAqH,SAAgB,EAAW,EAAK,CAAC,IAAM,GAAU,GAAM,GAAA,CAAI,MAAM,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,EAAU,SAAS,CAAQ,EAAE,EAAS,IAAK,CAAC,SAAgB,GAAa,CAAC,GAAK,CAAC,gBAAc,EAAc,EAAE,OAAO,EAAW,GAAc,IAAI,CAAE,CAAC,SAAgB,EAAQ,EAAa,CAAC,IAAM,EAAS,EAAY,EAAE,OAAOC,MAAY,IAAW,KAAK,EAAa,GAAG,CAAC,GAAG,EAAa,GAAG,GAAG,EAAa,EAAS,EAAE,CAAC,EAAS,CAAY,CAAC,CAAE,mBARj2B,IAAkC,EAQmS,EAAU,CAAC,KAAK,KAAK,KAAK,IAAI"}