Tappe
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
The following has evaluated to null or missing:
==> eventDate [in template "71432351086739#20119#43350" at line 9, column 42]
----
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: ${eventDate} [in template "71432351086739#20119#43350" at line 9, column 40]
----
1<#assign Data_Data = getterUtil.getString(Data.getData())>
2
3<#if validator.isNotNull(Data_Data)>
4 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
5
6 <#assign eventDate = dateUtil.getDate(Data_DateObj, "yyyy", locale)>
7</#if>
8
9<div class="item-tappe" data-timeline="${eventDate}" id="tappa-${.vars['reserved-article-id'].data}">
10 <div class="item-tappe__bubble">
11 <div class="item-tappe__dot"></div>
12 <div class="item-tappe__wrapper">
13 <div class="item-tappe__left">
14 <figure class="item-tappe__figure">
15 <#if (Immagine.getData())?? && Immagine.getData() != "">
16 <img class="item-tappe__img" alt="${Immagine.getAttribute("alt")}" data-fileentryid="${Immagine.getAttribute("fileEntryId")}" src="${Immagine.getData()}" />
17 </#if>
18 </figure>
19 <#if validator.isNotNull(Data_Data)>
20 <div class="item-tappe__date text-uppercase">
21 <#assign Data_DateObj = dateUtil.parseDate("yyyy-MM-dd", Data_Data, locale)>
22 ${dateUtil.getDate(Data_DateObj, "dd MMM yyyy", locale)}
23 </div>
24 </#if>
25
26 </div>
27 <div class="item-tappe__right">
28 <h6 class="item-tappe__title">
29 <#if (Titolo.getData())??>
30 ${Titolo.getData()}
31 </#if>
32 </h6>
33 <#if (Descrizione.getData())??>
34 <#assign desc = Descrizione.getData() />
35 <#assign descLenght = desc?length />
36 <div class="item-tappe__description ellipsed-description" data-article="${.vars['reserved-article-id'].data}">
37 <div class="short">
38 ${stringUtil.shorten(htmlUtil.stripHtml(desc), 140)}
39 </div>
40 <div class="full d-none">
41 ${Descrizione.getData()}
42 </div>
43 </div>
44 <#if descLenght > 140 >
45 <div class="item-tappe__read-more" data-article="${.vars['reserved-article-id'].data}">
46 <div class="read-more">
47 <span class="read-more__label">Più dettagli</span>
48 <i class="icon-angle-down"></i>
49 </div>
50 <div class="read-more-open d-none">
51 <span class="read-more__label">Meno dettagli</span>
52 <i class="icon-angle-up"></i>
53 </div>
54 </div>
55 </#if>
56 </#if>
57 </div>
58 </div>
59 </div>
60</div>
61
62<#if Descrizione.getData() !=''>
63 <script>
64 AUI().use('aui-base', function(A) {
65 A.ready(function() {
66 var tappa = A.one('#tappa-${.vars['reserved-article-id'].data}');
67 var button = tappa.one('.item-tappe__read-more');
68 var description = tappa.one('.item-tappe__description');
69 var descriptionFull = description.one('.full');
70 var descriptionShort = description.one('.short');
71 var buttonRead = button.one('.read-more');
72 var readmore = tappa.one('.read-more');
73 var readmoreOpen = tappa.one('.read-more-open');
74 button.on('click', function(event){
75 buttonRead.toggleClass('open');
76 description.toggleClass('ellipsed-description');
77 descriptionFull.toggleClass('d-none');
78 descriptionShort.toggleClass('d-none');
79 readmore.toggleClass('d-none');
80 readmoreOpen.toggleClass('d-none');
81 });
82 });
83 });
84 </script>
85</#if>
86
87
88
89<style>
90.justify-content-end .item-tappe {
91 display: flex;
92 justify-content: flex-end;
93}
94
95.item-tappe__bubble{
96 width: calc(100% - 45px);
97 position: relative;
98 padding: 30px;
99 border-radius: 30px;
100 background-color: #eee;
101}
102
103.item-tappe__bubble:before {
104 content: "";
105 position: absolute;
106 width: 42px;
107 height: 42px;
108 left: calc(100% - 30px);
109 top: 25px;
110 background: #eee;
111 border-radius: 3px;
112 transform: rotate(45deg);
113 z-index: 1;
114}
115
116.justify-content-end .item-tappe__bubble:before {
117 left: unset;
118 right: calc(100% - 27px);
119}
120
121.item-tappe__dot{
122 position: absolute;
123 height: 32px;
124 width: 32px;
125 left: calc(100% + 30px);
126 background: var(--blue);
127 border: 6px solid #fff;
128 box-shadow: 2px 10px 16px rgba(0,0,0,0.17);
129 border-radius: 100%;
130 z-index: 1;
131}
132
133.justify-content-end .item-tappe__dot {
134 left: unset;
135 right: calc(100% + 28px);
136}
137
138.item-tappe__wrapper {
139 display: flex;
140 z-index: 1;
141 position: relative;
142}
143
144.item-tappe__left {
145 flex: 1 0 auto;
146}
147
148figure {
149 margin: 0 !important;
150}
151
152.item-tappe__figure {
153 display: inline-block;
154 max-width: 160px;
155 width: 100%;
156 height: auto;
157}
158
159.item-tappe__img {
160 width: 100%;
161 height: auto;
162 border-radius: 27px;
163}
164
165.item-tappe__date {
166 text-align: center;
167 padding-top: 14px;
168 color: var(--blue);
169 font-weight: 700;
170 font-size: 18px;
171 line-height: 27px;
172}
173
174.item-tappe__right {
175 padding-left: 30px;
176}
177
178.item-tappe__title {
179 font-weight: 700;
180 font-size: 18px;
181 line-height: 27px;
182 color: var(--dark-gray);
183 padding-bottom: 10px;
184}
185
186.item-tappe__description {
187 padding-left: 16px;
188 position: relative;
189}
190
191.item-tappe__description:after {
192 content: "";
193 position: absolute;
194 background-color: var(--blue);
195 top: 7px;
196 left: 0;
197 width: 13px;
198 height: 5px;
199}
200
201.item-tappe__date {
202 text-align: center;
203 padding-top: 14px;
204 color: var(--blue);
205 font-weight: 700;
206 font-size: 18px;
207 line-height: 27px;
208}
209
210.item-tappe__read-more {
211 text-align: right;
212}
213
214.item-tappe .read-more {
215 display: inline-block;
216 color: var(--blue);
217 cursor: pointer;
218}
219
220.read-more-open{
221 display: inline-block;
222 color: var(--blue);
223 cursor: pointer;
224}
225.item-tappe .read-more__label {
226 font-weight: 700;
227 font-size: 14px;
228 line-height: 21px;
229 padding-right: 5px;
230}
231
232
233
234/*
235.item-tappe .read-more__icon {
236 transform: scale(-1);
237 display: inline-block;
238 font-size: 11px;
239}
240*/
241
242.icon-angle-down {
243 font-size: 1.2em;
244 color: var(--blue);
245 /*transition: transform 0.3s ease; */
246}
247
248.read-more.open .icon-angle-down {
249 transform: rotate(0deg);
250}
251
252.read-more:not(.open) .icon-angle-down {
253 transform: rotate(180deg);
254}
255
256
257
258
259
260
261@media (max-width: 1024px) {
262
263 /* Modifica del layout del wrapper */
264 .item-tappe__wrapper {
265 display: flex;
266 flex-direction: column; /* Cambiato per adattarsi meglio ai dispositivi mobili */
267 z-index: 1;
268 position: relative;
269 }
270
271 /* Gestione dei titoli */
272 .item-tappe__title {
273 font-size: 16px;
274 line-height: 24px;
275 padding-bottom: 8px;
276 }
277
278.item-tappe__figure {
279 display: none;
280 max-width: 160px;
281 width: 100%;
282 height: 0;
283}
284 /* Gestione della descrizione */
285 .item-tappe__description {
286 padding-left: 8px;
287 font-size: 14px;
288 }
289
290 /* Modifica della data */
291 .item-tappe__date {
292 font-size: 16px;
293 }
294
295 /* Modifica dei pulsanti "Read more" */
296 .item-tappe__read-more {
297 text-align: left;
298 }
299
300 .item-tappe__left {
301 flex: 0 1 auto; /* Evita che l'elemento si espanda */
302 height: auto; /* L'altezza si adatta al contenuto */
303 padding-top: 8px; /* Riduce il padding */
304 padding-bottom: 8px; /* Riduce il padding */
305 }
306
307 .read-more__label {
308 font-size: 14px;
309 }
310
311 /* Rimuovi la parte che non serve per i dispositivi mobili */
312 .item-tappe__figure {
313 max-width: 120px;
314 }
315
316 /* Contenitore con flex-end per allineamento */
317 .justify-content-end .item-tappe__bubble:before {
318 left: unset;
319 right: 25px;
320 }
321 .item-tappe__date {
322 text-align: center;
323 padding-top: 0;
324 color: var(--blue);
325 font-weight: 700;
326 font-size: 18px;
327}
328
329
330 /* Modifica del comportamento del dot per il mobile */
331 .justify-content-end .item-tappe__dot {
332 left: unset;
333 right: 25px;
334 }
335
336 /* Modifica della data nel layout mobile */
337 .item-tappe__date {
338 text-align: center;
339 font-size: 16px;
340 }
341}
342
343</style>
Attivazione della soluzione Web Application Firewall (WAF)
La Regione del Veneto mette a disposizione degli enti aderenti al Polo Strategico Regionale un servizio di Web Application Firewall (WAF), tramite FortiWeb, per la protezione delle applicazioni web. Il servizio analizza il traffico in tempo reale, blocca automaticamente le minacce informatiche e include funzionalità di Load Balancing, gestione certificati e dashboard di monitoraggio. È disponibile in diversi livelli di capacità, scalabile e personalizzabile in base alle esigenze degli enti.
Qualificazione ACN - livello AC2
La Regione del Veneto ha conseguito la qualificazione ACN – livello AC2, attestando la conformità ai requisiti di sicurezza, affidabilità e continuità operativa previsti per l’erogazione di servizi cloud a supporto della gestione di dati critici della Pubblica Amministrazione.
Integrazione autodichiarazione di conformità e adozione dei requisiti di qualificazione ACN per infrastrutture di livello QI2 (sito secondario di Padova)
Come stabilito dal Decreto Direttoriale dell’Agenzia per la Cybersicurezza Nazionale n. 5489/2023, Regione del Veneto condivide con ACN l’integrazione dell’autodichiarazione riguardante il livello di qualificazione dell’infrastruttura PA situata nel sito secondario di Padova, attestandone il livello QI2 (adatta ad ospitare servizi con dati critici).