{"id":187892,"date":"2025-11-21T10:27:58","date_gmt":"2025-11-21T09:27:58","guid":{"rendered":"https:\/\/tourtravelandmore.com\/?p=187892"},"modified":"2025-12-25T22:33:12","modified_gmt":"2025-12-25T21:33:12","slug":"que-hacer-en-oporto-con-adolescentes","status":"publish","type":"post","link":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/","title":{"rendered":"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico"},"content":{"rendered":"\n<p>Llegamos a Oporto con dos teens con m\u00e1s bater\u00eda que mi m\u00f3vil y una misi\u00f3n clara: cero bostezos. Empezamos por la Ribeira al atardecer, ese momento en el que el Duero se vuelve dorado y hasta el m\u00e1s reacio suelta el m\u00f3vil para hacer una foto. \u201cVale, esto mola\u201d, dijeron. Yo respir\u00e9: primera victoria. Esa noche entend\u00ed el truco de Oporto con adolescentes: combinar retos, vistas que impresionen y planes que se sienten como un juego. <\/p>\n\n\n\n<p>Aqu\u00ed va la ruta que nos funcion\u00f3, con decisiones claras para que elijas sin perder tiempo.<\/p>\n\n\n\n<section class=\"lxm-root\" data-ar=\"16:9\" data-init=\"d1\">\n  <script type=\"application\/json\" class=\"lxm-config\">\n  {\n    \"tile\": {\n      \"url\": \"https:\/\/{s}.basemaps.cartocdn.com\/rastertiles\/voyager\/{z}\/{x}\/{y}{r}.png\",\n      \"attribution\": \"&copy; OpenStreetMap contributors &copy; CARTO\",\n      \"maxZoom\": 20\n    },\n    \"brand\": \"tourtravelandmore.com\",\n    \"days\": [\n      {\n        \"key\": \"d1\",\n        \"label\": \"D\u00eda 1 \u2014 Ribeira y miradores\",\n        \"color\": \"#e67e22\",\n        \"stops\": [\n          {\"title\":\"Ribeira do Porto\",\"desc\":\"Paseo junto al Duero y ambiente animado.\",\"latlng\":[41.1407,-8.6110]},\n          {\"title\":\"Torre de los Cl\u00e9rigos\",\"desc\":\"200 escalones y vistas 360\u00ba.\",\"latlng\":[41.1456,-8.6147]},\n          {\"title\":\"Puente Dom Lu\u00eds I (nivel superior)\",\"desc\":\"Cruce ic\u00f3nico con v\u00e9rtigo divertido.\",\"latlng\":[41.1400,-8.6090]},\n          {\"title\":\"Telef\u00e9rico de Gaia\",\"desc\":\"Vistas sin esfuerzo sobre el r\u00edo.\",\"latlng\":[41.1339,-8.6112]},\n          {\"title\":\"Jardim do Morro\",\"desc\":\"Atardecer, c\u00e9sped y m\u00fasica.\",\"latlng\":[41.1343,-8.6106]}\n        ]\n      },\n      {\n        \"key\": \"d2\",\n        \"label\": \"D\u00eda 2 \u2014 Cultura inmersiva y f\u00fatbol\",\n        \"color\": \"#2980b9\",\n        \"stops\": [\n          {\"title\":\"World of Discoveries\",\"desc\":\"Historia jugable en barca.\",\"latlng\":[41.1419,-8.6251]},\n          {\"title\":\"Mercado do Bolh\u00e3o\",\"desc\":\"Picoteo variado para todos.\",\"latlng\":[41.1496,-8.6077]},\n          {\"title\":\"Est\u00e1dio do Drag\u00e3o\",\"desc\":\"Museo y estadio del FC Porto.\",\"latlng\":[41.1618,-8.5836]},\n          {\"title\":\"Crucero de los Seis Puentes\",\"desc\":\"Descanso con panor\u00e1micas.\",\"latlng\":[41.1402,-8.6112]},\n          {\"title\":\"Cais de Gaia\",\"desc\":\"Paseo nocturno con vistas iluminadas.\",\"latlng\":[41.1334,-8.6110]}\n        ]\n      },\n      {\n        \"key\": \"d3\",\n        \"label\": \"D\u00eda extra \u2014 Frikiplan y street art\",\n        \"color\": \"#8e44ad\",\n        \"stops\": [\n          {\"title\":\"Librer\u00eda Lello\",\"desc\":\"Escalera m\u00edtica y ambiente m\u00e1gico.\",\"latlng\":[41.1467,-8.6149]},\n          {\"title\":\"Capela das Almas\",\"desc\":\"Azulejos azules fotog\u00e9nicos.\",\"latlng\":[41.1505,-8.6067]},\n          {\"title\":\"Rua das Flores\",\"desc\":\"Murales y tiendas animadas.\",\"latlng\":[41.1436,-8.6118]},\n          {\"title\":\"Mundo Fantasma (CC Bras\u00edlia)\",\"desc\":\"C\u00f3mics y fantas\u00eda.\",\"latlng\":[41.1529,-8.6093]},\n          {\"title\":\"Any Play Porto\",\"desc\":\"Anime, snacks y merchandising.\",\"latlng\":[41.1460,-8.6089]}\n        ]\n      }\n    ]\n  }\n  <\/script>\n\n  <div class=\"lxm-toolbar\" role=\"group\" aria-label=\"Mapa de itinerario\">\n    <div class=\"lxm-row\">\n      <label class=\"lxm-label\">Seleccionar:<\/label>\n      <select class=\"lxm-select\" aria-label=\"Seleccionar d\u00eda\"><\/select>\n      <button class=\"lxm-btn lxm-download\" type=\"button\">Descargar mapa<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"lxm-stopsline\" aria-label=\"Paradas del itinerario\"><\/div>\n\n  <div class=\"lxm-aspect\">\n    <div class=\"lxm-map\" aria-label=\"Mapa\"><\/div>\n  <\/div>\n<\/section>\n\n<style>\n  .lxm-root{font:14px\/1.45 system-ui,-apple-system,Segoe UI,Roboto,Arial;color:#111827}\n  .lxm-toolbar{padding:10px 0 8px;position:sticky;top:0;background:var(--wp--preset--color--base,#fff);z-index:5;box-shadow:0 1px 0 rgba(0,0,0,.06)}\n  .lxm-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}\n  .lxm-label{font-weight:600;color:#0f172a}\n  .lxm-select{border:1px solid #e5e7eb;border-radius:10px;padding:6px 10px;background:#fff;color:#111827;font:13px\/1.3 system-ui}\n  .lxm-btn{border:1px solid #e5e7eb;border-radius:10px;padding:6px 10px;background:#fff;cursor:pointer;font:13px\/1.3 system-ui}\n  .lxm-btn:hover{background:#f8fafc}\n\n  .lxm-stopsline{margin:10px 0 10px;display:flex;flex-wrap:wrap;gap:8px;align-items:center;line-height:1.2}\n  .lxm-stopchip{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;border-radius:999px;border:1px solid rgba(0,0,0,.08);background:#fff;cursor:pointer;user-select:none;box-shadow:0 1px 6px rgba(0,0,0,.04);font-size:13px;max-width:100%}\n  .lxm-stopchip:hover{background:#f8fafc}\n  .lxm-stopchip__n{width:18px;height:18px;border-radius:999px;display:grid;place-items:center;color:#fff;font-weight:700;font-size:11px;background:var(--c,#111827);flex:0 0 auto}\n  .lxm-stopchip__t{font-weight:600;color:#0f172a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:46ch}\n\n  .lxm-aspect{position:relative;width:100%;--pt:56.25%}\n  .lxm-aspect::before{content:\"\";display:block;padding-top:var(--pt)}\n  .lxm-map{position:absolute;inset:0;width:100%;height:100%;border-radius:16px;box-shadow:0 8px 22px rgba(0,0,0,.12)}\n\n  .leaflet-container a{color:#2563eb}\n<\/style>\n\n<script>\n(function(){\n  function loadOnce(tag, attrs){\n    const key = attrs.href || attrs.src;\n    if(key && document.querySelector('[data-lxm=\"'+key+'\"]')) return;\n    const el = document.createElement(tag);\n    Object.entries(attrs).forEach(([k,v])=> el.setAttribute(k,v));\n    if(key) el.setAttribute('data-lxm', key);\n    (tag === 'link' ? document.head : document.body).appendChild(el);\n    return el;\n  }\n\n  function ensureLeaflet(cb){\n    if(window.L && window.L.map){ cb(); return; }\n    loadOnce('link',{rel:'stylesheet',href:'https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css'});\n    const js=loadOnce('script',{src:'https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js'});\n    js.onload=cb;\n  }\n\n  function ensureLeafletImage(cb){\n    if(window.leafletImage){ cb(); return; }\n    const js=loadOnce('script',{src:'https:\/\/unpkg.com\/leaflet-image@latest\/leaflet-image.js'});\n    js.onload=cb;\n  }\n\n  const $=(s,r=document)=>r.querySelector(s);\n  const $$=(s,r=document)=>[...r.querySelectorAll(s)];\n\n  function setAspect(root){\n    const ar=(root.getAttribute('data-ar')||'16:9').split(':').map(Number);\n    const w=ar[0]||16,h=ar[1]||9;\n    const pct=(h\/w)*100;\n    const box=$('.lxm-aspect',root);\n    box&&box.style.setProperty('--pt',pct.toFixed(5)+'%');\n  }\n\n  function svgMarkerIcon(n, color){\n    const safeN = String(n);\n    const c = color || '#2563eb';\n    const svg =\n`<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"34\" height=\"34\" viewBox=\"0 0 34 34\">\n  <defs>\n    <filter id=\"s\" x=\"-30%\" y=\"-30%\" width=\"160%\" height=\"160%\">\n      <feDropShadow dx=\"0\" dy=\"2\" stdDeviation=\"2\" flood-opacity=\"0.35\"\/>\n    <\/filter>\n  <\/defs>\n  <circle cx=\"17\" cy=\"17\" r=\"13\" fill=\"${c}\" stroke=\"white\" stroke-width=\"3\" filter=\"url(#s)\"\/>\n  <text x=\"17\" y=\"21\" text-anchor=\"middle\" font-family=\"system-ui, -apple-system, Segoe UI, Roboto, Arial\"\n        font-size=\"13\" font-weight=\"800\" fill=\"white\">${safeN}<\/text>\n<\/svg>`;\n    return L.icon({\n      iconUrl: \"data:image\/svg+xml;charset=UTF-8,\" + encodeURIComponent(svg),\n      iconSize: [34,34],\n      iconAnchor: [17,17],\n      popupAnchor: [0,-14]\n    });\n  }\n\n  function safeFit(map,layer){\n    try{\n      const b=layer.getBounds();\n      if(b && b.isValid && b.isValid()){ map.fitBounds(b,{padding:[40,40]}); return; }\n    }catch(e){}\n    const first=layer.getLayers && layer.getLayers()[0];\n    if(first && first.getLatLng) map.setView(first.getLatLng(),14);\n  }\n\n  function renderStopsLine(root, day, onPick){\n    const line=$('.lxm-stopsline',root);\n    const c = day?.color || '#111827';\n    const stops = day?.stops || [];\n    line.innerHTML = stops.map((s,i)=>{\n      const t=(s.title||'').trim().replace(\/\"\/g,'&quot;');\n      return `<button type=\"button\" class=\"lxm-stopchip\" data-idx=\"${i}\" title=\"${t}\">\n        <span class=\"lxm-stopchip__n\" style=\"--c:${c}\">${i+1}<\/span>\n        <span class=\"lxm-stopchip__t\">${t}<\/span>\n      <\/button>`;\n    }).join('');\n    line.querySelectorAll('[data-idx]').forEach(btn=>{\n      btn.addEventListener('click', ()=> onPick(parseInt(btn.getAttribute('data-idx'),10)));\n    });\n  }\n\n  function sanitizeFileName(s){\n    return String(s||'mapa').toLowerCase()\n      .replace(\/[^\\w\\s-]\/g,'')\n      .trim()\n      .replace(\/\\s+\/g,'-')\n      .slice(0,60) || 'mapa';\n  }\n\n  function titleOnly(label){\n    const t=String(label||'').trim();\n    if(!t) return 'Mapa';\n    if(t.includes('\u2014')) return t.split('\u2014').slice(-1)[0].trim();\n    if(t.includes('-')) return t.split('-').slice(-1)[0].trim();\n    return t;\n  }\n\n  function buildStopsText(stops){\n    const parts = (stops||[]).map((s,i)=>`${i+1}. ${(s.title||'').trim()}`).filter(Boolean);\n    return parts.join(' \u00b7 ');\n  }\n\n  function ellipsizeToWidth(ctx, text, maxW){\n    if(ctx.measureText(text).width <= maxW) return text;\n    const ell = '\u2026';\n    let lo = 0, hi = text.length;\n    while(lo < hi){\n      const mid = Math.floor((lo+hi)\/2);\n      const t = text.slice(0, mid).trimEnd() + ell;\n      if(ctx.measureText(t).width <= maxW) lo = mid + 1; else hi = mid;\n    }\n    return text.slice(0, Math.max(0, lo-1)).trimEnd() + ell;\n  }\n\n  function init(root){\n    setAspect(root);\n\n    let cfg;\n    try{ cfg = JSON.parse($('.lxm-config',root).textContent); }catch(e){ return; }\n\n    const map = L.map($('.lxm-map',root),{zoomControl:true});\n\n    L.tileLayer(cfg.tile.url,{\n      maxZoom: cfg.tile.maxZoom ?? 20,\n      attribution: cfg.tile.attribution || '',\n      crossOrigin: true\n    }).addTo(map);\n\n    L.tileLayer('https:\/\/{s}.basemaps.cartocdn.com\/light_only_labels\/{z}\/{x}\/{y}{r}.png',{\n      maxZoom: 20,\n      attribution: '',\n      crossOrigin: true\n    }).addTo(map);\n\n    const select=$('.lxm-select',root);\n    select.innerHTML=(cfg.days||[]).map(d=>`<option value=\"${d.key}\">${d.label}<\/option>`).join('');\n\n    const groups={}, stopRefs={};\n    (cfg.days||[]).forEach(day=>{\n      const g=L.featureGroup();\n      stopRefs[day.key]=[];\n      (day.stops||[]).forEach((s,i)=>{\n        if(!s.latlng || s.latlng.length!==2) return;\n        const html = `<strong>${s.title||''}<\/strong>${s.desc ? `<br>${s.desc}` : ''}`;\n        const m = L.marker(s.latlng,{ icon: svgMarkerIcon(i+1, day.color) }).bindPopup(html).addTo(g);\n        stopRefs[day.key].push(m);\n      });\n      groups[day.key]=g;\n    });\n\n    let currentKey = root.getAttribute('data-init') || (cfg.days?.[0]?.key) || 'd1';\n\n    function show(k){\n      currentKey = k;\n      Object.values(groups).forEach(g=>map.removeLayer(g));\n      const g=groups[k];\n      if(!g) return;\n      g.addTo(map);\n      safeFit(map,g);\n      select.value=k;\n\n      const day=(cfg.days||[]).find(d=>d.key===k);\n      renderStopsLine(root, day, (idx)=>{\n        const m = stopRefs[k]?.[idx];\n        if(!m) return;\n        const ll = m.getLatLng();\n        map.setView(ll, Math.max(map.getZoom(), 15), { animate:true });\n        m.openPopup();\n      });\n    }\n\n    select.addEventListener('change',()=>show(select.value));\n    show(currentKey);\n\n    const dlBtn = $('.lxm-download',root);\n    dlBtn.addEventListener('click',()=>{\n      ensureLeafletImage(()=>{\n        const day=(cfg.days||[]).find(d=>d.key===currentKey);\n        const title = (day?.label || 'Mapa').trim();\n        const brand = cfg.brand || 'tourtravelandmore.com';\n        const stopsTextRaw = buildStopsText(day?.stops || []);\n\n        leafletImage(map, function(err, canvas){\n          if(err || !canvas){ alert('No se pudo generar la imagen del mapa.'); return; }\n\n          const footerH = 68;\n          const out = document.createElement('canvas');\n          out.width = canvas.width;\n          out.height = canvas.height + footerH;\n\n          const ctx = out.getContext('2d');\n          ctx.fillStyle = '#ffffff';\n          ctx.fillRect(0,0,out.width,out.height);\n          ctx.drawImage(canvas,0,0);\n\n          ctx.fillStyle = 'rgba(255,255,255,.92)';\n          ctx.fillRect(0, out.height-footerH, out.width, footerH);\n\n          ctx.strokeStyle = 'rgba(0,0,0,.08)';\n          ctx.beginPath();\n          ctx.moveTo(0,out.height-footerH+0.5);\n          ctx.lineTo(out.width,out.height-footerH+0.5);\n          ctx.stroke();\n\n          const pad = 16;\n          ctx.fillStyle = '#0f172a';\n          ctx.font = '700 16px system-ui, -apple-system, Segoe UI, Roboto, Arial';\n          ctx.fillText(title, pad, out.height-footerH+24);\n\n          ctx.fillStyle = '#334155';\n          ctx.font = '600 13px system-ui, -apple-system, Segoe UI, Roboto, Arial';\n          const brandW = ctx.measureText(brand).width;\n          ctx.fillText(brand, out.width - brandW - pad, out.height-footerH+24);\n\n          ctx.fillStyle = '#0f172a';\n          ctx.font = '500 12px system-ui, -apple-system, Segoe UI, Roboto, Arial';\n          const maxStopsW = out.width - pad*2 - brandW - 14;\n          const stopsText = ellipsizeToWidth(ctx, stopsTextRaw, Math.max(80, maxStopsW));\n          ctx.fillText(stopsText, pad, out.height-footerH+48);\n\n          const a = document.createElement('a');\n          a.href = out.toDataURL('image\/png');\n          a.download = `${sanitizeFileName(title)}.png`;\n          document.body.appendChild(a);\n          a.click();\n          a.remove();\n        });\n      });\n    });\n\n    window.addEventListener('resize',()=>setTimeout(()=>map.invalidateSize(),120));\n    new IntersectionObserver(entries=>{\n      entries.forEach(e=>{ if(e.isIntersecting) setTimeout(()=>map.invalidateSize(),80); });\n    }).observe(root);\n  }\n\n  ensureLeaflet(()=>$$('.lxm-root').forEach(init));\n})();\n<\/script>\n\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-subidon-de-vistas-sin-bostezos\">Subid\u00f3n de vistas sin bostezos<\/h2>\n\n\n\n<p>La ciudad se disfruta desde arriba, pero el \u201cc\u00f3mo\u201d marca la diferencia seg\u00fan el \u00e1nimo de tu tropa. A nosotros nos salv\u00f3 alternar esfuerzo y premio.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-torre-de-los-clerigos-200-escalones-con-recompensa\">Torre de los Cl\u00e9rigos: 200 escalones con recompensa<\/h3>\n\n\n\n<p>Confieso que sub\u00ed los 200 escalones dosificando aire y chistes malos. Ellos lo convirtieron en un \u201cspeedrun\u201d y, arriba, el 360\u00ba de tejados y deltas del Duero dej\u00f3 silencio\u2026 y fotos. Si vas, mejor a primera hora o al final de la tarde; entre medias hay m\u00e1s gente y el sol pega sin piedad.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-puente-dom-luis-i-por-arriba-vertigo-divertido-y-foto-iconica\">Puente Dom Lu\u00eds I por arriba: v\u00e9rtigo divertido y foto ic\u00f3nica<\/h3>\n\n\n\n<p>Cruzarlo a 45 metros sobre el r\u00edo fue nuestro \u201cminijuego\u201d favorito. A m\u00ed me dio un poquito de v\u00e9rtigo (motivo de risas, obvio), pero el combo tranv\u00eda + r\u00edo + barcos es la postal que quer\u00edan. Truco: id cuando el sol baja y el viento es m\u00e1s amable.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-teleferico-de-gaia-o-jardin-do-morro-elige-tu-estilo\">Telef\u00e9rico de Gaia o Jard\u00edn do Morro: elige tu estilo<\/h3>\n\n\n\n<p>Cuando nos dio pereza volver a subir, tomamos el telef\u00e9rico desde Gaia: asiento, vistas y Stories resueltas. Otro d\u00eda subimos caminando al Jardim do Morro y nos tiramos en el c\u00e9sped con m\u00fasica callejera. Dos atm\u00f3sferas, mismo horizonte.<\/p>\n\n\n\n<p><strong>Mini-comparativa de vistas<\/strong><\/p>\n\n\n\n<!-- Tabla comparativa: responsive 100% sin scroll horizontal -->\n<div id=\"tabla-comparativa-v2\" style=\"--c:#d3af37;\">\n  <style>\n    \/* ======= Namespacing y reset local ======= *\/\n    #tabla-comparativa-v2{margin:1rem auto;max-width:100%;isolation:isolate}\n    #tabla-comparativa-v2 table{all:unset;display:table;border-collapse:separate;border-spacing:0;width:100%}\n    #tabla-comparativa-v2 thead,#tabla-comparativa-v2 tbody,#tabla-comparativa-v2 tr,\n    #tabla-comparativa-v2 th,#tabla-comparativa-v2 td{all:unset}\n    #tabla-comparativa-v2 thead{display:table-header-group}\n    #tabla-comparativa-v2 tbody{display:table-row-group}\n    #tabla-comparativa-v2 tr{display:table-row}\n    #tabla-comparativa-v2 th,#tabla-comparativa-v2 td{display:table-cell}\n\n    \/* ======= Estilos base ======= *\/\n    #tabla-comparativa-v2 table{\n      width:100%;\n      table-layout:fixed;\n      font-size:.95rem;line-height:1.6;\n      background:color-mix(in srgb, var(--c) 3%, #fff);\n      border:1px solid color-mix(in srgb, var(--c) 22%, #e2e8f0);\n      border-radius:14px;overflow:hidden\n    }\n    #tabla-comparativa-v2 colgroup col:first-child{width:24%}\n    #tabla-comparativa-v2 colgroup col:nth-child(2){width:38%}\n    #tabla-comparativa-v2 colgroup col:nth-child(3){width:38%}\n\n    #tabla-comparativa-v2 thead th{\n      position:sticky;top:0;text-align:left;text-transform:uppercase;letter-spacing:.03em;\n      font-weight:700;font-size:.85rem;color:#1f2937;padding:1rem 1.1rem;\n      background:color-mix(in srgb, var(--c) 16%, #fff);\n      border-bottom:1px solid color-mix(in srgb, var(--c) 28%, #fff);z-index:1\n    }\n    #tabla-comparativa-v2 tbody tr{\n      transition:transform .18s ease, background-color .18s ease, box-shadow .18s ease\n    }\n    #tabla-comparativa-v2 tbody tr:nth-child(odd){\n      background:color-mix(in srgb, var(--c) 3%, #fff)\n    }\n    #tabla-comparativa-v2 tbody tr:nth-child(even){\n      background:color-mix(in srgb, var(--c) 6%, #fff)\n    }\n    #tabla-comparativa-v2 tbody tr:hover{\n      background:color-mix(in srgb, var(--c) 12%, #fff);transform:translateY(-1px);\n      box-shadow:0 2px 10px rgba(0,0,0,.08)\n    }\n    #tabla-comparativa-v2 td{\n      padding:1rem 1.1rem;vertical-align:top;color:#374151;\n      border-bottom:1px solid color-mix(in srgb, var(--c) 10%, #f1f5f9);\n      overflow-wrap:anywhere;word-break:normal;hyphens:auto\n    }\n    #tabla-comparativa-v2 td:first-child{color:#0f172a;font-weight:600}\n\n    \/* ======= Ajustes m\u00f3viles ======= *\/\n    @media (max-width: 640px){\n      #tabla-comparativa-v2 table{font-size:.9rem}\n      #tabla-comparativa-v2 td{padding:.85rem .9rem}\n      #tabla-comparativa-v2 thead th{font-size:.8rem}\n    }\n    @media (prefers-reduced-motion: reduce){\n      #tabla-comparativa-v2 tbody tr{transition:none}\n    }\n  <\/style>\n\n  <div role=\"region\" aria-label=\"Tabla comparativa\">\n    <table role=\"table\" aria-label=\"Opciones de miradores en Oporto\">\n      <colgroup>\n        <col><col><col>\n      <\/colgroup>\n      <thead role=\"rowgroup\">\n        <tr role=\"row\">\n          <th scope=\"col\" role=\"columnheader\">Opci\u00f3n<\/th>\n          <th scope=\"col\" role=\"columnheader\">Para qui\u00e9n<\/th>\n          <th scope=\"col\" role=\"columnheader\">Mejor momento<\/th>\n        <\/tr>\n      <\/thead>\n      <tbody role=\"rowgroup\">\n        <tr role=\"row\">\n          <td role=\"cell\">Telef\u00e9rico de Gaia<\/td>\n          <td role=\"cell\">\u201cQuiero vistas sin sudar\u201d<\/td>\n          <td role=\"cell\">Tarde con cielo despejado<\/td>\n        <\/tr>\n        <tr role=\"row\">\n          <td role=\"cell\">Jardim do Morro<\/td>\n          <td role=\"cell\">Presupuesto ajustado + picnic<\/td>\n          <td role=\"cell\">Atardecer, m\u00fasica y ambiente<\/td>\n        <\/tr>\n        <tr role=\"row\">\n          <td role=\"cell\">Torre de los Cl\u00e9rigos<\/td>\n          <td role=\"cell\">Teens con energ\u00eda y reto<\/td>\n          <td role=\"cell\">Primera hora o golden hour<\/td>\n        <\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cultura-que-engancha-de-verdad-sin-cara-larga\">Cultura que engancha de verdad (sin cara larga)<\/h2>\n\n\n\n<p>La clave no es \u201cm\u00e1s museos\u201d, es <strong>c\u00f3mo<\/strong> se viven.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-world-of-discoveries-historia-que-se-juega\">World of Discoveries: historia que se juega<\/h3>\n\n\n\n<p>Aqu\u00ed no miras vitrinas: te subes a una barca y recorres rutas de exploradores con efectos, olores y escenarios. A mis chicos les record\u00f3 a una misi\u00f3n de juego: mapas, decisiones, barcos y un globo 4D que te sit\u00faa en \u00e9poca. Yo agradec\u00ed el fresquito y el ritmo. Compra entradas online y entra en la primera franja posible.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-street-art-y-azulejos-que-si-apetece-fotografiar\">Street art y azulejos que s\u00ed apetece fotografiar<\/h3>\n\n\n\n<p>Les propuse una \u201cb\u00fasqueda del tesoro\u201d por murales. Empezamos por la Capela das Almas (parece un mural gigante de azulejos azules) y seguimos por Rua das Flores y otras paredes firmadas por artistas como Vhils. Premio por cada hallazgo: elegir helado. Instant\u00e1neamente motivados.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-fc-porto-museum-amp-estadio-do-dragao-incluso-para-no-futboleros\">FC Porto Museum &amp; Est\u00e1dio do Drag\u00e3o: incluso para no futboleros<\/h3>\n\n\n\n<p>Nos sorprendi\u00f3 el montaje audiovisual: trofeos, t\u00fanel, c\u00e9sped y pantallas que cuentan historias sin discursos eternos. Si ten\u00e9is fans del bal\u00f3n, esto os gana el d\u00eda; si no, sigue siendo un espacio potente y moderno.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-el-rincon-friki-que-siempre-funciona-comics-anime-gaming\">El rinc\u00f3n friki que siempre funciona (c\u00f3mics, anime, gaming)<\/h2>\n\n\n\n<p>No subestimes el poder de un buen \u201cloot\u201d. Entre miradores metimos este combo y el \u00e1nimo subi\u00f3.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Librer\u00eda Lello:<\/strong> s\u00ed, hay colas; s\u00ed, es hipn\u00f3tica. Comprad <strong>entrada online<\/strong> y entrad a primera hora. La famosa escalera es una foto obligada, y el ambiente \u201cHarry Potter\u201d tiene magia incluso para quien no ley\u00f3 los libros.<\/li>\n\n\n\n<li><strong>Mundo Fantasma (CC Bras\u00edlia):<\/strong> cueva del tesoro de c\u00f3mics y fantas\u00eda; mucho material en ingl\u00e9s.<\/li>\n\n\n\n<li><strong>Tim Tim por Tim Tim:<\/strong> nostalgia de c\u00f3mic europeo y figuritas.<\/li>\n\n\n\n<li><strong>Any Play:<\/strong> merchandising de anime y snacks japoneses; \u201c\u00bfpodemos probar este ramen?\u201d fue la frase del d\u00eda.<\/li>\n\n\n\n<li><strong>TeeLegend:<\/strong> camisetas geek para llevar un recuerdo que s\u00ed usar\u00e1n.<\/li>\n<\/ul>\n\n\n\n<p>Yo dej\u00e9 que cada uno eligiera un \u201csouvenir friki\u201d a cambio de un rato sin m\u00f3vil en la siguiente visita. Trato aceptado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-comer-como-campeones-mision-francesinha\">Comer como campeones: misi\u00f3n francesinha<\/h2>\n\n\n\n<p>La <strong>francesinha<\/strong> es el jefe final de Oporto: pan, carnes, queso y salsa. Nosotros la atacamos al <strong>mediod\u00eda<\/strong> (si la tomas de noche, luego solo querr\u00e1s cama).<\/p>\n\n\n\n<p><strong>D\u00f3nde nos funcion\u00f3 mejor<\/strong><\/p>\n\n\n\n<!-- Tabla comparativa: responsive 100% sin scroll horizontal -->\n<div id=\"tabla-comparativa-v2\" style=\"--c:#d3af37;\">\n  <style>\n    \/* ======= Namespacing y reset local ======= *\/\n    #tabla-comparativa-v2{margin:1rem auto;max-width:100%;isolation:isolate}\n    #tabla-comparativa-v2 table{all:unset;display:table;border-collapse:separate;border-spacing:0;width:100%}\n    #tabla-comparativa-v2 thead,#tabla-comparativa-v2 tbody,#tabla-comparativa-v2 tr,\n    #tabla-comparativa-v2 th,#tabla-comparativa-v2 td{all:unset}\n    #tabla-comparativa-v2 thead{display:table-header-group}\n    #tabla-comparativa-v2 tbody{display:table-row-group}\n    #tabla-comparativa-v2 tr{display:table-row}\n    #tabla-comparativa-v2 th,#tabla-comparativa-v2 td{display:table-cell}\n\n    \/* ======= Estilos base ======= *\/\n    #tabla-comparativa-v2 table{\n      width:100%;\n      table-layout:fixed;\n      font-size:.95rem;line-height:1.6;\n      background:color-mix(in srgb, var(--c) 3%, #fff);\n      border:1px solid color-mix(in srgb, var(--c) 22%, #e2e8f0);\n      border-radius:14px;overflow:hidden\n    }\n    #tabla-comparativa-v2 colgroup col:first-child{width:24%}\n    #tabla-comparativa-v2 colgroup col:nth-child(2){width:38%}\n    #tabla-comparativa-v2 colgroup col:nth-child(3){width:38%}\n\n    #tabla-comparativa-v2 thead th{\n      position:sticky;top:0;text-align:left;text-transform:uppercase;letter-spacing:.03em;\n      font-weight:700;font-size:.85rem;color:#1f2937;padding:1rem 1.1rem;\n      background:color-mix(in srgb, var(--c) 16%, #fff);\n      border-bottom:1px solid color-mix(in srgb, var(--c) 28%, #fff);z-index:1\n    }\n    #tabla-comparativa-v2 tbody tr{\n      transition:transform .18s ease, background-color .18s ease, box-shadow .18s ease\n    }\n    #tabla-comparativa-v2 tbody tr:nth-child(odd){\n      background:color-mix(in srgb, var(--c) 3%, #fff)\n    }\n    #tabla-comparativa-v2 tbody tr:nth-child(even){\n      background:color-mix(in srgb, var(--c) 6%, #fff)\n    }\n    #tabla-comparativa-v2 tbody tr:hover{\n      background:color-mix(in srgb, var(--c) 12%, #fff);transform:translateY(-1px);\n      box-shadow:0 2px 10px rgba(0,0,0,.08)\n    }\n    #tabla-comparativa-v2 td{\n      padding:1rem 1.1rem;vertical-align:top;color:#374151;\n      border-bottom:1px solid color-mix(in srgb, var(--c) 10%, #f1f5f9);\n      overflow-wrap:anywhere;word-break:normal;hyphens:auto\n    }\n    #tabla-comparativa-v2 td:first-child{color:#0f172a;font-weight:600}\n\n    \/* ======= Ajustes m\u00f3viles ======= *\/\n    @media (max-width: 640px){\n      #tabla-comparativa-v2 table{font-size:.9rem}\n      #tabla-comparativa-v2 td{padding:.85rem .9rem}\n      #tabla-comparativa-v2 thead th{font-size:.8rem}\n    }\n    @media (prefers-reduced-motion: reduce){\n      #tabla-comparativa-v2 tbody tr{transition:none}\n    }\n  <\/style>\n\n  <div role=\"region\" aria-label=\"Tabla comparativa\">\n    <table role=\"table\" aria-label=\"D\u00f3nde comer francesinha en Oporto\">\n      <colgroup>\n        <col><col><col>\n      <\/colgroup>\n      <thead role=\"rowgroup\">\n        <tr role=\"row\">\n          <th scope=\"col\" role=\"columnheader\">Sitio<\/th>\n          <th scope=\"col\" role=\"columnheader\">Lo mejor<\/th>\n          <th scope=\"col\" role=\"columnheader\">Para tener en cuenta<\/th>\n        <\/tr>\n      <\/thead>\n      <tbody role=\"rowgroup\">\n        <tr role=\"row\">\n          <td role=\"cell\">Caf\u00e9 Santiago<\/td>\n          <td role=\"cell\">Cl\u00e1sico, r\u00e1pida rotaci\u00f3n<\/td>\n          <td role=\"cell\">Cola: ve pronto<\/td>\n        <\/tr>\n        <tr role=\"row\">\n          <td role=\"cell\">Bras\u00e3o Cervejaria<\/td>\n          <td role=\"cell\">Opci\u00f3n <strong>vegetariana<\/strong> y ambiente<\/td>\n          <td role=\"cell\">Pide mesa con antelaci\u00f3n<\/td>\n        <\/tr>\n        <tr role=\"row\">\n          <td role=\"cell\">Francesinha Caf\u00e9<\/td>\n          <td role=\"cell\">Especialistas \u201ca tope\u201d<\/td>\n          <td role=\"cell\">Carta centrada en francesinha<\/td>\n        <\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n<\/div>\n\n\n\n<p>Extra teen-friendly: <strong>Mercado do Bolh\u00e3o<\/strong> para picoteo variado y <strong>past\u00e9is de nata<\/strong> de postre. En nuestra mesa, la regla fue bebida con gas (cola o cerveza) y luego paseo largo. Mano de santo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-modo-aventura-fuera-de-la-ciudad-cuando-necesitan-quemar-energia\">Modo aventura fuera de la ciudad: cuando necesitan quemar energ\u00eda<\/h2>\n\n\n\n<p>Si te piden \u201calgo fuerte\u201d, el <strong>Pena Aventura Parque<\/strong> os da el d\u00eda: tirolina <strong>Fantasticable<\/strong>, <strong>Alpine Coaster<\/strong> (monta\u00f1a rusa entre \u00e1rboles), <strong>Salto Negativo<\/strong> y circuitos de arborismo. Nosotros lo usamos como \u201cgran final\u201d del viaje. Consejo: madrugar y llevar ropa c\u00f3moda; reserva previa si vais en fin de semana.<\/p>\n\n\n\n<!-- Secci\u00f3n embebible: Leaflet + mapa interactivo de Oporto (teen-friendly)\n\nC\u00f3mo usar:\n1) Copia este bloque completo dentro de tu p\u00e1gina (por ejemplo, tras el CTA y antes del cierre).\n2) Requiere conexi\u00f3n a internet para cargar Leaflet y Nominatim (geocodificaci\u00f3n).\n3) Puedes editar\/a\u00f1adir lugares en el array POIS. Se geocodifican autom\u00e1ticamente y se cachean en localStorage.\n4) Opcional: ajusta colores por categor\u00eda en CATEGORY_STYLES.\n-->\n\n<link\n  rel=\"stylesheet\"\n  href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\"\n  integrity=\"sha256-p4NxAoJBhIIN+hmNHrzRCf9tD\/miZyoHS5obTRR9BMY=\"\n  crossorigin=\"\"\n\/>\n<script\n  src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"\n  integrity=\"sha256-20nQCchB9co0qIjJZRGuk2\/Z9VM+kNiyxNV1lvTlZBo=\"\n  crossorigin=\"\"\n><\/script>\n\n<section id=\"mapa-oporto-teens\" style=\"margin:2rem 0;\">\n  <div style=\"display:flex; gap:1rem; align-items:flex-start; flex-wrap:wrap;\">\n    <div style=\"flex:1 1 260px; min-width:260px;\">\n      <h2 style=\"margin:0 0 .5rem 0; font-size:1.25rem;\">Mapa con los planes que m\u00e1s funcionan con adolescentes<\/h2>\n      <p style=\"margin:.25rem 0 .75rem 0; color:#444;\">\n        Activa o desactiva categor\u00edas para ver solo lo que te interesa. Consejito: combina <em>vistas + cultura jugable + comida potente<\/em> y tendr\u00e1s cero bostezos.\n      <\/p>\n\n      <!-- Filtros por categor\u00eda -->\n      <div id=\"filters\" style=\"display:grid; grid-template-columns:repeat(2, minmax(0, 1fr)); gap:.5rem; max-width:420px;\">\n        <!-- Se generan din\u00e1micamente -->\n      <\/div>\n      <small style=\"display:block; margin-top:.5rem; color:#666;\">Arrastra el mapa, haz zoom y toca cada punto para ver detalles y abrir la navegaci\u00f3n.<\/small>\n    <\/div>\n\n    <div id=\"map-porto\" style=\"flex:3 1 540px; min-height:520px; min-width:320px; border-radius:14px; overflow:hidden; box-shadow:0 6px 20px rgba(0,0,0,.08);\"><\/div>\n  <\/div>\n<\/section>\n\n<script>\n  \/\/ ---- Configuraci\u00f3n base ----\n  const MAP_CENTER = [41.147, -8.614]; \/\/ Centro aproximado de Oporto\n  const CATEGORY_STYLES = {\n    \"Vistas\": { color: \"#2563eb\" },      \/\/ azul\n    \"Cultura\": { color: \"#16a34a\" },     \/\/ verde\n    \"Geek\": { color: \"#9333ea\" },        \/\/ morado\n    \"Comida\": { color: \"#f97316\" },      \/\/ naranja\n    \"F\u00fatbol\": { color: \"#0ea5e9\" },      \/\/ celeste\n    \"Excursi\u00f3n\": { color: \"#ef4444\" }    \/\/ rojo\n  };\n\n  \/\/ ---- Lugares recomendados (direcciones geocodificadas al vuelo) ----\n  \/\/ Puedes a\u00f1adir o quitar elementos. Si prefieres coordenadas exactas, sustituye \"address\" por {lat, lng}.\n  const POIS = [\n    \/\/ Vistas\n    { name: \"Torre de los Cl\u00e9rigos (200 escalones)\", category: \"Vistas\", address: \"Torre dos Cl\u00e9rigos, Porto, Portugal\", tips: \"Mejor a primera hora o golden hour.\" },\n    { name: \"Puente Dom Lu\u00eds I (pasarela superior)\", category: \"Vistas\", address: \"Ponte Lu\u00eds I, Porto, Portugal\", tips: \"Cruzad al atardecer para la foto ic\u00f3nica.\" },\n    { name: \"Telef\u00e9rico de Gaia\", category: \"Vistas\", address: \"Telef\u00e9rico de Gaia, Vila Nova de Gaia, Portugal\", tips: \"Opci\u00f3n c\u00f3moda para vistas sin sudar.\" },\n    { name: \"Jardim do Morro (picnic con vistas)\", category: \"Vistas\", address: \"Jardim do Morro, Vila Nova de Gaia, Portugal\", tips: \"M\u00fasica callejera al atardecer.\" },\n\n    \/\/ Cultura jugable \/ foto spots\n    { name: \"World of Discoveries (barco interactivo)\", category: \"Cultura\", address: \"World of Discoveries, Porto, Portugal\", tips: \"Entrada online para primera franja.\" },\n    { name: \"Capela das Almas (azulejos azules)\", category: \"Cultura\", address: \"Capela das Almas, Porto, Portugal\", tips: \"Foto f\u00e1cil y sin colas largas.\" },\n    { name: \"Crucero de los 6 Puentes (embarcadero Ribeira)\", category: \"Cultura\", address: \"Cais da Ribeira, Porto, Portugal\", tips: \"~50 min de descanso con panor\u00e1micas.\" },\n\n    \/\/ Geek \/ friki\n    { name: \"Livraria Lello (Hogwarts vibes)\", category: \"Geek\", address: \"Livraria Lello, Porto, Portugal\", tips: \"Compra entrada online y ve temprano.\" },\n    { name: \"Mundo Fantasma (CC Bras\u00edlia)\", category: \"Geek\", address: \"Centro Comercial Bras\u00edlia, Porto, Portugal\", tips: \"C\u00f3mics y fantas\u00eda a montones.\" },\n    { name: \"Tim Tim por Tim Tim (librer\u00eda de c\u00f3mic)\", category: \"Geek\", address: \"Tim Tim por Tim Tim, Porto, Portugal\", tips: \"Joyas retro y figuritas.\" },\n    { name: \"Any Play (merch anime y snacks)\", category: \"Geek\", address: \"Any Play Porto, Portugal\", tips: \"Ramen y dulces japoneses.\" },\n    { name: \"TeeLegend (camisetas geek)\", category: \"Geek\", address: \"TeeLegend Porto, Portugal\", tips: \"Recuerdo que s\u00ed usar\u00e1n.\" },\n\n    \/\/ Comida\n    { name: \"Caf\u00e9 Santiago (francesinha cl\u00e1sica)\", category: \"Comida\", address: \"Caf\u00e9 Santiago, Rua de Passos Manuel 198, Porto\", tips: \"Ve pronto: suele haber cola.\" },\n    { name: \"Bras\u00e3o Cervejaria (opci\u00f3n vegetariana)\", category: \"Comida\", address: \"Bras\u00e3o Cervejaria Aliados, Porto, Portugal\", tips: \"Reserva si vas en hora punta.\" },\n    { name: \"Francesinha Caf\u00e9 (especialistas)\", category: \"Comida\", address: \"Francesinha Caf\u00e9, Rua da Alegria 946, Porto\", tips: \"Carta centrada en la francesinha.\" },\n    { name: \"Mercado do Bolh\u00e3o (variedad r\u00e1pida)\", category: \"Comida\", address: \"Mercado do Bolh\u00e3o, Porto, Portugal\", tips: \"Perfecto para grupos con gustos distintos.\" },\n\n    \/\/ F\u00fatbol\n    { name: \"Est\u00e1dio do Drag\u00e3o\", category: \"F\u00fatbol\", address: \"Est\u00e1dio do Drag\u00e3o, Porto, Portugal\", tips: \"Tour + museo con montaje audiovisual.\" },\n    { name: \"FC Porto Museum\", category: \"F\u00fatbol\", address: \"Museu do Futebol Clube do Porto, Porto, Portugal\", tips: \"En el complejo del estadio.\" },\n\n    \/\/ Excursi\u00f3n de adrenalina\n    { name: \"Pena Aventura Parque (tirolina, coaster)\", category: \"Excursi\u00f3n\", address: \"Pena Aventura Park, Ribeira de Pena, Portugal\", tips: \"Reserva previa y ropa c\u00f3moda.\" }\n  ];\n\n  \/\/ ---- Inicializa el mapa ----\n  const map = L.map('map-porto', { scrollWheelZoom: true }).setView(MAP_CENTER, 13);\n  L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\n    maxZoom: 19,\n    attribution: '&copy; <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap<\/a> contributors'\n  }).addTo(map);\n\n  \/\/ ---- Capa por categor\u00edas ----\n  const layersByCategory = {};\n  Object.keys(CATEGORY_STYLES).forEach(cat => {\n    layersByCategory[cat] = L.layerGroup().addTo(map);\n  });\n\n  \/\/ ---- Utilidades ----\n  const sleep = (ms) => new Promise(r => setTimeout(r, ms));\n  const cacheKey = (addr) => `geo:${addr.toLowerCase()}`;\n\n  async function geocodeAddress(addr) {\n    const key = cacheKey(addr);\n    const cached = localStorage.getItem(key);\n    if (cached) {\n      try { return JSON.parse(cached); } catch {}\n    }\n    \/\/ Respetar pol\u00edticas de uso ligero de Nominatim\n    const url = new URL('https:\/\/nominatim.openstreetmap.org\/search');\n    url.searchParams.set('q', addr);\n    url.searchParams.set('format', 'json');\n    url.searchParams.set('limit', '1');\n    url.searchParams.set('addressdetails', '0');\n\n    const resp = await fetch(url.toString(), { headers: { 'Accept-Language': 'es' } });\n    if (!resp.ok) throw new Error('Fallo geocodificando: ' + addr);\n    const data = await resp.json();\n    if (!data || !data[0]) throw new Error('Sin resultados para: ' + addr);\n    const { lat, lon } = data[0];\n    const coords = { lat: parseFloat(lat), lng: parseFloat(lon) };\n    localStorage.setItem(key, JSON.stringify(coords));\n    \/\/ Corto retardo para ser amables con la API cuando hay muchos puntos\n    await sleep(200);\n    return coords;\n  }\n\n  function markerForCategory(cat, coords, poi) {\n    const color = CATEGORY_STYLES[cat]?.color || '#111827';\n    const marker = L.circleMarker([coords.lat, coords.lng], {\n      radius: 8,\n      color,\n      weight: 2,\n      fillColor: color,\n      fillOpacity: 0.85\n    });\n    const gmaps = `https:\/\/www.google.com\/maps?q=${encodeURIComponent(poi.name + ' ' + poi.address)}`;\n    marker.bindPopup(`\n      <strong>${poi.name}<\/strong><br\/>\n      <small style=\"color:#374151;\">${poi.address}<\/small><br\/>\n      <em style=\"color:#6b7280;\">${poi.tips || ''}<\/em><br\/>\n      <a href=\"${gmaps}\" target=\"_blank\" rel=\"noopener\" style=\"color:${color}; text-decoration:underline;\">C\u00f3mo llegar<\/a>\n    `);\n    return marker;\n  }\n\n  async function initMarkers() {\n    const bounds = L.latLngBounds([]);\n    for (const poi of POIS) {\n      try {\n        let coords = poi.coords;\n        if (!coords && poi.address) coords = await geocodeAddress(poi.address);\n        if (!coords) continue;\n        const marker = markerForCategory(poi.category, coords, poi);\n        layersByCategory[poi.category].addLayer(marker);\n        bounds.extend([coords.lat, coords.lng]);\n      } catch (e) { console.warn(e.message); }\n    }\n    if (bounds.isValid()) map.fitBounds(bounds.pad(0.1));\n  }\n\n  \/\/ ---- Controles de filtro ----\n  function buildFilters() {\n    const container = document.getElementById('filters');\n    Object.keys(CATEGORY_STYLES).forEach(cat => {\n      const id = `flt-${cat.toLowerCase()}`.replace(\/\\s+\/g,'-');\n      const wrap = document.createElement('label');\n      wrap.style.display = 'flex';\n      wrap.style.alignItems = 'center';\n      wrap.style.gap = '.5rem';\n      wrap.style.cursor = 'pointer';\n\n      const chk = document.createElement('input');\n      chk.type = 'checkbox';\n      chk.id = id;\n      chk.checked = true;\n      chk.addEventListener('change', () => {\n        if (chk.checked) {\n          layersByCategory[cat].addTo(map);\n        } else {\n          map.removeLayer(layersByCategory[cat]);\n        }\n      });\n\n      const swatch = document.createElement('span');\n      swatch.style.display = 'inline-block';\n      swatch.style.width = '12px';\n      swatch.style.height = '12px';\n      swatch.style.borderRadius = '9999px';\n      swatch.style.background = CATEGORY_STYLES[cat].color;\n\n      const text = document.createElement('span');\n      text.textContent = cat;\n      text.style.userSelect = 'none';\n\n      wrap.appendChild(chk);\n      wrap.appendChild(swatch);\n      wrap.appendChild(text);\n      container.appendChild(wrap);\n    });\n  }\n\n  buildFilters();\n  initMarkers();\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-itinerario-de-2-3-dias-para-ritmos-adolescentes\">Itinerario de 2\u20133 d\u00edas para ritmos adolescentes<\/h2>\n\n\n\n<p>Este esquema equilibra adrenalina, cultura jugable y comida potente. Ajusta seg\u00fan si tu equipo es madrugador o de arrancar tarde.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-dia-1-ribeira-retos-y-foto-de-portada\">D\u00eda 1 \u2014 Ribeira, retos y foto de portada<\/h3>\n\n\n\n<p>Ma\u00f1ana: paseo por la Ribeira, subida a <strong>Torre de los Cl\u00e9rigos<\/strong> (o Jardim do Morro si prefer\u00eds empezar suave).<br>Mediod\u00eda: <strong>francesinha<\/strong> (Caf\u00e9 Santiago o Bras\u00e3o).<br>Tarde: <strong>Puente Dom Lu\u00eds I<\/strong> por arriba + <strong>telef\u00e9rico<\/strong> de vuelta a Gaia.<br>Atardecer: m\u00fasica y c\u00e9sped en <strong>Jardim do Morro<\/strong>.<br>Noche: callejeo tranquilo por Baixa.<\/p>\n\n\n\n<p><em>(En mi caso, aqu\u00ed cayeron las mejores fotos y cero quejas.)<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-dia-2-cultura-inmersiva-futbol-y-barco\">D\u00eda 2 \u2014 Cultura inmersiva, f\u00fatbol y barco<\/h3>\n\n\n\n<p>Ma\u00f1ana: <strong>World of Discoveries<\/strong> (entrada online).<br>Mediod\u00eda: <strong>Bolh\u00e3o<\/strong> para elegir al gusto.<br>Tarde: <strong>FC Porto Museum &amp; Drag\u00e3o<\/strong>; despu\u00e9s, <strong>crucero de los seis puentes<\/strong> (unos 50 min) para descansar piernas y sacar panor\u00e1micas.<br>Noche: paseo por Cais de Gaia con vistas iluminadas del puente.<\/p>\n\n\n\n<p><em>(A nosotros nos sirvi\u00f3 como \u201cd\u00eda mixto\u201d: tecnolog\u00eda, estadio y un rato zen en barco.)<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-dia-extra-frikiplan-street-art-o-aventura-total\">D\u00eda extra \u2014 Frikiplan + street art o aventura total<\/h3>\n\n\n\n<p>Opci\u00f3n A (ciudad): <strong>Lello<\/strong> a primera hora + ruta <strong>geek<\/strong> (Mundo Fantasma, Tim Tim por Tim Tim, Any Play, TeeLegend) + caza de murales con helado de premio.<br>Opci\u00f3n B (full adrenalina): <strong>Pena Aventura Parque<\/strong> todo el d\u00eda.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-consejos-que-me-ahorraron-peleas-y-colas\">Consejos que me ahorraron peleas y colas<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Reservas online siempre<\/strong>: Lello, World of Discoveries y, si puedes, mesa en Bras\u00e3o.<\/li>\n\n\n\n<li><strong>Mejores franjas<\/strong>: primeras horas para subir, \u00faltima luz para fotos.<\/li>\n\n\n\n<li><strong>Alternativas r\u00e1pidas<\/strong>: si el telef\u00e9rico est\u00e1 lleno, subid andando al Jardim do Morro; si Cl\u00e9rigos tiene cola, cambiad el orden y volved al final.<\/li>\n\n\n\n<li><strong>Ritmo teen<\/strong>: cada 90\u2013120 minutos, cambio de plan o mini-recompensa (foto, snack, tienda friki).<\/li>\n\n\n\n<li><strong>Transporte<\/strong>: si se cansan, <strong>tuk-tuk<\/strong> o <strong>segway<\/strong> para ver m\u00e1s con sonrisa.<\/li>\n\n\n\n<li><strong>Clima<\/strong>: plan B si llueve = World of Discoveries + shopping friki + caf\u00e9 con nata.<\/li>\n<\/ul>\n\n\n\n<p><strong>Qu\u00e9 elegir cuando dudas<\/strong><\/p>\n\n\n\n<!-- Tabla comparativa: responsive 100% sin scroll horizontal -->\n<div id=\"tabla-comparativa-v2\" style=\"--c:#d3af37;\">\n  <style>\n    \/* ======= Namespacing y reset local ======= *\/\n    #tabla-comparativa-v2{margin:1rem auto;max-width:100%;isolation:isolate}\n    #tabla-comparativa-v2 table{all:unset;display:table;border-collapse:separate;border-spacing:0;width:100%}\n    #tabla-comparativa-v2 thead,#tabla-comparativa-v2 tbody,#tabla-comparativa-v2 tr,\n    #tabla-comparativa-v2 th,#tabla-comparativa-v2 td{all:unset}\n    #tabla-comparativa-v2 thead{display:table-header-group}\n    #tabla-comparativa-v2 tbody{display:table-row-group}\n    #tabla-comparativa-v2 tr{display:table-row}\n    #tabla-comparativa-v2 th,#tabla-comparativa-v2 td{display:table-cell}\n\n    \/* ======= Estilos base ======= *\/\n    #tabla-comparativa-v2 table{\n      width:100%;\n      table-layout:fixed;\n      font-size:.95rem;line-height:1.6;\n      background:color-mix(in srgb, var(--c) 3%, #fff);\n      border:1px solid color-mix(in srgb, var(--c) 22%, #e2e8f0);\n      border-radius:14px;overflow:hidden\n    }\n    #tabla-comparativa-v2 colgroup col:first-child{width:24%}\n    #tabla-comparativa-v2 colgroup col:nth-child(2){width:38%}\n    #tabla-comparativa-v2 colgroup col:nth-child(3){width:38%}\n\n    #tabla-comparativa-v2 thead th{\n      position:sticky;top:0;text-align:left;text-transform:uppercase;letter-spacing:.03em;\n      font-weight:700;font-size:.85rem;color:#1f2937;padding:1rem 1.1rem;\n      background:color-mix(in srgb, var(--c) 16%, #fff);\n      border-bottom:1px solid color-mix(in srgb, var(--c) 28%, #fff);z-index:1\n    }\n    #tabla-comparativa-v2 tbody tr{\n      transition:transform .18s ease, background-color .18s ease, box-shadow .18s ease\n    }\n    #tabla-comparativa-v2 tbody tr:nth-child(odd){\n      background:color-mix(in srgb, var(--c) 3%, #fff)\n    }\n    #tabla-comparativa-v2 tbody tr:nth-child(even){\n      background:color-mix(in srgb, var(--c) 6%, #fff)\n    }\n    #tabla-comparativa-v2 tbody tr:hover{\n      background:color-mix(in srgb, var(--c) 12%, #fff);transform:translateY(-1px);\n      box-shadow:0 2px 10px rgba(0,0,0,.08)\n    }\n    #tabla-comparativa-v2 td{\n      padding:1rem 1.1rem;vertical-align:top;color:#374151;\n      border-bottom:1px solid color-mix(in srgb, var(--c) 10%, #f1f5f9);\n      overflow-wrap:anywhere;word-break:normal;hyphens:auto\n    }\n    #tabla-comparativa-v2 td:first-child{color:#0f172a;font-weight:600}\n\n    \/* ======= Ajustes m\u00f3viles ======= *\/\n    @media (max-width: 640px){\n      #tabla-comparativa-v2 table{font-size:.9rem}\n      #tabla-comparativa-v2 td{padding:.85rem .9rem}\n      #tabla-comparativa-v2 thead th{font-size:.8rem}\n    }\n    @media (prefers-reduced-motion: reduce){\n      #tabla-comparativa-v2 tbody tr{transition:none}\n    }\n  <\/style>\n\n  <div role=\"region\" aria-label=\"Tabla comparativa\">\n    <table role=\"table\" aria-label=\"Resolver dudas t\u00edpicas en Oporto\">\n      <colgroup>\n        <col><col><col>\n      <\/colgroup>\n      <thead role=\"rowgroup\">\n        <tr role=\"row\">\n          <th scope=\"col\" role=\"columnheader\">Duda com\u00fan<\/th>\n          <th scope=\"col\" role=\"columnheader\">Yo elegir\u00eda si\u2026<\/th>\n          <th scope=\"col\" role=\"columnheader\">Por qu\u00e9<\/th>\n        <\/tr>\n      <\/thead>\n      <tbody role=\"rowgroup\">\n        <tr role=\"row\">\n          <td role=\"cell\">Telef\u00e9rico vs. Jardim<\/td>\n          <td role=\"cell\">Hay cansancio o ganas de \u201cwow\u201d inmediato<\/td>\n          <td role=\"cell\">Telef\u00e9rico sella la foto sin esfuerzo<\/td>\n        <\/tr>\n        <tr role=\"row\">\n          <td role=\"cell\">Cl\u00e9rigos vs. otro mirador<\/td>\n          <td role=\"cell\">Quieren reto y 360\u00b0 real<\/td>\n          <td role=\"cell\">Los 200 escalones les pican el orgullo<\/td>\n        <\/tr>\n        <tr role=\"row\">\n          <td role=\"cell\">Crucero s\u00ed\/no<\/td>\n          <td role=\"cell\">Necesitan pausa pero no aburrirse<\/td>\n          <td role=\"cell\">50 min, vistas y bater\u00eda social media recargada<\/td>\n        <\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Tu Oporto a medida (con modo adolescente activado)<\/h2>\n\n\n\n<p>Si prefieres que lo organicemos todo para que tus adolescentes solo tengan que disfrutar, tambi\u00e9n podemos acompa\u00f1aros: dise\u00f1amos <strong>tours privados a medida para familias con teens<\/strong> con retos de miradores (sin colas), <strong>rutas de street art gamificadas<\/strong>, paradas <strong>foodie<\/strong> donde la francesinha no falla (con opci\u00f3n veg), visitas <strong>geek<\/strong> curadas (Lello + tiendas frikis sin perder tiempo) y coordinaci\u00f3n de un <strong>d\u00eda de aventura<\/strong> si os anim\u00e1is. Todo en vuestro idioma, con ritmo flexible y planes que realmente enganchan. <strong>Reserva tu ruta familiar teen-friendly aqu\u00ed:<\/strong> <a href=\"https:\/\/tourtravelandmore.com\/\">https:\/\/tourtravelandmore.com\/<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-la-foto-del-puente-que-nos-llevamos-a-casa\">La foto del puente que nos llevamos a casa<\/h2>\n\n\n\n<p>La \u00faltima tarde volvimos al puente por pura inercia. Ya no hab\u00eda prisa: ellos se tumbaron en el c\u00e9sped del Jardim do Morro, yo mir\u00e9 el r\u00edo pensando en cu\u00e1nto nos hab\u00eda dado esta ciudad sin exigir postureo. Oporto funciona con adolescentes porque se vive como una partida: retos cortos, recompensas claras y sorpresas a cada esquina. Si sigues este plan, apuesto a que, al volver a casa, escuchar\u00e1s la frase m\u00e1gica: \u201c\u00bfCu\u00e1ndo repetimos?\u201d<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Llegamos a Oporto con dos teens con m\u00e1s bater\u00eda que mi m\u00f3vil y una misi\u00f3n clara: cero bostezos. Empezamos por la Ribeira al atardecer, ese momento en el que el Duero se vuelve dorado y hasta el m\u00e1s reacio suelta el m\u00f3vil para hacer una foto. \u201cVale, esto mola\u201d, dijeron. Yo respir\u00e9: primera victoria. Esa [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":187893,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[4324,2361],"tags":[],"class_list":["post-187892","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oporto","category-portugal-es"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.3.1 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico &#8212; Tour Travel And More<\/title>\n<meta name=\"description\" content=\"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico &#8212; Portugal Tour Travel And More Gu\u00eda teen-friendly de Oporto: planes \u00e9picos, ruta geek, World of Discoveries, francesinha y miradores. Itinerario 2\u20133 d\u00edas + mapa interactivo\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico\" \/>\n<meta property=\"og:description\" content=\"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico &#8212; Portugal Tour Travel And More Gu\u00eda teen-friendly de Oporto: planes \u00e9picos, ruta geek, World of Discoveries, francesinha y miradores. Itinerario 2\u20133 d\u00edas + mapa interactivo\" \/>\n<meta property=\"og:url\" content=\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/\" \/>\n<meta property=\"og:site_name\" content=\"Tour Travel And More\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/tourtravelandmore\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-21T09:27:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-25T21:33:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2025\/11\/Que-hacer-con-adolescentes-en-Oporto.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Maya Nader Harati\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@TourTravel_More\" \/>\n<meta name=\"twitter:site\" content=\"@TourTravel_More\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Maya Nader Harati\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/\"},\"author\":{\"name\":\"Maya Nader Harati\",\"@id\":\"https:\/\/tourtravelandmore.com\/es\/#\/schema\/person\/2a1c66d76ae9290a394e8efb4af12e1e\"},\"headline\":\"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico\",\"datePublished\":\"2025-11-21T09:27:58+00:00\",\"dateModified\":\"2025-12-25T21:33:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/\"},\"wordCount\":1533,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/tourtravelandmore.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2025\/11\/Que-hacer-con-adolescentes-en-Oporto.webp\",\"articleSection\":[\"Oporto\",\"Portugal\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/\",\"url\":\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/\",\"name\":\"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico &#8212; Tour Travel And More\",\"isPartOf\":{\"@id\":\"https:\/\/tourtravelandmore.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2025\/11\/Que-hacer-con-adolescentes-en-Oporto.webp\",\"datePublished\":\"2025-11-21T09:27:58+00:00\",\"dateModified\":\"2025-12-25T21:33:12+00:00\",\"description\":\"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico &#8212; Portugal Tour Travel And More Gu\u00eda teen-friendly de Oporto: planes \u00e9picos, ruta geek, World of Discoveries, francesinha y miradores. Itinerario 2\u20133 d\u00edas + mapa interactivo\",\"breadcrumb\":{\"@id\":\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#primaryimage\",\"url\":\"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2025\/11\/Que-hacer-con-adolescentes-en-Oporto.webp\",\"contentUrl\":\"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2025\/11\/Que-hacer-con-adolescentes-en-Oporto.webp\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/tourtravelandmore.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/tourtravelandmore.com\/es\/#website\",\"url\":\"https:\/\/tourtravelandmore.com\/es\/\",\"name\":\"Tour Travel And More\",\"description\":\"Private sightseeing tours and luxury transfers in Spain\",\"publisher\":{\"@id\":\"https:\/\/tourtravelandmore.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/tourtravelandmore.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/tourtravelandmore.com\/es\/#organization\",\"name\":\"Tour Travel And More\",\"url\":\"https:\/\/tourtravelandmore.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/tourtravelandmore.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2022\/12\/cropped-logo-cabecera-new.png\",\"contentUrl\":\"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2022\/12\/cropped-logo-cabecera-new.png\",\"width\":430,\"height\":61,\"caption\":\"Tour Travel And More\"},\"image\":{\"@id\":\"https:\/\/tourtravelandmore.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/tourtravelandmore\/\",\"https:\/\/x.com\/TourTravel_More\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/tourtravelandmore.com\/es\/#\/schema\/person\/2a1c66d76ae9290a394e8efb4af12e1e\",\"name\":\"Maya Nader Harati\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/tourtravelandmore.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/adc2305883b6f86a616354c0c4516fcd9a333d5f5a0806d9d1ae9b30f898fa1f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/adc2305883b6f86a616354c0c4516fcd9a333d5f5a0806d9d1ae9b30f898fa1f?s=96&d=mm&r=g\",\"caption\":\"Maya Nader Harati\"},\"description\":\"Cultural Destination Specialist & Travel Chronicler. Maya doesn\u2019t just travel the world; she translates it.\",\"sameAs\":[\"https:\/\/tourtravelandmore.com\/author-profile-maya-nader-harati\/\"]}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico &#8212; Tour Travel And More","description":"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico &#8212; Portugal Tour Travel And More Gu\u00eda teen-friendly de Oporto: planes \u00e9picos, ruta geek, World of Discoveries, francesinha y miradores. Itinerario 2\u20133 d\u00edas + mapa interactivo","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/","og_locale":"es_ES","og_type":"article","og_title":"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico","og_description":"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico &#8212; Portugal Tour Travel And More Gu\u00eda teen-friendly de Oporto: planes \u00e9picos, ruta geek, World of Discoveries, francesinha y miradores. Itinerario 2\u20133 d\u00edas + mapa interactivo","og_url":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/","og_site_name":"Tour Travel And More","article_publisher":"https:\/\/www.facebook.com\/tourtravelandmore\/","article_published_time":"2025-11-21T09:27:58+00:00","article_modified_time":"2025-12-25T21:33:12+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2025\/11\/Que-hacer-con-adolescentes-en-Oporto.webp","type":"image\/webp"}],"author":"Maya Nader Harati","twitter_card":"summary_large_image","twitter_creator":"@TourTravel_More","twitter_site":"@TourTravel_More","twitter_misc":{"Escrito por":"Maya Nader Harati","Tiempo de lectura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#article","isPartOf":{"@id":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/"},"author":{"name":"Maya Nader Harati","@id":"https:\/\/tourtravelandmore.com\/es\/#\/schema\/person\/2a1c66d76ae9290a394e8efb4af12e1e"},"headline":"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico","datePublished":"2025-11-21T09:27:58+00:00","dateModified":"2025-12-25T21:33:12+00:00","mainEntityOfPage":{"@id":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/"},"wordCount":1533,"commentCount":0,"publisher":{"@id":"https:\/\/tourtravelandmore.com\/es\/#organization"},"image":{"@id":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#primaryimage"},"thumbnailUrl":"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2025\/11\/Que-hacer-con-adolescentes-en-Oporto.webp","articleSection":["Oporto","Portugal"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/","url":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/","name":"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico &#8212; Tour Travel And More","isPartOf":{"@id":"https:\/\/tourtravelandmore.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#primaryimage"},"image":{"@id":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#primaryimage"},"thumbnailUrl":"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2025\/11\/Que-hacer-con-adolescentes-en-Oporto.webp","datePublished":"2025-11-21T09:27:58+00:00","dateModified":"2025-12-25T21:33:12+00:00","description":"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico &#8212; Portugal Tour Travel And More Gu\u00eda teen-friendly de Oporto: planes \u00e9picos, ruta geek, World of Discoveries, francesinha y miradores. Itinerario 2\u20133 d\u00edas + mapa interactivo","breadcrumb":{"@id":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#primaryimage","url":"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2025\/11\/Que-hacer-con-adolescentes-en-Oporto.webp","contentUrl":"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2025\/11\/Que-hacer-con-adolescentes-en-Oporto.webp","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/tourtravelandmore.com\/es\/que-hacer-en-oporto-con-adolescentes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/tourtravelandmore.com\/es\/"},{"@type":"ListItem","position":2,"name":"Qu\u00e9 hacer en Oporto con adolescentes: mi gu\u00eda honesta para un fin de semana \u00e9pico"}]},{"@type":"WebSite","@id":"https:\/\/tourtravelandmore.com\/es\/#website","url":"https:\/\/tourtravelandmore.com\/es\/","name":"Tour Travel And More","description":"Private sightseeing tours and luxury transfers in Spain","publisher":{"@id":"https:\/\/tourtravelandmore.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/tourtravelandmore.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/tourtravelandmore.com\/es\/#organization","name":"Tour Travel And More","url":"https:\/\/tourtravelandmore.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/tourtravelandmore.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2022\/12\/cropped-logo-cabecera-new.png","contentUrl":"https:\/\/tourtravelandmore.com\/wp-content\/uploads\/2022\/12\/cropped-logo-cabecera-new.png","width":430,"height":61,"caption":"Tour Travel And More"},"image":{"@id":"https:\/\/tourtravelandmore.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/tourtravelandmore\/","https:\/\/x.com\/TourTravel_More"]},{"@type":"Person","@id":"https:\/\/tourtravelandmore.com\/es\/#\/schema\/person\/2a1c66d76ae9290a394e8efb4af12e1e","name":"Maya Nader Harati","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/tourtravelandmore.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/adc2305883b6f86a616354c0c4516fcd9a333d5f5a0806d9d1ae9b30f898fa1f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/adc2305883b6f86a616354c0c4516fcd9a333d5f5a0806d9d1ae9b30f898fa1f?s=96&d=mm&r=g","caption":"Maya Nader Harati"},"description":"Cultural Destination Specialist & Travel Chronicler. Maya doesn\u2019t just travel the world; she translates it.","sameAs":["https:\/\/tourtravelandmore.com\/author-profile-maya-nader-harati\/"]}]}},"_links":{"self":[{"href":"https:\/\/tourtravelandmore.com\/es\/wp-json\/wp\/v2\/posts\/187892","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tourtravelandmore.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tourtravelandmore.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tourtravelandmore.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tourtravelandmore.com\/es\/wp-json\/wp\/v2\/comments?post=187892"}],"version-history":[{"count":3,"href":"https:\/\/tourtravelandmore.com\/es\/wp-json\/wp\/v2\/posts\/187892\/revisions"}],"predecessor-version":[{"id":188220,"href":"https:\/\/tourtravelandmore.com\/es\/wp-json\/wp\/v2\/posts\/187892\/revisions\/188220"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tourtravelandmore.com\/es\/wp-json\/wp\/v2\/media\/187893"}],"wp:attachment":[{"href":"https:\/\/tourtravelandmore.com\/es\/wp-json\/wp\/v2\/media?parent=187892"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tourtravelandmore.com\/es\/wp-json\/wp\/v2\/categories?post=187892"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tourtravelandmore.com\/es\/wp-json\/wp\/v2\/tags?post=187892"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}