{"id":130,"date":"2025-01-28T14:21:29","date_gmt":"2025-01-28T14:21:29","guid":{"rendered":"https:\/\/holyhead-dublin.com\/ie\/?page_id=130"},"modified":"2025-12-12T12:37:32","modified_gmt":"2025-12-12T12:37:32","slug":"timetable","status":"publish","type":"page","link":"https:\/\/holyhead-dublin.com\/ie\/timetable\/","title":{"rendered":"Timetable"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"130\" class=\"elementor elementor-130\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-170c4e6c e-con-full e-flex e-con e-parent\" data-id=\"170c4e6c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-537ed0c1 e-con-full e-flex e-con e-child\" data-id=\"537ed0c1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ad3c5a9 elementor-widget elementor-widget-global elementor-global-3364 elementor-widget-breadcrumbs\" data-id=\"ad3c5a9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"breadcrumbs.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p id=\"breadcrumbs\"><span><span><a href=\"https:\/\/holyhead-dublin.com\/ie\/\">Home<\/a><\/span><\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-549c62c8 elementor-widget elementor-widget-heading\" data-id=\"549c62c8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Dublin-Holyhead<br>Ferry Timetable<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cc347fd elementor-widget elementor-widget-text-editor\" data-id=\"cc347fd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Stay up to date with all Dublin ferry departures and Holyhead arrivals. This page brings together the latest timetables from both Irish Ferries and Stena Line.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d211208 e-con-full e-flex e-con e-child\" data-id=\"d211208\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-209b6bce e-flex e-con-boxed e-con e-parent\" data-id=\"209b6bce\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5ec88fac elementor-widget elementor-widget-text-editor\" data-id=\"5ec88fac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #ff0000;\">\u25cf\u00a0 <\/span>The fast catamaran ferry of Irish Ferries, the <strong>Dublin Swift<\/strong>, is currently out of service on this route. It will resume operation as summer approaches.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-587601b e-flex e-con-boxed e-con e-parent\" data-id=\"587601b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e3cc362 elementor-widget elementor-widget-text-editor\" data-id=\"e3cc362\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #44b7b5;\">Timetable Dublin Ferry Port<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c143d4f elementor-widget elementor-widget-text-editor\" data-id=\"c143d4f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2>Dublin Departures<\/h2><p>Below is the schedule for the ferries departing from Dublin and for the boats arriving in Dublin. This overview makes it easy to check current sailing times and plan your trip accordingly. All sailings shown here operate on the Dublin\u2013Holyhead route.\u00a0By adjusting the date, you can view <strong>scheduled<\/strong> sailings for the next day or any other day. In addition to the departures, you can also view the ferry arrivals in Holyhead.<\/p><p>\ud83d\udd34 Stormy weather or just worried about delays? <strong>Check the latest <a href=\"https:\/\/holyhead-dublin.com\/ie\/timetable\/sailing-updates\/\">sailing updates<\/a><\/strong>.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e43f45f elementor-widget__width-inherit e-n-tabs-mobile elementor-widget elementor-widget-n-tabs\" data-id=\"e43f45f\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;tabs_justify_horizontal&quot;:&quot;start&quot;,&quot;horizontal_scroll&quot;:&quot;disable&quot;}\" data-widget_type=\"nested-tabs.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"e-n-tabs\" data-widget-number=\"239334495\" aria-label=\"Tabs. Open items with Enter or Space, close with Escape and navigate using the Arrow keys.\">\n\t\t\t<div class=\"e-n-tabs-heading\" role=\"tablist\">\n\t\t\t\t\t<button id=\"e-n-tab-title-2393344951\" data-tab-title-id=\"e-n-tab-title-2393344951\" class=\"e-n-tab-title\" aria-selected=\"true\" data-tab-index=\"1\" role=\"tab\" tabindex=\"0\" aria-controls=\"e-n-tab-content-2393344951\" style=\"--n-tabs-title-order: 1;\">\n\t\t\t\t\t\t<span class=\"e-n-tab-title-text\">\n\t\t\t\tDublin Departures\t\t\t<\/span>\n\t\t<\/button>\n\t\t\t\t<button id=\"e-n-tab-title-2393344952\" data-tab-title-id=\"e-n-tab-title-2393344952\" class=\"e-n-tab-title\" aria-selected=\"false\" data-tab-index=\"2\" role=\"tab\" tabindex=\"-1\" aria-controls=\"e-n-tab-content-2393344952\" style=\"--n-tabs-title-order: 2;\">\n\t\t\t\t\t\t<span class=\"e-n-tab-title-text\">\n\t\t\t\tDublin Arrivals\t\t\t<\/span>\n\t\t<\/button>\n\t\t\t\t\t<\/div>\n\t\t\t<div class=\"e-n-tabs-content\">\n\t\t\t\t<div id=\"e-n-tab-content-2393344951\" role=\"tabpanel\" aria-labelledby=\"e-n-tab-title-2393344951\" data-tab-index=\"1\" style=\"--n-tabs-title-order: 1;\" class=\"e-active elementor-element elementor-element-57bb4d4 e-con-full e-flex e-con e-child\" data-id=\"57bb4d4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a318178 elementor-widget__width-inherit elementor-widget elementor-widget-shortcode\" data-id=\"a318178\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div class=\"tp-wrap\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;route&quot;:17,&quot;days&quot;:1,&quot;autoload&quot;:true,&quot;label&quot;:&quot;Dublin \\u21d2 Holyhead&quot;,&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Date&quot;,&quot;ui_days&quot;:&quot;Days&quot;,&quot;ui_button&quot;:&quot;Show sailings&quot;,&quot;status_idle&quot;:&quot;Pick a date and click Show sailings&quot;,&quot;status_loading&quot;:&quot;Loading...&quot;,&quot;status_empty&quot;:&quot;No sailings found&quot;,&quot;status_found&quot;:&quot;%d sailings found&quot;,&quot;th_date&quot;:&quot;Date&quot;,&quot;th_dep&quot;:&quot;Departure&quot;,&quot;th_arr&quot;:&quot;Arrival&quot;,&quot;th_dur&quot;:&quot;Duration&quot;,&quot;th_ship&quot;:&quot;Ship&quot;,&quot;th_op&quot;:&quot;Operator&quot;,&quot;th_route&quot;:&quot;Route&quot;,&quot;wd_sun&quot;:&quot;SUN&quot;,&quot;wd_mon&quot;:&quot;MON&quot;,&quot;wd_tue&quot;:&quot;TUE&quot;,&quot;wd_wed&quot;:&quot;WED&quot;,&quot;wd_thu&quot;:&quot;THU&quot;,&quot;wd_fri&quot;:&quot;FRI&quot;,&quot;wd_sat&quot;:&quot;SAT&quot;},&quot;showLogo&quot;:true,&quot;shipMap&quot;:[],&quot;shipLinks&quot;:{&quot;ulysses&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/ulysses\\\/&quot;,&quot;stena adventurer&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/stena-adventurer\\\/&quot;,&quot;james joyce&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/james-joyce\\\/&quot;,&quot;stena estrid&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/stena-estrid\\\/&quot;,&quot;dublin swift&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/dublin-swift\\\/&quot;}}\">\n  <div class=\"tp-controls\" role=\"group\" aria-label=\"Timetable controls\">\n    <div>\n      <label for=\"tp-date\">Date<\/label><br>\n      <input id=\"tp-date\" class=\"tp-date\" type=\"date\" aria-label=\"Date\">\n    <\/div>\n    <div>\n      <label for=\"tp-range\">Days<\/label><br>\n      <select id=\"tp-range\" class=\"tp-range\" aria-label=\"Days\">\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\" class=\"tp-btn\">Show sailings<\/button><\/div>\n  <\/div>\n\n  <div id=\"tp-status\" class=\"tp-muted\" aria-live=\"polite\">Pick a date and click Show sailings<\/div>\n  <div id=\"tp-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\">Loading...<\/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');\n  const daysEl = wrap.querySelector('#tp-range');\n  const btn    = wrap.querySelector('#tp-load');\n  const status = wrap.querySelector('#tp-status');\n  const out    = wrap.querySelector('#tp-results');\n  const loader = wrap.querySelector('.tp-loader');\n\n  dateEl.valueAsDate = new Date();\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'}); } \/\/ short, no year\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 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 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,op:L.th_op};\n    let html = '<table class=\"tp-table\"><thead><tr>'+\n      '<th>'+th.date+'<\/th><th>'+th.dep+'<\/th><th>'+th.arr+'<\/th><th>'+th.dur+'<\/th><th>'+th.ship+'<\/th><th>'+th.op+'<\/th>'+\n      '<\/tr><\/thead><tbody>';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      html += '<tr>'+\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span><\/td>'+\n        '<td>'+hhmm(r.dep)+'<\/td>'+\n        '<td>'+hhmm(r.arr)+'<\/td>'+\n        '<td>'+dur(r.min)+'<\/td>'+\n        '<td>'+shipBadge(r.ship)+'<\/td>'+\n        '<td>'+opCell(r)+'<\/td>'+\n      '<\/tr>';\n    });\n    html += '<\/tbody><\/table>';\n    return html;\n  }\n\n  function renderCards(rows){\n    const routeName = cfg.label || '';\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\">'+\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        \/\/ Row 2: Ship & Route (no prefixes)\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+shipBadge(r.ship)+'<\/div>'+\n          (routeName ? ('<div class=\"rhs\">'+routeName+'<\/div>') : '<div class=\"rhs\"><\/div>')+\n        '<\/div>'+\n        \/\/ Row 3: Operator (no book button)\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  async function load(){\n    btn.disabled = true; setLoader(true); status.textContent = L.status_loading;\n    const start = new Date(dateEl.value || new Date());\n    const days  = Math.max(1, parseInt(daysEl.value,10)||1);\n    const end   = new Date(start); end.setDate(start.getDate()+days-1);\n    const url = new URL(cfg.rest); url.searchParams.set('route', String(cfg.route));\n    url.searchParams.set('from', iso(start)); url.searchParams.set('to', iso(end));\n    try{\n      const res = await fetch(url.toString(), {credentials:'same-origin'});\n      if(!res.ok) throw new 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      const rows = list.map(t=>({\n        opId:t.operatorId||null, opName:t.operatorName||'', opLogo:t.operatorLogo||'', opLink:t.operatorLink||'',\n        dep:toLocal(t.departureTime), arr:toLocal(t.arrivalTime), min:t.durationInMinutes||0, ship:t.shipName||''\n      })).sort((a,b)=>a.dep-b.dep);\n      if(rows.length===0){ status.textContent = L.status_empty; out.innerHTML=''; return; }\n      status.textContent = (cfg.label? (cfg.label+': '):'') + (L.status_found||'%d sailings found').replace('%d', rows.length);\n      out.innerHTML = renderTable(rows) + renderCards(rows);\n    }catch(e){\n      status.textContent = 'Failed to load data'; out.innerHTML = '<pre>'+String(e.message||e)+'<\/pre>';\n    }finally{ setLoader(false); btn.disabled=false; }\n  }\n\n  btn.addEventListener('click', load);\n  if (cfg.autoload) load();\n})();\n<\/script>\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div id=\"e-n-tab-content-2393344952\" role=\"tabpanel\" aria-labelledby=\"e-n-tab-title-2393344952\" data-tab-index=\"2\" style=\"--n-tabs-title-order: 2;\" class=\" elementor-element elementor-element-5d37b7e e-con-full e-flex e-con e-child\" data-id=\"5d37b7e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-38d89b3 e-flex e-con-boxed e-con e-child\" data-id=\"38d89b3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f92dee9 elementor-widget__width-inherit elementor-widget elementor-widget-shortcode\" data-id=\"f92dee9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div class=\"tp-wrap\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;route&quot;:65,&quot;days&quot;:1,&quot;autoload&quot;:true,&quot;label&quot;:&quot;Holyhead \\u21d2 Dublin&quot;,&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Date&quot;,&quot;ui_days&quot;:&quot;Days&quot;,&quot;ui_button&quot;:&quot;Show sailings&quot;,&quot;status_idle&quot;:&quot;Pick a date and click Show sailings&quot;,&quot;status_loading&quot;:&quot;Loading...&quot;,&quot;status_empty&quot;:&quot;No sailings found&quot;,&quot;status_found&quot;:&quot;%d sailings found&quot;,&quot;th_date&quot;:&quot;Date&quot;,&quot;th_dep&quot;:&quot;Departure&quot;,&quot;th_arr&quot;:&quot;Arrival&quot;,&quot;th_dur&quot;:&quot;Duration&quot;,&quot;th_ship&quot;:&quot;Ship&quot;,&quot;th_op&quot;:&quot;Operator&quot;,&quot;th_route&quot;:&quot;Route&quot;,&quot;wd_sun&quot;:&quot;SUN&quot;,&quot;wd_mon&quot;:&quot;MON&quot;,&quot;wd_tue&quot;:&quot;TUE&quot;,&quot;wd_wed&quot;:&quot;WED&quot;,&quot;wd_thu&quot;:&quot;THU&quot;,&quot;wd_fri&quot;:&quot;FRI&quot;,&quot;wd_sat&quot;:&quot;SAT&quot;},&quot;showLogo&quot;:true,&quot;shipMap&quot;:[],&quot;shipLinks&quot;:{&quot;ulysses&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/ulysses\\\/&quot;,&quot;stena adventurer&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/stena-adventurer\\\/&quot;,&quot;james joyce&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/james-joyce\\\/&quot;,&quot;stena estrid&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/stena-estrid\\\/&quot;,&quot;dublin swift&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/dublin-swift\\\/&quot;}}\">\n  <div class=\"tp-controls\" role=\"group\" aria-label=\"Timetable controls\">\n    <div>\n      <label for=\"tp-date\">Date<\/label><br>\n      <input id=\"tp-date\" class=\"tp-date\" type=\"date\" aria-label=\"Date\">\n    <\/div>\n    <div>\n      <label for=\"tp-range\">Days<\/label><br>\n      <select id=\"tp-range\" class=\"tp-range\" aria-label=\"Days\">\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\" class=\"tp-btn\">Show sailings<\/button><\/div>\n  <\/div>\n\n  <div id=\"tp-status\" class=\"tp-muted\" aria-live=\"polite\">Pick a date and click Show sailings<\/div>\n  <div id=\"tp-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\">Loading...<\/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');\n  const daysEl = wrap.querySelector('#tp-range');\n  const btn    = wrap.querySelector('#tp-load');\n  const status = wrap.querySelector('#tp-status');\n  const out    = wrap.querySelector('#tp-results');\n  const loader = wrap.querySelector('.tp-loader');\n\n  dateEl.valueAsDate = new Date();\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'}); } \/\/ short, no year\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 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 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,op:L.th_op};\n    let html = '<table class=\"tp-table\"><thead><tr>'+\n      '<th>'+th.date+'<\/th><th>'+th.dep+'<\/th><th>'+th.arr+'<\/th><th>'+th.dur+'<\/th><th>'+th.ship+'<\/th><th>'+th.op+'<\/th>'+\n      '<\/tr><\/thead><tbody>';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      html += '<tr>'+\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span><\/td>'+\n        '<td>'+hhmm(r.dep)+'<\/td>'+\n        '<td>'+hhmm(r.arr)+'<\/td>'+\n        '<td>'+dur(r.min)+'<\/td>'+\n        '<td>'+shipBadge(r.ship)+'<\/td>'+\n        '<td>'+opCell(r)+'<\/td>'+\n      '<\/tr>';\n    });\n    html += '<\/tbody><\/table>';\n    return html;\n  }\n\n  function renderCards(rows){\n    const routeName = cfg.label || '';\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\">'+\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        \/\/ Row 2: Ship & Route (no prefixes)\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+shipBadge(r.ship)+'<\/div>'+\n          (routeName ? ('<div class=\"rhs\">'+routeName+'<\/div>') : '<div class=\"rhs\"><\/div>')+\n        '<\/div>'+\n        \/\/ Row 3: Operator (no book button)\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  async function load(){\n    btn.disabled = true; setLoader(true); status.textContent = L.status_loading;\n    const start = new Date(dateEl.value || new Date());\n    const days  = Math.max(1, parseInt(daysEl.value,10)||1);\n    const end   = new Date(start); end.setDate(start.getDate()+days-1);\n    const url = new URL(cfg.rest); url.searchParams.set('route', String(cfg.route));\n    url.searchParams.set('from', iso(start)); url.searchParams.set('to', iso(end));\n    try{\n      const res = await fetch(url.toString(), {credentials:'same-origin'});\n      if(!res.ok) throw new 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      const rows = list.map(t=>({\n        opId:t.operatorId||null, opName:t.operatorName||'', opLogo:t.operatorLogo||'', opLink:t.operatorLink||'',\n        dep:toLocal(t.departureTime), arr:toLocal(t.arrivalTime), min:t.durationInMinutes||0, ship:t.shipName||''\n      })).sort((a,b)=>a.dep-b.dep);\n      if(rows.length===0){ status.textContent = L.status_empty; out.innerHTML=''; return; }\n      status.textContent = (cfg.label? (cfg.label+': '):'') + (L.status_found||'%d sailings found').replace('%d', rows.length);\n      out.innerHTML = renderTable(rows) + renderCards(rows);\n    }catch(e){\n      status.textContent = 'Failed to load data'; out.innerHTML = '<pre>'+String(e.message||e)+'<\/pre>';\n    }finally{ setLoader(false); btn.disabled=false; }\n  }\n\n  btn.addEventListener('click', load);\n  if (cfg.autoload) load();\n})();\n<\/script>\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6aae53a e-flex e-con-boxed e-con e-parent\" data-id=\"6aae53a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-26d00ba0 elementor-widget elementor-widget-text-editor\" data-id=\"26d00ba0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Timetable Holyhead Ferry Port<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-028e954 elementor-widget elementor-widget-text-editor\" data-id=\"028e954\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2>Holyhead Departures<\/h2><p>There are usually at least seven daily departures from Holyhead, operated by both Stena Line and Irish Ferries. In the timetable below, you can view the scheduled sailings to Dublin for today.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-50c2d76 elementor-widget__width-inherit e-n-tabs-mobile elementor-widget elementor-widget-n-tabs\" data-id=\"50c2d76\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;tabs_justify_horizontal&quot;:&quot;start&quot;,&quot;horizontal_scroll&quot;:&quot;disable&quot;}\" data-widget_type=\"nested-tabs.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"e-n-tabs\" data-widget-number=\"84684150\" aria-label=\"Tabs. Open items with Enter or Space, close with Escape and navigate using the Arrow keys.\">\n\t\t\t<div class=\"e-n-tabs-heading\" role=\"tablist\">\n\t\t\t\t\t<button id=\"e-n-tab-title-846841501\" data-tab-title-id=\"e-n-tab-title-846841501\" class=\"e-n-tab-title\" aria-selected=\"true\" data-tab-index=\"1\" role=\"tab\" tabindex=\"0\" aria-controls=\"e-n-tab-content-846841501\" style=\"--n-tabs-title-order: 1;\">\n\t\t\t\t\t\t<span class=\"e-n-tab-title-text\">\n\t\t\t\tHolyhead Departures\t\t\t<\/span>\n\t\t<\/button>\n\t\t\t\t<button id=\"e-n-tab-title-846841502\" data-tab-title-id=\"e-n-tab-title-846841502\" class=\"e-n-tab-title\" aria-selected=\"false\" data-tab-index=\"2\" role=\"tab\" tabindex=\"-1\" aria-controls=\"e-n-tab-content-846841502\" style=\"--n-tabs-title-order: 2;\">\n\t\t\t\t\t\t<span class=\"e-n-tab-title-text\">\n\t\t\t\tHolyhead Arrivals\t\t\t<\/span>\n\t\t<\/button>\n\t\t\t\t\t<\/div>\n\t\t\t<div class=\"e-n-tabs-content\">\n\t\t\t\t<div id=\"e-n-tab-content-846841501\" role=\"tabpanel\" aria-labelledby=\"e-n-tab-title-846841501\" data-tab-index=\"1\" style=\"--n-tabs-title-order: 1;\" class=\"e-active elementor-element elementor-element-858bed6 e-con-full e-flex e-con e-child\" data-id=\"858bed6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f678fa3 elementor-widget__width-inherit elementor-widget elementor-widget-shortcode\" data-id=\"f678fa3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div class=\"tp-wrap\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;route&quot;:65,&quot;days&quot;:1,&quot;autoload&quot;:true,&quot;label&quot;:&quot;Holyhead \\u21d2 Dublin&quot;,&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Date&quot;,&quot;ui_days&quot;:&quot;Days&quot;,&quot;ui_button&quot;:&quot;Show sailings&quot;,&quot;status_idle&quot;:&quot;Pick a date and click Show sailings&quot;,&quot;status_loading&quot;:&quot;Loading...&quot;,&quot;status_empty&quot;:&quot;No sailings found&quot;,&quot;status_found&quot;:&quot;%d sailings found&quot;,&quot;th_date&quot;:&quot;Date&quot;,&quot;th_dep&quot;:&quot;Departure&quot;,&quot;th_arr&quot;:&quot;Arrival&quot;,&quot;th_dur&quot;:&quot;Duration&quot;,&quot;th_ship&quot;:&quot;Ship&quot;,&quot;th_op&quot;:&quot;Operator&quot;,&quot;th_route&quot;:&quot;Route&quot;,&quot;wd_sun&quot;:&quot;SUN&quot;,&quot;wd_mon&quot;:&quot;MON&quot;,&quot;wd_tue&quot;:&quot;TUE&quot;,&quot;wd_wed&quot;:&quot;WED&quot;,&quot;wd_thu&quot;:&quot;THU&quot;,&quot;wd_fri&quot;:&quot;FRI&quot;,&quot;wd_sat&quot;:&quot;SAT&quot;},&quot;showLogo&quot;:true,&quot;shipMap&quot;:[],&quot;shipLinks&quot;:{&quot;ulysses&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/ulysses\\\/&quot;,&quot;stena adventurer&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/stena-adventurer\\\/&quot;,&quot;james joyce&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/james-joyce\\\/&quot;,&quot;stena estrid&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/stena-estrid\\\/&quot;,&quot;dublin swift&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/dublin-swift\\\/&quot;}}\">\n  <div class=\"tp-controls\" role=\"group\" aria-label=\"Timetable controls\">\n    <div>\n      <label for=\"tp-date\">Date<\/label><br>\n      <input id=\"tp-date\" class=\"tp-date\" type=\"date\" aria-label=\"Date\">\n    <\/div>\n    <div>\n      <label for=\"tp-range\">Days<\/label><br>\n      <select id=\"tp-range\" class=\"tp-range\" aria-label=\"Days\">\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\" class=\"tp-btn\">Show sailings<\/button><\/div>\n  <\/div>\n\n  <div id=\"tp-status\" class=\"tp-muted\" aria-live=\"polite\">Pick a date and click Show sailings<\/div>\n  <div id=\"tp-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\">Loading...<\/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');\n  const daysEl = wrap.querySelector('#tp-range');\n  const btn    = wrap.querySelector('#tp-load');\n  const status = wrap.querySelector('#tp-status');\n  const out    = wrap.querySelector('#tp-results');\n  const loader = wrap.querySelector('.tp-loader');\n\n  dateEl.valueAsDate = new Date();\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'}); } \/\/ short, no year\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 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 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,op:L.th_op};\n    let html = '<table class=\"tp-table\"><thead><tr>'+\n      '<th>'+th.date+'<\/th><th>'+th.dep+'<\/th><th>'+th.arr+'<\/th><th>'+th.dur+'<\/th><th>'+th.ship+'<\/th><th>'+th.op+'<\/th>'+\n      '<\/tr><\/thead><tbody>';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      html += '<tr>'+\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span><\/td>'+\n        '<td>'+hhmm(r.dep)+'<\/td>'+\n        '<td>'+hhmm(r.arr)+'<\/td>'+\n        '<td>'+dur(r.min)+'<\/td>'+\n        '<td>'+shipBadge(r.ship)+'<\/td>'+\n        '<td>'+opCell(r)+'<\/td>'+\n      '<\/tr>';\n    });\n    html += '<\/tbody><\/table>';\n    return html;\n  }\n\n  function renderCards(rows){\n    const routeName = cfg.label || '';\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\">'+\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        \/\/ Row 2: Ship & Route (no prefixes)\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+shipBadge(r.ship)+'<\/div>'+\n          (routeName ? ('<div class=\"rhs\">'+routeName+'<\/div>') : '<div class=\"rhs\"><\/div>')+\n        '<\/div>'+\n        \/\/ Row 3: Operator (no book button)\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  async function load(){\n    btn.disabled = true; setLoader(true); status.textContent = L.status_loading;\n    const start = new Date(dateEl.value || new Date());\n    const days  = Math.max(1, parseInt(daysEl.value,10)||1);\n    const end   = new Date(start); end.setDate(start.getDate()+days-1);\n    const url = new URL(cfg.rest); url.searchParams.set('route', String(cfg.route));\n    url.searchParams.set('from', iso(start)); url.searchParams.set('to', iso(end));\n    try{\n      const res = await fetch(url.toString(), {credentials:'same-origin'});\n      if(!res.ok) throw new 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      const rows = list.map(t=>({\n        opId:t.operatorId||null, opName:t.operatorName||'', opLogo:t.operatorLogo||'', opLink:t.operatorLink||'',\n        dep:toLocal(t.departureTime), arr:toLocal(t.arrivalTime), min:t.durationInMinutes||0, ship:t.shipName||''\n      })).sort((a,b)=>a.dep-b.dep);\n      if(rows.length===0){ status.textContent = L.status_empty; out.innerHTML=''; return; }\n      status.textContent = (cfg.label? (cfg.label+': '):'') + (L.status_found||'%d sailings found').replace('%d', rows.length);\n      out.innerHTML = renderTable(rows) + renderCards(rows);\n    }catch(e){\n      status.textContent = 'Failed to load data'; out.innerHTML = '<pre>'+String(e.message||e)+'<\/pre>';\n    }finally{ setLoader(false); btn.disabled=false; }\n  }\n\n  btn.addEventListener('click', load);\n  if (cfg.autoload) load();\n})();\n<\/script>\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div id=\"e-n-tab-content-846841502\" role=\"tabpanel\" aria-labelledby=\"e-n-tab-title-846841502\" data-tab-index=\"2\" style=\"--n-tabs-title-order: 2;\" class=\" elementor-element elementor-element-4a6c553 e-con-full e-flex e-con e-child\" data-id=\"4a6c553\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-e7014a5 e-flex e-con-boxed e-con e-child\" data-id=\"e7014a5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b6140ec elementor-widget__width-inherit elementor-widget elementor-widget-shortcode\" data-id=\"b6140ec\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div class=\"tp-wrap\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;route&quot;:17,&quot;days&quot;:1,&quot;autoload&quot;:true,&quot;label&quot;:&quot;Dublin \\u21d2 Holyhead&quot;,&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Date&quot;,&quot;ui_days&quot;:&quot;Days&quot;,&quot;ui_button&quot;:&quot;Show sailings&quot;,&quot;status_idle&quot;:&quot;Pick a date and click Show sailings&quot;,&quot;status_loading&quot;:&quot;Loading...&quot;,&quot;status_empty&quot;:&quot;No sailings found&quot;,&quot;status_found&quot;:&quot;%d sailings found&quot;,&quot;th_date&quot;:&quot;Date&quot;,&quot;th_dep&quot;:&quot;Departure&quot;,&quot;th_arr&quot;:&quot;Arrival&quot;,&quot;th_dur&quot;:&quot;Duration&quot;,&quot;th_ship&quot;:&quot;Ship&quot;,&quot;th_op&quot;:&quot;Operator&quot;,&quot;th_route&quot;:&quot;Route&quot;,&quot;wd_sun&quot;:&quot;SUN&quot;,&quot;wd_mon&quot;:&quot;MON&quot;,&quot;wd_tue&quot;:&quot;TUE&quot;,&quot;wd_wed&quot;:&quot;WED&quot;,&quot;wd_thu&quot;:&quot;THU&quot;,&quot;wd_fri&quot;:&quot;FRI&quot;,&quot;wd_sat&quot;:&quot;SAT&quot;},&quot;showLogo&quot;:true,&quot;shipMap&quot;:[],&quot;shipLinks&quot;:{&quot;ulysses&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/ulysses\\\/&quot;,&quot;stena adventurer&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/stena-adventurer\\\/&quot;,&quot;james joyce&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/james-joyce\\\/&quot;,&quot;stena estrid&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/stena-estrid\\\/&quot;,&quot;dublin swift&quot;:&quot;https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/ferries\\\/dublin-swift\\\/&quot;}}\">\n  <div class=\"tp-controls\" role=\"group\" aria-label=\"Timetable controls\">\n    <div>\n      <label for=\"tp-date\">Date<\/label><br>\n      <input id=\"tp-date\" class=\"tp-date\" type=\"date\" aria-label=\"Date\">\n    <\/div>\n    <div>\n      <label for=\"tp-range\">Days<\/label><br>\n      <select id=\"tp-range\" class=\"tp-range\" aria-label=\"Days\">\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\" class=\"tp-btn\">Show sailings<\/button><\/div>\n  <\/div>\n\n  <div id=\"tp-status\" class=\"tp-muted\" aria-live=\"polite\">Pick a date and click Show sailings<\/div>\n  <div id=\"tp-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\">Loading...<\/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');\n  const daysEl = wrap.querySelector('#tp-range');\n  const btn    = wrap.querySelector('#tp-load');\n  const status = wrap.querySelector('#tp-status');\n  const out    = wrap.querySelector('#tp-results');\n  const loader = wrap.querySelector('.tp-loader');\n\n  dateEl.valueAsDate = new Date();\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'}); } \/\/ short, no year\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 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 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,op:L.th_op};\n    let html = '<table class=\"tp-table\"><thead><tr>'+\n      '<th>'+th.date+'<\/th><th>'+th.dep+'<\/th><th>'+th.arr+'<\/th><th>'+th.dur+'<\/th><th>'+th.ship+'<\/th><th>'+th.op+'<\/th>'+\n      '<\/tr><\/thead><tbody>';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      html += '<tr>'+\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span><\/td>'+\n        '<td>'+hhmm(r.dep)+'<\/td>'+\n        '<td>'+hhmm(r.arr)+'<\/td>'+\n        '<td>'+dur(r.min)+'<\/td>'+\n        '<td>'+shipBadge(r.ship)+'<\/td>'+\n        '<td>'+opCell(r)+'<\/td>'+\n      '<\/tr>';\n    });\n    html += '<\/tbody><\/table>';\n    return html;\n  }\n\n  function renderCards(rows){\n    const routeName = cfg.label || '';\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\">'+\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        \/\/ Row 2: Ship & Route (no prefixes)\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+shipBadge(r.ship)+'<\/div>'+\n          (routeName ? ('<div class=\"rhs\">'+routeName+'<\/div>') : '<div class=\"rhs\"><\/div>')+\n        '<\/div>'+\n        \/\/ Row 3: Operator (no book button)\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  async function load(){\n    btn.disabled = true; setLoader(true); status.textContent = L.status_loading;\n    const start = new Date(dateEl.value || new Date());\n    const days  = Math.max(1, parseInt(daysEl.value,10)||1);\n    const end   = new Date(start); end.setDate(start.getDate()+days-1);\n    const url = new URL(cfg.rest); url.searchParams.set('route', String(cfg.route));\n    url.searchParams.set('from', iso(start)); url.searchParams.set('to', iso(end));\n    try{\n      const res = await fetch(url.toString(), {credentials:'same-origin'});\n      if(!res.ok) throw new 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      const rows = list.map(t=>({\n        opId:t.operatorId||null, opName:t.operatorName||'', opLogo:t.operatorLogo||'', opLink:t.operatorLink||'',\n        dep:toLocal(t.departureTime), arr:toLocal(t.arrivalTime), min:t.durationInMinutes||0, ship:t.shipName||''\n      })).sort((a,b)=>a.dep-b.dep);\n      if(rows.length===0){ status.textContent = L.status_empty; out.innerHTML=''; return; }\n      status.textContent = (cfg.label? (cfg.label+': '):'') + (L.status_found||'%d sailings found').replace('%d', rows.length);\n      out.innerHTML = renderTable(rows) + renderCards(rows);\n    }catch(e){\n      status.textContent = 'Failed to load data'; out.innerHTML = '<pre>'+String(e.message||e)+'<\/pre>';\n    }finally{ setLoader(false); btn.disabled=false; }\n  }\n\n  btn.addEventListener('click', load);\n  if (cfg.autoload) load();\n})();\n<\/script>\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-217a4a63 e-flex e-con-boxed e-con e-parent\" data-id=\"217a4a63\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-5c296974 e-con-full e-flex e-con e-child\" data-id=\"5c296974\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6d3ed1b elementor-widget elementor-widget-text-editor\" data-id=\"6d3ed1b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>About the schedule<\/h3>\n<ul>\n  <li>Ferries between Dublin and Holyhead operate several times a day on a fixed timetable. The only exception is the <a href=\"https:\/\/holyhead-dublin.com\/ie\/ferries\/dublin-swift\/\">Dublin Swift Ferry<\/a>, whose departure times can vary during the low season or when sailings are affected by weather or maintenance.<\/li>\n\n  <li>If upcoming sailings from Stena Line or Irish Ferries appear <strong>missing from the timetable<\/strong>, it usually means that the official schedules for that period have not yet been released. This often happens towards the end of the year when new timetables are being finalised.<\/li>\n\n  <li>This page shows an integrated timetable with all sailings from both Irish Ferries and Stena Line, giving you a clear overview of every departure. You can also view separate timetables for <a href=\"https:\/\/holyhead-dublin.com\/ie\/timetable\/stena-line-timetable\/\">Stena Line<\/a> and <a href=\"https:\/\/holyhead-dublin.com\/ie\/timetable\/irish-ferries-timetable\/\">Irish Ferries<\/a> if you prefer.<\/li>\n\n  <li><strong>Not seeing a ferry in the timetable?<\/strong> You can use our <a href=\"https:\/\/holyhead-dublin.com\/ie\/live-location\/\">live ferry tracker<\/a> to check whether a ship is currently sailing on the route or docked in port.<\/li>\n\n  <li>Please note that all sailings listed in the timetable may change depending on operating conditions.<\/li>\n<\/ul>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-569749f4 e-con-full e-flex e-con e-parent\" data-id=\"569749f4\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-1141513b e-con-full e-flex e-con e-child\" data-id=\"1141513b\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-638a3f22 e-con-full e-flex e-con e-child\" data-id=\"638a3f22\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-37de7842 elementor-widget elementor-widget-heading\" data-id=\"37de7842\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Changes in the sailing schedules<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-63246875 elementor-widget elementor-widget-text-editor\" data-id=\"63246875\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Unfortunately, it is not uncommon for a ferry to be delayed or cancelled, often due to <a href=\"https:\/\/holyhead-dublin.com\/ie\/weather\/\">weather conditions.<\/a> The Irish Sea can be quite rough, as many storms arrive from the southwest. In general, the larger ferries will continue to operate in strong winds longer than the fast catamaran vessels. For the latest sailing updates, please consult the sailing updates page.<\/p><ul><li><a href=\"https:\/\/holyhead-dublin.com\/ie\/timetable\/sailing-updates\/\"><strong>Latest sailing updates<\/strong><\/a><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3751bf4 e-flex e-con-boxed e-con e-parent\" data-id=\"3751bf4\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-0786f64 e-con-full e-flex e-con e-child\" data-id=\"0786f64\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f28b338 elementor-widget elementor-widget-text-editor\" data-id=\"f28b338\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>Departing? Build in some extra time<\/h3><p>All international ferry services have check-in times that must be observed. There is a latest check-in deadline to ensure sufficient time for customs, boarding, and other formalities.<\/p><p>On the Holyhead-Dublin route, these check-in times are relatively short. Depending on which ferry company you are travelling with, the specific check-in times are listed on these pages:<\/p><ul><li><a href=\"https:\/\/holyhead-dublin.com\/ie\/irish-ferries\/#checkin\">Irish Ferries Check-in times<\/a><\/li><li><a href=\"https:\/\/holyhead-dublin.com\/ie\/stena-line\/#checkin\">Stena Line Check-in times<\/a><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1163cac e-flex e-con-boxed e-con e-parent\" data-id=\"1163cac\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3667306e elementor-position-top elementor-widget elementor-widget-image-box\" data-id=\"3667306e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-image-box-wrapper\"><figure class=\"elementor-image-box-img\"><a href=\"https:\/\/holyhead-dublin.com\/ie\/price\/\" tabindex=\"-1\"><img fetchpriority=\"high\" decoding=\"async\" width=\"300\" height=\"200\" src=\"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/12\/Holyhead-dublin-ferry-prices-explained-300x200.jpg\" class=\"attachment-medium size-medium wp-image-3663\" alt=\"\" srcset=\"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/12\/Holyhead-dublin-ferry-prices-explained-300x200.jpg 300w, https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/12\/Holyhead-dublin-ferry-prices-explained-1024x683.jpg 1024w, https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/12\/Holyhead-dublin-ferry-prices-explained-768x512.jpg 768w, https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/12\/Holyhead-dublin-ferry-prices-explained.jpg 1200w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><div class=\"elementor-image-box-content\"><div class=\"elementor-image-box-title\"><a href=\"https:\/\/holyhead-dublin.com\/ie\/price\/\">Ferry price<\/a><\/div><\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-56c4e96 elementor-position-top elementor-widget elementor-widget-image-box\" data-id=\"56c4e96\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-image-box-wrapper\"><figure class=\"elementor-image-box-img\"><a href=\"https:\/\/holyhead-dublin.com\/ie\/weather\/\" tabindex=\"-1\"><img decoding=\"async\" width=\"300\" height=\"200\" src=\"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/10\/ferries-departing-dublin-300x200.jpg\" class=\"attachment-medium size-medium wp-image-1725\" alt=\"ferries departing dublin\" srcset=\"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/10\/ferries-departing-dublin-300x200.jpg 300w, https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/10\/ferries-departing-dublin-1024x683.jpg 1024w, https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/10\/ferries-departing-dublin-768x512.jpg 768w, https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/10\/ferries-departing-dublin.jpg 1200w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><div class=\"elementor-image-box-content\"><div class=\"elementor-image-box-title\"><a href=\"https:\/\/holyhead-dublin.com\/ie\/weather\/\">Current weather Irish Sea<\/a><\/div><\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1bb74ef elementor-position-top elementor-widget elementor-widget-image-box\" data-id=\"1bb74ef\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-image-box-wrapper\"><figure class=\"elementor-image-box-img\"><a href=\"https:\/\/holyhead-dublin.com\/ie\/ferries\/\" tabindex=\"-1\"><img decoding=\"async\" width=\"300\" height=\"200\" src=\"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/12\/Holyhead-port-ferries-departing-soon-300x200.jpg\" class=\"attachment-medium size-medium wp-image-3669\" alt=\"\" srcset=\"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/12\/Holyhead-port-ferries-departing-soon-300x200.jpg 300w, https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/12\/Holyhead-port-ferries-departing-soon-1024x683.jpg 1024w, https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/12\/Holyhead-port-ferries-departing-soon-768x512.jpg 768w, https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/12\/Holyhead-port-ferries-departing-soon.jpg 1200w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><div class=\"elementor-image-box-content\"><div class=\"elementor-image-box-title\"><a href=\"https:\/\/holyhead-dublin.com\/ie\/ferries\/\">Discover the ferries<\/a><\/div><\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-458a2840 elementor-position-top elementor-widget elementor-widget-image-box\" data-id=\"458a2840\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-image-box-wrapper\"><figure class=\"elementor-image-box-img\"><a href=\"https:\/\/holyhead-dublin.com\/ie\/live-location\/\" tabindex=\"-1\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"212\" src=\"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/10\/live-vessel-location-300x212.jpg\" class=\"attachment-medium size-medium wp-image-1193\" alt=\"Realtime vessel position map\" srcset=\"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/10\/live-vessel-location-300x212.jpg 300w, https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/10\/live-vessel-location.jpg 702w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><div class=\"elementor-image-box-content\"><div class=\"elementor-image-box-title\"><a href=\"https:\/\/holyhead-dublin.com\/ie\/live-location\/\">Live ferry location<\/a><\/div><\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Dublin-HolyheadFerry Timetable Stay up to date with all Dublin ferry departures and Holyhead arrivals. This page brings together the latest [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1591,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","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-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":"","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-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":"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":""},"mobile":{"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":""}},"footnotes":""},"class_list":["post-130","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Holyhead-Dublin Timetable - Departures and arrival times<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/holyhead-dublin.com\/ie\/timetable\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Holyhead-Dublin Timetable - Departures and arrival times\" \/>\n<meta property=\"og:description\" content=\"Dublin-HolyheadFerry Timetable Stay up to date with all Dublin ferry departures and Holyhead arrivals. This page brings together the latest [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/holyhead-dublin.com\/ie\/timetable\/\" \/>\n<meta property=\"og:site_name\" content=\"Dublin-Holyhead\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-12T12:37:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/10\/timetable-holyhead-dublin-ferries.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"660\" \/>\n\t<meta property=\"og:image:height\" content=\"660\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/timetable\\\/\",\"url\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/timetable\\\/\",\"name\":\"Holyhead-Dublin Timetable - Departures and arrival times\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/timetable\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/timetable\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/10\\\/timetable-holyhead-dublin-ferries.jpg\",\"datePublished\":\"2025-01-28T14:21:29+00:00\",\"dateModified\":\"2025-12-12T12:37:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/timetable\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/timetable\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/timetable\\\/#primaryimage\",\"url\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/10\\\/timetable-holyhead-dublin-ferries.jpg\",\"contentUrl\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/10\\\/timetable-holyhead-dublin-ferries.jpg\",\"width\":660,\"height\":660,\"caption\":\"timetable holyhead dublin ferries\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/timetable\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Timetable\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/#website\",\"url\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/\",\"name\":\"Dublin-Holyhead\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/#organization\",\"name\":\"Dublin-Holyhead\",\"url\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/12\\\/dublin-holyhead-logo.svg\",\"contentUrl\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/12\\\/dublin-holyhead-logo.svg\",\"width\":150,\"height\":30,\"caption\":\"Dublin-Holyhead\"},\"image\":{\"@id\":\"https:\\\/\\\/holyhead-dublin.com\\\/ie\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Holyhead-Dublin Timetable - Departures and arrival times","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:\/\/holyhead-dublin.com\/ie\/timetable\/","og_locale":"en_GB","og_type":"article","og_title":"Holyhead-Dublin Timetable - Departures and arrival times","og_description":"Dublin-HolyheadFerry Timetable Stay up to date with all Dublin ferry departures and Holyhead arrivals. This page brings together the latest [&hellip;]","og_url":"https:\/\/holyhead-dublin.com\/ie\/timetable\/","og_site_name":"Dublin-Holyhead","article_modified_time":"2025-12-12T12:37:32+00:00","og_image":[{"width":660,"height":660,"url":"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/10\/timetable-holyhead-dublin-ferries.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/holyhead-dublin.com\/ie\/timetable\/","url":"https:\/\/holyhead-dublin.com\/ie\/timetable\/","name":"Holyhead-Dublin Timetable - Departures and arrival times","isPartOf":{"@id":"https:\/\/holyhead-dublin.com\/ie\/#website"},"primaryImageOfPage":{"@id":"https:\/\/holyhead-dublin.com\/ie\/timetable\/#primaryimage"},"image":{"@id":"https:\/\/holyhead-dublin.com\/ie\/timetable\/#primaryimage"},"thumbnailUrl":"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/10\/timetable-holyhead-dublin-ferries.jpg","datePublished":"2025-01-28T14:21:29+00:00","dateModified":"2025-12-12T12:37:32+00:00","breadcrumb":{"@id":"https:\/\/holyhead-dublin.com\/ie\/timetable\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/holyhead-dublin.com\/ie\/timetable\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/holyhead-dublin.com\/ie\/timetable\/#primaryimage","url":"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/10\/timetable-holyhead-dublin-ferries.jpg","contentUrl":"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/10\/timetable-holyhead-dublin-ferries.jpg","width":660,"height":660,"caption":"timetable holyhead dublin ferries"},{"@type":"BreadcrumbList","@id":"https:\/\/holyhead-dublin.com\/ie\/timetable\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/holyhead-dublin.com\/ie\/"},{"@type":"ListItem","position":2,"name":"Timetable"}]},{"@type":"WebSite","@id":"https:\/\/holyhead-dublin.com\/ie\/#website","url":"https:\/\/holyhead-dublin.com\/ie\/","name":"Dublin-Holyhead","description":"","publisher":{"@id":"https:\/\/holyhead-dublin.com\/ie\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/holyhead-dublin.com\/ie\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/holyhead-dublin.com\/ie\/#organization","name":"Dublin-Holyhead","url":"https:\/\/holyhead-dublin.com\/ie\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/holyhead-dublin.com\/ie\/#\/schema\/logo\/image\/","url":"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/12\/dublin-holyhead-logo.svg","contentUrl":"https:\/\/holyhead-dublin.com\/ie\/wp-content\/uploads\/sites\/2\/2025\/12\/dublin-holyhead-logo.svg","width":150,"height":30,"caption":"Dublin-Holyhead"},"image":{"@id":"https:\/\/holyhead-dublin.com\/ie\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/holyhead-dublin.com\/ie\/wp-json\/wp\/v2\/pages\/130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/holyhead-dublin.com\/ie\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/holyhead-dublin.com\/ie\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/holyhead-dublin.com\/ie\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/holyhead-dublin.com\/ie\/wp-json\/wp\/v2\/comments?post=130"}],"version-history":[{"count":401,"href":"https:\/\/holyhead-dublin.com\/ie\/wp-json\/wp\/v2\/pages\/130\/revisions"}],"predecessor-version":[{"id":3836,"href":"https:\/\/holyhead-dublin.com\/ie\/wp-json\/wp\/v2\/pages\/130\/revisions\/3836"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/holyhead-dublin.com\/ie\/wp-json\/wp\/v2\/media\/1591"}],"wp:attachment":[{"href":"https:\/\/holyhead-dublin.com\/ie\/wp-json\/wp\/v2\/media?parent=130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}