Si è verificato un errore nell'elaborarazione del modello.
Java method "it.ariadne.tool.JournalTemplateTool.sortLongFormFields(long, Locale)" threw an exception when invoked on it.ariadne.tool.JournalTemplateTool object "it.ariadne.tool.JournalTemplateTool@1e99be98"; see cause exception in the Java stack trace.
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign jsonOrderableFields = journal... [in template "51632#51678#LONG-FORM" at line 397, column 1]
----
1<#include "${templatesPath}/2023-SELLA-MACRO" />
2<#include "${templatesPath}/SOCIAL-SHARE-MACRO" />
3
4<#assign articleId = .vars['reserved-article-id'].data />
5<#assign article = journalService.getArticle(getterUtil.getLong(scopeGroupId),articleId) />
6<#assign asset = assetService.getEntry('com.liferay.journal.model.JournalArticle',article.resourcePrimKey) />
7<#assign formatCategory = sella_tool.getCategoryFromVocabularyId(asset.getCategories(),formatVocabulary.vocabularyId, articleLocale) />
8<#assign topicsCategory = sella_tool.getCategoryFromVocabularyId(asset.getCategories(),topicsVocabulary.vocabularyId, articleLocale) />
9<#assign title = .vars['reserved-article-title'].data />
10<#assign absoluteURL = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() />
11
12<#assign localizedArticle = journal_template_tool.toMap(journal_template_tool.parseContent(article.resourcePrimKey,articleLocale)) />
13
14<#assign localizedBigImageCardInsights = localizedArticle.BigImageCardInsights />
15<#assign localizedWhatsAppImg = localizedArticle.whatsappImg />
16
17<#assign localizedHeroTitle = localizedArticle.heroTitle />
18<#assign localizedAuthor = localizedArticle.AuthorFullNameInsights />
19<#assign localizedReadTimeInsights = localizedArticle.ReadTimeInsights />
20<#assign localizedAuthorFullNameInsights = localizedArticle.AuthorFullNameInsights />
21<#assign localizedAuthorImageInsights = localizedArticle.AuthorImageInsights />
22<#assign localizedAuthorDescriptionInsights = localizedArticle.AuthorDescriptionInsights />
23<#assign localizedBodyInsightsFieldSet = localizedArticle.BodyInsightsFieldSet />
24<#assign localizedAbstractInsights = localizedArticle.abstractInsights />
25<#assign localizedDate = localizedArticle.date />
26<#assign localizedBkgColor = localizedArticle.colors.backgroundColor />
27<#assign localizedHeroOverlayColor = localizedArticle.colors.heroOverlayColor />
28<#assign localizedMainTextColor = localizedArticle.colors.mainTextColor />
29<#assign localizedSecondaryTextColor = localizedArticle.colors.secondaryTextColor />
30<#assign localizedSellaColorColor = localizedArticle.colors.sellaColor />
31<#assign localizedDownload = localizedArticle.downloadDocument />
32
33<#assign localizedHeroImage = "" />
34<#if (localizedArticle.heroImage)?is_string>
35 <#assign localizedHeroImage = localizedArticle.heroImage />
36<#elseif (localizedArticle.heroImage.url)?has_content>
37 <#assign localizedHeroImage = localizedArticle.heroImage.url />
38</#if>
39
40<#assign localizedDownloadLink = "" />
41<#if (localizedArticle.link)?has_content>
42 <#assign localizedDownloadLink = localizedArticle.link />
43</#if>
44
45<#-- ja title -->
46<#if (localizedHeroTitle)?has_content >
47 <#assign title = localizedHeroTitle />
48</#if>
49
50<#-- social media -->
51<#assign socialImg = ""/>
52<#assign whatsAppImg = ""/>
53<#assign jaAbstract = ""/>
54
55<#if localizedBigImageCardInsights?? && localizedBigImageCardInsights?has_content>
56 <#if localizedBigImageCardInsights.fileEntryId?? && localizedBigImageCardInsights.fileEntryId != "">
57 <#assign socialImg = themeDisplay.getPortalURL() + sella_tool.getAdaptiveMediaSrc("800-x-533-px",localizedBigImageCardInsights.fileEntryId?number,localizedBigImageCardInsights.name) />
58 </#if>
59</#if>
60
61<#if localizedWhatsAppImg?? && localizedWhatsAppImg?has_content >
62 <#if localizedWhatsAppImg.fileEntryId?? && localizedWhatsAppImg.fileEntryId != "">
63 <#assign whatsAppImg = themeDisplay.getPortalURL() + sella_tool.getAdaptiveMediaSrc("300-x-300-px",localizedWhatsAppImg.fileEntryId?number,localizedWhatsAppImg.name) />
64 </#if>
65</#if>
66
67<#if localizedAbstractInsights?? && localizedAbstractInsights != "" >
68 <#assign jaAbstract = localizedAbstractInsights />
69</#if>
70
71<#assign LONG_FORM_LANGUAGE_KEYS_IT = {
72 "si-longform-kpi-show-details-on-mouse-hover": "Scopri di più passando con il mouse sui key numbers",
73 "si-longform-kpi-show-details-interacting-with-headings": "Scopri di più cliccando sui titoli",
74 "si-longform-kpi-show-details-interacting-with-markers": "Scopri di più cliccando sulle immagini",
75 "si-longform-kpi-scroll-infographic": "Scorri per scoprire tutta l'infografica ",
76 "si-longform-kpi-show-more-interacting-with-markers": "Scopri di più cliccando sulle icone",
77 "si-longform-kpi-show-more-interacting-with-markers-or-tags": "Scopri di più cliccando sulle icone o la legenda",
78 "__": "__"
79} />
80
81<#assign LONG_FORM_LANGUAGE_KEYS_EN = {
82 "si-longform-kpi-show-details-on-mouse-hover": "Show details on mouse over",
83 "si-longform-kpi-show-details-interacting-with-headings": "Find out more by clicking on the titles",
84 "si-longform-kpi-show-details-interacting-with-markers": "Find out more by clicking on the images",
85 "si-longform-kpi-scroll-infographic": "Scroll horizontally to explore the infographic",
86 "si-longform-kpi-show-more-interacting-with-markers": "Find out more by clicking on the pins",
87 "si-longform-kpi-show-more-interacting-with-markers-or-tags": "Find out more by clicking on the pins or tags",
88 "__": "__"
89} />
90
91<#function translateKey locale key>
92 <#-- This function is an hack -->
93 <#-- Please remove as soon as possible -->
94
95 <#assign keys = LONG_FORM_LANGUAGE_KEYS_IT />
96
97 <#if locale?string?starts_with("en")>
98 <#assign keys = LONG_FORM_LANGUAGE_KEYS_EN />
99 </#if>
100
101 <#return keys[key] ! languageUtil.get(locale, key) />
102</#function>
103
104<@shareContent title="${title}" summary="${jaAbstract}" detailURL="${absoluteURL}" imageURL="${socialImg}" whatsAppImgURL="${whatsAppImg}" twitterImgURL="${socialImg}" />
105
106<#if !localizedHeroOverlayColor?has_content || localizedHeroOverlayColor == "#">
107 <#assign localizedHeroOverlayColor = "#32323299" />
108</#if>
109
110<#if localizedHeroOverlayColor?matches("\\p{XDigit}{3,8}")>
111 <#assign localizedHeroOverlayColor = "#" + localizedHeroOverlayColor />
112</#if>
113
114<!-- custom hero -->
115<div class="hero_section activate-on-scroll" style="background-image: url('${localizedHeroImage}');">
116 <div class="hero_overlay" style="background-color: ${localizedHeroOverlayColor};"></div>
117 <div class="hero_wrapper">
118 <div class="hero_intro">
119 <span class="d-md-flex justify-content-start" style="flex: 1 1 0px">
120 <#if (localizedDate)?has_content>
121 <time class="article-detail__date">
122 ${localizedDate}
123 </time>
124 </#if>
125 </span>
126
127 <#assign pulseParts = [] />
128
129 <#if (formatCategory)?has_content>
130 <#assign pulseParts += [formatCategory] />
131 </#if>
132
133 <#if (topicsCategory)?has_content>
134 <#assign pulseParts += [topicsCategory] />
135 </#if>
136
137 <#if (pulseParts)?has_content>
138 <div class="hero_pulse">
139 <div class="pulse_wrapper pulse-with-shimmer">
140 <div class="pulse_cursor"></div>
141 <div class="pulse_container-ext">
142 <div class="pulse_container">
143 <#list pulseParts as pulsePart>
144 <#assign pulsePartIndex = pulsePart?index * 2 />
145
146 <#assign pulseCssClass = "pulse_part" />
147
148 <#if pulsePartIndex == 0>
149 <#assign pulseCssClass += " pulse_format" />
150 </#if>
151
152 <div
153 style="--pulse-part-index: ${pulsePartIndex}"
154 class="${pulseCssClass}"
155 >
156 ${pulsePart}
157 </div>
158
159 <#sep>
160 <div
161 style="--pulse-part-index: ${pulsePartIndex + 1}"
162 class="pulse_part pulse_part_separator"
163 >
164 /
165 </div>
166 </#sep>
167 </#list>
168 </div>
169 </div>
170 </div>
171 </div>
172 </#if>
173
174 <span class="d-md-flex justify-content-end" style="flex: 1 1 0px">
175 <a
176 href="${localizedDetailUrl}"
177 title='${translateKey(articleLocale, "article-change-language")}'
178 class="article-detail__lang" data-senna-off="true"
179 >
180 ${translateKey(articleLocale, "article-change-language")}
181 </a>
182 </span>
183 </div>
184
185 <div class="hero_title_container">
186 <div class="hero_title">
187 <#assign characterIndex = 0 />
188
189 <h1 class="word-appear" aria-description="${localizedHeroTitle?html}">
190 <#list (localizedHeroTitle)?word_list as word>
191 <span class="word-appear_word" aria-hidden="true"><#--
192 REMOVE WHITESPACE
193 --><#list word?split("") as character><#--
194 REMOVE WHITESPACE
195 --><span
196 class="word-appear_part"
197 style="--word-appear-part-index: ${characterIndex}"
198 >${character}</span><#--
199 REMOVE WHITESPACE
200 --><#assign characterIndex += 1 /></#list><#--
201 REMOVE WHITESPACE
202 --></span>
203 </#list>
204 </h1>
205 </div>
206
207 <#if (localizedAuthor)?has_content >
208 <div class="hero_credits">
209 <h2>di ${localizedAuthor}</h2>
210 </div>
211 </#if>
212 </div>
213
214 <svg
215 class="hero_arrow"
216 width="26"
217 height="14"
218 viewBox="0 0 26 14"
219 fill="none"
220 xmlns="http://www.w3.org/2000/svg"
221 >
222 <path
223 d="M 25 1 L 13 13 L 1 1"
224 stroke="#82D0F6"
225 stroke-width="2"
226 stroke-linejoin="bevel"
227 />
228 </svg>
229 </div>
230</div>
231
232<article class="article-detail-first-text">
233 <div class="container">
234 <div class="row">
235 <div class="col-12 col-lg-8 offset-lg-2">
236 <#if localizedAbstractInsights?? && localizedAbstractInsights != "">
237 <#assign localizedAbstract = journal_template_tool.getBodyWithFirstLetterStyled(localizedAbstractInsights)/>
238 <div class="article-detail__abstract-longform">${localizedAbstract}</div>
239 </#if>
240 <#if localizedAuthorFullNameInsights?? && localizedAuthorFullNameInsights != ""
241 && localizedAuthorImageInsights.url?? && localizedAuthorImageInsights.url?has_content>
242 <div class="article-detail__info">
243 <div class="d-md-flex justify-content-md-between align-items-md-center">
244 <div class="d-md-flex">
245 <#if localizedDate?? && localizedDate != "" >
246 <div class="article-detail__date">${localizedDate}</div>
247 </#if>
248 <#if asset.getTags()?size gt 0>
249 <div class="article-detail__tags d-flex">
250 <#list asset.getTags() as tag>
251 <a href="${htmlUtil.escape(layout.getGroup().getDisplayURL(themeDisplay, false))}/risultati-ricerca?q=${tag.name}" title="${tag.name}">#${tag.name}</a>
252 </#list>
253 </div>
254 </#if>
255 </div>
256 <#if localizedReadTimeInsights?? && localizedReadTimeInsights != "">
257 <div class="article-detail__time"><span>Tempo di lettura </span>${localizedReadTimeInsights}</div>
258 </#if>
259 </div>
260 </div>
261 <#-- Author -->
262 <#assign imgSrc = "" />
263 <#if localizedAuthorImageInsights?? && localizedAuthorImageInsights?has_content>
264 <#if localizedAuthorImageInsights.url?? && localizedAuthorImageInsights.url != "">
265 <#assign imgSrc = localizedAuthorImageInsights.url />
266 <#elseif journal_template_tool.getFileObjectUrl(localizedAuthorImageInsights, themeDisplay) != "">
267 <#assign imgSrc = journal_template_tool.getFileObjectUrl(localizedAuthorImageInsights, themeDisplay) />
268 </#if>
269
270 <#if imgSrc != "">
271 <div class="article-detail__author d-flex">
272 <div>
273 <img src="${imgSrc}" alt="${localizedAuthorFullNameInsights}" class="article-detail__author-img" />
274 </div>
275
276 <div class="article-detail__author-info d-flex">
277 <div class="article-detail__author-name">${localizedAuthorFullNameInsights}</div>
278 <#if localizedAuthorDescriptionInsights?? && localizedAuthorDescriptionInsights != "" >
279 <div class="article-detail__author-desc">
280 <p>${localizedAuthorDescriptionInsights}</p>
281 </div>
282 </#if>
283 </div>
284 </div>
285 </#if>
286 </#if>
287 </#if>
288 </div>
289 </div>
290 </div>
291
292 <#if localizedBodyInsightsFieldSet?has_content>
293 <#if localizedBodyInsightsFieldSet?? && localizedBodyInsightsFieldSet?has_content>
294 <#assign localizedQuoteInsightsFieldSet = localizedBodyInsightsFieldSet.QuoteInsightsFieldSet! />
295 <#assign localizedQuoteInsights = localizedQuoteInsightsFieldSet.QuoteInsights! />
296 <#assign localizedQuotePosition = localizedQuoteInsightsFieldSet.QuotePosition! />
297
298 <#assign localizedBodyInsights = localizedBodyInsightsFieldSet.BodyInsights />
299 </#if>
300
301 <#if (localizedQuoteInsights?? && localizedQuoteInsights != "") || (localizedBodyInsights?? && localizedBodyInsights != "") >
302 <div class="article-detail__text">
303
304 <#-- Quote -->
305 <#if localizedQuoteInsights?? && localizedQuoteInsights != "">
306 <div class="container">
307 <div class="row">
308 <div class="col-12 col-lg-8 offset-lg-2">
309 <#assign quotePositionClass = "article-detail__blockquote" />
310 <#if localizedQuotePosition == "Left">
311 <#assign quotePositionClass += " article-detail__blockquote--left" />
312 </#if>
313 <blockquote class="${quotePositionClass}">
314 <svg class="ico-svg d-print-none" aria-hidden="true">
315 <use xlink:href="${themeDisplay.getPathThemeImages()}/icons.svg#sella-quote"></use>
316 </svg>
317 ${localizedQuoteInsights}
318 </blockquote>
319 </div>
320 </div>
321 </div>
322 </#if>
323
324 <#-- Text + Social -->
325 <#if localizedBodyInsights?? && localizedBodyInsights != "">
326 <div class="container">
327 <div class="row">
328 <#assign bodyClass = "col-12" />
329 <#if socialShareActive.data == "true">
330 <#assign bodyClass += " col-lg-7 order-lg-2" />
331 <#else>
332 <#assign bodyClass += " col-lg-8 offset-lg-2" />
333 </#if>
334 <div class="${bodyClass}">
335 <#assign localizedBody = journal_template_tool.getBodyWithFirstLetterStyled(localizedBodyInsights)/>
336 ${localizedBody}
337 </div>
338 <#if socialShareActive.data == "true">
339 <div class="col-12 col-lg-3 order-lg-1">
340 <div class="box-share">
341 <div class="box-share__title">${translateKey(articleLocale, "share-and-participate")}</div>
342 <ul class="box-share__list d-flex">
343 <li class="box-share__item">
344 <a href="https://www.facebook.com/sharer/sharer.php?u=${absoluteURL}" title="Facebook" class="box-share__link d-flex">
345 <svg class="ico-svg" aria-hidden="true">
346 <use xlink:href="${themeDisplay.getPathThemeImages()}/icons.svg#facebook-f"></use>
347 </svg>
348 </a>
349 </li>
350 <li class="box-share__item">
351 <a href="https://twitter.com/intent/tweet?text=${absoluteURL}" title="Twitter" class="box-share__link d-flex">
352 <svg class="ico-svg" aria-hidden="true">
353 <use xlink:href="${themeDisplay.getPathThemeImages()}/icons.svg#square-x-twitter"></use>
354 </svg>
355 </a>
356 </li>
357 <li class="box-share__item">
358 <a href="https://www.linkedin.com/sharing/share-offsite/?url=${absoluteURL}" title="LinkedIn" class="box-share__link d-flex">
359 <svg class="ico-svg" aria-hidden="true">
360 <use xlink:href="${themeDisplay.getPathThemeImages()}/icons.svg#linkedin-in"></use>
361 </svg>
362 </a>
363 </li>
364 <li class="box-share__item">
365 <a href="https://api.whatsapp.com/send?text=${absoluteURL}" title="WhatsApp" class="box-share__link d-flex">
366 <svg class="ico-svg" aria-hidden="true">
367 <use xlink:href="${themeDisplay.getPathThemeImages()}/icons.svg#whatsapp"></use>
368 </svg>
369 </a>
370 </li>
371 </ul>
372 <div class="box-share__download">
373 <#if localizedDownloadLink?? && localizedDownloadLink != "">
374 <a href="${localizedDownloadLink?replace('<[^>]+>','','r')}" title="${translateKey(articleLocale, 'download-article')}" class="d-flex justify-content-between align-items-center">
375 <#else>
376 <a href="javascript:window.print();" title="${translateKey(articleLocale, 'download-article')}" class="d-flex justify-content-between align-items-center">
377 </#if>
378 <span>${translateKey(articleLocale, "download-article")}</span>
379 <svg class="ico-svg" aria-hidden="true">
380 <use xlink:href="${themeDisplay.getPathThemeImages()}/icons.svg#sella-download"></use>
381 </svg>
382 </a>
383 </div>
384 </div>
385 </div>
386 </#if>
387 </div>
388 </div>
389 </#if>
390 </div>
391 </#if>
392 </#if>
393</article>
394
395
396<#assign jsonAllFields = journal_template_tool.toMap(journal_template_tool.parseContent(article.resourcePrimKey, articleLocale)) />
397<#assign jsonOrderableFields = journal_template_tool.toMap(journal_template_tool.sortLongFormFields(article.resourcePrimKey, articleLocale)).orderableFields />
398
399<#list jsonOrderableFields as item>
400
401 <#switch item.fieldSetType>
402 <#case "SliderImageInsightsFieldSet">
403 <#if item.image?? && item.image?has_content>
404
405 <#assign firstElement = item.image[0] />
406 <#if firstElement.SliderImageInsights?? && firstElement.SliderImageInsights?has_content >
407 <div class="slider slider-longform-photogallery-detail">
408 <#list item.image as image>
409 <#assign imageText = image.ImageTextInsights />
410
411 <#if image.SliderImageInsights.url?? && image.SliderImageInsights.url != "">
412 <#assign imageUrl = image.SliderImageInsights.url />
413 </#if>
414
415 <#if imageUrl?? && imageUrl != "">
416 <div>
417 <img src="${imageUrl}" loading="lazy" class="img-slider" alt="Immagine ${image?index}" />
418 </div>
419 </#if>
420 </#list>
421 </div>
422 </#if>
423 </#if>
424 <#break>
425 <#case "text">
426 <#if item.richText?? && item.richText?has_content>
427 <article class="article-detail">
428 <div class="container">
429 <div class="row">
430 <div class="col-12 col-lg-8 offset-lg-2">
431 <p>${item.richText}</p>
432 </div>
433 </div>
434 </div>
435 </article>
436 </#if>
437 <#break>
438 <#case "quote">
439 <#if item.quoteText?? && item.quoteText?has_content>
440 <div class="article-detail__text">
441 <div class="container">
442 <div class="row">
443 <div class="col-12 col-lg-8 offset-lg-2">
444 <blockquote class="article-detail__blockquote">
445 <svg class="ico-svg d-print-none" aria-hidden="true">
446 <use xlink:href="${themeDisplay.getPathThemeImages()}/icons.svg#sella-quote"></use>
447 </svg>
448 ${item.quoteText}
449 </blockquote>
450 </div>
451 </div>
452 </div>
453 </div>
454 </#if>
455 <#break>
456 <#case "kpi">
457 <#if item.singleKPI?? && item.singleKPI?has_content>
458 <#assign firstKPI = item.singleKPI[0] />
459 <#if firstKPI.title?has_content && firstKPI.abstract?has_content && firstKPI.body?has_content>
460 <div class="activate-on-scroll">
461 <div class="pulse_wrapper d-none d-md-flex" style="margin-bottom: 30px">
462 <div class="pulse_container-ext">
463 <div class="pulse_container">
464 <div class="pulse_part">
465 ${translateKey(articleLocale, "si-longform-kpi-show-details-on-mouse-hover")}
466 </div>
467 </div>
468 </div>
469 </div>
470 <div class="container">
471 <div class="article-kpi">
472 <#list item.singleKPI as singleKPI>
473
474 <#assign title = singleKPI.title />
475 <#assign abstract = singleKPI.abstract />
476 <#assign body = singleKPI.body />
477
478 <#if title?has_content && abstract?has_content && body?has_content>
479 <div class="article-kpi__card">
480 <div class="article-kpi__wrapper">
481 <div class="article-kpi__card__header">
482 <h1 class="article-kpi__card__header__title">${title}</h1>
483 <p>${abstract}</p>
484 </div>
485 <div class="article-kpi__card__body">
486 <p>${body}</p>
487 </div>
488 </div>
489 </div>
490 </#if>
491 </#list>
492 </div>
493 </div>
494 </div>
495 </#if>
496 </#if>
497
498 <#break>
499 <#case "map">
500 <#if item.mapName != "">
501 <#assign mapName = item.mapName />
502 <#assign latitudine = item.mapLatitude>
503 <#assign longitudine = item.mapLongitude>
504 <#assign zoom = item.mapZoom>
505 <#assign mapType = (orderableFields.map.mapType.getData()) ! "">
506 <#assign sideMenuColor = (orderableFields.map.sideMenuColor.getData()) ! "">
507
508 <#if !sideMenuColor?has_content>
509 <#assign sideMenuColor = "default" />
510 </#if>
511
512 <#-- Verifica se è necessario mostrare map_chip -->
513 <#assign showTagsLegend = getterUtil.getBoolean((orderableFields.map.showTagsLegend.getData()) ! "false") />
514 <#assign hasMarkers = item.marker?? && item.marker?size gt 0 />
515
516 <div class="section_map activate-on-scroll">
517 <div class="pulse_wrapper" style="position: absolute; z-index: 1; width: 100%; margin-top: 30px;">
518 <div class="pulse_container-ext">
519 <div class="pulse_container">
520 <div class="pulse_part">
521 <#if (showTagsLegend && hasMarkers)>
522 ${translateKey(articleLocale, "si-longform-kpi-show-more-interacting-with-markers-or-tags")}
523 <#else>
524 ${translateKey(articleLocale, "si-longform-kpi-show-more-interacting-with-markers")}
525 </#if>
526 </div>
527 </div>
528 </div>
529 </div>
530
531 <#if (mapName)?has_content || (showTagsLegend && hasMarkers)>
532 <div class="map_chip">
533 <#-- Mostra mapName se disponibile -->
534 <#if (mapName)?has_content>
535 <div class="map_chip_title">
536 ${mapName}
537 </div>
538 </#if>
539
540 <#-- Mostra i bottoni dei marker solo se il booleano è attivato e ci sono marker -->
541 <#if showTagsLegend && hasMarkers>
542 <div class="map_chip_buttons">
543 <#list item.marker as marker>
544 <button
545 class="map_chip_button"
546 data-chip-map="map1"
547 data-chip-index="${marker?index}"
548 data-lat="${marker.lat}"
549 data-lng="${marker.long}"
550 >
551 ${marker.titleMarker}
552 </button>
553 </#list>
554 </div>
555 </#if>
556 </div>
557 </#if>
558
559 <div class="position-relative">
560
561 <div class="map-container" id="map1"></div>
562
563 <#list item.marker as marker>
564 <#assign latMarker = marker.lat />
565 <#assign longMarker = marker.long />
566 <#assign titleMarker = marker.titleMarker />
567 <#assign textMarker = marker.textMarker />
568 <#assign videoMarker = marker.markerVideo />
569 <#assign placeholderVideoMarker = marker.markerPlaceholder />
570 <#assign images = marker.markerImage />
571
572 <div
573 data-lat="${latMarker}"
574 data-lng="${longMarker}"
575 class="map_sidemenu map_sidemenu-${sideMenuColor}"
576 data-sidemenu-map="map1"
577 data-sidemenu-index="${marker?index}"
578 >
579 <div class="map_header">
580 <div class="map_close">
581 <svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg">
582 <g clip-path="url(#clip0_707_448)">
583 <path d="M0 0L12.5 12.5" stroke="white" stroke-width="3" stroke-linecap="round"/>
584 <path d="M12.5 0L0 12.5" stroke="white" stroke-width="3" stroke-linecap="round"/>
585 </g>
586 <defs>
587 <clipPath id="clip0_707_448">
588 <rect width="12.5" height="12.5" fill="white"/>
589 </clipPath>
590 </defs>
591 </svg>
592 </div>
593 <h2>${titleMarker}</h2>
594 <p>${textMarker}</p>
595
596 <#if marker.ctaFieldset.ctaText?? && marker.ctaFieldset.ctaLink??
597 && marker.ctaFieldset.ctaText?has_content && marker.ctaFieldset.ctaLink?has_content>
598 <div class="longform_cta">
599 <a href="${marker.ctaFieldset.ctaLink}">${marker.ctaFieldset.ctaText}<i>
600 <svg width="11" height="11" viewBox="0 0 11 11" fill="none" xmlns="http://www.w3.org/2000/svg">
601 <path d="M9.33601 2.84518L2.16386 10.0173L0.985352 8.83883L8.15751 1.66667H1.83603V0H11.0027V9.16667H9.33601V2.84518Z" fill="#323232" />
602 </svg>
603 </i>
604 </a>
605 </div>
606 </#if>
607
608 <#if images?? && images?has_content >
609
610 <#if images?size == 1 >
611 <#assign imgUrl = "" />
612 <#assign imgAlt = "" />
613
614 <#if images[0].url?? && images[0].url != "">
615 <#assign imgUrl = images[0].url />
616 </#if>
617
618 <#if images[0].alt?? && images[0].alt != "">
619 <#assign imgAlt = images[0].alt />
620 </#if>
621
622 <#if imgUrl != "" && imgAlt != "">
623 <div class="longform_lightbox">
624 <div data-fancybox="id_lightbox_${titleMarker}" data-src="${imgUrl}">
625 <img src="${imgUrl}" />
626 </div>
627 </div>
628 </#if>
629 <#elseif images?size gt 1>
630 <div id="id_slideshow_${titleMarker}" class="longform_slideshow">
631 <#list images as img>
632 <#assign imgUrl = "" />
633
634 <#if img.url?? && img.url != "">
635 <#assign imgUrl = img.url />
636 </#if>
637
638 <#if imgUrl != "">
639 <div data-fancybox="id_slideshow_${titleMarker}" data-src="${imgUrl}" >
640 <img src="${imgUrl}" />
641 </div>
642 </#if>
643 </#list>
644 </div>
645 </#if>
646 </#if>
647
648 <#if videoMarker?? && videoMarker?has_content >
649 <div class="longform_video">
650 <div data-fancybox="id_video_${titleMarker}" data-width="640" data-height="360" href="${videoMarker}" class="longform_video-container">
651 <#if placeholderVideoMarker?? && placeholderVideoMarker?has_content >
652 <#assign placeholderImg = placeholderVideoMarker.url />
653 <#else>
654 <#assign placeholderImg = "/webdav/sella-insights/document_library/600x400.svg">
655 </#if>
656 <img src="${placeholderImg}" alt="Video poster" class="video-poster">
657 <div class="video-overlay">
658 <svg width="21" height="26" viewBox="0 0 21 26" fill="none" xmlns="http://www.w3.org/2000/svg">
659 <path d="M0 23.9271V2.07179C0 1.02455 1.15193 0.386088 2.04 0.941128L19.5243 11.8688C20.3599 12.391 20.3599 13.6079 19.5243 14.1302L2.04 25.0578C1.15193 25.6128 0 24.9744 0 23.9271Z" fill="white"/>
660 </svg>
661 </div>
662 </div>
663 </div>
664 </#if>
665
666 </div>
667
668 <#assign subMarkers = marker.subMarker?filter(
669 subMarker ->
670 (subMarker.numberSubMarker)?has_content ||
671 (subMarker.textSubMarker)?has_content) />
672
673 <#if subMarkers?has_content>
674 <div class="map_footer">
675 <#list marker.subMarker as subMarker>
676 <div class="map_kpi">
677 <h5>${subMarker.numberSubMarker}</h5>
678 <p>${subMarker.textSubMarker}</p>
679 </div>
680 </#list>
681 </div>
682 </#if>
683 </div>
684 </#list>
685 </div>
686 </div>
687 </#if>
688 <#break>
689 <#case "timeline">
690 <#if item.event?? && item.event?has_content>
691 <#assign firstEvent = item.event[0] />
692 <#if firstEvent.year?has_content && firstEvent.titleEvent?has_content>
693 <div class="container activate-on-scroll">
694 <div class="pulse_wrapper" style="margin-bottom: 30px">
695 <div class="pulse_container-ext">
696 <div class="pulse_container">
697 <div class="pulse_part">
698 ${translateKey(articleLocale, "si-longform-kpi-show-details-interacting-with-headings")}
699 </div>
700 </div>
701 </div>
702 </div>
703
704 <div class="accordion">
705 <#list item.event as event>
706 <#assign yearEvent = event.year />
707 <#assign titleEvent = event.titleEvent />
708 <#assign textEvent = event.textEvent />
709 <#assign imageUrl = (event.imageEvent.url) ! "" />
710 <#assign imageAlt = (event.imageEvent.alt) ! "" />
711
712 <div class="accordion-item">
713 <div class="accordion-header">
714 <div class="accordion-header__year">${yearEvent}</div>
715
716 <div class="accordion-header__arrow">
717 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
718 <path d="M12.48 6.71997L22.08 12.48L12.48 18.24" stroke="#323232" stroke-width="2.304" stroke-linejoin="bevel" />
719 <path fill-rule="evenodd" clip-rule="evenodd"
720 d="M4.79994 11.3281H1.43994V13.6321H4.79994V11.3281ZM7.67994 13.6321H21.5999V11.3281H7.67994V13.6321Z"
721 fill="#323232" />
722 </svg>
723 </div>
724
725 <div class="accordion-header__info">${titleEvent}</div>
726
727 <div class="accordion-header__button">
728 <div class="accordion-header__button-icon">
729 <svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg">
730 <g clip-path="url(#clip0_978_49)">
731 <path d="M6.25 -2.58887V15.0888" stroke="white" stroke-linecap="round" />
732 <path d="M-2.58887 6.25H15.0888" stroke="white" stroke-linecap="round" />
733 </g>
734 <defs>
735 <clipPath id="clip0_978_49">
736 <rect width="12.5" height="12.5" fill="white" />
737 </clipPath>
738 </defs>
739 </svg>
740 </div>
741 </div>
742 </div>
743
744 <div class="accordion-content">
745 <div class="accordion-content__wrapper">
746
747 <div class="accordion-header__info_mobile">${titleEvent}</div>
748
749 <div class="accordion-content__image">
750 <img src="${imageUrl}" alt="${imageAlt}">
751 </div>
752 <div class="accordion-content__text">
753 <p>${textEvent}</p>
754 </div>
755 </div>
756 </div>
757 </div>
758 </#list>
759 </div>
760 </div>
761 </#if>
762 </#if>
763 <#break>
764 <#case "info">
765 <#assign title = "" />
766 <#assign subtitle = "" />
767 <#assign text = "" />
768 <#assign imageUrl = "" />
769 <#assign backgroundImageColor = "E5F6FD" />
770 <#assign backgroundTextColor = "FFFFFF" />
771
772 <#if item.boxTitle?? && item.boxTitle != "">
773 <#assign title = item.boxTitle />
774 </#if>
775
776 <#if item.boxAbstract?? && item.boxAbstract != "">
777 <#assign subtitle = item.boxAbstract />
778 </#if>
779
780 <#if item.boxText?? && item.boxText != "">
781 <#assign text = item.boxText />
782 </#if>
783
784 <#if (item.boxImage)?is_string>
785 <#assign imageUrl = item.boxImage />
786 <#elseif item.boxImage.url?? && item.boxImage.url != "">
787 <#assign imageUrl = item.boxImage.url />
788 </#if>
789
790 <#if item.colorImage?? && item.colorImage != "">
791 <#assign backgroundImageColor = item.colorImage />
792 </#if>
793
794 <#if item.colorText?? && item.colorText != "">
795 <#assign backgroundTextColor = item.colorText />
796 </#if>
797
798 <#if title != "" && imageUrl != "">
799 <div class="container">
800 <div class="infographic">
801
802 <#if item.isTextRight != "true">
803 <div class="infographic__text-column">
804 <div class="infographic__header">
805 <h2 class="infographic__title">${title}</h2>
806 <h4 class="infographic__subtitle">${subtitle}</h4>
807 </div>
808 <p class="infographic__text">${text}</p>
809 </div>
810 <div class="infographic_divider"></div>
811 <div style="background-image: url('${imageUrl}'); background-color: #${backgroundImageColor};" class="infographic__image-column"></div>
812 <#else>
813 <!-- allineamento con immagine a sx -->
814 <div style="background-image: url('${imageUrl}'); background-color: #${backgroundImageColor};" class="infographic__image-column"></div>
815 <div class="infographic_divider"></div>
816 <div class="infographic__text-column">
817 <div class="infographic__header">
818 <h2 class="infographic__title">${title}</h2>
819 <h4 class="infographic__subtitle">${subtitle}</h4>
820 </div>
821 <p class="infographic__text">${text}</p>
822 </div>
823 </#if>
824 </div>
825 </div>
826 </#if>
827 <#break>
828 <#case "carousel">
829 <#if item.carouselImageFieldset?? && item.carouselImageFieldset?has_content>
830 <#assign startCounter = 0 />
831 <#assign imageCounter = 0 />
832 <#assign itemCounter = 0 />
833
834 <#assign carouselHTML>
835 <div class="section_longform_gallery activate-on-scroll">
836 <div class="pulse_wrapper" style="margin-bottom: 30px">
837 <div class="pulse_container-ext">
838 <div class="pulse_container">
839 <div class="pulse_part">
840 ${translateKey(articleLocale, "si-longform-kpi-show-details-interacting-with-markers")}
841 </div>
842 </div>
843 </div>
844 </div>
845
846 <div class="longform_gallery__container">
847 <div class="longform_gallery">
848 <#list item.carouselImageFieldset as img>
849 <#assign carouselImageUrl = "" />
850 <#assign carouselImageAlt = "" />
851
852 <#if (img.carouselImage)?is_string>
853 <#assign carouselImageUrl = img.carouselImage />
854 <#elseif (img.carouselImage.url)?has_content>
855 <#assign carouselImageUrl = img.carouselImage.url />
856
857 <#if (img.carouselImage.alt)?has_content>
858 <#assign carouselImageAlt = img.carouselImage.alt />
859 </#if>
860 </#if>
861
862 <#if carouselImageUrl?has_content>
863 <#assign itemCounter = itemCounter + 1 />
864
865 <div class="longform_gallery-item">
866 <#if img.hotspot?has_content>
867 <#list img.hotspot as hotspotFieldset>
868 <#assign hotspotImageUrl = "" />
869
870 <#if hotspotFieldset.hotspotImage.url?has_content>
871 <#assign hotspotImageUrl = hotspotFieldset.hotspotImage.url />
872 </#if>
873
874 <#if hotspotImageUrl?has_content && hotspotFieldset.hotspotX?has_content && hotspotFieldset.hotspotY?has_content>
875 <div class="hotspot" data-fancybox="gallery" data-src="${hotspotImageUrl}" data-start="${startCounter}" style="top: ${hotspotFieldset.hotspotY}%; left: ${hotspotFieldset.hotspotX}%;"></div>
876 <#assign startCounter = startCounter + 1 />
877 <#assign imageCounter = imageCounter + 1 />
878 </#if>
879 </#list>
880 </#if>
881 <img src="${carouselImageUrl}" alt="${carouselImageAlt}"/>
882 </div>
883 </#if>
884 </#list>
885 </div>
886
887 <#if imageCounter gt 1>
888 <div class="custom-scrollbar">
889 <div class="custom-scrollbar-handle"></div>
890 </div>
891 </#if>
892 </div>
893
894 <svg id="custom-icons" xmlns="http://www.w3.org/2000/svg" style="display: none;">
895 <symbol id="icon-close" viewBox="0 0 24 24">
896 <g clip-path="url(#clip0_1330_1317)">
897 <path d="M1.33398 1.33203L8.87646 8.8745" stroke="white" stroke-width="1.70667" stroke-linecap="round"/>
898 <path d="M12.001 11.998L22.6676 22.6647" stroke="white" stroke-width="1.70667" stroke-linecap="round"/>
899 <path d="M22.667 1.33203L1.33366 22.6654" stroke="white" stroke-width="1.70667" stroke-linecap="round"/>
900 </g>
901 <defs>
902 <clipPath id="clip0_1330_1317">
903 <rect width="24" height="24" fill="white"/>
904 </clipPath>
905 </defs>
906 </symbol>
907 <symbol id="icon-arrow-left" viewBox="0 0 22 22">
908 <path id="arrow-left-path" d="M10.5732 15.6934L2.03991 10.5734L10.5732 5.45336" stroke="#323232" stroke-width="2.048" stroke-linejoin="bevel"/>
909 <path fill-rule="evenodd" clip-rule="evenodd" d="M17.401 11.5977L20.3877 11.5977L20.3877 9.54966L17.401 9.54966L17.401 11.5977ZM14.841 9.54966L2.46769 9.54965L2.46769 11.5977L14.841 11.5977L14.841 9.54966Z" fill="#323232"/>
910 </symbol>
911 <symbol id="icon-arrow-right" viewBox="0 0 22 22">
912 <path id="arrow-right-path" d="M11.4268 6.30664L19.9601 11.4266L11.4268 16.5466" stroke="#323232" stroke-width="2.048" stroke-linejoin="bevel"/>
913 <path fill-rule="evenodd" clip-rule="evenodd" d="M4.59897 10.4023H1.6123L1.6123 12.4503H4.59897V10.4023ZM7.15897 12.4503L19.5323 12.4503V10.4023L7.15897 10.4023V12.4503Z" fill="#323232"/>
914 </symbol>
915 </svg>
916 </div>
917 </#assign>
918
919 <#if itemCounter gt 0>
920 ${carouselHTML}
921 </#if>
922 </#if>
923 <#break>
924
925 <#case "secondInfo">
926 <#if item.infoImage?? && item.infoImage?has_content>
927 <#assign imgUrl = "" />
928 <#assign imgAlt = "" />
929
930 <#if item.infoImage.url?has_content>
931 <#assign imgUrl = item.infoImage.url />
932 </#if>
933
934 <#if item.infoImage.alt?has_content>
935 <#assign imgAlt = item.infoImage.alt />
936 </#if>
937
938 <#if imgUrl?has_content && imgAlt?has_content>
939 <div class="activate-on-scroll">
940 <div class="pulse_wrapper" style="margin-bottom: -13px">
941 <div class="pulse_container-ext">
942 <div class="pulse_container">
943 <div class="pulse_part">
944 ${translateKey(articleLocale, "si-longform-kpi-scroll-infographic")}
945 </div>
946 </div>
947 </div>
948 </div>
949 <section class="infografica-scroll">
950 <div class="infografica-scroll_container">
951 <img src="${imgUrl}" alt="${imgAlt}">
952 </div>
953 </section>
954 </div>
955 </#if>
956 </#if>
957 <#break>
958 <#case "embed">
959 <#if (item.embeddedArticle)?has_content>
960 <#assign embeddedArticle = jsonFactoryUtil.createJSONObject(item.embeddedArticle) />
961 <#assign embeddedArticleUUID = embeddedArticle.getString("uuid") />
962 <#assign embeddedAssetEntryId = embeddedArticle.getLong("assetEntryId") />
963 <#assign embeddedClassPK = embeddedArticle.getLong("classPK") />
964 <#assign embeddedClassName = embeddedArticle.getString("className") />
965
966 <#if (embeddedClassPK > 0) && embeddedClassName?has_content>
967 <#-- Most common case -->
968
969 <#assign embeddedAssetEntry = assetService.getEntry(embeddedClassName, embeddedClassPK) />
970 <#assign embeddedAssetRenderer = embeddedAssetEntry.getAssetRenderer() />
971 <#assign embeddedJournalArticle = embeddedAssetRenderer.getAssetObject() />
972
973 <@liferay_journal["journal-article"]
974 article=(embeddedJournalArticle)
975 languageId=(articleLocale?string)
976 />
977 <#elseif (embeddedArticleUUID)?has_content>
978 <#-- Fallback when staging IS enabled -->
979
980 <#assign embeddedJournalArticle =
981 journalService.getJournalArticleByUuidAndGroupId(
982 embeddedArticleUUID, themeDisplay.getScopeGroupId()) />
983
984 <@liferay_journal["journal-article"]
985 article=(embeddedJournalArticle)
986 languageId=(articleLocale?string)
987 />
988 <#elseif (embeddedAssetEntryId > 0)>
989 <#-- Fallback when staging IS NOT enabled -->
990
991 <#assign embeddedAssetEntry = assetService.getEntry(embeddedAssetEntryId) />
992 <#assign embeddedAssetRenderer = embeddedAssetEntry.getAssetRenderer() />
993 <#assign embeddedJournalArticle = embeddedAssetRenderer.getAssetObject() />
994
995 <@liferay_journal["journal-article"]
996 article=(embeddedJournalArticle)
997 languageId=(articleLocale?string)
998 />
999 </#if>
1000 <#else>
1001 <!-- Cannot find load method for "${((embeddedArticle.getString("title")) ! "N/A")?html}" -->
1002 </#if>
1003 <#break>
1004 <#default>
1005 </#switch>
1006</#list>
1007
1008<#if localizedArticle.downloadText?? && localizedArticle.downloadText?has_content>
1009 <#assign localizedDownloadText = localizedArticle.downloadText/>
1010<#else>
1011 <#assign localizedDownloadText = "Scarica il report" />
1012</#if>
1013
1014<#if localizedDownload?? && localizedDownload == "true">
1015 <div class="container">
1016 <div class="cta">
1017 <#if localizedDownloadLink?? && localizedDownloadLink != "">
1018 <a class="cta_link" href="${localizedDownloadLink?replace('<[^>]+>','','r')}">
1019 <#else>
1020 <a class="cta_link" href="javascript:window.print();">
1021 </#if>
1022 <span class="cta_icon">
1023 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1024 <g clip-path="url(#clip0_894_1479)">
1025 <circle cx="12" cy="12" r="12" fill="white"/>
1026 <path d="M14.2002 10.6001L11.8002 14.6001L9.4002 10.6001" stroke="#323232" stroke-width="0.96" stroke-linejoin="bevel"/>
1027 <path fill-rule="evenodd" clip-rule="evenodd" d="M11.3203 14.6L11.3203 7L12.2803 7L12.2803 14.6L11.3203 14.6Z" fill="#323232"/>
1028 <rect x="7" y="15.7998" width="10" height="0.96" fill="#323232"/>
1029 </g>
1030 <defs>
1031 <clipPath id="clip0_894_1479">
1032 <rect width="24" height="24" fill="white"/>
1033 </clipPath>
1034 </defs>
1035 </svg>
1036 </span>
1037 <span class="cta_text">${localizedDownloadText?replace('<[^>]+>','','r')}</span>
1038 </a>
1039 </div>
1040 </div>
1041</#if>
1042
1043<style>
1044 body {
1045 background-color: #${localizedBkgColor} !important;
1046 }
1047 p {
1048 color: #${localizedMainTextColor} !important;
1049 }
1050
1051 .wrapper .hero_title h1 {
1052 font-family: 'SellaStencil-Regular', sans-serif;
1053 line-height: 1em;
1054 }
1055
1056 .article-detail__tags a {
1057 color: #${localizedSecondaryTextColor} !important;
1058 }
1059 .article-detail__author-name,
1060 .article-detail__blockquote p {
1061 color: #${localizedSellaColorColor} !important;
1062 }
1063 .article-detail__blockquote {
1064 background-color: #e8f4fc !important;
1065 }
1066 @media (max-width: 991.98px) {
1067 body {
1068 padding-top: 0px !important;
1069 }
1070 }
1071 @media (max-width: 991.98px) {
1072 .wrapper .header__nav-wrap {
1073 background-color: #ededed !important;
1074 }
1075 }
1076 @media (max-width: 991.98px) {
1077 .wrapper .header-long-form.custom_header .navigation__link,
1078 .wrapper .header-long-form.custom_header .nav-topic__link,
1079 .wrapper .header-long-form.custom_header .box-utils__link {
1080 color: var(--color-link) !important;
1081 }
1082 }
1083 @media (min-width: 0px) {
1084 .accordion-header__year {
1085 font-size: 24px !important;
1086 }
1087 }
1088 @media (min-width: 410px) {
1089 .accordion-header__year {
1090 font-size: 24px !important;
1091 }
1092 }
1093 @media (min-width: 651px) {
1094 .accordion-header__year {
1095 font-size: 33px !important;
1096 }
1097 }
1098 @media (min-width: 725px) {
1099 .accordion-header__year {
1100 font-size: 40px !important;
1101 }
1102 }
1103 .wrapper .article-kpi__card__header {
1104 text-wrap: balance;
1105 }
1106 .wrapper .article-kpi__card__header__title {
1107 font-size: 4vw;
1108 font-size: max(2rem, 4vw);
1109 }
1110 .wrapper .article-kpi__card__header__title * {
1111 color: inherit;
1112 }
1113 .wrapper .article-kpi__card__header__title small {
1114 font-size: 0.5em;
1115 }
1116 .infographic{
1117 margin-bottom: 0px !important;
1118 }
1119 .article-detail {
1120 padding-top: 30px !important;
1121 padding-bottom: 30px !important;
1122 }
1123 .article-detail-first-text {
1124 padding-top: 30px !important;
1125 padding-bottom: 0px !important;
1126 }
1127 .cta {
1128 padding-top: 30px !important;
1129 padding-bottom: 15px !important;
1130 }
1131 .infographic__text-column {
1132 background-color: #${backgroundTextColor} !important;
1133 }
1134
1135 .map_sidemenu.map_sidemenu-default {}
1136
1137 .map_sidemenu.map_sidemenu-blue,
1138 .map_sidemenu.map_sidemenu-blue-with-stripes {
1139 background-color: var(--blue);
1140 }
1141
1142 <#assign mapSidemenuStripesHTML><#compress>
1143 <#assign stripesWidth = 280 />
1144 <#assign stripesHeight = 280 />
1145 <svg
1146 xmlns="http://www.w3.org/2000/svg"
1147 viewBox="0 0 ${stripesWidth} ${stripesHeight}"
1148 width="${stripesWidth}"
1149 height="${stripesHeight}"
1150 >
1151 <#assign stripesCount = 7 />
1152 <#list (0..*stripesCount) as n>
1153 <#assign stripeStepStart = n * 25 />
1154 <#assign stripeStepEnd = stripeStepStart + 5 />
1155 <path opacity="0.3" fill="white" stroke="none" d="
1156 M ${stripesWidth}, ${stripeStepStart}
1157 L ${stripesWidth}, ${stripeStepEnd}
1158 L ${stripeStepEnd}, ${stripesHeight}
1159 L ${stripeStepStart}, ${stripesHeight}
1160 Z
1161 " />
1162 </#list>
1163 </svg>
1164 </#compress></#assign>
1165
1166 .map_sidemenu.map_sidemenu-blue-with-stripes {
1167 background-image: url("data:image/svg+xml,${mapSidemenuStripesHTML?url("UTF-8")}");
1168 background-position: bottom right;
1169 background-repeat: no-repeat;
1170 }
1171
1172 .map_kpi p,
1173 .map_header p,
1174 .hero_intro p {
1175 color: white !important;
1176 }
1177 .slider + .section_map {
1178 margin-top: 30px;
1179 }
1180 :root {
1181 <#--
1182 The following property is required because the minifier removes the "ms"
1183 unit from the value in the theme's CSS.
1184 -->
1185 --pulse-cursor-duration: 0ms;
1186 }
1187 @media not (max-width: 768px) {
1188 .section_map:has(.map_sidemenu.active) .pulse_container-ext {
1189 margin-right: 600px;
1190 }
1191 .section_map:has(.map_sidemenu.active) .map-container {
1192 width: calc(100% - 600px);
1193 }
1194 }
1195 @property --pulse-border-shimmer-angle {
1196 syntax: "<angle>";
1197 initial-value: 0deg;
1198 inherits: false;
1199 }
1200</style>
1201
1202<script>
1203 function checkMapModuleAndInit() {
1204 const mapModuleEventTarget = new EventTarget();
1205 mapModuleEventTarget.addEventListener('mapModuleReady', initializeMap);
1206
1207 const mapModuleProxy = new Proxy(
1208 { mapModuleLoaded: false, mappaLoaded: false },
1209 {
1210 set(target, prop, value) {
1211 target[prop] = value;
1212
1213 if (target.mapModuleLoaded && target.mappaLoaded) {
1214 mapModuleEventTarget.dispatchEvent(new Event('mapModuleReady'));
1215 }
1216 return true;
1217 }
1218 }
1219 );
1220
1221 // Monitoriamo l'oggetto `window.mapModule`
1222 Object.defineProperty(window, 'mapModule', {
1223 configurable: true,
1224 enumerable: true,
1225 get() {
1226 return this._mapModule;
1227 },
1228 set(value) {
1229 this._mapModule = value;
1230 if (value) {
1231 mapModuleProxy.mapModuleLoaded = true;
1232 mapModuleProxy.mappaLoaded = !!window.mappa;
1233 }
1234 }
1235 });
1236
1237 // Monitoriamo `window.mappa`
1238 Object.defineProperty(window, 'mappa', {
1239 configurable: true,
1240 enumerable: true,
1241 get() {
1242 return this._mappa;
1243 },
1244 set(value) {
1245 this._mappa = value;
1246 if (value) {
1247 mapModuleProxy.mappaLoaded = true;
1248 }
1249 }
1250 });
1251 }
1252
1253 function initializeMap() {
1254 const latFromTemplate = parseFloat("${latitudine!""}");
1255 const lngFromTemplate = parseFloat("${longitudine!""}");
1256 const zoomFromTemplate = parseFloat("${zoom!""}");
1257 const typeFromTemplate = "${mapType!""}";
1258
1259 if (!isNaN(latFromTemplate) && !isNaN(lngFromTemplate)) {
1260 window.mappa.setCenter(
1261 new google.maps.LatLng(latFromTemplate, lngFromTemplate)
1262 );
1263 }
1264
1265 if (!isNaN(zoomFromTemplate)) {
1266 window.mappa.setZoom(zoomFromTemplate);
1267 }
1268
1269 if (typeFromTemplate && google.maps.MapTypeId[typeFromTemplate]) {
1270 window.mappa.setMapTypeId(google.maps.MapTypeId[typeFromTemplate]);
1271 }
1272 }
1273
1274 checkMapModuleAndInit();
1275</script>