Este website utiliza cookies. Ao continuar a navegação está a aceitar a sua utilização.
Caso pretenda saber mais, consulte a nossa política de privacidade.
Where those who leave long to come back
Awarded several times in the last years as the best cruise port in Europe, the Port of Lisbon internationally renowned in the cruise industry.
The Cruise Terminal is a modern infrastructure, adequate to the current requirements of cruise tourism and located in the historic center of the city of Lisbon. Together with the mild climate, the great touristic and hotel offer, the airlift connecting to several European and American destinations, Lisbon is a destination of excellence for cruise tourism, at the intersection of the main routes - Mediterranean, Baltic, Transatlantic and Atlantic.
Since August 26, 2014, the management of the cruise activity has been responsibility of LCP - Lisbon Cruise Ports (LCP), a consortium formed by Global Liman Isletmeleri AS, Grupo Sousa Investimentos SGPS Ld.ª, Royal Caribbean Cruises Ltd. and Creuers del Port de Barcelona SA with whom APL signed, on July 17, 2014, the Public Service concession contract for the cruise activity at the Lisbon Cruise Terminal.
- Best International Cruise Port 2011
By Cruise Excellence Awards
- Europe’s Leading Cruise Port 2014
- Europe’s Leading Cruise Port 2016
- Europe’s Leading Cruise Port 2017
- Europe’s Leading Cruise Port 2018
- Europe’s Leading Cruise Port 2019
By World Travel Awards
The following has evaluated to null or missing: ==> title [in template "20097#20125#66237" at line 125, column 51] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${title.getData()} [in template "20097#20125#66237" at line 125, column 49] ----
1<#-- SliderNumbers.ftl -->
2<#-- _<@portlet.namespace /> -->
3<style>
4
5/* Seção de apresentação com margem superior */
6.maringTopPresentation {
7 margin-top: 7%;
8 min-height: 770px;
9}
10
11/* Paginação do slider */
12.sliderPagination${randomNamespace} {
13 display: none;
14}
15
16.sliderPagination${randomNamespace} .is-active {
17 transform: unset;
18 background: #82c6e2;
19 opacity: 1;
20}
21
22/* Indicadores do slider */
23.sliderIndicators${randomNamespace} {
24 background: #82c6e2;
25 opacity: 0.2;
26 width: 6px;
27 height: 6px;
28}
29
30/* Botões de navegação do slider */
31.sliderPrev_${randomNamespace},
32.sliderNext_${randomNamespace} {
33 width: 44px;
34 height: 44px;
35 background-color: #fff;
36 opacity: 0.5;
37 border-radius: 5px;
38}
39
40.sliderPrev_${randomNamespace} {
41 left: 0;
42}
43
44.sliderNext_${randomNamespace} {
45 right: 0;
46}
47
48/* Media Query para telas menores que 767px */
49@media only screen and (max-width: 767px) {
50 .sliderPagination${randomNamespace} {
51 display: flex;
52 bottom: 2.5em;
53 }
54
55 .numbDiv {
56 padding: 65px 0;
57 }
58
59 .sliderPrev_${randomNamespace},
60 .sliderNext_${randomNamespace} {
61 top: 60%;
62 }
63
64 .sliderNext_${randomNamespace} {
65 right: 48%;
66 transform: translateX(100%);
67 }
68
69 .sliderPrev_${randomNamespace} {
70 left: 48%;
71 transform: translateX(-100%);
72 }
73 .gfi .slider-DeepSea .silhuetas_lisboa {
74 margin-top: 0;
75 }
76 .gfi .slider-DeepSea .silhuetas_lisboa .wave-contents.buildings {
77 min-height: 300px;
78 }
79 .gfi .slider-DeepSea .silhuetas_lisboa .back div {
80 height: 250px !important;
81 }
82}
83
84/* Estilos gerais para a classe .back */
85.back div {
86 height: 350px !important;
87 align-content: end !important;
88}
89
90.back img {
91 max-height: 350px;
92 width: auto;
93}
94
95/* Imagens flutuadas para diferentes variantes */
96.back_1 img {
97 float: right;
98}
99
100.back_3 img {
101 float: left;
102}
103
104/* Container centralizado com z-index */
105.back_2,
106.back_3 {
107 width: 100%;
108 position: absolute;
109 z-index: 5;
110 top: 0;
111 height: 306px;
112 text-align: center;
113}
114
115.back_3 {
116 align-content: end;
117}
118
119</style>
120<#assign counterEntries = 0>
121<div class="slider-DeepSea sliderContainer deepSea_Bk" style="margin-top:-10px">
122 <div class="wave" style="background-color: #E5EEF1"></div>
123
124 <div class="container deepSea_Bk block-numbers" data-aos="fade-up" data-aos-duration="1000">
125 <h2 class=" descriptiveBannerTitle">${title.getData()}</h2>
126 <div id="splide_${randomNamespace}" class="splide">
127 <div class="splide__arrows">
128 <button class="splide__arrow splide__arrow--prev sliderPrev_${randomNamespace}">
129 <svg style="width:30px; height:30px; fill: #14213d">
130 <use href="/o/apl-theme/images/icons.svg#IconKeyboardArrowRightRounded"></use>
131 </svg>
132 </button>
133 <button class="splide__arrow splide__arrow--next sliderNext_${randomNamespace}">
134 <svg style="width: 30px; height: 30px; fill: #14213d">
135 <use href="/o/apl-theme/images/icons.svg#IconKeyboardArrowRightRounded"></use>
136 </svg>
137 </button>
138 </div>
139 <div class="splide__track">
140 <div class="splide__list">
141 <#if numb?? && numb.getSiblings()?has_content>
142 <#list numb.getSiblings() as cur_numb>
143 <#assign counterEntries=counterEntries + 1>
144 <div class="splide__slide">
145 <div class="numbDiv">
146 <p class="numbInfo">${cur_numb.getData()}</p>
147 <p class="numbDesc">${cur_numb.desc.getData()}</p>
148 </div>
149 </div>
150 </#list>
151 </#if>
152 </div>
153 </div>
154 </div>
155 </div>
156 <div class="silhuetas_lisboa">
157 <div class="wave-contents buildings">
158 <div class="back">
159
160 <div class="back_3">
161 <div data-aos="fade-left" data-aos-duration="1000" class="aos-init aos-animate">
162 <img src="/o/apl-theme/images/background/silhuetas_lisboa_back3.svg" alt="" style="float: left; margin-bottom: 0 !important;" >
163 </div>
164 </div>
165
166 <div class="back_2">
167 <div data-aos="fade-right" data-aos-duration="1500" class="aos-init aos-animate">
168 <img src="/o/apl-theme/images/background/silhuetas_lisboa_back2.svg" alt="" >
169 </div>
170 </div>
171
172 <div class="back_1" data-aos="fade-left" data-aos-duration="2000" class="aos-init aos-animate">
173 <img src="/o/apl-theme/images/background/silhuetas_lisboa_back1.svg" alt="" >
174 </div>
175
176 <div class="mid">
177 <div data-aos="fade-right" data-aos-duration="1000" class="aos-init aos-animate">
178 <img src="/o/apl-theme/images/background/silhuetas_lisboa_mid.svg" alt="">
179 </div>
180 </div>
181 <div class="front">
182 <div data-aos="fade-right" data-aos-duration="3000" class="aos-init aos-animate">
183 <img src="/o/apl-theme/images/background/silhuetas_lisboa_front.svg" alt="">
184 </div>
185 </div>
186 </div>
187 </div>
188 </div>
189</div>
190
191<script>
192<#-- IMPORTANTE: DEFINIR AQUI O NUMERO DE ITENS POR PAGINA PARA MOBILE / TABLET / DESKTOP -->
193<#-- Desktop -->
194<#assign slidesPerPageDesktop = 3>
195<#-- Tablet -->
196<#assign slidesPerPageTablet = 3>
197<#-- Mobile -->
198<#assign slidesPerPageMobile = 1>
199
200<#-- Define drag default -->
201var isDraggableDesktop = true;
202var isDraggableTablet = true;
203var isDraggableMobile = true;
204
205<#-- Desativa o drag se o numero de entradas for menor que o numero de itens por página-->
206if (${counterEntries} < (${slidesPerPageDesktop} + 1)){
207 isDraggableDesktop = false;
208}
209if (${counterEntries} < (${slidesPerPageTablet} + 1)){
210 isDraggableTablet = false;
211}
212if (${counterEntries} < (${slidesPerPageMobile} + 1)){
213 isDraggableMobile = false;
214}
215
216<#-- Configuração do slider que irá ser criado -->
217 var splide_${randomNamespace} = new Splide( '#splide_${randomNamespace}', {
218 perPage: 3,
219 <#-- perPage: ${slidesPerPageDesktop}, -->
220 perMove: 1,
221 type: 'loop',
222 height: 100,
223 pagination: true,
224 drag: isDraggableDesktop,
225 classes: {
226 // Add classes for pagination.
227 pagination: 'splide__pagination sliderPagination${randomNamespace}', // container
228 page : 'splide__pagination__page sliderIndicators${randomNamespace}', // each button
229 },
230 breakpoints: {
231 767: {
232 perPage: ${slidesPerPageMobile},
233 height: 300,
234 drag: isDraggableMobile,
235 }
236 }
237});
238
239<#-- Fazer aparecer ou desaparecer as setas dependendo do numero de páginas (se houver só uma página não queremos setas) -->
240splide_${randomNamespace}.on( 'mounted resize', function() {
241 var slid_${randomNamespace} = document.getElementById('splide_${randomNamespace}');
242 var uls_${randomNamespace} = slid_${randomNamespace}.getElementsByClassName('splide__pagination'); // todos os ul's
243 var ul_${randomNamespace} = uls_${randomNamespace}[uls_${randomNamespace}.length - 1]; // ul's com os lis da paginação
244 var lisCount_${randomNamespace} = ul_${randomNamespace}.childElementCount; // 2
245 <#-- var lis_${randomNamespace} = ul_${randomNamespace}.children; -->
246 if (lisCount_${randomNamespace} > 1){
247 $(".sliderPrev_${randomNamespace}").css("display", "flex");
248 $(".sliderNext_${randomNamespace}").css("display", "flex");
249 } else {
250 document.querySelector("#splide_${randomNamespace} > ul > li:nth-child(1) > button").click();
251 $(".sliderPrev_${randomNamespace}").css("display", "none");
252 $(".sliderNext_${randomNamespace}").css("display", "none");
253 }
254} );
255
256<#-- Codigo que lança a criação do slider -->
257splide_${randomNamespace}.mount();
258
259
260
261<#-- anime elemento numeros -->
262document.addEventListener('DOMContentLoaded', () => {
263 const blockNumbers = document.querySelector('.block-numbers');
264
265 const observer = new IntersectionObserver(entries => {
266 entries.forEach(entry => {
267 if (entry.isIntersecting) {
268 blockNumbers.classList.add('show');
269 // Opcional: Para evitar que a animação aconteça várias vezes
270 observer.unobserve(entry.target);
271 }
272 });
273 }, { threshold: 0.5 }); // Ativa quando 50% do elemento estiver visível
274
275 observer.observe(blockNumbers);
276});
277
278
279</script>
280<script>
281 AOS.init();
282</script>
Cruise Terminals
Where those who leave long to come back