Financial highlights
Ultima quotazione 56,62€
Variazione -3,35%
27/03/2026 - 17:39
data source: Investis Digital
Financial highlights
Ultima quotazione 56,62€
Variazione -3,35%
27/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#13222278" 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#13222278" 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<@leonardo.articleInfo .vars "SP-Product-base"/>
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
661<#else>
662
663 <@leonardo.articleInfo .vars "SP-Product-base"/>
664
665 <#assign rndNamespace = randomNamespace>
666
667 <#assign currentGroupExpandoBridge = themeDisplay.getScopeGroup().getExpandoBridge()>
668 <#assign isDarkTheme = false>
669 <#if currentGroupExpandoBridge.hasAttribute("dark-theme")>
670 <#assign isDarkTheme = currentGroupExpandoBridge.getAttribute("dark-theme", false)>
671 </#if>
672
673
674 <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
675 <#assign languageId = languageUtil.getLanguageId(locale) />
676
677 <#assign jArticle = journalArticleLocalService.getArticle(groupId, .vars['reserved-article-id'].data) >
678 <#assign productLayout = (jArticle.getLayout()!)>
679
680 <#assign docsDownloadURL = ''>
681 <#if (layout.getGroup().getGroupId()) != (jArticle.getGroupId())>
682 <#assign docsDownloadURL = portalUtil.getVirtualHostname (productLayout.getLayoutSet())>
683 <#if (docsDownloadURL)?has_content && (docsDownloadURL?lower_case != 'localhost')>
684 <#assign docsDownloadURL = 'https://' + docsDownloadURL >
685 <#else>
686 <#assign docsDownloadURL = ''>
687 </#if>
688 </#if>
689
690 <#if isDarkTheme && !(hasDetailPage?? && getterUtil.getBoolean(hasDetailPage.getData()))>
691 <#if SeparatorOverview??>
692 <#assign scalingDetails = {
693 "desktop": {"alternateImage": {}, "key": "w_317"},
694 "tl": {"alternateImage": SeparatorOverview.OverviewImage.ImageTl!, "key": "w_317"},
695 "tp": {"alternateImage": SeparatorOverview.OverviewImage.ImageTp!, "key": "w_317"},
696 "mobile": {"alternateImage": SeparatorOverview.OverviewImage.ImageM!, "key": "w_317"}
697 }>
698
699 <#assign dataImg = leonardo.adaptImage(SeparatorOverview.OverviewImage!, scalingDetails )>
700 <div class="product-page-hero-card product-card-modal-container product-base section-hero-card--smallerVersion section-hero-card--wider-page-padding">
701 <div class="product-card-modal">
702 <div class="product-card-modal-text">
703 <div class="modal-title-container">
704 <h1 class="modal-title">
705 ${SeparatorOverview.ProductName.getData()}
706 </h1>
707 </div>
708 <div class="product-card--graphic-container">
709 <img class="product-card--graphic" alt="${SeparatorOverview.ProductName.getData()!}" title="${SeparatorOverview.ProductName.getData()!}" src="${themeDisplay.pathThemeImages}/blank.png"
710 data-src-url-d="${dataImg.desktop!}"
711 data-src-url-tl="${dataImg.tablet_landscape!}"
712 data-src-url-tp="${dataImg.tablet_portrait!}"
713 data-src-url-m="${dataImg.mobile!}"/>
714 </div>
715 <div class="modal-description">
716 ${SeparatorOverview.OverviewText.getData()}
717 </div>
718
719 <#if SeparatorOverview.OverviewFileUrl??>
720 <#assign docsDownloadURL = ''>
721
722 <ul class="js-ul-overview">
723 <#list SeparatorOverview.OverviewFileUrl.getSiblings() as itemList>
724
725 <#assign file_info = leonardo.findFileEntryInfo(itemList.getData()) >
726 <#if itemList.OverviewFileLabel.getData()!= '' && file_info.downloadUrl != ''>
727 <li class="list-item">
728 <a href="${docsDownloadURL}${file_info.downloadUrl}" target="_blank">
729 ${itemList.OverviewFileLabel.getData()!}
730 </a>
731 </li>
732 </#if>
733 </#list>
734 </ul>
735 </#if>
736 </div>
737 </div>
738 </div>
739 </#if>
740 <#else>
741 <#macro downloadIcon>
742 <svg xmlns="http://www.w3.org/2000/svg" width="14" height="18" viewBox="0 0 14 18">
743 <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"/>
744 </svg>
745 </#macro>
746
747 <#macro displayDownloadLinks fileUrlElms fileVirtualHost>
748 <div class="section-content--action-items">
749 <#list fileUrlElms as cur_file>
750 <#if cur_file.getData()?? && cur_file.getData() != "">
751 <#assign defLabel = languageUtil.get(locale, "download-brochure")>
752 <div class="section-content--action-items--download">
753 <#assign file_info = leonardo.findFileEntryInfo(cur_file.getData()) >
754
755 <a class="section-content--action-items--download--link"
756 target="_blank"
757 href="${fileVirtualHost}${file_info.downloadUrl}"
758 title='${(file_info.title)!cur_file.OverviewFileLabel.getData()!defLabel}'>
759 <@downloadIcon />
760 <span class="section-content--action-items--download--link--filename">
761 ${(cur_file.OverviewFileLabel.getData())!(file_info.title)!defLabel}
762 </span>
763 </a>
764 </div>
765 </#if>
766 </#list>
767 </div>
768 </#macro>
769
770 <#function getProductImageUUID plid=-1>
771 <#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")>
772 <#assign assetCategoryPropertyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryPropertyLocalService")>
773 <#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")>
774 <#assign journalArticleResourceLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService")>
775
776 <#assign groupExpandoBridge = layout.getGroup().getExpandoBridge() />
777 <#assign products_vocabulary_id = (groupExpandoBridge.hasAttribute("products-vocabulary-id")?then(getterUtil.getLong(groupExpandoBridge.getAttribute("products-vocabulary-id", false)),0)) />
778
779 <#if (plid > 0)>
780 <#assign fromLayout = layoutLocalService.fetchLayout(plid)>
781 <#if fromLayout??>
782 <#assign categories = assetCategoryLocalService.getCategories("com.liferay.portal.kernel.model.Layout", fromLayout.getPlid()) />
783 <#list categories as category>
784 <#assign properties = assetCategoryPropertyLocalService.getCategoryProperties(category.getCategoryId())>
785 <#list properties as property>
786 <#if (products_vocabulary_id == category.getVocabularyId()) && (property.key == "uuid-banner-image") && (property.value)?has_content>
787 <#return property.getValue() />
788 </#if>
789 </#list>
790 </#list>
791 <#return getProductImageUUID(fromLayout.getParentPlid())/>
792 </#if>
793 <#elseif (plid < 0)>
794 <#assign from = paramUtil.getString(themeDisplay.getRequest(), "f", "null")>
795 <#assign fromLayout = layout>
796 <#if validator.isNotNull(from) && (from != "/search")>
797 <#assign fromLayout = layoutLocalService.fetchLayoutByFriendlyURL(groupId, false, from)!>
798 <#if validator.isNotNull(fromLayout)>
799 <#assign uuid_banner_image = getProductImageUUID(fromLayout.getPlid()) />
800 </#if>
801 </#if>
802 <#if !((uuid_banner_image)?has_content)>
803 <#assign resourcePrimKey = journalArticleResourceLocalService.getArticleResourcePrimKey(groupId, .vars['reserved-article-id'].data)>
804 <#assign categories = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", resourcePrimKey) />
805 <#list categories as category>
806 <#assign properties = assetCategoryPropertyLocalService.getCategoryProperties(category.getCategoryId())>
807 <#list properties as property>
808 <#if (products_vocabulary_id == category.getVocabularyId()) && (property.key == "uuid-banner-image") && (property.value)?has_content>
809 <#return property.getValue() />
810 </#if>
811 </#list>
812 </#list>
813 </#if>
814
815 <#if uuid_banner_image??>
816 <#return uuid_banner_image>
817 </#if>
818 </#if>
819 <#return "">
820 </#function>
821
822 <#function getImageURL uuid>
823 <#if (uuid?has_content)>
824 <#assign dlFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")>
825 <#assign banner_image = dlFileEntryLocalService.fetchDLFileEntryByUuidAndGroupId(uuid, groupId)! />
826 <#if (banner_image?has_content)>
827 <#assign t = banner_image.getFileVersion().getModifiedDate()! />
828 <#assign url = "/documents/" + banner_image.getRepositoryId()
829 + "/" + banner_image.getFolderId()
830 + "/" + httpUtil.encodePath(banner_image.getFileName())
831 + "/" + banner_image.getUuid() + "?t=" + t?long>
832 <#assign dataImage = {"fileEntryId": banner_image.getFileEntryId(), "fileName": banner_image.getFileName(), "ts": t?long}>
833 <#assign scalingDetails = {
834 "desktop": {"alternateImage": {}, "key": "w_1440"},
835 "tl": {"alternateImage": {}, "key": "h_460"},
836 "tp": {"alternateImage": {}, "key": "h_560"},
837 "mobile": {"alternateImage": {}, "key": "h_400"}
838 }>
839 <#return leonardo.adaptImage(dataImage, scalingDetails)>
840 </#if>
841 </#if>
842 <#return {}>
843 </#function>
844 <#assign uuid = getProductImageUUID()>
845 <#assign bannerImageData = getImageURL(uuid)>
846 <!-- default number of visible technical data boxes -->
847 <#assign maxTechnicalBoxes = 12>
848
849
850
851
852
853 <#assign sectionOFound = false>
854 <#assign sectionOHtmlFound = false>
855 <#assign sectionFreeArea1 = false>
856 <#assign sectionFreeArea2 = false>
857 <#assign sectionTDFound = false>
858
859 <!--FREE AREA 1 -->
860 <#if SeparatorMainFeatures?? && SeparatorMainFeatures.getSiblings()?has_content>
861 <#list SeparatorMainFeatures.getSiblings() as cur_sectionMF>
862 <#if (cur_sectionMF.MFSectionTitle.getData())?has_content ||
863 (cur_sectionMF.MFText.getData())?has_content ||
864 (cur_sectionMF.FreeWebContent.getData())?has_content>
865 <#assign sectionFreeArea1 = true>
866 <#break>
867 </#if>
868 </#list>
869 </#if>
870 <!--FREE AREA 2 -->
871 <#if SeparatorFreeArea2?? && SeparatorFreeArea2.getSiblings()?has_content>
872 <#list SeparatorFreeArea2.getSiblings() as cur_sectionFA2>
873 <#if (cur_sectionFA2.Fa2Text.getData())?has_content ||
874 (cur_sectionFA2.Fa2SectionTitle.getData())?has_content ||
875 (cur_sectionFA2.Fa2WebContent.getData())?has_content>
876 <#assign sectionFreeArea2 = true>
877 <#break>
878 </#if>
879 </#list>
880 </#if>
881 <#if (SeparatorTechnicalData.TDSectionTitle.getSiblings())?has_content>
882 <#list SeparatorTechnicalData.TDSectionTitle.getSiblings() as cur_sectionTD>
883 <#if cur_sectionTD.getData() != "">
884 <#assign sectionTDFound = true>
885 <#break>
886 </#if>
887 </#list>
888 </#if>
889 <#if (SeparatorOverview.OverviewText.getData())?has_content ||
890 (SeparatorOverview.OverviewTitle.getData())?has_content>
891 <#assign sectionOFound = true>
892 </#if>
893 <#if (SeparatorOverview.ContentHtml.getData())?has_content >
894 <#assign sectionOHtmlFound = true>
895 </#if>
896 <#if (SeparatorOverview.OverviewFileUrl)?has_content>
897 <#assign overviewFileUrlElms = SeparatorOverview.OverviewFileUrl.getSiblings()>
898 </#if>
899
900 <div class="product-wrapper product-base">
901 <!--Start Module: Hero-->
902 <div class="section-container section-container--fluid">
903 <style>
904 <#if bannerImageData?has_content>
905 .hero-banner-half-image-bck{background-image: url(${bannerImageData.desktop!});}
906 @media all and (min-width: 1024px) and (max-width: 1279px) {
907 .hero-banner-half-image-bck{background-image: url(${bannerImageData.tablet_landscape!});}
908 }
909 @media all and (min-width: 768px) and (max-width: 1023px) {
910 .hero-banner-half-image-bck{background-image: url(${bannerImageData.tablet_portrait!});}
911 }
912 @media all and (max-width: 767px) {
913 .hero-banner-half-image-bck{background-image: url(${bannerImageData.mobile!});}
914 }
915 <#else>
916 .hero-banner-half-image-bck{background-color: #8698a2;}
917 </#if>
918 </style>
919
920 <div class="hero">
921 <!--Start Module: Hero Slide-->
922 <div class="hero-slide hero-slide--internal hero-banner-half-image-bck">
923 <div class="hero-slide--content">
924 <h1 class="hero-slide--content--title">${(SeparatorOverview.ProductName.data)!"Product"}</h1>
925 </div>
926 <noscript>
927 <img src="${bannerImageData.desktop!}" alt='${bannerImageData.alt_desktop!}'>
928 <img src="${bannerImageData.tablet_landscape!}" alt='${bannerImageData.alt_tablet_landscape!}'>
929 <img src="${bannerImageData.tablet_portrait!}" alt='${bannerImageData.alt_tablet_portrait!}'>
930 <img src="${bannerImageData.mobile!}" alt='${bannerImageData.alt_mobile!}'>
931 </noscript>
932 </div>
933 <!--End Module: Hero Slide-->
934
935 <!--Start Mixin: Icon Share Primary-->
936 <@leonardo.shareLinkHero/>
937 <!--End Mixin: Icon Share Primary-->
938 </div>
939 </div>
940
941 <!--Start Module: Section Navigator Anchor bar product base-->
942 <div class="section-container section-container--fluid">
943 <div class="section-navigator">
944 <div class="section-navigator--list">
945 <div class="section-container swiper-container--sectionNavigator section-container--fixed">
946 <div class="section-navigator--list--item-wrap swiper-wrapper">
947 <!--Overview-->
948 <#assign defaultValue=languageUtil.get(locale, "section-overview-default")>
949 <a class="section-navigator--list--item swiper-slide active" href="javascript:void(0);"
950 title="${(SeparatorOverview.OverviewTitle.getData())!defaultValue}"
951 data-target=".section-hero-card">
952 ${(SeparatorOverview.OverviewTitle.getData())!defaultValue}</a>
953 <!--Free Area 1 -->
954 <#if sectionFreeArea1 && SeparatorMainFeatures??>
955 <#list SeparatorMainFeatures.getSiblings() as cur_section>
956 <#if (cur_section.Fa1AnchorBarText.getData())?has_content >
957 <a class="section-navigator--list--item swiper-slide" href="javascript:void(0);"
958 title='${(cur_section.Fa1AnchorBarText.getData())}'
959 data-target=".section-content--features-${cur_section?index}">
960 ${(cur_section.Fa1AnchorBarText.getData())!}</a>
961 </#if>
962 </#list>
963 </#if>
964 <!--Technical data-->
965 <#if sectionTDFound = true >
966 <#assign defaultValue=languageUtil.get(locale, "section-techdata-default")>
967 <a class="section-navigator--list--item swiper-slide" href="javascript:void(0)"
968 title='${(SeparatorTechnicalData.TDSectionTitle.getData())!defaultValue}'
969 data-target=".products-technical-data">
970 ${(SeparatorTechnicalData.TDSectionTitle.getData())!defaultValue}</a>
971 </#if>
972 <!--Free Area 2 -->
973 <#if sectionFreeArea2 && SeparatorFreeArea2??>
974 <#list SeparatorFreeArea2.getSiblings() as cur_section>
975 <#if (cur_section.Fa2AnchorBarText.getData())?has_content >
976 <a class="section-navigator--list--item swiper-slide" href="javascript:void(0)"
977 title='${(cur_section.Fa2AnchorBarText.getData())!}'
978 data-target=".section-content--features-fa2-${cur_section?index}">
979 ${(cur_section.Fa2AnchorBarText.getData())!}</a>
980 </#if>
981 </#list>
982 </#if>
983 <!--Contacts-->
984 <a class="section-navigator--list--item anchorbar_products_contacts swiper-slide" href="javascript:void(0)"
985 title='${languageUtil.get(locale, "anchor-contacts")}'
986 data-target=".section-contacts">
987 ${languageUtil.get(locale, "anchor-contacts")}</a>
988 <!--Related Products-->
989 <a class="section-navigator--list--item anchorbar_products_related swiper-slide" href="javascript:void(0)"
990 title='${languageUtil.get(locale, "related-products")}'
991 data-target=".related-products">
992 ${languageUtil.get(locale, "related-products")}</a>
993 </div>
994 </div>
995 <div class="swiper-button-prev section-navigator--scroll--left"><span class="section-navigator--scroll--left--icon"></span></div>
996 <div class="swiper-button-next section-navigator--scroll--right"><span class="section-navigator--scroll--right--icon"></span></div>
997 </div>
998 <div class="section-navigator--spacer"></div>
999 </div>
1000 </div>
1001
1002 <!--End Module: Section Navigator-->
1003 <#if sectionOFound = true || sectionOHtmlFound = true>
1004
1005 <#if (SeparatorOverview.ProductTitle.getData())?has_content>
1006 <#assign isMiddle = leonardo.isRadioButtonValue(SeparatorOverview.ProductTitle.ProductTitlePosition, "middle")>
1007 <#if (isMiddle=="true")>
1008 <#assign forcedStyle = rndNamespace + "forced-style-200">
1009 <#else>
1010 <#assign forcedStyle = rndNamespace + "forced-style-0">
1011 </#if>
1012 <style>
1013 /*Desktop and tablet landscape viewport*/
1014 @media all and (min-width: 1024px) {
1015 .section-hero-card .section-grid .section-hero-card--content .section-hero-card--title.${rndNamespace}forced-style-200 {
1016 margin-left: -200px !important;
1017 }
1018 .section-hero-card .section-grid .section-hero-card--content .section-hero-card--title.${rndNamespace}forced-style-0 {
1019 margin-left: 0 !important;
1020 }
1021 }
1022 </style>
1023 </#if>
1024
1025 <!--Start Module: Section Hero Cards-->
1026 <div class="section-container section-container--fixed">
1027 <div class="product-page-hero-card section-hero-card section-hero-card--smallerVersion section-hero-card--wider-page-padding">
1028 <div class="section-grid layout--tp-col layout--m-col">
1029 <div class="grid grid--tp100p grid--m100p grid--d33p grid--tl33p hidden-on-dark-theme">
1030 <#assign scalingDetails = {
1031 "desktop": {"alternateImage": {}, "key": "h_480"},
1032 "tl": {"alternateImage": (SeparatorOverview.OverviewImage.ImageTl)!, "key": "h_480"},
1033 "tp": {"alternateImage": (SeparatorOverview.OverviewImage.ImageTp)!, "key": "w_768"},
1034 "mobile": {"alternateImage": (SeparatorOverview.OverviewImage.ImageM)!, "key": "h_300"}
1035 }>
1036 <#assign overviewImg = leonardo.adaptImage((SeparatorOverview.OverviewImage)!, scalingDetails )>
1037 <div class="mr1 section-hero-card--graphic is-light"
1038 data-img-url-d="${(overviewImg.desktop)!}"
1039 data-img-url-tl="${(overviewImg.tablet_landscape)!}"
1040 data-img-url-tp="${(overviewImg.tablet_portrait)!}"
1041 data-img-url-m="${(overviewImg.mobile!)}">
1042
1043 <noscript>
1044 <img src="${overviewImg.desktop!}" alt='${overviewImg.alt_desktop!}'>
1045 <img src="${overviewImg.tablet_landscape!}" alt='${overviewImg.alt_tablet_landscape!}'>
1046 <img src="${overviewImg.tablet_portrait!}" alt='${overviewImg.alt_tablet_portrait!}'>
1047 <img src="${overviewImg.mobile!}" alt='${overviewImg.alt_mobile!}'>
1048 </noscript>
1049 </div>
1050 </div>
1051 <div class="grid grid--tp100p grid--m100p grid--d67p grid--tl67p">
1052 <div class="section-hero-card--content">
1053 <#if (SeparatorOverview.ProductTitle.getData())?has_content>
1054 <h2 class="section-hero-card--title section-hero-card--title-alwayson ${forcedStyle!}">${(SeparatorOverview.ProductTitle.getData())}</h2>
1055 </#if>
1056 <#if (SeparatorOverview.OverviewText.getData())?has_content>
1057 <h3 class="section-hero-card--description">${SeparatorOverview.OverviewText.getData()}</h3>
1058 </#if>
1059 <!--download section-->
1060 <#if sectionOHtmlFound = false && overviewFileUrlElms??>
1061 <@displayDownloadLinks fileUrlElms=overviewFileUrlElms fileVirtualHost=docsDownloadURL/>
1062 </#if>
1063 </div>
1064 </div>
1065 </div>
1066 </div>
1067 </div>
1068 <!--End Module: Section Hero Cards-->
1069
1070 <!--Start Module: Section Content-->
1071 <#if SeparatorOverview.ContentHtml.getData() != "">
1072 <div class="section-container section-container--fixed generic-content-body">
1073 <div class="section-content">
1074 <div class="section-content--content">
1075 ${SeparatorOverview.ContentHtml.getData()}
1076 </div>
1077 <#if sectionOHtmlFound = true && overviewFileUrlElms??>
1078 <@displayDownloadLinks fileUrlElms=overviewFileUrlElms fileVirtualHost=docsDownloadURL/>
1079 </#if>
1080 </div>
1081 </div>
1082 </#if>
1083 <!--End Module: Section Content-->
1084 </#if>
1085
1086
1087 <!--START MODULE: FREE AREA 1-->
1088 <#if sectionFreeArea1 >
1089 <#list SeparatorMainFeatures.getSiblings() as cur_sectionMF>
1090 <!--Start Module: Section Content-->
1091 <#assign showTitleOrText = false>
1092 <#if (cur_sectionMF.MFSectionTitle.getData())?has_content ||
1093 (cur_sectionMF.MFText.getData())?has_content>
1094 <#assign showTitleOrText = true>
1095 </#if>
1096 <#if showTitleOrText>
1097 <div class="section-container section-container--fixed generic-content-body">
1098 <div class="section-content">
1099 <div class="section-content--content section-content--features-${cur_sectionMF?index}">
1100 <!--title-->
1101 <#if cur_sectionMF.MFSectionTitle.getData() != "">
1102 <div class="4section-content--features--heading section-heading section-heading--center">
1103 ${cur_sectionMF.MFSectionTitle.getData()}
1104 </div>
1105 </#if>
1106 <!--text-->
1107 <#if cur_sectionMF.MFText.getData() != "">
1108 <#assign htmlFormatted = leonardo.expandElementsInPage(cur_sectionMF.MFText.getData())>
1109 <div class="check-html-content">${htmlFormatted}</div>
1110 </#if>
1111 </div>
1112 </div>
1113 </div>
1114 </#if>
1115 <#if (cur_sectionMF.FreeWebContent.getData())?has_content>
1116 <!--Start Module: Free Web Content -->
1117 <div ${(showTitleOrText)?then('','class="section-content--features-'+ cur_sectionMF?index + '"')}>
1118 <#assign data = cur_sectionMF.FreeWebContent.getData()/>
1119 <#assign json = jsonFactoryUtil.createJSONObject(data) />
1120 <#assign classPK = json.getLong("classPK") />
1121 <#if (classPK >0) >
1122 <#assign ja = journalArticleLocalService.getLatestArticle(classPK) />
1123 <#assign jad = journalArticleLocalService.getArticleDisplay(ja, ja.getTemplateId(), "", languageId, 1, null, themeDisplay) />
1124 ${jad.getContent()}
1125 </#if>
1126 </div>
1127 <!--End Module: Free Web Content-->
1128 </#if>
1129 <!--End Module: Section Content-->
1130 </#list>
1131 </#if>
1132 <!--END MODULE: FREE AREA 1-->
1133
1134 <!--START MODULE: PRODUCTS TECHNICAL DATA-->
1135 <#if sectionTDFound >
1136 <div id = "products-technical-data" class="container">
1137 <div class="component-with-title">
1138 <#if SeparatorTechnicalData.TDSectionTitle.getData() != "">
1139 <h1 class="title-extralarge">
1140 ${SeparatorTechnicalData.TDSectionTitle.getData()}
1141 </h1>
1142 </#if>
1143
1144 <div class="grid-technical">
1145 <#if SeparatorTechnicalData.TDSectionTitle.getSiblings()?has_content>
1146 <#list SeparatorTechnicalData.TDSectionTitle.getSiblings() as cur_TDSectionTitle>
1147 <div class="data-container rounded-20">
1148 <#if cur_TDSectionTitle.getData() != "">
1149 <h2 class="body-medium text-center mb-0">${cur_TDSectionTitle.getData()}</h2>
1150 </#if>
1151 <#if cur_TDSectionTitle.TDText.getData() != "">
1152 <div class="body-medium text-center mb-0">
1153 ${cur_TDSectionTitle.TDText.getData()}
1154 </div>
1155 </#if>
1156 </div>
1157
1158 </#list>
1159 </#if>
1160 <#if SeparatorTechnicalData.TDButtonLabel.getData() != "">
1161
1162 </#if>
1163 </div>
1164 </div>
1165 </div>
1166 </#if>
1167 <!--END MODULE: PRODUCTS TECHNICAL DATA-->
1168
1169 <!-- TECHNICAL DATA -->
1170 <#if sectionTDFound = true >
1171 <!--Start Module: Products Technical Data-->
1172 <div class="section-container section-container--fixed">
1173 <div class="products-technical-data" data-expandable="true" data-lazy-load="12">
1174 <#if SeparatorTechnicalData.TDSectionTitle.getData() != "">
1175 <h2 class="products-technical-data--heading section-heading section-heading--center">
1176 ${SeparatorTechnicalData.TDSectionTitle.getData()}
1177 </h2>
1178 </#if>
1179 <div class="products-technical-data--specifications">
1180 <#if SeparatorTechnicalData.TDSectionTitle.getSiblings()?has_content>
1181 <#list SeparatorTechnicalData.TDSectionTitle.getSiblings() as cur_TDSectionTitle>
1182 <div class='products-technical-data--spec invisible'>
1183 <#if cur_TDSectionTitle.getData() != "">
1184 <div class="products-technical-data--spec--label">${cur_TDSectionTitle.getData()}</div>
1185 </#if>
1186 <#if cur_TDSectionTitle.TDText.getData() != "">
1187 <div class="products-technical-data--spec--value">
1188 ${cur_TDSectionTitle.TDText.getData()}
1189 </div>
1190 </#if>
1191 </div>
1192 </#list>
1193 </#if>
1194 </div>
1195 <#if SeparatorTechnicalData.TDButtonLabel.getData() != "">
1196 <div class="products-technical-data--action-items">
1197 <div class="" style="text-align: center;">
1198 <button class="btn btn-leo see-more" type="button">${SeparatorTechnicalData.TDButtonLabel.getData()}</button>
1199 </div>
1200 </div>
1201 </#if>
1202 </div>
1203 </div>
1204 <!--End Module: Products Technical Data-->
1205 </#if>
1206
1207 <!--START MODULE: FREE AREA 2 -->
1208 <#if sectionFreeArea2 >
1209 <#list SeparatorFreeArea2.getSiblings() as cur_sectionFA2>
1210 <!--Start Module: Section Content-->
1211 <#assign showTitleOrText = false>
1212 <#if (cur_sectionFA2.Fa2SectionTitle.getData())?has_content ||
1213 (cur_sectionFA2.Fa2Text.getData())?has_content>
1214 <#assign showTitleOrText = true>
1215 </#if>
1216 <#if showTitleOrText>
1217 <div class="section-container section-container--fixed generic-content-body">
1218 <div class="section-content">
1219 <div class="section-content--content section-content--features-fa2-${cur_sectionFA2?index}">
1220 <!--title-->
1221 <#if cur_sectionFA2.Fa2SectionTitle.getData() != "">
1222 <div class="section-content--features--heading section-heading section-heading--center">
1223 ${cur_sectionFA2.Fa2SectionTitle.getData()}
1224 </div>
1225 </#if>
1226 <!--text-->
1227 <#if cur_sectionFA2.Fa2Text.getData() != "">
1228 <#assign htmlFormatted = leonardo.expandElementsInPage(cur_sectionFA2.Fa2Text.getData())>
1229 <div class="check-html-content">${htmlFormatted}</div>
1230 </#if>
1231 </div>
1232 </div>
1233 </div>
1234 </#if>
1235 <#if (cur_sectionFA2.Fa2WebContent.getData())?has_content>
1236 <!--Start Module: Free Web Content -->
1237 <div ${(showTitleOrText)?then('','class="section-content--features-fa2-'+ cur_sectionFA2?index + '"')}>
1238 <#assign data = cur_sectionFA2.Fa2WebContent.getData()/>
1239 <#assign json = jsonFactoryUtil.createJSONObject(data) />
1240 <#assign classPK = json.getLong("classPK") />
1241 <#if (classPK >0) >
1242 <#assign ja = journalArticleLocalService.getLatestArticle(classPK) />
1243 <#assign jad = journalArticleLocalService.getArticleDisplay(ja, ja.getTemplateId(), "", languageId, 1, null, themeDisplay) />
1244 ${jad.getContent()}
1245 </#if>
1246 </div>
1247 <!--End Module: Free Web Content-->
1248 </#if>
1249 <!--End Module: Section Content-->
1250 </#list>
1251 </#if>
1252 <!--END MODULE: FREE AREA 2 -->
1253 </div>
1254
1255 <!-- Meta description -->
1256 <#if (layout.getDescription(themeDisplay.locale))?has_content>
1257 <#assign metaDesc = layout.getDescription(themeDisplay.locale)>
1258 <#elseif (.vars['reserved-article-description'].data)?has_content>
1259 <#assign metaDesc = .vars['reserved-article-description'].data>
1260 </#if>
1261 <#if metaDesc?has_content>
1262 ${layout.setDescription(metaDesc)}
1263 </#if>
1264
1265 <!-- Social Sharing -->
1266 <#if (overviewImg.desktop)?has_content>
1267 <#assign imageFileName = overviewImg.desktop!"" >
1268 <#elseif (bannerImageData.desktop)?has_content>
1269 <#assign imageFileName = bannerImageData.desktop!"" >
1270 <#else>
1271 <#assign imageFileName = "" >
1272 </#if>
1273 <#if (SeparatorOverview)?has_content>
1274 <#assign shareTitle = (SeparatorOverview.ProductName.getData())!"">
1275 <#assign shareDescription = (SeparatorOverview.ProductTitle.getData())!metaDesc!(SeparatorOverview.ProductName.getData())!"">
1276
1277 <#assign ogType='product'>
1278 <@leonardo.socialShareMetaAndLinks shareTitle=shareTitle shareDescription=shareDescription imageFileName=imageFileName ogType=ogType />
1279
1280 </#if>
1281 </#if>
1282
1283</#if>
2026-03-28T11:17:40Z
NSC_Qppm-ovpwp-tjup-qspe - ffffffff0919141845525d5f4f58455e445a4a423660
cookie_disclaimer:true
page_disclaimer :false