// ===== RIVAMAR Group — Módulos del panel admin (v1.1) ===== const { useState, useMemo } = React; // ---------- Iconos ---------- const AdminIcons = { grid: , list: , calendar: , image: , edit: , users: , chart: , briefcase: , home: , trash: , star: , plus: , reset: , mail: , globe: , book: , }; function AdIcon({ name, size = 18 }) { return {AdminIcons[name]}; } // ---------- Vista calendario ---------- function CalendarView({ reservas, onSelect }) { const [month, setMonth] = useState(new Date(2026, 5, 1)); // junio 2026 (local) const y = month.getFullYear(), m = month.getMonth(); const first = new Date(y, m, 1); const startDow = (first.getDay() + 6) % 7; // lunes=0 const days = new Date(y, m + 1, 0).getDate(); const monthName = month.toLocaleDateString('es-CL', { month: 'long', year: 'numeric' }); const byDate = {}; reservas.forEach((r) => { (byDate[r.fecha] = byDate[r.fecha] || []).push(r); }); const cells = []; for (let i = 0; i < startDow; i++) cells.push(null); for (let d = 1; d <= days; d++) cells.push(d); const dateStr = (d) => `${y}-${String(m + 1).padStart(2, '0')}-${String(d).padStart(2, '0')}`; return (

{monthName}

{['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá', 'Do'].map((d) =>
{d}
)}
{cells.map((d, i) => { if (!d) return
; const items = byDate[dateStr(d)] || []; return (
{d}
{items.slice(0, 2).map((r) => ( ))} {items.length > 2 &&
+{items.length - 2} más
}
); })}
); } // ---------- Modal editar reserva ---------- function EditModal({ reserva, onSave, onClose }) { const [r, setR] = useState(reserva); if (!reserva) return null; const set = (k) => (e) => setR({ ...r, [k]: e.target.value }); return (
e.stopPropagation()}>

Editar reserva {r.id}

setR({ ...r, pax: parseInt(e.target.value) || 0 })} />