{"id":1376,"date":"2023-03-24T06:35:06","date_gmt":"2023-03-24T06:35:06","guid":{"rendered":"https:\/\/cozystay.loftocean.com\/mountain-chalet\/?page_id=8"},"modified":"2026-09-11T10:51:45","modified_gmt":"2026-09-11T13:51:45","slug":"home","status":"publish","type":"page","link":"https:\/\/termasdepanimavida.cl\/esp\/","title":{"rendered":"Inicio"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1376\" class=\"elementor elementor-1376\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7261abc6 elementor-section-height-min-height cs-section-content-fullwidth cs_scroll_y_120 cs-parallax-on-scroll elementor-section-boxed elementor-section-height-default elementor-section-items-middle\" data-id=\"7261abc6\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;slideshow&quot;,&quot;background_slideshow_gallery&quot;:[{&quot;id&quot;:1666,&quot;url&quot;:&quot;https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/DSC05244-scaled.jpg&quot;},{&quot;id&quot;:1653,&quot;url&quot;:&quot;https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/DSC05326-scaled.jpg&quot;},{&quot;id&quot;:1627,&quot;url&quot;:&quot;https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/DSC0606-scaled.jpg&quot;},{&quot;id&quot;:1673,&quot;url&quot;:&quot;https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/contacto2.jpg&quot;},{&quot;id&quot;:1674,&quot;url&quot;:&quot;https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/DSC05348-scaled.jpg&quot;},{&quot;id&quot;:1675,&quot;url&quot;:&quot;https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/header-6.jpeg&quot;},{&quot;id&quot;:1676,&quot;url&quot;:&quot;https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/DSC05324-scaled.jpg&quot;},{&quot;id&quot;:1677,&quot;url&quot;:&quot;https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/slider-1-1-2.jpg&quot;},{&quot;id&quot;:1678,&quot;url&quot;:&quot;https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/slider-1-1-3.jpg&quot;},{&quot;id&quot;:1679,&quot;url&quot;:&quot;https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/slider-1-1-4.jpg&quot;},{&quot;id&quot;:1680,&quot;url&quot;:&quot;https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/slider-1.jpg&quot;},{&quot;id&quot;:1681,&quot;url&quot;:&quot;https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/slider-2.jpg&quot;}],&quot;background_slideshow_ken_burns&quot;:&quot;yes&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,&quot;background_slideshow_ken_burns_zoom_direction&quot;:&quot;in&quot;}\" data-cs-parallax-y=\"120\">\n\t\t\t\t\t\t\t<div class=\"elementor-background-overlay\"><\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-10d21585 dark-color\" data-id=\"10d21585\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d3bf1bf elementor-widget elementor-widget-cs_title\" data-id=\"d3bf1bf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"cs_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n        <div class=\"cs-title-wrap text-center\">\t            <h1 class=\"cs-title\">\n\t                Termas de Panim\u00e1vida\t            <\/h1>\t            <div class=\"cs-title-text\">\n\t                <p>Todo lo que necesitas en un s\u00f3lo lugar.<\/p>\t            <\/div>                <div class=\"cs-title-btn\">\n                    <a class=\"button elementor-button-link\" role=\"button\" href=\"https:\/\/termasdepanimavida.cl\/esp\/promociones\/\">\n                        <span class=\"cs-btn-text\">Promociones<\/span>                    <\/a>\n                <\/div>\n                    <\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-12cec814 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"12cec814\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3a58b8a4\" data-id=\"3a58b8a4\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3458846 elementor-widget elementor-widget-shortcode\" data-id=\"3458846\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><!-- RT noches-minimas build: nm-v12-center-2026-08-04 -->\n<form method=\"POST\" action=\"https:\/\/termasdepanimavida.cl\/esp\/esp\/reserva-paso-2\/\" class=\"rt-step1-form-anim\" data-rt-modo=\"estadia\">\n\n<!-- \ud83c\udf6f Honeypot anti-spam: campo trampa invisible para humanos.\n     Un cliente real nunca lo ve ni lo rellena; los bots autom\u00e1ticos s\u00ed.\n     Si llega con contenido, el lead se marca como sospechoso en el panel.\n     NO usar display:none (algunos bots lo detectan): se saca de pantalla. -->\n<div aria-hidden=\"true\" style=\"position:absolute; left:-9999px; top:-9999px; width:1px; height:1px; overflow:hidden;\">\n    <label>No completar este campo<\/label>\n    <input type=\"text\" name=\"rt_web_extra\" id=\"rt_web_extra\" value=\"\" tabindex=\"-1\" autocomplete=\"off\">\n<\/div>\n\n<div class=\"rt-form-wrapper\">\n\n<div class=\"rt-form\" data-noches-min=\"[{&quot;id&quot;:&quot;nm_1785940289_512&quot;,&quot;etiqueta&quot;:&quot;Halloween&quot;,&quot;desde&quot;:&quot;2026-10-29&quot;,&quot;hasta&quot;:&quot;2026-11-01&quot;,&quot;min&quot;:2,&quot;salida&quot;:true},{&quot;id&quot;:&quot;nm_1788885319_764&quot;,&quot;etiqueta&quot;:&quot;2 Noches Octubre&quot;,&quot;desde&quot;:&quot;2026-10-09&quot;,&quot;hasta&quot;:&quot;2026-10-11&quot;,&quot;min&quot;:2,&quot;salida&quot;:true}]\">\n\n<!-- \ud83d\udecf\ufe0f Aviso de plazas (dentro del flex de campos, forzado a ancho completo arriba) -->\n<div id=\"rt-aviso-plazas\" class=\"rt-aviso-plazas\" style=\"display:none;\"><\/div>\n\n    <div class=\"rt-field\">\n        <label><b>Tipo<\/b><\/label>\n        <select name=\"tipo\" id=\"tipo\">\n            <option value=\"estadia\">Estadia<\/option>\n            <option value=\"dia\">Por el dia<\/option>\n        <\/select>\n    <\/div>\n    <div class=\"rt-field\" style=\"position:relative;\">\n        <label id=\"label-checkin\"><b>Fecha Ingreso<\/b><\/label>\n        <span class=\"rt-nm-input-wrap\" style=\"position:relative; display:block;\">\n            <input type=\"date\" name=\"checkin\" id=\"checkin\">\n            <div id=\"rt-nm-popover\" class=\"rt-nm-popover\" style=\"display:none;\"><\/div>\n        <\/span>\n        <span id=\"rt-email-info\" style=\"display:none; max-width:100%; display:block; margin-top:4px; min-height:30px; line-height:1.3;\">\n            <span style=\"font-size:12px; color:#00b5ad; font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; display:block;\"><span id=\"rt-email-registrado\"><\/span><\/span>\n            <a href=\"#\" id=\"rt-cambiar-email\" style=\"font-size:10px; color:#aaa; text-decoration:none; margin-top:-2px; display:none;\">&#9998; Cambiar<\/a>\n        <\/span>\n    <\/div>\n    <div class=\"rt-field\" id=\"campo-dinamico\">\n        <label id=\"label-dinamico\"><b>Fecha Salida<\/b><\/label>\n        <input type=\"date\" name=\"checkout\" id=\"checkout\">\n        <span id=\"rt-nm-linea\" style=\"display:block; margin-top:4px; white-space:nowrap;\">\n            <span id=\"rt-noches-info\" style=\"display:none; font-size:12px; color:#0073aa; font-weight:600; min-height:16px; line-height:1.3;\"><\/span>\n            <span id=\"rt-nm-error\" class=\"rt-nm-error\" style=\"display:none;\"><\/span>\n        <\/span>\n        <div id=\"rt-nm-aviso-link\" style=\"display:none; font-size:12px; color:#8a8a8a; margin-top:5px; white-space:nowrap;\">\u00bfMuchas noches? <a href=\"#\" id=\"rt-nm-aviso-a\" style=\"color:#5a6a7d; text-decoration:underline; cursor:pointer;\">Av\u00edsame cuando baje la restricci\u00f3n<\/a><\/div>\n        <select name=\"servicio\" id=\"servicio\" style=\"display:none;\">\n            <option value=\"\">Seleccionar Servicio<\/option>\n                            <option value=\"17658\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-28&quot;,&quot;2026-06-27&quot;,&quot;2026-07-03&quot;,&quot;2026-07-04&quot;,&quot;2026-07-25&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Piscina + Cena Buffet                <\/option>\n                            <option value=\"16907\"\n                        data-nino-activo=\"0\"\n                        data-infante-activo=\"0\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[]\"\n                        data-meses-cerrados=\"[]\">\n                    Drenaje Linf\u00e1tico + Mascarilla Facial                <\/option>\n                            <option value=\"16902\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-27&quot;,&quot;2026-06-28&quot;,&quot;2026-07-03&quot;,&quot;2026-07-04&quot;,&quot;2026-07-25&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Piscina + Almuerzo Buffet + Cena Buffet                <\/option>\n                            <option value=\"16892\"\n                        data-nino-activo=\"0\"\n                        data-infante-activo=\"0\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[]\"\n                        data-meses-cerrados=\"[]\">\n                    Biomagnetismo + Mascarilla Facial                <\/option>\n                            <option value=\"16891\"\n                        data-nino-activo=\"0\"\n                        data-infante-activo=\"0\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[]\"\n                        data-meses-cerrados=\"[]\">\n                    Masaje Cuerpo Entero + Mascarilla Facial                <\/option>\n                            <option value=\"16890\"\n                        data-nino-activo=\"0\"\n                        data-infante-activo=\"0\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[]\"\n                        data-meses-cerrados=\"[]\">\n                    Masaje Piedras Calientes + Mascarilla Facial                <\/option>\n                            <option value=\"16889\"\n                        data-nino-activo=\"0\"\n                        data-infante-activo=\"0\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-27&quot;,&quot;2026-06-28&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Promoci\u00f3n d\u00eda de SPA (Promoci\u00f3n 4)                <\/option>\n                            <option value=\"16888\"\n                        data-nino-activo=\"0\"\n                        data-infante-activo=\"0\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-27&quot;,&quot;2026-06-28&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Promoci\u00f3n d\u00eda de SPA (Promoci\u00f3n 3)                <\/option>\n                            <option value=\"16886\"\n                        data-nino-activo=\"0\"\n                        data-infante-activo=\"0\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-27&quot;,&quot;2026-06-28&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Promoci\u00f3n d\u00eda de SPA (Promoci\u00f3n 2)                <\/option>\n                            <option value=\"16885\"\n                        data-nino-activo=\"0\"\n                        data-infante-activo=\"0\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-27&quot;,&quot;2026-06-28&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Promoci\u00f3n d\u00eda de SPA (Promoci\u00f3n 1)                <\/option>\n                            <option value=\"15387\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[]\"\n                        data-meses-cerrados=\"[]\">\n                    Desayuno Buffet                <\/option>\n                            <option value=\"15386\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-27&quot;,&quot;2026-06-28&quot;,&quot;2026-07-03&quot;,&quot;2026-07-04&quot;,&quot;2026-07-25&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Almuerzo Buffet                <\/option>\n                            <option value=\"15384\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[]\"\n                        data-meses-cerrados=\"[]\">\n                    Once Panim\u00e1vida                <\/option>\n                            <option value=\"15383\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[]\"\n                        data-meses-cerrados=\"[]\">\n                    Cena Buffet                <\/option>\n                            <option value=\"15382\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-28&quot;,&quot;2026-07-03&quot;,&quot;2026-07-04&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Piscinas D\u00eda Completo                <\/option>\n                            <option value=\"15381\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-28&quot;,&quot;2026-07-03&quot;,&quot;2026-07-04&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Piscina Medio D\u00eda                <\/option>\n                            <option value=\"15380\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-07-04&quot;,&quot;2026-07-05&quot;,&quot;2026-07-11&quot;,&quot;2026-07-12&quot;,&quot;2026-07-18&quot;,&quot;2026-07-19&quot;,&quot;2026-07-25&quot;,&quot;2026-07-26&quot;,&quot;2026-08-01&quot;,&quot;2026-08-02&quot;,&quot;2026-08-08&quot;,&quot;2026-08-09&quot;,&quot;2026-08-15&quot;,&quot;2026-08-16&quot;,&quot;2026-08-22&quot;,&quot;2026-08-23&quot;,&quot;2026-08-29&quot;,&quot;2026-08-30&quot;,&quot;2026-09-13&quot;,&quot;2026-09-06&quot;,&quot;2026-09-05&quot;,&quot;2026-09-12&quot;,&quot;2026-09-19&quot;,&quot;2026-09-26&quot;,&quot;2026-09-20&quot;,&quot;2026-09-27&quot;,&quot;2026-10-03&quot;,&quot;2026-10-04&quot;,&quot;2026-10-10&quot;,&quot;2026-10-11&quot;,&quot;2026-10-17&quot;,&quot;2026-10-25&quot;,&quot;2026-10-24&quot;,&quot;2026-10-31&quot;,&quot;2026-11-01&quot;,&quot;2026-11-07&quot;,&quot;2026-11-08&quot;,&quot;2026-11-15&quot;,&quot;2026-11-14&quot;,&quot;2026-11-22&quot;,&quot;2026-11-21&quot;,&quot;2026-11-28&quot;,&quot;2026-12-12&quot;,&quot;2026-11-29&quot;,&quot;2026-12-13&quot;,&quot;2026-12-19&quot;,&quot;2026-12-06&quot;,&quot;2026-12-05&quot;,&quot;2026-12-27&quot;,&quot;2026-12-20&quot;,&quot;2026-12-26&quot;,&quot;2026-09-18&quot;,&quot;2026-07-03&quot;,&quot;2026-10-18&quot;,&quot;2026-09-17&quot;,&quot;2026-10-30&quot;]\"\n                        data-meses-cerrados=\"[&quot;2026-06&quot;]\">\n                    Piscina Media Tarde                <\/option>\n                            <option value=\"15379\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-28&quot;,&quot;2026-06-27&quot;,&quot;2026-07-03&quot;,&quot;2026-07-04&quot;,&quot;2026-07-25&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Piscina + Almuerzo Buffet                <\/option>\n                            <option value=\"15378\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-27&quot;,&quot;2026-06-28&quot;,&quot;2026-07-03&quot;,&quot;2026-07-04&quot;,&quot;2026-07-25&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Piscina + Desayuno Buffet + Almuerzo buffet                <\/option>\n                            <option value=\"15377\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-27&quot;,&quot;2026-06-28&quot;,&quot;2026-07-03&quot;,&quot;2026-07-04&quot;,&quot;2026-07-25&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Piscina + Almuerzo Buffet + Once Panim\u00e1vida                <\/option>\n                            <option value=\"15376\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-27&quot;,&quot;2026-06-28&quot;,&quot;2026-07-03&quot;,&quot;2026-07-04&quot;,&quot;2026-07-25&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Piscina + Desayuno Buffet + Almuerzo Buffet + Once Panim\u00e1vida                <\/option>\n                            <option value=\"15375\"\n                        data-nino-activo=\"1\"\n                        data-infante-activo=\"1\"\n                        data-dias=\"1,2,3,4,5,6,0\"\n                        data-rangos=\"[]\"\n                        data-usar-ventana=\"1\"\n                        data-temporada=\"todas\"\n                        data-switch-maestro=\"1\"\n                        data-dias-cerrados=\"[&quot;2026-06-28&quot;,&quot;2026-08-29&quot;]\"\n                        data-meses-cerrados=\"[]\">\n                    Piscina 1\/2 d\u00eda + Once Panim\u00e1vida                <\/option>\n                    <\/select>\n        <div id=\"modal-precios\" class=\"rt-modal\">\n            <div class=\"rt-modal-content\">\n                <h3 id=\"modal-titulo\"><\/h3>\n                <div id=\"modal-body\"><\/div>\n                <div class=\"rt-modal-actions\">\n                    <button type=\"button\" id=\"cancelar-servicio\" class=\"rt-btn-cancelar\">Cancelar<\/button>\n                    <button type=\"button\" id=\"aceptar-servicio\" class=\"rt-btn-aceptar\">Aceptar<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n    <div class=\"rt-field small rt-pax-clasico\">\n        <label><b>Adultos<\/b><span class=\"rt-rango-edad\" id=\"rt-rango-adultos\">Desde 10 a&ntilde;os<\/span><\/label>\n        <select name=\"adultos\" id=\"adultos\">\n                            <option value=\"1\" >1<\/option>\n                            <option value=\"2\" selected>2<\/option>\n                            <option value=\"3\" >3<\/option>\n                            <option value=\"4\" >4<\/option>\n                            <option value=\"5\" >5<\/option>\n                            <option value=\"6\" >6<\/option>\n                            <option value=\"7\" >7<\/option>\n                            <option value=\"8\" >8<\/option>\n                            <option value=\"9\" >9<\/option>\n                            <option value=\"10\" >10<\/option>\n                    <\/select>\n        <span id=\"rt-subtotal-adultos\" class=\"rt-subtotal\"><\/span>\n    <\/div>\n    <div class=\"rt-field small rt-pax-clasico\">\n        <label><b>Ni&ntilde;os<\/b><span class=\"rt-rango-edad\">De 5 a 9 a&ntilde;os<\/span><\/label>\n        <select name=\"ninos\" id=\"ninos\">\n                            <option value=\"0\">0<\/option>\n                            <option value=\"1\">1<\/option>\n                            <option value=\"2\">2<\/option>\n                            <option value=\"3\">3<\/option>\n                            <option value=\"4\">4<\/option>\n                            <option value=\"5\">5<\/option>\n                            <option value=\"6\">6<\/option>\n                            <option value=\"7\">7<\/option>\n                            <option value=\"8\">8<\/option>\n                            <option value=\"9\">9<\/option>\n                            <option value=\"10\">10<\/option>\n                    <\/select>\n        <span id=\"rt-subtotal-ninos\" class=\"rt-subtotal\"><\/span>\n    <\/div>\n    <!-- Contador Adolescentes: solo visible en fechas especiales con tarifa de adolescente. -->\n    <div class=\"rt-field small\" id=\"rt-field-adolescentes\" style=\"display:none;\">\n        <label><b>Adolesc.<\/b><span class=\"rt-rango-edad\">De 10 a 17 a&ntilde;os<\/span><\/label>\n        <select name=\"adolescentes\" id=\"adolescentes\">\n                            <option value=\"0\">0<\/option>\n                            <option value=\"1\">1<\/option>\n                            <option value=\"2\">2<\/option>\n                            <option value=\"3\">3<\/option>\n                            <option value=\"4\">4<\/option>\n                            <option value=\"5\">5<\/option>\n                            <option value=\"6\">6<\/option>\n                            <option value=\"7\">7<\/option>\n                            <option value=\"8\">8<\/option>\n                            <option value=\"9\">9<\/option>\n                            <option value=\"10\">10<\/option>\n                    <\/select>\n        <span id=\"rt-subtotal-adolescentes\" class=\"rt-subtotal\"><\/span>\n    <\/div>\n    <div class=\"rt-field small rt-pax-clasico\">\n        <label><b>Infantes<\/b><span class=\"rt-rango-edad\">De 0 a 4 a&ntilde;os<\/span><\/label>\n        <select name=\"infantes\" id=\"infantes\">\n                            <option value=\"0\">0<\/option>\n                            <option value=\"1\">1<\/option>\n                            <option value=\"2\">2<\/option>\n                            <option value=\"3\">3<\/option>\n                            <option value=\"4\">4<\/option>\n                            <option value=\"5\">5<\/option>\n                            <option value=\"6\">6<\/option>\n                            <option value=\"7\">7<\/option>\n                            <option value=\"8\">8<\/option>\n                            <option value=\"9\">9<\/option>\n                            <option value=\"10\">10<\/option>\n                    <\/select>\n        <span id=\"rt-subtotal-infantes\" class=\"rt-subtotal\"><\/span>\n    <\/div>\n\n    <!-- \ud83d\udc36 NUEVO: Campo Mascotas -->\n    <div class=\"rt-field small rt-pax-clasico\" id=\"rt-field-mascotas\">\n        <label><b>Mascotas<\/b><span class=\"rt-rango-edad\">1 hasta 15 kg<\/span><\/label>\n        <select name=\"mascotas\" id=\"mascotas\">\n            <option value=\"0\" selected>0<\/option>\n            <option value=\"1\">1<\/option>\n            <option value=\"2\">2<\/option>\n        <\/select>\n        <span id=\"rt-subtotal-mascotas\" class=\"rt-subtotal\"><\/span>\n    <\/div>\n\n    <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 \ud83c\udfe8 NUEVO: Campo Hu\u00e9spedes multi-habitaci\u00f3n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n         Solo visible en ESTAD\u00cdA. Reemplaza visualmente a los 4 campos\n         cl\u00e1sicos (adultos\/ni\u00f1os\/infantes\/mascotas), que se ocultan en\n         estad\u00eda v\u00eda JS. En \"por el d\u00eda\" este campo se oculta y vuelven\n         los cl\u00e1sicos. Sincroniza sus valores a los selects cl\u00e1sicos\n         (habitaci\u00f3n 1) para no romper script.js ni el submit. -->\n    <div class=\"rt-field rt-field-huespedes\" id=\"rt-field-huespedes\" style=\"position:relative;\">\n        <label><b>Hu\u00e9spedes<\/b><span class=\"rt-rango-edad\">Habitaciones y personas<\/span><\/label>\n        <div class=\"rt-guest-trigger\" id=\"rt-guest-trigger\">\n            <span class=\"rt-guest-icon\">\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#0073aa\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"\/><circle cx=\"9\" cy=\"7\" r=\"4\"\/><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"\/><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"\/><\/svg>\n            <\/span>\n            <span class=\"rt-guest-summary\" id=\"rt-guest-summary\">2 Adultos, 1 Habitaci\u00f3n<\/span>\n            <span class=\"rt-guest-chevron\" id=\"rt-guest-chevron\">\u25bc<\/span>\n        <\/div>\n        <div class=\"rt-guest-dropdown\" id=\"rt-guest-dropdown\">\n            <div class=\"rt-guest-banner-fijo\" id=\"rt-guest-banner-dd\"><\/div>\n            <div class=\"rt-guest-dd-body\" id=\"rt-guest-dd-body\"><\/div>\n            <div class=\"rt-guest-dd-footer\">\n                <button type=\"button\" class=\"rt-guest-btn-add\" id=\"rt-guest-btn-add\">\n                    <span class=\"rt-guest-plus\">+<\/span> A\u00f1adir habitaci\u00f3n\n                <\/button>\n                <button type=\"button\" class=\"rt-guest-btn-listo\" id=\"rt-guest-btn-listo\">LISTO<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"rt-field rt-total-box\" style=\"display:none;\">\n        <label><b>Total<\/b><\/label>\n        <div id=\"rt-total-general\" class=\"rt-total-valor\"><\/div>\n    <\/div>\n    <div class=\"rt-actions rt-field\">\n        <label aria-hidden=\"true\" style=\"visibility:hidden;\"><b>&nbsp;<\/b><\/label>\n        <div class=\"rt-actions-inner\">\n            <!-- Bot\u00f3n Step 1: siempre \"Siguiente\". El modo se elige en un modal posterior. -->\n            <button type=\"button\" data-tipo=\"reserva\" class=\"rt-btn reservar\">Siguiente<\/button>\n        <\/div>\n    <\/div>\n<\/div>\n\n<\/div>\n\n<\/form>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 \ud83c\udfe8 BOTTOM SHEET M\u00d3VIL: Hu\u00e9spedes multi \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<div id=\"rt-guest-sheet-mask\" class=\"rt-guest-sheet-mask\">\n    <div class=\"rt-guest-sheet\" onclick=\"event.stopPropagation()\">\n        <div class=\"rt-guest-sheet-head\">\n            <div class=\"rt-guest-sheet-title\">Hu\u00e9spedes y habitaciones<\/div>\n            <button type=\"button\" class=\"rt-guest-sheet-close\" id=\"rt-guest-sheet-close\">&times;<\/button>\n        <\/div>\n        <div class=\"rt-guest-banner-fijo\" id=\"rt-guest-banner-sheet\"><\/div>\n        <div class=\"rt-guest-sheet-body\" id=\"rt-guest-sheet-body\"><\/div>\n        <div class=\"rt-guest-sheet-footer\">\n            <button type=\"button\" class=\"rt-guest-btn-add\" id=\"rt-guest-btn-add-mobile\">\n                <span class=\"rt-guest-plus\">+<\/span> A\u00f1adir habitaci\u00f3n\n            <\/button>\n            <button type=\"button\" class=\"rt-guest-btn-listo\" id=\"rt-guest-btn-listo-mobile\">LISTO<\/button>\n        <\/div>\n    <\/div>\n<\/div>\n\n<!-- \ud83d\udc36 NUEVO: Modal informativo para mascotas (al elegir 2) -->\n<!-- Modal: pedir aviso cuando baje la restricci\u00f3n de noches -->\n<div id=\"rt-modal-aviso\" style=\"display:none; position:fixed; inset:0; z-index:2147483646;\">\n    <div id=\"rt-modal-aviso-ov\" style=\"position:absolute; inset:0; background:rgba(0,0,0,.45);\"><\/div>\n    <div style=\"position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); background:#fff; border-radius:12px; padding:24px 26px; max-width:360px; width:calc(100% - 40px); box-shadow:0 10px 40px rgba(0,0,0,.25);\">\n        <button type=\"button\" id=\"rt-modal-aviso-x\" aria-label=\"Cerrar\" style=\"position:absolute; top:10px; right:14px; background:none; border:none; font-size:22px; color:#999; cursor:pointer; line-height:1;\">&times;<\/button>\n        <div style=\"font-size:16px; font-weight:700; color:#1f3a5f; margin-bottom:6px;\">Te avisamos cuando puedas reservar<\/div>\n        <p id=\"rt-aviso-intro\" style=\"font-size:12.5px; color:#5a6a7d; line-height:1.5; margin:0 0 16px;\">D\u00e9janos tus datos y te escribiremos apenas la estad\u00eda m\u00ednima para estas fechas se reduzca.<\/p>\n\n        <div id=\"rt-aviso-form\">\n            <label style=\"font-size:12px; color:#555; display:block; margin-bottom:3px;\">Nombre<\/label>\n            <input type=\"text\" id=\"rt-aviso-nombre\" placeholder=\"Tu nombre\" style=\"width:100%; padding:9px; margin-bottom:10px; border:1px solid #ccc; border-radius:7px; box-sizing:border-box;\">\n\n            <label style=\"font-size:12px; color:#555; display:block; margin-bottom:3px;\">Correo<\/label>\n            <input type=\"email\" id=\"rt-aviso-email\" placeholder=\"tucorreo@ejemplo.cl\" style=\"width:100%; padding:9px; margin-bottom:6px; border:1px solid #ccc; border-radius:7px; box-sizing:border-box;\">\n\n            <div id=\"rt-aviso-error\" style=\"display:none; font-size:12px; color:#b32d2e; margin-bottom:8px;\"><\/div>\n\n            <button type=\"button\" id=\"rt-aviso-enviar\" style=\"width:100%; background:#2f80ed; color:#fff; border:none; padding:11px; border-radius:8px; font-size:14px; font-weight:600; cursor:pointer; margin-top:6px;\">Av\u00edsenme<\/button>\n        <\/div>\n\n        <div id=\"rt-aviso-ok\" style=\"display:none; text-align:center; padding:8px 0 2px;\">\n            <div style=\"font-size:34px;\">\u2705<\/div>\n            <div style=\"font-size:15px; font-weight:700; color:#1f3a5f; margin:4px 0 4px;\">\u00a1Listo!<\/div>\n            <div style=\"font-size:12.5px; color:#5a6a7d; line-height:1.5;\">Te enviaremos un correo apenas la restricci\u00f3n de noches para estas fechas se reduzca.<\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div id=\"rt-modal-mascotas\" class=\"rt-modal-mascotas\" style=\"display:none;\">\n    <div class=\"rt-modal-mascotas-overlay\"><\/div>\n    <div class=\"rt-modal-mascotas-content\">\n        <button type=\"button\" class=\"rt-modal-mascotas-close\" aria-label=\"Cerrar\">&times;<\/button>\n        <div class=\"rt-modal-mascotas-icon\">\ud83d\udc36<\/div>\n        <h3 class=\"rt-modal-mascotas-titulo\">Solo se permite 1 mascota<\/h3>\n        <p class=\"rt-modal-mascotas-texto\">\n            Por motivos de comodidad y seguridad de todos nuestros hu\u00e9spedes, en cada reserva\n            se permite <b>\u00fanicamente 1 mascota peque\u00f1a de hasta 15 kg<\/b>.\n        <\/p>\n                        <div class=\"rt-modal-mascotas-actions\">\n            <button type=\"button\" class=\"rt-modal-mascotas-volver\">Volver<\/button>\n        <\/div>\n    <\/div>\n<\/div>\n\n<style>\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   \ud83c\udfe8 SELECTOR MULTI-HABITACI\u00d3N: Dropdown + Bottom Sheet\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\n\/* En estad\u00eda, los campos cl\u00e1sicos se ocultan con !important para\n   ganarle a cualquier $('#mascotas').show() de script.js.\n   El toggle se hace v\u00eda atributo data-rt-modo en el form. *\/\nform[data-rt-modo=\"estadia\"] .rt-pax-clasico{ display:none !important; }\nform[data-rt-modo=\"estadia\"] #rt-field-huespedes{ display:flex !important; }\nform[data-rt-modo=\"dia\"] #rt-field-huespedes{ display:none !important; }\n\n.rt-field-huespedes{ flex: 4 1 auto !important; min-width: 320px !important; max-width: none !important; }\n.rt-guest-trigger{\n    display:flex; align-items:center; gap:8px;\n    width:100%; height:52px; padding:0 12px;\n    background:var(--rt-c-bg); border:1.5px solid var(--rt-c-border);\n    border-radius:var(--rt-radius); color:var(--rt-c-text);\n    font-size:14px; font-weight:500; cursor:pointer;\n    box-shadow:0 2px 6px rgba(0,0,0,0.08);\n    transition:border-color .15s, box-shadow .15s; box-sizing:border-box;\n}\n.rt-guest-trigger:hover{ border-color:var(--rt-c-border-hover); box-shadow:0 3px 8px rgba(0,0,0,0.10); }\n.rt-guest-trigger.active{ border-color:var(--rt-c-focus); box-shadow:0 0 0 4px var(--rt-c-focus-ring); }\n.rt-guest-icon{ flex-shrink:0; display:flex; align-items:center; pointer-events:none; }\n.rt-guest-icon *{ pointer-events:none; }\n.rt-guest-summary{ flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; pointer-events:none; }\n.rt-guest-chevron{ font-size:10px; color:#6b7785; flex-shrink:0; transition:transform .2s; pointer-events:none; }\n.rt-guest-trigger.active .rt-guest-chevron{ transform:rotate(180deg); color:var(--rt-c-focus); }\n\n.rt-guest-dropdown{\n    position:fixed; top:0; left:0;\n    width:380px; overflow:hidden;\n    background:#fff; border:1.5px solid var(--rt-c-border, #d0c8b8);\n    border-radius:var(--rt-radius, 8px);\n    box-shadow:0 8px 32px rgba(0,0,0,.12), 0 2px 8px rgba(0,0,0,.08);\n    z-index:2147483646; display:none;\n}\n.rt-guest-dropdown.open{ display:flex; flex-direction:column; transform-origin:top center; animation:rtDdUnfold .24s cubic-bezier(0.16, 1, 0.3, 1); }\n@keyframes rtDdUnfold{\n    from{ opacity:0; transform:scaleY(0.85) translateY(-8px); }\n    to{ opacity:1; transform:scaleY(1) translateY(0); }\n}\n.rt-guest-dd-body{ padding:16px 18px; overflow-y:auto; -webkit-overflow-scrolling:touch; flex:1 1 auto; min-height:0; max-height:560px; }\n.rt-guest-banner-fijo{\n    padding:12px 18px; flex-shrink:0;\n    background:#f9fbfd; border-bottom:1px solid #e4e0d8;\n}\n.rt-guest-banner-fijo .rt-guest-total-banner{\n    margin-bottom:0; background:transparent; padding:0;\n}\n.rt-guest-dd-footer{\n    display:flex; justify-content:space-between; align-items:center;\n    padding:12px 18px; border-top:1px solid #e4e0d8;\n    background:#f9fbfd; border-radius:0 0 var(--rt-radius) var(--rt-radius);\n    flex-shrink:0;\n}\n@media(max-width:768px){ .rt-guest-dropdown{ display:none !important; } }\n\n.rt-guest-sheet-mask{\n    position:fixed; inset:0; background:rgba(0,0,0,.5);\n    display:none; z-index:2147483647; \/* m\u00e1ximo, sobre botones flotantes del sitio *\/\n    align-items:flex-end; justify-content:center;\n    touch-action:auto; \/* restaura gestos dentro del mask cuando body tiene touch-action:none *\/\n}\n.rt-guest-sheet-mask.open{ display:flex; align-items:flex-end; padding-bottom:90px; }\n\n\/* En pantallas muy bajas, reducir el margen para no cortar el sheet *\/\n@media(max-height:640px){\n    .rt-guest-sheet-mask.open{ padding-bottom:70px; }\n}\n\n\/* Al abrir el sheet en m\u00f3vil, ocultar botones flotantes del sitio\n   (chat de ayuda, bot\u00f3n c\u00e1mara\/auto de Elementor, etc.) que quedar\u00edan\n   encima del footer del sheet. Selectores amplios de widgets comunes. *\/\nbody.rt-guest-sheet-abierto .elementor-location-popup,\nbody.rt-guest-sheet-abierto [class*=\"floating\"],\nbody.rt-guest-sheet-abierto [class*=\"whatsapp\"],\nbody.rt-guest-sheet-abierto [id*=\"chat\"],\nbody.rt-guest-sheet-abierto .rt-fab,\nbody.rt-guest-sheet-abierto [class*=\"e-floating-buttons\"]{\n    display:none !important;\n}\n.rt-guest-sheet{\n    background:#fff; width:calc(100% - 24px); max-width:420px;\n    border-radius:16px 16px 0 0; max-height:85vh;\n    display:flex; flex-direction:column; animation:rtSheetUp .22s ease-out;\n    padding-bottom:env(safe-area-inset-bottom, 0px);\n}\n@keyframes rtSheetUp{ from{transform:translateY(20px);opacity:0} to{transform:translateY(0);opacity:1} }\n.rt-guest-sheet-head{\n    display:flex; justify-content:space-between; align-items:center;\n    padding:16px 18px; border-bottom:1px solid #e4e0d8;\n    position:sticky; top:0; background:#fff; z-index:1;\n}\n.rt-guest-sheet-title{ font-size:16px; font-weight:600; color:#2c3e50; }\n.rt-guest-sheet-close{ background:transparent; border:none; font-size:22px; color:#999; cursor:pointer; line-height:1; padding:4px 8px; }\n.rt-guest-sheet-body{ padding:16px 18px; flex:1 1 auto; min-height:0; overflow-y:auto; -webkit-overflow-scrolling:touch; overscroll-behavior:contain; touch-action:pan-y; }\n.rt-guest-sheet-footer{\n    padding:14px 18px calc(14px + env(safe-area-inset-bottom, 0px)); border-top:1px solid #e4e0d8;\n    background:#f9fbfd; position:sticky; bottom:0;\n    display:flex; justify-content:space-between; align-items:center;\n    z-index:2;\n}\n\n.rt-guest-room{ margin-bottom:0; padding-top:2px; }\n\/* Animaci\u00f3n de aparici\u00f3n de habitaci\u00f3n nueva (efecto alargue m\u00e1s visual) *\/\n@keyframes rtRoomIn{\n    0%{   opacity:0; transform:translateY(-14px) scale(0.97); max-height:0; }\n    100%{ opacity:1; transform:translateY(0) scale(1); max-height:700px; }\n}\n@keyframes rtRoomHighlight{\n    0%{   background:rgba(74,103,65,0.12); }\n    100%{ background:transparent; }\n}\n.rt-guest-room.rt-room-nueva{\n    animation:rtRoomIn .28s cubic-bezier(0.16, 1, 0.3, 1), rtRoomHighlight .9s ease-out;\n    overflow:hidden;\n}\n\/* Peque\u00f1o \"pop\" del badge de la habitaci\u00f3n nueva *\/\n@keyframes rtBadgePop{\n    0%{   transform:scale(0.4); opacity:0; }\n    60%{  transform:scale(1.15); opacity:1; }\n    100%{ transform:scale(1); }\n}\n.rt-guest-room.rt-room-nueva .rt-guest-room-badge{\n    animation:rtBadgePop .45s cubic-bezier(0.34, 1.56, 0.64, 1) .08s both;\n}\n\/* Separador grueso entre habitaciones (opci\u00f3n D) *\/\n.rt-guest-room + .rt-guest-room{ border-top:5px solid #ece7dd; margin-top:6px; padding-top:12px; }\n.rt-guest-room-head{\n    display:flex; justify-content:space-between; align-items:center;\n    margin-bottom:8px; padding-bottom:6px; border-bottom:1px solid #e4e0d8;\n}\n.rt-guest-room-title-wrap{ display:flex; align-items:center; gap:8px; }\n.rt-guest-room-badge{\n    width:22px; height:22px; border-radius:50%;\n    background:#4a6741; color:#fff;\n    display:flex; align-items:center; justify-content:center;\n    font-size:12px; font-weight:700; flex-shrink:0;\n}\n.rt-guest-room-title{ font-size:14px; font-weight:600; color:#2c3e50; }\n.rt-guest-room-remove{ background:none; border:none; font-size:12px; color:#b84a3a; cursor:pointer; font-weight:500; padding:2px 6px; }\n.rt-guest-room-remove:hover{ text-decoration:underline; }\n.rt-guest-pax-row{ display:flex; justify-content:space-between; align-items:center; padding:8px 0; }\n.rt-guest-pax-row + .rt-guest-pax-row{ border-top:1px dashed #e4e0d8; }\n.rt-guest-pax-main{ display:flex; flex-direction:column; }\n.rt-guest-pax-label{ font-size:13.5px; color:#2c3e50; }\n.rt-guest-pax-sub{ font-size:10.5px; color:#8a8680; margin-top:1px; }\n.rt-guest-stepper{ display:inline-flex; align-items:center; border:1.5px solid #d0c8b8; border-radius:999px; background:#fff; overflow:hidden; }\n.rt-guest-stepper button{ width:32px; height:32px; border:none; background:transparent; font-size:17px; color:#3a3a3a; cursor:pointer; font-weight:500; transition:background .12s, color .12s; line-height:1; }\n.rt-guest-stepper button:active{ background:#eaf0e8; }\n\/* \ud83d\uded1 Bot\u00f3n +\/\u2212 al tope: gris, sin hover activo, pero SIGUE clickeable\n   para poder disparar el toast educativo. *\/\n.rt-guest-stepper button.at-max,\n.rt-guest-stepper button.at-min{\n    color:#c8c2b6; cursor:not-allowed;\n}\n.rt-guest-stepper button.at-max:active,\n.rt-guest-stepper button.at-min:active{ background:transparent; }\n\/* \ud83d\udca1 Microhint bajo el header de la habitaci\u00f3n (solo cerca del l\u00edmite) *\/\n.rt-guest-room-hint{\n    font-size:11px; color:#8a8680; margin:-2px 0 6px; padding:4px 8px;\n    background:#f7f5f0; border-radius:6px; display:inline-block;\n}\n.rt-guest-room-hint.at-max{\n    color:#b26a1a; background:#fff4e5;\n    font-weight:500;\n}\n\/* \ud83d\uddd3\ufe0f Flash de atenci\u00f3n cuando el usuario intenta abrir hu\u00e9spedes sin fechas.\n   Pulso naranja de 2s en el campo de fecha faltante. *\/\n.rt-flash-required{\n    animation: rtFlashRequired 0.6s ease-in-out 3;\n    border-color:#f57c00 !important;\n    box-shadow:0 0 0 3px rgba(245,124,0,.15) !important;\n}\n@keyframes rtFlashRequired{\n    0%,100%{ background-color: inherit; }\n    50%{ background-color: #fff4e5; }\n}\n\/* \u23f3 Preloader sutil en el trigger de hu\u00e9spedes mientras se cargan los caps\n   por fecha (max 400ms). A\u00f1ade un pulso al borde para dar feedback sin\n   sentir \"bloqueado\". *\/\n.rt-guest-trigger.rt-guest-loading{\n    animation: rtTriggerPulse 0.9s ease-in-out infinite;\n    cursor: wait;\n}\n@keyframes rtTriggerPulse{\n    0%,100%{ box-shadow:0 0 0 0 rgba(74,103,65,.15); }\n    50%{     box-shadow:0 0 0 6px rgba(74,103,65,.08); }\n}\n.rt-guest-val{ min-width:28px; text-align:center; font-variant-numeric:tabular-nums; font-weight:600; font-size:14px; }\n@media(max-width:768px){\n    .rt-guest-stepper button{ width:40px; height:40px; font-size:22px; }\n    .rt-guest-val{ min-width:34px; font-size:16px; }\n    .rt-guest-pax-label{ font-size:15px; }\n    .rt-guest-pax-sub{ font-size:11.5px; }\n}\n.rt-guest-btn-add{ display:flex; align-items:center; gap:6px; background:none; border:none; font-size:13px; color:#0073aa; font-weight:600; cursor:pointer; padding:6px 0; }\n.rt-guest-btn-add:hover{ text-decoration:underline; }\n.rt-guest-plus{ width:22px; height:22px; border-radius:50%; border:1.5px solid #0073aa; display:flex; align-items:center; justify-content:center; font-size:15px; line-height:1; }\n.rt-guest-btn-listo{\n    padding:8px 20px; border:none;\n    background:linear-gradient(135deg, rgb(83,98,78) 0%, rgb(66,79,62) 100%);\n    color:#fff; border-radius:var(--rt-radius);\n    font-size:13px; font-weight:600; cursor:pointer;\n    transition:transform .12s, box-shadow .15s;\n}\n.rt-guest-btn-listo:hover{ transform:translateY(-1px); box-shadow:0 4px 12px rgba(83,98,78,0.30); }\n.rt-guest-total-banner{ background:#f5efe0; padding:10px 14px; border-radius:6px; margin-bottom:14px; display:flex; justify-content:space-between; align-items:center; }\n.rt-guest-total-banner-l{ font-size:12.5px; color:#2c3e50; font-weight:600; }\n.rt-guest-total-banner-v{ font-size:13px; color:#4a6741; font-weight:700; font-variant-numeric:tabular-nums; }\n@media(max-width:768px){\n    .rt-field-huespedes{ flex:1 1 100% !important; max-width:100% !important; width:100% !important; }\n}\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 FIN SELECTOR MULTI-HABITACI\u00d3N \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\n\/* \u2500\u2500\u2500 Modal precios: sin l\u00edneas grises en la cabecera \u2500\u2500\u2500\n   El acento de color bajo el t\u00edtulo lo pinta script.js por JS. Aqu\u00ed s\u00f3lo se\n   neutraliza cualquier borde gris que el CSS base ponga en el header\/body del\n   modal, para que quede s\u00f3lo la barra de color + la fecha. *\/\n#modal-precios #modal-body{border-top:0 !important;}\n#modal-precios #modal-body::before{display:none !important;content:none !important;}\n#modal-precios #modal-titulo::after{display:none !important;content:none !important;}\n#modal-precios .rt-modal-content > hr{display:none !important;}\n\/* \u2500\u2500\u2500 T\u00edtulo Step 1 (Sistema de Reservas\/Cotizaciones) \u2500\u2500\u2500 *\/\n.rt-step1-titulo{\n    text-align:center;\n    margin:-60px auto -20px;\n    padding:0 16px;\n    opacity:0;\n    transform:translateY(-6px);\n    filter:blur(4px);\n    animation: rtTituloIn .7s cubic-bezier(.22,.61,.36,1) .08s forwards;\n}\n\/* En mobile el banner es m\u00e1s corto: usar menos margen negativo para no encimar el t\u00edtulo. *\/\n@media (max-width: 768px){\n    .rt-step1-titulo{\n        margin:-25px auto -6px;\n        \/* Garantizar ancho completo: si el contenedor de Elementor que lo envuelve\n           colapsa en m\u00f3vil, el t\u00edtulo se apilaba letra por letra. *\/\n        width:100% !important;\n        max-width:100% !important;\n        box-sizing:border-box;\n        display:block;\n    }\n    .rt-step1-titulo h2{\n        width:100% !important;\n        max-width:100% !important;\n        white-space:normal !important;\n        word-break:normal !important;\n        overflow-wrap:normal !important;\n        writing-mode:horizontal-tb !important;\n    }\n}\n\/* Si el formulario se renderiza dentro del modal \"Modificar b\u00fasqueda\"\n   (en la pantalla de elegir habitaci\u00f3n), ocultar el t\u00edtulo global porque\n   el modal ya tiene su propio t\u00edtulo \"Modificar b\u00fasqueda\". *\/\n#rt-modal-modificar .rt-step1-titulo,\n.rt-modal-modificar .rt-step1-titulo{\n    display:none !important;\n}\n.rt-step1-titulo h2{\n    margin:0;\n    font-size:clamp(20px, 2.6vw, 28px);\n    font-weight:600;\n    color:#0d4f6c;\n    letter-spacing:.3px;\n    line-height:1.25;\n}\n.rt-step1-titulo-linea{\n    display:block;\n    width:0;\n    height:2px;\n    margin:6px auto 0;\n    background:linear-gradient(90deg, transparent, #0073aa 50%, transparent);\n    animation: rtLineaExpand .65s cubic-bezier(.22,.61,.36,1) .45s forwards;\n}\n.rt-step1-form-anim{\n    width:100%;\n    max-width:100%;\n    margin:0 auto;\n    box-sizing:border-box;\n    opacity:0;\n    transform:translateY(8px);\n    filter:blur(3px);\n    animation: rtFormIn .65s cubic-bezier(.22,.61,.36,1) .35s forwards;\n}\n\/* Cascada de campos.\n   - En la PRIMERA carga, la cascada se aplica v\u00eda CSS (nth-child) para que el\n     efecto sea inmediato sin esperar JS.\n   - Al cambiar de tipo (Estad\u00eda <-> Por el d\u00eda), un script re-dispara la\n     cascada SOLO sobre los campos visibles a\u00f1adiendo la clase .rt-anim-in con\n     un delay individual en la variable --rt-d. As\u00ed el efecto siempre recae en\n     los campos correctos en el orden correcto. *\/\n.rt-step1-form-anim .rt-form > *{\n    opacity:0;\n    transform:translateY(6px);\n    animation: rtCampoIn .5s ease-out forwards;\n}\n.rt-step1-form-anim .rt-form > *:nth-child(1){ animation-delay:.55s; }\n.rt-step1-form-anim .rt-form > *:nth-child(2){ animation-delay:.62s; }\n.rt-step1-form-anim .rt-form > *:nth-child(3){ animation-delay:.69s; }\n.rt-step1-form-anim .rt-form > *:nth-child(4){ animation-delay:.76s; }\n.rt-step1-form-anim .rt-form > *:nth-child(5){ animation-delay:.83s; }\n.rt-step1-form-anim .rt-form > *:nth-child(6){ animation-delay:.90s; }\n.rt-step1-form-anim .rt-form > *:nth-child(7){ animation-delay:.97s; }\n.rt-step1-form-anim .rt-form > *:nth-child(n+8){ animation-delay:1.04s; }\n\n\/* Re-animaci\u00f3n al cambiar de tipo: JS aplica esta clase con un delay propio por\n   campo (--rt-d). Debe GANAR a la regla base de cascada inicial, que tiene mayor\n   especificidad (.rt-step1-form-anim .rt-form > *), as\u00ed que igualamos contexto\n   y usamos !important en lo esencial para forzar el re-disparo. *\/\n.rt-step1-form-anim .rt-form > .rt-anim-in,\n.rt-form > .rt-anim-in{\n    opacity:0;\n    transform:translateY(6px);\n    animation: rtCampoIn .5s ease-out var(--rt-d, 0s) forwards !important;\n}\n\n@keyframes rtTituloIn{\n    to { opacity:1; transform:translateY(0); filter:blur(0); }\n}\n@keyframes rtFormIn{\n    to { opacity:1; transform:translateY(0); filter:blur(0); }\n}\n@keyframes rtLineaExpand{\n    to { width:60px; }\n}\n@keyframes rtCampoIn{\n    to { opacity:1; transform:translateY(0); }\n}\n\/* Respetar preferencias de accesibilidad. *\/\n@media (prefers-reduced-motion: reduce){\n    .rt-step1-titulo, .rt-step1-titulo-linea, .rt-step1-form-anim,\n    .rt-step1-form-anim .rt-form > *{\n        animation:none;\n        opacity:1;\n        transform:none;\n        filter:none;\n        width:60px;\n    }\n}\n\/* \ud83d\udc36 Estilos del modal de mascotas *\/\n.rt-modal-mascotas{\n    position:fixed; inset:0;\n    z-index:2147483647; \/* m\u00e1ximo posible, garantiza estar arriba de cualquier overlay del tema\/Elementor *\/\n    display:flex; align-items:center; justify-content:center;\n    padding:20px;\n}\n.rt-modal-mascotas-overlay{\n    position:absolute; inset:0;\n    background:rgba(0,0,0,0.55);\n    backdrop-filter:blur(2px);\n}\n.rt-modal-mascotas-content{\n    position:relative;\n    background:#fff;\n    border-radius:14px;\n    max-width:440px; width:100%;\n    padding:32px 28px 24px;\n    text-align:center;\n    box-shadow:0 20px 60px rgba(0,0,0,0.25);\n    animation:rtModalMascotasIn .25s ease-out;\n}\n@keyframes rtModalMascotasIn{\n    from{opacity:0; transform:translateY(20px) scale(.96);}\n    to{opacity:1; transform:translateY(0) scale(1);}\n}\n.rt-modal-mascotas-close{\n    position:absolute; top:10px; right:14px;\n    background:transparent; border:none;\n    font-size:28px; line-height:1;\n    color:#999; cursor:pointer;\n    padding:4px 10px; border-radius:6px;\n    transition:.15s;\n}\n.rt-modal-mascotas-close:hover{background:#f0f0f0; color:#222;}\n.rt-modal-mascotas-icon{\n    font-size:48px; line-height:1;\n    margin-bottom:14px;\n}\n.rt-modal-mascotas-titulo{\n    margin:0 0 12px;\n    font-size:20px; font-weight:700;\n    color:#0073aa;\n}\n.rt-modal-mascotas-texto{\n    margin:0 0 16px;\n    font-size:14px; line-height:1.55;\n    color:#444;\n}\n.rt-modal-mascotas-link{\n    display:inline-block;\n    margin:0 0 22px;\n    color:#0073aa; font-weight:600;\n    font-size:13px;\n    text-decoration:underline;\n    text-decoration-style:dotted;\n    text-underline-offset:3px;\n}\n.rt-modal-mascotas-link:hover{\n    color:#005a87;\n    text-decoration-style:solid;\n}\n.rt-modal-mascotas-actions{\n    margin-top:8px;\n}\n.rt-modal-mascotas-volver{\n    background:#0073aa; color:#fff;\n    border:none;\n    padding:12px 32px;\n    border-radius:8px;\n    font-size:14px; font-weight:600;\n    cursor:pointer;\n    transition:.15s;\n}\n.rt-modal-mascotas-volver:hover{background:#005a87;}\n\n\n\/* ============================================================ *\/\n\/* \ud83c\udfa8 RESTYLING MODERNO DEL FORMULARIO STEP 1\n\/* ============================================================ *\/\n\n\/* Wrapper general *\/\n.rt-form-wrapper{\n    --rt-c-border: #d9dde3;\n    --rt-c-border-hover: #99c8e0;\n    --rt-c-focus: #0073aa;\n    --rt-c-focus-ring: rgba(0, 115, 170, 0.18);\n    --rt-c-text: #2c3e50;\n    --rt-c-text-soft: #6b7785;\n    --rt-c-bg: #ffffff;\n    --rt-c-bg-hover: #f9fbfd;\n    --rt-radius: 10px;\n}\n\n\/* Labels: m\u00e1s limpio, color suave *\/\n.rt-form .rt-field label{\n    color: var(--rt-c-text-soft);\n    font-size: 12px;\n    font-weight: 600;\n    letter-spacing: .3px;\n    text-transform: uppercase;\n    margin-bottom: 6px;\n    display: block;\n}\n.rt-form .rt-field label b{\n    color: var(--rt-c-text);\n    font-weight: 700;\n    text-transform: none;\n    letter-spacing: 0;\n    font-size: 14px;\n}\n\n\/* Inputs y selects: estilo unificado moderno *\/\n.rt-form .rt-field input[type=\"date\"],\n.rt-form .rt-field input[type=\"text\"],\n.rt-form .rt-field input[type=\"email\"],\n.rt-form .rt-field input[type=\"number\"],\n.rt-form .rt-field select{\n    width: 100%;\n    height: 52px;\n    padding: 0 8px 0 38px; \/* deja espacio para el icono a la izquierda *\/\n    background-color: var(--rt-c-bg);\n    background-repeat: no-repeat;\n    background-position: 10px center;\n    background-size: 20px 20px;\n    border: 1.5px solid var(--rt-c-border);\n    border-radius: var(--rt-radius);\n    color: var(--rt-c-text);\n    font-size: 14px;\n    font-weight: 500;\n    transition: border-color .15s, box-shadow .15s, background-color .15s;\n    appearance: none;\n    -webkit-appearance: none;\n    box-shadow: 0 2px 6px rgba(0,0,0,0.08);\n    box-sizing: border-box;\n    min-width: 0; \/* permite que el input shrinkee dentro de un flex container *\/\n}\n\n\/* Selects: dejar espacio a la flecha custom de la derecha *\/\n.rt-form .rt-field select{\n    padding-right: 30px;\n    cursor: pointer;\n    \/* flecha custom a la derecha *\/\n    background-image:\n        var(--rt-icon, none),\n        url(\"data:image\/svg+xml;utf8,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='8' viewBox='0 0 12 8'><path fill='%236b7785' d='M6 8L0 0h12z'\/><\/svg>\");\n    background-position:\n        10px center,\n        calc(100% - 10px) center;\n    background-size:\n        20px 20px,\n        10px 7px;\n}\n\n\/* Contadores peque\u00f1os (Adultos, Ni\u00f1os, Adolesc., Infantes, Mascotas): se\n   angostan para que todos quepan c\u00f3modos en la fila, especialmente cuando\n   aparece el contador de Adolescentes en fechas especiales. *\/\n.rt-form .rt-field.small{\n    flex: 0 0 auto;\n    max-width: 84px;\n    min-width: 70px;\n}\n.rt-form .rt-field.small label > b{\n    white-space: nowrap;\n}\n.rt-form .rt-field.small select{\n    padding-left: 8px;\n    padding-right: 24px;\n}\n\/* Cuando el formulario tiene el contador de adolescentes visible, se aprieta un\n   poco m\u00e1s todo para que el bot\u00f3n \"Siguiente\" no se salga del recuadro. *\/\n.rt-form{ gap: 12px; }\n.rt-form .rt-field.small select{\n    background-position: 7px center, calc(100% - 8px) center;\n}\n\n\/* En m\u00f3vil los contadores peque\u00f1os deben ocupar el ancho completo: liberamos\n   el max-width de 84px (que se usa solo en desktop para que quepan en la fila). *\/\n@media (max-width: 768px){\n    \/* El formulario fluye en filas que se envuelven. *\/\n    .rt-form{\n        display: flex !important;\n        flex-direction: row !important;\n        flex-wrap: wrap !important;\n        gap: 8px !important;\n        align-items: flex-start !important;\n    }\n    \/* Campos grandes (Tipo, Fecha, Servicio, Total y acciones): ancho completo. *\/\n    .rt-form > .rt-field:not(.small){\n        flex: 1 1 100% !important;\n        max-width: 100% !important;\n        width: 100% !important;\n        min-width: 0 !important;\n    }\n    \/* Contadores peque\u00f1os: ~50% para que fluyan de a DOS por fila.\n       Los campos ocultos (display:none) no ocupan espacio, as\u00ed que el\n       emparejamiento se acomoda solo seg\u00fan cu\u00e1les est\u00e9n visibles. *\/\n    .rt-form > .rt-field.small{\n        flex: 1 1 calc(50% - 4px) !important;\n        max-width: calc(50% - 4px) !important;\n        min-width: calc(50% - 4px) !important;\n        width: calc(50% - 4px) !important;\n        box-sizing: border-box !important;\n    }\n    .rt-form > .rt-field.small select{\n        width: 100% !important;\n        max-width: 100% !important;\n        box-sizing: border-box !important;\n        \/* M\u00e1s espacio a la izquierda para que el n\u00famero no pise el icono de fondo. *\/\n        padding-left: 34px !important;\n    }\n}\n\n\/* Inputs date: en algunos navegadores muestran el indicador a la derecha,\n   le dejamos algo de aire *\/\n.rt-form .rt-field input[type=\"date\"]{\n    padding-right: 6px;\n}\n\n\/* Hover *\/\n.rt-form .rt-field input[type=\"date\"]:hover,\n.rt-form .rt-field input[type=\"text\"]:hover,\n.rt-form .rt-field input[type=\"email\"]:hover,\n.rt-form .rt-field input[type=\"number\"]:hover,\n.rt-form .rt-field select:hover{\n    border-color: var(--rt-c-border-hover);\n    background-color: var(--rt-c-bg-hover);\n    box-shadow: 0 3px 8px rgba(0,0,0,0.10);\n}\n\n\/* Focus: anillo azul *\/\n.rt-form .rt-field input[type=\"date\"]:focus,\n.rt-form .rt-field input[type=\"text\"]:focus,\n.rt-form .rt-field input[type=\"email\"]:focus,\n.rt-form .rt-field input[type=\"number\"]:focus,\n.rt-form .rt-field select:focus{\n    outline: none;\n    border-color: var(--rt-c-focus);\n    background-color: var(--rt-c-bg);\n    box-shadow: 0 0 0 4px var(--rt-c-focus-ring);\n}\n\n\/* Iconos por campo (SVG inline en base64) *\/\n.rt-form #tipo{\n    --rt-icon: url(\"data:image\/svg+xml;utf8,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%230073aa' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z'\/><polyline points='9 22 9 12 15 12 15 22'\/><\/svg>\");\n}\n.rt-form #checkin,\n.rt-form #checkout{\n    background-image: url(\"data:image\/svg+xml;utf8,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%230073aa' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='4' width='18' height='18' rx='2' ry='2'\/><line x1='16' y1='2' x2='16' y2='6'\/><line x1='8' y1='2' x2='8' y2='6'\/><line x1='3' y1='10' x2='21' y2='10'\/><\/svg>\");\n}\n.rt-form #servicio{\n    --rt-icon: url(\"data:image\/svg+xml;utf8,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%230073aa' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z'\/><\/svg>\");\n}\n.rt-form #adultos{\n    --rt-icon: url(\"data:image\/svg+xml;utf8,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%230073aa' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2'\/><circle cx='12' cy='7' r='4'\/><\/svg>\");\n}\n.rt-form #ninos{\n    --rt-icon: url(\"data:image\/svg+xml;utf8,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%230073aa' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='8' r='4'\/><path d='M6 21v-2a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v2'\/><circle cx='9' cy='7' r='.5' fill='%230073aa'\/><circle cx='15' cy='7' r='.5' fill='%230073aa'\/><\/svg>\");\n}\n.rt-form #infantes{\n    --rt-icon: url(\"data:image\/svg+xml;utf8,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%230073aa' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='9' r='5'\/><path d='M9 19h6'\/><path d='M12 14v5'\/><\/svg>\");\n}\n.rt-form #mascotas{\n    --rt-icon: url(\"data:image\/svg+xml;utf8,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%230073aa' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='11' cy='4' r='2'\/><circle cx='18' cy='8' r='2'\/><circle cx='20' cy='14' r='2'\/><circle cx='4' cy='10' r='2'\/><path d='M7.5 16c-1.5 1.5-3 4 0 5s3 0 4.5-1 3 1 4.5 0c2-1.5 1-4 0-5s-2-3-4-3-3.5 2-5 4z'\/><\/svg>\");\n}\n\n\/* Rango de edad peque\u00f1o y visible debajo de cada t\u00edtulo (Adultos, Ni\u00f1os, etc.) *\/\n.rt-rango-edad{\n    display: block;\n    font-size: 9px;\n    line-height: 1.1;\n    color: #6b7a85;\n    font-weight: 500;\n    margin: 1px 0 0;\n    white-space: nowrap;       \/* el rango cabe en una l\u00ednea bajo el t\u00edtulo *\/\n    text-transform: uppercase;\n    letter-spacing: .2px;\n}\n\/* Todos los campos de la fila reservan la MISMA altura de label, ya sea que el\n   label tenga 2 l\u00edneas (los de edad: t\u00edtulo + rango) o 1 sola (Tipo, Fecha,\n   Servicio, Total y el bot\u00f3n Siguiente). As\u00ed TODOS los inputs\/selects\/bot\u00f3n\n   arrancan a la misma altura y la fila queda perfectamente alineada. *\/\n.rt-form .rt-field > label{\n    min-height: 34px;          \/* t\u00edtulo (~18px) + rango (~12px) + margen *\/\n    box-sizing: border-box;\n    display: block;\n}\n.rt-form .rt-field.small label{\n    white-space: normal;\n}\n\n\/* Tooltips de ayuda (?) m\u00e1s amigables *\/\n.rt-tooltip-trigger{\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    width: 16px;\n    height: 16px;\n    background: #e3eef5;\n    color: #0073aa;\n    border-radius: 50%;\n    font-size: 11px;\n    font-weight: 700;\n    cursor: help;\n    margin-left: 4px;\n    transition: background .15s;\n}\n.rt-tooltip-trigger:hover{\n    background: #0073aa;\n    color: #fff;\n}\n\n\/* Mostrar el \u00edcono de calendario nativo del input date m\u00e1s sutil\n   (algunos navegadores lo ocultan autom\u00e1ticamente con appearance:none,\n    en otros queda doble; le bajamos opacidad para que no compita) *\/\n.rt-form input[type=\"date\"]::-webkit-calendar-picker-indicator{\n    opacity: 0.5;\n    cursor: pointer;\n    margin-left: 6px;\n}\n\n\/* Subtotales debajo de cada campo *\/\n.rt-form .rt-subtotal{\n    display: block;\n    font-size: 12px;\n    color: var(--rt-c-focus);\n    font-weight: 600;\n    margin-top: 6px;\n    min-height: 16px;\n    line-height: 1.3;\n}\n\n\/* Bot\u00f3n Reservar m\u00e1s moderno *\/\n.rt-form .rt-btn.reservar,\n.rt-form .rt-btn[data-tipo=\"reserva\"]{\n    height: 52px;\n    padding: 0 22px;\n    background: linear-gradient(135deg, rgb(83, 98, 78) 0%, rgb(66, 79, 62) 100%);\n    color: #fff;\n    border: none;\n    border-radius: var(--rt-radius);\n    font-size: 15px;\n    font-weight: 700;\n    letter-spacing: .3px;\n    cursor: pointer;\n    box-shadow: 0 4px 12px rgba(83, 98, 78, 0.30);\n    transition: transform .12s, box-shadow .15s;\n    white-space: nowrap;       \/* nunca cortar en dos l\u00edneas *\/\n    min-width: 110px;          \/* asegura que la palabra \"Reservar\" entre completa *\/\n}\n.rt-form .rt-btn.reservar:hover,\n.rt-form .rt-btn[data-tipo=\"reserva\"]:hover{\n    transform: translateY(-1px);\n    box-shadow: 0 6px 18px rgba(83, 98, 78, 0.42);\n}\n.rt-form .rt-btn.reservar:active,\n.rt-form .rt-btn[data-tipo=\"reserva\"]:active{\n    transform: translateY(0);\n    box-shadow: 0 2px 8px rgba(83, 98, 78, 0.30);\n}\n\n\/* Alineaci\u00f3n del bot\u00f3n \"Siguiente\": el contenedor de acciones replica el mismo\n   markup de label que los dem\u00e1s campos (un <b> oculto), de modo que reserva\n   exactamente la misma altura y el bot\u00f3n queda alineado con los inputs. *\/\n.rt-form .rt-actions{\n    display: flex;\n    flex-direction: column;\n}\n.rt-form .rt-actions-inner{\n    display: flex;\n}\n.rt-form .rt-actions-inner .rt-btn{\n    width: 100%;\n}\n\n\n\/* ============================================================ *\/\n\/* \ud83c\udf89 TOASTS (notificaciones flotantes esquina sup derecha)\n\/* ============================================================ *\/\n.rt-toast-container{\n    position: fixed;\n    top: 20px;\n    right: 20px;\n    z-index: 2147483646;\n    display: flex;\n    flex-direction: column;\n    gap: 10px;\n    pointer-events: none;\n    max-width: calc(100vw - 40px);\n}\n.rt-toast{\n    background: #fff;\n    border-left: 4px solid #0073aa;\n    border-radius: 10px;\n    padding: 14px 18px 14px 16px;\n    min-width: 280px;\n    max-width: 380px;\n    box-shadow: 0 10px 30px rgba(0,0,0,0.15), 0 2px 6px rgba(0,0,0,0.08);\n    display: flex;\n    align-items: flex-start;\n    gap: 12px;\n    pointer-events: auto;\n    animation: rtToastIn .25s cubic-bezier(.16,1,.3,1);\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n}\n.rt-toast.rt-toast-leaving{\n    animation: rtToastOut .2s ease-in forwards;\n}\n@keyframes rtToastIn{\n    from{ opacity:0; transform: translateX(20px) scale(.95); }\n    to  { opacity:1; transform: translateX(0)    scale(1); }\n}\n@keyframes rtToastOut{\n    from{ opacity:1; transform: translateX(0); }\n    to  { opacity:0; transform: translateX(20px); }\n}\n.rt-toast-icon{\n    flex-shrink: 0;\n    width: 22px;\n    height: 22px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 16px;\n    line-height: 1;\n    margin-top: 1px;\n}\n.rt-toast-body{\n    flex: 1;\n    font-size: 14px;\n    line-height: 1.45;\n    color: #2c3e50;\n    font-weight: 500;\n}\n.rt-toast-close{\n    background: none;\n    border: none;\n    color: #999;\n    font-size: 18px;\n    line-height: 1;\n    cursor: pointer;\n    padding: 0;\n    margin-left: 4px;\n    width: 20px; height: 20px;\n    border-radius: 4px;\n    transition: background .15s, color .15s;\n}\n.rt-toast-close:hover{ background:#f0f0f0; color:#333; }\n\n\/* Variantes *\/\n.rt-toast-info   { border-left-color: #0073aa; }\n.rt-toast-info    .rt-toast-icon{ color: #0073aa; }\n.rt-toast-success{ border-left-color: #2e7d32; }\n.rt-toast-success .rt-toast-icon{ color: #2e7d32; }\n.rt-toast-error  { border-left-color: #c62828; }\n.rt-toast-error   .rt-toast-icon{ color: #c62828; }\n.rt-toast-warning{ border-left-color: #f57c00; }\n.rt-toast-warning .rt-toast-icon{ color: #f57c00; }\n\n\n\/* ============================================================ *\/\n\/* \u26a0\ufe0f INLINE ERRORS (mensaje rojo debajo del campo)\n\/* ============================================================ *\/\n.rt-field-error{\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    margin-top: 6px;\n    padding: 6px 10px;\n    background: #fff5f5;\n    border: 1px solid #fecaca;\n    border-radius: 6px;\n    color: #c62828;\n    font-size: 12px;\n    font-weight: 600;\n    line-height: 1.3;\n    animation: rtErrorShake .35s cubic-bezier(.36,.07,.19,.97);\n}\n\/* En los campos de fecha el error se posiciona absoluto justo debajo del\n   input, para que no lo empujen los spans informativos (email\/noches) que\n   tienen distinta altura. As\u00ed el error de \"ingreso\" y \"salida\" quedan a la\n   misma altura. La distancia = label (~20px) + input (52px) + 4px. *\/\n.rt-form .rt-field{ position: relative; }\n.rt-form #checkin ~ .rt-field-error,\n.rt-form #checkout ~ .rt-field-error,\n.rt-field:has(#checkin) .rt-field-error,\n.rt-field:has(#checkout) .rt-field-error{\n    position: absolute;\n    top: 80px;\n    left: 0;\n    right: 0;\n    margin-top: 0;\n    z-index: 3;\n}\n.rt-field-error::before{\n    content: \"\u26a0\ufe0f\";\n    font-size: 13px;\n    line-height: 1;\n}\n@keyframes rtErrorShake{\n    0%, 100% { transform: translateX(0); }\n    20%, 60% { transform: translateX(-4px); }\n    40%, 80% { transform: translateX(4px); }\n}\n\n\/* \ud83d\udcf1 En m\u00f3vil los campos se apilan en columna. El posicionamiento absoluto que\n   usamos en desktop (top:80px) hace que el error de fecha se SUPERPONGA con los\n   campos siguientes (Adultos\/Ni\u00f1os). En m\u00f3vil lo devolvemos al flujo normal:\n   queda justo debajo del input y empuja el contenido hacia abajo, sin solapes. *\/\n@media (max-width: 768px){\n    .rt-form #checkin ~ .rt-field-error,\n    .rt-form #checkout ~ .rt-field-error,\n    .rt-field:has(#checkin) .rt-field-error,\n    .rt-field:has(#checkout) .rt-field-error{\n        position: static;\n        top: auto;\n        left: auto;\n        right: auto;\n        margin-top: 6px;\n        z-index: auto;\n    }\n}\n\n\/* Campo con error: borde rojo *\/\n.rt-form .rt-field input.rt-input-error,\n.rt-form .rt-field select.rt-input-error{\n    border-color: #c62828 !important;\n    box-shadow: 0 0 0 4px rgba(198, 40, 40, 0.12) !important;\n}\n\n\/* ============================================================ *\/\n\/* \ud83d\udecf\ufe0f AVISO DE PLAZAS (varias habitaciones \/ contactar eventos)\n\/* ============================================================ *\/\n\/* El aviso se posiciona absoluto en la parte superior del formulario,\n   ocupando todo el ancho, SIN participar del flex (as\u00ed los campos y el\n   bot\u00f3n siguen en una sola fila). El espacio se reserva con padding-top\n   din\u00e1mico aplicado por JS (clase rt-tiene-aviso). *\/\n.rt-form{ position: relative; }\n\n\/* Desktop: alinear todos los campos por su base, de modo que los inputs y\n   selects queden a la misma altura aunque algunos labels tengan 2 l\u00edneas\n   (los de edad con su rango) y otros solo 1 (Tipo, Fechas, Mascotas). *\/\n@media (min-width: 769px){\n    .rt-form{ align-items: flex-end; }\n    .rt-form .rt-field{ display: flex; flex-direction: column; justify-content: flex-end; }\n}\n.rt-form.rt-tiene-aviso{ }\n\n.rt-aviso-plazas{\n    position: absolute;\n    top: 0; left: 0; right: 0;\n    width: 100%;\n    box-sizing: border-box;\n    margin: 0;\n    padding: 14px 20px;\n    border-radius: 10px;\n    line-height: 1.45;\n    text-align: center;\n    animation: rtErrorShake .35s cubic-bezier(.36,.07,.19,.97);\n}\n\/* L\u00ednea principal *\/\n.rt-aviso-plazas .rt-aviso-titulo{\n    font-size: 15px;\n    font-weight: 700;\n    margin: 0;\n}\n.rt-aviso-plazas .rt-aviso-titulo .rt-aviso-emoji{ margin-right: 6px; }\n\/* Segunda l\u00ednea, texto m\u00e1s chico *\/\n.rt-aviso-plazas .rt-aviso-sub{\n    font-size: 12.5px;\n    font-weight: 500;\n    margin: 4px 0 0;\n    opacity: .9;\n}\n\/* Tercera l\u00ednea: contactos *\/\n.rt-aviso-plazas .rt-aviso-contactos{\n    margin: 8px 0 0;\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: center;\n    gap: 14px;\n    font-size: 12px;\n}\n.rt-aviso-plazas .rt-aviso-contactos a{\n    color: inherit;\n    text-decoration: none;\n    font-weight: 600;\n    display: inline-flex;\n    align-items: center;\n    gap: 4px;\n    border-bottom: 1px dotted currentColor;\n    padding-bottom: 1px;\n    transition: opacity .15s;\n}\n.rt-aviso-plazas .rt-aviso-contactos a:hover{ opacity: .7; }\n\n\/* Variante celeste (8-9 personas) *\/\n.rt-aviso-plazas.rt-aviso-info{\n    background: #eef7fb;\n    border: 1px solid #99c8e0;\n    color: #0d4f6c;\n}\n\/* Variante amarilla (10+ personas, con contactos) *\/\n.rt-aviso-plazas.rt-aviso-eventos{\n    background: #fff8ec;\n    border: 1px solid #f0c878;\n    color: #7a5800;\n}\n\/* Variante roja (error de validaci\u00f3n, ej. noches m\u00ednimas no cumplidas) *\/\n.rt-aviso-plazas.rt-aviso-error{\n    background: #fcebeb;\n    border: 1px solid #e24b4a;\n    color: #a32d2d;\n}\n\n\/* \ud83c\udf88 Globo flotante informativo sobre Fecha de Ingreso (noches m\u00ednimas) *\/\n.rt-nm-popover{\n    position: absolute;\n    left: 50%;\n    transform: translateX(-50%);\n    bottom: calc(100% + 5px);\n    background: #2f80ed;\n    color: #fff;\n    font-size: 12.5px;\n    line-height: 1.35;\n    font-weight: 500;\n    padding: 8px 12px;\n    border-radius: 8px;\n    white-space: normal;\n    max-width: 240px;\n    width: max-content;\n    box-shadow: 0 6px 20px rgba(0,0,0,.25);\n    z-index: 2147483647;\n    text-align: center;\n    pointer-events: none;\n}\n.rt-nm-popover::after{\n    content: \"\";\n    position: absolute;\n    top: 100%;\n    left: 50%;\n    transform: translateX(-50%) translateY(-5px) rotate(45deg);\n    width: 10px;\n    height: 10px;\n    background: #2f80ed;\n}\n.rt-nm-popover b{ font-weight: 700; }\n\/* Versi\u00f3n flotante en m\u00f3vil (portal al body): posicionada por JS *\/\n.rt-nm-popover.rt-nm-popover-fixed{\n    position: fixed;\n    left: 0; right: auto;\n    transform: none;\n    bottom: auto;\n    max-width: 82vw;\n}\n.rt-nm-popover.rt-nm-popover-fixed::after{ display:none; }\n\n\/* Mensaje de error de noches m\u00ednimas (bajo Fecha de Salida) *\/\n.rt-nm-error{\n    display: none;\n    font-size: 12.5px;\n    color: #a32d2d;\n    font-weight: 600;\n    line-height: 1.35;\n}\n.rt-nm-error.rt-nm-error-visible{ display: inline; margin-left: 8px; }\n.rt-nm-error b{ font-weight: 700; }\n\/* En escritorio, \"N noches\" debe ser inline para que el error vaya al lado *\/\n@media (min-width: 769px){\n    #rt-nm-linea #rt-noches-info{ display: inline !important; }\n}\n\/* Separador \"\u00b7\" antes del error cuando \"N noches\" est\u00e1 visible al lado *\/\n#rt-nm-linea .rt-nm-error.rt-nm-error-visible::before{\n    content: \"\u00b7\";\n    color: #b8b6ad;\n    margin-right: 8px;\n    font-weight: 700;\n}\n\/* En m\u00f3vil, la l\u00ednea envuelve y el error cae debajo (no se sale de pantalla) *\/\n@media (max-width: 768px){\n    #rt-nm-linea{ white-space: normal !important; }\n    .rt-nm-error.rt-nm-error-visible{ display: block; margin-left: 0; margin-top: 4px; }\n    #rt-nm-linea .rt-nm-error.rt-nm-error-visible::before{ content: \"\"; margin: 0; }\n}\n.rt-aviso-plazas b{ font-weight: 700; }\n\n\/* Bot\u00f3n Reservar deshabilitado por tope de plazas *\/\n.rt-form .rt-btn.reservar.rt-btn-bloqueado,\n.rt-form .rt-btn[data-tipo=\"reserva\"].rt-btn-bloqueado,\n.rt-btn-aceptar-modal.rt-btn-bloqueado,\n#rt-btn-aceptar-modal.rt-btn-bloqueado{\n    background: #c4ccd4 !important;\n    box-shadow: none !important;\n    cursor: not-allowed !important;\n    transform: none !important;\n    opacity: .85;\n}\n\n\/* ============================================================ *\/\n\/* \ud83d\udcf1 M\u00d3VIL: el aviso flota fijo abajo (siempre visible)\n\/* ============================================================ *\/\n@media (max-width: 768px){\n    \/* El form ya no necesita reservar espacio arriba en m\u00f3vil *\/\n    .rt-form.rt-tiene-aviso{ padding-top: 0 !important; }\n\n    .rt-aviso-plazas{\n        position: fixed !important;\n        left: 12px !important;\n        right: 12px !important;\n        top: 12px !important;\n        bottom: auto !important;\n        width: auto !important;\n        z-index: 2147483647 !important;\n        margin: 0 !important;\n        box-shadow: 0 12px 36px rgba(0,0,0,.28);\n        padding: 16px 18px 16px;\n        animation: rtAvisoMovilIn .3s cubic-bezier(.16,1,.3,1);\n    }\n    \/* Bot\u00f3n de cerrar (solo visible en m\u00f3vil) *\/\n    .rt-aviso-cerrar{\n        position: absolute;\n        top: 6px; right: 8px;\n        background: transparent; border: none;\n        font-size: 22px; line-height: 1;\n        color: currentColor; opacity: .6;\n        cursor: pointer; padding: 2px 6px;\n    }\n    .rt-aviso-cerrar:hover{ opacity: 1; }\n    \/* dejar aire arriba del texto para no chocar con la \u2715 *\/\n    .rt-aviso-plazas .rt-aviso-titulo{ padding: 0 18px; }\n}\n@keyframes rtAvisoMovilIn{\n    from{ opacity:0; transform: translateY(-20px); }\n    to  { opacity:1; transform: translateY(0); }\n}\n\/* El bot\u00f3n cerrar se oculta en escritorio (el aviso es est\u00e1tico ah\u00ed) *\/\n.rt-aviso-cerrar{ display: none; }\n@media (max-width: 768px){\n    .rt-aviso-cerrar{ display: block; }\n}\n\n\/* Fix alineamiento \"N noche(s)\" bajo Fecha Salida con \"email\/Cambiar\"\n   bajo Fecha Ingreso. El contenedor #rt-email-info tiene min-height:30px\n   y line-height:1.3 (con span block interno que queda pegado arriba).\n   #rt-nm-linea hereda line-height del contenedor de Elementor (~1.5-2)\n   y su span inline queda al baseline (m\u00e1s abajo). Forzamos ambos a la\n   misma altura de l\u00ednea y alineamos el texto al TOP del bloque. *\/\n#rt-nm-linea{\n    min-height:30px;\n    display:block;\n    margin-top:4px;\n    line-height:1.3;\n}\n#rt-nm-linea #rt-noches-info{\n    line-height:1.3;\n    vertical-align:top;\n}\n<\/style>\n\n<script>\n(function(){\n    \/\/ L\u00f3gica del select Mascotas + modal informativo\n    var $selMascotas = document.getElementById('mascotas');\n    var $modal       = document.getElementById('rt-modal-mascotas');\n    if(!$selMascotas || !$modal) return;\n\n    \/\/ \ud83d\udd27 PORTAL: Mover el modal directamente al <body> para que escape\n    \/\/ de cualquier contenedor con position:relative, overflow:hidden o\n    \/\/ stacking context creado por el tema\/Elementor. As\u00ed el z-index funciona.\n    if($modal.parentNode !== document.body){\n        document.body.appendChild($modal);\n    }\n\n    var $overlay     = $modal.querySelector('.rt-modal-mascotas-overlay');\n    var $btnCerrar   = $modal.querySelector('.rt-modal-mascotas-close');\n    var $btnVolver   = $modal.querySelector('.rt-modal-mascotas-volver');\n\n    function abrirModal(){\n        $modal.style.display = 'flex';\n        \/\/ Bloquear scroll del body mientras est\u00e1 abierto\n        document.body.style.overflow = 'hidden';\n    }\n    function cerrarModal(){\n        $modal.style.display = 'none';\n        document.body.style.overflow = '';\n        \/\/ Forzar selecci\u00f3n a \"1\" (1 mascota es lo m\u00e1ximo permitido)\n        $selMascotas.value = '1';\n        \/\/ Disparar evento change por si el resto del JS escucha esto para recalcular\n        try {\n            $selMascotas.dispatchEvent(new Event('change', { bubbles: true }));\n        } catch(e){}\n    }\n\n    $selMascotas.addEventListener('change', function(){\n        if(parseInt(this.value, 10) >= 2){\n            abrirModal();\n        }\n    });\n\n    if($overlay)   $overlay.addEventListener('click', cerrarModal);\n    if($btnCerrar) $btnCerrar.addEventListener('click', cerrarModal);\n    if($btnVolver) $btnVolver.addEventListener('click', cerrarModal);\n\n    \/\/ ESC tambi\u00e9n cierra\n    document.addEventListener('keydown', function(e){\n        if(e.key === 'Escape' && $modal.style.display === 'flex'){\n            cerrarModal();\n        }\n    });\n})();\n<\/script>\n\n\n<script>\n\/* ============================================================\n * \ud83d\udd22 RANGO DIN\u00c1MICO DE ADULTOS seg\u00fan visibilidad de Adolescentes\n *\n * - Si el contador \"Adolescentes\" (De 10 a 17) est\u00e1 VISIBLE,\n *   los adultos son \"Desde 18 a\u00f1os\" (los 10-17 caen en Adolescentes).\n * - Si est\u00e1 OCULTO, Adultos absorbe ese tramo: \"Desde 10 a\u00f1os\".\n *\n * El campo Adolescentes se muestra\/oculta desde otro script (fechas\n * especiales). Aqu\u00ed observamos su atributo style para reaccionar\n * sin depender del orden de carga.\n * ============================================================ *\/\n(function(){\n    var $rango = document.getElementById('rt-rango-adultos');\n    var $adol  = document.getElementById('rt-field-adolescentes');\n    if(!$rango || !$adol) return;\n\n    function adolescentesVisible(){\n        \/\/ Visible si NO est\u00e1 display:none y ocupa espacio en el layout.\n        if($adol.style.display === 'none') return false;\n        return $adol.offsetParent !== null;\n    }\n\n    function actualizarRango(){\n        $rango.textContent = adolescentesVisible() ? 'Desde 18 a\\u00f1os' : 'Desde 10 a\\u00f1os';\n    }\n\n    \/\/ Estado inicial\n    actualizarRango();\n\n    \/\/ Reaccionar a cambios de visibilidad del campo Adolescentes.\n    try {\n        var obs = new MutationObserver(actualizarRango);\n        obs.observe($adol, { attributes: true, attributeFilter: ['style', 'class'] });\n    } catch(e){}\n\n    \/\/ Red de seguridad: revisar tambi\u00e9n al cambiar fechas (por si el toggle\n    \/\/ se hace sin mutar atributos observables).\n    ['fecha_ingreso','fecha_salida','checkin','checkout','fecha'].forEach(function(id){\n        var el = document.getElementById(id);\n        if(el) el.addEventListener('change', function(){ setTimeout(actualizarRango, 50); });\n    });\n})();\n<\/script>\n\n\n<script>\n\/* ============================================================\n * \u2728 RE-ANIMACI\u00d3N EN CASCADA AL CAMBIAR DE TIPO\n *\n * En la carga inicial el efecto de entrada lo da el CSS (.rt-step1-form-anim).\n * Cada vez que se cambia el \"Tipo\" (Estad\u00eda <-> Por el d\u00eda) algunos campos se\n * muestran\/ocultan (Fecha Salida vs Servicio, Mascotas, Adolescentes). Aqu\u00ed\n * re-disparamos la cascada SOLO sobre los campos visibles, en orden, para que\n * el efecto recaiga siempre en los campos correctos.\n *\n * No toca la l\u00f3gica del switch: solo lee qu\u00e9 campos est\u00e1n visibles y les pone\n * una animaci\u00f3n de entrada escalonada.\n * ============================================================ *\/\n(function(){\n    var $tipo = document.getElementById('tipo');\n    var $form = document.querySelector('.rt-form');\n    if(!$tipo || !$form) return;\n\n    var STEP  = 0.07;  \/\/ segundos entre cada campo\n    var START = 0.05;  \/\/ retraso inicial\n\n    function esVisible(el){\n        \/\/ offsetParent es null cuando el elemento (o un ancestro) est\u00e1 display:none\n        return el.offsetParent !== null;\n    }\n\n    function reanimar(){\n        var campos = Array.prototype.slice.call($form.children);\n        var i = 0;\n        campos.forEach(function(campo){\n            if(!esVisible(campo)) return;          \/\/ saltar campos ocultos en este modo\n            \/\/ reiniciar animaci\u00f3n\n            campo.classList.remove('rt-anim-in');\n            \/\/ forzar reflow para que el remove\/add re-dispare la animaci\u00f3n\n            void campo.offsetWidth;\n            campo.style.setProperty('--rt-d', (START + i * STEP).toFixed(2) + 's');\n            campo.classList.add('rt-anim-in');\n            i++;\n        });\n    }\n\n    \/\/ Limpiar la clase cuando termina, para no dejar estilos pegados.\n    $form.addEventListener('animationend', function(e){\n        if(e.target && e.target.classList && e.target.classList.contains('rt-anim-in')){\n            e.target.classList.remove('rt-anim-in');\n            e.target.style.removeProperty('--rt-d');\n        }\n    });\n\n    \/\/ Al cambiar de tipo: el switch (en script.js) ajusta la visibilidad de los\n    \/\/ campos. Esperamos a que termine ese ajuste antes de re-animar. Usamos un\n    \/\/ peque\u00f1o timeout + doble requestAnimationFrame para correr despu\u00e9s del\n    \/\/ repaint en que el switch ya aplic\u00f3 display:none\/block.\n    $tipo.addEventListener('change', function(){\n        setTimeout(function(){\n            requestAnimationFrame(function(){\n                requestAnimationFrame(reanimar);\n            });\n        }, 60);\n    });\n\n    \/\/ El campo Adolescentes puede aparecer seg\u00fan la fecha (no solo el tipo).\n    \/\/ Para no re-animar toda la fila cada vez que se elige una fecha, solo\n    \/\/ re-animamos si Adolescentes acaba de PASAR de oculto a visible.\n    var $adol = document.getElementById('rt-field-adolescentes');\n    if($adol){\n        var adolEstaba = esVisible($adol);\n        ['checkin','checkout'].forEach(function(id){\n            var el = document.getElementById(id);\n            if(el) el.addEventListener('change', function(){\n                setTimeout(function(){\n                    var ahora = esVisible($adol);\n                    if(ahora && !adolEstaba){ reanimar(); }\n                    adolEstaba = ahora;\n                }, 60);\n            });\n        });\n    }\n})();\n<\/script>\n\n\n<script>\n\/* ============================================================\n * \ud83d\udcc5 BLOQUEO DE FECHAS PASADAS (desktop + m\u00f3vil)\n *\n * - Fecha Ingreso: min = hoy\n * - Fecha Salida:  min = checkin + 1 d\u00eda (se actualiza al cambiar checkin)\n *\n * Funciona porque el navegador (incluyendo iOS Safari y Android Chrome)\n * respeta el atributo `min` en <input type=\"date\"> y deshabilita d\u00edas\n * anteriores en el datepicker nativo.\n * ============================================================ *\/\n(function(){\n    var $checkin  = document.getElementById('checkin');\n    var $checkout = document.getElementById('checkout');\n    if(!$checkin) return;\n\n    \/\/ Helper: convertir Date a \"YYYY-MM-DD\" (formato requerido por input type=date)\n    function toISODate(d){\n        var yyyy = d.getFullYear();\n        var mm   = String(d.getMonth() + 1).padStart(2, '0');\n        var dd   = String(d.getDate()).padStart(2, '0');\n        return yyyy + '-' + mm + '-' + dd;\n    }\n\n    \/\/ Bloquear fechas pasadas en check-in.\n    \/\/ OJO: se calcula SIEMPRE con hora LOCAL (getFullYear\/getMonth\/getDate),\n    \/\/ nunca con UTC, para que a partir de las 20:00 en Chile (GMT-04\/-03) el\n    \/\/ \"hoy\" no se adelante al d\u00eda siguiente por el desfase con UTC.\n    function calcularHoyISO(){\n        return toISODate(new Date());\n    }\n    var hoyISO = calcularHoyISO();\n\n    \/\/ Guardi\u00e1n: reafirma el min correcto. Si otro script (theme\/CozyStay\/Elementor)\n    \/\/ pisa el atributo min y lo deja MAYOR a hoy local, lo devolvemos a hoy.\n    function reafirmarMinCheckin(){\n        var actual = $checkin.getAttribute('min');\n        if(actual !== hoyISO){\n            $checkin.setAttribute('min', hoyISO);\n        }\n        \/\/ Si qued\u00f3 una fecha anterior a hoy por cache\/historial, limpiarla\n        if($checkin.value && $checkin.value < hoyISO){\n            $checkin.value = '';\n        }\n    }\n    reafirmarMinCheckin();\n\n    \/\/ Reafirmar tras el ciclo de carga y ante cambios externos del atributo min,\n    \/\/ para ganarle a cualquier datepicker del theme que lo sobrescriba.\n    window.setTimeout(reafirmarMinCheckin, 0);\n    window.setTimeout(reafirmarMinCheckin, 400);\n    window.setTimeout(reafirmarMinCheckin, 1200);\n    try {\n        var rtMinObserver = new MutationObserver(function(){\n            var actual = $checkin.getAttribute('min');\n            \/\/ Solo corregimos si el min qued\u00f3 M\u00c1S RESTRICTIVO que hoy (adelantado).\n            if(actual && actual > hoyISO){\n                $checkin.setAttribute('min', hoyISO);\n            }\n        });\n        rtMinObserver.observe($checkin, { attributes: true, attributeFilter: ['min'] });\n    } catch(e){}\n\n    \/\/ Cuando cambia checkin \u2192 actualizar min de checkout al d\u00eda siguiente\n    function actualizarMinCheckout(){\n        if(!$checkout) return;\n        if(!$checkin.value){\n            $checkout.setAttribute('min', hoyISO);\n            return;\n        }\n        var checkinDate = new Date($checkin.value + 'T00:00:00');\n        if(isNaN(checkinDate.getTime())) return;\n        var minCheckout = new Date(checkinDate);\n        minCheckout.setDate(minCheckout.getDate() + 1);\n        var minCheckoutISO = toISODate(minCheckout);\n        $checkout.setAttribute('min', minCheckoutISO);\n\n        \/\/ Si el checkout actual qued\u00f3 antes del nuevo min, limpiarlo\n        if($checkout.value && $checkout.value < minCheckoutISO){\n            $checkout.value = '';\n            try { $checkout.dispatchEvent(new Event('change', { bubbles: true })); } catch(e){}\n        }\n    }\n\n    $checkin.addEventListener('change', actualizarMinCheckout);\n    actualizarMinCheckout(); \/\/ estado inicial\n})();\n<\/script>\n\n\n<script>\n\/* ============================================================\n * \ud83c\udf89 SISTEMA DE NOTIFICACIONES MODERNAS (toasts + inline errors)\n *\n * Reemplaza los alert() nativos del navegador por feedback moderno.\n *\n * API global:\n *   rtToast.info(msg)\n *   rtToast.success(msg)\n *   rtToast.error(msg)\n *   rtToast.warning(msg)\n *\n *   rtFieldError(selector, msg)   \u2192 muestra error rojo debajo del campo\n *   rtClearFieldError(selector)   \u2192 limpia el error de ese campo\n *   rtClearAllFieldErrors()       \u2192 limpia todos los errores inline\n * ============================================================ *\/\n(function(){\n    if(window.rtToast) return; \/\/ ya est\u00e1 cargado\n\n    \/\/ \u2500\u2500\u2500\u2500\u2500 Toast container \u2500\u2500\u2500\u2500\u2500\n    function getContainer(){\n        var c = document.getElementById('rt-toast-container');\n        if(!c){\n            c = document.createElement('div');\n            c.id = 'rt-toast-container';\n            c.className = 'rt-toast-container';\n            document.body.appendChild(c);\n        }\n        return c;\n    }\n\n    var iconos = {\n        info:    '\u2139\ufe0f',\n        success: '\u2713',\n        error:   '\u2715',\n        warning: '\u26a0\ufe0f'\n    };\n\n    function showToast(tipo, mensaje, duracion){\n        if(typeof duracion !== 'number') duracion = 4000;\n        var c = getContainer();\n        var toast = document.createElement('div');\n        toast.className = 'rt-toast rt-toast-' + tipo;\n        toast.innerHTML =\n            '<span class=\"rt-toast-icon\">' + (iconos[tipo] || '') + '<\/span>' +\n            '<div class=\"rt-toast-body\"><\/div>' +\n            '<button type=\"button\" class=\"rt-toast-close\" aria-label=\"Cerrar\">\u00d7<\/button>';\n        toast.querySelector('.rt-toast-body').textContent = mensaje;\n        c.appendChild(toast);\n\n        function cerrar(){\n            if(!toast.parentNode) return;\n            toast.classList.add('rt-toast-leaving');\n            setTimeout(function(){\n                if(toast.parentNode) toast.parentNode.removeChild(toast);\n            }, 200);\n        }\n\n        toast.querySelector('.rt-toast-close').addEventListener('click', cerrar);\n        if(duracion > 0){\n            setTimeout(cerrar, duracion);\n        }\n        return toast;\n    }\n\n    window.rtToast = {\n        info:    function(msg, dur){ return showToast('info', msg, dur); },\n        success: function(msg, dur){ return showToast('success', msg, dur); },\n        error:   function(msg, dur){ return showToast('error', msg, dur); },\n        warning: function(msg, dur){ return showToast('warning', msg, dur); }\n    };\n\n\n    \/\/ \u2500\u2500\u2500\u2500\u2500 Inline field errors \u2500\u2500\u2500\u2500\u2500\n    function $resolveField(selector){\n        if(typeof selector === 'string'){\n            return document.querySelector(selector);\n        }\n        if(selector && selector.jquery) return selector[0];\n        return selector;\n    }\n\n    window.rtFieldError = function(selector, mensaje){\n        var $field = $resolveField(selector);\n        if(!$field) return;\n\n        \/\/ Marcar el input con borde rojo\n        $field.classList.add('rt-input-error');\n\n        \/\/ Buscar contenedor .rt-field padre\n        var $container = $field.closest('.rt-field') || $field.parentNode;\n\n        \/\/ \u00bfYa existe un error en este contenedor? actualizarlo\n        var $existing = $container.querySelector('.rt-field-error');\n        if($existing){\n            $existing.textContent = mensaje;\n            \/\/ re-disparar animaci\u00f3n\n            $existing.style.animation = 'none';\n            void $existing.offsetWidth; \/\/ forzar reflow\n            $existing.style.animation = '';\n            return;\n        }\n\n        \/\/ Crear nuevo error\n        var $err = document.createElement('div');\n        $err.className = 'rt-field-error';\n        $err.textContent = mensaje;\n        $container.appendChild($err);\n\n        \/\/ Auto-limpiar cuando el usuario interact\u00faa con el campo\n        var limpiarUnaVez = function(){\n            window.rtClearFieldError($field);\n            $field.removeEventListener('change', limpiarUnaVez);\n            $field.removeEventListener('input', limpiarUnaVez);\n            $field.removeEventListener('focus', limpiarUnaVez);\n        };\n        $field.addEventListener('change', limpiarUnaVez);\n        $field.addEventListener('input',  limpiarUnaVez);\n        $field.addEventListener('focus',  limpiarUnaVez);\n    };\n\n    window.rtClearFieldError = function(selector){\n        var $field = $resolveField(selector);\n        if(!$field) return;\n        $field.classList.remove('rt-input-error');\n        var $container = $field.closest('.rt-field') || $field.parentNode;\n        var $err = $container.querySelector('.rt-field-error');\n        if($err && $err.parentNode) $err.parentNode.removeChild($err);\n    };\n\n    window.rtClearAllFieldErrors = function(){\n        document.querySelectorAll('.rt-input-error').forEach(function(el){\n            el.classList.remove('rt-input-error');\n        });\n        document.querySelectorAll('.rt-field-error').forEach(function(el){\n            if(el.parentNode) el.parentNode.removeChild(el);\n        });\n    };\n})();\n<\/script>\n\n<script>\n\/* ============================================================\n * \ud83d\udecf\ufe0f VALIDACI\u00d3N DE PLAZAS \/ CANTIDAD DE PERSONAS (Step 1)\n *\n * Dos conteos distintos:\n *   \u2022 total       = adultos + ni\u00f1os + infantes  \u2192 capacidad F\u00cdSICA de la\n *                    habitaci\u00f3n (el infante ocupa plaza aunque no pague).\n *   \u2022 totalPagan  = adultos + ni\u00f1os + max(0, infantes-1) \u2192 umbral de GRUPO\n *                    GRANDE \/ cotizaci\u00f3n especial (el 1er infante es gratis).\n *\n *  ESTAD\u00cdA:\n *    - total \u2264 maxPlazas (hab. m\u00e1s grande) \u2192 OK, sin aviso\n *    - total > maxPlazas (hasta 9 pagan)   \u2192 aviso CELESTE \"2+ habitaciones\". BLOQUEA.\n *    - totalPagan \u2265 10                     \u2192 aviso AMARILLO con contactos. BLOQUEA.\n *  POR EL D\u00cdA:\n *    - totalPagan \u2265 10 \u2192 aviso AMARILLO con contactos. BLOQUEA.\n *    - resto \u2192 OK.\n * ============================================================ *\/\n(function(){\n    var MAX_PLAZAS = 8;\n\n    \/\/ Datos de contacto (desde Ajustes del admin)\n    var CONTACTO = {\n        telefono: \"+56991586623\",\n        whatsapp: \"56996864771\",\n        email:    \"eventos@termasdepanimavida.cl\"    };\n\n    var $tipo     = document.getElementById('tipo');\n    var $adultos  = document.getElementById('adultos');\n    var $ninos    = document.getElementById('ninos');\n    var $infantes = document.getElementById('infantes');\n    var $checkin  = document.getElementById('checkin');\n    var $checkout = document.getElementById('checkout');\n    var $aviso    = document.getElementById('rt-aviso-plazas');\n    var $rtForm   = document.querySelector('.rt-form');\n\n    \/\/ Recoge TODOS los botones que deben bloquearse: el \"Reservar\" del Step 1\n    \/\/ y el \"Aceptar\" del modal \"Modificar b\u00fasqueda\" (en Step 2 y Step 3).\n    function getBotones(){\n        return document.querySelectorAll(\n            '.rt-btn.reservar, .rt-btn[data-tipo=\"reserva\"], #rt-btn-aceptar-modal, .rt-btn-aceptar-modal'\n        );\n    }\n\n    if(!$tipo || !$adultos || !$aviso) return;\n\n    function intval(v){ var n = parseInt(v, 10); return isNaN(n) ? 0 : n; }\n\n    function mostrarAviso(tipoAviso, html){\n        $aviso.className = 'rt-aviso-plazas rt-aviso-' + tipoAviso;\n        $aviso.innerHTML = '<button type=\"button\" class=\"rt-aviso-cerrar\" aria-label=\"Cerrar\">\\u00D7<\/button>' + html;\n        $aviso.style.display = 'block';\n\n        \/\/ En m\u00f3vil: t\u00e9cnica portal. Mover el aviso al <body> para que escape\n        \/\/ de cualquier stacking context de Elementor\/tema y su z-index m\u00e1ximo\n        \/\/ gane sobre los botones flotantes del sitio (WhatsApp, etc).\n        var esMovil = window.matchMedia('(max-width: 768px)').matches;\n        if(esMovil){\n            if($aviso.parentNode !== document.body){\n                document.body.appendChild($aviso);\n            }\n        } else {\n            \/\/ En escritorio: devolverlo a su lugar original (dentro de .rt-form)\n            if($rtForm && $aviso.parentNode !== $rtForm){\n                $rtForm.insertBefore($aviso, $rtForm.firstChild);\n            }\n        }\n\n        if($rtForm){\n            $rtForm.classList.add('rt-tiene-aviso');\n            \/\/ Reservar espacio arriba (solo aplica en escritorio; en m\u00f3vil flota fijo)\n            requestAnimationFrame(function(){\n                if(window.matchMedia('(max-width: 768px)').matches){\n                    $rtForm.style.paddingTop = '';\n                } else {\n                    var h = $aviso.offsetHeight || 0;\n                    $rtForm.style.paddingTop = (h + 16) + 'px';\n                }\n            });\n        }\n        \/\/ Bot\u00f3n cerrar (\u00fatil sobre todo en m\u00f3vil, donde el aviso flota)\n        var $cerrar = $aviso.querySelector('.rt-aviso-cerrar');\n        if($cerrar){\n            $cerrar.addEventListener('click', function(){\n                $aviso.style.display = 'none';\n                if($rtForm) $rtForm.style.paddingTop = '';\n            });\n        }\n        $aviso.style.animation = 'none'; void $aviso.offsetWidth; $aviso.style.animation = '';\n    }\n    function ocultarAviso(){\n        $aviso.style.display = 'none';\n        $aviso.innerHTML = '';\n        if($rtForm){\n            $rtForm.classList.remove('rt-tiene-aviso');\n            $rtForm.style.paddingTop = '';\n        }\n    }\n    function bloquearBoton(bloquear){\n        getBotones().forEach(function($b){\n            if(bloquear){\n                $b.classList.add('rt-btn-bloqueado');\n                $b.setAttribute('data-bloqueado', '1');\n            } else {\n                $b.classList.remove('rt-btn-bloqueado');\n                $b.removeAttribute('data-bloqueado');\n            }\n        });\n    }\n\n    \/\/ Construye la l\u00ednea de contactos (tel \/ whatsapp \/ correo) como hiperv\u00ednculos chicos\n    function lineaContactos(){\n        var items = [];\n        if(CONTACTO.telefono){\n            var telLimpio = CONTACTO.telefono.replace(\/[^\\d+]\/g, '');\n            items.push('<a href=\"tel:' + telLimpio + '\">\\u260E\\uFE0F ' + CONTACTO.telefono + '<\/a>');\n        }\n        if(CONTACTO.whatsapp){\n            var waLimpio = CONTACTO.whatsapp.replace(\/[^\\d]\/g, '');\n            items.push('<a href=\"https:\/\/wa.me\/' + waLimpio + '\" target=\"_blank\" rel=\"noopener\">' +\n                '<svg viewBox=\"0 0 32 32\" width=\"15\" height=\"15\" style=\"vertical-align:-2px;margin-right:4px;\">' +\n                '<path fill=\"#25D366\" d=\"M16 .4C7.4.4.4 7.4.4 16c0 2.8.7 5.4 2 7.7L.3 31.6l8.1-2.1c2.2 1.2 4.8 1.9 7.5 1.9 8.6 0 15.6-7 15.6-15.6S24.6.4 16 .4z\"\/>' +\n                '<path fill=\"#fff\" d=\"M24.5 19.6c-.4-.2-2.5-1.2-2.9-1.4-.4-.1-.7-.2-.9.2-.3.4-1 1.4-1.3 1.6-.2.3-.5.3-.9.1-.4-.2-1.8-.7-3.4-2.1-1.3-1.1-2.1-2.5-2.4-2.9-.2-.4 0-.6.2-.8.2-.2.4-.5.6-.7.2-.2.3-.4.4-.7.1-.3.1-.5 0-.7-.1-.2-.9-2.2-1.3-3-.3-.8-.7-.7-.9-.7h-.8c-.3 0-.7.1-1 .5-.4.4-1.4 1.3-1.4 3.3s1.4 3.8 1.6 4.1c.2.3 2.8 4.3 6.8 6 .9.4 1.7.7 2.2.9.9.3 1.8.2 2.4.2.7-.1 2.2-.9 2.5-1.8.3-.9.3-1.6.2-1.8-.1-.1-.4-.2-.8-.4z\"\/>' +\n                '<\/svg>Ir a WhatsApp<\/a>');\n        }\n        if(CONTACTO.email){\n            items.push('<a href=\"mailto:' + CONTACTO.email + '\">\\u2709\\uFE0F ' + CONTACTO.email + '<\/a>');\n        }\n        if(items.length === 0) return '';\n        return '<div class=\"rt-aviso-contactos\">' + items.join('') + '<\/div>';\n    }\n\n    \/\/ \u2500\u2500 Noches m\u00ednimas por rango de fechas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    \/\/ Reglas activas impresas por PHP en data-noches-min del .rt-form.\n    var REGLAS_NOCHES = [];\n    try {\n        var $rtFormNM = document.querySelector('.rt-form');\n        if($rtFormNM){\n            REGLAS_NOCHES = JSON.parse($rtFormNM.getAttribute('data-noches-min') || '[]') || [];\n        }\n    } catch(e){ REGLAS_NOCHES = []; }\n\n    \/\/ Devuelve la lista de fechas-noche 'YYYY-MM-DD' de una estad\u00eda:\n    \/\/ las noches son desde el ingreso hasta la v\u00edspera de la salida.\n    function nochesDeEstadia(checkin, checkout){\n        var out = [];\n        if(!checkin || !checkout) return out;\n        var f1 = new Date(checkin + 'T00:00:00');\n        var f2 = new Date(checkout + 'T00:00:00');\n        if(isNaN(f1) || isNaN(f2) || f2 <= f1) return out;\n        var d = new Date(f1);\n        while(d < f2){\n            var y = d.getFullYear();\n            var m = ('0' + (d.getMonth() + 1)).slice(-2);\n            var dd = ('0' + d.getDate()).slice(-2);\n            out.push(y + '-' + m + '-' + dd);\n            d.setDate(d.getDate() + 1);\n        }\n        return out;\n    }\n\n    \/\/ \u00bfUna fecha 'YYYY-MM-DD' cae dentro de [desde, hasta] inclusive?\n    function fechaEnRango(f, desde, hasta){\n        return (f >= desde && f <= hasta);\n    }\n\n    \/\/ Formatea el rango 'YYYY-MM-DD'..'YYYY-MM-DD' como texto:\n    \/\/   mismo mes  -> \"17 y 19 de septiembre\"\n    \/\/   distinto   -> \"30 de septiembre y 2 de octubre\"\n    function rangoEnPalabras(desde, hasta){\n        var meses = ['enero','febrero','marzo','abril','mayo','junio','julio',\n                     'agosto','septiembre','octubre','noviembre','diciembre'];\n        function partes(ymd){\n            var m = \/^(\\d{4})-(\\d{2})-(\\d{2})$\/.exec(ymd || '');\n            if(!m) return null;\n            return { d: parseInt(m[3],10), mes: parseInt(m[2],10) - 1 };\n        }\n        var a = partes(desde), b = partes(hasta);\n        if(!a || !b) return 'estas fechas';\n        if(a.mes === b.mes){\n            return a.d + ' y ' + b.d + ' de ' + meses[a.mes];\n        }\n        return a.d + ' de ' + meses[a.mes] + ' y ' + b.d + ' de ' + meses[b.mes];\n    }\n\n    \/\/ \u2500\u2500 Aviso \"cuando baje la restricci\u00f3n\" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    var _reglaAvisoActual = null; \/\/ guarda la regla incumplida para el modal\n\n    function mostrarEnlaceAviso(falta){\n        _reglaAvisoActual = falta;\n        var $wrap = document.getElementById('rt-nm-aviso-link');\n        if(!$wrap) return;\n        $wrap.style.display = 'block';\n        \/\/ Centrar el enlace bajo el ancho del texto rojo (solo escritorio).\n        \/\/ El error puede desbordar la columna; medimos su ancho real y\n        \/\/ desplazamos el enlace para que su centro coincida con el del error.\n        try {\n            var esMovil = window.matchMedia('(max-width: 768px)').matches;\n            if(esMovil){\n                $wrap.style.marginLeft = '0';\n                $wrap.style.textAlign = 'center';\n                return;\n            }\n            var $err = document.getElementById('rt-nm-error');\n            var $linea = document.getElementById('rt-nm-linea');\n            if($err && $linea && $err.offsetWidth > 0){\n                \/\/ Ancho REAL del contenido (scrollWidth capta el desborde nowrap).\n                var anchoTexto = $linea.scrollWidth || $linea.getBoundingClientRect().width;\n                var anchoLink  = $wrap.scrollWidth || $wrap.getBoundingClientRect().width;\n                var offset = (anchoTexto - anchoLink) \/ 2;\n                $wrap.style.marginLeft = (offset > 0 ? offset : 0) + 'px';\n                $wrap.style.textAlign = 'left';\n            }\n        } catch(e){\n            $wrap.style.textAlign = 'center';\n        }\n    }\n    function ocultarEnlaceAviso(){\n        _reglaAvisoActual = null;\n        var $wrap = document.getElementById('rt-nm-aviso-link');\n        if($wrap){ $wrap.style.display = 'none'; }\n    }\n\n    function abrirModalAviso(){\n        var $m = document.getElementById('rt-modal-aviso');\n        if(!$m) return;\n        \/\/ Portal al body (evita recorte por contenedores de Elementor).\n        if($m.parentNode !== document.body){ document.body.appendChild($m); }\n        \/\/ Reset visual: mostrar formulario, ocultar confirmaci\u00f3n.\n        var $form = document.getElementById('rt-aviso-form');\n        var $intro = document.getElementById('rt-aviso-intro');\n        var $ok = document.getElementById('rt-aviso-ok');\n        var $err = document.getElementById('rt-aviso-error');\n        var $btn = document.getElementById('rt-aviso-enviar');\n        if($form) $form.style.display = 'block';\n        if($intro) $intro.style.display = 'block';\n        if($ok) $ok.style.display = 'none';\n        if($err){ $err.style.display = 'none'; $err.textContent = ''; }\n        if($btn){ $btn.disabled = false; $btn.textContent = 'Av\u00edsenme'; }\n        \/\/ Prellenar correo si ya lo ingres\u00f3.\n        var $inEmail = document.getElementById('rt-aviso-email');\n        var reg = document.getElementById('rt-email-registrado');\n        if($inEmail && reg && reg.textContent.trim() !== ''){\n            $inEmail.value = reg.textContent.trim();\n        }\n        $m.style.display = 'block';\n    }\n    function cerrarModalAviso(){\n        var $m = document.getElementById('rt-modal-aviso');\n        if($m) $m.style.display = 'none';\n    }\n\n    (function initModalAviso(){\n        var $a = document.getElementById('rt-nm-aviso-a');\n        if($a){ $a.addEventListener('click', function(e){ e.preventDefault(); abrirModalAviso(); }); }\n        var $x = document.getElementById('rt-modal-aviso-x');\n        var $ov = document.getElementById('rt-modal-aviso-ov');\n        if($x) $x.addEventListener('click', cerrarModalAviso);\n        if($ov) $ov.addEventListener('click', cerrarModalAviso);\n\n        var $enviar = document.getElementById('rt-aviso-enviar');\n        if($enviar){\n            $enviar.addEventListener('click', function(){\n                var nombre = (document.getElementById('rt-aviso-nombre').value || '').trim();\n                var email  = (document.getElementById('rt-aviso-email').value || '').trim();\n                var $err = document.getElementById('rt-aviso-error');\n                function fail(msg){ if($err){ $err.textContent = msg; $err.style.display = 'block'; } }\n                if(!nombre){ fail('Ingresa tu nombre.'); return; }\n                if(!email || !\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(email)){ fail('Ingresa un correo v\u00e1lido.'); return; }\n                if($err) $err.style.display = 'none';\n\n                var falta = _reglaAvisoActual || {};\n                var payload = {\n                    action: 'rt_noches_espera_add',\n                    nombre: nombre,\n                    email: email,\n                    regla_id: falta.regla_id || '',\n                    checkin: ($checkin ? $checkin.value : ''),\n                    checkout: ($checkout ? $checkout.value : '')\n                };\n                \/\/ nonce de rt_ajax (mismo que usa el resto del frontend).\n                try { if(typeof rt_ajax !== 'undefined' && rt_ajax.nonce){ payload.nonce = rt_ajax.nonce; } } catch(e){}\n                var url = (typeof rt_ajax !== 'undefined' && rt_ajax.url) ? rt_ajax.url : '\/wp-admin\/admin-ajax.php';\n\n                $enviar.disabled = true; $enviar.textContent = 'Enviando\u2026';\n                if(window.jQuery){\n                    jQuery.post(url, payload).done(function(res){\n                        if(res && res.success){ mostrarOkAviso(); }\n                        else { $enviar.disabled = false; $enviar.textContent = 'Av\u00edsenme'; fail((res && res.data) ? res.data : 'No se pudo guardar.'); }\n                    }).fail(function(){ $enviar.disabled = false; $enviar.textContent = 'Av\u00edsenme'; fail('Error de conexi\u00f3n.'); });\n                } else {\n                    \/\/ Fallback fetch.\n                    var body = Object.keys(payload).map(function(k){ return encodeURIComponent(k)+'='+encodeURIComponent(payload[k]); }).join('&');\n                    fetch(url, { method:'POST', headers:{'Content-Type':'application\/x-www-form-urlencoded'}, body:body })\n                        .then(function(r){ return r.json(); })\n                        .then(function(res){ if(res && res.success){ mostrarOkAviso(); } else { $enviar.disabled=false; $enviar.textContent='Av\u00edsenme'; fail('No se pudo guardar.'); } })\n                        .catch(function(){ $enviar.disabled=false; $enviar.textContent='Av\u00edsenme'; fail('Error de conexi\u00f3n.'); });\n                }\n            });\n        }\n    })();\n\n    function mostrarOkAviso(){\n        var $form = document.getElementById('rt-aviso-form');\n        var $intro = document.getElementById('rt-aviso-intro');\n        if($form) $form.style.display = 'none';\n        if($intro) $intro.style.display = 'none';\n        document.getElementById('rt-aviso-ok').style.display = 'block';\n        setTimeout(cerrarModalAviso, 3000);\n    }\n\n    \/\/ Eval\u00faa las reglas contra las fechas actuales. Devuelve:\n    \/\/   null si todo OK, o { min, etiqueta } de la regla que se incumple.\n    \/\/ Eval\u00faa las reglas con l\u00f3gica de \"bloque de noches consecutivas\".\n    \/\/ Para cada regla: cuenta cu\u00e1ntas noches de la estad\u00eda caen DENTRO del rango.\n    \/\/   - 0 noches dentro  -> la regla no aplica (permitido).\n    \/\/   - 1..min-1 dentro  -> rompe el bloque -> bloqueado.\n    \/\/   - >= min dentro     -> cumple (permitido).\n    \/\/ (Las noches dentro del rango son consecutivas por definici\u00f3n, as\u00ed que\n    \/\/  contar cu\u00e1ntas caen dentro equivale a exigir min consecutivas.)\n    function evaluarNochesMinimas(){\n        if(!REGLAS_NOCHES.length) return null;\n        var checkin  = $checkin ? $checkin.value : '';\n        var checkout = $checkout ? $checkout.value : '';\n        if(!checkin || !checkout) return null;\n\n        var f1 = new Date(checkin + 'T00:00:00');\n        var f2 = new Date(checkout + 'T00:00:00');\n        if(isNaN(f1) || isNaN(f2) || f2 <= f1) return null;\n\n        var noches = nochesDeEstadia(checkin, checkout);\n\n        for(var i = 0; i < REGLAS_NOCHES.length; i++){\n            var r = REGLAS_NOCHES[i];\n            var min = parseInt(r.min, 10) || 0;\n            if(min < 1) continue;\n\n            \/\/ Contar cu\u00e1ntas noches de la estad\u00eda caen dentro del rango.\n            var dentro = 0;\n            for(var j = 0; j < noches.length; j++){\n                if(fechaEnRango(noches[j], r.desde, r.hasta)) dentro++;\n            }\n\n            \/\/ Si toca el bloque (>=1) pero no cubre el m\u00ednimo -> rompe el bloque.\n            if(dentro >= 1 && dentro < min){\n                return { min: min, etiqueta: (r.etiqueta || ''), dentro: dentro, desde: r.desde, hasta: r.hasta, regla_id: (r.id || '') };\n            }\n        }\n        return null;\n    }\n\n    \/\/ Busca la primera regla cuyo rango contiene la fecha de ingreso dada.\n    \/\/ Devuelve la regla o null. (Para el popover informativo al elegir ingreso.)\n    function reglaParaIngreso(checkin){\n        if(!REGLAS_NOCHES.length || !checkin) return null;\n        for(var i = 0; i < REGLAS_NOCHES.length; i++){\n            var r = REGLAS_NOCHES[i];\n            if(fechaEnRango(checkin, r.desde, r.hasta)){\n                if((parseInt(r.min,10) || 0) >= 1) return r;\n            }\n        }\n        return null;\n    }\n\n    \/\/ Popover informativo (azul) bajo el campo de ingreso: avisa el m\u00ednimo\n    \/\/ apenas el cliente elige una fecha de ingreso en rango restringido.\n    function ocultarPopoverIngreso(){\n        var $pop = document.getElementById('rt-nm-popover');\n        if(!$pop) return;\n        $pop.style.display = 'none';\n        $pop.innerHTML = '';\n        $pop.classList.remove('rt-nm-popover-fixed');\n        if($pop.parentNode === document.body){\n            var $campo = $checkin ? ($checkin.closest('.rt-nm-input-wrap') || $checkin.closest('.rt-field')) : null;\n            if($campo) $campo.appendChild($pop);\n        }\n    }\n\n    function posicionarPopoverFlotante(){\n        var $pop = document.getElementById('rt-nm-popover');\n        if(!$pop || $pop.style.display === 'none' || !$checkin) return;\n        var esMovil = window.matchMedia('(max-width: 768px)').matches;\n        if(esMovil){\n            if($pop.parentNode !== document.body){ document.body.appendChild($pop); }\n            $pop.classList.add('rt-nm-popover-fixed');\n            var r = $checkin.getBoundingClientRect();\n            var pw = $pop.offsetWidth || 220;\n            var left = r.left + (r.width \/ 2) - (pw \/ 2);\n            if(left < 8) left = 8;\n            if(left + pw > window.innerWidth - 8) left = window.innerWidth - 8 - pw;\n            var top = r.top - ($pop.offsetHeight || 40) - 10;\n            if(top < 8) top = r.bottom + 8;\n            $pop.style.left = left + 'px';\n            $pop.style.top  = top + 'px';\n        } else {\n            var $wrap = $checkin.closest('.rt-nm-input-wrap') || $checkin.closest('.rt-field');\n            if($wrap && $pop.parentNode !== $wrap){ $wrap.appendChild($pop); }\n            $pop.classList.remove('rt-nm-popover-fixed');\n            $pop.style.left = '';\n            $pop.style.top  = '';\n        }\n    }\n\n    \/\/ Bandera: \u00bfalguno de los campos de fecha est\u00e1 enfocado\/abierto?\n    \/\/ El globo azul informativo solo debe verse mientras el cliente est\u00e1\n    \/\/ interactuando con las fechas; al soltar el foco se oculta.\n    var nmCampoFechaActivo = false;\n\n    function actualizarPopoverIngreso(){\n        var $pop = document.getElementById('rt-nm-popover');\n        if(!$pop) return;\n        \/\/ Solo mostrar el globo mientras el campo de fecha est\u00e1 enfocado\/abierto.\n        if(!nmCampoFechaActivo){ ocultarPopoverIngreso(); return; }\n        var tipo = $tipo ? $tipo.value : '';\n        var checkin = $checkin ? $checkin.value : '';\n        if(tipo !== 'estadia' || !checkin){ ocultarPopoverIngreso(); return; }\n        var r = reglaParaIngreso(checkin);\n        if(!r){ ocultarPopoverIngreso(); return; }\n        var checkout = $checkout ? $checkout.value : '';\n        if(checkout && evaluarNochesMinimas()){ ocultarPopoverIngreso(); return; }\n        var min = parseInt(r.min, 10) || 0;\n        var txt = (min === 1) ? '1 noche' : (min + ' noches consecutivas');\n        var etq = r.etiqueta ? ('<b>' + r.etiqueta + ':<\/b> ') : '';\n        $pop.innerHTML = etq + 'm\u00ednimo <b>' + txt + '<\/b>';\n        $pop.style.display = 'block';\n        posicionarPopoverFlotante();\n    }\n\n    function validar(){\n        \/\/ El globo flotante de ingreso se recalcula siempre; internamente se\n        \/\/ oculta si hay error (evita duplicar el mensaje).\n        actualizarPopoverIngreso();\n        \/\/ Limpiar el error de noches por defecto; se re-muestra si corresponde.\n        var $nmErrClear = document.getElementById('rt-nm-error');\n        if($nmErrClear){ $nmErrClear.classList.remove('rt-nm-error-visible'); $nmErrClear.style.display = 'none'; $nmErrClear.innerHTML = ''; }\n        var tipo     = $tipo.value;\n        var adultos  = intval($adultos.value);\n        var ninos    = intval($ninos && $ninos.value);\n        var infantes = intval($infantes && $infantes.value);\n\n        \/\/ Personas TOTALES: para capacidad f\u00edsica de la habitaci\u00f3n (el infante\n        \/\/ ocupa plaza aunque no pague).\n        var total = adultos + ninos + infantes;\n\n        \/\/ Personas que PAGAN: para el umbral de \"grupo grande \/ cotizaci\u00f3n\n        \/\/ especial\". El 1er infante (0-4 a\u00f1os) es gratis; del 2do en adelante\n        \/\/ s\u00ed cuenta. max(0, infantes - 1) evita negativos con 0 infantes.\n        var totalPagan = adultos + ninos + Math.max(0, infantes - 1);\n\n        \/\/ POR EL D\u00cdA: 10 o m\u00e1s personas que pagan \u2192 amarillo con contactos\n        if(tipo === 'dia'){\n            if(totalPagan >= 10){\n                mostrarAviso('eventos',\n                    '<p class=\"rt-aviso-titulo\"><span class=\"rt-aviso-emoji\">\\uD83D\\uDCDE<\/span>Grupos de <b>' + totalPagan + ' personas<\/b> requieren cotizaci\u00f3n especial<\/p>' +\n                    '<p class=\"rt-aviso-sub\">Si eres un grupo o delegaci\u00f3n especial, comun\u00edcate con ventas para un descuento especial por grupos grandes.<\/p>' +\n                    lineaContactos());\n                bloquearBoton(true);\n            } else {\n                ocultarAviso();\n                bloquearBoton(false);\n            }\n            return;\n        }\n\n        \/\/ ESTAD\u00cdA \u2014 10 o m\u00e1s personas que pagan \u2192 amarillo con contactos\n        if(totalPagan >= 10){\n            var nHabAmarillo = (MAX_PLAZAS > 0) ? Math.ceil(total \/ MAX_PLAZAS) : 2;\n            if(nHabAmarillo < 2) nHabAmarillo = 2;\n            mostrarAviso('eventos',\n                '<p class=\"rt-aviso-titulo\"><span class=\"rt-aviso-emoji\">\\uD83D\\uDCDE<\/span>Con <b>' + total + ' personas<\/b> necesitar\u00e1s <b>' + nHabAmarillo + ' o m\u00e1s habitaciones<\/b><\/p>' +\n                '<p class=\"rt-aviso-sub\">Si eres un grupo o delegaci\u00f3n especial, comun\u00edcate con ventas para un descuento especial por grupos grandes.<\/p>' +\n                lineaContactos());\n            bloquearBoton(true);\n            return;\n        }\n\n        \/\/ ESTAD\u00cdA \u2014 sobre la habitaci\u00f3n m\u00e1s grande (hasta 9) \u2192 celeste\n        if(MAX_PLAZAS > 0 && total > MAX_PLAZAS){\n            var nHabCeleste = Math.ceil(total \/ MAX_PLAZAS);\n            if(nHabCeleste < 2) nHabCeleste = 2;\n            mostrarAviso('info',\n                '<p class=\"rt-aviso-titulo\"><span class=\"rt-aviso-emoji\">\\uD83D\\uDECF\\uFE0F<\/span>Con <b>' + total + ' personas<\/b> necesitar\u00e1s <b>' + nHabCeleste + ' o m\u00e1s habitaciones<\/b><\/p>' +\n                '<p class=\"rt-aviso-sub\">Esta cantidad de hu\u00e9spedes supera la capacidad de una sola habitaci\u00f3n.<\/p>');\n            bloquearBoton(true);\n            return;\n        }\n\n        \/\/ ESTAD\u00cdA \u2014 noches m\u00ednimas por rango de fechas (Fiestas Patrias, etc.)\n        \/\/ Se eval\u00faa despu\u00e9s de las reglas de plazas (que tienen prioridad).\n        \/\/ El error se muestra como texto rojo bajo la Fecha de Salida (no como\n        \/\/ el aviso grande de arriba), y se bloquea el bot\u00f3n.\n        var $nmError = document.getElementById('rt-nm-error');\n        var faltaNoches = evaluarNochesMinimas();\n        if(faltaNoches){\n            var etq = faltaNoches.etiqueta ? ('<b>' + faltaNoches.etiqueta + ':<\/b> ') : '';\n            var txtNoches = faltaNoches.min === 1 ? '1 noche' : (faltaNoches.min + ' noches consecutivas');\n            var rango = rangoEnPalabras(faltaNoches.desde, faltaNoches.hasta);\n            if($nmError){\n                $nmError.innerHTML = '\\u26A0\\uFE0F ' + etq + 'debes reservar ' + txtNoches +\n                    ' entre el ' + rango;\n                $nmError.classList.add('rt-nm-error-visible');\n                var esMovilNM = window.matchMedia('(max-width: 768px)').matches;\n                $nmError.style.display = esMovilNM ? 'block' : 'inline';\n            }\n            \/\/ Enlace gris: pedir aviso cuando baje la restricci\u00f3n.\n            mostrarEnlaceAviso(faltaNoches);\n            ocultarAviso();\n            bloquearBoton(true);\n            return;\n        }\n        ocultarEnlaceAviso();\n        if($nmError){ $nmError.classList.remove('rt-nm-error-visible'); $nmError.style.display = 'none'; $nmError.innerHTML = ''; }\n\n        \/\/ Todo OK\n        ocultarAviso();\n        bloquearBoton(false);\n    }\n\n    \/\/ Al cambiar el TIPO (estad\u00eda \u2194 por el d\u00eda), limpiar la cantidad de personas\n    \/\/ a sus valores por defecto, para no arrastrar grupos grandes de un modo a otro.\n    $tipo.addEventListener('change', function(){\n        $adultos.value = '2';\n        if($ninos)    $ninos.value = '0';\n        if($infantes) $infantes.value = '0';\n        \/\/ Notificar a otros scripts (subtotales, etc.) que los valores cambiaron\n        try { $adultos.dispatchEvent(new Event('change', { bubbles: true })); } catch(e){}\n        if($ninos)    { try { $ninos.dispatchEvent(new Event('change', { bubbles: true })); } catch(e){} }\n        if($infantes) { try { $infantes.dispatchEvent(new Event('change', { bubbles: true })); } catch(e){} }\n        validar();\n    });\n    $adultos.addEventListener('change', validar);\n    if($ninos)    $ninos.addEventListener('change', validar);\n    if($infantes) $infantes.addEventListener('change', validar);\n    \/\/ Revalidar tambi\u00e9n al cambiar las fechas (para noches m\u00ednimas).\n    if($checkin)  { $checkin.addEventListener('change', validar); $checkin.addEventListener('input', validar); }\n    if($checkout) { $checkout.addEventListener('change', validar); $checkout.addEventListener('input', validar); }\n\n    \/\/ Globo azul informativo: solo visible mientras un campo de fecha tiene el\n    \/\/ foco (o su calendario est\u00e1 abierto). Al soltar el foco se oculta.\n    \/\/ El blur usa un peque\u00f1o retardo para no parpadear al saltar de ingreso a\n    \/\/ salida (el foco pasa de un input al otro sin que se cierre el aviso).\n    (function initFocoFechas(){\n        function onFocoFecha(){ nmCampoFechaActivo = true; actualizarPopoverIngreso(); }\n        function onBlurFecha(){\n            setTimeout(function(){\n                var act = document.activeElement;\n                var siguePuesto = (act === $checkin || act === $checkout);\n                if(!siguePuesto){ nmCampoFechaActivo = false; ocultarPopoverIngreso(); }\n            }, 120);\n        }\n        if($checkin){  $checkin.addEventListener('focus', onFocoFecha);  $checkin.addEventListener('blur', onBlurFecha); }\n        if($checkout){ $checkout.addEventListener('focus', onFocoFecha); $checkout.addEventListener('blur', onBlurFecha); }\n    })();\n\n    \/\/ Interceptar el click de cualquier bot\u00f3n bloqueado (Reservar o Aceptar del modal).\n    \/\/ A nivel document con captura: funciona aunque el modal se inyecte despu\u00e9s.\n    document.addEventListener('click', function(e){\n        var $b = e.target.closest(\n            '.rt-btn.reservar, .rt-btn[data-tipo=\"reserva\"], #rt-btn-aceptar-modal, .rt-btn-aceptar-modal'\n        );\n        if(!$b) return;\n        \/\/ Bloqueado si tiene el flag, o si hay un aviso de plazas visible, o si\n        \/\/ hay error de noches m\u00ednimas visible bajo la Fecha de Salida.\n        var hayAviso = $aviso && $aviso.style.display !== 'none' && $aviso.innerHTML.trim() !== '';\n        var $nmErr = document.getElementById('rt-nm-error');\n        var hayErrorNoches = $nmErr && $nmErr.classList.contains('rt-nm-error-visible');\n        if($b.getAttribute('data-bloqueado') === '1' || hayAviso || hayErrorNoches){\n            e.preventDefault();\n            e.stopImmediatePropagation();\n            if(window.rtToast){\n                var msg = 'Revisa los datos de tu reserva para continuar.';\n                if(hayErrorNoches){\n                    msg = 'Ajusta tu fecha de salida para cumplir la estad\u00eda m\u00ednima.';\n                } else if($aviso && $aviso.innerHTML.indexOf('habitaciones') !== -1){\n                    msg = 'Para ese n\u00famero de personas, necesitas 2 o m\u00e1s habitaciones.';\n                }\n                rtToast.warning(msg);\n            }\n        }\n    }, true);\n\n    \/\/ Reposicionar el globo flotante al hacer scroll o cambiar tama\u00f1o\n    \/\/ (relevante en m\u00f3vil, donde el globo vive en el body con position:fixed).\n    window.addEventListener('scroll', function(){ posicionarPopoverFlotante(); }, { passive: true });\n    window.addEventListener('resize', function(){ posicionarPopoverFlotante(); });\n\n    \/\/ Estado inicial\n    validar();\n})();\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   \ud83c\udfe8 SELECTOR MULTI-HABITACI\u00d3N: Dropdown + Bottom Sheet\n   Solo activo en ESTAD\u00cdA. En \"por el d\u00eda\" se ocultan estos\n   controles y vuelven los campos cl\u00e1sicos intactos.\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\/\/ \ud83d\udecf\ufe0f Caps m\u00e1x del hotel expuestos desde PHP (fuente: rt_get_capacidades_max()).\n\/\/ Se inyectan ANTES del IIFE para que el selector los lea al arrancar.\nwindow.RT_CAPS_MAX = {\"adultos\":6,\"ninos\":5,\"infantes\":6,\"plazas_fisicas\":8};\n\/\/ Si el PHP precalcul\u00f3 caps con fechas de URL, exponemos la key para\n\/\/ que el JS use ese cache inicial sin re-consultar.\nwindow.RT_CAPS_PRECALC_FECHA = \"\";\n\/\/ \ud83d\udcc5 Mapa de disponibilidad 12 meses: para calcular caps por fecha\n\/\/ LOCALMENTE en JS sin llamadas AJAX\/REST (evita bloqueos de WAF).\nwindow.RT_DISPONIBILIDAD = {\"habitaciones\":[{\"id\":15767,\"caps\":[{\"adultos\":3,\"ninos\":2,\"infantes\":3,\"plazas_fisicas\":5}],\"dias_off\":[\"2026-09-24\",\"2026-09-25\",\"2026-09-27\",\"2026-09-28\",\"2026-09-29\",\"2026-09-30\",\"2026-10-01\",\"2026-10-02\",\"2026-10-03\",\"2026-10-04\",\"2026-10-05\",\"2026-10-06\",\"2026-10-07\",\"2026-10-08\",\"2026-10-09\",\"2026-10-10\",\"2026-10-11\",\"2026-10-12\",\"2026-10-13\",\"2026-10-14\",\"2026-10-15\",\"2026-10-16\",\"2026-10-17\",\"2026-10-18\",\"2026-10-19\",\"2026-10-20\",\"2026-10-21\",\"2026-10-22\",\"2026-10-25\",\"2026-10-26\",\"2026-10-27\",\"2026-10-28\",\"2026-10-29\",\"2026-10-30\",\"2026-10-31\",\"2026-11-01\",\"2026-11-02\",\"2026-11-03\",\"2026-11-04\",\"2026-11-05\",\"2026-11-06\",\"2026-11-07\",\"2026-11-08\",\"2026-11-09\",\"2026-11-10\",\"2026-11-11\",\"2026-11-12\",\"2026-11-13\",\"2026-11-14\",\"2026-11-15\",\"2026-11-16\",\"2026-11-17\",\"2026-11-18\",\"2026-11-19\",\"2026-11-20\",\"2026-11-21\",\"2026-11-22\",\"2026-11-23\",\"2026-11-24\",\"2026-11-25\",\"2026-11-26\",\"2026-11-27\",\"2026-11-28\",\"2026-11-29\",\"2026-11-30\",\"2026-12-01\",\"2026-12-02\",\"2026-12-03\",\"2026-12-04\",\"2026-12-05\",\"2026-12-06\",\"2026-12-07\",\"2026-12-08\",\"2026-12-09\",\"2026-12-10\",\"2026-12-11\",\"2026-12-12\",\"2026-12-13\",\"2026-12-14\",\"2026-12-15\",\"2026-12-16\",\"2026-12-17\",\"2026-12-18\",\"2026-12-19\",\"2026-12-20\",\"2026-12-21\",\"2026-12-22\",\"2026-12-23\",\"2026-12-24\",\"2026-12-25\",\"2026-12-26\",\"2026-12-27\",\"2026-12-28\",\"2026-12-29\",\"2026-12-30\",\"2026-12-31\",\"2027-01-01\"]},{\"id\":15671,\"caps\":[{\"adultos\":6,\"ninos\":5,\"infantes\":6,\"plazas_fisicas\":8}],\"dias_off\":[\"2026-09-26\"]},{\"id\":15670,\"caps\":[{\"adultos\":3,\"ninos\":2,\"infantes\":3,\"plazas_fisicas\":4}],\"dias_off\":[]},{\"id\":15666,\"caps\":[{\"adultos\":4,\"ninos\":3,\"infantes\":4,\"plazas_fisicas\":6}],\"dias_off\":[]},{\"id\":15664,\"caps\":[{\"adultos\":4,\"ninos\":3,\"infantes\":4,\"plazas_fisicas\":6}],\"dias_off\":[\"2026-12-31\",\"2027-01-01\"]},{\"id\":15662,\"caps\":[{\"adultos\":2,\"ninos\":1,\"infantes\":2,\"plazas_fisicas\":4}],\"dias_off\":[\"2026-09-26\",\"2026-12-31\",\"2027-01-01\"]}],\"rango_ini\":\"2026-09-24\",\"rango_fin\":\"2027-09-24\"};\n\/\/ \ud83d\udd0d Modo debug: activar con ?rt_debug=1 en la URL. Imprime en consola\n\/\/ cada paso del flujo de caps por fecha para diagnosticar problemas.\nwindow.RT_CAPS_DEBUG = false;\n\n(function(){\n    'use strict';\n    window.RT_STEP1_MULTI_BUILD = 'step1-multi-v14.6.1-wording-fecha-2026-09-15';\n\n    \/\/ \ud83d\udecf\ufe0f Caps reales del hotel (fuente: rt_get_capacidades_max()).\n    \/\/ Fallback a 10 si algo raro pasa server-side, para no bloquear la UI.\n    var RT_CAPS = (window.RT_CAPS_MAX && typeof window.RT_CAPS_MAX === 'object')\n        ? window.RT_CAPS_MAX\n        : {adultos:10, ninos:10, infantes:10, plazas_fisicas:10};\n    var MAX_TOTAL_HAB = parseInt(RT_CAPS.plazas_fisicas, 10) || 10;\n\n    var FIELDS = [\n        {key:'adultos',  label:'Adultos',  sub:'Desde 10 a\u00f1os',  min:1, def:2, max: (parseInt(RT_CAPS.adultos,10)  || 10)},\n        {key:'ninos',    label:'Ni\u00f1os',    sub:'De 5 a 9 a\u00f1os',  min:0, def:0, max: (parseInt(RT_CAPS.ninos,10)    || 10)},\n        {key:'infantes', label:'Infantes', sub:'De 0 a 4 a\u00f1os',  min:0, def:0, max: (parseInt(RT_CAPS.infantes,10) || 10)},\n        {key:'mascotas', label:'Mascotas', sub:'1 hasta 15 kg',  min:0, def:0, max:1}\n    ];\n    function newRoom(){ var r={}; FIELDS.forEach(function(f){r[f.key]=f.def}); return r; }\n    var state = {\n        rooms: [newRoom()],\n        isOpen: false,\n        _roomNueva: -1,\n        \/\/ Si el PHP precalcul\u00f3 caps con fechas de URL, marcamos ese cache como\n        \/\/ ya cargado \u2014 as\u00ed al abrir el picker no hace AJAX innecesario.\n        _lastCapsFecha: (window.RT_CAPS_PRECALC_FECHA || '')\n    };\n\n    \/\/ \ud83d\udd0d Debug helper: activo con ?rt_debug=1. Imprime cada paso del flujo.\n    var RT_DEBUG = !!window.RT_CAPS_DEBUG;\n    function dbg(){\n        if(!RT_DEBUG) return;\n        var args = ['[RT-CAPS]'].concat(Array.prototype.slice.call(arguments));\n        try { console.log.apply(console, args); } catch(e){}\n    }\n    dbg('INIT \u00b7 RT_CAPS_MAX=', RT_CAPS, '\u00b7 precalc_fecha=', state._lastCapsFecha);\n\n    \/\/ \u2500\u2500 Helpers de tope inteligente \u2500\u2500\n    \/\/ Personas humanas (excluye mascotas) que suma una habitaci\u00f3n.\n    function personasEnHab(r){ return (r.adultos|0) + (r.ninos|0) + (r.infantes|0); }\n    \/\/ \u00bfEl bot\u00f3n + de este campo debe deshabilitarse en esta habitaci\u00f3n?\n    function plusDeshabilitado(r, fkey){\n        if(fkey === 'mascotas'){\n            return (r.mascotas|0) >= 1;\n        }\n        var fdef = null;\n        for(var i=0;i<FIELDS.length;i++){ if(FIELDS[i].key===fkey){ fdef=FIELDS[i]; break; } }\n        if(!fdef) return false;\n        \/\/ Tope por tipo (adultos\/ninos\/infantes por separado)\n        if((r[fkey]|0) >= fdef.max) return true;\n        \/\/ Tope total de plazas de la habitaci\u00f3n m\u00e1s grande\n        if(personasEnHab(r) >= MAX_TOTAL_HAB) return true;\n        return false;\n    }\n    \/\/ Motivo por el que se rechaza subir un campo (para el toast).\n    function motivoTope(r, fkey){\n        var fdef = null;\n        for(var i=0;i<FIELDS.length;i++){ if(FIELDS[i].key===fkey){ fdef=FIELDS[i]; break; } }\n        if(fdef && (r[fkey]|0) >= fdef.max){\n            return 'La habitaci\u00f3n m\u00e1s grande para esa fecha admite hasta ' + fdef.max + ' ' + fdef.label.toLowerCase() + '. Agrega otra habitaci\u00f3n para m\u00e1s hu\u00e9spedes.';\n        }\n        if(personasEnHab(r) >= MAX_TOTAL_HAB){\n            return 'La habitaci\u00f3n m\u00e1s grande para esa fecha admite hasta ' + MAX_TOTAL_HAB + ' personas. Agrega otra habitaci\u00f3n para m\u00e1s hu\u00e9spedes.';\n        }\n        return '';\n    }\n    \/\/ Anti-spam del toast (evita m\u00faltiples toasts si aporrean el +).\n    var _toastMaxLast = 0;\n    function avisarTope(msg){\n        var now = Date.now();\n        if(now - _toastMaxLast < 1200) return;\n        _toastMaxLast = now;\n        if(window.rtToast && rtToast.warning) rtToast.warning(msg);\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ \ud83d\uddd3\ufe0f CAPA \"FECHAS ANTES QUE HU\u00c9SPEDES\"\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n    \/\/ \u00bfHay checkin y checkout v\u00e1lidos en el DOM? Modo \"estad\u00eda\" solamente\n    \/\/ (en modo \"por el d\u00eda\" el picker multi ni siquiera se muestra).\n    function tieneFechasValidas(){\n        var ci = document.getElementById('checkin');\n        var co = document.getElementById('checkout');\n        if(!ci || !co) return false;\n        var v1 = (ci.value || '').trim();\n        var v2 = (co.value || '').trim();\n        if(!v1 || !v2) return false;\n        \/\/ Formato YYYY-MM-DD y checkout > checkin\n        var re = \/^\\d{4}-\\d{2}-\\d{2}$\/;\n        if(!re.test(v1) || !re.test(v2)) return false;\n        return v2 > v1;\n    }\n\n    \/\/ Cuando falta alguna fecha: toast + scroll + foco al primer campo faltante.\n    var _toastFechasLast = 0;\n    function mostrarErrorSinFechas(){\n        var ci = document.getElementById('checkin');\n        var co = document.getElementById('checkout');\n        var faltante = null;\n        if(!ci || !(ci.value || '').trim()) faltante = ci;\n        else if(!co || !(co.value || '').trim()) faltante = co;\n        else faltante = ci;\n\n        \/\/ Toast anti-spam\n        var now = Date.now();\n        if(now - _toastFechasLast > 1200){\n            _toastFechasLast = now;\n            if(window.rtToast && rtToast.warning){\n                rtToast.warning('Selecciona primero las fechas de tu estad\u00eda para ver disponibilidad.');\n            }\n        }\n\n        \/\/ Scroll + foco\n        if(faltante){\n            try { faltante.scrollIntoView({behavior:'smooth', block:'center'}); } catch(e){ faltante.scrollIntoView(); }\n            setTimeout(function(){ try { faltante.focus(); } catch(e){} }, 350);\n            \/\/ Resaltar visualmente por 2s\n            faltante.classList.add('rt-flash-required');\n            setTimeout(function(){ faltante.classList.remove('rt-flash-required'); }, 2000);\n        }\n    }\n\n    \/\/ Ajusta pax a la baja si exceden los nuevos topes. Devuelve true si ajust\u00f3 algo.\n    function ajustarPaxSiExcede(){\n        var ajusto = false;\n        state.rooms.forEach(function(r){\n            \/\/ Cap por tipo\n            FIELDS.forEach(function(f){\n                if(f.key === 'mascotas') return;\n                if((r[f.key]|0) > f.max){ r[f.key] = f.max; ajusto = true; }\n            });\n            \/\/ Cap total: bajar en orden infantes \u2192 ni\u00f1os \u2192 adultos (protegiendo min:1 adulto)\n            var guard = 0;\n            while(personasEnHab(r) > MAX_TOTAL_HAB && guard < 30){\n                if((r.infantes|0) > 0) r.infantes--;\n                else if((r.ninos|0) > 0) r.ninos--;\n                else if((r.adultos|0) > 1) r.adultos--;\n                else break;\n                ajusto = true;\n                guard++;\n            }\n        });\n        return ajusto;\n    }\n\n    \/\/ Aplica caps nuevos al estado local (FIELDS + MAX_TOTAL_HAB + ajuste de pax).\n    function aplicarCapsNuevos(nuevos){\n        if(!nuevos || typeof nuevos !== 'object') return false;\n        \/\/ Solo aplicar si los valores tienen sentido (evita romper con 0\/faltantes)\n        var a = parseInt(nuevos.adultos, 10);\n        var n = parseInt(nuevos.ninos, 10);\n        var i = parseInt(nuevos.infantes, 10);\n        var p = parseInt(nuevos.plazas_fisicas, 10);\n        if(!(a > 0 && p > 0)) return false; \/\/ config vac\u00eda \u2192 mantener actual\n\n        FIELDS[0].max = a;\n        FIELDS[1].max = Math.max(0, n|0);\n        FIELDS[2].max = Math.max(0, i|0);\n        MAX_TOTAL_HAB = p;\n        RT_CAPS = {adultos:a, ninos:FIELDS[1].max, infantes:FIELDS[2].max, plazas_fisicas:p};\n        return ajustarPaxSiExcede();\n    }\n\n    \/\/ Calcula caps m\u00e1ximos LOCALMENTE usando window.RT_DISPONIBILIDAD.\n    \/\/ Sin AJAX, sin REST, sin reload. Todo en frontend.\n    \/\/ Devuelve {adultos, ninos, infantes, plazas_fisicas} para las fechas dadas.\n    function calcularCapsLocal(checkin, checkout){\n        var max = {adultos:0, ninos:0, infantes:0, plazas_fisicas:0};\n        var disp = window.RT_DISPONIBILIDAD;\n        if(!disp || !disp.habitaciones){\n            dbg('calcularCapsLocal: sin RT_DISPONIBILIDAD, fallback a globales');\n            return RT_CAPS; \/\/ fallback a caps globales del PHP inicial\n        }\n        for(var i = 0; i < disp.habitaciones.length; i++){\n            var hab = disp.habitaciones[i];\n            \/\/ \u00bfAlg\u00fan d\u00eda del rango cae en dias_off? Rango = [checkin, checkout)\n            var libre = true;\n            if(hab.dias_off && hab.dias_off.length){\n                for(var j = 0; j < hab.dias_off.length; j++){\n                    var dia = hab.dias_off[j];\n                    \/\/ El d\u00eda debe estar entre checkin (inclusive) y checkout (exclusive)\n                    if(dia >= checkin && dia < checkout){\n                        libre = false;\n                        break;\n                    }\n                }\n            }\n            if(!libre) continue;\n            \/\/ Habitaci\u00f3n disponible en el rango: sumar sus capacidades al m\u00e1ximo\n            if(hab.caps && hab.caps.length){\n                for(var k = 0; k < hab.caps.length; k++){\n                    var c = hab.caps[k];\n                    if((c.adultos|0)        > max.adultos)        max.adultos        = c.adultos|0;\n                    if((c.ninos|0)          > max.ninos)          max.ninos          = c.ninos|0;\n                    if((c.infantes|0)       > max.infantes)       max.infantes       = c.infantes|0;\n                    if((c.plazas_fisicas|0) > max.plazas_fisicas) max.plazas_fisicas = c.plazas_fisicas|0;\n                }\n            }\n        }\n        return max;\n    }\n\n    \/\/ Actualiza caps por fecha usando c\u00e1lculo local. Reemplaza al viejo\n    \/\/ refrescarCapsDesdeServer (que depend\u00eda de AJAX bloqueado por WAF).\n    \/\/ Instant\u00e1neo, sin red, sin recarga.\n    var _refreshInflight = false; \/\/ se mantiene por compat con llamadores viejos\n    function refrescarCapsDesdeServer(callback){\n        var ci = document.getElementById('checkin');\n        var co = document.getElementById('checkout');\n        if(!ci || !co || !tieneFechasValidas()){\n            dbg('local skip: sin fechas v\u00e1lidas');\n            if(typeof callback === 'function') callback(false);\n            return;\n        }\n        var checkin  = ci.value.trim();\n        var checkout = co.value.trim();\n        var key = checkin + '|' + checkout;\n        if(key === state._lastCapsFecha){\n            dbg('local skip: cache hit', key);\n            if(typeof callback === 'function') callback(true);\n            return;\n        }\n        dbg('calculando caps local para:', key);\n\n        var nuevos = calcularCapsLocal(checkin, checkout);\n        dbg('caps calculados:', nuevos);\n\n        \/\/ Si el c\u00e1lculo local dio 0 en todo (algo raro), no aplicar\n        if(nuevos.adultos <= 0 || nuevos.plazas_fisicas <= 0){\n            dbg('local: caps vac\u00edos, ignorando');\n            if(typeof callback === 'function') callback(false);\n            return;\n        }\n\n        state._lastCapsFecha = key;\n        var ajusto = aplicarCapsNuevos(nuevos);\n        dbg('aplicados. ajust\u00f3 pax?', ajusto, '\u00b7 FIELDS.max=', FIELDS.map(function(f){return f.key+':'+f.max;}), '\u00b7 MAX_TOTAL=', MAX_TOTAL_HAB);\n        if(ajusto && window.rtToast && rtToast.info){\n            rtToast.info('Se ajustaron los hu\u00e9spedes seg\u00fan la disponibilidad de las fechas elegidas.');\n        }\n        renderAll();\n        if(typeof callback === 'function') callback(true);\n    }\n\n    var trigger    = document.getElementById('rt-guest-trigger');\n    var summaryEl  = document.getElementById('rt-guest-summary');\n    var dropdown   = document.getElementById('rt-guest-dropdown');\n    var ddBody     = document.getElementById('rt-guest-dd-body');\n    var btnAdd     = document.getElementById('rt-guest-btn-add');\n    var btnListo   = document.getElementById('rt-guest-btn-listo');\n    var sheetMask  = document.getElementById('rt-guest-sheet-mask');\n    var sheetBody  = document.getElementById('rt-guest-sheet-body');\n    var btnAddM    = document.getElementById('rt-guest-btn-add-mobile');\n    var btnListoM  = document.getElementById('rt-guest-btn-listo-mobile');\n    var sheetClose = document.getElementById('rt-guest-sheet-close');\n    var fieldHuesped = document.getElementById('rt-field-huespedes');\n\n    \/\/ PATR\u00d3N PORTAL: mover el dropdown a document.body para escapar de\n    \/\/ cualquier ancestro con transform\/overflow de Elementor que romper\u00eda\n    \/\/ el position:fixed o lo recortar\u00eda.\n    if(dropdown && dropdown.parentNode !== document.body){\n        document.body.appendChild(dropdown);\n    }\n\n    var $tipo     = document.getElementById('tipo');\n    var $adultos  = document.getElementById('adultos');\n    var $ninos    = document.getElementById('ninos');\n    var $infantes = document.getElementById('infantes');\n    var $mascotas = document.getElementById('mascotas');\n\n    function isMobile(){ return window.matchMedia('(max-width:768px)').matches; }\n\n    \/* \u2500\u2500 Mostrar\/ocultar seg\u00fan el tipo \u2500\u2500 *\/\n    function esEstadia(){ return $tipo && $tipo.value === 'estadia'; }\n\n    function aplicarModo(){\n        var form = document.querySelector('form.rt-step1-form-anim') ||\n                   (fieldHuesped ? fieldHuesped.closest('form') : null);\n        if(esEstadia()){\n            if(form) form.setAttribute('data-rt-modo', 'estadia');\n            syncHiddenFromRoom0();\n        } else {\n            if(form) form.setAttribute('data-rt-modo', 'dia');\n            if(state.isOpen) closeGuests();\n        }\n    }\n\n    \/* \u2500\u2500 Sincronizar room[0] a los selects cl\u00e1sicos \u2500\u2500 *\/\n    function syncHiddenFromRoom0(){\n        if(!esEstadia()) return;\n        var r = state.rooms[0];\n        if($adultos)  $adultos.value  = String(r.adultos);\n        if($ninos)    $ninos.value    = String(r.ninos);\n        if($infantes) $infantes.value = String(r.infantes);\n        if($mascotas) $mascotas.value = String(Math.min(1, r.mascotas));\n        try{\n            if($adultos)  $adultos.dispatchEvent(new Event('change',{bubbles:true}));\n            if($ninos)    $ninos.dispatchEvent(new Event('change',{bubbles:true}));\n            if($infantes) $infantes.dispatchEvent(new Event('change',{bubbles:true}));\n            if($mascotas) $mascotas.dispatchEvent(new Event('change',{bubbles:true}));\n        }catch(e){}\n    }\n\n    function updateSummary(){\n        var t={adultos:0,ninos:0,infantes:0,mascotas:0};\n        state.rooms.forEach(function(r){ FIELDS.forEach(function(f){t[f.key]+=r[f.key]}); });\n        var hab = state.rooms.length;\n        var parts = [];\n        parts.push(t.adultos + ' Adulto' + (t.adultos!==1?'s':''));\n        if(t.ninos)    parts.push(t.ninos + ' Ni\u00f1o' + (t.ninos>1?'s':''));\n        if(t.infantes) parts.push(t.infantes + ' Infante' + (t.infantes>1?'s':''));\n        if(t.mascotas) parts.push(t.mascotas + ' Mascota' + (t.mascotas>1?'s':''));\n        parts.push(hab + ' Habitaci' + (hab!==1?'ones':'\u00f3n'));\n        if(summaryEl) summaryEl.textContent = parts.join(', ');\n    }\n\n    function totalBannerHTML(){\n        if(state.rooms.length <= 1) return '';\n        var t={adultos:0,ninos:0,infantes:0,mascotas:0};\n        state.rooms.forEach(function(r){ FIELDS.forEach(function(f){t[f.key]+=r[f.key]}); });\n        var pers = t.adultos + t.ninos + t.infantes;\n        var hab = state.rooms.length;\n        return '<div class=\"rt-guest-total-banner\">' +\n            '<span class=\"rt-guest-total-banner-l\">Total reserva<\/span>' +\n            '<span class=\"rt-guest-total-banner-v\">' + hab + ' hab. \u00b7 ' + pers + ' pers.' +\n            (t.mascotas ? ' \u00b7 ' + t.mascotas + ' masc.' : '') + '<\/span><\/div>';\n    }\n\n    function roomsHTML(scope){\n        var html = '';\n        state.rooms.forEach(function(r,i){\n            var esNueva = (state._roomNueva === i);\n            \/\/ Microhint din\u00e1mico: solo aparece cuando est\u00e1 cerca (\u2265 max-1) o al tope.\n            var pers = personasEnHab(r);\n            var hintHtml = '';\n            if(pers >= (MAX_TOTAL_HAB - 1)){\n                var atTope = (pers >= MAX_TOTAL_HAB);\n                hintHtml = '<div class=\"rt-guest-room-hint' + (atTope ? ' at-max' : '') + '\">' +\n                    (atTope\n                        ? 'Al tope: m\u00e1x. ' + MAX_TOTAL_HAB + ' personas por habitaci\u00f3n'\n                        : 'Cerca del m\u00e1x. (' + pers + '\/' + MAX_TOTAL_HAB + ' personas)') +\n                    '<\/div>';\n            }\n            html += '<div class=\"rt-guest-room' + (esNueva ? ' rt-room-nueva' : '') + '\">' +\n                '<div class=\"rt-guest-room-head\">' +\n                    '<div class=\"rt-guest-room-title-wrap\">' +\n                        '<span class=\"rt-guest-room-badge\">' + (i+1) + '<\/span>' +\n                        '<span class=\"rt-guest-room-title\">Habitaci\u00f3n ' + (i+1) + '<\/span>' +\n                    '<\/div>' +\n                    (i > 0 ? '<button type=\"button\" class=\"rt-guest-room-remove\" data-rt-remove=\"'+i+'\">Eliminar<\/button>' : '') +\n                '<\/div>' + hintHtml;\n            FIELDS.forEach(function(f){\n                var plusOff = plusDeshabilitado(r, f.key);\n                var minusOff = (r[f.key]|0) <= f.min;\n                html += '<div class=\"rt-guest-pax-row\">' +\n                    '<div class=\"rt-guest-pax-main\">' +\n                        '<div class=\"rt-guest-pax-label\">' + f.label + '<\/div>' +\n                        '<div class=\"rt-guest-pax-sub\">' + f.sub + '<\/div>' +\n                    '<\/div>' +\n                    '<div class=\"rt-guest-stepper\" data-rt-scope=\"'+scope+'\" data-rt-idx=\"'+i+'\" data-rt-field=\"'+f.key+'\">' +\n                        '<button type=\"button\" data-rt-op=\"minus\"' + (minusOff ? ' class=\"at-min\" aria-disabled=\"true\"' : '') + '>\u2212<\/button>' +\n                        '<span class=\"rt-guest-val\">' + r[f.key] + '<\/span>' +\n                        '<button type=\"button\" data-rt-op=\"plus\"' + (plusOff ? ' class=\"at-max\" aria-disabled=\"true\"' : '') + '>+<\/button>' +\n                    '<\/div><\/div>';\n            });\n            html += '<\/div>';\n        });\n        return html;\n    }\n\n    function renderAll(){\n        var banner = totalBannerHTML();\n        var bannerDD    = document.getElementById('rt-guest-banner-dd');\n        var bannerSheet = document.getElementById('rt-guest-banner-sheet');\n        if(bannerDD){    bannerDD.innerHTML    = banner; bannerDD.style.display    = banner ? 'block' : 'none'; }\n        if(bannerSheet){ bannerSheet.innerHTML = banner; bannerSheet.style.display = banner ? 'block' : 'none'; }\n        if(ddBody)    ddBody.innerHTML = roomsHTML('d');\n        if(sheetBody) sheetBody.innerHTML = roomsHTML('m');\n        var canAdd = state.rooms.length < 10;\n        if(btnAdd)  btnAdd.style.display  = canAdd ? 'flex' : 'none';\n        if(btnAddM) btnAddM.style.display = canAdd ? 'flex' : 'none';\n        updateSummary();\n        syncHiddenFromRoom0();\n        if(state.isOpen && !isMobile() && typeof posicionarDropdown === 'function'){\n            requestAnimationFrame(posicionarDropdown);\n        }\n    }\n\n    \/\/ El sheet ahora se posiciona por encima de los botones flotantes\n    \/\/ (padding-bottom en la m\u00e1scara), as\u00ed que ya no hace falta ocultarlos.\n    function ocultarFlotantes(ocultar){ \/* no-op: el sheet queda sobre los flotantes *\/ }\n\n    function posicionarDropdown(){\n        if(!dropdown || !trigger) return;\n        var ref = trigger.getBoundingClientRect();\n        if(ref.width === 0 && fieldHuesped){\n            ref = fieldHuesped.getBoundingClientRect();\n        }\n        var vh = window.innerHeight;\n        var gap = 4;\n        var margen = 16;\n        var ancho = ref.width;\n\n        dropdown.style.position = 'fixed';\n        dropdown.style.left  = ref.left + 'px';\n        dropdown.style.width = ancho + 'px';\n        dropdown.style.right = 'auto';\n        dropdown.style.top = (ref.bottom + gap) + 'px';\n        dropdown.style.bottom = 'auto';\n\n        var espacioAbajo = vh - ref.bottom - margen;\n        dropdown.style.maxHeight = espacioAbajo + 'px';\n    }\n\n    \/\/ Reposiciona el dropdown siguiendo al trigger SIN recalcular la altura\n    \/\/ m\u00e1xima (para que al scrollear no se deforme, solo se desplace).\n    function reposicionarSuave(){\n        if(!dropdown || !trigger) return;\n        var ref = trigger.getBoundingClientRect();\n        if(ref.width === 0 && fieldHuesped){\n            ref = fieldHuesped.getBoundingClientRect();\n        }\n        dropdown.style.left = ref.left + 'px';\n        dropdown.style.top  = (ref.bottom + 4) + 'px';\n        dropdown.style.width = ref.width + 'px';\n    }\n\n    \/\/ Al abrir, si el dropdown no cabe c\u00f3modo abajo, scrollear la p\u00e1gina\n    \/\/ para que el campo suba y quede espacio. Scroll instant\u00e1neo (no smooth)\n    \/\/ para que el dropdown no se vea \"crecer\" durante la animaci\u00f3n.\n    function asegurarEspacioYPosicionar(){\n        if(!trigger) return;\n        var ref = trigger.getBoundingClientRect();\n        var vh = window.innerHeight;\n        var margen = 16;\n\n        dropdown.style.maxHeight = 'none';\n        var altoNatural = dropdown.offsetHeight || 0;\n        \/\/ Tope: body 560 + banner (~48) + footer (~52) \u2248 660\n        var altoDD = Math.min(altoNatural, 660);\n\n        var espacioAbajo = vh - ref.bottom - margen;\n\n        if(altoDD > espacioAbajo){\n            var falta = altoDD - espacioAbajo;\n            var margenSuperior = 90;\n            var puedeSubir = Math.max(0, ref.top - margenSuperior);\n            var scrollExtra = Math.min(falta, puedeSubir);\n            if(scrollExtra > 0){\n                \/\/ Instant\u00e1neo: evita el salto visual del dropdown\n                window.scrollBy(0, scrollExtra);\n            }\n        }\n        \/\/ Posicionar de inmediato tras el scroll (ya est\u00e1 en su lugar final)\n        posicionarDropdown();\n    }\n\n    function openGuests(){\n        if(!esEstadia()) return;\n        state.isOpen = true;\n        renderAll();\n        if(isMobile()){\n            \/\/ Bloqueo del scroll de fondo SIN cambiar position del body:\n            \/\/   - overflow:hidden en html\/body (funciona en Android\/Chrome).\n            \/\/   - touch-action:none en body (bloquea gestos t\u00e1ctiles en iOS Safari).\n            \/\/   - El .rt-guest-sheet-mask redefine touch-action a auto (ver CSS),\n            \/\/     y el sheet-body permite pan-y para scroll interno.\n            \/\/ Este approach NO cambia el layout ni el stacking context (evita\n            \/\/ que se corten eventos t\u00e1ctiles como pasaba con position:fixed).\n            state._scrollY = window.scrollY || window.pageYOffset || 0;\n            document.documentElement.style.overflow = 'hidden';\n            document.body.style.overflow = 'hidden';\n            document.body.style.touchAction = 'none';\n            if(sheetMask) sheetMask.classList.add('open');\n            document.body.classList.add('rt-guest-sheet-abierto');\n        }\n        else {\n            if(dropdown){\n                dropdown.classList.add('open');\n                dropdown.style.display = 'flex';\n                dropdown.style.flexDirection = 'column';\n                asegurarEspacioYPosicionar();\n            }\n        }\n        if(trigger) trigger.classList.add('active');\n    }\n    function closeGuests(){\n        var estabaMovil = document.body.style.touchAction === 'none';\n        state.isOpen = false;\n        if(dropdown){ dropdown.classList.remove('open'); dropdown.style.display = 'none'; }\n        if(sheetMask) sheetMask.classList.remove('open');\n        document.body.classList.remove('rt-guest-sheet-abierto');\n        if(estabaMovil){\n            document.documentElement.style.overflow = '';\n            document.body.style.overflow = '';\n            document.body.style.touchAction = '';\n            \/\/ Como no cambiamos position del body, no hace falta scrollTo.\n        }\n        if(trigger)   trigger.classList.remove('active');\n        updateSummary();\n        syncHiddenFromRoom0();\n    }\n    function toggleGuests(){ if(state.isOpen) closeGuests(); else openGuests(); }\n\n    function addRoom(){\n        if(state.rooms.length >= 10) return;\n        state.rooms.push(newRoom());\n        state._roomNueva = state.rooms.length - 1;  \/\/ marcar la nueva para animar\n        renderAll();\n        setTimeout(function(){ state._roomNueva = -1; }, 950);\n\n        function scrollAsomando(cont){\n            if(!cont) return;\n            var rooms = cont.querySelectorAll('.rt-guest-room');\n            var ultima = rooms[rooms.length - 1];\n            if(!ultima){ return; }\n            \/\/ Dejar el t\u00edtulo de la nueva habitaci\u00f3n a ~35% desde arriba del\n            \/\/ \u00e1rea visible, para que se asome claramente con contexto arriba.\n            var destino = ultima.offsetTop - (cont.clientHeight * 0.35);\n            var maxScroll = cont.scrollHeight - cont.clientHeight;\n            if(destino < 0) destino = 0;\n            if(destino > maxScroll) destino = maxScroll;\n            cont.scrollTo({ top: destino, behavior:'smooth' });\n        }\n\n        if(!isMobile()){\n            asegurarEspacioYPosicionar();\n            setTimeout(function(){ scrollAsomando(ddBody); }, 300);\n        } else {\n            setTimeout(function(){ scrollAsomando(sheetBody); }, 300);\n        }\n    }\n    function removeRoom(idx){\n        state.rooms.splice(idx, 1);\n        state._roomNueva = -1;\n        renderAll();\n        if(!isMobile()) asegurarEspacioYPosicionar();\n    }\n\n    \/\/ Trigger: en desktop usar pointerdown (respuesta inmediata sin doble-tap).\n    \/\/ En m\u00f3vil usar click simple, que es m\u00e1s confiable con el sheet.\n    if(trigger){\n        var triggerHandler = function(e){\n            e.preventDefault();\n            e.stopPropagation();\n            \/\/ Si est\u00e1 abierto, solo cerrar (comportamiento original).\n            if(state.isOpen){\n                toggleGuests();\n                return;\n            }\n            \/\/ \ud83d\udee1\ufe0f Va a ABRIR: chequear fechas primero.\n            if(!tieneFechasValidas()){\n                mostrarErrorSinFechas();\n                return;\n            }\n            \/\/ \ud83d\uddd3\ufe0f Verificar si YA tenemos caps por fecha correspondientes a las\n            \/\/ fechas actuales (cache hit por preload al cargar p\u00e1gina o al\n            \/\/ cambiar fechas). Si s\u00ed, abrir INSTANTE con caps correctos.\n            var ci = document.getElementById('checkin').value.trim();\n            var co = document.getElementById('checkout').value.trim();\n            var keyActual = ci + '|' + co;\n\n            if(state._lastCapsFecha === keyActual){\n                \/\/ Caps ya cargados y frescos \u2192 abrir instante, sin AJAX.\n                toggleGuests();\n                return;\n            }\n\n            \/\/ No hay caps frescos: mostrar preloader breve en el trigger,\n            \/\/ esperar hasta 400ms al AJAX, luego abrir con lo que haya.\n            \/\/ Nunca bloquea al usuario m\u00e1s all\u00e1 del threshold.\n            mostrarPreloaderTrigger(true);\n            var abierto = false;\n            var abrirYa = function(){\n                if(abierto) return;\n                abierto = true;\n                mostrarPreloaderTrigger(false);\n                toggleGuests();\n            };\n            \/\/ Timeout de seguridad: s\u00ed o s\u00ed abrir a los 400ms\n            var timerAbrir = setTimeout(abrirYa, 400);\n            refrescarCapsDesdeServer(function(){\n                clearTimeout(timerAbrir);\n                abrirYa();\n            });\n        };\n        if(isMobile()){\n            trigger.addEventListener('click', triggerHandler);\n        } else {\n            trigger.addEventListener('pointerdown', triggerHandler);\n            if(!window.PointerEvent){\n                trigger.addEventListener('click', triggerHandler);\n            }\n        }\n    }\n\n    \/\/ Preloader visual sutil en el trigger mientras carga caps por fecha.\n    function mostrarPreloaderTrigger(mostrar){\n        if(!trigger) return;\n        if(mostrar) trigger.classList.add('rt-guest-loading');\n        else        trigger.classList.remove('rt-guest-loading');\n    }\n\n    \/\/ \ud83d\uddd3\ufe0f Listener en cambios de fecha: SIEMPRE recalcula caps al cambiar,\n    \/\/ sin importar si hay pax reales, para que al abrir el picker ya\n    \/\/ tengamos los caps correctos por fecha (elimina race conditions).\n    (function(){\n        var ci = document.getElementById('checkin');\n        var co = document.getElementById('checkout');\n        function onFechaChange(){\n            \/\/ Invalidar cach\u00e9 para forzar re-consulta\n            state._lastCapsFecha = '';\n            if(!tieneFechasValidas()) return;\n            \/\/ Refresh sync inmediato \u2014 si el picker ya estaba abierto y hay\n            \/\/ pax que exceden nuevo tope, aplicarCapsNuevos los baja + toast.\n            refrescarCapsDesdeServer(null);\n        }\n        if(ci) ci.addEventListener('change', onFechaChange);\n        if(co) co.addEventListener('change', onFechaChange);\n\n        \/\/ Pre-carga inicial: si al cargar la p\u00e1gina YA hay fechas persistidas\n        \/\/ (sessionStorage, URL, autocomplete), disparar el AJAX de inmediato\n        \/\/ para tener caps correctos antes del primer click en hu\u00e9spedes.\n        if(tieneFechasValidas()){\n            refrescarCapsDesdeServer(null);\n        }\n    })();\n    if(btnListo)   btnListo.addEventListener('click', function(e){ e.preventDefault(); e.stopPropagation(); closeGuests(); });\n    if(btnListoM)  btnListoM.addEventListener('click', function(e){ e.preventDefault(); e.stopPropagation(); closeGuests(); });\n    if(btnAdd)     btnAdd.addEventListener('click', function(e){ e.preventDefault(); e.stopPropagation(); addRoom(); });\n    if(btnAddM)    btnAddM.addEventListener('click', function(e){ e.preventDefault(); e.stopPropagation(); addRoom(); });\n    if(sheetClose) sheetClose.addEventListener('click', function(e){ e.preventDefault(); e.stopPropagation(); closeGuests(); });\n    \/\/ La m\u00e1scara cierra solo si el clic es directamente sobre ella (no sobre el sheet)\n    \/\/ El sheet m\u00f3vil NO se cierra al tocar fuera: solo con LISTO o la X.\n    \/\/ (Se deja el listener para bloquear que el toque llegue al fondo.)\n    if(sheetMask)  sheetMask.addEventListener('click', function(e){\n        e.stopPropagation();\n    });\n    \/\/ Nota: el bloqueo del scroll de fondo se hace v\u00eda CSS (touch-action:none\n    \/\/ en body + overflow:hidden en html\/body al abrir). No se enganchan\n    \/\/ listeners touchmove porque interfieren con los taps precisos en iOS.\n\n    \/\/ Cerrar dropdown desktop al hacer pointerdown fuera del campo Y del dropdown\n    \/\/ (el dropdown ahora vive en document.body por el patr\u00f3n portal).\n    document.addEventListener('pointerdown', function(e){\n        if(!state.isOpen || isMobile()) return;\n        var dentroCampo = fieldHuesped && fieldHuesped.contains(e.target);\n        var dentroDD = dropdown && dropdown.contains(e.target);\n        if(!dentroCampo && !dentroDD) closeGuests();\n    });\n    \/\/ Cerrar en resize SOLO en desktop. En m\u00f3vil NO: iOS Safari dispara resize\n    \/\/ cuando la URL bar aparece\/desaparece por cualquier tap, lo que cerraba\n    \/\/ el sheet despu\u00e9s del primer +\/- (\"solo deja usar el +\/- una vez\").\n    window.addEventListener('resize', function(){\n        if(state.isOpen && !isMobile()) closeGuests();\n    });\n    \/\/ En desktop, al scrollear la p\u00e1gina el dropdown sigue pegado al trigger\n    \/\/ (solo actualiza top\/left, sin recalcular altura para evitar deformaci\u00f3n).\n    window.addEventListener('scroll', function(){\n        if(state.isOpen && !isMobile()) reposicionarSuave();\n    }, true);\n\n    \/\/ Steppers +\/- : stopPropagation para que no burbujee al cierre.\n    \/\/ Se enganchan directamente sobre los contenedores del dropdown y sheet.\n    function onStepperClick(e){\n        var btn = e.target.closest('[data-rt-op]');\n        if(!btn) return;\n        e.stopPropagation();\n        var stepper = btn.closest('[data-rt-scope]');\n        if(!stepper) return;\n        var idx   = parseInt(stepper.getAttribute('data-rt-idx'), 10);\n        var field = stepper.getAttribute('data-rt-field');\n        var fdef  = null;\n        FIELDS.forEach(function(f){ if(f.key===field) fdef=f; });\n        if(!fdef) return;\n        var op   = btn.getAttribute('data-rt-op');\n        var room = state.rooms[idx];\n        var cur  = room[field];\n\n        \/\/ Interceptar + cuando el bot\u00f3n est\u00e1 deshabilitado: mostrar toast\n        \/\/ explicativo (por qu\u00e9 no puede sumar m\u00e1s) y no modificar estado.\n        if(op === 'plus' && plusDeshabilitado(room, field)){\n            var msg = motivoTope(room, field);\n            if(msg) avisarTope(msg);\n            return;\n        }\n\n        var next = op === 'plus'\n            ? Math.min(fdef.max, cur + 1) : Math.max(fdef.min, cur - 1);\n        if(next === cur) return;\n        state.rooms[idx][field] = next;\n        renderAll();\n    }\n    if(ddBody)    ddBody.addEventListener('click', onStepperClick);\n    if(sheetBody) sheetBody.addEventListener('click', onStepperClick);\n\n    \/\/ Bot\u00f3n \"Eliminar\" habitaci\u00f3n (delegado en los contenedores)\n    function onRemoveClick(e){\n        var btn = e.target.closest('[data-rt-remove]');\n        if(!btn) return;\n        e.preventDefault();\n        e.stopPropagation();\n        removeRoom(parseInt(btn.getAttribute('data-rt-remove'), 10));\n    }\n    if(ddBody)    ddBody.addEventListener('click', onRemoveClick);\n    if(sheetBody) sheetBody.addEventListener('click', onRemoveClick);\n\n    \/\/ Enganchar cambio de tipo (corre despu\u00e9s del actualizarTipo de script.js)\n    if($tipo) $tipo.addEventListener('change', function(){ setTimeout(aplicarModo, 0); });\n\n    \/\/ Init: el atributo data-rt-modo ya viene en 'estadia' desde el server,\n    \/\/ as\u00ed que el CSS oculta los cl\u00e1sicos sin flash. Reaplicamos por si el\n    \/\/ tipo inicial fuera otro y para sincronizar los selects cl\u00e1sicos.\n    updateSummary();\n    [50, 300].forEach(function(ms){ setTimeout(aplicarModo, ms); });\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       INTERCEPTOR SUBMIT MULTI-HABITACI\u00d3N\n       El bot\u00f3n \"Siguiente\" del Step 1 es type=\"button\" (no submit), y el\n       env\u00edo lo hace script.js con window.location.href tras validar. Por\n       eso interceptamos el CLICK del bot\u00f3n en fase captura (antes que\n       script.js), no el submit del form (que nunca se dispara).\n\n       IMPORTANTE: chequeamos fechas ANTES de preventDefault(). Si faltan,\n       NO interceptamos \u2192 el validador normal de script.js corre y marca\n       los campos en rojo con su mensaje. Interceptar sin fechas romp\u00eda\n       la UX porque el usuario no ve\u00eda por qu\u00e9 no avanzaba.\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    var $formStep1Multi = document.querySelector('form.rt-step1-form-anim[data-rt-modo=\"estadia\"]');\n    var $btnSiguienteMulti = $formStep1Multi\n        ? $formStep1Multi.querySelector('button.rt-btn.reservar[data-tipo=\"reserva\"]')\n        : null;\n\n    if($btnSiguienteMulti){\n        $btnSiguienteMulti.addEventListener('click', function rtMultiClickHandler(e){\n            \/\/ Solo interceptar si es estad\u00eda Y hay m\u00faltiples habitaciones\n            if(!esEstadia()) return;\n            if(!state.rooms || state.rooms.length <= 1) return;\n\n            \/\/ Chequear fechas SIN interceptar todav\u00eda: si faltan, dejar\n            \/\/ que script.js muestre su validaci\u00f3n normal en rojo.\n            var pick = function(sel){\n                var el = $formStep1Multi.querySelector(sel);\n                return el ? (el.value || '') : '';\n            };\n            var checkin  = pick('[name=\"checkin\"]');\n            var checkout = pick('[name=\"checkout\"]');\n            if(!checkin || !checkout) return; \/\/ \u2190 flujo normal, script.js valida\n\n            \/\/ Tenemos todo lo necesario: interceptar y tomar control\n            try {\n                e.preventDefault();\n                e.stopImmediatePropagation();\n\n                var email  = pick('[name=\"email\"]');\n                var codigo = pick('[name=\"codigo\"]');\n\n                \/\/ Construir array de config de habitaciones desde state.rooms\n                var habitaciones_config = state.rooms.map(function(r){\n                    return {\n                        adultos:  parseInt(r.adultos,  10) || 0,\n                        ninos:    parseInt(r.ninos,    10) || 0,\n                        infantes: parseInt(r.infantes, 10) || 0,\n                        mascotas: Math.min(1, parseInt(r.mascotas, 10) || 0)\n                    };\n                });\n\n                \/\/ Merge con reservaData previa (si existe email\/codigo\/etc)\n                var data = {};\n                try {\n                    var prev = sessionStorage.getItem('reservaData');\n                    if(prev) data = JSON.parse(prev) || {};\n                } catch(e){ data = {}; }\n\n                data.tipo     = 'estadia';\n                data.checkin  = checkin;\n                data.checkout = checkout;\n                if(email)  data.email  = email;\n                if(codigo) data.codigo = codigo;\n\n                \/\/ Totales sumados (compat con quien lea data.adultos, etc.)\n                var totales = habitaciones_config.reduce(function(acc, h){\n                    acc.adultos  += h.adultos;\n                    acc.ninos    += h.ninos;\n                    acc.infantes += h.infantes;\n                    acc.mascotas += h.mascotas;\n                    return acc;\n                }, {adultos:0, ninos:0, infantes:0, mascotas:0});\n                data.adultos  = totales.adultos;\n                data.ninos    = totales.ninos;\n                data.infantes = totales.infantes;\n                data.mascotas = Math.min(1, totales.mascotas);\n\n                data.multi = {\n                    total: habitaciones_config.length,\n                    actual: 0,\n                    habitaciones_config: habitaciones_config,\n                    habitaciones_elegidas: []\n                };\n\n                sessionStorage.setItem('reservaData', JSON.stringify(data));\n\n                \/\/ Construir URL a elegir-habitacion con params de la HAB 1\n                var conf = habitaciones_config[0];\n                var params = new URLSearchParams();\n                params.set('tipo',      'estadia');\n                params.set('multi',     '1');\n                params.set('hab',       '1');\n                params.set('hab_total', String(habitaciones_config.length));\n                params.set('checkin',   checkin);\n                params.set('checkout',  checkout);\n                params.set('adultos',   String(conf.adultos));\n                params.set('ninos',     String(conf.ninos));\n                params.set('infantes',  String(conf.infantes));\n                params.set('mascotas',  String(conf.mascotas));\n                \/* FIX v10 \u00b7 Bug URL sin email\/codigo en flujo multi\n                   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n                   Las variables `email` y `codigo` (le\u00eddas de pick() en\n                   l\u00edneas 2827-2828) siempre est\u00e1n vac\u00edas porque el form\n                   principal NO tiene inputs [name=\"email\"] ni [name=\"codigo\"]\n                   \u2014 el correo se captura en un modal aparte que guarda el\n                   valor en sessionStorage.reservaData, no en el form.\n\n                   El merge de l\u00edneas 2841-2851 ya trajo data.email y\n                   data.codigo desde reservaData (que s\u00ed los tiene tras el\n                   modal). Usamos esos valores ac\u00e1, en vez de las variables\n                   locales vac\u00edas. *\/\n                var _emailFinal  = data.email_previo || data.email  || email;\n                var _codigoFinal = data.codigo || codigo;\n                if(_emailFinal)  params.set('email',  _emailFinal);\n                if(_codigoFinal) params.set('codigo', _codigoFinal);\n\n                \/* Preloader con mensaje contextual multi.\n                   La funci\u00f3n window.rtMultiMostrarPreloader vive en el helper\n                   elegir-habitacion-multi.php pero ac\u00e1 estamos en la p\u00e1gina del\n                   Step 1, as\u00ed que replicamos el mecanismo inline.\n\n                   FIX v11 \u00b7 Bug preloader invisible en m\u00f3vil\n                   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n                   Antes (v10): setTimeout(40) para reemplazar el texto y\n                   location.href inmediato. En m\u00f3vil (iOS Safari, Chrome\n                   Android) el navegador prioriza la navegaci\u00f3n sobre el paint\n                   \u2192 el modal se crea en el DOM pero nunca se pinta; el user\n                   no ve nada hasta la siguiente p\u00e1gina. En desktop funcionaba\n                   porque hay m\u00e1s margen entre asignar .href y la navegaci\u00f3n\n                   real. Por eso el user reportaba que en celular el mensaje\n                   \"Vamos a configurar la habitaci\u00f3n N\" no aparece (y el \u00fanico\n                   preloader visible en el flujo multi era el del final, que\n                   corre por AJAX del sistema y s\u00ed alcanza a pintarse).\n\n                   Ahora (v11):\n                   (1) el reemplazo de texto es S\u00cdNCRONO. `rtMostrarPreloaderDatos()`\n                       inyecta el modal sync, as\u00ed que la primera pasada del\n                       querySelectorAll ya lo encuentra. Fallback rAF por si\n                       alg\u00fan d\u00eda la creaci\u00f3n pasa a ser async.\n                   (2) la navegaci\u00f3n va dentro de un setTimeout(150) para dar\n                       ~2 frames de holgura al navegador m\u00f3vil antes de que\n                       empiece el unload. *\/\n                var rtMultiPreloaderMsg = function(mensaje){\n                    if(typeof window.rtMostrarPreloaderDatos === 'function'){\n                        window.rtMostrarPreloaderDatos();\n                    } else if(typeof window.rtMostrarBarraCarga === 'function'){\n                        window.rtMostrarBarraCarga();\n                    }\n                    if(!mensaje) return;\n                    var reemplazarTexto = function(){\n                        var patrones = ['Perfecto', 'faltan tus datos', 'datos personales'];\n                        var candidatos = document.querySelectorAll(\n                            'body > div p, body > div h1, body > div h2, body > div h3, ' +\n                            'body > div span, body > div strong'\n                        );\n                        for(var i = 0; i < candidatos.length; i++){\n                            var el = candidatos[i];\n                            if(el.children.length !== 0) continue;\n                            var txt = (el.textContent || '').trim();\n                            if(!txt) continue;\n                            for(var k = 0; k < patrones.length; k++){\n                                if(txt.indexOf(patrones[k]) >= 0){\n                                    el.textContent = mensaje;\n                                    return true;\n                                }\n                            }\n                        }\n                        return false;\n                    };\n                    \/\/ Intento s\u00edncrono (el modal se crea sync por rtMostrarPreloaderDatos)\n                    if(reemplazarTexto()) return;\n                    \/\/ Fallback: reintento en el pr\u00f3ximo frame por si a\u00fan no est\u00e1 en DOM\n                    if(typeof requestAnimationFrame === 'function'){\n                        requestAnimationFrame(reemplazarTexto);\n                    } else {\n                        setTimeout(reemplazarTexto, 16);\n                    }\n                };\n                rtMultiPreloaderMsg('Vamos a elegir la habitaci\u00f3n 1');\n\n                console.log('[rt-multi] interceptando: redirigiendo a elegir-habitacion multi con', habitaciones_config.length, 'habitaciones');\n                var url = '\/esp\/elegir-habitacion\/?' + params.toString();\n                \/\/ FIX v11 \u00b7 Delay antes de navegar para que el navegador m\u00f3vil\n                \/\/ alcance a pintar el modal (ver comentario m\u00e1s arriba).\n                setTimeout(function(){ window.location.href = url; }, 150);\n\n            } catch(err){\n                \/\/ Si algo falla ac\u00e1 adentro, ya hicimos preventDefault. Reintentamos\n                \/\/ el click desenganch\u00e1ndonos primero (referencia nombrada, no arguments.callee).\n                console.error('[rt-multi] error en interceptor, delegando al flujo normal:', err);\n                try {\n                    $btnSiguienteMulti.removeEventListener('click', rtMultiClickHandler, true);\n                    $btnSiguienteMulti.click();\n                    \/\/ Re-enganchar por si el usuario intenta de nuevo\n                    setTimeout(function(){\n                        $btnSiguienteMulti.addEventListener('click', rtMultiClickHandler, true);\n                    }, 200);\n                } catch(e2){\n                    console.error('[rt-multi] fallback tambi\u00e9n fall\u00f3:', e2);\n                }\n            }\n        }, true); \/\/ capture:true \u2192 antes que script.js\n    } else {\n        console.warn('[rt-multi] bot\u00f3n Siguiente no encontrado, interceptor multi no activado');\n    }\n})();\n<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1177ff5 cs-animation-small-offset elementor-section-boxed elementor-section-height-default elementor-section-height-default elementor-invisible\" data-id=\"1177ff5\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;animation&quot;:&quot;fadeInUp&quot;,&quot;animation_delay&quot;:300}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-48a61049\" data-id=\"48a61049\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9088323 elementor-widget elementor-widget-spacer\" data-id=\"9088323\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-35cd7366 dark-color\" data-id=\"35cd7366\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t<div class=\"elementor-background-overlay\"><\/div>\n\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-77abdced elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"77abdced\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-2f178259\" data-id=\"2f178259\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6f8d335f elementor-widget elementor-widget-cs_title\" data-id=\"6f8d335f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"cs_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n        <div class=\"cs-title-wrap text-center\">\t            <div class=\"cs-subtitle-wrap\"><span class=\"cs-subtitle color-white\">Hotel, Resort & Spa<\/span><\/div>\t            <h4 class=\"cs-title\">\n\t                Experiencias exclusivas en nuestro hotel\t            <\/h4>                <div class=\"cs-title-btn\">\n                    <a class=\"button elementor-button-link cs-btn-color-primary cs-btn-underline\" role=\"button\" href=\"https:\/\/maps.app.goo.gl\/TctHLnKMKRr1dCKG8\">\n                        <span class=\"cs-btn-text\">vis\u00edtanos<\/span>                    <\/a>\n                <\/div>\n                    <\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-52aa3b4d\" data-id=\"52aa3b4d\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d7f43ba elementor-widget elementor-widget-spacer\" data-id=\"d7f43ba\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-624942ac elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"624942ac\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3f83d436\" data-id=\"3f83d436\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-71c6aa4 elementor-widget elementor-widget-video\" data-id=\"71c6aa4\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;youtube_url&quot;:&quot;https:\\\/\\\/www.youtube.com\\\/watch?v=v8YMqmu7adI&quot;,&quot;video_type&quot;:&quot;youtube&quot;}\" data-widget_type=\"video.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-wrapper elementor-open-inline\">\n\t\t\t<div class=\"elementor-video\"><\/div>\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-29928c05 elementor-widget elementor-widget-cs_title\" data-id=\"29928c05\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"cs_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n        <div class=\"cs-title-wrap\">\t            <div class=\"cs-subtitle-wrap\"><span class=\"cs-subtitle\">DISFRUTA DE UNA EXPERIENCIA \u00daNICA EN TU ESTAD\u00cdA<\/span><\/div>\t            <h2 class=\"cs-title\">\n\t                Selecciona un tipo de habitaci\u00f3n\t            <\/h2>\t            <div class=\"cs-title-text\">\n\t                <p>En nuestro hotel, ofrecemos una variedad de opciones en hospedaje para satisfacer las necesidades de todos nuestros hu\u00e9spedes. Desde acogedoras habitaciones individuales hasta lujosas suites y departamentos\u00a0 familiares, tenemos el alojamiento perfecto para ti.<\/p>\t            <\/div>        <\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3311f8d elementor-widget elementor-widget-cs_button\" data-id=\"3311f8d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"cs_button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <a href=\"https:\/\/termasdepanimavida.cl\/2024\/habitaciones\/\" class=\"elementor-button-link button\" role=\"button\">\n            <span class=\"cs-btn-text\">Ver habitaciones<\/span>        <\/a>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-70e20d0 cs-animation-small-offset elementor-invisible elementor-widget elementor-widget-cs_rooms\" data-id=\"70e20d0\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;,&quot;_animation_delay&quot;:200}\" data-widget_type=\"cs_rooms.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t                    <div class=\"posts cs-rooms cs-rooms-carousel layout-grid slider-arrow-top column-3 img-ratio-4-3\" data-autoplay=\"off\" data-autoplay-speed=\"\" data-show-arrows=\"on\" data-show-dots=\"on\" data-column=\"3\">\n                        <div class=\"posts-wrapper cs-rooms-wrapper\">\n    <div class=\"post cs-room-item has-post-thumbnail\">            <div class=\"featured-img\">\n                <a href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/junior\/\"><img fetchpriority=\"high\" decoding=\"async\" width=\"780\" height=\"439\" src=\"https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-780x439.jpg\" class=\"attachment-cozystay_780x9999 size-cozystay_780x9999\" alt=\"\" srcset=\"https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-780x439.jpg 780w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-300x169.jpg 300w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-1024x576.jpg 1024w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-768x432.jpg 768w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-1536x864.jpg 1536w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-2048x1152.jpg 2048w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-1920x1080.jpg 1920w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-1440x810.jpg 1440w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-1200x675.jpg 1200w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-600x338.jpg 600w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-550x309.jpg 550w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-370x208.jpg 370w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-255x143.jpg 255w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2023\/04\/DSC1445-150x84.jpg 150w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/>                <\/a>            <\/div>\n        <div class=\"post-content cs-room-content\">\n            <header class=\"post-header item-header\">                <h2 class=\"post-title item-title\">\n                    <a href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/junior\/\">Junior<\/a>\n                <\/h2>            <div class=\"cs-room-basic-info\">\n                <ul>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-maximize\"><\/i><\/div>                            <span class=\"csrbi-text\">25 m<sup>2<\/sup><\/span>                        <\/li>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-user-2\"><\/i><\/div>                            <span class=\"csrbi-text\">2 Hu\u00e9spedes<\/span>                        <\/li>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-bed-6\"><\/i><\/div>                            <span class=\"csrbi-text\">1 Cama dos Plazas<\/span>                        <\/li>            <\/header>                <div class=\"post-excerpt item-excerpt\"><p>Es una habitaci\u00f3n de menores dimensiones. Se sit\u00faan en el pabell\u00f3n 100, que se encuentra en las inmediaciones del sector de Piscinas, y en el pabell\u00f3n 400, ubicado en las cercan\u00edas del sector del bar y comedor.<\/p>\n<\/div>                <footer class=\"post-footer item-footer\">\n                    <div class=\"more-btn\">\n                        <a class=\"read-more-btn button cs-btn-underline\" href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/junior\/\">\n                            <span>Ver Habitaci\u00f3n<\/span>\n                        <\/a>\n                    <\/div>\n                <\/footer>        <\/div>\n    <\/div>\n\n    <div class=\"post cs-room-item has-post-thumbnail\">            <div class=\"featured-img\">\n                <a href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/estandar\/\"><img decoding=\"async\" width=\"780\" height=\"439\" src=\"https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-780x439.jpg\" class=\"attachment-cozystay_780x9999 size-cozystay_780x9999\" alt=\"\" srcset=\"https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-780x439.jpg 780w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-300x169.jpg 300w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-1024x576.jpg 1024w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-768x432.jpg 768w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-1536x864.jpg 1536w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-2048x1152.jpg 2048w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-1920x1080.jpg 1920w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-1440x810.jpg 1440w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-1200x675.jpg 1200w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-600x338.jpg 600w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-550x309.jpg 550w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-370x208.jpg 370w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-255x143.jpg 255w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1315-150x84.jpg 150w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/>                <\/a>            <\/div>\n        <div class=\"post-content cs-room-content\">\n            <header class=\"post-header item-header\">                <h2 class=\"post-title item-title\">\n                    <a href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/estandar\/\">Est\u00e1ndar<\/a>\n                <\/h2>            <div class=\"cs-room-basic-info\">\n                <ul>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-maximize\"><\/i><\/div>                            <span class=\"csrbi-text\">30 m<sup>2<\/sup><\/span>                        <\/li>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-user-2\"><\/i><\/div>                            <span class=\"csrbi-text\">2 Huespedes<\/span>                        <\/li>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-bed-6\"><\/i><\/div>                            <span class=\"csrbi-text\">1 Cama King<\/span>                        <\/li>            <\/header>                <div class=\"post-excerpt item-excerpt\"><p>Es una habitaci\u00f3n con mayor amplitud, de estilo colonial. \u00c9stas se sit\u00faan en los pabellones 100, 200, 300 y 400, por lo que contamos con habitaciones est\u00e1ndar tanto en las cercan\u00edas del sector del bar y comedor, como de las terrazas, jardines, piscinas y Spa.<\/p>\n<\/div>                <footer class=\"post-footer item-footer\">\n                    <div class=\"more-btn\">\n                        <a class=\"read-more-btn button cs-btn-underline\" href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/estandar\/\">\n                            <span>Ver Habitaci\u00f3n<\/span>\n                        <\/a>\n                    <\/div>\n                <\/footer>        <\/div>\n    <\/div>\n\n    <div class=\"post cs-room-item has-post-thumbnail\">            <div class=\"featured-img\">\n                <a href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/superior\/\"><img decoding=\"async\" width=\"780\" height=\"439\" src=\"https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-780x439.jpg\" class=\"attachment-cozystay_780x9999 size-cozystay_780x9999\" alt=\"\" srcset=\"https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-780x439.jpg 780w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-300x169.jpg 300w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-1024x576.jpg 1024w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-768x432.jpg 768w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-1536x864.jpg 1536w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-2048x1152.jpg 2048w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-1920x1080.jpg 1920w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-1440x810.jpg 1440w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-1200x675.jpg 1200w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-600x338.jpg 600w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-550x309.jpg 550w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-370x208.jpg 370w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-255x143.jpg 255w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC0605-150x84.jpg 150w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/>                <\/a>            <\/div>\n        <div class=\"post-content cs-room-content\">\n            <header class=\"post-header item-header\">                <h2 class=\"post-title item-title\">\n                    <a href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/superior\/\">Superior<\/a>\n                <\/h2>            <div class=\"cs-room-basic-info\">\n                <ul>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-maximize\"><\/i><\/div>                            <span class=\"csrbi-text\">32 m<sup>2<\/sup><\/span>                        <\/li>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-user-2\"><\/i><\/div>                            <span class=\"csrbi-text\">2 Huespedes<\/span>                        <\/li>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-bed-6\"><\/i><\/div>                            <span class=\"csrbi-text\">1 Cama King<\/span>                        <\/li>            <\/header>                <div class=\"post-excerpt item-excerpt\"><p>Es una habitaci\u00f3n amplia y con terminaciones m\u00e1s actuales. \u00c9stas se sit\u00faan en el pabell\u00f3n 200 y 300, en las cercan\u00edas del sector del bar, comedor, piscinas, terrazas y jardines.<\/p>\n<\/div>                <footer class=\"post-footer item-footer\">\n                    <div class=\"more-btn\">\n                        <a class=\"read-more-btn button cs-btn-underline\" href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/superior\/\">\n                            <span>Ver Habitaci\u00f3n<\/span>\n                        <\/a>\n                    <\/div>\n                <\/footer>        <\/div>\n    <\/div>\n\n    <div class=\"post cs-room-item has-post-thumbnail hide\">            <div class=\"featured-img\">\n                <a href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/superior-discapacitados\/\"><img loading=\"lazy\" decoding=\"async\" width=\"780\" height=\"439\" src=\"https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-780x439.jpg\" class=\"attachment-cozystay_780x9999 size-cozystay_780x9999\" alt=\"\" srcset=\"https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-780x439.jpg 780w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-300x169.jpg 300w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-1024x576.jpg 1024w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-768x432.jpg 768w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-1536x864.jpg 1536w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-2048x1152.jpg 2048w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-1920x1080.jpg 1920w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-1440x810.jpg 1440w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-1200x675.jpg 1200w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-600x338.jpg 600w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-550x309.jpg 550w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-370x208.jpg 370w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-255x143.jpg 255w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1594-150x84.jpg 150w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/>                <\/a>            <\/div>\n        <div class=\"post-content cs-room-content\">\n            <header class=\"post-header item-header\">                <h2 class=\"post-title item-title\">\n                    <a href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/superior-discapacitados\/\">Superior (Para personas con Movilidad Reducida)<\/a>\n                <\/h2>            <div class=\"cs-room-basic-info\">\n                <ul>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-maximize\"><\/i><\/div>                            <span class=\"csrbi-text\">35 m<sup>2<\/sup><\/span>                        <\/li>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-user-2\"><\/i><\/div>                            <span class=\"csrbi-text\">2 Huespedes<\/span>                        <\/li>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-bed-6\"><\/i><\/div>                            <span class=\"csrbi-text\">1 Cama King<\/span>                        <\/li>            <\/header>                <div class=\"post-excerpt item-excerpt\"><p>Es una habitaci\u00f3n amplia y con terminaciones m\u00e1s actuales. \u00c9stas se sit\u00faan en el pabell\u00f3n 200 y 300, en las cercan\u00edas del sector del bar, comedor, piscinas, terrazas y jardines<\/p>\n<\/div>                <footer class=\"post-footer item-footer\">\n                    <div class=\"more-btn\">\n                        <a class=\"read-more-btn button cs-btn-underline\" href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/superior-discapacitados\/\">\n                            <span>Ver Habitaci\u00f3n<\/span>\n                        <\/a>\n                    <\/div>\n                <\/footer>        <\/div>\n    <\/div>\n\n    <div class=\"post cs-room-item has-post-thumbnail hide\">            <div class=\"featured-img\">\n                <a href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/suite\/\"><img loading=\"lazy\" decoding=\"async\" width=\"780\" height=\"439\" src=\"https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-780x439.jpg\" class=\"attachment-cozystay_780x9999 size-cozystay_780x9999\" alt=\"\" srcset=\"https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-780x439.jpg 780w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-300x169.jpg 300w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-1024x576.jpg 1024w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-768x432.jpg 768w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-1536x864.jpg 1536w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-2048x1152.jpg 2048w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-1920x1080.jpg 1920w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-1440x810.jpg 1440w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-1200x675.jpg 1200w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-600x338.jpg 600w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-550x309.jpg 550w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-370x208.jpg 370w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-255x143.jpg 255w, https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/04\/DSC1547-150x84.jpg 150w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/>                <\/a>            <\/div>\n        <div class=\"post-content cs-room-content\">\n            <header class=\"post-header item-header\">                <h2 class=\"post-title item-title\">\n                    <a href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/suite\/\">Suite<\/a>\n                <\/h2>            <div class=\"cs-room-basic-info\">\n                <ul>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-maximize\"><\/i><\/div>                            <span class=\"csrbi-text\">40 m<sup>2<\/sup><\/span>                        <\/li>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-user-2\"><\/i><\/div>                            <span class=\"csrbi-text\">2 Huespedes<\/span>                        <\/li>                        <li>\n                            <div class=\"csrbi-icon\"><i class=\"flaticon flaticon-bed-6\"><\/i><\/div>                            <span class=\"csrbi-text\">1 Cama King<\/span>                        <\/li>            <\/header>                <div class=\"post-excerpt item-excerpt\"><p>Es una habitaci\u00f3n amplia, con decoraci\u00f3n estilo Colonial y con vista a los jardines del hotel. \u00c9stas se sit\u00faan en el pabell\u00f3n 400, cercana al sector de piscinas, Spa, jardines y terrazas.<\/p>\n<\/div>                <footer class=\"post-footer item-footer\">\n                    <div class=\"more-btn\">\n                        <a class=\"read-more-btn button cs-btn-underline\" href=\"https:\/\/termasdepanimavida.cl\/esp\/room\/suite\/\">\n                            <span>Ver Habitaci\u00f3n<\/span>\n                        <\/a>\n                    <\/div>\n                <\/footer>        <\/div>\n    <\/div>\n                        <\/div>                    <\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6e2ad212 cs-section-content-fullwidth elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6e2ad212\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-52817e97 dark-color\" data-id=\"52817e97\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7f8ae23b elementor-widget elementor-widget-cs_info_box\" data-id=\"7f8ae23b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"cs_info_box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n\t\t\t<div class=\"cs-info-box column-3 valign-top img-left\">\n                <div class=\"cs-info-box-wrap\">                    <div class=\"cs-info-box-item elementor-repeater-item-cccff81\">\n                    \t<div class=\"cs-item-container\">\t                        <div class=\"cs-info-box-img\"><i aria-hidden=\"true\" class=\"flaticon flaticon-food-tray\"><\/i>\t                        <\/div>\t                        <div class=\"cs-info-box-content\">\n\t                            <h5 class=\"cs-title cs-info-box-title\">Buffet Incluido\t\t\t\t\t\t\t\t<\/h5>\t                            \t<div class=\"cs-info-box-text\"><p>Todas nuestras estad\u00edas incluyen desayuno, almuerzo y cena tipo buffet con postres y bebidas de m\u00e1quina cerveza de barril, infusiones, t\u00e9, caf\u00e9. <\/p><\/div>\t                        <\/div>\t                    <\/div>\n                    <\/div>                    <div class=\"cs-info-box-item elementor-repeater-item-c44a4fb\">\n                    \t<div class=\"cs-item-container\">\t                        <div class=\"cs-info-box-img\"><i aria-hidden=\"true\" class=\"flaticon flaticon-bed-3\"><\/i>\t                        <\/div>\t                        <div class=\"cs-info-box-content\">\n\t                            <h5 class=\"cs-title cs-info-box-title\">Habitaciones Equipadas\t\t\t\t\t\t\t\t<\/h5>\t                            \t<div class=\"cs-info-box-text\"><p>Ba\u00f1o privado, secador de pelo, toalla, shampoo, jab\u00f3n , calefacci\u00f3n central, aire acondicionado en casi todas las habitaciones, caja de seguridad y TV Cable <\/p><\/div>\t                        <\/div>\t                    <\/div>\n                    <\/div>                    <div class=\"cs-info-box-item elementor-repeater-item-0a01fb1\">\n                    \t<div class=\"cs-item-container\">\t                        <div class=\"cs-info-box-img\"><i aria-hidden=\"true\" class=\"flaticon flaticon-swimming-pool\"><\/i>\t                        <\/div>\t                        <div class=\"cs-info-box-content\">\n\t                            <h5 class=\"cs-title cs-info-box-title\">Piscinas Termales\t\t\t\t\t\t\t\t<\/h5>\t                            \t<div class=\"cs-info-box-text\"><p>4 piscinas termales de distintos tama\u00f1os, 4 jacuzzis tipo familiar para 12 personas c\/u, 2 piletas de agua fr\u00eda para intercambio de temperatura.<\/p><\/div>\t                        <\/div>\t                    <\/div>\n                    <\/div>                    <div class=\"cs-info-box-item elementor-repeater-item-bb40a8b\">\n                    \t<div class=\"cs-item-container\">\t                        <div class=\"cs-info-box-img\"><i aria-hidden=\"true\" class=\"flaticon flaticon-swimming-pool-1\"><\/i>\t                        <\/div>\t                        <div class=\"cs-info-box-content\">\n\t                            <h5 class=\"cs-title cs-info-box-title\">Piscina Exterior\t\t\t\t\t\t\t\t<\/h5>\t                            \t<div class=\"cs-info-box-text\"><p>Gran piscina al aire libre para adultos con \u00e1reas verdes y camarines y piscina exterior para ni\u00f1os con cascada incluida<\/p><\/div>\t                        <\/div>\t                    <\/div>\n                    <\/div>                    <div class=\"cs-info-box-item elementor-repeater-item-55da29c\">\n                    \t<div class=\"cs-item-container\">\t                        <div class=\"cs-info-box-img\"><i aria-hidden=\"true\" class=\"flaticon flaticon-spa\"><\/i>\t                        <\/div>\t                        <div class=\"cs-info-box-content\">\n\t                            <h5 class=\"cs-title cs-info-box-title\">Spa & Bienestar\t\t\t\t\t\t\t\t<\/h5>\t                            \t<div class=\"cs-info-box-text\"><p>Masajes rejuvenecedores, ba\u00f1os de barro, tinas calientes, reiki y diversos tipos de terapias <\/p><\/div>\t                        <\/div>\t                    <\/div>\n                    <\/div>                    <div class=\"cs-info-box-item elementor-repeater-item-0bf7877\">\n                    \t<div class=\"cs-item-container\">\t                        <div class=\"cs-info-box-img\"><i aria-hidden=\"true\" class=\"flaticon flaticon-yoga-pose\"><\/i>\t                        <\/div>\t                        <div class=\"cs-info-box-content\">\n\t                            <h5 class=\"cs-title cs-info-box-title\">Entretenci\u00f3n\t\t\t\t\t\t\t\t<\/h5>\t                            \t<div class=\"cs-info-box-text\"><p>Sal\u00f3n para juegos de mesa, sala de pool, sala de m\u00fasica con piano de cola, clases de hidrogimnasia, yoga y relajaci\u00f3n en el agua<\/p><\/div>\t                        <\/div>\t                    <\/div>\n                    <\/div>\t\t\t\t<\/div>\n\t\t\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-46d00877 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"46d00877\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2863077\" data-id=\"2863077\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-404a3823 elementor-widget elementor-widget-cs_title\" data-id=\"404a3823\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"cs_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n        <div class=\"cs-title-wrap text-center\">\t            <div class=\"cs-subtitle-wrap\"><span class=\"cs-subtitle\">\u00a1haz de tu estad\u00eda una experiencia inolvidable!<\/span><\/div>\t            <h2 class=\"cs-title\">\n\t                Las Mejores Promociones\t            <\/h2>        <\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1cc48a81 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1cc48a81\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6de37522\" data-id=\"6de37522\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-344dc03a elementor-widget elementor-widget-cs_title\" data-id=\"344dc03a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"cs_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n        <div class=\"cs-title-wrap text-center\">\t            <h6 class=\"cs-title\">\n\t                \n\"\u00a1Aprovecha nuestras promociones limitadas y vive momentos inolvidables en nuestro hotel!\"\t            <\/h6>                <div class=\"cs-title-btn\">\n                    <a class=\"button elementor-button-link\" role=\"button\" href=\"https:\/\/termasdepanimavida.cl\/2024\/promociones\/\">\n                        <span class=\"cs-btn-text\">Ver m\u00e1s promociones<\/span>                    <\/a>\n                <\/div>\n                    <\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-64f53b24 cs_scroll_y_120 cs-section-content-fullwidth cs-parallax-on-scroll elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"64f53b24\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\" data-cs-parallax-y=\"120\" style=\"background-image: none;\" data-cs-background-image=\"https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/03\/DSC05345-copia-scaled.jpg\">\n\t\t\t\t\t\t\t<div class=\"elementor-background-overlay\"><\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3e0fc51c dark-color\" data-id=\"3e0fc51c\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7be57daf elementor-widget__width-initial elementor-invisible elementor-widget elementor-widget-cs_testimonials\" data-id=\"7be57daf\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:300}\" data-widget_type=\"cs_testimonials.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n            <div class=\"cs-testimonials testimonial-style-1 text-center testimonials-slider\" data-column=\"1\" data-autoplay=\"on\" data-autoplay-speed=\"5000\" data-show-arrows=\"\" data-show-dots=\"on\"><div class=\"cs-ts-wrap\"><div class=\"cs-ts-item\">                    <div class=\"cs-testimonial\"><div class=\"cs-testimonial-rating\"><span class=\"cs-testimonial-stars\"><\/span><\/div>                        <div class=\"cs-testimonial-content\">Disfrut\u00e9 su estad\u00eda, es un lugar maravilloso sus jardines tienen algo m\u00e1gico me encantan las Termas de Panimavida<\/div>                        <div class=\"cs-testimonial-meta\">\n                            <div class=\"elementor-testimonial-meta-inner\">\t                                <div class=\"elementor-testimonial-details\">\t                                    <div class=\"elementor-testimonial-name\">Ruiz Veloso<\/div>\t                                    <div class=\"elementor-testimonial-job\">Instagram<\/div>\t\t\t\t\t\t\t\t\t<\/div>                            <\/div>\n                        <\/div>                    <\/div><\/div><div class=\"cs-ts-item\">                    <div class=\"cs-testimonial\"><div class=\"cs-testimonial-rating\"><span class=\"cs-testimonial-stars\"><\/span><\/div>                        <div class=\"cs-testimonial-content\">Buen\u00edsimas  instalaciones  y personal sumamente  amable, el ambiente es familiar y no es masivo, por lo tanto es perfecto para descansar y disfrutar de las aguas termales  curativas!!<\/div>                        <div class=\"cs-testimonial-meta\">\n                            <div class=\"elementor-testimonial-meta-inner\">\t                                <div class=\"elementor-testimonial-details\">\t                                    <div class=\"elementor-testimonial-name\">Kari L\u00f3pez<\/div>\t                                    <div class=\"elementor-testimonial-job\">Facebook<\/div>\t\t\t\t\t\t\t\t\t<\/div>                            <\/div>\n                        <\/div>                    <\/div><\/div><div class=\"cs-ts-item\">                    <div class=\"cs-testimonial\"><div class=\"cs-testimonial-rating\"><span class=\"cs-testimonial-stars\"><\/span><\/div>                        <div class=\"cs-testimonial-content\">He visitado varias veces, son muy agradables, una buena atenci\u00f3n, comida muy variada y sana, grandes jardines , enormes piscinas, y el mejor DESCANSO, recomendables!!!!!<\/div>                        <div class=\"cs-testimonial-meta\">\n                            <div class=\"elementor-testimonial-meta-inner\">\t                                <div class=\"elementor-testimonial-details\">\t                                    <div class=\"elementor-testimonial-name\">Lsagon<\/div>\t                                    <div class=\"elementor-testimonial-job\">Tripadvisor<\/div>\t\t\t\t\t\t\t\t\t<\/div>                            <\/div>\n                        <\/div>                    <\/div><\/div><div class=\"cs-ts-item\">                    <div class=\"cs-testimonial\"><div class=\"cs-testimonial-rating\"><span class=\"cs-testimonial-stars\"><\/span><\/div>                        <div class=\"cs-testimonial-content\">Un tranquilo lugar para descansar en familia o solos. Todas las reservas incluyen tres comidas buffet. Sin duda alguna volvemos para recargar energ\u00edas.<\/div>                        <div class=\"cs-testimonial-meta\">\n                            <div class=\"elementor-testimonial-meta-inner\">\t                                <div class=\"elementor-testimonial-details\">\t                                    <div class=\"elementor-testimonial-name\">Kuralemu Casa de Campo<\/div>\t                                    <div class=\"elementor-testimonial-job\">Google+<\/div>\t\t\t\t\t\t\t\t\t<\/div>                            <\/div>\n                        <\/div>                    <\/div><\/div><div class=\"cs-ts-item\">                    <div class=\"cs-testimonial\"><div class=\"cs-testimonial-rating\"><span class=\"cs-testimonial-stars\"><\/span><\/div>                        <div class=\"cs-testimonial-content\">Realmente es hermoso el paisaje y el turismo que tiene panimavida y su hotel \ud83d\ude0d<\/div>                        <div class=\"cs-testimonial-meta\">\n                            <div class=\"elementor-testimonial-meta-inner\">\t                                <div class=\"elementor-testimonial-details\">\t                                    <div class=\"elementor-testimonial-name\">Natalia Anais<\/div>\t                                    <div class=\"elementor-testimonial-job\">Instagram<\/div>\t\t\t\t\t\t\t\t\t<\/div>                            <\/div>\n                        <\/div>                    <\/div><\/div><div class=\"cs-ts-item\">                    <div class=\"cs-testimonial\"><div class=\"cs-testimonial-rating\"><span class=\"cs-testimonial-stars\"><\/span><\/div>                        <div class=\"cs-testimonial-content\">Me  encanto el ba\u00f1o de barro del spa, y ademas la linda celebracion que nos hicieron en el dia de la mama ,fue un lindo gesto y eso se agradese y habla bien de este lugar.<\/div>                        <div class=\"cs-testimonial-meta\">\n                            <div class=\"elementor-testimonial-meta-inner\">\t                                <div class=\"elementor-testimonial-details\">\t                                    <div class=\"elementor-testimonial-name\">Sussy Borquez Rojas<\/div>\t                                    <div class=\"elementor-testimonial-job\">Facebook<\/div>\t\t\t\t\t\t\t\t\t<\/div>                            <\/div>\n                        <\/div>                    <\/div><\/div><div class=\"cs-ts-item\">                    <div class=\"cs-testimonial\"><div class=\"cs-testimonial-rating\"><span class=\"cs-testimonial-stars\"><\/span><\/div>                        <div class=\"cs-testimonial-content\">\ud83d\ude4c que maravilla!!! Sin duda es un lugar que permite absolutamente que la familia completa disfrute \ud83d\ude0d<\/div>                        <div class=\"cs-testimonial-meta\">\n                            <div class=\"elementor-testimonial-meta-inner\">\t                                <div class=\"elementor-testimonial-details\">\t                                    <div class=\"elementor-testimonial-name\">Francisca Torres Sahli<\/div>\t                                    <div class=\"elementor-testimonial-job\">Instagram<\/div>\t\t\t\t\t\t\t\t\t<\/div>                            <\/div>\n                        <\/div>                    <\/div><\/div><div class=\"cs-ts-item\">                    <div class=\"cs-testimonial\"><div class=\"cs-testimonial-rating\"><span class=\"cs-testimonial-stars\"><\/span><\/div>                        <div class=\"cs-testimonial-content\">Maravilloso en todo sentido, el lugar, la comida, el personal. He ido en 3 oportunidades y siempre la atenci\u00f3n es muy buena<\/div>                        <div class=\"cs-testimonial-meta\">\n                            <div class=\"elementor-testimonial-meta-inner\">\t                                <div class=\"elementor-testimonial-details\">\t                                    <div class=\"elementor-testimonial-name\">Yasna Denise Valenzuela Cisternas<\/div>\t                                    <div class=\"elementor-testimonial-job\">Google+<\/div>\t\t\t\t\t\t\t\t\t<\/div>                            <\/div>\n                        <\/div>                    <\/div><\/div><div class=\"cs-ts-item\">                    <div class=\"cs-testimonial\"><div class=\"cs-testimonial-rating\"><span class=\"cs-testimonial-stars\"><\/span><\/div>                        <div class=\"cs-testimonial-content\">Hermoso lugar para desconectarse, respirar aire puro, pasarlo bien y comer muy rico. Recomendado 100%<\/div>                        <div class=\"cs-testimonial-meta\">\n                            <div class=\"elementor-testimonial-meta-inner\">\t                                <div class=\"elementor-testimonial-details\">\t                                    <div class=\"elementor-testimonial-name\">Paula Silva<\/div>\t                                    <div class=\"elementor-testimonial-job\">Google+<\/div>\t\t\t\t\t\t\t\t\t<\/div>                            <\/div>\n                        <\/div>                    <\/div><\/div><div class=\"cs-ts-item\">                    <div class=\"cs-testimonial\"><div class=\"cs-testimonial-rating\"><span class=\"cs-testimonial-stars\"><\/span><\/div>                        <div class=\"cs-testimonial-content\">Excelente eleccion ,exquisitas las piscinas muy buen buffet y la habitacion confortable, excelente atencion de recepcion <\/div>                        <div class=\"cs-testimonial-meta\">\n                            <div class=\"elementor-testimonial-meta-inner\">\t                                <div class=\"elementor-testimonial-details\">\t                                    <div class=\"elementor-testimonial-name\">Paola F<\/div>\t                                    <div class=\"elementor-testimonial-job\">Tripadvisor<\/div>\t\t\t\t\t\t\t\t\t<\/div>                            <\/div>\n                        <\/div>                    <\/div><\/div><div class=\"cs-ts-item\">                    <div class=\"cs-testimonial\"><div class=\"cs-testimonial-rating\"><span class=\"cs-testimonial-stars\"><\/span><\/div>                        <div class=\"cs-testimonial-content\">Hola amigos, les habla el Negro Pi\u00f1era. Quiero invitarlos a un lugar m\u00e1gico: las Termas de Panim\u00e1vida. Est\u00e1 a solo 20 minutos de Linares, \u00a1un lugar maravilloso que tienen que conocer!<\/div>                        <div class=\"cs-testimonial-meta\">\n                            <div class=\"elementor-testimonial-meta-inner\">\t                                <div class=\"elementor-testimonial-details\">\t                                    <div class=\"elementor-testimonial-name\">Negro Pi\u00f1era<\/div>\t                                    <div class=\"elementor-testimonial-job\">TikTok<\/div>\t\t\t\t\t\t\t\t\t<\/div>                            <\/div>\n                        <\/div>                    <\/div><\/div><\/div>            <\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Termas de Panim\u00e1vida Todo lo que necesitas en un s\u00f3lo lugar. Promociones Hotel, Resort &#038; Spa Experiencias exclusivas en nuestro hotel vis\u00edtanos DISFRUTA DE UNA EXPERIENCIA \u00daNICA EN TU ESTAD\u00cdA Selecciona un tipo de habitaci\u00f3n En nuestro hotel, ofrecemos una variedad de opciones en hospedaje para satisfacer las necesidades de todos nuestros hu\u00e9spedes. Desde acogedoras &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-wide-content.php","meta":{"_monsterinsights_skip_tracking":false,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"cozystay_single_page_hide_site_header":"","cozystay_single_page_site_header_source":"","cozystay_single_page_custom_site_header":"0","cozystay_single_page_custom_sticky_site_header":"0","cozystay_single_page_hide_page_title":"on","cozystay_single_page_header_section_size":"","cozystay_single_page_header_background_color":"","cozystay_single_page_header_background_position_x":"center","cozystay_single_page_header_background_position_y":"center","cozystay_single_page_header_background_size":"cover","cozystay_single_page_header_background_repeat":"off","cozystay_single_page_header_background_scroll":"on","cozystay_single_page_header_text_color":"","cozystay_single_page_header_show_breadcrumb":"","cozystay_single_page_site_footer_hide_main":"","cozystay_single_custom_site_footer_main_source":"","cozystay_single_custom_site_footer_main":"0","cozystay_single_page_site_footer_hide_above":"","cozystay_single_custom_site_footer_above_source":"","cozystay_single_custom_site_footer_above":"0","cozystay_single_page_site_footer_hide_instagram":"","cozystay_single_page_site_footer_hide_bottom":"","cozystay_single_custom_mobile_menu_source":"","cozystay_single_custom_mobile_menu":"0","cozystay_single_custom_mobile_menu_animation":"","cozystay_single_custom_mobile_menu_width":"","cozystay_single_custom_mobile_menu_custom_width":375,"footnotes":""},"class_list":["post-1376","page","type-page","status-publish","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"Es una habitaci\u00f3n de menores dimensiones. Se sit\u00faan en el pabell\u00f3n 100, que se encuentra en las inmediaciones del sector de Piscinas, y en el pabell\u00f3n 400, ubicado en las cercan\u00edas del sector del bar y comedor.Tipos de Cama: En las habitaciones del pabell\u00f3n 100, la cama es tipo matrimonial y para una tercera persona,\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/termasdepanimavida.cl\/esp\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Termas de P\u00e1nimavida -\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Inicio - Termas de P\u00e1nimavida\" \/>\n\t\t<meta property=\"og:description\" content=\"Es una habitaci\u00f3n de menores dimensiones. Se sit\u00faan en el pabell\u00f3n 100, que se encuentra en las inmediaciones del sector de Piscinas, y en el pabell\u00f3n 400, ubicado en las cercan\u00edas del sector del bar y comedor.Tipos de Cama: En las habitaciones del pabell\u00f3n 100, la cama es tipo matrimonial y para una tercera persona,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/termasdepanimavida.cl\/esp\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/termasdepanimavida.cl\/2024\/wp-content\/uploads\/2024\/03\/Logotipo_Amarillo-copia.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/termasdepanimavida.cl\/2024\/wp-content\/uploads\/2024\/03\/Logotipo_Amarillo-copia.png\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2023-03-24T06:35:06+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-09-11T13:51:45+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Inicio - Termas de P\u00e1nimavida\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Es una habitaci\u00f3n de menores dimensiones. Se sit\u00faan en el pabell\u00f3n 100, que se encuentra en las inmediaciones del sector de Piscinas, y en el pabell\u00f3n 400, ubicado en las cercan\u00edas del sector del bar y comedor.Tipos de Cama: En las habitaciones del pabell\u00f3n 100, la cama es tipo matrimonial y para una tercera persona,\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/termasdepanimavida.cl\/2024\/wp-content\/uploads\/2024\/03\/Logotipo_Amarillo-copia.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/#listItem\",\"name\":\"Inicio\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/#listItem\",\"position\":2,\"name\":\"Inicio\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp#listItem\",\"name\":\"Home\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/#organization\",\"name\":\"Termas de P\\u00e1nimavida\",\"url\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/cropped-cropped-Logotipo_Amarillo-copia-copia.png\",\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/#organizationLogo\",\"width\":1208,\"height\":566},\"image\":{\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/#organizationLogo\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/author\\\/soportepymesweb-cl\\\/#author\",\"url\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/author\\\/soportepymesweb-cl\\\/\",\"name\":\"Soporte\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/13183aff3a8c41505f0cddd86a05adb09fb1944b23908810dd9184674290bddc?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Soporte\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/#webpage\",\"url\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/\",\"name\":\"Inicio - Termas de P\\u00e1nimavida\",\"description\":\"Es una habitaci\\u00f3n de menores dimensiones. Se sit\\u00faan en el pabell\\u00f3n 100, que se encuentra en las inmediaciones del sector de Piscinas, y en el pabell\\u00f3n 400, ubicado en las cercan\\u00edas del sector del bar y comedor.Tipos de Cama: En las habitaciones del pabell\\u00f3n 100, la cama es tipo matrimonial y para una tercera persona,\",\"inLanguage\":\"es-ES\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/author\\\/soportepymesweb-cl\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/author\\\/soportepymesweb-cl\\\/#author\"},\"datePublished\":\"2023-03-24T06:35:06-03:00\",\"dateModified\":\"2026-09-11T10:51:45-03:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/#website\",\"url\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/\",\"name\":\"Termas de P\\u00e1nimavida\",\"inLanguage\":\"es-ES\",\"publisher\":{\"@id\":\"https:\\\/\\\/termasdepanimavida.cl\\\/esp\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Inicio - Termas de P\u00e1nimavida","description":"Es una habitaci\u00f3n de menores dimensiones. Se sit\u00faan en el pabell\u00f3n 100, que se encuentra en las inmediaciones del sector de Piscinas, y en el pabell\u00f3n 400, ubicado en las cercan\u00edas del sector del bar y comedor.Tipos de Cama: En las habitaciones del pabell\u00f3n 100, la cama es tipo matrimonial y para una tercera persona,","canonical_url":"https:\/\/termasdepanimavida.cl\/esp\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/termasdepanimavida.cl\/esp\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/termasdepanimavida.cl\/esp#listItem","position":1,"name":"Home","item":"https:\/\/termasdepanimavida.cl\/esp","nextItem":{"@type":"ListItem","@id":"https:\/\/termasdepanimavida.cl\/esp\/#listItem","name":"Inicio"}},{"@type":"ListItem","@id":"https:\/\/termasdepanimavida.cl\/esp\/#listItem","position":2,"name":"Inicio","previousItem":{"@type":"ListItem","@id":"https:\/\/termasdepanimavida.cl\/esp#listItem","name":"Home"}}]},{"@type":"Organization","@id":"https:\/\/termasdepanimavida.cl\/esp\/#organization","name":"Termas de P\u00e1nimavida","url":"https:\/\/termasdepanimavida.cl\/esp\/","logo":{"@type":"ImageObject","url":"https:\/\/termasdepanimavida.cl\/esp\/wp-content\/uploads\/2024\/03\/cropped-cropped-Logotipo_Amarillo-copia-copia.png","@id":"https:\/\/termasdepanimavida.cl\/esp\/#organizationLogo","width":1208,"height":566},"image":{"@id":"https:\/\/termasdepanimavida.cl\/esp\/#organizationLogo"}},{"@type":"Person","@id":"https:\/\/termasdepanimavida.cl\/esp\/author\/soportepymesweb-cl\/#author","url":"https:\/\/termasdepanimavida.cl\/esp\/author\/soportepymesweb-cl\/","name":"Soporte","image":{"@type":"ImageObject","@id":"https:\/\/termasdepanimavida.cl\/esp\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/13183aff3a8c41505f0cddd86a05adb09fb1944b23908810dd9184674290bddc?s=96&d=mm&r=g","width":96,"height":96,"caption":"Soporte"}},{"@type":"WebPage","@id":"https:\/\/termasdepanimavida.cl\/esp\/#webpage","url":"https:\/\/termasdepanimavida.cl\/esp\/","name":"Inicio - Termas de P\u00e1nimavida","description":"Es una habitaci\u00f3n de menores dimensiones. Se sit\u00faan en el pabell\u00f3n 100, que se encuentra en las inmediaciones del sector de Piscinas, y en el pabell\u00f3n 400, ubicado en las cercan\u00edas del sector del bar y comedor.Tipos de Cama: En las habitaciones del pabell\u00f3n 100, la cama es tipo matrimonial y para una tercera persona,","inLanguage":"es-ES","isPartOf":{"@id":"https:\/\/termasdepanimavida.cl\/esp\/#website"},"breadcrumb":{"@id":"https:\/\/termasdepanimavida.cl\/esp\/#breadcrumblist"},"author":{"@id":"https:\/\/termasdepanimavida.cl\/esp\/author\/soportepymesweb-cl\/#author"},"creator":{"@id":"https:\/\/termasdepanimavida.cl\/esp\/author\/soportepymesweb-cl\/#author"},"datePublished":"2023-03-24T06:35:06-03:00","dateModified":"2026-09-11T10:51:45-03:00"},{"@type":"WebSite","@id":"https:\/\/termasdepanimavida.cl\/esp\/#website","url":"https:\/\/termasdepanimavida.cl\/esp\/","name":"Termas de P\u00e1nimavida","inLanguage":"es-ES","publisher":{"@id":"https:\/\/termasdepanimavida.cl\/esp\/#organization"}}]},"og:locale":"es_ES","og:site_name":"Termas de P\u00e1nimavida -","og:type":"article","og:title":"Inicio - Termas de P\u00e1nimavida","og:description":"Es una habitaci\u00f3n de menores dimensiones. Se sit\u00faan en el pabell\u00f3n 100, que se encuentra en las inmediaciones del sector de Piscinas, y en el pabell\u00f3n 400, ubicado en las cercan\u00edas del sector del bar y comedor.Tipos de Cama: En las habitaciones del pabell\u00f3n 100, la cama es tipo matrimonial y para una tercera persona,","og:url":"https:\/\/termasdepanimavida.cl\/esp\/","og:image":"https:\/\/termasdepanimavida.cl\/2024\/wp-content\/uploads\/2024\/03\/Logotipo_Amarillo-copia.png","og:image:secure_url":"https:\/\/termasdepanimavida.cl\/2024\/wp-content\/uploads\/2024\/03\/Logotipo_Amarillo-copia.png","article:published_time":"2023-03-24T06:35:06+00:00","article:modified_time":"2026-09-11T13:51:45+00:00","twitter:card":"summary_large_image","twitter:title":"Inicio - Termas de P\u00e1nimavida","twitter:description":"Es una habitaci\u00f3n de menores dimensiones. Se sit\u00faan en el pabell\u00f3n 100, que se encuentra en las inmediaciones del sector de Piscinas, y en el pabell\u00f3n 400, ubicado en las cercan\u00edas del sector del bar y comedor.Tipos de Cama: En las habitaciones del pabell\u00f3n 100, la cama es tipo matrimonial y para una tercera persona,","twitter:image":"https:\/\/termasdepanimavida.cl\/2024\/wp-content\/uploads\/2024\/03\/Logotipo_Amarillo-copia.png"},"aioseo_meta_data":{"post_id":"1376","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"WebPage","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2024-03-29 16:17:35","updated":"2026-09-11 14:42:49","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/termasdepanimavida.cl\/esp\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tInicio\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/termasdepanimavida.cl\/esp"},{"label":"Inicio","link":"https:\/\/termasdepanimavida.cl\/esp\/"}],"_links":{"self":[{"href":"https:\/\/termasdepanimavida.cl\/esp\/wp-json\/wp\/v2\/pages\/1376","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/termasdepanimavida.cl\/esp\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/termasdepanimavida.cl\/esp\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/termasdepanimavida.cl\/esp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/termasdepanimavida.cl\/esp\/wp-json\/wp\/v2\/comments?post=1376"}],"version-history":[{"count":342,"href":"https:\/\/termasdepanimavida.cl\/esp\/wp-json\/wp\/v2\/pages\/1376\/revisions"}],"predecessor-version":[{"id":18060,"href":"https:\/\/termasdepanimavida.cl\/esp\/wp-json\/wp\/v2\/pages\/1376\/revisions\/18060"}],"wp:attachment":[{"href":"https:\/\/termasdepanimavida.cl\/esp\/wp-json\/wp\/v2\/media?parent=1376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}