1<!doctype html> 2<html lang="es"> 3 <head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=0.86, maximum-scale=0.86, user-scalable=yes"> 7 <meta name="description" content="Restaurante - Experiencias"> 8 <meta name="keywords" content="Experiencias Gastronómicas, Experiencias en Restaurantes, Experiencias de comida, Clases de cocina, Menús degustación"> 9 <meta name="author" content="MESA 24/7"> 10 11 <meta name="google-site-verification" content="JFIP3jfS03fXvpBAhAtP18u1foL1iXVbGnfFNuGbFXQ" /> 12<meta property="og:url" content="https://experiencias.mesa247.pe/experiencias" /> 13<meta property="og:title" content="Experiencias Gastronómicas | " /> 14<meta property="og:image" content="https://cdn.mesa247.io/archivos/web202101/img/logo_mesa200.jpg" /> 15<meta property="og:image:secure_url" content="https://cdn.mesa247.io/archivos/web202101/img/logo_mesa200.jpg" /> 16<meta property="og:image:type" content="image/jpeg" /> 17<meta property="og:image:width" content="400" /> 18<meta property="og:image:height" content="300" /> 19<meta property="og:image:alt" content="Experiencias Gastronómicas | " /> 20<meta property="og:description" content="Restaurante - Experiencias" /> 21<meta property="og:type" content="website" /> 22<link rel="canonical" href="https://experiencias.mesa247.pe/experiencias"> 23 24 <title>Experiencias Gastronómicas | </title> 25 26 <link rel="preconnect" href="https://cdn.mesa247.io" crossorigin> 27 <link rel="preload" as="font" href="https://cdn.mesa247.io/archivos/web202101/fonts/icons.woff2?66fd5b566833312924e222d2fa402c8a" type="font/ttf" crossorigin="anonymous"> 28 29 <link rel="preload" as="font" href="https://cdn.mesa247.io/archivos/web202101/fonts/Manrope-Regular.ttf" type="font/ttf" crossorigin="anonymous"> 30 <link rel="preload" as="font" href="https://cdn.mesa247.io/archivos/web202101/fonts/Manrope-Bold.ttf" type="font/ttf" crossorigin="anonymous"> 31 <link rel="preload" as="font" href="https://cdn.mesa247.io/archivos/web202101/fonts/Manrope-SemiBold.ttf" type="font/ttf" crossorigin="anonymous"> 32 <link rel="preload" as="font" href="https://cdn.mesa247.io/archivos/web202101/fonts/Manrope-Light.ttf" type="font/ttf" crossorigin="anonymous"> 33 <link rel="preload" as="font" href="https://cdn.mesa247.io/archivos/web202101/fonts/Manrope-Medium.ttf" type="font/ttf" crossorigin="anonymous"> 34 <link rel="preload" as="font" href="https://cdn.mesa247.io/archivos/web202101/fonts/Manrope-ExtraLight.ttf" type="font/ttf" crossorigin="anonymous"> 35 36 <link href="https://experiencias.mesa247.pe/experiencias/css/app.css?id=3ccaeaed34f5eb6355f6" rel="stylesheet" type="text/css" > 37 <link href="https://experiencias.mesa247.pe/experiencias/css/font-awesome.css" rel="stylesheet" type="text/css" > 38 <meta name="csrf-token" content="FGHfBtjiYbIzxPH4ekALpJnA1wfiwl7AzGxjLmna"> 39 <meta name="locale" content="es"> 40 <link href="https://cdn.mesa247.io/archivos/mesa247/favicon.ico" rel="shortcut icon" type="image/x-icon"> 41 42 <!-- START Webpages Styles --> 43 <style type="text/css"> 44 @font-face { 45 font-family: 'Courier-Regular'; 46 src: url('https://cdn.mesa247.io/archivos/webpages/fonts/custom/Courier/Courier-Regular.ttf'); 47 font-weight: normal; 48 font-style: normal; 49 font-display: swap; 50} 51@font-face { 52 font-family: 'Courier-Regular'; 53 src: url('https://cdn.mesa247.io/archivos/webpages/fonts/custom/Courier/Courier-Regular.ttf'); 54 font-weight: normal; 55 font-style: normal; 56 font-display: swap; 57} 58@font-face { 59 font-family: 'Courier-Regular'; 60 src: url('https://cdn.mesa247.io/archivos/webpages/fonts/custom/Courier/Courier-Regular.ttf'); 61 font-weight: normal; 62 font-style: normal; 63 font-display: swap; 64} 65 66/* common styles */ 67body { 68 color: #222; 69 font-size: 1em; 70 line-height: 1.4; 71 font-family: 'Courier-Regular', 'PublicSans', sans-serif !important; 72} 73 74h1, h2, h3, h4, h5, h6 { 75 font-family: 'Courier-Regular'; 76} 77 78p, li, span { 79 font-family: 'Courier-Regular'; 80} 81 82.btn-cta, .menu-list > li { 83 font-family: 'Courier-Regular'; 84} 85 86b, strong { 87 font-family: 'Courier-Regular'; 88} 89 90.form-restaurant .submit { 91 font-family: 'Courier-Regular'; 92} 93 94.discount-plates .food-plates .box-food .prices .price-money { 95 font-family: 'Courier-Regular'; 96} 97 98.discount-plates .food-plates .box-food .prices .price-money span { 99 font-family: 'Courier-Regular'; 100} 101 102.wrap-food-plates .food-plates-items .box-food-plate .food-header .food-title { 103 font-family: 'Courier-Regular'; 104} 105 106.wrap-food-plates .food-plates-items .box-food-plate .food-body p { 107 font-family: 'Courier-Regular'; 108} 109 110.banner-description .slogan { 111 font-family: 'Courier-Regular'; 112} 113 114.panel-home header .buttons .btn-cta, 115.panel-home .wrap-description .buttons .btn-cta { 116 font-family: 'Courier-Regular'; 117} 118 119/* Custom Fixes */ 120.panel .panel-content .panel-description h2,
121.panel .panel-content .the-menu-container .the-menu-content h2 { 122 font-family: 'Courier-Regular'; 123} 124 125.editor-container { 126 font-family: 'Courier-Regular'; 127} 128 129.banner-description h1 { 130 font-family: 'Courier-Regular'; 131} 132 133.wrap-popular-foods .box-popular-food .food-body .food-description p { 134 font-family: 'Courier-Regular'; 135} 136 137.wrap-popular-foods .box-popular-food .food-body .food-title { 138 font-family: 'Courier-Regular'; 139} 140 141.wrap-popular-foods .box-popular-food .food-body .food-price, 142.wrap-food-plates .food-plates-items .box-food-plate .food-header 143.food-price .price { 144 font-family: 'Courier-Regular'; 145} 146 147/* Extras */ 148.panel .panel-content .panel-description:after { 149 display: none 150} 151 152.section-break { display: none; } 153 154.back-to-top { 155 background-color: rgb(13, 64, 58); 156} 157 158#atendemos { 159 max-width: 100%; 160 margin: 0 auto; 161} 162 163#atendemos .order-md-2 { 164 order: 1; 165 flex: 0 0 100% !important; 166 max-width: 100% !important; 167} 168 169#atendemos .order-md-1 { 170 order: 2; 171 flex: 0 0 100% !important; 172 max-width: 100% !important; 173} 174 175#atendemos .panel .panel-content .panel-description { 176 padding: 30px 50px 30px; 177} 178 179#somos { 180 max-width: 100%; 181 margin: 0 auto; 182} 183 184#somos .order-md-2 { 185 order: 1; 186 flex: 0 0 100% !important; 187 max-width: 100% !important; 188} 189 190#somos .order-md-1 { 191 order: 2; 192 flex: 0 0 100% !important; 193 max-width: 100% !important; 194} 195 196#somos .panel .panel-content .panel-description { 197 padding: 30px 50px 30px; 198} 199 200.panel-home header .buttons .btn-cta.light { 201 color: #ffffff; 202 background-color: #0d403a; 203 </style> 204 <!-- END Webpages Styles --> 205 206 <!-- START Webpages Head Scripts --> 207 208 <!-- END Webpages Head Scripts --> 209 210 <link id="bsdp-css" href="https://experiencias.mesa247.pe/experiencias/css/datepicker.min.css" rel="stylesheet"> 211<link rel="stylesheet" href="https://experiencias.mesa247.pe/experiencias/libs/splide/css/splide.min.css"> 212 213 214 215 </head> 216 <body class="home" > 217 218 <!-- START Webpages Body Scripts --> 219 220 <!-- END Webpages Body Scripts --> 221 222 223 <div id="bg-cover"></div> 224 225 <div id="app"> 226 <div class="main-bg-overlay"></div> 227 228 <div class="container-fluid navbar-header navbar-name-" style="background-color: #000000;" > 229 <div class="row"> 230 <div class="col-4"> 231 <a href="/experiencias/"> 232 <img class="img-logo" src="https://cdn.mesa247.io/archivos/w-agrupation-logo-isolina-1632508255.png"> 233 </a> 234 </div> 235 <div class="col-8 text-right"> 236 <div class="dropdown dd-lang"> 237 <button class="btn dropdown-toggle btn-language" type="button" id="dd-lang" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 238 <i class="fa fa-globe"></i> 239 ES 240 </button> 241 <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dd-lang"> 242 <a class="dropdown-item" href="https://experiencias.mesa247.pe/experiences/">EN</a> 243 </div> 244 </div> 245 </div> 246 </div> 247</div> 248 249 250 <div class="experiences-header-wrapper experiences-filters-sticky"> 251 <div class="experiences-filters-content"> 252 <div class="mobile-control-filters"> 253 <div class="control-filter"> 254 <button id="btnControlFilter" class="btn btn-control-secondary"><i class="icon-filter"></i> <span class="name">Ver filtros</span></button> 255 </div> 256 <div class="control-filter"> 257 <button class="btn btn-control dropdown-toggle" type="button" id="dd-orderbyMobile" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Ordenado <span class="sorting-selected">por Relevancia</span></button> 258 <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dd-orderbyMobile"> 259 <a class="dropdown-header"><span>Ordenado por</span><i class="icon-close"></i></a> 260 <div class="dropdown-divider"></div> 261 <a class="dropdown-item"> 262 <div class="custom-control custom-radio"> 263 <input type="radio" checked id="mobile-order-by-1" name="mobile-order-by" class="custom-control-input sorting-input" value="relevance"> 264 <label class="custom-control-label" for="mobile-order-by-1">Relevancia</label> 265 </div> 266 </a> 267 <a class="dropdown-item"> 268 <div class="custom-control custom-radio"> 269 <input type="radio" id="mobile-order-by-3" name="mobile-order-by" class="custom-control-input sorting-input" value="lowprice"> 270 <label class="custom-control-label" for="mobile-order-by-3">Menor precio</label> 271 </div> 272 </a> 273 <a class="dropdown-item"> 274 <div class="custom-control custom-radio"> 275 <input type="radio" id="mobile-order-by-4" name="mobile-order-by" class="custom-control-input sorting-input" value="highprice"> 276 <label class="custom-control-label" for="mobile-order-by-4">Mayor precio</label> 277 </div> 278 </a> 279 <a class="dropdown-item"> 280 <div class="custom-control custom-radio"> 281 <input type="radio" id="mobile-order-by-discount" name="mobile-order-by" class="custom-control-input sorting-input" value="discount"> 282 <label class="custom-control-label" for="mobile-order-by-discount">Descuento</label> 283 </div> 284 </a> 285 <a class="dropdown-item"> 286 <div class="custom-control custom-radio"> 287 <input type="radio" id="mobile-order-by-5" name="mobile-order-by" class="custom-control-input sorting-input" value="a-z"> 288 <label class="custom-control-label" for="mobile-order-by-5">A - Z</label> 289 </div> 290 </a> 291 <a class="dropdown-item"> 292 <div class="custom-control custom-radio"> 293 <input type="radio" id="mobile-order-by-6" name="mobile-order-by" class="custom-control-input sorting-input" value="z-a"> 294 <label class="custom-control-label" for="mobile-order-by-6">Z - A</label> 295 </div> 296 </a> 297 </div> 298 </div> 299 </div> 300 <div class="filter-buttons-wrapper"> 301 <div class="filters-title-content"> 302 <div class="title">Experiencias gastronómicas</div> 303 </div> 304 <div class="filter-buttons-content"> 305 <div class="sorting-actions"> 306 <button id="btnToggleFilter" class="btn btn-control-secondary"><i class="icon-filter"></i> <span class="name">Filtros</span></button> 307 <button class="btn btn-control dropdown-toggle" type="button" id="dd-orderby" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
307Ordenado <span class="sorting-selected">por Relevancia</span></button> 308 <div class="dropdown-menu dropdown-menu-left" aria-labelledby="dd-orderby"> 309 <a class="dropdown-header"><span>Ordenado por</span><i class="icon-close"></i></a> 310 <div class="dropdown-divider"></div> 311 <a class="dropdown-item"> 312 <div class="custom-control custom-radio"> 313 <input type="radio" checked id="rb-order-by-1" name="rb-order-by" class="custom-control-input sorting-input" value="relevance"> 314 <label class="custom-control-label" for="rb-order-by-1">Relevancia</label> 315 </div> 316 </a> 317 <a class="dropdown-item"> 318 <div class="custom-control custom-radio"> 319 <input type="radio" id="rb-order-by-3" name="rb-order-by" class="custom-control-input sorting-input" value="lowprice"> 320 <label class="custom-control-label" for="rb-order-by-3">Menor precio</label> 321 </div> 322 </a> 323 <a class="dropdown-item"> 324 <div class="custom-control custom-radio"> 325 <input type="radio" id="rb-order-by-4" name="rb-order-by" class="custom-control-input sorting-input" value="highprice"> 326 <label class="custom-control-label" for="rb-order-by-4">Mayor precio</label> 327 </div> 328 </a> 329 <a class="dropdown-item"> 330 <div class="custom-control custom-radio"> 331 <input type="radio" id="rb-order-by-discount" name="rb-order-by" class="custom-control-input sorting-input" value="discount"> 332 <label class="custom-control-label" for="rb-order-by-discount">Descuento</label> 333 </div> 334 </a> 335 <a class="dropdown-item"> 336 <div class="custom-control custom-radio"> 337 <input type="radio" id="rb-order-by-5" name="rb-order-by" class="custom-control-input sorting-input" value="a-z"> 338 <label class="custom-control-label" for="rb-order-by-5">A - Z</label> 339 </div> 340 </a> 341 <a class="dropdown-item"> 342 <div class="custom-control custom-radio"> 343 <input type="radio" id="rb-order-by-6" name="rb-order-by" class="custom-control-input sorting-input" value="z-a"> 344 <label class="custom-control-label" for="rb-order-by-6">Z - A</label> 345 </div> 346 </a> 347 </div> 348 </div> 349 </div> 350 </div> 351 </div> 352 </div> 353 <div class="filters-popup"> 354 <div class="filters-popup-header"> 355 <h2 class="filters-popup-title">Filtrar y ordenar</h2> 356 <button type="button" class="btn btn-filter-close-popup"><i class="icon-close"></i></button> 357 </div> 358 <div class="filters-popup-count"> 359 <span class="filters-count-text">4 experiencias</span> 360 </div> 361 <div class="filters-popup-active"> 362 <!-- Los filtros activos se generarán dinámicamente con JavaScript --> 363 </div> 364 <div class="filters-popup-content"> 365 <div class="filter-section expanded"> 366 <div class="filter-section-header"> 367 <h3 class="filter-section-title">Ocasión</h3> 368 <button type="button" class="filter-section-toggle" aria-expanded="true"> 369 <i class="icon-arrow-up-gross"></i> 370 </button> 371 </div> 372 <div class="filter-section-content show"> 373 <div class="filter-buttons-group"> 374 <button type="button" class="filter-btn by-category-btn" data-value="bjKZMypGxpv1r7zOmngL" data-input-id="ocasionbjKZMypGxpv1r7zOmngL"> 375 Experiencia para dos 376 </button> 377 <button type="button" class="filter-btn by-category-btn" data-value="obYPg8rnw36xak3AXqKz" data-input-id="ocasionobYPg8rnw36xak3AXqKz"> 378 General 379 </button> 380 <button type="button" class="filter-btn by-category-btn" data-value="gjW8poNYwXA14rL96AGa" data-input-id="ocasiongjW8poNYwXA14rL96AGa"> 381 Menú degustación 382 </button> 383 </div> 384 <!-- Checkboxes ocultos para mantener la funcionalidad (opción múltiple) --> 385 <input type="checkbox" id="ocasionbjKZMypGxpv1r7zOmngL" name="ocasion" class="filter-input by-category" value="bjKZMypGxpv1r7zOmngL" style="display: none;"> 386 <input type="checkbox" id="ocasionobYPg8rnw36xak3AXqKz" name="ocasion" class="filter-input by-category" value="obYPg8rnw36xak3AXqKz" style="display: none;"> 387 <input type="checkbox" id="ocasiongjW8poNYwXA14rL96AGa" name="ocasion" class="filter-input by-category" value="gjW8poNYwXA14rL96AGa" style="display: none;"> 388 </div> 389 </div> 390 <div class="filter-section expanded"> 391 <div class="filter-section-header"> 392 <h3 class="filter-section-title">Precio</h3> 393 <button type="button" class="filter-section-toggle" aria-expanded="true"> 394 <i class="icon-arrow-up-gross"></i> 395 </button> 396 </div> 397 <div class="filter-section-content show"> 398 <div class="filter-buttons-group"> 399 <button type="button" class="filter-btn by-price-btn" data-value="S/ 50 - 150" data-input-id="byPrice0" data-min="50" data-max="150"> 400 S/ 50 - 150 401 </button> 402 <button type="button" class="filter-btn by-price-btn" data-value="S/ 150 - 250" data-input-id="byPrice1" data-min="150" data-max="250"> 403 S/ 150 - 250 404 </button> 405 <button type="button" class="filter-btn by-price-btn" data-value="S/ 250+" data-input-id="byPrice2" data-min="250" data-max=""> 406 S/ 250+ 407 </button> 408 <button type="button" class="filter-btn by-discount-btn" data-input-id="byDiscount">Con descuento</button> 409 </div> 410 <!-- Checkboxes ocultos para mantener la funcionalidad --> 411 <input type="checkbox" class="filter-input by-price" id="byPrice0" value="S/ 50 - 150" data-min="50" data-max="150" style="display: none;"> 412 <input type="checkbox" class="filter-input by-price" id="byPrice1" value="S/ 150 - 250" data-min="150" data-max="250" style="display: none;"> 413 <input type="checkbox" class="filter-input by-price" id="byPrice2" value="S/ 250+" data-min="250" data-max="" style="display: none;"> 414 <input type="checkbox" class="filter-input by-discount" id="byDiscount" value="1" style="display: none;"> 415 </div> 416 </div> 417 <div class="filter-section expanded"> 418 <div class="filter-section-header"> 419 <h3 class="filter-section-title">Fecha</h3> 420 <button type="button" class="filter-section-toggle" aria-expanded="true"> 421 <i class="icon-arrow-up-gross"></i> 422 </button> 423 </div> 424 <div class="filter-section-content show"> 425 <div class="filter-buttons-group"> 426 <button type="button" class="filter-btn by-month-btn" data-value="today" data-input-id="byDateToday">Hoy</button> 427 <button type="button" class="filter-btn by-month-btn" data-value="tomorrow" data-input-id="byDateTomorrow">Mañana</button> 428 <button type="button" class="filter-btn by-month-btn" data-value="weekend" data-input-id="byDateWeekend">Fin de semana</button> 429 <button type="button" class="filter-btn by-month-btn" data-value="next_week" data-input-id="byDateNextWeek">Próx. semana</button> 430 <button type="button" class="filter-btn by-month-btn" data-value="2026-10" data-input-id="byMonth0"> 431 Octubre 432 </button> 433 <button type="button" class="filter-btn by-month-btn" data-value="2026-11" data-input-id="byMonth1"> 434 Noviembre 435 </button> 436 </div> 437 <!-- Checkboxes ocultos para mantener la funcionalidad --> 438 <input type="checkbox" class="filter-input by-month" id="byDateToday" value="today" style="display: none;"> 439 <input type="checkbox" class="filter-input by-month" id="byDateTomorrow" value="tomorrow" style="display: none;"> 440 <input type="checkbox" class="filter-input by-month" id="byDateWeekend" value="weekend" style="display: none;"> 441 <input type="checkbox" class="filter-input by-month" id="byDateNextWeek" value="next_week" style="display: none;"> 442 <input type="checkbox" class="filter-input by-month" id="byMonth0" value="2026-10" style="display: none;"> 443 <input type="checkbox" class="filter-input by-month" id="byMonth1" value="2026-11" style="display: none;"> 444 </div> 445 </div> 446 <div class="filter-section expanded"> 447 <div class="filter-section-header"> 448 <h3 class="filter-section-title">Distrito</h3> 449 <button type="button" class="filter-section-toggle" aria-expanded="true"> 450 <i class="icon-arrow-up-gross"></i> 451 </button> 452 </div> 453 <div class="filter-section-content show"> 454 <div class="filter-buttons-group"> 455 <button type="button" class="filter-btn by-district-btn" data-value="Barranco" data-input-id="byDistrict0"> 456 Barranco 457 </button> 458 <button type="button" class="filter-btn by-district-btn" data-value="Santiago de Surco" data-input-id="byDistrict1"> 459 Santiago de Surco 460 </button> 461 </div> 462 <!-- Checkboxes ocultos para mantener la funcionalidad --> 463 <input type="checkbox" class="filter-input by-district" id="byDistrict0" value="Barranco" style="display: none;"> 464 <input type="checkbox" class="filter-input by-district" id="byDistrict1" value="Santiago de Surco" style="display: none;"> 465 </div> 466 </div> 467 </div> 468 <div class="filters-popup-footer"> 469 <button type="button" class="btn btn-clear-filters">Limpiar filtros</button> 470 </div> 471 </div> 472 473 <div class="experiences-list-alt"> 474 <div class="experiences-body-wrapper"> 475 <div class="experiences-body-content"> 476 <div class="experience-boxes"> 477 <div class="category-buttons-wrapper"> 478 <div class="category-buttons-content"> 479 <div id="layoutCategory" class="filter-buttons"> 480 <button id="btnFilterbjKZMypGxpv1r7zOmngL" data-value="bjKZMypGxpv1r7zOmngL" data-seo-heading="Experiencias Gastronómicas y Cenas para Dos" data-seo-text="El plan perfecto para compartir: cenas, almuerzos y actividades para dos personas en los mejores restaurantes." class="btn btn-filter"> 481 Experiencia para dos 482 </button> 483 <button id="btnFiltergjW8poNYwXA14rL96AGa" data-value="gjW8poNYwXA14rL96AGa" data-seo-heading="Los Mejores Menús de Degustación y Alta Cocina" data-seo-text="Reserva exclusivos menús de degustación, experiencias de pasos y de alta cocina en los mejores restaurantes." class="btn btn-filter"> 484 Menú degustación 485 </button> 486 <button id="btnFilterobYPg8rnw36xak3AXqKz" data-value="obYPg8rnw36xak3AXqKz" data-seo-heading="Las Mejores Experiencias Gastronómicas y Eventos" data-seo-text="Planes únicos en los restaurantes top. Exclusivas cenas románticas, catas, menús de degustación y más." class="btn btn-filter"> 487 General 488 </button> 489 490 </div> 491 <div class="btn-controls-wrapper btn-control-left" style="display: none;"> 492 <div class="btn-controls-content"> 493 <a rel="nofollow" hre
493f="#" class="btn-control"> 494 <i class="icon-arrow-left-gross"></i> 495 </a> 496 </div> 497 </div> 498 <div class="btn-controls-wrapper btn-control-right" style="display: none;"> 499 <div class="btn-controls-content"> 500 <a rel="nofollow" href="#" class="btn-control"> 501 <i class="icon-arrow-right-gross"></i> 502 </a> 503 </div> 504 </div> 505 </div> 506 </div> 507 <div id="experiencesMain" class="experience-cards-wrapper"> 508 <div class="experience-cards-content"> 509 <div id="categorySeoHeader" class="category-seo-header"> 510 <h1 class="category-seo-title"></h1> 511 <p class="category-seo-text"></p> 512 </div> 513 <div id="mainExperiencesContainer" class="search-results"> 514 <div class="experience-card" 515 id="experienceCardjVOJvNY14Y025E7kXymL" 516 data-title="Amores de Taberna, Cena Romántica por Isolina" 517 data-priority="20260724" 518 data-category="bjKZMypGxpv1r7zOmngL" 519 data-price="250.00" 520 data-local="XKGEpq2wNKQ01LAzYn9v" 521 data-local-name="Isolina - Surco" 522 data-location="Santiago de Surco" 523 data-months="" 524 data-has-discount="0"> 525 <div class="experience-info"> 526 <div class="bg-image"> 527 <a class="btn-see-experience" 528 data-title="Amores de Taberna, Cena Romántica por Isolina" 529 href="/experiencias/isolina-surco/amores-de-taberna-cena-romantica-por-isolina-en-isolina-surco-jVOJvNY14Y025E7kXymL" 530 > 531 <div class="main-image" data-src="background-image:url(https://cdn.mesa247.io/archivos/exp-amores-de-taberna-cena-romantica-por-isolina-1760467591867.jpg)" style="background-image:url(https://cdn.mesa247.io/archivos/exp-amores-de-taberna-cena-romantica-por-isolina-1760467591867.jpg)"> 532 <img class="mx-auto logo" src="https://cdn.mesa247.io/archivos/restaurante/logo/2021/09/restaurante-isolina-3.png" style="display: none"> 533 </div> 534 </a> 535 </div> 536 <div class="media"> 537 <div class="media-body"> 538 <span style="display:none" class="see-in-marketplace">1</span> 539 <a href="/experiencias/isolina-surco/" class="local-name-prefix"> 540 <span>Isolina - Surco</span> 541 </a> 542 <a class="btn-see-experience" data-title="Amores de Taberna, Cena Romántica por Isolina" href="/experiencias/isolina-surco/amores-de-taberna-cena-romantica-por-isolina-en-isolina-surco-jVOJvNY14Y025E7kXymL"> 543 <h2 class="mt-0">Amores de Taberna, Cena Romántica por Isolina</h2> 544 </a> 545 <div class="local-location"><i class="icon-marker"></i> Santiago de Surco</div> 546 547 548 </div> 549 </div> 550 551 552 553 554 <div class="checkout-wrapper"> 555 <div class="checkout-content"> 556 557 <div class="action-buttons soldout "> 558 <a data-title="Amores de Taberna, Cena Romántica por Isolina" class="btn-see-experience btn btn-gray btn-action" href="/experiencias/isolina-surco/amores-de-taberna-cena-romantica-por-isolina-en-isolina-surco-jVOJvNY14Y025E7kXymL" role="button">Agotado</a> 559 </div> 560 <div class="result-errors text-danger small mt-2"></div> 561 </div> 562 </div> 563 </div> 564 </div> 565 <div class="experience-card" 566 id="experienceCardgZG68lo1kD9a5RQL3nyD" 567 data-title="Entre Copas y Piqueos en el Bar de Isolina" 568 data-priority="20260724" 569 data-category="obYPg8rnw36xak3AXqKz" 570 data-price="220.00" 571 data-local="XKGEpq2wNKQ01LAzYn9v" 572 data-local-name="Isolina - Surco" 573 data-location="Santiago de Surco" 574 data-months="" 575 data-has-discount="0"> 576 <div class="experience-info"> 577 <div class="bg-image"> 578 <a class="btn-see-experience" 579 data-title="Entre Copas y Piqueos en el Bar de Isolina" 580 href="/experiencias/isolina-surco/entre-copas-y-piqueos-en-el-bar-de-isolina-en-isolina-surco-gZG68lo1kD9a5RQL3nyD" 581 > 582 <div class="main-image" data-src="background-image:url(https://cdn.mesa247.io/archivos/exp-entre-copas-y-piqueos-en-el-bar-de-isolina-1760466105163.jpg)" style="background-image:url(https://cdn.mesa247.io/archivos/exp-entre-copas-y-piqueos-en-el-bar-de-isolina-1760466105163.jpg)"> 583 <img class="mx-auto logo" src="https://cdn.mesa247.io/archivos/restaurante/logo/2021/09/restaurante-isolina-3.png" style="display: none"> 584 </div> 585 </a> 586 </div> 587 <div class="media"> 588 <div class="media-body">
589 <span style="display:none" class="see-in-marketplace">1</span> 590 <a href="/experiencias/isolina-surco/" class="local-name-prefix"> 591 <span>Isolina - Surco</span> 592 </a> 593 <a class="btn-see-experience" data-title="Entre Copas y Piqueos en el Bar de Isolina" href="/experiencias/isolina-surco/entre-copas-y-piqueos-en-el-bar-de-isolina-en-isolina-surco-gZG68lo1kD9a5RQL3nyD"> 594 <h2 class="mt-0">Entre Copas y Piqueos en el Bar de Isolina</h2> 595 </a> 596 <div class="local-location"><i class="icon-marker"></i> Santiago de Surco</div> 597 598 599 </div> 600 </div> 601 602 603 604 605 <div class="checkout-wrapper"> 606 <div class="checkout-content"> 607 608 <div class="action-buttons soldout "> 609 <a data-title="Entre Copas y Piqueos en el Bar de Isolina" class="btn-see-experience btn btn-gray btn-action" href="/experiencias/isolina-surco/entre-copas-y-piqueos-en-el-bar-de-isolina-en-isolina-surco-gZG68lo1kD9a5RQL3nyD" role="button">Agotado</a> 610 </div> 611 <div class="result-errors text-danger small mt-2"></div> 612 </div> 613 </div> 614 </div> 615 </div> 616 <div class="experience-card" 617 id="experienceCardMLq8lKE5LbLzwJGgvPyb" 618 data-title="Mini degustación Criolla en Isolina Barranco" 619 data-priority="20260724" 620 data-category="gjW8poNYwXA14rL96AGa" 621 data-price="125.00" 622 data-local="XRvYa03n1Gdl5PNVe2jz" 623 data-local-name="Isolina - Barranco" 624 data-location="Barranco" 625 data-months="2026-10-05,2026-10-06,2026-10-07,2026-10-08,2026-10-09,2026-10-12,2026-10-13,2026-10-14,2026-10-15,2026-10-16,2026-10-19,2026-10-20,2026-10-21,2026-10-22,2026-10-23,2026-10-26,2026-10-27,2026-10-28,2026-10-29,2026-10-30,2026-11-02,2026-11-03,2026-11-04,2026-11-05,2026-11-06,2026-11-09,2026-11-10,2026-11-11,2026-11-12,2026-11-13,2026-11-16,2026-11-17,2026-11-18,2026-11-19,2026-11-20,2026-11-23,2026-11-24,2026-11-25,2026-11-26,2026-11-27" 626 data-has-discount="0"> 627 <div class="experience-info"> 628 <div class="bg-image"> 629 <a class="btn-see-experience" 630 data-title="Mini degustación Criolla en Isolina Barranco" 631 href="/experiencias/isolina/mini-degustacion-criolla-en-isolina-barranco-en-isolina-barranco-MLq8lKE5LbLzwJGgvPyb" 632 > 633 <div class="main-image" data-src="background-image:url(https://cdn.mesa247.io/archivos/exp-mini-degustacion-criolla-en-isolina-barranco-1762469712493.jpg)" style="background-image:url(https://cdn.mesa247.io/archivos/exp-mini-degustacion-criolla-en-isolina-barranco-1762469712493.jpg)"> 634 <img class="mx-auto logo" src="https://cdn.mesa247.io/archivos/restaurante/logo/2021/09/restaurante-isolina-3.png" style="display: none"> 635 </div> 636 </a> 637 </div> 638 <div class="media"> 639 <div class="media-body">
640 <span style="display:none" class="see-in-marketplace">1</span> 641 <a href="/experiencias/isolina/" class="local-name-prefix"> 642 <span>Isolina - Barranco</span> 643 </a> 644 <a class="btn-see-experience" data-title="Mini degustación Criolla en Isolina Barranco" href="/experiencias/isolina/mini-degustacion-criolla-en-isolina-barranco-en-isolina-barranco-MLq8lKE5LbLzwJGgvPyb"> 645 <h2 class="mt-0">Mini degustación Criolla en Isolina Barranco</h2> 646 </a> 647 <div class="local-location"><i class="icon-marker"></i> Barranco - 5 de Oct.</div> 648 649 650 </div> 651 </div> 652 653 654 655 656 <div class="checkout-wrapper"> 657 <div class="checkout-content"> 658 659 <div class="action-buttons "> 660 661 <div class="final-price">S/ 125</div> 662 663 <a href="/experiencias/isolina/mini-degustacion-criolla-en-isolina-barranco-en-isolina-barranco-MLq8lKE5LbLzwJGgvPyb" class="btn btn-green-main btn-action">Comprar ahora</a> 664 665 </div> 666 <div class="result-errors text-danger small mt-2"></div> 667 </div> 668 </div> 669 </div> 670 </div> 671 <div class="experience-card" 672 id="experienceCardVq26Rma5mk9zwyYWgXz9" 673 data-title="Desayuno Criollo en Isolina Barranco" 674 data-priority="20260725" 675 data-category="obYPg8rnw36xak3AXqKz" 676 data-price="120.00" 677 data-local="XRvYa03n1Gdl5PNVe2jz" 678 data-local-name="Isolina - Barranco" 679 data-location="Barranco" 680 data-months="2026-10-04,2026-10-10,2026-10-11,2026-10-17,2026-10-18,2026-10-24,2026-10-25,2026-10-31,2026-11-01,2026-11-07,2026-11-08,2026-11-14,2026-11-15,2026-11-21,2026-11-22,2026-11-28,2026-11-29" 681 data-has-discount="0"> 682 <div class="experience-info"> 683 <div class="bg-image"> 684 <a class="btn-see-experience" 685 data-title="Desayuno Criollo en Isolina Barranco" 686 href="/experiencias/isolina/desayuno-criollo-en-isolina-barranco-en-isolina-barranco-Vq26Rma5mk9zwyYWgXz9" 687 > 688 <div class="main-image" data-src="background-image:url(https://cdn.mesa247.io/archivos/exp-desayuno-criollo-en-isolina-barranco-1761082621215.jpg)" style="background-image:url(https://cdn.mesa247.io/archivos/exp-desayuno-criollo-en-isolina-barranco-1761082621215.jpg)"> 689 <img class="mx-auto logo" src="https://cdn.mesa247.io/archivos/restaurante/logo/2021/09/restaurante-isolina-3.png" style="display: none"> 690 </div> 691 </a> 692 </div> 693 <div class="media"> 694 <div class="media-body">
695 <span style="display:none" class="see-in-marketplace">1</span> 696 <a href="/experiencias/isolina/" class="local-name-prefix"> 697 <span>Isolina - Barranco</span> 698 </a> 699 <a class="btn-see-experience" data-title="Desayuno Criollo en Isolina Barranco" href="/experiencias/isolina/desayuno-criollo-en-isolina-barranco-en-isolina-barranco-Vq26Rma5mk9zwyYWgXz9"> 700 <h2 class="mt-0">Desayuno Criollo en Isolina Barranco</h2> 701 </a> 702 <div class="local-location"><i class="icon-marker"></i> Barranco - 4 de Oct.</div> 703 704 705 </div> 706 </div> 707 708 709 710 711 <div class="checkout-wrapper"> 712 <div class="checkout-content"> 713 714 <div class="action-buttons "> 715 716 <div class="final-price">S/ 120</div> 717 718 <a href="/experiencias/isolina/desayuno-criollo-en-isolina-barranco-en-isolina-barranco-Vq26Rma5mk9zwyYWgXz9" class="btn btn-green-main btn-action">Comprar ahora</a> 719 720 </div> 721 <div class="result-errors text-danger small mt-2"></div> 722 </div> 723 </div> 724 </div> 725 </div> 726 </div> 727 <div class="search-no-results"> 728 No se encontraron experiencias que se ajusten a los filtros escogidos. 729 </div> 730 </div> 731 </div> 732 </div> 733 </div> 734 735 736 737 </div> 738 </div> 739 </div> 740 741
741<script type="text/javascript"> 742 localStorage.setItem('expToken',"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImY5ZGY5MDdjNDEwMDlmY2JiOGYyOTAyNGNlYmYwMTQ4YTQ3OWFhYWMwMjViN2VjOTMyZDhiNjFjMGJmMDgyYzM2MWU5YjY2MTI4MWUxNjhjIn0.eyJhdWQiOiI3MDgiLCJqdGkiOiJmOWRmOTA3YzQxMDA5ZmNiYjhmMjkwMjRjZWJmMDE0OGE0NzlhYWFjMDI1YjdlYzkzMmQ4YjYxYzBiZjA4MmMzNjFlOWI2NjEyODFlMTY4YyIsImlhdCI6MTc5MDc0OTA3OCwibmJmIjoxNzkwNzQ5MDc4LCJleHAiOjE4MjIyODUwNzgsInN1YiI6IjQ4NDk2Iiwic2NvcGVzIjpbXX0.Box9FJP3xa8v2Iy7KuUJ6boOns6j7sc__jYyCwiU23iBKieVPQ-uJcWCxFCBITZzrHzErjU9bLIcXmB4_A2p80TE7t7mdsWthh6XsIrEQ70g2A5fYPA0m_GQ9ftSWtkbTmt2zrTSgI70RaPFKLFtzDDOXp-iMGUsntG89z6G8qiyz7EZ5Cs5PEIDmmEj53Jl7O9nwlFuibex-qQ-t1Bs1Xm9uqvEGN8z53PO55pWzv7dubGsGbw54xgzO8h90gRGhWN3LWkoBeINYE7BgjFMi58krmWiGt03tRPFAhmQnp5mdlPDE7CUq7c9_vMr7rgtMhWKVo1Ja3eBpKuwnMSN-HxInlyYXBLg3HsJUsIYG_ee8ktD6t7IveRreni68XIAhAXz7YX0OfNZWQfNh96Z4-sQq2JmwL0SCQFRjF3rYZPkLHooI-rQ1TFV32R0IJERR6KSCIHxchlKtHWT_4oi1OVNNiGtncv9mdhxcKHiX_olo_7-flwFRy8vu5v00H67wRswX3RmWCU3FUvtAtMjwLfQtQsi2ugVC0Pj8eGjFhI-gpBfi57UaMZNgVFK4mFLDBT3hDqkEbaGJoskNP9DgTLAzS_sonLhz92sg-2asHKIfXNJD8i29jMs2flSr6r-37qihhk3heJ1gCK0FqViyIwL1MdXRK8kauSP_bRb_gM"); 743localStorage.setItem('local_image',"https://cdn.mesa247.io/archivos/w-agrupation-bg-isolina-1595007125.jpg"); 744document.getElementById('bg-cover').style.backgroundImage = 'url(' + localStorage.getItem('local_image') + ')'; 745document.getElementById('bg-cover').style.display = 'block'; 746 localStorage.setItem('lang',"es"); 747localStorage.removeItem('last_people_number'); 748</script>
748 749
749<script type="text/javascript" src="https://experiencias.mesa247.pe/experiencias/js/app.js?id=23f705f29d9bb1338e01"></script>
749 750
750<script> 751 //Utils 752 function mainShuffle(array) { 753 let currentIndex = array.length; 754 755 // While there remain elements to shuffle... 756 while (currentIndex != 0) { 757 758 // Pick a remaining element... 759 let randomIndex = Math.floor(Math.random() * currentIndex); 760 currentIndex--; 761 762 // And swap it with the current element. 763 [array[currentIndex], array[randomIndex]] = [ 764 array[randomIndex], array[currentIndex]]; 765 } 766 } 767 </script>
767 768
768<script src="https://experiencias.mesa247.pe/experiencias/js/datepicker.min.js"></script>
vendor: 1 bytes, line 768
768
769<script src="https://experiencias.mesa247.pe/experiencias/js/datepicker.es-ES.js"></script>
vendor: 1 bytes, line 769
769
770<script src="https://experiencias.mesa247.pe/experiencias/libs/splide/js/splide.min.js"></script>
vendor: 1 bytes, line 770
770
771<script type="text/javascript"> 772$(document).ready(function(){ 773 const $stickyApp = $('#app'); 774 const $stickyNav = $stickyApp.children('nav').first(); 775 776 if ($stickyNav.length) { 777 const stickyApp = $stickyApp[0]; 778 const filtersEl = document.querySelector('.experiences-filters-sticky'); 779 let navHeight = 0; 780 let condensed = false; 781 let io = null; 782 let sentinel = null; 783 784 function setCondensed(state) { 785 if (state === condensed) return; 786 condensed = state; 787 $stickyApp.toggleClass('is-condensed', condensed); 788 if (filtersEl) { 789 stickyApp.style.setProperty('--sticky-filters-h', filtersEl.offsetHeight + 'px'); 790 } 791 } 792 793 function measureStickyOffsets() { 794 navHeight = $stickyNav.outerHeight() || 0; 795 stickyApp.style.setProperty('--sticky-nav-h', navHeight + 'px'); 796 stickyApp.style.setProperty('--sticky-filters-h', (filtersEl ? filtersEl.offsetHeight : 0) + 'px'); 797 } 798 799 function setupObserver() { 800 if (!filtersEl || !('IntersectionObserver' in window)) return; 801 if (io) io.disconnect(); 802 if (!sentinel) { 803 sentinel = document.createElement('div'); 804 sentinel.setAttribute('aria-hidden', 'true'); 805 sentinel.style.cssText = 'display:block;height:0;margin:0;padding:0;border:0;'; 806 filtersEl.parentNode.insertBefore(sentinel, filtersEl); 807 } 808 io = new IntersectionObserver(function(entries) { 809 setCondensed(!entries[0].isIntersecting); 810 }, { rootMargin: (-(navHeight + 1)) + 'px 0px 0px 0px', threshold: 0 }); 811 io.observe(sentinel); 812 } 813 814 measureStickyOffsets(); 815 $stickyApp.addClass('sticky-bars-on'); 816 setupObserver(); 817 818 let resizeTimer; 819 $(window).on('resize', function() { 820 clearTimeout(resizeTimer); 821 resizeTimer = setTimeout(function() { 822 measureStickyOffsets(); 823 setupObserver(); 824 }, 150); 825 }); 826 window.addEventListener('load', function() { 827 measureStickyOffsets(); 828 setupObserver(); 829 }); 830 } 831 832 let experiencesData = []; 833 let currentSorting = 'relevance'; 834 835 $('.experience-card').each(function() { 836 const $card = $(this); 837 experiencesData.push({ 838 dom: $card.detach(), 839 title: $card.data('title'), 840 price: parseFloat($card.data('price')), 841 category: $card.data('category'), 842 local: $card.data('local'), 843 location: $card.data('location'), 844 months: ($card.data('months') || '').split(','), 845 hasDiscount: $card.data('hasDiscount') == 1 || $card.data('has-discount') == 1 846 }); 847 }); 848 849 // Guardar una referencia del dataset original para asegurar que nunca se modifique 850 const originalExperiencesData = [...experiencesData]; 851 852 function renderExperiences(list) { 853 const container = $('#mainExperiencesContainer'); 854 container.empty(); 855 856 if (list.length === 0) { 857 $('.search-no-results').addClass('show'); 858 } else { 859 $('.search-no-results').removeClass('show'); 860 list.forEach(item => container.append(item.dom)); 861 } 862 863 // Actualizar contador si el popup está abierto 864 if ($('.filters-popup').hasClass('show')) { 865 updateFiltersCount(list.length); 866 } 867 } 868 869 // Inicializar renderizando directamente (sin filtros) 870 renderExperiences([...originalExperiencesData]); 871 updateActiveFilters(); 872 873 // Función para actualizar el contador de experiencias 874 function updateFiltersCount(count) { 875 const finalCount = count !== undefined ? count : 0; 876 const singular = "experiencia"; 877 const plural = "experiencias"; 878 const text = finalCount === 1 ? '1 ' + singular : finalCount + ' ' + plural; 879 $('.filters-count-text').text(text); 880 } 881 882 const sortingLabels = { 883 'a-z': "Alfabéticamente", 884 'z-a': "Alfabéticamente", 885 'lowprice': "por Precio", 886 'highprice': "por Precio", 887 'discount': "por Descuento", 888 'relevance': "por Relevancia" 889 }; 890 891 function applySorting(data, sortingOption) { 892 if (!data || !Array.isArray(data) || data.length === 0) { 893 return data; 894 } 895 896 let sortedData = [...data]; 897 898 switch (sortingOption) { 899 case 'a-z': 900 sortedData.sort((a, b) => a.title.localeCompare(b.title)); 901 break; 902 case 'z-a': 903 sortedData.sort((a, b) => b.title.localeCompare(a.title)); 904 break; 905 case 'lowprice': 906 sortedData.sort((a, b) => a.price - b.price); 907 break; 908 case 'highprice': 909 sortedData.sort((a, b) => b.price - a.price); 910 break; 911 case 'discount': 912 sortedData.sort((a, b) => (b.hasDiscount ? 1 : 0) - (a.hasDiscount ? 1 : 0)); 913 break; 914 case 'relevance': 915 default: 916 // No ordenar, mantener orden original 917 break; 918 } 919 920 return sortedData; 921 } 922 923 $('.sorting-input').on('change', function() { 924 const sortingOption = $(this).val(); 925 currentSorting = sortingOption; 926 927 $('input[name=mobile-order-by]').prop('checked', false); 928 $('input[name=rb-order-by]').prop('checked', false); 929 $('input[value="' + sortingOption + '"]').prop('checked', true); 930 931 $('.sorting-selected').html(sortingLabels[sortingOption]); 932 933 // Aplicar filtros (que luego aplicará el ordenamiento) 934 applyFilters(); 935 }); 936 937 // Listener general para todos los filtros (excepto categorÃas que tienen su propio handler) 938 $('.filter-input:not(.by-category)').on('change', function() { 939 applyFilters(); 940 }); 941 942 function applyFilters(dataset) { 943 let baseDataset; 944 if (dataset && Array.isArray(dataset) && dataset.length > 0) { 945 baseDataset = [...dataset]; 946 } else { 947 baseDataset = originalExperiencesData && originalExperiencesData.length > 0 948 ? [...originalExperiencesData] 949 : (experiencesData && experiencesData.length > 0 ? [...experiencesData] : []); 950 } 951 952 // Si no hay datos, no hacer nada 953 if (!baseDataset || baseDataset.length === 0) { 954 return; 955 } 956 957 // Normalizador para comparar sin acentos / mayúsculas / espacios 958 const norm = (s) => 959 (s || '') 960 .toString() 961 .trim() 962 .toLowerCase() 963 .normalize('NFD') 964 .replace(/[\u0300-\u036f]/g, ''); 965 966 // Siempre empezar con el dataset original completo (no filtrado) 967 let filteredData = [...baseDataset]; 968 969 // CategorÃa (opción múltiple - si no hay ninguna seleccionad
969a, muestra todo) 970 const activeCategories = $('.by-category:checked'); 971 972 if (activeCategories.length > 0) { 973 const selectedCategoryIds = [...activeCategories] 974 .map(el => $(el).val().toString()) 975 .filter(id => id !== 'all'); // Excluir 'all' si existe 976 977 // Si después de filtrar 'all' no quedan categorÃas, mostrar todo 978 if (selectedCategoryIds.length > 0) { 979 filteredData = filteredData.filter(item => { 980 // Convertir category a string para comparar correctamente 981 const itemCategory = item.category ? item.category.toString() : ''; 982 return selectedCategoryIds.includes(itemCategory); 983 }); 984 } 985 } 986 // Si activeCategories.length === 0 o solo quedaba 'all', no se filtra por categorÃa (muestra todo - comportamiento implÃcito de "Todas") 987 988 // Precio 989 const activePrices = $('.by-price:checked'); 990 if (activePrices.length > 0) { 991 filteredData = filteredData.filter(item => { 992 return [...activePrices].some(el => { 993 const $el = $(el); 994 const min = parseFloat($el.data('min')); 995 const max = parseFloat($el.data('max')); 996 return item.price >= min && (!max || item.price <= max); 997 }); 998 }); 999 } 1000 1001 // Con descuento 1002 if ($('.by-discount:checked').length > 0) { 1003 filteredData = filteredData.filter(item => item.hasDiscount === true); 1004 } 1005 1006 // Fecha: opciones especiales (hoy, mañana, fin de semana, próx semana) y meses (YYYY-MM) 1007 const activeMonths = $('.by-month:checked'); 1008 if (activeMonths.length > 0) { 1009 const specialValues = ['today', 'tomorrow', 'weekend', 'next_week']; 1010 const selectedValues = [...activeMonths].map(el => $(el).val()); 1011 const specialSelected = selectedValues.filter(v => specialValues.indexOf(v) !== -1); 1012 const monthSelected = selectedValues.filter(v => specialValues.indexOf(v) === -1); 1013 1014 function toYMD(d) { 1015 const y = d.getFullYear(); 1016 const m = String(d.getMonth() + 1).padStart(2, '0'); 1017 const day = String(d.getDate()).padStart(2, '0'); 1018 return y + '-' + m + '-' + day; 1019 } 1020 1021 function getSpecialDateRanges() { 1022 const today = new Date(); 1023 const ranges = { today: [], tomorrow: [], weekend: [], next_week: [] }; 1024 ranges.today.push(toYMD(today)); 1025 const tomorrow = new Date(today); 1026 tomorrow.setDate(tomorrow.getDate() + 1); 1027 ranges.tomorrow.push(toYMD(tomorrow)); 1028 const day = today.getDay(); 1029 const sat = new Date(today); 1030 const daysToSat = (6 - day + 7) % 7; 1031 sat.setDate(sat.getDate() + (daysToSat === 0 && day !== 6 ? 7 : daysToSat)); 1032 const sun = new Date(sat); 1033 sun.setDate(sun.getDate() + 1); 1034 ranges.weekend.push(toYMD(sat), toYMD(sun)); 1035 const daysUntilNextMon = day === 1 ? 7 : (8 - day + 7) % 7; 1036 const nextMon = new Date(today); 1037 nextMon.setDate(nextMon.getDate() + daysUntilNextMon); 1038 for (let i = 0; i < 7; i++) { 1039 const d = new Date(nextMon); 1040 d.setDate(d.getDate() + i); 1041 ranges.next_week.push(toYMD(d)); 1042 } 1043 return ranges; 1044 } 1045 1046 const specialRanges = getSpecialDateRanges(); 1047 1048 function itemMatchesSpecialDate(item, specialKind) { 1049 const dates = specialRanges[specialKind] || []; 1050 return (item.months || []).some(m => { 1051 const s = (m || '').trim(); 1052 if (s.length >= 10) return dates.indexOf(s) !== -1; 1053 if (s.length === 7) return dates.some(d => d.startsWith(s)); 1054 return false;
1055 }); 1056 } 1057 1058 filteredData = filteredData.filter(item => { 1059 const matchSpecial = specialSelected.length > 0 && specialSelected.some(kind => itemMatchesSpecialDate(item, kind)); 1060 const matchMonth = monthSelected.length > 0 && item.months.some(m => monthSelected.some(sel => (m || '').startsWith(sel))); 1061 return matchSpecial || matchMonth; 1062 }); 1063 } 1064 1065 // Restaurante (Local) 1066 const activeLocals = $('.by-local:checked'); 1067 if (activeLocals.length > 0) { 1068 filteredData = filteredData.filter(item => { 1069 return [...activeLocals].some(el => item.local == $(el).val()); 1070 }); 1071 } 1072 1073 // Distrito 1074 const activeDistricts = $('.by-district:checked'); 1075 if (activeDistricts.length > 0) { 1076 const selectedDistricts = [...activeDistricts].map(el => norm($(el).val())); // p.ej. "miraflores" 1077 filteredData = filteredData.filter(item => selectedDistricts.includes(norm(item.location))); 1078 } 1079 1080 filteredData = applySorting(filteredData, currentSorting); 1081 1082 renderExperiences(filteredData); 1083 updateActiveFilters(); 1084 } 1085 1086 function createActiveFilterTag(type, label, dataAttrs) { 1087 const attrs = Object.keys(dataAttrs).map(key => 'data-' + key + '="' + dataAttrs[key] + '"').join(' '); 1088 return $('<span class="active-filter-tag" data-type="' + type + '" ' + attrs + '">' + 1089 '<button type="button" class="active-filter-remove" data-type="' + type + '" ' + attrs + '">' + 1090 '<i class="icon-close"></i>' + 1091 '</button>' + 1092 '<span>' + label + '</span>' + 1093 '</span>'); 1094 } 1095 1096 function processActiveFilters(selector, type, btnSelector, defaultLabel, getLabelFn) { 1097 const $activeContainer = $('.filters-popup-active'); 1098 let hasActive = false; 1099 1100 $(selector + ':checked').each(function() { 1101 const $checkbox = $(this); 1102 const value = $checkbox.val(); 1103 1104 if (type === 'category' && value === 'all') return; 1105 1106 hasActive = true; 1107 const inputId = $checkbox.attr('id'); 1108 let label = defaultLabel; 1109 let dataAttrs = {}; 1110 1111 if (type === 'category') { 1112 const $btn = $(btnSelector.replace('{value}', value)); 1113 label = $btn.length ? $btn.text() : defaultLabel; 1114 dataAttrs = { value: value }; 1115 } else { 1116 const $btn = $(btnSelector.replace('{inputId}', inputId)); 1117 label = $btn.length ? $btn.text() : defaultLabel; 1118 dataAttrs = { 'input-id': inputId }; 1119 } 1120 1121 if (getLabelFn) { 1122 label = getLabelFn($checkbox, label); 1123 } 1124 1125 const $tag = createActiveFilterTag(type, label, dataAttrs); 1126 $activeContainer.append($tag); 1127 }); 1128 1129 return hasActive; 1130 } 1131 1132 function updateActiveFilters() { 1133 const $activeContainer = $('.filters-popup-active'); 1134 $activeContainer.empty(); 1135 1136 let hasActiveFilters = false; 1137 1138 hasActiveFilters = processActiveFilters('.by-category', 'category', '.by-category-btn[data-value="{value}"]', 'CategorÃa') || hasActiveFilters; 1139 hasActiveFilters = processActiveFilters('.by-price', 'price', '.by-price-btn[data-input-id="{inputId}"]', 'Precio') || hasActiveFilters; 1140 hasActiveFilters = processActiveFilters('.by-discount', 'discount', '.by-discount-btn[data-input-id="{inputId}"]', "Con descuento") || hasActiveFilters; 1141 hasActiveFilters = processActiveFilters('.by-month', 'month', '.by-month-btn[data-input-id="{inputId}"]', 'Mes') || hasActiveFilters; 1142 hasActiveFilters = processActiveFilters('.by-district', 'district', '.by-district-btn[data-input-id="{inputId}"]', 'Distrito') || hasActiveFilters; 1143 hasActiveFilters = processActiveFilters('.by-local', 'local', '.by-local-btn[data-input-id="{inputId}"]', 'Restaurante') || hasActiveFilters; 1144 1145 $activeContainer.toggle(hasActiveFilters); 1146 } 1147 1148 function deactivateFilter(type, value, inputId) { 1149 let $checkbox, $btnSelector, $carruselBtn; 1150 1151 if (type === 'category') { 1152 $checkbox = $('#ocasion' + value); 1153 $btnSelector = '.by-category-btn[data-value="' + value + '"]'; 1154 $carruselBtn = $('#btnFilter' + value); 1155 } else { 1156 $checkbox = $('#' + inputId); 1157 const btnClassMap = { 1158 'price': '.by-price-btn', 1159 'discount': '.by-discount-btn', 1160 'month': '.by-month-btn', 1161 'district': '.by-district-btn', 1162 'local': '.by-local-btn' 1163 }; 1164 $btnSelector = (btnClassMap[type] || '') + '[data-input-id="' + inputId + '"]'; 1165 } 1166 1167 if ($checkbox.length) { 1168 $checkbox.prop('checked', false); 1169 } 1170 1171 if ($btnSelector) { 1172 $($btnSelector).removeClass('active'); 1173 } 1174 1175 if ($carruselBtn && $carruselBtn.length) { 1176 $carruselBtn.removeClass('active'); 1177 } 1178 } 1179 1180 $(document).on('click', '.active-filter-remove', function(e) { 1181 e.preventDefault(); 1182 e.stopPropagation(); 1183 1184 const $btn = $(this); 1185 const type = $btn.data('type'); 1186 const value = $btn.data('value'); 1187 const inputId = $btn.data('input-id'); 1188 1189 deactivateFilter(type, value, inputId); 1190 applyFilters(); 1191 }); 1192 1193 function openFiltersPopup() { 1194 const $popup = $('.filters-popup'); 1195 if (!$popup.length) return; 1196 1197 $popup.addClass('show'); 1198 $('.main-bg-overlay').addClass('show'); 1199 $('body').addClass('popup-mode'); 1200 const currentCount = $('#mainExperiencesContainer .experience-card').length; 1201 updateFiltersCount(currentCount); 1202 1203 const $filterWrapper = $('.filter-buttons-wrapper'); 1204 if ($filterWrapper.length) { 1205 $filterWrapper[0].scrollIntoView({ 1206 behavior: 'smooth', 1207 block: 'start' 1208 }); 1209 } 1210 } 1211 1212 function closeFiltersPopup() { 1213 const $popup = $('.filters-popup'); 1214 if (!$popup.length) return; 1215 1216 $popup.removeClass('show'); 1217 $('.main-bg-overlay').removeClass('show'); 1218 $('body').removeClass('popup-mode'); 1219 } 1220 1221 if ($('#btnToggleFilter').length) { 1222 $('#btnToggleFilter').on('click', function(e) { 1223 e.preventDefault(); 1224 const isShowing = $('.filters-popup').hasClass('show'); 1225 1226 if (!isShowing) { 1227 openFiltersPopup(); 1228 } else { 1229 closeFiltersPopup(); 1230 } 1231 }); 1232 } 1233 1234 if ($('#btnControlFilter').length) { 1235 $('#btnControlFilter').on('click', function(e) { 1236 e.preventDefault(); 1237 e.stopPropagation(); 1238 openFiltersPopup(); 1239 }); 1240 } 1241 1242 $('.main-bg-overlay').on('click', function(e) { 1243 if ($('.filters-popup').hasClass('show')) { 1244 closeFiltersPopup(); 1245 } 1246 }); 1247 1248 $(document).on('click', '.btn-filter-close-popup', function(e) { 1249 e.preventDefault(); 1250 e.stopPropagation(); 1251 closeFiltersPopup(); 1252 }); 1253 1254 //FIX the fail click around on the radio input 1255 $('body').on('click', '.dropdown-item', function(e){ 1256 const sortingOption = $(this).find('.sorting-input').get(0); 1257 if (sortingOption) { 1258 sortingOption.click(); 1259 } 1260 }); 1261 1262 $('.toggle-options').on('click', function() { 1263 const $toggleBtn = $(this); 1264 const $box = $toggleBtn.closest('.box'); 1265 1266 const isExpanded = $box.hasClass('expanded'); 1267 $box.toggleClass('expanded', !isExpanded); 1268 $toggleBtn.html(isExpanded ? 'Ver más <i class="icon-arrow-down"></i>' : 'Ver menos <i class="icon-arrow-up-gross"></i>'); 1269 }); 1270 1271 $('.btn-filter').on('click', function(e) { 1272 const btnSelected = $(this); 1273 const categoryId = btnSelected.data('value'); 1274 1275 if (!categoryId) { 1276 return; 1277 } 1278 1279 e.preventDefault(); 1280 e.stopPropagation(); 1281 1282 const $checkbox = $('#ocasion' + categoryId); 1283 const isChecked = $checkbox.is(':checked'); 1284 1285 $('.by-category').prop('checked', false); 1286 $('.by-category-btn').removeClass('active'); 1287 $('.btn-filter').removeClass('active'); 1288 1289 if (!isChecked) { 1290 $checkbox.prop('checked', true); 1291 btnSelected.addClass('active'); 1292 $('.by-category-btn[data-value="' + categoryId + '"]').addClass('active'); 1293 } 1294 1295 applyFilters(); 1296 }); 1297 1298 $('input.by-category').on('change', function() { 1299 const $checkbox = $(this); 1300 const categoryId = $checkbox.val(); 1301 const isChecked = $checkbox.is(':checked'); 1302 1303 // Sincronizar botones del nuevo popup 1304 const $popupBtn = $('.by-category-btn[data-value="' + categoryId + '"]'); 1305 $popupBtn.toggleClass('active', isChecked); 1306 1307 // Sincronizar botones del carrusel de arriba 1308 const $carruselBtn = $('#btnFilter' + categoryId); 1309 $carruselBtn.toggleClass('active', isChecked); 1310 1311 // Aplicar filtros 1312 applyFilters(); 1313 }); 1314 1315 // Funcionalidad del accordion en el nuevo popup 1316 $('.filter-section-header').on('click', function() { 1317 const $section = $(this).closest('.filter-section'); 1318 const $content = $section.find('.filter-section-content'); 1319 const isExpanded = $section.hasClass('expanded'); 1320 1321 $section.toggleClass('expanded', !isExpanded); 1322 $content.toggleClass('show', !isExpanded); 1323 }); 1324 1325 // Funcionalidad de los botones de filtro en el nuevo popup (CategorÃa - opción múltiple) 1326 $('.by-category-btn').on('click', function(e) { 1327 e.preventDefault(); 1328 e.stopPropagation(); 1329 const $btn = $(this); 1330 const inputId = $btn.data('input-id'); 1331 const $checkbox = $('#' + inputId); 1332 const isChecked = $checkbox.is(':checked'); 1333 const categoryId = $checkbox.val(); 1334 1335 // Toggle del checkbox sin trigger para evitar doble ejecución 1336 $checkbox.prop('checked', !isChecked); 1337 1338 // Actualizar estado visual del botón 1339 $btn.toggleClass('active', !isChecked); 1340 1341 // Sincronizar botones del carrusel de arriba 1342 const $carruselBtn = $('#btnFilter' + categoryId); 1343 $carruselBtn.toggleClass('active', !isChecked); 1344 1345 // Aplicar filtros manualmente 1346 applyFilters(); 1347 }); 1348 1349 // Funcionalidad de los botones de filtro de precio (opción múltiple) 1350 $('.by-price-btn').on('click', function() { 1351 const $btn = $(this); 1352 const inputId = $btn.data('input-id'); 1353 const $checkbox = $('#' + inputId); 1354 const isChecked = $checkbox.is(':checked'); 1355 1356 // Toggle del checkbox 1357 $checkbox.prop('checked', !isChecked).trigger('change'); 1358 1359 // Actualizar estado visual del botón 1360 $btn.toggleClass('active', !isChecked); 1361 }); 1362 1363 $('.by-discount-btn').on('click', function() { 1364 const $btn = $(this); 1365 const inputId = $btn.data('input-id'); 1366 const $checkbox = $('#' + inputId); 1367 const isChecked = $checkbox.is(':checked'); 1368 1369 $checkbox.prop('checked', !isChecked).trigger('change'); 1370 $btn.toggleClass('active', !isChecked); 1371 }); 1372 1373 // Funcionalidad de los botones de filtro de mes (opción múltiple) 1374 $('.by-month-btn').on('click', function() { 1375 const $btn = $(this); 1376 const inputId = $btn.data('input-id'); 1377 const $checkbox = $('#' + inputId); 1378 const isChecked = $checkbox.is(':checked'); 1379 1380 $checkbox.prop('checked', !isChecked).trigger('change'); 1381 $btn.toggleClass('active', !isChecked); 1382 }); 1383 1384 // Funcionalidad de los botones de filtro de distrito (opción múltiple) 1385 $('.by-district-btn').on('click', function() { 1386 const $btn = $(this); 1387 const inputId = $btn.data('input-id'); 1388 const $checkbox = $('#' + inputId); 1389 const isChecked = $checkbox.is(':checked'); 1390 1391 $checkbox.prop('checked', !isChecked).trigger('change'); 1392 $btn.toggleClass('active', !isChecked); 1393 }); 1394 1395 // Funcionalidad de los botones de filtro de restaurante (opción múltiple) 1396 $('.by-local-btn').on('click', function() { 1397 const $btn = $(this); 1398 const inputId = $btn.data('input-id'); 1399 const $checkbox = $('#' + inputId); 1400 const isChecked = $checkbox.is(':checked'); 1401 1402 $checkbox.prop('checked', !isChecked).trigger('change'); 1403 $btn.toggleClass('active', !isChecked); 1404 }); 1405 1406 // Sincronizar botones cuando cambian los checkboxes 1407 $('.by-price, .by-discount, .by-month, .by-district, .by-local').on('change', function() { 1408 const $checkbox = $(this); 1409 const inputId = $checkbox.attr('id'); 1410 const $btn = $('.by-price-btn[data-input-id="' + inputId + '"], .by-discount-btn[data-input-id="' + inputId + '"], .by-month-btn[data-input-id="' + inputId + '"], .by-district-btn[data-input-id="' + inputId + '"], .by-local-btn[data-input-id="' + inputId + '"]'); 1411 $btn.toggleClass('active', $checkbox.is(':checked')); 1412 }); 1413 1414 // Inicializar estado de los botones al cargar 1415 $('.by-category-btn').each(function() { 1416 const $btn = $(this); 1417 const inputId = $btn.data('input-id'); 1418 if ($('#' + inputId).is(':checked')) { 1419 $btn.addClass('active'); 1420 } 1421 }); 1422 1423 // Inicializar estado de los botones de precio al cargar 1424 $('.by-price-btn').each(function() { 1425 const $btn = $(this); 1426 const inputId = $btn.data('input-id'); 1427 if ($('#' + inputId).is(':checked')) { 1428 $btn.addClass('active'); 1429 } 1430 }); 1431 1432 $('.by-discount-btn').each(function() { 1433 const $btn = $(this); 1434 const inputId = $btn.data('input-id'); 1435 if ($('#' + inputId).is(':checked')) { 1436 $btn.addClass('active'); 1437 } 1438 }); 1439 1440 // Inicializar estado de los botones de mes al cargar 1441 $('.by-month-btn').each(function() { 1442 const $btn = $(this); 1443 const inputId = $btn.data('input-id'); 1444 if ($('#' + inputId).is(':checked')) { 1445 $btn.addClass('active'); 1446 } 1447 }); 1448 1449 // Inicializar estado de los botones de distrito al cargar 1450 $('.by-district-btn').each(function() { 1451 const $btn = $(this); 1452 const inputId = $btn.data('input-id'); 1453 if ($('#' + inputId).is(':checked')) { 1454 $btn.addClass('active'); 1455 } 1456 }); 1457 1458 // Inicializar estado de los botones de restaurante al cargar 1459 $('.by-local-btn').each(function() { 1460 const $btn = $(this); 1461 const inputId = $btn.data('input-id'); 1462 if ($('#' + inputId).is(':checked')) { 1463 $btn.addClass('active'); 1464 } 1465 }); 1466 1467 // Función para limpiar todos los filtros (estado original) 1468 function clearAllFilters() { 1469 // Limpiar categorÃas 1470 $('.by-category').prop('checked', false); 1471 $('.by-category-btn').removeClass('active'); 1472 $('.btn-filter').removeClass('active'); 1473 1474 // Limpiar precio 1475 $('.by-price').prop('checked', false); 1476 $('.by-price-btn').removeClass('active'); 1477 1478 $('.by-discount').prop('checked', false); 1479 $('.by-discount-btn').removeClass('active'); 1480 1481 // Limpiar mes 1482 $('.by-month').prop('checked', false); 1483 $('.by-month-btn').removeClass('active'); 1484 1485 // Limpiar distrito 1486 $('.by-district').prop('checked', false); 1487 $('.by-district-btn').removeClass('active'); 1488 1489 // Limpiar restaurante 1490 $('.by-local').prop('checked', false); 1491 $('.by-local-btn').removeClass('active'); 1492 1493 // Aplicar filtros (mostrar todo) 1494 applyFilters(); 1495 } 1496 1497 // Botón limpiar filtros 1498 $('.btn-clear-filters').on('click', function(e) { 1499 e.preventDefault(); 1500 clearAllFilters(); 1501 }); 1502 1503 $('#experience-date').datepicker({ 1504 format:'dd/mm/yyyy', 1505 autoHide: true, 1506 language: 'es-ES' 1507 }).on('change', function(e){ 1508 // app.refreshValue($(this).val()); 1509 }); 1510 1511 $('#categoryExperiences').on('change', function () { 1512 $('#categoryForm').submit(); 1513 }); 1514 1515 $(document).on('click', '.btn-confirm-experience', function() { 1516 $('.result-errors').html(
1516''); 1517 let element = $(this); 1518 const expDate = element.data('expdate'); 1519 const localSlug = element.data('explocal'); 1520 const expId = element.data('expid'); 1521 1522 let boxResultserror = element.parent().find('.result-errors'); 1523 element.addClass('readonly'); 1524 element.addClass('loading-dots'); 1525 1526 window.axios.defaults.baseURL = 'https://mesa-backend-prod-370098395535.us-east4.run.app/v1/'; 1527 window.axios.defaults.params['language'] = localStorage.getItem('lang')!=null ? localStorage.getItem('lang') : 'es'; 1528 window.axios.defaults.headers.common = {'Authorization': "Bearer " + localStorage.getItem('expToken')}; 1529 window.axios.defaults.headers.common['Content-Type'] = 'application/json'; 1530 window.axios.defaults.headers.common['Accept'] = 'application/json'; 1531 1532 axios.post('ecommerce/experiencies/' + expId + '/date', 1533 {"schedule":{"_id":expDate},"clean":1,"origin": 'isolina.pe'} 1534 ).then(function (response) { 1535 element.removeClass('readonly'); 1536 element.removeClass('loading-dots'); 1537 if (response) { 1538 location.href = `/experiencias/${localSlug}/${expId}/asistentes`; 1539 } 1540 }).catch(error => { 1541 if (error.response && error.response.data) { 1542 boxResultserror.html(error.response.data.message); 1543 } else { 1544 console.log('Error', error.message); 1545 boxResultserror.html('Ocurrió un error: ' + error.message); 1546 } 1547 1548 element.removeClass('readonly'); 1549 element.removeClass('loading-dots'); 1550 }); 1551 }); 1552 1553 1554 function smoothScroll(element, target, duration) { 1555 const start = element.scrollLeft(); 1556 const change = target - start; 1557 const startTime = performance.now(); 1558 1559 function easeInOutQuad(t) { 1560 return t < 0.5 1561 ? 2 * t * t 1562 : -1 + (4 - 2 * t) * t; 1563 } 1564 1565 function animateScroll(currentTime) { 1566 const elapsed = (currentTime - startTime) / duration; 1567 const progress = Math.min(elapsed, 1); 1568 const easedProgress = easeInOutQuad(progress); 1569 element.scrollLeft(start + change * easedProgress); 1570 1571 if (progress < 1) { 1572 requestAnimationFrame(animateScroll); 1573 } else { 1574 toggleScrollCategories(); 1575 } 1576 } 1577 1578 requestAnimationFrame(animateScroll); 1579 } 1580 1581 1582}); 1583</script>
1583 1584 1585
1585<script type="text/javascript"> 1586$(document).ready(function(){ 1587 function trackPush(payload) { 1588 window.dataLayer = window.dataLayer || []; 1589 window.dataLayer.push(payload); 1590 } 1591 1592 function trackActiveFilters() { 1593 return $('.filters-popup-active .active-filter-tag').map(function() { 1594 return $(this).data('type') + ':' + $(this).text().trim(); 1595 }).get().join(' | '); 1596 } 1597 1598 function trackDevice() { 1599 return $('#btnControlFilter').is(':visible') ? 'mobile' : 'desktop'; 1600 } 1601 1602 function trackFilterPush(params) { 1603 trackPush($.extend({ event: 'experience_filter_click' }, params, { 1604 device: trackDevice(), 1605 active_filters: trackActiveFilters() 1606 })); 1607 } 1608 1609 $(document).on('click', '.experience-card a:not(.local-name-prefix)', function() { 1610 const $card = $(this).closest('.experience-card'); 1611 const $collection = $card.closest('.ec-collection'); 1612 const inCollection = $collection.length > 0; 1613 let position; 1614 1615 if (inCollection) { 1616 const $slide = $card.closest('.splide__slide'); 1617 position = $slide.closest('.splide__list').children('.splide__slide').not('.splide__slide--clone').index($slide) + 1; 1618 } else { 1619 position = $('#mainExperiencesContainer').children('.experience-card').index($card) + 1; 1620 } 1621 1622 window.dataLayer = window.dataLayer || []; 1623 window.dataLayer.push({ 1624 event: "experience_click", 1625 experience_name: $card.data('title'), 1626 restaurant_name: $card.data('local-name'), 1627 collection_name: inCollection ? $collection.data('collection-name') : 'Todas las experiencias', 1628 collection_type: inCollection ? $collection.data('collection-type') : 'listado', 1629 position: position 1630 }); 1631 }); 1632 1633 $('.btn-filter').on('click', function() { 1634 const $btn = $(this); 1635 1636 if (!$btn.data('value')) { 1637 return; 1638 } 1639 1640 trackFilterPush({ 1641 filter_source: 'carrusel', 1642 filter_type: 'category', 1643 filter_name: $btn.text().trim(), 1644 action: $btn.hasClass('active') ? 'select' : 'deselect' 1645 }); 1646 }); 1647 1648 [ 1649 { selector: '.by-category-btn', type: 'category' }, 1650 { selector: '.by-price-btn', type: 'price' }, 1651 { selector: '.by-discount-btn', type: 'discount' }, 1652 { selector: '.by-month-btn', type: 'month' }, 1653 { selector: '.by-district-btn', type: 'district' }, 1654 { selector: '.by-local-btn', type: 'local' } 1655 ].forEach(function(filter) { 1656 $(filter.selector).on('click', function() { 1657 const $btn = $(this); 1658 trackFilterPush({ 1659 filter_source: 'popup', 1660 filter_type: filter.type, 1661 filter_name: $btn.text().trim(), 1662 action: $btn.hasClass('active') ? 'select' : 'deselect' 1663 }); 1664 }); 1665 }); 1666 1667 $(document).on('click', '.active-filter-remove', function() { 1668 const $btn = $(this); 1669 trackFilterPush({ 1670 filter_source: 'quitar_filtro', 1671 filter_type: $btn.data('type'), 1672 filter_name: $btn.closest('.active-filter-tag').text().trim(), 1673 action: 'remove' 1674 }); 1675 }); 1676 1677 $('#btnFilterAll').on('click', function() { 1678 trackFilterPush({ 1679 filter_source: 'limpiar_filtros', 1680 filter_type: 'category', 1681 filter_name: $(this).text().trim(), 1682 action: 'clear' 1683 }); 1684 }); 1685 1686 $('.btn-clear-filters').on('click', function() { 1687 trackFilterPush({ 1688 filter_source: 'limpiar_filtros', 1689 filter_name: $(this).text().trim(), 1690 action: 'clear' 1691 }); 1692 }); 1693 1694 $('#btnToggleFilter, #btnControlFilter').on('click', function() { 1695 trackFilterPush({ 1696 filter_source: 'boton_filtros', 1697 filter_name: $(this).text().trim(), 1698 action: $('.filters-popup').hasClass('show') ? 'open' : 'close' 1699 }); 1700 }); 1701 1702 $(document).on('click', '.btn-filter-close-popup', function() { 1703 trackFilterPush({ filter_source: 'cerrar_popup', filter_name: 'Cerrar', action: 'close' }); 1704 }); 1705 1706 document.addEventListener('click', function(e) { 1707 if (e.target.classList.contains('main-bg-overlay') && $('.filters-popup').hasClass('show')) { 1708 trackFilterPush({ filter_source: 'cerrar_popup', filter_name: 'Overlay', action: 'close' }); 1709 } 1710 }, true); 1711 1712 $(document).on('shown.bs.dropdown', function(e) { 1713 const toggleId = $(e.target).find('[data-toggle="dropdown"]').first().attr('id'); 1714 1715 if (toggleId === 'dd-orderby' || toggleId === 'dd-orderbyMobile') { 1716 trackFilterPush({ 1717 filter_source: 'boton_ordenar', 1718 filter_name: $('#' + toggleId).text().trim(), 1719 action: 'open' 1720 }); 1721 } 1722 }); 1723 1724 $('.sorting-input').on('change', function() { 1725 trackFilterPush({ 1726 filter_source: 'opcion_orden', 1727 filter_type: 'sort', 1728 filter_name: $('label[for="' + this.id + '"]').text().trim(), 1729 sort_value: $(this).val(), 1730 action: 'select' 1731 }); 1732 }); 1733 1734 $('.btn-control-left, .btn-control-right').on('click', function() { 1735 trackFilterPush({ 1736 filter_source: 'flecha_carrusel', 1737 action: $(this).hasClass('btn-control-left') ? 'left' : 'right' 1738 }); 1739 }); 1740}); 1741</script>
1741 1742 1743 <!-- START Webpages Footer Scripts --> 1744 1745 <!-- END Webpages Footer Scripts --> 1746 </body> 1747</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.