{"id":17840,"date":"2026-04-16T06:32:51","date_gmt":"2026-04-16T06:32:51","guid":{"rendered":"https:\/\/www.visitatavernes.es\/?page_id=17840"},"modified":"2026-04-16T12:34:18","modified_gmt":"2026-04-16T12:34:18","slug":"configurador-de-viatge-de-tavernes","status":"publish","type":"page","link":"https:\/\/www.visitatavernes.es\/ca\/configurador-de-viatge-de-tavernes\/","title":{"rendered":"Configurador de viatge a Tavernes de la Valldigna"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"17840\" class=\"elementor elementor-17840 elementor-17841\" wpc-filter-elementor-widget=\"1\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-32a435f elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"32a435f\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2d5cdae\" data-id=\"2d5cdae\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f100b5d elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"f100b5d\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<!DOCTYPE html>\r\n<html lang=\"ca\">\r\n<head>\r\n<meta charset=\"utf-8\"\/>\r\n<meta name=\"viewport\" content=\"width=1920, initial-scale=0.25, maximum-scale=5, user-scalable=yes\"\/>\r\n<title>Planificador de viatge de Tavernes de la Valldigna | Visit Tavernes<\/title>\r\n<meta content=\"Organitza el teu itinerari a Tavernes de la Valldigna per dies i franges hor\u00e0ries amb activitats, restaurants, allotjaments, esdeveniments i pressupost orientatiu.\" name=\"description\"\/>\r\n<meta content=\"Tavernes de la Valldigna, planificador de viatge, qu\u00e8 fer a Tavernes, restaurants Tavernes, rutes Tavernes, platges Tavernes, allotjament Tavernes\" name=\"keywords\"\/>\r\n<meta content=\"index,follow\" name=\"robots\"\/>\r\n<meta content=\"Planificador de viatge de Tavernes de la Valldigna\" property=\"og:title\"\/>\r\n<meta content=\"Organitza el teu itinerari a Tavernes de la Valldigna per dies i per franges hor\u00e0ries amb activitats, patrimoni, natura, restauraci\u00f3, oci, esdeveniments i allotjaments.\" property=\"og:description\"\/>\r\n<meta content=\"website\" property=\"og:type\"\/>\r\n\r\n<link\r\n  rel=\"stylesheet\"\r\n  href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\"\r\n  integrity=\"sha256-p4NxAoJBhIIN+hmNHrzRCf9tD\/miZyoHS5obTRR9BMY=\"\r\n  crossorigin=\"\"\r\n\/>\r\n\r\n<style>\r\n:root{\r\n  --bg:#eef3f8;\r\n  --panel:#fff;\r\n  --line:#d8e3ef;\r\n  --line2:#bfd1e3;\r\n  --text:#12385f;\r\n  --muted:#5f7892;\r\n  --brand:#0d6fb8;\r\n  --brand2:#0a5a96;\r\n  --soft:#f7fbff;\r\n  --accent:#f08b2d;\r\n  --ok:#2d8b57;\r\n  --shadow:0 10px 28px rgba(17,58,98,.08);\r\n  --radius:18px;\r\n}\r\n\r\n*{box-sizing:border-box}\r\n\r\nhtml,body{\r\n  margin:0;\r\n  padding:0;\r\n  width:100%;\r\n  min-height:100%;\r\n  overflow:auto;\r\n}\r\n\r\nbody{\r\n  font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;\r\n  background:transparent !important;\r\n  color:var(--text);\r\n}\r\n\r\n.elementor-widget-html,\r\n.elementor-widget-container,\r\n.elementor-shortcode,\r\n.elementor{\r\n  width:100%;\r\n  max-width:none;\r\n  overflow:visible;\r\n}\r\n\r\n.app-viewport{\r\n  width:100%;\r\n  min-height:100vh;\r\n  overflow:auto;\r\n  display:flex;\r\n  justify-content:center;\r\n  align-items:flex-start;\r\n  -webkit-overflow-scrolling:touch;\r\n  overscroll-behavior:contain;\r\n  background:transparent;\r\n}\r\n\r\n.app-scale-wrap{\r\n  position:relative;\r\n  flex:0 0 auto;\r\n  overflow:hidden;\r\n}\r\n\r\n.app-scale{\r\n  position:relative;\r\n  transform-origin:top left;\r\n  will-change:transform;\r\n}\r\n\r\n.app-shell{\r\n  width:1920px;\r\n  min-width:1920px;\r\n  max-width:1920px;\r\n  margin:0;\r\n  background:linear-gradient(180deg,#f6f9fc 0%, #eef3f8 100%);\r\n  border:1px solid var(--line);\r\n  border-radius:24px;\r\n  padding:18px;\r\n  overflow:hidden;\r\n  isolation:isolate;\r\n}\r\n\r\n.app{\r\n  display:grid;\r\n  grid-template-columns:260px 900px 340px 420px;\r\n  gap:16px;\r\n  width:1920px;\r\n  min-height:calc(100vh - 60px);\r\n  height:calc(100vh - 60px);\r\n  align-items:stretch;\r\n}\r\n\r\n.panel{\r\n  background:var(--panel);\r\n  border:1px solid var(--line);\r\n  border-radius:var(--radius);\r\n  box-shadow:var(--shadow);\r\n}\r\n\r\n.left,.center,.right,.map-col{\r\n  min-height:0;\r\n}\r\n\r\n.left{\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:16px;\r\n  min-height:0;\r\n  overflow-y:auto;\r\n  overflow-x:hidden;\r\n  padding-right:8px;\r\n  scrollbar-gutter:stable;\r\n}\r\n\r\n.center{\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:16px;\r\n  min-width:0;\r\n  min-height:0;\r\n  overflow:hidden;\r\n}\r\n\r\n.right{\r\n  display:flex;\r\n  flex-direction:column;\r\n  min-width:0;\r\n  min-height:0;\r\n  overflow:hidden;\r\n}\r\n\r\n.map-col{\r\n  display:flex;\r\n  flex-direction:column;\r\n  min-width:0;\r\n  min-height:0;\r\n  overflow:hidden;\r\n}\r\n\r\n.left::-webkit-scrollbar,\r\n.center-scroll::-webkit-scrollbar,\r\n.catalog-results::-webkit-scrollbar,\r\n.map-side-scroll::-webkit-scrollbar,\r\nbody::-webkit-scrollbar{\r\n  width:16px;\r\n  height:14px;\r\n}\r\n\r\n.left::-webkit-scrollbar-track,\r\n.center-scroll::-webkit-scrollbar-track,\r\n.catalog-results::-webkit-scrollbar-track,\r\n.map-side-scroll::-webkit-scrollbar-track,\r\nbody::-webkit-scrollbar-track{\r\n  background:#e7eef6;\r\n  border-radius:999px;\r\n}\r\n\r\n.left::-webkit-scrollbar-thumb,\r\n.center-scroll::-webkit-scrollbar-thumb,\r\n.catalog-results::-webkit-scrollbar-thumb,\r\n.map-side-scroll::-webkit-scrollbar-thumb,\r\nbody::-webkit-scrollbar-thumb{\r\n  background:linear-gradient(180deg,#9ab1c7,#6f88a3);\r\n  border-radius:999px;\r\n  border:3px solid #e7eef6;\r\n}\r\n\r\nbody,\r\n.left,\r\n.center-scroll,\r\n.catalog-results,\r\n.map-side-scroll{\r\n  scrollbar-width:auto;\r\n  scrollbar-color:#7b96b3 #e7eef6;\r\n}\r\n\r\n.box{padding:16px}\r\n\r\n.brand{\r\n  display:flex;\r\n  gap:12px;\r\n  align-items:center;\r\n  padding:16px 18px;\r\n  background:linear-gradient(135deg,#eef7ff,#ffffff);\r\n  border:1px solid var(--line);\r\n  border-radius:18px;\r\n}\r\n\r\n.brand-wordmark{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:14px;\r\n  width:100%;\r\n}\r\n\r\n.brand-logo{\r\n  width:54px;\r\n  height:auto;\r\n  display:block;\r\n  flex:0 0 auto;\r\n}\r\n\r\n.brand-kicker{\r\n  font-size:13px;\r\n  font-weight:800;\r\n  letter-spacing:.12em;\r\n  color:var(--brand);\r\n}\r\n\r\n.brand-main{\r\n  font-size:23px;\r\n  line-height:1.05;\r\n  font-weight:800;\r\n  color:var(--text);\r\n}\r\n\r\n.brand-subline{\r\n  font-size:13px;\r\n  color:var(--muted);\r\n  margin-top:4px;\r\n}\r\n\r\n.stack{display:grid;gap:12px}\r\n.field label{display:block;font-size:13px;color:var(--muted);margin-bottom:6px}\r\ninput,select,textarea,button{font:inherit}\r\n\r\n.field input,\r\n.field select,\r\n.field textarea{\r\n  width:100%;\r\n  padding:11px 12px;\r\n  border:1px solid var(--line2);\r\n  border-radius:12px;\r\n  background:#fff;\r\n  color:var(--text);\r\n}\r\n\r\n.trip-form{\r\n  display:grid;\r\n  grid-template-columns:repeat(2,minmax(160px,1fr));\r\n  gap:14px;\r\n  align-items:start;\r\n}\r\n\r\n.trip-form .field textarea{\r\n  min-height:76px;\r\n  resize:vertical;\r\n}\r\n\r\n.hero-grid{\r\n  display:grid;\r\n  grid-template-columns:1fr 1.05fr;\r\n  gap:18px;\r\n  align-items:start;\r\n}\r\n\r\n.hero-title h2{\r\n  font-size:26px;\r\n  line-height:1.08;\r\n  margin:0 0 10px;\r\n}\r\n\r\n.hero-title p{\r\n  margin:0;\r\n  color:var(--muted);\r\n  line-height:1.6;\r\n}\r\n\r\n.prefs-box{\r\n  margin-top:14px;\r\n  padding:10px 12px;\r\n  border:1px solid var(--line);\r\n  border-radius:14px;\r\n  background:var(--soft);\r\n  color:var(--muted);\r\n  font-size:14px;\r\n  line-height:1.5;\r\n}\r\n\r\n.btns{\r\n  display:flex;\r\n  gap:10px;\r\n  flex-wrap:wrap;\r\n}\r\n\r\n.btn{\r\n  border:0;\r\n  background:var(--brand);\r\n  color:#fff;\r\n  padding:11px 14px;\r\n  border-radius:12px;\r\n  cursor:pointer;\r\n  font-weight:700;\r\n}\r\n\r\n.btn.alt{\r\n  background:#fff;\r\n  color:var(--text);\r\n  border:1px solid var(--line2);\r\n}\r\n\r\n.btn.orange{background:var(--accent)}\r\n.btn.small{padding:10px 12px;font-size:15px}\r\n\r\n.stats{\r\n  display:grid;\r\n  grid-template-columns:1fr 1fr;\r\n  gap:10px;\r\n}\r\n\r\n.stat{\r\n  background:var(--soft);\r\n  border:1px solid var(--line);\r\n  border-radius:14px;\r\n  padding:12px;\r\n}\r\n\r\n.stat .num{\r\n  font-size:25px;\r\n  font-weight:900;\r\n}\r\n\r\n.stat .lbl{\r\n  font-size:13px;\r\n  color:var(--muted);\r\n}\r\n\r\n.budget-line{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  gap:10px;\r\n  padding:9px 0;\r\n  border-bottom:1px dashed var(--line);\r\n}\r\n\r\n.budget-total{\r\n  font-size:30px;\r\n  font-weight:900;\r\n  margin-top:12px;\r\n}\r\n\r\n.itinerary-panel,\r\n.catalog-panel{\r\n  display:flex;\r\n  flex-direction:column;\r\n  min-height:0;\r\n}\r\n\r\n.center-scroll{\r\n  flex:1;\r\n  min-height:0;\r\n  overflow-y:auto;\r\n  overflow-x:hidden;\r\n  padding:4px 12px 4px 2px;\r\n  scrollbar-gutter:stable both-edges;\r\n}\r\n\r\n.catalog-panel{\r\n  padding:0;\r\n  overflow:hidden;\r\n}\r\n\r\n.catalog-fixed{\r\n  padding:16px 16px 10px;\r\n  border-bottom:1px solid var(--line);\r\n  background:#fff;\r\n  flex:0 0 auto;\r\n}\r\n\r\n.catalog-results{\r\n  flex:1;\r\n  min-height:0;\r\n  overflow-y:auto;\r\n  overflow-x:hidden;\r\n  padding:12px 12px 16px;\r\n  scrollbar-gutter:stable;\r\n}\r\n\r\n.day-card{\r\n  padding:14px;\r\n  border:1px solid var(--line);\r\n  border-radius:16px;\r\n  background:#fff;\r\n  margin-bottom:14px;\r\n}\r\n\r\n.day-head{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  align-items:center;\r\n  gap:12px;\r\n  margin-bottom:12px;\r\n}\r\n\r\n.day-head h3{\r\n  margin:0;\r\n  font-size:23px;\r\n}\r\n\r\n.day-date{\r\n  font-size:13px;\r\n  color:var(--muted);\r\n  font-weight:700;\r\n  background:var(--soft);\r\n  padding:6px 10px;\r\n  border-radius:999px;\r\n  border:1px solid var(--line);\r\n}\r\n\r\n.slot-grid{\r\n  display:grid;\r\n  grid-template-columns:repeat(4,minmax(160px,1fr));\r\n  gap:12px;\r\n}\r\n\r\n.slot{\r\n  border:1px solid var(--line);\r\n  border-radius:14px;\r\n  background:var(--soft);\r\n  padding:12px;\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:10px;\r\n  min-height:280px;\r\n}\r\n\r\n.slot h4{\r\n  margin:0;\r\n  font-size:19px;\r\n}\r\n\r\n.slot-meta{\r\n  font-size:11px;\r\n  color:var(--muted);\r\n}\r\n\r\n.slot-empty{\r\n  border:1px dashed var(--line2);\r\n  border-radius:12px;\r\n  padding:12px;\r\n  color:var(--muted);\r\n  font-size:14px;\r\n  background:#fff;\r\n}\r\n\r\n.plan-item{\r\n  background:#fff;\r\n  border:1px solid var(--line);\r\n  border-radius:14px;\r\n  padding:10px;\r\n  display:grid;\r\n  gap:8px;\r\n}\r\n\r\n.plan-top{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  gap:8px;\r\n  align-items:flex-start;\r\n}\r\n\r\n.plan-title{\r\n  font-weight:800;\r\n  line-height:1.25;\r\n}\r\n\r\n.price-pill{\r\n  font-size:11px;\r\n  font-weight:800;\r\n  background:#edf7ef;\r\n  color:var(--ok);\r\n  padding:5px 8px;\r\n  border-radius:999px;\r\n  border:1px solid #bde0c7;\r\n  white-space:nowrap;\r\n}\r\n\r\n.tags{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:6px;\r\n}\r\n\r\n.tag{\r\n  font-size:11px;\r\n  padding:4px 8px;\r\n  border-radius:999px;\r\n  border:1px solid var(--line);\r\n  background:#fff;\r\n  color:var(--brand2);\r\n}\r\n\r\n.tag.type-restaurante{background:#fff5eb;border-color:#ffd3a8;color:#b86400}\r\n.tag.type-alojamiento{background:#eef9ef;border-color:#c8ebd0;color:#2d8b57}\r\n.tag.type-evento{background:#fff0f0;border-color:#f0c7c7;color:#b24a4a}\r\n.tag.type-ocio{background:#f7f0ff;border-color:#dccbff;color:#7546c8}\r\n.tag.reco{background:#eaf5ff;border-color:#bcd9f4;color:#0d6fb8;font-weight:800}\r\n.tag.planned{background:#fff7e8;border-color:#ffd28a;color:#8f5b00;font-weight:800}\r\n\r\n.controls-inline{\r\n  display:flex;\r\n  gap:6px;\r\n  align-items:center;\r\n  flex-wrap:wrap;\r\n}\r\n\r\n.small-select{\r\n  padding:8px 10px;\r\n  border:1px solid var(--line2);\r\n  border-radius:10px;\r\n  background:#fff;\r\n  color:var(--text);\r\n  min-width:75px;\r\n}\r\n\r\n.tiny-btn{\r\n  padding:8px 10px;\r\n  border-radius:10px;\r\n  border:1px solid var(--line2);\r\n  background:#fff;\r\n  cursor:pointer;\r\n}\r\n\r\n.tiny-btn.primary{\r\n  background:var(--brand);\r\n  color:#fff;\r\n  border-color:var(--brand);\r\n}\r\n\r\n.catalog-head h3{\r\n  margin:0 0 8px;\r\n  font-size:28px;\r\n  line-height:1.05;\r\n}\r\n\r\n.catalog-head p{\r\n  margin:0 0 14px;\r\n  color:var(--muted);\r\n  font-size:15px;\r\n  line-height:1.6;\r\n  max-width:42ch;\r\n}\r\n\r\n.catalog-count{\r\n  display:inline-flex;\r\n  margin-top:10px;\r\n  font-size:13px;\r\n  font-weight:800;\r\n  padding:6px 10px;\r\n  border-radius:999px;\r\n  background:var(--soft);\r\n  border:1px solid var(--line);\r\n}\r\n\r\n.filters{\r\n  display:grid;\r\n  grid-template-columns:repeat(2,minmax(0,1fr));\r\n  gap:10px;\r\n  margin-top:12px;\r\n}\r\n\r\n.search{grid-column:1\/-1}\r\n.catalog-grid{display:grid;gap:12px}\r\n\r\n.catalog-card{\r\n  background:#fff;\r\n  border:1px solid var(--line);\r\n  border-radius:16px;\r\n  padding:12px;\r\n  display:grid;\r\n  gap:8px;\r\n}\r\n\r\n.catalog-top{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  gap:10px;\r\n  align-items:flex-start;\r\n}\r\n\r\n.catalog-top h4{\r\n  margin:0;\r\n  font-size:19px;\r\n  line-height:1.25;\r\n}\r\n\r\n.score{\r\n  font-size:13px;\r\n  font-weight:900;\r\n  background:#f1f7ff;\r\n  color:var(--brand);\r\n  padding:6px 8px;\r\n  border-radius:999px;\r\n  border:1px solid #cfe2f5;\r\n  white-space:nowrap;\r\n}\r\n\r\n.catalog-card p{\r\n  margin:0;\r\n  color:var(--muted);\r\n  line-height:1.5;\r\n  font-size:15px;\r\n}\r\n\r\n.help{\r\n  font-size:13px;\r\n  color:var(--muted);\r\n}\r\n\r\n.empty{\r\n  padding:14px;\r\n  border:1px dashed var(--line2);\r\n  border-radius:14px;\r\n  background:var(--soft);\r\n  color:var(--muted);\r\n  font-size:15px;\r\n}\r\n\r\n.icon-badge{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  width:28px;\r\n  height:28px;\r\n  border-radius:999px;\r\n  background:#eef7ff;\r\n  border:1px solid #cfe2f5;\r\n  font-size:16px;\r\n  flex:0 0 auto;\r\n}\r\n\r\n.title-row{\r\n  display:flex;\r\n  align-items:flex-start;\r\n  gap:8px;\r\n}\r\n\r\n.catalog-link,\r\n.plan-link,\r\n.map-focus-link{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  gap:6px;\r\n  margin-top:2px;\r\n  font-size:13px;\r\n  font-weight:700;\r\n  color:var(--brand2);\r\n  text-decoration:none;\r\n  cursor:pointer;\r\n}\r\n\r\n.catalog-link:hover,\r\n.plan-link:hover,\r\n.map-focus-link:hover{\r\n  text-decoration:underline;\r\n}\r\n\r\n.catalog-card .help-strong{\r\n  color:var(--text);\r\n  font-weight:600;\r\n}\r\n\r\n.map-panel{\r\n  display:flex;\r\n  flex-direction:column;\r\n  min-height:0;\r\n  overflow:hidden;\r\n  padding:0;\r\n}\r\n\r\n.map-header{\r\n  padding:14px 14px 10px;\r\n  border-bottom:1px solid var(--line);\r\n  background:#fff;\r\n}\r\n\r\n.map-header h3{\r\n  margin:0 0 6px;\r\n  font-size:23px;\r\n}\r\n\r\n.map-header p{\r\n  margin:0;\r\n  font-size:14px;\r\n  color:var(--muted);\r\n  line-height:1.5;\r\n}\r\n\r\n.map-stats{\r\n  display:flex;\r\n  gap:8px;\r\n  flex-wrap:wrap;\r\n  margin-top:10px;\r\n}\r\n\r\n.map-pill{\r\n  font-size:11px;\r\n  font-weight:800;\r\n  padding:5px 8px;\r\n  border-radius:999px;\r\n  background:var(--soft);\r\n  border:1px solid var(--line);\r\n  color:var(--brand2);\r\n}\r\n\r\n.map-controls{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:10px;\r\n  flex-wrap:wrap;\r\n  margin-top:10px;\r\n}\r\n\r\n.map-toggle{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  gap:6px;\r\n  font-size:13px;\r\n  color:var(--text);\r\n  font-weight:700;\r\n}\r\n\r\n#travelMap{\r\n  flex:1;\r\n  min-height:420px;\r\n  width:100%;\r\n}\r\n\r\n.map-side-scroll{\r\n  max-height:220px;\r\n  overflow:auto;\r\n  border-top:1px solid var(--line);\r\n  padding:10px 12px 12px;\r\n  background:#fbfdff;\r\n}\r\n\r\n.map-list{\r\n  display:grid;\r\n  grid-template-columns:repeat(2,minmax(0,1fr));\r\n  gap:10px;\r\n}\r\n\r\n.map-list-item{\r\n  padding:10px;\r\n  border:1px solid var(--line);\r\n  border-radius:12px;\r\n  background:#fff;\r\n  display:grid;\r\n  gap:4px;\r\n  align-content:start;\r\n}\r\n\r\n.map-list-item strong{\r\n  color:var(--text);\r\n  font-size:14px;\r\n}\r\n\r\n.map-list-item .meta{\r\n  font-size:13px;\r\n  color:var(--muted);\r\n  line-height:1.4;\r\n}\r\n\r\n.leaflet-popup-content{\r\n  font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;\r\n  color:#12385f;\r\n  line-height:1.45;\r\n}\r\n\r\n.leaflet-popup-content strong{\r\n  display:block;\r\n  margin-bottom:4px;\r\n}\r\n\r\n\/* === Layout actualizado === *\/\r\n.app{\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:16px;\r\n  width:1920px;\r\n  min-height:auto;\r\n  height:auto;\r\n  align-items:stretch;\r\n}\r\n\r\n.top-layout{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1.05fr) minmax(0,1.95fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.hero-card,\r\n.controls-card{\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:16px;\r\n}\r\n\r\n.hero-split{\r\n  display:grid;\r\n  grid-template-columns:220px minmax(0,1fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.brand{\r\n  min-height:100%;\r\n}\r\n\r\n.trip-tools-row{\r\n  display:grid;\r\n  grid-template-columns:repeat(3,minmax(0,1fr)) auto;\r\n  gap:14px;\r\n  align-items:end;\r\n}\r\n\r\n.day-actions{\r\n  display:flex;\r\n  gap:10px;\r\n  flex-wrap:wrap;\r\n}\r\n\r\n.trip-form{\r\n  grid-template-columns:repeat(4,minmax(0,1fr));\r\n}\r\n\r\n.trip-form .field:last-child{\r\n  grid-column:span 2;\r\n}\r\n\r\n.top-actions{\r\n  display:flex;\r\n  gap:10px;\r\n  flex-wrap:wrap;\r\n}\r\n\r\n.stats-budget-row{\r\n  display:grid;\r\n  grid-template-columns:320px minmax(0,1fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.stats-card,\r\n.budget-card{\r\n  padding:16px;\r\n  border:1px solid var(--line);\r\n  border-radius:16px;\r\n  background:var(--soft);\r\n}\r\n\r\n.content-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1.6fr) 430px;\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.content-left,\r\n.content-right{\r\n  min-width:0;\r\n}\r\n\r\n.itinerary-panel{\r\n  min-height:760px;\r\n}\r\n\r\n.center-scroll{\r\n  max-height:920px;\r\n}\r\n\r\n.catalog-panel{\r\n  min-height:760px;\r\n}\r\n\r\n.catalog-results{\r\n  max-height:920px;\r\n}\r\n\r\n.map-bottom{\r\n  overflow:hidden;\r\n}\r\n\r\n.map-bottom-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr) 330px;\r\n  min-height:620px;\r\n}\r\n\r\n#travelMap{\r\n  width:100%;\r\n  height:620px;\r\n  min-height:620px;\r\n}\r\n\r\n.map-side-scroll{\r\n  max-height:none;\r\n  border-top:0;\r\n  border-left:1px solid var(--line);\r\n  padding:12px;\r\n  background:#fbfdff;\r\n}\r\n\r\n.catalog-top h4{\r\n  margin:0;\r\n}\r\n\r\n@media (max-width: 1200px){\r\n  .trip-form{\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n\r\n  .trip-form .field:last-child{\r\n    grid-column:1 \/ -1;\r\n  }\r\n}\r\n\r\n\r\n\/* === Layout pantalla completa v2 === *\/\r\n.app-viewport{\r\n  width:100%;\r\n  min-height:100vh;\r\n  overflow:visible;\r\n  display:block;\r\n  background:transparent;\r\n}\r\n\r\n.app-scale-wrap{\r\n  width:100% !important;\r\n  height:auto !important;\r\n  overflow:visible;\r\n}\r\n\r\n.app-scale{\r\n  width:100% !important;\r\n  height:auto !important;\r\n  transform:none !important;\r\n}\r\n\r\n.app-shell{\r\n  width:100%;\r\n  min-width:0;\r\n  max-width:none;\r\n  border-radius:0;\r\n  border-left:0;\r\n  border-right:0;\r\n  padding:16px;\r\n}\r\n\r\n.app{\r\n  width:100%;\r\n  min-width:0;\r\n}\r\n\r\n.top-layout{\r\n  display:grid;\r\n  grid-template-columns:420px minmax(0,1fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.content-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr);\r\n  gap:16px;\r\n}\r\n\r\n.content-right{\r\n  order:-1;\r\n}\r\n\r\n.catalog-panel{\r\n  min-height:auto;\r\n}\r\n\r\n.catalog-fixed{\r\n  border-bottom:0;\r\n  padding:16px;\r\n}\r\n\r\n.catalog-head{\r\n  display:grid;\r\n  grid-template-columns:320px minmax(0,1fr);\r\n  gap:20px;\r\n  align-items:start;\r\n}\r\n\r\n.catalog-head > div:first-child{\r\n  min-width:0;\r\n}\r\n\r\n.filters{\r\n  display:grid;\r\n  grid-template-columns:repeat(7,minmax(120px,1fr));\r\n  gap:10px;\r\n  margin-top:0;\r\n  align-items:end;\r\n}\r\n\r\n.filters .search{\r\n  grid-column:span 1;\r\n}\r\n\r\n.catalog-results{\r\n  max-height:none;\r\n  padding:0 16px 16px;\r\n}\r\n\r\n.catalog-grid{\r\n  grid-template-columns:repeat(3,minmax(0,1fr));\r\n  align-items:start;\r\n}\r\n\r\n.itinerary-panel{\r\n  min-height:0;\r\n}\r\n\r\n.center-scroll{\r\n  max-height:none;\r\n  overflow:visible;\r\n  padding-right:0;\r\n}\r\n\r\n.stats-budget-row{\r\n  grid-template-columns:220px minmax(0,1fr);\r\n}\r\n\r\n.budget-card{\r\n  order:3;\r\n}\r\n\r\n.bottom-budget{\r\n  margin-top:16px;\r\n}\r\n\r\n.map-bottom{\r\n  margin-top:16px;\r\n}\r\n\r\n.map-bottom-grid{\r\n  grid-template-columns:minmax(0,1fr) 360px;\r\n  min-height:680px;\r\n}\r\n\r\n#travelMap{\r\n  height:680px;\r\n  min-height:680px;\r\n  display:block;\r\n}\r\n\r\n@media (max-width: 1600px){\r\n  .catalog-grid{\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n  .filters{\r\n    grid-template-columns:repeat(4,minmax(120px,1fr));\r\n  }\r\n}\r\n\r\n@media (max-width: 1200px){\r\n  .top-layout,\r\n  .catalog-head,\r\n  .stats-budget-row,\r\n  .map-bottom-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n  .filters{\r\n    grid-template-columns:repeat(2,minmax(120px,1fr));\r\n  }\r\n\r\n  .catalog-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n\/* === Ajuste disposici\u00f3n final === *\/\r\n.top-layout{\r\n  display:block;\r\n}\r\n\r\n.hero-card,\r\n.controls-card{\r\n  display:block;\r\n}\r\n\r\n.unified-top{\r\n  display:grid;\r\n  grid-template-columns:420px minmax(0,1fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.unified-top-right{\r\n  display:grid;\r\n  gap:16px;\r\n}\r\n\r\n.unified-top .top-actions{\r\n  margin-top:12px;\r\n}\r\n\r\n.content-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1.15fr) minmax(520px,0.85fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.itinerary-panel{\r\n  min-height:720px;\r\n}\r\n\r\n.catalog-panel{\r\n  min-height:720px;\r\n  overflow:hidden;\r\n}\r\n\r\n.catalog-fixed{\r\n  padding:16px;\r\n  border-bottom:1px solid var(--line);\r\n}\r\n\r\n.catalog-head{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:14px;\r\n}\r\n\r\n.filters{\r\n  display:grid;\r\n  grid-template-columns:repeat(3,minmax(0,1fr));\r\n  gap:10px;\r\n  align-items:end;\r\n}\r\n\r\n.filters .search{\r\n  grid-column:1 \/ -1;\r\n}\r\n\r\n.catalog-results{\r\n  max-height:760px;\r\n  overflow-y:auto;\r\n  overflow-x:hidden;\r\n  padding:16px;\r\n  scrollbar-gutter:stable;\r\n}\r\n\r\n.catalog-grid{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:12px;\r\n}\r\n\r\n.center-scroll{\r\n  max-height:760px;\r\n  overflow-y:auto;\r\n  overflow-x:hidden;\r\n  padding-right:8px;\r\n  scrollbar-gutter:stable;\r\n}\r\n\r\n.map-bottom-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr) 320px;\r\n  gap:0;\r\n  min-height:720px;\r\n}\r\n\r\n#travelMap{\r\n  height:720px;\r\n  min-height:720px;\r\n}\r\n\r\n.map-side-scroll{\r\n  max-height:720px;\r\n  overflow-y:auto;\r\n  overflow-x:hidden;\r\n  border-left:1px solid var(--line);\r\n  border-top:0;\r\n  padding:12px;\r\n  background:#fbfdff;\r\n  scrollbar-gutter:stable;\r\n}\r\n\r\n.bottom-budget{\r\n  margin-top:16px;\r\n}\r\n\r\n@media (max-width: 1400px){\r\n  .content-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n  .filters{\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n}\r\n\r\n@media (max-width: 1100px){\r\n  .unified-top{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n\/* === Ajustes finos solicitados === *\/\r\n.unified-top{\r\n  grid-template-columns:1fr;\r\n}\r\n\r\n.unified-top > div:first-child{\r\n  display:grid;\r\n  grid-template-columns:220px minmax(0,1fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.hero-split{\r\n  grid-template-columns:1fr;\r\n  gap:12px;\r\n}\r\n\r\n.hero-split > div:last-child{\r\n  min-width:0;\r\n}\r\n\r\n.unified-top-right{\r\n  display:grid;\r\n  grid-template-columns:1fr auto;\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.trip-tools-row{\r\n  grid-column:1 \/ -1;\r\n}\r\n\r\n.trip-form{\r\n  grid-column:1 \/ -1;\r\n}\r\n\r\n.stats-budget-row{\r\n  display:block;\r\n}\r\n\r\n.stats-card{\r\n  display:none;\r\n}\r\n\r\n.bottom-budget{\r\n  margin-top:16px;\r\n}\r\n\r\n.bottom-budget .stats{\r\n  margin-bottom:16px;\r\n}\r\n\r\n.content-grid{\r\n  grid-template-columns:minmax(0,1fr) minmax(0,1fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.catalog-panel,\r\n.itinerary-panel{\r\n  min-height:980px;\r\n  height:980px;\r\n}\r\n\r\n.catalog-results,\r\n.center-scroll{\r\n  height:calc(980px - 88px);\r\n  max-height:calc(980px - 88px);\r\n  overflow-y:auto;\r\n  overflow-x:hidden;\r\n}\r\n\r\n.catalog-grid{\r\n  grid-template-columns:1fr;\r\n}\r\n\r\n.catalog-card{\r\n  display:grid;\r\n  gap:12px;\r\n  min-height:190px;\r\n  padding:16px;\r\n}\r\n\r\n.slot-grid{\r\n  display:grid;\r\n  grid-template-columns:repeat(4,minmax(0,1fr));\r\n  gap:12px;\r\n}\r\n\r\n.slot{\r\n  min-height:220px;\r\n}\r\n\r\n.quick-slot-actions{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:6px;\r\n  margin-top:6px;\r\n}\r\n\r\n.quick-add-btn{\r\n  padding:7px 10px;\r\n  border-radius:999px;\r\n  border:1px solid var(--line2);\r\n  background:#fff;\r\n  color:var(--text);\r\n  cursor:pointer;\r\n  font-size:13px;\r\n  font-weight:700;\r\n}\r\n\r\n.quick-add-btn:hover{\r\n  background:var(--soft);\r\n}\r\n\r\n.day-card{\r\n  margin-bottom:10px;\r\n}\r\n\r\n.map-bottom-grid{\r\n  grid-template-columns:minmax(0,0.82fr) minmax(0,1.18fr);\r\n}\r\n\r\n@media (max-width: 1400px){\r\n  .content-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n\/* === Ajuste exclusivo franja superior === *\/\r\n.top-banner{\r\n  width:100%;\r\n  min-height:118px;\r\n  border:1px solid var(--line);\r\n  border-radius:14px;\r\n  background:linear-gradient(135deg,#eef7ff,#ffffff);\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:flex-start;\r\n  padding:18px 24px;\r\n}\r\n\r\n.top-banner .brand-wordmark{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:14px;\r\n  width:auto;\r\n}\r\n\r\n.top-banner .brand-logo{\r\n  width:42px;\r\n  max-width:100%;\r\n  height:auto;\r\n  display:block;\r\n  flex:0 0 auto;\r\n  object-fit:contain;\r\n}\r\n\r\n.top-banner .brand-kicker{\r\n  font-size:13px;\r\n  font-weight:800;\r\n  letter-spacing:.12em;\r\n  color:var(--brand);\r\n}\r\n\r\n.top-banner .brand-main{\r\n  font-size:23px;\r\n  line-height:1.05;\r\n  font-weight:800;\r\n  color:var(--text);\r\n}\r\n\r\n.top-banner .brand-subline{\r\n  font-size:13px;\r\n  color:var(--muted);\r\n  margin-top:4px;\r\n}\r\n\r\n\r\n\/* === Superior limpio === *\/\r\n.unified-top-clean{\r\n  display:grid;\r\n  grid-template-columns:260px minmax(0,1fr);\r\n  gap:18px;\r\n  align-items:start;\r\n}\r\n\r\n.top-clean-main{\r\n  display:contents;\r\n}\r\n\r\n.top-clean-left{\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:16px;\r\n}\r\n\r\n.unified-top-clean .top-banner{\r\n  min-height:108px;\r\n}\r\n\r\n.unified-top-clean .trip-tools-row{\r\n  grid-column:1 \/ -1;\r\n  display:grid;\r\n  grid-template-columns:1fr 1fr 1fr auto;\r\n  gap:10px;\r\n  align-items:end;\r\n}\r\n\r\n@media (max-width: 1200px){\r\n  .unified-top-clean{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n  .unified-top-clean .trip-tools-row{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n.catalog-extra-filters{\r\n  display:grid;\r\n  grid-template-columns:repeat(3,minmax(0,1fr));\r\n  gap:10px;\r\n  margin-bottom:10px;\r\n}\r\n\r\n@media (max-width: 1100px){\r\n  .catalog-extra-filters{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n@media (max-width: 900px){\r\n  .map-bottom-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n  .map-list{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n\r\n\r\n\/* === Pressupost en dos bloques laterales === *\/\r\n.bottom-budget{\r\n  display:block;\r\n}\r\n\r\n.budget-two-cols{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr) 260px;\r\n  gap:16px;\r\n  align-items:stretch;\r\n}\r\n\r\n.budget-main-col,\r\n.budget-side-col{\r\n  border:1px solid var(--line);\r\n  background:var(--soft);\r\n  border-radius:16px;\r\n  padding:14px;\r\n  height:100%;\r\n}\r\n\r\n.budget-main-col{\r\n  display:flex;\r\n  flex-direction:column;\r\n}\r\n\r\n.budget-side-col{\r\n  display:flex;\r\n}\r\n\r\n.budget-total{\r\n  margin-top:auto;\r\n}\r\n\r\n.budget-mini-stats{\r\n  display:grid;\r\n  grid-template-columns:repeat(2,minmax(0,1fr));\r\n  grid-auto-rows:1fr;\r\n  gap:8px;\r\n  width:100%;\r\n  height:100%;\r\n}\r\n\r\n.mini-stat{\r\n  border:1px solid var(--line);\r\n  background:#fff;\r\n  border-radius:12px;\r\n  padding:10px;\r\n  display:flex;\r\n  flex-direction:column;\r\n  justify-content:center;\r\n  gap:4px;\r\n  min-height:0;\r\n}\r\n\r\n.mini-stat-label{\r\n  font-size:11px;\r\n  color:var(--muted);\r\n  line-height:1.1;\r\n}\r\n\r\n.mini-stat-value{\r\n  font-size:17px;\r\n  color:var(--text);\r\n  line-height:1.1;\r\n}\r\n\r\n@media (max-width: 900px){\r\n  .budget-two-cols{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n<\/style>\r\n<\/head>\r\n<body>\r\n<div class=\"app-viewport\" id=\"appViewport\">\r\n  <div class=\"app-scale-wrap\" id=\"appScaleWrap\">\r\n    <div class=\"app-scale\" id=\"appScale\">\r\n      <div class=\"app-shell\">\r\n        <div class=\"app\">\r\n        <section class=\"top-layout\">\r\n          <section class=\"panel box unified-top-clean\">\r\n            <div class=\"top-clean-main\">\r\n              <div class=\"top-clean-left\">\r\n                <div class=\"top-actions\">\r\n                  <button class=\"btn orange\" id=\"btnCopy\">Copiar resum<\/button>\r\n                  <button class=\"btn alt\" id=\"btnClear\">Buidar pla<\/button>\r\n                  <button class=\"btn alt small\" id=\"btnDownload\">Descarregar PDF<\/button>\r\n                <\/div>\r\n              <\/div>\r\n\r\n              <div class=\"top-banner\">\r\n                <div aria-label=\"Visita Tavernes\" class=\"brand-wordmark\">\r\n                  <img decoding=\"async\" class=\"brand-logo\" alt=\"Turisme Tavernes Valldigna\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG0AAAB5CAYAAAAzv6\/bAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAB6QSURBVHhe7Z15dFXV2f8\/+5xzp4TMJGBkUMAwo6ARiojFiChVRMQiJRYUGaTAkv5U2teWwYGlS1FwUVsHKtZXW8VlHUAREUQU0FJ4QUAFKWCAQELmm9zxnOf3x829DTcJhAyYRD5rnZVk73PPOXd\/z977eZ49RImIcJ4WhRadcJ7mz3nRWiCqRTWPTf2oSkWnNEuan2gikcOyBMuyEAQCJuLzIF4fBK1GFVApBWkp2F2u6KxmSbMRzRIh6PNhHcklePAI5r7DBPd+T3D\/D1hH8rAKipEKP8q0EGlc0YiLoe2W13B27dwiatuPKpppWVgVHqzc43j+\/gGev69BcguwLBMtaCGWBZYFVmXtA2jkpxUN1MXppO19D5vNEZ3dLDnnollWEMvrJ3j4KN5\/rMH\/6TbM7w5ilbrBHwwJdA4Rh4Frym0kLvk9uqZHZzdLzploYplYFR58u76j4q2P8K38GPKLINDITd1ZInEukv7+JDE3Dg31bS2AphfNEiy\/H39+PuVzn8Hz4SakrBzNah7ehroghbZb\/hd7pw7RWc2WJis5EcEKBvGXlFGy6HkKBk\/A++bHqBJPsxFMEEhNQouNjc5q1jRJ6YmEalfFxq8ovH4y7seXw7HCc95fnQkFGMkJ4LJHZzVrGl00UyxMdzkli5dTctsszJ370IJWo1t9jYFoCtolg71lWI1hGlU00zIJHDpC4ZQ\/4HliBZT5Q45wc8XQMLp2QumNWgxNTqM8rSBYgQD+nd9RMnkevnc+RdyeZlm7TsHQsV98YYuxGsM0jmiBIJ6juRRNeIDgph1ofhPV3AUDlK5jdL4QjZ+YaGYwSMX\/fUPxjfdiffcDmM24OYzGZkO7IDU6tdnTINGCloV317eUTpkH+3NaRO2qinI60BLjopObPfUWTUQwC4oou+9xZO\/BZmfOnxmF1iYW5XRGZzR76iWaiBAsLKZ4+gKC\/9rbvC3EWhEkPgb0ltWfUS\/RRDD9fspWvE3goy0oXyD6jBaDFhsD6uyL4MfmrJ9YTAvvlh1ULHwO5fVHZ7cs7EZL1OzsRLNECJZX4P7jsyhPA4ZRVOXQvq6BoaNsGspmQ9lsiF1HHAbYDJShg6GHztNU6HONhCjQDB2rMS96jjirKL\/l8VL8zAq8855DROrvPOsaesf26Ff2xnZlH4zel6Bf2A49oQ1KgekLYBWVYuXmEzyYQ\/DbQ5j7fsD8\/iDm0ZNoZn1v\/F9EgeOGn5H0j8UYcS3LgqyzaKZlEti1j8IbpiB5JdHZdcLSLVRyEjFzJ9Pm16OxxbpA10EL1aRIZEJCxg4ilSPXFmJaBAN+PP\/eg3fBn\/D\/33dQ7m2QY2wbMYjklU9jtGlZotW5eRSPl4qX38YqLI3OqhOiBD3jIpJXPk3ijF9hS0lAuZwouw1l6ChNCzWZSoUE1LVQut0W8qdiXdgS4okbmknbd5eR9NdHUV0uRBrgHFr+AMqMTm3+1Ek0yzLx7\/oW7z8+RAXrV0hi04l7ei7OQf3RnA5UPSwApRSazYaWlEjMqGtp+\/cnUWmJ9e\/ryj0\/6qh5falTyQWDASr++g5mUVl0Vp1RLie2Tukouy0666xRSqE57NgyLsbo3rXeM6ik1I1YLa+q1Uk0CooJfPZvtGD9v6By2NENo96VoiaUrqES6j\/qbJaWg8cXndzsOaNolmVR8dpqrCMnKm31+qHsBmI08mwnTUNPiK\/3cymfv9599I\/JGUUzK8op\/8ubiK8BjrQCXHY0o+FN4ykoBcnx9dUM8fsxf8iNTm72nFY0sSwCe\/+DFLpRDQwvKrsDbEZ08imICGYwiOXzYfm8WMFgyPSvDaXQ05IQ6vlwQYvg94dPf49myBlF82\/ZCb5GaPedjlB043RYFt6tOymZv4zih\/9E4Idj0Weciqaht0tG6lnTVCCI\/7uDWFY9Rf+ROKNovo8+QwWC0VlnjTqdaFbIiZZAkMD2vVQ8+Qqep1\/FysmNONfUULBKU2jt2tU7MiOmEPzPESTQsoLetYsmgukuI7htD5j1txrDqPhYlF5dNDMQxHfgML49+\/Hv\/R7JPRnKECFw+Ci+vd+HjkNHQnP7q6IUetsklKp+3bqgBCSvEKnwRmc1a2oVTSyLwO7vodRb7ze5KlpSYijwG4WUlVF0+\/8j\/4pxFAyaQPniFSGHN2BRMmUhBVeM42TmHZT+5tHqfY9SkJJQb0MEBOt4AdIA\/\/PHoHopViKmSXDHt402hUClxtfc9wgoM4gKmBA0UeEBVQEtYEHABNNETBMVpY5SCiM5DjG0egsnJWX4P\/83ZmO8meeIWkXDtDC\/Pdg4YR4BIy0VrdZVKVJ5\/BcLM5Ieyql+DkqhXC60NjGnptcZBYEg5f\/7HtIIXcC5olbRxBKCufnVm6T6oEBLSah1fqFl19Ev647jukHYr81E75iKntEJ+7VXYssaiN6\/e+01SWmhyTm1XPtMiGkS+PcerKPHG+cFPQfUKhqWhRSWVnu564MAempSaCAzCgUom0H8wpkkv7eM5H8uxRg5BOevbyb57SWkvPssbRbOqF0zRWW\/VtsZp0cJiN\/E96\/d1Q2dZkqtoinAcrurN0n1QUClJNdYsKIAIzRqrTkdaI7K4Rp75e9OJ4bhAM2ofKpTUUpDS66\/aKDQAiaBT7dhNSC2ei6pVTQRCU3tbgREU2ipiTUWrLRxEv\/4HLQBPRARlKHjmnw7ztHXIrZQH6j6dSNm\/r1Y1T8eMvtTGjA8Q6VTv\/nfLb+mARAINE5F0xV6Us39js3mxDX4chypKaE+T9Nw9cnA2fViNE1H03ScqW2JybwUXav5cbW2ybX2l3XCsjD352C5K1pEv1ZzKVTSgGL4Lwo0hwMVG1PzBZX676h1OEnTThVBhUaya0IALSm+xheizgho3iDBgzlIfScrnUNqLomIYA0oiAgK1caF0vRqflajoEAlN1A0ABHk6AmQ5t9E1ipao6FAJbSp1\/SCuqCUQiU2jmhWSXmjdAdNTdOUZFWUQkuIqzka0ggopWEktGm4aEqhWkB\/xjkRDdAS2zTMUDgdCoiLbXBLbilQrpaxjLfpRVMKFd+08wq1OFeDa5omgmqXXGMAoLlxbkRLbITmqzaUQouLa5jRpEBsGvrFHZruORuRJhdNKdDi20QnNyoqLhZpSGErhXZBKlpaSsj9aOacgydU6E252lKFXApqGGCtM7qG7YreNQ7SNkeaXjQFKiEe1YR9hXLYIc5e7xZSDB3nz69oEbWMcyGapSn0+Jgm7SuUptc6ilAXRNexXTUA\/XxNC6Oh4uKaJhpSiSgN\/YLUer0YYmg4+nRF79kttHqnBdD0T6kELT62XgVaVxSgX5hej5omaG1iaPPwTIzGnkjbhDS5aAogoeHO7+lQgLow9axrimgK\/dIMbJl9m875bwLO7lvWA4WCJjb5RQT9wrSzXvSuYhzETvslqt5zTH4czu5bnjUCStDjmrh5VAqtfVqNU\/Rqw9LAPjoL58ihGPrpp6s3N+r+LeuFQjQdFdv0W6fr7ZPOalWOSksidtYEVJv6L5X6sWha0RQQYwenvelrWmIcymYL96K1o0CcNuKfeRB7v+61joY3Z5r2iZVCT4xHOwfNj3LYUQ5b5Vh2LajQ1AfXxJuJ+cUwdHvL2lE1TJOLRtvEes+1PysMG+pM29radOzDBxH\/yCz0GFeLshir0rSiaQqVltRkA6BVUYYBrto3JxObht4hlcRlf8RITm4xIauaaNonVwojNTk6tUlQNh0VU7NoouvoA3qS9MHz2C5qGcMvp6PJRdNT20anNgli6OiO6qJZykK\/qi+JLz2MvdtFoTkl50WrDQmNU7VLOaNBVxPhNQR1XUug2Qxw2iPLNVBgGWAM7EfK357A2b1Li24Sq9K036KyT6tLsFhECHg8BI4cI5gTOvy5x7HquEBfNB1p46yc8Kogxk7szPGkvvsnbOlpoT6vldCEooV2mTOSa18tUxUBrINHybvqTvKuvIO8gePJv+YurKMnok+tEU3TMJISwGGgd2xH7JO\/JeHR+zBSklqVYDStaICuoxLqNmqtEPD7USdOIieK4EQRFJaG\/tNTnVCQnoKe2ZvEDcuJu+eX6DEx9Yj8N3+aVDRlM1CnMcMbE00p2tw9lrb\/XIajc0f0FjTUcrY0sWi2yijFucHeMR0jqW7NcUumaUWz28B27kSzRAiaJsFgsNajrojIKUdzoklFw26g7OfOCPD5fDz22GOMHz+e8ePHc8cdd0R+v\/vuu8nNza2zAKZpsmXLFhYsWECgme0z0qSiKZvtjFsrNTYOhwOXy4XNZmP16tWcOHECp9OJy+VCOws\/TUQ4fPgw69ata3Y7+tS6Ha5Z6ibv0tFYP+TVe6GdcVkPUjYsx0iIj86qhoiFf+e3FAwaj\/grCyk5nrRNr2Lr2SX69BoRCf2LZYDy8nK6du3K0qVLGTNmDEopgsEgmqbhdIb8Oa\/Xi4hgt9uxLCvydzhqYpomRUVFpKenYxgGPp+PQCCAiESuE073+\/0opbAsC6UUNpsNESFYub+X3W7H4XCgaRqmaeL3+\/H7Qz6oruuRa9WFWl89Rcg5Dh3a2R+6Bi77WWzKqbCUFhrI1MPXUGcVbFZKoes6uq6jVS5MDKcVFxeTlZXFypUrMU0TEWHx4sVMnDgRt9vNW2+9xVVXXUVWVhZ9+\/bltdde4+OPPyY7OxvTNCkvL+eBBx6gf\/\/+9OnTh6uuuooVK1bg8\/n485\/\/zMCBA8nKyiIjI4NBgwbxl7\/8hQkTJtC7d2\/69OnDjBkzKC8vR0T44YcfInndu3fn5ptvZufOnZh13BajdmltBo5Rw5Ci+u2HKICR0bnOhkh4Radj3EiUWWkwuJxoDdiEsyoiQn5+PuXl5RHrsrS0lIKCAgAqKio4dOgQc+fO5bbbbsPlcrFp0yby8vIAWLduHZ999hkvv\/wyvXr14vnnn+eZZ57hhhtuwO12U1hYyP3338\/Pf\/5zli1bxsKFCxk1ahRr167lu+++Y+rUqVx77bXceuutLF++nG+++YbXX3+dlJQU5s6dy2OPPcaKFSuIjz9zq4TUhmmK5fWJ5fHW\/\/D5o696WqygWf3zQTP6tDpRVlYmqamp8vrrr4vf75fc3Fzp0qWLPPfccxIMBsWyLHnwwQdl2LBhUlxcLC+99JL06NFDcnNzJRgMis\/nk1dffVW6desm5eXl8uKLL0qfPn1k165dUlRUJPn5+bJv3z7xeDyycOFCufTSSyU\/P19M05Tt27dL586d5f3335dgMChut1tGjBghM2fOlPz8fLn55ptlxowZUlBQIIWFhbJq1Srp0qWLHDp0KPpr1EitzSOaFhoNdjrqf9S5aQyhdK36589isk5DCPdDhmGg6\/opvp5Siptuuon+\/fszbtw4Ro8ezaxZszhw4EDkHF3XsdvtaJqGw+HAZrNht9vRdR3DMCL9pmmaeDweVq9ezZgxY7j11luZN29epD+sC+emRJoR4YKparTUBYfDEWnCJk6cSCAQ4IEHHuDkycpd86pwOuc+3McOHz6cJUuWsHTpUpYuXcqyZctISkqKPr1GfjKi2e12YmJiOHr0KB6PB7fbTV5eHk6n84xz+EWEp556igULFpCRkcG4ceO47777KCwsxO12R59+WgzDoF27dhw\/fpwuXbrQvXt3SkpK+P3vf19nQ6RVixa2IAFiY2OZPXs2r7zyCr\/5zW+YPn06n332GaNHj8Zms6GUqubHhdOUUtxwww1s3ryZe+65h4ceeogHH3yQnj17kpIS2v+k6r2Iunf4bypr7KhRo9i2bRuTJk1i9uzZzJ49mxEjRuBy1W2qob5gwYIF0YmtAcuyKCoqYsiQIRE\/q0+fPlxwwQXk5ORgt9uZOXMmY8eOxWaz4fV6cblcDBkyBLvdjohE0q655ho6duxIv379OHLkCCUlJQwePJhHHnmEtm3bUlFRQXJyMoMHD8Zms2GaJl6vl8GDB5OaGvr3laWlJWRkZNC3b18yMjLIzMwkJycHv9\/PmDFjmD59OnFxcadtWsPU6ly3dEQEv9+PYRiRtz7s7IabobDRQaXIpmlGzg\/3ecFgELvdjqp0zsM+nqZpkXPDDrRhGBGDwjRNNE1D13VEhEAgEPEfw\/cLh8eq+pZ1odWK1pppVaLJGaLyNfVbLZFWJZrf72f\/\/v2UlpZGmkMqxTIMg4yMjDr3G82ZViWa2+1m0qRJfPrppwAUFxcTGxuLzWYjPj6e1atX06NHj\/OiNSfCnbtpmlRUVNCjRw8WL17Mrbfeit1uP8VQ0DStmll+OsIDqNHREqoYMWHDI5xW9T5VCRtE4RagKjVdK5qW38BXQasMIblcrsjwi91ux1n5v6z37NnDDTfcQO\/evRk9ejRff\/01xcXFTJ48mSeeeCIiTH5+Prfffjtr1qzB6\/Xy+uuvc+WVV9K\/f38WLVpEUVERIsIXX3zBLbfcwkMPPcQVV1zBmjVrePnllxk\/fjzTp0\/n0ksvZezYsezfvz8i4okTJ5gzZw59+vRh2LBhfPTRR3i9XoLBIIcPH2by5Mn07duXa665hg8++ACPp\/pGqa1KtDDhmlC1Ruzfv5+xY8fSs2dP5s+fT0JCAvfeey8lJSX079+fv\/71r3g8HkzTZP369ezZs4eLL76YV199lfnz53PLLbcwadIk3nnnHRYsWIBlWRQWFrJ161Z27drFjBkzSE9PJycnh3Xr1gEwbdo0ioqK+NWvfoXb7aa0tJRp06axY8cOZs+ezcCBA7n33nvZtWsXZWVlPPjgg5w8eZL58+czcuRIpk2bxubNm6uH204JH7ciqkb5fT6f7NixQyZNmiT79++XsrIy2bdvn1xyySWydu1aOXbsmLRr107Wrl0rbrdbpk2bJiNGjJC8vDwZPXq0jB8\/XnJzc6WgoEBWrFghaWlpcvLkSXnnnXfkggsukC1btojf7xePxyMLFiyQXr16ycGDB8Xj8ciWLVukbdu2smPHDvnmm2+ka9eu8sYbb0hRUZEcP35csrKyZPbs2XL48GHp3bu3vPbaa1JSUiJFRUUyY8YMWbt2rQSDwVO+W6usadEopejRowcPP\/wwq1ev5vHHH2fZsmX4fD68Xi\/x8fEMGDCAN998k5KSEr7++muGDx+O0+mkoKCAQ4cOMW\/ePP7whz\/w7rvvIiKRmKPL5SI9PR2bzRbpI+Pi4oiPj8fpdJKYmIjdbsfr9VJRUYHf7+fNN9\/kf\/7nf5g3bx55eXkcOXIEp9NJ3759+d3vfsd9993H6tWrmT9\/PldffXW1PvQnIZqIsH37doYMGcK2bduIj48nJSUFqZxaYLPZuP7669m+fTtfffUVxcXFjB49OhLNSElJoWfPnvTo0YOhQ4cyb948EhIS4AwRfarkh+9lWRZdu3alR48e9O7dm7vuuovs7Gzi4uJ48sknWbRoEXFxcTz77LMMHDiQL7\/8MvqSPw3RLMti586deL1enn32WebMmcNdd91FbGxoVNwwDG6++WZycnJ44oknyMzMpH379pFa06lTJ+655x6mT5\/O1Vdfze7du88oVjThl8PlcpGVlcWMGTOYMmUKmqZRXFxMfn4+7733HsOHD2fx4sWsW7eO2NhYvvjii2pT\/34SoimlSEpKIhAIsHXrVo4fP86SJUsiY2GaptGpUycGDRrE7t27GTZsGA6HA13XGTRoEB988AEbNmxg9+7dLFiwgG3btkWs07oiIrRr147k5GSWLl3K7t27WbduHU888QQANpuNF154gYcffpjDhw\/z+eefc\/z4cTp27FjNZWi1ommaRkZGBgkJCWiaxrBhw5gyZQp\/\/OMfuf322yksLKRXr16RORm6rjNx4kT69OnDz372s8iI8\/Tp07nzzjtZuHAhkyZNIi4ujpdeegm73U5cXBydO3fG4QjtyKppGm3btqVTp04R\/8vpdNKtWzdcLheJiYk8++yzxMfHk52dzSOPPMLUqVMZM2YMiYmJPP744xw4cIAxY8bwyCOPMGfOHG688cZq\/lqrcq6rYpompaWluFwu7JUL4n0+H263GxHB4XBU8+PC\/lJ4ugCVNSRsRFiWhcvlwuVyoet6xEUIny8ieDweLMuKTIkLBAJUVFQQExODYRiRYRuPx4Ou65GIjaocRQjfyzAMYmNjI1MYqtJqRWvNtNrmsSbO9H6eKb+50KpqmmmaFBcXo+s6iYmJkXTLsnC73Xg8Htq2bVutjwhTWFiIpmnEx8cjIhQWFuJwOGodGSgqKgKI9IumaUaauiblFFe7hePxeOTuu++WrKwsCQQCkfTy8nKZMWOGDBkypFp0IUwwGJQ77rhDfvvb34rX65WSkhIZPHiwLFq06JRrhbEsS2bMmCFTp04Vt9sdmbtYUlIilmVFn96otKrmUdd1Bg4cyJ49ezh48GCkucvLy2PDhg1kZ2ejKsfZwgHc8DkiEolYhCPtXq8Xn893SrNZ9bNVz09ISKBfv36RqEj0PcI\/o4+qz1DTPaLzaG19mmEYDBgwAKUUO3fujBTMxo0bERFuvPFGioqK+PDDD\/nb3\/7G22+\/zX\/+859qzmtNiAilpaWsX7+eV155hbVr1+LxeCKF2qFDB8aNG4fNZsOyLI4dO8Zbb73FCy+8wMaNG3n77bfZv38\/Pp+PrVu3snHjRlatWsWrr77Kxo0bI1ZtIBBg3759rFy5kldeeYWPP\/6YwsLCU8WLrnotneLiYhk8eLDcc889EggExOfzSXZ2towcOVIKCgpk6tSp0r59exkwYIB06NBBBg0aJPn5+RIIBGTUqFEyc+ZMqaiokMLCQhkwYIDMnz9f\/H6\/eL1eWbRokaSmpkrnzp0lPT1dEhIS5M4775TS0lJZtWqVpKSkSFlZmRQWFkpWVpakpaVJ3759JS0tTZxOpyxfvlwKCwvltttuk8TEROnQoYN06NAhEtj2er1y7Ngx6devn3Tu3Fn69+8v7dq1kzlz5ojH44l8x1ZV06gM4E6ePJk1a9ZQWlqK2+1m3759EYd569atLF68mM8\/\/5wPP\/yQkpIS1q9fH32ZalRUVPD++++TnZ3Nrl27WL9+PXFxcZEaEG5SqRwG2rdvH88\/\/zxffvklb7zxRqTWq8olVN26dWPr1q3s3r2bX\/ziFzz\/\/PO43W62b9+OaZps3ryZzZs3M3fuXDZs2EBFRUXkWVqdaIZhMGLECCzLYtOmTezdu5eioiJGjhxJXFwcn3zyCd27d+err77i8OHD2Gw2Tpw487YXfr+f4uJirrvuOuLi4rjkkksYPHhwjZboyZMn0XWdyy67DKfTSWZmJunp6RGrUtd1+vfvT3p6OgkJCYwYMYKioiIsyyIrK4v333+fQ4cO8eWXXyKVfW3V1aitTrSwyd6rVy\/WrFnDCy+8QO\/evenWrRsVFRXcf\/\/9jB49milTpjBr1ixOnDhRY2cfTbimhGOOSqlaZwRLlXmRYaHCEZYwYYMlnBeugbm5udx0001kZ2czbdo0nn76aayoQdBWJxqV8\/aHDRvGhg0bWL16Nddffz0Oh4OTJ0+yatUqXnzxRTZt2sTHH39Mp06doIoo4d+j08KFHF4YaFX6fjUJHh8fTyAQ4OjRo\/h8PvLy8k55OWrz44LBIMuXLyc5OZm1a9eyadMmlixZUi2M1SpFMwyDUaNGkZubi2maXHbZZZE4YDAYjMQFjx07Flk0CNCmTRuOHDlCTk4OgUAAp9PJ0aNHycnJQdM00tLS+OCDD8jJyeGrr77iiy++OKUWhMXo1KkTaWlpPPXUU7z22mvMmjWL8vLyyHmnw+PxYBhGJAi9a9eun0ZN03WdSy65hMzMTC666CK6d++Opmm0b9+ezMxMJk6cyPDhw5kwYQJ+vz\/SPI0aNYp\/\/etf3HTTTZSWlpKdnc27777LL3\/5S3w+H7fddhv\/\/Oc\/GTp0KGPHjkVEIiPWhmHgcoU2\/mzfvj3PPfcceXl5PPbYY3Tt2pWOHTtGmlVb5dq1MDabLZL261\/\/mgMHDnD99ddz3XXX8eKLL6JXThsP06rCWFWxLIu9e\/ciIvTs2RPDMLAqF2Vs27YNt9tNx44dMU2T9u3bc9FFF+H3+\/n6668pKyvj8ssvx+l0snPnTioqKrjyyivRNC3iuLdv3x6n04ndbqd79+4UFhayZ88ehg4dypEjR3j00Ue599576dmzJ8ePHyczM5N33nmHzMxMvv32W2w2G71790YpxbFjxzh06BADBoT+dcqBAwf45ptvMAyDDh064Ha7ufzyy4mJCW1F32pFo0rfVLUPCfdH4bTon+F+LFwrwk1T1b\/D+VXTw5\/TNI38\/HwmTJjAsWPH6N+\/P9u2bePiiy9m5cqVEeMl\/LnwPcNUvVZN96G1i\/ZjYZombrebTz75hN27d9OrVy+uu+464uPjqxkV9eG8aE1E2Nm2KmcZVzX\/G8p50VogDa+r5znnnBetBXJetBbIedFaIP8fH7bWR3OG4MYAAAAASUVORK5CYII=\"\/>\r\n                  <div class=\"brand-text\">\r\n                    <div class=\"brand-kicker\">VISITA TAVERNES DE LA VALLDIGNA<\/div>\r\n                    <div class=\"brand-main\"><\/div> Dissenya el teu viatge per dies i per franges hor\u00e0ries amb totes les opcions disponibles a Tavernes: activitats, patrimoni, natura, restauraci\u00f3, oci, esdeveniments i allotjaments\r\n                    <div class=\"brand-subline\">Planificador de viatge<\/div>\r\n                  <\/div>\r\n                <\/div>\r\n              <\/div>\r\n\r\n              <div class=\"trip-tools-row\">\r\n                <div class=\"field\">\r\n                  <label for=\"tripName\">Nom del viatge<\/label>\r\n                  <input id=\"tripName\" value=\"Escapada a Tavernes\"\/>\r\n                <\/div>\r\n                <div class=\"field\">\r\n                  <label for=\"tripStart\">Data d\u2019inici<\/label>\r\n                  <input id=\"tripStart\" type=\"date\"\/>\r\n                <\/div>\r\n                <div class=\"field\">\r\n                  <label for=\"numDays\">Nombre de dies<\/label>\r\n                  <select id=\"numDays\"><\/select>\r\n                <\/div>\r\n                <div class=\"day-actions\">\r\n                  <button class=\"btn alt\" id=\"btnGenerate\">Aplicar dies<\/button>\r\n                  <button class=\"btn\" id=\"btnAddDay\">Afegir un dia<\/button>\r\n                <\/div>\r\n              <\/div>\r\n            <\/div>\r\n          <\/section>\r\n\r\n        <section class=\"content-grid\">\r\n          <aside class=\"panel catalog-panel content-right\">\r\n            <div class=\"catalog-fixed\">\r\n              <div class=\"catalog-head\">\r\n                <div>\r\n                  <h3>Cat\u00e0leg general de Tavernes de la Valldigna<\/h3>\r\n                  \r\n                  <div class=\"catalog-count\" id=\"catalogCount\">0 opcions<\/div>\r\n                <\/div>\r\n\r\n                <div class=\"catalog-extra-filters\">\r\n                  <div class=\"field\">\r\n                    <label>Amb qui viatges<\/label>\r\n                    <select id=\"tripWho\">\r\n                      <option value=\"pareja\">Parella<\/option>\r\n                      <option value=\"familia\">Fam\u00edlia<\/option>\r\n                      <option value=\"amigos\">Amics<\/option>\r\n                      <option value=\"solo\">Sol<\/option>\r\n                      <option value=\"grupo\">Grup<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n                  <div class=\"field\">\r\n                    <label>Com et mous<\/label>\r\n                    <select id=\"tripMove\">\r\n                      <option value=\"cualquiera\">Qualsevol mitj\u00e0<\/option>\r\n                      <option value=\"coche\">Principalment cotxe<\/option>\r\n                      <option value=\"pie\">Principalment a peu<\/option>\r\n                      <option value=\"bici\">Principalment bici<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n                  <div class=\"field\">\r\n                    <label>Ritme<\/label>\r\n                    <select id=\"tripPace\">\r\n                      <option value=\"equilibrado\">Equilibrat<\/option>\r\n                      <option value=\"tranquilo\">Tranquil<\/option>\r\n                      <option value=\"activo\">Actiu<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"filters\">\r\n                  <div class=\"field\">\r\n                    <label>Tipus<\/label>\r\n                    <select id=\"filterType\">\r\n                      <option value=\"\">Tot<\/option>\r\n                      <option value=\"actividad\">Activitat<\/option>\r\n                      <option value=\"restaurante\">Restaurant<\/option>\r\n                      <option value=\"alojamiento\">Allotjament<\/option>\r\n                      <option value=\"evento\">Esdeveniment<\/option>\r\n                      <option value=\"ocio\">Oci<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n\r\n                  <div class=\"field\">\r\n                    <label>Zona<\/label>\r\n                    <select id=\"filterZone\">\r\n                      <option value=\"\">Qualsevol<\/option>\r\n                      <option value=\"platja\">Platja<\/option>\r\n                      <option value=\"pueblo\">Poble<\/option>\r\n                      <option value=\"valldigna\">Entorn Valldigna<\/option>\r\n                      <option value=\"monduber\">Muntanya \/ Mond\u00faver<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n\r\n                  <div class=\"field\">\r\n                    <label>Franja<\/label>\r\n                    <select id=\"filterSlot\">\r\n                      <option value=\"\">Totes<\/option>\r\n                      <option value=\"mat\u00ed\">Mat\u00ed<\/option>\r\n                      <option value=\"migdia\">Migdia<\/option>\r\n                      <option value=\"vesprada\">Vesprada<\/option>\r\n                      <option value=\"nit\">Nit<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n\r\n                  <div class=\"field\">\r\n                    <label>Transport<\/label>\r\n                    <select id=\"filterMove\">\r\n                      <option value=\"\">Qualsevol<\/option>\r\n                      <option value=\"pie\">A peu<\/option>\r\n                      <option value=\"bici\">Bici<\/option>\r\n                      <option value=\"coche\">Cotxe<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n\r\n                  <div class=\"field\">\r\n                    <label>Inter\u00e9s<\/label>\r\n                    <select id=\"filterInterest\">\r\n                      <option value=\"\">Qualsevol<\/option>\r\n                      <option value=\"playa\">Platja i mar<\/option>\r\n                      <option value=\"naturaleza\">Natura<\/option>\r\n                      <option value=\"senderismo\">Senderisme<\/option>\r\n                      <option value=\"patrimonio\">Patrimoni i cultura<\/option>\r\n                      <option value=\"gastronomia\">Gastronomia<\/option>\r\n                      <option value=\"familia\">Plans familiars<\/option>\r\n                      <option value=\"vespreig\">Vespreig i ambient<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n\r\n                  <div class=\"field\">\r\n                    <label>Duraci\u00f3<\/label>\r\n                    <select id=\"filterDuration\">\r\n                      <option value=\"\">Qualsevol<\/option>\r\n                      <option value=\"corta\">Fins a 1,5 h<\/option>\r\n                      <option value=\"media\">Entre 1,5 i 3 h<\/option>\r\n                      <option value=\"larga\">M\u00e9s de 3 h<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n\r\n                  <div class=\"field search\">\r\n                    <label>Buscar<\/label>\r\n                    <input id=\"search\" placeholder=\"Ex. arr\u00f2s, platja, hotel, Bolomor, senderisme...\"\/>\r\n                  <\/div>\r\n                <\/div>\r\n              <\/div>\r\n            <\/div>\r\n            <div class=\"catalog-results\">\r\n              <div class=\"catalog-grid\" id=\"catalogGrid\"><\/div>\r\n            <\/div>\r\n          <\/aside>\r\n\r\n          <section class=\"panel box itinerary-panel content-left\" style=\"padding-bottom:10px\">\r\n            <h3 style=\"margin:0 0 12px;font-size:25px\">Itinerari<\/h3>\r\n            <div class=\"center-scroll\" id=\"daysContainer\"><\/div>\r\n          <\/section>\r\n        <\/section>\r\n\r\n        <section class=\"panel map-panel map-bottom\">\r\n          <div class=\"map-header\">\r\n            <h3>Mapa interactiu<\/h3>\r\n            <p>Fes clic en una fitxa per a centrar la seua ubicaci\u00f3. Els punts s\u2019actualitzen amb els filtres i el mapa ajuda a repartir millor el viatge.<\/p>\r\n            <div class=\"map-stats\">\r\n              <span class=\"map-pill\" id=\"mapVisibleCount\">0 ubicacions visibles<\/span>\r\n              <span class=\"map-pill\" id=\"mapPlannedCount\">0 afegides al viatge<\/span>\r\n              <span class=\"map-pill\">\ud83e\udded Activitat<\/span>\r\n              <span class=\"map-pill\">\ud83c\udf7d\ufe0f Restaurant<\/span>\r\n              <span class=\"map-pill\">\ud83d\udecf\ufe0f Allotjament<\/span>\r\n              <span class=\"map-pill\">\ud83c\udf89 Esdeveniment<\/span>\r\n              <span class=\"map-pill\">\ud83c\udf19 Oci<\/span>\r\n            <\/div>\r\n            <div class=\"map-controls\">\r\n              <label class=\"map-toggle\">\r\n                <input type=\"checkbox\" id=\"mapOnlyPlanned\"\/>\r\n                Veure nom\u00e9s els afegits al viatge\r\n              <\/label>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"map-bottom-grid\">\r\n            <div id=\"travelMap\"><\/div>\r\n            <div class=\"map-side-scroll\">\r\n              <div class=\"map-list\" id=\"mapList\"><\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/section>\r\n\r\n        <section class=\"panel box bottom-budget\">\r\n          <div class=\"budget-two-cols\">\r\n            <div class=\"budget-main-col\">\r\n              <h3 style=\"margin:0 0 10px;font-size:25px\">Pressupost<\/h3>\r\n              <div class=\"budget-line\"><span>Activitats<\/span><strong id=\"bAct\">0 \u20ac<\/strong><\/div>\r\n              <div class=\"budget-line\"><span>Restaurants<\/span><strong id=\"bFood\">0 \u20ac<\/strong><\/div>\r\n              <div class=\"budget-line\"><span>Allotjament<\/span><strong id=\"bStay\">0 \u20ac<\/strong><\/div>\r\n              <div class=\"budget-line\"><span>Oci i esdeveniments<\/span><strong id=\"bOther\">0 \u20ac<\/strong><\/div>\r\n              <div class=\"budget-total\" id=\"bTotal\">0 \u20ac<\/div>\r\n            <\/div>\r\n\r\n            <div class=\"budget-side-col\">\r\n              <div class=\"budget-mini-stats\">\r\n                <div class=\"mini-stat\">\r\n                  <span class=\"mini-stat-label\">Dies<\/span>\r\n                  <strong class=\"mini-stat-value\" id=\"statDays\">0<\/strong>\r\n                <\/div>\r\n                <div class=\"mini-stat\">\r\n                  <span class=\"mini-stat-label\">Hores<\/span>\r\n                  <strong class=\"mini-stat-value\" id=\"statHours\">0 h<\/strong>\r\n                <\/div>\r\n                <div class=\"mini-stat\">\r\n                  <span class=\"mini-stat-label\">Parades<\/span>\r\n                  <strong class=\"mini-stat-value\" id=\"statStops\">0<\/strong>\r\n                <\/div>\r\n                <div class=\"mini-stat\">\r\n                  <span class=\"mini-stat-label\">Pressupost<\/span>\r\n                  <strong class=\"mini-stat-value\" id=\"statBudget\">0 \u20ac<\/strong>\r\n                <\/div>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/section>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n<script\r\n  src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"\r\n  integrity=\"sha256-20nQCchB9co0qIjJZRGuk2\/Z9VM+kNiyxNV1lvTlZBo=\"\r\n  crossorigin=\"\"\r\n><\/script>\r\n\r\n<script>\r\nconst PLANNER_BASE_WIDTH = 1940;\r\nconst PLANNER_BASE_HEIGHT = 1060;\r\n\r\nconst catalog = [\r\n  {\r\n    \"id\": \"act-1\",\r\n    \"title\": \"Platja de Tavernes\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 2,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Passeig, bany i tram principal de platja.\",\r\n    \"cost\": 0,\r\n    \"score\": 95,\r\n    \"notes\": \"platja ba\u00f1o paseo mar\"\r\n  },\r\n  {\r\n    \"id\": \"act-2\",\r\n    \"title\": \"Llac de la Goleta\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Passeig suau al costat de la zona de la Goleta.\",\r\n    \"cost\": 0,\r\n    \"score\": 88,\r\n    \"notes\": \"platja paseo relax\"\r\n  },\r\n  {\r\n    \"id\": \"act-3\",\r\n    \"title\": \"Clot de la Font\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"valldigna\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Parada de natura relaxada i entorn fresc.\",\r\n    \"cost\": 0,\r\n    \"score\": 90,\r\n    \"notes\": \"naturaleza relax\"\r\n  },\r\n  {\r\n    \"id\": \"act-4\",\r\n    \"title\": \"Font de la Granata\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"valldigna\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Entorn natural per a una visita tranquil\u00b7la.\",\r\n    \"cost\": 0,\r\n    \"score\": 84,\r\n    \"notes\": \"naturaleza tranquila\"\r\n  },\r\n  {\r\n    \"id\": \"act-5\",\r\n    \"title\": \"Les Fontetes de Cant\u00fas\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"valldigna\",\r\n    \"hours\": 2,\r\n    \"move\": [\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Paratge d\u2019interior per a passeig i aire lliure.\",\r\n    \"cost\": 0,\r\n    \"score\": 83,\r\n    \"notes\": \"interior paseo\"\r\n  },\r\n  {\r\n    \"id\": \"act-6\",\r\n    \"title\": \"Ruta pel Mond\u00faver\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\"\r\n    ],\r\n    \"desc\": \"Eixida de muntanya per a qui vulga una ruta m\u00e9s exigent.\",\r\n    \"cost\": 0,\r\n    \"score\": 92,\r\n    \"notes\": \"senderismo monta\u00f1a activo\"\r\n  },\r\n  {\r\n    \"id\": \"act-7\",\r\n    \"title\": \"Visita a la Cova del Bolomor\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\"\r\n    ],\r\n    \"desc\": \"Visita al jaciment i al valor arqueol\u00f2gic de l\u2019enclavament. Consulta en la web oficial les dates disponibles, ja que les visites es programen en diumenge i no tots els diumenges.\",\r\n    \"cost\": 0,\r\n    \"score\": 89,\r\n    \"notes\": \"cultura patrimonio historia\"\r\n  },\r\n  {\r\n    \"id\": \"act-8\",\r\n    \"title\": \"Ruta cova del Bolomor\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 2,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Passeig per l\u2019entorn sense plantejar la visita a l\u2019interior.\",\r\n    \"cost\": 0,\r\n    \"score\": 81,\r\n    \"notes\": \"paseo naturaleza historia\"\r\n  },\r\n  {\r\n    \"id\": \"act-9\",\r\n    \"title\": \"Escola de vela\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Activitat n\u00e0utica d\u2019iniciaci\u00f3 o sessi\u00f3 guiada.\",\r\n    \"cost\": 0,\r\n    \"score\": 85,\r\n    \"notes\": \"platja mar deporte activo familia\"\r\n  },\r\n  {\r\n    \"id\": \"act-10\",\r\n    \"title\": \"Carril de kitesurf\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Zona d\u2019acc\u00e9s esportiu vinculada a la pr\u00e0ctica del kite.\",\r\n    \"cost\": 0,\r\n    \"score\": 76,\r\n    \"notes\": \"platja deporte viento\"\r\n  },\r\n  {\r\n    \"id\": \"act-11\",\r\n    \"title\": \"Carril d\u2019entrada d\u2019embarcacions\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Punt d\u2019acc\u00e9s n\u00e0utic al costat de l\u2019entrada de la platja.\",\r\n    \"cost\": 0,\r\n    \"score\": 70,\r\n    \"notes\": \"n\u00e1utica platja\"\r\n  },\r\n  {\r\n    \"id\": \"act-12\",\r\n    \"title\": \"Platja de la Goleta\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Tram de platja i passeig de la Goleta, base de l\u2019ecosistema dunar de la Ruta dels Sentits.\",\r\n    \"cost\": 0,\r\n    \"score\": 93,\r\n    \"notes\": \"platja dunas paseo\"\r\n  },\r\n  {\r\n    \"id\": \"act-13\",\r\n    \"title\": \"Parc del Moll\u00f3\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Parc accessible per a bici, patinatge i aparells de gimn\u00e0stica a l\u2019aire lliure.\",\r\n    \"cost\": 0,\r\n    \"score\": 82,\r\n    \"notes\": \"familia ni\u00f1os bici\"\r\n  },\r\n  {\r\n    \"id\": \"act-14\",\r\n    \"title\": \"Parc del Nord\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Zona esportiva i d\u2019oci amb pistes i activitats de temporada.\",\r\n    \"cost\": 0,\r\n    \"score\": 84,\r\n    \"notes\": \"familia deporte ocio\"\r\n  },\r\n  {\r\n    \"id\": \"act-15\",\r\n    \"title\": \"Torre de Guaita\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Torre costanera defensiva BIC al costat d\u2019una zona d\u2019oci i estany.\",\r\n    \"cost\": 0,\r\n    \"score\": 94,\r\n    \"notes\": \"patrimonio cultura paseo\"\r\n  },\r\n  {\r\n    \"id\": \"act-16\",\r\n    \"title\": \"Carril bici de l\u2019entrada de la platja\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"bici\",\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Tram c\u00f2mode per a passejar en bici amb connexi\u00f3 cap a la Torre de Guaita i la Goleta.\",\r\n    \"cost\": 0,\r\n    \"score\": 80,\r\n    \"notes\": \"bici paseo platja\"\r\n  },\r\n  {\r\n    \"id\": \"act-17\",\r\n    \"title\": \"Ruta dels Sentits\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"valldigna\",\r\n    \"hours\": 3.5,\r\n    \"move\": [\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Sender Blau de 14 km que connecta dunes, marjal, horta i entorn forestal.\",\r\n    \"cost\": 0,\r\n    \"score\": 97,\r\n    \"notes\": \"senderismo bici naturaleza marjal platja\"\r\n  },\r\n  {\r\n    \"id\": \"act-18\",\r\n    \"title\": \"Ullal Gran\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"valldigna\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Zona humida lligada a un naixement subterrani, refugi d\u2019aus i parada molt fotog\u00e8nica.\",\r\n    \"cost\": 0,\r\n    \"score\": 89,\r\n    \"notes\": \"naturaleza fotos aves\"\r\n  },\r\n  {\r\n    \"id\": \"act-19\",\r\n    \"title\": \"Ullal de les Penyetes\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"valldigna\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Punt de marjal complementari a l\u2019Ullal Gran, adequat per a un passeig interpretatiu.\",\r\n    \"cost\": 0,\r\n    \"score\": 84,\r\n    \"notes\": \"naturaleza paseo\"\r\n  },\r\n  {\r\n    \"id\": \"act-20\",\r\n    \"title\": \"Font de la Sangonera\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Font de muntanya situada en l\u2019entorn de la ruta de les Creus.\",\r\n    \"cost\": 0,\r\n    \"score\": 82,\r\n    \"notes\": \"monta\u00f1a paseo\"\r\n  },\r\n  {\r\n    \"id\": \"act-21\",\r\n    \"title\": \"Paratge de Sant Lloren\u00e7\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Entorn de muntanya associat a l\u2019ermita i a diversos itineraris cap als miradors.\",\r\n    \"cost\": 0,\r\n    \"score\": 86,\r\n    \"notes\": \"naturaleza mirador patrimonio\"\r\n  },\r\n  {\r\n    \"id\": \"act-22\",\r\n    \"title\": \"Mirador del Mediterrani\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Mirador cl\u00e0ssic de Tavernes amb panor\u00e0miques cap a la costa i la Valldigna.\",\r\n    \"cost\": 0,\r\n    \"score\": 91,\r\n    \"notes\": \"mirador fotos paisaje\"\r\n  },\r\n  {\r\n    \"id\": \"act-23\",\r\n    \"title\": \"Pic del Massalari\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 3,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\"\r\n    ],\r\n    \"desc\": \"Cim i entorn muntany\u00f3s per a senderistes amb un recorregut un poc m\u00e9s llarg.\",\r\n    \"cost\": 0,\r\n    \"score\": 84,\r\n    \"notes\": \"senderismo monta\u00f1a activo\"\r\n  },\r\n  {\r\n    \"id\": \"act-24\",\r\n    \"title\": \"Campana del Massalari\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 3.5,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\"\r\n    ],\r\n    \"desc\": \"Ruta d\u2019anada i tornada per la Serra de les Creus fins a la campana instal\u00b7lada pels excursionistes.\",\r\n    \"cost\": 0,\r\n    \"score\": 88,\r\n    \"notes\": \"senderismo activo\"\r\n  },\r\n  {\r\n    \"id\": \"act-25\",\r\n    \"title\": \"Ruta de les Creus (PR-CV 38)\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 4,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Ruta senyalitzada amb ascens a les Creus, Fontetes de Cant\u00fas, Castellets i mirador.\",\r\n    \"cost\": 0,\r\n    \"score\": 96,\r\n    \"notes\": \"senderismo monta\u00f1a activo\"\r\n  },\r\n  {\r\n    \"id\": \"act-26\",\r\n    \"title\": \"Via ferrada Pas de Cabres\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 5,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\"\r\n    ],\r\n    \"desc\": \"Via ferrada K2 amb dos trams equipats i final a la segona creu.\",\r\n    \"cost\": 0,\r\n    \"score\": 90,\r\n    \"notes\": \"aventura activo monta\u00f1a\"\r\n  },\r\n  {\r\n    \"id\": \"act-27\",\r\n    \"title\": \"Via ferrada Les Marujes\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 2.5,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\"\r\n    ],\r\n    \"desc\": \"Via ferrada K3 a Penya Roja amb pont tibet\u00e0 i trams verticals.\",\r\n    \"cost\": 0,\r\n    \"score\": 89,\r\n    \"notes\": \"aventura activo\"\r\n  },\r\n  {\r\n    \"id\": \"act-28\",\r\n    \"title\": \"Ruta de la Cadira\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 2.8,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\"\r\n    ],\r\n    \"desc\": \"Ruta circular pel Cam\u00ed de la Cadira, la Cisterna i el Pla de les Foietes.\",\r\n    \"cost\": 0,\r\n    \"score\": 93,\r\n    \"notes\": \"senderismo paisaje\"\r\n  },\r\n  {\r\n    \"id\": \"act-29\",\r\n    \"title\": \"Ruta de l\u2019Ombria\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 3,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\"\r\n    ],\r\n    \"desc\": \"Ruta circular per l\u2019Ombria, el barranc de Cremades i el Pla de les Foietes.\",\r\n    \"cost\": 0,\r\n    \"score\": 90,\r\n    \"notes\": \"senderismo activo\"\r\n  },\r\n  {\r\n    \"id\": \"act-30\",\r\n    \"title\": \"Castell de la Reina Mora\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 2,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Ruta de dificultat mitjana fins a un enclavament de llegenda a la serra, vinculat al passat medieval.\",\r\n    \"cost\": 0,\r\n    \"score\": 87,\r\n    \"notes\": \"senderismo historia patrimonio\"\r\n  },\r\n  {\r\n    \"id\": \"act-31\",\r\n    \"title\": \"Via Verda - Trenet (GR-236)\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"valldigna\",\r\n    \"hours\": 2.5,\r\n    \"move\": [\r\n      \"bici\",\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Recorregut de 29 km sobre l\u2019antic tra\u00e7at del tren Carcaixent-Gandia-D\u00e9nia, apte per a bicicleta.\",\r\n    \"cost\": 0,\r\n    \"score\": 92,\r\n    \"notes\": \"bici activo ruta\"\r\n  },\r\n  {\r\n    \"id\": \"act-32\",\r\n    \"title\": \"Circuit de marxa n\u00f2rdica\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 2.5,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Circuit actiu per l\u2019entorn del Mirador, Rac\u00f3 de Joana i Rac\u00f3 Red\u00f3.\",\r\n    \"cost\": 0,\r\n    \"score\": 80,\r\n    \"notes\": \"activo deporte caminar\"\r\n  },\r\n  {\r\n    \"id\": \"act-33\",\r\n    \"title\": \"Rac\u00f3 de Joana\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Paratge de l\u2019entorn del Mirador i del circuit de marxa n\u00f2rdica.\",\r\n    \"cost\": 0,\r\n    \"score\": 79,\r\n    \"notes\": \"naturaleza paseo bici\"\r\n  },\r\n  {\r\n    \"id\": \"act-34\",\r\n    \"title\": \"La Cisterna\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 0.8,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Antic aljub visible en l\u2019entorn de la ruta de la Cadira i l\u2019Ombria.\",\r\n    \"cost\": 0,\r\n    \"score\": 76,\r\n    \"notes\": \"patrimonio monta\u00f1a\"\r\n  },\r\n  {\r\n    \"id\": \"act-35\",\r\n    \"title\": \"Pla de les Foietes\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Altipl\u00e0 i balc\u00f3 paisatg\u00edstic incl\u00f2s en diverses rutes de muntanya.\",\r\n    \"cost\": 0,\r\n    \"score\": 78,\r\n    \"notes\": \"paisaje mirador\"\r\n  },\r\n  {\r\n    \"id\": \"act-36\",\r\n    \"title\": \"Ajuntament\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 0.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Edifici emblem\u00e0tic del centre urb\u00e0, integrat en un recorregut patrimonial.\",\r\n    \"cost\": 0,\r\n    \"score\": 74,\r\n    \"notes\": \"patrimonio centro\"\r\n  },\r\n  {\r\n    \"id\": \"act-37\",\r\n    \"title\": \"Esgl\u00e9sia de Sant Pere\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Temple hist\u00f2ric del nucli antic amb c\u00fapula, capella i museu.\",\r\n    \"cost\": 0,\r\n    \"score\": 90,\r\n    \"notes\": \"cultura patrimonio historia\"\r\n  },\r\n  {\r\n    \"id\": \"act-38\",\r\n    \"title\": \"Esgl\u00e9sia de Sant Josep\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 0.75,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Esgl\u00e9sia inclosa entre els edificis emblem\u00e0tics de Tavernes.\",\r\n    \"cost\": 0,\r\n    \"score\": 78,\r\n    \"notes\": \"patrimonio cultura\"\r\n  },\r\n  {\r\n    \"id\": \"act-39\",\r\n    \"title\": \"Calvari\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 0.75,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Pujada i visita a un dels punts emblem\u00e0tics del nucli urb\u00e0.\",\r\n    \"cost\": 0,\r\n    \"score\": 79,\r\n    \"notes\": \"paseo pueblo\"\r\n  },\r\n  {\r\n    \"id\": \"act-40\",\r\n    \"title\": \"Mol\u00ed Vell o del Pla\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 0.75,\r\n    \"move\": [\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Exemple destacat d\u2019arqueologia hidr\u00e0ulica d\u2019\u00e8poca cistercenca.\",\r\n    \"cost\": 0,\r\n    \"score\": 85,\r\n    \"notes\": \"patrimonio cultura\"\r\n  },\r\n  {\r\n    \"id\": \"act-41\",\r\n    \"title\": \"Mol\u00ed de Tonet\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 0.75,\r\n    \"move\": [\r\n      \"pie\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Refer\u00e8ncia del patrimoni industrial local vinculada a l\u2019evoluci\u00f3 t\u00e8cnica de la vall.\",\r\n    \"cost\": 0,\r\n    \"score\": 80,\r\n    \"notes\": \"patrimonio\"\r\n  },\r\n  {\r\n    \"id\": \"act-42\",\r\n    \"title\": \"Ermita de Sant Lloren\u00e7\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Ermita i enclavament hist\u00f2ric lligat a l\u2019Alcudiola i a la pujada al mirador.\",\r\n    \"cost\": 0,\r\n    \"score\": 82,\r\n    \"notes\": \"patrimonio mirador\"\r\n  },\r\n  {\r\n    \"id\": \"act-43\",\r\n    \"title\": \"Mercat Municipal\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 0.75,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\"\r\n    ],\r\n    \"desc\": \"Espai municipal on es pot trobar producte local i activitat comercial quotidiana.\",\r\n    \"cost\": 0,\r\n    \"score\": 77,\r\n    \"notes\": \"producto local\"\r\n  },\r\n  {\r\n    \"id\": \"act-44\",\r\n    \"title\": \"Casa de la Cultura\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Equipament cultural amb activitat durant tot l\u2019any i espai exterior per a esdeveniments.\",\r\n    \"cost\": 0,\r\n    \"score\": 83,\r\n    \"notes\": \"cultura\"\r\n  },\r\n  {\r\n    \"id\": \"act-45\",\r\n    \"title\": \"Mural VCF del pavell\u00f3 Carlos Pellicer\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 0.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Gran mural d\u2019art urb\u00e0 impulsat per la Fundaci\u00f3 Valencia CF al pavell\u00f3 Carlos Pellicer.\",\r\n    \"cost\": 0,\r\n    \"score\": 85,\r\n    \"notes\": \"arte urbano\"\r\n  },\r\n  {\r\n    \"id\": \"act-46\",\r\n    \"title\": \"Mural de la Casa de la Cultura (Estell\u00e9s)\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 0.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Mural urb\u00e0 de gran format a la fa\u00e7ana de la Casa de la Cultura dedicat a Estell\u00e9s.\",\r\n    \"cost\": 0,\r\n    \"score\": 84,\r\n    \"notes\": \"arte urbano cultura\"\r\n  },\r\n  {\r\n    \"id\": \"act-47\",\r\n    \"title\": \"Mural de ferro de la Torreta\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 0.4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Intervenci\u00f3 art\u00edstica al cam\u00ed entre la Torre de Guaita i la Torreta.\",\r\n    \"cost\": 0,\r\n    \"score\": 74,\r\n    \"notes\": \"arte platja\"\r\n  },\r\n  {\r\n    \"id\": \"act-48\",\r\n    \"title\": \"Badell i entorn del riu Vaca\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"valldigna\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Passeig per l\u2019entorn de l\u2019afluent del riu Vaca, integrat en diverses rutes del terme.\",\r\n    \"cost\": 0,\r\n    \"score\": 78,\r\n    \"notes\": \"paseo naturaleza\"\r\n  },\r\n  {\r\n    \"id\": \"act-49\",\r\n    \"title\": \"Passeig per l\u2019Avinguda de la Marina\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Passeig per l\u2019Avinguda de la Marina i l\u2019entorn litoral.\",\r\n    \"cost\": 0,\r\n    \"score\": 86,\r\n    \"notes\": \"platja vespreig paseo\"\r\n  },\r\n  {\r\n    \"id\": \"act-50\",\r\n    \"title\": \"Passeig cultural pel centre hist\u00f2ric\",\r\n    \"type\": \"actividad\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Recorregut urb\u00e0 que combina ajuntament, esgl\u00e9sies, mercat, molins i Casa de la Cultura.\",\r\n    \"cost\": 0,\r\n    \"score\": 80,\r\n    \"notes\": \"cultura pueblo patrimonio\"\r\n  },\r\n  {\r\n    \"id\": \"res-51\",\r\n    \"title\": \"Baladre\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"migdia\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant situat a la platja amb servei de taula i oferta gastron\u00f2mica variada.\",\r\n    \"cost\": 24,\r\n    \"score\": 92,\r\n    \"notes\": \"platja arroz vespreig\"\r\n  },\r\n  {\r\n    \"id\": \"res-52\",\r\n    \"title\": \"Bar Restaurant Calipso\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant situat a la platja amb cuina mediterr\u00e0nia.\",\r\n    \"cost\": 22,\r\n    \"score\": 84,\r\n    \"notes\": \"platja mediterr\u00e1neo\"\r\n  },\r\n  {\r\n    \"id\": \"res-53\",\r\n    \"title\": \"Restaurant Macario\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.6,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Cuina mediterr\u00e0nia i valenciana, molt orientada als arrossos i a la paella valenciana.\",\r\n    \"cost\": 28,\r\n    \"score\": 94,\r\n    \"notes\": \"arroz paella platja\"\r\n  },\r\n  {\r\n    \"id\": \"res-54\",\r\n    \"title\": \"Casablanca Beer & Grill\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Opci\u00f3 de platja orientada a grill, cerveza, menjars i sopars.\",\r\n    \"cost\": 24,\r\n    \"score\": 83,\r\n    \"notes\": \"informal amigos\"\r\n  },\r\n  {\r\n    \"id\": \"res-55\",\r\n    \"title\": \"Cerveseria Los Delfines\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Cerveseria de platja adequada per a tapes, picoteig o menjars i sopars de cuina alemanys.\",\r\n    \"cost\": 18,\r\n    \"score\": 81,\r\n    \"notes\": \"tapeo amigos platja\"\r\n  },\r\n  {\r\n    \"id\": \"res-56\",\r\n    \"title\": \"Dall\u2019Italiano\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant itali\u00e0 situat a la platja.\",\r\n    \"cost\": 24,\r\n    \"score\": 93,\r\n    \"notes\": \"pizza italiano familia noche\"\r\n  },\r\n  {\r\n    \"id\": \"res-57\",\r\n    \"title\": \"El Fog\u00f3n de More\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant situat a la platja.\",\r\n    \"cost\": 22,\r\n    \"score\": 80,\r\n    \"notes\": \"platja\"\r\n  },\r\n  {\r\n    \"id\": \"res-58\",\r\n    \"title\": \"Haveli Tavernes\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant de cuina hind\u00fa situat a la platja.\",\r\n    \"cost\": 22,\r\n    \"score\": 87,\r\n    \"notes\": \"indio cena\"\r\n  },\r\n  {\r\n    \"id\": \"res-59\",\r\n    \"title\": \"La Bombonera Gastrobar\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"migdia\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Gastrobar de platja adequat per a ambient i oci, tapes, dinar o sopar.\",\r\n    \"cost\": 24,\r\n    \"score\": 82,\r\n    \"notes\": \"vespreig amigos platja\"\r\n  },\r\n  {\r\n    \"id\": \"res-60\",\r\n    \"title\": \"La Gallina Loca\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant de platja per a dinar o sopar.\",\r\n    \"cost\": 22,\r\n    \"score\": 80,\r\n    \"notes\": \"platja\"\r\n  },\r\n  {\r\n    \"id\": \"res-61\",\r\n    \"title\": \"La Mordidita Beach Club\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"migdia\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Beach club per a dinars, ambient i oci i ambient nocturn.\",\r\n    \"cost\": 26,\r\n    \"score\": 85,\r\n    \"notes\": \"vespreig amigos platja\"\r\n  },\r\n  {\r\n    \"id\": \"res-62\",\r\n    \"title\": \"L\u2019Excusa Perfecta\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant de platja orientat a dinar i sopar.\",\r\n    \"cost\": 23,\r\n    \"score\": 80,\r\n    \"notes\": \"platja\"\r\n  },\r\n  {\r\n    \"id\": \"res-63\",\r\n    \"title\": \"Restaurant Puerta del Sol\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"migdia\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant situat a la platja.\",\r\n    \"cost\": 24,\r\n    \"score\": 84,\r\n    \"notes\": \"platja restaurante comida cena\"\r\n  },\r\n  {\r\n    \"id\": \"res-64\",\r\n    \"title\": \"N\u00f2mada Lounge & Restaurant\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"migdia\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Lounge & restaurant vora mar, adequat per a dinar, sopar o allargar la sobretaula.\",\r\n    \"cost\": 26,\r\n    \"score\": 86,\r\n    \"notes\": \"pareja platja cena\"\r\n  },\r\n  {\r\n    \"id\": \"res-65\",\r\n    \"title\": \"Restaurant Altamar\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant de platja adequat per a dinar i sopar.\",\r\n    \"cost\": 26,\r\n    \"score\": 88,\r\n    \"notes\": \"platja\"\r\n  },\r\n  {\r\n    \"id\": \"res-66\",\r\n    \"title\": \"Restaurant El Medi \/ Mediterrani\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant de cuina mediterr\u00e0nia a la platja.\",\r\n    \"cost\": 25,\r\n    \"score\": 86,\r\n    \"notes\": \"mediterr\u00e1neo platja\"\r\n  },\r\n  {\r\n    \"id\": \"res-67\",\r\n    \"title\": \"Restaurant Les Ones\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant de platja per a esmorzars, dinars i sopars.\",\r\n    \"cost\": 23,\r\n    \"score\": 84,\r\n    \"notes\": \"platja\"\r\n  },\r\n  {\r\n    \"id\": \"res-68\",\r\n    \"title\": \"Restaurant Luna Park\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant a la platja de Tavernes.\",\r\n    \"cost\": 25,\r\n    \"score\": 83,\r\n    \"notes\": \"platja\"\r\n  },\r\n  {\r\n    \"id\": \"res-69\",\r\n    \"title\": \"Restaurant San Bernardo\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant situat a la platja amb cuina tradicional.\",\r\n    \"cost\": 22,\r\n    \"score\": 84,\r\n    \"notes\": \"tradicional platja\"\r\n  },\r\n  {\r\n    \"id\": \"res-70\",\r\n    \"title\": \"Aires del Sur\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Especialista en fritures i carns.\",\r\n    \"cost\": 21,\r\n    \"score\": 84,\r\n    \"notes\": \"carne\"\r\n  },\r\n  {\r\n    \"id\": \"res-71\",\r\n    \"title\": \"Bar \u00c1ngel\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Bar amb servei d\u2019esmorzars.\",\r\n    \"cost\": 12,\r\n    \"score\": 89,\r\n    \"notes\": \"almuerzo local\"\r\n  },\r\n  {\r\n    \"id\": \"res-72\",\r\n    \"title\": \"Bar Els Amics\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Bar de poble per a esmorzar, tapes o menjar i sopars.\",\r\n    \"cost\": 20,\r\n    \"score\": 78,\r\n    \"notes\": \"almuerzo tapeo\"\r\n  },\r\n  {\r\n    \"id\": \"res-73\",\r\n    \"title\": \"Bar La Cosa Nostra\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Bar restaurant urb\u00e0 per a esmorzar, dinar o sopar.\",\r\n    \"cost\": 16,\r\n    \"score\": 79,\r\n    \"notes\": \"urbano\"\r\n  },\r\n  {\r\n    \"id\": \"res-74\",\r\n    \"title\": \"Bar Restaurant Astim\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Bar restaurant de poble per a esmorzar o dinar.\",\r\n    \"cost\": 15,\r\n    \"score\": 78,\r\n    \"notes\": \"almuerzo\"\r\n  },\r\n  {\r\n    \"id\": \"res-75\",\r\n    \"title\": \"Bar Tapas Cristal\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Establiment de restauraci\u00f3 especialitzat en tapes.\",\r\n    \"cost\": 17,\r\n    \"score\": 80,\r\n    \"notes\": \"tapas amigos\"\r\n  },\r\n  {\r\n    \"id\": \"res-76\",\r\n    \"title\": \"Bar Murciano\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Bar situat al poble amb servei d\u2019esmorzars, dinars i sopars.\",\r\n    \"cost\": 18,\r\n    \"score\": 79,\r\n    \"notes\": \"almuerzo\"\r\n  },\r\n  {\r\n    \"id\": \"res-77\",\r\n    \"title\": \"Ca Saoret\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Establiment de restauraci\u00f3 amb cuina mediterr\u00e0nia i espanyola.\",\r\n    \"cost\": 19,\r\n    \"score\": 95,\r\n    \"notes\": \"almuerzo local imperdible\"\r\n  },\r\n  {\r\n    \"id\": \"res-78\",\r\n    \"title\": \"Cervesseria Garatge\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Cerveseria urbana per a picoteig i ambient i oci.\",\r\n    \"cost\": 18,\r\n    \"score\": 79,\r\n    \"notes\": \"cerveza vespreig amigos\"\r\n  },\r\n  {\r\n    \"id\": \"res-79\",\r\n    \"title\": \"Exqsa Perfecta \u2013 Passeig\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Opci\u00f3 urbana per a dinar o sopar.\",\r\n    \"cost\": 19,\r\n    \"score\": 77,\r\n    \"notes\": \"urbano\"\r\n  },\r\n  {\r\n    \"id\": \"res-80\",\r\n    \"title\": \"La Casa Viva\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"migdia\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant amb oferta vegetariana, vegana i opcions sense gluten.\",\r\n    \"cost\": 24,\r\n    \"score\": 92,\r\n    \"notes\": \"vegetariano vegano saludable\"\r\n  },\r\n  {\r\n    \"id\": \"res-81\",\r\n    \"title\": \"Legends\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Bar orientat a l\u2019esmorzar.\",\r\n    \"cost\": 14,\r\n    \"score\": 82,\r\n    \"notes\": \"almuerzo\"\r\n  },\r\n  {\r\n    \"id\": \"res-82\",\r\n    \"title\": \"Pizzeria La Vall Expr\u00e9s\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 0.8,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"migdia\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Pizzeria amb forn de llenya i servei per a emportar.\",\r\n    \"cost\": 15,\r\n    \"score\": 88,\r\n    \"notes\": \"pizza familia\"\r\n  },\r\n  {\r\n    \"id\": \"res-83\",\r\n    \"title\": \"Pizzeria Tropical\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Pizzeria situada al poble.\",\r\n    \"cost\": 17,\r\n    \"score\": 79,\r\n    \"notes\": \"pizza\"\r\n  },\r\n  {\r\n    \"id\": \"res-84\",\r\n    \"title\": \"Restaurant 5 Hermanas\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant urb\u00e0 per a dinars i sopars.\",\r\n    \"cost\": 20,\r\n    \"score\": 82,\r\n    \"notes\": \"urbano\"\r\n  },\r\n  {\r\n    \"id\": \"res-85\",\r\n    \"title\": \"Restaurant Bar Pizzeria Anais\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Bar Restaurant pizzeria al poble.\",\r\n    \"cost\": 18,\r\n    \"score\": 78,\r\n    \"notes\": \"pizza\"\r\n  },\r\n  {\r\n    \"id\": \"res-86\",\r\n    \"title\": \"Restaurant Xin\u00e9s Gran Muralla\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant de cuina xinesa situat al poble.\",\r\n    \"cost\": 18,\r\n    \"score\": 78,\r\n    \"notes\": \"asi\u00e1tico\"\r\n  },\r\n  {\r\n    \"id\": \"res-87\",\r\n    \"title\": \"Restaurant Club de Tenis Valldigna\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant ubicat al club de tenis.\",\r\n    \"cost\": 22,\r\n    \"score\": 76,\r\n    \"notes\": \"club\"\r\n  },\r\n  {\r\n    \"id\": \"res-88\",\r\n    \"title\": \"Restaurant Delicias\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant urb\u00e0 per a dinar i sopar.\",\r\n    \"cost\": 17,\r\n    \"score\": 77,\r\n    \"notes\": \"urbano\"\r\n  },\r\n  {\r\n    \"id\": \"res-89\",\r\n    \"title\": \"Restaurant Pizzer\u00eda Ibis\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant pizzeria a Tavernes poble.\",\r\n    \"cost\": 17,\r\n    \"score\": 77,\r\n    \"notes\": \"pizza\"\r\n  },\r\n  {\r\n    \"id\": \"res-90\",\r\n    \"title\": \"Restaurant Mei Zhou\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant de cuina asi\u00e0tica situat al poble.\",\r\n    \"cost\": 18,\r\n    \"score\": 78,\r\n    \"notes\": \"asi\u00e1tico\"\r\n  },\r\n  {\r\n    \"id\": \"res-91\",\r\n    \"title\": \"Restaurant V\u00edctor\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Bar restaurant de poble per a esmorzar, dinar o sopar.\",\r\n    \"cost\": 25,\r\n    \"score\": 79,\r\n    \"notes\": \"almuerzo\"\r\n  },\r\n  {\r\n    \"id\": \"res-92\",\r\n    \"title\": \"Rustiks\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Restaurant urb\u00e0 per a dinar o sopar.\",\r\n    \"cost\": 19,\r\n    \"score\": 78,\r\n    \"notes\": \"cena\"\r\n  },\r\n  {\r\n    \"id\": \"res-93\",\r\n    \"title\": \"Super Pizza\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 0.8,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Establiment amb servei de pizzes per a emportar.\",\r\n    \"cost\": 14,\r\n    \"score\": 76,\r\n    \"notes\": \"pizza\"\r\n  },\r\n  {\r\n    \"id\": \"res-94\",\r\n    \"title\": \"The Black Burger\",\r\n    \"type\": \"restaurante\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1.2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Hamburgueseria situada al poble.\",\r\n    \"cost\": 18,\r\n    \"score\": 83,\r\n    \"notes\": \"burger amigos familia\"\r\n  },\r\n  {\r\n    \"id\": \"alo-95\",\r\n    \"title\": \"Hotel Valldigna\",\r\n    \"type\": \"alojamiento\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 8,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Hotel a Tavernes poble.\",\r\n    \"cost\": 0,\r\n    \"score\": 88,\r\n    \"notes\": \"alojamiento hotel\"\r\n  },\r\n  {\r\n    \"id\": \"alo-96\",\r\n    \"title\": \"Villa Ursula\",\r\n    \"type\": \"alojamiento\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 8,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Allotjament al costat de la zona de platja.\",\r\n    \"cost\": 0,\r\n    \"score\": 85,\r\n    \"notes\": \"alojamiento platja\"\r\n  },\r\n  {\r\n    \"id\": \"alo-97\",\r\n    \"title\": \"VMC Rooms\",\r\n    \"type\": \"alojamiento\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 8,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Habitacions prop de la platja.\",\r\n    \"cost\": 0,\r\n    \"score\": 84,\r\n    \"notes\": \"alojamiento platja\"\r\n  },\r\n  {\r\n    \"id\": \"alo-98\",\r\n    \"title\": \"Rooms Avenida\",\r\n    \"type\": \"alojamiento\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 8,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Allotjament urb\u00e0 a Tavernes poble.\",\r\n    \"cost\": 0,\r\n    \"score\": 80,\r\n    \"notes\": \"alojamiento pueblo\"\r\n  },\r\n  {\r\n    \"id\": \"alo-99\",\r\n    \"title\": \"Camping Car La Finca\",\r\n    \"type\": \"alojamiento\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 8,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"\u00c0rea c\u00e0mper al costat de la platja.\",\r\n    \"cost\": 0,\r\n    \"score\": 79,\r\n    \"notes\": \"camper platja\"\r\n  },\r\n  {\r\n    \"id\": \"alo-100\",\r\n    \"title\": \"Ohana Beach \u00c0rea C\u00e0mper\",\r\n    \"type\": \"alojamiento\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 8,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"\u00c0rea c\u00e0mper a la platja de Tavernes.\",\r\n    \"cost\": 0,\r\n    \"score\": 77,\r\n    \"notes\": \"camper platja\"\r\n  },\r\n  {\r\n    \"id\": \"eve-101\",\r\n    \"title\": \"Falles de Tavernes\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Refer\u00e8ncia festiva del 16 al 19 de mar\u00e7.\",\r\n    \"cost\": 0,\r\n    \"score\": 87,\r\n    \"notes\": \"evento fiesta\"\r\n  },\r\n  {\r\n    \"id\": \"eve-102\",\r\n    \"title\": \"Festivern\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"migdia\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Festival del 29 al 31 de desembre.\",\r\n    \"cost\": 0,\r\n    \"score\": 91,\r\n    \"notes\": \"festival m\u00fasica amigos\"\r\n  },\r\n  {\r\n    \"id\": \"eve-103\",\r\n    \"title\": \"Del Poble Fest\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"migdia\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Festival amb dates variables segons l\u2019edici\u00f3.\",\r\n    \"cost\": 0,\r\n    \"score\": 82,\r\n    \"notes\": \"festival\"\r\n  },\r\n  {\r\n    \"id\": \"eve-104\",\r\n    \"title\": \"Nit de Sant Joan\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"migdia\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Nit tradicional del 23 de juny.\",\r\n    \"cost\": 0,\r\n    \"score\": 84,\r\n    \"notes\": \"platja fiesta noche\"\r\n  },\r\n  {\r\n    \"id\": \"eve-105\",\r\n    \"title\": \"Fira de Sant Jaume\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Fira popular d\u2019atraccions i ambient festiu.\",\r\n    \"cost\": 0,\r\n    \"score\": 83,\r\n    \"notes\": \"familia feria\"\r\n  },\r\n  {\r\n    \"id\": \"eve-106\",\r\n    \"title\": \"Cinema a la fresca \/ cinema d\u2019estiu\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Projeccions estivals a la platja o programaci\u00f3 municipal puntual de cinema a l\u2019aire lliure.\",\r\n    \"cost\": 0,\r\n    \"score\": 78,\r\n    \"notes\": \"familia cine platja noche\"\r\n  },\r\n  {\r\n    \"id\": \"eve-112\",\r\n    \"title\": \"Abril - Setmana Santa\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"La Setmana Santa de Tavernes inclou actes lit\u00fargics i processionals, com el Via Crucis pel Calvari, el trasllat de la Vera Creu i la process\u00f3 del Sant Enterrament.\",\r\n    \"cost\": 0,\r\n    \"score\": 84,\r\n    \"notes\": \"semana santa tradicion procesiones\"\r\n  },\r\n  {\r\n    \"id\": \"eve-113\",\r\n    \"title\": \"Festes Majors\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 4,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"mat\u00ed\",\r\n      \"migdia\",\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Les Festes Majors inclouen activitats com concurs de paelles, festival de bandes, concurs de xarangues, pilota, disfresses i nit de focs artificials.\",\r\n    \"cost\": 0,\r\n    \"score\": 90,\r\n    \"notes\": \"festes majors tradicion pueblo\"\r\n  },\r\n  {\r\n    \"id\": \"eve-114\",\r\n    \"title\": \"1 de maig\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"L\u20191 de maig \u00e9s festa nacional i a Tavernes \u00e9s tradicional pujar a la muntanya de les Tres Creus per a passar la jornada i gaudir de les vistes.\",\r\n    \"cost\": 0,\r\n    \"score\": 82,\r\n    \"notes\": \"tradicion mayo fiesta\"\r\n  },\r\n  {\r\n    \"id\": \"eve-115\",\r\n    \"title\": \"9 d'octubre\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"El 9 d\u2019Octubre inclou tallers did\u00e0ctics i artesanals, especialment pensats per als m\u00e9s menuts, i el concert de la Banda Simf\u00f2nica de Tavernes.\",\r\n    \"cost\": 0,\r\n    \"score\": 82,\r\n    \"notes\": \"tradicion octubre fiesta\"\r\n  },\r\n  {\r\n    \"id\": \"eve-116\",\r\n    \"title\": \"Porrat de la Sang\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"valldigna\",\r\n    \"hours\": 2.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Porrat tradicional orientat a un pla familiar i a la tradici\u00f3 local.\",\r\n    \"cost\": 0,\r\n    \"score\": 84,\r\n    \"notes\": \"porrat tradicion familiar\"\r\n  },\r\n  {\r\n    \"id\": \"eve-117\",\r\n    \"title\": \"Porrat de Sant Lloren\u00e7\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"monduber\",\r\n    \"hours\": 2.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\"\r\n    ],\r\n    \"desc\": \"Porrat lligat a l\u2019entorn de Sant Lloren\u00e7, adequat per a combinar tradici\u00f3 i natura.\",\r\n    \"cost\": 0,\r\n    \"score\": 84,\r\n    \"notes\": \"porrat san lorenzo tradicion\"\r\n  },\r\n  {\r\n    \"id\": \"eve-118\",\r\n    \"title\": \"Sete S\u00f3is Sete Luas\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 3,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Festival cultural i musical segons la programaci\u00f3 anual.\",\r\n    \"cost\": 0,\r\n    \"score\": 86,\r\n    \"notes\": \"festival musica cultura\"\r\n  },\r\n  {\r\n    \"id\": \"eve-119\",\r\n    \"title\": \"Festival de Corals\",\r\n    \"type\": \"evento\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 2.5,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Festival musical coral segons la programaci\u00f3 anual.\",\r\n    \"cost\": 0,\r\n    \"score\": 84,\r\n    \"notes\": \"festival corales musica\"\r\n  },\r\n  {\r\n    \"id\": \"oci-107\",\r\n    \"title\": \"Copes o vespreig en Baladre\",\r\n    \"type\": \"ocio\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Proposta d\u2019oci i consumicions en un establiment de la platja.\",\r\n    \"cost\": 0,\r\n    \"score\": 82,\r\n    \"notes\": \"vespreig copas amigos\"\r\n  },\r\n  {\r\n    \"id\": \"oci-108\",\r\n    \"title\": \"Passeig nocturn per l\u2019Avinguda de la Marina\",\r\n    \"type\": \"ocio\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Pla suau per a acabar el dia.\",\r\n    \"cost\": 0,\r\n    \"score\": 75,\r\n    \"notes\": \"platja paseo noche tranquilo\"\r\n  },\r\n  {\r\n    \"id\": \"oci-109\",\r\n    \"title\": \"Passeig nocturn per Tavernes poble\",\r\n    \"type\": \"ocio\",\r\n    \"zone\": \"pueblo\",\r\n    \"hours\": 1,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Volta tranquil\u00b7la pel nucli urb\u00e0.\",\r\n    \"cost\": 0,\r\n    \"score\": 68,\r\n    \"notes\": \"pueblo paseo tranquilo\"\r\n  },\r\n  {\r\n    \"id\": \"oci-110\",\r\n    \"title\": \"Copes o vespreig en La Bombonera Gastrobar\",\r\n    \"type\": \"ocio\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Proposta d\u2019oci i consumicions al costat de la platja.\",\r\n    \"cost\": 0,\r\n    \"score\": 80,\r\n    \"notes\": \"vespreig copas platja\"\r\n  },\r\n  {\r\n    \"id\": \"oci-111\",\r\n    \"title\": \"Copes o vespreig en La Mordidita Beach Club\",\r\n    \"type\": \"ocio\",\r\n    \"zone\": \"platja\",\r\n    \"hours\": 2,\r\n    \"move\": [\r\n      \"coche\",\r\n      \"pie\",\r\n      \"bici\"\r\n    ],\r\n    \"slots\": [\r\n      \"vesprada\",\r\n      \"nit\"\r\n    ],\r\n    \"desc\": \"Beach club amb ambient i oci i ambient nocturn.\",\r\n    \"cost\": 0,\r\n    \"score\": 82,\r\n    \"notes\": \"vespreig amigos platja\"\r\n  }\r\n];\r\n\r\nconst coordPatch = {\r\n  \"Platja de Tavernes\": { \"lat\": 39.090078963337994, \"lng\": -0.2170801784160719 },\r\n  \"Llac de la Goleta\": { \"lat\": 39.10312853744882, \"lng\": -0.22278208556330922 },\r\n  \"Clot de la Font\": { \"lat\": 39.05708169837652, \"lng\": -0.2745747423274704 },\r\n  \"Font de la Granata\": { \"lat\": 39.09340321510781, \"lng\": -0.28952816613671006 },\r\n  \"Visita a la Cova del Bolomor\": { \"lat\": 39.06389524256403, \"lng\": -0.2503037292673149 },\r\n  \"Escola de vela\": { \"lat\": 39.10325976200742, \"lng\": -0.22155410309260565 },\r\n  \"Carril de kitesurf\": { \"lat\": 39.081956563207164, \"lng\": -0.21150778129306116 },\r\n  \"Carril d\u2019entrada d\u2019embarcacions\": { \"lat\": 39.08746337411143, \"lng\": -0.21483372077186944 },\r\n  \"Platja de la Goleta\": { \"lat\": 39.09912177293142, \"lng\": -0.22074944077030723 },\r\n  \"Parc del Moll\u00f3\": { \"lat\": 39.10409105232547, \"lng\": -0.22618615830573205 },\r\n  \"Parc del Nord\": { \"lat\": 39.10494858305977, \"lng\": -0.22326791488051762 },\r\n  \"Torre de Guaita\": { \"lat\": 39.086219905452495, \"lng\": -0.2179107262353749 },\r\n  \"Carril bici de l\u2019entrada de la platja\": { \"lat\": 39.08719423981628, \"lng\": -0.21684857144468592 },\r\n  \"Ullal Gran\": { \"lat\": 39.081696791340356, \"lng\": -0.24162182660775022 },\r\n  \"Font de la Sangonera\": { \"lat\": 39.086984213592814, \"lng\": -0.2916866316306998 },\r\n  \"Paratge de Sant Lloren\u00e7\": { \"lat\": 39.082276678853574, \"lng\": -0.2553871316309047 },\r\n  \"Mirador del Mediterrani\": { \"lat\": 39.08500826482173, \"lng\": -0.24860650723306568 },\r\n  \"Pic del Massalari\": { \"lat\": 39.09562987342248, \"lng\": -0.2976822847644695 },\r\n  \"Campana del Massalari\": { \"lat\": 39.0901676476069, \"lng\": -0.281375696705547 },\r\n  \"Ruta de les Creus (PR-CV 38)\": { \"lat\": 39.08090715367388, \"lng\": -0.2774274853867399 },\r\n  \"Via ferrada Pas de Cabres\": { \"lat\": 39.07977059871669, \"lng\": -0.273598729838858 },\r\n  \"Via ferrada Les Marujes\": { \"lat\": 39.07644345499099, \"lng\": -0.283686755199953 },\r\n  \"Circuit de marxa n\u00f2rdica\": { \"lat\": 39.07504353681741, \"lng\": -0.2598953242164171 },\r\n  \"La Cisterna\": { \"lat\": 39.0831555373413, \"lng\": -0.258103608759979 },\r\n  \"Ajuntament\": { \"lat\": 39.07184834218302, \"lng\": -0.2677240316312862 },\r\n  \"Esgl\u00e9sia de Sant Pere\": { \"lat\": 39.07284595241503, \"lng\": -0.26713767210484973 },\r\n  \"Esgl\u00e9sia de Sant Josep\": { \"lat\": 39.07457572479507, \"lng\": -0.2715793974193275 },\r\n  \"Calvari\": { \"lat\": 39.07532619598619, \"lng\": -0.26917211534507374 },\r\n  \"Mol\u00ed Vell o del Pla\": { \"lat\": 39.065478544993255, \"lng\": -0.27233504342227705 },\r\n  \"Mercat Municipal\": { \"lat\": 39.0721666178573, \"lng\": -0.26569366046757914 },\r\n  \"Casa de la Cultura\": { \"lat\": 39.073160576305916, \"lng\": -0.26638481341513565 },\r\n  \"Mural VCF del pavell\u00f3 Carlos Pellicer\": { \"lat\": 39.07007956648436, \"lng\": -0.26425654974295515 },\r\n  \"Mural de la Casa de la Cultura (Estell\u00e9s)\": { \"lat\": 39.06948728618269, \"lng\": -0.26813629639738595 },\r\n  \"Baladre\": { \"lat\": 39.08222922110664, \"lng\": -0.21526300028398643 },\r\n  \"Bar Restaurant Calipso\": { \"lat\": 39.092593742093975, \"lng\": -0.21813275912833915 },\r\n  \"Restaurant Macario\": { \"lat\": 39.10013509162634, \"lng\": -0.22136580460720873 },\r\n  \"Casablanca Beer & Grill\": { \"lat\": 39.08758166016625, \"lng\": -0.21594852511362625 },\r\n  \"Cerveseria Los Delfines\": { \"lat\": 39.08269095619182, \"lng\": -0.21330960391158235 },\r\n  \"Dall\u2019Italiano\": { \"lat\": 39.081931011306786, \"lng\": -0.21326937077557143 },\r\n  \"El Fog\u00f3n de More\": { \"lat\": 39.08508524960249, \"lng\": -0.21496452687923168 },\r\n  \"Haveli Tavernes\": { \"lat\": 39.08596799466984, \"lng\": -0.21474726794750276 },\r\n  \"La Bombonera Gastrobar\": { \"lat\": 39.083207297645615, \"lng\": -0.21334715483280298 },\r\n  \"La Gallina Loca\": { \"lat\": 39.09759662915328, \"lng\": -0.2203788931174758 },\r\n  \"La Mordidita Beach Club\": { \"lat\": 39.09865452495847, \"lng\": -0.22263932493635763 },\r\n  \"L\u2019Excusa Perfecta\": { \"lat\": 39.10183314164362, \"lng\": -0.22269615521231936 },\r\n  \"Restaurant Puerta del Sol\": { \"lat\": 39.0874844360736, \"lng\": -0.21542362867441925 },\r\n  \"N\u00f2mada Lounge & Restaurant\": { \"lat\": 39.10327141897599, \"lng\": -0.22226968396992064 },\r\n  \"Restaurant Altamar\": { \"lat\": 39.09787801712504, \"lng\": -0.22050239144070466 },\r\n  \"Restaurant El Medi \/ Mediterrani\": { \"lat\": 39.083367612566704, \"lng\": -0.2133256971602638 },\r\n  \"Restaurant Les Ones\": { \"lat\": 39.08325726597179, \"lng\": -0.2137226641022385 },\r\n  \"Restaurant Luna Park\": { \"lat\": 39.09403529809503, \"lng\": -0.21818594437244127 },\r\n  \"Restaurant San Bernardo\": { \"lat\": 39.096585343265886, \"lng\": -0.21930880842708134 },\r\n  \"Aires del Sur\": { \"lat\": 39.073485808964236, \"lng\": -0.26310478465489145 },\r\n  \"Bar \u00c1ngel\": { \"lat\": 39.074026466353715, \"lng\": -0.260235937301254 },\r\n  \"Bar Els Amics\": { \"lat\": 39.079003406629425, \"lng\": -0.26548287629794376 },\r\n  \"Bar La Cosa Nostra\": { \"lat\": 39.0715615961676, \"lng\": -0.26686403163129535 },\r\n  \"Bar Restaurant Astim\": { \"lat\": 39.07006052332613, \"lng\": -0.2671105162863127 },\r\n  \"Bar Tapas Cristal\": { \"lat\": 39.06954474653355, \"lng\": -0.26881350279511246 },\r\n  \"Bar Murciano\": { \"lat\": 39.06892090578349, \"lng\": -0.2650382865088393 },\r\n  \"Ca Saoret\": { \"lat\": 39.07167760949219, \"lng\": -0.2673813422567982 },\r\n  \"Cervesseria Garatge\": { \"lat\": 39.07336013192499, \"lng\": -0.26317563843912056 },\r\n  \"Exqsa Perfecta \u2013 Passeig\": { \"lat\": 39.071616567994056, \"lng\": -0.2667012590695635 },\r\n  \"La Casa Viva\": { \"lat\": 39.07002836537868, \"lng\": -0.2707287390922631 },\r\n  \"Legends\": { \"lat\": 39.0734096392343, \"lng\": -0.2601931027950059 },\r\n  \"Pizzeria La Vall Expr\u00e9s\": { \"lat\": 39.07320306411841, \"lng\": -0.2639315451224509 },\r\n  \"Pizzeria Tropical\": { \"lat\": 39.07081749181977, \"lng\": -0.2624474586137511 },\r\n  \"Restaurant 5 Hermanas\": { \"lat\": 39.083325476624694, \"lng\": -0.24284615861324998 },\r\n  \"Restaurant Bar Pizzeria Anais\": { \"lat\": 39.0712050908591, \"lng\": -0.26755574697644235 },\r\n  \"Restaurant Chino Gran Muralla\": { \"lat\": 39.07574263418766, \"lng\": -0.25906917301761523 },\r\n  \"Restaurant Club de Tenis Valldigna\": { \"lat\": 39.07929487071183, \"lng\": -0.26252038535322453 },\r\n  \"Restaurant Delicias\": { \"lat\": 39.074783488325465, \"lng\": -0.2627904612189703 },\r\n  \"Restaurant Pizzer\u00eda Ibis\": { \"lat\": 39.07152214279915, \"lng\": -0.2627456162862469 },\r\n  \"Restaurant Mei Zhou\": { \"lat\": 39.07081466105959, \"lng\": -0.2623482018539252 },\r\n  \"Restaurant V\u00edctor\": { \"lat\": 39.07812365121439, \"lng\": -0.2433022569232853 },\r\n  \"Rustiks\": { \"lat\": 39.0706599557694, \"lng\": -0.2641044181401787 },\r\n  \"Super Pizza\": { \"lat\": 39.07134204383321, \"lng\": -0.2659134010280008 },\r\n  \"The Black Burger\": { \"lat\": 39.07223422096353, \"lng\": -0.2671728653132802 },\r\n  \"Hotel Valldigna\": { \"lat\": 39.070667354520786, \"lng\": -0.266997013491229 },\r\n  \"Villa Ursula\": { \"lat\": 39.09434719968148, \"lng\": -0.21837400279415725 },\r\n  \"VMC Rooms\": { \"lat\": 39.08511231506302, \"lng\": -0.21484919188933363 },\r\n  \"Rooms Avenida\": { \"lat\": 39.070667354520786, \"lng\": -0.266997013491229 },\r\n  \"Camping Car La Finca\": { \"lat\": 39.08131993016402, \"lng\": -0.21393286870035835 },\r\n  \"Ohana Beach \u00c0rea C\u00e0mper\": { \"lat\": 39.08763521685332, \"lng\": -0.21826241725137896 }\r\n};\r\n\r\nfor (const item of catalog) {\r\n  const match = coordPatch[item.title];\r\n  if (match) {\r\n    item.lat = match.lat;\r\n    item.lng = match.lng;\r\n  }\r\n}\r\n\r\ncatalog.sort((a, b) => a.title.localeCompare(b.title, 'ca', { sensitivity: 'base' }));\r\n\r\nconst state = {\r\n  tripName:'Escapada a Tavernes',\r\n  startDate:'',\r\n  days:[],\r\n  nextUid:1\r\n};\r\n\r\nconst slotsOrder = ['mat\u00ed','migdia','vesprada','nit'];\r\nconst slotLabels = {'mat\u00ed':'Mat\u00ed','migdia':'Migdia','vesprada':'Vesprada','nit':'Nit'};\r\nconst zoneLabels = {platja:'Platja', pueblo:'Poble', valldigna:'Entorn Valldigna', monduber:'Muntanya \/ Mond\u00faver'};\r\nconst typeLabels = {actividad:'Activitat', restaurante:'Restaurant', alojamiento:'Allotjament', evento:'Esdeveniment', ocio:'Oci'};\r\nconst typeIcons = {actividad:'\ud83e\udded', restaurante:'\ud83c\udf7d\ufe0f', alojamiento:'\ud83d\udecf\ufe0f', evento:'\ud83c\udf89', ocio:'\ud83c\udf19'};\r\n\r\nconst officialLinks = {\r\n  restaurantes:'https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/',\r\n  alojamientos:'https:\/\/www.visitatavernes.es\/allotjaments-i-campings-de-caravanes-tavernes-de-la-valldigna\/',\r\n  bolomor:'https:\/\/www.visitatavernes.es\/ca\/cova-del-bolomor-portals\/',\r\n  edificios:'https:\/\/www.visitatavernes.es\/ca\/tavernes-ciutat\/',\r\n  naturales:'https:\/\/www.visitatavernes.es\/ca\/tavernes-mediambiental-2\/',\r\n  platges:'https:\/\/www.visitatavernes.es\/ca\/platja\/',\r\n  senderismo:'https:\/\/www.visitatavernes.es\/ca\/senderisme\/'\r\n};\r\n\r\nconst officialUrlByTitle = {\r\n  \"Platja de Tavernes\": \"https:\/\/www.visitatavernes.es\/ca\/platja\/\",\r\n  \"Llac de la Goleta\": \"https:\/\/www.visitatavernes.es\/ca\/platja\/\",\r\n  \"Clot de la Font\": \"https:\/\/www.visitatavernes.es\/ca\/clot-de-la-font\/\",\r\n  \"Font de la Granata\": \"https:\/\/www.visitatavernes.es\/ca\/la-granata\/\",\r\n  \"Les Fontetes de Cant\u00fas\": \"https:\/\/www.visitatavernes.es\/ca\/fonteta-de-cantus\/\",\r\n  \"Ruta pel Mond\u00faver\": \"https:\/\/www.visitatavernes.es\/ca\/senderisme\/\",\r\n  \"Visita a la Cova del Bolomor\": \"https:\/\/www.visitatavernes.es\/ca\/cova-del-bolomor-portals\/\",\r\n  \"Ruta cova del Bolomor\": \"https:\/\/www.visitatavernes.es\/ca\/ruta-cova-del-bolomor\/\",\r\n  \"Escola de vela\": \"https:\/\/www.visitatavernes.es\/ca\/platja\/\",\r\n  \"Carril de kitesurf\": \"https:\/\/www.visitatavernes.es\/ca\/platja\/\",\r\n  \"Carril d\u2019entrada d\u2019embarcacions\": \"https:\/\/www.visitatavernes.es\/ca\/platja\/\",\r\n  \"Platja de la Goleta\": \"https:\/\/www.visitatavernes.es\/ca\/platja\/\",\r\n  \"Parc del Moll\u00f3\": \"https:\/\/www.visitatavernes.es\/ca\/platja\/\",\r\n  \"Parc del Nord\": \"https:\/\/www.visitatavernes.es\/ca\/platja\/\",\r\n  \"Torre de Guaita\": \"https:\/\/www.visitatavernes.es\/ca\/torre-de-guaita\/\",\r\n  \"Carril bici de l\u2019entrada de la platja\": \"https:\/\/www.visitatavernes.es\/ca\/platja\/\",\r\n  \"Ruta dels Sentits\": \"https:\/\/www.visitatavernes.es\/ca\/ruta-dels-sentits-3\/\",\r\n  \"Ullal Gran\": \"https:\/\/www.visitatavernes.es\/ca\/ullal-gran-i-de-penyetes\/\",\r\n  \"Ullal de les Penyetes\": \"https:\/\/www.visitatavernes.es\/ca\/ullal-gran-i-de-penyetes\/\",\r\n  \"Font de la Sangonera\": \"https:\/\/www.visitatavernes.es\/ca\/la-sangonera\/\",\r\n  \"Paratge de Sant Lloren\u00e7\": \"https:\/\/www.visitatavernes.es\/ca\/sant-llorenc-2\/\",\r\n  \"Mirador del Mediterrani\": \"https:\/\/www.visitatavernes.es\/ca\/mirador-de-la-mediterrania\/\",\r\n  \"Pic del Massalari\": \"https:\/\/www.visitatavernes.es\/ca\/massalari\/\",\r\n  \"Campana del Massalari\": \"https:\/\/www.visitatavernes.es\/ca\/massalari\/\",\r\n  \"Ruta de les Creus (PR-CV 38)\": \"https:\/\/www.visitatavernes.es\/ca\/ruta-de-les-creus\/\",\r\n  \"Via ferrada Pas de Cabres\": \"https:\/\/www.visitatavernes.es\/ca\/senderisme\/\",\r\n  \"Via ferrada Les Marujes\": \"https:\/\/www.visitatavernes.es\/ca\/via-ferrata\/\",\r\n  \"Ruta de la Cadira\": \"https:\/\/www.visitatavernes.es\/ca\/senderisme\/\",\r\n  \"Ruta de l\u2019Ombria\": \"https:\/\/www.visitatavernes.es\/ca\/lombria\/\",\r\n  \"Castell de la Reina Mora\": \"https:\/\/www.visitatavernes.es\/ca\/senderisme\/\",\r\n  \"Via Verda - Trenet (GR-236)\": \"https:\/\/www.visitatavernes.es\/ca\/senderisme\/\",\r\n  \"Circuit de marxa n\u00f2rdica\": \"https:\/\/www.visitatavernes.es\/ca\/senderisme\/\",\r\n  \"Rac\u00f3 de Joana\": \"https:\/\/www.visitatavernes.es\/ca\/raco-de-joana-ullals\/\",\r\n  \"La Cisterna\": \"https:\/\/www.visitatavernes.es\/ca\/senderisme\/\",\r\n  \"Pla de les Foietes\": \"https:\/\/www.visitatavernes.es\/ca\/senderisme\/\",\r\n  \"Ajuntament\": \"https:\/\/www.visitatavernes.es\/ca\/ajuntament\/\",\r\n  \"Esgl\u00e9sia de Sant Pere\": \"https:\/\/www.visitatavernes.es\/ca\/esglesia-sant-pere\/\",\r\n  \"Esgl\u00e9sia de Sant Josep\": \"https:\/\/www.visitatavernes.es\/ca\/esglesia-sant-josep\/\",\r\n  \"Calvari\": \"https:\/\/www.visitatavernes.es\/ca\/el-calvari\/\",\r\n  \"Mol\u00ed Vell o del Pla\": \"https:\/\/www.visitatavernes.es\/ca\/el-moli\/\",\r\n  \"Mol\u00ed de Tonet\": \"https:\/\/www.visitatavernes.es\/ca\/tavernes-ciutat\/\",\r\n  \"Ermita de Sant Lloren\u00e7\": \"https:\/\/www.visitatavernes.es\/ca\/ermita-de-sant-llorenc-de-lalcudiola\/\",\r\n  \"Mercat Municipal\": \"https:\/\/www.visitatavernes.es\/ca\/mercat-municipal\/\",\r\n  \"Casa de la Cultura\": \"https:\/\/www.visitatavernes.es\/ca\/casa-de-la-cultura\/\",\r\n  \"Mural VCF del pavell\u00f3 Carlos Pellicer\": \"https:\/\/www.visitatavernes.es\/arte-urbano\/\",\r\n  \"Mural de la Casa de la Cultura (Estell\u00e9s)\": \"https:\/\/www.visitatavernes.es\/arte-urbano\/\",\r\n  \"Mural de ferro de la Torreta\": \"https:\/\/www.visitatavernes.es\/arte-urbano\/\",\r\n  \"Badell i entorn del riu Vaca\": \"https:\/\/www.visitatavernes.es\/ca\/tavernes-mediambiental-2\/\",\r\n  \"Passeig per l\u2019Avinguda de la Marina\": \"https:\/\/www.visitatavernes.es\/ca\/platja\/\",\r\n  \"Passeig cultural pel centre hist\u00f2ric\": \"https:\/\/www.visitatavernes.es\/ca\/tavernes-ciutat\/\",\r\n  \"Baladre\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Bar Restaurant Calipso\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant Macario\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Casablanca Beer & Grill\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Cerveseria Los Delfines\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Dall\u2019Italiano\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"El Fog\u00f3n de More\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Haveli Tavernes\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"La Bombonera Gastrobar\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"La Gallina Loca\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"La Mordidita Beach Club\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"L\u2019Excusa Perfecta\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant Puerta del Sol\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"N\u00f2mada Lounge & Restaurant\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant Altamar\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant El Medi \/ Mediterrani\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant Les Ones\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant Luna Park\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant San Bernardo\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Aires del Sur\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Bar \u00c1ngel\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Bar Els Amics\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Bar La Cosa Nostra\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Bar Restaurant Astim\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Bar Tapas Cristal\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Bar Murciano\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Ca Saoret\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Cervesseria Garatge\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Exqsa Perfecta \u2013 Passeig\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"La Casa Viva\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Legends\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Pizzeria La Vall Expr\u00e9s\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Pizzeria Tropical\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant 5 Hermanas\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant Bar Pizzeria Anais\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant Chino Gran Muralla\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant Club de Tenis Valldigna\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant Delicias\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant Pizzer\u00eda Ibis\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant Mei Zhou\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Restaurant V\u00edctor\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Rustiks\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Super Pizza\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"The Black Burger\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Hotel Valldigna\": \"https:\/\/www.visitatavernes.es\/allotjaments-i-campings-de-caravanes-tavernes-de-la-valldigna\/\",\r\n  \"Villa Ursula\": \"https:\/\/www.visitatavernes.es\/allotjaments-i-campings-de-caravanes-tavernes-de-la-valldigna\/\",\r\n  \"VMC Rooms\": \"https:\/\/www.visitatavernes.es\/allotjaments-i-campings-de-caravanes-tavernes-de-la-valldigna\/\",\r\n  \"Rooms Avenida\": \"https:\/\/www.visitatavernes.es\/allotjaments-i-campings-de-caravanes-tavernes-de-la-valldigna\/\",\r\n  \"Camping Car La Finca\": \"https:\/\/www.visitatavernes.es\/allotjaments-i-campings-de-caravanes-tavernes-de-la-valldigna\/\",\r\n  \"Ohana Beach \u00c0rea C\u00e0mper\": \"https:\/\/www.visitatavernes.es\/allotjaments-i-campings-de-caravanes-tavernes-de-la-valldigna\/\",\r\n  \"Falles de Tavernes\": \"https:\/\/www.visitatavernes.es\/ca\/falles\/\",\r\n  \"Festivern\": \"https:\/\/www.visitatavernes.es\/ca\/festivern\/\",\r\n  \"Del Poble Fest\": \"https:\/\/www.visitatavernes.es\/del-poble-fest\/\",\r\n  \"Nit de Sant Joan\": \"https:\/\/www.visitatavernes.es\/ca\/juny\/\",\r\n  \"Fira de Sant Jaume\": \"https:\/\/www.visitatavernes.es\/ca\/juliol-fira-de-sant-jaume\/\",\r\n  \"Cinema a la fresca \/ cinema d\u2019estiu\": \"\",\r\n  \"Copes o vespreig en Baladre\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Passeig nocturn per l\u2019Avinguda de la Marina\": \"https:\/\/www.visitatavernes.es\/ca\/platja\/\",\r\n  \"Passeig nocturn per Tavernes poble\": \"https:\/\/www.visitatavernes.es\/ca\/tavernes-ciutat\/\",\r\n  \"Copes o vespreig en La Bombonera Gastrobar\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Copes o vespreig en La Mordidita Beach Club\": \"https:\/\/www.visitatavernes.es\/ca\/guia-restaurants\/\",\r\n  \"Abril - Setmana Santa\": \"https:\/\/www.visitatavernes.es\/ca\/setmana-santa\/\",\r\n  \"Festes Majors\": \"https:\/\/www.visitatavernes.es\/ca\/festes-majors\/\",\r\n  \"1 de maig\": \"https:\/\/www.visitatavernes.es\/ca\/1-de-maig\/\",\r\n  \"9 d'octubre\": \"https:\/\/www.visitatavernes.es\/ca\/9-doctubre\/\",\r\n  \"Porrat de la Sang\": \"https:\/\/www.visitatavernes.es\/ca\/porrats\/\",\r\n  \"Porrat de Sant Lloren\u00e7\": \"https:\/\/www.visitatavernes.es\/ca\/sant-llorenc\/\",\r\n  \"Sete S\u00f3is Sete Luas\": \"https:\/\/www.visitatavernes.es\/ca\/sete-sois-sete-luas\/\",\r\n  \"Festival de Corals\": \"https:\/\/www.visitatavernes.es\/ca\/turisme-cultural\/\"\r\n};\r\n\r\n\r\nconst tripName = document.getElementById('tripName');\r\nconst tripStart = document.getElementById('tripStart');\r\nconst numDays = document.getElementById('numDays');\r\nconst daysContainer = document.getElementById('daysContainer');\r\nconst catalogGrid = document.getElementById('catalogGrid');\r\nconst catalogCount = document.getElementById('catalogCount');\r\nconst tripWho = document.getElementById('tripWho');\r\nconst tripMove = document.getElementById('tripMove');\r\nconst tripPace = document.getElementById('tripPace');\r\nconst mapVisibleCount = document.getElementById('mapVisibleCount');\r\nconst mapPlannedCount = document.getElementById('mapPlannedCount');\r\nconst mapList = document.getElementById('mapList');\r\nconst mapOnlyPlanned = document.getElementById('mapOnlyPlanned');\r\n\r\nfor(let i=1;i<=10;i++){\r\n  const op=document.createElement('option');\r\n  op.value=i;\r\n  op.textContent=i;\r\n  if(i===1) op.selected=true;\r\n  numDays.appendChild(op);\r\n}\r\n\r\nfunction euro(v){\r\n  return new Intl.NumberFormat('ca-ES',{style:'currency',currency:'EUR',maximumFractionDigits:0}).format(v || 0);\r\n}\r\nfunction fmtHours(v){\r\n  return v ? String(v).replace('.0','') + ' h' : 'Duraci\u00f3 variable';\r\n}\r\nfunction prettyMoves(arr){\r\n  const list=(arr && arr.length ? arr : ['coche','pie','bici']);\r\n  const order=['pie','bici','coche'];\r\n  const labels = {pie:'a peu', bici:'bici', coche:'cotxe'};\r\n  return order.filter(o=>list.includes(o)).map(o => labels[o] || o).join(' \u00b7 ');\r\n}\r\nfunction dateLabel(offset){\r\n  const base = new Date(state.startDate + 'T00:00:00');\r\n  base.setDate(base.getDate() + offset);\r\n  return base.toLocaleDateString('ca-ES',{weekday:'long', day:'numeric', month:'long'});\r\n}\r\nfunction normalizeText(t){\r\n  return (t || '').toLowerCase().normalize('NFD').replace(\/[\\u0300-\\u036f]\/g,'');\r\n}\r\nfunction getTypeIcon(type){\r\n  return typeIcons[type] || '\ud83d\udccd';\r\n}\r\n\r\nfunction getGoogleMapsDirectionsUrl(item){\r\n  if(!item || !Number.isFinite(item.lat) || !Number.isFinite(item.lng)) return '';\r\n  return `https:\/\/www.google.com\/maps\/dir\/?api=1&destination=${item.lat},${item.lng}`;\r\n}\r\n\r\nfunction getTodayISO(){\r\n  const today = new Date();\r\n  const yyyy = today.getFullYear();\r\n  const mm = String(today.getMonth() + 1).padStart(2, '0');\r\n  const dd = String(today.getDate()).padStart(2, '0');\r\n  return `${yyyy}-${mm}-${dd}`;\r\n}\r\n\r\n\r\nfunction inferInterestTags(item){\r\n  const hay = normalizeText([item.title,item.desc,item.zone,item.type,item.notes || ''].join(' '));\r\n  const tags = [];\r\n  if (hay.includes('platja') || hay.includes('goleta') || hay.includes('mar')) tags.push('playa');\r\n  if (hay.includes('natura') || hay.includes('naturaleza') || hay.includes('ullal') || hay.includes('paratge') || hay.includes('paraje') || hay.includes('font') || hay.includes('clot')) tags.push('naturaleza');\r\n  if (hay.includes('senderisme') || hay.includes('senderismo') || hay.includes('ruta') || hay.includes('ferrata') || hay.includes('monduber') || hay.includes('creus') || hay.includes('cruces')) tags.push('senderismo');\r\n  if (hay.includes('patrimoni') || hay.includes('patrimonio') || hay.includes('esglesia') || hay.includes('iglesia') || hay.includes('moli') || hay.includes('mol\u00ed') || hay.includes('ajuntament') || hay.includes('ayuntamiento') || hay.includes('cultura') || hay.includes('bolomor') || hay.includes('torre')) tags.push('patrimonio');\r\n  if (item.type === 'restaurante') tags.push('gastronomia');\r\n  if (hay.includes('familia') || hay.includes('fam\u00edlia') || hay.includes('xiquets') || hay.includes('ni\u00f1os') || hay.includes('cine') || hay.includes('cinema') || hay.includes('fira') || hay.includes('feria') || hay.includes('pizza')) tags.push('familia');\r\n  if (hay.includes('ambient') || hay.includes('oci') || hay.includes('vespreig') || hay.includes('copes') || hay.includes('copas') || hay.includes('beach club') || hay.includes('festival')) tags.push('vespreig');\r\n  return [...new Set(tags)];\r\n}\r\n\r\nfunction matchesDuration(item, filterDuration){\r\n  const h = Number(item.hours) || 0;\r\n  if(!filterDuration) return true;\r\n  if(filterDuration === 'corta') return h <= 1.5;\r\n  if(filterDuration === 'media') return h > 1.5 && h <= 3;\r\n  if(filterDuration === 'larga') return h > 3;\r\n  return true;\r\n}\r\n\r\nfunction inferSearchIntent(searchText){\r\n  const q = normalizeText(searchText);\r\n  if(!q) return '';\r\n  if(q.includes('restaurant') || q.includes('restaurante') || q.includes('menjar') || q.includes('sopar') || q.includes('esmorzar') || q.includes('pizza') || q.includes('arr\u00f2s') || q.includes('arroz')) return 'restaurante';\r\n  if(q.includes('hotel') || q.includes('allotjament') || q.includes('alojamiento') || q.includes('apartament') || q.includes('camper') || q.includes('dormir')) return 'alojamiento';\r\n  if(q.includes('esdeveniment') || q.includes('evento') || q.includes('festival') || q.includes('fira') || q.includes('feria') || q.includes('falles') || q.includes('cine') || q.includes('cinema')) return 'evento';\r\n  if(q.includes('copes') || q.includes('copas') || q.includes('ambient') || q.includes('oci') || q.includes('ocio') || q.includes('nit') || q.includes('noche')) return 'ocio';\r\n  if(q.includes('platja') || q.includes('ruta') || q.includes('bolomor') || q.includes('senderismo') || q.includes('mirador') || q.includes('paraje') || q.includes('actividad')) return 'actividad';\r\n  return '';\r\n}\r\n\r\nfunction getPreferenceModel(){\r\n  return {\r\n    who: tripWho.value,\r\n    move: tripMove.value,\r\n    pace: tripPace.value,\r\n    notes: ''\r\n  };\r\n}\r\n\r\nfunction getPersonalScore(item){\r\n  const pref = getPreferenceModel();\r\n  let score = item.score || 0;\r\n  let reasons = [];\r\n\r\n  if(pref.move !== 'cualquiera'){\r\n    if((item.move || []).includes(pref.move)){\r\n      score += 12;\r\n      reasons.push('encaixa amb el teu transport');\r\n    } else {\r\n      score -= 10;\r\n    }\r\n  }\r\n\r\n  if(pref.pace === 'tranquilo'){\r\n    if((item.hours || 0) <= 1.5){ score += 10; reasons.push('ritme tranquil'); }\r\n    if((item.hours || 0) >= 3.5){ score -= 8; }\r\n    if(item.type === 'ocio' || item.type === 'restaurante'){ score += 4; }\r\n  }\r\n\r\n  if(pref.pace === 'activo'){\r\n    if((item.hours || 0) >= 2){ score += 10; reasons.push('ritme actiu'); }\r\n    if(item.zone === 'monduber' || (item.notes || '').includes('senderismo') || (item.notes || '').includes('deporte')){ score += 8; }\r\n  }\r\n\r\n  if(pref.pace === 'equilibrado'){\r\n    if((item.hours || 0) >= 1 && (item.hours || 0) <= 2.5){ score += 5; }\r\n  }\r\n\r\n  if(pref.who === 'familia'){\r\n    if((item.notes || '').includes('familia') || item.type === 'actividad'){ score += 8; reasons.push('pla familiar'); }\r\n    if(item.type === 'ocio' && (item.notes || '').includes('copas')){ score -= 8; }\r\n    if(item.type === 'restaurante' && ((item.notes || '').includes('pizza') || (item.notes || '').includes('local'))){ score += 5; }\r\n  }\r\n\r\n  if(pref.who === 'pareja'){\r\n    if(item.zone === 'platja' || item.type === 'restaurante'){ score += 6; reasons.push('bona opci\u00f3 per a parella'); }\r\n    if((item.notes || '').includes('pareja') || (item.notes || '').includes('mirador')){ score += 5; }\r\n  }\r\n\r\n  if(pref.who === 'amigos'){\r\n    if(item.type === 'ocio' || item.type === 'evento'){ score += 10; reasons.push('millor per a amics'); }\r\n    if((item.notes || '').includes('vespreig') || (item.notes || '').includes('festival') || (item.notes || '').includes('copas')){ score += 8; }\r\n  }\r\n\r\n  if(pref.who === 'solo'){\r\n    if((item.hours || 0) <= 2){ score += 5; }\r\n    if(item.type === 'actividad' || item.type === 'restaurante'){ score += 4; }\r\n  }\r\n\r\n  if(pref.who === 'grupo'){\r\n    if(item.type === 'restaurante' || item.type === 'evento' || item.type === 'ocio'){ score += 7; reasons.push('\u00fatil per a grup'); }\r\n  }\r\n\r\n  if(pref.notes){\r\n    const hay = normalizeText([item.title,item.desc,item.zone,item.type,item.notes || ''].join(' '));\r\n    const words = pref.notes.split(\/[\\s,;]+\/).filter(Boolean);\r\n    let hits = 0;\r\n    words.forEach(w => {\r\n      if(w.length >= 3 && hay.includes(w)) hits++;\r\n    });\r\n    if(hits){\r\n      score += hits * 8;\r\n      reasons.push('coincideix amb les teues observacions');\r\n    }\r\n  }\r\n\r\n  return {\r\n    finalScore: Math.round(score),\r\n    recommended: score >= (item.score + 12),\r\n    reasons\r\n  };\r\n}\r\n\r\nfunction getTopRecommendations(){\r\n  return catalog\r\n    .map(item => ({...item, pref:getPersonalScore(item)}))\r\n    .sort((a,b)=>b.pref.finalScore - a.pref.finalScore)\r\n    .slice(0,3)\r\n    .map(x=>x.title);\r\n}\r\n\r\nfunction getOfficialLink(item){\r\n  if (officialUrlByTitle[item.title] !== undefined) {\r\n    return officialUrlByTitle[item.title] || '';\r\n  }\r\n\r\n  const hay = normalizeText([item.title, item.desc, item.notes || '', item.zone].join(' '));\r\n\r\n  if (hay.includes('bolomor')) return officialLinks.bolomor;\r\n  if (item.type === 'restaurante') return officialLinks.restaurantes;\r\n  if (item.type === 'alojamiento') return officialLinks.alojamientos;\r\n\r\n  if (hay.includes('iglesia de san pedro') || hay.includes('iglesia de san jose') || hay.includes('ayuntamiento') || hay.includes('moli') || hay.includes('calvario') || hay.includes('casa de la cultura') || hay.includes('ermita')) return officialLinks.edificios;\r\n  if (hay.includes('platja') || hay.includes('goleta') || hay.includes('avinguda de la marina') || hay.includes('torre de guaita')) return officialLinks.platges;\r\n  if (hay.includes('ruta') || hay.includes('senderismo') || hay.includes('ferrata') || hay.includes('cruces') || hay.includes('ombria') || hay.includes('cadira') || hay.includes('les marujes') || hay.includes('via verda')) return officialLinks.senderismo;\r\n  if (hay.includes('ullal') || hay.includes('clot') || hay.includes('font') || hay.includes('mirador') || hay.includes('paratge') || hay.includes('massalari') || hay.includes('cantus') || hay.includes('sangonera') || hay.includes('sant llorenc')) return officialLinks.naturales;\r\n\r\n  return item.type === 'actividad' ? officialLinks.naturales : '';\r\n}\r\n\r\nfunction buildEnhancedDescription(item){\r\n  const icon = getTypeIcon(item.type);\r\n  const duration = fmtHours(item.hours);\r\n  const zone = zoneLabels[item.zone] || item.zone;\r\n  const zoneSentenceLabels = {platja:'la platja', pueblo:'el poble', valldigna:'l\u2019entorn Valldigna', monduber:'la muntanya \/ Mond\u00faver'};\r\n  const zoneSentence = zoneSentenceLabels[item.zone] || zone.toLowerCase();\r\n  const interestTags = inferInterestTags(item);\r\n  const bestMoment = (item.slots || []).length ? (item.slots || []).map(s => slotLabels[s]).filter(Boolean).join(', ') : 'qualsevol moment';\r\n  const move = prettyMoves(item.move);\r\n\r\n  let intro = item.desc || '';\r\n  let practical = '';\r\n\r\n  if(item.type === 'actividad'){\r\n    practical = `Es tracta d\u2019una activitat situada a ${zoneSentence}, prevista habitualment per a ${bestMoment.toLowerCase()}. La duraci\u00f3 orientativa \u00e9s de ${duration.toLowerCase()} i l\u2019acc\u00e9s es fa habitualment en ${move}.`;\r\n  } else if(item.type === 'restaurante'){\r\n    practical = `Es tracta d\u2019una proposta de restauraci\u00f3 ubicada a ${zoneSentence}, disponible habitualment en ${bestMoment.toLowerCase()}. La duraci\u00f3 orientativa \u00e9s de ${duration.toLowerCase()}.`;\r\n  } else if(item.type === 'alojamiento'){\r\n    practical = `Es tracta d\u2019una proposta d\u2019allotjament situada a ${zoneSentence}, pensada com a base d\u2019estada durant el viatge.`;\r\n  } else if(item.type === 'evento'){\r\n    practical = `Es tracta d\u2019un esdeveniment del calendari local, previst habitualment en ${bestMoment.toLowerCase()}, subjecte a la programaci\u00f3 i a les dates de celebraci\u00f3.`;\r\n  } else if(item.type === 'ocio'){\r\n    practical = `Es tracta d\u2019una proposta d\u2019oci situada a ${zoneSentence}, prevista habitualment per a ${bestMoment.toLowerCase()}.`;\r\n  }\r\n\r\n  if(interestTags.includes('familia')) practical += ' Pot formar part d\u2019un itinerari familiar.';\r\n  if(interestTags.includes('vespreig')) practical += ' Est\u00e0 vinculada a l\u2019oci i a l\u2019ambient de la zona.';\r\n  if(interestTags.includes('patrimonio')) practical += ' Forma part del patrimoni o de l\u2019oferta cultural local.';\r\n  if(interestTags.includes('naturaleza')) practical += ' S\u2019inscriu en l\u2019entorn natural del municipi.';\r\n\r\n  return `<span class=\"help-strong\">${icon} ${intro}<\/span> ${practical}`;\r\n}\r\n\r\nfunction createDays(n){\r\n  state.days = [];\r\n  for(let i=0;i<n;i++){\r\n    state.days.push({\r\n      id:'day-'+(i+1),\r\n      title:'Dia ' + (i+1),\r\n      slots:{'mat\u00ed':[], 'migdia':[], 'vesprada':[], 'nit':[]}\r\n    });\r\n  }\r\n  numDays.value = String(state.days.length);\r\n  renderAll();\r\n}\r\n\r\nfunction addDay(){\r\n  const idx = state.days.length + 1;\r\n  state.days.push({\r\n    id:'day-'+idx,\r\n    title:'Dia ' + idx,\r\n    slots:{'mat\u00ed':[], 'migdia':[], 'vesprada':[], 'nit':[]}\r\n  });\r\n  numDays.value = state.days.length;\r\n  renderAll();\r\n}\r\n\r\nfunction addItemToPlan(itemId, dayIndex, slot){\r\n  const source = catalog.find(x => x.id === itemId);\r\n  if(!source || !state.days[dayIndex]) return;\r\n  const clone = JSON.parse(JSON.stringify(source));\r\n  clone.uid = 'u' + (state.nextUid++);\r\n  state.days[dayIndex].slots[slot].push(clone);\r\n  renderAll();\r\n}\r\n\r\nfunction removeItem(dayIndex, slot, uid){\r\n  state.days[dayIndex].slots[slot] = state.days[dayIndex].slots[slot].filter(x => x.uid !== uid);\r\n  renderAll();\r\n}\r\n\r\nfunction getPlannedOccurrences(){\r\n  const map = {};\r\n  state.days.forEach((day) => {\r\n    slotsOrder.forEach(slot => {\r\n      (day.slots[slot] || []).forEach(item => {\r\n        if(!map[item.id]) map[item.id] = [];\r\n        map[item.id].push(`${day.title} \u00b7 ${slotLabels[slot]}`);\r\n      });\r\n    });\r\n  });\r\n  return map;\r\n}\r\n\r\nfunction getPlannedItemIds(){\r\n  const ids = new Set();\r\n  state.days.forEach(day => {\r\n    slotsOrder.forEach(slot => {\r\n      (day.slots[slot] || []).forEach(item => ids.add(item.id));\r\n    });\r\n  });\r\n  return ids;\r\n}\r\n\r\nfunction updateStats(){\r\n  const allItems = state.days.flatMap(d => slotsOrder.flatMap(s => d.slots[s]));\r\n  const totalStops = allItems.length;\r\n  const totalHours = allItems.reduce((a,b)=>a+(Number(b.hours)||0),0);\r\n  const totals = {actividad:0, restaurante:0, alojamiento:0, evento:0, ocio:0};\r\n\r\n  allItems.forEach(item => {\r\n    totals[item.type] = (totals[item.type]||0) + (Number(item.cost)||0);\r\n  });\r\n\r\n  const other = (totals.evento||0) + (totals.ocio||0);\r\n\r\n  document.getElementById('statDays').textContent = state.days.length;\r\n  document.getElementById('statStops').textContent = totalStops;\r\n  document.getElementById('statHours').textContent = totalHours.toFixed(1).replace('.0','') + ' h';\r\n  document.getElementById('statBudget').textContent = euro(Object.values(totals).reduce((a,b)=>a+b,0)).replace(',00','');\r\n  const statDays = document.getElementById('statDays');\r\n  const statStops = document.getElementById('statStops');\r\n  const statHours = document.getElementById('statHours');\r\n  const statBudget = document.getElementById('statBudget');\r\n  if(statDays) statDays.textContent = state.days.length;\r\n  if(statStops) statStops.textContent = totalStops;\r\n  if(statHours) statHours.textContent = totalHours.toFixed(1).replace('.0','') + ' h';\r\n  if(statBudget) statBudget.textContent = euro(Object.values(totals).reduce((a,b)=>a+b,0)).replace(',00','');\r\n  document.getElementById('bAct').textContent = euro(totals.actividad||0).replace(',00','');\r\n  document.getElementById('bFood').textContent = euro(totals.restaurante||0).replace(',00','');\r\n  document.getElementById('bStay').textContent = euro(totals.alojamiento||0).replace(',00','');\r\n  document.getElementById('bOther').textContent = euro(other).replace(',00','');\r\n  document.getElementById('bTotal').textContent = euro(Object.values(totals).reduce((a,b)=>a+b,0)).replace(',00','');\r\n\r\n  const prefsSummary = document.getElementById('prefsSummary');\r\n  if (prefsSummary) {\r\n    prefsSummary.textContent =\r\n      `Classificaci\u00f3 din\u00e0mica activa. Segons el perfil de viatge seleccionat, el cat\u00e0leg ordena les propostes segons ${tripWho.options[tripWho.selectedIndex].text.toLowerCase()}, la teua manera de moure\u2019t i el ritme triat. Exemples: ${getTopRecommendations().join(', ')}.`;\r\n  }\r\n}\r\n\r\nfunction renderDays(){\r\n  if(!state.days.length){\r\n    daysContainer.innerHTML = '<div class=\"empty\">Prem <strong>Generar dies<\/strong> per a comen\u00e7ar a construir el viatge.<\/div>';\r\n    return;\r\n  }\r\n\r\n  const plannedIds = getPlannedItemIds();\r\n\r\n  daysContainer.innerHTML = state.days.map((day, dayIndex) => `\r\n    <div class=\"day-card\">\r\n      <div class=\"day-head\">\r\n        <h3>${day.title}<\/h3>\r\n        <div class=\"day-date\">${dateLabel(dayIndex)}<\/div>\r\n      <\/div>\r\n      <div class=\"slot-grid\">\r\n        ${slotsOrder.map(slot => `\r\n          <div class=\"slot\">\r\n            <div>\r\n              <h4>${slotLabels[slot]}<\/h4>\r\n              <div class=\"slot-meta\">${(day.slots[slot]||[]).length} pla(ns)<\/div>\r\n            <\/div>\r\n            ${(day.slots[slot]||[]).length ? day.slots[slot].map(item => `\r\n              <div class=\"plan-item\">\r\n                <div class=\"plan-top\">\r\n                  <div class=\"title-row\">\r\n                    <span class=\"icon-badge\">${getTypeIcon(item.type)}<\/span>\r\n                    <div class=\"plan-title\">${item.title}<\/div>\r\n                  <\/div>\r\n                  <div class=\"price-pill\">${Number(item.cost)||0 ? euro(item.cost).replace(',00','') : 'Gratis'}<\/div>\r\n                <\/div>\r\n                <div class=\"tags\">\r\n                  <span class=\"tag type-${item.type}\">${typeLabels[item.type]}<\/span>\r\n                  <span class=\"tag\">${zoneLabels[item.zone] || item.zone}<\/span>\r\n                  <span class=\"tag\">${fmtHours(item.hours)}<\/span>\r\n                  <span class=\"tag\">${prettyMoves(item.move)}<\/span>\r\n                  ${plannedIds.has(item.id) ? '<span class=\"tag planned\">En el teu viatge<\/span>' : ''}\r\n                <\/div>\r\n                <div class=\"help\">${buildEnhancedDescription(item)}<\/div>\r\n                <div class=\"controls-inline\">\r\n                  ${item.lat && item.lng ? `<span class=\"map-focus-link\" data-map-focus=\"${item.id}\">Veure en el mapa<\/span>` : ''}\r\n                  ${item.lat && item.lng ? `<a class=\"plan-link\" href=\"${getGoogleMapsDirectionsUrl(item)}\" target=\"_blank\" rel=\"noopener noreferrer\">Com arribar<\/a>` : ''}\r\n                  ${getOfficialLink(item) ? `<a class=\"plan-link\" href=\"${getOfficialLink(item)}\" target=\"_blank\" rel=\"noopener noreferrer\">Veure info oficial<\/a>` : ''}\r\n                  <button class=\"tiny-btn\" onclick=\"removeItem(${dayIndex}, '${slot}', '${item.uid}')\">Eliminar<\/button>\r\n                <\/div>\r\n              <\/div>\r\n            `).join('') : '<div class=\"slot-empty\">Sense elements encara.<\/div>'}\r\n          <\/div>\r\n        `).join('')}\r\n      <\/div>\r\n    <\/div>\r\n  `).join('');\r\n\r\n  bindMapFocusLinks();\r\n}\r\n\r\nfunction matchesFilters(item){\r\n  const t = document.getElementById('filterType').value;\r\n  const z = document.getElementById('filterZone').value;\r\n  const s = document.getElementById('filterSlot').value;\r\n  const m = document.getElementById('filterMove').value;\r\n  const i = document.getElementById('filterInterest').value;\r\n  const d = document.getElementById('filterDuration').value;\r\n  const rawSearch = document.getElementById('search').value.trim();\r\n  const q = normalizeText(rawSearch);\r\n  const intent = inferSearchIntent(rawSearch);\r\n\r\n  if(t && item.type !== t) return false;\r\n  if(z && item.zone !== z) return false;\r\n  if(s && !(item.slots||[]).includes(s)) return false;\r\n  if(m && !((item.move||['coche','pie','bici']).includes(m))) return false;\r\n  if(d && !matchesDuration(item, d)) return false;\r\n\r\n  if(i){\r\n    const interests = inferInterestTags(item);\r\n    if(!interests.includes(i)) return false;\r\n  }\r\n\r\n  if(intent && !t && item.type !== intent){\r\n    const interests = inferInterestTags(item);\r\n    if(intent !== 'actividad' || item.type !== 'actividad'){\r\n      if(item.type !== intent && !interests.includes(intent)) return false;\r\n    }\r\n  }\r\n\r\n  if(q){\r\n    const hay = normalizeText([\r\n      item.title,\r\n      item.desc,\r\n      item.zone,\r\n      item.type,\r\n      item.notes || '',\r\n      (item.slots||[]).join(' '),\r\n      (item.move||[]).join(' '),\r\n      inferInterestTags(item).join(' ')\r\n    ].join(' '));\r\n\r\n    const words = q.split(\/\\s+\/).filter(Boolean);\r\n    const matched = words.every(word => hay.includes(word) || word.length < 3);\r\n    if(!matched) return false;\r\n  }\r\n\r\n  return true;\r\n}\r\n\r\nfunction getVisibleCatalogItems(){\r\n  return catalog\r\n    .filter(matchesFilters)\r\n    .map(item => ({\r\n      ...item,\r\n      pref: getPersonalScore(item),\r\n      officialLink: getOfficialLink(item)\r\n    }))\r\n    .sort((a, b) => a.title.localeCompare(b.title, 'ca', { sensitivity: 'base' }));\r\n}\r\n\r\nfunction renderCatalog(){\r\n  const items = getVisibleCatalogItems();\r\n  const plannedIds = getPlannedItemIds();\r\n\r\n  catalogCount.textContent = `${items.length} opcions`;\r\n\r\n  if(!items.length){\r\n    catalogGrid.innerHTML = '<div class=\"empty\">No hi ha resultats amb eixos filtres. Prova a netejar la cerca o a ampliar zona i franja.<\/div>';\r\n    renderMap([]);\r\n    return;\r\n  }\r\n\r\n  catalogGrid.innerHTML = items.map(item => `\r\n    <div class=\"catalog-card\">\r\n      <div class=\"catalog-top\">\r\n        <div class=\"title-row\">\r\n          <span class=\"icon-badge\">${getTypeIcon(item.type)}<\/span>\r\n          <div><h4>${item.title}<\/h4><\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"tags\">\r\n        <span class=\"tag type-${item.type}\">${typeLabels[item.type]}<\/span>\r\n        <span class=\"tag\">${zoneLabels[item.zone] || item.zone}<\/span>\r\n        <span class=\"tag\">${fmtHours(item.hours)}<\/span>\r\n        <span class=\"tag\">${prettyMoves(item.move)}<\/span>\r\n        ${(item.slots||[]).map(s=>`<span class=\"tag\">${slotLabels[s]}<\/span>`).join('')}\r\n        ${plannedIds.has(item.id) ? '<span class=\"tag planned\">En el teu viatge<\/span>' : ''}\r\n      <\/div>\r\n\r\n      <p>${buildEnhancedDescription(item)}<\/p>\r\n\r\n      <div class=\"help\">\r\n        ${item.type==='restaurante'\r\n          ? 'Preu mitj\u00e0 orientatiu: ' + euro(item.cost).replace(',00','')\r\n          : (Number(item.cost)||0 ? 'Cost orientatiu: ' + euro(item.cost).replace(',00','') : 'Sense cost orientatiu')}\r\n      <\/div>\r\n\r\n\r\n      <div class=\"controls-inline\">\r\n        ${item.lat && item.lng ? `<a class=\"catalog-link\" href=\"${getGoogleMapsDirectionsUrl(item)}\" target=\"_blank\" rel=\"noopener noreferrer\">Com arribar<\/a>` : ''}\r\n        ${item.officialLink ? `<a class=\"catalog-link\" href=\"${item.officialLink}\" target=\"_blank\" rel=\"noopener noreferrer\">Veure informaci\u00f3 oficial<\/a>` : ''}\r\n      <\/div>\r\n\r\n      <div class=\"controls-inline\">\r\n        <select class=\"small-select add-day\" data-item=\"${item.id}\">\r\n          ${state.days.map((d, idx)=>`<option value=\"${idx}\">${d.title}<\/option>`).join('')}\r\n        <\/select>\r\n      <\/div>\r\n\r\n      <div class=\"quick-slot-actions\">\r\n        ${slotsOrder.map(slot => `<button class=\"quick-add-btn\" data-quick-add=\"${item.id}\" data-slot=\"${slot}\">${slotLabels[slot]}<\/button>`).join('')}\r\n      <\/div>\r\n    <\/div>\r\n  `).join('');\r\n\r\n  document.querySelectorAll('[data-quick-add]').forEach(btn => {\r\n    btn.addEventListener('click', () => {\r\n      const id = btn.getAttribute('data-quick-add');\r\n      const slot = btn.getAttribute('data-slot') || 'mat\u00ed';\r\n      const day = Number(document.querySelector(`.add-day[data-item=\"${id}\"]`).value || 0);\r\n      addItemToPlan(id, day, slot);\r\n    });\r\n  });\r\n\r\n  bindMapFocusLinks();\r\n  renderMap(items);\r\n}\r\n\r\nfunction buildSummaryText(){\r\n  const lines = [];\r\n  lines.push(state.tripName);\r\n  lines.push('');\r\n  lines.push(`Perfil: ${tripWho.options[tripWho.selectedIndex].text} \u00b7 ${tripMove.options[tripMove.selectedIndex].text} \u00b7 ${tripPace.options[tripPace.selectedIndex].text}`);\r\n  lines.push('');\r\n\r\n  state.days.forEach((day, idx) => {\r\n    lines.push(`${day.title} \u00b7 ${dateLabel(idx)}`);\r\n    slotsOrder.forEach(slot => {\r\n      if(day.slots[slot].length){\r\n        lines.push(`  ${slotLabels[slot]}:`);\r\n        day.slots[slot].forEach(it => lines.push(`  - ${it.title} (${typeLabels[it.type]}, ${zoneLabels[it.zone] || it.zone})`));\r\n      }\r\n    });\r\n    lines.push('');\r\n  });\r\n\r\n  lines.push('Pressupost total: ' + document.getElementById('bTotal').textContent);\r\n  return lines.join('\\n');\r\n}\r\n\r\nfunction copySummary(){\r\n  navigator.clipboard.writeText(buildSummaryText());\r\n}\r\n\r\nfunction downloadSummary(){\r\n  const win = window.open('', '_blank');\r\n  if(!win) return;\r\n\r\n  const safeTitle = state.tripName || 'Itinerari en Tavernes';\r\n  const totalBudget = document.getElementById('bTotal').textContent;\r\n\r\n  let html = `\r\n    <html>\r\n    <head>\r\n      <title>${safeTitle}<\/title>\r\n      <style>\r\n        body{font-family:Arial,sans-serif;color:#12385f;margin:40px;line-height:1.5}\r\n        h1{margin:0 0 10px;font-size:28px}\r\n        h2{margin:28px 0 8px;font-size:20px}\r\n        h3{margin:18px 0 6px;font-size:17px}\r\n        .meta{margin-bottom:20px;color:#5f7892}\r\n        .day{margin-bottom:24px;padding-bottom:12px;border-bottom:1px solid #d8e3ef}\r\n        .item{margin:6px 0 10px 14px}\r\n        .budget{margin-top:24px;font-size:19px;font-weight:bold}\r\n      \r\n\/* === Layout actualizado === *\/\r\n.app{\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:16px;\r\n  width:1920px;\r\n  min-height:auto;\r\n  height:auto;\r\n  align-items:stretch;\r\n}\r\n\r\n.top-layout{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1.05fr) minmax(0,1.95fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.hero-card,\r\n.controls-card{\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:16px;\r\n}\r\n\r\n.hero-split{\r\n  display:grid;\r\n  grid-template-columns:220px minmax(0,1fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.brand{\r\n  min-height:100%;\r\n}\r\n\r\n.trip-tools-row{\r\n  display:grid;\r\n  grid-template-columns:repeat(3,minmax(0,1fr)) auto;\r\n  gap:14px;\r\n  align-items:end;\r\n}\r\n\r\n.day-actions{\r\n  display:flex;\r\n  gap:10px;\r\n  flex-wrap:wrap;\r\n}\r\n\r\n.trip-form{\r\n  grid-template-columns:repeat(4,minmax(0,1fr));\r\n}\r\n\r\n.trip-form .field:last-child{\r\n  grid-column:span 2;\r\n}\r\n\r\n.top-actions{\r\n  display:flex;\r\n  gap:10px;\r\n  flex-wrap:wrap;\r\n}\r\n\r\n.stats-budget-row{\r\n  display:grid;\r\n  grid-template-columns:320px minmax(0,1fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.stats-card,\r\n.budget-card{\r\n  padding:16px;\r\n  border:1px solid var(--line);\r\n  border-radius:16px;\r\n  background:var(--soft);\r\n}\r\n\r\n.content-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1.6fr) 430px;\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.content-left,\r\n.content-right{\r\n  min-width:0;\r\n}\r\n\r\n.itinerary-panel{\r\n  min-height:760px;\r\n}\r\n\r\n.center-scroll{\r\n  max-height:920px;\r\n}\r\n\r\n.catalog-panel{\r\n  min-height:760px;\r\n}\r\n\r\n.catalog-results{\r\n  max-height:920px;\r\n}\r\n\r\n.map-bottom{\r\n  overflow:hidden;\r\n}\r\n\r\n.map-bottom-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr) 330px;\r\n  min-height:620px;\r\n}\r\n\r\n#travelMap{\r\n  width:100%;\r\n  height:620px;\r\n  min-height:620px;\r\n}\r\n\r\n.map-side-scroll{\r\n  max-height:none;\r\n  border-top:0;\r\n  border-left:1px solid var(--line);\r\n  padding:12px;\r\n  background:#fbfdff;\r\n}\r\n\r\n.catalog-top h4{\r\n  margin:0;\r\n}\r\n\r\n@media (max-width: 1200px){\r\n  .trip-form{\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n\r\n  .trip-form .field:last-child{\r\n    grid-column:1 \/ -1;\r\n  }\r\n}\r\n\r\n\r\n\/* === Layout pantalla completa v2 === *\/\r\n.app-viewport{\r\n  width:100%;\r\n  min-height:100vh;\r\n  overflow:visible;\r\n  display:block;\r\n  background:transparent;\r\n}\r\n\r\n.app-scale-wrap{\r\n  width:100% !important;\r\n  height:auto !important;\r\n  overflow:visible;\r\n}\r\n\r\n.app-scale{\r\n  width:100% !important;\r\n  height:auto !important;\r\n  transform:none !important;\r\n}\r\n\r\n.app-shell{\r\n  width:100%;\r\n  min-width:0;\r\n  max-width:none;\r\n  border-radius:0;\r\n  border-left:0;\r\n  border-right:0;\r\n  padding:16px;\r\n}\r\n\r\n.app{\r\n  width:100%;\r\n  min-width:0;\r\n}\r\n\r\n.top-layout{\r\n  display:grid;\r\n  grid-template-columns:420px minmax(0,1fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.content-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr);\r\n  gap:16px;\r\n}\r\n\r\n.content-right{\r\n  order:-1;\r\n}\r\n\r\n.catalog-panel{\r\n  min-height:auto;\r\n}\r\n\r\n.catalog-fixed{\r\n  border-bottom:0;\r\n  padding:16px;\r\n}\r\n\r\n.catalog-head{\r\n  display:grid;\r\n  grid-template-columns:320px minmax(0,1fr);\r\n  gap:20px;\r\n  align-items:start;\r\n}\r\n\r\n.catalog-head > div:first-child{\r\n  min-width:0;\r\n}\r\n\r\n.filters{\r\n  display:grid;\r\n  grid-template-columns:repeat(7,minmax(120px,1fr));\r\n  gap:10px;\r\n  margin-top:0;\r\n  align-items:end;\r\n}\r\n\r\n.filters .search{\r\n  grid-column:span 1;\r\n}\r\n\r\n.catalog-results{\r\n  max-height:none;\r\n  padding:0 16px 16px;\r\n}\r\n\r\n.catalog-grid{\r\n  grid-template-columns:repeat(3,minmax(0,1fr));\r\n  align-items:start;\r\n}\r\n\r\n.itinerary-panel{\r\n  min-height:0;\r\n}\r\n\r\n.center-scroll{\r\n  max-height:none;\r\n  overflow:visible;\r\n  padding-right:0;\r\n}\r\n\r\n.stats-budget-row{\r\n  grid-template-columns:220px minmax(0,1fr);\r\n}\r\n\r\n.budget-card{\r\n  order:3;\r\n}\r\n\r\n.bottom-budget{\r\n  margin-top:16px;\r\n}\r\n\r\n.map-bottom{\r\n  margin-top:16px;\r\n}\r\n\r\n.map-bottom-grid{\r\n  grid-template-columns:minmax(0,1fr) 360px;\r\n  min-height:680px;\r\n}\r\n\r\n#travelMap{\r\n  height:680px;\r\n  min-height:680px;\r\n  display:block;\r\n}\r\n\r\n@media (max-width: 1600px){\r\n  .catalog-grid{\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n  .filters{\r\n    grid-template-columns:repeat(4,minmax(120px,1fr));\r\n  }\r\n}\r\n\r\n@media (max-width: 1200px){\r\n  .top-layout,\r\n  .catalog-head,\r\n  .stats-budget-row,\r\n  .map-bottom-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n  .filters{\r\n    grid-template-columns:repeat(2,minmax(120px,1fr));\r\n  }\r\n\r\n  .catalog-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n\/* === Ajuste disposici\u00f3n final === *\/\r\n.top-layout{\r\n  display:block;\r\n}\r\n\r\n.hero-card,\r\n.controls-card{\r\n  display:block;\r\n}\r\n\r\n.unified-top{\r\n  display:grid;\r\n  grid-template-columns:420px minmax(0,1fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.unified-top-right{\r\n  display:grid;\r\n  gap:16px;\r\n}\r\n\r\n.unified-top .top-actions{\r\n  margin-top:12px;\r\n}\r\n\r\n.content-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1.15fr) minmax(520px,0.85fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.itinerary-panel{\r\n  min-height:720px;\r\n}\r\n\r\n.catalog-panel{\r\n  min-height:720px;\r\n  overflow:hidden;\r\n}\r\n\r\n.catalog-fixed{\r\n  padding:16px;\r\n  border-bottom:1px solid var(--line);\r\n}\r\n\r\n.catalog-head{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:14px;\r\n}\r\n\r\n.filters{\r\n  display:grid;\r\n  grid-template-columns:repeat(3,minmax(0,1fr));\r\n  gap:10px;\r\n  align-items:end;\r\n}\r\n\r\n.filters .search{\r\n  grid-column:1 \/ -1;\r\n}\r\n\r\n.catalog-results{\r\n  max-height:760px;\r\n  overflow-y:auto;\r\n  overflow-x:hidden;\r\n  padding:16px;\r\n  scrollbar-gutter:stable;\r\n}\r\n\r\n.catalog-grid{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:12px;\r\n}\r\n\r\n.center-scroll{\r\n  max-height:760px;\r\n  overflow-y:auto;\r\n  overflow-x:hidden;\r\n  padding-right:8px;\r\n  scrollbar-gutter:stable;\r\n}\r\n\r\n.map-bottom-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr) 320px;\r\n  gap:0;\r\n  min-height:720px;\r\n}\r\n\r\n#travelMap{\r\n  height:720px;\r\n  min-height:720px;\r\n}\r\n\r\n.map-side-scroll{\r\n  max-height:720px;\r\n  overflow-y:auto;\r\n  overflow-x:hidden;\r\n  border-left:1px solid var(--line);\r\n  border-top:0;\r\n  padding:12px;\r\n  background:#fbfdff;\r\n  scrollbar-gutter:stable;\r\n}\r\n\r\n.bottom-budget{\r\n  margin-top:16px;\r\n}\r\n\r\n@media (max-width: 1400px){\r\n  .content-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n  .filters{\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n}\r\n\r\n@media (max-width: 1100px){\r\n  .unified-top{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n\/* === Ajustes finos solicitados === *\/\r\n.unified-top{\r\n  grid-template-columns:1fr;\r\n}\r\n\r\n.unified-top > div:first-child{\r\n  display:grid;\r\n  grid-template-columns:220px minmax(0,1fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.hero-split{\r\n  grid-template-columns:1fr;\r\n  gap:12px;\r\n}\r\n\r\n.hero-split > div:last-child{\r\n  min-width:0;\r\n}\r\n\r\n.unified-top-right{\r\n  display:grid;\r\n  grid-template-columns:1fr auto;\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.trip-tools-row{\r\n  grid-column:1 \/ -1;\r\n}\r\n\r\n.trip-form{\r\n  grid-column:1 \/ -1;\r\n}\r\n\r\n.stats-budget-row{\r\n  display:block;\r\n}\r\n\r\n.stats-card{\r\n  display:none;\r\n}\r\n\r\n.bottom-budget{\r\n  margin-top:16px;\r\n}\r\n\r\n.bottom-budget .stats{\r\n  margin-bottom:16px;\r\n}\r\n\r\n.content-grid{\r\n  grid-template-columns:minmax(0,1fr) minmax(0,1fr);\r\n  gap:16px;\r\n  align-items:start;\r\n}\r\n\r\n.catalog-panel,\r\n.itinerary-panel{\r\n  min-height:980px;\r\n  height:980px;\r\n}\r\n\r\n.catalog-results,\r\n.center-scroll{\r\n  height:calc(980px - 88px);\r\n  max-height:calc(980px - 88px);\r\n  overflow-y:auto;\r\n  overflow-x:hidden;\r\n}\r\n\r\n.catalog-grid{\r\n  grid-template-columns:1fr;\r\n}\r\n\r\n.catalog-card{\r\n  display:grid;\r\n  gap:12px;\r\n  min-height:190px;\r\n  padding:16px;\r\n}\r\n\r\n.slot-grid{\r\n  display:grid;\r\n  grid-template-columns:repeat(4,minmax(0,1fr));\r\n  gap:12px;\r\n}\r\n\r\n.slot{\r\n  min-height:220px;\r\n}\r\n\r\n.quick-slot-actions{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:6px;\r\n  margin-top:6px;\r\n}\r\n\r\n.quick-add-btn{\r\n  padding:7px 10px;\r\n  border-radius:999px;\r\n  border:1px solid var(--line2);\r\n  background:#fff;\r\n  color:var(--text);\r\n  cursor:pointer;\r\n  font-size:13px;\r\n  font-weight:700;\r\n}\r\n\r\n.quick-add-btn:hover{\r\n  background:var(--soft);\r\n}\r\n\r\n.day-card{\r\n  margin-bottom:10px;\r\n}\r\n\r\n.map-bottom-grid{\r\n  grid-template-columns:minmax(0,0.82fr) minmax(0,1.18fr);\r\n}\r\n\r\n@media (max-width: 1400px){\r\n  .content-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n\/* === Ajuste exclusivo franja superior === *\/\r\n.top-banner{\r\n  width:100%;\r\n  min-height:118px;\r\n  border:1px solid var(--line);\r\n  border-radius:14px;\r\n  background:linear-gradient(135deg,#eef7ff,#ffffff);\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:flex-start;\r\n  padding:18px 24px;\r\n}\r\n\r\n.top-banner .brand-wordmark{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:14px;\r\n  width:auto;\r\n}\r\n\r\n.top-banner .brand-logo{\r\n  width:42px;\r\n  max-width:100%;\r\n  height:auto;\r\n  display:block;\r\n  flex:0 0 auto;\r\n  object-fit:contain;\r\n}\r\n\r\n.top-banner .brand-kicker{\r\n  font-size:13px;\r\n  font-weight:800;\r\n  letter-spacing:.12em;\r\n  color:var(--brand);\r\n}\r\n\r\n.top-banner .brand-main{\r\n  font-size:23px;\r\n  line-height:1.05;\r\n  font-weight:800;\r\n  color:var(--text);\r\n}\r\n\r\n.top-banner .brand-subline{\r\n  font-size:13px;\r\n  color:var(--muted);\r\n  margin-top:4px;\r\n}\r\n\r\n\r\n\/* === Superior limpio === *\/\r\n.unified-top-clean{\r\n  display:grid;\r\n  grid-template-columns:260px minmax(0,1fr);\r\n  gap:18px;\r\n  align-items:start;\r\n}\r\n\r\n.top-clean-main{\r\n  display:contents;\r\n}\r\n\r\n.top-clean-left{\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:16px;\r\n}\r\n\r\n.unified-top-clean .top-banner{\r\n  min-height:108px;\r\n}\r\n\r\n.unified-top-clean .trip-tools-row{\r\n  grid-column:1 \/ -1;\r\n  display:grid;\r\n  grid-template-columns:1fr 1fr 1fr auto;\r\n  gap:10px;\r\n  align-items:end;\r\n}\r\n\r\n@media (max-width: 1200px){\r\n  .unified-top-clean{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n  .unified-top-clean .trip-tools-row{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n.catalog-extra-filters{\r\n  display:grid;\r\n  grid-template-columns:repeat(3,minmax(0,1fr));\r\n  gap:10px;\r\n  margin-bottom:10px;\r\n}\r\n\r\n@media (max-width: 1100px){\r\n  .catalog-extra-filters{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n@media (max-width: 900px){\r\n  .map-bottom-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n  .map-list{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n\r\n\r\n\/* === Pressupost en dos bloques laterales === *\/\r\n.bottom-budget{\r\n  display:block;\r\n}\r\n\r\n.budget-two-cols{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr) 260px;\r\n  gap:16px;\r\n  align-items:stretch;\r\n}\r\n\r\n.budget-main-col,\r\n.budget-side-col{\r\n  border:1px solid var(--line);\r\n  background:var(--soft);\r\n  border-radius:16px;\r\n  padding:14px;\r\n  height:100%;\r\n}\r\n\r\n.budget-main-col{\r\n  display:flex;\r\n  flex-direction:column;\r\n}\r\n\r\n.budget-side-col{\r\n  display:flex;\r\n}\r\n\r\n.budget-total{\r\n  margin-top:auto;\r\n}\r\n\r\n.budget-mini-stats{\r\n  display:grid;\r\n  grid-template-columns:repeat(2,minmax(0,1fr));\r\n  grid-auto-rows:1fr;\r\n  gap:8px;\r\n  width:100%;\r\n  height:100%;\r\n}\r\n\r\n.mini-stat{\r\n  border:1px solid var(--line);\r\n  background:#fff;\r\n  border-radius:12px;\r\n  padding:10px;\r\n  display:flex;\r\n  flex-direction:column;\r\n  justify-content:center;\r\n  gap:4px;\r\n  min-height:0;\r\n}\r\n\r\n.mini-stat-label{\r\n  font-size:11px;\r\n  color:var(--muted);\r\n  line-height:1.1;\r\n}\r\n\r\n.mini-stat-value{\r\n  font-size:17px;\r\n  color:var(--text);\r\n  line-height:1.1;\r\n}\r\n\r\n@media (max-width: 900px){\r\n  .budget-two-cols{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n\r\n\/* === FORZAR VISTA ESCRITORIO EN M\u00d3VIL === *\/\r\nhtml, body{\r\n  min-width:1920px !important;\r\n}\r\n\r\n.app-viewport{\r\n  width:1920px !important;\r\n  min-width:1920px !important;\r\n  overflow-x:auto !important;\r\n  overflow-y:auto !important;\r\n  display:block !important;\r\n}\r\n\r\n.app-scale-wrap{\r\n  width:1920px !important;\r\n  min-width:1920px !important;\r\n  overflow:visible !important;\r\n}\r\n\r\n.app-scale{\r\n  width:1920px !important;\r\n  min-width:1920px !important;\r\n  transform:none !important;\r\n}\r\n\r\n.app-shell{\r\n  width:1920px !important;\r\n  min-width:1920px !important;\r\n  max-width:1920px !important;\r\n  border-radius:24px !important;\r\n  border-left:1px solid var(--line) !important;\r\n  border-right:1px solid var(--line) !important;\r\n  padding:18px !important;\r\n}\r\n\r\n.app{\r\n  width:1920px !important;\r\n  min-width:1920px !important;\r\n  display:flex !important;\r\n  flex-direction:column !important;\r\n  gap:16px !important;\r\n}\r\n\r\n.top-layout{\r\n  display:block !important;\r\n}\r\n\r\n.content-grid{\r\n  display:grid !important;\r\n  grid-template-columns:minmax(0,1fr) minmax(0,1fr) !important;\r\n  gap:16px !important;\r\n  align-items:start !important;\r\n}\r\n\r\n.catalog-panel,\r\n.itinerary-panel{\r\n  min-height:980px !important;\r\n  height:980px !important;\r\n}\r\n\r\n.catalog-results,\r\n.center-scroll{\r\n  height:calc(980px - 88px) !important;\r\n  max-height:calc(980px - 88px) !important;\r\n  overflow-y:auto !important;\r\n  overflow-x:hidden !important;\r\n}\r\n\r\n.map-bottom-grid{\r\n  display:grid !important;\r\n  grid-template-columns:minmax(0,0.82fr) minmax(0,1.18fr) !important;\r\n  min-height:720px !important;\r\n}\r\n\r\n#travelMap{\r\n  height:720px !important;\r\n  min-height:720px !important;\r\n}\r\n\r\n.filters{\r\n  display:grid !important;\r\n  grid-template-columns:repeat(3,minmax(0,1fr)) !important;\r\n  gap:10px !important;\r\n}\r\n\r\n.filters .search{\r\n  grid-column:1 \/ -1 !important;\r\n}\r\n\r\n.catalog-grid{\r\n  display:grid !important;\r\n  grid-template-columns:1fr !important;\r\n  gap:12px !important;\r\n}\r\n\r\n.slot-grid{\r\n  display:grid !important;\r\n  grid-template-columns:repeat(4,minmax(0,1fr)) !important;\r\n  gap:12px !important;\r\n}\r\n\r\n.unified-top-clean{\r\n  display:grid !important;\r\n  grid-template-columns:260px minmax(0,1fr) !important;\r\n  gap:18px !important;\r\n}\r\n\r\n.unified-top-clean .trip-tools-row{\r\n  display:grid !important;\r\n  grid-template-columns:1fr 1fr 1fr auto !important;\r\n  gap:10px !important;\r\n}\r\n\r\n.catalog-extra-filters{\r\n  display:grid !important;\r\n  grid-template-columns:repeat(3,minmax(0,1fr)) !important;\r\n  gap:10px !important;\r\n}\r\n\r\n.budget-two-cols{\r\n  display:grid !important;\r\n  grid-template-columns:minmax(0,1fr) 260px !important;\r\n  gap:16px !important;\r\n}\r\n\r\n<\/style>\r\n    <\/head>\r\n    <body>\r\n      <h1>${safeTitle}<\/h1>\r\n      <div class=\"meta\">\r\n        <div><strong>Perfil:<\/strong> ${tripWho.options[tripWho.selectedIndex].text} \u00b7 ${tripMove.options[tripMove.selectedIndex].text} \u00b7 ${tripPace.options[tripPace.selectedIndex].text}<\/div>\r\n\r\n      <\/div>\r\n  `;\r\n\r\n  state.days.forEach((day, idx) => {\r\n    html += `<div class=\"day\">`;\r\n    html += `<h2>${day.title} \u00b7 ${dateLabel(idx)}<\/h2>`;\r\n    slotsOrder.forEach(slot => {\r\n      if(day.slots[slot].length){\r\n        html += `<h3>${slotLabels[slot]}<\/h3>`;\r\n        day.slots[slot].forEach(it => {\r\n          html += `<div class=\"item\"><strong>${getTypeIcon(it.type)} ${it.title}<\/strong><br>${typeLabels[it.type]} \u00b7 ${zoneLabels[it.zone] || it.zone} \u00b7 ${fmtHours(it.hours)}<\/div>`;\r\n        });\r\n      }\r\n    });\r\n    html += `<\/div>`;\r\n  });\r\n\r\n  html += `<div class=\"budget\">Pressupost total: ${totalBudget}<\/div>`;\r\n  html += `<\/body><\/html>`;\r\n\r\n  win.document.open();\r\n  win.document.write(html);\r\n  win.document.close();\r\n  win.focus();\r\n  win.print();\r\n}\r\n\r\nfunction renderAll(){\r\n  state.tripName = tripName.value.trim() || 'Viaje a Tavernes';\r\n  state.startDate = tripStart.value || getTodayISO();\r\n  renderDays();\r\n  renderCatalog();\r\n  updateStats();\r\n\r\n  requestAnimationFrame(() => {\r\n    setTimeout(() => {\r\n      if (typeof map !== 'undefined' && map) {\r\n        map.invalidateSize();\r\n      }\r\n    }, 120);\r\n  });\r\n}\r\n\r\nconst map = L.map('travelMap', { zoomControl:true }).setView([39.073, -0.241], 12);\r\n\r\nL.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\r\n  maxZoom: 19,\r\n  attribution: '&copy; OpenStreetMap'\r\n}).addTo(map);\r\n\r\nlet mapMarkers = {};\r\nlet mapLayerGroup = L.layerGroup().addTo(map);\r\n\r\nwindow.addEventListener('load', () => {\r\n  setTimeout(() => {\r\n    if (typeof map !== 'undefined' && map) {\r\n      map.invalidateSize();\r\n    }\r\n  }, 300);\r\n});\r\n\r\nfunction markerHtmlForType(type, isPlanned){\r\n  const bg = {\r\n    actividad:'#0d6fb8',\r\n    restaurante:'#f08b2d',\r\n    alojamiento:'#2d8b57',\r\n    evento:'#d9534f',\r\n    ocio:'#7546c8'\r\n  }[type] || '#5f7892';\r\n\r\n  const border = isPlanned ? '#ffbf47' : '#ffffff';\r\n  const ring = isPlanned ? '0 0 0 3px rgba(255,191,71,.35), 0 4px 10px rgba(0,0,0,.18)' : '0 4px 10px rgba(0,0,0,.15)';\r\n  const size = isPlanned ? 34 : 30;\r\n  const fontSize = isPlanned ? 16 : 15;\r\n\r\n  return `\r\n    <div style=\"\r\n      width:${size}px;\r\n      height:${size}px;\r\n      border-radius:999px;\r\n      background:${bg};\r\n      color:#fff;\r\n      display:flex;\r\n      align-items:center;\r\n      justify-content:center;\r\n      font-size:${fontSize}px;\r\n      border:3px solid ${border};\r\n      box-shadow:${ring};\r\n      font-weight:700;\r\n    \">\r\n      ${getTypeIcon(type)}\r\n    <\/div>\r\n  `;\r\n}\r\n\r\nfunction getMarkerIcon(type, isPlanned){\r\n  const size = isPlanned ? 34 : 30;\r\n  return L.divIcon({\r\n    html: markerHtmlForType(type, isPlanned),\r\n    className: '',\r\n    iconSize: [size,size],\r\n    iconAnchor: [size\/2,size\/2],\r\n    popupAnchor: [0,-14]\r\n  });\r\n}\r\n\r\nfunction getPopupHtml(item, plannedOccurrences){\r\n  const official = getOfficialLink(item);\r\n  const plannedBlock = plannedOccurrences.length\r\n    ? `<div style=\"margin-top:6px;\"><strong>En el teu viatge:<\/strong> ${plannedOccurrences.join(' \u00b7 ')}<\/div>`\r\n    : '';\r\n\r\n  const directionsUrl = getGoogleMapsDirectionsUrl(item);\r\n  const directionsBlock = directionsUrl\r\n    ? `<div style=\"margin-top:6px;\"><a href=\"${directionsUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">Com arribar<\/a><\/div>`\r\n    : '';\r\n\r\n  const officialBlock = official\r\n    ? `<div style=\"margin-top:6px;\"><a href=\"${official}\" target=\"_blank\" rel=\"noopener noreferrer\">Veure informaci\u00f3 oficial<\/a><\/div>`\r\n    : '';\r\n\r\n  return `\r\n    <div>\r\n      <strong>${getTypeIcon(item.type)} ${item.title}<\/strong>\r\n      <div>${typeLabels[item.type]} \u00b7 ${zoneLabels[item.zone] || item.zone}<\/div>\r\n      <div>${fmtHours(item.hours)} \u00b7 ${prettyMoves(item.move)}<\/div>\r\n      <div style=\"margin-top:4px;\">${item.desc}<\/div>\r\n      ${plannedBlock}\r\n      ${directionsBlock}\r\n      ${officialBlock}\r\n    <\/div>\r\n  `;\r\n}\r\n\r\nfunction renderMap(items){\r\n  mapLayerGroup.clearLayers();\r\n  mapMarkers = {};\r\n\r\n  const plannedOccurrencesMap = getPlannedOccurrences();\r\n  const plannedIds = getPlannedItemIds();\r\n\r\n  const visibleCatalogGeolocated = items.filter(item => Number.isFinite(item.lat) && Number.isFinite(item.lng));\r\n  const plannedGeolocated = catalog.filter(item => plannedIds.has(item.id) && Number.isFinite(item.lat) && Number.isFinite(item.lng));\r\n  const sourceItems = mapOnlyPlanned.checked ? plannedGeolocated : visibleCatalogGeolocated;\r\n\r\n  const uniqueMap = new Map();\r\n  sourceItems.forEach(item => uniqueMap.set(item.id, item));\r\n  const finalItems = [...uniqueMap.values()];\r\n\r\n  mapVisibleCount.textContent = `${finalItems.length} ubicacions visibles`;\r\n  mapPlannedCount.textContent = `${plannedGeolocated.length} afegides al viatge`;\r\n\r\n  mapList.innerHTML = finalItems.length\r\n    ? finalItems.map(item => {\r\n        const occ = plannedOccurrencesMap[item.id] || [];\r\n        return `\r\n          <div class=\"map-list-item\">\r\n            <strong>${getTypeIcon(item.type)} ${item.title}<\/strong>\r\n            <div class=\"meta\">${typeLabels[item.type]} \u00b7 ${zoneLabels[item.zone] || item.zone} \u00b7 ${fmtHours(item.hours)}<\/div>\r\n            ${occ.length ? `<div class=\"meta\"><strong>En el teu viatge:<\/strong> ${occ.join(' \u00b7 ')}<\/div>` : ''}\r\n            <div class=\"controls-inline\">\r\n              <span class=\"map-focus-link\" data-map-focus=\"${item.id}\">Centrar en mapa<\/span>\r\n              <a class=\"map-focus-link\" href=\"${getGoogleMapsDirectionsUrl(item)}\" target=\"_blank\" rel=\"noopener noreferrer\">Com arribar<\/a>\r\n            <\/div>\r\n          <\/div>\r\n        `;\r\n      }).join('')\r\n    : `<div class=\"empty\">No hi ha ubicacions visibles al mapa amb l\u2019estat actual.<\/div>`;\r\n\r\n  finalItems.forEach(item => {\r\n    const occ = plannedOccurrencesMap[item.id] || [];\r\n    const isPlanned = occ.length > 0;\r\n    const marker = L.marker([item.lat, item.lng], { icon: getMarkerIcon(item.type, isPlanned) });\r\n    marker.bindPopup(getPopupHtml(item, occ));\r\n    marker.addTo(mapLayerGroup);\r\n    mapMarkers[item.id] = marker;\r\n  });\r\n\r\n  if(finalItems.length === 1){\r\n    map.setView([finalItems[0].lat, finalItems[0].lng], 16);\r\n  } else if(finalItems.length > 1){\r\n    const bounds = L.latLngBounds(finalItems.map(item => [item.lat, item.lng]));\r\n    map.fitBounds(bounds.pad(0.04));\r\n    const currentZoom = map.getZoom();\r\n    if(currentZoom > 14){\r\n      map.setZoom(14);\r\n    }\r\n  } else {\r\n    map.setView([39.073, -0.241], 13);\r\n  }\r\n\r\n  bindMapFocusLinks();\r\n  setTimeout(() => {\r\n    if (typeof map !== 'undefined' && map) {\r\n      map.invalidateSize();\r\n    }\r\n  }, 80);\r\n}\r\n\r\nfunction focusItemOnMap(itemId){\r\n  const item = catalog.find(x => x.id === itemId);\r\n  if(!item || !item.lat || !item.lng) return;\r\n\r\n  const plannedIds = getPlannedItemIds();\r\n  if(mapOnlyPlanned.checked && !plannedIds.has(itemId)){\r\n    mapOnlyPlanned.checked = false;\r\n    renderCatalog();\r\n  }\r\n\r\n  const marker = mapMarkers[itemId];\r\n  map.setView([item.lat, item.lng], 16, {animate:true});\r\n\r\n  if(marker){\r\n    setTimeout(() => marker.openPopup(), 250);\r\n  }\r\n}\r\n\r\nfunction bindMapFocusLinks(){\r\n  document.querySelectorAll('[data-map-focus]').forEach(el => {\r\n    el.onclick = () => focusItemOnMap(el.getAttribute('data-map-focus'));\r\n  });\r\n}\r\n\r\nfunction scalePlannerApp(){\r\n  const viewport = document.getElementById('appViewport');\r\n  const wrap = document.getElementById('appScaleWrap');\r\n  const scaleBox = document.getElementById('appScale');\r\n\r\n  if(!viewport || !wrap || !scaleBox) return;\r\n\r\n  wrap.style.width = '100%';\r\n  wrap.style.height = 'auto';\r\n  scaleBox.style.width = '100%';\r\n  scaleBox.style.height = 'auto';\r\n  scaleBox.style.transform = 'none';\r\n  viewport.style.minHeight = 'auto';\r\n\r\n  requestAnimationFrame(() => {\r\n    setTimeout(() => {\r\n      if (typeof map !== 'undefined' && map) {\r\n        map.invalidateSize();\r\n      }\r\n    }, 120);\r\n  });\r\n}\r\n\r\ndocument.getElementById('btnGenerate').addEventListener('click', () => createDays(Number(numDays.value||1)));\r\ndocument.getElementById('btnAddDay').addEventListener('click', addDay);\r\ndocument.getElementById('btnClear').addEventListener('click', () => createDays(Number(numDays.value||1)));\r\ndocument.getElementById('btnCopy').addEventListener('click', copySummary);\r\ndocument.getElementById('btnDownload').addEventListener('click', downloadSummary);\r\n\r\nnumDays.addEventListener('change', () => createDays(Number(numDays.value||1)));\r\ntripName.addEventListener('input', renderAll);\r\ntripStart.addEventListener('change', renderAll);\r\ntripWho.addEventListener('change', renderAll);\r\ntripMove.addEventListener('change', renderAll);\r\ntripPace.addEventListener('change', renderAll);\r\n\r\nmapOnlyPlanned.addEventListener('change', renderCatalog);\r\n\r\n['filterType','filterZone','filterSlot','filterMove','filterInterest','filterDuration','search'].forEach(id => {\r\n  document.getElementById(id).addEventListener('input', renderCatalog);\r\n  document.getElementById(id).addEventListener('change', renderCatalog);\r\n});\r\n\r\nif (tripStart && !tripStart.value) {\r\n  tripStart.value = getTodayISO();\r\n}\r\n\r\ncreateDays(1);\r\n\r\nwindow.addEventListener('load', scalePlannerApp);\r\nwindow.addEventListener('resize', scalePlannerApp);\r\n\r\nsetTimeout(() => {\r\n  if (typeof map !== 'undefined' && map) {\r\n    map.invalidateSize();\r\n  }\r\n  scalePlannerApp();\r\n}, 250);\r\n<\/script>\r\n<\/body>\r\n<\/html>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Planificador de viatge de Tavernes de la Valldigna | Visit Tavernes Copiar resum Buidar pla Descarregar PDF VISITA TAVERNES DE LA VALLDIGNA Dissenya el teu viatge per dies i per franges hor\u00e0ries amb totes les opcions disponibles a Tavernes: activitats, patrimoni, natura, restauraci\u00f3, oci, esdeveniments i allotjaments Planificador de viatge Nom del viatge Data d\u2019inici [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-17840","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.visitatavernes.es\/ca\/wp-json\/wp\/v2\/pages\/17840","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.visitatavernes.es\/ca\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.visitatavernes.es\/ca\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.visitatavernes.es\/ca\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.visitatavernes.es\/ca\/wp-json\/wp\/v2\/comments?post=17840"}],"version-history":[{"count":30,"href":"https:\/\/www.visitatavernes.es\/ca\/wp-json\/wp\/v2\/pages\/17840\/revisions"}],"predecessor-version":[{"id":18023,"href":"https:\/\/www.visitatavernes.es\/ca\/wp-json\/wp\/v2\/pages\/17840\/revisions\/18023"}],"wp:attachment":[{"href":"https:\/\/www.visitatavernes.es\/ca\/wp-json\/wp\/v2\/media?parent=17840"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}