Financial highlights
Ultima quotazione 60,60€
Variazione -4,11%
20/03/2026 - 17:39
data source: Investis Digital
Financial highlights
Ultima quotazione 60,60€
Variazione -4,11%
20/03/2026 - 17:39
data source: Investis Digital
Financial Results & Reports
Press releases
The following has evaluated to null or missing:
==> bannerImageData.mobile [in template "20115#20151#14304386" at line 200, column 75]
----
Tip: It's the step after the last dot that caused this error, not those before it.
----
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: ${bannerImageData.mobile?replace(" ",... [in template "20115#20151#14304386" at line 200, column 73]
----
1<#assign siteExpandoBridge = themeDisplay.getScopeGroup().getExpandoBridge() />
2<#assign new_restyle = (siteExpandoBridge.hasAttribute("new-restyle")?then(getterUtil.getBoolean(siteExpandoBridge.getAttribute("new-restyle", false)),false)) />
3<#if new_restyle?? && new_restyle>
4
5<@leonardo.articleInfo .vars "SP-Product-base"/>
6 <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
7
8 <#assign jArticle = journalArticleLocalService.getArticle(groupId, .vars['reserved-article-id'].data) >
9
10 <#assign productLayout = (jArticle.getLayout()!)>
11
12 <#assign docsDownloadURL = ''>
13 <#if (layout.getGroup().getGroupId()) != (jArticle.getGroupId())>
14 <#assign docsDownloadURL = portalUtil.getVirtualHostname (productLayout.getLayoutSet())>
15 <#if (docsDownloadURL)?has_content && (docsDownloadURL?lower_case != 'localhost')>
16 <#assign docsDownloadURL = 'https://' + docsDownloadURL >
17 <#else>
18 <#assign docsDownloadURL = ''>
19 </#if>
20 </#if>
21 <#assign currentGroupExpandoBridge = themeDisplay.getScopeGroup().getExpandoBridge()>
22 <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
23 <#assign languageId = languageUtil.getLanguageId(locale) />
24
25 <#assign
26 title = ''
27 abstract = ''
28 type = 'text'
29 date = ''
30 author = ''
31 jad = ''
32 metaTitle = ''
33 metaDescription = ''
34 >
35
36 <#if SeparatorOverview.ContentAbstract?? && (SeparatorOverview.ContentAbstract.getData())?has_content>
37 <#assign abstract = SeparatorOverview.ContentAbstract.getData()>
38 </#if>
39
40 <#assign LayoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")>
41 <#assign layoutObject = LayoutLocalService.getLayout(layout.getPlid()) />
42 <#assign layoutParent = LayoutLocalService.getLayout(layoutObject.getParentPlid()) />
43 <#assign layout = LayoutLocalService.getLayout(layoutObject.getPlid()) />
44 <#assign ancestors = layout.getAncestors() />
45 <#assign parentName = layoutParent.getName(locale) />
46 <#assign parentURL = layoutParent.getFriendlyURL(locale) />
47 <#assign GroupLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService")>
48 <#assign guestUrl = GroupLocalService.getGroup(themeDisplay.getScopeGroupId()).getFriendlyURL() />
49
50 <#assign maxTechnicalBoxes = 12>
51
52 <#assign languageId = languageUtil.getLanguageId(locale) />
53
54 <#assign sectionFreeArea1 = false>
55 <#assign sectionTDFound = false>
56 <#assign sectionOFound = false>
57 <#assign sectionOHtmlFound = false>
58 <#assign sectionFreeArea2 = false>
59
60
61 <!--FREE AREA 1 -->
62 <#if SeparatorMainFeatures?? && SeparatorMainFeatures.getSiblings()?has_content>
63 <#list SeparatorMainFeatures.getSiblings() as cur_sectionMF>
64 <#if (cur_sectionMF.MFSectionTitle.getData())?has_content ||
65 (cur_sectionMF.MFText.getData())?has_content ||
66 (cur_sectionMF.FreeWebContent.getData())?has_content>
67 <#assign sectionFreeArea1 = true>
68 <#break>
69 </#if>
70 </#list>
71 </#if>
72
73 <#if (SeparatorTechnicalData.TDSectionTitle.getSiblings())?has_content>
74 <#list SeparatorTechnicalData.TDSectionTitle.getSiblings() as cur_sectionTD>
75 <#if cur_sectionTD.getData() != "">
76 <#assign sectionTDFound = true>
77 <#break>
78 </#if>
79 </#list>
80 </#if>
81
82 <#if SeparatorFreeArea2?? && SeparatorFreeArea2.getSiblings()?has_content>
83 <#list SeparatorFreeArea2.getSiblings() as cur_sectionFA2>
84 <#if (cur_sectionFA2.Fa2Text.getData())?has_content ||
85 (cur_sectionFA2.Fa2SectionTitle.getData())?has_content ||
86 (cur_sectionFA2.Fa2WebContent.getData())?has_content
87 >
88 <#assign sectionFreeArea2 = true>
89 <#break>
90 </#if>
91 </#list>
92 </#if>
93
94 <#if (SeparatorOverview.OverviewText.getData())?has_content ||
95 (SeparatorOverview.OverviewTitle.getData())?has_content>
96 <#assign sectionOFound = true>
97 </#if>
98
99 <#if SeparatorOverview.ContentHtml?? &&
100 SeparatorOverview.ContentHtml.getData() != "" >
101 <#assign sectionOHtmlFound = true>
102 </#if>
103
104 <#function getProductImageUUID plid=-1>
105 <#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")>
106 <#assign assetCategoryPropertyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryPropertyLocalService")>
107 <#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")>
108 <#assign journalArticleResourceLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService")>
109
110 <#assign groupExpandoBridge = layout.getGroup().getExpandoBridge() />
111 <#assign products_vocabulary_id = (groupExpandoBridge.hasAttribute("products-vocabulary-id")?then(getterUtil.getLong(groupExpandoBridge.getAttribute("products-vocabulary-id", false)),0)) />
112
113 <#if (plid > 0)>
114 <#assign fromLayout = layoutLocalService.fetchLayout(plid)>
115 <#if fromLayout??>
116 <#assign categories = assetCategoryLocalService.getCategories("com.liferay.portal.kernel.model.Layout", fromLayout.getPlid()) />
117 <#list categories as category>
118 <#assign properties = assetCategoryPropertyLocalService.getCategoryProperties(category.getCategoryId())>
119 <#list properties as property>
120 <#if (products_vocabulary_id == category.getVocabularyId()) && (property.key == "uuid-banner-image") && (property.value)?has_content>
121 <#return property.getValue() />
122 </#if>
123 </#list>
124 </#list>
125 <#return getProductImageUUID(fromLayout.getParentPlid())/>
126 </#if>
127 <#elseif (plid < 0)>
128 <#assign from = paramUtil.getString(themeDisplay.getRequest(), "f", "null")>
129 <#assign fromLayout = layout>
130 <#if validator.isNotNull(from) && (from != "/search")>
131 <#assign fromLayout = layoutLocalService.fetchLayoutByFriendlyURL(groupId, false, from)!>
132 <#if validator.isNotNull(fromLayout)>
133 <#assign uuid_banner_image = getProductImageUUID(fromLayout.getPlid()) />
134 </#if>
135 </#if>
136 <#if !((uuid_banner_image)?has_content)>
137 <#assign resourcePrimKey = journalArticleResourceLocalService.getArticleResourcePrimKey(groupId, .vars['reserved-article-id'].data)>
138 <#assign categories = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", resourcePrimKey) />
139 <#list categories as category>
140 <#assign properties = assetCategoryPropertyLocalService.getCategoryProperties(category.getCategoryId())>
141 <#list properties as property>
142 <#if (products_vocabulary_id == category.getVocabularyId()) && (property.key == "uuid-banner-image") && (property.value)?has_content>
143 <#return property.getValue() />
144 </#if>
145 </#list>
146 </#list>
147 </#if>
148
149 <#if uuid_banner_image??>
150 <#return uuid_banner_image>
151 </#if>
152 </#if>
153 <#return "">
154 </#function>
155
156 <#function getImageURL uuid>
157 <#if (uuid?has_content)>
158 <#assign dlFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")>
159 <#assign banner_image = dlFileEntryLocalService.fetchDLFileEntryByUuidAndGroupId(uuid, groupId)! />
160 <#if (banner_image?has_content)>
161 <#assign t = banner_image.getFileVersion().getModifiedDate()! />
162 <#assign url = "/documents/" + banner_image.getRepositoryId()
163 + "/" + banner_image.getFolderId()
164 + "/" + httpUtil.encodePath(banner_image.getFileName())
165 + "/" + banner_image.getUuid() + "?t=" + t?long>
166 <#assign dataImage = {"fileEntryId": banner_image.getFileEntryId(), "fileName": banner_image.getFileName(), "ts": t?long}>
167 <#assign scalingDetails = {
168 "desktop": {"alternateImage": {}, "key": "w_1440"},
169 "tl": {"alternateImage": {}, "key": "h_460"},
170 "tp": {"alternateImage": {}, "key": "h_560"},
171 "mobile": {"alternateImage": {}, "key": "h_400"}
172 }>
173 <#return leonardo.adaptImage(dataImage, scalingDetails)>
174 </#if>
175 </#if>
176 <#return {}>
177 </#function>
178 <#assign uuid = getProductImageUUID()>
179 <#assign bannerImageData = getImageURL(uuid)>
180 <!-- default number of visible technical data boxes -->
181 <#assign maxTechnicalBoxes = 12>
182
183 <div class="sticky-container">
184 <section>
185 <#if !(hasDetailPage?? && getterUtil.getBoolean(hasDetailPage.getData())) >
186 <#if (SeparatorOverview.OverviewImage)?has_content >
187 <div class="container-full-width black hero-image-small product">
188 <div class="hero-bottom-gradient">
189 <div class="text-content container">
190 <h1 class="title-hero-02 mb-0">${SeparatorOverview.ProductName.getData()}</h1>
191 </div>
192 </div>
193 </div>
194
195 </#if>
196 <#else>
197 <div class="container-full-width black hero-image-small product">
198 <div class="hero-bottom-gradient">
199 <picture class="bg-picture">
200 <source srcset="${bannerImageData.mobile?replace(" ", "%20")!}" media="(max-width: 576px)">
201 <source srcset="${bannerImageData.tablet_portrait?replace(" ", "%20")!}" media="(max-width: 768px)">
202 <source srcset="${bannerImageData.tablet_landscape?replace(" ", "%20")!}" media="(max-width: 1024px)">
203 <img class="img-fluid bg" src="${bannerImageData.desktop?replace(" ", "%20")!}">
204 </picture>
205
206 <div class="text-content container">
207 <h1 class="title-hero-02 mb-0">${SeparatorOverview.ProductName.getData()}</h1>
208 </div>
209 </div>
210 </div>
211 </#if>
212 </section>
213 <#if hasDetailPage?? && getterUtil.getBoolean(hasDetailPage.getData()) >
214 <div class="menu-fixed menu-fixed-grey">
215 <div class="menu-wrapper">
216 <ul>
217 <li>
218 <a
219 class="label-light"
220 data-scrolltosection="#section-overview"
221 title="${(SeparatorOverview.OverviewTitle.getData())!defaultValue}"
222 aria-label="${(SeparatorOverview.OverviewTitle.getData())!defaultValue}"
223 >
224
225 ${((SeparatorOverview.OverviewTitle.getData())?has_content)?then(SeparatorOverview.OverviewTitle.getData(),defaultValue)}
226 </a>
227 </li>
228
229 <#-- FREE AREA 1 -->
230 <#if sectionFreeArea1 && SeparatorMainFeatures??>
231 <#list SeparatorMainFeatures.getSiblings() as cur_section>
232 <#assign showTitleOrText = false>
233 <#if (cur_section.MFSectionTitle.getData())?has_content &&
234 (cur_section.MFText.getData())?has_content>
235 <#assign showTitleOrText = true>
236 </#if>
237 <#if showTitleOrText>
238 <#if cur_section.Fa1AnchorBarText.getData()?has_content >
239 <li>
240 <a
241 class="label-light"
242 data-scrolltosection="#section-content--features-${cur_section?index}"
243 title="${cur_section.Fa1AnchorBarText.getData()}"
244 aria-label="${cur_section.Fa1AnchorBarText.getData()}"
245 >
246 ${cur_section.Fa1AnchorBarText.getData()}
247 </a>
248 </li>
249 </#if>
250 </#if>
251 </#list>
252 </#if>
253
254 <#-- TECHNICAL DATA -->
255 <#if sectionTDFound>
256 <#assign tdSiblings = SeparatorTechnicalData.TDTitle.getSiblings()>
257 <#if tdSiblings?has_content
258 && ((tdSiblings?first.getData()!"")?trim != "" || (tdSiblings?first.TDText.getData()!"")?trim != "")>
259 <#assign defaultValue = languageUtil.get(locale, "section-techdata-default") />
260 <li>
261 <a
262 class="label-light"
263 data-scrolltosection="#products-technical-data"
264 title="${((SeparatorTechnicalData.TDSectionTitle.getData())?has_content)?then(SeparatorTechnicalData.TDSectionTitle.getData(),defaultValue)}"
265 aria-label="${((SeparatorTechnicalData.TDSectionTitle.getData())?has_content)?then(SeparatorTechnicalData.TDSectionTitle.getData(),defaultValue)}"
266 >
267 ${((SeparatorTechnicalData.TDSectionTitle.getData())?has_content)?then(SeparatorTechnicalData.TDSectionTitle.getData(),defaultValue)}
268
269 </a>
270 </li>
271 </#if>
272 </#if>
273
274 <#-- FREE AREA 2 -->
275 <#if sectionFreeArea2 && SeparatorFreeArea2??>
276 <#list SeparatorFreeArea2.getSiblings() as fa2>
277 <#if fa2.Fa2AnchorBarText.getData()?has_content >
278 <li>
279 <a
280 class="label-light"
281 data-scrolltosection="#section-content--features-fa2-${fa2?index}"
282 title="${fa2.Fa2AnchorBarText.getData()}"
283 aria-label="${fa2.Fa2AnchorBarText.getData()}"
284 >
285 ${fa2.Fa2AnchorBarText.getData()}
286 </a>
287 </li>
288 </#if>
289 </#list>
290 </#if>
291
292
293 <li>
294 <a
295 class="label-light anchorbar_products_contacts"
296 title='${languageUtil.get(locale, "anchor-contacts")}'
297 aria-label='${languageUtil.get(locale, "anchor-contacts")}'
298 data-scrolltosection=".section-contacts"
299 >
300 ${languageUtil.get(locale, "anchor-contacts")}
301 </a>
302 </li>
303
304 </ul>
305
306 </div>
307 </div>
308 </#if>
309
310 </div>
311
312 <div class="container-full-width <#if abstract!='' >black<#else>grey</#if>">
313 <div class="container">
314 <nav aria-label="Breadcrumb" class="breadcrumbs">
315 <ol>
316 <#list ancestors?reverse as ancestor>
317 <#if !ancestor.isHidden()>
318 <#assign url = ancestor.getFriendlyURL()!"">
319 <#if !url?ends_with("-node")>
320 <li>
321 <a class="label-regular"
322 title="${ancestor.getName(locale)}"
323 href="${themeDisplay.getPathFriendlyURLPublic()}${guestUrl}${ancestor.getFriendlyURL(locale)}"
324 >
325 ${ancestor.getName(locale)}
326 </a>
327 </li>
328 </#if>
329 </#if>
330 </#list>
331 <li class="border-0 text-truncate" style="flex:auto">
332 <span class="label-regular">${.vars['reserved-article-title'].data}</span>
333 </li>
334 </ol>
335 </nav>
336 </div>
337 </div>
338
339 <#macro displayDownloadLinks fileUrlElms>
340 <div class="grid-col-download rounded-20 margin-bottom">
341 <#list fileUrlElms as cur_file>
342 <#if cur_file.getData()?? && cur_file.getData() != "">
343 <#assign defLabel = languageUtil.get(locale, "download-brochure")>
344 <#assign file_info = leonardo.findFileEntryInfo(cur_file.getData()) >
345 <a class="report-download"
346 target="_blank"
347 href="${docsDownloadURL}${file_info.downloadUrl}"
348 title='${(file_info.title)!cur_file.OverviewFileLabel.getData()!defLabel}'
349 >
350 <img src="${themeDisplay.getPathThemeImages()}/img/reports/download-icon.svg" alt="download icon" style="border-radius:0;width:auto">
351 <span class="label-regular">
352 ${(cur_file.OverviewFileLabel.getData())!(file_info.title)!defLabel}
353 </span>
354 </a>
355 </#if>
356 </#list>
357 </div>
358 </#macro>
359
360 <#if !(hasDetailPage?? && getterUtil.getBoolean(hasDetailPage.getData())) >
361 <#if (SeparatorOverview.OverviewText.getData())?has_content>
362 <div class="container-full-width padding-block pagination-flex">
363 <div id = "section-overview" class="container tight">
364 <div class="simple-text">
365 <div class="body-regular">
366 ${SeparatorOverview.OverviewText.getData()}
367 </div>
368 </div>
369 </div>
370 </div>
371 </#if>
372 <#assign validFiles = 0>
373 <#assign overviewSiblings = SeparatorOverview.OverviewFileUrl.getSiblings()>
374
375 <#if overviewSiblings?has_content>
376 <#list overviewSiblings as itemList>
377 <#assign file_info = leonardo.findFileEntryInfo(itemList.getData())>
378 <#assign label = (itemList.OverviewFileLabel.getData()!"")?trim>
379 <#assign downloadUrl = (file_info.downloadUrl!"")?trim>
380
381 <#if label != "" && downloadUrl != "">
382 <#assign validFiles = validFiles + 1>
383 </#if>
384 </#list>
385 </#if>
386
387 <#assign hasValidFiles = (validFiles > 0)>
388
389 <#if hasValidFiles>
390 <div class="container-full-width padding-top">
391 <div class="container tight">
392 <div class="grid-col-download rounded-20">
393 <#list overviewSiblings as itemList>
394 <#assign file_info = leonardo.findFileEntryInfo(itemList.getData())>
395 <#assign label = (itemList.OverviewFileLabel.getData()!"")?trim>
396 <#assign downloadUrl = (file_info.downloadUrl!"")?trim>
397
398 <#if label != "" && downloadUrl != "">
399 <a class="report-download"
400 href="${downloadUrl}"
401 title="${file_info.title!}"
402 target="_blank">
403 <img src="${themeDisplay.getPathThemeImages()}/img/reports/download-icon.svg" alt="download icon">
404 <span class="label-regular">${label}</span>
405 </a>
406 </#if>
407 </#list>
408 </div>
409 </div>
410 </div>
411 </#if>
412 <#else>
413 <div class="container-full-width padding-block pagination-flex">
414 <!--OVERVIEW LAUNCH-->
415
416 <div id = "section-overview" class="container tight">
417 <div class="simple-text component-with-title">
418 <div class="body-regular">
419 <#--<#if (SeparatorOverview.ProductTitle.getData())?has_content>
420 <h2 class="title-extralarge">
421 ${(SeparatorOverview.ProductTitle.getData())}
422 </h2>
423 </#if>-->
424
425 <#if (SeparatorOverview.OverviewText.getData())?has_content>
426 ${SeparatorOverview.OverviewText.getData()}
427 </#if>
428 </div>
429 <!--Start Module: Section Content-->
430 <#if SeparatorOverview.ContentHtml.getData() != "">
431 <div class="body-regular">
432 ${SeparatorOverview.ContentHtml.getData()}
433 </div>
434 </#if>
435
436 <#assign overviewFileUrlElms = SeparatorOverview.OverviewFileUrl.getSiblings() />
437 <#assign validFiles = overviewFileUrlElms?filter(f -> f.getData()?? && f.getData()?trim != "")>
438
439 <#if validFiles?has_content && !getterUtil.getBoolean(hasDetailPage.getData())>
440 <@displayDownloadLinks fileUrlElms=overviewFileUrlElms />
441 </#if>
442 <!--End Module: Section Content-->
443
444 <#if (discoverMoreLink)?has_content && (discoverMoreLink.getData() != '')>
445 <div class = "product-det-discover padding-top">
446 <div class="white-card">
447 ${discoverMoreLink.getData()!}
448 </div>
449 </div>
450 </#if>
451 </div>
452 </div>
453 <!--END MODULE: LAUNCH SECTION-->
454
455 <!--START MODULE: FREE AREA 1-->
456 <#if sectionFreeArea1 >
457 <#list SeparatorMainFeatures.getSiblings() as cur_sectionMF>
458 <!--Start Module: Section Content-->
459 <#assign showTitleOrText = false>
460 <#if (cur_sectionMF.MFSectionTitle.getData())?has_content &&
461 (cur_sectionMF.MFText.getData())?has_content>
462 <#assign showTitleOrText = true>
463 </#if>
464 <#if showTitleOrText>
465 <div id = "section-content--features-${cur_sectionMF?index}" class="container section-content--features">
466 <div class="simple-text">
467 <div class="body-regular">
468 <#if (cur_sectionMF.MFSectionTitle.getData())?has_content>
469 <h2 class="title-extralarge">
470 ${cur_sectionMF.MFSectionTitle.getData()}
471 </h2>
472 </#if>
473
474 <#if cur_sectionMF.MFText.getData() != "">
475 <#assign htmlFormatted = leonardo.expandElementsInPage(cur_sectionMF.MFText.getData())>
476 ${htmlFormatted}
477 </#if>
478 </div>
479 </div>
480 </div>
481 </#if>
482 <#if (cur_sectionMF.FreeWebContent.getData())?has_content>
483 <!--Start Module: Free Web Content -->
484 <div ${(showTitleOrText)?then('','id="section-content--features-'+ cur_sectionMF?index + '"')}>
485 <#assign data = cur_sectionMF.FreeWebContent.getData()/>
486 <#assign json = jsonFactoryUtil.createJSONObject(data) />
487 <#assign classPK = json.getLong("classPK") />
488 <#if (classPK >0) >
489 <#assign ja = journalArticleLocalService.getLatestArticle(classPK) />
490 <#assign jad = journalArticleLocalService.getArticleDisplay(ja, ja.getTemplateId(), "", languageId, 1, null, themeDisplay) />
491 ${jad.getContent()}
492 </#if>
493 </div>
494 <!--End Module: Free Web Content-->
495 </#if>
496 <!--End Module: Section Content-->
497 </#list>
498 </#if>
499 <!--END MODULE: FREE AREA 1-->
500
501 <!--START MODULE: PRODUCTS TECHNICAL DATA-->
502 <#if sectionTDFound >
503 <#assign tdSiblings = SeparatorTechnicalData.TDTitle.getSiblings()>
504 <#if tdSiblings?has_content
505 && ((tdSiblings?first.getData()!"")?trim != "" || (tdSiblings?first.TDText.getData()!"")?trim != "")>
506 <div id = "products-technical-data" class="container">
507 <div class="component-with-title">
508 <#if SeparatorTechnicalData.TDSectionTitle.getData() != "">
509 <h1 class="title-extralarge">
510 ${SeparatorTechnicalData.TDSectionTitle.getData()}
511 </h1>
512 </#if>
513 <div class="grid-technical">
514 <#list SeparatorTechnicalData.TDTitle.getSiblings() as cur_TDTitle>
515 <div class="data-container rounded-20">
516 <#if cur_TDTitle.getData() != "">
517 <h2 class="body-medium text-center mb-0">${cur_TDTitle.getData()}</h2>
518 </#if>
519 <#if cur_TDTitle.TDText.getData() != "">
520 <div class="body-medium text-center mb-0">
521 ${cur_TDTitle.TDText.getData()}
522 </div>
523 </#if>
524 </div>
525 </#list>
526 </#if>
527 <#if SeparatorTechnicalData.TDButtonLabel.getData() != "">
528
529 </div>
530 </div>
531 </div>
532 </#if>
533 </#if>
534 <!--END MODULE: PRODUCTS TECHNICAL DATA-->
535
536 <!--START MODULE: FREE AREA 2 -->
537 <#if sectionFreeArea2 >
538 <#list SeparatorFreeArea2.getSiblings() as cur_sectionFA2>
539 <!--Start Module: Section Content-->
540 <#assign showTitleOrText = false>
541 <#if (cur_sectionFA2.Fa2SectionTitle.getData())?has_content ||
542 (cur_sectionFA2.Fa2Text.getData())?has_content>
543 <#assign showTitleOrText = true>
544 </#if>
545 <#if showTitleOrText>
546 <div id = "section-content--features-fa2-${cur_sectionFA2?index}" class="container section-content--features-fa2">
547 <div class="simple-text">
548 <div class="body-regular">
549 <#if (cur_sectionFA2.Fa2SectionTitle.getData())?has_content>
550 <h2 class="title-extralarge">
551 ${cur_sectionFA2.Fa2SectionTitle.getData()}
552 </h2>
553 </#if>
554
555 <#if cur_sectionFA2.Fa2Text.getData() != "">
556 <#assign htmlFormatted = leonardo.expandElementsInPage(cur_sectionFA2.Fa2Text.getData())>
557 ${htmlFormatted}
558 </#if>
559 </div>
560 </div>
561 </div>
562 </#if>
563 <#if (cur_sectionFA2.Fa2WebContent.getData())?has_content>
564 <!--Start Module: Free Web Content -->
565 <div ${(showTitleOrText)?then('','id="section-content--features-fa2-'+ cur_sectionFA2?index + '"')}>
566 <#assign data = cur_sectionFA2.Fa2WebContent.getData()/>
567 <#assign json = jsonFactoryUtil.createJSONObject(data) />
568 <#assign classPK = json.getLong("classPK") />
569 <#if (classPK >0) >
570 <#assign ja = journalArticleLocalService.getLatestArticle(classPK) />
571 <#assign jad = journalArticleLocalService.getArticleDisplay(ja, ja.getTemplateId(), "", languageId, 1, null, themeDisplay) />
572 ${jad.getContent()}
573 </#if>
574 </div>
575 <!--End Module: Free Web Content-->
576 </#if>
577 <!--End Module: Section Content-->
578 </#list>
579 </#if>
580 <!--END MODULE: FREE AREA 2 -->
581
582 <#assign validFiles = 0>
583 <#assign overviewSiblings = SeparatorOverview.OverviewFileUrl.getSiblings()>
584
585 <#if overviewSiblings?has_content>
586 <#list overviewSiblings as itemList>
587 <#assign file_info = leonardo.findFileEntryInfo(itemList.getData())>
588 <#assign label = (itemList.OverviewFileLabel.getData()!"")?trim>
589 <#assign downloadUrl = (file_info.downloadUrl!"")?trim>
590
591 <#if label != "" && downloadUrl != "">
592 <#assign validFiles = validFiles + 1>
593 </#if>
594 </#list>
595 </#if>
596
597 <#assign hasValidFiles = (validFiles > 0)>
598
599 <#if hasValidFiles>
600 <div class="container tight padding-top">
601 <div class="grid-col-download rounded-20">
602 <#list overviewSiblings as itemList>
603 <#assign file_info = leonardo.findFileEntryInfo(itemList.getData())>
604 <#assign label = (itemList.OverviewFileLabel.getData()!"")?trim>
605 <#assign downloadUrl = (file_info.downloadUrl!"")?trim>
606
607 <#if label != "" && downloadUrl != "">
608 <a class="report-download"
609 href="${downloadUrl}"
610 title="${file_info.title!}"
611 target="_blank">
612 <img src="${themeDisplay.getPathThemeImages()}/img/reports/download-icon.svg" alt="download icon">
613 <span class="label-regular">${label}</span>
614 </a>
615 </#if>
616 </#list>
617 </div>
618 </div>
619 </#if>
620
621
622
623 <div class="container">
624 <span class="separator-grey"></span>
625 </div>
626 <!--END MODULE: DOWNLOAD -->
627 </div>
628
629 <#assign metaDesc = "">
630 <!-- Meta description -->
631 <#if (layout.getDescription(themeDisplay.locale))?has_content>
632 <#assign metaDesc = layout.getDescription(themeDisplay.locale)>
633 <#elseif (.vars['reserved-article-description'].data)?has_content>
634 <#assign metaDesc = .vars['reserved-article-description'].data>
635 </#if>
636 <#if metaDesc?has_content>
637 ${layout.setDescription(metaDesc)}
638 </#if>
639 <#if SeparatorHero?? && (SeparatorHero.HeroImage.getData())?has_content>
640 <!-- Social Sharing -->
641 <#if (heroImg.desktop)?has_content>
642 <#assign imageFileName = heroImg.desktop!"" >
643 <#elseif (overviewImg.desktop)?has_content>
644 <#assign imageFileName = overviewImg.desktop!"" >
645 <#else>
646 <#assign imageFileName = "" >
647 </#if>
648
649 <#if (SeparatorHero.HeroTitle.getData())?has_content>
650 <#assign shareDescription = (htmlUtil.escape(SeparatorHero.HeroTitle.getData())!"")/>
651 <#assign shareDescription = (shareDescription?replace("\n", " "))/>
652 </#if>
653
654 <#assign ogType='product'>
655
656 <#assign twitterVia = "Leonardo_live">
657 <@leonardo.socialShareMetaAndLinks shareDescription=shareDescription imageFileName=imageFileName ogType=ogType twitterVia=twitterVia/>
658 </#if>
659 </#if>
660<#else>
661
662 <@leonardo.articleInfo .vars "SP-Product-base"/>
663
664 <#assign rndNamespace = randomNamespace>
665
666 <#assign currentGroupExpandoBridge = themeDisplay.getScopeGroup().getExpandoBridge()>
667 <#assign isDarkTheme = false>
668 <#if currentGroupExpandoBridge.hasAttribute("dark-theme")>
669 <#assign isDarkTheme = currentGroupExpandoBridge.getAttribute("dark-theme", false)>
670 </#if>
671
672
673 <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
674 <#assign languageId = languageUtil.getLanguageId(locale) />
675
676 <#assign jArticle = journalArticleLocalService.getArticle(groupId, .vars['reserved-article-id'].data) >
677 <#assign productLayout = (jArticle.getLayout()!)>
678
679 <#assign docsDownloadURL = ''>
680 <#if (layout.getGroup().getGroupId()) != (jArticle.getGroupId())>
681 <#assign docsDownloadURL = portalUtil.getVirtualHostname (productLayout.getLayoutSet())>
682 <#if (docsDownloadURL)?has_content && (docsDownloadURL?lower_case != 'localhost')>
683 <#assign docsDownloadURL = 'https://' + docsDownloadURL >
684 <#else>
685 <#assign docsDownloadURL = ''>
686 </#if>
687 </#if>
688
689 <#if isDarkTheme && !(hasDetailPage?? && getterUtil.getBoolean(hasDetailPage.getData()))>
690 <#if SeparatorOverview??>
691 <#assign scalingDetails = {
692 "desktop": {"alternateImage": {}, "key": "w_317"},
693 "tl": {"alternateImage": SeparatorOverview.OverviewImage.ImageTl!, "key": "w_317"},
694 "tp": {"alternateImage": SeparatorOverview.OverviewImage.ImageTp!, "key": "w_317"},
695 "mobile": {"alternateImage": SeparatorOverview.OverviewImage.ImageM!, "key": "w_317"}
696 }>
697
698 <#assign dataImg = leonardo.adaptImage(SeparatorOverview.OverviewImage!, scalingDetails )>
699 <div class="product-page-hero-card product-card-modal-container product-base section-hero-card--smallerVersion section-hero-card--wider-page-padding">
700 <div class="product-card-modal">
701 <div class="product-card-modal-text">
702 <div class="modal-title-container">
703 <h1 class="modal-title">
704 ${SeparatorOverview.ProductName.getData()}
705 </h1>
706 </div>
707 <div class="product-card--graphic-container">
708 <img class="product-card--graphic" alt="${SeparatorOverview.ProductName.getData()!}" title="${SeparatorOverview.ProductName.getData()!}" src="${themeDisplay.pathThemeImages}/blank.png"
709 data-src-url-d="${dataImg.desktop!}"
710 data-src-url-tl="${dataImg.tablet_landscape!}"
711 data-src-url-tp="${dataImg.tablet_portrait!}"
712 data-src-url-m="${dataImg.mobile!}"/>
713 </div>
714 <div class="modal-description">
715 ${SeparatorOverview.OverviewText.getData()}
716 </div>
717
718 <#if SeparatorOverview.OverviewFileUrl??>
719 <#assign docsDownloadURL = ''>
720
721 <ul class="js-ul-overview">
722 <#list SeparatorOverview.OverviewFileUrl.getSiblings() as itemList>
723
724 <#assign file_info = leonardo.findFileEntryInfo(itemList.getData()) >
725 <#if itemList.OverviewFileLabel.getData()!= '' && file_info.downloadUrl != ''>
726 <li class="list-item">
727 <a href="${docsDownloadURL}${file_info.downloadUrl}" target="_blank">
728 ${itemList.OverviewFileLabel.getData()!}
729 </a>
730 </li>
731 </#if>
732 </#list>
733 </ul>
734 </#if>
735 </div>
736 </div>
737 </div>
738 </#if>
739 <#else>
740 <#macro downloadIcon>
741 <svg xmlns="http://www.w3.org/2000/svg" width="14" height="18" viewBox="0 0 14 18">
742 <path fill="#000" fill-rule="nonzero" d="M6.61 12.763l-2.145-2.24a.58.58 0 0 1 0-.796c.211-.22.551-.22.762 0l1.235 1.29V6.75c0-.31.24-.563.538-.563.297 0 .538.252.538.563v4.267l1.235-1.29c.21-.22.551-.22.762 0a.58.58 0 0 1 0 .796l-2.145 2.24a.526.526 0 0 1-.78 0zM12.62 18H1.383C.62 18 0 17.368 0 16.592V5.037c0-.49.19-.968.52-1.314L3.565.544A1.728 1.728 0 0 1 4.82 0h7.797C13.38 0 14 .631 14 1.407v15.186C14 17.37 13.38 18 12.619 18zM4.82 1.125a.682.682 0 0 0-.496.214L1.282 4.52a.755.755 0 0 0-.205.518v11.555c0 .156.137.283.306.283h11.235c.168 0 .305-.127.305-.282V1.407c0-.155-.137-.282-.305-.282H4.821zm-.783 4.5H2.154a.551.551 0 0 1-.539-.563c0-.31.242-.562.539-.562h1.884c.15 0 .27-.126.27-.281V2.25c0-.31.24-.563.538-.563.297 0 .539.252.539.563v1.969c0 .775-.605 1.406-1.347 1.406zm6.193 9.563H3.769a.55.55 0 0 1-.538-.563.55.55 0 0 1 .538-.563h6.462a.55.55 0 0 1 .538.563.55.55 0 0 1-.538.563z"/>
743 </svg>
744 </#macro>
745
746 <#macro displayDownloadLinks fileUrlElms fileVirtualHost>
747 <div class="section-content--action-items">
748 <#list fileUrlElms as cur_file>
749 <#if cur_file.getData()?? && cur_file.getData() != "">
750 <#assign defLabel = languageUtil.get(locale, "download-brochure")>
751 <div class="section-content--action-items--download">
752 <#assign file_info = leonardo.findFileEntryInfo(cur_file.getData()) >
753
754 <a class="section-content--action-items--download--link"
755 target="_blank"
756 href="${fileVirtualHost}${file_info.downloadUrl}"
757 title='${(file_info.title)!cur_file.OverviewFileLabel.getData()!defLabel}'>
758 <@downloadIcon />
759 <span class="section-content--action-items--download--link--filename">
760 ${(cur_file.OverviewFileLabel.getData())!(file_info.title)!defLabel}
761 </span>
762 </a>
763 </div>
764 </#if>
765 </#list>
766 </div>
767 </#macro>
768
769 <#function getProductImageUUID plid=-1>
770 <#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")>
771 <#assign assetCategoryPropertyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryPropertyLocalService")>
772 <#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")>
773 <#assign journalArticleResourceLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService")>
774
775 <#assign groupExpandoBridge = layout.getGroup().getExpandoBridge() />
776 <#assign products_vocabulary_id = (groupExpandoBridge.hasAttribute("products-vocabulary-id")?then(getterUtil.getLong(groupExpandoBridge.getAttribute("products-vocabulary-id", false)),0)) />
777
778 <#if (plid > 0)>
779 <#assign fromLayout = layoutLocalService.fetchLayout(plid)>
780 <#if fromLayout??>
781 <#assign categories = assetCategoryLocalService.getCategories("com.liferay.portal.kernel.model.Layout", fromLayout.getPlid()) />
782 <#list categories as category>
783 <#assign properties = assetCategoryPropertyLocalService.getCategoryProperties(category.getCategoryId())>
784 <#list properties as property>
785 <#if (products_vocabulary_id == category.getVocabularyId()) && (property.key == "uuid-banner-image") && (property.value)?has_content>
786 <#return property.getValue() />
787 </#if>
788 </#list>
789 </#list>
790 <#return getProductImageUUID(fromLayout.getParentPlid())/>
791 </#if>
792 <#elseif (plid < 0)>
793 <#assign from = paramUtil.getString(themeDisplay.getRequest(), "f", "null")>
794 <#assign fromLayout = layout>
795 <#if validator.isNotNull(from) && (from != "/search")>
796 <#assign fromLayout = layoutLocalService.fetchLayoutByFriendlyURL(groupId, false, from)!>
797 <#if validator.isNotNull(fromLayout)>
798 <#assign uuid_banner_image = getProductImageUUID(fromLayout.getPlid()) />
799 </#if>
800 </#if>
801 <#if !((uuid_banner_image)?has_content)>
802 <#assign resourcePrimKey = journalArticleResourceLocalService.getArticleResourcePrimKey(groupId, .vars['reserved-article-id'].data)>
803 <#assign categories = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", resourcePrimKey) />
804 <#list categories as category>
805 <#assign properties = assetCategoryPropertyLocalService.getCategoryProperties(category.getCategoryId())>
806 <#list properties as property>
807 <#if (products_vocabulary_id == category.getVocabularyId()) && (property.key == "uuid-banner-image") && (property.value)?has_content>
808 <#return property.getValue() />
809 </#if>
810 </#list>
811 </#list>
812 </#if>
813
814 <#if uuid_banner_image??>
815 <#return uuid_banner_image>
816 </#if>
817 </#if>
818 <#return "">
819 </#function>
820
821 <#function getImageURL uuid>
822 <#if (uuid?has_content)>
823 <#assign dlFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")>
824 <#assign banner_image = dlFileEntryLocalService.fetchDLFileEntryByUuidAndGroupId(uuid, groupId)! />
825 <#if (banner_image?has_content)>
826 <#assign t = banner_image.getFileVersion().getModifiedDate()! />
827 <#assign url = "/documents/" + banner_image.getRepositoryId()
828 + "/" + banner_image.getFolderId()
829 + "/" + httpUtil.encodePath(banner_image.getFileName())
830 + "/" + banner_image.getUuid() + "?t=" + t?long>
831 <#assign dataImage = {"fileEntryId": banner_image.getFileEntryId(), "fileName": banner_image.getFileName(), "ts": t?long}>
832 <#assign scalingDetails = {
833 "desktop": {"alternateImage": {}, "key": "w_1440"},
834 "tl": {"alternateImage": {}, "key": "h_460"},
835 "tp": {"alternateImage": {}, "key": "h_560"},
836 "mobile": {"alternateImage": {}, "key": "h_400"}
837 }>
838 <#return leonardo.adaptImage(dataImage, scalingDetails)>
839 </#if>
840 </#if>
841 <#return {}>
842 </#function>
843 <#assign uuid = getProductImageUUID()>
844 <#assign bannerImageData = getImageURL(uuid)>
845 <!-- default number of visible technical data boxes -->
846 <#assign maxTechnicalBoxes = 12>
847
848
849
850
851
852 <#assign sectionOFound = false>
853 <#assign sectionOHtmlFound = false>
854 <#assign sectionFreeArea1 = false>
855 <#assign sectionFreeArea2 = false>
856 <#assign sectionTDFound = false>
857
858 <!--FREE AREA 1 -->
859 <#if SeparatorMainFeatures?? && SeparatorMainFeatures.getSiblings()?has_content>
860 <#list SeparatorMainFeatures.getSiblings() as cur_sectionMF>
861 <#if (cur_sectionMF.MFSectionTitle.getData())?has_content ||
862 (cur_sectionMF.MFText.getData())?has_content ||
863 (cur_sectionMF.FreeWebContent.getData())?has_content>
864 <#assign sectionFreeArea1 = true>
865 <#break>
866 </#if>
867 </#list>
868 </#if>
869 <!--FREE AREA 2 -->
870 <#if SeparatorFreeArea2?? && SeparatorFreeArea2.getSiblings()?has_content>
871 <#list SeparatorFreeArea2.getSiblings() as cur_sectionFA2>
872 <#if (cur_sectionFA2.Fa2Text.getData())?has_content ||
873 (cur_sectionFA2.Fa2SectionTitle.getData())?has_content ||
874 (cur_sectionFA2.Fa2WebContent.getData())?has_content>
875 <#assign sectionFreeArea2 = true>
876 <#break>
877 </#if>
878 </#list>
879 </#if>
880 <#if (SeparatorTechnicalData.TDSectionTitle.getSiblings())?has_content>
881 <#list SeparatorTechnicalData.TDSectionTitle.getSiblings() as cur_sectionTD>
882 <#if cur_sectionTD.getData() != "">
883 <#assign sectionTDFound = true>
884 <#break>
885 </#if>
886 </#list>
887 </#if>
888 <#if (SeparatorOverview.OverviewText.getData())?has_content ||
889 (SeparatorOverview.OverviewTitle.getData())?has_content>
890 <#assign sectionOFound = true>
891 </#if>
892 <#if (SeparatorOverview.ContentHtml.getData())?has_content >
893 <#assign sectionOHtmlFound = true>
894 </#if>
895 <#if (SeparatorOverview.OverviewFileUrl)?has_content>
896 <#assign overviewFileUrlElms = SeparatorOverview.OverviewFileUrl.getSiblings()>
897 </#if>
898
899 <div class="product-wrapper product-base">
900 <!--Start Module: Hero-->
901 <div class="section-container section-container--fluid">
902 <style>
903 <#if bannerImageData?has_content>
904 .hero-banner-half-image-bck{background-image: url(${bannerImageData.desktop!});}
905 @media all and (min-width: 1024px) and (max-width: 1279px) {
906 .hero-banner-half-image-bck{background-image: url(${bannerImageData.tablet_landscape!});}
907 }
908 @media all and (min-width: 768px) and (max-width: 1023px) {
909 .hero-banner-half-image-bck{background-image: url(${bannerImageData.tablet_portrait!});}
910 }
911 @media all and (max-width: 767px) {
912 .hero-banner-half-image-bck{background-image: url(${bannerImageData.mobile!});}
913 }
914 <#else>
915 .hero-banner-half-image-bck{background-color: #8698a2;}
916 </#if>
917 </style>
918
919 <div class="hero">
920 <!--Start Module: Hero Slide-->
921 <div class="hero-slide hero-slide--internal hero-banner-half-image-bck">
922 <div class="hero-slide--content">
923 <h1 class="hero-slide--content--title">${(SeparatorOverview.ProductName.data)!"Product"}</h1>
924 </div>
925 <noscript>
926 <img src="${bannerImageData.desktop!}" alt='${bannerImageData.alt_desktop!}'>
927 <img src="${bannerImageData.tablet_landscape!}" alt='${bannerImageData.alt_tablet_landscape!}'>
928 <img src="${bannerImageData.tablet_portrait!}" alt='${bannerImageData.alt_tablet_portrait!}'>
929 <img src="${bannerImageData.mobile!}" alt='${bannerImageData.alt_mobile!}'>
930 </noscript>
931 </div>
932 <!--End Module: Hero Slide-->
933
934 <!--Start Mixin: Icon Share Primary-->
935 <@leonardo.shareLinkHero/>
936 <!--End Mixin: Icon Share Primary-->
937 </div>
938 </div>
939
940 <!--Start Module: Section Navigator Anchor bar product base-->
941 <div class="section-container section-container--fluid">
942 <div class="section-navigator">
943 <div class="section-navigator--list">
944 <div class="section-container swiper-container--sectionNavigator section-container--fixed">
945 <div class="section-navigator--list--item-wrap swiper-wrapper">
946 <!--Overview-->
947 <#assign defaultValue=languageUtil.get(locale, "section-overview-default")>
948 <a class="section-navigator--list--item swiper-slide active" href="javascript:void(0);"
949 title="${(SeparatorOverview.OverviewTitle.getData())!defaultValue}"
950 data-target=".section-hero-card">
951 ${(SeparatorOverview.OverviewTitle.getData())!defaultValue}</a>
952 <!--Free Area 1 -->
953 <#if sectionFreeArea1 && SeparatorMainFeatures??>
954 <#list SeparatorMainFeatures.getSiblings() as cur_section>
955 <#if (cur_section.Fa1AnchorBarText.getData())?has_content >
956 <a class="section-navigator--list--item swiper-slide" href="javascript:void(0);"
957 title='${(cur_section.Fa1AnchorBarText.getData())}'
958 data-target=".section-content--features-${cur_section?index}">
959 ${(cur_section.Fa1AnchorBarText.getData())!}</a>
960 </#if>
961 </#list>
962 </#if>
963 <!--Technical data-->
964 <#if sectionTDFound = true >
965 <#assign defaultValue=languageUtil.get(locale, "section-techdata-default")>
966 <a class="section-navigator--list--item swiper-slide" href="javascript:void(0)"
967 title='${(SeparatorTechnicalData.TDSectionTitle.getData())!defaultValue}'
968 data-target=".products-technical-data">
969 ${(SeparatorTechnicalData.TDSectionTitle.getData())!defaultValue}</a>
970 </#if>
971 <!--Free Area 2 -->
972 <#if sectionFreeArea2 && SeparatorFreeArea2??>
973 <#list SeparatorFreeArea2.getSiblings() as cur_section>
974 <#if (cur_section.Fa2AnchorBarText.getData())?has_content >
975 <a class="section-navigator--list--item swiper-slide" href="javascript:void(0)"
976 title='${(cur_section.Fa2AnchorBarText.getData())!}'
977 data-target=".section-content--features-fa2-${cur_section?index}">
978 ${(cur_section.Fa2AnchorBarText.getData())!}</a>
979 </#if>
980 </#list>
981 </#if>
982 <!--Contacts-->
983 <a class="section-navigator--list--item anchorbar_products_contacts swiper-slide" href="javascript:void(0)"
984 title='${languageUtil.get(locale, "anchor-contacts")}'
985 data-target=".section-contacts">
986 ${languageUtil.get(locale, "anchor-contacts")}</a>
987 <!--Related Products-->
988 <a class="section-navigator--list--item anchorbar_products_related swiper-slide" href="javascript:void(0)"
989 title='${languageUtil.get(locale, "related-products")}'
990 data-target=".related-products">
991 ${languageUtil.get(locale, "related-products")}</a>
992 </div>
993 </div>
994 <div class="swiper-button-prev section-navigator--scroll--left"><span class="section-navigator--scroll--left--icon"></span></div>
995 <div class="swiper-button-next section-navigator--scroll--right"><span class="section-navigator--scroll--right--icon"></span></div>
996 </div>
997 <div class="section-navigator--spacer"></div>
998 </div>
999 </div>
1000
1001 <!--End Module: Section Navigator-->
1002 <#if sectionOFound = true || sectionOHtmlFound = true>
1003
1004 <#if (SeparatorOverview.ProductTitle.getData())?has_content>
1005 <#assign isMiddle = leonardo.isRadioButtonValue(SeparatorOverview.ProductTitle.ProductTitlePosition, "middle")>
1006 <#if (isMiddle=="true")>
1007 <#assign forcedStyle = rndNamespace + "forced-style-200">
1008 <#else>
1009 <#assign forcedStyle = rndNamespace + "forced-style-0">
1010 </#if>
1011 <style>
1012 /*Desktop and tablet landscape viewport*/
1013 @media all and (min-width: 1024px) {
1014 .section-hero-card .section-grid .section-hero-card--content .section-hero-card--title.${rndNamespace}forced-style-200 {
1015 margin-left: -200px !important;
1016 }
1017 .section-hero-card .section-grid .section-hero-card--content .section-hero-card--title.${rndNamespace}forced-style-0 {
1018 margin-left: 0 !important;
1019 }
1020 }
1021 </style>
1022 </#if>
1023
1024 <!--Start Module: Section Hero Cards-->
1025 <div class="section-container section-container--fixed">
1026 <div class="product-page-hero-card section-hero-card section-hero-card--smallerVersion section-hero-card--wider-page-padding">
1027 <div class="section-grid layout--tp-col layout--m-col">
1028 <div class="grid grid--tp100p grid--m100p grid--d33p grid--tl33p hidden-on-dark-theme">
1029 <#assign scalingDetails = {
1030 "desktop": {"alternateImage": {}, "key": "h_480"},
1031 "tl": {"alternateImage": (SeparatorOverview.OverviewImage.ImageTl)!, "key": "h_480"},
1032 "tp": {"alternateImage": (SeparatorOverview.OverviewImage.ImageTp)!, "key": "w_768"},
1033 "mobile": {"alternateImage": (SeparatorOverview.OverviewImage.ImageM)!, "key": "h_300"}
1034 }>
1035 <#assign overviewImg = leonardo.adaptImage((SeparatorOverview.OverviewImage)!, scalingDetails )>
1036 <div class="mr1 section-hero-card--graphic is-light"
1037 data-img-url-d="${(overviewImg.desktop)!}"
1038 data-img-url-tl="${(overviewImg.tablet_landscape)!}"
1039 data-img-url-tp="${(overviewImg.tablet_portrait)!}"
1040 data-img-url-m="${(overviewImg.mobile!)}">
1041
1042 <noscript>
1043 <img src="${overviewImg.desktop!}" alt='${overviewImg.alt_desktop!}'>
1044 <img src="${overviewImg.tablet_landscape!}" alt='${overviewImg.alt_tablet_landscape!}'>
1045 <img src="${overviewImg.tablet_portrait!}" alt='${overviewImg.alt_tablet_portrait!}'>
1046 <img src="${overviewImg.mobile!}" alt='${overviewImg.alt_mobile!}'>
1047 </noscript>
1048 </div>
1049 </div>
1050 <div class="grid grid--tp100p grid--m100p grid--d67p grid--tl67p">
1051 <div class="section-hero-card--content">
1052 <#if (SeparatorOverview.ProductTitle.getData())?has_content>
1053 <h2 class="section-hero-card--title section-hero-card--title-alwayson ${forcedStyle!}">${(SeparatorOverview.ProductTitle.getData())}</h2>
1054 </#if>
1055 <#if (SeparatorOverview.OverviewText.getData())?has_content>
1056 <h3 class="section-hero-card--description">${SeparatorOverview.OverviewText.getData()}</h3>
1057 </#if>
1058 <!--download section-->
1059 <#if sectionOHtmlFound = false && overviewFileUrlElms??>
1060 <@displayDownloadLinks fileUrlElms=overviewFileUrlElms fileVirtualHost=docsDownloadURL/>
1061 </#if>
1062 </div>
1063 </div>
1064 </div>
1065 </div>
1066 </div>
1067 <!--End Module: Section Hero Cards-->
1068
1069 <!--Start Module: Section Content-->
1070 <#if SeparatorOverview.ContentHtml.getData() != "">
1071 <div class="section-container section-container--fixed generic-content-body">
1072 <div class="section-content">
1073 <div class="section-content--content">
1074 ${SeparatorOverview.ContentHtml.getData()}
1075 </div>
1076 <#if sectionOHtmlFound = true && overviewFileUrlElms??>
1077 <@displayDownloadLinks fileUrlElms=overviewFileUrlElms fileVirtualHost=docsDownloadURL/>
1078 </#if>
1079 </div>
1080 </div>
1081 </#if>
1082 <!--End Module: Section Content-->
1083 </#if>
1084
1085
1086 <!--START MODULE: FREE AREA 1-->
1087 <#if sectionFreeArea1 >
1088 <#list SeparatorMainFeatures.getSiblings() as cur_sectionMF>
1089 <!--Start Module: Section Content-->
1090 <#assign showTitleOrText = false>
1091 <#if (cur_sectionMF.MFSectionTitle.getData())?has_content ||
1092 (cur_sectionMF.MFText.getData())?has_content>
1093 <#assign showTitleOrText = true>
1094 </#if>
1095 <#if showTitleOrText>
1096 <div class="section-container section-container--fixed generic-content-body">
1097 <div class="section-content">
1098 <div class="section-content--content section-content--features-${cur_sectionMF?index}">
1099 <!--title-->
1100 <#if cur_sectionMF.MFSectionTitle.getData() != "">
1101 <div class="4section-content--features--heading section-heading section-heading--center">
1102 ${cur_sectionMF.MFSectionTitle.getData()}
1103 </div>
1104 </#if>
1105 <!--text-->
1106 <#if cur_sectionMF.MFText.getData() != "">
1107 <#assign htmlFormatted = leonardo.expandElementsInPage(cur_sectionMF.MFText.getData())>
1108 <div class="check-html-content">${htmlFormatted}</div>
1109 </#if>
1110 </div>
1111 </div>
1112 </div>
1113 </#if>
1114 <#if (cur_sectionMF.FreeWebContent.getData())?has_content>
1115 <!--Start Module: Free Web Content -->
1116 <div ${(showTitleOrText)?then('','class="section-content--features-'+ cur_sectionMF?index + '"')}>
1117 <#assign data = cur_sectionMF.FreeWebContent.getData()/>
1118 <#assign json = jsonFactoryUtil.createJSONObject(data) />
1119 <#assign classPK = json.getLong("classPK") />
1120 <#if (classPK >0) >
1121 <#assign ja = journalArticleLocalService.getLatestArticle(classPK) />
1122 <#assign jad = journalArticleLocalService.getArticleDisplay(ja, ja.getTemplateId(), "", languageId, 1, null, themeDisplay) />
1123 ${jad.getContent()}
1124 </#if>
1125 </div>
1126 <!--End Module: Free Web Content-->
1127 </#if>
1128 <!--End Module: Section Content-->
1129 </#list>
1130 </#if>
1131 <!--END MODULE: FREE AREA 1-->
1132
1133 <!--START MODULE: PRODUCTS TECHNICAL DATA-->
1134 <#if sectionTDFound >
1135 <div id = "products-technical-data" class="container">
1136 <div class="component-with-title">
1137 <#if SeparatorTechnicalData.TDSectionTitle.getData() != "">
1138 <h1 class="title-extralarge">
1139 ${SeparatorTechnicalData.TDSectionTitle.getData()}
1140 </h1>
1141 </#if>
1142
1143 <div class="grid-technical">
1144 <#if SeparatorTechnicalData.TDSectionTitle.getSiblings()?has_content>
1145 <#list SeparatorTechnicalData.TDSectionTitle.getSiblings() as cur_TDSectionTitle>
1146 <div class="data-container rounded-20">
1147 <#if cur_TDSectionTitle.getData() != "">
1148 <h2 class="body-medium text-center mb-0">${cur_TDSectionTitle.getData()}</h2>
1149 </#if>
1150 <#if cur_TDSectionTitle.TDText.getData() != "">
1151 <div class="body-medium text-center mb-0">
1152 ${cur_TDSectionTitle.TDText.getData()}
1153 </div>
1154 </#if>
1155 </div>
1156
1157 </#list>
1158 </#if>
1159 <#if SeparatorTechnicalData.TDButtonLabel.getData() != "">
1160
1161 </#if>
1162 </div>
1163 </div>
1164 </div>
1165 </#if>
1166 <!--END MODULE: PRODUCTS TECHNICAL DATA-->
1167
1168 <!-- TECHNICAL DATA -->
1169 <#if sectionTDFound = true >
1170 <!--Start Module: Products Technical Data-->
1171 <div class="section-container section-container--fixed">
1172 <div class="products-technical-data" data-expandable="true" data-lazy-load="12">
1173 <#if SeparatorTechnicalData.TDSectionTitle.getData() != "">
1174 <h2 class="products-technical-data--heading section-heading section-heading--center">
1175 ${SeparatorTechnicalData.TDSectionTitle.getData()}
1176 </h2>
1177 </#if>
1178 <div class="products-technical-data--specifications">
1179 <#if SeparatorTechnicalData.TDSectionTitle.getSiblings()?has_content>
1180 <#list SeparatorTechnicalData.TDSectionTitle.getSiblings() as cur_TDSectionTitle>
1181 <div class='products-technical-data--spec invisible'>
1182 <#if cur_TDSectionTitle.getData() != "">
1183 <div class="products-technical-data--spec--label">${cur_TDSectionTitle.getData()}</div>
1184 </#if>
1185 <#if cur_TDSectionTitle.TDText.getData() != "">
1186 <div class="products-technical-data--spec--value">
1187 ${cur_TDSectionTitle.TDText.getData()}
1188 </div>
1189 </#if>
1190 </div>
1191 </#list>
1192 </#if>
1193 </div>
1194 <#if SeparatorTechnicalData.TDButtonLabel.getData() != "">
1195 <div class="products-technical-data--action-items">
1196 <div class="" style="text-align: center;">
1197 <button class="btn btn-leo see-more" type="button">${SeparatorTechnicalData.TDButtonLabel.getData()}</button>
1198 </div>
1199 </div>
1200 </#if>
1201 </div>
1202 </div>
1203 <!--End Module: Products Technical Data-->
1204 </#if>
1205
1206 <!--START MODULE: FREE AREA 2 -->
1207 <#if sectionFreeArea2 >
1208 <#list SeparatorFreeArea2.getSiblings() as cur_sectionFA2>
1209 <!--Start Module: Section Content-->
1210 <#assign showTitleOrText = false>
1211 <#if (cur_sectionFA2.Fa2SectionTitle.getData())?has_content ||
1212 (cur_sectionFA2.Fa2Text.getData())?has_content>
1213 <#assign showTitleOrText = true>
1214 </#if>
1215 <#if showTitleOrText>
1216 <div class="section-container section-container--fixed generic-content-body">
1217 <div class="section-content">
1218 <div class="section-content--content section-content--features-fa2-${cur_sectionFA2?index}">
1219 <!--title-->
1220 <#if cur_sectionFA2.Fa2SectionTitle.getData() != "">
1221 <div class="section-content--features--heading section-heading section-heading--center">
1222 ${cur_sectionFA2.Fa2SectionTitle.getData()}
1223 </div>
1224 </#if>
1225 <!--text-->
1226 <#if cur_sectionFA2.Fa2Text.getData() != "">
1227 <#assign htmlFormatted = leonardo.expandElementsInPage(cur_sectionFA2.Fa2Text.getData())>
1228 <div class="check-html-content">${htmlFormatted}</div>
1229 </#if>
1230 </div>
1231 </div>
1232 </div>
1233 </#if>
1234 <#if (cur_sectionFA2.Fa2WebContent.getData())?has_content>
1235 <!--Start Module: Free Web Content -->
1236 <div ${(showTitleOrText)?then('','class="section-content--features-fa2-'+ cur_sectionFA2?index + '"')}>
1237 <#assign data = cur_sectionFA2.Fa2WebContent.getData()/>
1238 <#assign json = jsonFactoryUtil.createJSONObject(data) />
1239 <#assign classPK = json.getLong("classPK") />
1240 <#if (classPK >0) >
1241 <#assign ja = journalArticleLocalService.getLatestArticle(classPK) />
1242 <#assign jad = journalArticleLocalService.getArticleDisplay(ja, ja.getTemplateId(), "", languageId, 1, null, themeDisplay) />
1243 ${jad.getContent()}
1244 </#if>
1245 </div>
1246 <!--End Module: Free Web Content-->
1247 </#if>
1248 <!--End Module: Section Content-->
1249 </#list>
1250 </#if>
1251 <!--END MODULE: FREE AREA 2 -->
1252 </div>
1253
1254 <!-- Meta description -->
1255 <#if (layout.getDescription(themeDisplay.locale))?has_content>
1256 <#assign metaDesc = layout.getDescription(themeDisplay.locale)>
1257 <#elseif (.vars['reserved-article-description'].data)?has_content>
1258 <#assign metaDesc = .vars['reserved-article-description'].data>
1259 </#if>
1260 <#if metaDesc?has_content>
1261 ${layout.setDescription(metaDesc)}
1262 </#if>
1263
1264 <!-- Social Sharing -->
1265 <#if (overviewImg.desktop)?has_content>
1266 <#assign imageFileName = overviewImg.desktop!"" >
1267 <#elseif (bannerImageData.desktop)?has_content>
1268 <#assign imageFileName = bannerImageData.desktop!"" >
1269 <#else>
1270 <#assign imageFileName = "" >
1271 </#if>
1272 <#if (SeparatorOverview)?has_content>
1273 <#assign shareTitle = (SeparatorOverview.ProductName.getData())!"">
1274 <#assign shareDescription = (SeparatorOverview.ProductTitle.getData())!metaDesc!(SeparatorOverview.ProductName.getData())!"">
1275
1276 <#assign ogType='product'>
1277 <@leonardo.socialShareMetaAndLinks shareTitle=shareTitle shareDescription=shareDescription imageFileName=imageFileName ogType=ogType />
1278
1279 </#if>
1280 </#if>
1281
1282</#if>
2026-03-22T09:22:12Z
cookie_disclaimer:true
page_disclaimer :false