{"id":17841,"date":"2026-04-16T06:34:09","date_gmt":"2026-04-16T06:34:09","guid":{"rendered":"https:\/\/www.visitatavernes.es\/?page_id=17841"},"modified":"2026-05-25T09:40:34","modified_gmt":"2026-05-25T09:40:34","slug":"travel-planner-for-tavernes","status":"publish","type":"page","link":"https:\/\/www.visitatavernes.es\/en\/travel-planner-for-tavernes\/","title":{"rendered":"Travel planner for Tavernes de la Valldigna"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"17841\" class=\"elementor 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\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false,&quot;ekit_has_onepagescroll_dot&quot;:&quot;yes&quot;}\">\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 elementor-widget-html\" data-id=\"f100b5d\" data-element_type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<!--\r\nSEO recommended for Rank Math\r\nFocus keyword: travel planner for Tavernes de la Valldigna\r\nSEO title: Travel planner for Tavernes de la Valldigna\r\nMeta description: Travel planner for Tavernes de la Valldigna: organize your visit with beaches, nature, town, gastronomy, events and accommodation.\r\nCanonical: https:\/\/www.visitatavernes.es\/en\/travel-planner-for-tavernes-de-la-valldigna\/\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\r\n#vt-travel-planner{\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  font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;\r\n  color:var(--text);\r\n  width:100vw;\r\n  max-width:100vw;\r\n  margin-left:calc(50% - 50vw);\r\n  margin-right:calc(50% - 50vw);\r\n}\r\n#vt-travel-planner,\r\n#vt-travel-planner *{\r\n  box-sizing:border-box;\r\n}\r\n#vt-travel-planner .vt-planner-seo-intro{\r\n  width:100%;\r\n  max-width:none;\r\n  margin:0 0 14px;\r\n  padding:24px clamp(18px,4vw,64px);\r\n  border:1px solid var(--line);\r\n  border-left:0;\r\n  border-right:0;\r\n  border-radius:0;\r\n  background:linear-gradient(135deg,#eef7ff 0%,#ffffff 58%,#f7fbff 100%);\r\n  box-shadow:none;\r\n}\r\n#vt-travel-planner .vt-planner-seo-intro h1{\r\n  margin:0 0 8px;\r\n  font-size:clamp(1.8rem,3vw,3rem);\r\n  line-height:1.08;\r\n  color:var(--text);\r\n}\r\n#vt-travel-planner .vt-planner-seo-intro p{\r\n  max-width:88ch;\r\n  margin:0;\r\n  color:var(--muted);\r\n  font-size:1.02rem;\r\n  line-height:1.55;\r\n}\r\n#vt-travel-planner .vt-planner-seo-links{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:10px;\r\n  margin-top:16px;\r\n}\r\n#vt-travel-planner .vt-planner-seo-links a{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  padding:.58rem .86rem;\r\n  border:1px solid var(--line2);\r\n  border-radius:999px;\r\n  background:#fff;\r\n  color:var(--brand2);\r\n  font-weight:800;\r\n  text-decoration:none;\r\n}\r\n#vt-travel-planner .vt-planner-seo-links a:hover{\r\n  text-decoration:underline;\r\n}\r\n\r\n\r\n#vt-travel-planner{\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#vt-travel-planner, #vt-travel-planner *{box-sizing:border-box}\r\n\r\n#vt-travel-planner,\r\n#vt-travel-planner{\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\n#vt-travel-planner{\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#vt-travel-planner .elementor-widget-html,\r\n#vt-travel-planner .elementor-widget-container,\r\n#vt-travel-planner .elementor-shortcode,\r\n#vt-travel-planner .elementor{\r\n  width:100%;\r\n  max-width:none;\r\n  overflow:visible;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .app-scale-wrap{\r\n  position:relative;\r\n  flex:0 0 auto;\r\n  overflow:hidden;\r\n}\r\n\r\n#vt-travel-planner .app-scale{\r\n  position:relative;\r\n  transform-origin:top left;\r\n  will-change:transform;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .left,\r\n#vt-travel-planner .center,\r\n#vt-travel-planner .right,\r\n#vt-travel-planner .map-col{\r\n  min-height:0;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .left::-webkit-scrollbar,\r\n#vt-travel-planner .center-scroll::-webkit-scrollbar,\r\n#vt-travel-planner .catalog-results::-webkit-scrollbar,\r\n#vt-travel-planner .map-side-scroll::-webkit-scrollbar,\r\n#vt-travel-planner::-webkit-scrollbar{\r\n  width:16px;\r\n  height:14px;\r\n}\r\n\r\n#vt-travel-planner .left::-webkit-scrollbar-track,\r\n#vt-travel-planner .center-scroll::-webkit-scrollbar-track,\r\n#vt-travel-planner .catalog-results::-webkit-scrollbar-track,\r\n#vt-travel-planner .map-side-scroll::-webkit-scrollbar-track,\r\n#vt-travel-planner::-webkit-scrollbar-track{\r\n  background:#e7eef6;\r\n  border-radius:999px;\r\n}\r\n\r\n#vt-travel-planner .left::-webkit-scrollbar-thumb,\r\n#vt-travel-planner .center-scroll::-webkit-scrollbar-thumb,\r\n#vt-travel-planner .catalog-results::-webkit-scrollbar-thumb,\r\n#vt-travel-planner .map-side-scroll::-webkit-scrollbar-thumb,\r\n#vt-travel-planner::-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\n#vt-travel-planner,\r\n#vt-travel-planner .left,\r\n#vt-travel-planner .center-scroll,\r\n#vt-travel-planner .catalog-results,\r\n#vt-travel-planner .map-side-scroll{\r\n  scrollbar-width:auto;\r\n  scrollbar-color:#7b96b3 #e7eef6;\r\n}\r\n\r\n#vt-travel-planner .box{padding:16px}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .brand-subline{\r\n  font-size:13px;\r\n  color:var(--muted);\r\n  margin-top:4px;\r\n}\r\n\r\n#vt-travel-planner .stack{display:grid;gap:12px}\r\n#vt-travel-planner .field label{display:block;font-size:13px;color:var(--muted);margin-bottom:6px}\r\n#vt-travel-planner input,\r\n#vt-travel-planner select,\r\n#vt-travel-planner textarea,\r\n#vt-travel-planner button{font:inherit}\r\n\r\n#vt-travel-planner .field input,\r\n#vt-travel-planner .field select,\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .trip-form .field textarea{\r\n  min-height:76px;\r\n  resize:vertical;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .hero-title p{\r\n  margin:0;\r\n  color:var(--muted);\r\n  line-height:1.6;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .btns{\r\n  display:flex;\r\n  gap:10px;\r\n  flex-wrap:wrap;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .btn.alt{\r\n  background:#fff;\r\n  color:var(--text);\r\n  border:1px solid var(--line2);\r\n}\r\n\r\n#vt-travel-planner .btn.orange{background:var(--accent)}\r\n#vt-travel-planner .btn.small{padding:10px 12px;font-size:15px}\r\n\r\n#vt-travel-planner .stats{\r\n  display:grid;\r\n  grid-template-columns:1fr 1fr;\r\n  gap:10px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .stat .num{\r\n  font-size:25px;\r\n  font-weight:900;\r\n}\r\n\r\n#vt-travel-planner .stat .lbl{\r\n  font-size:13px;\r\n  color:var(--muted);\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .budget-total{\r\n  font-size:30px;\r\n  font-weight:900;\r\n  margin-top:12px;\r\n}\r\n\r\n#vt-travel-planner .itinerary-panel,\r\n#vt-travel-planner .catalog-panel{\r\n  display:flex;\r\n  flex-direction:column;\r\n  min-height:0;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .catalog-panel{\r\n  padding:0;\r\n  overflow:hidden;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .day-head h3{\r\n  margin:0;\r\n  font-size:23px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .slot h4{\r\n  margin:0;\r\n  font-size:19px;\r\n}\r\n\r\n#vt-travel-planner .slot-meta{\r\n  font-size:11px;\r\n  color:var(--muted);\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .plan-title{\r\n  font-weight:800;\r\n  line-height:1.25;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .tags{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:6px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .tag.type-restaurante{background:#fff5eb;border-color:#ffd3a8;color:#b86400}\r\n#vt-travel-planner .tag.type-alojamiento{background:#eef9ef;border-color:#c8ebd0;color:#2d8b57}\r\n#vt-travel-planner .tag.type-evento{background:#fff0f0;border-color:#f0c7c7;color:#b24a4a}\r\n#vt-travel-planner .tag.type-ocio{background:#f7f0ff;border-color:#dccbff;color:#7546c8}\r\n#vt-travel-planner .tag.reco{background:#eaf5ff;border-color:#bcd9f4;color:#0d6fb8;font-weight:800}\r\n#vt-travel-planner .tag.planned{background:#fff7e8;border-color:#ffd28a;color:#8f5b00;font-weight:800}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .tiny-btn.primary{\r\n  background:var(--brand);\r\n  color:#fff;\r\n  border-color:var(--brand);\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .search{grid-column:1\/-1}\r\n#vt-travel-planner .catalog-grid{display:grid;gap:12px}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .catalog-top h4{\r\n  margin:0;\r\n  font-size:19px;\r\n  line-height:1.25;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .help{\r\n  font-size:13px;\r\n  color:var(--muted);\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .title-row{\r\n  display:flex;\r\n  align-items:flex-start;\r\n  gap:8px;\r\n}\r\n\r\n#vt-travel-planner .catalog-link,\r\n#vt-travel-planner .plan-link,\r\n#vt-travel-planner .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#vt-travel-planner .catalog-link:hover,\r\n#vt-travel-planner .plan-link:hover,\r\n#vt-travel-planner .map-focus-link:hover{\r\n  text-decoration:underline;\r\n}\r\n\r\n#vt-travel-planner .catalog-card .help-strong{\r\n  color:var(--text);\r\n  font-weight:600;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .map-header h3{\r\n  margin:0 0 6px;\r\n  font-size:23px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner #travelMap{\r\n  flex:1;\r\n  min-height:420px;\r\n  width:100%;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .map-list-item strong{\r\n  color:var(--text);\r\n  font-size:14px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .leaflet-popup-content strong{\r\n  display:block;\r\n  margin-bottom:4px;\r\n}\r\n\r\n#vt-travel-planner \/* === Updated layout === *\/\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#vt-travel-planner .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#vt-travel-planner .hero-card,\r\n#vt-travel-planner .controls-card{\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:16px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .brand{\r\n  min-height:100%;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .day-actions{\r\n  display:flex;\r\n  gap:10px;\r\n  flex-wrap:wrap;\r\n}\r\n\r\n#vt-travel-planner .trip-form{\r\n  grid-template-columns:repeat(4,minmax(0,1fr));\r\n}\r\n\r\n#vt-travel-planner .trip-form .field:last-child{\r\n  grid-column:span 2;\r\n}\r\n\r\n#vt-travel-planner .top-actions{\r\n  display:flex;\r\n  gap:10px;\r\n  flex-wrap:wrap;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .stats-card,\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .content-left,\r\n#vt-travel-planner .content-right{\r\n  min-width:0;\r\n}\r\n\r\n#vt-travel-planner .itinerary-panel{\r\n  min-height:760px;\r\n}\r\n\r\n#vt-travel-planner .center-scroll{\r\n  max-height:920px;\r\n}\r\n\r\n#vt-travel-planner .catalog-panel{\r\n  min-height:760px;\r\n}\r\n\r\n#vt-travel-planner .catalog-results{\r\n  max-height:920px;\r\n}\r\n\r\n#vt-travel-planner .map-bottom{\r\n  overflow:hidden;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner #travelMap{\r\n  width:100%;\r\n  height:620px;\r\n  min-height:620px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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  #vt-travel-planner .trip-form .field:last-child{\r\n    grid-column:1 \/ -1;\r\n  }\r\n}\r\n\r\n\r\n#vt-travel-planner \/* === Full-screen layout 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#vt-travel-planner .app-scale-wrap{\r\n  width:100% !important;\r\n  height:auto !important;\r\n  overflow:visible;\r\n}\r\n\r\n#vt-travel-planner .app-scale{\r\n  width:100% !important;\r\n  height:auto !important;\r\n  transform:none !important;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .app{\r\n  width:100%;\r\n  min-width:0;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .content-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr);\r\n  gap:16px;\r\n}\r\n\r\n#vt-travel-planner .content-right{\r\n  order:-1;\r\n}\r\n\r\n#vt-travel-planner .catalog-panel{\r\n  min-height:auto;\r\n}\r\n\r\n#vt-travel-planner .catalog-fixed{\r\n  border-bottom:0;\r\n  padding:16px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .catalog-head > div:first-child{\r\n  min-width:0;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .filters .search{\r\n  grid-column:span 1;\r\n}\r\n\r\n#vt-travel-planner .catalog-results{\r\n  max-height:none;\r\n  padding:0 16px 16px;\r\n}\r\n\r\n#vt-travel-planner .catalog-grid{\r\n  grid-template-columns:repeat(3,minmax(0,1fr));\r\n  align-items:start;\r\n}\r\n\r\n#vt-travel-planner .itinerary-panel{\r\n  min-height:0;\r\n}\r\n\r\n#vt-travel-planner .center-scroll{\r\n  max-height:none;\r\n  overflow:visible;\r\n  padding-right:0;\r\n}\r\n\r\n#vt-travel-planner .stats-budget-row{\r\n  grid-template-columns:220px minmax(0,1fr);\r\n}\r\n\r\n#vt-travel-planner .budget-card{\r\n  order:3;\r\n}\r\n\r\n#vt-travel-planner .bottom-budget{\r\n  margin-top:16px;\r\n}\r\n\r\n#vt-travel-planner .map-bottom{\r\n  margin-top:16px;\r\n}\r\n\r\n#vt-travel-planner .map-bottom-grid{\r\n  grid-template-columns:minmax(0,1fr) 360px;\r\n  min-height:680px;\r\n}\r\n\r\n#vt-travel-planner #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  #vt-travel-planner .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  #vt-travel-planner .filters{\r\n    grid-template-columns:repeat(2,minmax(120px,1fr));\r\n  }\r\n\r\n  #vt-travel-planner .catalog-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n#vt-travel-planner \/* === Final layout adjustment === *\/\r\n.top-layout{\r\n  display:block;\r\n}\r\n\r\n#vt-travel-planner .hero-card,\r\n#vt-travel-planner .controls-card{\r\n  display:block;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .unified-top-right{\r\n  display:grid;\r\n  gap:16px;\r\n}\r\n\r\n#vt-travel-planner .unified-top .top-actions{\r\n  margin-top:12px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .itinerary-panel{\r\n  min-height:720px;\r\n}\r\n\r\n#vt-travel-planner .catalog-panel{\r\n  min-height:720px;\r\n  overflow:hidden;\r\n}\r\n\r\n#vt-travel-planner .catalog-fixed{\r\n  padding:16px;\r\n  border-bottom:1px solid var(--line);\r\n}\r\n\r\n#vt-travel-planner .catalog-head{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:14px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .filters .search{\r\n  grid-column:1 \/ -1;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .catalog-grid{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:12px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner #travelMap{\r\n  height:720px;\r\n  min-height:720px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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  #vt-travel-planner .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#vt-travel-planner \/* === Requested fine-tuning === *\/\r\n.unified-top{\r\n  grid-template-columns:1fr;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .hero-split{\r\n  grid-template-columns:1fr;\r\n  gap:12px;\r\n}\r\n\r\n#vt-travel-planner .hero-split > div:last-child{\r\n  min-width:0;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .trip-tools-row{\r\n  grid-column:1 \/ -1;\r\n}\r\n\r\n#vt-travel-planner .trip-form{\r\n  grid-column:1 \/ -1;\r\n}\r\n\r\n#vt-travel-planner .stats-budget-row{\r\n  display:block;\r\n}\r\n\r\n#vt-travel-planner .stats-card{\r\n  display:none;\r\n}\r\n\r\n#vt-travel-planner .bottom-budget{\r\n  margin-top:16px;\r\n}\r\n\r\n#vt-travel-planner .bottom-budget .stats{\r\n  margin-bottom:16px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .catalog-panel,\r\n#vt-travel-planner .itinerary-panel{\r\n  min-height:980px;\r\n  height:980px;\r\n}\r\n\r\n#vt-travel-planner .catalog-results,\r\n#vt-travel-planner .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#vt-travel-planner .catalog-grid{\r\n  grid-template-columns:1fr;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .slot{\r\n  min-height:220px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .quick-add-btn:hover{\r\n  background:var(--soft);\r\n}\r\n\r\n#vt-travel-planner .day-card{\r\n  margin-bottom:10px;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner \/* === Top banner-only adjustment === *\/\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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner \/* === Clean top section === *\/\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#vt-travel-planner .top-clean-main{\r\n  display:contents;\r\n}\r\n\r\n#vt-travel-planner .top-clean-left{\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:16px;\r\n}\r\n\r\n#vt-travel-planner .unified-top-clean .top-banner{\r\n  min-height:108px;\r\n}\r\n\r\n#vt-travel-planner .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  #vt-travel-planner .unified-top-clean .trip-tools-row{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n#vt-travel-planner .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  #vt-travel-planner .map-list{\r\n    grid-template-columns:1fr;\r\n  }\r\n}\r\n\r\n\r\n\r\n\r\n#vt-travel-planner \/* === Budget in two side blocks === *\/\r\n.bottom-budget{\r\n  display:block;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .budget-main-col,\r\n#vt-travel-planner .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#vt-travel-planner .budget-main-col{\r\n  display:flex;\r\n  flex-direction:column;\r\n}\r\n\r\n#vt-travel-planner .budget-side-col{\r\n  display:flex;\r\n}\r\n\r\n#vt-travel-planner .budget-total{\r\n  margin-top:auto;\r\n}\r\n\r\n#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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#vt-travel-planner .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<\/style>\r\n\r\n<div id=\"vt-travel-planner\">\r\n<section class=\"vt-planner-seo-intro\" aria-labelledby=\"vt-planner-title\">\r\n  <h1 id=\"vt-planner-title\">Travel planner for Tavernes de la Valldigna<\/h1>\r\n<p>Travel planner for Tavernes de la Valldigna: organize your visit with a tool designed to combine beach, nature, town, heritage, gastronomy, events, accommodation and plans at your own pace.<\/p>\r\n  <div class=\"vt-planner-seo-links\" aria-label=\"Useful links to plan your visit\">\r\n    <a href=\"https:\/\/www.visitatavernes.es\/en\/things-to-do-in-tavernes\/\">Things to do in Tavernes<\/a>\r\n    <a href=\"https:\/\/www.visitatavernes.es\/en\/tavernes-beaches\/\">Beaches<\/a>\r\n    <a href=\"https:\/\/www.visitatavernes.es\/en\/nature-and-routes-in-tavernes\/\">Nature and routes<\/a>\r\n    <a href=\"https:\/\/www.visitatavernes.es\/en\/tavernes-de-la-valldigna-for-families\/\">Tavernes for families<\/a>\r\n  <\/div>\r\n<\/section>\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\">Copy summary<\/button>\r\n                  <button class=\"btn alt\" id=\"btnClear\">Clear plan<\/button>\r\n                  <button class=\"btn alt small\" id=\"btnDownload\">Download PDF<\/button>\r\n                <\/div>\r\n              <\/div>\r\n\r\n              <div class=\"top-banner\">\r\n                <div aria-label=\"Visit Tavernes\" class=\"brand-wordmark\">\r\n                  <img decoding=\"async\" class=\"brand-logo\" alt=\"Visit Tavernes de la 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\">VISIT TAVERNES DE LA VALLDIGNA<\/div>\r\n                    <div class=\"brand-main\">Interactive tool<\/div>\r\n                    <div class=\"brand-subline\">Choose dates, filters and plans to build your itinerary by day.<\/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\">Trip name<\/label>\r\n                  <input id=\"tripName\" value=\"Tavernes getaway\"\/>\r\n                <\/div>\r\n                <div class=\"field\">\r\n                  <label for=\"tripStart\">Start date<\/label>\r\n                  <input id=\"tripStart\" type=\"date\"\/>\r\n                <\/div>\r\n                <div class=\"field\">\r\n                  <label for=\"numDays\">Number of days<\/label>\r\n                  <select id=\"numDays\"><\/select>\r\n                <\/div>\r\n                <div class=\"day-actions\">\r\n                  <button class=\"btn alt\" id=\"btnGenerate\">Apply days<\/button>\r\n                  <button class=\"btn\" id=\"btnAddDay\">Add a day<\/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>Choose plans for your trip to Tavernes<\/h3>\r\n                  \r\n                  <div class=\"catalog-count\" id=\"catalogCount\">0 options<\/div>\r\n                <\/div>\r\n\r\n                <div class=\"catalog-extra-filters\">\r\n                  <div class=\"field\">\r\n                    <label>Who are you travelling with<\/label>\r\n                    <select id=\"tripWho\">\r\n                      <option value=\"pareja\">Couple<\/option>\r\n                      <option value=\"familia\">Family<\/option>\r\n                      <option value=\"amigos\">Friends<\/option>\r\n                      <option value=\"solo\">Solo<\/option>\r\n                      <option value=\"grupo\">Group<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n                  <div class=\"field\">\r\n                    <label>How do you get around<\/label>\r\n                    <select id=\"tripMove\">\r\n                      <option value=\"cualquiera\">Any means<\/option>\r\n                      <option value=\"coche\">Mostly by car<\/option>\r\n                      <option value=\"pie\">Mostly on foot<\/option>\r\n                      <option value=\"bici\">Mostly by bike<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n                  <div class=\"field\">\r\n                    <label>Pace<\/label>\r\n                    <select id=\"tripPace\">\r\n                      <option value=\"equilibrado\">Balanced<\/option>\r\n                      <option value=\"tranquilo\">Relaxed<\/option>\r\n                      <option value=\"activo\">Active<\/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>Type<\/label>\r\n                    <select id=\"filterType\">\r\n                      <option value=\"\">All<\/option>\r\n                      <option value=\"actividad\">Activity<\/option>\r\n                      <option value=\"restaurante\">Restaurant<\/option>\r\n                      <option value=\"alojamiento\">Accommodation<\/option>\r\n                      <option value=\"evento\">Event<\/option>\r\n                      <option value=\"ocio\">Leisure<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n\r\n                  <div class=\"field\">\r\n                    <label>Area<\/label>\r\n                    <select id=\"filterZone\">\r\n                      <option value=\"\">Any<\/option>\r\n                      <option value=\"beach\">Beach<\/option>\r\n                      <option value=\"city\">City<\/option>\r\n                      <option value=\"valldigna\">Valldigna area<\/option>\r\n                      <option value=\"monduber\">Mountain \/ Mond\u00faver<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n\r\n                  <div class=\"field\">\r\n                    <label>Time slot<\/label>\r\n                    <select id=\"filterSlot\">\r\n                      <option value=\"\">All<\/option>\r\n                      <option value=\"morning\">Morning<\/option>\r\n                      <option value=\"midday\">Midday<\/option>\r\n                      <option value=\"afternoon\">Afternoon<\/option>\r\n                      <option value=\"night\">Night<\/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=\"\">Any<\/option>\r\n                      <option value=\"pie\">Foot<\/option>\r\n                      <option value=\"bici\">Bike<\/option>\r\n                      <option value=\"coche\">Car<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n\r\n                  <div class=\"field\">\r\n                    <label>Interest<\/label>\r\n                    <select id=\"filterInterest\">\r\n                      <option value=\"\">Any<\/option>\r\n                      <option value=\"beach\">Beach and sea<\/option>\r\n                      <option value=\"naturaleza\">Nature<\/option>\r\n                      <option value=\"senderismo\">Hiking<\/option>\r\n                      <option value=\"patrimonio\">Heritage and culture<\/option>\r\n                      <option value=\"gastronomia\">Gastronomy<\/option>\r\n                      <option value=\"familia\">Family plans<\/option>\r\n                      <option value=\"afternoon_social\">Afternoon social atmosphere<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n\r\n                  <div class=\"field\">\r\n                    <label>Duration<\/label>\r\n                    <select id=\"filterDuration\">\r\n                      <option value=\"\">Any<\/option>\r\n                      <option value=\"corta\">Up to 1.5 h<\/option>\r\n                      <option value=\"media\">Between 1.5 and 3 h<\/option>\r\n                      <option value=\"larga\">More than 3 h<\/option>\r\n                    <\/select>\r\n                  <\/div>\r\n\r\n                  <div class=\"field search\">\r\n                    <label>Search<\/label>\r\n                    <input id=\"search\" placeholder=\"E.g. rice, beach, hotel, Bolomor, hiking...\"\/>\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\">Itinerary<\/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>Interactive map<\/h3>\r\n            <p>Click on a card to center its location. The points update with the filters and the map helps distribute your trip more efficiently.<\/p>\r\n            <div class=\"map-stats\">\r\n              <span class=\"map-pill\" id=\"mapVisibleCount\">0 visible locations<\/span>\r\n              <span class=\"map-pill\" id=\"mapPlannedCount\">0 added to the trip<\/span>\r\n              <span class=\"map-pill\">\ud83e\udded Activity<\/span>\r\n              <span class=\"map-pill\">\ud83c\udf7d\ufe0f Restaurant<\/span>\r\n              <span class=\"map-pill\">\ud83d\udecf\ufe0f Accommodation<\/span>\r\n              <span class=\"map-pill\">\ud83c\udf89 Event<\/span>\r\n              <span class=\"map-pill\">\ud83c\udf19 Leisure<\/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                Show only items added to the trip\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\">Budget<\/h3>\r\n              <div class=\"budget-line\"><span>Activities<\/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>Accommodation<\/span><strong id=\"bStay\">0 \u20ac<\/strong><\/div>\r\n              <div class=\"budget-line\"><span>Leisure and events<\/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\">Days<\/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\">Hours<\/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\">Stops<\/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\">Budget<\/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<\/div>\r\n\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\n(() => {\r\nconst root = document.getElementById('vt-travel-planner');\r\nif (!root) return;\r\nconst $ = (id) => root.querySelector('#' + id);\r\n\r\nconst PLANNER_BASE_WIDTH = 1940;\r\nconst PLANNER_BASE_HEIGHT = 1060;\r\n\r\nconst catalog = [\r\n  {\"id\":\"act-1\",\"title\":\"Beach of Tavernes\",\"type\":\"actividad\",\"zone\":\"beach\",\"hours\":2,\"move\":[\"pie\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Walk, swim and main beach stretch.\",\"cost\":0,\"score\":95,\"notes\":\"beach swimming promenade sea\"},\r\n  {\"id\":\"act-2\",\"title\":\"Llac de la Goleta\",\"type\":\"actividad\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"pie\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Easy walk next to the Goleta area.\",\"cost\":0,\"score\":88,\"notes\":\"beach promenade relaxation\"},\r\n  {\"id\":\"act-3\",\"title\":\"Clot de la Font\",\"type\":\"actividad\",\"zone\":\"valldigna\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Relaxed nature stop in a fresh setting.\",\"cost\":0,\"score\":90,\"notes\":\"nature relaxation\"},\r\n  {\"id\":\"act-4\",\"title\":\"Granata Fountain\",\"type\":\"actividad\",\"zone\":\"valldigna\",\"hours\":1.5,\"move\":[\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Natural setting for a peaceful visit.\",\"cost\":0,\"score\":84,\"notes\":\"peaceful nature\"},\r\n  {\"id\":\"act-5\",\"title\":\"Les Fontetes de Cant\u00fas\",\"type\":\"actividad\",\"zone\":\"valldigna\",\"hours\":2,\"move\":[\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Inland spot for walking and outdoor time.\",\"cost\":0,\"score\":83,\"notes\":\"inland promenade\"},\r\n  {\"id\":\"act-6\",\"title\":\"Mond\u00faver Route\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\"],\"desc\":\"Mountain outing for those wanting a more demanding route.\",\"cost\":0,\"score\":92,\"notes\":\"hiking mountain active\"},\r\n  {\"id\":\"act-7\",\"title\":\"Visit to Bolomor Cave\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\"],\"desc\":\"Visit the site and discover its archaeological value.\",\"cost\":0,\"score\":89,\"notes\":\"culture heritage history\"},\r\n  {\"id\":\"act-8\",\"title\":\"Bolomor Cave Route\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":2,\"move\":[\"pie\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"A walk through the surrounding area without entering the interior of the site.\",\"cost\":0,\"score\":81,\"notes\":\"walk nature history\"},\r\n  {\"id\":\"act-9\",\"title\":\"Sailing school\",\"type\":\"actividad\",\"zone\":\"beach\",\"hours\":2,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Water-based activity for beginners or as a guided session.\",\"cost\":0,\"score\":85,\"notes\":\"beach sea sport active family\"},\r\n  {\"id\":\"act-10\",\"title\":\"Kitesurf lane\",\"type\":\"actividad\",\"zone\":\"beach\",\"hours\":2,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Sports access area linked to kitesurf practice.\",\"cost\":0,\"score\":76,\"notes\":\"beach wind sport\"},\r\n  {\"id\":\"act-11\",\"title\":\"Boat entry channel\",\"type\":\"actividad\",\"zone\":\"beach\",\"hours\":1,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Nautical access point next to the beach entrance.\",\"cost\":0,\"score\":70,\"notes\":\"nautical beach\"},\r\n  {\"id\":\"act-12\",\"title\":\"Beach of Goleta\",\"type\":\"actividad\",\"zone\":\"beach\",\"hours\":2,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Stretch of beach and promenade in La Goleta, gateway to the dune ecosystem of the Ruta dels Sentits.\",\"cost\":0,\"score\":93,\"notes\":\"beach dunes promenade\"},\r\n  {\"id\":\"act-13\",\"title\":\"Moll\u00f3 Park\",\"type\":\"actividad\",\"zone\":\"beach\",\"hours\":1,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Accessible park for cycling, skating and outdoor fitness equipment.\",\"cost\":0,\"score\":82,\"notes\":\"family children cycling\"},\r\n  {\"id\":\"act-14\",\"title\":\"North Park\",\"type\":\"actividad\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Sports and leisure area with courts and seasonal summer activities.\",\"cost\":0,\"score\":84,\"notes\":\"family sport leisure\"},\r\n  {\"id\":\"act-15\",\"title\":\"Watchtower\",\"type\":\"actividad\",\"zone\":\"beach\",\"hours\":1,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Historic coastal watchtower with defensive heritage value, next to a leisure area and pond.\",\"cost\":0,\"score\":94,\"notes\":\"heritage culture walk\"},\r\n  {\"id\":\"act-16\",\"title\":\"Beach entrance cycle lane\",\"type\":\"actividad\",\"zone\":\"beach\",\"hours\":1,\"move\":[\"bici\",\"pie\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Comfortable cycle route connecting with the Watchtower and La Goleta.\",\"cost\":0,\"score\":80,\"notes\":\"cycling beach ride\"},\r\n  {\"id\":\"act-17\",\"title\":\"Ruta dels Sentits\",\"type\":\"actividad\",\"zone\":\"valldigna\",\"hours\":3.5,\"move\":[\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"A 14 km Blue Trail linking dunes, marshland, orchards and woodland surroundings.\",\"cost\":0,\"score\":97,\"notes\":\"hiking cycling nature marsh beach\"},\r\n  {\"id\":\"act-18\",\"title\":\"Ullal Gran\",\"type\":\"actividad\",\"zone\":\"valldigna\",\"hours\":1,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Wetland linked to an underground spring, a refuge for birds and a very photogenic stop.\",\"cost\":0,\"score\":89,\"notes\":\"nature photos birds\"},\r\n  {\"id\":\"act-19\",\"title\":\"Ullal de les Penyetes\",\"type\":\"actividad\",\"zone\":\"valldigna\",\"hours\":1,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Wetland point complementary to Ullal Gran, ideal for an interpretive walk.\",\"cost\":0,\"score\":84,\"notes\":\"nature walk\"},\r\n  {\"id\":\"act-20\",\"title\":\"Sangonera Fountain\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":1,\"move\":[\"pie\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Mountain spring located in the surroundings of the Route de les Creus.\",\"cost\":0,\"score\":82,\"notes\":\"mountain walk\"},\r\n  {\"id\":\"act-21\",\"title\":\"Saint Lawrence Natural Area\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Mountain setting linked to the hermitage and several routes leading to viewpoints.\",\"cost\":0,\"score\":86,\"notes\":\"nature viewpoint heritage\"},\r\n  {\"id\":\"act-22\",\"title\":\"Mediterranean Viewpoint\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":1,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Classic viewpoint in Tavernes with panoramic views over the coast and the Valldigna valley.\",\"cost\":0,\"score\":91,\"notes\":\"viewpoint photos landscape\"},\r\n  {\"id\":\"act-23\",\"title\":\"Massalari Peak Peak\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":3,\"move\":[\"pie\"],\"slots\":[\"morning\"],\"desc\":\"Mountain summit and surrounding area for hikers looking for a longer route.\",\"cost\":0,\"score\":84,\"notes\":\"hiking mountain active\"},\r\n  {\"id\":\"act-24\",\"title\":\"Massalari Peak Bell\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":3.5,\"move\":[\"pie\"],\"slots\":[\"morning\"],\"desc\":\"Out-and-back route through the Serra de les Creus to the bell installed by hikers.\",\"cost\":0,\"score\":88,\"notes\":\"active hiking\"},\r\n  {\"id\":\"act-25\",\"title\":\"Route de les Creus\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":4,\"move\":[\"pie\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Waymarked route ascending to les Creus, Fontetes de Cant\u00fas, Castellets and the viewpoint.\",\"cost\":0,\"score\":96,\"notes\":\"hiking mountain active\"},\r\n  {\"id\":\"act-26\",\"title\":\"Pas de Cabres Via Ferrata\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":5,\"move\":[\"pie\"],\"slots\":[\"morning\"],\"desc\":\"K2 via ferrata with two equipped sections ending at the second cross.\",\"cost\":0,\"score\":90,\"notes\":\"adventure active mountain\"},\r\n  {\"id\":\"act-27\",\"title\":\"Les Marujes Via Ferrata\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":2.5,\"move\":[\"pie\"],\"slots\":[\"morning\"],\"desc\":\"K3 via ferrata in Penya Roja with a Tibetan bridge and vertical sections.\",\"cost\":0,\"score\":89,\"notes\":\"adventure active\"},\r\n  {\"id\":\"act-28\",\"title\":\"Cadira Route\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":2.8,\"move\":[\"pie\"],\"slots\":[\"morning\"],\"desc\":\"Circular route through Cam\u00ed de la Cadira, La Cisterna and Pla de les Foietes.\",\"cost\":0,\"score\":93,\"notes\":\"hiking landscape\"},\r\n  {\"id\":\"act-29\",\"title\":\"Ombria Route\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":3,\"move\":[\"pie\"],\"slots\":[\"morning\"],\"desc\":\"Circular route through l'Ombria, Barranc de Cremades and Pla de les Foietes.\",\"cost\":0,\"score\":90,\"notes\":\"active hiking\"},\r\n  {\"id\":\"act-31\",\"title\":\"Via Verda - Trenet (GR-236)\",\"type\":\"actividad\",\"zone\":\"valldigna\",\"hours\":2.5,\"move\":[\"bici\",\"pie\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"29 km route along the former Carcaixent-Gandia-D\u00e9nia railway, ideal for cycling.\",\"cost\":0,\"score\":92,\"notes\":\"cycling active route\"},\r\n  {\"id\":\"act-32\",\"title\":\"Nordic Walking Circuit\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":2.5,\"move\":[\"pie\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Active circuit through the viewpoint area, Rac\u00f3 de Joana and Rac\u00f3 Red\u00f3.\",\"cost\":0,\"score\":80,\"notes\":\"active sport walking\"},\r\n  {\"id\":\"act-33\",\"title\":\"Rac\u00f3 de Joana\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":1.5,\"move\":[\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Natural area in the surroundings of the viewpoint and the Nordic walking circuit.\",\"cost\":0,\"score\":79,\"notes\":\"nature walk cycling\"},\r\n  {\"id\":\"act-34\",\"title\":\"La Cisterna\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":0.8,\"move\":[\"pie\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Historic cistern visible in the surroundings of the Cadira Route and l'Ombria.\",\"cost\":0,\"score\":76,\"notes\":\"heritage mountain\"},\r\n  {\"id\":\"act-35\",\"title\":\"Pla de les Foietes\",\"type\":\"actividad\",\"zone\":\"monduber\",\"hours\":1,\"move\":[\"pie\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"High plateau and scenic balcony included in several mountain routes.\",\"cost\":0,\"score\":78,\"notes\":\"landscape viewpoint\"},\r\n  {\"id\":\"act-36\",\"title\":\"City Hall\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":0.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Emblematic building in the urban centre, suitable for a heritage walk.\",\"cost\":0,\"score\":74,\"notes\":\"heritage centre\"},\r\n  {\"id\":\"act-37\",\"title\":\"Saint Peter Church\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":1,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Historic church in the old quarter with a dome, chapel and museum.\",\"cost\":0,\"score\":90,\"notes\":\"culture heritage history\"},\r\n  {\"id\":\"act-38\",\"title\":\"Saint Joseph Church\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":0.75,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Church included among Tavernes\u2019 emblematic buildings.\",\"cost\":0,\"score\":78,\"notes\":\"heritage culture\"},\r\n  {\"id\":\"act-39\",\"title\":\"Calvari\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":0.75,\"move\":[\"pie\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Climb and visit to one of the emblematic landmarks of the urban centre.\",\"cost\":0,\"score\":79,\"notes\":\"city walk\"},\r\n  {\"id\":\"act-40\",\"title\":\"Mol\u00ed Vell del Pla\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":0.75,\"move\":[\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Notable example of hydraulic archaeology from the Cistercian period.\",\"cost\":0,\"score\":85,\"notes\":\"heritage culture\"},\r\n  {\"id\":\"act-41\",\"title\":\"Mol\u00ed de Tonet\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":0.75,\"move\":[\"pie\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Reference point of local industrial heritage linked to the valley\u2019s technical evolution.\",\"cost\":0,\"score\":80,\"notes\":\"heritage\"},\r\n  {\"id\":\"act-42\",\"title\":\"Ermita de Saint Lawrence\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":1,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Hermitage and historic site linked to l\u2019Alcudiola and the route up to the viewpoint.\",\"cost\":0,\"score\":82,\"notes\":\"heritage viewpoint\"},\r\n  {\"id\":\"act-43\",\"title\":\"Municipal Market\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":0.75,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\"],\"desc\":\"Useful stop for local produce and everyday local atmosphere.\",\"cost\":0,\"score\":77,\"notes\":\"local produce\"},\r\n  {\"id\":\"act-44\",\"title\":\"House of Culture\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":1,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Cultural venue active throughout the year with outdoor space for events.\",\"cost\":0,\"score\":83,\"notes\":\"culture\"},\r\n  {\"id\":\"act-45\",\"title\":\"VCF Mural at Carlos Pellicer Pavilion\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":0.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Large urban art mural promoted by the Fundaci\u00f3 Valencia CF at the Carlos Pellicer pavilion.\",\"cost\":0,\"score\":85,\"notes\":\"urban art\"},\r\n  {\"id\":\"act-46\",\"title\":\"House of Culture Mural (Estell\u00e9s)\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":0.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Large-format urban mural on the fa\u00e7ade of the House of Culture dedicated to Estell\u00e9s.\",\"cost\":0,\"score\":84,\"notes\":\"urban art culture\"},\r\n  {\"id\":\"act-47\",\"title\":\"Torreta Iron Mural\",\"type\":\"actividad\",\"zone\":\"beach\",\"hours\":0.4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Art intervention on the route between the Watchtower and the Torreta.\",\"cost\":0,\"score\":74,\"notes\":\"art by the beach\"},\r\n  {\"id\":\"act-48\",\"title\":\"Badell and Vaca River Area\",\"type\":\"actividad\",\"zone\":\"valldigna\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Walk through the surroundings of the Vaca River tributary, included in several local routes.\",\"cost\":0,\"score\":78,\"notes\":\"nature walk\"},\r\n  {\"id\":\"act-49\",\"title\":\"Promenade and beach bars\",\"type\":\"actividad\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Relaxed stroll along the seafront with atmosphere, bars and summer activity.\",\"cost\":0,\"score\":86,\"notes\":\"beach atmosphere promenade\"},\r\n  {\"id\":\"act-50\",\"title\":\"Cultural Walk Through the Historic Centre\",\"type\":\"actividad\",\"zone\":\"city\",\"hours\":2,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Urban route combining City Hall, churches, the market, mills and the House of Culture.\",\"cost\":0,\"score\":80,\"notes\":\"culture city heritage\"},\r\n\r\n  {\"id\":\"res-51\",\"title\":\"Baladre\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"midday\",\"afternoon\",\"night\"],\"desc\":\"Beachside restaurant with rice dishes, terrace atmosphere, pool and drinks option.\",\"cost\":24,\"score\":92,\"notes\":\"beach rice atmosphere\"},\r\n  {\"id\":\"res-52\",\"title\":\"Bar Restaurant Calipso\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Beachside restaurant serving Mediterranean cuisine.\",\"cost\":22,\"score\":84,\"notes\":\"beach Mediterranean\"},\r\n  {\"id\":\"res-53\",\"title\":\"Restaurant Macario\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.6,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Mediterranean and Valencian cuisine with a strong emphasis on rice dishes and Valencian paella.\",\"cost\":28,\"score\":94,\"notes\":\"rice paella beach\"},\r\n  {\"id\":\"res-54\",\"title\":\"Casablanca Beer & Grill\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Beachside option focused on grill dishes and casual dining.\",\"cost\":24,\"score\":83,\"notes\":\"casual friends\"},\r\n  {\"id\":\"res-55\",\"title\":\"Cervecer\u00eda Los Delfines\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Beachside beer bar suitable for tapas, snacks or a relaxed meal.\",\"cost\":18,\"score\":81,\"notes\":\"tapas friends beach\"},\r\n  {\"id\":\"res-56\",\"title\":\"Dall\u2019Italiano\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Italian beachside restaurant with homemade pasta and pizzas in the evening.\",\"cost\":24,\"score\":93,\"notes\":\"pizza Italian family night\"},\r\n  {\"id\":\"res-57\",\"title\":\"El Fog\u00f3n de More\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Beachside restaurant suitable for lunch and dinner.\",\"cost\":22,\"score\":80,\"notes\":\"beach\"},\r\n  {\"id\":\"res-58\",\"title\":\"Haveli Tavernes\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Indian restaurant by the beach.\",\"cost\":22,\"score\":87,\"notes\":\"Indian dinner\"},\r\n  {\"id\":\"res-59\",\"title\":\"La Bombonera Gastrobar\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"midday\",\"afternoon\",\"night\"],\"desc\":\"Beachside gastrobar suitable for afternoon social time, tapas, lunch or dinner.\",\"cost\":24,\"score\":82,\"notes\":\"afternoon social friends beach\"},\r\n  {\"id\":\"res-60\",\"title\":\"La Gallina Loca\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Beachside restaurant for lunch or dinner.\",\"cost\":22,\"score\":80,\"notes\":\"beach\"},\r\n  {\"id\":\"res-61\",\"title\":\"La Mordidita Beach Club\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"midday\",\"afternoon\",\"night\"],\"desc\":\"Beach club suitable for meals, afternoon social time and evening atmosphere.\",\"cost\":26,\"score\":85,\"notes\":\"afternoon social friends beach\"},\r\n  {\"id\":\"res-62\",\"title\":\"L\u2019Excusa Perfecta\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Beachside restaurant suitable for lunch and dinner.\",\"cost\":23,\"score\":80,\"notes\":\"beach\"},\r\n  {\"id\":\"res-63\",\"title\":\"Restaurant Puerta del Sol\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"midday\",\"afternoon\",\"night\"],\"desc\":\"Beachside restaurant suitable for lunch or dinner during a day by the sea.\",\"cost\":24,\"score\":84,\"notes\":\"beach restaurant lunch dinner\"},\r\n  {\"id\":\"res-64\",\"title\":\"N\u00f2mada Lounge & Restaurant\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"midday\",\"night\"],\"desc\":\"Lounge and restaurant by the sea, suitable for lunch, dinner or extending after-meal time.\",\"cost\":26,\"score\":86,\"notes\":\"couples beach dinner\"},\r\n  {\"id\":\"res-65\",\"title\":\"Restaurant Altamar\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Beachside restaurant suitable for lunch and dinner.\",\"cost\":26,\"score\":88,\"notes\":\"beach\"},\r\n  {\"id\":\"res-66\",\"title\":\"Restaurant El Medi \/ Mediterrani\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Restaurant serving Mediterranean cuisine by the beach.\",\"cost\":25,\"score\":86,\"notes\":\"Mediterranean beach\"},\r\n  {\"id\":\"res-67\",\"title\":\"Restaurant Les Ones\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Beachside restaurant suitable for lunch and dinner.\",\"cost\":23,\"score\":84,\"notes\":\"beach\"},\r\n  {\"id\":\"res-68\",\"title\":\"Restaurant Luna Park\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Restaurant on Tavernes beach.\",\"cost\":25,\"score\":83,\"notes\":\"beach\"},\r\n  {\"id\":\"res-69\",\"title\":\"Restaurant San Bernardo\",\"type\":\"restaurante\",\"zone\":\"beach\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Restaurant serving traditional cuisine by the beach.\",\"cost\":22,\"score\":84,\"notes\":\"traditional beach\"},\r\n  {\"id\":\"res-70\",\"title\":\"Aires del Sur\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Restaurant specializing in fried dishes and meat dishes.\",\"cost\":21,\"score\":84,\"notes\":\"meat dishes\"},\r\n  {\"id\":\"res-71\",\"title\":\"Bar \u00c1ngel\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.2,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Bar closely linked to the local mid-morning meal tradition.\",\"cost\":12,\"score\":89,\"notes\":\"local mid-morning meal\"},\r\n  {\"id\":\"res-72\",\"title\":\"Bar Els Amics\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.2,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"City bar suitable for the local mid-morning meal, tapas or lunch.\",\"cost\":20,\"score\":78,\"notes\":\"mid-morning meal tapas\"},\r\n  {\"id\":\"res-73\",\"title\":\"Bar La Cosa Nostra\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Urban bar-restaurant suitable for lunch or dinner.\",\"cost\":16,\"score\":79,\"notes\":\"urban\"},\r\n  {\"id\":\"res-74\",\"title\":\"Bar Restaurant Astim\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"City bar-restaurant suitable for the local mid-morning meal or lunch.\",\"cost\":15,\"score\":78,\"notes\":\"mid-morning meal\"},\r\n  {\"id\":\"res-75\",\"title\":\"Bar Tapas Cristal\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Tapas venue in Tavernes suitable for a relaxed meal.\",\"cost\":17,\"score\":80,\"notes\":\"tapas friends\"},\r\n  {\"id\":\"res-76\",\"title\":\"Bar Murciano\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.2,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"City bar especially associated with the local mid-morning meal tradition.\",\"cost\":18,\"score\":79,\"notes\":\"mid-morning meal\"},\r\n  {\"id\":\"res-77\",\"title\":\"Ca Saoret\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Well-known local venue associated with the traditional mid-morning meal, with Mediterranean and Spanish cuisine. Winner of the Cacau d\u2019Or award.\",\"cost\":19,\"score\":95,\"notes\":\"local signature mid-morning meal\"},\r\n  {\"id\":\"res-78\",\"title\":\"Cervesseria Garatge\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Urban beer bar suitable for snacks and afternoon social time.\",\"cost\":18,\"score\":79,\"notes\":\"beer afternoon social friends\"},\r\n  {\"id\":\"res-79\",\"title\":\"Exqsa Perfecta \u2013 Passeig\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Urban option suitable for lunch or dinner.\",\"cost\":19,\"score\":77,\"notes\":\"urban\"},\r\n  {\"id\":\"res-80\",\"title\":\"La Casa Viva\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"midday\",\"afternoon\",\"night\"],\"desc\":\"Vegetarian and vegan restaurant with gluten-free options.\",\"cost\":24,\"score\":92,\"notes\":\"vegetarian vegan healthy\"},\r\n  {\"id\":\"res-81\",\"title\":\"Legends\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.2,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\"],\"desc\":\"Bar focused on the local late breakfast \/ brunch tradition.\",\"cost\":14,\"score\":82,\"notes\":\"mid-morning meal\"},\r\n  {\"id\":\"res-82\",\"title\":\"Pizzeria La Vall Expr\u00e9s\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":0.8,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"midday\",\"night\"],\"desc\":\"Wood-fired pizzeria offering pizzas and roast chicken for takeaway.\",\"cost\":15,\"score\":88,\"notes\":\"pizza family\"},\r\n  {\"id\":\"res-83\",\"title\":\"Pizzer\u00eda Tropical\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.2,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Pizzeria in Tavernes city.\",\"cost\":17,\"score\":79,\"notes\":\"pizza\"},\r\n  {\"id\":\"res-84\",\"title\":\"Restaurant 5 Hermanas\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Urban restaurant suitable for lunch and dinner.\",\"cost\":20,\"score\":82,\"notes\":\"urban\"},\r\n  {\"id\":\"res-85\",\"title\":\"Restaurant Bar Pizzeria Anais\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Bar-pizzeria in the city.\",\"cost\":18,\"score\":78,\"notes\":\"pizza\"},\r\n  {\"id\":\"res-86\",\"title\":\"Restaurant Chino Gran Muralla\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Chinese restaurant in Tavernes city.\",\"cost\":18,\"score\":78,\"notes\":\"Asian\"},\r\n  {\"id\":\"res-87\",\"title\":\"Restaurant Club de Tenis Valldigna\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Restaurant linked to the tennis club.\",\"cost\":22,\"score\":76,\"notes\":\"club\"},\r\n  {\"id\":\"res-88\",\"title\":\"Restaurant Delicias\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Urban restaurant suitable for lunch and dinner.\",\"cost\":17,\"score\":77,\"notes\":\"urban\"},\r\n  {\"id\":\"res-89\",\"title\":\"Restaurant Pizzer\u00eda Ibis\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Restaurant-pizzeria in Tavernes city.\",\"cost\":17,\"score\":77,\"notes\":\"pizza\"},\r\n  {\"id\":\"res-90\",\"title\":\"Restaurant Mei Zhou\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Asian restaurant in Tavernes city.\",\"cost\":18,\"score\":78,\"notes\":\"Asian\"},\r\n  {\"id\":\"res-91\",\"title\":\"Restaurant V\u00edctor\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"City bar-restaurant suitable for the local mid-morning meal or lunch.\",\"cost\":25,\"score\":79,\"notes\":\"mid-morning meal\"},\r\n  {\"id\":\"res-92\",\"title\":\"Rustiks\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Urban restaurant for lunch or dinner.\",\"cost\":19,\"score\":78,\"notes\":\"dinner\"},\r\n  {\"id\":\"res-93\",\"title\":\"Super Pizza\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":0.8,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Takeaway pizzas.\",\"cost\":14,\"score\":76,\"notes\":\"pizza\"},\r\n  {\"id\":\"res-94\",\"title\":\"The Black Burger\",\"type\":\"restaurante\",\"zone\":\"city\",\"hours\":1.2,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Burger restaurant in Tavernes city.\",\"cost\":18,\"score\":83,\"notes\":\"burger friends family\"},\r\n\r\n  {\"id\":\"alo-95\",\"title\":\"Hotel Valldigna\",\"type\":\"alojamiento\",\"zone\":\"city\",\"hours\":8,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Hotel in Tavernes city.\",\"cost\":0,\"score\":88,\"notes\":\"alojamiento hotel\"},\r\n  {\"id\":\"alo-96\",\"title\":\"Villa Ursula\",\"type\":\"alojamiento\",\"zone\":\"beach\",\"hours\":8,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Accommodation close to the beach area.\",\"cost\":0,\"score\":85,\"notes\":\"alojamiento beach\"},\r\n  {\"id\":\"alo-97\",\"title\":\"VMC Rooms\",\"type\":\"alojamiento\",\"zone\":\"beach\",\"hours\":8,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Rooms close to the beach.\",\"cost\":0,\"score\":84,\"notes\":\"alojamiento beach\"},\r\n  {\"id\":\"alo-98\",\"title\":\"Rooms Avenida\",\"type\":\"alojamiento\",\"zone\":\"city\",\"hours\":8,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Urban accommodation in Tavernes city.\",\"cost\":0,\"score\":80,\"notes\":\"accommodation city\"},\r\n  {\"id\":\"alo-99\",\"title\":\"Camping Car La Finca\",\"type\":\"alojamiento\",\"zone\":\"beach\",\"hours\":8,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Camper area next to the beach.\",\"cost\":0,\"score\":79,\"notes\":\"camper beach\"},\r\n  {\"id\":\"alo-100\",\"title\":\"Ohana Beach Camper Area\",\"type\":\"alojamiento\",\"zone\":\"beach\",\"hours\":8,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Restaurant on Tavernes beach.\",\"cost\":0,\"score\":77,\"notes\":\"camper beach\"},\r\n\r\n  {\"id\":\"eve-101\",\"title\":\"Tavernes Fallas\",\"type\":\"evento\",\"zone\":\"city\",\"hours\":3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"afternoon\",\"night\"],\"desc\":\"Traditional festival held from 16 to 19 March.\",\"cost\":0,\"score\":87,\"notes\":\"festival celebration\"},\r\n  {\"id\":\"eve-102\",\"title\":\"Festivern\",\"type\":\"evento\",\"zone\":\"city\",\"hours\":4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"midday\",\"afternoon\",\"night\"],\"desc\":\"Festival held from 29 to 31 December.\",\"cost\":0,\"score\":91,\"notes\":\"music festival friends\"},\r\n  {\"id\":\"eve-103\",\"title\":\"Del Poble Fest\",\"type\":\"evento\",\"zone\":\"city\",\"hours\":4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"midday\",\"afternoon\",\"night\"],\"desc\":\"Festival held on dates that vary depending on each edition.\",\"cost\":0,\"score\":82,\"notes\":\"festival\"},\r\n  {\"id\":\"eve-104\",\"title\":\"Saint John\",\"type\":\"evento\",\"zone\":\"beach\",\"hours\":3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"midday\",\"afternoon\",\"night\"],\"desc\":\"Traditional celebration on the night of 23 June.\",\"cost\":0,\"score\":84,\"notes\":\"beach fiesta night\"},\r\n  {\"id\":\"eve-105\",\"title\":\"Saint James Fair\",\"type\":\"evento\",\"zone\":\"city\",\"hours\":3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Popular fair with attractions and a festive atmosphere.\",\"cost\":0,\"score\":83,\"notes\":\"familia feria\"},\r\n\r\n  {\"id\":\"eve-112\",\"title\":\"April - Holy Week\",\"type\":\"evento\",\"zone\":\"city\",\"hours\":3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Traditional programme associated with Holy Week in Tavernes.\",\"cost\":0,\"score\":84,\"notes\":\"Holy Week tradition processions\"},\r\n  {\"id\":\"eve-113\",\"title\":\"Major Festivities\",\"type\":\"evento\",\"zone\":\"city\",\"hours\":4,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"morning\",\"midday\",\"afternoon\",\"night\"],\"desc\":\"Key event in the local calendar, with activities spread throughout the day.\",\"cost\":0,\"score\":90,\"notes\":\"fiestas mayores tradition town\"},\r\n  {\"id\":\"eve-114\",\"title\":\"1st of May\",\"type\":\"evento\",\"zone\":\"city\",\"hours\":3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Traditional 1st of May celebration with local programming.\",\"cost\":0,\"score\":82,\"notes\":\"May tradition celebration\"},\r\n  {\"id\":\"eve-115\",\"title\":\"9th of October\",\"type\":\"evento\",\"zone\":\"city\",\"hours\":3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Commemorative programme for 9 October within the local calendar.\",\"cost\":0,\"score\":82,\"notes\":\"9 October tradition celebration\"},\r\n  {\"id\":\"eve-116\",\"title\":\"Porrat de la Sang\",\"type\":\"evento\",\"zone\":\"valldigna\",\"hours\":2.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\"],\"desc\":\"Traditional porrat linked to local custom and suitable for family plans.\",\"cost\":0,\"score\":84,\"notes\":\"traditional family porrat\"},\r\n  {\"id\":\"eve-117\",\"title\":\"Saint Lawrence Porrat\",\"type\":\"evento\",\"zone\":\"monduber\",\"hours\":2.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\"],\"desc\":\"Traditional porrat linked to the Saint Lawrence area, combining local tradition and nature.\",\"cost\":0,\"score\":84,\"notes\":\"Saint Lawrence porrat tradition\"},\r\n  {\"id\":\"eve-118\",\"title\":\"Sete S\u00f3is Sete Luas\",\"type\":\"evento\",\"zone\":\"city\",\"hours\":3,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Cultural and music festival held according to the annual programme.\",\"cost\":0,\"score\":86,\"notes\":\"festival music culture\"},\r\n  {\"id\":\"eve-119\",\"title\":\"Choir Festival\",\"type\":\"evento\",\"zone\":\"city\",\"hours\":2.5,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Choral music festival held according to the annual programme.\",\"cost\":0,\"score\":84,\"notes\":\"choir festival music\"},\r\n\r\n  {\"id\":\"oci-107\",\"title\":\"Drinks or afternoon social at Baladre\",\"type\":\"ocio\",\"zone\":\"beach\",\"hours\":2,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Afternoon social time and drinks at Baladre, one of the liveliest spots by the beach.\",\"cost\":0,\"score\":82,\"notes\":\"afternoon social drinks friends\"},\r\n  {\"id\":\"oci-108\",\"title\":\"Seafront evening stroll\",\"type\":\"ocio\",\"zone\":\"beach\",\"hours\":1,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"night\"],\"desc\":\"Gentle option to round off the day.\",\"cost\":0,\"score\":75,\"notes\":\"beach night walk relaxed\"},\r\n  {\"id\":\"oci-109\",\"title\":\"Night Walk Through Tavernes City\",\"type\":\"ocio\",\"zone\":\"city\",\"hours\":1,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"night\"],\"desc\":\"Relaxed walk through the city centre.\",\"cost\":0,\"score\":68,\"notes\":\"city relaxed walk\"},\r\n  {\"id\":\"oci-110\",\"title\":\"Drinks or afternoon social at La Bombonera Gastrobar\",\"type\":\"ocio\",\"zone\":\"beach\",\"hours\":2,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Afternoon social time and drinks next to the beach.\",\"cost\":0,\"score\":80,\"notes\":\"afternoon social drinks beach\"},\r\n  {\"id\":\"oci-111\",\"title\":\"Drinks or afternoon social at La Mordidita Beach Club\",\"type\":\"ocio\",\"zone\":\"beach\",\"hours\":2,\"move\":[\"coche\",\"pie\",\"bici\"],\"slots\":[\"afternoon\",\"night\"],\"desc\":\"Beach club with an afternoon social atmosphere and evening leisure setting.\",\"cost\":0,\"score\":82,\"notes\":\"afternoon social friends beach\"}\r\n];\r\n\r\nconst coordPatch = {\r\n  \"Beach of 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  \"Granata Fountain\": { \"lat\": 39.09340321510781, \"lng\": -0.28952816613671006 },\r\n  \"Visit to Bolomor Cave\": { \"lat\": 39.06389524256403, \"lng\": -0.2503037292673149 },\r\n  \"Sailing school\": { \"lat\": 39.10325976200742, \"lng\": -0.22155410309260565 },\r\n  \"Kitesurf lane\": { \"lat\": 39.081956563207164, \"lng\": -0.21150778129306116 },\r\n  \"Boat entry channel\": { \"lat\": 39.08746337411143, \"lng\": -0.21483372077186944 },\r\n  \"Beach of Goleta\": { \"lat\": 39.09912177293142, \"lng\": -0.22074944077030723 },\r\n  \"Moll\u00f3 Park\": { \"lat\": 39.10409105232547, \"lng\": -0.22618615830573205 },\r\n  \"North Park\": { \"lat\": 39.10494858305977, \"lng\": -0.22326791488051762 },\r\n  \"Watchtower\": { \"lat\": 39.086219905452495, \"lng\": -0.2179107262353749 },\r\n  \"Beach entrance cycle lane\": { \"lat\": 39.08719423981628, \"lng\": -0.21684857144468592 },\r\n  \"Ullal Gran\": { \"lat\": 39.081696791340356, \"lng\": -0.24162182660775022 },\r\n  \"Sangonera Fountain\": { \"lat\": 39.086984213592814, \"lng\": -0.2916866316306998 },\r\n  \"Saint Lawrence Natural Area\": { \"lat\": 39.082276678853574, \"lng\": -0.2553871316309047 },\r\n  \"Mediterranean Viewpoint\": { \"lat\": 39.08500826482173, \"lng\": -0.24860650723306568 },\r\n  \"Massalari Peak Peak\": { \"lat\": 39.09562987342248, \"lng\": -0.2976822847644695 },\r\n  \"Massalari Peak Bell\": { \"lat\": 39.0901676476069, \"lng\": -0.281375696705547 },\r\n  \"Route de les Creus\": { \"lat\": 39.08090715367388, \"lng\": -0.2774274853867399 },\r\n  \"Pas de Cabres Via Ferrata\": { \"lat\": 39.07977059871669, \"lng\": -0.273598729838858 },\r\n  \"Les Marujes Via Ferrata\": { \"lat\": 39.07644345499099, \"lng\": -0.283686755199953 },\r\n  \"Nordic Walking Circuit\": { \"lat\": 39.07504353681741, \"lng\": -0.2598953242164171 },\r\n  \"La Cisterna\": { \"lat\": 39.0831555373413, \"lng\": -0.258103608759979 },\r\n  \"City Hall\": { \"lat\": 39.07184834218302, \"lng\": -0.2677240316312862 },\r\n  \"Saint Peter Church\": { \"lat\": 39.07284595241503, \"lng\": -0.26713767210484973 },\r\n  \"Saint Joseph Church\": { \"lat\": 39.07457572479507, \"lng\": -0.2715793974193275 },\r\n  \"Calvari\": { \"lat\": 39.07532619598619, \"lng\": -0.26917211534507374 },\r\n  \"Mol\u00ed Vell del Pla\": { \"lat\": 39.065478544993255, \"lng\": -0.27233504342227705 },\r\n  \"Municipal Market\": { \"lat\": 39.0721666178573, \"lng\": -0.26569366046757914 },\r\n  \"House of Culture\": { \"lat\": 39.073160576305916, \"lng\": -0.26638481341513565 },\r\n  \"VCF Mural at Carlos Pellicer Pavilion\": { \"lat\": 39.07007956648436, \"lng\": -0.26425654974295515 },\r\n  \"House of Culture Mural (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  \"Cervecer\u00eda 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  \"Pizzer\u00eda 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 Camper Area\": { \"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, 'en', { sensitivity: 'base' }));\r\n\r\nconst state = {\r\n  tripName:'Tavernes getaway',\r\n  startDate:'',\r\n  days:[],\r\n  nextUid:1\r\n};\r\n\r\nconst slotsOrder = ['morning','midday','afternoon','night'];\r\nconst slotLabels = {'morning':'Morning','midday':'Midday','afternoon':'Afternoon','night':'Night'};\r\nconst zoneLabels = {beach:'Beach', city:'City', town:'Town', valldigna:'Valldigna area', monduber:'Mountain \/ Mond\u00faver'};\r\nconst typeLabels = {actividad:'Activity', restaurante:'Restaurant', alojamiento:'Accommodation', evento:'Event', ocio:'Leisure'};\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\/en\/restaurants-and-accommodations-guide\/',\r\n  alojamientos:'https:\/\/www.visitatavernes.es\/en\/accommodation-campers-and-caravans-in-tavernes-de-la-valldigna\/',\r\n  bolomor:'https:\/\/www.visitatavernes.es\/en\/visit-cova-del-bolomor\/',\r\n  edificios:'https:\/\/www.visitatavernes.es\/en\/emblematic-buildings-in-tavernes\/',\r\n  naturales:'https:\/\/www.visitatavernes.es\/en\/natural-landscape-in-tavernes\/',\r\n  beachs:'https:\/\/www.visitatavernes.es\/en\/tavernes-beaches\/',\r\n  senderismo:'https:\/\/www.visitatavernes.es\/en\/hiking-in-tavernes\/'\r\n};\r\n\r\nconst officialUrlByTitle = {\r\n  \"Beach of Tavernes\": \"https:\/\/www.visitatavernes.es\/en\/tavernes-beaches\/\",\r\n  \"Llac de la Goleta\": \"https:\/\/www.visitatavernes.es\/en\/tavernes-beaches\/\",\r\n  \"Clot de la Font\": \"https:\/\/www.visitatavernes.es\/en\/clot-de-la-font-fountain\/\",\r\n  \"Granata Fountain\": \"https:\/\/www.visitatavernes.es\/en\/font-de-la-granata-fountain\/\",\r\n  \"Les Fontetes de Cant\u00fas\": \"https:\/\/www.visitatavernes.es\/en\/cantus-water-sources\/\",\r\n  \"Mond\u00faver Route\": \"https:\/\/www.visitatavernes.es\/en\/hiking-in-tavernes\/\",\r\n  \"Visit to Bolomor Cave\": \"https:\/\/www.visitatavernes.es\/en\/visit-cova-del-bolomor\/\",\r\n  \"Bolomor Cave Route\": \"https:\/\/www.visitatavernes.es\/en\/route-cova-del-bolomor\/\",\r\n  \"Sailing school\": \"https:\/\/www.visitatavernes.es\/en\/tavernes-beaches\/\",\r\n  \"Kitesurf lane\": \"https:\/\/www.visitatavernes.es\/en\/tavernes-beaches\/\",\r\n  \"Boat entry channel\": \"https:\/\/www.visitatavernes.es\/en\/tavernes-beaches\/\",\r\n  \"Beach of Goleta\": \"https:\/\/www.visitatavernes.es\/en\/tavernes-beaches\/\",\r\n  \"Moll\u00f3 Park\": \"https:\/\/www.visitatavernes.es\/en\/tavernes-beaches\/\",\r\n  \"North Park\": \"https:\/\/www.visitatavernes.es\/en\/tavernes-beaches\/\",\r\n  \"Watchtower\": \"https:\/\/www.visitatavernes.es\/en\/guaita-tower\/\",\r\n  \"Beach entrance cycle lane\": \"https:\/\/www.visitatavernes.es\/en\/tavernes-beaches\/\",\r\n  \"Ruta dels Sentits\": \"https:\/\/www.visitatavernes.es\/en\/ruta-dels-sentits\/\",\r\n  \"Ullal Gran\": \"https:\/\/www.visitatavernes.es\/en\/ullal-gran-i-de-les-penyetes-wellspring\/\",\r\n  \"Ullal de les Penyetes\": \"https:\/\/www.visitatavernes.es\/en\/ullal-gran-i-de-les-penyetes-wellspring\/\",\r\n  \"Sangonera Fountain\": \"https:\/\/www.visitatavernes.es\/en\/font-de-la-sangonera-fountain\/\",\r\n  \"Saint Lawrence Natural Area\": \"https:\/\/www.visitatavernes.es\/en\/sant-llorenc\/\",\r\n  \"Mediterranean Viewpoint\": \"https:\/\/www.visitatavernes.es\/en\/mirador-de-la-mediterrania-viewpoint\/\",\r\n  \"Massalari Peak Peak\": \"https:\/\/www.visitatavernes.es\/en\/puntal-del-massalari-pilaster\/\",\r\n  \"Massalari Peak Bell\": \"https:\/\/www.visitatavernes.es\/en\/puntal-del-massalari-pilaster\/\",\r\n  \"Route de les Creus\": \"https:\/\/www.visitatavernes.es\/en\/the-creus-trek\/\",\r\n  \"Pas de Cabres Via Ferrata\": \"https:\/\/www.visitatavernes.es\/en\/hiking-in-tavernes\/\",\r\n  \"Les Marujes Via Ferrata\": \"https:\/\/www.visitatavernes.es\/en\/via-ferrata-les-marujes-trek\/\",\r\n  \"Cadira Route\": \"https:\/\/www.visitatavernes.es\/en\/hiking-in-tavernes\/\",\r\n  \"Ombria Route\": \"https:\/\/www.visitatavernes.es\/en\/the-ombria-trek\/\",\r\n  \"Via Verda - Trenet (GR-236)\": \"https:\/\/www.visitatavernes.es\/en\/hiking-in-tavernes\/\",\r\n  \"Nordic Walking Circuit\": \"https:\/\/www.visitatavernes.es\/en\/hiking-in-tavernes\/\",\r\n  \"Rac\u00f3 de Joana\": \"https:\/\/www.visitatavernes.es\/en\/raco-de-joana-ullals\/\",\r\n  \"La Cisterna\": \"https:\/\/www.visitatavernes.es\/en\/hiking-in-tavernes\/\",\r\n  \"Pla de les Foietes\": \"https:\/\/www.visitatavernes.es\/en\/hiking-in-tavernes\/\",\r\n  \"City Hall\": \"https:\/\/www.visitatavernes.es\/en\/city-hall\/\",\r\n  \"Saint Peter Church\": \"https:\/\/www.visitatavernes.es\/en\/saint-peter-church\/\",\r\n  \"Saint Joseph Church\": \"https:\/\/www.visitatavernes.es\/en\/saint-joseph-church\/\",\r\n  \"Calvari\": \"https:\/\/www.visitatavernes.es\/en\/the-calvary-of-tavernes\/\",\r\n  \"Mol\u00ed Vell del Pla\": \"https:\/\/www.visitatavernes.es\/en\/the-pla-mill\/\",\r\n  \"Mol\u00ed de Tonet\": \"https:\/\/www.visitatavernes.es\/en\/emblematic-buildings-in-tavernes\/\",\r\n  \"Ermita de Saint Lawrence\": \"https:\/\/www.visitatavernes.es\/en\/hermitage-of-saint-llorenc\/\",\r\n  \"Municipal Market\": \"https:\/\/www.visitatavernes.es\/en\/municipal-market\/\",\r\n  \"House of Culture\": \"https:\/\/www.visitatavernes.es\/en\/the-cultural-center\/\",\r\n  \"VCF Mural at Carlos Pellicer Pavilion\": \"https:\/\/www.visitatavernes.es\/en\/things-to-do-in-tavernes-in-one-day\/\",\r\n  \"House of Culture Mural (Estell\u00e9s)\": \"https:\/\/www.visitatavernes.es\/en\/things-to-do-in-tavernes-in-one-day\/\",\r\n  \"Promenade and beach bars\": \"https:\/\/www.visitatavernes.es\/en\/tavernes-beaches\/\",\r\n  \"Cultural Walk Through the Historic Centre\": \"https:\/\/www.visitatavernes.es\/en\/emblematic-buildings-in-tavernes\/\",\r\n \"Baladre\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Bar Restaurant Calipso\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant Macario\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Casablanca Beer & Grill\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Cervecer\u00eda Los Delfines\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Dall\u2019Italiano\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"El Fog\u00f3n de More\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Haveli Tavernes\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"La Bombonera Gastrobar\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"La Gallina Loca\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"La Mordidita Beach Club\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"L\u2019Excusa Perfecta\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant Puerta del Sol\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"N\u00f2mada Lounge & Restaurant\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant Altamar\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant El Medi \/ Mediterrani\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant Les Ones\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant Luna Park\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant San Bernardo\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Aires del Sur\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Bar \u00c1ngel\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Bar Els Amics\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Bar La Cosa Nostra\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Bar Restaurant Astim\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Bar Tapas Cristal\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Bar Murciano\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Ca Saoret\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Cervesseria Garatge\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Exqsa Perfecta \u2013 Passeig\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"La Casa Viva\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Legends\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Pizzeria La Vall Expr\u00e9s\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Pizzer\u00eda Tropical\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant 5 Hermanas\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant Bar Pizzeria Anais\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant Chino Gran Muralla\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant Club de Tenis Valldigna\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant Delicias\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant Pizzer\u00eda Ibis\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant Mei Zhou\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Restaurant V\u00edctor\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Rustiks\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"Super Pizza\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n\"The Black Burger\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n  \"Hotel Valldigna\": \"https:\/\/www.visitatavernes.es\/en\/accommodation-campers-and-caravans-in-tavernes-de-la-valldigna\/\",\r\n  \"Villa Ursula\": \"https:\/\/www.visitatavernes.es\/en\/accommodation-campers-and-caravans-in-tavernes-de-la-valldigna\/\",\r\n  \"VMC Rooms\": \"https:\/\/www.visitatavernes.es\/en\/accommodation-campers-and-caravans-in-tavernes-de-la-valldigna\/\",\r\n  \"Rooms Avenida\": \"https:\/\/www.visitatavernes.es\/en\/accommodation-campers-and-caravans-in-tavernes-de-la-valldigna\/\",\r\n  \"Camping Car La Finca\": \"https:\/\/www.visitatavernes.es\/en\/accommodation-campers-and-caravans-in-tavernes-de-la-valldigna\/\",\r\n  \"Ohana Beach Camper Area\": \"https:\/\/www.visitatavernes.es\/en\/accommodation-campers-and-caravans-in-tavernes-de-la-valldigna\/\",\r\n  \"Tavernes Fallas\": \"https:\/\/www.visitatavernes.es\/en\/fallas-in-tavernes-de-la-valldigna\/\",\r\n  \"Festivern\": \"https:\/\/www.visitatavernes.es\/en\/festivern\/\",\r\n  \"Del Poble Fest\": \"https:\/\/www.visitatavernes.es\/en\/del-poble-fest\/\",\r\n  \"Saint John\": \"https:\/\/www.visitatavernes.es\/en\/saint-john\/\",\r\n  \"Saint James Fair\": \"https:\/\/www.visitatavernes.es\/en\/saint-james-fair\/\",\r\n  \"Drinks or afternoon social at Baladre\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n  \"Seafront evening stroll\": \"https:\/\/www.visitatavernes.es\/en\/tavernes-beaches\/\",\r\n  \"Night Walk Through Tavernes City\": \"https:\/\/www.visitatavernes.es\/en\/emblematic-buildings-in-tavernes\/\",\r\n  \"Drinks or afternoon social at La Bombonera Gastrobar\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n  \"Drinks or afternoon social at La Mordidita Beach Club\": \"https:\/\/www.visitatavernes.es\/en\/restaurants-and-accommodations-guide\/\",\r\n  \"April - Holy Week\": \"https:\/\/www.visitatavernes.es\/en\/holy-week\/\",\r\n  \"Major Festivities\": \"https:\/\/www.visitatavernes.es\/en\/major-festivals-in-tavernes\/\",\r\n  \"1st of May\": \"https:\/\/www.visitatavernes.es\/en\/may-1st\/\",\r\n  \"9th of October\": \"https:\/\/www.visitatavernes.es\/en\/october-9th\/\",\r\n  \"Porrat de la Sang\": \"https:\/\/www.visitatavernes.es\/en\/porrat-de-la-sang\/\",\r\n  \"Saint Lawrence Porrat\": \"https:\/\/www.visitatavernes.es\/en\/saint-lawrence-porrat\/\",\r\n  \"Sete S\u00f3is Sete Luas\": \"https:\/\/www.visitatavernes.es\/en\/sete-sois-sete-luas\/\",\r\n  \"Choir Festival\": \"https:\/\/www.visitatavernes.es\/en\/festival-de-corals\/\"\r\n};\r\n\r\n\r\nconst tripName = $('tripName');\r\nconst tripStart = $('tripStart');\r\nconst numDays = $('numDays');\r\nconst daysContainer = $('daysContainer');\r\nconst catalogGrid = $('catalogGrid');\r\nconst catalogCount = $('catalogCount');\r\nconst tripWho = $('tripWho');\r\nconst tripMove = $('tripMove');\r\nconst tripPace = $('tripPace');\r\nconst mapVisibleCount = $('mapVisibleCount');\r\nconst mapPlannedCount = $('mapPlannedCount');\r\nconst mapList = $('mapList');\r\nconst mapOnlyPlanned = $('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('en-GB',{style:'currency',currency:'EUR',maximumFractionDigits:0}).format(v || 0);\r\n}\r\nfunction fmtHours(v){\r\n  return v ? String(v).replace('.0','') + ' h' : 'Variable duration';\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  return order.filter(o=>list.includes(o)).map(o=>({pie:'Foot', bici:'Bike', coche:'Car'}[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('en-GB',{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('beach') || hay.includes('goleta') || hay.includes('mar')) tags.push('beach');\r\n  if (hay.includes('naturaleza') || hay.includes('ullal') || hay.includes('paraje') || hay.includes('font') || hay.includes('clot')) tags.push('naturaleza');\r\n  if (hay.includes('senderismo') || hay.includes('ruta') || hay.includes('ferrata') || hay.includes('monduber') || hay.includes('cruces')) tags.push('senderismo');\r\n  if (hay.includes('patrimonio') || hay.includes('iglesia') || hay.includes('moli') || 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('ni\u00f1os') || hay.includes('cine') || hay.includes('feria') || hay.includes('pizza')) tags.push('familia');\r\n  if (hay.includes('afternoon social') || hay.includes('drinks') || hay.includes('copas') || hay.includes('beach club') || hay.includes('festival') || hay.includes('atmosphere') || hay.includes('ambiente')) tags.push('afternoon_social');\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('restaurante') || q.includes('have lunch') || q.includes('have dinner') || q.includes('local mid-morning meal') || q.includes('pizza') || q.includes('arroz')) return 'restaurante';\r\n  if(q.includes('hotel') || q.includes('alojamiento') || q.includes('apartamento') || q.includes('camper') || q.includes('dormir')) return 'alojamiento';\r\n  if(q.includes('evento') || q.includes('festival') || q.includes('feria') || q.includes('fallas') || q.includes('cine')) return 'evento';\r\n  if(q.includes('drinks') || q.includes('afternoon social') || q.includes('copas') || q.includes('leisure') || q.includes('night')) return 'ocio';\r\n  if(q.includes('beach') || 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('matches your transport choice');\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('relaxed pace'); }\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('active pace'); }\r\n    if(item.zone === 'monduber' || (item.notes || '').includes('hiking') || (item.notes || '').includes('sport') || (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('family plan'); }\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 === 'beach' || item.type === 'restaurante'){ score += 6; reasons.push('good option for couples'); }\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('better for friends'); }\r\n    if((item.notes || '').includes('afternoon social') || (item.notes || '').includes('drinks') || (item.notes || '').includes('festival')){ 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('useful for groups'); }\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('matches your notes');\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('beach') || hay.includes('goleta') || hay.includes('paseo maritimo') || hay.includes('torre de guaita')) return officialLinks.beachs;\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 interestTags = inferInterestTags(item);\r\n  const bestMoment = (item.slots || []).length ? (item.slots || []).map(s => slotLabels[s]).join(', ') : 'any time';\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 = `This is a ${zone.toLowerCase()} option that works well for ${bestMoment.toLowerCase()}. Allow about ${duration.toLowerCase()} and keep in mind it works best if you get around by ${move}.`;\r\n  } else if(item.type === 'restaurante'){\r\n    practical = `A good option for planning a ${bestMoment.toLowerCase()}. It is most practical to allow about ${duration.toLowerCase()} and use it as lunch or dinner within the itinerary.`;\r\n  } else if(item.type === 'alojamiento'){\r\n    practical = `It works well as a base for organizing the trip comfortably. It helps you set your resting point and distribute the day\u2019s plans better.`;\r\n  } else if(item.type === 'evento'){\r\n    practical = `It fits especially well in ${bestMoment.toLowerCase()} and can add a livelier touch to the itinerary if it matches your dates.`;\r\n  } else if(item.type === 'ocio'){\r\n    practical = `It works very well to round off the day or extend the afternoon. It is a useful option if you are looking for atmosphere without complicated or long journeys.`;\r\n  }\r\n\r\n  if(interestTags.includes('familia')) practical += ' It usually works well for family trips.';\r\n  if(interestTags.includes('afternoon_social')) practical += ' It is a good fit if you are looking for atmosphere or after-lunch drinks.';\r\n  if(interestTags.includes('patrimonio')) practical += ' It adds cultural value to the trip.';\r\n  if(interestTags.includes('naturaleza')) practical += ' It adds scenery and contact with the natural surroundings.';\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:'Day ' + (i+1),\r\n      slots:{morning:[], midday:[], afternoon:[], night:[]}\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:'Day ' + idx,\r\n    slots:{morning:[], midday:[], afternoon:[], night:[]}\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  $('statDays').textContent = state.days.length;\r\n  $('statStops').textContent = totalStops;\r\n  $('statHours').textContent = totalHours.toFixed(1).replace('.0','') + ' h';\r\n  $('statBudget').textContent = euro(Object.values(totals).reduce((a,b)=>a+b,0)).replace(',00','');\r\n  const statDays = $('statDays');\r\n  const statStops = $('statStops');\r\n  const statHours = $('statHours');\r\n  const statBudget = $('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  $('bAct').textContent = euro(totals.actividad||0).replace(',00','');\r\n  $('bFood').textContent = euro(totals.restaurante||0).replace(',00','');\r\n  $('bStay').textContent = euro(totals.alojamiento||0).replace(',00','');\r\n  $('bOther').textContent = euro(other).replace(',00','');\r\n  $('bTotal').textContent = euro(Object.values(totals).reduce((a,b)=>a+b,0)).replace(',00','');\r\n\r\n  const prefsSummary = $('prefsSummary');\r\n  if (prefsSummary) {\r\n    prefsSummary.textContent =\r\n      `Dynamic recommendation active. Based on your travel profile, the catalogue highlights proposals compatible with ${tripWho.options[tripWho.selectedIndex].text.toLowerCase()}, your way of getting around and the chosen pace. Examples: ${getTopRecommendations().join(', ')}.`;\r\n  }\r\n}\r\n\r\nfunction renderDays(){\r\n  if(!state.days.length){\r\n    daysContainer.innerHTML = '<div class=\"empty\">Click <strong>Apply days<\/strong> to start building the trip.<\/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} plan(s)<\/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','') : 'Free'}<\/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\">In your trip<\/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}\">View on map<\/span>` : ''}\r\n                  ${item.lat && item.lng ? `<a class=\"plan-link\" href=\"${getGoogleMapsDirectionsUrl(item)}\" target=\"_blank\" rel=\"noopener noreferrer\">Get directions<\/a>` : ''}\r\n                  ${getOfficialLink(item) ? `<a class=\"plan-link\" href=\"${getOfficialLink(item)}\">View official info<\/a>` : ''}\r\n                  <button class=\"tiny-btn\" onclick=\"removeItem(${dayIndex}, '${slot}', '${item.uid}')\">Remove<\/button>\r\n                <\/div>\r\n              <\/div>\r\n            `).join('') : '<div class=\"slot-empty\">No items yet.<\/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 = $('filterType').value;\r\n  const z = $('filterZone').value;\r\n  const s = $('filterSlot').value;\r\n  const m = $('filterMove').value;\r\n  const i = $('filterInterest').value;\r\n  const d = $('filterDuration').value;\r\n  const rawSearch = $('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, 'en', { 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} options`;\r\n\r\n  if(!items.length){\r\n    catalogGrid.innerHTML = '<div class=\"empty\">There are no results for those filters. Try clearing the search or broadening the area and time slot.<\/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\">In your trip<\/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          ? 'Estimated average price: ' + euro(item.cost).replace(',00','')\r\n          : (Number(item.cost)||0 ? 'Estimated cost: ' + euro(item.cost).replace(',00','') : 'No estimated cost')}\r\n      <\/div>\r\n\r\n      ${item.pref.reasons.length ? `<div class=\"help\">Priority: ${item.pref.reasons.slice(0,2).join(' \u00b7 ')}<\/div>` : ''}\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\">Get directions<\/a>` : ''}\r\n        ${item.officialLink ? `<a class=\"catalog-link\" href=\"${item.officialLink}\">View official information<\/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  root.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') || 'morning';\r\n      const day = Number(root.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(`Profile: ${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('Total budget: ' + $('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 || 'Itinerary in Tavernes';\r\n  const totalBudget = $('bTotal').textContent;\r\n\r\n  let html = `\r\n    \\x3Chtml>\r\n    \\x3Chead>\r\n      \\x3Ctitle>${safeTitle}\\x3C\/title>\r\n      \\x3Cstyle>\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\/* === Updated layout === *\/\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\/* === Full-screen layout 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\/* === Final layout adjustment === *\/\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\/* === Requested fine-tuning === *\/\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\/* === Top banner-only adjustment === *\/\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\/* === Clean top section === *\/\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\/* === Budget in two side blocks === *\/\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\\x3C\/style>\r\n    \\x3C\/head>\r\n    \\x3Cbody>\r\n      <h1>${safeTitle}<\/h1>\r\n      <div class=\"meta\">\r\n        <div><strong>Profile:<\/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\">Total budget: ${totalBudget}<\/div>`;\r\n  html += `\\x3C\/body>\\x3C\/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() || 'Trip to 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\nlet map = null;\r\nlet mapMarkers = {};\r\nlet mapLayerGroup = null;\r\n\r\nif (window.L && $('travelMap')) {\r\n  map = L.map($('travelMap'), { zoomControl:true }).setView([39.073, -0.241], 12);\r\n\r\n  L.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\n  mapLayerGroup = L.layerGroup().addTo(map);\r\n} else if ($('travelMap')) {\r\n  $('travelMap').innerHTML = '<div class=\"empty\">The interactive map will load on the public page.<\/div>';\r\n}\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>In your trip:<\/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\">Get directions<\/a><\/div>`\r\n    : '';\r\n\r\n  const officialBlock = official\r\n    ? `<div style=\"margin-top:6px;\"><a href=\"${official}\">View official information<\/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  if(!map || !mapLayerGroup || !window.L){\r\n    const plannedIds = getPlannedItemIds();\r\n    const visibleCount = (items || []).filter(item => Number.isFinite(item.lat) && Number.isFinite(item.lng)).length;\r\n    if(mapVisibleCount) mapVisibleCount.textContent = `${visibleCount} visible locations`;\r\n    if(mapPlannedCount) mapPlannedCount.textContent = `${plannedIds.size} added to the trip`;\r\n    if(mapList) mapList.innerHTML = '<div class=\"empty\">The interactive map will load on the public page.<\/div>';\r\n    return;\r\n  }\r\n\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} visible locations`;\r\n  mapPlannedCount.textContent = `${plannedGeolocated.length} added to the trip`;\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>In your trip:<\/strong> ${occ.join(' \u00b7 ')}<\/div>` : ''}\r\n            <div class=\"controls-inline\">\r\n              <span class=\"map-focus-link\" data-map-focus=\"${item.id}\">Center on map<\/span>\r\n              <a class=\"map-focus-link\" href=\"${getGoogleMapsDirectionsUrl(item)}\" target=\"_blank\" rel=\"noopener noreferrer\">Get directions<\/a>\r\n            <\/div>\r\n          <\/div>\r\n        `;\r\n      }).join('')\r\n    : `<div class=\"empty\">There are no visible locations on the map with the current settings.<\/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  root.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 = $('appViewport');\r\n  const wrap = $('appScaleWrap');\r\n  const scaleBox = $('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\n$('btnGenerate').addEventListener('click', () => createDays(Number(numDays.value||1)));\r\n$('btnAddDay').addEventListener('click', addDay);\r\n$('btnClear').addEventListener('click', () => createDays(Number(numDays.value||1)));\r\n$('btnCopy').addEventListener('click', copySummary);\r\n$('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  $(id).addEventListener('input', renderCatalog);\r\n  $(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})();\r\n<\/script>\r\n\r\n<style>\r\n\/* Full-width view and compact internal header *\/\r\n#vt-travel-planner .top-banner{min-height:86px;padding:14px 18px;}\r\n#vt-travel-planner .top-banner .brand-logo{width:36px;}\r\n#vt-travel-planner .top-banner .brand-main{font-size:21px;}\r\n#vt-travel-planner .top-banner .brand-subline{font-size:13px;}\r\n#vt-travel-planner .top-actions{align-content:start;}\r\n@media (max-width: 900px){\r\n  #vt-travel-planner{width:100%;max-width:100%;margin-left:0;margin-right:0;}\r\n  #vt-travel-planner .vt-planner-seo-intro{padding:18px 14px;}\r\n  #vt-travel-planner .app-shell{padding:10px;}\r\n}\r\n<\/style>\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>Travel planner for Tavernes de la Valldigna Travel planner for Tavernes de la Valldigna: organize your visit with a tool designed to combine beach, nature, town, heritage, gastronomy, events, accommodation and plans at your own pace. Things to do in Tavernes Beaches Nature and routes Tavernes for families Copy summary Clear plan Download PDF VISIT [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-17841","page","type-page","status-publish","hentry"],"acf":[],"rttpg_featured_image_url":null,"rttpg_author":{"display_name":"root","author_link":"https:\/\/www.visitatavernes.es\/en\/author\/root\/"},"rttpg_comment":0,"rttpg_category":" <a href=\"https:\/\/www.visitatavernes.es\/?taxonomy=translation_priority&#038;term=opcional\" rel=\"tag\">Opcional<\/a><a href=\"https:\/\/www.visitatavernes.es\/en\/?taxonomy=translation_priority&#038;term=optional-en\" rel=\"tag\">Optional<\/a>","rttpg_excerpt":"Travel planner for Tavernes de la Valldigna Travel planner for Tavernes de la Valldigna: organize your visit with a tool designed to combine beach, nature, town, heritage, gastronomy, events, accommodation and plans at your own pace. Things to do in Tavernes Beaches Nature and routes Tavernes for families Copy summary Clear plan Download PDF VISIT&hellip;","_links":{"self":[{"href":"https:\/\/www.visitatavernes.es\/en\/wp-json\/wp\/v2\/pages\/17841","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.visitatavernes.es\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.visitatavernes.es\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.visitatavernes.es\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.visitatavernes.es\/en\/wp-json\/wp\/v2\/comments?post=17841"}],"version-history":[{"count":68,"href":"https:\/\/www.visitatavernes.es\/en\/wp-json\/wp\/v2\/pages\/17841\/revisions"}],"predecessor-version":[{"id":25645,"href":"https:\/\/www.visitatavernes.es\/en\/wp-json\/wp\/v2\/pages\/17841\/revisions\/25645"}],"wp:attachment":[{"href":"https:\/\/www.visitatavernes.es\/en\/wp-json\/wp\/v2\/media?parent=17841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}