/* ============================================================
SECTIONS — hero, banner de fecha especial, info, reservas, QR, footer
============================================================ */
const { SPECIAL_DATES: _SD, PAYMENTS: _P2, HOURS: _H, WA: _WA2, MENU_URL: _MU, CATS: _CATS, SOCIAL: _SOCIAL, SlotPicker } = window;
/* fecha especial activa (la más cercana) */
function getActiveSpecial(override) {
if (override && override !== "auto") return _SD.find(s => s.id === override) || _SD[0];
const now = new Date();
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
let best = null, bestDiff = Infinity;
_SD.forEach(s => {
const span = s.id === "semana" ? 8 : 1;
let d = new Date(s.date + "T00:00:00");
while (d.getTime() + span * 864e5 < today.getTime()) d.setFullYear(d.getFullYear() + 1);
const diff = d - today;
if (diff < bestDiff) { bestDiff = diff; best = s; }
});
return best;
}
/* ---- Hero: carrusel horizontal automático ---- */
function HeroSlide({ slotId, placeholder, children }) {
return (
);
}
function Hero({ onOrder, onScrollTo, onOpenItem, onPdf, isOpen }) {
const [i, setI] = useState(0);
const n = 4;
const pause = useRef(false);
useEffect(() => {
const t = setInterval(() => { if (!pause.current) setI(p => (p + 1) % n); }, 6500);
return () => clearInterval(t);
}, []);
const go = (d) => setI((d + n) % n);
return (
{ pause.current = true; }}
onMouseLeave={() => { pause.current = false; }}>
{/* Slide 1 — marca */}
Pescadería & Restaurante · Cocina del Pacífico
Del mar
a tu mesa
Pescado fresco, salsas marineras y leche de coco. Arma tu pedido, personalízalo y recíbelo en casa.
40+Platos
9Pescados frescos
100%Del Pacífico
{/* Slide 2 — especialidad: Langosta Marinera */}
La especialidad · Plato estrella
Langosta
Marinera
Langosta con frutos del mar en salsa marinera cremosa. La joya de Dos Océanos.
{/* Slide 3 — especialidad: Salmón marinero */}
La especialidad
Salmón
marinero
Salmón fresco bajo una generosa salsa de frutos del mar.
{/* Slide 4 — especialidad: Cazuela de Mariscos */}
La especialidad
Cazuela
de Mariscos
Frutos del mar en un caldo cremoso de leche de coco.
{[0, 1, 2, 3].map(d => (
))}
);
}
/* ---- Banda de experiencia (persona probando un plato) ---- */
function Experience({ onOrder }) {
return (
La experiencia Dos Océanos
Se ve, se huele, se antoja
Pescado recién traído, salsas que se cocinan al momento y el sabor del Pacífico en cada bocado. Pide y vívelo en tu mesa.
);
}
/* ---- Banner de fecha especial ---- */
function SpecialBanner({ special, onCta }) {
if (!special) return null;
return (
{special.kicker} · {special.dateLabel}
{special.title}
{special.msg}
);
}
/* ---- Nav de categorías ---- */
function CategoryNav({ cats, active, onJump }) {
const ref = useRef(null);
useEffect(() => {
const el = ref.current && ref.current.querySelector(".on");
if (el && ref.current) {
const r = el.getBoundingClientRect(), pr = ref.current.getBoundingClientRect();
ref.current.scrollBy({ left: r.left - pr.left - pr.width / 2 + r.width / 2, behavior: "smooth" });
}
}, [active]);
return (
);
}
/* ---- Reservas ---- */
function Reservas() {
const [f, setF] = useState({ name: "", date: "", time: "", people: 2, notes: "" });
const set = (k, v) => setF(s => ({ ...s, [k]: v }));
const valid = isValidName(f.name) && f.date && f.time;
function send() {
window.addReservation({ name: f.name, date: f.date, time: f.time, people: f.people, notes: f.notes.trim() });
const L = ["*RESERVA — Dos Océanos*", `Nombre: ${f.name}`, `Fecha: ${f.date}`, `Hora: ${f.time}`, `Personas: ${f.people}`];
if (f.notes.trim()) L.push(`Notas: ${f.notes}`);
window.open(`https://wa.me/${_WA2}?text=${encodeURIComponent(L.join("\n"))}`, "_blank");
}
return (
Reservas
Aparta tu mesa
frente al mar
Para fechas especiales recomendamos reservar con anticipación. Te confirmamos por WhatsApp.
{_H.days}, {_H.label}
Grupos y eventos disponibles
Cotizar evento por WhatsApp
);
}
/* ---- Info: horarios, cobertura, pagos ---- */
function InfoSection({ store }) {
const openNow = store ? isStoreOpen(store) : true;
return (
Horarios
{openNow ? "Abierto ahora" : "Cerrado ahora"}
- {_H.days}{_H.label}
- Cocina hasta{_H.kitchenLabel}
Métodos de pago
{_P2.map(p => {p.label})}
Paga en línea con PSE de forma segura, o al recibir tu pedido.
);
}
/* ---- QR ---- */
function QRSection() {
const ref = useRef(null);
useEffect(() => {
if (!ref.current) return;
ref.current.innerHTML = "";
if (window.qrcode) {
const qr = window.qrcode(0, "M");
qr.addData(_MU); qr.make();
ref.current.innerHTML = qr.createSvgTag({ cellSize: 6, margin: 0, scalable: true });
const svg = ref.current.querySelector("svg");
if (svg) { svg.style.width = "100%"; svg.style.height = "100%"; svg.removeAttribute("width"); svg.removeAttribute("height"); }
} else {
ref.current.innerHTML = 'QR
';
}
}, []);
return (
Escanea & pide
Lleva la carta
en tu bolsillo
Escanea este código para abrir la carta en tu celular, armar tu pedido y recibirlo a domicilio. Imprímelo para tu mesa o compártelo con tus clientes.
Dos Océanos · Haz tu pedido
);
}
/* ---- Footer ---- */
function Footer({ onAdmin }) {
return (
);
}
Object.assign(window, { getActiveSpecial, Hero, Experience, SpecialBanner, CategoryNav, Reservas, InfoSection, QRSection, Footer });