{"id":2509,"date":"2023-07-05T09:35:55","date_gmt":"2023-07-05T09:35:55","guid":{"rendered":"https:\/\/calais-dover.com\/?page_id=2509"},"modified":"2026-06-17T09:31:58","modified_gmt":"2026-06-17T09:31:58","slug":"ferry-calais-douvres-horaires","status":"publish","type":"page","link":"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/","title":{"rendered":"Horaire ferry Calais Douvres"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2509\" class=\"elementor elementor-2509 elementor-2131\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5091c13 elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"5091c13\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0b1e636\" data-id=\"0b1e636\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8d0cd8e elementor-widget elementor-widget-shortcode\" data-id=\"8d0cd8e\" 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\"><style>.elementor-7688 .elementor-element.elementor-element-3ee6618e:not(.elementor-motion-effects-element-type-background), .elementor-7688 .elementor-element.elementor-element-3ee6618e > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:transparent;background-image:linear-gradient(360deg, #004080 25%, #00314E 7%);}.elementor-7688 .elementor-element.elementor-element-3ee6618e > .elementor-background-overlay{opacity:0.5;transition:background 0.3s, border-radius 0.3s, opacity 0.3s;}.elementor-7688 .elementor-element.elementor-element-3ee6618e{transition:background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s;margin-top:0px;margin-bottom:20px;padding:0px 0px 25px 0px;}.elementor-7688 .elementor-element.elementor-element-3ee6618e > .elementor-shape-bottom svg{width:calc(122% + 1.3px);height:116px;transform:translateX(-50%) rotateY(180deg);}.elementor-7688 .elementor-element.elementor-element-3ee6618e > .elementor-shape-bottom{z-index:2;pointer-events:none;}.elementor-7688 .elementor-element.elementor-element-416143fc > .elementor-element-populated{margin:0px 0px 0px 0px;--e-column-margin-right:0px;--e-column-margin-left:0px;padding:0px 0px 0px 0px;}.elementor-7688 .elementor-element.elementor-element-6ca8a2a7{transition:background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s;margin-top:0px;margin-bottom:0px;}.elementor-7688 .elementor-element.elementor-element-6ca8a2a7 > .elementor-background-overlay{transition:background 0.3s, border-radius 0.3s, opacity 0.3s;}.elementor-7688 .elementor-element.elementor-element-57e73c15{font-family:\"Lato\", Sans-serif;color:#FFFFFF;width:auto;max-width:auto;align-self:center;}.elementor-7688 .elementor-element.elementor-element-57e73c15 a{color:#FFFFFF;}.elementor-7688 .elementor-element.elementor-element-57e73c15 > .elementor-widget-container{margin:0px 0px 0px 0px;}.elementor-7688 .elementor-element.elementor-element-1432e9db{transition:background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s;margin-top:-30px;margin-bottom:20px;}.elementor-7688 .elementor-element.elementor-element-1432e9db > .elementor-background-overlay{transition:background 0.3s, border-radius 0.3s, opacity 0.3s;}.elementor-7688 .elementor-element.elementor-element-427cdad8.elementor-column > .elementor-widget-wrap{justify-content:flex-end;}.elementor-7688 .elementor-element.elementor-element-427cdad8 > .elementor-element-populated{margin:15px 0px -15px 0px;--e-column-margin-right:0px;--e-column-margin-left:0px;}.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-nav-menu .elementor-item{font-family:\"Lato\", Sans-serif;font-size:16px;font-weight:bold;text-decoration:none;letter-spacing:-0.2px;}.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-nav-menu--main .elementor-item{color:#FFFFFF;fill:#FFFFFF;}.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-nav-menu--dropdown a, .elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-menu-toggle{color:#00314E;fill:#00314E;}.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-nav-menu--dropdown a:hover,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-nav-menu--dropdown a:focus,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-nav-menu--dropdown a.elementor-item-active,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-nav-menu--dropdown a.highlighted,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-menu-toggle:hover,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-menu-toggle:focus{color:#FFFFFF;}.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-nav-menu--dropdown a:hover,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-nav-menu--dropdown a:focus,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-nav-menu--dropdown a.elementor-item-active,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-nav-menu--dropdown a.highlighted{background-color:#46A492;}.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-nav-menu--dropdown .elementor-item, .elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-nav-menu--dropdown  .elementor-sub-item{font-family:\"Lato\", Sans-serif;font-size:15px;font-weight:600;}.elementor-7688 .elementor-element.elementor-element-746bdd35 div.elementor-menu-toggle{color:#FFFFFF;}.elementor-7688 .elementor-element.elementor-element-746bdd35 div.elementor-menu-toggle svg{fill:#FFFFFF;}.elementor-7688 .elementor-element.elementor-element-746bdd35 .elementor-menu-toggle{background-color:#46A492;}.elementor-7688 .elementor-element.elementor-element-746bdd35 > .elementor-widget-container{margin:0px 0px 0px 0px;padding:0px 0px 0px 0px;border-radius:45px 45px 45px 45px;}.elementor-7688 .elementor-element.elementor-element-3878bdae > .elementor-container > .elementor-column > .elementor-widget-wrap{align-content:center;align-items:center;}.elementor-7688 .elementor-element.elementor-element-3878bdae:not(.elementor-motion-effects-element-type-background), .elementor-7688 .elementor-element.elementor-element-3878bdae > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:#FFFFFF;}.elementor-7688 .elementor-element.elementor-element-3878bdae, .elementor-7688 .elementor-element.elementor-element-3878bdae > .elementor-background-overlay{border-radius:45px 45px 45px 45px;}.elementor-7688 .elementor-element.elementor-element-3878bdae{transition:background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s;margin-top:0px;margin-bottom:25px;padding:0px 0px 0px 0px;}.elementor-7688 .elementor-element.elementor-element-3878bdae > .elementor-background-overlay{transition:background 0.3s, border-radius 0.3s, opacity 0.3s;}.elementor-7688 .elementor-element.elementor-element-44da78ef{text-align:start;}.elementor-7688 .elementor-element.elementor-element-44da78ef > .elementor-widget-container{margin:0px 0px 0px 0px;}.elementor-7688 .elementor-element.elementor-element-2c15adc1.elementor-column > .elementor-widget-wrap{justify-content:flex-end;}.elementor-7688 .elementor-element.elementor-element-2c15adc1 > .elementor-element-populated{margin:0px 0px 0px 0px;--e-column-margin-right:0px;--e-column-margin-left:0px;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu .elementor-item{font-family:\"Lato\", Sans-serif;font-size:16px;font-weight:bold;text-decoration:none;letter-spacing:-0.2px;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--main .elementor-item{color:#00314E;fill:#00314E;padding-left:20px;padding-right:20px;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown a, .elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-menu-toggle{color:#00314E;fill:#00314E;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown a:hover,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown a:focus,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown a.elementor-item-active,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown a.highlighted,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-menu-toggle:hover,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-menu-toggle:focus{color:#FFFFFF;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown a:hover,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown a:focus,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown a.elementor-item-active,\n\t\t\t\t\t.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown a.highlighted{background-color:#46A492;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown .elementor-item, .elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown  .elementor-sub-item{font-family:\"Lato\", Sans-serif;font-size:15px;font-weight:600;text-decoration:none;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown{border-radius:15px 15px 15px 15px;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown li:first-child a{border-top-left-radius:15px;border-top-right-radius:15px;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown li:last-child a{border-bottom-right-radius:15px;border-bottom-left-radius:15px;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--main .elementor-nav-menu--dropdown, .elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu__container.elementor-nav-menu--dropdown{box-shadow:0px 0px 10px 0px rgba(0, 0, 0, 0.11);}.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-nav-menu--dropdown li:not(:last-child){border-style:none;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 div.elementor-menu-toggle{color:#000000;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 div.elementor-menu-toggle svg{fill:#000000;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 .elementor-menu-toggle{background-color:#FF7575;}.elementor-7688 .elementor-element.elementor-element-29c81fd9 > .elementor-widget-container{margin:0px 0px 0px 0px;padding:0px 0px 0px 0px;border-radius:45px 45px 45px 45px;}.elementor-7688 .elementor-element.elementor-element-668b2de2{font-family:\"Lato\", Sans-serif;color:#FFFFFF;width:auto;max-width:auto;align-self:center;}.elementor-7688 .elementor-element.elementor-element-668b2de2 a{color:#FFFFFF;}.elementor-7688 .elementor-element.elementor-element-795daa92 .elementor-heading-title{font-family:\"Open Sans\", Sans-serif;font-size:60px;color:#FFFFFF;}.elementor-7688 .elementor-element.elementor-element-795daa92 > .elementor-widget-container{margin:15px 0px -15px 0px;padding:5px 5px 0px 0px;}.elementor-7688 .elementor-element.elementor-element-3f22fdfb .elementor-widget-container{font-family:\"Open Sans\", Sans-serif;font-size:21px;font-weight:600;color:#FFFFFF;}.elementor-7688 .elementor-element.elementor-element-3f22fdfb > .elementor-widget-container{margin:0px 0px 0px 0px;padding:0px 5px 5px 5px;}.elementor-7688 .elementor-element.elementor-element-11fa232{width:var( --container-widget-width, 26.019% );max-width:26.019%;--container-widget-width:26.019%;--container-widget-flex-grow:0;top:161px;}body:not(.rtl) .elementor-7688 .elementor-element.elementor-element-11fa232{left:831px;}body.rtl .elementor-7688 .elementor-element.elementor-element-11fa232{right:831px;}.elementor-7688 .elementor-element.elementor-element-152fe442{transition:background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s;margin-top:10px;margin-bottom:-30px;padding:0px 0px 0px 0px;}.elementor-7688 .elementor-element.elementor-element-152fe442 > .elementor-background-overlay{transition:background 0.3s, border-radius 0.3s, opacity 0.3s;}.elementor-7688 .elementor-element.elementor-element-2e541a52 > .elementor-element-populated, .elementor-7688 .elementor-element.elementor-element-2e541a52 > .elementor-element-populated > .elementor-background-overlay, .elementor-7688 .elementor-element.elementor-element-2e541a52 > .elementor-background-slideshow{border-radius:0px 0px 0px 0px;}.elementor-7688 .elementor-element.elementor-element-3e131a37 > .elementor-widget-container{margin:0px 0px 0px 0px;padding:0px 0px 0px 0px;background-color:#004080;border-radius:5px 5px 0px 0px;}.elementor-7688 .elementor-element.elementor-element-3e131a37{width:var( --container-widget-width, 101.91% );max-width:101.91%;--container-widget-width:101.91%;--container-widget-flex-grow:0;}.elementor-7688 .elementor-element.elementor-element-2a261b37 > .elementor-element-populated{transition:background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s;margin:130px 0px 0px 0px;--e-column-margin-right:0px;--e-column-margin-left:0px;}.elementor-7688 .elementor-element.elementor-element-2a261b37 > .elementor-element-populated > .elementor-background-overlay{transition:background 0.3s, border-radius 0.3s, opacity 0.3s;}.elementor-7688 .elementor-element.elementor-element-2a261b37{z-index:1;}.elementor-7688 .elementor-element.elementor-element-55a1bdae img{border-radius:40px 40px 40px 40px;}.elementor-7688 .elementor-element.elementor-element-55a1bdae > .elementor-widget-container{padding:3px 3px 3px 3px;}.elementor-7688 .elementor-element.elementor-element-55a1bdae{width:auto;max-width:auto;}.elementor-7688 .elementor-element.elementor-element-2649ef45 img{border-radius:40px 40px 40px 40px;}.elementor-7688 .elementor-element.elementor-element-2649ef45 > .elementor-widget-container{padding:3px 3px 3px 3px;}.elementor-7688 .elementor-element.elementor-element-2649ef45{width:auto;max-width:auto;}.elementor-7688 .elementor-element.elementor-element-6bf59f47 img{border-radius:40px 40px 40px 40px;}.elementor-7688 .elementor-element.elementor-element-6bf59f47 > .elementor-widget-container{padding:3px 3px 3px 3px;}.elementor-7688 .elementor-element.elementor-element-6bf59f47{width:auto;max-width:auto;}.elementor-7688 .elementor-element.elementor-element-45bf3c0a img{border-radius:40px 40px 40px 40px;}.elementor-7688 .elementor-element.elementor-element-45bf3c0a > .elementor-widget-container{padding:3px 3px 3px 3px;}.elementor-7688 .elementor-element.elementor-element-45bf3c0a{width:auto;max-width:auto;}.elementor-7688 .elementor-element.elementor-element-20913f8f img{border-radius:40px 40px 40px 40px;}.elementor-7688 .elementor-element.elementor-element-20913f8f > .elementor-widget-container{padding:3px 3px 3px 3px;}.elementor-7688 .elementor-element.elementor-element-20913f8f{width:auto;max-width:auto;}@media(max-width:1024px){.elementor-7688 .elementor-element.elementor-element-11fa232{width:var( --container-widget-width, 738px );max-width:738px;--container-widget-width:738px;--container-widget-flex-grow:0;}}@media(min-width:768px){.elementor-7688 .elementor-element.elementor-element-20114cd8{width:10%;}.elementor-7688 .elementor-element.elementor-element-2c15adc1{width:90%;}.elementor-7688 .elementor-element.elementor-element-2e541a52{width:71.939%;}.elementor-7688 .elementor-element.elementor-element-2a261b37{width:27.967%;}}@media(max-width:767px){.elementor-7688 .elementor-element.elementor-element-668b2de2 > .elementor-widget-container{margin:0px 0px 0px 10px;}.elementor-7688 .elementor-element.elementor-element-668b2de2{width:var( --container-widget-width, 338.156px );max-width:338.156px;--container-widget-width:338.156px;--container-widget-flex-grow:0;}.elementor-7688 .elementor-element.elementor-element-795daa92 .elementor-heading-title{font-size:50px;}.elementor-7688 .elementor-element.elementor-element-795daa92 > .elementor-widget-container{margin:15px 0px -15px 5px;}.elementor-7688 .elementor-element.elementor-element-3f22fdfb > .elementor-widget-container{margin:0px 0px 0px 5px;}.elementor-7688 .elementor-element.elementor-element-3e131a37 > .elementor-widget-container{margin:0px 0px 0px 0px;}}<\/style>\t\t<div data-elementor-type=\"section\" data-elementor-id=\"7688\" class=\"elementor elementor-7688\" data-elementor-post-type=\"elementor_library\">\n\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3ee6618e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3ee6618e\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;,&quot;shape_divider_bottom_negative&quot;:&quot;yes&quot;,&quot;shape_divider_bottom&quot;:&quot;curve-asymmetrical&quot;}\">\n\t\t\t\t\t\t\t<div class=\"elementor-background-overlay\"><\/div>\n\t\t\t\t\t\t<div class=\"elementor-shape elementor-shape-bottom\" aria-hidden=\"true\" data-negative=\"true\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1000 100\" preserveAspectRatio=\"none\">\n\t<path class=\"elementor-shape-fill\" d=\"M615.2,96.7C240.2,97.8,0,18.9,0,0v100h1000V0C1000,19.2,989.8,96,615.2,96.7z\"\/>\n<\/svg>\t\t<\/div>\n\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-416143fc\" data-id=\"416143fc\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-6ca8a2a7 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6ca8a2a7\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-6290117b\" data-id=\"6290117b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-57e73c15 elementor-widget__width-auto elementor-hidden-mobile elementor-widget elementor-widget-breadcrumbs\" data-id=\"57e73c15\" 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:\/\/calais-dover.com\/fr\/page-daccueil\/\">Calais-Dover.com<\/a><\/span><\/span><\/p>\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<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-1432e9db elementor-hidden-desktop elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1432e9db\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-427cdad8\" data-id=\"427cdad8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-746bdd35 elementor-nav-menu--dropdown-mobile elementor-nav-menu__text-align-aside elementor-nav-menu--toggle elementor-nav-menu--burger elementor-widget elementor-widget-nav-menu\" data-id=\"746bdd35\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;layout&quot;:&quot;horizontal&quot;,&quot;submenu_icon&quot;:{&quot;value&quot;:&quot;&lt;i class=\\&quot;fas fa-caret-down\\&quot; aria-hidden=\\&quot;true\\&quot;&gt;&lt;\\\/i&gt;&quot;,&quot;library&quot;:&quot;fa-solid&quot;},&quot;toggle&quot;:&quot;burger&quot;}\" data-widget_type=\"nav-menu.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t<nav aria-label=\"Menu\" class=\"elementor-nav-menu--main elementor-nav-menu__container elementor-nav-menu--layout-horizontal e--pointer-none\">\n\t\t\t\t<ul id=\"menu-1-746bdd35\" class=\"elementor-nav-menu\"><li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-2523\"><a href=\"https:\/\/calais-dover.com\/fr\/\" class=\"elementor-item\">Accueil<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2520\"><a href=\"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/\" class=\"elementor-item\">Horaires<\/a><\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-7727\"><a href=\"#\" class=\"elementor-item elementor-item-anchor\">Op\u00e9rateurs<\/a>\n<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8789\"><a href=\"https:\/\/calais-dover.com\/fr\/po-ferries\/\" class=\"elementor-sub-item\">P&#038;O ferries<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8787\"><a href=\"https:\/\/calais-dover.com\/fr\/dfds\/\" class=\"elementor-sub-item\">DFDS<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8788\"><a href=\"https:\/\/calais-dover.com\/fr\/irish-ferries\/\" class=\"elementor-sub-item\">Irish Ferries<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7907\"><a href=\"https:\/\/calais-dover.com\/fr\/comparez\/\" class=\"elementor-sub-item\">Comparez<\/a><\/li>\n<\/ul>\n<\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3822\"><a href=\"https:\/\/calais-dover.com\/fr\/eurotunnel\/\" class=\"elementor-item\">Eurotunnel<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2508\"><a href=\"https:\/\/calais-dover.com\/fr\/prix\/\" class=\"elementor-item\">Les prix<\/a><\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-7932\"><a href=\"#\" class=\"elementor-item elementor-item-anchor\">Comment voyager?<\/a>\n<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7933\"><a href=\"https:\/\/calais-dover.com\/fr\/calais-douvres-en-voiture\/\" class=\"elementor-sub-item\">Voiture<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7940\"><a href=\"https:\/\/calais-dover.com\/fr\/avec-caravane-en-angleterre\/\" class=\"elementor-sub-item\">Caravane<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7941\"><a href=\"https:\/\/calais-dover.com\/fr\/passager-pieton\/\" class=\"elementor-sub-item\">Pi\u00e9ton<\/a><\/li>\n<\/ul>\n<\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-2860\"><a href=\"#\" class=\"elementor-item elementor-item-anchor\">Plus d&rsquo;infos<\/a>\n<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2428\"><a href=\"https:\/\/calais-dover.com\/fr\/calais-douvres-webcams-et-meteo\/\" class=\"elementor-sub-item\">Webcams et m\u00e9t\u00e9o<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7966\"><a href=\"https:\/\/calais-dover.com\/fr\/conduire-en-angleterre\/\" class=\"elementor-sub-item\">Conduire en Angleterre<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-7967\"><a href=\"#\" class=\"elementor-sub-item elementor-item-anchor\">Informations portuaires<\/a>\n\t<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8004\"><a href=\"https:\/\/calais-dover.com\/fr\/port-de-calais\/\" class=\"elementor-sub-item\">Port de Calais<\/a><\/li>\n\t\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8013\"><a href=\"https:\/\/calais-dover.com\/fr\/port-de-douvres\/\" class=\"elementor-sub-item\">Port de Douvres<\/a><\/li>\n\t<\/ul>\n<\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2861\"><a href=\"https:\/\/calais-dover.com\/fr\/parking-calais\/\" class=\"elementor-sub-item\">Parking Calais<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\t\t\t<\/nav>\n\t\t\t\t\t<div class=\"elementor-menu-toggle\" role=\"button\" tabindex=\"0\" aria-label=\"Permuter le menu\" aria-expanded=\"false\">\n\t\t\t<i aria-hidden=\"true\" role=\"presentation\" class=\"elementor-menu-toggle__icon--open eicon-menu-bar\"><\/i><i aria-hidden=\"true\" role=\"presentation\" class=\"elementor-menu-toggle__icon--close eicon-close\"><\/i>\t\t<\/div>\n\t\t\t\t\t<nav class=\"elementor-nav-menu--dropdown elementor-nav-menu__container\" aria-hidden=\"true\">\n\t\t\t\t<ul id=\"menu-2-746bdd35\" class=\"elementor-nav-menu\"><li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-2523\"><a href=\"https:\/\/calais-dover.com\/fr\/\" class=\"elementor-item\" tabindex=\"-1\">Accueil<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2520\"><a href=\"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/\" class=\"elementor-item\" tabindex=\"-1\">Horaires<\/a><\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-7727\"><a href=\"#\" class=\"elementor-item elementor-item-anchor\" tabindex=\"-1\">Op\u00e9rateurs<\/a>\n<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8789\"><a href=\"https:\/\/calais-dover.com\/fr\/po-ferries\/\" class=\"elementor-sub-item\" tabindex=\"-1\">P&#038;O ferries<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8787\"><a href=\"https:\/\/calais-dover.com\/fr\/dfds\/\" class=\"elementor-sub-item\" tabindex=\"-1\">DFDS<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8788\"><a href=\"https:\/\/calais-dover.com\/fr\/irish-ferries\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Irish Ferries<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7907\"><a href=\"https:\/\/calais-dover.com\/fr\/comparez\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Comparez<\/a><\/li>\n<\/ul>\n<\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3822\"><a href=\"https:\/\/calais-dover.com\/fr\/eurotunnel\/\" class=\"elementor-item\" tabindex=\"-1\">Eurotunnel<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2508\"><a href=\"https:\/\/calais-dover.com\/fr\/prix\/\" class=\"elementor-item\" tabindex=\"-1\">Les prix<\/a><\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-7932\"><a href=\"#\" class=\"elementor-item elementor-item-anchor\" tabindex=\"-1\">Comment voyager?<\/a>\n<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7933\"><a href=\"https:\/\/calais-dover.com\/fr\/calais-douvres-en-voiture\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Voiture<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7940\"><a href=\"https:\/\/calais-dover.com\/fr\/avec-caravane-en-angleterre\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Caravane<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7941\"><a href=\"https:\/\/calais-dover.com\/fr\/passager-pieton\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Pi\u00e9ton<\/a><\/li>\n<\/ul>\n<\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-2860\"><a href=\"#\" class=\"elementor-item elementor-item-anchor\" tabindex=\"-1\">Plus d&rsquo;infos<\/a>\n<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2428\"><a href=\"https:\/\/calais-dover.com\/fr\/calais-douvres-webcams-et-meteo\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Webcams et m\u00e9t\u00e9o<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7966\"><a href=\"https:\/\/calais-dover.com\/fr\/conduire-en-angleterre\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Conduire en Angleterre<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-7967\"><a href=\"#\" class=\"elementor-sub-item elementor-item-anchor\" tabindex=\"-1\">Informations portuaires<\/a>\n\t<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8004\"><a href=\"https:\/\/calais-dover.com\/fr\/port-de-calais\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Port de Calais<\/a><\/li>\n\t\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8013\"><a href=\"https:\/\/calais-dover.com\/fr\/port-de-douvres\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Port de Douvres<\/a><\/li>\n\t<\/ul>\n<\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2861\"><a href=\"https:\/\/calais-dover.com\/fr\/parking-calais\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Parking Calais<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\t\t\t<\/nav>\n\t\t\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<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-3878bdae elementor-hidden-tablet elementor-hidden-mobile elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3878bdae\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-20114cd8\" data-id=\"20114cd8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-44da78ef elementor-widget elementor-widget-image\" data-id=\"44da78ef\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/calais-dover.com\/fr\/\">\n\t\t\t\t\t\t\t<img decoding=\"async\" class=\"lazyload\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/thumbs_dir\/calais-dover-logo-icon-qpi10i1vaywdh3lc48nz9zlu3obu0b3nc49e7vwws4.png\" title=\"calais-dover-logo-icon.png\" alt=\"calais-dover-logo-icon.png\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\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<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-2c15adc1\" data-id=\"2c15adc1\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-29c81fd9 elementor-nav-menu--dropdown-mobile elementor-nav-menu__align-start elementor-nav-menu__text-align-aside elementor-nav-menu--toggle elementor-nav-menu--burger elementor-widget elementor-widget-nav-menu\" data-id=\"29c81fd9\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;layout&quot;:&quot;horizontal&quot;,&quot;submenu_icon&quot;:{&quot;value&quot;:&quot;&lt;i class=\\&quot;fas fa-caret-down\\&quot; aria-hidden=\\&quot;true\\&quot;&gt;&lt;\\\/i&gt;&quot;,&quot;library&quot;:&quot;fa-solid&quot;},&quot;toggle&quot;:&quot;burger&quot;}\" data-widget_type=\"nav-menu.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t<nav aria-label=\"Menu\" class=\"elementor-nav-menu--main elementor-nav-menu__container elementor-nav-menu--layout-horizontal e--pointer-none\">\n\t\t\t\t<ul id=\"menu-1-29c81fd9\" class=\"elementor-nav-menu\"><li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-2523\"><a href=\"https:\/\/calais-dover.com\/fr\/\" class=\"elementor-item\">Accueil<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2520\"><a href=\"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/\" class=\"elementor-item\">Horaires<\/a><\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-7727\"><a href=\"#\" class=\"elementor-item elementor-item-anchor\">Op\u00e9rateurs<\/a>\n<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8789\"><a href=\"https:\/\/calais-dover.com\/fr\/po-ferries\/\" class=\"elementor-sub-item\">P&#038;O ferries<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8787\"><a href=\"https:\/\/calais-dover.com\/fr\/dfds\/\" class=\"elementor-sub-item\">DFDS<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8788\"><a href=\"https:\/\/calais-dover.com\/fr\/irish-ferries\/\" class=\"elementor-sub-item\">Irish Ferries<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7907\"><a href=\"https:\/\/calais-dover.com\/fr\/comparez\/\" class=\"elementor-sub-item\">Comparez<\/a><\/li>\n<\/ul>\n<\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3822\"><a href=\"https:\/\/calais-dover.com\/fr\/eurotunnel\/\" class=\"elementor-item\">Eurotunnel<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2508\"><a href=\"https:\/\/calais-dover.com\/fr\/prix\/\" class=\"elementor-item\">Les prix<\/a><\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-7932\"><a href=\"#\" class=\"elementor-item elementor-item-anchor\">Comment voyager?<\/a>\n<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7933\"><a href=\"https:\/\/calais-dover.com\/fr\/calais-douvres-en-voiture\/\" class=\"elementor-sub-item\">Voiture<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7940\"><a href=\"https:\/\/calais-dover.com\/fr\/avec-caravane-en-angleterre\/\" class=\"elementor-sub-item\">Caravane<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7941\"><a href=\"https:\/\/calais-dover.com\/fr\/passager-pieton\/\" class=\"elementor-sub-item\">Pi\u00e9ton<\/a><\/li>\n<\/ul>\n<\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-2860\"><a href=\"#\" class=\"elementor-item elementor-item-anchor\">Plus d&rsquo;infos<\/a>\n<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2428\"><a href=\"https:\/\/calais-dover.com\/fr\/calais-douvres-webcams-et-meteo\/\" class=\"elementor-sub-item\">Webcams et m\u00e9t\u00e9o<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7966\"><a href=\"https:\/\/calais-dover.com\/fr\/conduire-en-angleterre\/\" class=\"elementor-sub-item\">Conduire en Angleterre<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-7967\"><a href=\"#\" class=\"elementor-sub-item elementor-item-anchor\">Informations portuaires<\/a>\n\t<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8004\"><a href=\"https:\/\/calais-dover.com\/fr\/port-de-calais\/\" class=\"elementor-sub-item\">Port de Calais<\/a><\/li>\n\t\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8013\"><a href=\"https:\/\/calais-dover.com\/fr\/port-de-douvres\/\" class=\"elementor-sub-item\">Port de Douvres<\/a><\/li>\n\t<\/ul>\n<\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2861\"><a href=\"https:\/\/calais-dover.com\/fr\/parking-calais\/\" class=\"elementor-sub-item\">Parking Calais<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\t\t\t<\/nav>\n\t\t\t\t\t<div class=\"elementor-menu-toggle\" role=\"button\" tabindex=\"0\" aria-label=\"Permuter le menu\" aria-expanded=\"false\">\n\t\t\t<i aria-hidden=\"true\" role=\"presentation\" class=\"elementor-menu-toggle__icon--open eicon-menu-bar\"><\/i><i aria-hidden=\"true\" role=\"presentation\" class=\"elementor-menu-toggle__icon--close eicon-close\"><\/i>\t\t<\/div>\n\t\t\t\t\t<nav class=\"elementor-nav-menu--dropdown elementor-nav-menu__container\" aria-hidden=\"true\">\n\t\t\t\t<ul id=\"menu-2-29c81fd9\" class=\"elementor-nav-menu\"><li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-2523\"><a href=\"https:\/\/calais-dover.com\/fr\/\" class=\"elementor-item\" tabindex=\"-1\">Accueil<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2520\"><a href=\"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/\" class=\"elementor-item\" tabindex=\"-1\">Horaires<\/a><\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-7727\"><a href=\"#\" class=\"elementor-item elementor-item-anchor\" tabindex=\"-1\">Op\u00e9rateurs<\/a>\n<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8789\"><a href=\"https:\/\/calais-dover.com\/fr\/po-ferries\/\" class=\"elementor-sub-item\" tabindex=\"-1\">P&#038;O ferries<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8787\"><a href=\"https:\/\/calais-dover.com\/fr\/dfds\/\" class=\"elementor-sub-item\" tabindex=\"-1\">DFDS<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8788\"><a href=\"https:\/\/calais-dover.com\/fr\/irish-ferries\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Irish Ferries<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7907\"><a href=\"https:\/\/calais-dover.com\/fr\/comparez\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Comparez<\/a><\/li>\n<\/ul>\n<\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3822\"><a href=\"https:\/\/calais-dover.com\/fr\/eurotunnel\/\" class=\"elementor-item\" tabindex=\"-1\">Eurotunnel<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2508\"><a href=\"https:\/\/calais-dover.com\/fr\/prix\/\" class=\"elementor-item\" tabindex=\"-1\">Les prix<\/a><\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-7932\"><a href=\"#\" class=\"elementor-item elementor-item-anchor\" tabindex=\"-1\">Comment voyager?<\/a>\n<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7933\"><a href=\"https:\/\/calais-dover.com\/fr\/calais-douvres-en-voiture\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Voiture<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7940\"><a href=\"https:\/\/calais-dover.com\/fr\/avec-caravane-en-angleterre\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Caravane<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7941\"><a href=\"https:\/\/calais-dover.com\/fr\/passager-pieton\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Pi\u00e9ton<\/a><\/li>\n<\/ul>\n<\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-2860\"><a href=\"#\" class=\"elementor-item elementor-item-anchor\" tabindex=\"-1\">Plus d&rsquo;infos<\/a>\n<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2428\"><a href=\"https:\/\/calais-dover.com\/fr\/calais-douvres-webcams-et-meteo\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Webcams et m\u00e9t\u00e9o<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-7966\"><a href=\"https:\/\/calais-dover.com\/fr\/conduire-en-angleterre\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Conduire en Angleterre<\/a><\/li>\n\t<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-7967\"><a href=\"#\" class=\"elementor-sub-item elementor-item-anchor\" tabindex=\"-1\">Informations portuaires<\/a>\n\t<ul class=\"sub-menu elementor-nav-menu--dropdown\">\n\t\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8004\"><a href=\"https:\/\/calais-dover.com\/fr\/port-de-calais\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Port de Calais<\/a><\/li>\n\t\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-8013\"><a href=\"https:\/\/calais-dover.com\/fr\/port-de-douvres\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Port de Douvres<\/a><\/li>\n\t<\/ul>\n<\/li>\n\t<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-2861\"><a href=\"https:\/\/calais-dover.com\/fr\/parking-calais\/\" class=\"elementor-sub-item\" tabindex=\"-1\">Parking Calais<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\t\t\t<\/nav>\n\t\t\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<\/div>\n\t\t<\/section>\n\t\t\t\t<div class=\"elementor-element elementor-element-668b2de2 elementor-widget__width-auto elementor-hidden-desktop elementor-hidden-tablet elementor-widget-mobile__width-initial elementor-widget elementor-widget-breadcrumbs\" data-id=\"668b2de2\" 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:\/\/calais-dover.com\/fr\/page-daccueil\/\">Calais-Dover.com<\/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-3f22fdfb elementor-widget elementor-widget-theme-post-excerpt\" data-id=\"3f22fdfb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-excerpt.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\tD\u00e9parts Calais-Douvres par jour, dur\u00e9e de travers\u00e9e et horaires P&amp;O, DFDS et Irish Ferries.\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-11fa232 elementor-absolute elementor-widget__width-initial elementor-widget-tablet__width-initial elementor-hidden-mobile elementor-widget elementor-widget-image\" data-id=\"11fa232\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_position&quot;:&quot;absolute&quot;}\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"lazyload\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/06\/Zonder-titel-300-x-130-px-300-x-200-px-1.png\" title=\"Zonder-titel-300-x-130-px-300-x-200-px-1.png\" alt=\"Zonder-titel-300-x-130-px-300-x-200-px-1.png\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-152fe442 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"152fe442\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-2e541a52\" data-id=\"2e541a52\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3e131a37 elementor-widget__width-initial elementor-widget elementor-widget-shortcode\" data-id=\"3e131a37\" 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 id=\"bookingmodule\"><iframe id=\"dealFinder\" marginwidth=\"0\" frameborder=\"0\" scrolling=\"no\" height=\"100%\" marginheight=\"0\" style=\"width:100%;\" src=\"https:\/\/wiz.directferries.com\/partners\/deal_finder_iframe.aspx?stdc=F5663F&cult=fr-FR&oprt=Douvres&btn=46a492&btnh=168b16&btnt=FFFFFF&tclr=000001&lclr=FFFFFF&lbld=700&pclr=FFFFFF&sclr=64b6e6&targ=1\" style=\"z-index:1\"><\/iframe><\/div><\/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<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-2a261b37 elementor-hidden-mobile\" data-id=\"2a261b37\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-55a1bdae elementor-widget__width-auto elementor-widget elementor-widget-image\" data-id=\"55a1bdae\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"lazyload\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/thumbs_dir\/po-ferries-logo-1-qpi106rswklchmyrxtkl365gwpaopcqeyqiu1pzer8.jpg\" title=\"po-ferries-logo.jpg\" alt=\"po-ferries-logo.jpg\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\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-2649ef45 elementor-widget__width-auto elementor-widget elementor-widget-image\" data-id=\"2649ef45\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"lazyload\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/thumbs_dir\/dfds-logo-1-qpi105typqk261053b5yioe0bbfbhnmomlvckg0sxg.jpg\" title=\"dfds-logo.jpg\" alt=\"dfds-logo.jpg\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\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-6bf59f47 elementor-widget__width-auto elementor-widget elementor-widget-image\" data-id=\"6bf59f47\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"lazyload\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/thumbs_dir\/irish-ferries-logo-2-qpi103yac2hhit2veacpdov34jol29f7yckdlw3l9w.jpg\" title=\"irish-ferries-logo.jpg\" alt=\"irish-ferries-logo.jpg\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\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-45bf3c0a elementor-widget__width-auto elementor-widget elementor-widget-image\" data-id=\"45bf3c0a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"lazyload\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/thumbs_dir\/le-shutle-qwlordcicbh9a64k6rz0xe3le2cspdfwbmlp1q0778.jpg\" title=\"le shutle\" alt=\"le shutle\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\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-20913f8f elementor-widget__width-auto elementor-widget elementor-widget-image\" data-id=\"20913f8f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"lazyload\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/thumbs_dir\/Eurostar-logo-2-qpi108nha8nx4uw1mudu85oe3h1f4qxvmztt09wmes.jpg\" title=\"Eurostar-logo.jpg\" alt=\"Eurostar-logo.jpg\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\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<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\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<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-435e82d5 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"435e82d5\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-3af3ed18\" data-id=\"3af3ed18\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ad3cc71 elementor-widget elementor-widget-text-editor\" data-id=\"ad3cc71\" 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>Consultez les horaires du ferry Calais Douvres par jour de voyage. Cette page regroupe les d\u00e9parts des principaux op\u00e9rateurs de la ligne, dont <strong>P&amp;O Ferries, DFDS et Irish Ferries<\/strong>.<\/p>\n\n<p>Vous pouvez v\u00e9rifier les travers\u00e9es dans les deux sens: Calais vers Douvres et Douvres vers Calais. Les tableaux indiquent les heures de d\u00e9part, les arriv\u00e9es pr\u00e9vues, la dur\u00e9e et l\u2019op\u00e9rateur lorsque ces informations sont disponibles.<\/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<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-5f275e5e\" data-id=\"5f275e5e\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a83de9a elementor-hidden-mobile elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"a83de9a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<i aria-hidden=\"true\" class=\"far fa-calendar-alt\"><\/i>\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<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-711d4cc5 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"711d4cc5\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;sticky&quot;:&quot;top&quot;,&quot;sticky_on&quot;:[&quot;desktop&quot;,&quot;tablet&quot;,&quot;mobile&quot;],&quot;sticky_offset&quot;:0,&quot;sticky_effects_offset&quot;:0,&quot;sticky_anchor_link_offset&quot;:0}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-54ead2ba\" data-id=\"54ead2ba\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4dad3411 elementor-align-start elementor-icon-list--layout-inline elementor-mobile-align-center elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"4dad3411\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items elementor-inline-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"#horaires\">\n\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Horaires<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"#d&#039;enregistrement\">\n\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Informations d'enregistrement<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\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<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-4decc8bb\" data-id=\"4decc8bb\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ab76b27 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ab76b27\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-extended\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5103864\" data-id=\"5103864\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-909f5d6 elementor-widget elementor-widget-text-editor\" data-id=\"909f5d6\" 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 id=\"horaires\">Horaires ferry Calais Douvres<\/h3>\n\n<p>Le tableau ci-dessous affiche les horaires du ferry de Calais \u00e0 Douvres. Cette vue par jour permet de garder les d\u00e9parts lisibles, m\u00eame lorsque plusieurs travers\u00e9es sont programm\u00e9es.<\/p>\n\n<p>Regardez surtout l\u2019heure de d\u00e9part, l\u2019heure d\u2019arriv\u00e9e et l\u2019op\u00e9rateur. Si vous cherchez les <strong>horaires P&amp;O Ferries Calais Douvres<\/strong>, v\u00e9rifiez la colonne op\u00e9rateur dans le tableau.<\/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-84ef2bb elementor-widget elementor-widget-shortcode\" data-id=\"84ef2bb\" 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 tp-theme-extended_cards tp-day-setup-modern\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/calais-dover.com\\\/fr\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;route&quot;:97,&quot;days&quot;:1,&quot;autoload&quot;:true,&quot;theme&quot;:&quot;extended_cards&quot;,&quot;daySetup&quot;:&quot;modern&quot;,&quot;limit10&quot;:true,&quot;label&quot;:&quot;Calais - Dover&quot;,&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Date&quot;,&quot;ui_days&quot;:&quot;Jours&quot;,&quot;ui_button&quot;:&quot;Afficher les travers\\u00e9es&quot;,&quot;status_idle&quot;:&quot;Choisissez une date et cliquez sur Afficher les travers\\u00e9es&quot;,&quot;status_loading&quot;:&quot;Chargement...&quot;,&quot;status_empty&quot;:&quot;Aucune travers\\u00e9e trouv\\u00e9e&quot;,&quot;status_found&quot;:&quot;%d travers\\u00e9es trouv\\u00e9es&quot;,&quot;th_date&quot;:&quot;Date&quot;,&quot;th_dep&quot;:&quot;D\\u00e9part&quot;,&quot;th_arr&quot;:&quot;Arriv\\u00e9e&quot;,&quot;th_dur&quot;:&quot;Dur\\u00e9e&quot;,&quot;th_ship&quot;:&quot;Navire&quot;,&quot;th_op&quot;:&quot;Op\\u00e9rateur&quot;,&quot;th_route&quot;:&quot;Route&quot;,&quot;wd_sun&quot;:&quot;DIM&quot;,&quot;wd_mon&quot;:&quot;LUN&quot;,&quot;wd_tue&quot;:&quot;MAR&quot;,&quot;wd_wed&quot;:&quot;MER&quot;,&quot;wd_thu&quot;:&quot;JEU&quot;,&quot;wd_fri&quot;:&quot;VEN&quot;,&quot;wd_sat&quot;:&quot;SAM&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Voir tous les d\\u00e9parts %s dans notre horaire&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Voir plus de d\\u00e9parts %1$s et %2$s dans notre horaire&quot;,&quot;summary_footer_generic&quot;:&quot;Consultez notre horaire pour plus de travers\\u00e9es&quot;,&quot;summary_header&quot;:&quot;Les deux prochains d\\u00e9parts :&quot;,&quot;summary_no_upcoming&quot;:&quot;Aucun prochain d\\u00e9part trouv\\u00e9&quot;,&quot;more_link&quot;:&quot;Plus de travers\\u00e9es&quot;,&quot;more_departures_button&quot;:&quot;Afficher plus de d\\u00e9parts&quot;,&quot;day_nav_previous&quot;:&quot;Afficher le jour pr\\u00e9c\\u00e9dent&quot;,&quot;day_nav_next&quot;:&quot;Afficher le jour suivant&quot;,&quot;day_nav_today&quot;:&quot;Afficher aujourd\\u2019hui&quot;,&quot;day_nav_tomorrow&quot;:&quot;Afficher demain&quot;,&quot;local_time_pair&quot;:&quot;Heure locale du port de d\\u00e9part : %1$s \\\/ Heure locale du port d&#039;arriv\\u00e9e : %2$s&quot;,&quot;local_time_combined&quot;:&quot;Heure locale des ports de d\\u00e9part et d&#039;arriv\\u00e9e : %s&quot;,&quot;tag_often_booked&quot;:&quot;\\u2b50 Souvent r\\u00e9serv\\u00e9&quot;,&quot;tag_leaving_soon&quot;:&quot;\\ud83d\\udd34 D\\u00e9part imminent&quot;,&quot;tag_currently_sailing&quot;:&quot;\\ud83d\\udfe2 En navigation&quot;,&quot;tag_arrived&quot;:&quot;\\u26ab Arriv\\u00e9&quot;,&quot;tag_overnight&quot;:&quot;Nuit \\u00e0 bord&quot;},&quot;showLogo&quot;:true,&quot;activityBoosters&quot;:true,&quot;shipMap&quot;:{&quot;p&amp;o ferries&quot;:&quot;P&amp;O Ferries&quot;,&quot;dfds&quot;:&quot;DFDS&quot;,&quot;irish ferries&quot;:&quot;Irish Ferries&quot;,&quot;norfolk line&quot;:&quot;DFDS&quot;},&quot;shipLinks&quot;:[],&quot;showShip&quot;:true,&quot;departurePort&quot;:&quot;Calais&quot;,&quot;arrivalPort&quot;:&quot;Dover&quot;,&quot;departureTimezone&quot;:&quot;Europe\\\/Paris&quot;,&quot;arrivalTimezone&quot;:&quot;Europe\\\/London&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 class=\"tp-day-field\">\n      <label for=\"tp-range\">Jours<\/label><br>\n      <select id=\"tp-range\" class=\"tp-range\" aria-label=\"Jours\">\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\">Afficher les travers\u00e9es<\/button><\/div>\n  <\/div>\n\n  <div class=\"tp-local-nav-row\">\n    <div class=\"tp-local-times\" id=\"tp-local-times\" aria-live=\"polite\"><\/div>\n    <div class=\"tp-day-nav-host\"><\/div>\n  <\/div>\n  <div id=\"tp-status\" class=\"tp-muted\" aria-live=\"polite\">Choisissez une date et cliquez sur Afficher les travers\u00e9es<\/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\">Chargement...<\/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  const controls = wrap.querySelector('.tp-controls');\n  const navHost = wrap.querySelector('.tp-day-nav-host');\n  const localTimesEl = wrap.querySelector('#tp-local-times');\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'}); } \/\/ 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 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      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.opId||''), String(+r.dep||0), String(+r.arr||0), String(r.ship||'')].join('|');\n  }\n\n  function pickFeaturedKey(rows, avoidKey){\n    if (!activityBoosters || !rows.length) return '';\n    const routeSeed = parseInt(cfg.route, 10) || 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((routeSeed + 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 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\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.op+'<\/th>');\n\n    let html = '<table class=\"tp-table\"><thead><tr>'+headCells.join('')+'<\/tr><\/thead><tbody>';\n\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 cells = [\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span>'+boostersHtml(r, false)+'<\/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>'+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    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\">'+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\">'+(showShip ? shipBadge(r.ship) : '')+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>';\n      }\n\n      html +=\n        \/\/ Row 3: Operator + route label (no book button)\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          (routeName ? ('<div class=\"rhs\"><span class=\"tp-route-ticket\">'+routeTicketHtml(routeName)+'<\/span><\/div>') : '<div class=\"rhs\"><\/div>')+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  function renderExtendedCards(rows){\n    const routeName = cfg.label || '';\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        +   (routeName ? ('<div class=\"tp-ext-route\">'+routeName+'<\/div>') : '')\n        + '<\/div>'\n        + '<div class=\"tp-ext-right\">'+link+'<\/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  = (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 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      let 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      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      if(rows.length===0){ status.textContent = L.status_empty; clearStatusInline(); out.innerHTML=''; return; }\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      status.textContent = '';\n      setStatusInline(\n  (L.status_found || '%d sailings found').replace('%d', '<strong>'+rows.length+'<\/strong>')\n);\n      out.innerHTML = renderTable(visibleRows) + renderCards(visibleRows) + moreButtonHtml(hiddenCount);\n      bindRowLinks();\n      if (navHost) navHost.innerHTML = navHtml();\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  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<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4d3575a elementor-widget elementor-widget-text-editor\" data-id=\"4d3575a\" 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 id=\"dover-calais-ferry-timetable\">Horaires du ferry Douvres\u2013Calais<\/h2><p>Cet horaire pr\u00e9sente les d\u00e9parts en direct depuis Douvres ainsi que les arriv\u00e9es pr\u00e9vues \u00e0 Calais. Ici aussi, l\u2019affichage par d\u00e9faut est de <strong>1 jour<\/strong>, ce qui permet de conserver une bonne lisibilit\u00e9 sur une liaison comptant de nombreux d\u00e9parts quotidiens. Les horaires de P&amp;O Ferries, DFDS et Irish Ferries peuvent \u00e9galement \u00eatre consult\u00e9s directement.<\/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-a71c333 elementor-widget elementor-widget-shortcode\" data-id=\"a71c333\" 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 tp-theme-extended_cards tp-day-setup-modern\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/calais-dover.com\\\/fr\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;route&quot;:98,&quot;days&quot;:1,&quot;autoload&quot;:true,&quot;theme&quot;:&quot;extended_cards&quot;,&quot;daySetup&quot;:&quot;modern&quot;,&quot;limit10&quot;:true,&quot;label&quot;:&quot;Dover - Calais&quot;,&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Date&quot;,&quot;ui_days&quot;:&quot;Jours&quot;,&quot;ui_button&quot;:&quot;Afficher les travers\\u00e9es&quot;,&quot;status_idle&quot;:&quot;Choisissez une date et cliquez sur Afficher les travers\\u00e9es&quot;,&quot;status_loading&quot;:&quot;Chargement...&quot;,&quot;status_empty&quot;:&quot;Aucune travers\\u00e9e trouv\\u00e9e&quot;,&quot;status_found&quot;:&quot;%d travers\\u00e9es trouv\\u00e9es&quot;,&quot;th_date&quot;:&quot;Date&quot;,&quot;th_dep&quot;:&quot;D\\u00e9part&quot;,&quot;th_arr&quot;:&quot;Arriv\\u00e9e&quot;,&quot;th_dur&quot;:&quot;Dur\\u00e9e&quot;,&quot;th_ship&quot;:&quot;Navire&quot;,&quot;th_op&quot;:&quot;Op\\u00e9rateur&quot;,&quot;th_route&quot;:&quot;Route&quot;,&quot;wd_sun&quot;:&quot;DIM&quot;,&quot;wd_mon&quot;:&quot;LUN&quot;,&quot;wd_tue&quot;:&quot;MAR&quot;,&quot;wd_wed&quot;:&quot;MER&quot;,&quot;wd_thu&quot;:&quot;JEU&quot;,&quot;wd_fri&quot;:&quot;VEN&quot;,&quot;wd_sat&quot;:&quot;SAM&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Voir tous les d\\u00e9parts %s dans notre horaire&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Voir plus de d\\u00e9parts %1$s et %2$s dans notre horaire&quot;,&quot;summary_footer_generic&quot;:&quot;Consultez notre horaire pour plus de travers\\u00e9es&quot;,&quot;summary_header&quot;:&quot;Les deux prochains d\\u00e9parts :&quot;,&quot;summary_no_upcoming&quot;:&quot;Aucun prochain d\\u00e9part trouv\\u00e9&quot;,&quot;more_link&quot;:&quot;Plus de travers\\u00e9es&quot;,&quot;more_departures_button&quot;:&quot;Afficher plus de d\\u00e9parts&quot;,&quot;day_nav_previous&quot;:&quot;Afficher le jour pr\\u00e9c\\u00e9dent&quot;,&quot;day_nav_next&quot;:&quot;Afficher le jour suivant&quot;,&quot;day_nav_today&quot;:&quot;Afficher aujourd\\u2019hui&quot;,&quot;day_nav_tomorrow&quot;:&quot;Afficher demain&quot;,&quot;local_time_pair&quot;:&quot;Heure locale du port de d\\u00e9part : %1$s \\\/ Heure locale du port d&#039;arriv\\u00e9e : %2$s&quot;,&quot;local_time_combined&quot;:&quot;Heure locale des ports de d\\u00e9part et d&#039;arriv\\u00e9e : %s&quot;,&quot;tag_often_booked&quot;:&quot;\\u2b50 Souvent r\\u00e9serv\\u00e9&quot;,&quot;tag_leaving_soon&quot;:&quot;\\ud83d\\udd34 D\\u00e9part imminent&quot;,&quot;tag_currently_sailing&quot;:&quot;\\ud83d\\udfe2 En navigation&quot;,&quot;tag_arrived&quot;:&quot;\\u26ab Arriv\\u00e9&quot;,&quot;tag_overnight&quot;:&quot;Nuit \\u00e0 bord&quot;},&quot;showLogo&quot;:true,&quot;activityBoosters&quot;:true,&quot;shipMap&quot;:{&quot;p&amp;o ferries&quot;:&quot;P&amp;O Ferries&quot;,&quot;dfds&quot;:&quot;DFDS&quot;,&quot;irish ferries&quot;:&quot;Irish Ferries&quot;,&quot;norfolk line&quot;:&quot;DFDS&quot;},&quot;shipLinks&quot;:[],&quot;showShip&quot;:true,&quot;departurePort&quot;:&quot;Dover&quot;,&quot;arrivalPort&quot;:&quot;Calais&quot;,&quot;departureTimezone&quot;:&quot;Europe\\\/London&quot;,&quot;arrivalTimezone&quot;:&quot;Europe\\\/Paris&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 class=\"tp-day-field\">\n      <label for=\"tp-range\">Jours<\/label><br>\n      <select id=\"tp-range\" class=\"tp-range\" aria-label=\"Jours\">\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\">Afficher les travers\u00e9es<\/button><\/div>\n  <\/div>\n\n  <div class=\"tp-local-nav-row\">\n    <div class=\"tp-local-times\" id=\"tp-local-times\" aria-live=\"polite\"><\/div>\n    <div class=\"tp-day-nav-host\"><\/div>\n  <\/div>\n  <div id=\"tp-status\" class=\"tp-muted\" aria-live=\"polite\">Choisissez une date et cliquez sur Afficher les travers\u00e9es<\/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\">Chargement...<\/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  const controls = wrap.querySelector('.tp-controls');\n  const navHost = wrap.querySelector('.tp-day-nav-host');\n  const localTimesEl = wrap.querySelector('#tp-local-times');\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'}); } \/\/ 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 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      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.opId||''), String(+r.dep||0), String(+r.arr||0), String(r.ship||'')].join('|');\n  }\n\n  function pickFeaturedKey(rows, avoidKey){\n    if (!activityBoosters || !rows.length) return '';\n    const routeSeed = parseInt(cfg.route, 10) || 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((routeSeed + 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 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\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.op+'<\/th>');\n\n    let html = '<table class=\"tp-table\"><thead><tr>'+headCells.join('')+'<\/tr><\/thead><tbody>';\n\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 cells = [\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span>'+boostersHtml(r, false)+'<\/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>'+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    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\">'+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\">'+(showShip ? shipBadge(r.ship) : '')+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>';\n      }\n\n      html +=\n        \/\/ Row 3: Operator + route label (no book button)\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          (routeName ? ('<div class=\"rhs\"><span class=\"tp-route-ticket\">'+routeTicketHtml(routeName)+'<\/span><\/div>') : '<div class=\"rhs\"><\/div>')+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  function renderExtendedCards(rows){\n    const routeName = cfg.label || '';\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        +   (routeName ? ('<div class=\"tp-ext-route\">'+routeName+'<\/div>') : '')\n        + '<\/div>'\n        + '<div class=\"tp-ext-right\">'+link+'<\/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  = (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 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      let 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      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      if(rows.length===0){ status.textContent = L.status_empty; clearStatusInline(); out.innerHTML=''; return; }\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      status.textContent = '';\n      setStatusInline(\n  (L.status_found || '%d sailings found').replace('%d', '<strong>'+rows.length+'<\/strong>')\n);\n      out.innerHTML = renderTable(visibleRows) + renderCards(visibleRows) + moreButtonHtml(hiddenCount);\n      bindRowLinks();\n      if (navHost) navHost.innerHTML = navHtml();\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  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<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ab81f8a elementor-widget elementor-widget-text-editor\" data-id=\"ab81f8a\" 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>P&amp;O Ferries, DFDS ou Irish Ferries?<\/h3><p>Sur la route Calais Douvres, les horaires peuvent varier selon l\u2019op\u00e9rateur. P&amp;O Ferries, DFDS et Irish Ferries desservent la m\u00eame travers\u00e9e, mais les heures de d\u00e9part, les r\u00e8gles d\u2019enregistrement et les billets disponibles ne sont pas toujours identiques.<\/p><p>Si vous avez d\u00e9j\u00e0 r\u00e9serv\u00e9, utilisez toujours l\u2019horaire indiqu\u00e9 sur votre billet comme r\u00e9f\u00e9rence finale. Si vous comparez encore les options, le tableau permet de voir rapidement quel op\u00e9rateur propose le d\u00e9part qui correspond le mieux \u00e0 votre trajet.<\/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-41a33b9 elementor-widget elementor-widget-text-editor\" data-id=\"41a33b9\" 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 id=\"calais-folkestone-eurotunnel-timetable\">Eurotunnel Calais\u2013Folkestone<\/h2>\nVous trouverez ci-dessous les horaires de d\u00e9part en direct de Le Shuttle \/ Eurotunnel entre Calais et Folkestone. Par d\u00e9faut, nous affichons <strong>1 jour<\/strong>. Il s\u2019agit de la travers\u00e9e la plus rapide sur ce corridor pour les voitures, les utilitaires, les motos, les camping-cars et le transport de marchandises.\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-32095cd elementor-widget elementor-widget-shortcode\" data-id=\"32095cd\" 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 tp-theme-extended_cards tp-day-setup-modern\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/calais-dover.com\\\/fr\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;route&quot;:8,&quot;days&quot;:1,&quot;autoload&quot;:true,&quot;theme&quot;:&quot;extended_cards&quot;,&quot;daySetup&quot;:&quot;modern&quot;,&quot;limit10&quot;:true,&quot;label&quot;:&quot;Calais - Folkestone&quot;,&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Date&quot;,&quot;ui_days&quot;:&quot;Jours&quot;,&quot;ui_button&quot;:&quot;Afficher les travers\\u00e9es&quot;,&quot;status_idle&quot;:&quot;Choisissez une date et cliquez sur Afficher les travers\\u00e9es&quot;,&quot;status_loading&quot;:&quot;Chargement...&quot;,&quot;status_empty&quot;:&quot;Aucune travers\\u00e9e trouv\\u00e9e&quot;,&quot;status_found&quot;:&quot;%d travers\\u00e9es trouv\\u00e9es&quot;,&quot;th_date&quot;:&quot;Date&quot;,&quot;th_dep&quot;:&quot;D\\u00e9part&quot;,&quot;th_arr&quot;:&quot;Arriv\\u00e9e&quot;,&quot;th_dur&quot;:&quot;Dur\\u00e9e&quot;,&quot;th_ship&quot;:&quot;Navire&quot;,&quot;th_op&quot;:&quot;Op\\u00e9rateur&quot;,&quot;th_route&quot;:&quot;Route&quot;,&quot;wd_sun&quot;:&quot;DIM&quot;,&quot;wd_mon&quot;:&quot;LUN&quot;,&quot;wd_tue&quot;:&quot;MAR&quot;,&quot;wd_wed&quot;:&quot;MER&quot;,&quot;wd_thu&quot;:&quot;JEU&quot;,&quot;wd_fri&quot;:&quot;VEN&quot;,&quot;wd_sat&quot;:&quot;SAM&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Voir tous les d\\u00e9parts %s dans notre horaire&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Voir plus de d\\u00e9parts %1$s et %2$s dans notre horaire&quot;,&quot;summary_footer_generic&quot;:&quot;Consultez notre horaire pour plus de travers\\u00e9es&quot;,&quot;summary_header&quot;:&quot;Les deux prochains d\\u00e9parts :&quot;,&quot;summary_no_upcoming&quot;:&quot;Aucun prochain d\\u00e9part trouv\\u00e9&quot;,&quot;more_link&quot;:&quot;Plus de travers\\u00e9es&quot;,&quot;more_departures_button&quot;:&quot;Afficher plus de d\\u00e9parts&quot;,&quot;day_nav_previous&quot;:&quot;Afficher le jour pr\\u00e9c\\u00e9dent&quot;,&quot;day_nav_next&quot;:&quot;Afficher le jour suivant&quot;,&quot;day_nav_today&quot;:&quot;Afficher aujourd\\u2019hui&quot;,&quot;day_nav_tomorrow&quot;:&quot;Afficher demain&quot;,&quot;local_time_pair&quot;:&quot;Heure locale du port de d\\u00e9part : %1$s \\\/ Heure locale du port d&#039;arriv\\u00e9e : %2$s&quot;,&quot;local_time_combined&quot;:&quot;Heure locale des ports de d\\u00e9part et d&#039;arriv\\u00e9e : %s&quot;,&quot;tag_often_booked&quot;:&quot;\\u2b50 Souvent r\\u00e9serv\\u00e9&quot;,&quot;tag_leaving_soon&quot;:&quot;\\ud83d\\udd34 D\\u00e9part imminent&quot;,&quot;tag_currently_sailing&quot;:&quot;\\ud83d\\udfe2 En navigation&quot;,&quot;tag_arrived&quot;:&quot;\\u26ab Arriv\\u00e9&quot;,&quot;tag_overnight&quot;:&quot;Nuit \\u00e0 bord&quot;},&quot;showLogo&quot;:true,&quot;activityBoosters&quot;:true,&quot;shipMap&quot;:{&quot;eurotunnel&quot;:&quot;Eurotunnel&quot;},&quot;shipLinks&quot;:[],&quot;showShip&quot;:false,&quot;departurePort&quot;:&quot;Calais&quot;,&quot;arrivalPort&quot;:&quot;Folkestone&quot;,&quot;departureTimezone&quot;:&quot;Europe\\\/Paris&quot;,&quot;arrivalTimezone&quot;:&quot;Europe\\\/London&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 class=\"tp-day-field\">\n      <label for=\"tp-range\">Jours<\/label><br>\n      <select id=\"tp-range\" class=\"tp-range\" aria-label=\"Jours\">\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\">Afficher les travers\u00e9es<\/button><\/div>\n  <\/div>\n\n  <div class=\"tp-local-nav-row\">\n    <div class=\"tp-local-times\" id=\"tp-local-times\" aria-live=\"polite\"><\/div>\n    <div class=\"tp-day-nav-host\"><\/div>\n  <\/div>\n  <div id=\"tp-status\" class=\"tp-muted\" aria-live=\"polite\">Choisissez une date et cliquez sur Afficher les travers\u00e9es<\/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\">Chargement...<\/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  const controls = wrap.querySelector('.tp-controls');\n  const navHost = wrap.querySelector('.tp-day-nav-host');\n  const localTimesEl = wrap.querySelector('#tp-local-times');\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'}); } \/\/ 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 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      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.opId||''), String(+r.dep||0), String(+r.arr||0), String(r.ship||'')].join('|');\n  }\n\n  function pickFeaturedKey(rows, avoidKey){\n    if (!activityBoosters || !rows.length) return '';\n    const routeSeed = parseInt(cfg.route, 10) || 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((routeSeed + 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 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\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.op+'<\/th>');\n\n    let html = '<table class=\"tp-table\"><thead><tr>'+headCells.join('')+'<\/tr><\/thead><tbody>';\n\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 cells = [\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span>'+boostersHtml(r, false)+'<\/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>'+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    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\">'+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\">'+(showShip ? shipBadge(r.ship) : '')+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>';\n      }\n\n      html +=\n        \/\/ Row 3: Operator + route label (no book button)\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          (routeName ? ('<div class=\"rhs\"><span class=\"tp-route-ticket\">'+routeTicketHtml(routeName)+'<\/span><\/div>') : '<div class=\"rhs\"><\/div>')+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  function renderExtendedCards(rows){\n    const routeName = cfg.label || '';\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        +   (routeName ? ('<div class=\"tp-ext-route\">'+routeName+'<\/div>') : '')\n        + '<\/div>'\n        + '<div class=\"tp-ext-right\">'+link+'<\/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  = (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 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      let 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      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      if(rows.length===0){ status.textContent = L.status_empty; clearStatusInline(); out.innerHTML=''; return; }\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      status.textContent = '';\n      setStatusInline(\n  (L.status_found || '%d sailings found').replace('%d', '<strong>'+rows.length+'<\/strong>')\n);\n      out.innerHTML = renderTable(visibleRows) + renderCards(visibleRows) + moreButtonHtml(hiddenCount);\n      bindRowLinks();\n      if (navHost) navHost.innerHTML = navHtml();\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  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<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9be4676 elementor-widget elementor-widget-text-editor\" data-id=\"9be4676\" 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 id=\"folkestone-calais-eurotunnel-timetable\">Eurotunnel Folkestone\u2013Calais<\/h2><p>Cet horaire pr\u00e9sente les d\u00e9parts en direct depuis Folkestone ainsi que les arriv\u00e9es pr\u00e9vues \u00e0 Calais. Gr\u00e2ce \u00e0 la vue sur <strong>1 jour<\/strong>, les horaires restent faciles \u00e0 consulter, m\u00eame lors des journ\u00e9es avec de nombreux d\u00e9parts. Des informations compl\u00e9mentaires sur l\u2019Eurotunnel sont \u00e9galement disponibles.<\/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-2799839 elementor-widget elementor-widget-shortcode\" data-id=\"2799839\" 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 tp-theme-extended_cards tp-day-setup-modern\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/calais-dover.com\\\/fr\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;route&quot;:56,&quot;days&quot;:1,&quot;autoload&quot;:true,&quot;theme&quot;:&quot;extended_cards&quot;,&quot;daySetup&quot;:&quot;modern&quot;,&quot;limit10&quot;:true,&quot;label&quot;:&quot;Folkestone - Calais&quot;,&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Date&quot;,&quot;ui_days&quot;:&quot;Jours&quot;,&quot;ui_button&quot;:&quot;Afficher les travers\\u00e9es&quot;,&quot;status_idle&quot;:&quot;Choisissez une date et cliquez sur Afficher les travers\\u00e9es&quot;,&quot;status_loading&quot;:&quot;Chargement...&quot;,&quot;status_empty&quot;:&quot;Aucune travers\\u00e9e trouv\\u00e9e&quot;,&quot;status_found&quot;:&quot;%d travers\\u00e9es trouv\\u00e9es&quot;,&quot;th_date&quot;:&quot;Date&quot;,&quot;th_dep&quot;:&quot;D\\u00e9part&quot;,&quot;th_arr&quot;:&quot;Arriv\\u00e9e&quot;,&quot;th_dur&quot;:&quot;Dur\\u00e9e&quot;,&quot;th_ship&quot;:&quot;Navire&quot;,&quot;th_op&quot;:&quot;Op\\u00e9rateur&quot;,&quot;th_route&quot;:&quot;Route&quot;,&quot;wd_sun&quot;:&quot;DIM&quot;,&quot;wd_mon&quot;:&quot;LUN&quot;,&quot;wd_tue&quot;:&quot;MAR&quot;,&quot;wd_wed&quot;:&quot;MER&quot;,&quot;wd_thu&quot;:&quot;JEU&quot;,&quot;wd_fri&quot;:&quot;VEN&quot;,&quot;wd_sat&quot;:&quot;SAM&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Voir tous les d\\u00e9parts %s dans notre horaire&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Voir plus de d\\u00e9parts %1$s et %2$s dans notre horaire&quot;,&quot;summary_footer_generic&quot;:&quot;Consultez notre horaire pour plus de travers\\u00e9es&quot;,&quot;summary_header&quot;:&quot;Les deux prochains d\\u00e9parts :&quot;,&quot;summary_no_upcoming&quot;:&quot;Aucun prochain d\\u00e9part trouv\\u00e9&quot;,&quot;more_link&quot;:&quot;Plus de travers\\u00e9es&quot;,&quot;more_departures_button&quot;:&quot;Afficher plus de d\\u00e9parts&quot;,&quot;day_nav_previous&quot;:&quot;Afficher le jour pr\\u00e9c\\u00e9dent&quot;,&quot;day_nav_next&quot;:&quot;Afficher le jour suivant&quot;,&quot;day_nav_today&quot;:&quot;Afficher aujourd\\u2019hui&quot;,&quot;day_nav_tomorrow&quot;:&quot;Afficher demain&quot;,&quot;local_time_pair&quot;:&quot;Heure locale du port de d\\u00e9part : %1$s \\\/ Heure locale du port d&#039;arriv\\u00e9e : %2$s&quot;,&quot;local_time_combined&quot;:&quot;Heure locale des ports de d\\u00e9part et d&#039;arriv\\u00e9e : %s&quot;,&quot;tag_often_booked&quot;:&quot;\\u2b50 Souvent r\\u00e9serv\\u00e9&quot;,&quot;tag_leaving_soon&quot;:&quot;\\ud83d\\udd34 D\\u00e9part imminent&quot;,&quot;tag_currently_sailing&quot;:&quot;\\ud83d\\udfe2 En navigation&quot;,&quot;tag_arrived&quot;:&quot;\\u26ab Arriv\\u00e9&quot;,&quot;tag_overnight&quot;:&quot;Nuit \\u00e0 bord&quot;},&quot;showLogo&quot;:true,&quot;activityBoosters&quot;:true,&quot;shipMap&quot;:{&quot;eurotunnel&quot;:&quot;Eurotunnel&quot;},&quot;shipLinks&quot;:[],&quot;showShip&quot;:false,&quot;departurePort&quot;:&quot;Folkestone&quot;,&quot;arrivalPort&quot;:&quot;Calais&quot;,&quot;departureTimezone&quot;:&quot;Europe\\\/London&quot;,&quot;arrivalTimezone&quot;:&quot;Europe\\\/Paris&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 class=\"tp-day-field\">\n      <label for=\"tp-range\">Jours<\/label><br>\n      <select id=\"tp-range\" class=\"tp-range\" aria-label=\"Jours\">\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\">Afficher les travers\u00e9es<\/button><\/div>\n  <\/div>\n\n  <div class=\"tp-local-nav-row\">\n    <div class=\"tp-local-times\" id=\"tp-local-times\" aria-live=\"polite\"><\/div>\n    <div class=\"tp-day-nav-host\"><\/div>\n  <\/div>\n  <div id=\"tp-status\" class=\"tp-muted\" aria-live=\"polite\">Choisissez une date et cliquez sur Afficher les travers\u00e9es<\/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\">Chargement...<\/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  const controls = wrap.querySelector('.tp-controls');\n  const navHost = wrap.querySelector('.tp-day-nav-host');\n  const localTimesEl = wrap.querySelector('#tp-local-times');\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'}); } \/\/ 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 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      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.opId||''), String(+r.dep||0), String(+r.arr||0), String(r.ship||'')].join('|');\n  }\n\n  function pickFeaturedKey(rows, avoidKey){\n    if (!activityBoosters || !rows.length) return '';\n    const routeSeed = parseInt(cfg.route, 10) || 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((routeSeed + 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 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\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.op+'<\/th>');\n\n    let html = '<table class=\"tp-table\"><thead><tr>'+headCells.join('')+'<\/tr><\/thead><tbody>';\n\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 cells = [\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span>'+boostersHtml(r, false)+'<\/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>'+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    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\">'+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\">'+(showShip ? shipBadge(r.ship) : '')+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>';\n      }\n\n      html +=\n        \/\/ Row 3: Operator + route label (no book button)\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          (routeName ? ('<div class=\"rhs\"><span class=\"tp-route-ticket\">'+routeTicketHtml(routeName)+'<\/span><\/div>') : '<div class=\"rhs\"><\/div>')+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  function renderExtendedCards(rows){\n    const routeName = cfg.label || '';\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        +   (routeName ? ('<div class=\"tp-ext-route\">'+routeName+'<\/div>') : '')\n        + '<\/div>'\n        + '<div class=\"tp-ext-right\">'+link+'<\/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  = (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 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      let 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      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      if(rows.length===0){ status.textContent = L.status_empty; clearStatusInline(); out.innerHTML=''; return; }\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      status.textContent = '';\n      setStatusInline(\n  (L.status_found || '%d sailings found').replace('%d', '<strong>'+rows.length+'<\/strong>')\n);\n      out.innerHTML = renderTable(visibleRows) + renderCards(visibleRows) + moreButtonHtml(hiddenCount);\n      bindRowLinks();\n      if (navHost) navHost.innerHTML = navHtml();\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  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<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e11f84b elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"e11f84b\" 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 id=\"about-calais-dover-timetables\">Aper\u00e7u<\/h3><p>Cette page rassemble les principaux horaires entre Calais et Douvres, avec les travers\u00e9es en ferry et la liaison Le Shuttle \/ Eurotunnel entre Calais\/Coquelles et Folkestone. Elle permet de comparer rapidement les deux options les plus utilis\u00e9es entre la France et l\u2019Angleterre.<\/p><p><strong>Ferry ou tunnel ?<\/strong> Les ferries relient directement Calais \u00e0 Douvres et sont op\u00e9r\u00e9s par P&amp;O Ferries, DFDS et Irish Ferries. Le Shuttle passe par le tunnel sous la Manche et relie Calais\/Coquelles \u00e0 Folkestone. Le tunnel est g\u00e9n\u00e9ralement le choix le plus rapide pour les voyageurs en voiture, tandis que le ferry peut \u00eatre plus int\u00e9ressant selon le prix, l\u2019heure de d\u00e9part et l\u2019arriv\u00e9e souhait\u00e9e en Angleterre.<\/p><p>Les tableaux sont affich\u00e9s par jour de voyage. C\u2019est le format le plus lisible pour cette route, car les d\u00e9parts sont nombreux. Si vous pr\u00e9parez un trajet \u00e0 une autre date, s\u00e9lectionnez simplement le jour souhait\u00e9 dans le tableau.<\/p><blockquote><p><strong>Vous voyagez aujourd\u2019hui ou en p\u00e9riode charg\u00e9e ?<\/strong> Ne vous fiez pas uniquement \u00e0 l\u2019horaire affich\u00e9. V\u00e9rifiez aussi l\u2019op\u00e9rateur, l\u2019heure limite d\u2019enregistrement, la m\u00e9t\u00e9o, le trafic au port et les \u00e9ventuelles perturbations. Les mises \u00e0 jour peuvent parfois arriver avec un l\u00e9ger retard en cas d\u2019annulation de derni\u00e8re minute, de vent fort, de files d\u2019attente ou de changement op\u00e9rationnel.<\/p><\/blockquote><p>Pour les conditions de voyage avant le d\u00e9part, consultez aussi nos webcams et informations m\u00e9t\u00e9o Calais Douvres. Pour comparer avec le tunnel, utilisez notre page d\u00e9di\u00e9e \u00e0 l\u2019<a href=\"\/fr\/eurotunnel\/\">Eurotunnel Calais Folkestone<\/a>. Pour une source portuaire officielle, le <a href=\"https:\/\/www.portofdover.com\/ferry\/\" target=\"_blank\" rel=\"noopener\">Port of Dover<\/a> publie \u00e9galement des informations sur les ferries et les op\u00e9rateurs actifs au port.<\/p><p>Si un d\u00e9part n\u2019appara\u00eet pas encore, cela ne signifie pas forc\u00e9ment qu\u2019il est annul\u00e9. Le planning peut \u00eatre en cours de publication ou de mise \u00e0 jour, surtout lors des changements de saison, des vacances scolaires ou des journ\u00e9es de forte affluence. Si vous avez d\u00e9j\u00e0 r\u00e9serv\u00e9, la r\u00e9f\u00e9rence finale reste toujours votre billet et les informations communiqu\u00e9es par votre op\u00e9rateur.<\/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<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6e904112 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6e904112\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-extended\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7d70ce8c\" data-id=\"7d70ce8c\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-69d0a22d elementor-widget elementor-widget-heading\" data-id=\"69d0a22d\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"enregistrement\" 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\">Informations d'enregistrement<\/h2>\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<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-17b522df elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"17b522df\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-extended\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-457626f\" data-id=\"457626f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1c54dcc6 elementor-widget elementor-widget-image\" data-id=\"1c54dcc6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"600\" height=\"400\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/2019\/08\/dfds-logo2.png\" class=\"lazyload attachment-large size-large wp-image-582\" alt=\"\" srcset=\"https:\/\/calais-dover.com\/wp-content\/uploads\/2019\/08\/dfds-logo2.png 600w, https:\/\/calais-dover.com\/wp-content\/uploads\/2019\/08\/dfds-logo2-300x200.png 300w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/>\t\t\t\t\t\t\t\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-9b0ce44 elementor-widget elementor-widget-text-editor\" data-id=\"9b0ce44\" 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<h4>Enregistrement DFDS<\/h4><ul><li>60-90 minutes. pr\u00e9senter \u00e0 l&rsquo;avance<\/li><li>Journ\u00e9es charg\u00e9es : 90 minutes<\/li><\/ul>\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<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-1fab1c1a\" data-id=\"1fab1c1a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-323b0d84 elementor-widget elementor-widget-image\" data-id=\"323b0d84\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"840\" height=\"560\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/logo-po-ferries-1024x683.jpg\" class=\"lazyload attachment-large size-large wp-image-6132\" alt=\"logo p&amp;o ferries\" srcset=\"https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/logo-po-ferries-1024x683.jpg 1024w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/logo-po-ferries-300x200.jpg 300w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/logo-po-ferries-768x512.jpg 768w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/logo-po-ferries-1536x1024.jpg 1536w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/logo-po-ferries-2048x1365.jpg 2048w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/logo-po-ferries-225x150.jpg 225w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/logo-po-ferries-100x67.jpg 100w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/logo-po-ferries-525x350.jpg 525w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/logo-po-ferries-788x525.jpg 788w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/logo-po-ferries.jpg 1200w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/>\t\t\t\t\t\t\t\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-63fa2ec9 elementor-widget elementor-widget-text-editor\" data-id=\"63fa2ec9\" 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<h4>Enregistrement P&amp;O Ferries<\/h4><ul><li>L&rsquo;enregistrement ferme 90 minutes avant le d\u00e9part des pi\u00e9tons<\/li><li>L&rsquo;enregistrement ferme pour le reste du trafic 60 minutes avant le d\u00e9part<\/li><\/ul>\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<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-571fe170\" data-id=\"571fe170\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-31f9ec96 elementor-widget elementor-widget-image\" data-id=\"31f9ec96\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"840\" height=\"560\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/irish-ferries-1024x683.jpg\" class=\"lazyload attachment-large size-large wp-image-5868\" alt=\"\" srcset=\"https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/irish-ferries-1024x683.jpg 1024w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/irish-ferries-300x200.jpg 300w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/irish-ferries-768x512.jpg 768w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/irish-ferries-1536x1024.jpg 1536w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/irish-ferries-2048x1365.jpg 2048w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/irish-ferries-225x150.jpg 225w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/irish-ferries-100x67.jpg 100w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/irish-ferries-525x350.jpg 525w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/irish-ferries-788x525.jpg 788w, https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/05\/irish-ferries.jpg 1200w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/>\t\t\t\t\t\t\t\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-3d6551af elementor-widget elementor-widget-text-editor\" data-id=\"3d6551af\" 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<h4>Enregistrement sur Irish Ferries<\/h4><ul><li>L&rsquo;enregistrement ferme 90 minutes avant le d\u00e9part pour les autocars<\/li><li>L&rsquo;enregistrement ferme 60 minutes avant le d\u00e9part pour les autres transports<\/li><\/ul>\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<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-803b509 elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"803b509\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-94ed92a\" data-id=\"94ed92a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3d188a9 elementor-widget elementor-widget-shortcode\" data-id=\"3d188a9\" 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\"><style>.elementor-7673 .elementor-element.elementor-element-1852271e:not(.elementor-motion-effects-element-type-background), .elementor-7673 .elementor-element.elementor-element-1852271e > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:transparent;background-image:linear-gradient(167deg, #004080 0%, #00314E 100%);}.elementor-7673 .elementor-element.elementor-element-1852271e{transition:background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s;margin-top:50px;margin-bottom:0px;padding:50px 0px 50px 0px;}.elementor-7673 .elementor-element.elementor-element-1852271e > .elementor-background-overlay{transition:background 0.3s, border-radius 0.3s, opacity 0.3s;}.elementor-7673 .elementor-element.elementor-element-5746f210 .elementor-heading-title{color:#FFFFFF;}.elementor-7673 .elementor-element.elementor-element-323bf77a{font-size:16px;line-height:25px;color:#FFFFFF;}.elementor-7673 .elementor-element.elementor-element-6125658a img{border-radius:40px 40px 40px 40px;}.elementor-7673 .elementor-element.elementor-element-6125658a > .elementor-widget-container{padding:3px 3px 3px 3px;}.elementor-7673 .elementor-element.elementor-element-6125658a{width:auto;max-width:auto;}.elementor-7673 .elementor-element.elementor-element-7b12cc46 img{border-radius:40px 40px 40px 40px;}.elementor-7673 .elementor-element.elementor-element-7b12cc46 > .elementor-widget-container{padding:3px 3px 3px 3px;}.elementor-7673 .elementor-element.elementor-element-7b12cc46{width:auto;max-width:auto;}.elementor-7673 .elementor-element.elementor-element-46dbc2ac img{border-radius:40px 40px 40px 40px;}.elementor-7673 .elementor-element.elementor-element-46dbc2ac > .elementor-widget-container{padding:3px 3px 3px 3px;}.elementor-7673 .elementor-element.elementor-element-46dbc2ac{width:auto;max-width:auto;}.elementor-7673 .elementor-element.elementor-element-7eed68af img{border-radius:40px 40px 40px 40px;}.elementor-7673 .elementor-element.elementor-element-7eed68af > .elementor-widget-container{padding:3px 3px 3px 3px;}.elementor-7673 .elementor-element.elementor-element-7eed68af{width:auto;max-width:auto;}.elementor-7673 .elementor-element.elementor-element-178ec34d img{border-radius:40px 40px 40px 40px;}.elementor-7673 .elementor-element.elementor-element-178ec34d > .elementor-widget-container{padding:3px 3px 3px 3px;}.elementor-7673 .elementor-element.elementor-element-178ec34d{width:auto;max-width:auto;}.elementor-7673 .elementor-element.elementor-element-46ec8418{text-align:end;top:69px;}.elementor-7673 .elementor-element.elementor-element-46ec8418 img{width:64%;max-width:53%;}body:not(.rtl) .elementor-7673 .elementor-element.elementor-element-46ec8418{left:1053px;}body.rtl .elementor-7673 .elementor-element.elementor-element-46ec8418{right:1053px;}.elementor-7673 .elementor-element.elementor-element-46ec8418 > .elementor-widget-container{--e-transform-flipX:-1;}.elementor-7673 .elementor-element.elementor-element-7c8de16f .elementor-heading-title{color:#FFFFFF;}.elementor-7673 .elementor-element.elementor-element-c908b40{font-size:16px;line-height:25px;color:#FFFFFF;}.elementor-7673 .elementor-element.elementor-element-76960ea0 .elementor-heading-title{color:#FFFFFF;}.elementor-7673 .elementor-element.elementor-element-1fcf27bf{font-size:16px;text-decoration:none;line-height:25px;color:#FFFFFF;}.elementor-7673 .elementor-element.elementor-element-23c17198 .elementor-heading-title{color:#FFFFFF;}.elementor-7673 .elementor-element.elementor-element-58bdc9b8{font-size:16px;line-height:25px;color:#FFFFFF;}.elementor-7673 .elementor-element.elementor-element-70db4750 .elementor-heading-title{color:#FFFFFF;}.elementor-7673 .elementor-element.elementor-element-6c0c1bd3{font-size:16px;line-height:25px;color:#FFFFFF;}.elementor-7673 .elementor-element.elementor-element-55c79f8c .elementor-heading-title{color:#FFFFFF;}.elementor-7673 .elementor-element.elementor-element-5cfbabd5{font-size:16px;line-height:25px;color:#FFFFFF;z-index:2;}.elementor-7673 .elementor-element.elementor-element-57ab395c .elementor-heading-title{color:#FFFFFF;}.elementor-7673 .elementor-element.elementor-element-5978a4f6 .elementor-icon-list-icon i{color:#FFFFFF;transition:color 0.3s;}.elementor-7673 .elementor-element.elementor-element-5978a4f6 .elementor-icon-list-icon svg{fill:#FFFFFF;transition:fill 0.3s;}.elementor-7673 .elementor-element.elementor-element-5978a4f6{--e-icon-list-icon-size:14px;--icon-vertical-align:flex-start;--icon-vertical-offset:5px;}.elementor-7673 .elementor-element.elementor-element-5978a4f6 .elementor-icon-list-item > .elementor-icon-list-text, .elementor-7673 .elementor-element.elementor-element-5978a4f6 .elementor-icon-list-item > a{font-size:16px;}.elementor-7673 .elementor-element.elementor-element-5978a4f6 .elementor-icon-list-text{color:#FFFFFF;transition:color 0.3s;}@media(min-width:768px){.elementor-7673 .elementor-element.elementor-element-50bbf3b0{width:35%;}.elementor-7673 .elementor-element.elementor-element-5212edcc{width:21.6%;}.elementor-7673 .elementor-element.elementor-element-5518954d{width:21.6%;}.elementor-7673 .elementor-element.elementor-element-271091ef{width:21.8%;}}@media(max-width:767px){.elementor-7673 .elementor-element.elementor-element-1852271e{margin-top:50px;margin-bottom:0px;}body:not(.rtl) .elementor-7673 .elementor-element.elementor-element-46ec8418{left:-51px;}body.rtl .elementor-7673 .elementor-element.elementor-element-46ec8418{right:-51px;}.elementor-7673 .elementor-element.elementor-element-46ec8418{top:938px;z-index:0;}}<\/style>\t\t<div data-elementor-type=\"page\" data-elementor-id=\"7673\" class=\"elementor elementor-7673\" data-elementor-post-type=\"elementor_library\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1852271e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1852271e\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-50bbf3b0\" data-id=\"50bbf3b0\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5746f210 elementor-widget elementor-widget-heading\" data-id=\"5746f210\" 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<h3 class=\"elementor-heading-title elementor-size-default\">\u00c0 propos de nous<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-323bf77a elementor-widget elementor-widget-text-editor\" data-id=\"323bf77a\" 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>Le guide ultime pour les voyageurs de Calais \u00e0 Douvres, la distance la plus courte que vous puissiez parcourir de la France \u00e0 l&rsquo;Angleterre en ferry ou en train.<\/p><p>Comparez les billets de P&amp;O Ferries, Irish Ferries, DFDS et Eurotunnel sur Calais-Dover.com.<\/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-6125658a elementor-widget__width-auto elementor-widget elementor-widget-image\" data-id=\"6125658a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"lazyload\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/thumbs_dir\/eurotunnel-le-shuttle-2-qpi1030g58g77748jry2t73mj5t7ukbhm7ww4m4zg4.jpg\" title=\"eurotunnel-le-shuttle.jpg\" alt=\"eurotunnel-le-shuttle.jpg\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\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-7b12cc46 elementor-widget__width-auto elementor-widget elementor-widget-image\" data-id=\"7b12cc46\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"lazyload\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/thumbs_dir\/irish-ferries-logo-2-qpi103yac2hhit2veacpdov34jol29f7yckdlw3l9w.jpg\" title=\"irish-ferries-logo.jpg\" alt=\"irish-ferries-logo.jpg\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\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-46dbc2ac elementor-widget__width-auto elementor-widget elementor-widget-image\" data-id=\"46dbc2ac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"lazyload\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/thumbs_dir\/dfds-logo-1-qpi105typqk261053b5yioe0bbfbhnmomlvckg0sxg.jpg\" title=\"dfds-logo.jpg\" alt=\"dfds-logo.jpg\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\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-7eed68af elementor-widget__width-auto elementor-widget elementor-widget-image\" data-id=\"7eed68af\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"lazyload\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/thumbs_dir\/po-ferries-logo-1-qpi106rswklchmyrxtkl365gwpaopcqeyqiu1pzer8.jpg\" title=\"po-ferries-logo.jpg\" alt=\"po-ferries-logo.jpg\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\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-178ec34d elementor-widget__width-auto elementor-widget elementor-widget-image\" data-id=\"178ec34d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"lazyload\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/thumbs_dir\/Eurostar-logo-2-qpi108nha8nx4uw1mudu85oe3h1f4qxvmztt09wmes.jpg\" title=\"Eurostar-logo.jpg\" alt=\"Eurostar-logo.jpg\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\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-46ec8418 elementor-absolute e-transform elementor-hidden-mobile elementor-widget elementor-widget-image\" data-id=\"46ec8418\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_position&quot;:&quot;absolute&quot;,&quot;_transform_flipX_effect&quot;:&quot;transform&quot;}\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" class=\"lazyload\" src=\"https:\/\/calais-dover.com\/wp-content\/themes\/rehub-theme\/images\/default\/blank.gif\" data-src=\"https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/06\/zeemeeuw-1.png\" title=\"zeemeeuw.png\" alt=\"zeemeeuw.png\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\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<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-5212edcc\" data-id=\"5212edcc\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7c8de16f elementor-widget elementor-widget-heading\" data-id=\"7c8de16f\" 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<h3 class=\"elementor-heading-title elementor-size-default\">Information<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c908b40 elementor-widget elementor-widget-text-editor\" data-id=\"c908b40\" 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><a href=\"https:\/\/calais-dover.com\/fr\/prix\/\">Prix<\/a><br \/><a href=\"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/\">Horaires<\/a><br \/><a href=\"https:\/\/calais-dover.com\/fr\/calais-douvres-webcams-et-meteo\/\">M\u00e9t\u00e9o et webcams<\/a><br \/><a href=\"https:\/\/calais-dover.com\/fr\/port-de-calais\/\">Port de Calais<\/a><br \/><a href=\"https:\/\/calais-dover.com\/fr\/port-de-douvres\/\">Port de Douvres<\/a><br \/><a href=\"https:\/\/calais-dover.com\/fr\/parking-calais\/\">Parking \u00e0 Calais<\/a><br \/><a href=\"https:\/\/calais-dover.com\/fr\/conduire-en-angleterre\/\">Conduire en Angleterre<\/a><\/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-76960ea0 elementor-widget elementor-widget-heading\" data-id=\"76960ea0\" 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<h3 class=\"elementor-heading-title elementor-size-default\">Guides de transports<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1fcf27bf elementor-widget elementor-widget-text-editor\" data-id=\"1fcf27bf\" 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><a href=\"https:\/\/calais-dover.com\/fr\/pieton\/\">Sans voiture<\/a><br \/><a href=\"#\">Avec voiture<\/a><br \/><a href=\"https:\/\/calais-dover.com\/fr\/avec-caravane-en-angleterre\/\">Avec caravane<\/a><\/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<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-5518954d\" data-id=\"5518954d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-23c17198 elementor-widget elementor-widget-heading\" data-id=\"23c17198\" 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<h3 class=\"elementor-heading-title elementor-size-default\">Op\u00e9rateurs<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-58bdc9b8 elementor-widget elementor-widget-text-editor\" data-id=\"58bdc9b8\" 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><a href=\"https:\/\/calais-dover.com\/fr\/dfds\/\">DFDS<\/a><br \/><a href=\"https:\/\/calais-dover.com\/fr\/po-ferries\/\">P&amp;O Ferries<\/a><br \/><a href=\"https:\/\/calais-dover.com\/fr\/irish-ferries\/\">Irish Ferries<\/a><\/p><p><a href=\"https:\/\/calais-dover.com\/fr\/comparez\/\">Comparez les ferries<\/a><\/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-70db4750 elementor-widget elementor-widget-heading\" data-id=\"70db4750\" 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<h3 class=\"elementor-heading-title elementor-size-default\">Avec le tunnel<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6c0c1bd3 elementor-widget elementor-widget-text-editor\" data-id=\"6c0c1bd3\" 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><a href=\"https:\/\/calais-dover.com\/fr\/eurotunnel\/\">Eurotunnel<\/a><\/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<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-271091ef\" data-id=\"271091ef\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-55c79f8c elementor-widget elementor-widget-heading\" data-id=\"55c79f8c\" 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<h3 class=\"elementor-heading-title elementor-size-default\">Calais-dover.com<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5cfbabd5 elementor-widget elementor-widget-text-editor\" data-id=\"5cfbabd5\" 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><a href=\"https:\/\/calais-dover.com\/fr\/a-propos-de-nous\/\">\u00c0 propos de nous<\/a><br \/><a href=\"https:\/\/calais-dover.com\/fr\/contact\/\">Contact<\/a><br \/><a href=\"https:\/\/calais-dover.com\/fr\/declaration-de-confidentialite\/\">Conditions de confidentialit\u00e9<\/a><br \/><a href=\"https:\/\/calais-dover.com\/fr\/clause-de-non-responsabilite\/\">Clause de non-responsabilit\u00e9<\/a><\/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-57ab395c elementor-widget elementor-widget-heading\" data-id=\"57ab395c\" 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<h3 class=\"elementor-heading-title elementor-size-default\">D\u00e9tails de l'entreprise<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5978a4f6 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"5978a4f6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"rhicon rhi-map-marker-alt\"><\/i>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Jufferstraat 3<br>3701 AD<br> Zeist, les Pays-Bas<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"far fa-envelope\"><\/i>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">info@calais-dover.com<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\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<\/div>\n\t\t<\/section>\n\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<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>D\u00e9parts Calais-Douvres par jour, dur\u00e9e de travers\u00e9e et horaires P&amp;O, DFDS et Irish Ferries.<\/p>\n","protected":false},"author":1,"featured_media":6440,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2509","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Horaire ferry Calais Douvres | P&amp;O, DFDS et Irish Ferries<\/title>\n<meta name=\"description\" content=\"Consultez les horaires Calais-Douvres avec les heures d&#039;arriv\u00e9e, de d\u00e9part et les derni\u00e8res heures d&#039;enregistrement. Travers\u00e9es P&amp;O, Irish Ferries et DFDS.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Horaire ferry Calais Douvres | P&amp;O, DFDS et Irish Ferries\" \/>\n<meta property=\"og:description\" content=\"Consultez les horaires Calais-Douvres avec les heures d&#039;arriv\u00e9e, de d\u00e9part et les derni\u00e8res heures d&#039;enregistrement. Travers\u00e9es P&amp;O, Irish Ferries et DFDS.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/\" \/>\n<meta property=\"og:site_name\" content=\"Calais-Dover.com\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-17T09:31:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/06\/timetable-calais-dover.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"800\" \/>\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=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/ferry-calais-douvres-horaires\\\/\",\"url\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/ferry-calais-douvres-horaires\\\/\",\"name\":\"Horaire ferry Calais Douvres | P&O, DFDS et Irish Ferries\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/ferry-calais-douvres-horaires\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/ferry-calais-douvres-horaires\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/calais-dover.com\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/timetable-calais-dover.jpg\",\"datePublished\":\"2023-07-05T09:35:55+00:00\",\"dateModified\":\"2026-06-17T09:31:58+00:00\",\"description\":\"Consultez les horaires Calais-Douvres avec les heures d'arriv\u00e9e, de d\u00e9part et les derni\u00e8res heures d'enregistrement. Travers\u00e9es P&O, Irish Ferries et DFDS.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/ferry-calais-douvres-horaires\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/calais-dover.com\\\/fr\\\/ferry-calais-douvres-horaires\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/ferry-calais-douvres-horaires\\\/#primaryimage\",\"url\":\"https:\\\/\\\/calais-dover.com\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/timetable-calais-dover.jpg\",\"contentUrl\":\"https:\\\/\\\/calais-dover.com\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/timetable-calais-dover.jpg\",\"width\":1200,\"height\":800,\"caption\":\"Plan des horaires DFDS\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/ferry-calais-douvres-horaires\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Calais-Dover.com\",\"item\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/page-daccueil\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Horaire ferry Calais Douvres\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/\",\"name\":\"Calais-Dover.com\",\"description\":\"From Dover to Calais\",\"publisher\":{\"@id\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/#organization\",\"name\":\"Calais-Dover.com\",\"url\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/calais-dover.com\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/Calais-Dover-logo.png\",\"contentUrl\":\"https:\\\/\\\/calais-dover.com\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/Calais-Dover-logo.png\",\"width\":450,\"height\":80,\"caption\":\"Calais-Dover.com\"},\"image\":{\"@id\":\"https:\\\/\\\/calais-dover.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Horaire ferry Calais Douvres | P&O, DFDS et Irish Ferries","description":"Consultez les horaires Calais-Douvres avec les heures d'arriv\u00e9e, de d\u00e9part et les derni\u00e8res heures d'enregistrement. Travers\u00e9es P&O, Irish Ferries et DFDS.","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:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/","og_locale":"fr_FR","og_type":"article","og_title":"Horaire ferry Calais Douvres | P&O, DFDS et Irish Ferries","og_description":"Consultez les horaires Calais-Douvres avec les heures d'arriv\u00e9e, de d\u00e9part et les derni\u00e8res heures d'enregistrement. Travers\u00e9es P&O, Irish Ferries et DFDS.","og_url":"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/","og_site_name":"Calais-Dover.com","article_modified_time":"2026-06-17T09:31:58+00:00","og_image":[{"width":1200,"height":800,"url":"https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/06\/timetable-calais-dover.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/","url":"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/","name":"Horaire ferry Calais Douvres | P&O, DFDS et Irish Ferries","isPartOf":{"@id":"https:\/\/calais-dover.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/#primaryimage"},"image":{"@id":"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/#primaryimage"},"thumbnailUrl":"https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/06\/timetable-calais-dover.jpg","datePublished":"2023-07-05T09:35:55+00:00","dateModified":"2026-06-17T09:31:58+00:00","description":"Consultez les horaires Calais-Douvres avec les heures d'arriv\u00e9e, de d\u00e9part et les derni\u00e8res heures d'enregistrement. Travers\u00e9es P&O, Irish Ferries et DFDS.","breadcrumb":{"@id":"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/#primaryimage","url":"https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/06\/timetable-calais-dover.jpg","contentUrl":"https:\/\/calais-dover.com\/wp-content\/uploads\/2024\/06\/timetable-calais-dover.jpg","width":1200,"height":800,"caption":"Plan des horaires DFDS"},{"@type":"BreadcrumbList","@id":"https:\/\/calais-dover.com\/fr\/ferry-calais-douvres-horaires\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Calais-Dover.com","item":"https:\/\/calais-dover.com\/fr\/page-daccueil\/"},{"@type":"ListItem","position":2,"name":"Horaire ferry Calais Douvres"}]},{"@type":"WebSite","@id":"https:\/\/calais-dover.com\/fr\/#website","url":"https:\/\/calais-dover.com\/fr\/","name":"Calais-Dover.com","description":"From Dover to Calais","publisher":{"@id":"https:\/\/calais-dover.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/calais-dover.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/calais-dover.com\/fr\/#organization","name":"Calais-Dover.com","url":"https:\/\/calais-dover.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/calais-dover.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/calais-dover.com\/wp-content\/uploads\/2023\/07\/Calais-Dover-logo.png","contentUrl":"https:\/\/calais-dover.com\/wp-content\/uploads\/2023\/07\/Calais-Dover-logo.png","width":450,"height":80,"caption":"Calais-Dover.com"},"image":{"@id":"https:\/\/calais-dover.com\/fr\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/calais-dover.com\/fr\/wp-json\/wp\/v2\/pages\/2509","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/calais-dover.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/calais-dover.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/calais-dover.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/calais-dover.com\/fr\/wp-json\/wp\/v2\/comments?post=2509"}],"version-history":[{"count":5,"href":"https:\/\/calais-dover.com\/fr\/wp-json\/wp\/v2\/pages\/2509\/revisions"}],"predecessor-version":[{"id":9878,"href":"https:\/\/calais-dover.com\/fr\/wp-json\/wp\/v2\/pages\/2509\/revisions\/9878"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/calais-dover.com\/fr\/wp-json\/wp\/v2\/media\/6440"}],"wp:attachment":[{"href":"https:\/\/calais-dover.com\/fr\/wp-json\/wp\/v2\/media?parent=2509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}