{"id":221657,"date":"2026-08-22T21:11:52","date_gmt":"2026-08-22T21:11:52","guid":{"rendered":"https:\/\/parcroyalhotel.com\/suites-in-cuencas-historic-center-parc-royal-hotel\/superior-suite-in-cuenca-parc-royal-hotel\/"},"modified":"2026-10-14T22:15:22","modified_gmt":"2026-10-14T22:15:22","slug":"superior-suite","status":"publish","type":"page","link":"https:\/\/parcroyalhotel.com\/en\/suites\/superior-suite\/","title":{"rendered":"Superior Suite in Cuenca | Parc Royal Hotel"},"content":{"rendered":"<div class=\"et_pb_section_0 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_0 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_0 et_pb_column et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_8_24 et_flex_column_8_24_tablet et_flex_column_24_24_phone et_flex_column_8_24_widescreen et_flex_column_8_24_ultraWide\">\n<div class=\"et_pb_heading_0 et_pb_heading et_pb_module et_flex_module texto-grabado-oscuro\"><div class=\"et_pb_heading_container\"><h1 class=\"et_pb_module_header\">SUPERIOR SUITE<\/h1><\/div><\/div>\n\n<div class=\"et_pb_text_0 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><p>From 35 m\u00b2<br \/>2 guests \u00b7 Queen or King<\/p>\n<p><span>From USD 210 + tax \/ night<\/span><\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_module et_pb_button_module_wrapper et_pb_button_0_wrapper preset--module--divi-button--default_wrapper\"><a class=\"et_pb_button_0 et_pb_button et_pb_bg_layout_light et_pb_module et_flex_module preset--module--divi-button--default\" href=\"https:\/\/parcroyalhotel.com\/en\/reservations\/\">Book your stay<\/a><\/div>\n<\/div>\n\n<div class=\"et_pb_column_1 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_16_24 et_flex_column_16_24_tablet et_flex_column_24_24_phone et_flex_column_16_24_widescreen et_flex_column_16_24_ultraWide\">\n<div class=\"et_pb_image_0 et_pb_image et_pb_module et_flex_module\"><span class=\"et_pb_image_wrap\"><img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=\" title=\"Suite superior sala v2\" class=\"wp-image-2124 et_multi_view_hidden_image\" \/><\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_1 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_1 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_2 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone et_flex_column_24_24_widescreen et_flex_column_24_24_ultraWide\">\n<div class=\"et_pb_image_1 et_pb_image et_pb_module et_flex_module\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Aves-y-texturas-web.webp\" title=\"Aves y texturas web\" width=\"784\" height=\"930\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Aves-y-texturas-web.webp 784w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Aves-y-texturas-web-480x569.webp 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 784px, 100vw\" class=\"wp-image-1501\" \/><\/span><\/div>\n\n<div class=\"et_pb_text_1 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module mask-reveal\"><div class=\"et_pb_text_inner\"><h2>About the Suite<\/h2>\n<p>SPECIFICATIONS &amp; COMFORT<\/p>\n<\/div><\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_row_2 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_3 et_pb_column et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_8_24 et_flex_column_8_24_tablet et_flex_column_24_24_phone et_flex_column_8_24_widescreen et_flex_column_8_24_ultraWide\">\n<div class=\"et_pb_text_2 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><h5>BEDROOM<\/h5>\n<p>King or Queen bed<br \/>Twin option in two interior suites<br \/>Blackout curtains<br \/>Soundproof windows<\/p>\n<\/div><\/div>\n<\/div>\n\n<div class=\"et_pb_column_4 et_pb_column et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_8_24 et_flex_column_8_24_tablet et_flex_column_24_24_phone et_flex_column_8_24_widescreen et_flex_column_8_24_ultraWide\">\n<div class=\"et_pb_text_3 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><h5>BATHROOM &amp; WELLNESS<\/h5>\n<p>Floor-level rain shower<br \/>Central hot water system<br \/>Bath amenities<br \/>Hair dryer<br \/>Parc Royal bathrobes and slippers<\/p>\n<\/div><\/div>\n<\/div>\n\n<div class=\"et_pb_column_5 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_8_24 et_flex_column_8_24_tablet et_flex_column_24_24_phone et_flex_column_8_24_widescreen et_flex_column_8_24_ultraWide\">\n<div class=\"et_pb_text_4 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><h5>LIVING SPACE &amp; DETAILS<\/h5>\n<p>On the first and second floors<br \/>Living area with work desk<br \/>Small double sofa bed<br \/>Coffee station with coffee maker, kettle, microwave, and mini-fridge<br \/>Smart TV with DirecTV and in-room safe<br \/>High-speed Wi-Fi<\/p>\n<\/div><\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_row_3 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_6 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone et_flex_column_24_24_widescreen et_flex_column_24_24_ultraWide\">\n<div class=\"et_pb_text_5 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-phone=\"true\"><p _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\"><strong _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\"><span _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\">SIZE:<\/span><\/strong><span _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\"><span> From 3<\/span>5 m\u00b2 to 53 m\u00b2 \u00b7 <span>\u00a0<\/span><\/span><strong _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\"><ms-cmark-node _ngcontent-ng-c3333768056=\"\" _nghost-ng-c3333768056=\"\"><span _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\">CAPACITY:<\/span><\/ms-cmark-node><\/strong><span _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\"><span>\u00a0<\/span>2 guests \u00b7 <span>\u00a0<\/span><\/span><strong _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\"><ms-cmark-node _ngcontent-ng-c3333768056=\"\" _nghost-ng-c3333768056=\"\"><span _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\">CHECK-IN:<\/span><\/ms-cmark-node><\/strong><span _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\"><span>\u00a0<\/span>2:00 PM \u00b7 <span>\u00a0<\/span><\/span><strong _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\"><ms-cmark-node _ngcontent-ng-c3333768056=\"\" _nghost-ng-c3333768056=\"\"><span _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\">CHECK-OUT:<\/span><\/ms-cmark-node><\/strong><span _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\"><span>\u00a0<\/span>12:00 PM \u00b7\u00a0<span>\u00a0<\/span><\/span><strong _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\"><ms-cmark-node _ngcontent-ng-c3333768056=\"\" _nghost-ng-c3333768056=\"\"><span _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\">CANCELLATION:<\/span><\/ms-cmark-node><\/strong><span _ngcontent-ng-c3333768056=\"\" class=\"ng-star-inserted\"><span>\u00a0<\/span>Flexible (48 h)<\/span><\/p>\n<\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_2 et_pb_section et_section_regular et_block_section pr-carousel pr-editar-slides\">\n<div class=\"et_pb_row_4 et_pb_row et_pb_gutters1 et_grid_row pr-slide\">\n<div class=\"et_pb_column_7 et_pb_column et_block_column et_pb_css_mix_blend_mode_passthrough pr-col-text\">\n<div class=\"et_pb_image_2 et_pb_image et_pb_module et_block_module pr-thumb\"><span class=\"et_pb_image_wrap has-box-shadow-overlay\"><div class=\"box-shadow-overlay\"><\/div><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/TAPIZ-habitacion.jpg\" title=\"TAPIZ habitacion\" width=\"400\" height=\"600\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/TAPIZ-habitacion.jpg 400w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/TAPIZ-habitacion-200x300.jpg 200w\" sizes=\"(max-width: 400px) 100vw, 400px\" class=\"wp-image-1597\" \/><\/span><\/div>\n\n<div class=\"et_pb_text_6 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module pr-label\"><div class=\"et_pb_text_inner\"><p>01 \/ THE BEDROOM<\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_text_7 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module pr-caption\"><div class=\"et_pb_text_inner\"><p>Every detail was thought of before your arrival. All that is left is to rest.<\/p>\n<\/div><\/div>\n<\/div>\n\n<div class=\"et_pb_column_8 et_pb_column et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough pr-col-photo\">\n<div class=\"et_pb_image_3 et_pb_image et_pb_module et_block_module pr-hero\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/LUXURY3.jpg-Grande.jpeg\" title=\"LUXURY3.jpg (Grande)\" width=\"1620\" height=\"1080\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/LUXURY3.jpg-Grande.jpeg 1620w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/LUXURY3.jpg-Grande-1280x853.jpeg 1280w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/LUXURY3.jpg-Grande-980x653.jpeg 980w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/LUXURY3.jpg-Grande-480x320.jpeg 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 1620px, 100vw\" class=\"wp-image-897\" \/><\/span><\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_row_5 et_pb_row et_pb_gutters1 et_grid_row pr-slide\">\n<div class=\"et_pb_column_9 et_pb_column et_block_column et_pb_css_mix_blend_mode_passthrough pr-col-text\">\n<div class=\"et_pb_image_4 et_pb_image et_pb_module et_block_module pr-thumb\"><span class=\"et_pb_image_wrap has-box-shadow-overlay\"><div class=\"box-shadow-overlay\"><\/div><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/ARMONY.jpg-Mediana.jpeg\" title=\"ARMONY.jpg (Mediana)\" width=\"768\" height=\"1152\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/ARMONY.jpg-Mediana.jpeg 768w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/ARMONY.jpg-Mediana-480x720.jpeg 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 768px, 100vw\" class=\"wp-image-980\" \/><\/span><\/div>\n\n<div class=\"et_pb_text_8 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module pr-label\"><div class=\"et_pb_text_inner\"><p>02 \/ THE BATHROOM<\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_text_9 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module pr-caption\"><div class=\"et_pb_text_inner\"><p>Hot water from the very first second, and all the time you want to take.<\/p>\n<\/div><\/div>\n<\/div>\n\n<div class=\"et_pb_column_10 et_pb_column et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough pr-col-photo\">\n<div class=\"et_pb_image_5 et_pb_image et_pb_module et_block_module pr-hero\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Bano-v1.jpg\" title=\"Ba\u00f1o v1\" width=\"1350\" height=\"900\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Bano-v1.jpg 1350w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Bano-v1-1280x853.jpg 1280w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Bano-v1-980x653.jpg 980w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Bano-v1-480x320.jpg 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 1350px, 100vw\" class=\"wp-image-1594\" \/><\/span><\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_row_6 et_pb_row et_pb_gutters1 et_grid_row pr-slide\">\n<div class=\"et_pb_column_11 et_pb_column et_block_column et_pb_css_mix_blend_mode_passthrough pr-col-text\">\n<div class=\"et_pb_image_6 et_pb_image et_pb_module et_block_module pr-thumb\"><span class=\"et_pb_image_wrap has-box-shadow-overlay\"><div class=\"box-shadow-overlay\"><\/div><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Desayuno.jpg\" title=\"Desayuno\" width=\"400\" height=\"600\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Desayuno.jpg 400w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Desayuno-200x300.jpg 200w\" sizes=\"(max-width: 400px) 100vw, 400px\" class=\"wp-image-1606\" \/><\/span><\/div>\n\n<div class=\"et_pb_text_10 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module pr-label\"><div class=\"et_pb_text_inner\"><p>03 \/ BREAKFAST<\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_text_11 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module pr-caption\"><div class=\"et_pb_text_inner\"><p>The bread is baked here. The coffee comes from Vilcabamba. The morning begins unhurried.<\/p>\n<\/div><\/div>\n<\/div>\n\n<div class=\"et_pb_column_12 et_pb_column et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough pr-col-photo\">\n<div class=\"et_pb_image_7 et_pb_image et_pb_module et_block_module pr-hero\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/desayuno-v1.jpg\" title=\"desayuno v1\" width=\"1350\" height=\"900\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/desayuno-v1.jpg 1350w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/desayuno-v1-1280x853.jpg 1280w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/desayuno-v1-980x653.jpg 980w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/desayuno-v1-480x320.jpg 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 1350px, 100vw\" class=\"wp-image-1591\" \/><\/span><\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_row_7 et_pb_row et_pb_gutters1 et_grid_row pr-slide\">\n<div class=\"et_pb_column_13 et_pb_column et_block_column et_pb_css_mix_blend_mode_passthrough pr-col-text\">\n<div class=\"et_pb_image_8 et_pb_image et_pb_module et_block_module pr-thumb\"><span class=\"et_pb_image_wrap has-box-shadow-overlay\"><div class=\"box-shadow-overlay\"><\/div><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Silla-habitacion.jpg\" title=\"Silla habitacion\" width=\"403\" height=\"600\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Silla-habitacion.jpg 403w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Silla-habitacion-202x300.jpg 202w\" sizes=\"(max-width: 403px) 100vw, 403px\" class=\"wp-image-1602\" \/><\/span><\/div>\n\n<div class=\"et_pb_text_12 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module pr-label\"><div class=\"et_pb_text_inner\"><p>04 \/ THE LIVING AREA<\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_text_13 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module pr-caption\"><div class=\"et_pb_text_inner\"><p>A desk to work at and a coffee maker just steps away. The suite adapts to your day.<\/p>\n<\/div><\/div>\n<\/div>\n\n<div class=\"et_pb_column_14 et_pb_column et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough pr-col-photo\">\n<div class=\"et_pb_image_9 et_pb_image et_pb_module et_block_module pr-hero\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Suite-Superior-habitacion-v2.jpg\" title=\"Suite Superior habitacion v2\" width=\"1350\" height=\"900\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Suite-Superior-habitacion-v2.jpg 1350w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Suite-Superior-habitacion-v2-1280x853.jpg 1280w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Suite-Superior-habitacion-v2-980x653.jpg 980w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Suite-Superior-habitacion-v2-480x320.jpg 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 1350px, 100vw\" class=\"wp-image-1601\" \/><\/span><\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"et_pb_row_9 et_pb_row et_flex_row pr-engine\">\n<div class=\"et_pb_column_17 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone et_flex_column_24_24_widescreen et_flex_column_24_24_ultraWide\">\n<div class=\"et_pb_code_0 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><script>\n\/* ============================================================\n   MARCA DE EDITOR \u2014 va primero de todo, a prop\u00f3sito.\n   Divi 5 dibuja la p\u00e1gina del editor DENTRO DE UN IFRAME, y el sitio\n   p\u00fablico nunca est\u00e1 en uno. Esa se\u00f1al se puede consultar ya mismo,\n   mientras que las clases et-fb Divi las agrega bastante despu\u00e9s de\n   que la p\u00e1gina carg\u00f3. Preguntando ac\u00e1, el CSS de modo edici\u00f3n aplica\n   ANTES de que se pinte la primera l\u00e1mina: no hay superposici\u00f3n ni\n   parpadeo.\n   ============================================================ *\/\n(function () {\n  var editor = false;\n  try { editor = (window.self !== window.top); } catch (e) { editor = true; }\n  if (\/[?&](et_fb|et_bfb|app_window|et_pb_preview)=\/.test(location.search)) editor = true;\n  if (editor) document.documentElement.classList.add('pr-editor');\n})();\n<\/script>\n\n<style>\n\/* ==========================================================================\n   PARC ROYAL \u2014 Carrusel sincronizado (Divi 5 \/ Divi 4)\n   --------------------------------------------------------------------------\n   Cada SLIDE es una FILA (Row) completa de Divi que contiene las dos mitades.\n   Al cambiar de slide cambian la foto grande, la imagen chica y el texto\n   al mismo tiempo, porque son el mismo objeto. No hay nada que sincronizar.\n\n   Este bloque NO contiene im\u00e1genes ni textos: todo se edita desde el Builder.\n\n   Clases que hay que poner en Divi (Advanced > CSS ID & Classes):\n     .pr-carousel   -> la SECCI\u00d3N\n     .pr-slide      -> cada FILA (una por slide)\n     .pr-col-text   -> columna izquierda (azul)\n     .pr-col-photo  -> columna derecha (foto grande)\n     .pr-hero       -> m\u00f3dulo Image de la foto grande\n     .pr-thumb      -> m\u00f3dulo Image de la imagen chica enmarcada\n     .pr-label      -> m\u00f3dulo Text del r\u00f3tulo \"01 \/ EL DORMITORIO\"\n     .pr-caption    -> m\u00f3dulo Text de la frase\n     .pr-engine     -> la FILA que contiene este m\u00f3dulo Code (opcional)\n\n   Clases opcionales sobre la SECCI\u00d3N, para el Visual Builder:\n     pr-editar  -> fuerza el modo edici\u00f3n: se ven todas las filas apiladas\n     pr-forzar  -> fuerza el carrusel adentro del Builder, para previsualizarlo\n\n   Flechas propias (opcional): pon\u00e9 dos m\u00f3dulos Image dentro de la fila\n   .pr-engine con las clases .pr-arrow-src-prev y .pr-arrow-src-next y sub\u00ed ah\u00ed\n   tu SVG o PNG. Con una sola alcanza: la otra se espeja sola.\n\n   Ajustes r\u00e1pidos (Secci\u00f3n > Advanced > Atributos, o editando aqu\u00ed abajo):\n     data-interval=\"6000\"   milisegundos entre slides\n     data-fade=\"900\"        duraci\u00f3n del cruce\n     data-arrows=\"false\"    saca las flechas (por defecto est\u00e1n puestas)\n     data-arrow-prev=\"URL\"  otra forma de poner tu flecha, pegando la URL\n     data-arrow-next=\"URL\"  del archivo en vez de usar un m\u00f3dulo Image\n     data-dots=\"true\"       muestra puntitos de navegaci\u00f3n (por defecto: no)\n   ========================================================================== *\/\n\n.pr-carousel{\n  --pr-alto: clamp(520px, 46vw, 860px);  \/* alto del split en desktop *\/\n  --pr-fade: 900ms;\n  --pr-navy: #0f2b57;\n  --pr-arrow-tam: 23px;                  \/* lado del boton de la flecha (era 46) *\/\n\n  \/* La imagen chica va sin linea de marco. Si alguna vez la quer\u00e9s de vuelta,\n     pon\u00e9 el grosor en --pr-marco (1px) y el aire en --pr-marco-aire (9px). *\/\n  --pr-marco: 0;\n  --pr-marco-aire: 0px;\n\n  position: relative;\n}\n\n\/* OJO: el recorte va SOLO en modo carrusel. Si estuviera en la regla base\n   tambien recortaria dentro del Builder, donde las filas van una debajo de\n   la otra: se verian dos y el resto quedaria cortado. *\/\n.pr-carousel.pr-ready{ overflow: hidden; }\n\n\/* Antes de que arranque el JS se ve solo el primer slide, para que en el sitio\n   publicado no aparezcan todos apilados durante un instante. *\/\n.pr-carousel:not(.pr-ready):not(.pr-vb):not(.pr-editar) .pr-slide ~ .pr-slide{\n  display: none;\n}\n\n\/* La fila del m\u00f3dulo Code no se ve en el sitio (s\u00ed en el Builder, para editarla) *\/\n.pr-carousel.pr-ready .pr-engine{ display: none !important; }\n\n\/* --------------------------------------------------------------------------\n   MODO EDICI\u00d3N\n   Dentro del Visual Builder el carrusel NO arranca: se ven todas las filas,\n   una debajo de la otra, sin recortes y sin superposiciones.\n\n   html.pr-editor  lo pone el bloque de arriba apenas se parsea el m\u00f3dulo, o\n                   sea ANTES de que se pinte nada. Es la se\u00f1al que sirve:\n                   Divi 5 dibuja la p\u00e1gina del editor dentro de un iframe.\n   .pr-vb          lo pone el motor si detecta el Builder m\u00e1s tarde.\n   .pr-editar      lo pod\u00e9s poner vos a mano en la secci\u00f3n.\n   .pr-forzar      al rev\u00e9s: fuerza el carrusel adentro del Builder, para\n                   previsualizarlo.\n\n   OJO con los selectores de Divi: et-fb y et-bfb van en el <body>, pero\n   et-fb-root-ancestor va en el <html>. Antes dec\u00eda \"body.et-fb-root-ancestor\",\n   que no puede coincidir nunca.\n   -------------------------------------------------------------------------- *\/\n\n\/* Todas las filas visibles *\/\nhtml.pr-editor .pr-carousel:not(.pr-forzar) .pr-slide ~ .pr-slide,\nbody.et-fb   .pr-carousel:not(.pr-forzar) .pr-slide ~ .pr-slide,\nbody.et-bfb  .pr-carousel:not(.pr-forzar) .pr-slide ~ .pr-slide,\n.et-fb-root-ancestor .pr-carousel:not(.pr-forzar) .pr-slide ~ .pr-slide,\n.pr-carousel.pr-vb .pr-slide ~ .pr-slide,\n.pr-carousel.pr-editar:not(.pr-forzar) .pr-slide ~ .pr-slide{\n  display: block !important;\n  opacity: 1 !important;\n  visibility: visible !important;\n}\n\n\/* Ni recortes ni alturas fijas mientras se edita.\n   Lleva :not(.pr-forzar) y no :not(.pr-ready) a prop\u00f3sito: si el motor lleg\u00f3\n   a arrancar antes de que Divi marcara el editor, estas reglas tienen que\n   poder ganarle igual a las de .pr-ready. *\/\nhtml.pr-editor .pr-carousel:not(.pr-forzar),\nbody.et-fb   .pr-carousel:not(.pr-forzar),\nbody.et-bfb  .pr-carousel:not(.pr-forzar),\n.et-fb-root-ancestor .pr-carousel:not(.pr-forzar),\n.pr-carousel.pr-vb,\n.pr-carousel.pr-editar:not(.pr-forzar){\n  overflow: visible !important;\n  height: auto !important;\n  min-height: 0 !important;\n  counter-reset: pr-n;\n}\n\n\/* Esto es lo que evita que la foto se derrame sobre los m\u00f3dulos de abajo:\n   en modo carrusel las l\u00e1minas van apiladas en position:absolute, y si el\n   editor aparece con el carrusel ya armado, quedaban una encima de otra y\n   encima de las secciones siguientes. Ac\u00e1 vuelven al flujo normal. *\/\nhtml.pr-editor .pr-carousel:not(.pr-forzar) .pr-slide,\nbody.et-fb   .pr-carousel:not(.pr-forzar) .pr-slide,\nbody.et-bfb  .pr-carousel:not(.pr-forzar) .pr-slide,\n.et-fb-root-ancestor .pr-carousel:not(.pr-forzar) .pr-slide,\n.pr-carousel.pr-vb .pr-slide,\n.pr-carousel.pr-editar:not(.pr-forzar) .pr-slide{\n  position: relative !important;\n  inset: auto !important;\n  height: auto !important;\n  min-height: 0 !important;\n  transform: none !important;\n  opacity: 1 !important;\n  z-index: auto !important;\n  counter-increment: pr-n;\n}\n\n\/* Y las columnas de adentro tampoco deben estirarse al 100% de una altura\n   que en modo edici\u00f3n ya no existe. *\/\nhtml.pr-editor .pr-carousel:not(.pr-forzar) .pr-col-photo,\nhtml.pr-editor .pr-carousel:not(.pr-forzar) .pr-hero,\nbody.et-fb   .pr-carousel:not(.pr-forzar) .pr-col-photo,\nbody.et-fb   .pr-carousel:not(.pr-forzar) .pr-hero,\n.et-fb-root-ancestor .pr-carousel:not(.pr-forzar) .pr-col-photo,\n.et-fb-root-ancestor .pr-carousel:not(.pr-forzar) .pr-hero,\n.pr-carousel.pr-vb .pr-col-photo,\n.pr-carousel.pr-vb .pr-hero,\n.pr-carousel.pr-editar:not(.pr-forzar) .pr-col-photo,\n.pr-carousel.pr-editar:not(.pr-forzar) .pr-hero{\n  height: auto !important;\n}\n\n\/* La fila del m\u00f3dulo Code se oculta en el sitio, pero al editar tiene que\n   verse: es donde est\u00e1n el c\u00f3digo y las flechas personalizadas. *\/\nhtml.pr-editor .pr-carousel:not(.pr-forzar) .pr-engine,\nbody.et-fb   .pr-carousel:not(.pr-forzar) .pr-engine,\nbody.et-bfb  .pr-carousel:not(.pr-forzar) .pr-engine,\n.et-fb-root-ancestor .pr-carousel:not(.pr-forzar) .pr-engine,\n.pr-carousel.pr-vb .pr-engine,\n.pr-carousel.pr-editar:not(.pr-forzar) .pr-engine{\n  display: block !important;\n}\n\n\/* etiqueta para saber qu\u00e9 fila es cu\u00e1l sin contar en el panel de capas *\/\nhtml.pr-editor .pr-carousel:not(.pr-forzar) .pr-slide::before,\nbody.et-fb   .pr-carousel:not(.pr-forzar) .pr-slide::before,\nbody.et-bfb  .pr-carousel:not(.pr-forzar) .pr-slide::before,\n.et-fb-root-ancestor .pr-carousel:not(.pr-forzar) .pr-slide::before,\n.pr-carousel.pr-vb .pr-slide::before,\n.pr-carousel.pr-editar:not(.pr-forzar) .pr-slide::before{\n  content: \"SLIDE \" counter(pr-n, decimal-leading-zero);\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 60;\n  padding: 6px 13px;\n  background: rgba(0, 0, 0, .66);\n  color: #fff;\n  font: 500 10px\/1 -apple-system, \"Segoe UI\", Roboto, sans-serif;\n  letter-spacing: .2em;\n  pointer-events: none;\n}\n\n\/* --------------------------------------------------------------------------\n   Apilado + cruce suave\n   -------------------------------------------------------------------------- *\/\n\/* El \"track\" puede ser la propia secci\u00f3n (Divi pone las filas como hijas\n   directas) o un wrapper interno: el motor marca al que corresponda. *\/\n.pr-carousel.pr-ready .pr-track,\n.pr-carousel.pr-ready.pr-track{\n  display: grid;\n  min-height: var(--pr-alto);\n}\n\n\/* Cruce sin pasar por el fondo\n   -----------------------------\n   El slide que SALE se queda opaco abajo; el que ENTRA sube de 0 a 1 encima.\n   La suma de opacidades nunca baja de 1, as\u00ed que el fondo no llega a asomar:\n   una imagen se funde directamente sobre la otra.\n   Por eso el estado base no tiene transici\u00f3n \u2014 el apagado del saliente ocurre\n   reci\u00e9n cuando ya est\u00e1 tapado, y tiene que ser instant\u00e1neo. *\/\n.pr-carousel.pr-ready .pr-slide{\n  grid-area: 1 \/ 1;          \/* todos los slides ocupan la misma celda *\/\n  height: 100%;\n  opacity: 0;\n  visibility: hidden;        \/* saca los links del orden de tabulaci\u00f3n *\/\n  pointer-events: none;\n  transition: none;\n}\n\n.pr-carousel.pr-ready .pr-slide.is-visible{\n  visibility: visible;\n}\n\n.pr-carousel.pr-ready .pr-slide.is-active{\n  opacity: 1;\n  pointer-events: auto;\n  transition: opacity var(--pr-fade) cubic-bezier(.4, 0, .2, 1);\n}\n\n\/* --------------------------------------------------------------------------\n   Columna derecha: la foto llena la mitad, sin m\u00e1rgenes ni huecos\n   -------------------------------------------------------------------------- *\/\n.pr-carousel .pr-col-photo{\n  padding: 0 !important;\n  margin: 0 !important;\n}\n\n.pr-carousel.pr-ready .pr-col-photo,\n.pr-carousel.pr-ready .pr-col-photo > *,\n.pr-carousel.pr-ready .pr-hero,\n.pr-carousel.pr-ready .pr-hero > *{\n  height: 100%;\n}\n\n.pr-carousel .pr-hero img{\n  display: block;\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n}\n\n\/* Ken Burns opcional: agreg\u00e1 la clase pr-kenburns a la SECCI\u00d3N para activarlo *\/\n.pr-carousel.pr-kenburns.pr-ready .pr-slide.is-active .pr-hero img{\n  animation: pr-kb 9s ease-out forwards;\n}\n@keyframes pr-kb{\n  from{ transform: scale(1); }\n  to  { transform: scale(1.06); }\n}\n\n\/* --------------------------------------------------------------------------\n   Columna izquierda: marco de la imagen chica y tipograf\u00eda del bloque\n   (todo esto se puede sobrescribir desde el Builder si prefer\u00eds)\n   -------------------------------------------------------------------------- *\/\n.pr-carousel .pr-col-text{\n  background-color: var(--pr-navy);\n  display: flex;\n  flex-direction: column;\n  justify-content: center;   \/* centra verticalmente el bloque de la izquierda *\/\n}\n\n.pr-carousel .pr-thumb{\n  max-width: 232px;\n  margin: 0 auto 26px !important;\n  padding: var(--pr-marco-aire);\n  border: var(--pr-marco) solid rgba(255, 255, 255, .26);\n}\n.pr-carousel .pr-thumb img{\n  display: block;\n  width: 100%;\n  \/* El alto lo fija el motor con --pr-thumb-alto (ver \u00abTODAS LAS L\u00c1MINAS, LA\n     MISMA CAJA\u00bb m\u00e1s abajo). Si no lleg\u00f3 a medir, vale auto y se ve como antes. *\/\n  height: var(--pr-thumb-alto, auto);\n  object-fit: cover;\n}\n\n\/* --------------------------------------------------------------------------\n   TODAS LAS L\u00c1MINAS, LA MISMA CAJA\n   --------------------------------------------------------------------------\n   El problema que esto resuelve: la columna azul centra todo su bloque como\n   una unidad. Si una l\u00e1mina tiene el subt\u00edtulo de una l\u00ednea y otra de tres, el\n   bloque m\u00e1s corto arranca m\u00e1s abajo y se corre TODO: la foto chica, el\n   r\u00f3tulo y las flechas. Medido antes del arreglo, con el mismo ancho:\n\n       texto de 3 l\u00edneas   foto chica arriba en 378px\n       texto de 1 l\u00ednea    foto chica arriba en 410px   \u2190 32px m\u00e1s abajo\n\n   La soluci\u00f3n no es dejar de centrar, sino que todos los bloques midan lo\n   mismo: el motor mide la foto chica, el r\u00f3tulo y el subt\u00edtulo M\u00c1S ALTOS de\n   todas las l\u00e1minas y le reserva ese alto a todas. Centrados, si todos miden\n   igual, todos caen en el mismo sitio.\n\n   El texto corto queda pegado ARRIBA de su espacio reservado, as\u00ed la primera\n   l\u00ednea cae siempre a la misma altura. Eso es lo que hace un bloque normal:\n   por eso ac\u00e1 no hay ninguna regla, alcanza con el min-height que pone el JS.\n   -------------------------------------------------------------------------- *\/\n\n.pr-carousel .pr-label{\n  color: rgba(255, 255, 255, .72);\n  font-size: 12px;\n  letter-spacing: .22em;\n  text-transform: uppercase;\n  text-align: center;\n  margin-bottom: 46px !important;\n}\n\n.pr-carousel .pr-caption{\n  color: #fff;\n  font-style: italic;\n  font-size: clamp(17px, 1.35vw, 22px);\n  line-height: 1.62;\n  text-align: center;\n  max-width: 30ch;\n  margin: 0 auto !important;\n}\n\n\/* --------------------------------------------------------------------------\n   Flechas (se apagan con data-arrows=\"false\")\n   -------------------------------------------------------------------------- *\/\n.pr-carousel .pr-arrow{\n  position: absolute;\n  top: 50%;\n  z-index: 10;\n  transform: translateY(-50%);\n  width: var(--pr-arrow-tam);\n  height: var(--pr-arrow-tam);\n  padding: 0;\n  border: 0;\n  background: none;\n  color: #fff;\n  opacity: .72;\n  cursor: pointer;\n  transition: opacity .3s ease, transform .3s ease;\n  -webkit-tap-highlight-color: transparent;\n}\n.pr-carousel .pr-arrow svg{\n  display: block;\n  width: 100%;\n  height: 100%;\n  \/* doble sombra: un halo ajustado al trazo para que la flecha se lea sobre\n     una s\u00e1bana blanca, y otro difuso para que no quede recortada sobre una\n     pared oscura *\/\n  filter: drop-shadow(0 1px 2px rgba(0, 0, 0, .55))\n          drop-shadow(0 2px 12px rgba(0, 0, 0, .4));\n}\n.pr-carousel .pr-prev{ left: 26px; }\n.pr-carousel .pr-next{ right: 26px; }\n\n\/* Flecha propia (SVG o PNG subido desde el Builder) *\/\n.pr-carousel .pr-arrow-img{\n  display: block;\n  width: 100%;\n  height: 100%;\n  object-fit: contain;          \/* respeta la proporci\u00f3n del archivo *\/\n  filter: drop-shadow(0 1px 2px rgba(0, 0, 0, .55))\n          drop-shadow(0 2px 12px rgba(0, 0, 0, .4));\n}\n\/* si el dise\u00f1o es tuyo se muestra casi a full: no lo apagamos como al chevron *\/\n.pr-carousel .pr-arrow-custom{ opacity: .92; }\n\n\/* con subir UNA sola imagen alcanza: la otra flecha se espeja *\/\n.pr-carousel .pr-arrow-flip .pr-arrow-img{ transform: scaleX(-1); }\n\n\/* los m\u00f3dulos Image que sirven de origen no se ven en el front (s\u00ed en el\n   Builder, para poder subirlos) *\/\n.pr-carousel.pr-ready .pr-arrow-src-prev,\n.pr-carousel.pr-ready .pr-arrow-src-next{ display: none !important; }\n\n.pr-carousel .pr-arrow:hover{ opacity: 1; }\n.pr-carousel .pr-prev:hover{ transform: translateY(-50%) translateX(-4px); }\n.pr-carousel .pr-next:hover{ transform: translateY(-50%) translateX(4px); }\n\n.pr-carousel .pr-arrow:focus-visible{\n  opacity: 1;\n  outline: 1px solid rgba(255, 255, 255, .85);\n  outline-offset: 6px;\n}\n\n\/* --------------------------------------------------------------------------\n   Puntitos de navegaci\u00f3n (solo si pon\u00e9s data-dots=\"true\")\n   -------------------------------------------------------------------------- *\/\n.pr-carousel .pr-dots{\n  position: absolute;\n  z-index: 5;\n  left: 0;\n  bottom: 34px;\n  width: 50%;                \/* centrados sobre la mitad azul *\/\n  display: flex;\n  justify-content: center;\n  gap: 12px;\n}\n.pr-carousel .pr-dots button{\n  width: 7px;\n  height: 7px;\n  padding: 0;\n  border: 0;\n  border-radius: 50%;\n  background: rgba(255, 255, 255, .34);\n  cursor: pointer;\n  transition: background .3s ease, transform .3s ease;\n}\n.pr-carousel .pr-dots button[aria-current=\"true\"]{\n  background: #fff;\n  transform: scale(1.35);\n}\n\n\/* --------------------------------------------------------------------------\n   Mobile: foto arriba, bloque azul abajo\n   -------------------------------------------------------------------------- *\/\n\/* --------------------------------------------------------------------------\n   ESCRITORIO: flechas al centro y mitades clickeables\n   -------------------------------------------------------------------------- *\/\n@media (min-width: 981px){\n  \/* LAS FLECHAS VAN DEBAJO DEL TEXTO DEL PANEL AZUL.\n\n     No se fijan a un porcentaje: el motor MIDE la columna de texto y publica\n     --pr-fl-x (su centro) y --pr-fl-y (debajo de su \u00faltimo texto). As\u00ed da\n     igual la proporci\u00f3n de las columnas \u20141fr 2fr, 1fr 1fr, la que sea\u2014: las\n     flechas siguen al bloque azul sin tocar nada.\n\n     Si el motor no llegara a medir, los valores por defecto las dejan\n     centradas, que es donde estaban antes. *\/\n  .pr-carousel{\n    --pr-flechas-separacion: 26px;   \/* separaci\u00f3n entre las dos flechas *\/\n    --pr-flechas-ajuste: 0px;        \/* corrimiento fino: + baja, - sube *\/\n    --pr-flechas-min: 28px;          \/* aire m\u00ednimo entre el texto y las flechas *\/\n  }\n\n  .pr-carousel .pr-arrow{\n    top: var(--pr-fl-y, 50%);\n  }\n  .pr-carousel .pr-prev{\n    left: calc(var(--pr-fl-x, 50%) - var(--pr-flechas-separacion));\n    right: auto;\n    transform: translate(-100%, -50%);\n  }\n  .pr-carousel .pr-next{\n    left: calc(var(--pr-fl-x, 50%) + var(--pr-flechas-separacion));\n    right: auto;\n    transform: translate(0, -50%);\n  }\n  .pr-carousel .pr-prev:hover{ transform: translate(calc(-100% - 4px), -50%); }\n  .pr-carousel .pr-next:hover{ transform: translate(4px, -50%); }\n\n}\n\n@media (max-width: 980px){\n  .pr-carousel.pr-ready .pr-track,\n  .pr-carousel.pr-ready.pr-track{ min-height: 0; }\n\n  .pr-carousel.pr-ready .pr-slide{\n    display: flex;\n    flex-direction: column;\n    height: auto;\n  }\n  \/* si Divi mete un wrapper intermedio entre la fila y las columnas *\/\n  .pr-carousel.pr-ready .pr-slide > div:not(.pr-col-text):not(.pr-col-photo){\n    display: contents;\n  }\n\n  \/* ORDEN EN CELULAR: LA FOTO ARRIBA, EL PANEL AZUL ABAJO.\n     Es lo \u00fanico que hay que tocar para invertirlo: el que tiene 0 va arriba.\n     Funciona porque .pr-slide es un flex en columna, y el wrapper que Divi\n     mete a veces entre la fila y las columnas lleva display:contents (regla\n     de m\u00e1s arriba), as\u00ed que las dos columnas son hijas directas del flex y\n     `order` las manda de verdad. *\/\n  .pr-carousel.pr-ready .pr-col-photo{ order: 0; height: auto; }\n  .pr-carousel.pr-ready .pr-col-text { order: 1; height: auto; }\n\n  .pr-carousel.pr-ready .pr-hero,\n  .pr-carousel.pr-ready .pr-hero > *{ height: auto; }\n\n  \/* La foto ENTERA, sin recortar. Antes ten\u00eda una altura fija (54vh) y\n     object-fit la recortaba arriba y abajo. Con la proporci\u00f3n real de las\n     fotos (1620x1080) entra completa. Si tus fotos tienen otra proporci\u00f3n,\n     cambi\u00e1 --pr-foto-proporcion. *\/\n  .pr-carousel{ --pr-foto-proporcion: 1620 \/ 1080; }\n  .pr-carousel .pr-hero img{\n    width: 100%;\n    height: auto;\n    aspect-ratio: var(--pr-foto-proporcion);\n    object-fit: cover;\n    min-height: 0;\n    max-height: none;\n  }\n\n  .pr-carousel .pr-label{ margin-bottom: 28px !important; }\n  .pr-carousel .pr-dots{ width: 100%; bottom: 22px; }\n\n  \/* Flechas al centro vertical de la l\u00e1mina entera. La regla base ya trae\n     top:50% y translateY(-50%); antes esto lo pisaba con un top fijo para\n     dejarlas sobre la foto. *\/\n  .pr-carousel{ --pr-arrow-tam: var(--pr-arrow-tam-movil, 38px); }\n  .pr-carousel .pr-arrow{ top: 50%; }\n  .pr-carousel .pr-prev{ left: 10px; }\n  .pr-carousel .pr-next{ right: 10px; }\n\n  \/* ---- ARRASTRE CON EL DEDO -------------------------------------------\n     pan-y: el navegador se queda con el gesto vertical (scroll de la\n     p\u00e1gina) y nos deja el horizontal a nosotros. Sin esto habr\u00eda que\n     bloquear el scroll a mano y el resultado es siempre peor. *\/\n  .pr-carousel.pr-ready .pr-slide{ touch-action: pan-y; }\n\n  \/* Mientras el dedo est\u00e1 apoyado: las dos l\u00e1minas en juego, opacas y\n     sin transici\u00f3n, para que sigan el dedo al instante. *\/\n  .pr-carousel.pr-arrastre .pr-slide.pr-dr-actual,\n  .pr-carousel.pr-arrastre .pr-slide.pr-dr-entrante{\n    opacity: 1 !important;\n    visibility: visible !important;\n    transition: none !important;\n    will-change: transform;\n  }\n\n  \/* Al soltar: la desaceleraci\u00f3n. El cubic-bezier arranca r\u00e1pido y frena\n     al final; la duraci\u00f3n la calcula el motor seg\u00fan lo que falte recorrer. *\/\n  .pr-carousel.pr-soltando .pr-slide.pr-dr-actual,\n  .pr-carousel.pr-soltando .pr-slide.pr-dr-entrante{\n    opacity: 1 !important;\n    visibility: visible !important;\n    transition: transform var(--pr-soltar, 420ms) cubic-bezier(.17, .84, .44, 1) !important;\n  }\n}\n\n@media (prefers-reduced-motion: reduce){\n  .pr-carousel.pr-kenburns.pr-ready .pr-slide.is-active .pr-hero img{ animation: none; }\n  .pr-carousel .pr-prev:hover{ transform: translateY(-50%); }\n  .pr-carousel .pr-next:hover{ transform: translateY(-50%); }\n}\n<\/style>\n\n<script>\n\/* ==========================================================================\n   PARC ROYAL \u2014 motor del carrusel sincronizado\n   No toca im\u00e1genes ni textos: solo decide qu\u00e9 fila se ve.\n   ========================================================================== *\/\n(function () {\n  'use strict';\n\n  \/*! =====================================================================\n     TIEMPO ENTRE LAMINAS  \u2014  SE CAMBIA ACA\n\n     DEFAULT_INTERVAL : cu\u00e1nto se queda quieta cada l\u00e1mina, en milisegundos.\n                        3000 = 3 segundos. Para 5 segundos, pon\u00e9 5000.\n     DEFAULT_FADE     : cu\u00e1nto dura el cruce de una l\u00e1mina a la siguiente.\n\n     Tambi\u00e9n se puede cambiar sin tocar el c\u00f3digo, desde Divi, poni\u00e9ndole a\n     la secci\u00f3n los atributos data-interval y data-fade.\n     ====================================================================== *\/\n  var DEFAULT_INTERVAL = 3000;   \/* <-- 3 segundos *\/\n  var DEFAULT_FADE     = 900;\n\n  \/* Divi renombra sus clases entre versiones, as\u00ed que preguntamos por varias\n     se\u00f1ales en vez de confiar en una sola. *\/\n  function enVisualBuilder() {\n    if (document.documentElement.classList.contains('pr-editor')) return true;\n\n    \/* Estar dentro de un iframe ALCANZA. Antes se ped\u00eda adem\u00e1s que la URL\n       tuviera et_fb=1, y por eso la detecci\u00f3n fallaba: el motor arrancaba\n       el carrusel adentro del editor y las l\u00e1minas se pisaban entre s\u00ed. *\/\n    try { if (window.self !== window.top) return true; } catch (e) { return true; }\n\n    if (\/[?&](et_fb|et_bfb|app_window|et_pb_preview)=\/.test(location.search)) return true;\n\n    var h = document.documentElement;\n    var b = document.body;\n    var clases = ((h && h.className) || '') + ' ' + ((b && b.className) || '');\n    if (\/\\bet-fb\\b|\\bet-bfb\\b|\\bet-fb-root-ancestor\\b|\\bet-fb-preview\\b\/.test(clases)) {\n      return true;\n    }\n\n    if (document.getElementById('et-fb-app')) return true;\n\n    try {\n      var marco = window.frameElement;\n      if (marco && \/et[-_]fb|divi|builder\/i.test(\n            (marco.id || '') + ' ' + (marco.className || ''))) return true;\n    } catch (e) { \/* cross-origin *\/ }\n\n    return false;\n  }\n\n  \/* Divi monta el Visual Builder de forma AS\u00cdNCRONA. Si el carrusel lleg\u00f3 a\n     armarse antes de que apareciera, hay que deshacerlo: si no, las l\u00e1minas\n     quedan apiladas en absolute, tap\u00e1ndose entre s\u00ed y tapando las secciones\n     de m\u00e1s abajo. *\/\n  function volverAEdicion(root) {\n    if (root.classList.contains('pr-forzar')) return;\n    root.classList.remove('pr-ready');\n    root.classList.add('pr-vb');\n    root.__prIniciado = false;\n\n    var track = root.querySelector('.pr-track');\n    if (track) track.classList.remove('pr-track');\n\n    root.querySelectorAll('.pr-slide').forEach(function (s) {\n      s.style.zIndex = '';\n      s.classList.remove('is-visible', 'is-active');\n    });\n    root.querySelectorAll('.pr-engine').forEach(function (e) { e.style.display = ''; });\n  }\n\n  function vigilarEditor(root) {\n    function revisar() {\n      if (!enVisualBuilder()) return false;\n      volverAEdicion(root);\n      return true;\n    }\n    if (revisar()) return;\n    var obs = new MutationObserver(function () { if (revisar()) obs.disconnect(); });\n    obs.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n    if (document.body) obs.observe(document.body, { attributes: true, attributeFilter: ['class'], childList: true });\n    [500, 1500, 3000, 6000, 12000].forEach(function (t) {\n      setTimeout(function () { if (revisar()) obs.disconnect(); }, t);\n    });\n    setTimeout(function () { obs.disconnect(); }, 30000);\n  }\n\n  function iniciar(root) {\n    if (root.__prIniciado) return;\n\n    var slides = Array.prototype.slice.call(root.querySelectorAll('.pr-slide'));\n    if (!slides.length) return;   \/\/ todav\u00eda no se parse\u00f3 la secci\u00f3n: se reintenta\n\n    \/\/ .pr-forzar gana sobre todo: sirve para previsualizar el carrusel adentro\n    \/\/ del Builder. .pr-editar es lo contrario, y fuerza el modo edici\u00f3n.\n    var forzar = root.classList.contains('pr-forzar');\n    if (forzar) root.classList.remove('pr-editar');\n    if (!forzar && (root.classList.contains('pr-editar') || enVisualBuilder())) {\n      root.classList.add('pr-vb');   \/\/ se ven todas las filas, para editarlas\n      return;                        \/\/ sin marcar: si el Builder se cierra, reintenta\n    }\n\n    root.__prIniciado = true;\n    root.classList.remove('pr-vb');\n\n    var track = slides[0].parentNode;\n    track.classList.add('pr-track');\n\n    \/\/ La fila del m\u00f3dulo Code no debe ocupar la celda del grid.\n    Array.prototype.forEach.call(track.children, function (hijo) {\n      if (hijo.classList && hijo.classList.contains('pr-engine')) {\n        hijo.style.display = 'none';\n      }\n    });\n\n    var reduce   = window.matchMedia &&\n                   window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    var interval = parseInt(root.getAttribute('data-interval'), 10) || DEFAULT_INTERVAL;\n    var fade     = reduce ? 1 : (parseInt(root.getAttribute('data-fade'), 10) || DEFAULT_FADE);\n\n    root.style.setProperty('--pr-fade', fade + 'ms');\n\n    var indice   = 0;\n    var timer    = null;\n    var limpieza = null;\n    var freno    = { hover: false, foco: false, oculto: false };\n    var dots     = null;\n\n    root.setAttribute('role', 'region');\n    root.setAttribute('aria-roledescription', 'carrusel');\n    if (!root.getAttribute('aria-label')) root.setAttribute('aria-label', 'Galer\u00eda');\n    if (!root.hasAttribute('tabindex'))   root.setAttribute('tabindex', '0');\n\n    slides.forEach(function (s, n) {\n      s.setAttribute('role', 'group');\n      s.setAttribute('aria-roledescription', 'slide');\n      s.setAttribute('aria-label', (n + 1) + ' de ' + slides.length);\n      pintar(s, n === 0);\n    });\n\n    if (slides.length > 1) { construirFlechas(); construirDots(); }\n\n    root.classList.add('pr-ready');\n    vigilarEditor(root);\n    igualarCajas();\n    ubicarFlechas();\n\n    \/* ------------------------------------------------------------------\n       TODAS LAS L\u00c1MINAS, LA MISMA CAJA.\n       Mide el alto natural de la foto chica, el r\u00f3tulo y el subt\u00edtulo en TODAS\n       las l\u00e1minas, se queda con el m\u00e1s alto de cada uno y se lo reserva a\n       todas. Con los bloques del mismo alto, centrarlos los deja a todos en el\n       mismo sitio, y las flechas \u2014que se calculan contra el final del texto\u2014\n       dejan de moverse.\n\n       Se mide en dos tiempos a prop\u00f3sito: primero se borra TODO lo puesto\n       antes y reci\u00e9n despu\u00e9s se lee. Si se leyera con los altos ya puestos, se\n       estar\u00eda midiendo la reserva anterior en vez del texto.\n       ------------------------------------------------------------------ *\/\n    function igualarCajas() {\n      if (!root.classList.contains('pr-ready')) return;\n\n      \/* Va DENTRO de la funci\u00f3n a prop\u00f3sito. Estando afuera, con var, la\n         declaraci\u00f3n queda izada pero la asignaci\u00f3n no: la primera llamada\n         \u2014que ocurre m\u00e1s arriba\u2014 la encontraba en undefined y reventaba con\n         \u00abCannot read properties of undefined\u00bb. El motor se cortaba ah\u00ed y el\n         carrusel no llegaba a arrancar. *\/\n      var PIEZAS = ['pr-thumb', 'pr-label', 'pr-caption'];\n\n      \/* 1. borrar lo de antes *\/\n      slides.forEach(function (s) {\n        PIEZAS.forEach(function (c) {\n          var e = s.querySelector('.' + c);\n          if (e) e.style.removeProperty('min-height');\n        });\n      });\n      root.style.removeProperty('--pr-thumb-alto');\n\n      \/* 2. medir el alto natural de cada pieza en cada l\u00e1mina *\/\n      var alto = {};\n      PIEZAS.forEach(function (c) {\n        var m = 0;\n        slides.forEach(function (s) {\n          var e = s.querySelector('.' + c);\n          if (!e) return;\n          var h = e.getBoundingClientRect().height;\n          if (h > m) m = h;\n        });\n        alto[c] = m;\n      });\n\n      \/* 3. reservar ese alto en todas *\/\n      slides.forEach(function (s) {\n        PIEZAS.forEach(function (c) {\n          if (!alto[c]) return;\n          var e = s.querySelector('.' + c);\n          if (e) e.style.minHeight = Math.ceil(alto[c]) + 'px';\n        });\n      });\n\n      \/* La foto chica va con alto FIJO y no con m\u00ednimo: si una viniera m\u00e1s\n         alta que las otras, un m\u00ednimo no la achicar\u00eda y seguir\u00eda empujando.\n         Con alto fijo y object-fit:cover se recorta a la caja sin deformarse. *\/\n      if (alto['pr-thumb']) {\n        root.style.setProperty('--pr-thumb-alto', Math.ceil(alto['pr-thumb']) + 'px');\n      }\n\n      ubicarFlechas();\n    }\n\n    \/* Hay que volver a medir cada vez que puedan cambiar los renglones: al\n       cambiar el ancho, cuando terminan de cargar las fotos chicas, y cuando\n       carga la tipograf\u00eda \u2014un texto con la fuente de reserva ocupa distinto\n       que con la definitiva, y si se mide antes, la reserva queda corta. *\/\n    var reMedir = null;\n    function pedirIgualar() {\n      clearTimeout(reMedir);\n      reMedir = setTimeout(igualarCajas, 120);\n    }\n    window.addEventListener('resize', pedirIgualar);\n    window.addEventListener('load', pedirIgualar);\n    slides.forEach(function (s) {\n      var im = s.querySelector('.pr-thumb img');\n      if (im && !im.complete) im.addEventListener('load', pedirIgualar);\n    });\n    if (document.fonts && document.fonts.ready && document.fonts.ready.then) {\n      document.fonts.ready.then(pedirIgualar);\n    }\n\n    function pintar(slide, activo) {\n      slide.classList.toggle('is-visible', activo);\n      slide.classList.toggle('is-active', activo);\n      slide.setAttribute('aria-hidden', activo ? 'false' : 'true');\n    }\n\n    \/* ------------------------------------------------------------------\n       UBICAR LAS FLECHAS bajo el texto del panel azul.\n       Se mide en vez de suponer: la proporci\u00f3n de las columnas la defin\u00eds vos\n       en Divi y puede cambiar. Solo en escritorio; en celular las flechas\n       tienen su propia posici\u00f3n.\n       ------------------------------------------------------------------ *\/\n    \/* ------------------------------------------------------------------\n       POR QU\u00c9 SE MIDE CON offsetTop Y NO CON getBoundingClientRect.\n\n       getBoundingClientRect devuelve la caja YA TRANSFORMADA. Si algo mueve\n       el panel mientras se mide \u2014los efectos de scroll de Divi, por ejemplo,\n       que desplazan m\u00f3dulos seg\u00fan d\u00f3nde est\u00e1 la secci\u00f3n en la pantalla\u2014 el\n       n\u00famero sale corrido, y como la posici\u00f3n de las flechas queda escrita en\n       una variable, ese error se graba y no se corrige solo.\n\n       As\u00ed se descuadraban al bajar a la secci\u00f3n siguiente y volver: el\n       autoplay cambiaba de l\u00e1mina con la secci\u00f3n a medio entrar, med\u00eda el\n       panel desplazado, y guardaba esa posici\u00f3n. Reproducido con un efecto de\n       scroll puesto a prop\u00f3sito: las flechas se corr\u00edan 17px.\n\n       offsetTop y offsetLeft son de LAYOUT: no se enteran de las\n       transformaciones ni de d\u00f3nde est\u00e1 el scroll. Miden siempre lo mismo.\n       ------------------------------------------------------------------ *\/\n    function dentroDe(el, hasta, cual) {\n      var y = 0, n = el;\n      while (n && n !== hasta) { y += n[cual]; n = n.offsetParent; }\n      return y;\n    }\n\n    var ultimoFlX = '', ultimoFlY = '';\n\n    function ubicarFlechas() {\n      if (!root.classList.contains('pr-ready')) return;\n\n      if (window.innerWidth < 981) {\n        if (ultimoFlX || ultimoFlY) {\n          ultimoFlX = ultimoFlY = '';\n          root.style.removeProperty('--pr-fl-x');\n          root.style.removeProperty('--pr-fl-y');\n        }\n        return;\n      }\n\n      var lamina = slides[indice];\n      var col = lamina && lamina.querySelector('.pr-col-text');\n      if (!col) return;   \/* sin columna de texto: quedan como estaban *\/\n\n      if (!col.offsetWidth) return;\n\n      \/* Horizontal: el centro de la columna de texto. *\/\n      var nuevoX = Math.round(dentroDe(col, root, 'offsetLeft') + col.offsetWidth \/ 2) + 'px';\n      if (nuevoX !== ultimoFlX) {\n        ultimoFlX = nuevoX;\n        root.style.setProperty('--pr-fl-x', nuevoX);\n      }\n\n      \/* Vertical: el fondo del contenido de la columna.\n         Antes esto buscaba etiquetas concretas (p, h2, .pr-caption\u2026) y si el\n         texto no era ninguna de ellas, la medici\u00f3n se quedaba corta y las\n         flechas ca\u00edan ENCIMA del t\u00edtulo. Ahora recorre todo lo que haya\n         adentro y se queda con lo m\u00e1s bajo, sea cual sea la etiqueta. *\/\n      \/* Se miden los HIJOS DIRECTOS y no todos los descendientes. La caja de\n         un m\u00f3dulo ya contiene a su texto, as\u00ed que el resultado es el mismo y\n         se leen tres o cuatro rect\u00e1ngulos en vez de todos. Cada lectura, si\n         hubo una escritura antes, obliga al navegador a rehacer la p\u00e1gina.\n         Medido en 40 cambios de ancho de ventana: 122 layouts antes, contra\n         40 del control sin el m\u00f3dulo. *\/\n      var arribaCol = dentroDe(col, root, 'offsetTop');\n      var fondoCol  = arribaCol + col.offsetHeight;\n\n      \/* Se miran los hijos directos de la columna. Pero Divi a veces mete un\n         contenedor que se ESTIRA a toda la columna: ese contenedor termina\n         donde termina el panel, y tomarlo como \u00abfin del texto\u00bb manda las\n         flechas contra el borde de abajo. Medido con un envoltorio puesto:\n         las flechas ca\u00edan en 643 con el panel terminando en 662, o sea\n         clavadas al borde, en vez de 625.\n         Por eso, al hijo que mide casi tanto como la columna no se lo mide:\n         se entra adentro y se miran sus hijos. *\/\n      var fondo = 0;\n      function mirar(lista, profundidad) {\n        Array.prototype.forEach.call(lista, function (t) {\n          if (t.classList && t.classList.contains('pr-arrow')) return;\n          if (t.offsetWidth < 2 || t.offsetHeight < 2) return;\n          if (profundidad < 3 && t.children.length &&\n              t.offsetHeight >= col.offsetHeight * 0.95) {\n            mirar(t.children, profundidad + 1);\n            return;\n          }\n          var b = dentroDe(t, root, 'offsetTop') + t.offsetHeight;\n          if (b > fondo) fondo = b;\n        });\n      }\n      mirar(col.children, 0);\n      if (!fondo) fondo = fondoCol;\n\n      var cs = getComputedStyle(root);\n      var minimo = parseInt(cs.getPropertyValue('--pr-flechas-min'), 10) || 28;\n      var ajuste = parseInt(cs.getPropertyValue('--pr-flechas-ajuste'), 10) || 0;\n      var alto   = parseInt(cs.getPropertyValue('--pr-arrow-tam'), 10) || 23;\n\n      \/* CENTRADAS en el aire que queda entre el final del texto y el borde\n         de abajo del bloque azul. As\u00ed el espacio se reparte solo, sin\n         depender de cu\u00e1nto texto tenga cada l\u00e1mina. *\/\n      var y = (fondo + fondoCol) \/ 2 + ajuste;\n\n      \/* Sin pisar el texto, y sin salirse del bloque. *\/\n      var minY = fondo + minimo + alto \/ 2;\n      var maxY = fondoCol - alto \/ 2 - 8;\n      if (y < minY) y = minY;\n      if (y > maxY) y = maxY;\n\n      \/* Solo se escribe si cambi\u00f3: escribir una variable de CSS ensucia el\n         estilo aunque el valor sea el mismo, y lo que viene despu\u00e9s tiene\n         que recalcularlo. *\/\n      var nuevoY = Math.round(y) + 'px';\n      if (nuevoY !== ultimoFlY) {\n        ultimoFlY = nuevoY;\n        root.style.setProperty('--pr-fl-y', nuevoY);\n      }\n    }\n\n    \/* El resize NO llama a medir directo. En el celular, esconder y mostrar la\n       barra del navegador al scrollear dispara resize, as\u00ed que atarlo sin\n       freno significa medir la p\u00e1gina en mitad del scroll. Con rAF se mide\n       como mucho una vez por cuadro, y solo cuando el navegador va a pintar. *\/\n    var flPedido = 0;\n    function pedirFlechas() {\n      if (flPedido) return;\n      flPedido = requestAnimationFrame(function () { flPedido = 0; ubicarFlechas(); });\n    }\n    window.addEventListener('resize', pedirFlechas);\n    window.addEventListener('load', pedirFlechas);\n\n    function ir(n) {\n      n = (n % slides.length + slides.length) % slides.length;\n      if (n === indice) return;\n\n      var saliente = slides[indice];\n      var entrante = slides[n];\n\n      \/\/ 1. el entrante se hace visible con opacidad 0, justo encima del saliente.\n      \/\/    Solo hay dos slides en juego, asi que el apilado es 0 \/ 1 \/ 2 y nunca\n      \/\/    crece: si creciera terminaria pasando por encima de las flechas.\n      \/\/    De paso se apaga cualquier slide que haya quedado a medias por clics\n      \/\/    muy seguidos: en el cruce solo participan estos dos.\n      slides.forEach(function (s, i) {\n        s.style.zIndex = '0';\n        if (i !== indice && i !== n) {\n          s.classList.remove('is-active');\n          s.classList.remove('is-visible');\n        }\n      });\n      saliente.style.zIndex = '1';\n      entrante.style.zIndex = '2';\n      entrante.classList.remove('is-active');\n      entrante.classList.add('is-visible');\n      void entrante.offsetWidth;                 \/\/ fuerza el reflow: sin esto no hay cruce\n\n      \/\/ 2. sube de 0 a 1 mientras el saliente sigue OPACO abajo. La suma nunca\n      \/\/    baja de 1, as\u00ed que el cruce no deja ver el fondo en ning\u00fan momento.\n      entrante.classList.add('is-active');\n      entrante.setAttribute('aria-hidden', 'false');\n      saliente.setAttribute('aria-hidden', 'true');\n\n      indice = n;\n\n      if (dots) {\n        dots.forEach(function (d, i) {\n          d.setAttribute('aria-current', i === indice ? 'true' : 'false');\n        });\n      }\n      root.dispatchEvent(new CustomEvent('pr:cambio', { detail: { indice: indice } }));\n      ubicarFlechas();\n\n      \/\/ 3. terminado el cruce se apagan los que quedaron atr\u00e1s, ya tapados\n      clearTimeout(limpieza);\n      limpieza = setTimeout(function () {\n        slides.forEach(function (s, i) {\n          if (i !== indice) {\n            s.classList.remove('is-active');\n            s.classList.remove('is-visible');\n          }\n        });\n      }, fade + 60);\n    }\n\n    function siguiente() { ir(indice + 1); }\n    function anterior()  { ir(indice - 1); }\n\n    function frenado() { return freno.hover || freno.foco || freno.oculto; }\n\n    function reproducir() {\n      detener();\n      if (slides.length < 2) return;\n      timer = setInterval(function () {\n        if (!frenado()) siguiente();\n      }, interval);\n    }\n\n    function detener() {\n      if (timer) { clearInterval(timer); timer = null; }\n    }\n\n    \/* Busca una flecha propia: primero un m\u00f3dulo Image marcado en el Builder,\n       despu\u00e9s el atributo data-arrow-*. Si no hay nada, devuelve null y se usa\n       el chevron dibujado por defecto. *\/\n    function fuenteFlecha(dir) {\n      var img = root.querySelector('.pr-arrow-src-' + dir + ' img');\n      if (img) {\n        var src = img.getAttribute('src') ||\n                  img.getAttribute('data-src') ||\n                  img.getAttribute('data-lazy-src') || '';\n        \/\/ los optimizadores dejan un GIF transparente mientras cargan: no sirve\n        if (src && src.indexOf('data:image\/gif') !== 0) return src;\n      }\n      var attr = root.getAttribute('data-arrow-' + dir);\n      return (attr && attr.trim()) ? attr.trim() : null;\n    }\n\n    function construirFlechas() {\n      var pedido = (root.getAttribute('data-arrows') || '').toLowerCase();\n      if (pedido === 'false' || pedido === 'off' || pedido === '0') return;\n\n      var srcPrev = fuenteFlecha('prev');\n      var srcNext = fuenteFlecha('next');\n\n      \/\/ con subir UNA imagen alcanza: la que falta se espeja\n      var flipPrev = false, flipNext = false;\n      if (srcPrev && !srcNext) { srcNext = srcPrev; flipNext = true; }\n      else if (srcNext && !srcPrev) { srcPrev = srcNext; flipPrev = true; }\n\n      [['prev', 'Anterior',  'M15 4 L7 12 L15 20', anterior,  srcPrev, flipPrev],\n       ['next', 'Siguiente', 'M9 4 L17 12 L9 20',  siguiente, srcNext, flipNext]\n      ].forEach(function (f) {\n        var b = document.createElement('button');\n        b.type = 'button';\n        b.className = 'pr-arrow pr-' + f[0] +\n                      (f[4] ? ' pr-arrow-custom' : '') +\n                      (f[5] ? ' pr-arrow-flip'   : '');\n        b.setAttribute('aria-label', f[1]);\n\n        if (f[4]) {\n          var im = document.createElement('img');\n          im.className = 'pr-arrow-img';\n          im.src = f[4];\n          im.alt = '';\n          im.setAttribute('aria-hidden', 'true');\n          im.setAttribute('draggable', 'false');\n          b.appendChild(im);\n        } else {\n          b.innerHTML = '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">' +\n                          '<path d=\"' + f[2] + '\" fill=\"none\" stroke=\"currentColor\" ' +\n                          'stroke-width=\"1.1\" stroke-linecap=\"square\" stroke-linejoin=\"miter\"\/>' +\n                        '<\/svg>';\n        }\n\n        b.addEventListener('click', function (e) {\n          e.preventDefault();\n          f[3]();\n          reproducir();\n        });\n        root.appendChild(b);\n      });\n    }\n\n    function construirDots() {\n      var pedido = (root.getAttribute('data-dots') || '').toLowerCase();\n      if (pedido !== 'true' && pedido !== 'on' && pedido !== '1') return;\n\n      var nav = document.createElement('div');\n      nav.className = 'pr-dots';\n      nav.setAttribute('role', 'tablist');\n\n      dots = slides.map(function (s, n) {\n        var b = document.createElement('button');\n        b.type = 'button';\n        b.setAttribute('aria-label', 'Ver slide ' + (n + 1));\n        b.setAttribute('aria-current', n === 0 ? 'true' : 'false');\n        b.addEventListener('click', function () { ir(n); reproducir(); });\n        nav.appendChild(b);\n        return b;\n      });\n\n      root.appendChild(nav);\n    }\n\n    \/* ---- ARRASTRE CON EL DEDO -------------------------------------------\n       Antes esto era un swipe por umbral: no pasaba nada hasta soltar el\n       dedo, y ah\u00ed la l\u00e1mina saltaba. Ahora la l\u00e1mina sigue al dedo y al\n       soltar frena. Solo en t\u00e1ctil: en escritorio se conserva el cruce\n       suave, que es el efecto que corresponde ah\u00ed.\n       --------------------------------------------------------------------- *\/\n    var tactil = window.matchMedia && window.matchMedia('(pointer: coarse)').matches;\n\n    var dr = null;   \/* estado del arrastre en curso *\/\n\n    function anchoLamina() { return root.getBoundingClientRect().width || 1; }\n\n    function limpiarArrastre() {\n      if (!dr) return;\n      root.classList.remove('pr-arrastre', 'pr-soltando');\n      [dr.actual, dr.entrante].forEach(function (s) {\n        if (!s) return;\n        s.style.transform = '';\n        s.style.willChange = '';\n        s.classList.remove('pr-dr-actual', 'pr-dr-entrante');\n      });\n      dr = null;\n    }\n\n    root.addEventListener('pointerdown', function (e) {\n      if (!tactil || slides.length < 2) return;\n      if (e.pointerType === 'mouse') return;\n      if (e.target.closest && e.target.closest('.pr-arrow, .pr-dots, a, button')) return;\n\n      \/* si ven\u00eda una animaci\u00f3n de soltar a medias, la cerramos ya *\/\n      if (dr && dr.soltando) { finalizar(dr.destino); }\n\n      dr = {\n        x0: e.clientX, y0: e.clientY, t0: e.timeStamp,\n        dx: 0, decidido: false, horizontal: false,\n        actual: slides[indice], entrante: null, signo: 0,\n        soltando: false, destino: indice\n      };\n      detener();   \/* el autoplay se corta mientras el dedo est\u00e1 apoyado *\/\n    }, { passive: true });\n\n    root.addEventListener('pointermove', function (e) {\n      if (!dr || dr.soltando) return;\n\n      var dx = e.clientX - dr.x0;\n      var dy = e.clientY - dr.y0;\n\n      if (!dr.decidido) {\n        if (Math.abs(dx) < 6 && Math.abs(dy) < 6) return;   \/* todav\u00eda no se sabe *\/\n        dr.decidido = true;\n        dr.horizontal = Math.abs(dx) > Math.abs(dy);\n        if (!dr.horizontal) { limpiarArrastre(); reproducir(); return; }\n        root.classList.add('pr-arrastre');\n        dr.actual.classList.add('pr-dr-actual');\n      }\n      if (!dr.horizontal) return;\n\n      var w = anchoLamina();\n      var signo = dx < 0 ? 1 : -1;   \/* 1 = va hacia el siguiente *\/\n\n      \/* Si cambi\u00f3 de direcci\u00f3n a mitad del gesto, cambiamos la l\u00e1mina que entra *\/\n      if (signo !== dr.signo) {\n        if (dr.entrante) {\n          dr.entrante.style.transform = '';\n          dr.entrante.classList.remove('pr-dr-entrante');\n        }\n        dr.signo = signo;\n        var n = ((indice + signo) % slides.length + slides.length) % slides.length;\n        dr.entrante = slides[n];\n        dr.iEntrante = n;\n        dr.entrante.classList.add('pr-dr-entrante');\n        dr.actual.style.zIndex = '1';\n        dr.entrante.style.zIndex = '2';\n      }\n\n      \/* Resistencia en los bordes no hace falta: el carrusel es infinito.\n         S\u00ed limitamos a un ancho, para que no se pueda arrastrar de m\u00e1s. *\/\n      dx = Math.max(-w, Math.min(w, dx));\n      dr.dx = dx;\n\n      dr.actual.style.transform   = 'translateX(' + dx + 'px)';\n      dr.entrante.style.transform = 'translateX(' + (dx + signo * w) + 'px)';\n\n      dr.xUlt = e.clientX;\n      dr.tUlt = e.timeStamp;\n    }, { passive: true });\n\n    function finalizar(nuevoIndice) {\n      if (!dr) return;\n      var cambia = (nuevoIndice !== indice);\n      var ent = dr.entrante, act = dr.actual;\n      limpiarArrastre();\n\n      if (cambia) {\n        \/* Dejamos el estado coherente sin volver a animar: el movimiento ya\n           lo hizo el arrastre. *\/\n        slides.forEach(function (s, i) {\n          s.style.zIndex = '0';\n          pintar(s, i === nuevoIndice);\n        });\n        indice = nuevoIndice;\n        if (dots) dots.forEach(function (d, i) {\n          d.setAttribute('aria-current', i === indice ? 'true' : 'false');\n        });\n        root.dispatchEvent(new CustomEvent('pr:cambio', { detail: { indice: indice } }));\n      } else if (act) {\n        pintar(act, true);\n        if (ent) pintar(ent, false);\n      }\n      reproducir();\n    }\n\n    function soltar(e) {\n      if (!dr) return;\n      if (!dr.horizontal || !dr.entrante) { limpiarArrastre(); reproducir(); return; }\n\n      var w = anchoLamina();\n      var dt = Math.max(1, (dr.tUlt || e.timeStamp) - dr.t0);\n      var v  = Math.abs(dr.dx) \/ dt;            \/* px por ms *\/\n\n      \/* Pasa de l\u00e1mina si el dedo recorri\u00f3 lo suficiente O si fue un\n         movimiento r\u00e1pido aunque corto. *\/\n      var pasa = Math.abs(dr.dx) > w * 0.18 || v > 0.45;\n\n      var destino = pasa ? (dr.dx < 0 ? w * -1 : w) : 0;\n      var falta   = Math.abs(destino - dr.dx);\n\n      \/* Duraci\u00f3n seg\u00fan lo que falte y qu\u00e9 tan r\u00e1pido ven\u00eda: as\u00ed el frenado se\n         siente continuo con el gesto, no como una animaci\u00f3n aparte.\n         MIN_FRENO es el piso: con menos que esto la desaceleraci\u00f3n no se\n         llega a percibir y el cambio parece seco. Subilo si lo quer\u00e9s m\u00e1s\n         lento, bajalo si lo quer\u00e9s m\u00e1s seco. *\/\n      var MIN_FRENO = 280, MAX_FRENO = 620;\n      var ms = Math.round(Math.min(MAX_FRENO, Math.max(MIN_FRENO, falta \/ Math.max(0.35, v) * 0.9)));\n      root.style.setProperty('--pr-soltar', ms + 'ms');\n\n      dr.soltando = true;\n      dr.destino  = pasa ? dr.iEntrante : indice;\n      root.classList.remove('pr-arrastre');\n      root.classList.add('pr-soltando');\n\n      dr.actual.style.transform   = 'translateX(' + destino + 'px)';\n      dr.entrante.style.transform = 'translateX(' + (destino + dr.signo * w) + 'px)';\n\n      var cerrado = false;\n      function cerrar() {\n        if (cerrado) return;\n        cerrado = true;\n        dr.actual.removeEventListener('transitionend', cerrar);\n        finalizar(dr.destino);\n      }\n      dr.actual.addEventListener('transitionend', cerrar);\n      setTimeout(cerrar, ms + 90);   \/* por si transitionend no llega *\/\n    }\n\n    root.addEventListener('pointerup', soltar, { passive: true });\n    root.addEventListener('pointercancel', function () {\n      if (dr && !dr.soltando) { limpiarArrastre(); reproducir(); }\n    }, { passive: true });\n\n    \/* En escritorio se mantiene el swipe de siempre (mouse arrastrado). *\/\n    var mx0 = 0, my0 = 0, mAbajo = false;\n    root.addEventListener('pointerdown', function (e) {\n      if (tactil || e.pointerType !== 'mouse' || e.button !== 0) return;\n      mAbajo = true; mx0 = e.clientX; my0 = e.clientY;\n    }, { passive: true });\n    root.addEventListener('pointerup', function (e) {\n      if (!mAbajo) return;\n      mAbajo = false;\n      var dx = e.clientX - mx0, dy = e.clientY - my0;\n      if (Math.abs(dx) > 45 && Math.abs(dx) > Math.abs(dy) * 1.4) {\n        if (dx < 0) siguiente(); else anterior();\n        reproducir();\n      }\n    }, { passive: true });\n\n    \/* ---- MITADES CLICKEABLES (escritorio) -------------------------------\n       Una forma extra de pasar de l\u00e1mina para quien no ve las flechas: la\n       mitad izquierda va atr\u00e1s, la derecha adelante.\n\n       Se resuelve mirando d\u00f3nde cay\u00f3 el clic, sin poner ninguna capa encima.\n       Una capa invisible tapar\u00eda el texto: no se podr\u00eda seleccionar ni\n       clickear un enlace. As\u00ed no molesta a nada.\n       --------------------------------------------------------------------- *\/\n    if (!tactil && slides.length > 1) {\n      var cx0 = 0, cy0 = 0, movido = false;\n\n      \/* ------------------------------------------------------------------\n         D\u00d3NDE TERMINA \"ATR\u00c1S\" Y EMPIEZA \"ADELANTE\".\n         No es la mitad de la secci\u00f3n: es la JUNTURA entre el panel azul y la\n         foto. Con columnas 1fr 2fr esa juntura cae en el 33%, no en el 50%,\n         as\u00ed que partir por la mitad dejaba una franja de foto que segu\u00eda\n         contando como \"atr\u00e1s\".\n         Se mide en vez de suponer, igual que la posici\u00f3n de las flechas: si\n         ma\u00f1ana cambi\u00e1s la proporci\u00f3n, esto la sigue solo.\n         ------------------------------------------------------------------ *\/\n      function limiteZonas() {\n        var lamina = slides[indice];\n        var col = lamina && lamina.querySelector('.pr-col-text');\n        if (col) {\n          var c = col.getBoundingClientRect();\n          if (c.width) return c.right;\n        }\n        var caja = root.getBoundingClientRect();\n        return caja.left + caja.width \/ 2;   \/* sin columna: por la mitad *\/\n      }\n\n      \/* Lo que NO debe disparar el cambio de l\u00e1mina *\/\n      function esInteractivo(el) {\n        return !!(el && el.closest &&\n                  el.closest('a, button, input, select, textarea, [role=\"button\"], .pr-arrow, .pr-dots'));\n      }\n\n      root.addEventListener('pointerdown', function (e) {\n        if (e.pointerType !== 'mouse' || e.button !== 0) return;\n        cx0 = e.clientX; cy0 = e.clientY; movido = false;\n      }, { passive: true });\n\n      root.addEventListener('click', function (e) {\n        if (esInteractivo(e.target)) return;\n\n        \/* Si arrastr\u00f3, era un swipe o una selecci\u00f3n de texto, no un clic. *\/\n        if (Math.abs(e.clientX - cx0) > 8 || Math.abs(e.clientY - cy0) > 8) return;\n\n        \/* Ni tampoco si estaba seleccionando texto. *\/\n        var sel = window.getSelection && window.getSelection();\n        if (sel && String(sel).length > 0) return;\n\n        if (e.clientX < limiteZonas()) anterior(); else siguiente();\n        reproducir();\n      });\n\n    }\n\n    \/* ---- teclado (con foco en la secci\u00f3n) -------------------------------- *\/\n    root.addEventListener('keydown', function (e) {\n      if (e.key === 'ArrowRight') { siguiente(); reproducir(); }\n      else if (e.key === 'ArrowLeft') { anterior(); reproducir(); }\n    });\n\n    \/* ---- pausas ---------------------------------------------------------- *\/\n    root.addEventListener('mouseenter', function () { freno.hover = true; });\n    root.addEventListener('mouseleave', function () { freno.hover = false; });\n    root.addEventListener('focusin',    function () { freno.foco  = true; });\n    root.addEventListener('focusout',   function () { freno.foco  = false; });\n    document.addEventListener('visibilitychange', function () {\n      freno.oculto = document.hidden;\n    });\n\n    reproducir();\n\n    \/\/ API por si alguna vez quer\u00e9s controlarlo desde afuera\n    root.prCarrusel = {\n      ir: ir, siguiente: siguiente, anterior: anterior,\n      reproducir: reproducir, detener: detener,\n      indice: function () { return indice; }\n    };\n  }\n\n  function arrancar() {\n    Array.prototype.forEach.call(\n      document.querySelectorAll('.pr-carousel'),\n      iniciar\n    );\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', arrancar);\n  } else {\n    arrancar();\n  }\n  window.addEventListener('load', arrancar); \/\/ red de seguridad; no duplica\n})();\n<\/script><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_3 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_10 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_18 et_pb_column et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_12_24_tablet et_flex_column_24_24_phone et_flex_column_24_24_widescreen et_flex_column_24_24_ultraWide\">\n<div class=\"et_pb_image_12 et_pb_image et_pb_module et_flex_module\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ave-suite-superior-v3.webp\" title=\"ave suite superior v3\" width=\"700\" height=\"933\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ave-suite-superior-v3.webp 700w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ave-suite-superior-v3-480x640.webp 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 700px, 100vw\" class=\"wp-image-220745\" \/><\/span><\/div>\n<\/div>\n\n<div class=\"et_pb_column_19 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_12_24_tablet et_flex_column_24_24_phone et_flex_column_24_24_widescreen et_flex_column_24_24_ultraWide\">\n<div class=\"et_pb_text_16 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><p><span>DIRECT BOOKING \u00b7 PARC ROYAL<\/span><\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_text_17 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><h4>\"The art of hospitality awaits you.\"<\/h4>\n<\/div><\/div>\n\n<div class=\"et_pb_module et_pb_button_module_wrapper et_pb_button_1_wrapper preset--module--divi-button--default_wrapper\"><a class=\"et_pb_button_1 et_pb_button et_pb_bg_layout_dark et_pb_module et_flex_module preset--module--divi-button--default\" href=\"https:\/\/parcroyalhotel.com\/en\/reservations\/\">Check availability<\/a><\/div>\n\n<div class=\"et_pb_text_18 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><p><span>Flexible cancellation (48h) \u00b7 Breakfast included<\/span><\/p>\n<\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_4 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_11 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_20 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone et_flex_column_24_24_widescreen et_flex_column_24_24_ultraWide\">\n<div class=\"et_pb_text_19 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module mask-reveal\"><div class=\"et_pb_text_inner\"><h2>YOU MAY ALSO LIKE<\/h2>\n<\/div><\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_row_12 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_21 et_pb_column et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_8_24 et_flex_column_8_24_tablet et_flex_column_24_24_phone et_flex_column_8_24_widescreen et_flex_column_8_24_ultraWide\">\n<div class=\"et_pb_image_13 et_pb_image et_pb_module et_flex_module\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-4_compressed.webp\" title=\"galeria penthouse 4_compressed\" width=\"1920\" height=\"1280\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-4_compressed.webp 1920w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-4_compressed-1280x853.webp 1280w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-4_compressed-980x653.webp 980w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-4_compressed-480x320.webp 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 1920px, 100vw\" class=\"wp-image-2318\" \/><\/span><\/div>\n\n<div class=\"et_pb_text_20 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><div class=\"et_pb_text_inner\">\n<div class=\"et_pb_text_inner\">\n<h3>Penthouse<\/h3>\n<p><span>It has a living room, dining area, minibar, workspace, and a p<\/span><span>rivate 20 m\u00b2 terrace on the top floor, above the rooftops of the historic center.\u00a0<\/span><span>Accessible by stairs.<\/span><\/p>\n<p><span>2 GUESTS \u00b7 QUEEN \u00b7 57\u00a0<\/span><span>m\u00b2<br \/><\/span><strong>From USD 313 per night + taxes<\/strong><\/p>\n<\/div>\n<\/div>\n<\/div><\/div>\n\n<div class=\"et_pb_module et_pb_button_module_wrapper et_pb_button_2_wrapper preset--module--divi-button--default_wrapper\"><a class=\"et_pb_button_2 et_pb_button et_pb_bg_layout_dark et_pb_module et_flex_module preset--module--divi-button--default\" href=\"https:\/\/parcroyalhotel.com\/en\/suites\/penthouse\/\">View suite<\/a><\/div>\n<\/div>\n\n<div class=\"et_pb_column_22 et_pb_column et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_8_24 et_flex_column_8_24_tablet et_flex_column_24_24_phone et_flex_column_8_24_widescreen et_flex_column_8_24_ultraWide\">\n<div class=\"et_pb_image_14 et_pb_image et_pb_module et_flex_module\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ROYAL-SUITE-galeria-2_compressed.webp\" title=\"PRESIDENCIAL\" width=\"1920\" height=\"1280\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ROYAL-SUITE-galeria-2_compressed.webp 1920w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ROYAL-SUITE-galeria-2_compressed-1280x853.webp 1280w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ROYAL-SUITE-galeria-2_compressed-980x653.webp 980w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ROYAL-SUITE-galeria-2_compressed-480x320.webp 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 1920px, 100vw\" class=\"wp-image-2325\" \/><\/span><\/div>\n\n<div class=\"et_pb_text_21 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><div class=\"et_pb_text_inner\">\n<div class=\"et_pb_text_inner\">\n<h3>ROYAL SUITE<\/h3>\n<p>Corner suite on the third floor. Views over the rooftops of the historic center. Discreet and set apart from the hotel's activity.<\/p>\n<p>\u00a02 GUESTS \u00b7 KING \u00b7 67 m\u00b2<\/p>\n<\/div>\n<div class=\"et_pb_group_5 et_pb_group et-last-child et_pb_module et_flex_group et_pb_css_mix_blend_mode_passthrough\">\n<div class=\"et_pb_text_25 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\">\n<div class=\"et_pb_text_inner\">\n<p><strong>From USD 300 per night + taxes<\/strong><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div><\/div>\n\n<div class=\"et_pb_module et_pb_button_module_wrapper et_pb_button_3_wrapper preset--module--divi-button--default_wrapper\"><a class=\"et_pb_button_3 et_pb_button et_pb_bg_layout_dark et_pb_module et_flex_module preset--module--divi-button--default\" href=\"https:\/\/parcroyalhotel.com\/en\/suites\/royal-suite\/\">View suite<\/a><\/div>\n<\/div>\n\n<div class=\"et_pb_column_23 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_8_24 et_flex_column_8_24_tablet et_flex_column_24_24_phone et_flex_column_8_24_widescreen et_flex_column_8_24_ultraWide\">\n<div class=\"et_pb_image_15 et_pb_image et_pb_module et_flex_module\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/PRESIDENCIAL.jpg\" title=\"PRESIDENCIAL\" width=\"700\" height=\"560\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/PRESIDENCIAL.jpg 700w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/PRESIDENCIAL-480x384.jpg 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 700px, 100vw\" class=\"wp-image-2048\" \/><\/span><\/div>\n\n<div class=\"et_pb_text_22 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><div class=\"et_pb_text_inner\">\n<div class=\"et_pb_text_inner\">\n<h3>Presidential Suite<\/h3>\n<p>Two separate bedrooms, each with its own bathroom. Views of the Cathedral domes from the master bedroom.<a href=\"http:\/\/www.parcroyale.ec\/\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n<p>4 GUESTS \u00b7 KING + QUEEN \u00b7 87 m\u00b2<br \/><strong>From USD 465 per night + taxes<\/strong><\/p>\n<\/div>\n<\/div>\n<\/div><\/div>\n\n<div class=\"et_pb_module et_pb_button_module_wrapper et_pb_button_4_wrapper preset--module--divi-button--default_wrapper\"><a class=\"et_pb_button_4 et_pb_button et_pb_bg_layout_dark et_pb_module et_flex_module preset--module--divi-button--default\" href=\"https:\/\/parcroyalhotel.com\/en\/suites\/presidential-suite\/\">View suite<\/a><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_5 et_pb_section et_section_regular et_flex_section pr-capsula-seccion\"><div class=\"et_pb_row_13 et_pb_row et_flex_row pr-capsula\"><div class=\"et_pb_column_24 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone et_flex_column_24_24_widescreen et_flex_column_24_24_ultraWide\"><div class=\"et_pb_code_1 et_pb_code et_pb_module pr-capsula-codigo\"><div class=\"et_pb_code_inner\"><style>\n\/* =====================================================================\n   AJUSTES DE LA C\u00c1PSULA DE FECHAS \u2014 Parc Royal\n   Cambia solo los valores despu\u00e9s de los dos puntos y guarda.\n\n   LO QUE SE EDITA EN DIVI (pesta\u00f1a Dise\u00f1o), no aqu\u00ed:\n   - La c\u00e1psula: fila \"C\u00e1psula\" \u2192 Fondo (crema), Borde (filete dorado y esquinas), Sombra y Espaciado.\n   - El bot\u00f3n: m\u00f3dulo \"Ver disponibilidad\" \u2192 texto, color, color al pasar el mouse, letra, esquinas y relleno.\n     Su enlace (\/reservas\/) es la p\u00e1gina a la que lleva con las fechas elegidas.\n   ===================================================================== *\/\n:root {\n\n  \/* ---------- CU\u00c1NDO APARECE ---------- *\/\n  --capsula-desde: 200;              \/* px bajados para que aparezca (sin \"px\"); se esconde sola al llegar al pie de p\u00e1gina *\/\n  --capsula-abajo: 22px;             \/* distancia al borde de abajo *\/\n  --capsula-abajo-movil: 10px;\n  --capsula-desenfoque: 20px;        \/* desenfoque de lo que pasa detr\u00e1s (Divi no lo tiene) \u00b7 0px = sin desenfoque *\/\n  --capsula-subir-whatsapp: 74px;    \/* en celular, cu\u00e1nto sube el bot\u00f3n de WhatsApp mientras se ve la c\u00e1psula *\/\n\n  \/* ---------- CAMPOS (Llegada \u00b7 Salida \u00b7 Hu\u00e9spedes) ---------- *\/\n  --capsula-etiqueta: #B89058;       \/* LLEGADA, SALIDA, HU\u00c9SPEDES *\/\n  --capsula-texto: #00245C;          \/* fechas elegidas *\/\n  --capsula-texto-vacio: rgba(0, 36, 92, .5);   \/* \"Elegir fecha\" *\/\n  --capsula-divisor: rgba(184, 144, 88, .35);   \/* l\u00ednea fina entre campos *\/\n  --capsula-valor-fuente: 'EB Garamond', Georgia, serif;\n  --capsula-valor-tamano: 19px;\n  --capsula-etiqueta-fuente: 'DM Sans', Helvetica, Arial, sans-serif;\n\n  \/* ---------- HU\u00c9SPEDES ---------- *\/\n  --capsula-adultos: 2;              \/* valor inicial *\/\n  --capsula-max-adultos: 6;\n\n  \/* ---------- PRECIOS POR NOCHE (de Cloudbeds) ---------- *\/\n  --capsula-hotel: \"4vIjld\";         \/* c\u00f3digo del hotel en Cloudbeds (el final del enlace \u2026\/reservation\/4vIjld) *\/\n  --capsula-hotel-numero: \"\";        \/* solo si los precios no cargan: el n\u00famero del hotel en Cloudbeds (Settings \u2192 Property ID) *\/\n  --cal-precios: 1;                  \/* 1 = mostrar bajo cada d\u00eda la tarifa m\u00e1s baja por noche \u00b7 0 = sin precios *\/\n  --cal-moneda: \"USD\";\n  --cal-precio: #597085;             \/* color del precio *\/\n  --cal-nota: \"Tarifa por noche, desde\";   \/* texto bajo el calendario cuando hay precios *\/\n\n  \/* ---------- CALENDARIO ---------- *\/\n  --cal-meses-adelante: 18;          \/* hasta cu\u00e1ntos meses adelante se puede reservar *\/\n  --cal-fondo: #FCFAF6;\n  --cal-seleccion: #00245C;          \/* c\u00edrculo de llegada y salida *\/\n  --cal-rango: rgba(184, 144, 88, .16);   \/* franja de las noches elegidas *\/\n  --cal-acento: #B89058;             \/* hoy, bordes y bot\u00f3n \"Listo\" *\/\n  --cal-texto: #00245C;\n}\n<\/style>\n<style>.pr-capsula-js .pr-capsula-seccion{position:fixed !important;left:0;right:0;bottom:var(--capsula-abajo,22px);z-index:1040;margin:0 !important;padding:0 16px !important;background:transparent !important;pointer-events:none;transform:translateY(calc(100% + var(--capsula-abajo,22px) + 30px));transition:transform .7s cubic-bezier(.23,1,.32,1)}.pr-capsula-js.pr-capsula-visible .pr-capsula-seccion{transform:none}.pr-capsula-seccion .pr-capsula{pointer-events:auto;display:flex !important;align-items:center !important;flex-wrap:nowrap !important;width:auto !important;max-width:calc(100vw - 32px) !important;margin:0 auto !important;-webkit-backdrop-filter:blur(var(--capsula-desenfoque,20px)) saturate(1.3);backdrop-filter:blur(var(--capsula-desenfoque,20px)) saturate(1.3);overflow:visible !important}.pr-capsula>.et_pb_column{display:flex !important;flex-direction:row !important;align-items:center !important;flex-wrap:nowrap !important;gap:6px;width:auto !important;max-width:none !important;flex:1 1 auto !important;margin:0 !important;padding:0 !important}.pr-capsula .et_pb_module{margin:0 !important}.pr-capsula .et_pb_code{flex:1 1 auto;min-width:0}.pr-capsula .et_pb_button_module_wrapper{flex:0 0 auto;align-self:stretch;display:flex}.pr-capsula .et_pb_button_module_wrapper .et_pb_button{display:flex !important;align-items:center;justify-content:center}.pr-capsula .et_pb_button{white-space:nowrap}.pr-capsula-campos{display:flex;align-items:center;min-width:0}.pr-capsula-aviso{display:block;padding:10px 22px;font:400 var(--capsula-valor-tamano,19px)\/1.25 var(--capsula-valor-fuente,serif);color:var(--capsula-texto-vacio,rgba(0,36,92,.5))}.pr-cap-campo{appearance:none;-webkit-appearance:none;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:3px;min-width:150px;margin:0;padding:9px 24px;border:0;border-radius:100px;background:transparent;text-align:left;cursor:pointer;transition:background-color .25s ease,box-shadow .25s ease}.pr-cap-campo:focus-visible{outline:2px solid var(--cal-acento,#B89058);outline-offset:2px}.pr-cap-campo.activo{background:#fff;box-shadow:0 4px 16px rgba(0,36,92,.09)}.pr-cap-etiqueta{font:500 10.5px\/1.3 var(--capsula-etiqueta-fuente,sans-serif);letter-spacing:2px;text-transform:uppercase;color:var(--capsula-etiqueta,#B89058);white-space:nowrap}.pr-cap-valor{font:400 var(--capsula-valor-tamano,19px)\/1.25 var(--capsula-valor-fuente,serif);color:var(--capsula-texto,#00245C);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.pr-cap-valor.vacio{color:var(--capsula-texto-vacio,rgba(0,36,92,.5))}.pr-cap-sep{flex:none;width:1px;height:30px;background:var(--capsula-divisor,rgba(184,144,88,.35))}.pr-cap-fechas{display:none !important}@media (hover:hover) and (pointer:fine){.pr-cap-campo:hover{background:rgba(184,144,88,.09)}.pr-cap-campo.activo:hover{background:#fff}}@keyframes prLatido{0%{box-shadow:0 0 0 0 rgba(184,144,88,.55)}100%{box-shadow:0 0 0 14px rgba(184,144,88,0)}}.pr-capsula-latido .et_pb_button{animation:prLatido 1.1s cubic-bezier(.23,1,.32,1) 2}.pr-cal{position:fixed;z-index:1060;left:16px;bottom:120px;box-sizing:border-box;width:680px;max-width:calc(100vw - 32px);padding:22px 26px 18px;background:var(--cal-fondo,#FCFAF6);border:1px solid rgba(184,144,88,.3);border-radius:24px;box-shadow:0 24px 60px -12px rgba(0,36,92,.28);color:var(--cal-texto,#00245C);opacity:0;visibility:hidden;transform:translateY(10px) scale(.98);transform-origin:50% 100%;transition:opacity .2s ease,transform .3s cubic-bezier(.23,1,.32,1),visibility 0s .3s}.pr-cal.abierto{opacity:1;visibility:visible;transform:none;transition:opacity .2s ease,transform .35s cubic-bezier(.23,1,.32,1),visibility 0s}.pr-cal{overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.pr-cal.modo-huespedes{width:330px}.pr-cal *{box-sizing:border-box}.pr-cal button{font-family:inherit}.pr-cal-cab{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin:0 0 12px}.pr-cal-titulo{margin:0;padding:0;font:400 25px\/1.2 var(--capsula-valor-fuente,serif);color:var(--cal-texto,#00245C)}.pr-cal-sub{margin:4px 0 0;padding:0;min-height:1.4em;font:500 11px\/1.4 var(--capsula-etiqueta-fuente,sans-serif);letter-spacing:2px;text-transform:uppercase;color:var(--cal-acento,#B89058)}.pr-cal-cerrar{position:relative;flex:none;width:36px;height:36px;margin:-4px -6px 0 0;padding:0;border:0;border-radius:50%;background:transparent;cursor:pointer;display:none}.pr-cal-cerrar span{position:absolute;left:30%;right:30%;top:50%;height:1.5px;background:var(--cal-texto,#00245C)}.pr-cal-cerrar span:first-child{transform:rotate(45deg)}.pr-cal-cerrar span:last-child{transform:rotate(-45deg)}.pr-cal-calendario{position:relative}.pr-cal-meses{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:34px}.pr-cal-nav{position:absolute;z-index:2;top:0;width:36px;height:36px;margin:0;padding:0;border:1px solid rgba(184,144,88,.4);border-radius:50%;background:transparent;cursor:pointer;transition:background-color .2s,opacity .2s}.pr-cal-nav::before{content:\"\";position:absolute;left:50%;top:50%;width:7px;height:7px;border-left:1.5px solid var(--cal-texto,#00245C);border-bottom:1.5px solid var(--cal-texto,#00245C)}.pr-cal-ant{left:0}.pr-cal-ant::before{transform:translate(-30%,-50%) rotate(45deg)}.pr-cal-sig{right:0}.pr-cal-sig::before{transform:translate(-70%,-50%) rotate(-135deg)}.pr-cal-nav:disabled{opacity:.25;cursor:default}.pr-cal-nav:focus-visible,.pr-hues-paso:focus-visible,.pr-cal-borrar:focus-visible,.pr-cal-listo:focus-visible{outline:2px solid var(--cal-acento,#B89058);outline-offset:2px}.pr-mes-titulo{margin:0 0 6px;padding:0;height:36px;font:500 12px\/36px var(--capsula-etiqueta-fuente,sans-serif);letter-spacing:2.5px;text-transform:uppercase;text-align:center;color:var(--cal-texto,#00245C)}.pr-mes-grilla{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));row-gap:2px}.pr-mes-dsem{padding:4px 0 8px;font:500 10px\/1 var(--capsula-etiqueta-fuente,sans-serif);letter-spacing:1px;text-align:center;color:#597085}.pr-dia{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;min-width:0;width:100%;height:42px;margin:0;padding:0;border:0;background:transparent;cursor:pointer;font:400 17px\/1 var(--capsula-valor-fuente,serif);color:var(--cal-texto,#00245C);-webkit-tap-highlight-color:transparent}.pr-dia span{position:relative;z-index:1;display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;transition:background-color .2s ease,color .2s ease,box-shadow .2s ease}.pr-dia::before{content:\"\";position:absolute;top:1px;bottom:1px;left:0;right:0;z-index:0;background:var(--cal-rango,rgba(184,144,88,.16));opacity:0;transition:opacity .2s ease}.pr-dia.en-rango::before{opacity:1}.pr-dia.es-inicio.con-fin::before{left:50%;opacity:1}.pr-dia.es-fin::before,.pr-dia.es-previa::before{right:50%;opacity:1}.pr-cal.con-previa .pr-dia.en-rango::before,.pr-cal.con-previa .pr-dia.es-previa::before,.pr-cal.con-previa .pr-dia.es-inicio.con-fin::before{opacity:.55}.pr-dia.es-hoy span::after{content:\"\";position:absolute;left:50%;bottom:5px;width:4px;height:4px;margin-left:-2px;border-radius:50%;background:var(--cal-acento,#B89058)}.pr-dia.es-inicio span,.pr-dia.es-fin span{background:var(--cal-seleccion,#00245C);color:#fff}.pr-dia.es-previa span{box-shadow:inset 0 0 0 1px var(--cal-seleccion,#00245C)}.pr-dia:disabled{cursor:default;color:rgba(0,36,92,.25)}.pr-dia-vacio{display:block}.pr-dia:focus-visible{outline:none}.pr-dia:focus-visible span{box-shadow:0 0 0 2px var(--cal-acento,#B89058)}.pr-cal.con-precios .pr-dia{height:58px;flex-direction:column;justify-content:flex-start;padding-top:2px}.pr-dia-precio{position:relative;z-index:1;display:block;margin-top:1px;font:500 10px\/1.2 var(--capsula-etiqueta-fuente,sans-serif);letter-spacing:.2px;color:var(--cal-precio,#597085);white-space:nowrap}.pr-dia.es-inicio .pr-dia-precio,.pr-dia.es-fin .pr-dia-precio{color:var(--cal-seleccion,#00245C);font-weight:700}.pr-dia.agotado span{color:rgba(0,36,92,.32);text-decoration:line-through;text-decoration-color:rgba(0,36,92,.25)}.pr-cal-nota{display:none;margin:8px 0 0;font:400 11px\/1.4 var(--capsula-etiqueta-fuente,sans-serif);color:#597085;text-align:right}.pr-cal.con-precios .pr-cal-nota{display:block}@media (hover:hover) and (pointer:fine){.pr-dia:not(:disabled):hover span{box-shadow:inset 0 0 0 1px var(--cal-acento,#B89058)}.pr-dia.es-inicio:hover span,.pr-dia.es-fin:hover span{box-shadow:none}.pr-cal-nav:not(:disabled):hover{background:rgba(184,144,88,.12)}}.pr-cal-hues{display:none;align-items:center;justify-content:space-between;gap:20px;padding:6px 0 4px}.pr-cal.modo-huespedes .pr-cal-hues,.pr-cal.modo-todo .pr-cal-hues{display:flex}.pr-cal.modo-huespedes .pr-cal-calendario{display:none}.pr-cal.modo-todo .pr-cal-hues{margin-top:14px;padding-top:16px;border-top:1px solid rgba(184,144,88,.25)}.pr-hues-titulo{font:400 21px\/1.2 var(--capsula-valor-fuente,serif);color:var(--cal-texto,#00245C)}.pr-hues-control{display:flex;align-items:center;gap:14px}.pr-hues-paso{position:relative;width:38px;height:38px;margin:0;padding:0;border:1px solid rgba(184,144,88,.55);border-radius:50%;background:transparent;cursor:pointer;transition:background-color .2s,opacity .2s}.pr-hues-paso::before,.pr-hues-mas::after{content:\"\";position:absolute;left:50%;top:50%;width:12px;height:1.5px;margin:-.75px 0 0 -6px;background:var(--cal-texto,#00245C)}.pr-hues-mas::after{transform:rotate(90deg)}.pr-hues-paso:disabled{opacity:.3;cursor:default}.pr-hues-cuenta{min-width:22px;text-align:center;font:400 24px\/1 var(--capsula-valor-fuente,serif);color:var(--cal-texto,#00245C)}@media (hover:hover) and (pointer:fine){.pr-hues-paso:not(:disabled):hover{background:rgba(184,144,88,.12)}}.pr-cal-pie{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:14px;padding-top:14px;border-top:1px solid rgba(184,144,88,.25)}.pr-cal.modo-huespedes .pr-cal-pie{border-top:0;padding-top:4px}.pr-cal-borrar{margin:0;padding:6px 0;border:0;background:transparent;cursor:pointer;font:500 11px\/1.4 var(--capsula-etiqueta-fuente,sans-serif);letter-spacing:2px;text-transform:uppercase;color:var(--cal-texto,#00245C);text-decoration:underline;text-underline-offset:4px;text-decoration-color:rgba(184,144,88,.6)}.pr-cal-borrar:disabled{opacity:.3;cursor:default}.pr-cal.modo-huespedes .pr-cal-borrar{visibility:hidden}.pr-cal-listo{margin:0 0 0 auto;padding:12px 26px;border:0;border-radius:100px;background:var(--cal-acento,#B89058);color:#fff;cursor:pointer;font:500 12px\/1.2 var(--capsula-etiqueta-fuente,sans-serif);letter-spacing:2px;text-transform:uppercase;transition:background-color .3s ease}@media (hover:hover) and (pointer:fine){.pr-cal-listo:hover{background:var(--cal-seleccion,#00245C)}}.pr-cal-velo{display:none;position:fixed;inset:0;z-index:1055;background:rgba(0,20,50,.38);opacity:0;visibility:hidden;transition:opacity .3s ease,visibility 0s .3s}.pr-cal-velo.abierto{opacity:1;visibility:visible;transition:opacity .3s ease,visibility 0s}.pr-cal-bloqueo,.pr-cal-bloqueo body{overflow:hidden !important}@media (max-width:767px){.pr-capsula-js .pr-capsula-seccion{bottom:var(--capsula-abajo-movil,10px);padding:0 8px !important;transform:translateY(calc(100% + var(--capsula-abajo-movil,10px) + 30px))}.pr-capsula-seccion .pr-capsula{width:100% !important;max-width:none !important}.pr-cap-llegada,.pr-cap-salida,.pr-cap-huespedes,.pr-cap-sep{display:none !important}.pr-cap-fechas{display:flex !important;flex:1 1 auto;min-width:0;padding:7px 16px}.pr-cap-etiqueta{font-size:9.5px;letter-spacing:1.5px}.pr-cap-valor{font-size:17px}.pr-cal{left:0 !important;right:0;bottom:0 !important;width:auto !important;max-width:none;max-height:90vh;overflow-y:auto;overscroll-behavior:contain;padding:20px 18px calc(16px + env(safe-area-inset-bottom));border-radius:24px 24px 0 0;border-width:1px 0 0;opacity:1;transform:translateY(100%);transition:transform .45s cubic-bezier(.32,.72,0,1),visibility 0s .45s}.pr-cal.abierto{transform:none;transition:transform .45s cubic-bezier(.32,.72,0,1),visibility 0s}.pr-cal-cerrar{display:block}.pr-cal-velo{display:block}.pr-cal-meses{grid-template-columns:minmax(0,1fr)}.pr-dia{height:44px}.pr-cal.con-precios .pr-dia{height:56px}.pr-cal-listo{padding:14px 28px}.pr-capsula-js.pr-capsula-visible .et-l--footer .et_pb_section--fixed{transform:translateY(calc(-1 * var(--capsula-subir-whatsapp,74px)))}.pr-capsula-js .et-l--footer .et_pb_section--fixed{transition:transform .7s cubic-bezier(.23,1,.32,1)}}@media (prefers-reduced-motion:reduce){.pr-capsula-seccion,.pr-cal,.pr-cal-velo,.pr-dia span,.pr-dia::before{transition-duration:.01s !important}.pr-capsula-latido .et_pb_button{animation:none}}<\/style><div class=\"pr-capsula-campos\"><span class=\"pr-capsula-aviso\">Llegada \u00b7 Salida \u00b7 Hu\u00e9spedes<\/span><\/div><script>window.PRCloudbeds = window.PRCloudbeds || (function () { 'use strict'; var notas = Array.of(); var hotel = null, base = null, propiedad = null, preparado = null, tipos = null; var pedidosCalendario = new Map(); function anotar(t) { notas.push(new Date().toTimeString().slice(0, 8) + ' ' + t); if (notas.length > 60) notas.shift(); } function formulario(datos) { var p = new URLSearchParams(); Object.entries(datos).forEach(function (par) { p.set(par.at(0), String(par.at(1))); }); return p; } function leer(paso) { return function (r) { anotar(paso + ': HTTP ' + r.status); if (!r.ok) throw new Error(paso + ' respondi\u00f3 ' + r.status); return r.json(); }; } function fallo(paso) { return function (e) { var m = e && e.message ? e.message : String(e); if (\/failed to fetch|networkerror|load failed\/i.test(m)) m += ' (bloqueado: \u00bfel dominio est\u00e1 autorizado en Cloudbeds?)'; anotar(paso + ': ' + m); throw e; }; } function enviar(ruta, datos) { return fetch(base + ruta, { method: 'POST', body: formulario(datos), credentials: 'omit' }) .then(leer(ruta)).catch(fallo(ruta)); } function preparar(codigo, idManual) { if (preparado && hotel === codigo) return preparado; hotel = codigo; anotar('hotel ' + codigo); preparado = fetch('https:\/\/api.cloudbeds.com\/mapping\/v1.0\/mfd\/property?hash=' + encodeURIComponent(codigo), { credentials: 'omit' }) .then(leer('mapping')).catch(function (e) { anotar('mapping fall\u00f3; se usa hotels.cloudbeds.com'); return null; }) .then(function (m) { base = String((m && m.island_mfd_base_url) || 'https:\/\/hotels.cloudbeds.com\/').replace(\/\\\/+$\/, '') + '\/booking'; anotar('servidor ' + base); if (\/^\\d+$\/.test(String(idManual || ''))) { propiedad = String(idManual); anotar('n\u00famero del hotel (AJUSTES) ' + propiedad); return propiedad; } return enviar('\/property_info', { property_code: codigo, lang: 'es', iframe: 'false' }).then(function (j) { var d = j && j.data; propiedad = d && (d.property_id || d.id); if (!propiedad) { anotar('property_info sin n\u00famero: ' + JSON.stringify(j).slice(0, 160)); throw new Error('Cloudbeds no devolvi\u00f3 el n\u00famero del hotel'); } propiedad = String(propiedad); anotar('n\u00famero del hotel ' + propiedad); return propiedad; }); }); preparado.catch(function () { preparado = null; }); return preparado; } function dos(n) { return n < 10 ? '0' + n : String(n); } function iso(d) { return d.getFullYear() + '-' + dos(d.getMonth() + 1) + '-' + dos(d.getDate()); } function calendario(desde, hasta) { var clave = iso(desde) + '_' + iso(hasta); if (pedidosCalendario.has(clave)) return pedidosCalendario.get(clave); var p = Promise.resolve().then(function () { if (!propiedad) throw new Error('sin preparar'); return enviar('\/availability_calendar', { property_id: propiedad, start_date: iso(desde), end_date: iso(hasta) }); }).then(function (j) { var datos = j && (j.data || j); var dias = new Map(); if (!datos || typeof datos !== 'object') throw new Error('availability_calendar sin datos'); Object.entries(datos).forEach(function (par) { var clave2 = String(par.at(0)), v = par.at(1); var m = \/^(\\d{4})-(\\d{2})-(\\d{2})\/.exec(clave2); var f = m ? new Date(Number(m.at(1)), Number(m.at(2)) - 1, Number(m.at(3))) : new Date(clave2); if (isNaN(f)) return; var lista = (Array.isArray(v) ? v : Object.values(v || {})).filter(function (c) { return c && typeof c === 'object'; }).map(function (c) { return { tipo: String(c.room_type_id), paquete: String(c.package_id || 0), tarifa: parseFloat(c.rate), cupo: Number(c.avail) || 0, cerrado: Number(c.closed) === 1, cta: Number(c.cta) === 1 }; }); dias.set(iso(f), lista); }); anotar('calendario ' + clave + ': ' + dias.size + ' d\u00edas'); if (!dias.size) anotar('respuesta: ' + JSON.stringify(j).slice(0, 160)); return dias; }); pedidosCalendario.set(clave, p); p.catch(function () { pedidosCalendario.delete(clave); }); return p; } function habitaciones() { if (tipos) return tipos; tipos = Promise.resolve().then(function () { if (!propiedad) throw new Error('sin preparar'); return enviar('\/rooms', { checkin: '1970-01-01', checkout: '1970-01-02', widget_property: propiedad }); }).then(function (j) { var lista = (j && (j.accomodation_types || (j.data && j.data.accomodation_types) || j.room_types || (j.data && j.data.room_types))) || Array.of(); var res = lista.map(function (t) { var nombres = Array.of(); try { var l = JSON.parse(t.room_type_title_langs || '{}'); Object.values(l).forEach(function (x) { if (x) nombres.push(String(x)); }); } catch (e) {} Array.of(t.title, t.room_type_title, t.room_type_name, t.name).forEach(function (x) { if (typeof x === 'string' && x.trim()) nombres.push(x.trim()); }); return { tipo: String(t.room_type_id), nombres: nombres }; }).filter(function (t) { return t.tipo !== 'undefined' && t.nombres.length; }); anotar('habitaciones: ' + res.map(function (t) { return t.tipo + '=' + t.nombres.at(0); }).join(' \u00b7 ')); return res; }); tipos.catch(function () { tipos = null; }); return tipos; } return { preparar: preparar, calendario: calendario, habitaciones: habitaciones, iso: iso, registro: function () { return notas.slice(); } }; })(); (function () { 'use strict'; function enEditor() { var q = location.search + location.hash; if (\/(et_fb|et_bfb|app_window|et_pb_preview)=\/.test(q)) return true; var marcas = 'et-fb et-bfb et-fb-root-ancestor et-fb-preview et-fb-iframe-ancestor'.split(' '); var enClase = marcas.some(function (m) { return document.documentElement.classList.contains(m) || (document.body && document.body.classList.contains(m)); }); if (enClase) return true; if (document.getElementById('et-fb-app')) return true; try { if (window.self !== window.top) return true; } catch (e) { return true; } return false; } var raiz = document.documentElement; function ajuste(nombre, defecto) { var v = getComputedStyle(raiz).getPropertyValue(nombre).trim().replace(\/^\"|\"$\/g, ''); return v === '' ? defecto : v; } function numero(nombre, defecto) { var v = parseFloat(ajuste(nombre, '')); return isNaN(v) ? defecto : v; } function el(tag, clase, texto) { var n = document.createElement(tag); if (clase) n.className = clase; if (texto) n.textContent = texto; return n; } if (!enEditor()) raiz.classList.add('pr-capsula-js'); var EN = \/^en\/i.test(raiz.getAttribute('lang') || ''); var T = EN ? { llegada: 'Check-in', salida: 'Check-out', huespedes: 'Guests', fechas: 'Dates', elegir: 'Add date', elegirFechas: 'Add dates', listas: 'Your dates', eligeLlegada: 'Select check-in', eligeSalida: 'Select check-out', noche: 'night', noches: 'nights', adulto: 'adult', adultos: 'adults', adultosTitulo: 'Adults', borrar: 'Clear dates', listo: 'Done', ver: 'See availability', anterior: 'Previous month', siguiente: 'Next month', cerrar: 'Close', menos: 'Fewer adults', mas: 'More adults' } : { llegada: 'Llegada', salida: 'Salida', huespedes: 'Hu\u00e9spedes', fechas: 'Fechas', elegir: 'Elegir fecha', elegirFechas: 'Elegir fechas', listas: 'Sus fechas', eligeLlegada: 'Elija su llegada', eligeSalida: 'Elija su salida', noche: 'noche', noches: 'noches', adulto: 'adulto', adultos: 'adultos', adultosTitulo: 'Adultos', borrar: 'Borrar fechas', listo: 'Listo', ver: 'Ver disponibilidad', anterior: 'Mes anterior', siguiente: 'Mes siguiente', cerrar: 'Cerrar', menos: 'Menos adultos', mas: 'M\u00e1s adultos' }; var IDIOMA = EN ? 'en-US' : 'es-EC'; function cero(d) { var x = new Date(d.getTime()); x.setHours(0, 0, 0, 0); return x; } function mas(d, n) { var x = new Date(d.getTime()); x.setDate(x.getDate() + n); return x; } function mesDe(d, n) { return new Date(d.getFullYear(), d.getMonth() + (n || 0), 1); } function dos(n) { return n < 10 ? '0' + n : String(n); } function iso(d) { return d.getFullYear() + '-' + dos(d.getMonth() + 1) + '-' + dos(d.getDate()); } function deIso(t) { if (!\/^\\d{4}-\\d{2}-\\d{2}$\/.test(t || '')) return null; var p = t.split('-').map(Number); return new Date(p.shift(), p.shift() - 1, p.shift()); } function igual(a, b) { return !!(a && b && a.getTime() === b.getTime()); } var fCorta = new Intl.DateTimeFormat(IDIOMA, { day: 'numeric', month: 'short' }); var fLarga = new Intl.DateTimeFormat(IDIOMA, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' }); var fMes = new Intl.DateTimeFormat(IDIOMA, { month: 'long', year: 'numeric' }); var fSemana = new Intl.DateTimeFormat(IDIOMA, { weekday: 'narrow' }); function corta(d) { return fCorta.format(d).replace('.', ''); } function tituloMes(d) { var t = fMes.format(d).replace(' de ', ' '); return t.charAt(0).toUpperCase() + t.slice(1); } function rango(a, b) { if (a.getMonth() === b.getMonth() && a.getFullYear() === b.getFullYear() && !EN) return a.getDate() + ' \u2013 ' + corta(b); return corta(a) + ' \u2013 ' + corta(b); } function noches(a, b) { return Math.round((b - a) \/ 86400000); } function arrancar() { if (enEditor()) return; var cont = document.querySelector('.pr-capsula-campos'); if (!cont) { raiz.classList.remove('pr-capsula-js'); return; } var capsula = cont.closest('.pr-capsula') || cont.closest('.et_pb_row'); var seccion = cont.closest('.pr-capsula-seccion') || cont.closest('.et_pb_section'); if (!capsula || !seccion) return; capsula.classList.add('pr-capsula'); seccion.classList.add('pr-capsula-seccion'); var bmod = capsula.querySelector('.pr-capsula-boton') || capsula.querySelector('.et_pb_button'); var boton = bmod && (bmod.tagName === 'A' ? bmod : bmod.querySelector('a')); var hoy = cero(new Date()); var limite = mas(mesDe(hoy, numero('--cal-meses-adelante', 18) + 1), -1); var maxAdultos = Math.max(1, Math.round(numero('--capsula-max-adultos', 6))); var q = new URLSearchParams(location.search); var entrada = deIso(q.get('checkin')), salida = deIso(q.get('checkout')); if (!entrada || entrada < hoy) { entrada = null; salida = null; } if (salida && salida <= entrada) salida = null; var adultos = parseInt(q.get('adults'), 10); if (!(adultos >= 1 && adultos <= maxAdultos)) adultos = Math.min(maxAdultos, Math.max(1, Math.round(numero('--capsula-adultos', 2)))); var fase = 'entrada', modo = 'fechas', abierto = false, origen = null, columnas = 2; var mes = mesDe(entrada || hoy); var movil = window.matchMedia('(max-width: 767px)'); cont.textContent = ''; function campo(clase, etiqueta) { var b = el('button', 'pr-cap-campo ' + clase); b.type = 'button'; b.setAttribute('aria-haspopup', 'dialog'); b.setAttribute('aria-controls', 'pr-cal'); b.setAttribute('aria-expanded', 'false'); var e = el('span', 'pr-cap-etiqueta', etiqueta), v = el('span', 'pr-cap-valor'); b.appendChild(e); b.appendChild(v); cont.appendChild(b); return { b: b, e: e, v: v }; } function separador() { var s = el('span', 'pr-cap-sep'); s.setAttribute('aria-hidden', 'true'); cont.appendChild(s); } var cLlegada = campo('pr-cap-llegada', T.llegada); separador(); var cSalida = campo('pr-cap-salida', T.salida); separador(); var cHuespedes = campo('pr-cap-huespedes', T.huespedes); var cFechas = campo('pr-cap-fechas', T.fechas); var campos = Array.of(cLlegada, cSalida, cHuespedes, cFechas); var velo = el('div', 'pr-cal-velo'); var panel = el('div', 'pr-cal'); panel.id = 'pr-cal'; panel.setAttribute('role', 'dialog'); panel.setAttribute('data-lenis-prevent', ''); var cab = el('div', 'pr-cal-cab'); var cabTexto = el('div'); var titulo = el('p', 'pr-cal-titulo'), sub = el('p', 'pr-cal-sub'); sub.setAttribute('aria-live', 'polite'); cabTexto.appendChild(titulo); cabTexto.appendChild(sub); var cerrarB = el('button', 'pr-cal-cerrar'); cerrarB.type = 'button'; cerrarB.setAttribute('aria-label', T.cerrar); cerrarB.appendChild(el('span')); cerrarB.appendChild(el('span')); cab.appendChild(cabTexto); cab.appendChild(cerrarB); panel.setAttribute('aria-labelledby', 'pr-cal-titulo'); titulo.id = 'pr-cal-titulo'; var secCal = el('div', 'pr-cal-calendario'); var ant = el('button', 'pr-cal-nav pr-cal-ant'), sig = el('button', 'pr-cal-nav pr-cal-sig'); ant.type = sig.type = 'button'; ant.setAttribute('aria-label', T.anterior); sig.setAttribute('aria-label', T.siguiente); var meses = el('div', 'pr-cal-meses'); secCal.appendChild(ant); secCal.appendChild(sig); secCal.appendChild(meses); secCal.appendChild(el('p', 'pr-cal-nota', EN ? 'Nightly rate, from' : ajuste('--cal-nota', 'Tarifa por noche, desde'))); var secHues = el('div', 'pr-cal-hues'); secHues.appendChild(el('span', 'pr-hues-titulo', T.adultosTitulo)); var control = el('div', 'pr-hues-control'); var menos = el('button', 'pr-hues-paso pr-hues-menos'), masB = el('button', 'pr-hues-paso pr-hues-mas'); menos.type = masB.type = 'button'; menos.setAttribute('aria-label', T.menos); masB.setAttribute('aria-label', T.mas); var cuenta = el('span', 'pr-hues-cuenta'); cuenta.setAttribute('aria-live', 'polite'); control.appendChild(menos); control.appendChild(cuenta); control.appendChild(masB); secHues.appendChild(control); var pie = el('div', 'pr-cal-pie'); var borrar = el('button', 'pr-cal-borrar', T.borrar), listo = el('button', 'pr-cal-listo'); borrar.type = listo.type = 'button'; pie.appendChild(borrar); pie.appendChild(listo); panel.appendChild(cab); panel.appendChild(secCal); panel.appendChild(secHues); panel.appendChild(pie); document.body.appendChild(velo); document.body.appendChild(panel); var hotel = ajuste('--capsula-hotel', '4vIjld'); var conPrecios = ajuste('--cal-precios', '1') !== '0' && \/^\\w+$\/.test(hotel) && !!window.fetch && !!window.PRCloudbeds; var precios = new Map(), pedidos = new Set(); var estado = 'sin pedir'; var fPrecio = null; try { fPrecio = new Intl.NumberFormat(IDIOMA, { style: 'currency', currency: ajuste('--cal-moneda', 'USD'), maximumFractionDigits: 0 }); } catch (e) { fPrecio = null; } function textoPrecio(n) { var t = fPrecio ? fPrecio.format(Math.round(n)) : String(Math.round(n)); return t.replace(\/US\\s?\/, '').replace(\/\\s\/g, ''); } function leerDia(lista) { var minimo = null, libre = false; lista.forEach(function (c) { var abierto = c.cupo > 0 && !c.cerrado; if (abierto && !c.cta) libre = true; if (abierto && c.paquete === '0' && c.tarifa > 0) minimo = minimo === null ? c.tarifa : Math.min(minimo, c.tarifa); }); return { precio: minimo, agotado: lista.length > 0 && !libre }; } function pedirPrecios() { if (!conPrecios || !window.PRCloudbeds) return; var faltan = false; for (var k = 0; k < columnas; k++) if (!pedidos.has(iso(mesDe(mes, k)))) faltan = true; if (!faltan) return; var meses2 = Array.of(); for (k = 0; k < columnas; k++) { pedidos.add(iso(mesDe(mes, k))); meses2.push(mesDe(mes, k)); } estado = 'pidiendo'; window.PRCloudbeds.preparar(hotel, ajuste('--capsula-hotel-numero', '')).then(function () { return Promise.all(meses2.map(function (m) { var ini = m < hoy ? hoy : m; var fin = mas(mesDe(m, 1), -1); if (fin > limite) fin = limite; return window.PRCloudbeds.calendario(ini, fin); })); }).then(function (todos) { todos.forEach(function (dias2) { dias2.forEach(function (lista, clave) { precios.set(clave, leerDia(lista)); }); }); estado = 'listo (' + precios.size + ' d\u00edas)'; if (precios.size) panel.classList.add('con-precios'); ponerPrecios(); }).catch(function (e) { estado = 'sin precios: ' + (e && e.message ? e.message : e); meses2.forEach(function (m) { pedidos.delete(iso(m)); }); }); } function ponerPrecios() { if (!precios.size) return; dias().forEach(function (b) { var info = precios.get(b.dataset.t); var viejo = b.querySelector('.pr-dia-precio'); if (viejo) viejo.remove(); b.classList.toggle('agotado', !!(info && info.agotado && !b.disabled)); if (!info || b.disabled || info.precio === null) return; b.appendChild(el('small', 'pr-dia-precio', textoPrecio(info.precio))); b.setAttribute('aria-label', fLarga.format(deIso(b.dataset.t)) + ', ' + textoPrecio(info.precio)); }); } window.prCapsula = function () { return { hotel: hotel, precios: conPrecios ? estado : 'apagados en AJUSTES', adultos: adultos, llegada: entrada && iso(entrada), salida: salida && iso(salida), cloudbeds: window.PRCloudbeds ? window.PRCloudbeds.registro() : 'falta el cliente de Cloudbeds' }; }; function diaDom(f) { var b = el('button', 'pr-dia'); b.type = 'button'; b.dataset.t = iso(f); b.setAttribute('aria-label', fLarga.format(f)); b.appendChild(el('span', '', String(f.getDate()))); if (f < hoy || f > limite) b.disabled = true; if (igual(f, hoy)) b.classList.add('es-hoy'); return b; } function mesDom(m) { var caja = el('div', 'pr-mes'); caja.appendChild(el('p', 'pr-mes-titulo', tituloMes(m))); var g = el('div', 'pr-mes-grilla'); var primerDia = EN ? 0 : 1; for (var i = 0; i < 7; i++) g.appendChild(el('span', 'pr-mes-dsem', fSemana.format(new Date(2024, 0, 7 + primerDia + i)).toUpperCase())); var hueco = (m.getDay() - primerDia + 7) % 7; for (i = 0; i < hueco; i++) g.appendChild(el('span', 'pr-dia-vacio')); var total = new Date(m.getFullYear(), m.getMonth() + 1, 0).getDate(); for (var n = 1; n <= total; n++) g.appendChild(diaDom(new Date(m.getFullYear(), m.getMonth(), n))); caja.appendChild(g); return caja; } function dias() { return Array.from(meses.querySelectorAll('.pr-dia')); } function pintar() { meses.textContent = ''; for (var k = 0; k < columnas; k++) meses.appendChild(mesDom(mesDe(mes, k))); ant.disabled = mes <= mesDe(hoy); sig.disabled = mesDe(mes, columnas) > limite; marcar(null); ponerPrecios(); pedirPrecios(); } function marcar(previa) { var fin = salida || previa; panel.classList.toggle('con-previa', !!(previa && !salida)); dias().forEach(function (b) { var f = deIso(b.dataset.t); var ini = igual(f, entrada), fi = igual(f, salida); b.classList.toggle('es-inicio', ini); b.classList.toggle('es-fin', fi); b.classList.toggle('es-previa', !salida && igual(f, previa)); b.classList.toggle('con-fin', ini && !!fin); b.classList.toggle('en-rango', !!(entrada && fin && f > entrada && f < fin)); b.setAttribute('aria-pressed', ini || fi ? 'true' : 'false'); }); } function textoAdultos() { return adultos + ' ' + (adultos === 1 ? T.adulto : T.adultos); } function textos() { cLlegada.v.textContent = entrada ? corta(entrada) : T.elegir; cLlegada.v.classList.toggle('vacio', !entrada); cSalida.v.textContent = salida ? corta(salida) : T.elegir; cSalida.v.classList.toggle('vacio', !salida); cHuespedes.v.textContent = textoAdultos(); cFechas.e.textContent = T.fechas + ' \u00b7 ' + textoAdultos(); cFechas.v.textContent = entrada && salida ? rango(entrada, salida) : entrada ? corta(entrada) + ' \u2013 \u2026' : T.elegirFechas; cFechas.v.classList.toggle('vacio', !entrada); cuenta.textContent = String(adultos); menos.disabled = adultos <= 1; masB.disabled = adultos >= maxAdultos; var n = entrada && salida ? noches(entrada, salida) : 0; titulo.textContent = modo === 'huespedes' ? T.huespedes : n ? T.listas : fase === 'entrada' ? T.eligeLlegada : T.eligeSalida; sub.textContent = modo === 'huespedes' ? '' : n ? n + ' ' + (n === 1 ? T.noche : T.noches) + ' \u00b7 ' + rango(entrada, salida) : entrada ? corta(entrada) + ' \u2013 \u2026' : ''; borrar.disabled = !entrada; listo.textContent = entrada && salida && modo !== 'huespedes' ? T.ver : T.listo; cLlegada.b.classList.toggle('activo', abierto && modo === 'fechas' && fase === 'entrada'); cSalida.b.classList.toggle('activo', abierto && modo === 'fechas' && fase === 'salida'); cHuespedes.b.classList.toggle('activo', abierto && modo === 'huespedes'); cFechas.b.classList.toggle('activo', abierto && modo === 'todo'); } function colocar() { if (movil.matches) { panel.style.removeProperty('left'); panel.style.removeProperty('bottom'); panel.style.removeProperty('max-height'); return; } var rc = capsula.getBoundingClientRect(); var ref = modo === 'huespedes' ? cHuespedes.b.getBoundingClientRect() : rc; var w = panel.offsetWidth; var x = Math.max(16, Math.min(window.innerWidth - w - 16, ref.left + ref.width \/ 2 - w \/ 2)); panel.style.left = Math.round(x) + 'px'; panel.style.bottom = Math.round(window.innerHeight - rc.top + 12) + 'px'; panel.style.maxHeight = Math.max(240, Math.round(rc.top - 12 - 16)) + 'px'; } function lenis(parar) { if (window.PR && window.PR.lenis) { try { if (parar) window.PR.lenis.stop(); else window.PR.lenis.start(); } catch (e) {} } } function abrir(m, desde, f) { var nuevoModo = movil.matches ? 'todo' : m; var columnasAhora = movil.matches ? 1 : 2; if (f) fase = f; origen = desde; if (!abierto || nuevoModo !== modo || columnasAhora !== columnas) { modo = nuevoModo; columnas = columnasAhora; mes = mesDe(entrada || hoy); if (mesDe(mes, columnas) > limite) mes = mesDe(limite, 1 - columnas); panel.className = 'pr-cal modo-' + modo + (abierto ? ' abierto' : '') + (precios.size ? ' con-precios' : ''); pintar(); } textos(); colocar(); if (!abierto) { abierto = true; panel.classList.add('abierto'); velo.classList.add('abierto'); if (movil.matches) { raiz.classList.add('pr-cal-bloqueo'); lenis(true); } } campos.forEach(function (c) { c.b.setAttribute('aria-expanded', 'true'); }); textos(); var foco = modo === 'huespedes' ? masB : (meses.querySelector('.pr-dia.es-inicio') || meses.querySelector('.pr-dia:not(:disabled)')); if (foco && !movil.matches) foco.focus({ preventScroll: true }); } function cerrar(devolver) { if (!abierto) return; abierto = false; panel.classList.remove('abierto', 'con-previa'); velo.classList.remove('abierto'); raiz.classList.remove('pr-cal-bloqueo'); lenis(false); campos.forEach(function (c) { c.b.setAttribute('aria-expanded', 'false'); }); textos(); if (devolver && origen) origen.focus({ preventScroll: true }); } function latir() { capsula.classList.remove('pr-capsula-latido'); void capsula.offsetWidth; capsula.classList.add('pr-capsula-latido'); } function ir() { var destino = (boton && boton.getAttribute('href')) || '\/reservas\/'; if (\/cloudbeds\\.com\/i.test(destino) || destino === '#') destino = ajuste('--reservas-url', '\/reservas\/'); destino = destino.split('#').shift().split('?').shift(); var p = new URLSearchParams(); p.set('checkin', iso(entrada)); p.set('checkout', iso(salida)); p.set('adults', String(adultos)); p.set('guests', String(adultos)); location.href = destino + '?' + p.toString(); } function elegir(f) { if (fase === 'salida' && entrada && f > entrada) { salida = f; fase = 'entrada'; marcar(null); textos(); if (!movil.matches) setTimeout(function () { cerrar(false); latir(); if (boton) boton.focus({ preventScroll: true }); }, 380); return; } entrada = f; salida = null; fase = 'salida'; marcar(null); textos(); } meses.addEventListener('click', function (e) { var b = e.target.closest && e.target.closest('.pr-dia'); if (b && !b.disabled) elegir(deIso(b.dataset.t)); }); meses.addEventListener('mouseover', function (e) { if (fase !== 'salida' || !entrada || salida) return; var b = e.target.closest && e.target.closest('.pr-dia'); if (!b || b.disabled) return; var f = deIso(b.dataset.t); marcar(f > entrada ? f : null); }); meses.addEventListener('mouseleave', function () { if (!salida) marcar(null); }); meses.addEventListener('keydown', function (e) { var b = e.target.closest && e.target.closest('.pr-dia'); if (!b) return; var n = 0; switch (e.key) { case 'ArrowLeft': n = -1; break; case 'ArrowRight': n = 1; break; case 'ArrowUp': n = -7; break; case 'ArrowDown': n = 7; break; default: return; } e.preventDefault(); var d = mas(deIso(b.dataset.t), n); if (d < hoy || d > limite) return; var buscar = function () { return dias().find(function (x) { return x.dataset.t === iso(d); }); }; var otro = buscar(); if (!otro) { mes = mesDe(mes, n > 0 ? 1 : -1); pintar(); otro = buscar(); } if (otro) otro.focus(); }); ant.addEventListener('click', function () { mes = mesDe(mes, -1); pintar(); }); sig.addEventListener('click', function () { mes = mesDe(mes, 1); pintar(); }); menos.addEventListener('click', function () { if (adultos > 1) adultos--; textos(); }); masB.addEventListener('click', function () { if (adultos < maxAdultos) adultos++; textos(); }); borrar.addEventListener('click', function () { entrada = salida = null; fase = 'entrada'; marcar(null); textos(); }); listo.addEventListener('click', function () { if (entrada && salida && modo !== 'huespedes') { ir(); return; } cerrar(true); }); cerrarB.addEventListener('click', function () { cerrar(true); }); velo.addEventListener('click', function () { cerrar(false); }); function alternar(m, c, f) { if (abierto && modo === m && (m === 'huespedes' || fase === f)) { cerrar(false); return; } abrir(m, c.b, f); } cLlegada.b.addEventListener('click', function () { alternar('fechas', cLlegada, 'entrada'); }); cSalida.b.addEventListener('click', function () { alternar('fechas', cSalida, entrada ? 'salida' : 'entrada'); }); cHuespedes.b.addEventListener('click', function () { alternar('huespedes', cHuespedes); }); cFechas.b.addEventListener('click', function () { abrir('todo', cFechas.b, entrada && !salida ? 'salida' : 'entrada'); }); if (boton) boton.addEventListener('click', function (e) { e.preventDefault(); if (entrada && salida) ir(); else abrir('fechas', entrada ? cSalida.b : cLlegada.b, entrada ? 'salida' : 'entrada'); }); document.addEventListener('pointerdown', function (e) { if (!abierto || movil.matches) return; if (panel.contains(e.target) || capsula.contains(e.target)) return; cerrar(false); }); document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && abierto) cerrar(true); }); window.addEventListener('resize', function () { if (!abierto) return; if ((movil.matches ? 1 : 2) !== columnas) cerrar(false); else colocar(); }); textos(); var desde = numero('--capsula-desde', 200); var pieVisto = false, pendiente = false, precargado = false; function revisar() { pendiente = false; var ver = window.pageYOffset > desde && !pieVisto; raiz.classList.toggle('pr-capsula-visible', ver); if (ver && !precargado) { precargado = true; columnas = movil.matches ? 1 : 2; mes = mesDe(entrada || hoy); pedirPrecios(); } if (!ver) cerrar(false); else if (abierto) colocar(); } var pies = Array.from(document.querySelectorAll('.et-l--footer .et_pb_section')).filter(function (s) { return !s.classList.contains('et_pb_section--fixed'); }); if ('IntersectionObserver' in window && pies.length) { var vistos = new Set(); var io = new IntersectionObserver(function (entradas) { entradas.forEach(function (en) { if (en.isIntersecting) vistos.add(en.target); else vistos.delete(en.target); }); pieVisto = vistos.size > 0; revisar(); }, { rootMargin: '0px 0px -60px 0px' }); pies.forEach(function (s) { io.observe(s); }); } window.addEventListener('scroll', function () { if (!pendiente) { pendiente = true; requestAnimationFrame(revisar); } }, { passive: true }); revisar(); } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', arrancar); else arrancar(); })();<\/script><\/div><\/div><div class=\"et_pb_module et_pb_button_module_wrapper et_pb_button_5_wrapper preset--module--divi-button--default_wrapper\"><a class=\"et_pb_button_5 et_pb_button et_pb_bg_layout_light et_pb_module et_flex_module pr-capsula-boton preset--module--divi-button--default\" href=\"\/reservas\/\">Ver disponibilidad<\/a><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>A 35 to 53 m\u00b2 suite in Cuenca&#8217;s historic center, with a living area, desk, and coffee station. Breakfast included.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":221570,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-221657","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/parcroyalhotel.com\/en\/wp-json\/wp\/v2\/pages\/221657","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/parcroyalhotel.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/parcroyalhotel.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/parcroyalhotel.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/parcroyalhotel.com\/en\/wp-json\/wp\/v2\/comments?post=221657"}],"version-history":[{"count":6,"href":"https:\/\/parcroyalhotel.com\/en\/wp-json\/wp\/v2\/pages\/221657\/revisions"}],"predecessor-version":[{"id":221893,"href":"https:\/\/parcroyalhotel.com\/en\/wp-json\/wp\/v2\/pages\/221657\/revisions\/221893"}],"up":[{"embeddable":true,"href":"https:\/\/parcroyalhotel.com\/en\/wp-json\/wp\/v2\/pages\/221570"}],"wp:attachment":[{"href":"https:\/\/parcroyalhotel.com\/en\/wp-json\/wp\/v2\/media?parent=221657"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}