Tappe


An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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> 
An error occurred while processing the template.
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 &gt; 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>