{"id":1591,"date":"2026-03-20T16:31:27","date_gmt":"2026-03-20T16:31:27","guid":{"rendered":"https:\/\/mayanmonkey.com\/bodas\/?page_id=1591"},"modified":"2026-03-20T16:52:46","modified_gmt":"2026-03-20T16:52:46","slug":"virtual-tour","status":"publish","type":"page","link":"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/","title":{"rendered":"Virtual Tour"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1591\" class=\"elementor elementor-1591\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0b131c4 e-flex e-con-boxed e-con e-parent\" data-id=\"0b131c4\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bc3dce7 elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"bc3dce7\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\/* \u2500\u2500 RESET \u2500\u2500 *\/\n#mm-tour, #mm-tour * { margin: 0; padding: 0; box-sizing: border-box; }\n\n\/* \u2500\u2500 VARIABLES + WRAPPER \u2500\u2500 *\/\n#mm-tour {\n  --gold: #C9A96E;\n  --gold-light: #E8C98A;\n  --gold-dim: rgba(201,169,110,0.3);\n  --dark: #0A0A0A;\n  --panel: rgba(10,10,10,0.82);\n  --w: #F5F0E8;\n  --wd: rgba(245,240,232,0.65);\n  --wf: rgba(245,240,232,0.12);\n  --tr: 0.4s cubic-bezier(0.4,0,0.2,1);\n  position: relative;\n  width: 100%;\n  height: 600px;\n  overflow: hidden;\n  border-radius: 16px;\n  background: #0A0A0A;\n  font-family: 'Lato', sans-serif;\n  color: var(--w);\n  -webkit-font-smoothing: antialiased;\n  user-select: none;\n  -webkit-user-select: none;\n}\n\n\/* \u2500\u2500 FULLSCREEN \u2500\u2500 *\/\n#mm-tour:-webkit-full-screen { width: 100vw; height: 100vh; }\n#mm-tour:-moz-full-screen    { width: 100vw; height: 100vh; }\n#mm-tour:fullscreen          { width: 100vw; height: 100vh; }\n\n#mm-tour.mm-fs-fake {\n  position: fixed !important;\n  top: 0 !important; left: 0 !important; right: 0 !important; bottom: 0 !important;\n  width: 100vw !important;\n  height: 100vh !important;\n  height: 100svh !important;\n  padding-bottom: 0 !important;\n  max-width: none !important;\n  margin: 0 !important;\n  border-radius: 0 !important;\n  z-index: 9999;\n}\n#mm-tour.mm-fs-fake #mm-nav {\n  padding-bottom: max(14px, env(safe-area-inset-bottom));\n}\n\n\/* \u2500\u2500 CANVAS \u2500\u2500 *\/\n#mm-canvas { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: block; cursor: grab; }\n#mm-canvas:active { cursor: grabbing; }\n\n\/* \u2500\u2500 LOADER \u2500\u2500 *\/\n#mm-loader {\n  position: absolute; inset: 0;\n  background: var(--dark);\n  display: flex; flex-direction: column;\n  align-items: center; justify-content: center;\n  z-index: 999;\n  transition: opacity 0.8s ease, visibility 0.8s ease;\n}\n#mm-loader.hidden { opacity: 0; visibility: hidden; pointer-events: none; }\n.mm-lbrand  { font-size: 10px; letter-spacing: 6px; text-transform: uppercase; color: var(--gold); margin-bottom: 36px; font-weight: 300; text-align: center; line-height: 1; }\n.mm-lbrand2 { display: none; }\n.mm-lbar-w  { width: 180px; height: 1px; background: rgba(255,255,255,0.1); overflow: hidden; }\n.mm-lbar    { height: 100%; background: linear-gradient(90deg, var(--gold), var(--gold-light)); width: 0%; transition: width .3s ease; }\n.mm-lpct    { margin-top: 14px; font-size: 10px; letter-spacing: 3px; color: var(--wd); font-weight: 300; }\n\n\/* \u2500\u2500 OVERLAYS \u2500\u2500 *\/\n#mm-ov  { position: absolute; inset: 0; background: var(--dark); opacity: 0; pointer-events: none; z-index: 100; transition: opacity .5s ease; }\n#mm-ov.on { opacity: 1; }\n#mm-vig { position: absolute; inset: 0; background: radial-gradient(ellipse at center, transparent 50%, rgba(0,0,0,0.6) 100%); pointer-events: none; z-index: 10; }\n\n\/* \u2500\u2500 TOP BAR \u2500\u2500 *\/\n#mm-top {\n  position: absolute; top: 0; left: 0; right: 0; height: 56px;\n  background: linear-gradient(180deg, rgba(0,0,0,0.8) 0%, transparent 100%);\n  display: flex; align-items: center; padding: 0 20px; z-index: 200;\n}\n.mm-brand { font-size: 9px; letter-spacing: 5px; text-transform: uppercase; font-weight: 700; color: var(--gold); }\n.mm-tr    { position: absolute; right: 20px; display: flex; gap: 8px; }\n\n\/* \u2500\u2500 BOTONES \u2500\u2500 *\/\n.mm-btn {\n  width: 32px; height: 32px;\n  border: 1px solid var(--wf); background: var(--panel);\n  border-radius: 6px; display: flex; align-items: center; justify-content: center;\n  cursor: pointer; transition: var(--tr); color: var(--wd);\n  backdrop-filter: blur(10px); flex-shrink: 0;\n}\n.mm-btn:hover { border-color: var(--gold-dim); color: var(--gold); background: rgba(201,169,110,.08); }\n.mm-btn svg   { width: 14px; height: 14px; }\n\n\/* \u2500\u2500 AUTOROTATE \u2500\u2500 *\/\n#mm-auto {\n  position: absolute; top: 66px; left: 20px; z-index: 200;\n  display: flex; align-items: center; gap: 7px;\n  background: var(--panel); border: 1px solid var(--wf);\n  border-radius: 20px; padding: 5px 11px;\n  font-size: 8px; letter-spacing: 2px; text-transform: uppercase;\n  color: var(--wd); backdrop-filter: blur(10px);\n  cursor: pointer; transition: var(--tr);\n}\n#mm-auto:hover   { border-color: var(--gold-dim); color: var(--gold); }\n#mm-auto.on      { color: var(--gold); border-color: var(--gold-dim); }\n.mm-dot          { width: 5px; height: 5px; border-radius: 50%; background: var(--wd); transition: background .3s; }\n#mm-auto.on .mm-dot { background: var(--gold); animation: blink 1.4s ease infinite; }\n@keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: .25; } }\n\n\/* \u2500\u2500 COMPASS \u2500\u2500 *\/\n#mm-cmp { position: absolute; top: 66px; right: 20px; z-index: 200; opacity: .65; }\n.mm-cr  { width: 40px; height: 40px; border-radius: 50%; border: 1px solid var(--wf); background: var(--panel); backdrop-filter: blur(10px); display: flex; align-items: center; justify-content: center; }\n.mm-cn  { width: 2px; height: 14px; background: linear-gradient(180deg, var(--gold) 50%, var(--wf) 50%); border-radius: 2px; transform-origin: center; transition: transform .2s ease; }\n\n\/* \u2500\u2500 COUNTER \u2500\u2500 *\/\n#mm-cnt  { position: absolute; bottom: 115px; right: 20px; z-index: 200; text-align: right; pointer-events: none; }\n.mm-cnum { font-size: 30px; font-weight: 100; line-height: 1; }\n.mm-ctot { font-size: 10px; color: var(--wd); font-weight: 300; letter-spacing: 1px; }\n\n\/* \u2500\u2500 ZOOM \u2500\u2500 *\/\n#mm-zm { position: absolute; right: 20px; bottom: 165px; z-index: 200; display: flex; flex-direction: column; gap: 5px; }\n\n\/* \u2500\u2500 HINT \u2500\u2500 *\/\n#mm-hint {\n  position: absolute; bottom: 115px; left: 50%;\n  transform: translateX(-50%); z-index: 200; pointer-events: none;\n  font-size: 8px; letter-spacing: 2px; text-transform: uppercase;\n  color: var(--wd); display: flex; align-items: center; gap: 8px;\n  white-space: nowrap;\n  animation: mmFadeUp 1s ease 1.5s both, mmFadeOut 1s ease 5s forwards;\n}\n.mm-hl { width: 20px; height: 1px; background: var(--wf); }\n@keyframes mmFadeUp  { from { opacity: 0; transform: translateX(-50%) translateY(10px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } }\n@keyframes mmFadeOut { from { opacity: 1; } to { opacity: 0; } }\n\n\/* \u2500\u2500 THUMBNAILS \u2500\u2500 *\/\n#mm-nav {\n  position: absolute; bottom: 0; left: 0; right: 0;\n  padding: 12px 20px 14px;\n  background: linear-gradient(0deg, rgba(0,0,0,.6) 60%, transparent 100%);\n  display: flex; align-items: center; justify-content: center; gap: 10px;\n  z-index: 200; overflow-x: auto; scrollbar-width: none; flex-wrap: nowrap;\n}\n#mm-nav::-webkit-scrollbar { display: none; }\n.mm-th { cursor: pointer; flex-shrink: 0; display: flex; flex-direction: column; align-items: center; gap: 5px; opacity: 1; filter: none; transition: var(--tr); }\n.mm-th.on .mm-ti { border-color: var(--gold); box-shadow: 0 0 0 1px var(--gold), 0 2px 16px rgba(201,169,110,.25); }\n.mm-ti  { width: 64px; height: 42px; border-radius: 4px; border: 1.5px solid rgba(255,255,255,.1); overflow: hidden; transition: var(--tr); }\n.mm-ti img { width: 100%; height: 100%; object-fit: cover; object-position: center; display: block; }\n.mm-tl  { font-size: 7px; letter-spacing: 1.5px; text-transform: uppercase; color: #F5F0E8; text-align: center; font-weight: 300; line-height: 1; white-space: nowrap; text-shadow: 0 1px 6px rgba(0,0,0,1); }\n.mm-th.on .mm-tl { color: #C9A96E; }\n\n\/* \u2500\u2500 DESKTOP \u2500\u2500 *\/\n@media (min-width: 769px) {\n  #mm-tour { height: 600px; padding-bottom: 0; max-width: 1260px; margin: 0 auto; }\n}\n\n\/* \u2500\u2500 MOBILE \u2500\u2500 *\/\n@media (max-width: 768px) {\n  #mm-tour  { height: 0; padding-bottom: 116.67%; margin: 0 20px; width: calc(100% - 40px); }\n  .mm-lbrand { font-size: 11px; letter-spacing: 4px; display: flex; flex-direction: column; align-items: center; gap: 10px; }\n  .mm-lbrand2 { display: block; font-size: 9px; letter-spacing: 5px; color: rgba(245,240,232,0.65); font-weight: 300; }\n  .mm-ti    { width: 44px; height: 29px; }\n  .mm-tl    { max-width: 44px; letter-spacing: 0; }\n  #mm-zm    { display: none; }\n  .mm-cnum  { font-size: 22px; }\n  #mm-cnt   { bottom: 105px; right: 14px; }\n  #mm-auto  { top: 62px; left: 14px; }\n  #mm-cmp   { top: 62px; right: 14px; }\n  #mm-nav   { padding: 10px 14px 12px; gap: 7px; }\n  .mm-brand { font-size: 8px; letter-spacing: 3px; }\n}\n<\/style>\n\n<!-- \u2550\u2550 HTML \u2550\u2550 -->\n<div id=\"mm-tour\">\n\n  <div id=\"mm-loader\">\n    <div class=\"mm-lbrand\">Mayan Monkey <span class=\"mm-lbrand2\">Virtual Tours<\/span><\/div>\n    <div class=\"mm-lbar-w\"><div class=\"mm-lbar\" id=\"mm-bar\"><\/div><\/div>\n    <div class=\"mm-lpct\" id=\"mm-pct\">0%<\/div>\n  <\/div>\n\n  <div id=\"mm-ov\"><\/div>\n  <div id=\"mm-vig\"><\/div>\n  <canvas id=\"mm-canvas\"><\/canvas>\n\n  <div id=\"mm-top\">\n    <span class=\"mm-brand\">Mayan Monkey &nbsp;|&nbsp; Areia<\/span>\n    <div class=\"mm-tr\">\n      <div class=\"mm-btn\" id=\"mm-fs\" title=\"Fullscreen\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n          <path d=\"M8 3H5a2 2 0 00-2 2v3m18 0V5a2 2 0 00-2-2h-3m0 18h3a2 2 0 002-2v-3M3 16v3a2 2 0 002 2h3\"\/>\n        <\/svg>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div id=\"mm-auto\" onclick=\"mmToggleAuto()\">\n    <div class=\"mm-dot\"><\/div>\n    <span>Auto<\/span>\n  <\/div>\n\n  <div id=\"mm-cmp\"><div class=\"mm-cr\"><div class=\"mm-cn\" id=\"mm-cn\"><\/div><\/div><\/div>\n\n  <div id=\"mm-hint\">\n    <div class=\"mm-hl\"><\/div>\n    <span>Tap &amp; drag to explore<\/span>\n    <div class=\"mm-hl\"><\/div>\n  <\/div>\n\n  <div id=\"mm-cnt\">\n    <div class=\"mm-cnum\" id=\"mm-cnum\">01<\/div>\n    <div class=\"mm-ctot\">\/ 06<\/div>\n  <\/div>\n\n  <div id=\"mm-zm\">\n    <div class=\"mm-btn\" id=\"mm-zi\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n        <circle cx=\"11\" cy=\"11\" r=\"8\"\/><path d=\"M21 21l-4.35-4.35M11 8v6M8 11h6\"\/>\n      <\/svg>\n    <\/div>\n    <div class=\"mm-btn\" id=\"mm-zo\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n        <circle cx=\"11\" cy=\"11\" r=\"8\"\/><path d=\"M21 21l-4.35-4.35M8 11h6\"\/>\n      <\/svg>\n    <\/div>\n  <\/div>\n\n  <div id=\"mm-nav\"><\/div>\n\n<\/div>\n\n<!-- \u2550\u2550 SCRIPTS \u2550\u2550 -->\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"><\/script>\n<script>\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 DATOS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nconst SC = [\n  { id:0, name:'Entrance',   short:'Entrance',   img:'https:\/\/mayanmonkey.com\/bachelorette\/wp-content\/uploads\/2026\/03\/PASILLO-ENTRADA-P-02-scaled.jpg',        arrows:[] },\n  { id:1, name:'Rooms',      short:'Rooms',       img:'https:\/\/mayanmonkey.com\/bachelorette\/wp-content\/uploads\/2026\/03\/P-MAYAN-y-AREIA-P_WEB-scaled.jpg',        arrows:[] },\n  { id:2, name:'Areia',      short:'Areia',       img:'https:\/\/mayanmonkey.com\/bachelorette\/wp-content\/uploads\/2026\/03\/ENTRADA-AREIA-PANORAMICA-WEB-scaled.jpg',  arrows:[] },\n  { id:3, name:'Bar',        short:'Bar',         img:'https:\/\/mayanmonkey.com\/bachelorette\/wp-content\/uploads\/2026\/03\/ENTRADA-2_02_Web-scaled.jpg',              arrows:[] },\n  { id:4, name:'Restaurant', short:'Restaurant',  img:'https:\/\/mayanmonkey.com\/bachelorette\/wp-content\/uploads\/2026\/03\/RESTAURANTE-Panorama-WEB-scaled.jpg',      arrows:[] },\n  { id:5, name:'Beach Club', short:'Beach Club',  img:'https:\/\/mayanmonkey.com\/bachelorette\/wp-content\/uploads\/2026\/03\/PLAYA-Panorama-WEB-scaled.jpg',            arrows:[] }\n];\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 ESTADO \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nlet cur=0, autoR=false, busy=false;\nlet texs=[], loaded=0;\nlet rdr, tsc, cam, sph;\nlet drag=false, prev={x:0,y:0};\nlet lon=180, lat=0, tlon=180, tlat=0, fov=75, tfov=75;\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 THREE.JS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction initThree(){\n  const wrap   = document.getElementById('mm-tour');\n  const canvas = document.getElementById('mm-canvas');\n  const W = wrap.clientWidth, H = wrap.clientHeight;\n  rdr = new THREE.WebGLRenderer({canvas, antialias:true, alpha:false});\n  rdr.setPixelRatio(Math.min(devicePixelRatio,2));\n  rdr.setSize(W, H);\n  tsc = new THREE.Scene();\n  cam = new THREE.PerspectiveCamera(75, W\/H, 0.1, 1000);\n  cam.position.set(0,0,0.001);\n  const geo = new THREE.SphereGeometry(500,60,40);\n  geo.scale(-1,1,1);\n  sph = new THREE.Mesh(geo, new THREE.MeshBasicMaterial({map:null}));\n  tsc.add(sph);\n  new ResizeObserver(()=>{\n    const w=wrap.clientWidth, h=wrap.clientHeight;\n    rdr.setSize(w,h); cam.aspect=w\/h; cam.updateProjectionMatrix();\n  }).observe(wrap);\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 TEXTURAS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction loadTexs(){\n  const ldr = new THREE.TextureLoader();\n  SC.forEach((s,i)=>{\n    ldr.load(s.img,\n      t=>{ texs[i]=t; loaded++; updBar(); if(i===0) applyTex(0); if(loaded===SC.length) done(); },\n      null,\n      ()=>{ texs[i]=fallback(s.name); loaded++; updBar(); if(loaded===SC.length) done(); }\n    );\n  });\n}\nfunction updBar(){\n  const p = Math.round(loaded\/SC.length*100);\n  document.getElementById('mm-bar').style.width = p+'%';\n  document.getElementById('mm-pct').textContent  = p+'%';\n}\nfunction fallback(n){\n  const c=document.createElement('canvas'); c.width=2048; c.height=1024;\n  const ctx=c.getContext('2d');\n  ctx.fillStyle='#111'; ctx.fillRect(0,0,2048,1024);\n  ctx.fillStyle='rgba(201,169,110,.5)'; ctx.font='48px Lato,sans-serif';\n  ctx.textAlign='center'; ctx.fillText(n,1024,512);\n  return new THREE.CanvasTexture(c);\n}\nfunction applyTex(i){\n  if(!texs[i]) return;\n  sph.material.map = texs[i];\n  sph.material.needsUpdate = true;\n  const wrap=document.getElementById('mm-tour');\n  const w=wrap.clientWidth, h=wrap.clientHeight;\n  if(w>0&&h>0){ rdr.setSize(w,h); cam.aspect=w\/h; cam.updateProjectionMatrix(); }\n}\nfunction done(){ setTimeout(()=>document.getElementById('mm-loader').classList.add('hidden'),400); }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 LOOP \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction loop(){\n  requestAnimationFrame(loop);\n  if(autoR&&!drag) tlon+=0.04;\n  lon+=(tlon-lon)*.06; lat+=(tlat-lat)*.06; fov+=(tfov-fov)*.08;\n  lat=Math.max(-85,Math.min(85,lat));\n  cam.fov=fov; cam.updateProjectionMatrix();\n  const phi=THREE.MathUtils.degToRad(90-lat);\n  const th =THREE.MathUtils.degToRad(lon);\n  cam.lookAt(500*Math.sin(phi)*Math.cos(th), 500*Math.cos(phi), 500*Math.sin(phi)*Math.sin(th));\n  document.getElementById('mm-cn').style.transform=`rotate(${-lon}deg)`;\n  rdr.render(tsc,cam);\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 ESCENAS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction goto(i){\n  if(busy||i===cur) return; busy=true;\n  const ov=document.getElementById('mm-ov');\n  ov.style.transition='opacity .32s ease'; ov.classList.add('on');\n  setTimeout(()=>{\n    cur=i; applyTex(i); updateUI(); tlon=lon+25;\n    ov.style.transition='opacity .6s ease'; ov.classList.remove('on');\n    setTimeout(()=>{ busy=false; },700);\n  },360);\n}\nfunction updateUI(){\n  const s=SC[cur];\n  document.getElementById('mm-cnum').textContent=String(cur+1).padStart(2,'0');\n  document.querySelectorAll('.mm-th').forEach((el,i)=>el.classList.toggle('on',i===cur));\n  renderArrows(s.arrows);\n}\nfunction renderArrows(){}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 THUMBNAILS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction buildNav(){\n  const nav=document.getElementById('mm-nav');\n  SC.forEach((s,i)=>{\n    const d=document.createElement('div');\n    d.className='mm-th'+(i===0?' on':'');\n    d.innerHTML=`<div class=\"mm-ti\"><img decoding=\"async\" src=\"${s.img}\" alt=\"${s.name}\" loading=\"lazy\"><\/div>\n                 <div class=\"mm-tl\">${s.short}<\/div>`;\n    d.addEventListener('click',()=>goto(i));\n    nav.appendChild(d);\n  });\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CONTROLES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction initControls(){\n  const cv=document.getElementById('mm-canvas');\n\n  cv.addEventListener('mousedown',e=>{ drag=true; prev={x:e.clientX,y:e.clientY}; });\n  window.addEventListener('mousemove',e=>{\n    if(!drag) return;\n    tlon-=(e.clientX-prev.x)*.15;\n    tlat-=(e.clientY-prev.y)*.15;\n    prev={x:e.clientX,y:e.clientY};\n  });\n  window.addEventListener('mouseup',()=>{ drag=false; });\n\n  let lt=null;\n  cv.addEventListener('touchstart',e=>{\n    if(e.touches.length===1) lt={x:e.touches[0].clientX,y:e.touches[0].clientY};\n  },{passive:true});\n  cv.addEventListener('touchmove',e=>{\n    if(e.touches.length===1&&lt){\n      const isFS = document.fullscreenElement || document.webkitFullscreenElement ||\n                   document.getElementById('mm-tour').classList.contains('mm-fs-fake');\n      if(isFS) e.preventDefault();\n      tlon-=(e.touches[0].clientX-lt.x)*.2;\n      if(isFS) tlat+=(e.touches[0].clientY-lt.y)*.2;\n      lt={x:e.touches[0].clientX,y:e.touches[0].clientY};\n    }\n  },{passive:false});\n  cv.addEventListener('touchend',()=>{ lt=null; });\n\n  cv.addEventListener('wheel',e=>{ e.preventDefault(); tfov=Math.max(30,Math.min(100,tfov+e.deltaY*.04)); },{passive:false});\n  document.getElementById('mm-zi').addEventListener('click',()=>{ tfov=Math.max(30,tfov-10); });\n  document.getElementById('mm-zo').addEventListener('click',()=>{ tfov=Math.min(100,tfov+10); });\n\n  document.getElementById('mm-fs').addEventListener('click',()=>{\n    const el=document.getElementById('mm-tour');\n    if(document.fullscreenEnabled||document.webkitFullscreenEnabled){\n      if(!document.fullscreenElement&&!document.webkitFullscreenElement){\n        (el.requestFullscreen?.())||el.webkitRequestFullscreen?.();\n      } else {\n        (document.exitFullscreen?.())||document.webkitExitFullscreen?.();\n      }\n    } else {\n      el.classList.toggle('mm-fs-fake');\n      document.body.style.overflow=el.classList.contains('mm-fs-fake')?'hidden':'';\n      requestAnimationFrame(()=>{\n        const w=el.clientWidth,h=el.clientHeight;\n        if(w>0&&h>0){ rdr.setSize(w,h); cam.aspect=w\/h; cam.updateProjectionMatrix(); }\n      });\n    }\n  });\n}\n\nfunction mmToggleAuto(){\n  autoR=!autoR;\n  document.getElementById('mm-auto').classList.toggle('on',autoR);\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 ARRANQUE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction startTour(){\n  initThree(); buildNav(); renderArrows(SC[0].arrows); loadTexs(); initControls(); loop();\n}\n\nif(window.innerWidth>768){\n  startTour();\n} else {\n  requestAnimationFrame(()=>{ requestAnimationFrame(startTour); });\n}\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Mayan Monkey Virtual Tours 0% Mayan Monkey &nbsp;|&nbsp; Areia Auto Tap &amp; drag to explore 01 \/ 06<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1591","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Virtual Tour - Bodas Mayan Monkey<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Virtual Tour - Bodas Mayan Monkey\" \/>\n<meta property=\"og:description\" content=\"Mayan Monkey Virtual Tours 0% Mayan Monkey &nbsp;|&nbsp; Areia Auto Tap &amp; drag to explore 01 \/ 06\" \/>\n<meta property=\"og:url\" content=\"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/\" \/>\n<meta property=\"og:site_name\" content=\"Bodas Mayan Monkey\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-20T16:52:46+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/\",\"url\":\"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/\",\"name\":\"Virtual Tour - Bodas Mayan Monkey\",\"isPartOf\":{\"@id\":\"https:\/\/mayanmonkey.com\/bodas\/#website\"},\"datePublished\":\"2026-03-20T16:31:27+00:00\",\"dateModified\":\"2026-03-20T16:52:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/mayanmonkey.com\/bodas\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Virtual Tour\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/mayanmonkey.com\/bodas\/#website\",\"url\":\"https:\/\/mayanmonkey.com\/bodas\/\",\"name\":\"Bodas Mayan Monkey\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/mayanmonkey.com\/bodas\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/mayanmonkey.com\/bodas\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/mayanmonkey.com\/bodas\/#organization\",\"name\":\"Bodas Mayan Monkey\",\"url\":\"https:\/\/mayanmonkey.com\/bodas\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/mayanmonkey.com\/bodas\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/mayanmonkey.com\/bodas\/wp-content\/uploads\/2025\/12\/logomayanmonkey.png\",\"contentUrl\":\"https:\/\/mayanmonkey.com\/bodas\/wp-content\/uploads\/2025\/12\/logomayanmonkey.png\",\"width\":954,\"height\":231,\"caption\":\"Bodas Mayan Monkey\"},\"image\":{\"@id\":\"https:\/\/mayanmonkey.com\/bodas\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Virtual Tour - Bodas Mayan Monkey","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/","og_locale":"es_MX","og_type":"article","og_title":"Virtual Tour - Bodas Mayan Monkey","og_description":"Mayan Monkey Virtual Tours 0% Mayan Monkey &nbsp;|&nbsp; Areia Auto Tap &amp; drag to explore 01 \/ 06","og_url":"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/","og_site_name":"Bodas Mayan Monkey","article_modified_time":"2026-03-20T16:52:46+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/","url":"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/","name":"Virtual Tour - Bodas Mayan Monkey","isPartOf":{"@id":"https:\/\/mayanmonkey.com\/bodas\/#website"},"datePublished":"2026-03-20T16:31:27+00:00","dateModified":"2026-03-20T16:52:46+00:00","breadcrumb":{"@id":"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/mayanmonkey.com\/bodas\/virtual-tour\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/mayanmonkey.com\/bodas\/"},{"@type":"ListItem","position":2,"name":"Virtual Tour"}]},{"@type":"WebSite","@id":"https:\/\/mayanmonkey.com\/bodas\/#website","url":"https:\/\/mayanmonkey.com\/bodas\/","name":"Bodas Mayan Monkey","description":"","publisher":{"@id":"https:\/\/mayanmonkey.com\/bodas\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/mayanmonkey.com\/bodas\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/mayanmonkey.com\/bodas\/#organization","name":"Bodas Mayan Monkey","url":"https:\/\/mayanmonkey.com\/bodas\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/mayanmonkey.com\/bodas\/#\/schema\/logo\/image\/","url":"https:\/\/mayanmonkey.com\/bodas\/wp-content\/uploads\/2025\/12\/logomayanmonkey.png","contentUrl":"https:\/\/mayanmonkey.com\/bodas\/wp-content\/uploads\/2025\/12\/logomayanmonkey.png","width":954,"height":231,"caption":"Bodas Mayan Monkey"},"image":{"@id":"https:\/\/mayanmonkey.com\/bodas\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/mayanmonkey.com\/bodas\/wp-json\/wp\/v2\/pages\/1591","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mayanmonkey.com\/bodas\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mayanmonkey.com\/bodas\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mayanmonkey.com\/bodas\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mayanmonkey.com\/bodas\/wp-json\/wp\/v2\/comments?post=1591"}],"version-history":[{"count":34,"href":"https:\/\/mayanmonkey.com\/bodas\/wp-json\/wp\/v2\/pages\/1591\/revisions"}],"predecessor-version":[{"id":1628,"href":"https:\/\/mayanmonkey.com\/bodas\/wp-json\/wp\/v2\/pages\/1591\/revisions\/1628"}],"wp:attachment":[{"href":"https:\/\/mayanmonkey.com\/bodas\/wp-json\/wp\/v2\/media?parent=1591"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}