{"id":73,"date":"2024-05-01T08:57:18","date_gmt":"2024-05-01T08:57:18","guid":{"rendered":"https:\/\/rostocktrelleborg.com\/se\/?page_id=73"},"modified":"2026-09-23T08:45:39","modified_gmt":"2026-09-23T08:45:39","slug":"tt-line","status":"publish","type":"page","link":"https:\/\/rostocktrelleborg.com\/se\/tt-line\/","title":{"rendered":"TT Line Trelleborg Rostock tidtabell"},"content":{"rendered":"\n<div class=\"wp-block-group rtf-hero is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group rtf-hero-inner is-layout-flow wp-block-group-is-layout-flow\">\n<p class=\"rtf-kicker wp-block-paragraph\">TT Line &middot; Trelleborg &rarr; Rostock<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">TT Line Trelleborg Rostock tidtabell<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">TT Line k&ouml;r str&auml;ckan &aring;ret runt, dag som natt. H&auml;r hittar du rederiets avg&aring;ngar, fartygen och det du beh&ouml;ver veta innan du rullar ombord i Trelleborg.<\/p>\n\n\n\n<div class=\"rtf-route\">\n<span class=\"rtf-route-port\"><small>TRG<\/small><strong>Trelleborg<\/strong><\/span>\n<span class=\"rtf-route-line\"><span>6 TIM &middot; 150 KM<\/span><\/span>\n<span class=\"rtf-route-port\"><small>ROS<\/small><strong>Rostock<\/strong><\/span>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group rtf-book is-layout-flow wp-block-group-is-layout-flow\">\n<form action=\"\/se\/go\/ttout\" method=\"get\" target=\"_blank\" rel=\"nofollow sponsored noopener\">\n<div class=\"rtf-field\">\n<label for=\"rtf-from\">Fr&aring;n<\/label>\n<select id=\"rtf-from\" name=\"from\"><option value=\"trelleborg\">Trelleborg (Sverige)<\/option><option value=\"rostock\">Rostock (Tyskland)<\/option><\/select>\n<\/div>\n<div class=\"rtf-field\">\n<label for=\"rtf-to\">Till<\/label>\n<select id=\"rtf-to\" name=\"to\"><option value=\"rostock\">Rostock (Tyskland)<\/option><option value=\"trelleborg\">Trelleborg (Sverige)<\/option><\/select>\n<\/div>\n<div class=\"rtf-field\">\n<label for=\"rtf-date\">Datum<\/label>\n<input id=\"rtf-date\" name=\"date\" type=\"date\">\n<\/div>\n<button type=\"submit\">S&ouml;k avg&aring;ngar<\/button>\n<\/form>\n<p class=\"rtf-book-note\">Priser och tillg&auml;nglighet via Direct Ferries<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group rtf-cols is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group rtf-rail-left is-layout-flow wp-block-group-is-layout-flow\">\n<p class=\"rtf-kicker wp-block-paragraph\">Rutten<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">150 km &ouml;ver &Ouml;stersj&ouml;n<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fr&aring;n Trelleborg till Rostock &auml;r det omkring 150 kilometer sj&ouml;v&auml;gen. R&auml;kna med cirka sex timmar ombord, n&aring;got mer p&aring; nattavg&aring;ngarna.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"rtf-kicker wp-block-paragraph\">Incheckning<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Var p&aring; plats i tid<\/h3>\n\n\n\n<p class=\"rtf-stat\">60&ndash;90<span> MIN<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S&aring; l&aring;ng tid f&ouml;re avg&aring;ng b&ouml;r du vara i terminalen. Med husbil, husvagn eller sl&auml;p b&ouml;r du r&auml;kna med mer.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"rtf-kicker wp-block-paragraph\">Alternativet<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Stena Line p&aring; samma rutt<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">TT Line &auml;r inte ensamt om str&auml;ckan. Se <a href=\"\/se\/stena-line\/\">Stena Lines tidtabell<\/a> innan du best&auml;mmer dig, eller <a href=\"\/se\/tidtabell\/\">b&aring;da rederierna sida vid sida<\/a>.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group rtf-main is-layout-flow wp-block-group-is-layout-flow\">\n\n\n<p class=\"wp-block-paragraph\">TT Line \u00e4r ett av tv\u00e5 rederier p\u00e5 rutten Trelleborg Rostock, vid sidan av Stena Line. Nedan hittar du den aktuella TT Line tidtabellen i b\u00e5da riktningarna, f\u00f6ljt av \u00f6verfartstid, vad som finns ombord, priser och information om terminalerna.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TT Line tidtabell: Trelleborg till Rostock<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Det h\u00e4r \u00e4r de n\u00e4rmaste TT Line avg\u00e5ngarna fr\u00e5n Trelleborg till Rostock. Tiderna uppdateras automatiskt och visar endast TT Line avg\u00e5ngar.<\/p>\n\n\n<div class=\"tp-wrap tp-theme-extended_cards tp-day-setup-classic\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/rostocktrelleborg.com\\\/se\\\/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;36&quot;],&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Datum&quot;,&quot;ui_days&quot;:&quot;Dagar&quot;,&quot;ui_button&quot;:&quot;Visa avg\\u00e5ngar&quot;,&quot;status_idle&quot;:&quot;V\\u00e4lj ett datum och klicka p\\u00e5 Visa avg\\u00e5ngar&quot;,&quot;status_loading&quot;:&quot;Laddar...&quot;,&quot;status_empty&quot;:&quot;Inga avg\\u00e5ngar hittades&quot;,&quot;status_found&quot;:&quot;%d avg\\u00e5ngar hittades&quot;,&quot;th_date&quot;:&quot;Datum&quot;,&quot;th_dep&quot;:&quot;Avg\\u00e5ng&quot;,&quot;th_arr&quot;:&quot;Ankomst&quot;,&quot;th_dur&quot;:&quot;Restid&quot;,&quot;th_ship&quot;:&quot;Fartyg&quot;,&quot;th_op&quot;:&quot;Operat\\u00f6r&quot;,&quot;th_route&quot;:&quot;Rutt&quot;,&quot;wd_sun&quot;:&quot;S\\u00d6N&quot;,&quot;wd_mon&quot;:&quot;M\\u00c5N&quot;,&quot;wd_tue&quot;:&quot;TIS&quot;,&quot;wd_wed&quot;:&quot;ONS&quot;,&quot;wd_thu&quot;:&quot;TOR&quot;,&quot;wd_fri&quot;:&quot;FRE&quot;,&quot;wd_sat&quot;:&quot;L\\u00d6R&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Se alla %s avg\\u00e5ngar i v\\u00e5r tidtabell&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Se fler avg\\u00e5ngar f\\u00f6r %1$s och %2$s i v\\u00e5r tidtabell&quot;,&quot;summary_footer_generic&quot;:&quot;Se v\\u00e5r tidtabell f\\u00f6r fler avg\\u00e5ngar&quot;,&quot;summary_header&quot;:&quot;De tv\\u00e5 n\\u00e4sta avg\\u00e5ngarna:&quot;,&quot;summary_no_upcoming&quot;:&quot;Inga kommande avg\\u00e5ngar hittades&quot;,&quot;more_link&quot;:&quot;Fler avg\\u00e5ngar&quot;,&quot;more_departures_button&quot;:&quot;Visa fler avg\\u00e5ngar&quot;,&quot;day_nav_previous&quot;:&quot;Visa f\\u00f6reg\\u00e5ende dag&quot;,&quot;day_nav_next&quot;:&quot;Visa n\\u00e4sta dag&quot;,&quot;day_nav_today&quot;:&quot;Visa idag&quot;,&quot;day_nav_tomorrow&quot;:&quot;Visa imorgon&quot;,&quot;local_time_pair&quot;:&quot;Lokal tid avg\\u00e5ngshamn: %1$s \\\/ Lokal tid ankomsthamn: %2$s&quot;,&quot;local_time_combined&quot;:&quot;Lokal tid avg\\u00e5ngs- och ankomsthamn: %s&quot;,&quot;tag_often_booked&quot;:&quot;\\u2b50 Ofta bokad&quot;,&quot;tag_leaving_soon&quot;:&quot;\\ud83d\\udd34 Avg\\u00e5r snart&quot;,&quot;tag_currently_sailing&quot;:&quot;\\ud83d\\udfe2 P\\u00e5 v\\u00e4g nu&quot;,&quot;tag_arrived&quot;:&quot;\\u26ab Anl\\u00e4nt&quot;,&quot;tag_overnight&quot;:&quot;\\u00d6vernattning&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\">Dagar<\/label><br>\n      <select id=\"tp-range-ops\" class=\"tp-range\" aria-label=\"Dagar\">\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\">Visa avg\u00e5ngar<\/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\">V\u00e4lj ett datum och klicka p\u00e5 Visa avg\u00e5ngar<\/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\">Laddar...<\/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 => ({'&':'&amp;','<':'&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\n\n\n<h2 class=\"wp-block-heading\">TT Line tidtabell: Rostock till Trelleborg<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00f6r resan tillbaka fr\u00e5n Tyskland till Sverige hittar du de aktuella TT Line avg\u00e5ngarna fr\u00e5n Rostock till Trelleborg h\u00e4r.<\/p>\n\n\n<div class=\"tp-wrap tp-theme-extended_cards tp-day-setup-classic\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/rostocktrelleborg.com\\\/se\\\/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;36&quot;],&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Datum&quot;,&quot;ui_days&quot;:&quot;Dagar&quot;,&quot;ui_button&quot;:&quot;Visa avg\\u00e5ngar&quot;,&quot;status_idle&quot;:&quot;V\\u00e4lj ett datum och klicka p\\u00e5 Visa avg\\u00e5ngar&quot;,&quot;status_loading&quot;:&quot;Laddar...&quot;,&quot;status_empty&quot;:&quot;Inga avg\\u00e5ngar hittades&quot;,&quot;status_found&quot;:&quot;%d avg\\u00e5ngar hittades&quot;,&quot;th_date&quot;:&quot;Datum&quot;,&quot;th_dep&quot;:&quot;Avg\\u00e5ng&quot;,&quot;th_arr&quot;:&quot;Ankomst&quot;,&quot;th_dur&quot;:&quot;Restid&quot;,&quot;th_ship&quot;:&quot;Fartyg&quot;,&quot;th_op&quot;:&quot;Operat\\u00f6r&quot;,&quot;th_route&quot;:&quot;Rutt&quot;,&quot;wd_sun&quot;:&quot;S\\u00d6N&quot;,&quot;wd_mon&quot;:&quot;M\\u00c5N&quot;,&quot;wd_tue&quot;:&quot;TIS&quot;,&quot;wd_wed&quot;:&quot;ONS&quot;,&quot;wd_thu&quot;:&quot;TOR&quot;,&quot;wd_fri&quot;:&quot;FRE&quot;,&quot;wd_sat&quot;:&quot;L\\u00d6R&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Se alla %s avg\\u00e5ngar i v\\u00e5r tidtabell&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Se fler avg\\u00e5ngar f\\u00f6r %1$s och %2$s i v\\u00e5r tidtabell&quot;,&quot;summary_footer_generic&quot;:&quot;Se v\\u00e5r tidtabell f\\u00f6r fler avg\\u00e5ngar&quot;,&quot;summary_header&quot;:&quot;De tv\\u00e5 n\\u00e4sta avg\\u00e5ngarna:&quot;,&quot;summary_no_upcoming&quot;:&quot;Inga kommande avg\\u00e5ngar hittades&quot;,&quot;more_link&quot;:&quot;Fler avg\\u00e5ngar&quot;,&quot;more_departures_button&quot;:&quot;Visa fler avg\\u00e5ngar&quot;,&quot;day_nav_previous&quot;:&quot;Visa f\\u00f6reg\\u00e5ende dag&quot;,&quot;day_nav_next&quot;:&quot;Visa n\\u00e4sta dag&quot;,&quot;day_nav_today&quot;:&quot;Visa idag&quot;,&quot;day_nav_tomorrow&quot;:&quot;Visa imorgon&quot;,&quot;local_time_pair&quot;:&quot;Lokal tid avg\\u00e5ngshamn: %1$s \\\/ Lokal tid ankomsthamn: %2$s&quot;,&quot;local_time_combined&quot;:&quot;Lokal tid avg\\u00e5ngs- och ankomsthamn: %s&quot;,&quot;tag_often_booked&quot;:&quot;\\u2b50 Ofta bokad&quot;,&quot;tag_leaving_soon&quot;:&quot;\\ud83d\\udd34 Avg\\u00e5r snart&quot;,&quot;tag_currently_sailing&quot;:&quot;\\ud83d\\udfe2 P\\u00e5 v\\u00e4g nu&quot;,&quot;tag_arrived&quot;:&quot;\\u26ab Anl\\u00e4nt&quot;,&quot;tag_overnight&quot;:&quot;\\u00d6vernattning&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\">Dagar<\/label><br>\n      <select id=\"tp-range-ops\" class=\"tp-range\" aria-label=\"Dagar\">\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\">Visa avg\u00e5ngar<\/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\">V\u00e4lj ett datum och klicka p\u00e5 Visa avg\u00e5ngar<\/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\">Laddar...<\/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 => ({'&':'&amp;','<':'&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\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"\/se\/go\/ttout\" target=\"_blank\" rel=\"nofollow sponsored noopener\">Kontrollera priser och tillg\u00e4nglighet<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Vill du j\u00e4mf\u00f6ra TT Line och Stena Line sida vid sida, anv\u00e4nd den gemensamma <a href=\"\/se\/tidtabell\/\">tidtabellen f\u00f6r f\u00e4rjan Rostock Trelleborg<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">TT Line p\u00e5 denna rutt i korthet<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Rutt<\/strong><\/td><td>Trelleborg (Sverige) \u2013 Rostock (Tyskland)<\/td><\/tr><tr><td><strong>\u00d6verfartstid<\/strong><\/td><td>cirka 6 timmar, nattavg\u00e5ngar l\u00e4ngre<\/td><\/tr><tr><td><strong>Avst\u00e5nd<\/strong><\/td><td>ungef\u00e4r 150 kilometer \u00f6ver \u00d6stersj\u00f6n<\/td><\/tr><tr><td><strong>Avg\u00e5ngar<\/strong><\/td><td>dagligen, i b\u00e5da riktningarna, \u00e5ret runt<\/td><\/tr><tr><td><strong>Fordon<\/strong><\/td><td>bil, husbil, husvagn, motorcykel, lastbil<\/td><\/tr><tr><td><strong>Andra rederiet<\/strong><\/td><td><a href=\"\/se\/stena-line\/\">Stena Line<\/a><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Hur l\u00e5ng tid tar \u00f6verfarten med TT Line?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En \u00f6verfart med TT Line mellan Trelleborg och Rostock tar ungef\u00e4r <strong>6 timmar<\/strong>. Dagavg\u00e5ngar ligger oftast n\u00e4ra den tiden. Nattavg\u00e5ngar tar ofta l\u00e4ngre tid, eftersom tidtabellen \u00e4r anpassad till ankomst tidigt p\u00e5 morgonen snarare \u00e4n kortast m\u00f6jliga restid.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Den faktiska restiden beror p\u00e5 fartyg, avg\u00e5ngstid och f\u00f6rh\u00e5llandena p\u00e5 \u00d6stersj\u00f6n. Kraftig vind eller h\u00f6g sj\u00f6 kan f\u00f6rl\u00e4nga \u00f6verfarten. Den planerade ankomsttiden f\u00f6r din avg\u00e5ng ser du i tidtabellen ovan.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ombord p\u00e5 en TT Line f\u00e4rja<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Utbudet varierar mellan fartygen, men p\u00e5 denna rutt kan du i regel r\u00e4kna med sittplatser, restaurang eller buff\u00e9, bar, butik och hytter p\u00e5 vissa avg\u00e5ngar. P\u00e5 en nattavg\u00e5ng \u00e4r det hytten som avg\u00f6r om du kommer fram utvilad.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">TT Line \u00e4r v\u00e4letablerat bland husbilsresen\u00e4rer och inom godstrafiken p\u00e5 den h\u00e4r \u00f6verfarten, s\u00e5 fordonsd\u00e4cken \u00e4r anpassade \u00e4ven f\u00f6r st\u00f6rre fordon.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Resa med hund eller annat husdjur<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Husdjur kan i regel f\u00f6lja med p\u00e5 denna rutt. Villkoren beror p\u00e5 fartyg och biljettyp, och vissa avg\u00e5ngar har hytter d\u00e4r husdjur \u00e4r v\u00e4lkomna. Eftersom regler och utbud \u00e4ndras, bekr\u00e4fta de aktuella villkoren vid bokningen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ut\u00f6ver rederiets egna regler g\u00e4ller inf\u00f6rselkrav f\u00f6r djur i b\u00e5de Sverige och Tyskland, bland annat om id-m\u00e4rkning, rabiesvaccination och dokument. Kontrollera det i god tid f\u00f6re resan, inte vid terminalen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TT Line priser<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Det finns inget fast pris. Vad du betalar beror p\u00e5:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>fordonet du tar med, r\u00e4knat p\u00e5 l\u00e4ngd och h\u00f6jd<\/li>\n\n\n\n<li>hur m\u00e5nga som reser med dig<\/li>\n\n\n\n<li>resdatum, d\u00e4r h\u00f6gs\u00e4song, lov och helger kostar mer<\/li>\n\n\n\n<li>hur tidigt du bokar<\/li>\n\n\n\n<li>om du l\u00e4gger till hytt<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Eftersom Stena Line trafikerar samma rutt l\u00f6nar det sig att j\u00e4mf\u00f6ra b\u00e5da f\u00f6re bokning. En \u00f6versikt finns p\u00e5 sidan om <a href=\"\/se\/priser\/\">f\u00e4rjepriser<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Terminaler och incheckning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">TT Line avg\u00e5r fr\u00e5n f\u00e4rjeterminalen i Trelleborgs hamn och ankommer till f\u00e4rjeterminalen i Rostocks hamn. B\u00e5da terminalerna \u00e4r skyltade fr\u00e5n infartsv\u00e4garna: E6 p\u00e5 den svenska sidan och A19 p\u00e5 den tyska.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e4kna med minst 60 till 90 minuter f\u00f6re avg\u00e5ng f\u00f6r incheckning, och mer med husbil, sl\u00e4p eller under h\u00f6gs\u00e4song. Stora fordon lastas ofta f\u00f6rst eller sist, s\u00e5 det l\u00f6nar sig att vara i god tid.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"\/se\/trelleborg-hamn\/\">Trelleborgs hamn<\/a> \u2013 adress, v\u00e4gbeskrivning och terminal<\/li>\n\n\n\n<li><a href=\"\/se\/rostock-hamn\/\">Rostocks hamn<\/a> \u2013 adress, v\u00e4gbeskrivning, incheckning och parkering<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">TT Line eller Stena Line?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">B\u00e5da rederierna trafikerar samma rutt p\u00e5 ungef\u00e4r samma tid. Valet handlar d\u00e4rf\u00f6r oftast om vilken avg\u00e5ngstid som passar din resa och vad priset \u00e4r p\u00e5 just dina datum. Den som har fasta tider v\u00e4ljer efter avg\u00e5ng, den som \u00e4r flexibel v\u00e4ljer efter pris.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">V\u00e4rt att kontrollera b\u00e5da: <a href=\"\/se\/stena-line\/\">Stena Line Trelleborg Rostock tidtabell<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">F\u00f6re avg\u00e5ng<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00f6rh\u00e5llandena p\u00e5 \u00d6stersj\u00f6n p\u00e5verkar komforten och ibland tidtabellen. Under h\u00f6sten och vintern kan stormvarningar leda till f\u00f6rseningar eller inst\u00e4llda avg\u00e5ngar. Kontrollera <a href=\"\/se\/vaderprognos\/\">v\u00e4derprognosen f\u00f6r \u00f6verfarten<\/a> f\u00f6re avresa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vanliga fr\u00e5gor<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Var hittar jag TT Line tidtabell f\u00f6r Trelleborg Rostock?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">De aktuella TT Line avg\u00e5ngarna i b\u00e5da riktningarna visas h\u00f6gst upp p\u00e5 denna sida och uppdateras automatiskt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hur l\u00e5ng tid tar f\u00e4rjan med TT Line?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ungef\u00e4r 6 timmar. Nattavg\u00e5ngar tar l\u00e4ngre tid eftersom de \u00e4r planerade f\u00f6r ankomst tidigt p\u00e5 morgonen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">G\u00e5r TT Line idag?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">De flesta dagar ja, i b\u00e5da riktningarna. Dagens avg\u00e5ngar visas i tidtabellen ovan.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kan jag ta med husbil eller husvagn?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ja. Priset baseras p\u00e5 fordonets l\u00e4ngd och h\u00f6jd, s\u00e5 m\u00e4t inklusive takbox och cykelh\u00e5llare innan du bokar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Finns det hytter?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Hytter erbjuds p\u00e5 vissa avg\u00e5ngar, framf\u00f6r allt nattavg\u00e5ngar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hur tidigt beh\u00f6ver jag vara vid terminalen?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Minst 60 till 90 minuter f\u00f6re avg\u00e5ng, och tidigare med stort fordon eller under h\u00f6gs\u00e4song.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vilket \u00e4r b\u00e4st, TT Line eller Stena Line?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Inget av dem \u00e4r generellt b\u00e4st. B\u00e5da trafikerar samma rutt p\u00e5 ungef\u00e4r samma tid, s\u00e5 j\u00e4mf\u00f6r avg\u00e5ngstider och priser p\u00e5 dina egna resdatum.<\/p>\n\n\n\n<script type=\"application\/ld+json\">\n{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Var hittar jag TT Line tidtabell f\u00f6r Trelleborg Rostock?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"De aktuella TT Line avg\u00e5ngarna i b\u00e5da riktningarna visas p\u00e5 denna sida och uppdateras automatiskt.\"}},{\"@type\":\"Question\",\"name\":\"Hur l\u00e5ng tid tar f\u00e4rjan med TT Line?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Ungef\u00e4r 6 timmar. Nattavg\u00e5ngar tar l\u00e4ngre tid eftersom de \u00e4r planerade f\u00f6r ankomst tidigt p\u00e5 morgonen.\"}},{\"@type\":\"Question\",\"name\":\"G\u00e5r TT Line idag?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"De flesta dagar ja, i b\u00e5da riktningarna. Dagens avg\u00e5ngar visas i tidtabellen p\u00e5 denna sida.\"}},{\"@type\":\"Question\",\"name\":\"Kan jag ta med husbil eller husvagn?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Ja. Priset baseras p\u00e5 fordonets l\u00e4ngd och h\u00f6jd.\"}},{\"@type\":\"Question\",\"name\":\"Finns det hytter?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Hytter erbjuds p\u00e5 vissa avg\u00e5ngar, framf\u00f6r allt nattavg\u00e5ngar.\"}},{\"@type\":\"Question\",\"name\":\"Hur tidigt beh\u00f6ver jag vara vid terminalen?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Minst 60 till 90 minuter f\u00f6re avg\u00e5ng, och tidigare med stort fordon eller under h\u00f6gs\u00e4song.\"}},{\"@type\":\"Question\",\"name\":\"Vilket \u00e4r b\u00e4st, TT Line eller Stena Line?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Inget av dem \u00e4r generellt b\u00e4st. B\u00e5da trafikerar samma rutt p\u00e5 ungef\u00e4r samma tid.\"}}]}\n<\/script>\n<\/div>\n\n\n\n<div class=\"wp-block-group rtf-rail-right is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group rtf-convert is-layout-flow wp-block-group-is-layout-flow\">\n<p class=\"rtf-kicker wp-block-paragraph\">J&auml;mf&ouml;r<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">TT Line mot Stena Line<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tv&aring; rederier, samma str&auml;cka, olika priss&auml;ttning. Se vad b&aring;da tar f&ouml;r ditt datum och fordon.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"\/se\/go\/ttout\" target=\"_blank\" rel=\"nofollow sponsored noopener\">Se priser<\/a><\/div>\n<\/div>\n<\/div>\n\n\n\n<p class=\"rtf-kicker wp-block-paragraph\">&Ouml;verfartstid<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dag eller natt<\/h3>\n\n\n\n<p class=\"rtf-stat\">6<span> TIM<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dagavg&aring;ngarna ligger n&auml;ra sex timmar. Nattavg&aring;ngarna tar oftast 7 till 8 timmar, planerade f&ouml;r ankomst tidigt p&aring; morgonen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"rtf-kicker wp-block-paragraph\">P&aring; sajten<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Nyttiga sidor<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"\/se\/tidtabell\/\">Tidtabell f&ouml;r b&aring;da rederierna<\/a><\/li>\n\n\n\n<li><a href=\"\/se\/priser\/\">Priser och vad som p&aring;verkar dem<\/a><\/li>\n\n\n\n<li><a href=\"\/se\/stena-line\/\">Stena Line<\/a><\/li>\n\n\n\n<li><a href=\"\/se\/trelleborg-hamn\/\">Trelleborgs hamn<\/a><\/li>\n\n\n\n<li><a href=\"\/se\/rostock-hamn\/\">Rostocks hamn<\/a><\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-group rtf-convert rtf-sticky is-layout-flow wp-block-group-is-layout-flow\">\n<p class=\"rtf-kicker wp-block-paragraph\">Boka<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Snart ombord?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Att boka tidigt &auml;r n&auml;stan alltid billigare p&aring; den h&auml;r rutten.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"\/se\/go\/ttout\" target=\"_blank\" rel=\"nofollow sponsored noopener\">Se priser<\/a><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>TT Line &middot; Trelleborg &rarr; Rostock TT Line Trelleborg Rostock tidtabell TT Line k&ouml;r str&auml;ckan &aring;ret runt, dag som natt. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_yoast_wpseo_title":"TT Line tidtabell Trelleborg Rostock | Avg\u00e5ngar","_yoast_wpseo_metadesc":"Aktuella TT Line-avg\u00e5ngar mellan Trelleborg och Rostock i b\u00e5da riktningarna, plus \u00f6verfartstid, hytter, husbilsregler och incheckningstider.","inline_featured_image":false,"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"unboxed","site-sidebar-style":"unboxed","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":"disabled","ast-breadcrumbs-content":"disabled","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-73","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TT Line tidtabell Trelleborg Rostock | Avg\u00e5ngar<\/title>\n<meta name=\"description\" content=\"Aktuella TT Line-avg\u00e5ngar mellan Trelleborg och Rostock i b\u00e5da riktningarna, plus \u00f6verfartstid, hytter, husbilsregler och incheckningstider.\" \/>\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\/se\/tt-line\/\" \/>\n<meta property=\"og:locale\" content=\"sv_SE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TT Line tidtabell Trelleborg Rostock | Avg\u00e5ngar\" \/>\n<meta property=\"og:description\" content=\"Aktuella TT Line-avg\u00e5ngar mellan Trelleborg och Rostock i b\u00e5da riktningarna, plus \u00f6verfartstid, hytter, husbilsregler och incheckningstider.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rostocktrelleborg.com\/se\/tt-line\/\" \/>\n<meta property=\"og:site_name\" content=\"Rostock Trelleborg F\u00e4rja\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-23T08:45:39+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Ber\u00e4knad l\u00e4stid\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minuter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/se\\\/tt-line\\\/\",\"url\":\"https:\\\/\\\/rostocktrelleborg.com\\\/se\\\/tt-line\\\/\",\"name\":\"TT Line tidtabell Trelleborg Rostock | Avg\u00e5ngar\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/se\\\/#website\"},\"datePublished\":\"2024-05-01T08:57:18+00:00\",\"dateModified\":\"2026-09-23T08:45:39+00:00\",\"description\":\"Aktuella TT Line-avg\u00e5ngar mellan Trelleborg och Rostock i b\u00e5da riktningarna, plus \u00f6verfartstid, hytter, husbilsregler och incheckningstider.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/se\\\/tt-line\\\/#breadcrumb\"},\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rostocktrelleborg.com\\\/se\\\/tt-line\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/se\\\/tt-line\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rostocktrelleborg.com\\\/se\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TT Line Trelleborg Rostock tidtabell\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/se\\\/#website\",\"url\":\"https:\\\/\\\/rostocktrelleborg.com\\\/se\\\/\",\"name\":\"Rostock Trelleborg F\u00e4rja\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rostocktrelleborg.com\\\/se\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"sv-SE\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"TT Line tidtabell Trelleborg Rostock | Avg\u00e5ngar","description":"Aktuella TT Line-avg\u00e5ngar mellan Trelleborg och Rostock i b\u00e5da riktningarna, plus \u00f6verfartstid, hytter, husbilsregler och incheckningstider.","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\/se\/tt-line\/","og_locale":"sv_SE","og_type":"article","og_title":"TT Line tidtabell Trelleborg Rostock | Avg\u00e5ngar","og_description":"Aktuella TT Line-avg\u00e5ngar mellan Trelleborg och Rostock i b\u00e5da riktningarna, plus \u00f6verfartstid, hytter, husbilsregler och incheckningstider.","og_url":"https:\/\/rostocktrelleborg.com\/se\/tt-line\/","og_site_name":"Rostock Trelleborg F\u00e4rja","article_modified_time":"2026-09-23T08:45:39+00:00","twitter_card":"summary_large_image","twitter_misc":{"Ber\u00e4knad l\u00e4stid":"2 minuter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/rostocktrelleborg.com\/se\/tt-line\/","url":"https:\/\/rostocktrelleborg.com\/se\/tt-line\/","name":"TT Line tidtabell Trelleborg Rostock | Avg\u00e5ngar","isPartOf":{"@id":"https:\/\/rostocktrelleborg.com\/se\/#website"},"datePublished":"2024-05-01T08:57:18+00:00","dateModified":"2026-09-23T08:45:39+00:00","description":"Aktuella TT Line-avg\u00e5ngar mellan Trelleborg och Rostock i b\u00e5da riktningarna, plus \u00f6verfartstid, hytter, husbilsregler och incheckningstider.","breadcrumb":{"@id":"https:\/\/rostocktrelleborg.com\/se\/tt-line\/#breadcrumb"},"inLanguage":"sv-SE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rostocktrelleborg.com\/se\/tt-line\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/rostocktrelleborg.com\/se\/tt-line\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rostocktrelleborg.com\/se\/"},{"@type":"ListItem","position":2,"name":"TT Line Trelleborg Rostock tidtabell"}]},{"@type":"WebSite","@id":"https:\/\/rostocktrelleborg.com\/se\/#website","url":"https:\/\/rostocktrelleborg.com\/se\/","name":"Rostock Trelleborg F\u00e4rja","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rostocktrelleborg.com\/se\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"sv-SE"}]}},"_links":{"self":[{"href":"https:\/\/rostocktrelleborg.com\/se\/wp-json\/wp\/v2\/pages\/73","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rostocktrelleborg.com\/se\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rostocktrelleborg.com\/se\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rostocktrelleborg.com\/se\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/rostocktrelleborg.com\/se\/wp-json\/wp\/v2\/comments?post=73"}],"version-history":[{"count":8,"href":"https:\/\/rostocktrelleborg.com\/se\/wp-json\/wp\/v2\/pages\/73\/revisions"}],"predecessor-version":[{"id":208,"href":"https:\/\/rostocktrelleborg.com\/se\/wp-json\/wp\/v2\/pages\/73\/revisions\/208"}],"wp:attachment":[{"href":"https:\/\/rostocktrelleborg.com\/se\/wp-json\/wp\/v2\/media?parent=73"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}