// mb-shop.jsx — Lojas feed + Loja do parceiro (iFood style) const money = (n) => "R$ " + n.toFixed(2).replace(".", ","); // ── Video helpers ───────────────────────────────────────────── function getVideoEmbed(url) { if (!url) return null; const yt = url.match(/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/); if (yt) return { type: "iframe", src: `https://www.youtube.com/embed/${yt[1]}?autoplay=1&rel=0` }; const vm = url.match(/vimeo\.com\/(\d+)/); if (vm) return { type: "iframe", src: `https://player.vimeo.com/video/${vm[1]}?autoplay=1` }; if (/\.(mp4|webm|mov)(\?|$)/i.test(url)) return { type: "video", src: url }; return { type: "external", src: url }; } function VideoModal({ url, title, onClose }) { const embed = getVideoEmbed(url); React.useEffect(() => { const handler = (e) => { if (e.key === "Escape") onClose(); }; window.addEventListener("keydown", handler); return () => window.removeEventListener("keydown", handler); }, []); if (!embed) return null; if (embed.type === "external") { window.open(embed.src, "_blank", "noopener,noreferrer"); onClose(); return null; } return (
{/* header */}
e.stopPropagation()} style={{ display: "flex", alignItems: "center", gap: 12, padding: "16px 16px", paddingTop: "max(20px, env(safe-area-inset-top, 20px))", flexShrink: 0 }}>
{title}
{/* player */}
e.stopPropagation()} style={{ flex: 1, display: "flex", alignItems: "center", justifyContent: "center", padding: "0 0 max(24px, env(safe-area-inset-bottom, 24px))" }}> {embed.type === "iframe" ?