/* ============================================================ 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 (
{children}
); } 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

Máximo 15 personas por reserva. Si pasan 30 minutos de la hora reservada sin confirmación de llegada, la mesa no se garantiza.

); } /* ---- 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}

Domicilios

  • Tarifa única{fmt(5000)}

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 });