{"id":104,"date":"2024-04-30T09:26:35","date_gmt":"2024-04-30T09:26:35","guid":{"rendered":"https:\/\/rostocktrelleborg.com\/de\/?page_id=104"},"modified":"2026-06-10T13:32:05","modified_gmt":"2026-06-10T13:32:05","slug":"fahrplan","status":"publish","type":"page","link":"https:\/\/rostocktrelleborg.com\/de\/fahrplan\/","title":{"rendered":"F\u00e4hre Rostock Trelleborg Fahrplan"},"content":{"rendered":"\n<style>\n.fd-route-page {\n  --fd-red: #d00c33;\n  --fd-dark: #1e293b;\n  --fd-muted: #64748b;\n  --fd-soft: #f8fafc;\n  --fd-border: #e5e7eb;\n}\n\n.fd-route-hero {\n  background: linear-gradient(135deg, #d00c33 0%, #9f0827 100%);\n  color: #fff;\n  padding: 34px;\n  border-radius: 18px;\n  margin-bottom: 28px;\n}\n\n.fd-route-hero p {\n  max-width: 820px;\n  margin: 0;\n  font-size: 18px;\n  line-height: 1.65;\n}\n\n.fd-route-stats {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: 16px;\n  margin: 24px 0 32px;\n}\n\n.fd-route-stat {\n  background: #fff;\n  border: 1px solid var(--fd-border);\n  border-radius: 16px;\n  padding: 22px;\n  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.06);\n}\n\n.fd-route-stat strong {\n  display: block;\n  color: var(--fd-red);\n  font-size: 18px;\n  margin-bottom: 6px;\n}\n\n.fd-route-stat span {\n  color: var(--fd-muted);\n  font-size: 14px;\n}\n\n.fd-content-block {\n  background: var(--fd-soft);\n  border: 1px solid var(--fd-border);\n  border-radius: 16px;\n  padding: 26px;\n  margin: 28px 0;\n}\n\n.fd-content-block h2,\n.fd-timetable-block h2,\n.fd-faq h2 {\n  margin-top: 0;\n  color: var(--fd-dark);\n}\n\n.fd-content-block a {\n  color: var(--fd-red);\n  font-weight: 700;\n}\n\n.fd-link-grid {\n  display: grid;\n  grid-template-columns: repeat(5, 1fr);\n  gap: 12px;\n  margin-top: 18px;\n}\n\n.fd-link-grid a {\n  background: #fff;\n  border: 1px solid var(--fd-border);\n  border-radius: 12px;\n  padding: 14px;\n  text-decoration: none;\n  color: var(--fd-dark);\n  font-weight: 700;\n}\n\n.fd-link-grid a:hover {\n  border-color: var(--fd-red);\n  color: var(--fd-red);\n}\n\n.fd-timetable-block {\n  background: #fff;\n  border: 1px solid var(--fd-border);\n  border-top: 5px solid var(--fd-red);\n  border-radius: 16px;\n  padding: 24px;\n  margin: 28px 0;\n  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.05);\n}\n\n.fd-operator-grid {\n  display: grid;\n  grid-template-columns: repeat(2, 1fr);\n  gap: 18px;\n  margin: 28px 0;\n}\n\n.fd-operator-card {\n  background: #fff;\n  border: 1px solid var(--fd-border);\n  border-radius: 16px;\n  padding: 24px;\n  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.05);\n}\n\n.fd-operator-card h2 {\n  margin-top: 0;\n  color: var(--fd-dark);\n}\n\n.fd-operator-card a {\n  color: var(--fd-red);\n  font-weight: 700;\n}\n\n.fd-faq {\n  margin: 32px 0;\n}\n\n.fd-faq-item {\n  background: #fff;\n  border: 1px solid var(--fd-border);\n  border-radius: 14px;\n  padding: 20px 22px;\n  margin-bottom: 14px;\n  box-shadow: 0 6px 18px rgba(15, 23, 42, 0.04);\n}\n\n.fd-faq-item h3 {\n  margin: 0 0 8px;\n  font-size: 18px;\n  color: var(--fd-dark);\n}\n\n.fd-faq-item p {\n  margin: 0;\n  color: var(--fd-muted);\n  line-height: 1.6;\n}\n\n.fd-faq-item a {\n  color: var(--fd-red);\n  font-weight: 700;\n}\n\n@media (max-width: 900px) {\n  .fd-route-stats,\n  .fd-link-grid {\n    grid-template-columns: repeat(2, 1fr);\n  }\n\n  .fd-operator-grid {\n    grid-template-columns: 1fr;\n  }\n}\n\n@media (max-width: 520px) {\n  .fd-route-stats,\n  .fd-link-grid {\n    grid-template-columns: 1fr;\n  }\n\n  .fd-route-hero {\n    padding: 26px;\n  }\n}\n<\/style>\n\n<div class=\"fd-route-page\">\n\n  <section class=\"fd-route-hero\">\n    <p>Die F\u00e4hre von Rostock nach Trelleborg verbindet Norddeutschland mit S\u00fcdschweden. Auf dieser Seite finden Sie den aktuellen Fahrplan f\u00fcr die F\u00e4hre Rostock Trelleborg, einschlie\u00dflich Abfahrten von Stena Line und TT Line in beide Richtungen.<\/p>\n  <\/section>\n\n  <div class=\"fd-route-stats\">\n    <div class=\"fd-route-stat\">\n      <strong>2 Reedereien<\/strong>\n      <span>TT Line und Stena Line<\/span>\n    <\/div>\n    <div class=\"fd-route-stat\">\n      <strong>6 Stunden<\/strong>\n      <span>typische \u00dcberfahrtszeit<\/span>\n    <\/div>\n    <div class=\"fd-route-stat\">\n      <strong>150 km<\/strong>\n      <span>ungef\u00e4hre Streckenl\u00e4nge<\/span>\n    <\/div>\n    <div class=\"fd-route-stat\">\n      <strong>6 bis 8 Abfahrten<\/strong>\n      <span>t\u00e4glich in beide Richtungen<\/span>\n    <\/div>\n  <\/div>\n\n  <div class=\"fd-content-block\">\n    <h2>F\u00e4hre von Rostock nach Trelleborg<\/h2>\n    <p>Die F\u00e4hrverbindung zwischen Rostock und Trelleborg geh\u00f6rt zu den wichtigsten Verbindungen zwischen Deutschland und Schweden. Die Route wird von Urlaubern, dem G\u00fcterverkehr, Wohnmobilreisenden und Reisenden genutzt, die mit dem Auto weiter nach Skandinavien fahren.<\/p>\n    <p>Da sowohl Stena Line als auch TT Line auf dieser Strecke fahren, k\u00f6nnen Reisende mehrere Abfahrten pro Tag vergleichen. Der Fahrplan unten kombiniert die verf\u00fcgbaren \u00dcberfahrten und macht es einfacher, eine passende Abfahrtszeit zu w\u00e4hlen.<\/p>\n  <\/div>\n\n  <div class=\"fd-timetable-block\">\n    <h2>F\u00e4hre Rostock Trelleborg Fahrplan<\/h2>\n    <p>Hier finden Sie alle kommenden F\u00e4hrabfahrten von Rostock nach Trelleborg. Der Fahrplan enth\u00e4lt Abfahrten von Stena Line und TT Line.<\/p>\n    <div class=\"tp-wrap tp-theme-extended_cards tp-day-setup-classic\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;routes&quot;:[157],&quot;days&quot;:1,&quot;autoload&quot;:true,&quot;theme&quot;:&quot;extended_cards&quot;,&quot;daySetup&quot;:&quot;classic&quot;,&quot;limit10&quot;:false,&quot;routeLabels&quot;:{&quot;157&quot;:&quot;Rostock-Trelleborg&quot;},&quot;opFilter&quot;:[&quot;13&quot;,&quot;36&quot;],&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Datum&quot;,&quot;ui_days&quot;:&quot;Tage&quot;,&quot;ui_button&quot;:&quot;\\u00dcberfahrten anzeigen&quot;,&quot;status_idle&quot;:&quot;W\\u00e4hlen Sie ein Datum und klicken Sie auf \\u00dcberfahrten anzeigen&quot;,&quot;status_loading&quot;:&quot;Wird geladen...&quot;,&quot;status_empty&quot;:&quot;Keine \\u00dcberfahrten gefunden&quot;,&quot;status_found&quot;:&quot;%d \\u00dcberfahrten gefunden&quot;,&quot;th_date&quot;:&quot;Datum&quot;,&quot;th_dep&quot;:&quot;Abfahrt&quot;,&quot;th_arr&quot;:&quot;Ankunft&quot;,&quot;th_dur&quot;:&quot;Dauer&quot;,&quot;th_ship&quot;:&quot;Schiff&quot;,&quot;th_op&quot;:&quot;Betreiber&quot;,&quot;th_route&quot;:&quot;Route&quot;,&quot;wd_sun&quot;:&quot;SO&quot;,&quot;wd_mon&quot;:&quot;MO&quot;,&quot;wd_tue&quot;:&quot;DI&quot;,&quot;wd_wed&quot;:&quot;MI&quot;,&quot;wd_thu&quot;:&quot;DO&quot;,&quot;wd_fri&quot;:&quot;FR&quot;,&quot;wd_sat&quot;:&quot;SA&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Alle %s Abfahrten im Fahrplan ansehen&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Mehr Abfahrten von %1$s und %2$s im Fahrplan ansehen&quot;,&quot;summary_footer_generic&quot;:&quot;Weitere \\u00dcberfahrten im Fahrplan ansehen&quot;,&quot;summary_header&quot;:&quot;Die n\\u00e4chsten zwei Abfahrten:&quot;,&quot;summary_no_upcoming&quot;:&quot;Keine kommenden Abfahrten gefunden&quot;,&quot;more_link&quot;:&quot;Weitere \\u00dcberfahrten&quot;,&quot;more_departures_button&quot;:&quot;Weitere Abfahrten anzeigen&quot;,&quot;day_nav_previous&quot;:&quot;Vorherigen Tag anzeigen&quot;,&quot;day_nav_next&quot;:&quot;N\\u00e4chsten Tag anzeigen&quot;,&quot;day_nav_today&quot;:&quot;Heute anzeigen&quot;,&quot;day_nav_tomorrow&quot;:&quot;Morgen anzeigen&quot;,&quot;local_time_pair&quot;:&quot;Ortszeit Abfahrtshafen: %1$s \\\/ Ortszeit Ankunftshafen: %2$s&quot;,&quot;local_time_combined&quot;:&quot;Ortszeit Abfahrts- & Ankunftshafen: %s&quot;,&quot;tag_often_booked&quot;:&quot;\\u2b50 Oft gebucht&quot;,&quot;tag_leaving_soon&quot;:&quot;\\ud83d\\udd34 Bald abfahrend&quot;,&quot;tag_currently_sailing&quot;:&quot;\\ud83d\\udfe2 Derzeit unterwegs&quot;,&quot;tag_arrived&quot;:&quot;\\u26ab Angekommen&quot;,&quot;tag_overnight&quot;:&quot;\\u00dcber Nacht&quot;},&quot;showLogo&quot;:true,&quot;activityBoosters&quot;:true,&quot;title&quot;:&quot;&quot;,&quot;shipMap&quot;:[],&quot;shipLinks&quot;:[],&quot;showShip&quot;:true,&quot;departurePort&quot;:&quot;Rostock&quot;,&quot;arrivalPort&quot;:&quot;Trelleborg&quot;,&quot;departureTimezone&quot;:&quot;Europe\\\/Berlin&quot;,&quot;arrivalTimezone&quot;:&quot;Europe\\\/Berlin&quot;}\">\n  <div class=\"tp-controls\" role=\"group\" aria-label=\"Timetable controls\">\n    <div>\n      <label for=\"tp-date-ops\">Datum<\/label><br>\n      <input id=\"tp-date-ops\" class=\"tp-date\" type=\"date\" aria-label=\"Datum\">\n    <\/div>\n    <div class=\"tp-day-field\">\n      <label for=\"tp-range-ops\">Tage<\/label><br>\n      <select id=\"tp-range-ops\" class=\"tp-range\" aria-label=\"Tage\">\n        <option value=\"1\">1<\/option><option value=\"3\">3<\/option><option value=\"7\">7<\/option><option value=\"14\">14<\/option>\n      <\/select>\n    <\/div>\n    <div><button id=\"tp-load-ops\" class=\"tp-btn\">\u00dcberfahrten anzeigen<\/button><\/div>\n  <\/div>\n\n  <div class=\"tp-local-nav-row\">\n    <div class=\"tp-local-times\" id=\"tp-local-times-ops\" aria-live=\"polite\"><\/div>\n    <div class=\"tp-day-nav-host\"><\/div>\n  <\/div>\n\n  \n  <div id=\"tp-status-ops\" class=\"tp-muted\" aria-live=\"polite\">W\u00e4hlen Sie ein Datum und klicken Sie auf \u00dcberfahrten anzeigen<\/div>\n\n  <div id=\"tp-ops-results\"><\/div>\n\n  <div class=\"tp-loader\" aria-hidden=\"true\">\n    <div class=\"tp-loader-card\">\n      <div class=\"tp-spinner\" aria-hidden=\"true\"><\/div>\n      <div class=\"tp-loader-text\">Wird geladen...<\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  const wrap   = document.currentScript.previousElementSibling;\n  const cfg    = JSON.parse(wrap.getAttribute('data-config')||'{}');\n  const L      = cfg.labels||{};\n  const dateEl = wrap.querySelector('#tp-date-ops');\n  const daysEl = wrap.querySelector('#tp-range-ops');\n  const btn    = wrap.querySelector('#tp-load-ops');\n  const status = wrap.querySelector('#tp-status-ops');\n  const out    = wrap.querySelector('#tp-ops-results');\n  const loader = wrap.querySelector('.tp-loader');\n  const navHost = wrap.querySelector('.tp-day-nav-host');\n  const localTimesEl = wrap.querySelector('#tp-local-times-ops');\n\n  const showShip = (cfg.showShip !== false && cfg.showShip !== 0 && cfg.showShip !== '0');\n  const activityBoosters = !!cfg.activityBoosters;\n  const daySetup = (cfg.daySetup === 'modern') ? 'modern' : 'classic';\n  const limit10 = !!cfg.limit10;\n  let featuredKey = '';\n  let soonKey = '';\n  let revealAll = false;\n\n  if (daySetup === 'modern') {\n    const dayField = wrap.querySelector('.tp-day-field');\n    if (dayField) dayField.style.display = 'none';\n  }\n\n  dateEl.valueAsDate = new Date();\n  dateEl.min = new Date().toISOString().split('T')[0];\n  Array.from(daysEl.options).forEach(o=>{ if(parseInt(o.value,10)===parseInt(cfg.days||7,10)) o.selected=true; });\n\n  function pad(n){ return String(n).padStart(2,'0'); }\n  function iso(d){ return d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate()); }\n  function toLocal(s){ return new Date(s); }\n  function hhmm(d){ return d.toLocaleTimeString([], {hour:'2-digit', minute:'2-digit'}); }\n  function dShort(d){ return d.toLocaleDateString([], {day:'numeric', month:'short'}); }\n  function dur(m){ const h=Math.floor(m\/60), r=m%60; return r? (h+'h '+r+'m') : (h+'h'); }\n\n  const WD = [\n    L.wd_sun || 'SUN',\n    L.wd_mon || 'MON',\n    L.wd_tue || 'TUE',\n    L.wd_wed || 'WED',\n    L.wd_thu || 'THU',\n    L.wd_fri || 'FRI',\n    L.wd_sat || 'SAT'\n  ];\n\n  function setLoader(v){ loader.classList.toggle('show', !!v); loader.setAttribute('aria-hidden', v?'false':'true'); }\n\n  function formatZoneTime(tz){\n    if (!tz) return '--:--';\n    try {\n      return new Intl.DateTimeFormat([], {hour:'2-digit', minute:'2-digit', hour12:false, timeZone: tz}).format(new Date());\n    } catch (e) {\n      return '--:--';\n    }\n  }\n\n  function renderLocalTimes(){\n    if (!localTimesEl) return;\n    if (!cfg.departureTimezone || !cfg.arrivalTimezone) {\n      localTimesEl.textContent = '';\n      return;\n    }\n    const depTime = formatZoneTime(cfg.departureTimezone);\n    const arrTime = formatZoneTime(cfg.arrivalTimezone);\n    const pairTpl = L.local_time_pair || 'Departure Port Local Time: %1$s \/ Arrival Port Local Time: %2$s';\n    const combinedTpl = L.local_time_combined || 'Departure & Arrival Port Local Time: %s';\n    if (depTime === arrTime) {\n      localTimesEl.textContent = combinedTpl.replace('%s', depTime);\n      return;\n    }\n    localTimesEl.textContent = pairTpl.replace('%1$s', depTime).replace('%2$s', arrTime);\n  }\n\n  function setStatusInline(html){\n    let box = wrap.querySelector('.tp-controls-status');\n    if (!box) {\n      box = document.createElement('div');\n      box.className = 'tp-controls-status';\n      wrap.querySelector('.tp-controls').appendChild(box);\n    }\n    box.innerHTML = html || '';\n  }\n\n  function clearStatusInline(){\n    const box = wrap.querySelector('.tp-controls-status');\n    if (box) box.innerHTML = '';\n  }\n\n  function navHtml(){\n    if (daySetup !== 'modern') return '';\n    const base = new Date(dateEl.value || new Date());\n    const today = new Date();\n    const tomorrow = new Date(today);\n    tomorrow.setDate(today.getDate() + 1);\n    const isToday = base.toDateString() === today.toDateString();\nlet prevLabel = L.day_nav_previous || 'Show previous day';\nlet nextLabel = L.day_nav_next || 'Show next day';\nif (isToday) nextLabel = L.day_nav_tomorrow || 'Show tomorrow';\nif (base.toDateString() === tomorrow.toDateString()) prevLabel = L.day_nav_today || 'Show today';\n    return '<div class=\"tp-day-nav\">'\n      + (isToday ? '' : '<a href=\"#\" data-shift=\"-1\">'+prevLabel+'<\/a>')\n      + '<a href=\"#\" data-shift=\"1\">'+nextLabel+'<\/a>'\n      + '<\/div>';\n  }\n\n  function shiftDate(delta){\n    const base = new Date(dateEl.value || new Date());\n    base.setDate(base.getDate() + delta);\n    dateEl.value = iso(base);\n    load();\n  }\n\n  function moreButtonHtml(hiddenCount){\n    if (!limit10 || revealAll || hiddenCount <= 0) return '';\n    return '<div style=\"margin-top:12px;text-align:center\">'\n      + '<button type=\"button\" class=\"tp-btn tp-more-btn\">'+(L.more_departures_button || 'Show more departures')+' ('+hiddenCount+')<\/button>'\n      + '<\/div>';\n  }\n\n  function opCell(r){\n    const name = r.opName || ('Operator '+(r.opId||''));\n    const logo = (cfg.showLogo && r.opLogo) ? '<img decoding=\"async\" src=\"'+r.opLogo+'\" alt=\"'+name+'\"> ' : '';\n    const label = logo + '<span>'+name+'<\/span>';\n    return r.opLink ? '<a class=\"tp-op\" href=\"'+r.opLink+'\" target=\"_blank\" rel=\"nofollow noopener\">'+label+'<\/a>' : '<span class=\"tp-op\">'+label+'<\/span>';\n  }\n\n  function shipInfo(original){\n    const key = (original||'').toLowerCase().trim();\n    const label = (cfg.shipMap && cfg.shipMap[key]) || original || '';\n    const href  = (cfg.shipLinks && cfg.shipLinks[key]) || '';\n    return {label, href};\n  }\n\n  function shipBadge(original){\n    const s = shipInfo(original);\n    const badge = '<span class=\"tp-badge\">'+(s.label||'')+'<\/span>';\n    return s.href ? ('<a href=\"'+s.href+'\" target=\"_blank\" rel=\"nofollow noopener\">'+badge+'<\/a>') : badge;\n  }\n\n  function rowKey(r){\n    return [String(r.routeId||''), String(r.opId||''), String(+r.dep||0), String(+r.arr||0)].join('|');\n  }\n\n  function pickFeaturedKey(rows, avoidKey){\n    if (!activityBoosters || !rows.length) return '';\n    const routesSum = Array.isArray(cfg.routes) ? cfg.routes.reduce((acc, n)=>acc + (parseInt(n,10)||0), 0) : 0;\n    const dateSeed = parseInt(String(dateEl.value || '').replace(\/-\/g,''), 10) || 0;\n\n    let pool = rows;\n    if (avoidKey) {\n      const soonIdx = rows.findIndex(r => rowKey(r) === avoidKey);\n      if (soonIdx >= 0) {\n        const later = rows.slice(soonIdx + 1).filter(r => rowKey(r) !== avoidKey);\n        pool = later.length ? later : rows.filter(r => rowKey(r) !== avoidKey);\n      } else {\n        pool = rows.filter(r => rowKey(r) !== avoidKey);\n      }\n    }\n\n    if (!pool.length) return '';\n    const idx = Math.abs((routesSum + dateSeed + rows.length) % pool.length);\n    return rowKey(pool[idx]);\n  }\n\n  function pickSoonKey(rows){\n    if (!activityBoosters || !rows.length) return '';\n    const now = Date.now();\n    const todayStr = new Date(now).toDateString();\n    const firstUpcoming = rows.find(r => (r.dep instanceof Date) && r.dep.getTime() > now && r.dep.toDateString() === todayStr);\n    return firstUpcoming ? rowKey(firstUpcoming) : '';\n  }\n\n  function boostersFor(r){\n    if (!activityBoosters) return [];\n    const now = Date.now();\n    const depMs = (r.dep instanceof Date) ? r.dep.getTime() : 0;\n    const arrMs = (r.arr instanceof Date) ? r.arr.getTime() : 0;\n    const depIsToday = (r.dep instanceof Date) && (new Date(now).toDateString() === r.dep.toDateString());\n\n    if (depMs > 0 && arrMs > 0 && depMs <= now && arrMs > now) {\n      return [{cls:'tp-booster-sailing', text:(L.tag_currently_sailing || '\ud83d\udfe2 Currently sailing')}];\n    }\n    if (depIsToday && arrMs > 0 && arrMs <= now) {\n      return [{cls:'tp-booster-arrived', text:(L.tag_arrived || '\u26ab Arrived')}];\n    }\n    if (rowKey(r) === soonKey) return [{cls:'tp-booster-soon', text:(L.tag_leaving_soon || '\ud83d\udd34 Leaving soon')}];\n    if (r.dep && r.arr && r.dep.toDateString() !== r.arr.toDateString()) return [{cls:'tp-booster-overnight', text:(L.tag_overnight || 'Overnight')}];\n\n    return [];\n  }\n\n  function boostersHtml(r, floating){\n    const tags = boostersFor(r);\n    if (!tags.length) return '';\n    const cls = floating ? 'tp-boosters tp-boosters-float' : 'tp-boosters';\n    return '<div class=\"'+cls+'\">' + tags.map(t => '<span class=\"tp-booster '+t.cls+'\">'+boosterLabelHtml(t.text)+'<\/span>').join('') + '<\/div>';\n  }\n\n  function boosterLabelHtml(text){\n    return String(text || '').replace(\/^(\ud83d\udd34|\ud83d\udfe2|\u26ab|\u2b50)\\s*\/, '<span class=\"tp-booster-emoji\">$1<\/span>');\n  }\n\n  function routeTicketHtml(label){\n    const raw = String(label || '').trim();\n    if (!raw) return '';\n    if (cfg.theme !== 'small_cards') return escAttr(raw);\n    const parts = raw.split(\/\\s*[\\-\u2013]\\s*\/, 2);\n    if (parts.length < 2) return escAttr(raw);\n    return escAttr(parts[0]) + '<br>' + escAttr(parts[1]);\n  }\n\n  function escAttr(v){\n    return String(v||'').replace(\/[&<>\"']\/g, m => ({'&':'&','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[m]));\n  }\n\n  function bindRowLinks(){\n    if (cfg.theme !== 'max_clickouts') return;\n    out.querySelectorAll('tr.tp-row-link').forEach((row)=>{\n      row.setAttribute('role','link');\n      row.setAttribute('tabindex','0');\n      row.addEventListener('click', (e)=>{\n        if (e.target && e.target.closest('a')) return;\n        const href = row.getAttribute('data-row-link');\n        if (!href) return;\n        window.open(href, '_blank', 'noopener,noreferrer');\n      });\n      row.addEventListener('keydown', (e)=>{\n        if (e.key !== 'Enter' && e.key !== ' ') return;\n        e.preventDefault();\n        row.click();\n      });\n    });\n  }\n\n  function routeLabel(rid){\n    return (cfg.routeLabels && (cfg.routeLabels[String(rid)] || cfg.routeLabels[rid])) || String(rid);\n  }\n\n  function renderTable(rows){\n    const th = {date:L.th_date,dep:L.th_dep,arr:L.th_arr,dur:L.th_dur,ship:L.th_ship,route:L.th_route,op:L.th_op};\n\n    const headCells = [\n      '<th>'+th.date+'<\/th>',\n      '<th>'+th.dep+'<\/th>',\n      '<th>'+th.arr+'<\/th>',\n      '<th>'+th.dur+'<\/th>'\n    ];\n    if (showShip) {\n      headCells.push('<th>'+th.ship+'<\/th>');\n    }\n    headCells.push('<th>'+th.route+'<\/th>');\n    headCells.push('<th>'+th.op+'<\/th>');\n\n    let html = '<table class=\"tp-table\"><thead><tr>'+headCells.join('')+'<\/tr><\/thead><tbody>';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      const clickable = (cfg.theme === 'max_clickouts' && r.opLink);\n      const rowAttr = clickable ? (' class=\"tp-row-link\" data-row-link=\"'+escAttr(r.opLink)+'\"') : '';\n      const dateBoosters = (cfg.theme === 'max_clickouts') ? '' : boostersHtml(r, false);\n      const routeBoosters = (cfg.theme === 'max_clickouts') ? boostersHtml(r, false) : '';\n      const cells = [\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span>'+dateBoosters+'<\/td>',\n        '<td>'+hhmm(r.dep)+'<\/td>',\n        '<td>'+hhmm(r.arr)+'<\/td>',\n        '<td>'+dur(r.min)+'<\/td>'\n      ];\n      if (showShip) {\n        cells.push('<td>'+shipBadge(r.ship)+'<\/td>');\n      }\n      cells.push('<td>'+routeBoosters+'<div>'+routeLabel(r.routeId)+'<\/div><\/td>');\n      cells.push('<td>'+opCell(r)+'<\/td>');\n      html += '<tr'+rowAttr+'>'+cells.join('')+'<\/tr>';\n    });\n    html += '<\/tbody><\/table>';\n    return html;\n  }\n\n  function renderCards(rows){\n    if (cfg.theme === 'extended_cards') {\n      return renderExtendedCards(rows);\n    }\n\n    let html = '<div class=\"tp-cardlist\">';\n    rows.forEach(r=>{\n      const dow   = WD[r.dep.getDay()] || '';\n      const times = hhmm(r.dep) + ' <span class=\"tp-arrow\">\u2192<\/span> ' + hhmm(r.arr);\n      html += '<div class=\"tp-card\">'+boostersHtml(r, true)+\n        \/\/ Row 1: Date + weekday + times\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\"><span class=\"tp-sub\">'+dShort(r.dep)+'<\/span><span class=\"tp-day\">'+dow+'<\/span><\/div>'+\n          '<div class=\"rhs\"><span class=\"tp-time\">'+times+'<\/span><\/div>'+\n        '<\/div>';\n\n      if (showShip) {\n        html +=\n        \/\/ Row 2: Ship\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+shipBadge(r.ship)+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>';\n      }\n\n      html +=\n        \/\/ Row 3: Operator + route label\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          '<div class=\"rhs\"><span class=\"tp-route-ticket\">'+routeTicketHtml(routeLabel(r.routeId))+'<\/span><\/div>'+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  function renderExtendedCards(rows){\n    const ctaText = L.more_link || 'More sailings';\n    let html = '<div class=\"tp-cardlist\">';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      const link = r.opLink ? ('<a class=\"tp-ext-cta\" href=\"'+r.opLink+'\" target=\"_blank\" rel=\"nofollow noopener\">'+ctaText+' <span class=\"tp-ext-cta-arrow\">\u00bb<\/span><\/a>') : '<span class=\"tp-ext-cta\">'+ctaText+' <span class=\"tp-ext-cta-arrow\">\u00bb<\/span><\/span>';\n      html += '<div class=\"tp-ext-card\">'\n        + boostersHtml(r, true)\n        + '<div class=\"tp-ext-left\">'\n        +   '<div>'+opCell(r)+'<\/div>'\n        +   (showShip ? ('<div>'+shipBadge(r.ship)+'<\/div>') : '')\n        + '<\/div>'\n        + '<div class=\"tp-ext-mid\">'\n        +   '<div class=\"tp-ext-top\"><span class=\"tp-sub\">'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span><\/span><span class=\"tp-ext-dur\">'+dur(r.min)+'<\/span><\/div>'\n        +   '<div class=\"tp-ext-times\"><span class=\"tp-ext-time\">'+hhmm(r.dep)+'<\/span><span class=\"tp-ext-line\"><\/span><span class=\"tp-ext-dur\">'+dur(r.min)+'<\/span><span class=\"tp-ext-line\"><\/span><span class=\"tp-ext-time\">'+hhmm(r.arr)+'<\/span><\/div>'\n        +   '<div class=\"tp-ext-route\">'+routeLabel(r.routeId)+'<\/div>'\n        + '<\/div>'\n        + '<div class=\"tp-ext-right\">'+link+'<\/div>'\n        + '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  \/\/ Safe fetch helper\n  async function fetchOne(routeId, from, to){\n    try{\n      const url = new URL(cfg.rest);\n      url.searchParams.set('route', String(routeId));\n      url.searchParams.set('from', from);\n      url.searchParams.set('to', to);\n      const res = await fetch(url.toString(), {credentials:'same-origin'});\n      if(!res.ok) return { rid: routeId, error: 'HTTP '+res.status };\n      const json = await res.json();\n      const list = (json && json.data && Array.isArray(json.data.rows)) ? json.data.rows : [];\n      return { rid: routeId, rows: list };\n    }catch(e){\n      return { rid: routeId, error: String(e && e.message ? e.message : e) };\n    }\n  }\n\n  async function load(){\n    btn.disabled = true; setLoader(true); status.textContent = L.status_loading;\n\n    const start = new Date(dateEl.value || new Date());\n    const days  = (daySetup === 'modern') ? 1 : Math.max(1, parseInt(daysEl.value,10)||1);\n    const end   = new Date(start); end.setDate(start.getDate()+days-1);\n    const fromIso = iso(start), toIso = iso(end);\n\n    try{\n      const results  = await Promise.all((cfg.routes||[]).map(rid=>fetchOne(rid, fromIso, toIso)));\n      const oks  = results.filter(r => !r.error);\n      const errs = results.filter(r =>  r.error);\n\n      const all = [];\n      oks.forEach(({rid, rows})=>{\n        rows.forEach(t=>{\n          all.push({\n            routeId: rid,\n            opId: t.operatorId || null,\n            opName: t.operatorName || '',\n            opLogo: t.operatorLogo || '',\n            opLink: t.operatorLink || '',\n            dep: toLocal(t.departureTime),\n            arr: toLocal(t.arrivalTime),\n            min: t.durationInMinutes || 0,\n            ship: t.shipName || ''\n          });\n        });\n      });\n\n      let rows = all;\n      if (Array.isArray(cfg.opFilter) && cfg.opFilter.length>0) {\n        rows = all.filter(r => r.opId && cfg.opFilter.includes(String(r.opId)));\n      }\n\n      rows.sort((a,b)=> a.dep - b.dep);\n\n      const todayStr = new Date().toDateString();\n      const nowMs = Date.now();\n      const arrivedToday = rows\n        .filter(r => (r.dep instanceof Date) && (r.arr instanceof Date) && r.dep.toDateString() === todayStr && r.arr.getTime() <= nowMs)\n        .sort((a,b) => b.arr - a.arr);\n      if (arrivedToday.length > 2) {\n        const keep = new Set(arrivedToday.slice(0,2).map(rowKey));\n        rows = rows.filter(r => {\n          const isArrivedToday = (r.dep instanceof Date) && (r.arr instanceof Date) && r.dep.toDateString() === todayStr && r.arr.getTime() <= nowMs;\n          return !isArrivedToday || keep.has(rowKey(r));\n        });\n      }\n\n      const total = rows.length;\n      if (total===0){\n        status.textContent = L.status_empty + (errs.length ? ' (some routes returned no data or errors)' : '');\n        clearStatusInline();\n        out.innerHTML='';\n        setLoader(false); btn.disabled=false; return;\n      }\n\n      const visibleRows = (limit10 && !revealAll && rows.length > 10) ? rows.slice(0,10) : rows;\n      const hiddenCount = rows.length - visibleRows.length;\n      soonKey = pickSoonKey(visibleRows);\n      featuredKey = pickFeaturedKey(visibleRows, soonKey);\n\n      status.textContent = errs.length ? ('Skipped '+errs.length+' route'+(errs.length>1?'s':'')) : '';\n      setStatusInline(\n  (L.status_found || '%d sailings found').replace('%d', '<strong>'+total+'<\/strong>')\n);\n      out.innerHTML = renderTable(visibleRows) + renderCards(visibleRows) + moreButtonHtml(hiddenCount);\n      bindRowLinks();\n      if (navHost) navHost.innerHTML = navHtml();\n\n    } catch(e){\n      status.textContent = 'Failed to load data';\n      out.innerHTML = '<pre>'+String(e.message||e)+'<\/pre>';\n    } finally {\n      setLoader(false);\n      btn.disabled = false;\n    }\n  }\n\n  wrap.addEventListener('click', function(e){\n    const nav = e.target.closest('.tp-day-nav a[data-shift]');\n    if (nav) {\n      e.preventDefault();\n      shiftDate(parseInt(nav.getAttribute('data-shift'),10) || 0);\n      return;\n    }\n    const more = e.target.closest('.tp-more-btn');\n    if (more) {\n      e.preventDefault();\n      revealAll = true;\n      load();\n    }\n  });\n\n  btn.addEventListener('click', load);\n  if (navHost) navHost.innerHTML = navHtml();\n  renderLocalTimes();\n  setInterval(renderLocalTimes, 30000);\n  if (cfg.autoload) load();\n})();\n<\/script>\n\n  <\/div>\n\n  <div class=\"fd-timetable-block\">\n    <h2>F\u00e4hre Trelleborg Rostock Fahrplan<\/h2>\n    <p>Hier finden Sie alle kommenden F\u00e4hrabfahrten von Trelleborg nach Rostock. Diese \u00dcbersicht hilft beim Vergleich der R\u00fcckfahrten von Schweden nach Deutschland.<\/p>\n    <div class=\"tp-wrap tp-theme-extended_cards tp-day-setup-classic\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;routes&quot;:[158],&quot;days&quot;:1,&quot;autoload&quot;:true,&quot;theme&quot;:&quot;extended_cards&quot;,&quot;daySetup&quot;:&quot;classic&quot;,&quot;limit10&quot;:false,&quot;routeLabels&quot;:{&quot;158&quot;:&quot;Trelleborg-Rostock&quot;},&quot;opFilter&quot;:[&quot;13&quot;,&quot;36&quot;],&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Datum&quot;,&quot;ui_days&quot;:&quot;Tage&quot;,&quot;ui_button&quot;:&quot;\\u00dcberfahrten anzeigen&quot;,&quot;status_idle&quot;:&quot;W\\u00e4hlen Sie ein Datum und klicken Sie auf \\u00dcberfahrten anzeigen&quot;,&quot;status_loading&quot;:&quot;Wird geladen...&quot;,&quot;status_empty&quot;:&quot;Keine \\u00dcberfahrten gefunden&quot;,&quot;status_found&quot;:&quot;%d \\u00dcberfahrten gefunden&quot;,&quot;th_date&quot;:&quot;Datum&quot;,&quot;th_dep&quot;:&quot;Abfahrt&quot;,&quot;th_arr&quot;:&quot;Ankunft&quot;,&quot;th_dur&quot;:&quot;Dauer&quot;,&quot;th_ship&quot;:&quot;Schiff&quot;,&quot;th_op&quot;:&quot;Betreiber&quot;,&quot;th_route&quot;:&quot;Route&quot;,&quot;wd_sun&quot;:&quot;SO&quot;,&quot;wd_mon&quot;:&quot;MO&quot;,&quot;wd_tue&quot;:&quot;DI&quot;,&quot;wd_wed&quot;:&quot;MI&quot;,&quot;wd_thu&quot;:&quot;DO&quot;,&quot;wd_fri&quot;:&quot;FR&quot;,&quot;wd_sat&quot;:&quot;SA&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Alle %s Abfahrten im Fahrplan ansehen&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Mehr Abfahrten von %1$s und %2$s im Fahrplan ansehen&quot;,&quot;summary_footer_generic&quot;:&quot;Weitere \\u00dcberfahrten im Fahrplan ansehen&quot;,&quot;summary_header&quot;:&quot;Die n\\u00e4chsten zwei Abfahrten:&quot;,&quot;summary_no_upcoming&quot;:&quot;Keine kommenden Abfahrten gefunden&quot;,&quot;more_link&quot;:&quot;Weitere \\u00dcberfahrten&quot;,&quot;more_departures_button&quot;:&quot;Weitere Abfahrten anzeigen&quot;,&quot;day_nav_previous&quot;:&quot;Vorherigen Tag anzeigen&quot;,&quot;day_nav_next&quot;:&quot;N\\u00e4chsten Tag anzeigen&quot;,&quot;day_nav_today&quot;:&quot;Heute anzeigen&quot;,&quot;day_nav_tomorrow&quot;:&quot;Morgen anzeigen&quot;,&quot;local_time_pair&quot;:&quot;Ortszeit Abfahrtshafen: %1$s \\\/ Ortszeit Ankunftshafen: %2$s&quot;,&quot;local_time_combined&quot;:&quot;Ortszeit Abfahrts- & Ankunftshafen: %s&quot;,&quot;tag_often_booked&quot;:&quot;\\u2b50 Oft gebucht&quot;,&quot;tag_leaving_soon&quot;:&quot;\\ud83d\\udd34 Bald abfahrend&quot;,&quot;tag_currently_sailing&quot;:&quot;\\ud83d\\udfe2 Derzeit unterwegs&quot;,&quot;tag_arrived&quot;:&quot;\\u26ab Angekommen&quot;,&quot;tag_overnight&quot;:&quot;\\u00dcber Nacht&quot;},&quot;showLogo&quot;:true,&quot;activityBoosters&quot;:true,&quot;title&quot;:&quot;&quot;,&quot;shipMap&quot;:[],&quot;shipLinks&quot;:[],&quot;showShip&quot;:true,&quot;departurePort&quot;:&quot;Trelleborg&quot;,&quot;arrivalPort&quot;:&quot;Rostock&quot;,&quot;departureTimezone&quot;:&quot;Europe\\\/Berlin&quot;,&quot;arrivalTimezone&quot;:&quot;Europe\\\/Berlin&quot;}\">\n  <div class=\"tp-controls\" role=\"group\" aria-label=\"Timetable controls\">\n    <div>\n      <label for=\"tp-date-ops\">Datum<\/label><br>\n      <input id=\"tp-date-ops\" class=\"tp-date\" type=\"date\" aria-label=\"Datum\">\n    <\/div>\n    <div class=\"tp-day-field\">\n      <label for=\"tp-range-ops\">Tage<\/label><br>\n      <select id=\"tp-range-ops\" class=\"tp-range\" aria-label=\"Tage\">\n        <option value=\"1\">1<\/option><option value=\"3\">3<\/option><option value=\"7\">7<\/option><option value=\"14\">14<\/option>\n      <\/select>\n    <\/div>\n    <div><button id=\"tp-load-ops\" class=\"tp-btn\">\u00dcberfahrten anzeigen<\/button><\/div>\n  <\/div>\n\n  <div class=\"tp-local-nav-row\">\n    <div class=\"tp-local-times\" id=\"tp-local-times-ops\" aria-live=\"polite\"><\/div>\n    <div class=\"tp-day-nav-host\"><\/div>\n  <\/div>\n\n  \n  <div id=\"tp-status-ops\" class=\"tp-muted\" aria-live=\"polite\">W\u00e4hlen Sie ein Datum und klicken Sie auf \u00dcberfahrten anzeigen<\/div>\n\n  <div id=\"tp-ops-results\"><\/div>\n\n  <div class=\"tp-loader\" aria-hidden=\"true\">\n    <div class=\"tp-loader-card\">\n      <div class=\"tp-spinner\" aria-hidden=\"true\"><\/div>\n      <div class=\"tp-loader-text\">Wird geladen...<\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  const wrap   = document.currentScript.previousElementSibling;\n  const cfg    = JSON.parse(wrap.getAttribute('data-config')||'{}');\n  const L      = cfg.labels||{};\n  const dateEl = wrap.querySelector('#tp-date-ops');\n  const daysEl = wrap.querySelector('#tp-range-ops');\n  const btn    = wrap.querySelector('#tp-load-ops');\n  const status = wrap.querySelector('#tp-status-ops');\n  const out    = wrap.querySelector('#tp-ops-results');\n  const loader = wrap.querySelector('.tp-loader');\n  const navHost = wrap.querySelector('.tp-day-nav-host');\n  const localTimesEl = wrap.querySelector('#tp-local-times-ops');\n\n  const showShip = (cfg.showShip !== false && cfg.showShip !== 0 && cfg.showShip !== '0');\n  const activityBoosters = !!cfg.activityBoosters;\n  const daySetup = (cfg.daySetup === 'modern') ? 'modern' : 'classic';\n  const limit10 = !!cfg.limit10;\n  let featuredKey = '';\n  let soonKey = '';\n  let revealAll = false;\n\n  if (daySetup === 'modern') {\n    const dayField = wrap.querySelector('.tp-day-field');\n    if (dayField) dayField.style.display = 'none';\n  }\n\n  dateEl.valueAsDate = new Date();\n  dateEl.min = new Date().toISOString().split('T')[0];\n  Array.from(daysEl.options).forEach(o=>{ if(parseInt(o.value,10)===parseInt(cfg.days||7,10)) o.selected=true; });\n\n  function pad(n){ return String(n).padStart(2,'0'); }\n  function iso(d){ return d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate()); }\n  function toLocal(s){ return new Date(s); }\n  function hhmm(d){ return d.toLocaleTimeString([], {hour:'2-digit', minute:'2-digit'}); }\n  function dShort(d){ return d.toLocaleDateString([], {day:'numeric', month:'short'}); }\n  function dur(m){ const h=Math.floor(m\/60), r=m%60; return r? (h+'h '+r+'m') : (h+'h'); }\n\n  const WD = [\n    L.wd_sun || 'SUN',\n    L.wd_mon || 'MON',\n    L.wd_tue || 'TUE',\n    L.wd_wed || 'WED',\n    L.wd_thu || 'THU',\n    L.wd_fri || 'FRI',\n    L.wd_sat || 'SAT'\n  ];\n\n  function setLoader(v){ loader.classList.toggle('show', !!v); loader.setAttribute('aria-hidden', v?'false':'true'); }\n\n  function formatZoneTime(tz){\n    if (!tz) return '--:--';\n    try {\n      return new Intl.DateTimeFormat([], {hour:'2-digit', minute:'2-digit', hour12:false, timeZone: tz}).format(new Date());\n    } catch (e) {\n      return '--:--';\n    }\n  }\n\n  function renderLocalTimes(){\n    if (!localTimesEl) return;\n    if (!cfg.departureTimezone || !cfg.arrivalTimezone) {\n      localTimesEl.textContent = '';\n      return;\n    }\n    const depTime = formatZoneTime(cfg.departureTimezone);\n    const arrTime = formatZoneTime(cfg.arrivalTimezone);\n    const pairTpl = L.local_time_pair || 'Departure Port Local Time: %1$s \/ Arrival Port Local Time: %2$s';\n    const combinedTpl = L.local_time_combined || 'Departure & Arrival Port Local Time: %s';\n    if (depTime === arrTime) {\n      localTimesEl.textContent = combinedTpl.replace('%s', depTime);\n      return;\n    }\n    localTimesEl.textContent = pairTpl.replace('%1$s', depTime).replace('%2$s', arrTime);\n  }\n\n  function setStatusInline(html){\n    let box = wrap.querySelector('.tp-controls-status');\n    if (!box) {\n      box = document.createElement('div');\n      box.className = 'tp-controls-status';\n      wrap.querySelector('.tp-controls').appendChild(box);\n    }\n    box.innerHTML = html || '';\n  }\n\n  function clearStatusInline(){\n    const box = wrap.querySelector('.tp-controls-status');\n    if (box) box.innerHTML = '';\n  }\n\n  function navHtml(){\n    if (daySetup !== 'modern') return '';\n    const base = new Date(dateEl.value || new Date());\n    const today = new Date();\n    const tomorrow = new Date(today);\n    tomorrow.setDate(today.getDate() + 1);\n    const isToday = base.toDateString() === today.toDateString();\nlet prevLabel = L.day_nav_previous || 'Show previous day';\nlet nextLabel = L.day_nav_next || 'Show next day';\nif (isToday) nextLabel = L.day_nav_tomorrow || 'Show tomorrow';\nif (base.toDateString() === tomorrow.toDateString()) prevLabel = L.day_nav_today || 'Show today';\n    return '<div class=\"tp-day-nav\">'\n      + (isToday ? '' : '<a href=\"#\" data-shift=\"-1\">'+prevLabel+'<\/a>')\n      + '<a href=\"#\" data-shift=\"1\">'+nextLabel+'<\/a>'\n      + '<\/div>';\n  }\n\n  function shiftDate(delta){\n    const base = new Date(dateEl.value || new Date());\n    base.setDate(base.getDate() + delta);\n    dateEl.value = iso(base);\n    load();\n  }\n\n  function moreButtonHtml(hiddenCount){\n    if (!limit10 || revealAll || hiddenCount <= 0) return '';\n    return '<div style=\"margin-top:12px;text-align:center\">'\n      + '<button type=\"button\" class=\"tp-btn tp-more-btn\">'+(L.more_departures_button || 'Show more departures')+' ('+hiddenCount+')<\/button>'\n      + '<\/div>';\n  }\n\n  function opCell(r){\n    const name = r.opName || ('Operator '+(r.opId||''));\n    const logo = (cfg.showLogo && r.opLogo) ? '<img decoding=\"async\" src=\"'+r.opLogo+'\" alt=\"'+name+'\"> ' : '';\n    const label = logo + '<span>'+name+'<\/span>';\n    return r.opLink ? '<a class=\"tp-op\" href=\"'+r.opLink+'\" target=\"_blank\" rel=\"nofollow noopener\">'+label+'<\/a>' : '<span class=\"tp-op\">'+label+'<\/span>';\n  }\n\n  function shipInfo(original){\n    const key = (original||'').toLowerCase().trim();\n    const label = (cfg.shipMap && cfg.shipMap[key]) || original || '';\n    const href  = (cfg.shipLinks && cfg.shipLinks[key]) || '';\n    return {label, href};\n  }\n\n  function shipBadge(original){\n    const s = shipInfo(original);\n    const badge = '<span class=\"tp-badge\">'+(s.label||'')+'<\/span>';\n    return s.href ? ('<a href=\"'+s.href+'\" target=\"_blank\" rel=\"nofollow noopener\">'+badge+'<\/a>') : badge;\n  }\n\n  function rowKey(r){\n    return [String(r.routeId||''), String(r.opId||''), String(+r.dep||0), String(+r.arr||0)].join('|');\n  }\n\n  function pickFeaturedKey(rows, avoidKey){\n    if (!activityBoosters || !rows.length) return '';\n    const routesSum = Array.isArray(cfg.routes) ? cfg.routes.reduce((acc, n)=>acc + (parseInt(n,10)||0), 0) : 0;\n    const dateSeed = parseInt(String(dateEl.value || '').replace(\/-\/g,''), 10) || 0;\n\n    let pool = rows;\n    if (avoidKey) {\n      const soonIdx = rows.findIndex(r => rowKey(r) === avoidKey);\n      if (soonIdx >= 0) {\n        const later = rows.slice(soonIdx + 1).filter(r => rowKey(r) !== avoidKey);\n        pool = later.length ? later : rows.filter(r => rowKey(r) !== avoidKey);\n      } else {\n        pool = rows.filter(r => rowKey(r) !== avoidKey);\n      }\n    }\n\n    if (!pool.length) return '';\n    const idx = Math.abs((routesSum + dateSeed + rows.length) % pool.length);\n    return rowKey(pool[idx]);\n  }\n\n  function pickSoonKey(rows){\n    if (!activityBoosters || !rows.length) return '';\n    const now = Date.now();\n    const todayStr = new Date(now).toDateString();\n    const firstUpcoming = rows.find(r => (r.dep instanceof Date) && r.dep.getTime() > now && r.dep.toDateString() === todayStr);\n    return firstUpcoming ? rowKey(firstUpcoming) : '';\n  }\n\n  function boostersFor(r){\n    if (!activityBoosters) return [];\n    const now = Date.now();\n    const depMs = (r.dep instanceof Date) ? r.dep.getTime() : 0;\n    const arrMs = (r.arr instanceof Date) ? r.arr.getTime() : 0;\n    const depIsToday = (r.dep instanceof Date) && (new Date(now).toDateString() === r.dep.toDateString());\n\n    if (depMs > 0 && arrMs > 0 && depMs <= now && arrMs > now) {\n      return [{cls:'tp-booster-sailing', text:(L.tag_currently_sailing || '\ud83d\udfe2 Currently sailing')}];\n    }\n    if (depIsToday && arrMs > 0 && arrMs <= now) {\n      return [{cls:'tp-booster-arrived', text:(L.tag_arrived || '\u26ab Arrived')}];\n    }\n    if (rowKey(r) === soonKey) return [{cls:'tp-booster-soon', text:(L.tag_leaving_soon || '\ud83d\udd34 Leaving soon')}];\n    if (r.dep && r.arr && r.dep.toDateString() !== r.arr.toDateString()) return [{cls:'tp-booster-overnight', text:(L.tag_overnight || 'Overnight')}];\n\n    return [];\n  }\n\n  function boostersHtml(r, floating){\n    const tags = boostersFor(r);\n    if (!tags.length) return '';\n    const cls = floating ? 'tp-boosters tp-boosters-float' : 'tp-boosters';\n    return '<div class=\"'+cls+'\">' + tags.map(t => '<span class=\"tp-booster '+t.cls+'\">'+boosterLabelHtml(t.text)+'<\/span>').join('') + '<\/div>';\n  }\n\n  function boosterLabelHtml(text){\n    return String(text || '').replace(\/^(\ud83d\udd34|\ud83d\udfe2|\u26ab|\u2b50)\\s*\/, '<span class=\"tp-booster-emoji\">$1<\/span>');\n  }\n\n  function routeTicketHtml(label){\n    const raw = String(label || '').trim();\n    if (!raw) return '';\n    if (cfg.theme !== 'small_cards') return escAttr(raw);\n    const parts = raw.split(\/\\s*[\\-\u2013]\\s*\/, 2);\n    if (parts.length < 2) return escAttr(raw);\n    return escAttr(parts[0]) + '<br>' + escAttr(parts[1]);\n  }\n\n  function escAttr(v){\n    return String(v||'').replace(\/[&<>\"']\/g, m => ({'&':'&','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[m]));\n  }\n\n  function bindRowLinks(){\n    if (cfg.theme !== 'max_clickouts') return;\n    out.querySelectorAll('tr.tp-row-link').forEach((row)=>{\n      row.setAttribute('role','link');\n      row.setAttribute('tabindex','0');\n      row.addEventListener('click', (e)=>{\n        if (e.target && e.target.closest('a')) return;\n        const href = row.getAttribute('data-row-link');\n        if (!href) return;\n        window.open(href, '_blank', 'noopener,noreferrer');\n      });\n      row.addEventListener('keydown', (e)=>{\n        if (e.key !== 'Enter' && e.key !== ' ') return;\n        e.preventDefault();\n        row.click();\n      });\n    });\n  }\n\n  function routeLabel(rid){\n    return (cfg.routeLabels && (cfg.routeLabels[String(rid)] || cfg.routeLabels[rid])) || String(rid);\n  }\n\n  function renderTable(rows){\n    const th = {date:L.th_date,dep:L.th_dep,arr:L.th_arr,dur:L.th_dur,ship:L.th_ship,route:L.th_route,op:L.th_op};\n\n    const headCells = [\n      '<th>'+th.date+'<\/th>',\n      '<th>'+th.dep+'<\/th>',\n      '<th>'+th.arr+'<\/th>',\n      '<th>'+th.dur+'<\/th>'\n    ];\n    if (showShip) {\n      headCells.push('<th>'+th.ship+'<\/th>');\n    }\n    headCells.push('<th>'+th.route+'<\/th>');\n    headCells.push('<th>'+th.op+'<\/th>');\n\n    let html = '<table class=\"tp-table\"><thead><tr>'+headCells.join('')+'<\/tr><\/thead><tbody>';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      const clickable = (cfg.theme === 'max_clickouts' && r.opLink);\n      const rowAttr = clickable ? (' class=\"tp-row-link\" data-row-link=\"'+escAttr(r.opLink)+'\"') : '';\n      const dateBoosters = (cfg.theme === 'max_clickouts') ? '' : boostersHtml(r, false);\n      const routeBoosters = (cfg.theme === 'max_clickouts') ? boostersHtml(r, false) : '';\n      const cells = [\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span>'+dateBoosters+'<\/td>',\n        '<td>'+hhmm(r.dep)+'<\/td>',\n        '<td>'+hhmm(r.arr)+'<\/td>',\n        '<td>'+dur(r.min)+'<\/td>'\n      ];\n      if (showShip) {\n        cells.push('<td>'+shipBadge(r.ship)+'<\/td>');\n      }\n      cells.push('<td>'+routeBoosters+'<div>'+routeLabel(r.routeId)+'<\/div><\/td>');\n      cells.push('<td>'+opCell(r)+'<\/td>');\n      html += '<tr'+rowAttr+'>'+cells.join('')+'<\/tr>';\n    });\n    html += '<\/tbody><\/table>';\n    return html;\n  }\n\n  function renderCards(rows){\n    if (cfg.theme === 'extended_cards') {\n      return renderExtendedCards(rows);\n    }\n\n    let html = '<div class=\"tp-cardlist\">';\n    rows.forEach(r=>{\n      const dow   = WD[r.dep.getDay()] || '';\n      const times = hhmm(r.dep) + ' <span class=\"tp-arrow\">\u2192<\/span> ' + hhmm(r.arr);\n      html += '<div class=\"tp-card\">'+boostersHtml(r, true)+\n        \/\/ Row 1: Date + weekday + times\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\"><span class=\"tp-sub\">'+dShort(r.dep)+'<\/span><span class=\"tp-day\">'+dow+'<\/span><\/div>'+\n          '<div class=\"rhs\"><span class=\"tp-time\">'+times+'<\/span><\/div>'+\n        '<\/div>';\n\n      if (showShip) {\n        html +=\n        \/\/ Row 2: Ship\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+shipBadge(r.ship)+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>';\n      }\n\n      html +=\n        \/\/ Row 3: Operator + route label\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          '<div class=\"rhs\"><span class=\"tp-route-ticket\">'+routeTicketHtml(routeLabel(r.routeId))+'<\/span><\/div>'+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  function renderExtendedCards(rows){\n    const ctaText = L.more_link || 'More sailings';\n    let html = '<div class=\"tp-cardlist\">';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      const link = r.opLink ? ('<a class=\"tp-ext-cta\" href=\"'+r.opLink+'\" target=\"_blank\" rel=\"nofollow noopener\">'+ctaText+' <span class=\"tp-ext-cta-arrow\">\u00bb<\/span><\/a>') : '<span class=\"tp-ext-cta\">'+ctaText+' <span class=\"tp-ext-cta-arrow\">\u00bb<\/span><\/span>';\n      html += '<div class=\"tp-ext-card\">'\n        + boostersHtml(r, true)\n        + '<div class=\"tp-ext-left\">'\n        +   '<div>'+opCell(r)+'<\/div>'\n        +   (showShip ? ('<div>'+shipBadge(r.ship)+'<\/div>') : '')\n        + '<\/div>'\n        + '<div class=\"tp-ext-mid\">'\n        +   '<div class=\"tp-ext-top\"><span class=\"tp-sub\">'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span><\/span><span class=\"tp-ext-dur\">'+dur(r.min)+'<\/span><\/div>'\n        +   '<div class=\"tp-ext-times\"><span class=\"tp-ext-time\">'+hhmm(r.dep)+'<\/span><span class=\"tp-ext-line\"><\/span><span class=\"tp-ext-dur\">'+dur(r.min)+'<\/span><span class=\"tp-ext-line\"><\/span><span class=\"tp-ext-time\">'+hhmm(r.arr)+'<\/span><\/div>'\n        +   '<div class=\"tp-ext-route\">'+routeLabel(r.routeId)+'<\/div>'\n        + '<\/div>'\n        + '<div class=\"tp-ext-right\">'+link+'<\/div>'\n        + '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  \/\/ Safe fetch helper\n  async function fetchOne(routeId, from, to){\n    try{\n      const url = new URL(cfg.rest);\n      url.searchParams.set('route', String(routeId));\n      url.searchParams.set('from', from);\n      url.searchParams.set('to', to);\n      const res = await fetch(url.toString(), {credentials:'same-origin'});\n      if(!res.ok) return { rid: routeId, error: 'HTTP '+res.status };\n      const json = await res.json();\n      const list = (json && json.data && Array.isArray(json.data.rows)) ? json.data.rows : [];\n      return { rid: routeId, rows: list };\n    }catch(e){\n      return { rid: routeId, error: String(e && e.message ? e.message : e) };\n    }\n  }\n\n  async function load(){\n    btn.disabled = true; setLoader(true); status.textContent = L.status_loading;\n\n    const start = new Date(dateEl.value || new Date());\n    const days  = (daySetup === 'modern') ? 1 : Math.max(1, parseInt(daysEl.value,10)||1);\n    const end   = new Date(start); end.setDate(start.getDate()+days-1);\n    const fromIso = iso(start), toIso = iso(end);\n\n    try{\n      const results  = await Promise.all((cfg.routes||[]).map(rid=>fetchOne(rid, fromIso, toIso)));\n      const oks  = results.filter(r => !r.error);\n      const errs = results.filter(r =>  r.error);\n\n      const all = [];\n      oks.forEach(({rid, rows})=>{\n        rows.forEach(t=>{\n          all.push({\n            routeId: rid,\n            opId: t.operatorId || null,\n            opName: t.operatorName || '',\n            opLogo: t.operatorLogo || '',\n            opLink: t.operatorLink || '',\n            dep: toLocal(t.departureTime),\n            arr: toLocal(t.arrivalTime),\n            min: t.durationInMinutes || 0,\n            ship: t.shipName || ''\n          });\n        });\n      });\n\n      let rows = all;\n      if (Array.isArray(cfg.opFilter) && cfg.opFilter.length>0) {\n        rows = all.filter(r => r.opId && cfg.opFilter.includes(String(r.opId)));\n      }\n\n      rows.sort((a,b)=> a.dep - b.dep);\n\n      const todayStr = new Date().toDateString();\n      const nowMs = Date.now();\n      const arrivedToday = rows\n        .filter(r => (r.dep instanceof Date) && (r.arr instanceof Date) && r.dep.toDateString() === todayStr && r.arr.getTime() <= nowMs)\n        .sort((a,b) => b.arr - a.arr);\n      if (arrivedToday.length > 2) {\n        const keep = new Set(arrivedToday.slice(0,2).map(rowKey));\n        rows = rows.filter(r => {\n          const isArrivedToday = (r.dep instanceof Date) && (r.arr instanceof Date) && r.dep.toDateString() === todayStr && r.arr.getTime() <= nowMs;\n          return !isArrivedToday || keep.has(rowKey(r));\n        });\n      }\n\n      const total = rows.length;\n      if (total===0){\n        status.textContent = L.status_empty + (errs.length ? ' (some routes returned no data or errors)' : '');\n        clearStatusInline();\n        out.innerHTML='';\n        setLoader(false); btn.disabled=false; return;\n      }\n\n      const visibleRows = (limit10 && !revealAll && rows.length > 10) ? rows.slice(0,10) : rows;\n      const hiddenCount = rows.length - visibleRows.length;\n      soonKey = pickSoonKey(visibleRows);\n      featuredKey = pickFeaturedKey(visibleRows, soonKey);\n\n      status.textContent = errs.length ? ('Skipped '+errs.length+' route'+(errs.length>1?'s':'')) : '';\n      setStatusInline(\n  (L.status_found || '%d sailings found').replace('%d', '<strong>'+total+'<\/strong>')\n);\n      out.innerHTML = renderTable(visibleRows) + renderCards(visibleRows) + moreButtonHtml(hiddenCount);\n      bindRowLinks();\n      if (navHost) navHost.innerHTML = navHtml();\n\n    } catch(e){\n      status.textContent = 'Failed to load data';\n      out.innerHTML = '<pre>'+String(e.message||e)+'<\/pre>';\n    } finally {\n      setLoader(false);\n      btn.disabled = false;\n    }\n  }\n\n  wrap.addEventListener('click', function(e){\n    const nav = e.target.closest('.tp-day-nav a[data-shift]');\n    if (nav) {\n      e.preventDefault();\n      shiftDate(parseInt(nav.getAttribute('data-shift'),10) || 0);\n      return;\n    }\n    const more = e.target.closest('.tp-more-btn');\n    if (more) {\n      e.preventDefault();\n      revealAll = true;\n      load();\n    }\n  });\n\n  btn.addEventListener('click', load);\n  if (navHost) navHost.innerHTML = navHtml();\n  renderLocalTimes();\n  setInterval(renderLocalTimes, 30000);\n  if (cfg.autoload) load();\n})();\n<\/script>\n\n  <\/div>\n\n  <div class=\"fd-operator-grid\">\n    <div class=\"fd-operator-card\">\n      <h2>Stena Line Rostock Trelleborg Fahrplan<\/h2>\n      <p>Viele Reisende suchen gezielt nach dem Stena Line Rostock Trelleborg Fahrplan. Stena Line bietet regelm\u00e4\u00dfige \u00dcberfahrten zwischen Deutschland und Schweden an, darunter Tages- und Nachtabfahrten.<\/p>\n      <p>Der Fahrplan auf dieser Seite enth\u00e4lt verf\u00fcgbare Stena Line Abfahrten von Rostock nach Trelleborg sowie von Trelleborg nach Rostock.<\/p>\n      <p><a href=\"\/de\/stena-line\/\">Mehr \u00fcber Stena Line<\/a><\/p>\n    <\/div>\n\n    <div class=\"fd-operator-card\">\n      <h2>TT Line Fahrplan Rostock Trelleborg<\/h2>\n      <p>TT Line geh\u00f6rt zu den wichtigsten Betreibern auf der Route Rostock Trelleborg. Die Reederei bietet regelm\u00e4\u00dfige Abfahrten und verbindet Deutschland direkt mit S\u00fcdschweden.<\/p>\n      <p>Im Fahrplan auf dieser Seite finden Sie verf\u00fcgbare TT Line Verbindungen zwischen Rostock und Trelleborg in beide Richtungen.<\/p>\n      <p><a href=\"\/de\/tt-line\/\">Mehr \u00fcber TT Line<\/a><\/p>\n    <\/div>\n  <\/div>\n\n  <div class=\"fd-content-block\">\n    <h2>\u00dcber die F\u00e4hrverbindung Rostock Trelleborg<\/h2>\n    <p>\u00dcberfahrten am Tag dauern meistens etwa 6 Stunden. Nachtfahrten k\u00f6nnen etwas l\u00e4nger dauern, abh\u00e4ngig vom Schiff und von der Abfahrtszeit. Die Route ist besonders praktisch f\u00fcr Reisende, die die Ostsee mit Auto, Wohnmobil, Motorrad oder Wohnwagen \u00fcberqueren m\u00f6chten.<\/p>\n    <p>Rostock ist ein praktischer Abfahrtshafen f\u00fcr Reisende aus Deutschland und Mitteleuropa. Trelleborg liegt in S\u00fcdschweden, mit guten Stra\u00dfenverbindungen nach Malm\u00f6, G\u00f6teborg, Stockholm und Norwegen.<\/p>\n  <\/div>\n\n  <div class=\"fd-content-block\">\n    <h2>N\u00fctzliche Informationen vor der Abfahrt<\/h2>\n    <p>Vor der \u00dcberfahrt zwischen Deutschland und Schweden k\u00f6nnen die folgenden Seiten hilfreich sein.<\/p>\n\n    <div class=\"fd-link-grid\">\n      <a href=\"\/de\/rostock-hafen\/\">Rostock Hafen<\/a>\n      <a href=\"\/de\/trelleborg-hafen\/\">Trelleborg Hafen<\/a>\n      <a href=\"\/de\/preise\/\">F\u00e4hrpreise<\/a>\n      <a href=\"\/de\/stena-line\/\">Stena Line<\/a>\n      <a href=\"\/de\/tt-line\/\">TT Line<\/a>\n    <\/div>\n  <\/div>\n\n  <section class=\"fd-faq\">\n    <h2>H\u00e4ufig gestellte Fragen<\/h2>\n\n    <div class=\"fd-faq-item\">\n      <h3>Wie lange dauert die F\u00e4hre von Rostock nach Trelleborg?<\/h3>\n      <p>Die meisten \u00dcberfahrten dauern etwa 6 Stunden. Einige Nachtfahrten dauern l\u00e4nger, meistens zwischen 7 und 8 Stunden.<\/p>\n    <\/div>\n\n    <div class=\"fd-faq-item\">\n      <h3>Welche Reedereien fahren zwischen Rostock und Trelleborg?<\/h3>\n      <p>Die Route wird von Stena Line und TT Line betrieben. Beide Anbieter bieten regelm\u00e4\u00dfige Abfahrten zwischen Deutschland und Schweden an.<\/p>\n    <\/div>\n\n    <div class=\"fd-faq-item\">\n      <h3>Gibt es heute eine F\u00e4hre von Rostock nach Trelleborg?<\/h3>\n      <p>Ja. An den meisten Tagen verkehren mehrere F\u00e4hren von Rostock nach Trelleborg. Die aktuellen Abfahrtszeiten finden Sie im Fahrplan auf dieser Seite.<\/p>\n    <\/div>\n\n    <div class=\"fd-faq-item\">\n      <h3>Gibt es heute eine F\u00e4hre von Trelleborg nach Rostock?<\/h3>\n      <p>Ja. Auch in Richtung Trelleborg nach Rostock gibt es an den meisten Tagen mehrere Abfahrten. Der aktuelle Fahrplan zeigt die n\u00e4chsten Verbindungen.<\/p>\n    <\/div>\n\n    <div class=\"fd-faq-item\">\n      <h3>Gibt es Nachtf\u00e4hren von Rostock nach Trelleborg?<\/h3>\n      <p>Ja. In beide Richtungen sind h\u00e4ufig Nachtfahrten verf\u00fcgbar. Das kann praktisch sein f\u00fcr Reisende, die fr\u00fch am Morgen ankommen m\u00f6chten.<\/p>\n    <\/div>\n\n    <div class=\"fd-faq-item\">\n      <h3>Wie viele t\u00e4gliche Abfahrten gibt es zwischen Rostock und Trelleborg?<\/h3>\n      <p>Die Anzahl der Abfahrten variiert je nach Datum und Saison, aber der Fahrplan zeigt h\u00e4ufig etwa 6 bis 8 Abfahrten pro Tag \u00fcber beide Anbieter hinweg.<\/p>\n    <\/div>\n\n    <div class=\"fd-faq-item\">\n      <h3>Was kostet die F\u00e4hre von Rostock nach Trelleborg?<\/h3>\n      <p>Die Preise variieren je nach Saison, Fahrzeug und Verf\u00fcgbarkeit. Weitere Informationen finden Sie auf unserer Seite \u00fcber <a href=\"\/de\/preise\/\">F\u00e4hrpreise<\/a>.<\/p>\n    <\/div>\n\n    <div class=\"fd-faq-item\">\n      <h3>Kann ich mein Auto auf der F\u00e4hre mitnehmen?<\/h3>\n      <p>Ja. Sowohl Stena Line als auch TT Line bef\u00f6rdern Autos, Wohnmobile, Motorr\u00e4der und Wohnwagen auf der Route zwischen Rostock und Trelleborg.<\/p>\n    <\/div>\n  <\/section>\n\n<\/div>\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\":\"https:\/\/schema.org\",\n  \"@type\":\"FAQPage\",\n  \"mainEntity\":[\n    {\n      \"@type\":\"Question\",\n      \"name\":\"Wie lange dauert die F\u00e4hre von Rostock nach Trelleborg?\",\n      \"acceptedAnswer\":{\n        \"@type\":\"Answer\",\n        \"text\":\"Die meisten \u00dcberfahrten dauern etwa 6 Stunden. Einige Nachtfahrten dauern l\u00e4nger, meistens zwischen 7 und 8 Stunden.\"\n      }\n    },\n    {\n      \"@type\":\"Question\",\n      \"name\":\"Welche Reedereien fahren zwischen Rostock und Trelleborg?\",\n      \"acceptedAnswer\":{\n        \"@type\":\"Answer\",\n        \"text\":\"Die Route wird von Stena Line und TT Line betrieben. Beide Anbieter bieten regelm\u00e4\u00dfige Abfahrten zwischen Deutschland und Schweden an.\"\n      }\n    },\n    {\n      \"@type\":\"Question\",\n      \"name\":\"Gibt es heute eine F\u00e4hre von Rostock nach Trelleborg?\",\n      \"acceptedAnswer\":{\n        \"@type\":\"Answer\",\n        \"text\":\"Ja. An den meisten Tagen verkehren mehrere F\u00e4hren von Rostock nach Trelleborg. Die aktuellen Abfahrtszeiten finden Sie im Fahrplan auf dieser Seite.\"\n      }\n    },\n    {\n      \"@type\":\"Question\",\n      \"name\":\"Gibt es heute eine F\u00e4hre von Trelleborg nach Rostock?\",\n      \"acceptedAnswer\":{\n        \"@type\":\"Answer\",\n        \"text\":\"Ja. Auch in Richtung Trelleborg nach Rostock gibt es an den meisten Tagen mehrere Abfahrten. Der aktuelle Fahrplan zeigt die n\u00e4chsten Verbindungen.\"\n      }\n    },\n    {\n      \"@type\":\"Question\",\n      \"name\":\"Gibt es Nachtf\u00e4hren von Rostock nach Trelleborg?\",\n      \"acceptedAnswer\":{\n        \"@type\":\"Answer\",\n        \"text\":\"Ja. In beide Richtungen sind h\u00e4ufig Nachtfahrten verf\u00fcgbar. Das kann praktisch sein f\u00fcr Reisende, die fr\u00fch am Morgen ankommen m\u00f6chten.\"\n      }\n    },\n    {\n      \"@type\":\"Question\",\n      \"name\":\"Wie viele t\u00e4gliche Abfahrten gibt es zwischen Rostock und Trelleborg?\",\n      \"acceptedAnswer\":{\n        \"@type\":\"Answer\",\n        \"text\":\"Die Anzahl der Abfahrten variiert je nach Datum und Saison, aber der Fahrplan zeigt h\u00e4ufig etwa 6 bis 8 Abfahrten pro Tag \u00fcber beide Anbieter hinweg.\"\n      }\n    },\n    {\n      \"@type\":\"Question\",\n      \"name\":\"Was kostet die F\u00e4hre von Rostock nach Trelleborg?\",\n      \"acceptedAnswer\":{\n        \"@type\":\"Answer\",\n        \"text\":\"Die Preise variieren je nach Saison, Fahrzeug und Verf\u00fcgbarkeit. Weitere Informationen finden Sie auf der Seite \u00fcber F\u00e4hrpreise.\"\n      }\n    },\n    {\n      \"@type\":\"Question\",\n      \"name\":\"Kann ich mein Auto auf der F\u00e4hre mitnehmen?\",\n      \"acceptedAnswer\":{\n        \"@type\":\"Answer\",\n        \"text\":\"Ja. Sowohl Stena Line als auch TT Line bef\u00f6rdern Autos, Wohnmobile, Motorr\u00e4der und Wohnwagen auf der Route zwischen Rostock und Trelleborg.\"\n      }\n    }\n  ]\n}\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Die F\u00e4hre von Rostock nach Trelleborg verbindet Norddeutschland mit S\u00fcdschweden. Auf dieser Seite finden Sie den aktuellen Fahrplan f\u00fcr die [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-104","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>F\u00e4hre Rostock Trelleborg Fahrplan | TT Line &amp; Stena Line<\/title>\n<meta name=\"description\" content=\"Aktueller Fahrplan der F\u00e4hre Rostock Trelleborg. Vergleichen Sie Abfahrten von TT Line und Stena Line zwischen Deutschland und Schweden.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rostocktrelleborg.com\/de\/fahrplan\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"F\u00e4hre Rostock Trelleborg Fahrplan | TT Line &amp; Stena Line\" \/>\n<meta property=\"og:description\" content=\"Aktueller Fahrplan der F\u00e4hre Rostock Trelleborg. Vergleichen Sie Abfahrten von TT Line und Stena Line zwischen Deutschland und Schweden.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rostocktrelleborg.com\/de\/fahrplan\/\" \/>\n<meta property=\"og:site_name\" content=\"F\u00e4hren von Rostock nach Trelleborg\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-10T13:32:05+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data1\" content=\"2\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/fahrplan\\\/\",\"url\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/fahrplan\\\/\",\"name\":\"F\u00e4hre Rostock Trelleborg Fahrplan | TT Line & Stena Line\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/#website\"},\"datePublished\":\"2024-04-30T09:26:35+00:00\",\"dateModified\":\"2026-06-10T13:32:05+00:00\",\"description\":\"Aktueller Fahrplan der F\u00e4hre Rostock Trelleborg. Vergleichen Sie Abfahrten von TT Line und Stena Line zwischen Deutschland und Schweden.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/fahrplan\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/fahrplan\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/fahrplan\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"F\u00e4hre Rostock Trelleborg Fahrplan\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/\",\"name\":\"F\u00e4hren von Rostock nach Trelleborg\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/#organization\",\"name\":\"F\u00e4hren von Rostock nach Trelleborg\",\"url\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/wp-content\\\/uploads\\\/sites\\\/3\\\/2026\\\/06\\\/rostocktrelleborg-ferry-logo.png\",\"contentUrl\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/wp-content\\\/uploads\\\/sites\\\/3\\\/2026\\\/06\\\/rostocktrelleborg-ferry-logo.png\",\"width\":512,\"height\":154,\"caption\":\"F\u00e4hren von Rostock nach Trelleborg\"},\"image\":{\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"F\u00e4hre Rostock Trelleborg Fahrplan | TT Line & Stena Line","description":"Aktueller Fahrplan der F\u00e4hre Rostock Trelleborg. Vergleichen Sie Abfahrten von TT Line und Stena Line zwischen Deutschland und Schweden.","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:\/\/rostocktrelleborg.com\/de\/fahrplan\/","og_locale":"de_DE","og_type":"article","og_title":"F\u00e4hre Rostock Trelleborg Fahrplan | TT Line & Stena Line","og_description":"Aktueller Fahrplan der F\u00e4hre Rostock Trelleborg. Vergleichen Sie Abfahrten von TT Line und Stena Line zwischen Deutschland und Schweden.","og_url":"https:\/\/rostocktrelleborg.com\/de\/fahrplan\/","og_site_name":"F\u00e4hren von Rostock nach Trelleborg","article_modified_time":"2026-06-10T13:32:05+00:00","twitter_card":"summary_large_image","twitter_misc":{"Gesch\u00e4tzte Lesezeit":"2\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/rostocktrelleborg.com\/de\/fahrplan\/","url":"https:\/\/rostocktrelleborg.com\/de\/fahrplan\/","name":"F\u00e4hre Rostock Trelleborg Fahrplan | TT Line & Stena Line","isPartOf":{"@id":"https:\/\/rostocktrelleborg.com\/de\/#website"},"datePublished":"2024-04-30T09:26:35+00:00","dateModified":"2026-06-10T13:32:05+00:00","description":"Aktueller Fahrplan der F\u00e4hre Rostock Trelleborg. Vergleichen Sie Abfahrten von TT Line und Stena Line zwischen Deutschland und Schweden.","breadcrumb":{"@id":"https:\/\/rostocktrelleborg.com\/de\/fahrplan\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rostocktrelleborg.com\/de\/fahrplan\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/rostocktrelleborg.com\/de\/fahrplan\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rostocktrelleborg.com\/de\/"},{"@type":"ListItem","position":2,"name":"F\u00e4hre Rostock Trelleborg Fahrplan"}]},{"@type":"WebSite","@id":"https:\/\/rostocktrelleborg.com\/de\/#website","url":"https:\/\/rostocktrelleborg.com\/de\/","name":"F\u00e4hren von Rostock nach Trelleborg","description":"","publisher":{"@id":"https:\/\/rostocktrelleborg.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rostocktrelleborg.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/rostocktrelleborg.com\/de\/#organization","name":"F\u00e4hren von Rostock nach Trelleborg","url":"https:\/\/rostocktrelleborg.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/rostocktrelleborg.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/rostocktrelleborg.com\/de\/wp-content\/uploads\/sites\/3\/2026\/06\/rostocktrelleborg-ferry-logo.png","contentUrl":"https:\/\/rostocktrelleborg.com\/de\/wp-content\/uploads\/sites\/3\/2026\/06\/rostocktrelleborg-ferry-logo.png","width":512,"height":154,"caption":"F\u00e4hren von Rostock nach Trelleborg"},"image":{"@id":"https:\/\/rostocktrelleborg.com\/de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/rostocktrelleborg.com\/de\/wp-json\/wp\/v2\/pages\/104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rostocktrelleborg.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rostocktrelleborg.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rostocktrelleborg.com\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/rostocktrelleborg.com\/de\/wp-json\/wp\/v2\/comments?post=104"}],"version-history":[{"count":5,"href":"https:\/\/rostocktrelleborg.com\/de\/wp-json\/wp\/v2\/pages\/104\/revisions"}],"predecessor-version":[{"id":167,"href":"https:\/\/rostocktrelleborg.com\/de\/wp-json\/wp\/v2\/pages\/104\/revisions\/167"}],"wp:attachment":[{"href":"https:\/\/rostocktrelleborg.com\/de\/wp-json\/wp\/v2\/media?parent=104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}