{"id":221583,"date":"2026-09-06T21:57:58","date_gmt":"2026-09-06T21:57:58","guid":{"rendered":"https:\/\/parcroyalhotel.com\/photo-gallery-parc-royal-hotel-cuenca\/"},"modified":"2026-10-14T01:33:49","modified_gmt":"2026-10-14T01:33:49","slug":"gallery","status":"publish","type":"page","link":"https:\/\/parcroyalhotel.com\/en\/gallery\/","title":{"rendered":"Photo Gallery | Parc Royal Hotel, Cuenca"},"content":{"rendered":"<div class=\"et_pb_section_0 et_pb_section et_section_regular et_flex_section\" id=\"galeria\">\n<div class=\"et_pb_row_0 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_0 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_0 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module pr-serv-h1\"><div class=\"et_pb_text_inner\"><h1>Parc Royal Gallery<\/h1>\n<\/div><\/div>\n\n<div class=\"et_pb_text_1 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module texto-grabado-oscuro pr-serv-titulo\"><div class=\"et_pb_text_inner\"><p>Details that define the stay<\/p>\n<\/div><\/div>\n\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\"><p>A visual journey through the spaces, rituals, and small gestures that define the experience.<\/p>\n<\/div><\/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 pr-galeria\">\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_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_gallery_0 et_pb_gallery et_pb_bg_layout_light et_pb_gallery_grid et_pb_module\" data-auto-rotate=\"off\" data-auto-rotate-speed=\"\"><div class=\"et_pb_gallery_items et_post_gallery clearfix et_grid_module\" data-per_page=\"4\"><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_0\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/GRAND-LUXE-galeria-3_compressed.webp\" title=\"GRAND LUXE galeria 3_compressed\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/GRAND-LUXE-galeria-3_compressed-400x516.webp\" alt=\"\" class=\"wp-image-2332\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/GRAND-LUXE-galeria-3_compressed.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/GRAND-LUXE-galeria-3_compressed-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">GRAND LUXE galeria 3_compressed<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_1\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/PRESIDENCIAL-galeria-1_compressed.webp\" title=\"PRESIDENCIAL galeria 1_compressed\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/PRESIDENCIAL-galeria-1_compressed-400x516.webp\" alt=\"\" class=\"wp-image-2341\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/PRESIDENCIAL-galeria-1_compressed.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/PRESIDENCIAL-galeria-1_compressed-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">PRESIDENCIAL galeria 1_compressed<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_2\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ROYAL-SUITE-HERO_compressed.webp\" title=\"ROYAL SUITE HERO_compressed\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ROYAL-SUITE-HERO_compressed-400x516.webp\" alt=\"\" class=\"wp-image-2271\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ROYAL-SUITE-HERO_compressed.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ROYAL-SUITE-HERO_compressed-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">ROYAL SUITE HERO_compressed<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_3\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/SUITE-HERO-v1.webp\" title=\"SUITE HERO v1\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/SUITE-HERO-v1-400x516.webp\" alt=\"\" class=\"wp-image-1913\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/SUITE-HERO-v1.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/SUITE-HERO-v1-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">SUITE HERO v1<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_4\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/desayuno-v1.jpg\" title=\"desayuno v1\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/desayuno-v1-400x516.jpg\" alt=\"\" class=\"wp-image-1591\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/desayuno-v1.jpg 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/desayuno-v1-400x516.jpg 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">desayuno v1<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_5\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Bano-v1.jpg\" title=\"Ba\u00f1o v1\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Bano-v1-400x516.jpg\" alt=\"\" class=\"wp-image-1594\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Bano-v1.jpg 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Bano-v1-400x516.jpg 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">Ba\u00f1o v1<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_6\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Lobby-bar-2.jpg-Mediana.jpeg\" title=\"Lobby bar (2).jpg (Mediana)\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Lobby-bar-2.jpg-Mediana-400x516.jpeg\" alt=\"\" class=\"wp-image-968\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Lobby-bar-2.jpg-Mediana.jpeg 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Lobby-bar-2.jpg-Mediana-400x516.jpeg 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">Lobby bar (2).jpg (Mediana)<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_7\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/sala-de-reuniones-1.jpg\" title=\"sala de reuniones\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/sala-de-reuniones-1-400x516.jpg\" alt=\"\" class=\"wp-image-845\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/sala-de-reuniones-1.jpg 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/sala-de-reuniones-1-400x516.jpg 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">sala de reuniones<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_8\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/BAR-2.jpg\" title=\"BAR 2\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/BAR-2-400x516.jpg\" alt=\"\" class=\"wp-image-858\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/BAR-2.jpg 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/BAR-2-400x516.jpg 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">BAR 2<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_9\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/PRESIDENCIAL-galeria-2_compressed.webp\" title=\"PRESIDENCIAL galeria 2_compressed\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/PRESIDENCIAL-galeria-2_compressed-400x516.webp\" alt=\"\" class=\"wp-image-2339\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/PRESIDENCIAL-galeria-2_compressed.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/PRESIDENCIAL-galeria-2_compressed-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">PRESIDENCIAL galeria 2_compressed<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_10\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/GRAND-LUXE-galeria-1_compressed.webp\" title=\"GRAND LUXE galeria 1_compressed\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/GRAND-LUXE-galeria-1_compressed-400x516.webp\" alt=\"\" class=\"wp-image-2334\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/GRAND-LUXE-galeria-1_compressed.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/GRAND-LUXE-galeria-1_compressed-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">GRAND LUXE galeria 1_compressed<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_11\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ROYAL-SUITE-HERO-MOVIL_compressed.webp\" title=\"ROYAL SUITE HERO MOVIL_compressed\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ROYAL-SUITE-HERO-MOVIL_compressed-400x516.webp\" alt=\"\" class=\"wp-image-2272\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ROYAL-SUITE-HERO-MOVIL_compressed.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/ROYAL-SUITE-HERO-MOVIL_compressed-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">ROYAL SUITE HERO MOVIL_compressed<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_12\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/Galeria-Deluxe-5_compressed.webp\" title=\"Galeria Deluxe 5_compressed\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/Galeria-Deluxe-5_compressed-400x516.webp\" alt=\"\" class=\"wp-image-2288\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/Galeria-Deluxe-5_compressed.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/Galeria-Deluxe-5_compressed-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">Galeria Deluxe 5_compressed<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_13\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Desayuno.jpg\" title=\"Desayuno\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Desayuno-400x516.jpg\" alt=\"\" class=\"wp-image-1606\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Desayuno.jpg 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/Desayuno-400x516.jpg 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">Desayuno<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_14\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/ritual-de-te.jpg\" title=\"ritual de te\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/ritual-de-te-400x516.jpg\" alt=\"\" class=\"wp-image-844\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/ritual-de-te.jpg 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/ritual-de-te-400x516.jpg 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">ritual de te<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_15\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/desayuno-1.jpg\" title=\"desayuno\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/desayuno-1-400x516.jpg\" alt=\"\" class=\"wp-image-843\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/desayuno-1.jpg 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/desayuno-1-400x516.jpg 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">desayuno<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_16\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/a-la-carta.jpg\" title=\"a la carta\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/a-la-carta-400x516.jpg\" alt=\"\" class=\"wp-image-841\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/a-la-carta.jpg 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/07\/a-la-carta-400x516.jpg 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">a la carta<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_17\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-2_compressed.webp\" title=\"galeria penthouse 2_compressed\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-2_compressed-400x516.webp\" alt=\"\" class=\"wp-image-2320\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-2_compressed.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-2_compressed-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">galeria penthouse 2_compressed<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_18\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/Fausto-Merchan.webp\" title=\"Fausto Merchan\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/Fausto-Merchan-400x516.webp\" alt=\"\" class=\"wp-image-221022\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/Fausto-Merchan.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/Fausto-Merchan-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">Fausto Merchan<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_19\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-4_compressed.webp\" title=\"galeria penthouse 4_compressed\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-4_compressed-400x516.webp\" alt=\"\" class=\"wp-image-2318\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-4_compressed.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-4_compressed-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">galeria penthouse 4_compressed<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_20\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/PENTHOUSE.jpg\" title=\"PENTHOUSE\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/PENTHOUSE-400x516.jpg\" alt=\"\" class=\"wp-image-2047\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/PENTHOUSE.jpg 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/PENTHOUSE-400x516.jpg 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">PENTHOUSE<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_21\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/ROAYL-SUITE.jpg\" title=\"ROAYL SUITE\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/ROAYL-SUITE-400x516.jpg\" alt=\"\" class=\"wp-image-2045\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/ROAYL-SUITE.jpg 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/ROAYL-SUITE-400x516.jpg 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">ROAYL SUITE<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_22\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/TAPIZ-habitacion.jpg\" title=\"TAPIZ habitacion\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/TAPIZ-habitacion-400x516.jpg\" alt=\"\" class=\"wp-image-1597\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/TAPIZ-habitacion.jpg 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/TAPIZ-habitacion-400x516.jpg 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">TAPIZ habitacion<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_23\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/LOBBY-BAR.jpg-Grande-Mediana.jpeg\" title=\"LOBBY BAR.jpg (Grande) (Mediana)\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/LOBBY-BAR.jpg-Grande-Mediana-400x516.jpeg\" alt=\"\" class=\"wp-image-966\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/LOBBY-BAR.jpg-Grande-Mediana.jpeg 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/08\/LOBBY-BAR.jpg-Grande-Mediana-400x516.jpeg 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">LOBBY BAR.jpg (Grande) (Mediana)<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_24\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-1_compressed.webp\" title=\"galeria penthouse 1_compressed\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-1_compressed-400x516.webp\" alt=\"\" class=\"wp-image-2319\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-1_compressed.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/galeria-penthouse-1_compressed-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">galeria penthouse 1_compressed<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_25\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/GRAND-LUXE-HERO_compressed.webp\" title=\"GRAND LUXE HERO_compressed\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/GRAND-LUXE-HERO_compressed-400x516.webp\" alt=\"\" class=\"wp-image-2275\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/GRAND-LUXE-HERO_compressed.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/GRAND-LUXE-HERO_compressed-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">GRAND LUXE HERO_compressed<\/h3><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_26\"><div class=\"et_pb_gallery_image portrait\" data-per_page=\"4\"><a href=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/PENTHOUSE-HERO-SECTION_compressed.webp\" title=\"PENTHOUSE HERO SECTION_compressed\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"516\" src=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/PENTHOUSE-HERO-SECTION_compressed-400x516.webp\" alt=\"\" class=\"wp-image-2268\" srcset=\"https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/PENTHOUSE-HERO-SECTION_compressed.webp 479w, https:\/\/parcroyalhotel.com\/wp-content\/uploads\/2026\/09\/PENTHOUSE-HERO-SECTION_compressed-400x516.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><h3 class=\"et_pb_gallery_title\">PENTHOUSE HERO SECTION_compressed<\/h3><\/div><\/div><div class=\"et_pb_gallery_pagination\"><\/div><\/div>\n\n<div class=\"et_pb_code_0 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- ============================================================\n     PARC ROYAL \u2014 GALER\u00cdA MASONRY CON VISOR\n     M\u00f3dulo Code de Divi 5.\n\n     LAS FOTOS SE CARGAN EN DIVI, NO AC\u00c1. Pon\u00e9s un m\u00f3dulo Gallery\n     \u2014o varios m\u00f3dulos Image\u2014 dentro de una fila, le pon\u00e9s a esa\n     FILA la clase  pr-galeria  y listo. El motor toma las im\u00e1genes\n     que encuentre adentro y las reacomoda en tres columnas.\n\n     Ver 20-GUIA-galeria-masonry.md para el montaje.\n     ============================================================ -->\n\n<style>\n\/* ==========================================================================\n   AJUSTES R\u00c1PIDOS \u2014 todo lo visual sale de ac\u00e1\n   ========================================================================== *\/\n.pr-galeria{\n  --g-columnas: 3;              \/* columnas en escritorio *\/\n  --g-aire: 18px;               \/* separaci\u00f3n entre fotos *\/\n  --g-fila: 4px;                \/* grano vertical de la rejilla. Ver abajo *\/\n  --g-radio: 2px;               \/* redondeo de las esquinas *\/\n  --g-vel: 660ms;               \/* duraci\u00f3n de las microinteracciones *\/\n  --g-curva: cubic-bezier(.4, 0, .2, 1);   \/* ease-in-out *\/\n  --g-zoom: 1.06;               \/* cu\u00e1nto acerca la foto al pasar el mouse *\/\n  --g-revelado: 900ms;          \/* lo que tarda la m\u00e1scara en abrir cada foto *\/\n  \/* Cu\u00e1nto se corre la foto mientras se destapa. Negativo = arranca un poco\n     m\u00e1s arriba y baja, que acompa\u00f1a a la m\u00e1scara, que tambi\u00e9n baja. *\/\n  --g-revelado-corre: -14px;\n  \/* EL BORDE QUE SE DIBUJA AL PASAR EL MOUSE VIENE APAGADO.\n     Para encenderlo, pon\u00e9 el grosor en 1px. El color puede ser el dorado de\n     abajo o cualquier otro; con rgba(255,255,255,.85) queda blanco fino. *\/\n  --g-borde-grosor: 0px;\n  --g-borde: rgba(198, 168, 108, .9);\n  --g-tinta: #f4ede8;           \/* color del t\u00edtulo sobre la foto *\/\n}\n\n\/* --------------------------------------------------------------------------\n   FONDO DE PAPEL OPCIONAL, dibujado con degradados: no es una imagen, no pesa\n   y se ve n\u00edtido en cualquier pantalla.\n   NO se aplica solo. Si lo quer\u00e9s, sumale a la fila la clase\n   pr-galeria-fondo junto a pr-galeria. Normalmente conviene poner el fondo\n   desde Divi, que adem\u00e1s es el que usa el visor.\n   -------------------------------------------------------------------------- *\/\n.pr-galeria-fondo{\n  position: relative;\n  background-color: #f3efe9;\n  background-image:\n    repeating-linear-gradient(90deg,  rgba(255,255,255,.55) 0 1px, transparent 1px 3px),\n    repeating-linear-gradient(0deg,   rgba(120,105,88,.045) 0 1px, transparent 1px 3px),\n    radial-gradient(120% 90% at 15% 5%,  rgba(255,255,255,.85), transparent 60%),\n    radial-gradient(120% 90% at 85% 95%, rgba(176,160,138,.20), transparent 60%);\n  background-size: 3px 3px, 3px 3px, 100% 100%, 100% 100%;\n}\n\n\/* --------------------------------------------------------------------------\n   MASONRY DE VERDAD, SIN JAVASCRIPT\n   Con columnas de CSS cada foto conserva su proporci\u00f3n y el navegador acomoda\n   el alto solo. No hay que medir nada, as\u00ed que no hay nada que se pueda\n   desacomodar al cargar las fotos.\n   -------------------------------------------------------------------------- *\/\n\/* EL AIRE, EXACTAMENTE IGUAL EN LOS DOS EJES.\n   Con `columns` de CSS el ancho de columna sale fraccionario y el navegador\n   redondea distinto en cada juntura: medido, daba 18.08 y 17.08 px entre\n   columnas contra 18.00 entre filas. Un p\u00edxel, pero se nota.\n   Con una rejilla de columnas de verdad, el mismo `gap` gobierna los dos\n   ejes y el n\u00famero es id\u00e9ntico por construcci\u00f3n. *\/\n.pr-galeria-rejilla{\n  display: grid;\n  grid-template-columns: repeat(var(--g-columnas), minmax(0, 1fr));\n  \/* FILAS FINITAS Y RELLENO DENSO.\n     Cada foto ocupa las filas finitas que necesita su alto, as\u00ed que puede\n     empezar donde termina la de arriba sin tener que emparejarse con las de\n     al lado: eso es el masonry. Y como son filas de la MISMA rejilla, una\n     foto puede ocupar dos columnas cuando queremos.\n     D\u00f3nde arranca cada foto lo decide el motor y lo escribe en el propio\n     elemento; ac\u00e1 solo se define el grano. *\/\n  width: 100%;\n  grid-auto-rows: var(--g-fila);\n  \/* EL AIRE VERTICAL NO ES UN row-gap.\n     Si lo fuera, el navegador meter\u00eda esa separaci\u00f3n entre CADA par de filas\n     finitas \u2014cientos por foto\u2014 y los altos se ir\u00edan al demonio. Va adentro de\n     la casilla: cada foto reserva sus filas y deja libre el aire de abajo.\n     El resultado es el mismo n\u00famero exacto por los dos ejes. *\/\n  column-gap: var(--g-aire);\n  row-gap: 0;\n  margin: 0 0 calc(-1 * var(--g-aire));   \/* el aire sobrante de la \u00faltima fila *\/\n  padding: 0;\n}\n\n.pr-g-item{\n  margin: 0;\n  padding: 0;\n  border: 0;\n  display: block;\n  min-width: 0;\n  grid-row: span 40;            \/* provisional: el motor lo recalcula por foto *\/\n}\n\/* LA FOTO QUE OCUPA DOS COLUMNAS. La clase la pone el motor. *\/\n.pr-g-item.es-ancha{ grid-column: span 2; }\n\n\/* --------------------------------------------------------------------------\n   LA CASILLA\n   overflow:hidden es lo que hace que el zoom del hover ocurra ADENTRO: la\n   foto crece pero la casilla no cambia de tama\u00f1o, as\u00ed que la grilla no se\n   mueve ni un p\u00edxel.\n   -------------------------------------------------------------------------- *\/\n.pr-g-marco{\n  \/* ES UN <button>, AS\u00cd QUE HAY QUE DESARMARLO ENTERO.\n     El navegador le da a todo bot\u00f3n un borde y un relleno propios. Poniendo\n     border:0 solo en la <img> \u2014como estaba\u2014 el borde del BOT\u00d3N segu\u00eda ah\u00ed:\n     esa era la l\u00ednea que se ve\u00eda alrededor de cada foto. Y su relleno met\u00eda\n     unos p\u00edxeles de m\u00e1s a los costados, as\u00ed que el aire entre columnas no\n     coincid\u00eda con el de arriba y abajo.\n     Y VA CON !important: una regla del tema con ID \u2014del estilo\n     #page-container button{border:2px; padding:6px}\u2014 le gana a una sola\n     clase. Medido: con esa regla puesta, el bot\u00f3n segu\u00eda con 2px de borde y\n     6px de relleno, y la foto no llegaba a llenar su casilla.\n  *\/\n  appearance: none !important;\n  -webkit-appearance: none !important;\n  border: 0 !important;\n  padding: 0 !important;\n  margin: 0 !important;\n  font: inherit;\n  color: inherit;\n  text-align: inherit;\n  box-shadow: none !important;\n  outline: 0;\n\n  position: relative;\n  display: block;\n  width: 100%;\n  \/* La casilla no llena su lugar en la rejilla: deja abajo exactamente el\n     aire. Esa franja libre es la separaci\u00f3n entre una foto y la siguiente. *\/\n  height: calc(100% - var(--g-aire));\n  overflow: hidden;\n  border-radius: var(--g-radio);\n  background: rgba(120,105,88,.07);   \/* mientras la foto no lleg\u00f3 *\/\n  cursor: zoom-in;\n  \/* LUPA MINIMALISTA como cursor. Va como SVG embebido: no hay que subir\n     ning\u00fan archivo y se ve n\u00edtida en pantallas retina. *\/\n  cursor:\n    url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cg fill='none' stroke='%23fff' stroke-width='1.4'%3E%3Ccircle cx='14' cy='14' r='8'\/%3E%3Cpath d='M20 20l6 6' stroke-linecap='round'\/%3E%3C\/g%3E%3Cg fill='none' stroke='%23000' stroke-opacity='.45' stroke-width='.7'%3E%3Ccircle cx='14' cy='14' r='8.8'\/%3E%3Cpath d='M20.5 20.5l6 6' stroke-linecap='round'\/%3E%3C\/g%3E%3C\/svg%3E\") 14 14,\n    zoom-in;\n  -webkit-tap-highlight-color: transparent;\n}\n\n.pr-g-foto{\n  display: block;      \/* block y no inline: si no, queda un hueco de l\u00ednea base debajo *\/\n  width: 100%;\n  \/* EL ALTO: `auto` con un piso, NO `height:100%`.\n     La casilla ya tiene el alto que el motor calcul\u00f3 con la proporci\u00f3n de esta\n     foto, as\u00ed que `auto` da pr\u00e1cticamente el mismo n\u00famero y `min-height` cubre\n     la diferencia; `cover` absorbe el resto, que son un par de p\u00edxeles.\n     Y es `auto` por una raz\u00f3n de fondo: con `height:100%` el ancho que la foto\n     le pide a la rejilla pasa a depender de su alto, y su alto lo calcul\u00f3 el\n     motor a partir del ancho de la rejilla. Si alg\u00fan ancestro se encoge a su\n     contenido \u2014una fila de Divi que es hija de un flex, por dar el caso\u2014 eso\n     es una pescadilla que se muerde la cola y en cada vuelta la achica m\u00e1s.\n     Medido en ese armado: columnas de 346px, despu\u00e9s 98px, despu\u00e9s 46px, seg\u00fan\n     cu\u00e1ntas vueltas lleg\u00f3 a dar. Con `auto` la foto pide siempre su ancho\n     natural, que no depende de nada, y no hay vuelta que dar. *\/\n  height: auto;\n  min-height: 100%;\n  object-fit: cover;\n  vertical-align: bottom;\n  \/* Defensa: muchos temas \u2014y la propia galer\u00eda de Divi\u2014 le ponen borde,\n     sombra o redondeo a las im\u00e1genes, y suelen hacerlo con reglas de ID que\n     le ganan a una clase. Por eso va con !important. *\/\n  border: 0 !important;\n  box-shadow: none !important;\n  border-radius: 0 !important;\n  max-width: none !important;\n  \/* FADE-IN AL CARGAR. Arranca apagada y sube cuando la imagen lleg\u00f3 de\n     verdad; la clase la pone el motor, no un temporizador a ciegas. *\/\n  opacity: 0;\n  transform: scale(1.02);\n  transition: opacity 700ms var(--g-curva),\n              transform var(--g-vel) var(--g-curva);\n  will-change: transform;\n}\n.pr-g-item.esta-lista .pr-g-foto{\n  opacity: 1;\n  transform: scale(1);\n}\n\n\/* ZOOM INTERNO AL PASAR EL MOUSE.\n   La foto crece adentro de la casilla, que no cambia de tama\u00f1o: la rejilla no\n   se mueve ni un p\u00edxel. Al salir vuelve sola, porque el estado en reposo es\n   scale(1) y la transici\u00f3n corre en los dos sentidos. *\/\n.pr-g-item.esta-lista .pr-g-marco:hover .pr-g-foto,\n.pr-g-item.esta-lista .pr-g-marco:focus-visible .pr-g-foto{\n  transform: scale(var(--g-zoom));\n}\n\n\/* --------------------------------------------------------------------------\n   VELO CON DEGRADADO Y T\u00cdTULO\n   -------------------------------------------------------------------------- *\/\n.pr-g-velo{\n  position: absolute;\n  inset: 0;\n  display: flex;\n  align-items: flex-end;\n  padding: 22px 20px 18px;\n  background: linear-gradient(to top,\n              rgba(12, 20, 38, .72) 0%,\n              rgba(12, 20, 38, .34) 34%,\n              rgba(12, 20, 38, 0)   68%);\n  opacity: 0;\n  transition: opacity var(--g-vel) var(--g-curva);\n  pointer-events: none;\n}\n.pr-g-marco:hover .pr-g-velo,\n.pr-g-marco:focus-visible .pr-g-velo{ opacity: 1; }\n\n.pr-g-titulo{\n  color: var(--g-tinta);\n  font-size: 13px;\n  letter-spacing: .16em;\n  text-transform: uppercase;\n  line-height: 1.5;\n  transform: translateY(6px);\n  transition: transform var(--g-vel) var(--g-curva);\n}\n.pr-g-marco:hover .pr-g-titulo{ transform: translateY(0); }\n\n\/* --------------------------------------------------------------------------\n   EL BORDE QUE SE DIBUJA\n   Dos capas: una dibuja las l\u00edneas de arriba y abajo creciendo a lo ancho, la\n   otra las de los costados creciendo a lo alto, un pel\u00edn despu\u00e9s. Se ve como\n   si el marco se trazara solo. Es CSS puro, sin JS.\n   -------------------------------------------------------------------------- *\/\n.pr-g-marco::before,\n.pr-g-marco::after{\n  content: \"\";\n  position: absolute;\n  inset: 10px;\n  pointer-events: none;\n  z-index: 2;\n}\n.pr-g-marco::before{\n  border-top:    var(--g-borde-grosor) solid var(--g-borde);\n  border-bottom: var(--g-borde-grosor) solid var(--g-borde);\n  transform: scaleX(0);\n  transition: transform var(--g-vel) var(--g-curva);\n}\n.pr-g-marco::after{\n  border-left:  var(--g-borde-grosor) solid var(--g-borde);\n  border-right: var(--g-borde-grosor) solid var(--g-borde);\n  transform: scaleY(0);\n  transition: transform var(--g-vel) var(--g-curva) 60ms;\n}\n.pr-g-marco:hover::before,\n.pr-g-marco:focus-visible::before{ transform: scaleX(1); }\n.pr-g-marco:hover::after,\n.pr-g-marco:focus-visible::after{ transform: scaleY(1); }\n\n.pr-g-marco:focus-visible{\n  outline: 1px solid rgba(255,255,255,.9);\n  outline-offset: 3px;\n}\n\n\/* --------------------------------------------------------------------------\n   APARICI\u00d3N CON M\u00c1SCARA AL BAJAR EL SCROLL\n   La foto no aparece: se destapa DE ARRIBA HACIA ABAJO, en el mismo sentido en\n   que va el scroll, y mientras tanto se corre unos p\u00edxeles.\n   El recorte es `inset(arriba derecha ABAJO izquierda)`: con el borde de abajo\n   metido el 100% no se ve nada, y al soltarlo hasta 0 la parte visible crece\n   hacia abajo. Con el 100% en el borde de arriba \u2014como estaba\u2014 crec\u00eda al\n   rev\u00e9s, de abajo hacia arriba.\n   La m\u00e1scara va en la casilla y no en la foto: la foto tiene su propio\n   transform \u2014el zoom del hover\u2014 y escribirle otro encima lo pisar\u00eda.\n   La clase con-revelado la pone el motor, y solo si va a poder abrirlas. Si el\n   JavaScript no llegara a correr, no hay m\u00e1scara que se quede cerrada y las\n   fotos se ven igual.\n   -------------------------------------------------------------------------- *\/\n.pr-galeria-rejilla.con-revelado .pr-g-marco{\n  clip-path: inset(0 0 100% 0);\n  transform: translateY(var(--g-revelado-corre));\n  transition: clip-path var(--g-revelado) var(--g-curva),\n              transform  var(--g-revelado) var(--g-curva);\n  transition-delay: var(--g-espera, 0ms);\n}\n.pr-galeria-rejilla.con-revelado .pr-g-item.se-revelo .pr-g-marco{\n  clip-path: inset(0 0 0 0);\n  transform: none;\n}\n\n\/* --------------------------------------------------------------------------\n   RESPONSIVE\n   -------------------------------------------------------------------------- *\/\n@media (max-width: 980px){ .pr-galeria{ --g-columnas: 2; --g-aire: 14px; } }\n\/* En una sola columna no hay dos columnas que ocupar: si se dejara el span 2\n   el navegador inventar\u00eda una segunda columna y romper\u00eda la rejilla. *\/\n@media (max-width: 640px){\n  .pr-galeria{ --g-columnas: 1; }\n  .pr-g-item.es-ancha{ grid-column: span 1; }\n}\n\n\/* ==========================================================================\n   EL VISOR (lightbox)\n   Cuelga del <body> con un z-index alt\u00edsimo: es la \u00fanica forma de estar\n   seguro de que queda por encima del men\u00fa, que en Divi anda por 10000 y\n   adem\u00e1s suele estar encerrado en un contexto de apilado propio.\n   ========================================================================== *\/\n.pr-g-visor{\n  position: fixed;\n  inset: 0;\n  z-index: 2147483000;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: clamp(18px, 4vw, 56px);\n  \/* FONDO CLARO, CASI BLANCO Y DIFUMINADO.\n     El desenfoque va con backdrop-filter, que difumina lo que hay DETR\u00c1S sin\n     tocarle un solo estilo a la galer\u00eda. Ponerle un filter a la p\u00e1gina\n     romper\u00eda cualquier position:fixed de adentro, el men\u00fa incluido. *\/\n  \/* El fondo sale de --g-visor-fondo, que el motor copia del fondo que le\n     pongas al m\u00f3dulo de galer\u00eda en Divi. Si no le pon\u00e9s ninguno, queda este\n     claro casi blanco. *\/\n  background: var(--g-visor-fondo, rgba(250, 248, 245, .84));\n  background-size: cover;\n  background-position: center;\n  -webkit-backdrop-filter: blur(16px) saturate(1.05);\n  backdrop-filter: blur(16px) saturate(1.05);\n  opacity: 0;\n  transition: opacity var(--pr-g-vel, 260ms) cubic-bezier(.4, 0, .2, 1);\n}\n.pr-g-visor.esta-abierto{ opacity: 1; }\n\n\/* OJO: el atributo hidden trae display:none de la hoja del navegador, que\n   pierde por especificidad contra el display:flex de la clase de arriba. Sin\n   esta l\u00ednea el visor quedar\u00eda SIEMPRE a la vista, tapando la p\u00e1gina entera. *\/\n.pr-g-visor[hidden]{ display: none !important; }\n\n.pr-g-visor img{\n  display: block;\n  max-width: 100%;\n  max-height: 100%;\n  width: auto;\n  height: auto;\n  object-fit: contain;\n  border: 0;                                   \/* sin marco ni borde *\/\n  box-shadow: 0 24px 70px rgba(60, 50, 40, .16);   \/* apenas, para despegarla del blanco *\/\n  transform-origin: top left;\n  will-change: transform;\n}\n\n.pr-g-visor-pie{\n  position: absolute;\n  left: 0; right: 0; bottom: clamp(14px, 3vw, 30px);\n  text-align: center;\n  color: rgba(30, 40, 60, .62);   \/* oscuro: el fondo del visor es claro *\/\n  font-size: 12px;\n  letter-spacing: .18em;\n  text-transform: uppercase;\n  opacity: 0;\n  transition: opacity var(--pr-g-vel, 260ms) cubic-bezier(.4, 0, .2, 1) 80ms;\n  pointer-events: none;\n}\n.pr-g-visor.esta-abierto .pr-g-visor-pie{ opacity: 1; }\n\n\/* Flechas finas *\/\n.pr-g-visor button{\n  position: absolute;\n  top: 50%;\n  width: 34px; height: 34px;\n  margin: 0; padding: 0;\n  border: 0; background: none;\n  color: #1e2a3c;                 \/* oscuro sobre el fondo claro *\/\n  opacity: 0;\n  cursor: pointer;\n  transform: translateY(-50%);\n  transition: opacity var(--pr-g-vel, 260ms) cubic-bezier(.4, 0, .2, 1),\n              transform var(--pr-g-vel, 260ms) cubic-bezier(.4, 0, .2, 1);\n}\n.pr-g-visor.esta-abierto button{ opacity: .55; }\n.pr-g-visor button:hover{ opacity: 1; }\n.pr-g-visor svg{ display: block; width: 100%; height: 100%; }\n\/* OJO CON LA ESPECIFICIDAD: estas tres van con .pr-g-visor adelante a\n   prop\u00f3sito. La regla de arriba es \u00ab.pr-g-visor button\u00bb, que tiene una clase\n   M\u00c1S una etiqueta; un simple \u00ab.pr-g-cerrar\u00bb pierde contra eso y el bot\u00f3n de\n   cerrar se quedaba en top:50%, justo encima de la flecha siguiente. Medido:\n   el clic en la flecha lo interceptaba el bot\u00f3n de cerrar. *\/\n.pr-g-visor .pr-g-anterior{ left: clamp(10px, 2.5vw, 34px); }\n.pr-g-visor .pr-g-siguiente{ right: clamp(10px, 2.5vw, 34px); }\n.pr-g-visor.esta-abierto .pr-g-anterior:hover{ transform: translate(-4px, -50%); }\n.pr-g-visor.esta-abierto .pr-g-siguiente:hover{ transform: translate(4px, -50%); }\n.pr-g-visor .pr-g-cerrar{\n  top: clamp(10px, 2.5vw, 30px);\n  right: clamp(10px, 2.5vw, 34px);\n  transform: none;\n}\n.pr-g-visor.esta-abierto .pr-g-cerrar:hover{ transform: rotate(90deg); }\n.pr-g-visor button:focus-visible{ opacity: 1; outline: 1px solid rgba(30,42,60,.7);\n                                  outline-offset: 4px; }\n\nhtml.pr-g-quieto{ overflow: hidden; }\n\n\/* --------------------------------------------------------------------------\n   MENOS MOVIMIENTO\n   -------------------------------------------------------------------------- *\/\n@media (prefers-reduced-motion: reduce){\n  .pr-galeria-rejilla.con-revelado .pr-g-marco{\n    clip-path: none; transform: none; transition: none;\n  }\n  .pr-g-foto{ transition: opacity 200ms linear; transform: none !important; }\n  .pr-g-marco::before, .pr-g-marco::after{ transition: none; }\n  .pr-g-visor, .pr-g-visor img, .pr-g-visor button, .pr-g-visor-pie{ transition: none !important; }\n}\n<\/style>\n\n<script>\n(function () {\n  'use strict';\n\n  \/* ======================================================================\n     AJUSTES DEL COMPORTAMIENTO\n     ====================================================================== *\/\n  var VEL       = 260;    \/* ms de las transiciones. Tambi\u00e9n en --g-vel *\/\n  var CLASE     = 'pr-galeria';\n\n  \/* FOTOS QUE OCUPAN DOS COLUMNAS.\n       ANCHA_CADA = 1  ->  TODAS las apaisadas van al doble de ancho (as\u00ed viene)\n       ANCHA_CADA = 4  ->  una cada cuatro, m\u00e1s o menos: quedan salteadas\n       ANCHA_CADA = 0  ->  ninguna, todas del mismo ancho\n     ANCHA_VARIA le suma una variaci\u00f3n a ese n\u00famero para que no se lea el\n     patr\u00f3n; con ANCHA_CADA en 1 no hace falta y va en 0.\n     La variaci\u00f3n es siempre la misma para la misma foto, as\u00ed la galer\u00eda se ve\n     igual en cada visita y al cambiar el tama\u00f1o de la ventana: es aleatoria a\n     la vista, no en cada recarga. *\/\n  \/* APARICI\u00d3N CON M\u00c1SCARA al bajar el scroll. El escal\u00f3n es la diferencia de\n     tiempo entre una foto y la siguiente de la misma tanda, para que no entren\n     todas juntas. *\/\n  var REVELADO         = true;\n  var REVELADO_ESCALON = 90;   \/* ms *\/\n\n  var ANCHA_CADA  = 1;\n  var ANCHA_VARIA = 0;\n  \/* De qu\u00e9 proporci\u00f3n para arriba una foto puede ir al doble de ancho. Una\n     vertical al doble queda enorme, y una cuadrada tampoco lee como panor\u00e1mica,\n     as\u00ed que el piso es 1.2: apaisada de verdad. Con 1 entran las cuadradas.\n     Si la galer\u00eda fuera toda de verticales, se permite igual: mejor eso que\n     ninguna ancha. *\/\n  var ANCHA_MINIMA_PROPORCION = 1.2;\n  \/* ====================================================================== *\/\n\n  var estado = { version: 'galeria-masonry-1', activo: false, motivo: 'todav\u00eda no corri\u00f3' };\n\n  window.prGaleria = function () {\n    console.log('VERSION  :', estado.version);\n    console.log('activo   :', estado.activo);\n    console.log('motivo   :', estado.motivo);\n    if (estado.fotos)    console.log('fotos    :', estado.fotos);\n    if (estado.columnas) console.log('columnas :', estado.columnas);\n    if (estado.anchas !== undefined)\n      console.log('fotos al doble de ancho:', estado.anchas);\n    if (estado.revelado) console.log('aparici\u00f3n con m\u00e1scara:', estado.revelado);\n    if (estado.fondoVisor) console.log('fondo del visor:', estado.fondoVisor);\n    if (estado.escondidos !== undefined)\n      console.log('bloques originales escondidos:', estado.escondidos,\n                  estado.escondidos ? '' : '  <-- OJO: la galer\u00eda de Divi qued\u00f3 a la vista');\n    if (estado.arreglos) console.log('ancestros corregidos:', estado.arreglos);\n    if (estado.anchoColumna) {\n      console.log('ancho de la rejilla:', estado.anchoRejilla,\n                  ' \u00b7 ancho de columna:', estado.anchoColumna);\n      \/* Una columna de menos de 120px quiere decir que la rejilla no est\u00e1\n         tomando el ancho de la p\u00e1gina sino el de su propio contenido, y eso\n         solo pasa si alg\u00fan ancestro se encoge a lo que tiene adentro. Se\n         imprime la cadena para ver cu\u00e1l es. *\/\n      if (parseInt(estado.anchoColumna, 10) < 120 && estado.cadena) {\n        console.log('%cLA REJILLA QUED\u00d3 ANGOSTA. Alg\u00fan ancestro se encoge a su contenido:',\n                    'color:#b00');\n        estado.cadena.forEach(function (l) { console.log('   ' + l); });\n      }\n    }\n    return estado;\n  };\n\n  \/* En el editor de Divi no se transforma nada: hay que poder editar las\n     fotos con los m\u00f3dulos tal como son. La se\u00f1al fiable es el iframe. *\/\n  function enEditor() {\n    var q = location.search + location.hash;\n    if (\/[?&#](et_fb|et_bfb|app_window|et_pb_preview)=\/.test(q)) return true;\n    var c = (document.documentElement.className || '') + ' ' +\n            ((document.body && document.body.className) || '');\n    if (\/\\bet-fb\\b|\\bet-bfb\\b|\\bet-fb-root-ancestor\\b|\\bet-fb-preview\\b\/.test(c)) return true;\n    if (document.getElementById('et-fb-app')) return true;\n    try { if (window.self !== window.top) return true; } catch (e) { return true; }\n    return false;\n  }\n\n  function arrancar() {\n    if (estado.activo) return;\n    if (enEditor()) { estado.motivo = 'estamos en el editor de Divi: no se transforma nada'; return; }\n\n    var origen = document.querySelector('.' + CLASE);\n    if (!origen) { estado.motivo = 'no encontr\u00e9 ning\u00fan elemento con la clase ' + CLASE; return; }\n    if (origen.querySelector('.pr-galeria-rejilla')) {\n      estado.motivo = 'la galer\u00eda ya estaba armada'; return;\n    }\n\n    \/* Se toman TODAS las im\u00e1genes que haya adentro, vengan de un m\u00f3dulo\n       Gallery de Divi o de m\u00f3dulos Image sueltos. Se descartan las que son\n       decoraci\u00f3n (iconos, separadores). *\/\n    var fuentes = Array.prototype.filter.call(origen.querySelectorAll('img'), function (im) {\n      if (im.closest('.pr-galeria-rejilla')) return false;\n      var w = im.naturalWidth || parseInt(im.getAttribute('width'), 10) || 999;\n      return w > 60;\n    });\n    if (!fuentes.length) {\n      estado.motivo = 'no hay ninguna imagen adentro de .' + CLASE +\n                      '. Pon\u00e9 un m\u00f3dulo Gallery o m\u00f3dulos Image en esa fila.';\n      return;\n    }\n\n    \/* El visor es position:fixed y cuelga del <body>: un transform, filter o\n       will-change en <html> o <body> har\u00eda que se posicione contra ellos en\n       vez de contra la pantalla. *\/\n    var corregidos = [];\n    [document.documentElement, document.body].forEach(function (n) {\n      var o = getComputedStyle(n);\n      if (o.transform !== 'none' || o.filter !== 'none' ||\n          o.perspective !== 'none' || o.willChange !== 'auto') {\n        n.style.setProperty('transform', 'none', 'important');\n        n.style.setProperty('filter', 'none', 'important');\n        n.style.setProperty('perspective', 'none', 'important');\n        n.style.setProperty('will-change', 'auto', 'important');\n        corregidos.push(n.tagName.toLowerCase());\n      }\n    });\n    estado.arreglos = corregidos.length ? corregidos.join(', ') : 'ninguno';\n\n    var reduce = window.matchMedia &&\n                 window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    document.documentElement.style.setProperty('--pr-g-vel', (reduce ? 1 : VEL) + 'ms');\n\n    \/* ------------------------------------------------------------------\n       SE ARMA LA REJILLA\n       Se construye al lado y reci\u00e9n al final se esconde lo de Divi. Si algo\n       fallara antes, la galer\u00eda original sigue a la vista: nunca se queda\n       la p\u00e1gina sin fotos.\n       ------------------------------------------------------------------ *\/\n    var rejilla = document.createElement('div');\n    rejilla.className = 'pr-galeria-rejilla';\n\n    \/* ------------------------------------------------------------------\n       LA PROPORCI\u00d3N DE CADA FOTO, SIN TENER QUE CARGARLA.\n       WordPress deja el tama\u00f1o en el propio nombre del archivo \u2014\n       nombre-ANCHOxALTO.jpg\u2014 y Divi lista varios en el srcset. Se busca el\n       m\u00e1s grande que NO sea cuadrado: los cuadrados son los recortes de la\n       galer\u00eda y no dicen nada de la foto real.\n       Sirve para repartir las fotos entre las columnas dej\u00e1ndolas parejas,\n       antes de que ninguna imagen haya llegado.\n       ------------------------------------------------------------------ *\/\n    function proporcion(im) {\n      var texto = (im.getAttribute('srcset') || '') + ' ' + (im.getAttribute('src') || '');\n      var mejor = null, mayor = 0, re = \/-(\\d{2,5})x(\\d{2,5})\\.(?:jpe?g|png|webp|avif|gif)\/gi, m;\n      while ((m = re.exec(texto))) {\n        var w = +m[1], h = +m[2];\n        if (w === h) continue;                 \/* recorte cuadrado: no cuenta *\/\n        if (w * h > mayor) { mayor = w * h; mejor = w \/ h; }\n      }\n      if (mejor) return mejor;\n      var aw = parseInt(im.getAttribute('width'), 10), ah = parseInt(im.getAttribute('height'), 10);\n      if (aw && ah && aw !== ah) return aw \/ ah;\n      return 1;\n    }\n\n    var props = fuentes.map(proporcion);\n\n    \/* ------------------------------------------------------------------\n       CU\u00c1LES OCUPAN DOS COLUMNAS\n       Se van marcando cada ANCHA_CADA fotos, m\u00e1s o menos: al n\u00famero se le\n       suma una variaci\u00f3n para que no se lea el patr\u00f3n. La variaci\u00f3n sale de\n       una cuenta fija sobre el n\u00famero de foto \u2014no de Math.random()\u2014 as\u00ed que\n       da SIEMPRE lo mismo: la galer\u00eda se ve igual en cada visita y al\n       cambiar el tama\u00f1o de la ventana. Aleatoria a la vista, no en cada\n       recarga, que ser\u00eda mareador.\n       ------------------------------------------------------------------ *\/\n    function azar(n) {\n      var x = Math.sin((n + 1) * 12.9898) * 43758.5453;\n      return x - Math.floor(x);                 \/* queda entre 0 y 1 *\/\n    }\n    var apta = props.map(function (p) { return p >= ANCHA_MINIMA_PROPORCION; });\n    if (!apta.some(Boolean)) apta = props.map(function () { return true; });\n    \/* La cadencia cuenta APAISADAS, no fotos. Contando fotos, en una galer\u00eda\n       con muchas verticales el turno ca\u00eda casi siempre sobre una vertical\n       \u2014que no puede ir ancha\u2014 y se perd\u00eda: de seis marcadas sal\u00eda una. *\/\n    var anchas = [], cuenta = 0, proxima = 0;\n    props.forEach(function (p, i) {\n      var ancha = false;\n      if (ANCHA_CADA > 0 && apta[i]) {\n        if (cuenta >= proxima) {\n          ancha = true;\n          proxima = cuenta + ANCHA_CADA + Math.round((azar(i) * 2 - 1) * ANCHA_VARIA);\n          if (proxima < cuenta + 1) proxima = cuenta + 1;\n        }\n        cuenta++;\n      }\n      anchas.push(ancha);\n    });\n\n    \/* ------------------------------------------------------------------\n       EL ALTO DE CADA FOTO, EN FILAS DE LA REJILLA\n       La casilla ocupa las filas finitas que necesita: ancho de su lugar\n       dividido su proporci\u00f3n, m\u00e1s el aire de abajo. Como las filas son de la\n       misma rejilla para todas, una foto puede empezar donde termina la de\n       arriba \u2014masonry\u2014 y a la vez ocupar dos columnas.\n       ------------------------------------------------------------------ *\/\n    function medida(nombre, porDefecto) {\n      var v = parseFloat(getComputedStyle(origen).getPropertyValue(nombre));\n      return isFinite(v) && v > 0 ? v : porDefecto;\n    }\n    function acomodar() {\n      if (!fotos) return;\n      var q     = Math.max(1, parseInt(getComputedStyle(origen).getPropertyValue('--g-columnas'), 10) || 3);\n      var fila  = medida('--g-fila', 4);\n      var aire  = medida('--g-aire', 18);\n      var ancho = rejilla.getBoundingClientRect().width;\n      if (!ancho) return;\n      estado.anchoColumna = Math.round((ancho - aire * (q - 1)) \/ q) + 'px';\n      estado.anchoRejilla = Math.round(ancho) + 'px';\n      var unaCol = (ancho - aire * (q - 1)) \/ q;\n      \/* UNA ANCHA NECESITA DOS COLUMNAS PAREJAS, Y CASI NUNCA LO EST\u00c1N.\n         En un masonry las columnas se van desnivelando: medido, se llevaban\n         entre 220 y 480px de diferencia. Si la ancha simplemente espera, queda\n         ese hueco en blanco debajo de la columna corta.\n         Pero el hueco tiene el ancho de UNA columna: ah\u00ed entra otra foto. As\u00ed\n         que antes de poner la ancha se busca entre las que faltan una que mida\n         casi eso y se la adelanta a ese lugar. Si ninguna sirve, se estira un\n         poco la \u00faltima de esa columna \u2014crece unos p\u00edxeles y `object-fit:cover`\n         se los recorta\u2014 y si tampoco alcanza, la ancha le pasa el turno a la\n         siguiente foto apaisada. La cadencia es aproximada a prop\u00f3sito, as\u00ed\n         que correrla una foto no se nota; el hueco s\u00ed se notar\u00eda.\n         RECORTE es cu\u00e1nto se admite apartarse de la proporci\u00f3n natural de una\n         foto, en tanto por uno. Y ojo con leerlo como \u00abdeformar\u00bb: con\n         `object-fit: cover` la foto NUNCA se estira ni se aplasta, siempre se\n         recorta. Alargar la casilla recorta un poco de los costados, achicarla\n         recorta un poco de arriba y abajo. Por eso el margen puede ser ancho:\n         un cuarto es un recorte que en una foto de hotel no se echa de menos.\n         Con 0.06 \u2014trat\u00e1ndolo como si deformara\u2014 casi ninguna ancha entraba: de\n         cinco apaisadas sal\u00edan dos. *\/\n      var RECORTE = 0.25;\n\n      \/* La proporci\u00f3n de la foto se corrige al cargar, as\u00ed que qui\u00e9n puede ir\n         al doble de ancho se decide ac\u00e1 y no cuando se arm\u00f3 la lista: si no,\n         una vertical cuya medida lleg\u00f3 tarde se quedaba con el ancho doble.\n         Medido: una 1200x1600 sal\u00eda de 727x970 y se com\u00eda la p\u00e1gina. *\/\n      var hayApaisadas = fotos.some(function (f) { return f.prop >= ANCHA_MINIMA_PROPORCION; });\n\n      \/* Se lleva la cuenta de hasta d\u00f3nde lleg\u00f3 cada columna y se va poniendo\n         cada foto donde corresponde. Lo escribe el motor en el elemento en vez\n         de dej\u00e1rselo al navegador: as\u00ed una foto ancha puede esperar al par de\n         columnas que est\u00e9 m\u00e1s parejo y no queda un hueco debajo de la otra.\n         Medido sin esto: un hueco de 50px donde el resto ten\u00eda 18. *\/\n      var altos = [], ultimo = [], i;\n      for (i = 0; i <q; i++) { altos.push(0); ultimo.push(null); } var pendiente = false, anchas = 0; function filasDe(f, cols) { var suyo = unaCol * cols + aire * (cols - 1); return Math.max(1, Math.round((suyo \/ (f.prop || 1) + aire) \/ fila)); } function poner(f, col, arranca, cols, filas) { f.puesta = true; f.item.classList.toggle('es-ancha', cols === 2); f.item.style.gridColumn = (col + 1) + ' \/ span ' + cols; f.item.style.gridRow = (arranca + 1) + ' \/ span ' + filas; for (var c = col; c <col + cols; c++) { altos[c] = arranca + filas; ultimo[c] = { f: f, filas: filas, arranca: arranca }; } } fotos.forEach(function (f) { f.puesta = false; }); fotos.forEach(function (f, idx) { if (f.puesta) return; \/* ya se adelant\u00f3 para tapar un hueco *\/ var cols = 1, col = 0, arranca = 0; \/* \u00bfEsta va al doble de ancho? Si le tocaba pero ning\u00fan par de columnas est\u00e1 parejo, el deseo pasa a la siguiente foto apaisada: la cadencia es aproximada a prop\u00f3sito, as\u00ed que correrla una foto no se nota y en cambio el hueco s\u00ed se notar\u00eda. *\/ var apaisada = !hayApaisadas || f.prop>= ANCHA_MINIMA_PROPORCION;\n        if ((f.ancha || pendiente) && apaisada && q >= 2) {\n          var mejor = -1, mejorAlto = Infinity, mejorSuma = Infinity,\n              mejorCorta = -1, mejorDif = 0, p;\n          for (p = 0; p + 1 <q; p++) { var alto = Math.max(altos[p], altos[p + 1]); var dif = alto - Math.min(altos[p], altos[p + 1]); var suma = altos[p] + altos[p + 1]; \/* El par que arranca m\u00e1s arriba. Entre dos que empatan, el que suma menos, o sea el que incluye la columna m\u00e1s corta: si no, las anchas se apilan siempre sobre el mismo par y la tercera columna se queda vac\u00eda. Medido: la columna de la izquierda no recib\u00eda una sola foto en la mitad de abajo. *\/ if (alto <mejorAlto || (alto === mejorAlto && suma <mejorSuma)) { mejorAlto = alto; mejorSuma = suma; mejor = p; mejorCorta = altos[p] <= altos[p + 1] ? p : p + 1; mejorDif = dif; } } \/* SE RELLENA EL HUECO CON LAS FOTOS QUE VIENEN. El hueco tiene el ancho de una columna, as\u00ed que ah\u00ed entran fotos. Puede hacer falta m\u00e1s de una: se van apilando mientras quepan, y la \u00faltima se ajusta al mil\u00edmetro que falte. Buscar una sola que calzara justo \u2014como estaba\u2014 casi nunca encontraba nada y la ancha terminaba pasando de largo: de tres marcadas sal\u00eda una. *\/ var vueltas = 0; while (mejor>= 0 && mejorDif > 0 && vueltas++ < fotos.length) {\n            var techo = mejorDif * (1 + RECORTE);   \/* lo m\u00e1s grande que entra *\/\n            var piso  = mejorDif * (1 - RECORTE);   \/* de ac\u00e1 para arriba, tapa el hueco sola *\/\n            var elegida = -1, roce = Infinity, j, fj;\n            for (j = idx + 1; j < fotos.length; j++) {\n              if (fotos[j].puesta) continue;\n              fj = filasDe(fotos[j], 1);\n              if (fj > techo) continue;             \/* no entra ni recort\u00e1ndola *\/\n              if (mejorDif - fj < roce) { roce = mejorDif - fj; elegida = j; }\n            }\n            if (elegida < 0) break;                 \/* ninguna entra: se sigue abajo *\/\n            fj = filasDe(fotos[elegida], 1);\n            var pone = (fj >= piso) ? mejorDif : fj; \/* la que alcanza, se ajusta al hueco *\/\n            poner(fotos[elegida], mejorCorta, altos[mejorCorta], 1, pone);\n            mejorDif -= pone;\n          }\n          if (mejor >= 0 && mejorDif > 0) {\n            \/* el hueco se tapa con otra foto, y si no, estirando *\/\n            var e = ultimo[mejorCorta];\n            if (!(e && mejorDif <= Math.max(2, Math.round(e.filas * RECORTE)))) mejor = -1;\n            if (mejor >= 0) {\n              e.filas += mejorDif;\n              e.f.item.style.gridRow = (e.arranca + 1) + ' \/ span ' + e.filas;\n              altos[mejorCorta] += mejorDif;\n            }\n          }\n          if (mejor >= 0) {\n            cols = 2; col = mejor; arranca = mejorAlto; pendiente = false;\n          } else {\n            pendiente = true;       \/* que la tome la pr\u00f3xima *\/\n          }\n        }\n\n        if (cols === 1) {           \/* a la columna que hoy va m\u00e1s corta *\/\n          col = 0;\n          for (var k = 1; k <q; k++) if (altos[k] <altos[col]) col = k; arranca = altos[col]; } poner(f, col, arranca, cols, filasDe(f, cols)); if (cols === 2) anchas++; }); estado.columnas = String(q); estado.anchas = anchas; } \/* Muchas fotos llegan casi juntas; se acomoda una sola vez por cuadro. *\/ var pedido = 0; function pedirAcomodar() { if (pedido) return; pedido = requestAnimationFrame(function () { pedido = 0; acomodar(); }); } \/* ------------------------------------------------------------------ LA FOTO ORIGINAL, NO LA MINIATURA. Divi arma su galer\u00eda con recortes CUADRADOS: si se usa el src que trae, todas las fotos salen cuadradas y se pierde el masonry. Hay dos formas de llegar al archivo de verdad, y se prueban en este orden: 1. el enlace que Divi le pone alrededor, que apunta al archivo grande 2. sacarle a la URL el sufijo de recorte de WordPress, que siempre tiene la forma -ANCHOxALTO antes de la extensi\u00f3n ------------------------------------------------------------------ *\/ function sinRecorte(u) { return String(u).replace(\/-\\d{2,5}x\\d{2,5}(\\.(?:jpe?g|png|webp|avif|gif))\/i, '$1'); } var fotos = fuentes.map(function (im, n) { var url = im.currentSrc || im.getAttribute('src') || im.getAttribute('data-src') || im.getAttribute('data-lazy-src') || ''; var a = im.closest('a'); var full = (a && \/\\.(jpe?g|png|webp|avif|gif)(\\?|$)\/i.test(a.href)) ? a.href : sinRecorte(url); url = full; \/* la rejilla tambi\u00e9n usa el original: es lo que le da su proporci\u00f3n *\/ \/* El t\u00edtulo sale del ALT. No se usa `title`: el script del <head> se lo\n         borra a todas las im\u00e1genes del sitio, as\u00ed que ac\u00e1 no habr\u00eda nada. *\/\n      var texto = (im.getAttribute('alt') || '').trim();\n      var cap = im.closest('figure') && im.closest('figure').querySelector('figcaption');\n      if (!texto && cap) texto = cap.textContent.trim();\n\n      var item  = document.createElement('figure');\n      item.className = 'pr-g-item' + (anchas[n] ? ' es-ancha' : '');\n\n      var marco = document.createElement('button');\n      marco.type = 'button';\n      marco.className = 'pr-g-marco';\n      marco.setAttribute('aria-label', 'Ampliar' + (texto ? ': ' + texto : ' foto ' + (n + 1)));\n\n      var foto = document.createElement('img');\n      foto.className = 'pr-g-foto';\n      foto.src = url;\n      foto.alt = texto;\n      foto.loading = 'lazy';\n      foto.decoding = 'async';\n      \/* NO se copian el ancho y el alto del original de Divi: son los del\n         recorte cuadrado, y fijarlos le impondr\u00eda esa proporci\u00f3n a la foto\n         buena. Sin ellos, cada foto toma la suya al cargar, que es de lo que\n         se trata el masonry. *\/\n\n      marco.appendChild(foto);\n\n      if (texto) {\n        var velo = document.createElement('span');\n        velo.className = 'pr-g-velo';\n        var tit = document.createElement('span');\n        tit.className = 'pr-g-titulo';\n        tit.textContent = texto;\n        velo.appendChild(tit);\n        marco.appendChild(velo);\n      }\n\n      item.appendChild(marco);\n      rejilla.appendChild(item);\n\n      var reg = { marco: marco, foto: foto, url: full, texto: texto,\n                  item: item, prop: props[n], ancha: anchas[n] };\n\n      \/* FADE-IN cuando la foto lleg\u00f3 de verdad. Y de paso se corrige la\n         proporci\u00f3n: hasta ac\u00e1 sal\u00eda del nombre del archivo, que es una\n         suposici\u00f3n; ahora est\u00e1 la medida real y el alto se ajusta solo. *\/\n      function lista() {\n        item.classList.add('esta-lista');\n        if (foto.naturalWidth && foto.naturalHeight) {\n          reg.prop = foto.naturalWidth \/ foto.naturalHeight;\n          pedirAcomodar();\n        }\n      }\n      if (foto.complete && foto.naturalWidth) lista();\n      else {\n        foto.addEventListener('load', lista, { once: true });\n        foto.addEventListener('error', lista, { once: true });   \/* rota: igual se muestra *\/\n      }\n\n      marco.addEventListener('click', function () { abrir(n); });\n\n      return reg;\n    });\n\n    origen.appendChild(rejilla);\n\n    \/* ------------------------------------------------------------------\n       EL FONDO DEL VISOR SALE DEL M\u00d3DULO DE GALER\u00cdA.\n       Se copia el fondo que le hayas puesto en Divi a la fila .pr-galeria\n       \u2014textura, color, degradado, lo que sea\u2014 y se usa en el visor. As\u00ed el\n       fondo lo eleg\u00eds desde el editor y no hay que tocar el c\u00f3digo.\n       Si no le pusiste ninguno, queda el claro casi blanco de la hoja.\n       ------------------------------------------------------------------ *\/\n    (function fondoDelVisor() {\n      var cs = getComputedStyle(origen);\n      var img = cs.backgroundImage;\n      var col = cs.backgroundColor;\n      var vale = img && img !== 'none';\n      var tieneColor = col && !\/rgba\\(0, 0, 0, 0\\)|transparent\/.test(col);\n      if (!vale && !tieneColor) { estado.fondoVisor = 'ninguno en Divi: queda el claro por defecto'; return; }\n      document.documentElement.style.setProperty('--g-visor-fondo',\n        (vale ? img + (tieneColor ? ', ' : '') : '') + (tieneColor ? col : ''));\n      estado.fondoVisor = 'copiado del m\u00f3dulo de galer\u00eda' + (vale ? ' (con imagen)' : ' (color)');\n    })();\n\n    \/* ------------------------------------------------------------------\n       SE ESCONDE LA GALER\u00cdA DE DIVI, POR POSICI\u00d3N Y NO POR NOMBRE DE CLASE.\n       Antes se buscaban .et_pb_module y .et_pb_gallery, que son nombres de\n       Divi 4. En Divi 5 cambiaron, as\u00ed que no encontraba nada y la galer\u00eda\n       original quedaba a la vista: se ve\u00edan las dos, una al lado de la otra.\n       Subiendo desde cada foto hasta el hijo directo de .pr-galeria da igual\n       c\u00f3mo se llamen las clases hoy o ma\u00f1ana.\n       ------------------------------------------------------------------ *\/\n    var esconder = [];\n    fuentes.forEach(function (im) {\n      var n = im;\n      while (n.parentElement && n.parentElement !== origen) n = n.parentElement;\n      if (n !== rejilla && n.parentElement === origen && esconder.indexOf(n) < 0) esconder.push(n);\n    });\n    esconder.forEach(function (n) { n.style.setProperty('display', 'none', 'important'); });\n    estado.escondidos = esconder.length;\n\n    acomodar();\n\n    \/* Para el diagn\u00f3stico: de d\u00f3nde viene el ancho. Se guarda la cadena de\n       ancestros con su ancho y su display, que es lo que hace falta para ver\n       cu\u00e1l de ellos se est\u00e1 encogiendo. *\/\n    estado.cadena = [];\n    for (var nodo = rejilla; nodo && nodo !== document.body; nodo = nodo.parentElement) {\n      var e = getComputedStyle(nodo);\n      estado.cadena.push(\n        Math.round(nodo.getBoundingClientRect().width) + 'px  ' +\n        e.display + '  ' + nodo.tagName.toLowerCase() +\n        (nodo.className ? '.' + String(nodo.className).trim().split(\/\\s+\/).join('.') : ''));\n    }\n\n    estado.fotos = fotos.length;\n\n    \/* ==================================================================\n       EL VISOR\n       ================================================================== *\/\n    var visor = document.createElement('div');\n    visor.className = 'pr-g-visor';\n    visor.setAttribute('role', 'dialog');\n    visor.setAttribute('aria-modal', 'true');\n    visor.hidden = true;\n\n    var grande = document.createElement('img');\n    grande.alt = '';\n    visor.appendChild(grande);\n\n    var pie = document.createElement('div');\n    pie.className = 'pr-g-visor-pie';\n    visor.appendChild(pie);\n\n    function boton(clase, etiqueta, d) {\n      var b = document.createElement('button');\n      b.type = 'button';\n      b.className = clase;\n      b.setAttribute('aria-label', etiqueta);\n      b.innerHTML = '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">' +\n        '<path d=\"' + d + '\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.1\" ' +\n        'stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>';\n      visor.appendChild(b);\n      return b;\n    }\n    var bAnt = boton('pr-g-anterior',  'Anterior',  'M15 4 L7 12 L15 20');\n    var bSig = boton('pr-g-siguiente', 'Siguiente', 'M9 4 L17 12 L9 20');\n    var bCer = boton('pr-g-cerrar',    'Cerrar',    'M6 6 L18 18 M18 6 L6 18');\n\n    document.body.appendChild(visor);\n\n    var abierto = -1, foco = null, animando = false;\n\n    \/* Se frena el scroll de fondo. Si Lenis est\u00e1, se lo para a \u00e9l; si no,\n       overflow en <html>. *\/\n    function quieto(si) {\n      var l = window.PR && window.PR.lenis;\n      if (l && typeof l.stop === 'function') { si ? l.stop() : l.start(); }\n      document.documentElement.classList.toggle('pr-g-quieto', si);\n    }\n\n    \/* ------------------------------------------------------------------\n       ABRIR: la foto sale DE SU CASILLA.\n       Se coloca ya en su tama\u00f1o final y despu\u00e9s se la lleva, con un\n       transform, a la posici\u00f3n y el tama\u00f1o exactos de la miniatura; se\n       suelta y vuelve. As\u00ed el recorrido es real, no una aproximaci\u00f3n, y al\n       cerrar aterriza justo en su casilla.\n       ------------------------------------------------------------------ *\/\n    function abrir(n) {\n      if (animando) return;\n      abierto = n;\n      \/* Al cerrar, el foco vuelve a la miniatura que se abri\u00f3. Se guarda esa,\n         y no document.activeElement, porque si se lleg\u00f3 con el mouse el foco\n         estaba en el <body> y al cerrar el teclado quedaba al principio de\n         la p\u00e1gina. *\/\n      foco = fotos[n].marco;\n\n      grande.src = fotos[n].url;\n      grande.alt = fotos[n].texto || '';\n      pie.textContent = fotos[n].texto || '';\n      var hay = fotos.length > 1;\n      bAnt.hidden = bSig.hidden = !hay;\n\n      visor.hidden = false;\n      grande.style.transition = 'none';\n      grande.style.transform = '';\n\n      requestAnimationFrame(function () {\n        var chico = fotos[n].foto.getBoundingClientRect();\n        var final = grande.getBoundingClientRect();\n        if (final.width && chico.width) {\n          var ex = chico.width \/ final.width;\n          var ey = chico.height \/ final.height;\n          grande.style.transform =\n            'translate(' + (chico.left - final.left) + 'px,' + (chico.top - final.top) + 'px) ' +\n            'scale(' + ex + ',' + ey + ')';\n        }\n        void grande.offsetWidth;\n        grande.style.transition = 'transform ' + (reduce ? 1 : VEL) +\n                                  'ms cubic-bezier(.4, 0, .2, 1)';\n        grande.style.transform = '';\n        visor.classList.add('esta-abierto');\n      });\n\n      quieto(true);\n      bCer.focus({ preventScroll: true });\n    }\n\n    \/* CERRAR: el mismo camino, al rev\u00e9s. *\/\n    function cerrar() {\n      if (abierto < 0 || animando) return;\n      animando = true;\n      var n = abierto;\n      var chico = fotos[n].foto.getBoundingClientRect();\n      var final = grande.getBoundingClientRect();\n\n      if (final.width && chico.width) {\n        var ex = chico.width \/ final.width;\n        var ey = chico.height \/ final.height;\n        grande.style.transition = 'transform ' + (reduce ? 1 : VEL) +\n                                  'ms cubic-bezier(.4, 0, .2, 1)';\n        grande.style.transform =\n          'translate(' + (chico.left - final.left) + 'px,' + (chico.top - final.top) + 'px) ' +\n          'scale(' + ex + ',' + ey + ')';\n      }\n      visor.classList.remove('esta-abierto');\n\n      setTimeout(function () {\n        visor.hidden = true;\n        grande.removeAttribute('src');\n        grande.style.transition = 'none';\n        grande.style.transform = '';\n        abierto = -1;\n        animando = false;\n        quieto(false);\n        if (foco && foco.focus) foco.focus({ preventScroll: true });\n      }, reduce ? 10 : VEL + 40);\n    }\n\n    \/* Cambiar de foto sin cerrar: un cruce corto. *\/\n    function mover(paso) {\n      if (abierto < 0 || fotos.length < 2) return;\n      var n = (abierto + paso + fotos.length) % fotos.length;\n      abierto = n;\n      grande.style.transition = 'opacity ' + (reduce ? 1 : VEL) + 'ms cubic-bezier(.4, 0, .2, 1)';\n      grande.style.opacity = '0';\n      setTimeout(function () {\n        grande.src = fotos[n].url;\n        grande.alt = fotos[n].texto || '';\n        pie.textContent = fotos[n].texto || '';\n        grande.style.opacity = '1';\n      }, reduce ? 1 : VEL * 0.6);\n    }\n\n    bCer.addEventListener('click', cerrar);\n    bAnt.addEventListener('click', function () { mover(-1); });\n    bSig.addEventListener('click', function () { mover(1); });\n    visor.addEventListener('click', function (e) { if (e.target === visor) cerrar(); });\n\n    document.addEventListener('keydown', function (e) {\n      if (abierto < 0) return;\n      if (e.key === 'Escape')     { e.preventDefault(); cerrar(); }\n      else if (e.key === 'ArrowRight') { e.preventDefault(); mover(1); }\n      else if (e.key === 'ArrowLeft')  { e.preventDefault(); mover(-1); }\n      else if (e.key === 'Tab')        { e.preventDefault(); bCer.focus(); }\n    });\n\n    \/* Si se cambia el tama\u00f1o con el visor abierto, se cierra: las medidas del\n       vuelo dejar\u00edan de valer. *\/\n    window.addEventListener('resize', function () { if (abierto >= 0) cerrar(); });\n\n    \/* ------------------------------------------------------------------\n       LA M\u00c1SCARA QUE DESTAPA CADA FOTO AL LLEGAR\n       El observador avisa cuando la foto entra en pantalla; el margen de abajo\n       hace que avise un poco antes de que asome del todo, as\u00ed el movimiento\n       acompa\u00f1a al scroll en vez de ir atr\u00e1s.\n       ------------------------------------------------------------------ *\/\n    if (REVELADO && !reduce && window.IntersectionObserver) {\n      rejilla.classList.add('con-revelado');\n      var pendientes = fotos.map(function (f) { return f.item; });\n      var mirador;\n\n      function destapar(it, espera) {\n        var k = pendientes.indexOf(it);\n        if (k < 0) return;                       \/* ya estaba destapada *\/\n        pendientes.splice(k, 1);\n        it.style.setProperty('--g-espera', (espera || 0) + 'ms');\n        it.classList.add('se-revelo');\n        mirador.unobserve(it);\n      }\n\n      \/* LAS QUE PASARON DE LARGO.\n         Un salto de scroll \u2014un enlace con ancla, el navegador que restaura la\n         posici\u00f3n al volver, una rueda r\u00e1pida\u2014 deja fotos que nunca llegaron a\n         estar en pantalla y que ya quedaron arriba. El observador no avisa por\n         ellas: su estado no cambi\u00f3, nunca se cruzaron. Medido: saltando al pie\n         de la p\u00e1gina quedaban 3 de 12 tapadas para siempre. Se las destapa al\n         pasar, sin espera, que off-screen no hay animaci\u00f3n que ver. *\/\n      function barrer() {\n        for (var i = pendientes.length - 1; i >= 0; i--) {\n          if (pendientes[i].getBoundingClientRect().bottom < 0) destapar(pendientes[i], 0);\n        }\n        if (!pendientes.length) window.removeEventListener('scroll', pedirBarrido);\n      }\n      var barrido = 0;\n      function pedirBarrido() {\n        if (barrido) return;\n        barrido = requestAnimationFrame(function () { barrido = 0; barrer(); });\n      }\n      window.addEventListener('scroll', pedirBarrido, { passive: true });\n\n      mirador = new IntersectionObserver(function (entradas) {\n        \/* Las que entraron en esta misma tanda se destapan escalonadas, de\n           arriba hacia abajo. El observador no las entrega en ning\u00fan orden en\n           particular, as\u00ed que se ordenan por su lugar en la pantalla. *\/\n        var turno = 0;\n        entradas.filter(function (e) { return e.isIntersecting; })\n                .sort(function (a, b) {\n                  return (a.boundingClientRect.top  - b.boundingClientRect.top) ||\n                         (a.boundingClientRect.left - b.boundingClientRect.left);\n                })\n                .forEach(function (e) {\n                  destapar(e.target, Math.min(turno++, 6) * REVELADO_ESCALON);\n                });\n        barrer();\n      }, { rootMargin: '0px 0px -10% 0px', threshold: 0.01 });\n      fotos.forEach(function (f) { mirador.observe(f.item); });\n\n      \/* RED DE SEGURIDAD, PERO SOLO SI EL OBSERVADOR NO FUNCION\u00d3.\n         Antes esto destapaba TODAS las fotos a los tres segundos, tambi\u00e9n las\n         que segu\u00edan abajo: para cuando el visitante llegaba a ellas ya estaban\n         abiertas y no se ve\u00eda ninguna m\u00e1scara. La red tiene sentido nada m\u00e1s\n         para el caso en que el observador no avise NUNCA \u2014la galer\u00eda adentro\n         de algo escondido\u2014, y eso se reconoce porque a los tres segundos no se\n         destap\u00f3 ni una. Si se destap\u00f3 aunque sea una, el observador anda y no\n         hay nada que salvar. *\/\n      setTimeout(function () {\n        if (pendientes.length < fotos.length) return;\n        pendientes.slice().forEach(function (it) { destapar(it, 0); });\n        estado.revelado = 's\u00ed, pero el observador no avis\u00f3 y se destaparon solas';\n      }, 3000);\n      estado.revelado = 's\u00ed, con m\u00e1scara';\n    } else {\n      estado.revelado = reduce ? 'no: el sistema pide menos movimiento' : 'no';\n    }\n\n    \/* Al cambiar el ancho cambia el ancho de cada columna \u2014y a veces cu\u00e1ntas\n       hay\u2014 as\u00ed que los altos se vuelven a calcular. El observador adem\u00e1s cubre\n       el caso de la galer\u00eda que arranca escondida \u2014adentro de una pesta\u00f1a o un\n       acorde\u00f3n\u2014: ah\u00ed el ancho es 0 y no hay nada que calcular, y avisa reci\u00e9n\n       cuando se muestra. *\/\n    window.addEventListener('resize', pedirAcomodar);\n    if (window.ResizeObserver) new ResizeObserver(pedirAcomodar).observe(rejilla);\n\n    estado.activo = true;\n    estado.motivo = 'ok';\n  }\n\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', arrancar);\n  else arrancar();\n  window.addEventListener('load', arrancar);\n})();\n<\/script><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Photos of the suites, the Penthouse terrace, and the spaces of Parc Royal Hotel in Cuenca&#8217;s historic center.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-221583","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/parcroyalhotel.com\/en\/wp-json\/wp\/v2\/pages\/221583","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=221583"}],"version-history":[{"count":2,"href":"https:\/\/parcroyalhotel.com\/en\/wp-json\/wp\/v2\/pages\/221583\/revisions"}],"predecessor-version":[{"id":221794,"href":"https:\/\/parcroyalhotel.com\/en\/wp-json\/wp\/v2\/pages\/221583\/revisions\/221794"}],"wp:attachment":[{"href":"https:\/\/parcroyalhotel.com\/en\/wp-json\/wp\/v2\/media?parent=221583"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}