{"id":52,"date":"2024-05-15T09:43:37","date_gmt":"2024-05-15T09:43:37","guid":{"rendered":"https:\/\/rostocktrelleborg.com\/no\/?page_id=52"},"modified":"2026-11-13T12:37:24","modified_gmt":"2026-11-13T12:37:24","slug":"tt-line","status":"publish","type":"page","link":"https:\/\/rostocktrelleborg.com\/no\/tt-line\/","title":{"rendered":"TT Line Trelleborg Rostock rutetider"},"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 rutetider: avganger og ankomst i dag<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">N&aring;r TT Line g&aring;r fra Trelleborg og Rostock i dag, hvor lang tid det tar og hva du b&oslash;r vite f&oslash;r du bestiller.<\/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 TIMER &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=\"\/no\/go\/ttout\" method=\"get\" target=\"_blank\" rel=\"nofollow sponsored noopener\">\n<div class=\"rtf-field\">\n<label for=\"rtf-from\">Fra<\/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\">Til<\/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\">Dato<\/label>\n<input id=\"rtf-date\" name=\"date\" type=\"date\">\n<\/div>\n<button type=\"submit\">S&oslash;k avganger<\/button>\n<\/form>\n<p class=\"rtf-book-note\">Priser og tilgjengelighet 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\">Ruten<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">150 km over &Oslash;sters&oslash;en<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fra Trelleborg helt s&oslash;r i Sverige til Rostock p&aring; den tyske &oslash;sters&oslash;kysten. I Sverige kj&oslash;rer du E6. I Tyskland g&aring;r A19 mot Berlin og A20 mot Hamburg.<\/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\">Innsjekking<\/p>\n\n\n\n<p class=\"rtf-stat\">60&ndash;90<span> MIN<\/span><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">F&oslash;r avgang<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">V&aelig;r der 60 til 90 minutter f&oslash;r avgang. Med bobil, campingvogn eller henger b&oslash;r du komme litt tidligere.<\/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\">Det andre rederiet<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Stena Line p&aring; samme rute<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Stena Line kj&oslash;rer samme rute. Se <a href=\"\/no\/stena-line\/\">rutetidene til Stena Line<\/a> f&oslash;r du velger avgang.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group rtf-main is-layout-flow wp-block-group-is-layout-flow\">\n<p class=\"wp-block-paragraph\">To rederier kj\u00f8rer mellom Trelleborg og Rostock: TT Line og Stena Line. Denne siden viser bare avgangene til TT Line. Under tidene ser du hvor lang tid overfarten tar, hva som finnes om bord, hva det koster og hvor du sjekker inn.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TT Line rutetider i dag: Trelleborg til Rostock<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">De neste avgangene til TT Line fra Trelleborg til Rostock, med ankomsttid. Listen oppdateres av seg selv.<\/p>\n\n\n<div class=\"tp-wrap tp-theme-extended_cards tp-day-setup-modern\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/rostocktrelleborg.com\\\/no\\\/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;modern&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;Dato&quot;,&quot;ui_days&quot;:&quot;Dager&quot;,&quot;ui_button&quot;:&quot;Vis avganger&quot;,&quot;status_idle&quot;:&quot;Velg en dato og klikk p\\u00e5 Vis avganger&quot;,&quot;status_loading&quot;:&quot;Laster...&quot;,&quot;status_empty&quot;:&quot;Ingen avganger funnet&quot;,&quot;status_found&quot;:&quot;%d avganger funnet&quot;,&quot;th_date&quot;:&quot;Dato&quot;,&quot;th_dep&quot;:&quot;Avgang&quot;,&quot;th_arr&quot;:&quot;Ankomst&quot;,&quot;th_dur&quot;:&quot;Varighet&quot;,&quot;th_ship&quot;:&quot;Skip&quot;,&quot;th_op&quot;:&quot;Operat\\u00f8r&quot;,&quot;th_route&quot;:&quot;Rute&quot;,&quot;wd_sun&quot;:&quot;S\\u00d8N&quot;,&quot;wd_mon&quot;:&quot;MAN&quot;,&quot;wd_tue&quot;:&quot;TIR&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\\u00d8R&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Se alle %s avganger i rutetabellen v\\u00e5r&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Se flere avganger for %1$s og %2$s i rutetabellen v\\u00e5r&quot;,&quot;summary_footer_generic&quot;:&quot;Sjekk rutetabellen v\\u00e5r for flere avganger&quot;,&quot;summary_header&quot;:&quot;De to neste avgangene:&quot;,&quot;summary_no_upcoming&quot;:&quot;Ingen kommende avganger funnet&quot;,&quot;more_link&quot;:&quot;Flere avganger&quot;,&quot;more_departures_button&quot;:&quot;Vis flere avganger&quot;,&quot;day_nav_previous&quot;:&quot;Vis forrige dag&quot;,&quot;day_nav_next&quot;:&quot;Vis neste dag&quot;,&quot;day_nav_today&quot;:&quot;Vis i dag&quot;,&quot;day_nav_tomorrow&quot;:&quot;Vis i morgen&quot;,&quot;local_time_pair&quot;:&quot;Lokal tid avgangshavn: %1$s \\\/ Lokal tid ankomsthavn: %2$s&quot;,&quot;local_time_combined&quot;:&quot;Lokal tid avgangs- og ankomsthavn: %s&quot;,&quot;tag_often_booked&quot;:&quot;\\u2b50 Ofte bestilt&quot;,&quot;tag_leaving_soon&quot;:&quot;\\ud83d\\udd34 G\\u00e5r snart&quot;,&quot;tag_currently_sailing&quot;:&quot;\\ud83d\\udfe2 P\\u00e5 vei n\\u00e5&quot;,&quot;tag_arrived&quot;:&quot;\\u26ab Ankommet&quot;,&quot;tag_overnight&quot;:&quot;Over natten&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\">Dato<\/label><br>\n      <input id=\"tp-date-ops\" class=\"tp-date\" type=\"date\" aria-label=\"Dato\">\n    <\/div>\n    <div class=\"tp-day-field\">\n      <label for=\"tp-range-ops\">Dager<\/label><br>\n      <select id=\"tp-range-ops\" class=\"tp-range\" aria-label=\"Dager\">\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\">Vis avganger<\/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\">Velg en dato og klikk p\u00e5 Vis avganger<\/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\">Laster...<\/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 rutetider i dag: Rostock til Trelleborg<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Og andre veien, fra Tyskland tilbake til Sverige.<\/p>\n\n\n<div class=\"tp-wrap tp-theme-extended_cards tp-day-setup-modern\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/rostocktrelleborg.com\\\/no\\\/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;modern&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;Dato&quot;,&quot;ui_days&quot;:&quot;Dager&quot;,&quot;ui_button&quot;:&quot;Vis avganger&quot;,&quot;status_idle&quot;:&quot;Velg en dato og klikk p\\u00e5 Vis avganger&quot;,&quot;status_loading&quot;:&quot;Laster...&quot;,&quot;status_empty&quot;:&quot;Ingen avganger funnet&quot;,&quot;status_found&quot;:&quot;%d avganger funnet&quot;,&quot;th_date&quot;:&quot;Dato&quot;,&quot;th_dep&quot;:&quot;Avgang&quot;,&quot;th_arr&quot;:&quot;Ankomst&quot;,&quot;th_dur&quot;:&quot;Varighet&quot;,&quot;th_ship&quot;:&quot;Skip&quot;,&quot;th_op&quot;:&quot;Operat\\u00f8r&quot;,&quot;th_route&quot;:&quot;Rute&quot;,&quot;wd_sun&quot;:&quot;S\\u00d8N&quot;,&quot;wd_mon&quot;:&quot;MAN&quot;,&quot;wd_tue&quot;:&quot;TIR&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\\u00d8R&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Se alle %s avganger i rutetabellen v\\u00e5r&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Se flere avganger for %1$s og %2$s i rutetabellen v\\u00e5r&quot;,&quot;summary_footer_generic&quot;:&quot;Sjekk rutetabellen v\\u00e5r for flere avganger&quot;,&quot;summary_header&quot;:&quot;De to neste avgangene:&quot;,&quot;summary_no_upcoming&quot;:&quot;Ingen kommende avganger funnet&quot;,&quot;more_link&quot;:&quot;Flere avganger&quot;,&quot;more_departures_button&quot;:&quot;Vis flere avganger&quot;,&quot;day_nav_previous&quot;:&quot;Vis forrige dag&quot;,&quot;day_nav_next&quot;:&quot;Vis neste dag&quot;,&quot;day_nav_today&quot;:&quot;Vis i dag&quot;,&quot;day_nav_tomorrow&quot;:&quot;Vis i morgen&quot;,&quot;local_time_pair&quot;:&quot;Lokal tid avgangshavn: %1$s \\\/ Lokal tid ankomsthavn: %2$s&quot;,&quot;local_time_combined&quot;:&quot;Lokal tid avgangs- og ankomsthavn: %s&quot;,&quot;tag_often_booked&quot;:&quot;\\u2b50 Ofte bestilt&quot;,&quot;tag_leaving_soon&quot;:&quot;\\ud83d\\udd34 G\\u00e5r snart&quot;,&quot;tag_currently_sailing&quot;:&quot;\\ud83d\\udfe2 P\\u00e5 vei n\\u00e5&quot;,&quot;tag_arrived&quot;:&quot;\\u26ab Ankommet&quot;,&quot;tag_overnight&quot;:&quot;Over natten&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\">Dato<\/label><br>\n      <input id=\"tp-date-ops\" class=\"tp-date\" type=\"date\" aria-label=\"Dato\">\n    <\/div>\n    <div class=\"tp-day-field\">\n      <label for=\"tp-range-ops\">Dager<\/label><br>\n      <select id=\"tp-range-ops\" class=\"tp-range\" aria-label=\"Dager\">\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\">Vis avganger<\/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\">Velg en dato og klikk p\u00e5 Vis avganger<\/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\">Laster...<\/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=\"\/no\/go\/ttout\" target=\"_blank\" rel=\"nofollow sponsored noopener\">Se priser og ledige plasser<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Vil du se TT Line og Stena Line ved siden av hverandre? Se hele <a href=\"\/no\/rutetider\/\">rutetabellen<\/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 denne ruten<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Rute<\/strong><\/td><td>Trelleborg (Sverige) til Rostock (Tyskland)<\/td><\/tr><tr><td><strong>Overfartstid<\/strong><\/td><td>omtrent 6 timer, om natten 7 til 8 timer<\/td><\/tr><tr><td><strong>Avstand<\/strong><\/td><td>rundt 150 kilometer over \u00d8stersj\u00f8en<\/td><\/tr><tr><td><strong>Avganger<\/strong><\/td><td>hver dag, i begge retninger, hele \u00e5ret<\/td><\/tr><tr><td><strong>Kj\u00f8ret\u00f8y<\/strong><\/td><td>bil, bobil, campingvogn, motorsykkel og lastebil<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Hvor lang tid tar TT Line-fergen?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Omtrent <strong>6 timer<\/strong> p\u00e5 dagtid. Om natten tar det som regel 7 til 8 timer, slik at du kommer fram tidlig om morgenen og ikke midt p\u00e5 natten. Vind og b\u00f8lger p\u00e5 \u00d8stersj\u00f8en kan gj\u00f8re turen litt lengre. Rutetabellen over viser planlagt ankomst for hver avgang.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Om bord<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Det varierer litt fra skip til skip, men som regel finner du sitteplasser, restaurant, bar og butikk. Lugarer finnes p\u00e5 noen avganger, mest om natten. P\u00e5 en nattavgang er en lugar verdt pengene.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Med hund<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Kj\u00e6ledyr kan som regel v\u00e6re med. Hva som er lov, kommer an p\u00e5 skipet og billetten, og noen avganger har lugarer der dyr kan bo. Sp\u00f8r TT Line n\u00e5r du bestiller. Sverige og Tyskland har ogs\u00e5 egne regler for dyr (ID-merking, rabiesvaksine og papirer). Ordne dette i god tid f\u00f8r du reiser.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hva koster TT Line?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Det finnes ingen fast pris. Det kommer an p\u00e5 kj\u00f8ret\u00f8yet (lengde og h\u00f8yde), hvor mange dere er, datoen, hvor tidlig du bestiller og om du tar lugar. Sommer, ferier og helger koster mer. Stena Line kj\u00f8rer samme rute, s\u00e5 se p\u00e5 begge. Mer p\u00e5 siden om <a href=\"\/no\/priser\/\">priser<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hvor TT Line g\u00e5r fra<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I Trelleborg g\u00e5r TT Line fra fergehavnen midt i byen, ved E6. Du sjekker inn p\u00e5 Norra Nyhamnsgatan 1b. I Rostock kommer du til fergeterminalen i \u00dcberseehafen, ikke i Warnem\u00fcnde.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">V\u00e6r der 60 til 90 minutter f\u00f8r avgang, og litt tidligere med stort kj\u00f8ret\u00f8y eller om sommeren.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"\/no\/trelleborg-havn\/\">Trelleborg havn<\/a>: adresse og webkamera<\/li>\n\n\n\n<li><a href=\"\/no\/rostock-havn\/\">Rostock havn<\/a>: adresse og veibeskrivelse<\/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\">Begge bruker omtrent like lang tid p\u00e5 samme rute. De fleste velger avgangen som passer best, eller den billigste p\u00e5 sin dato. Se ogs\u00e5 <a href=\"\/no\/stena-line\/\">rutetidene til Stena Line<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Om h\u00f8sten og vinteren kan storm p\u00e5 \u00d8stersj\u00f8en gi forsinkelser eller innstilte avganger. Sjekk <a href=\"\/no\/vaermelding\/\">v\u00e6rmeldingen<\/a> f\u00f8r du drar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sp\u00f8rsm\u00e5l om TT Line<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">G\u00e5r TT Line i dag?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">De fleste dager, ja, i begge retninger. Dagens avganger st\u00e5r i rutetabellen over.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hvor lang tid tar TT Line-fergen?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Omtrent 6 timer p\u00e5 dagtid, som regel 7 til 8 timer om natten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">G\u00e5r TT Line fra Warnem\u00fcnde?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nei. Fergene til Trelleborg g\u00e5r fra \u00dcberseehafen i Rostock. Warnem\u00fcnde brukes av cruiseskip.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kan jeg ta med bobil eller campingvogn?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ja. Prisen avhenger av lengde og h\u00f8yde, s\u00e5 m\u00e5l kj\u00f8ret\u00f8yet med takboks og sykkelstativ f\u00f8r du bestiller.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Finnes det lugarer?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">P\u00e5 noen avganger, mest om natten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hvor tidlig m\u00e5 jeg v\u00e6re i terminalen?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">60 til 90 minutter f\u00f8r avgang, litt tidligere med stort kj\u00f8ret\u00f8y eller om sommeren.<\/p>\n\n\n\n<script type=\"application\/ld+json\">\n{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"G\u00e5r TT Line i dag?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"De fleste dager, ja, i begge retninger. Dagens avganger st\u00e5r i rutetabellen p\u00e5 denne siden.\"}},{\"@type\":\"Question\",\"name\":\"Hvor lang tid tar TT Line-fergen?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Omtrent 6 timer p\u00e5 dagtid, som regel 7 til 8 timer om natten.\"}},{\"@type\":\"Question\",\"name\":\"G\u00e5r TT Line fra Warnem\u00fcnde?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Nei. Fergene til Trelleborg g\u00e5r fra \u00dcberseehafen i Rostock. Warnem\u00fcnde brukes av cruiseskip.\"}},{\"@type\":\"Question\",\"name\":\"Kan jeg ta med bobil eller campingvogn?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Ja. Prisen avhenger av lengde og h\u00f8yde, s\u00e5 m\u00e5l kj\u00f8ret\u00f8yet med takboks og sykkelstativ f\u00f8r du bestiller.\"}},{\"@type\":\"Question\",\"name\":\"Finnes det lugarer?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"P\u00e5 noen avganger, mest om natten.\"}},{\"@type\":\"Question\",\"name\":\"Hvor tidlig m\u00e5 jeg v\u00e6re i terminalen?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"60 til 90 minutter f\u00f8r avgang, litt tidligere med stort kj\u00f8ret\u00f8y eller om sommeren.\"}}]}\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\">Sammenlign<\/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\">To rederier p&aring; samme strekning. Sjekk begge for datoen din f&oslash;r du bestemmer deg.<\/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=\"\/no\/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\">Overfart<\/p>\n\n\n\n<p class=\"rtf-stat\">6<span> TIMER<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">P&aring; dagtid. Om natten 7 til 8 timer, slik at du kommer fram tidlig om morgenen.<\/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\">Nyttige sider<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"\/no\/rutetider\/\">Alle rutetider<\/a><\/li>\n\n\n\n<li><a href=\"\/no\/priser\/\">Priser<\/a><\/li>\n\n\n\n<li><a href=\"\/no\/stena-line\/\">Stena Line<\/a><\/li>\n\n\n\n<li><a href=\"\/no\/trelleborg-havn\/\">Trelleborg havn<\/a><\/li>\n\n\n\n<li><a href=\"\/no\/rostock-havn\/\">Rostock havn<\/a><\/li>\n\n\n\n<li><a href=\"\/no\/vaermelding\/\">V&aelig;rmelding<\/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\">Bestill<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Velg avgang<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">&Aring; bestille tidlig er som regel billigere p&aring; denne ruten.<\/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=\"\/no\/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 rutetider: avganger og ankomst i dag N&aring;r TT Line g&aring;r [&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 Trelleborg Rostock rutetider | Avganger i dag og priser","_yoast_wpseo_metadesc":"TT Line rutetider Trelleborg\u2013Rostock: dagens avganger og ankomst i begge retninger, hvor lang tid fergen tar, lugarer, priser og innsjekking.","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-52","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TT Line Trelleborg Rostock rutetider | Avganger i dag og priser<\/title>\n<meta name=\"description\" content=\"TT Line rutetider Trelleborg\u2013Rostock: dagens avganger og ankomst i begge retninger, hvor lang tid fergen tar, lugarer, priser og innsjekking.\" \/>\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\/no\/tt-line\/\" \/>\n<meta property=\"og:locale\" content=\"nb_NO\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TT Line Trelleborg Rostock rutetider | Avganger i dag og priser\" \/>\n<meta property=\"og:description\" content=\"TT Line rutetider Trelleborg\u2013Rostock: dagens avganger og ankomst i begge retninger, hvor lang tid fergen tar, lugarer, priser og innsjekking.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rostocktrelleborg.com\/no\/tt-line\/\" \/>\n<meta property=\"og:site_name\" content=\"Rostock Trelleborg Ferge\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-13T12:37:24+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Ansl. lesetid\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/no\\\/tt-line\\\/\",\"url\":\"https:\\\/\\\/rostocktrelleborg.com\\\/no\\\/tt-line\\\/\",\"name\":\"TT Line Trelleborg Rostock rutetider | Avganger i dag og priser\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/no\\\/#website\"},\"datePublished\":\"2024-05-15T09:43:37+00:00\",\"dateModified\":\"2026-11-13T12:37:24+00:00\",\"description\":\"TT Line rutetider Trelleborg\u2013Rostock: dagens avganger og ankomst i begge retninger, hvor lang tid fergen tar, lugarer, priser og innsjekking.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/no\\\/tt-line\\\/#breadcrumb\"},\"inLanguage\":\"nb-NO\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rostocktrelleborg.com\\\/no\\\/tt-line\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/no\\\/tt-line\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rostocktrelleborg.com\\\/no\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TT Line Trelleborg Rostock rutetider\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rostocktrelleborg.com\\\/no\\\/#website\",\"url\":\"https:\\\/\\\/rostocktrelleborg.com\\\/no\\\/\",\"name\":\"Rostock Trelleborg Ferge\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rostocktrelleborg.com\\\/no\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nb-NO\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"TT Line Trelleborg Rostock rutetider | Avganger i dag og priser","description":"TT Line rutetider Trelleborg\u2013Rostock: dagens avganger og ankomst i begge retninger, hvor lang tid fergen tar, lugarer, priser og innsjekking.","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\/no\/tt-line\/","og_locale":"nb_NO","og_type":"article","og_title":"TT Line Trelleborg Rostock rutetider | Avganger i dag og priser","og_description":"TT Line rutetider Trelleborg\u2013Rostock: dagens avganger og ankomst i begge retninger, hvor lang tid fergen tar, lugarer, priser og innsjekking.","og_url":"https:\/\/rostocktrelleborg.com\/no\/tt-line\/","og_site_name":"Rostock Trelleborg Ferge","article_modified_time":"2026-11-13T12:37:24+00:00","twitter_card":"summary_large_image","twitter_misc":{"Ansl. lesetid":"2 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/rostocktrelleborg.com\/no\/tt-line\/","url":"https:\/\/rostocktrelleborg.com\/no\/tt-line\/","name":"TT Line Trelleborg Rostock rutetider | Avganger i dag og priser","isPartOf":{"@id":"https:\/\/rostocktrelleborg.com\/no\/#website"},"datePublished":"2024-05-15T09:43:37+00:00","dateModified":"2026-11-13T12:37:24+00:00","description":"TT Line rutetider Trelleborg\u2013Rostock: dagens avganger og ankomst i begge retninger, hvor lang tid fergen tar, lugarer, priser og innsjekking.","breadcrumb":{"@id":"https:\/\/rostocktrelleborg.com\/no\/tt-line\/#breadcrumb"},"inLanguage":"nb-NO","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rostocktrelleborg.com\/no\/tt-line\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/rostocktrelleborg.com\/no\/tt-line\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rostocktrelleborg.com\/no\/"},{"@type":"ListItem","position":2,"name":"TT Line Trelleborg Rostock rutetider"}]},{"@type":"WebSite","@id":"https:\/\/rostocktrelleborg.com\/no\/#website","url":"https:\/\/rostocktrelleborg.com\/no\/","name":"Rostock Trelleborg Ferge","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rostocktrelleborg.com\/no\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nb-NO"}]}},"_links":{"self":[{"href":"https:\/\/rostocktrelleborg.com\/no\/wp-json\/wp\/v2\/pages\/52","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rostocktrelleborg.com\/no\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rostocktrelleborg.com\/no\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rostocktrelleborg.com\/no\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/rostocktrelleborg.com\/no\/wp-json\/wp\/v2\/comments?post=52"}],"version-history":[{"count":8,"href":"https:\/\/rostocktrelleborg.com\/no\/wp-json\/wp\/v2\/pages\/52\/revisions"}],"predecessor-version":[{"id":211,"href":"https:\/\/rostocktrelleborg.com\/no\/wp-json\/wp\/v2\/pages\/52\/revisions\/211"}],"wp:attachment":[{"href":"https:\/\/rostocktrelleborg.com\/no\/wp-json\/wp\/v2\/media?parent=52"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}