حصل خطأ عند معالجة القالب.
Java method "com.sun.proxy.$Proxy148.getFileEntryByUuidAndGroupId(String, long)" threw an exception when invoked on com.sun.proxy.$Proxy148 object "com.liferay.document.library.internal.service.FriendlyURLDLFileEntryLocalServiceWrapper@14419dc0"; see cause exception in the Java stack trace.
----
FTL stack trace ("~" means nesting-related):
- Failed at: #return dlFileEntry.getFileEntryByUui... [in template "74588389795879#20119#147048" in function "getFileEntryByUrl" at line 16, column 17]
- Reached through: @renderTopicRow iconFilename="certifi... [in template "74588389795879#20119#147048" at line 293, column 17]
----
1<#assign dlFileEntry = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")>
2
3<#assign iconsThemePath = "/o/edetheme-theme/images/icons/" />
4
5<#function getFileEntryByUrl url>
6 <#assign urlParts = url?split("/")>
7 <#assign groupId = "">
8 <#assign uuId = "">
9
10 <#if (urlParts?size >= 6)>
11 <#assign groupId = urlParts[2]?number>
12 <#assign uuId = urlParts[5]?keep_before("?")>
13 </#if>
14
15 <#if groupId?has_content && uuId?has_content>
16 <#return dlFileEntry.getFileEntryByUuidAndGroupId(uuId, groupId)>
17 <#else>
18 <#return null>
19 </#if>
20</#function>
21
22<#macro renderSection id title siblings threshold showMoreText showLessText listCssClass="" serviceProcess=false isFaq=false>
23 <#if (siblings?size > 0) && (siblings[0].getData()?has_content) >
24 <div id="${id}">
25 <h2>${title}</h2>
26
27 <#if (serviceProcess)>
28 <h3 class="mt-4">${languageUtil.get(locale, "when-applying-through-the-website")}</h3>
29 </#if>
30
31 <ul class="${listCssClass} ${serviceProcess?then('mb-5 mt-3', 'my-5')}">
32 <#list 0..siblings?size-1 as i>
33 <#if siblings[i].getData()?? && siblings[i].getData() != "">
34 <#assign isAnswer = isFaq && ((i + 1) % 2 == 0)>
35
36 <#if (i > threshold)>
37 <li data-hidden-li class="d-none mb-3 ${isAnswer?then('font-weight-normal', '')}">${siblings[i].getData()}</li>
38 <#else>
39 <li class="mb-3 ${isAnswer?then('font-weight-normal', '')}">${siblings[i].getData()}</li>
40 </#if>
41 </#if>
42 </#list>
43 </ul>
44
45 <#if (siblings?size > threshold + 1)>
46 <a data-toggle-show href="javascript:void(0)" class="font-weight-bold text-brand-1">
47 <span>${showMoreText}</span>
48 <span class="d-none">${showLessText}</span>
49 </a>
50 </#if>
51 <hr class="my-5">
52 </div>
53 </#if>
54</#macro>
55
56<#macro renderTopicRow iconFilename title content isResources=false isServiceFees=false withoutHr=false listCssClass="">
57 <div class="d-flex align-items-start justify-content-start">
58 <img
59 class="mr-4"
60 src="${iconsThemePath + iconFilename}"
61 />
62 <div class="row w-100">
63 <div class="col-12 col-md-5">
64 <h4 class="mb-md-0">${title}</h4>
65 </div>
66
67 <div class="col-12 col-md-7 d-flex flex-column">
68 <#if content?is_string>
69 <p class="mb-0">${content}<p>
70 <#elseif (content?is_sequence) && (isResources == false)>
71 <ul class="${listCssClass}">
72 <#list content as item>
73 <#if item.getData() != "">
74 <li class="mb-2 ${(item?is_first && isServiceFees)?then('font-weight-normal', '')}"> ${item.getData()}</li>
75 </#if>
76 </#list>
77 </ul>
78 <#elseif isResources>
79 <ul class="list-unstyled">
80 <#list content as item>
81 <#if (item.getData()??) && (item.getData() != "")>
82 <#assign fileEntry = getFileEntryByUrl(item.getData()) />
83
84 <li>
85 <a href="${item.getData()}" class="text-dark" target="_blank">
86 ${fileEntry.getFileName()?replace(serviceTitle.getData() + " - " , "")} ${(fileEntry.getSize()/1024)?round}KB
87 </a>
88 </li>
89 </#if>
90 </#list>
91
92 <#list 0..resourcePageTitle.getSiblings()?size-1 as i>
93 <#assign curPageTitle = resourcePageTitle.getSiblings()[i].getData() />
94 <#assign curPageUrl = resourcePageUrl.getSiblings()[i].getData() />
95
96 <#if (curPageTitle?has_content) && (curPageUrl?has_content)>
97 <li>
98 <a href="${curPageUrl}" class="text-dark" target="_blank">
99 ${curPageTitle}
100 </a>
101 </li>
102 </#if>
103 </#list>
104 </ul>
105 </#if>
106 </div>
107 </div>
108 </div>
109
110 <#if (withoutHr == false)>
111 <hr class="my-5">
112 </#if>
113</#macro>
114
115<div class="full-service pt-7 d-flex flex-column">
116 <div class="full-service-header-wrapper">
117 <div class="full-service-header bg-brand-2 w-100">
118 <div class="container position-relative">
119 <#if (serviceTitle.getData())?? && (serviceTitle.getData()) != "">
120 <div class="py-4">
121 <h1 class="full-service-title text-brand-1" style="font-size:2.5rem; !important">${serviceTitle.getData()}</h1>
122 </div>
123 </#if>
124 <#assign serviceUrl = startServiceLink.getData()!"" />
125
126 <#if serviceUrl?has_content && serviceUrl?contains("ede.gov.ae")>
127 <a
128 href="${serviceUrl}"
129 class="full-service-card-button start-service-btn-scrolled bg-white text-brand-1 p-3 mb-4 d-none"
130 target="_blank"
131 >
132 <h6 class="mb-0">${languageUtil.get(locale, "start-service")}</h6>
133 <img class="arrow-icon mx-3" src="${iconsThemePath}arrow-right-golden.svg" />
134 </a>
135 <#else>
136 <a
137 href="#"
138 class="full-service-card-button start-service-btn-scrolled bg-white text-brand-1 p-3 mb-4 d-none start-service-external"
139 data-service-url="${serviceUrl}"
140 target="_blank"
141 >
142 <h6 class="mb-0">${languageUtil.get(locale, "start-service")}</h6>
143 <img class="arrow-icon mx-3" src="${iconsThemePath}arrow-right-golden.svg" />
144 </a>
145 </#if>
146 <div class="full-service-card position-absolute w-100 px-3 py-4 p-md-6 row">
147 <div class="d-flex flex-column col-7 col-md-3">
148 <#if serviceUrl?has_content && serviceUrl?contains("ede.gov.ae")>
149 <a
150 href="${serviceUrl}"
151 class="full-service-card-button bg-white text-brand-1 p-3 mb-4"
152 target="_blank"
153 >
154 <h6 class="mb-0">${languageUtil.get(locale, "start-service")}</h6>
155 <img class="arrow-icon" src="${iconsThemePath}arrow-right-golden.svg" />
156 </a>
157 <#else>
158 <a
159 class="full-service-card-button bg-white text-brand-1 p-3 mb-4 start-service-external"
160 data-service-url="${serviceUrl}"
161 target="_blank"
162 >
163 <h6 class="mb-0">${languageUtil.get(locale, "start-service")}</h6>
164 <img class="arrow-icon" src="${iconsThemePath}arrow-right-golden.svg" />
165 </a>
166 </#if>
167 <#if (serviceCardFile.getData())?? && (serviceCardFile.getData() != "")>
168 <a href="${serviceCardFile.getData()}" class="full-service-card-button border border-dark text-brand-1 p-3">
169 <h6 class="mb-0">${languageUtil.get(locale, "download-service-card")}</h6>
170 <img class="download-icon" src="${iconsThemePath}download.svg" />
171 </a>
172 </#if>
173 </div>
174 <div class="d-none d-md-block col-2"></div>
175 <div class="d-flex flex-column col-5 col-md-7 d-flex justify-content-start justify-content-md-center">
176 <div class="mb-1 mb-md-4">
177 <h6 class="text-brand-1">${languageUtil.get(locale, "service-completion-duration")}</h6>
178 <#if (serviceCompletionDuration.getData())?? && (serviceCompletionDuration.getData() != "")>
179 <p>${serviceCompletionDuration.getData()}</p>
180 </#if>
181 </div>
182 <div>
183 <h6 class="text-brand-1">${languageUtil.get(locale, "service-fees")}</h6>
184 <ul class="list-unstyled service-fees-list">
185 <#list serviceFeesInfo.getSiblings() as item>
186 <#if item_index < 2 && item.getData() != "">
187 <li>${item.getData()}</li>
188 </#if>
189 </#list>
190 </ul>
191 </div>
192 </div>
193 </div>
194 </div>
195 </div>
196 </div>
197
198 <div class="full-service-content container position-relative py-2 py-sm-4 py-md-6">
199 <#if (aboutService.getData())?? && (aboutService.getData()) != "">
200 <div id="about">
201 <h2 class="mb-4">${languageUtil.get(locale, "about-the-service")}</h2>
202 <p>${aboutService.getData()}</p>
203 </div>
204 <hr class="my-5" >
205 </#if>
206
207 <@renderSection
208 id="service-process"
209 title=languageUtil.get(locale, "service-process")
210 siblings=step.getSiblings()
211 threshold=3
212 showMoreText=languageUtil.get(locale, "show-more")
213 showLessText=languageUtil.get(locale, "show-less")
214 listCssClass="list-unstyled"
215 serviceProcess=true
216 />
217
218 <@renderSection
219 id="conditions-and-requirements"
220 title=languageUtil.get(locale, "conditions-and-requirements")
221 siblings=conditionOrRequirement.getSiblings()
222 threshold=0
223 showMoreText=languageUtil.get(locale, "show-all-conditions-and-requirements")
224 showLessText=languageUtil.get(locale, "show-less")
225 listCssClass="list-unstyled"
226 />
227
228 <@renderSection
229 id="required-documents"
230 title=languageUtil.get(locale, "required-documents")
231 siblings=requiredDocument.getSiblings()
232 threshold=6
233 showMoreText=languageUtil.get(locale, "show-all-required-documents")
234 showLessText=languageUtil.get(locale, "show-less")
235 />
236
237 <@renderSection
238 id="faqs"
239 title=languageUtil.get(locale, "faqs")
240 siblings=faq.getSiblings()
241 threshold=1
242 showMoreText=languageUtil.get(locale, "show-all-faqs")
243 showLessText=languageUtil.get(locale, "show-less")
244 listCssClass="list-unstyled"
245 isFaq=true
246 />
247
248 <@renderTopicRow
249 iconFilename="clock.svg"
250 title=languageUtil.get(locale, "service-completion-duration")
251 content=serviceCompletionDuration.getData()
252 />
253
254 <@renderTopicRow
255 iconFilename="coins.svg"
256 title=languageUtil.get(locale, "service-fees")
257 content=serviceFeesInfo.getSiblings()
258 listCssClass="list-unstyled"
259 isServiceFees=true
260 />
261
262 <@renderTopicRow
263 iconFilename="globe.svg"
264 title=languageUtil.get(locale, "service-channels")
265 content=serviceChannel.getSiblings()
266 />
267
268 <@renderTopicRow
269 iconFilename="pin.svg"
270 title=languageUtil.get(locale, "service-locations")
271 content=serviceLocation.getSiblings()
272 />
273
274 <@renderTopicRow
275 iconFilename="support.svg"
276 title=languageUtil.get(locale, "support")
277 content=support.getSiblings()
278 />
279
280 <@renderTopicRow
281 iconFilename="target.svg"
282 title=languageUtil.get(locale, "target-audience")
283 content=targetAudience.getData()
284 />
285
286 <@renderTopicRow
287 iconFilename="card.svg"
288 title=languageUtil.get(locale, "payment-channels")
289 content=paymentChannel.getSiblings()
290 listCssClass="list-unstyled"
291 />
292
293 <@renderTopicRow
294 iconFilename="certificate.svg"
295 title=languageUtil.get(locale, "resources")
296 content=resource.getSiblings()
297 isResources=true
298 />
299
300<#--
301 <@renderTopicRow
302 iconFilename="board.svg"
303 title=languageUtil.get(locale, "department-name")
304 content=departmentName.getData()
305 />
306
307 <@renderTopicRow
308 iconFilename="badge.svg"
309 title=languageUtil.get(locale, "sector-name")
310 content=sectorName.getData()
311 />
312
313 <@renderTopicRow
314 iconFilename="hand.svg"
315 title=languageUtil.get(locale, "main-service")
316 content=mainService.getData()
317 />
318
319 <@renderTopicRow
320 iconFilename="code.svg"
321 title=languageUtil.get(locale, "service-code")
322 content=serviceCode.getData()
323 />
324
325 <@renderTopicRow
326 iconFilename="gears.svg"
327 title=languageUtil.get(locale, "service-classification")
328 content=serviceClassification.getData()
329 />
330
331 <@renderTopicRow
332 iconFilename="menu.svg"
333 title=languageUtil.get(locale, "service-type")
334 content=serviceTypeDescription.getData()
335 />
336
337 <@renderTopicRow
338 iconFilename="flag.svg"
339 title=languageUtil.get(locale, "sub-service-type")
340 content=subServiceType.getData()
341 />
342-->
343
344 <@renderTopicRow
345 iconFilename="message.svg"
346 title=languageUtil.get(locale, "related-services")
347 content=relatedService.getData()
348 />
349
350
351<#--
352 <@renderTopicRow
353 iconFilename="stack.svg"
354 title=languageUtil.get(locale, "service-bundle")
355 content=serviceBundle.getData()
356 />
357
358 <@renderTopicRow
359 iconFilename="user.svg"
360 title=languageUtil.get(locale, "number-of-users")
361 content=numberOfUsers.getData()
362 />
363
364 <@renderTopicRow
365 iconFilename="chart.svg"
366 title=languageUtil.get(locale, "number-of-transactions")
367 content=numberOfTransactions.getData()
368 />
369
370 <@renderTopicRow
371 iconFilename="info.svg"
372 title=languageUtil.get(locale, "notes")
373 content=notes.getData()
374 withoutHr=true
375 />
376-->
377
378 </div>
379</div>
380
381<script>
382 function initFullService() {
383 const fullServiceTemplate = document.querySelector(".full-service");
384 if (!fullServiceTemplate) return;
385
386 const fullServiceHeader = fullServiceTemplate.querySelector(".full-service-header");
387 const toggleListVisibilityAnchors = fullServiceTemplate.querySelectorAll("a[data-toggle-show]");
388
389 toggleListVisibilityAnchors.forEach(anchor => {
390 anchor.addEventListener("click", () => {
391 const sectionContainer = anchor.parentElement;
392 const listElement = sectionContainer.querySelector("ul");
393 const anchorLanguageKeys = sectionContainer.querySelectorAll("a span");
394 const hiddenList = listElement.querySelectorAll("li[data-hidden-li]");
395
396 hiddenList.forEach(li => li.classList.toggle("d-none"));
397 anchorLanguageKeys.forEach(languageKey => languageKey.classList.toggle("d-none"));
398 });
399});
400
401 const handleScroll = () => {
402 const isLargeScreen = window.innerWidth >= 768;
403 const isScrolled = window.scrollY > 0;
404
405 if (!fullServiceHeader) return;
406
407 if (isLargeScreen && isScrolled) {
408 fullServiceHeader.classList.add("scrolled");
409 fullServiceHeader.parentElement.style.height = "20rem";
410 }
411
412 if (isLargeScreen && !isScrolled){
413 fullServiceHeader.classList.remove("scrolled");
414 fullServiceHeader.parentElement.style.height = "33rem";
415 }
416 };
417
418 window.addEventListener("scroll", handleScroll);
419
420 const links = fullServiceTemplate.querySelectorAll('.start-service-external');
421
422 const leave_ede_website = "Leave EDE Website";
423 const external_service_warning_1 = "You are about to leave EDE website to visit an external services portal.";
424 const external_service_warning_2 = "Do you want to proceed?";
425 const cancel = "Cancel";
426 const proceed = "Proceed";
427
428 links.forEach(function (el) {
429 // To avoid duplicate bindings when SPA reuses the DOM:
430 if (el.dataset.modalBound === "true") return;
431 el.dataset.modalBound = "true";
432
433 el.addEventListener('click', function (event) {
434 event.preventDefault();
435
436 const url = el.getAttribute('data-service-url');
437
438 if(Liferay.ThemeDisplay.getLanguageId() === "ar_SA") {
439 Liferay.Util.openModal({
440 title: 'مغادرة موقع مؤسسة الإمارات للدواء',
441 bodyHTML:
442 '<p>أنت على وشك مغادرة موقع مؤسسة الإمارات للدواء والانتقال إلى بوابة خدمات خارجية.</p>' +
443 '<p>هل ترغب في المتابعة؟</p>',
444 buttons: [
445 {
446 label: 'متابعة',
447 type: 'submit',
448 class: 'my-proceed-btn',
449 onClick: function () {
450 window.open(url, '_blank');
451 }
452 },
453 {
454 label: 'إلغاء',
455 type: 'cancel',
456 class: 'my-cancel-btn'
457 }
458 ]
459 });
460 } else {
461 Liferay.Util.openModal({
462 title: 'Leave EDE Website',
463 bodyHTML:
464 '<p>You are about to leave EDE website to visit external services portal.</p>' +
465 '<p>Do you want to proceed?</p>',
466 buttons: [
467 {
468 label: 'Proceed',
469 type: 'submit',
470 class: 'my-proceed-btn',
471 onClick: function () {
472 window.open(url, '_blank');
473 }
474 },
475 {
476 label: 'Cancel',
477 type: 'cancel',
478 class: 'my-cancel-btn'
479 }
480 ]
481 });
482 }
483 });
484 });
485 }
486
487 // Run on a normal full page load
488 document.addEventListener('DOMContentLoaded', initFullService);
489
490 // Run after SPA navigation (when you land on this page via Liferay SPA)
491 Liferay.on('endNavigate', function () {
492 initFullService();
493 });
494(function () {
495 // prevent duplicate binding across SPA navigations
496 if (window.__fullServiceToggleBound) return;
497 window.__fullServiceToggleBound = true;
498
499 document.addEventListener("click", function (e) {
500 const anchor = e.target.closest('a[data-toggle-show]');
501 if (!anchor) return;
502
503 // Ensure it belongs to your component
504 const root = anchor.closest(".full-service");
505 if (!root) return;
506
507 e.preventDefault();
508
509 const sectionContainer = anchor.parentElement;
510 const listElement = sectionContainer.querySelector("ul");
511 if (!listElement) return;
512
513 const hiddenList = listElement.querySelectorAll("li[data-hidden-li]");
514 const spans = anchor.querySelectorAll("span");
515
516 hiddenList.forEach(li => li.classList.toggle("d-none"));
517 spans.forEach(s => s.classList.toggle("d-none"));
518 });
519})();
520
521</script>
522
523
524
525<style>
526
527 .my-proceed-btn {
528 background-color: #ffffff !important; /* White */
529 border-color: #b58934 !important;
530 color: #b58934 !important;
531
532 border-style: solid;
533 border-width: 0.0625rem;
534 border-radius: 0.25rem;
535 box-shadow: none;
536 cursor: pointer;
537 display: inline-block;
538 font-size: 1rem;
539 font-weight: var(--font-weight-semi-bold, 600);
540 line-height: 1.5;
541 padding-bottom: 0.4375rem;
542 padding-right: 0.9375rem;
543 padding-left: 0.9375rem;
544 padding-top: 0.4375rem;
545 text-align: center;
546 text-transform: none;
547 transition: color 0.15s
548 ease-in-out, background-color 0.15s
549 ease-in-out, border-color 0.15s
550 ease-in-out, box-shadow 0.15s
551 ease-in-out;
552 -ms-user-select: none;
553 -moz-user-select: none;
554 -webkit-user-select: none;
555 user-select: none;
556 vertical-align: middle;
557}
558
559.my-proceed-btn:hover {
560 background-color: #b58934 !important;
561 border-color: #b58934 !important;
562 color: #fff !important;
563
564
565 border-style: solid;
566 border-width: 0.0625rem;
567 border-radius: 0.25rem;
568 box-shadow: none;
569 cursor: pointer;
570 display: inline-block;
571 font-size: 1rem;
572 font-weight: var(--font-weight-semi-bold, 600);
573 line-height: 1.5;
574 padding-bottom: 0.4375rem;
575 padding-right: 0.9375rem;
576 padding-left: 0.9375rem;
577 padding-top: 0.4375rem;
578 text-align: center;
579 text-transform: none;
580 transition: color 0.15s
581 ease-in-out, background-color 0.15s
582 ease-in-out, border-color 0.15s
583 ease-in-out, box-shadow 0.15s
584 ease-in-out;
585 -ms-user-select: none;
586 -moz-user-select: none;
587 -webkit-user-select: none;
588 user-select: none;
589 vertical-align: middle;
590}
591
592 .my-cancel-btn {
593 background-color: #ffffff !important; /* White */
594 border-color: #c9302c !important;
595 color: #ac2925 !important;
596
597 border-style: solid;
598 border-width: 0.0625rem;
599 border-radius: 0.25rem;
600 box-shadow: none;
601 cursor: pointer;
602 display: inline-block;
603 font-size: 1rem;
604 font-weight: var(--font-weight-semi-bold, 600);
605 line-height: 1.5;
606 padding-bottom: 0.4375rem;
607 padding-right: 0.9375rem;
608 padding-left: 0.9375rem;
609 padding-top: 0.4375rem;
610 text-align: center;
611 text-transform: none;
612 transition: color 0.15s
613 ease-in-out, background-color 0.15s
614 ease-in-out, border-color 0.15s
615 ease-in-out, box-shadow 0.15s
616 ease-in-out;
617 -ms-user-select: none;
618 -moz-user-select: none;
619 -webkit-user-select: none;
620 user-select: none;
621 vertical-align: middle;
622}
623
624.my-cancel-btn:hover {
625 background-color: #c9302c !important;
626 border-color: #ac2925 !important;
627 color: #fff !important;
628
629
630 border-style: solid;
631 border-width: 0.0625rem;
632 border-radius: 0.25rem;
633 box-shadow: none;
634 cursor: pointer;
635 display: inline-block;
636 font-size: 1rem;
637 font-weight: var(--font-weight-semi-bold, 600);
638 line-height: 1.5;
639 padding-bottom: 0.4375rem;
640 padding-right: 0.9375rem;
641 padding-left: 0.9375rem;
642 padding-top: 0.4375rem;
643 text-align: center;
644 text-transform: none;
645 transition: color 0.15s
646 ease-in-out, background-color 0.15s
647 ease-in-out, border-color 0.15s
648 ease-in-out, box-shadow 0.15s
649 ease-in-out;
650 -ms-user-select: none;
651 -moz-user-select: none;
652 -webkit-user-select: none;
653 user-select: none;
654 vertical-align: middle;
655}
656
657.text-brand-1 {
658--h6-font-size: 1.2rem !important;
659}
660
661 .full-service {
662 --header-height-md: 33rem;
663 --header-height-sm: 18rem;
664 --header-height-xs: 23rem;
665 --card-border-radius-desktop: 5rem;
666 --card-border-radius-mobile: 2.5rem;
667 --button-border-radius: 1rem;
668 --button-border-width: 0.13rem;
669 --spacer-6: 2.0rem !important;
670 --font-size-base: 0.5 !important;
671 }
672
673 .full-service p,
674 .full-service li {
675 font-weight: 300;
676 font-size: 1.0rem !important;
677}
678
679 .full-service .full-service-header-wrapper {
680 height: var(--header-height-md);
681 transition: height 0.3s ease;
682 }
683
684 .full-service .full-service-header {
685 height: 22rem !important;
686 transition: all 0.3s ease;
687 z-index: 1 !important;
688 }
689
690 .full-service .full-service-card {
691 background-color: #F1F2F2;
692 border-radius: var(--card-border-radius-desktop);
693 transition: border-radius 0.3s ease;
694 }
695
696 .full-service .full-service-card-button {
697 border-radius: var(--button-border-radius);
698 cursor: pointer;
699 border-width: var(--button-border-width) !important;
700 display: flex;
701 justify-content: space-between;
702 align-items: center;
703 transition: all 0.2s ease;
704 text-decoration:none;
705 }
706
707 .full-service .full-service-card-button:hover {
708 background-color: rgba(0, 0, 0, 0.05);
709 }
710
711 .d-flex {
712 justify-content: center !important;
713 }
714
715 .full-service .full-service-card-button .arrow-icon:dir(rtl) {
716 transform: rotate(180deg);
717 }
718
719 .full-service .full-service-header.scrolled {
720 height: auto !important;
721 }
722
723 .full-service .full-service-header.scrolled {
724 position: fixed !important;
725 height: auto !important;
726 z-index: 10;
727 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
728 }
729
730 .full-service .full-service-header.scrolled .container {
731 display: flex;
732 justify-content: space-between;
733 align-items: center;
734 }
735
736 .full-service .full-service-header.scrolled .full-service-card {
737 display: none;
738 }
739
740 .full-service .full-service-header.scrolled .start-service-btn-scrolled {
741 display: flex !important;
742 justify-content: space-between;
743 align-items: center;
744 text-wrap: nowrap;
745 margin-bottom: 0 !important;
746 width: 19rem;
747 transition: all 0.2s ease;
748 }
749
750 .full-service .full-service-header.scrolled .start-service-btn-scrolled:hover {
751 background-color: rgba(0, 0, 0, 0.05);
752 }
753
754 .full-service .full-service-title {
755 display: -webkit-box;
756 -webkit-line-clamp: 2;
757 -webkit-box-orient: vertical;
758 overflow: hidden;
759 text-overflow: ellipsis;
760 }
761
762 @media screen and (max-width: 767px) {
763 .full-service .full-service-header-wrapper {
764 height: var(--header-height-sm) !important;
765 }
766
767 .full-service .full-service-card {
768 border-radius: var(--card-border-radius-mobile);
769 }
770
771 .full-service .full-service-card h6 {
772 font-size: 0.875rem !important;
773 }
774
775 .full-service .full-service-card p {
776 font-size: 0.75rem !important;
777 }
778
779 .full-service .arrow-icon {
780 width: 0.6rem !important;
781 }
782
783 .full-service .full-service-card .download-icon {
784 width: 1rem !important;
785 }
786
787 .full-service .full-service-card .full-service-card-button {
788 border-width: 0.1rem !important;
789 }
790
791 .full-service .service-fees-list {
792 display: -webkit-box;
793 -webkit-line-clamp: 3;
794 -webkit-box-orient: vertical;
795 overflow: hidden;
796 text-overflow: ellipsis;
797 }
798 }
799
800 @media screen and (max-width: 575px) {
801 .full-service .full-service-header-wrapper {
802 height: var(--header-height-xs) !important;
803 }
804 }
805
806 @media screen and (max-width: 376px) {
807 .full-service .full-service-header-wrapper {
808 height: 35rem !important;
809 }
810 }
811</style>