INITIALIZING… // — IMPORTS & SETUP — const { useState, useEffect, useRef } = React; const { createRoot } = ReactDOM; // — ICON WRAPPER — const Icon = ({ name, size = 24, className, strokeWidth = 2 }) => { const icons = window.lucide?.icons; if (!icons || !icons[name]) return ; return ( {icons[name].map((child, i) => { const [tag, attrs] = child; return React.createElement(tag, { …attrs, key: i }); })} ); }; // — DATA CONSTANTS — const THEMES = [ { id: ‘renewal’, title: ‘Spiritual Renewal’, description: “Focus on personal transformation, prayer, and reconnecting with God’s purpose.”, icon: ‘Flame’, color: ‘text-orange-400’, baseColor: ‘orange’, gradient: ‘from-orange-500/20 to-red-500/20’ }, { id: ‘unity’, title: ‘Unity & Fellowship’, description: ‘Build stronger bonds within your community.’, icon: ‘Users’, color: ‘text-blue-400’, baseColor: ‘blue’, gradient: ‘from-blue-500/20 to-indigo-500/20’ }, { id: ‘study’, title: ‘Biblical Study’, description: ‘Deep dive into Scripture with guided studies.’, icon: ‘BookOpen’, color: ‘text-emerald-400′, baseColor: ’emerald’, gradient: ‘from-emerald-500/20 to-green-500/20’ }, { id: ‘prayer’, title: ‘Prayer & Meditation’, description: ‘Cultivate a deeper prayer life.’, icon: ‘Heart’, color: ‘text-rose-400’, baseColor: ‘rose’, gradient: ‘from-rose-500/20 to-pink-500/20’ }, { id: ‘worship’, title: ‘Worship & Praise’, description: “Experience God’s presence through music.”, icon: ‘Crown’, color: ‘text-yellow-400’, baseColor: ‘yellow’, gradient: ‘from-yellow-500/20 to-amber-500/20’ }, { id: ‘discipleship’, title: ‘Discipleship’, description: ‘Grow in Christian maturity.’, icon: ‘Sprout’, color: ‘text-cyan-400’, baseColor: ‘cyan’, gradient: ‘from-cyan-500/20 to-teal-500/20’ } ]; const DEFAULT_SCHEDULE = [ { day: ‘Friday’, title: ‘Arrival & Opening’, icon: ‘🌅’, items: [ { id: ‘fri-1’, time: ‘6:00 PM’, title: ‘Registration’, description: ‘Check-in, room assignments.’ }, { id: ‘fri-2’, time: ‘7:30 PM’, title: ‘Opening Worship’, description: ‘Set the tone with praise songs.’ }, { id: ‘fri-3’, time: ‘8:30 PM’, title: ‘Icebreaker Activities’, description: ‘Fun, faith-based games to connect.’ }, { id: ‘fri-4’, time: ‘9:30 PM’, title: ‘Evening Prayer’, description: ‘Closing prayer circle.’ } ]}, { day: ‘Saturday’, title: ‘Full Day Program’, icon: ‘☀️’, items: [ { id: ‘sat-1’, time: ‘8:00 AM’, title: ‘Breakfast’, description: ‘Shared meal and bonding.’ }, { id: ‘sat-2’, time: ‘9:00 AM’, title: ‘Teaching Session 1’, description: ‘Core biblical teaching.’ }, { id: ‘sat-3′, time: ’10:45 AM’, title: ‘Small Groups’, description: ‘Breakout groups to apply teaching.’ }, { id: ‘sat-4’, time: ‘1:00 PM’, title: ‘Workshop’, description: ‘Hands-on workshops.’ }, { id: ‘sat-5’, time: ‘7:00 PM’, title: ‘Evening Worship’, description: ‘Worship time with testimonies.’ } ]}, { day: ‘Sunday’, title: ‘Closing & Commitment’, icon: ‘🌄’, items: [ { id: ‘sun-1’, time: ‘9:00 AM’, title: ‘Breakfast’, description: ‘Final meal together.’ }, { id: ‘sun-2′, time: ’10:00 AM’, title: ‘Closing Session’, description: ‘Final teaching and action steps.’ }, { id: ‘sun-3′, time: ’11:30 AM’, title: ‘Prayer & Departure’, description: ‘Closing prayer circle.’ } ]} ]; const THEME_DEVOTIONALS = { renewal: [ { id: ‘ren-1’, verse: “But those who hope in the Lord will renew their strength.”, reference: “Isaiah 40:31”, reflection: “Spiritual burnout is real, but God’s supply of strength is infinite.”, questions: [“Where do you feel depleted?”, “What does ‘waiting’ look like?”] }, { id: ‘ren-2’, verse: “Do not conform to the pattern of this world, but be transformed by the renewing of your mind.”, reference: “Romans 12:2”, reflection: “True renewal starts in the mind.”, questions: [“What worldly patterns are you trapped in?”, “How can you renew your mind?”] }, { id: ‘ren-3’, verse: “Create in me a pure heart, O God, and renew a steadfast spirit within me.”, reference: “Psalm 51:10”, reflection: “We ask God not just for a touch-up, but for a creation of something pure.”, questions: [“What area needs purification?”, “Why is a ‘steadfast’ spirit important?”] } ], unity: [ { id: ‘uni-1’, verse: “How good and pleasant it is when God’s people live together in unity!”, reference: “Psalm 133:1”, reflection: “Unity isn’t just avoiding conflict; it’s a blessing.”, questions: [“Who do you need to reconnect with?”, “How can you be a peacemaker?”] }, { id: ‘uni-2’, verse: “Make every effort to keep the unity of the Spirit through the bond of peace.”, reference: “Ephesians 4:3”, reflection: “Unity requires effort. It is a spiritual discipline.”, questions: [“What effort is required of you?”, “Are you holding onto offenses?”] }, { id: ‘uni-3’, verse: “For just as each of us has one body with many members…”, reference: “Romans 12:4-5”, reflection: “We are interconnected. Your spiritual health affects the whole body.”, questions: [“What role do you play?”, “How can you honor others?”] } ], study: [ { id: ‘stu-1’, verse: “All Scripture is God-breathed and is useful for teaching…”, reference: “2 Timothy 3:16”, reflection: “The Bible isn’t just history; it is the breath of God.”, questions: [“Which use of scripture do you need most?”, “How do you view Scripture?”] }, { id: ‘stu-2’, verse: “Your word is a lamp for my feet, a light on my path.”, reference: “Psalm 119:105”, reflection: “God gives us a lamp for the next step, not always a spotlight for the future.”, questions: [“What decision needs light?”, “Will you take the next step?”] }, { id: ‘stu-3’, verse: “Do not merely listen to the word… Do what it says.”, reference: “James 1:22”, reflection: “Study without application is self-deception.”, questions: [“What command do you struggle to do?”, “What is your action plan?”] } ], prayer: [ { id: ‘pray-1’, verse: “Pray continually, give thanks in all circumstances…”, reference: “1 Thess 5:17-18”, reflection: “Prayer is not an event; it is a lifestyle.”, questions: [“What stops you from praying continually?”, “Can you find a reason to give thanks?”] }, { id: ‘pray-2’, verse: “Do not be anxious about anything, but in every situation… present your requests.”, reference: “Phil 4:6”, reflection: “Anxiety and prayer are exchange rates.”, questions: [“What anxiety are you carrying?”, “Have you presented it to God?”] }, { id: ‘pray-3’, verse: “The Lord is near to all who call on him.”, reference: “Psalm 145:18”, reflection: “God is intimately near, but He responds to truth.”, questions: [“Are you honest with God?”, “What truth have you avoided?”] } ], worship: [ { id: ‘wor-1’, verse: “God is spirit, and his worshipers must worship in the Spirit and in truth.”, reference: “John 4:24”, reflection: “Worship transcends location. It is a heart posture.”, questions: [“What does ‘in Spirit’ mean to you?”, “Is your worship authentic?”] }, { id: ‘wor-2’, verse: “Come, let us bow down in worship.”, reference: “Psalm 95:6”, reflection: “Physical posture often reflects heart posture.”, questions: [“When did you last kneel?”, “What area needs submission?”] }, { id: ‘wor-3’, verse: “Let everything that has breath praise the Lord.”, reference: “Psalm 150:6”, reflection: “If you have breath, you have a purpose: praise.”, questions: [“How can you use your breath for praise?”, “What holds you back?”] } ], discipleship: [ { id: ‘disc-1’, verse: “Therefore go and make disciples of all nations…”, reference: “Matt 28:19”, reflection: “The Great Commission is not a suggestion.”, questions: [“Who are you discipling?”, “Who is discipling you?”] }, { id: ‘disc-2’, verse: “Entrust to reliable people who will also be qualified to teach.”, reference: “2 Tim 2:2”, reflection: “Discipleship is multi-generational.”, questions: [“Are you a ‘reliable person’?”, “Who is your Timothy?”] }, { id: ‘disc-3’, verse: “Follow me, and I will make you fishers of men.”, reference: “Matt 4:19”, reflection: “Before we lead, we must follow.”, questions: [“Are you following Jesus?”, “How can you fish for men?”] } ] }; const INITIAL_CHECKLIST = [ { id: ‘cl-1’, text: ‘Define Retreat Goals & Theme’, category: ‘Planning’, completed: false }, { id: ‘cl-2’, text: ‘Set Date & Duration’, category: ‘Planning’, completed: false }, { id: ‘cl-3’, text: ‘Select & Book Venue’, category: ‘Logistics’, completed: false }, { id: ‘cl-4’, text: ‘Develop Budget’, category: ‘Logistics’, completed: false }, { id: ‘cl-5’, text: ‘Plan Daily Schedule’, category: ‘Content’, completed: false }, { id: ‘cl-6’, text: ‘Arrange Speakers’, category: ‘Content’, completed: false }, { id: ‘cl-7’, text: ‘Coordinate Meals’, category: ‘Logistics’, completed: false }, { id: ‘cl-8’, text: ‘Plan Worship Music’, category: ‘Content’, completed: false }, { id: ‘cl-9’, text: ‘Promote & Register’, category: ‘Outreach’, completed: false }, { id: ‘cl-10’, text: ‘Send Thank You Notes’, category: ‘Follow-up’, completed: false } ]; const ENVIRONMENT_TIPS = [ { id: ‘env-1’, title: ‘Location’, description: ‘Select a peaceful setting away from daily distractions.’, icon: ‘MapPin’ }, { id: ‘env-2’, title: ‘Worship Atmosphere’, description: ‘Create spaces dedicated to worship with minimal visual noise.’, icon: ‘Music’ }, { id: ‘env-3’, title: ‘Fellowship Zones’, description: ‘Arrangement seating to encourage interaction.’, icon: ‘Coffee’ }, { id: ‘env-4’, title: ‘Digital Boundaries’, description: ‘Establish phone-free times to encourage presence.’, icon: ‘Smartphone’ }, { id: ‘env-5’, title: ‘Prayer Areas’, description: ‘Designate quiet spaces for personal meditation.’, icon: ‘Lamp’ }, { id: ‘env-6’, title: ‘Nature Integration’, description: ‘Incorporate outdoor elements and walks.’, icon: ‘Trees’ } ]; // — HTML GENERATOR — const generateStrategicPlanHtml = (currentSchedule, currentChecklist) => { const date = new Date().toLocaleDateString(‘en-US’, { year: ‘numeric’, month: ‘long’, day: ‘numeric’ }); const styles = ` :root { –void: #030712; –brand-500: #f97316; –brand-400: #facc15; –slate-500: #64748b; –slate-100: #f1f5f9; } body { font-family: sans-serif; line-height: 1.6; color: var(–void); max-width: 900px; margin: 0 auto; padding: 40px; } h1 { font-size: 40px; margin-bottom: 10px; line-height:1; } h2 { font-size: 24px; border-bottom: 2px solid #eee; padding-bottom: 10px; margin-top: 40px; } table { width: 100%; border-collapse: collapse; margin-top: 20px; } th, td { text-align: left; padding: 12px; border-bottom: 1px solid #eee; } th { background: #f8fafc; font-size: 12px; text-transform: uppercase; } .check-item { display: flex; align-items: center; padding: 10px 0; border-bottom: 1px solid #eee; } .box { width: 16px; height: 16px; border: 2px solid #ccc; margin-right: 15px; } header::after { content: ” “; position: absolute; bottom: -4px; left: 0; width: 100px; height: 4px; background: var(–brand-500); } .card::before { content: ” “; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, var(–brand-500), var(–brand-400)); opacity: 0.8; } `; let scheduleHtml = String(); currentSchedule.forEach(day => { scheduleHtml += `\u003Cdiv\u003E\u003Ch3\u003E${day.day} – ${day.title}\u003C/h3\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003ETime\u003C/th\u003E\u003Cth\u003EActivity\u003C/th\u003E\u003Cth\u003EDetails\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E`; day.items.forEach(item => { scheduleHtml += `\u003Ctr\u003E\u003Ctd\u003E${item.time}\u003C/td\u003E\u003Ctd\u003E\u003Cstrong\u003E${item.title}\u003C/strong\u003E\u003C/td\u003E\u003Ctd\u003E${item.description}\u003C/td\u003E\u003C/tr\u003E`; }); scheduleHtml += `\u003C/tbody\u003E\u003C/table\u003E\u003C/div\u003E`; }); let checklistHtml = String(); currentChecklist.forEach(item => { // FIXED: Replaced ” with String() to avoid WordPress smart-quote corruption checklistHtml += `\u003Cdiv class=”check-item”\u003E\u003Cdiv class=”box”\u003E${item.completed ? ‘X’ : String()}\u003C/div\u003E\u003Cdiv\u003E${item.text} \u003Csmall style=”color:#888″\u003E(${item.category})\u003C/small\u003E\u003C/div\u003E\u003C/div\u003E`; }); return ` \u003C!DOCTYPE html\u003E \u003Chtml\u003E \u003Chead\u003E\u003Ctitle\u003ERetreat Plan\u003C/title\u003E\u003Cstyle\u003E${styles}\u003C/style\u003E\u003C/head\u003E \u003Cbody\u003E \u003Cheader\u003E \u003Ch1\u003ESTRATEGIC RETREAT PLAN\u003C/h1\u003E \u003Cdiv\u003EGenerated: ${date}\u003C/div\u003E \u003C/header\u003E \u003Ch2\u003ESchedule Flow\u003C/h2\u003E ${scheduleHtml} \u003Ch2\u003EExecution Checklist\u003C/h2\u003E ${checklistHtml} \u003Cfooter style=”margin-top:50px; color:#888; font-size:12px; text-align:center;”\u003E Faith Retreat Planner – LoveThyBible.com \u003C/footer\u003E \u003C/body\u003E \u003C/html\u003E `; }; // — COMPONENTS — // 0. TAILWIND SAFELIST (Fixes Dynamic Colors) // Ensures base color classes are generated. We use separate opacity utilities (e.g., bg-opacity-10) // in the components to avoid needing to safelist every slash-combination (e.g., bg-orange-500/10). const TailwindSafelist = () => { const colors = [‘orange’, ‘blue’, ’emerald’, ‘rose’, ‘yellow’, ‘cyan’, ‘brand’]; return ( {colors.map(c => ( {/* Base Colors */} {/* Gradients */} {/* Hover States */} {/* Shadows */} ))} {/* Specific Environment Gradients */} ); }; // 1. HERO const Hero = ({ onStart }) => { const handleDownload = () => { const savedSchedule = localStorage.getItem(‘retreatSchedule_v2’); const currentSchedule = savedSchedule ? JSON.parse(savedSchedule) : DEFAULT_SCHEDULE; const htmlContent = generateStrategicPlanHtml(currentSchedule, INITIAL_CHECKLIST); const blob = new Blob([htmlContent], { type: ‘text/html’ }); const url = URL.createObjectURL(blob); const a = document.createElement(‘a’); a.href = url; a.download = `retreat-plan-${new Date().toISOString().split(‘T’)[0]}.html`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }; return ( The 2026 Collection RETREAT PLANNER Curate spiritual experiences that resonate. START PLANNING DOWNLOAD GUIDE ); }; // 2. SCHEDULE (Flow) const Schedule = ({ selectedTheme, scheduleData, onUpdateSchedule }) => { const [isEditing, setIsEditing] = useState(false); const baseColor = selectedTheme?.baseColor || ‘brand’; const getTextClass = (shade) => `text-${baseColor}-${shade}`; const updateItem = (dIdx, iIdx, field, val) => { const newS = […scheduleData]; newS[dIdx].items[iIdx] = { …newS[dIdx].items[iIdx], [field]: val }; onUpdateSchedule(newS); }; return ( The FlowCurate the rhythm of worship and rest. setIsEditing(!isEditing)} className={`px-4 py-2 rounded-full border text-xs font-bold uppercase ${isEditing ? ‘bg-white text-black’ : ‘text-slate-400 border-white/10’}`}>{isEditing ? ‘Save’ : ‘Edit’} {scheduleData.map((day, dIdx) => ( {day.icon} {day.day} {day.items.map((item, iIdx) => ( {isEditing ? ( {/* INPUTS (Inherits global CSS styles now) */} updateItem(dIdx, iIdx, ‘time’, e.target.value)} className=”w-32 p-2 rounded” /> updateItem(dIdx, iIdx, ‘title’, e.target.value)} className=”flex-1 p-2 rounded” /> updateItem(dIdx, iIdx, ‘description’, e.target.value)} className=”w-full h-16 p-2 rounded” /> ) : ( {item.time} {item.title} {item.description} )} ))} ))} ); }; // 3. CHECKLIST (Mission Control with Fireworks) const FireworksCanvas = ({ trigger }) => { const canvasRef = useRef(null); const particlesRef = useRef([]); const animationFrameRef = useRef(0); useEffect(() => { if (trigger === 0) return; const canvas = canvasRef.current; if (!canvas) return; const ctx = canvas.getContext(‘2d’); canvas.width = window.innerWidth; canvas.height = window.innerHeight; const createFirework = (x, y) => { const colors = [‘#facc15’, ‘#f97316’, ‘#22d3ee’, ‘#fb7185’, ‘#ffffff’]; for (let i = 0; i < 50; i++) { const angle = Math.random() * Math.PI * 2; const velocity = 2 + Math.random() * 4; particlesRef.current.push({ x, y, vx: Math.cos(angle) * velocity, vy: Math.sin(angle) * velocity, life: 1, color: colors[Math.floor(Math.random() * colors.length)], size: Math.random() * 3 + 1 }); } }; createFirework(window.innerWidth * 0.5, window.innerHeight * 0.4); const animate = () => { if (!ctx) return; ctx.clearRect(0, 0, canvas.width, canvas.height); // FIXED LOOP SYNTAX to avoid ‘i–‘ decrement operator which WordPress turns into an en-dash for (let i = particlesRef.current.length – 1; i >= 0; i = i – 1) { const p = particlesRef.current[i]; p.x += p.vx; p.y += p.vy; p.vy += 0.05; p.life -= 0.02; ctx.globalAlpha = p.life; ctx.fillStyle = p.color; ctx.beginPath(); ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2); ctx.fill(); if (p.life <= 0) particlesRef.current.splice(i, 1); } if (particlesRef.current.length > 0) animationFrameRef.current = requestAnimationFrame(animate); else ctx.clearRect(0, 0, canvas.width, canvas.height); }; animate(); }, [trigger]); return React.createElement(‘canvas’, { ref: canvasRef, className: “fixed inset-0 pointer-events-none z-[100]” }); }; const Checklist = ({ items, onToggle }) => { const [fireworksTrigger, setFireworksTrigger] = useState(0); const progress = Math.round((items.filter(i => i.completed).length / items.length) * 100); const handleToggle = (id, isCompleted) => { if (!isCompleted) setFireworksTrigger(p => p + 1); onToggle(id); }; return ( Mission ControlTrack logistics and execution. Status {progress}% {progress === 100 ? “SYSTEMS GO” : “IN PROGRESS”} {items.map(item => ( handleToggle(item.id, item.completed)} className={`w-full flex items-center justify-between p-4 rounded-sm border-l-2 transition-all duration-300 group ${item.completed ? ‘bg-white/5 border-l-orange-500/50 opacity-50’ : ‘bg-[#0B0F19] border-l-orange-500 hover:bg-white/5 hover:translate-x-2’} `} > {item.completed && } {item.text} {item.category} ))} ); }; // 4. ENVIRONMENT (Vibe) const Environment = () => { const getCardStyles = (index) => { const styles = [ { bg: ‘bg-cyan-500’, text: ‘text-cyan-400’, gradient: ‘from-cyan-400 to-blue-500’ }, { bg: ‘bg-fuchsia-500’, text: ‘text-fuchsia-400’, gradient: ‘from-fuchsia-400 to-purple-500’ }, { bg: ‘bg-orange-500’, text: ‘text-orange-400’, gradient: ‘from-orange-400 to-red-500’ }, { bg: ‘bg-violet-500’, text: ‘text-violet-400’, gradient: ‘from-violet-400 to-indigo-500’ }, { bg: ‘bg-emerald-500’, text: ‘text-emerald-400’, gradient: ‘from-emerald-400 to-teal-500’ }, { bg: ‘bg-amber-500’, text: ‘text-amber-400’, gradient: ‘from-amber-400 to-orange-500’ } ]; return styles[index % styles.length]; }; return ( Create the VibeCurate the physical space. {ENVIRONMENT_TIPS.map((tip, index) => { const s = getCardStyles(index); return ( Tip 0{index + 1} {tip.title} {tip.description} ); })} ); }; // 5. DEVOTIONALS (Word) const Devotionals = ({ selectedTheme }) => { const content = selectedTheme ? (THEME_DEVOTIONALS[selectedTheme.id] || THEME_DEVOTIONALS[‘renewal’]) : THEME_DEVOTIONALS[‘renewal’]; const baseColor = selectedTheme?.baseColor || ‘brand’; return ( Scripture & Reflection Anchoring the soul in truth. {selectedTheme?.title || ‘Daily’} Edition. 03 / The Word {content.map((devotional, idx) => ( {/* Vibrant Glow Background */} {/* Giant Watermark Number Colored – Using explicit opacity utility instead of slash syntax */} 0{idx + 1} {devotional.reference} “{devotional.verse}” {devotional.reflection} Discussion Points {devotional.questions.map((q, i) => ( {q} ))} ))} {/* Go Deeper Section */} Go Deeper Access a library of premium commentaries, original language tools, and community features. VISIT LOVETHYBIBLE.COM ); }; // 6. MAIN APP const App = () => { const [tab, setTab] = useState(‘home’); const [theme, setTheme] = useState(null); // Data State – CHANGED KEY TO v2 TO FIX MISSING SUNDAY const [schedule, setSchedule] = useState(() => { try { return JSON.parse(localStorage.getItem(‘retreatSchedule_v2’)) || DEFAULT_SCHEDULE; } catch(e) { return DEFAULT_SCHEDULE; } }); const [checklist, setChecklist] = useState(INITIAL_CHECKLIST); // Persist useEffect(() => { try{ localStorage.setItem(‘retreatSchedule_v2’, JSON.stringify(schedule)); }catch(e){} }, [schedule]); // Scroll to top on tab change useEffect(() => { const root = document.getElementById(‘faith-retreat-app-container’); if(root && tab !== ‘home’) root.scrollIntoView({behavior:’smooth’}); }, [tab]); const tabs = [ { id: ‘themes’, label: ‘THEMES’, icon: ‘Target’ }, { id: ‘schedule’, label: ‘FLOW’, icon: ‘Calendar’ }, { id: ‘devotionals’, label: ‘WORD’, icon: ‘Book’ }, { id: ‘environment’, label: ‘VIBE’, icon: ‘Mountain’ }, { id: ‘checklist’, label: ‘TASKS’, icon: ‘CheckSquare’ } ]; return ( {tab === ‘home’ ? setTab(‘themes’)} /> : ( <> setTab(‘home’)}>FAITH RETREAT. {theme && Focus: {theme.title}} {tab === ‘themes’ && ( Select ThemeDefine the spiritual trajectory. {THEMES.map(t => ( {setTheme(t); setTab(‘schedule’);}} className={`text-left p-6 rounded-2xl border transition-all ${theme?.id === t.id ? ‘bg-white/10 border-white’ : ‘bg-white/5 border-white/5 hover:bg-white/10’}`}> {t.title} {t.description} ))} )} {tab === ‘schedule’ && } {tab === ‘devotionals’ && } {tab === ‘checklist’ && setChecklist(p => p.map(i => i.id === id ? {…i, completed: !i.completed} : i))} />} {tab === ‘environment’ && } {/* NAV DOCK */} {tabs.map(t => ( setTab(t.id)} className={`flex flex-col items-center justify-center w-16 h-14 rounded-xl transition-all ${tab === t.id ? ‘bg-white text-black’ : ‘text-slate-400 hover:text-white hover:bg-white/5’}`}> {t.label} ))} > )} ); }; // — RENDER — const rootEl = document.getElementById(‘faith-retreat-root’); const root = createRoot(rootEl); root.render();