Milhas
Hoteis
Se ha producido un error al procesar la plantilla.
The following has evaluated to null or missing: ==> showWhenUserLoggedin [in template "20101#20128#1130052" at line 113, column 29] ---- 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: ${getterUtil.getBoolean(showWhenUserL... [in template "20101#20128#1130052" at line 113, column 5] ----
1<#assign uuid=randomNamespace />
2<style>
3.uv-hotels__educational-area__container {
4 padding: 0 24px;
5}
6
7.uv-hotels__educational-area__container p {
8 margin: 0;
9}
10
11.uv-hotels__educational-area__header {
12 display: flex;
13 flex-direction: column;
14 align-items: flex-start;
15 gap: 4px;
16}
17
18.uv-hotels__educational-area__title {
19 color: #100d0a;
20 font-weight: 400;
21 font-size: 32px;
22 line-height: 40px;
23 letter-spacing: -0.02em;
24}
25
26.uv-hotels__educational-area__cta {
27 font-style: normal;
28 font-weight: 600;
29 font-size: 16px;
30 line-height: 100%;
31 color: #100d0a;
32}
33
34.uv-hotels__educational-area__cards {
35 list-style: none;
36 padding: 0;
37 margin: 0;
38 position: relative;
39 display: flex;
40 flex-wrap: nowrap;
41 align-items: stretch;
42 gap: 24px;
43 overflow: hidden;
44 scroll-behavior: smooth;
45 -webkit-overflow-scrolling: touch;
46 scroll-snap-type: x mandatory;
47}
48
49.uv-hotels__educational-area__card {
50 display: flex;
51 flex-direction: column;
52 align-items: flex-start;
53 padding: 24px;
54 min-width: 100%;
55 scroll-snap-align: start;
56 min-height: 120px;
57 border: 1.5px solid #ebe6e1;
58 border-radius: 16px;
59 display: flex;
60 flex-direction: column;
61 gap: 8px;
62}
63
64.uv-hotels__educational-area__card__title p {
65 font-style: normal;
66 font-weight: 400;
67 font-size: 20px;
68 line-height: 135%;
69 letter-spacing: -0.02em;
70 color: #100d0a;
71}
72
73.uv-hotels__educational-area__card__description p {
74 font-style: normal;
75 font-weight: 400;
76 font-size: 14px;
77 line-height: 125%;
78 color: #564f4d;
79}
80
81@media (min-width: 1024px) {
82 .uv-hotels__educational-area__container {
83 padding: 0 40px;
84 }
85
86 .uv-hotels__educational-area__card {
87 width: 272px;
88 min-width: 240px;
89 }
90
91 .uv-hotels__educational-area__slider__controls {
92 display: none;
93 }
94}
95
96@media (min-width: 768px) {
97 .uv-hotels__educational-area__header {
98 align-items: center;
99 justify-content: space-between;
100 margin-bottom: 24px;
101 flex-direction: row;
102 }
103
104 .uv-hotels__educational-area__title {
105 font-size: 24px;
106 line-height: 135%;
107 letter-spacing: -0.02em;
108 }
109}
110</style>
111<section class="
112 uv-hotels__educational-area__container
113 ${getterUtil.getBoolean(showWhenUserLoggedin.getData())?then('uv-hotels__educational-area__container--logged-in', '')}
114 ${getterUtil.getBoolean(showWhenVisitant.getData())?then('uv-hotels__educational-area__container--visitant', '')} "
115 style="display: none;">
116 <#if ((title.getData())?? && title.getData() !="" ) || ((cta.getData())?? && cta.getData() !="" )>
117 <!-- Header -->
118 <header class="uv-hotels__educational-area__header">
119 <#if (title.getData())?? && title.getData() !="">
120 <!-- Title -->
121 <p class="uv-hotels__educational-area__title">
122 ${title.getData()}
123 </p>
124 </#if>
125 <#if (cta.getData())?? && cta.getData() !="">
126 <!-- CTA -->
127 <p class="uv-hotels__educational-area__cta">
128 ${cta.getData()}
129 </p>
130 </#if>
131 </header>
132 </#if>
133 <!-- Cards -->
134 <ul class="uv-hotels__educational-area__cards" id="${uuid}__uv-hotels__educational-area__cards">
135 <#if card_item.getSiblings()?has_content>
136 <#list card_item.getSiblings() as card>
137 <!-- Card -->
138 <li class="uv-hotels__educational-area__card">
139 <!-- Image -->
140 <#if (card.card_image.getData())?? && card.card_image.getData() !="">
141 <img alt="${card.card_image.getAttribute("alt")}" data-fileentryid="${card.card_image.getAttribute("fileEntryId")}" src="${card.card_image.getData()}" />
142 </#if>
143 <#if (card.card_title.getData())?? && card.card_title.getData() !="">
144 <!-- Card Title -->
145 <div class="uv-hotels__educational-area__card__title">
146 ${card.card_title.getData()}
147 </div>
148 </#if>
149 <#if (card.card_description.getData())?? && card.card_description.getData() !="">
150 <!-- Card Text -->
151 <div class="uv-hotels__educational-area__card__description">
152 ${card.card_description.getData()}
153 </div>
154 </#if>
155 </li>
156 </#list>
157 </#if>
158 </ul>
159 <div class="${uuid}__nav__container">
160 <div>
161</section>
162<script>
163document.addEventListener("DOMContentLoaded", function() {
164 try {
165 const carousel = new uvHandlerCarouselDefault({
166 container: document.querySelector("#${uuid}__uv-hotels__educational-area__cards"),
167 cards: document.querySelectorAll("#${uuid}__uv-hotels__educational-area__cards .uv-hotels__educational-area__card"),
168 navContainer: document.querySelector(".${uuid}__nav__container"),
169 colorDefault: "#100D0A",
170 uuid: "${uuid}"
171 });
172 const hasLoggedInFlag = !!${showWhenUserLoggedin.getData()};
173 const hasVisitantFlag = !!${showWhenVisitant.getData()};
174 const checkUserLoginStatus = () => !!localStorage.getItem("smls-user-data");
175
176 let attempts = 0;
177 const maxAttempts = 10;
178 const intervalTime = 500;
179 const checkLocalStorage = setInterval(() => {
180 attempts++;
181 const isLoggedIn = checkUserLoginStatus();
182 const isLoggedOut = !isLoggedIn;
183 const selector = hasLoggedInFlag ? "logged-in" : hasVisitantFlag ? "visitant" : "";
184 const contentContainer = document.querySelector(".uv-hotels__educational-area__container--" + selector);
185 if (isLoggedIn && hasLoggedInFlag) {
186 if (contentContainer) contentContainer.style.display = "block";
187 clearInterval(checkLocalStorage);
188 } else if (isLoggedOut && hasVisitantFlag) {
189 if (contentContainer) contentContainer.style.display = "block";
190 clearInterval(checkLocalStorage);
191 }
192 if (attempts >= maxAttempts) {
193 clearInterval(checkLocalStorage);
194 console.warn("Parando a verificação: O localStorage não foi atualizado a tempo.");
195 }
196 }, intervalTime);
197 } catch (error) {
198 console.error("Erro ao inicializar o componente do Liferay uv_hotels_educational:", error);
199 }
200});
201</script>
Quer viajar com o UV?
Encontre a melhor hospedagem com a Smiles
Viaje pelo exterior - teste jess
Viaje pelo mobile
Vários destinos com culturas diferentes para você conhecer Viaje pelo mobile


Paris
30.000 milhas


Lisboa
Diárias a partir de
20.999 milhas



Londres
Diárias a partir de
20.999 milhas



Berlim
Diárias a partir de
20.999 milhas



Nova Iorque
Diárias a partir de
20.999 milhas



Viaje pelo Brasilzão
Vários destinos com culturas diferentes para você conhecer

Salvador

Rio de Janeiro

Recife

São Paulo

Te levo de Milhas (Vitrine de QA)
Encontre dicas e inspirações para a sua próxima viagem

Se ha producido un error al procesar la plantilla.
The following has evaluated to null or missing: ==> showWhenUserLoggedin [in template "20101#20128#1130052" at line 113, column 29] ---- 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: ${getterUtil.getBoolean(showWhenUserL... [in template "20101#20128#1130052" at line 113, column 5] ----
1<#assign uuid=randomNamespace />
2<style>
3.uv-hotels__educational-area__container {
4 padding: 0 24px;
5}
6
7.uv-hotels__educational-area__container p {
8 margin: 0;
9}
10
11.uv-hotels__educational-area__header {
12 display: flex;
13 flex-direction: column;
14 align-items: flex-start;
15 gap: 4px;
16}
17
18.uv-hotels__educational-area__title {
19 color: #100d0a;
20 font-weight: 400;
21 font-size: 32px;
22 line-height: 40px;
23 letter-spacing: -0.02em;
24}
25
26.uv-hotels__educational-area__cta {
27 font-style: normal;
28 font-weight: 600;
29 font-size: 16px;
30 line-height: 100%;
31 color: #100d0a;
32}
33
34.uv-hotels__educational-area__cards {
35 list-style: none;
36 padding: 0;
37 margin: 0;
38 position: relative;
39 display: flex;
40 flex-wrap: nowrap;
41 align-items: stretch;
42 gap: 24px;
43 overflow: hidden;
44 scroll-behavior: smooth;
45 -webkit-overflow-scrolling: touch;
46 scroll-snap-type: x mandatory;
47}
48
49.uv-hotels__educational-area__card {
50 display: flex;
51 flex-direction: column;
52 align-items: flex-start;
53 padding: 24px;
54 min-width: 100%;
55 scroll-snap-align: start;
56 min-height: 120px;
57 border: 1.5px solid #ebe6e1;
58 border-radius: 16px;
59 display: flex;
60 flex-direction: column;
61 gap: 8px;
62}
63
64.uv-hotels__educational-area__card__title p {
65 font-style: normal;
66 font-weight: 400;
67 font-size: 20px;
68 line-height: 135%;
69 letter-spacing: -0.02em;
70 color: #100d0a;
71}
72
73.uv-hotels__educational-area__card__description p {
74 font-style: normal;
75 font-weight: 400;
76 font-size: 14px;
77 line-height: 125%;
78 color: #564f4d;
79}
80
81@media (min-width: 1024px) {
82 .uv-hotels__educational-area__container {
83 padding: 0 40px;
84 }
85
86 .uv-hotels__educational-area__card {
87 width: 272px;
88 min-width: 240px;
89 }
90
91 .uv-hotels__educational-area__slider__controls {
92 display: none;
93 }
94}
95
96@media (min-width: 768px) {
97 .uv-hotels__educational-area__header {
98 align-items: center;
99 justify-content: space-between;
100 margin-bottom: 24px;
101 flex-direction: row;
102 }
103
104 .uv-hotels__educational-area__title {
105 font-size: 24px;
106 line-height: 135%;
107 letter-spacing: -0.02em;
108 }
109}
110</style>
111<section class="
112 uv-hotels__educational-area__container
113 ${getterUtil.getBoolean(showWhenUserLoggedin.getData())?then('uv-hotels__educational-area__container--logged-in', '')}
114 ${getterUtil.getBoolean(showWhenVisitant.getData())?then('uv-hotels__educational-area__container--visitant', '')} "
115 style="display: none;">
116 <#if ((title.getData())?? && title.getData() !="" ) || ((cta.getData())?? && cta.getData() !="" )>
117 <!-- Header -->
118 <header class="uv-hotels__educational-area__header">
119 <#if (title.getData())?? && title.getData() !="">
120 <!-- Title -->
121 <p class="uv-hotels__educational-area__title">
122 ${title.getData()}
123 </p>
124 </#if>
125 <#if (cta.getData())?? && cta.getData() !="">
126 <!-- CTA -->
127 <p class="uv-hotels__educational-area__cta">
128 ${cta.getData()}
129 </p>
130 </#if>
131 </header>
132 </#if>
133 <!-- Cards -->
134 <ul class="uv-hotels__educational-area__cards" id="${uuid}__uv-hotels__educational-area__cards">
135 <#if card_item.getSiblings()?has_content>
136 <#list card_item.getSiblings() as card>
137 <!-- Card -->
138 <li class="uv-hotels__educational-area__card">
139 <!-- Image -->
140 <#if (card.card_image.getData())?? && card.card_image.getData() !="">
141 <img alt="${card.card_image.getAttribute("alt")}" data-fileentryid="${card.card_image.getAttribute("fileEntryId")}" src="${card.card_image.getData()}" />
142 </#if>
143 <#if (card.card_title.getData())?? && card.card_title.getData() !="">
144 <!-- Card Title -->
145 <div class="uv-hotels__educational-area__card__title">
146 ${card.card_title.getData()}
147 </div>
148 </#if>
149 <#if (card.card_description.getData())?? && card.card_description.getData() !="">
150 <!-- Card Text -->
151 <div class="uv-hotels__educational-area__card__description">
152 ${card.card_description.getData()}
153 </div>
154 </#if>
155 </li>
156 </#list>
157 </#if>
158 </ul>
159 <div class="${uuid}__nav__container">
160 <div>
161</section>
162<script>
163document.addEventListener("DOMContentLoaded", function() {
164 try {
165 const carousel = new uvHandlerCarouselDefault({
166 container: document.querySelector("#${uuid}__uv-hotels__educational-area__cards"),
167 cards: document.querySelectorAll("#${uuid}__uv-hotels__educational-area__cards .uv-hotels__educational-area__card"),
168 navContainer: document.querySelector(".${uuid}__nav__container"),
169 colorDefault: "#100D0A",
170 uuid: "${uuid}"
171 });
172 const hasLoggedInFlag = !!${showWhenUserLoggedin.getData()};
173 const hasVisitantFlag = !!${showWhenVisitant.getData()};
174 const checkUserLoginStatus = () => !!localStorage.getItem("smls-user-data");
175
176 let attempts = 0;
177 const maxAttempts = 10;
178 const intervalTime = 500;
179 const checkLocalStorage = setInterval(() => {
180 attempts++;
181 const isLoggedIn = checkUserLoginStatus();
182 const isLoggedOut = !isLoggedIn;
183 const selector = hasLoggedInFlag ? "logged-in" : hasVisitantFlag ? "visitant" : "";
184 const contentContainer = document.querySelector(".uv-hotels__educational-area__container--" + selector);
185 if (isLoggedIn && hasLoggedInFlag) {
186 if (contentContainer) contentContainer.style.display = "block";
187 clearInterval(checkLocalStorage);
188 } else if (isLoggedOut && hasVisitantFlag) {
189 if (contentContainer) contentContainer.style.display = "block";
190 clearInterval(checkLocalStorage);
191 }
192 if (attempts >= maxAttempts) {
193 clearInterval(checkLocalStorage);
194 console.warn("Parando a verificação: O localStorage não foi atualizado a tempo.");
195 }
196 }, intervalTime);
197 } catch (error) {
198 console.error("Erro ao inicializar o componente do Liferay uv_hotels_educational:", error);
199 }
200});
201</script>