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> 
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> 
14 Apr 2025
Attivazione della soluzione Web Application Firewall (WAF)
La Regione del Veneto mette a disposizione degli enti aderenti al Polo Strategico Regionale un servizio di Web Application Firewall...

La Regione del Veneto mette a disposizione degli enti aderenti al Polo Strategico Regionale un servizio di Web Application Firewall (WAF), tramite FortiWeb, per la protezione delle applicazioni web. Il servizio analizza il traffico in tempo reale, blocca automaticamente le minacce informatiche e include funzionalità di Load Balancing, gestione certificati e dashboard di monitoraggio. È disponibile in diversi livelli di capacità, scalabile e personalizzabile in base alle esigenze degli enti.

Più dettagli
Meno dettagli
06 Oct 2025
Qualificazione ACN - livello AC2
La Regione del Veneto ha conseguito la qualificazione ACN – livello AC2, attestando la conformità ai requisiti di sicurezza, affidabilità...

La Regione del Veneto ha conseguito la qualificazione ACN – livello AC2, attestando la conformità ai requisiti di sicurezza, affidabilità e continuità operativa previsti per l’erogazione di servizi cloud a supporto della gestione di dati critici della Pubblica Amministrazione.

Più dettagli
Meno dettagli
21 Mar 2024
Integrazione autodichiarazione di conformità e adozione dei requisiti di qualificazione ACN per infrastrutture di livello QI2 (sito secondario di Padova)
Come stabilito dal Decreto Direttoriale dell’Agenzia per la Cybersicurezza Nazionale n. 5489/2023, Regione del Veneto condivide con ACN...

Come stabilito dal Decreto Direttoriale dell’Agenzia per la Cybersicurezza Nazionale n. 5489/2023, Regione del Veneto condivide con ACN l’integrazione dell’autodichiarazione riguardante il livello di qualificazione dell’infrastruttura PA situata nel sito secondario di Padova, attestandone il livello QI2 (adatta ad ospitare servizi con dati critici).
 

Più dettagli
Meno dettagli