/* global React */ // Place detail โ€” data-driven from assets/attractions.json (?slug=...) const { useState, useEffect } = React; const NS_A = window.GamekeepersCottageDesignSystem_070bc7; const { Eyebrow, Button, Card, Badge, Rating } = NS_A; const Photo = window.GKPhoto; const useShell = window.GKuseShell; const useReviews = window.GKuseReviews; const reviewStats = window.GKreviewStats; const IMG = window.GK_IMG; // Places loader (mirrors Explore) โ€” assets/attractions.json, then embedded fallback. let _attrCache = null, _attrPromise = null; function loadAttractions() { if (_attrCache) return Promise.resolve(_attrCache); if (_attrPromise) return _attrPromise; _attrPromise = (async () => { try { const res = await fetch('assets/attractions.json', { cache: 'no-store' }); if (res.ok) { const d = await res.json(); if (d && Array.isArray(d.places)) { _attrCache = d.places; return _attrCache; } } } catch (e) { /* fall through */ } if (window.GK_ATTRACTIONS && Array.isArray(window.GK_ATTRACTIONS.places)) { _attrCache = window.GK_ATTRACTIONS.places; return _attrCache; } _attrCache = []; return _attrCache; })(); return _attrPromise; } function useAttractions() { const initial = _attrCache || (window.GK_ATTRACTIONS && window.GK_ATTRACTIONS.places) || []; const [list, setList] = useState(initial); useEffect(() => { let live = true; loadAttractions().then(a => { if (live) setList(a); }); return () => { live = false; }; }, []); return list; } function CottageRating() { const s = reviewStats(useReviews()); return s.count > 0 ? : null; } // Photo header that adapts to how many photos are uploaded. function PhotoHeader({ place }) { const imgs = (place.photos || []).filter(Boolean); const cell = { height: '100%', aspectRatio: 'auto' }; if (imgs.length >= 3) { return (
); } if (imgs.length === 2) { return (
); } if (imgs.length === 1) { return ; } return ; } function NotFound() { return (

Place not found

We couldn't find that place โ€” it may have been moved or removed.

); } function AttractionContent() { const { openBooking } = useShell(); const places = useAttractions(); const slug = new URLSearchParams(window.location.search).get('slug'); const place = places.find(p => p.slug === slug) || (!slug && places[0]) || null; useEffect(() => { if (window.lucide) window.lucide.createIcons(); }, [place]); if (places.length > 0 && !place) return ; if (!place) return
; const website = place.website ? (place.website.startsWith('http') ? place.website : 'https://' + place.website) : ''; const hasContact = place.phone || place.website || place.location || place.map; return (
Back to Explore Suffolk {place.category}{place.area ? ' ยท ' + place.area : ''}

{place.title}

{place.heading || ('About ' + place.title)}

{place.intro &&

{place.intro}

} {(place.sections || []).map((s, i) => (
{s.title &&

{s.title}

}

{s.text}

))}
{hasContact && (

Contact details

{place.phone && {place.phone}} {website && {place.website}} {place.location && {place.location}}
{place.map && (
)}
)}
Stay nearby

Looking for somewhere to stay?

The Gamekeeper's Cottage is hidden in its own hundred-acre wood, an easy drive from here.

Top offer

The Gamekeeper's Cottage

The Wood, Southwold Rd, Brampton, Beccles NR34 8DW

3 bedrooms 1 bathroom Sleeps 5
); } window.GKmount('attraction', AttractionContent);