{"id":4015,"date":"2026-03-18T11:41:06","date_gmt":"2026-03-18T16:41:06","guid":{"rendered":"https:\/\/vtower.mx\/contactanos\/"},"modified":"2026-04-17T17:10:37","modified_gmt":"2026-04-17T22:10:37","slug":"contact","status":"publish","type":"page","link":"https:\/\/vtower.mx\/en\/contact\/","title":{"rendered":"Contact"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4015\" class=\"elementor elementor-4015 elementor-1238\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0bf1b84 e-con-full e-flex e-con e-parent\" data-id=\"0bf1b84\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-ddd6bd4 e-con-full tao-hero-gallery e-flex e-con e-child\" data-id=\"ddd6bd4\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;slideshow&quot;,&quot;background_slideshow_gallery&quot;:[{&quot;id&quot;:4054,&quot;url&quot;:&quot;https:\\\/\\\/vtower.mx\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/A_Alberca-02.png&quot;},{&quot;id&quot;:2081,&quot;url&quot;:&quot;https:\\\/\\\/vtower.mx\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/A_Asador-02-2.png&quot;},{&quot;id&quot;:4052,&quot;url&quot;:&quot;https:\\\/\\\/vtower.mx\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/E_Estacionamiento-02-scaled.png&quot;},{&quot;id&quot;:2082,&quot;url&quot;:&quot;https:\\\/\\\/vtower.mx\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/A_Petpark-2.png&quot;}],&quot;background_slideshow_loop&quot;:&quot;yes&quot;,&quot;background_slideshow_slide_duration&quot;:5000,&quot;background_slideshow_slide_transition&quot;:&quot;fade&quot;,&quot;background_slideshow_transition_duration&quot;:500}\">\n\t\t<div class=\"elementor-element elementor-element-e4b9a22 e-con-full e-flex e-con e-child\" data-id=\"e4b9a22\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-eb2e8d7 elementor-widget elementor-widget-html\" data-id=\"eb2e8d7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\r\nwindow.addEventListener('load', function() {\r\n    \/\/ Le damos a Elementor 100ms extra para terminar de pintar la pantalla\r\n    setTimeout(() => { \r\n        const textElements = document.querySelectorAll('[id^=\"text-to-split\"]');\r\n        \r\n        textElements.forEach(element => {\r\n            \/\/ Buscamos el contenedor exacto del texto\r\n            const textContainer = element.querySelector('.elementor-heading-title, .elementor-text-editor') || element;\r\n            \r\n            const text = textContainer.innerText.trim();\r\n            if(!text) return; \/\/ Si est\u00e1 vac\u00edo, no hacemos nada\r\n            \r\n            textContainer.innerHTML = '';\r\n            \r\n            \/\/ Dividimos el texto midiendo palabra por palabra con la fuente ya cargada\r\n            const words = text.split(\/\\s+\/);\r\n            let wordsArray = [];\r\n            \r\n            words.forEach(word => {\r\n                const span = document.createElement('span');\r\n                span.innerHTML = word + '&nbsp;'; \r\n                span.style.display = 'inline-block';\r\n                textContainer.appendChild(span);\r\n                wordsArray.push(span);\r\n            });\r\n            \r\n            let lines = [];\r\n            let currentLine = [];\r\n            let currentOffset = -1;\r\n            \r\n            \/\/ Calculamos exactamente d\u00f3nde hace el salto de l\u00ednea el navegador\r\n            wordsArray.forEach(span => {\r\n                if (currentOffset === -1 || span.offsetTop > currentOffset + 5) {\r\n                    currentOffset = span.offsetTop;\r\n                    currentLine = [];\r\n                    lines.push(currentLine);\r\n                }\r\n                currentLine.push(span.innerText.trim());\r\n            });\r\n            \r\n            textContainer.innerHTML = '';\r\n            \r\n            \/\/ Reconstruimos el texto con la animaci\u00f3n\r\n            lines.forEach((lineWords, index) => {\r\n                const lineText = lineWords.join(' ');\r\n                \r\n                const container = document.createElement('span');\r\n                container.className = 'text-line-container';\r\n                container.style.display = 'block'; \r\n                container.style.overflow = 'hidden';\r\n                \r\n                const content = document.createElement('span');\r\n                content.className = 'text-line-content';\r\n                content.textContent = lineText;\r\n                \r\n                \/\/ MAGIA AUTOM\u00c1TICA: Calculamos el retraso de cada l\u00ednea aqu\u00ed mismo\r\n                content.style.transitionDelay = `${(index + 1) * 0.15}s`;\r\n                \r\n                container.appendChild(content);\r\n                textContainer.appendChild(container);\r\n            });\r\n            \r\n            \/\/ Observamos cuando el usuario llega a esta parte de la pantalla\r\n            const observer = new IntersectionObserver((entries) => {\r\n                entries.forEach(entry => {\r\n                    if (entry.isIntersecting) {\r\n                        element.classList.add('text-animated');\r\n                        observer.unobserve(element);\r\n                    }\r\n                });\r\n            }, { threshold: 0.1 }); \/\/ Se activa cuando asoma el 10% del texto\r\n            \r\n            observer.observe(element);\r\n        });\r\n    }, 100);\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b5b6d0e e-con-full e-flex e-con e-child\" data-id=\"b5b6d0e\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-387ceef elementor-widget elementor-widget-heading\" data-id=\"387ceef\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"test-to-split\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Invest in a project that embraces this emerging destination<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8a52610 elementor-widget elementor-widget-html\" data-id=\"8a52610\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\r\nwindow.addEventListener('load', function() {\r\n    \/\/ Le damos a Elementor 100ms extra para terminar de pintar la pantalla\r\n    setTimeout(() => { \r\n        const textElements = document.querySelectorAll('[id^=\"text-to-split\"]');\r\n        \r\n        textElements.forEach(element => {\r\n            \/\/ Buscamos el contenedor exacto del texto\r\n            const textContainer = element.querySelector('.elementor-heading-title, .elementor-text-editor') || element;\r\n            \r\n            const text = textContainer.innerText.trim();\r\n            if(!text) return; \/\/ Si est\u00e1 vac\u00edo, no hacemos nada\r\n            \r\n            textContainer.innerHTML = '';\r\n            \r\n            \/\/ Dividimos el texto midiendo palabra por palabra con la fuente ya cargada\r\n            const words = text.split(\/\\s+\/);\r\n            let wordsArray = [];\r\n            \r\n            words.forEach(word => {\r\n                const span = document.createElement('span');\r\n                span.innerHTML = word + '&nbsp;'; \r\n                span.style.display = 'inline-block';\r\n                textContainer.appendChild(span);\r\n                wordsArray.push(span);\r\n            });\r\n            \r\n            let lines = [];\r\n            let currentLine = [];\r\n            let currentOffset = -1;\r\n            \r\n            \/\/ Calculamos exactamente d\u00f3nde hace el salto de l\u00ednea el navegador\r\n            wordsArray.forEach(span => {\r\n                if (currentOffset === -1 || span.offsetTop > currentOffset + 5) {\r\n                    currentOffset = span.offsetTop;\r\n                    currentLine = [];\r\n                    lines.push(currentLine);\r\n                }\r\n                currentLine.push(span.innerText.trim());\r\n            });\r\n            \r\n            textContainer.innerHTML = '';\r\n            \r\n            \/\/ Reconstruimos el texto con la animaci\u00f3n\r\n            lines.forEach((lineWords, index) => {\r\n                const lineText = lineWords.join(' ');\r\n                \r\n                const container = document.createElement('span');\r\n                container.className = 'text-line-container';\r\n                container.style.display = 'block'; \r\n                container.style.overflow = 'hidden';\r\n                \r\n                const content = document.createElement('span');\r\n                content.className = 'text-line-content';\r\n                content.textContent = lineText;\r\n                \r\n                \/\/ MAGIA AUTOM\u00c1TICA: Calculamos el retraso de cada l\u00ednea aqu\u00ed mismo\r\n                content.style.transitionDelay = `${(index + 1) * 0.15}s`;\r\n                \r\n                container.appendChild(content);\r\n                textContainer.appendChild(container);\r\n            });\r\n            \r\n            \/\/ Observamos cuando el usuario llega a esta parte de la pantalla\r\n            const observer = new IntersectionObserver((entries) => {\r\n                entries.forEach(entry => {\r\n                    if (entry.isIntersecting) {\r\n                        element.classList.add('text-animated');\r\n                        observer.unobserve(element);\r\n                    }\r\n                });\r\n            }, { threshold: 0.1 }); \/\/ Se activa cuando asoma el 10% del texto\r\n            \r\n            observer.observe(element);\r\n        });\r\n    }, 100);\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-032f5ef elementor-button-align-center elementor-widget elementor-widget-form\" data-id=\"032f5ef\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;step_next_label&quot;:&quot;Next&quot;,&quot;step_previous_label&quot;:&quot;Previous&quot;,&quot;button_width&quot;:&quot;100&quot;,&quot;step_type&quot;:&quot;number_text&quot;,&quot;step_icon_shape&quot;:&quot;circle&quot;}\" data-widget_type=\"form.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<form class=\"elementor-form\" method=\"post\" name=\"New Form\" aria-label=\"New Form\">\n\t\t\t<input type=\"hidden\" name=\"post_id\" value=\"4015\"\/>\n\t\t\t<input type=\"hidden\" name=\"form_id\" value=\"032f5ef\"\/>\n\t\t\t<input type=\"hidden\" name=\"referer_title\" value=\"Contact - V Tower\" \/>\n\n\t\t\t\t\t\t\t<input type=\"hidden\" name=\"queried_id\" value=\"4015\"\/>\n\t\t\t\n\t\t\t<div class=\"elementor-form-fields-wrapper elementor-labels-\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-text elementor-field-group elementor-column elementor-field-group-name elementor-col-100 elementor-field-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"text\" name=\"form_fields[name]\" id=\"form-field-name\" class=\"elementor-field elementor-size-sm  elementor-field-textual\" placeholder=\"Name\" required=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-email elementor-field-group elementor-column elementor-field-group-email elementor-col-100 elementor-field-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-email\" class=\"elementor-field-label elementor-screen-only\">\n\t\t\t\t\t\t\t\tEmail\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"email\" name=\"form_fields[email]\" id=\"form-field-email\" class=\"elementor-field elementor-size-sm  elementor-field-textual\" placeholder=\"Email\" required=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-message elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-message\" class=\"elementor-field-label elementor-screen-only\">\n\t\t\t\t\t\t\t\tMessage\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t<textarea class=\"elementor-field-textual elementor-field  elementor-size-sm\" name=\"form_fields[message]\" id=\"form-field-message\" rows=\"4\" placeholder=\"Mensaje\"><\/textarea>\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons\">\n\t\t\t\t\t<button class=\"elementor-button elementor-size-md elementor-animation-grow\" type=\"submit\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Send<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/button>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/form>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3d4b539 e-flex e-con-boxed e-con e-parent\" data-id=\"3d4b539\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-8587e80 e-con-full e-flex e-con e-child\" data-id=\"8587e80\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a781984 e-grid e-con-boxed e-con e-child\" data-id=\"a781984\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bc7dc50 elementor-widget elementor-widget-heading\" data-id=\"bc7dc50\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">A place of vibrant emotions<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-224b87e elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"224b87e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<section class=\"ubicacion_02\">\n<div class=\"container-bottom\">\n<div class=\"container\">\n<div class=\"row align-items-center\">\n<div class=\"col-md-7\">\n\nPuerto Morelos is a destination that invites us to flourish and reinvent ourselves, having been chosen for the second consecutive year as the best destination for adventure tourism due to its diverse attractions:\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\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>Invest in a project that embraces this emerging destination A place of vibrant emotions Puerto Morelos is a destination that invites us to flourish and reinvent ourselves, having been chosen for the second consecutive year as the best destination for adventure tourism due to its diverse attractions:<\/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-4015","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/vtower.mx\/en\/wp-json\/wp\/v2\/pages\/4015","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vtower.mx\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/vtower.mx\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/vtower.mx\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vtower.mx\/en\/wp-json\/wp\/v2\/comments?post=4015"}],"version-history":[{"count":0,"href":"https:\/\/vtower.mx\/en\/wp-json\/wp\/v2\/pages\/4015\/revisions"}],"wp:attachment":[{"href":"https:\/\/vtower.mx\/en\/wp-json\/wp\/v2\/media?parent=4015"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}