// CalGrillz — landing page content (uses shared shell). // // All editable copy/imagery is read from `window.CG_CONTENT`, which Laravel // injects from the SiteContent CMS (admin: /mgmt/site-content). When a key // hasn't been set, the schema default kicks in server-side so the page never // renders with empty rectangles. // // cgC('home.hero.title', '') → string (Blade has already // sanitized HTML content). // cgHtml(value) → React element with // dangerouslySetInnerHTML. function cgC(key, fallback = '') { const v = (window.CG_CONTENT || {})[key]; return (v === undefined || v === null || v === '') ? fallback : v; } function cgHtml(value) { return ; } function CGWLandingPage() { return ( ); } // ─── EVENTS TEASER ───────────────────────────────────────── function CGWEventsTeaser() { return (
{cgC('home.events.eyebrow', 'Events & private bookings')}

{cgHtml(cgC('home.events.title', 'More than dinner.
Bring the whole crew.'))}

{cgC('home.events.subtitle', 'Live music nights, fish-fry Sundays, weddings, corporate dinners. Walk in, RSVP, or book us for your event.')}

); } // ─── HERO ─────────────────────────────────────────────────── function CGWHero() { const bg = cgC('home.hero.bg_image', CG_ASSET('hero-fish-platter.jpg')); return (
{Array.from({ length: 24 }).map((_, i) => { const left = (i * 53) % 100; const bottom = (i * 31) % 60; const dur = 3 + (i % 5); const delay = (i % 7) * 0.5; return ( ); })}
{cgC('home.hero.eyebrow', 'Agbor · Delta state · est. 2023')}

{cgHtml(cgC('home.hero.title', 'Fired-up.
Nigerian grill.'))}

{cgC('home.hero.subtitle', 'Point-and-kill catfish, whole tilapia, shawarma off the coal pit.')}

{cgC('home.hero.hours_value', '10am–9pm')}
{cgC('home.hero.hours_label', 'Every day')}
{cgC('home.hero.pickup_value', '25 min')}
{cgC('home.hero.pickup_label', 'Avg pickup')}
{cgC('home.hero.rating_value', '4.9 ★')}
{cgC('home.hero.rating_label', '680+ orders')}
CalGrillz
); } // ─── WHAT'S HOT ───────────────────────────────────────────── function CGWHot() { return (
{cgC('home.hot.eyebrow', "Tonight's grill")}

{cgHtml(cgC('home.hot.title', 'Hot off the
charcoal'))}

{cgC('home.hot.note', "Real catch. Real fire. Five dishes our regulars don't stop ordering.")}

{/* Featured items pulled from the REAL menu (was hardcoded to old demo slugs like "whole-tilapia" that no longer exist — every card returned null, leaving this whole section as a big empty gap). First item is the featured hero; the next four fill the grid. */}
{CGW_MENU.slice(0, 5).map((m, i) => ( i === 0 ? : ))}
); } function HotCardW({ slug, tagline, note, featured }) { const item = CGW_MENU.find(m => m.slug === slug); if (!item) return null; return ( {item.img ? ( <>
) : ( // No photo uploaded yet — show a warm branded placeholder instead of a // near-black tile, so the section never looks like empty space.
🔥
)}
{item.tags.map(t => )}
{tagline && featured &&
{tagline}
}
{item.name}
{note && featured &&
{note}
}
from {nairaW(item.priceFrom)}
); } function CGWWhy() { const items = [ { n: '01', t: cgC('home.why.item1.title', 'Slow-grilled. Charcoal only.'), b: cgC('home.why.item1.body', 'Real wood charcoal, 6-hour burn, hand-rubbed marinade.') }, { n: '02', t: cgC('home.why.item2.title', 'Earn while you eat.'), b: cgC('home.why.item2.body', 'Points on every plate. Tier up to gold for 1.25× points + birthday week perks.') }, { n: '03', t: cgC('home.why.item3.title', 'Order from anywhere.'), b: cgC('home.why.item3.body', 'WhatsApp, web, or walk-in — same kitchen, same speed.') }, ]; return (
{cgC('home.why.eyebrow', 'Why CalGrillz')}

{cgHtml(cgC('home.why.title', 'Three things we do
better than anyone.'))}

{items.map(w => (
{w.n}

{w.t}

{w.b}

))}
); } function CGWGame() { return (
{cgC('home.rewards.eyebrow', 'Earn while you eat')}

{cgHtml(cgC('home.rewards.title', 'The grill rewards
you back.'))}

{cgC('home.rewards.subtitle', 'Four ways your visits add up. Stack them all if you can.')}

Visit streaks

Eat once a week. Watch it grow. Hit 3 weeks for a free side. 10 weeks for ₦2,000 off.

🔥 Hit 3 weeks for a free side

Spin the wheel

Every qualifying order earns one spin. Win a voucher, free side, double points or extra spin.

🎰 ₦5,000 jackpot

Gift vouchers

Send the gift of grill via WhatsApp. Pick an amount, write a note, hit send. From ₦500.

🎁 New for 2026

VIP tiers

Bronze → Silver → Gold → VIP. Earn up to 1.5× points per ₦100 plus first-look access to new dishes.

👑 Up to 1.5×
); } function CGWGallery() { // Each gallery slot is admin-editable as home.gallery.image{1..6}; defaults // fall back to the original photo set. const tiles = [ cgC('home.gallery.image1', CG_ASSET('grill-closeup.jpg')), cgC('home.gallery.image2', CG_ASSET('hands-platter.jpg')), cgC('home.gallery.image3', CG_ASSET('chef-prep.jpg')), cgC('home.gallery.image4', CG_ASSET('grill-station.jpg')), cgC('home.gallery.image5', CG_ASSET('security.jpg')), cgC('home.gallery.image6', CG_ASSET('grill-topdown.jpg')), ]; return (
{cgC('home.gallery.eyebrow', 'From the pit')}

{cgHtml(cgC('home.gallery.title', 'Last weekend at the grill.'))}

{tiles.map((img, i) => (
))}
); } function CGWStory() { const storyMedia = cgC('home.story.media_image', CG_ASSET('server-platter.jpg')); // Reviews are admin-managed (window.CG_DATA.testimonials from /mgmt Testimonials) — // nothing hardcoded. Rotate through them; if there are none, the quote block hides. const reviews = (typeof window !== 'undefined' && window.CG_DATA && Array.isArray(window.CG_DATA.testimonials)) ? window.CG_DATA.testimonials : []; const [rIdx, setRIdx] = React.useState(0); React.useEffect(() => { if (reviews.length < 2) return; const id = setInterval(() => setRIdx(i => (i + 1) % reviews.length), 6000); return () => clearInterval(id); }, [reviews.length]); const rv = reviews[rIdx] || null; const stars = rv && rv.rating ? '★'.repeat(Math.max(1, Math.min(5, rv.rating))) : ''; const meta = rv ? [rv.title, stars].filter(Boolean).join(' · ') : ''; const avatar = (rv && rv.photo && !String(rv.photo).includes('/template/')) ? rv.photo : CG_ASSET('customer-eating.jpg'); return (
{rv && (<> {cgC('home.story.eyebrow', 'What people say')}

{rv.quote}

{rv.name}
{meta &&
{meta}
}
)}
Story in three numbers

Since 2023.

{[['14k+','Plates served'],['3','Pit masters'],['1','Charcoal pit']].map(([v, l]) => (
{v}
{l}
))}
CalGrillz Agbor  ·  Pit no.1  ·  Live now
); } function CGWFind() { return (
{cgC('home.find.eyebrow', 'Find us')}

{cgHtml(cgC("home.find.title", "Hot from 10am.
Open every day."))}

CALGRILLZ
Address
{cgC('home.find.address', 'No 1 Cocokalina Close, Agbor 330221, Delta State')}
Hours
{cgC('home.find.hours', 'Every day · 10:00 am – 9:00 pm')}
● Open now
Phone
{cgC('home.find.phone', '0708 570 1097')}
{cgC('home.find.cta', 'Order on WhatsApp')}
); } ReactDOM.createRoot(document.getElementById('root')).render();