PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 2.4.6
Booking for Appointments and Events Calendar – Amelia v2.4.6
2.4.7 2.4.6 2.4.5 2.4.4 2.4.3 2.4.2 2.4.1 2.4 trunk 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.15 1.2.16 1.2.17 1.2.18 1.2.19 1.2.2 1.2.20 1.2.21 1.2.22 1.2.23 1.2.24 1.2.25 1.2.26 1.2.27 1.2.28 1.2.29 1.2.3 1.2.30 1.2.31 1.2.32 1.2.33 1.2.34 1.2.35 1.2.36 1.2.37 1.2.38 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 2.0 2.0.1 2.0.2 2.1 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.3
ameliabooking / v3 / src / views / admin / customize / steps / CategoryService.vue
ameliabooking / v3 / src / views / admin / customize / steps Last commit date
Cabinet 4 weeks ago Events 4 weeks ago StepForm 1 month ago common 1 month ago parts 1 month ago BringingAnyone.vue 1 month ago CategoriesList.vue 1 month ago CategoryItemsList.vue 4 weeks ago CategoryPackage.vue 4 weeks ago CategoryService.vue 4 weeks ago Extras.vue 1 month ago PackageAppointmentsListStep.vue 1 month ago PackageAppointmentsStep.vue 1 month ago PackageInfoStep.vue 1 month ago PackageStep.vue 1 month ago RecurringStep.vue 1 month ago RecurringSummary.vue 1 month ago
CategoryService.vue
1679 lines
1 <template>
2 <Content
3 ref="contentRef"
4 wrapper-class="am-fcis"
5 form-class="am-fcis__form"
6 heading-class="am-fcis__header"
7 :content-class="`am-fcis__content ${customizeOptions.pageScroll.visibility ? '' : 'no-scroll'}`"
8 :style="cssVars"
9 >
10 <template #header>
11 <Header
12 :btn-string="labelsDisplay('back_btn')"
13 :btn-type="customizeOptions.backBtn.buttonType"
14 ></Header>
15 </template>
16 <template #heading>
17 <div
18 :class="[{ 'am-tablet': pageWidth <= 678 }, { 'am-mobile': pageWidth < 450 }]"
19 class="am-fcis__header-top"
20 >
21 <div class="am-fcis__header-text">
22 <span class="am-fcis__header-name">
23 {{ service.name }}
24 </span>
25 <div v-if="customizeOptions.serviceBadge.visibility" class="am-fcis__badge am-service">
26 <span class="am-icon-service"></span>
27 <span>
28 {{ labelsDisplay('heading_service') }}
29 </span>
30 </div>
31 </div>
32 <div class="am-fcis__header-action">
33 <span v-if="customizeOptions.servicePrice.visibility" class="am-fcis__header-price">
34 {{ service.price ? useFormattedPrice(service.price) : labelsDisplay('free') }}
35 </span>
36 <span class="am-fcis__header-btn">
37 <AmButton :type="customizeOptions.bookingBtn.buttonType">
38 {{ labelsDisplay('book_now') }}
39 </AmButton>
40 </span>
41 </div>
42 </div>
43 <div
44 v-if="
45 customizeOptions.serviceCategory.visibility ||
46 customizeOptions.serviceDuration.visibility ||
47 customizeOptions.serviceCapacity.visibility ||
48 customizeOptions.serviceLocation.visibility
49 "
50 class="am-fcis__header-bottom"
51 >
52 <div class="am-fcis__mini-info">
53 <div v-if="customizeOptions.serviceCategory.visibility" class="am-fcis__mini-info__inner">
54 <span class="am-icon-folder"></span>
55 <span>{{ category.name }}</span>
56 </div>
57 <div v-if="customizeOptions.serviceDuration.visibility" class="am-fcis__mini-info__inner">
58 <span class="am-icon-clock"></span>
59 <span>{{ serviceDuration(service.duration) }}</span>
60 </div>
61 <div
62 v-if="customizeOptions.serviceCapacity.visibility && !licence.isLite"
63 class="am-fcis__mini-info__inner"
64 >
65 <span class="am-icon-user"></span>
66 <span>1/10</span>
67 </div>
68 <div
69 v-if="
70 customizeOptions.serviceLocation.visibility && !licence.isLite && !licence.isStarter
71 "
72 class="am-fcis__mini-info__inner"
73 >
74 <span class="am-icon-locations"></span>
75 <span>{{
76 service.location ? service.location : labelsDisplay('multiple_locations')
77 }}</span>
78 </div>
79 </div>
80 </div>
81 </template>
82 <template #content>
83 <!-- Service Gallery -->
84 <div v-if="service.gallery.length" class="am-fcis__gallery">
85 <div
86 class="am-fcis__gallery-hero"
87 :class="[{ w100: service.gallery.length === 1 }, { 'am-mobile w100': pageWidth < 678 }]"
88 :style="{
89 backgroundImage: `url(${service.gallery[0].pictureFullPath})`,
90 }"
91 ></div>
92 <div
93 v-if="serviceThumbsGallery.length && pageWidth > 677"
94 class="am-fcis__gallery-thumb__wrapper"
95 >
96 <div
97 v-for="(img, index) in serviceThumbsGallery"
98 :key="index"
99 class="am-fcis__gallery-thumb"
100 :class="{ 'am-one-thumb': serviceThumbsGallery.length === 1 }"
101 :style="{ backgroundImage: `url(${img.pictureFullPath})` }"
102 ></div>
103 </div>
104 <AmButton
105 :custom-class="`am-fcis__gallery-btn${pageWidth < 678 ? ' am-mobile' : ''}`"
106 category="secondary"
107 type="filled"
108 @click="() => (galleryDialog = true)"
109 >
110 <span class="am-icon-gallery"></span>
111 <span>
112 {{ labelsDisplay('view_all_photos') }}
113 </span>
114 </AmButton>
115 </div>
116 <!-- Service Gallery -->
117
118 <!-- Gallery Images -->
119 <AmDialog
120 v-model="galleryDialog"
121 :modal-class="'amelia-v2-booking amelia-v2-sgd'"
122 :append-to-body="true"
123 :center="true"
124 :lock-scroll="false"
125 >
126 <div class="am-gd" :style="cssGalleryDialogVars">
127 <div class="am-gd__display-wrapper">
128 <div class="am-gd__arrows" style="display: flex; justify-content: space-between">
129 <span
130 class="am-icon-arrow-left"
131 @click="
132 () =>
133 (activeImage = activeImage <= 0 ? service.gallery.length - 1 : activeImage - 1)
134 "
135 ></span>
136 <span
137 class="am-icon-arrow-right"
138 @click="
139 () =>
140 (activeImage = service.gallery.length - 1 === activeImage ? 0 : activeImage + 1)
141 "
142 ></span>
143 </div>
144 <div
145 v-for="(img, index) in service.gallery"
146 :key="index"
147 class="am-gd__display"
148 :style="{ display: index === activeImage ? 'flex' : 'none' }"
149 @click="
150 () =>
151 (activeImage = service.gallery.length - 1 === activeImage ? 0 : activeImage + 1)
152 "
153 >
154 <img :src="img.pictureFullPath" :alt="index" />
155 </div>
156 </div>
157 <div class="am-gd__selection">
158 {{ `${activeImage + 1}/${service.gallery.length}` }}
159 </div>
160 <div class="am-gd__thumb-wrapper">
161 <div
162 v-for="(img, index) in service.gallery"
163 :key="index"
164 class="am-gd__thumb"
165 :class="{ 'am-active': index === activeImage }"
166 :style="{ backgroundImage: `url(${img.pictureFullPath})` }"
167 @click="() => (activeImage = index)"
168 ></div>
169 </div>
170 </div>
171 </AmDialog>
172 <!-- /Gallery Images -->
173
174 <!-- Service Info - (description, employees) -->
175 <div
176 v-if="
177 customizeOptions.serviceDescription.visibility ||
178 customizeOptions.serviceEmployees.visibility
179 "
180 class="am-fcis__info"
181 >
182 <div class="am-fcis__info-tab__wrapper">
183 <div
184 v-if="service.description && customizeOptions.serviceDescription.visibility"
185 class="am-fcis__info-tab"
186 :class="{ 'am-active': tabsActive === 'description' }"
187 @click="() => (tabsActive = 'description')"
188 >
189 {{ labelsDisplay('about_service') }}
190 </div>
191 <div
192 v-if="customizeOptions.serviceEmployees.visibility && !licence.isLite"
193 :class="{ 'am-active': tabsActive === 'employees' }"
194 class="am-fcis__info-tab"
195 @click="() => (tabsActive = 'employees')"
196 >
197 {{ labelsDisplay('tab_employees') }}
198 </div>
199 </div>
200 <div
201 v-if="
202 customizeOptions.serviceDescription.visibility ||
203 customizeOptions.serviceEmployees.visibility
204 "
205 class="am-fcis__info-content__wrapper"
206 >
207 <!-- Description -->
208 <div
209 v-if="service.description && customizeOptions.serviceDescription.visibility"
210 v-show="tabsActive === 'description'"
211 class="am-fcis__info-content"
212 >
213 <div class="am-fcis__info-service__desc" v-html="service.description"></div>
214 </div>
215 <!-- /Description -->
216
217 <!-- Employees -->
218 <div
219 v-if="customizeOptions.serviceEmployees.visibility && !licence.isLite"
220 v-show="tabsActive === 'employees'"
221 class="am-fcis__info-content"
222 >
223 <AmCollapse>
224 <AmCollapseItem v-for="employee in serviceEmployees" :key="employee.id" side>
225 <template #heading>
226 <div :class="{ 'am-mobile': pageWidth < 451 }" class="am-fcis__info-employee">
227 <div class="am-fcis__info-employee__hero">
228 <div
229 class="am-fcis__info-employee__img"
230 :style="{ ...employeeImage(employee) }"
231 >
232 {{ employeeSign(employee) }}
233 </div>
234 <div class="am-fcis__info-employee__name">
235 {{ employee.firstName }} {{ employee.lastName }}
236 </div>
237 </div>
238 <div
239 v-if="
240 serviceEmployeePrice(employee) &&
241 customizeOptions.serviceEmployeePrice.visibility
242 "
243 class="am-fcis__info-employee__price"
244 >
245 {{ serviceEmployeePrice(employee) }}
246 </div>
247 </div>
248 </template>
249 <template #default></template>
250 </AmCollapseItem>
251 </AmCollapse>
252 </div>
253 <!-- /Employees -->
254 </div>
255 </div>
256 <!-- /Service Info - (description, employees) -->
257
258 <!-- Available Service in Packages -->
259 <div
260 v-if="customizeOptions.servicePackages.visibility && features.packages"
261 class="am-fcis__include-wrapper"
262 >
263 <div class="am-fcis__include-heading">
264 <span class="am-fcis__include-heading__text">
265 {{ labelsDisplay('service_available_in_package') }}
266 </span>
267 <span
268 class="am-fcis__include-heading__btn"
269 @click="() => (displayAllPackages = !displayAllPackages)"
270 >
271 <template v-if="!displayAllPackages">
272 {{ labelsDisplay('more_packages') }}
273 </template>
274 <template v-else>
275 {{ labelsDisplay('less_packages') }}
276 </template>
277 </span>
278 </div>
279 <div v-for="pack in displayServicePackages" :key="pack.id" class="am-fcis__include">
280 <div class="am-fcis__include-hero">
281 <div
282 v-if="pageWidth > 450"
283 class="am-fcis__include-img"
284 :style="{ ...packageImage(pack) }"
285 >
286 {{ !pack.pictureFullPath ? pack.name.charAt(0) : '' }}
287 </div>
288 <div class="am-fcis__include-text" :class="{ 'am-mobile': pageWidth < 451 }">
289 <div class="am-fcis__include-header" :class="{ 'am-mobile': pageWidth < 600 }">
290 <div class="am-fcis__include-name" :class="{ 'am-mobile': pageWidth < 600 }">
291 {{ pack.name }}
292 </div>
293 <div v-if="customizeOptions.packagePrice.visibility" class="am-fcis__include-cost">
294 <span v-if="pack.discount" class="am-fcis__include-discount">
295 {{ `${labelsDisplay('save')} ${pack.discount}%` }}
296 </span>
297 <span class="am-fcis__include-price">
298 {{
299 pack.price ? useFormattedPrice(usePackageAmount(pack)) : labelsDisplay('free')
300 }}
301 </span>
302 </div>
303 </div>
304 <div class="am-fcis__include-info">
305 <div
306 v-if="customizeOptions.packageCategory.visibility"
307 class="am-fcis__include-info__inner"
308 >
309 <span class="am-icon-folder"></span>
310 <span>{{ category.name }}</span>
311 </div>
312 <div
313 v-if="customizeOptions.packageDuration.visibility"
314 class="am-fcis__include-info__inner"
315 >
316 <span class="am-icon-clock"></span>
317 <span v-if="pack.endDate">
318 {{ `${labelsDisplay('expires_at')} ${pack.endDate.split(' ')[0]}` }}
319 </span>
320 <span v-else-if="pack.durationCount">
321 {{
322 `${labelsDisplay('expires_after')} ${pack.durationCount} ${durationTypeLabel(
323 pack.durationCount,
324 pack.durationType,
325 )}`
326 }}
327 </span>
328 <span v-else>
329 {{ labelsDisplay('without_expiration') }}
330 </span>
331 </div>
332 <div
333 v-if="customizeOptions.packageCapacity.visibility"
334 class="am-fcis__include-info__inner"
335 >
336 <span class="am-icon-user"></span>
337 <span>1/1</span>
338 </div>
339 <div
340 v-if="pack.locations.length && customizeOptions.packageLocation.visibility"
341 class="am-fcis__include-info__inner"
342 >
343 <span class="am-icon-locations"></span>
344 <span>
345 {{
346 pack.locations.length === 1
347 ? pack.locations[0].name
348 : labelsDisplay('multiple_locations')
349 }}
350 </span>
351 </div>
352 <div
353 v-if="customizeOptions.packageServices.visibility"
354 class="am-fcis__include-info__inner am-fcis__include-info__services"
355 >
356 <span>
357 {{ `${labelsDisplay('in_package')}:` }}
358 </span>
359 <span v-for="obj in pack.services" :key="obj.id">
360 {{ obj.name }}
361 </span>
362 </div>
363 </div>
364 </div>
365 </div>
366 </div>
367 </div>
368 <!-- /Available Package in Service -->
369 </template>
370 </Content>
371 </template>
372
373 <script setup>
374 // * Components
375 import Content from '../../../common/CatalogFormConstruction/Content/Content.vue'
376 import Header from '../../../common/CatalogFormConstruction/Header/Header.vue'
377 import AmButton from '../../../_components/button/AmButton.vue'
378 import AmDialog from '../../../_components/dialog/AmDialog.vue'
379
380 // * Vue
381 import { ref, inject, computed, onMounted, onBeforeUnmount, watchEffect } from 'vue'
382
383 // * Composables
384 import { useFormattedPrice } from '../../../../assets/js/common/formatting.js'
385 import {
386 amCardColors,
387 useColorTransparency,
388 } from '../../../../assets/js/common/colorManipulation.js'
389 import { usePackageAmount } from '../../../../assets/js/public/package.js'
390 import { useReactiveCustomize } from '../../../../assets/js/admin/useReactiveCustomize.js'
391 import AmCollapse from '../../../_components/collapse/AmCollapse.vue'
392 import AmCollapseItem from '../../../_components/collapse/AmCollapseItem.vue'
393
394 // * Plugin Licence
395 let licence = inject('licence')
396
397 // * Features
398 let features = inject('features')
399
400 // * Customize
401 const { amCustomize } = useReactiveCustomize()
402
403 // * Page Width and Reference
404 let contentRef = ref()
405 let pageWidth = inject('containerWidth')
406
407 // * Options
408 let customizeOptions = computed(() => {
409 return amCustomize.value.cbf.categoryService.options
410 })
411
412 // * Base URLs
413 const baseUrls = inject('baseUrls')
414
415 // * Gallery active image
416 let activeImage = ref(0)
417
418 // * Selected category
419 let category = ref({
420 id: 1,
421 name: 'Category 1',
422 })
423
424 // * Service info tabs
425 let tabsActive = ref('description')
426
427 watchEffect(() => {
428 if (!customizeOptions.value.serviceDescription.visibility) tabsActive.value = 'employees'
429 if (!customizeOptions.value.serviceEmployees.visibility) tabsActive.value = 'description'
430 })
431
432 onBeforeUnmount(() => {
433 watchEffect(() => {})
434 })
435
436 // * Selected service
437 let service = ref({
438 id: 1,
439 name: 'Service 1',
440 category: null,
441 categoryId: 1,
442 color: '#1788FB',
443 customPricing: {
444 3600: {
445 price: 23,
446 rules: [],
447 },
448 },
449 price: 100,
450 deposit: 5,
451 description:
452 "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
453 duration: 3600,
454 extras: [
455 {
456 id: 10,
457 extraId: 10,
458 aggregatedPrice: false,
459 description:
460 "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.",
461 duration: 1800,
462 maxQuantity: 5,
463 name: 'Extra 2-1',
464 position: 1,
465 price: 5,
466 serviceId: null,
467 translations: null,
468 },
469 ],
470 gallery: [
471 {
472 pictureFullPath: `${baseUrls.value.wpAmeliaPluginURL}v3/src/assets/img/admin/customize/img_gallery_placeholder.svg`,
473 pictureThumbPath: `${baseUrls.value.wpAmeliaPluginURL}v3/src/assets/img/admin/customize/img_holder1.svg`,
474 },
475 {
476 pictureFullPath: `${baseUrls.value.wpAmeliaPluginURL}v3/src/assets/img/admin/customize/img_holder1.svg`,
477 pictureThumbPath: `${baseUrls.value.wpAmeliaPluginURL}v3/src/assets/img/admin/customize/img_holder1.svg`,
478 },
479 {
480 pictureFullPath: `${baseUrls.value.wpAmeliaPluginURL}v3/src/assets/img/admin/customize/img_holder1.svg`,
481 pictureThumbPath: `${baseUrls.value.wpAmeliaPluginURL}v3/src/assets/img/admin/customize/img_holder1.svg`,
482 },
483 {
484 pictureFullPath: `${baseUrls.value.wpAmeliaPluginURL}v3/src/assets/img/admin/customize/img_holder1.svg`,
485 pictureThumbPath: `${baseUrls.value.wpAmeliaPluginURL}v3/src/assets/img/admin/customize/img_holder1.svg`,
486 },
487 {
488 pictureFullPath: `${baseUrls.value.wpAmeliaPluginURL}v3/src/assets/img/admin/customize/img_holder1.svg`,
489 pictureThumbPath: `${baseUrls.value.wpAmeliaPluginURL}v3/src/assets/img/admin/customize/img_holder1.svg`,
490 },
491 ],
492 pictureFullPath: `${baseUrls.value.wpAmeliaPluginURL}v3/src/assets/img/admin/customize/img_holder1.svg`,
493 pictureThumbPath: `${baseUrls.value.wpAmeliaPluginURL}v3/src/assets/img/admin/customize/img_holder1.svg`,
494 location: 'Location 1',
495 })
496
497 let serviceEmployees = ref([
498 {
499 id: 1,
500 firstName: 'Herman',
501 lastName: 'Small',
502 pictureFullPath: null,
503 pictureThumbPath: null,
504 price: 20,
505 },
506 {
507 id: 2,
508 firstName: 'Abbie',
509 lastName: 'William',
510 pictureFullPath: null,
511 pictureThumbPath: null,
512 price: 150,
513 },
514 {
515 id: 3,
516 firstName: 'Miya',
517 lastName: 'Burrows',
518 pictureFullPath: null,
519 pictureThumbPath: null,
520 price: 80,
521 },
522 {
523 id: 4,
524 firstName: 'Derrick',
525 lastName: 'Cardenas',
526 pictureFullPath: null,
527 pictureThumbPath: null,
528 price: 120,
529 },
530 {
531 id: 5,
532 firstName: 'Zeynep',
533 lastName: 'Whittington',
534 pictureFullPath: null,
535 pictureThumbPath: null,
536 price: 45,
537 },
538 ])
539
540 function employeeImage(employee) {
541 if (employee.pictureFullPath) return { backgroundImage: `url(${employee.pictureFullPath})` }
542
543 return {
544 backgroundColor: `${amCardColors.value[Math.floor(Math.random() * amCardColors.value.length)]}`,
545 }
546 }
547
548 function employeeSign(employee) {
549 if (!employee.pictureFullPath) {
550 let name = `${employee.firstName} ${employee.lastName}`
551 return name
552 .split(' ')
553 .map((s) => s.charAt(0))
554 .join('')
555 .toUpperCase()
556 .substring(0, 3)
557 .replace(/[^\w\s]/g, '')
558 }
559 return ''
560 }
561
562 function serviceEmployeePrice(employee) {
563 let servicePrice = employee.price
564 if (servicePrice - service.value.price !== 0)
565 return `${
566 servicePrice - service.value.price > 0 ? '+' : '-'
567 } ${useFormattedPrice(servicePrice - service.value.price)}`
568 return ''
569 }
570
571 onMounted(() => {
572 tabsActive.value = service.value.description ? 'description' : 'employees'
573 })
574
575 let serviceThumbsGallery = computed(() => {
576 let thumbs = service.value.gallery.length ? JSON.parse(JSON.stringify(service.value.gallery)) : []
577 if (service.value.gallery.length === 1) return []
578 thumbs.shift()
579 if (thumbs.length > 2) thumbs.splice(2, thumbs.length - 2)
580 return thumbs
581 })
582
583 let servicePackages = ref([
584 {
585 id: 1,
586 name: 'Package 1',
587 calculatedPrice: false,
588 price: 500,
589 deposit: 50,
590 discount: 10,
591 depositPayment: 'percentage',
592 color: '#689BCA',
593 description:
594 'My name a Borat. I come from Kazakhstan. Can I say a first, we support your war of terror! May we show our support to our boys in Iraq! May US and A kill every single terrorist! May your George Bush drink the blood of every single man, women, and child of Iraq! May you destroy their country so that for next thousand years not even a single lizard will survive in their desert!',
595 durationCount: 2,
596 durationType: 'week',
597 endDate: null,
598 locations: [{ name: 'Location 1' }, { name: 'Location 2' }],
599 pictureFullPath: null,
600 pictureThumbPath: null,
601 services: [
602 {
603 id: 1,
604 name: 'Service 1',
605 },
606 {
607 id: 2,
608 name: 'Service 2',
609 },
610 {
611 id: 3,
612 name: 'Service 3',
613 },
614 {
615 id: 4,
616 name: 'Service 4',
617 },
618 {
619 id: 5,
620 name: 'Service 5',
621 },
622 ],
623 },
624 {
625 id: 2,
626 name: 'Package 2',
627 calculatedPrice: false,
628 price: 500,
629 deposit: 50,
630 discount: 10,
631 depositPayment: 'percentage',
632 color: '#689BCA',
633 description:
634 'My name a Borat. I come from Kazakhstan. Can I say a first, we support your war of terror! May we show our support to our boys in Iraq! May US and A kill every single terrorist! May your George Bush drink the blood of every single man, women, and child of Iraq! May you destroy their country so that for next thousand years not even a single lizard will survive in their desert!',
635 durationCount: 2,
636 durationType: 'week',
637 endDate: null,
638 locations: [{ name: 'Location 1' }, { name: 'Location 2' }],
639 pictureFullPath: null,
640 pictureThumbPath: null,
641 services: [
642 {
643 id: 1,
644 name: 'Service 1',
645 },
646 {
647 id: 2,
648 name: 'Service 2',
649 },
650 {
651 id: 3,
652 name: 'Service 3',
653 },
654 {
655 id: 4,
656 name: 'Service 4',
657 },
658 {
659 id: 5,
660 name: 'Service 5',
661 },
662 ],
663 },
664 {
665 id: 3,
666 name: 'Package 3',
667 calculatedPrice: false,
668 price: 500,
669 deposit: 50,
670 discount: 10,
671 depositPayment: 'percentage',
672 color: '#689BCA',
673 description:
674 'My name a Borat. I come from Kazakhstan. Can I say a first, we support your war of terror! May we show our support to our boys in Iraq! May US and A kill every single terrorist! May your George Bush drink the blood of every single man, women, and child of Iraq! May you destroy their country so that for next thousand years not even a single lizard will survive in their desert!',
675 durationCount: 2,
676 durationType: 'week',
677 endDate: null,
678 locations: [{ name: 'Location 1' }, { name: 'Location 2' }],
679 pictureFullPath: null,
680 pictureThumbPath: null,
681 services: [
682 {
683 id: 1,
684 name: 'Service 1',
685 },
686 {
687 id: 2,
688 name: 'Service 2',
689 },
690 {
691 id: 3,
692 name: 'Service 3',
693 },
694 {
695 id: 4,
696 name: 'Service 4',
697 },
698 {
699 id: 5,
700 name: 'Service 5',
701 },
702 ],
703 },
704 {
705 id: 4,
706 name: 'Package 4',
707 calculatedPrice: false,
708 price: 500,
709 deposit: 50,
710 discount: 10,
711 depositPayment: 'percentage',
712 color: '#689BCA',
713 description:
714 'My name a Borat. I come from Kazakhstan. Can I say a first, we support your war of terror! May we show our support to our boys in Iraq! May US and A kill every single terrorist! May your George Bush drink the blood of every single man, women, and child of Iraq! May you destroy their country so that for next thousand years not even a single lizard will survive in their desert!',
715 durationCount: 2,
716 durationType: 'week',
717 endDate: null,
718 locations: [{ name: 'Location 1' }, { name: 'Location 2' }],
719 pictureFullPath: null,
720 pictureThumbPath: null,
721 services: [
722 {
723 id: 1,
724 name: 'Service 1',
725 },
726 {
727 id: 2,
728 name: 'Service 2',
729 },
730 {
731 id: 3,
732 name: 'Service 3',
733 },
734 {
735 id: 4,
736 name: 'Service 4',
737 },
738 {
739 id: 5,
740 name: 'Service 5',
741 },
742 ],
743 },
744 {
745 id: 5,
746 name: 'Package 5',
747 calculatedPrice: false,
748 price: 500,
749 deposit: 50,
750 discount: 10,
751 depositPayment: 'percentage',
752 color: '#689BCA',
753 description:
754 'My name a Borat. I come from Kazakhstan. Can I say a first, we support your war of terror! May we show our support to our boys in Iraq! May US and A kill every single terrorist! May your George Bush drink the blood of every single man, women, and child of Iraq! May you destroy their country so that for next thousand years not even a single lizard will survive in their desert!',
755 durationCount: 2,
756 durationType: 'week',
757 endDate: null,
758 locations: [{ name: 'Location 1' }, { name: 'Location 2' }],
759 pictureFullPath: null,
760 pictureThumbPath: null,
761 services: [
762 {
763 id: 1,
764 name: 'Service 1',
765 },
766 {
767 id: 2,
768 name: 'Service 2',
769 },
770 {
771 id: 3,
772 name: 'Service 3',
773 },
774 {
775 id: 4,
776 name: 'Service 4',
777 },
778 {
779 id: 5,
780 name: 'Service 5',
781 },
782 ],
783 },
784 ])
785
786 let displayAllPackages = ref(false)
787 let displayServicePackages = computed(() => {
788 let arr = [...servicePackages.value]
789 if (!displayAllPackages.value) return arr.slice(0, 2)
790 return arr
791 })
792
793 function packageImage(pack) {
794 if (pack.pictureFullPath) return { backgroundImage: `url(${pack.pictureFullPath})` }
795
796 return { backgroundColor: pack.color }
797 }
798
799 let galleryDialog = ref(false)
800
801 // * Labels
802 let langKey = inject('langKey')
803 let amLabels = inject('labels')
804
805 function labelsDisplay(label) {
806 let computedLabel = computed(() => {
807 let translations = amCustomize.value.cbf.categoryService.translations
808 return translations && translations[label] && translations[label][langKey.value]
809 ? translations[label][langKey.value]
810 : amLabels[label]
811 })
812
813 return computedLabel.value
814 }
815
816 function durationTypeLabel(duration, type) {
817 let string = ''
818 if (duration > 1) {
819 if (type === 'day') string = labelsDisplay('expires_days')
820 if (type === 'week') string = labelsDisplay('expires_weeks')
821 if (type === 'month') string = labelsDisplay('expires_months')
822 } else {
823 if (type === 'day') string = labelsDisplay('expires_day')
824 if (type === 'week') string = labelsDisplay('expires_week')
825 if (type === 'month') string = labelsDisplay('expires_month')
826 }
827 return string
828 }
829
830 function serviceDuration(seconds) {
831 let hours = Math.floor(seconds / 3600)
832 let minutes = (seconds / 60) % 60
833
834 return (hours ? hours + amLabels.h + ' ' : '') + ' ' + (minutes ? minutes + amLabels.min : '')
835 }
836
837 // * Fonts
838 let amFonts = inject('amFonts')
839
840 // * Colors
841 let amColors = inject('amColors')
842
843 let cssVars = computed(() => {
844 return {
845 '--am-c-fcis-success-op20': useColorTransparency(amColors.value.colorSuccess, 0.2),
846 '--am-c-fcis-primary-op20': useColorTransparency(amColors.value.colorPrimary, 0.2),
847 '--am-c-fcis-text-op80': useColorTransparency(amColors.value.colorMainText, 0.8),
848 '--am-c-fcis-text-op03': useColorTransparency(amColors.value.colorMainText, 0.03),
849 '--am-c-fcis-btn-op50': useColorTransparency(amColors.value.colorBtnSec, 0.5),
850 }
851 })
852
853 let cssGalleryDialogVars = computed(() => {
854 return {
855 '--am-c-fcis-bgr': amColors.value.colorMainBgr,
856 '--am-c-fcis-text': amColors.value.colorMainText,
857 '--am-c-fcis-success': amColors.value.colorSuccess,
858 '--am-c-fcis-primary': amColors.value.colorPrimary,
859 '--am-c-scroll-op30': useColorTransparency(amColors.value.colorPrimary, 0.3),
860 '--am-c-scroll-op10': useColorTransparency(amColors.value.colorPrimary, 0.1),
861 '--am-font-family': amFonts.fontFamily,
862 }
863 })
864 </script>
865
866 <script>
867 export default {
868 name: 'CategoryService',
869 key: 'categoryService',
870 }
871 </script>
872
873 <style lang="scss">
874 @import '../../../../../src/assets/scss/common/quill/_quill-mixin.scss';
875
876 #amelia-app-backend-new {
877 // am- amelia
878 // -c- color
879 // -fcis- form category item service
880 // -bgr background
881 #amelia-container {
882 .am-fcis {
883 --am-c-fcis-header-text: var(--am-c-main-heading-text);
884 --am-c-fcis-bgr: var(--am-c-main-bgr);
885 --am-c-fcis-text: var(--am-c-main-text);
886 --am-c-fcis-success: var(--am-c-success);
887 --am-c-fcis-primary: var(--am-c-primary);
888 width: 100%;
889 padding: 24px;
890 border-radius: 10px;
891
892 &__form {
893 padding-top: 24px;
894 }
895
896 &__header {
897 &-top {
898 display: flex;
899 align-items: center;
900 justify-content: space-between;
901 padding: 0 0 16px;
902
903 &.am-tablet {
904 flex-wrap: wrap;
905
906 .am-fcis__header-text {
907 width: 100%;
908 justify-content: space-between;
909 margin-bottom: 12px;
910 }
911
912 .am-fcis__header-action {
913 width: 100%;
914 justify-content: space-between;
915 flex: unset;
916 }
917
918 &.am-mobile {
919 .am-fcis__header {
920 &-text {
921 flex-wrap: wrap;
922 }
923
924 &-name {
925 width: 100%;
926 }
927
928 &-action {
929 flex-wrap: wrap;
930 }
931
932 &-price {
933 margin-bottom: 12px;
934 }
935
936 &-tax {
937 margin-bottom: 12px;
938 }
939
940 &-btn {
941 width: 100%;
942 .am-button {
943 width: 100%;
944 }
945 }
946 }
947
948 .am-fcis__badge {
949 margin-left: 0;
950 }
951 }
952 }
953 }
954
955 &-name {
956 display: inline-flex;
957 font-size: 28px;
958 font-weight: 500;
959 color: var(--am-c-fcis-header-text);
960 }
961
962 &-action {
963 display: flex;
964 align-items: center;
965 justify-content: flex-end;
966 flex: 0 0 auto;
967 }
968
969 &-price {
970 font-size: 18px;
971 font-weight: 500;
972 margin-right: 20px;
973 color: var(--am-c-fcis-primary);
974 }
975
976 &-tax {
977 display: inline-flex;
978 flex: 0 0 auto;
979 align-items: center;
980 height: 28px;
981 font-size: 18px;
982 font-weight: 500;
983 line-height: 1;
984 border-radius: 14px;
985 padding: 0 8px;
986 margin-right: 10px;
987 background-color: var(--am-c-fcis-primary-op20);
988 color: var(--am-c-fcis-primary);
989 }
990
991 &-bottom {
992 padding: 0 0 16px;
993 }
994 }
995
996 &__content {
997 &.no-scroll {
998 max-height: unset;
999 overflow-x: unset;
1000 }
1001 }
1002
1003 &__badge {
1004 display: inline-flex;
1005 flex: 0 0 auto;
1006 align-items: center;
1007 height: 28px;
1008 padding: 0 12px 0 8px;
1009 border-radius: 14px;
1010 margin-left: 10px;
1011
1012 &.am-service {
1013 background-color: var(--am-c-fcis-success-op20);
1014 span {
1015 color: var(--am-c-fcis-success);
1016 }
1017 }
1018
1019 span {
1020 display: block;
1021 font-size: 18px;
1022 font-weight: 400;
1023 line-height: 1;
1024
1025 &[class*='am-icon']*='am-icon'] {
1026 font-size: 24px;
1027 }
1028 }
1029 }
1030
1031 &__mini-info {
1032 display: flex;
1033 flex-wrap: wrap;
1034 align-items: center;
1035
1036 &__inner {
1037 display: inline-flex;
1038 align-items: center;
1039 max-width: 100%;
1040 padding: 0 8px 0 0;
1041 margin: 0 0 8px;
1042
1043 &:last-child {
1044 padding: 0;
1045 }
1046
1047 span {
1048 font-size: 18px;
1049 font-weight: 400;
1050 color: var(--am-c-fcis-text-op80);
1051 line-height: 1.2;
1052 text-overflow: ellipsis;
1053 white-space: nowrap;
1054 overflow: hidden;
1055
1056 &[class*='am-icon']*='am-icon'] {
1057 flex: 0 0 auto;
1058 font-size: 24px;
1059 color: var(--am-c-fcis-primary);
1060 }
1061 }
1062 }
1063 }
1064
1065 &__gallery {
1066 display: flex;
1067 position: relative;
1068 transition: all 0.3s ease-in-out;
1069 margin: 0 0 32px;
1070 padding: 0 12px;
1071
1072 &-hero {
1073 width: calc(100% - 264px);
1074 border-top-left-radius: 8px;
1075 border-bottom-left-radius: 8px;
1076 margin: 0;
1077 background-size: cover;
1078 background-repeat: no-repeat;
1079 background-position: center;
1080 transition: all 0.3s ease-in-out;
1081 overflow: hidden;
1082
1083 &.w100 {
1084 width: 100%;
1085 padding-top: 25%;
1086 border-radius: 8px;
1087 margin-bottom: 0;
1088
1089 &.am-mobile {
1090 padding-top: 150px;
1091 }
1092 }
1093 }
1094
1095 &-thumb {
1096 position: relative;
1097 display: inline-block;
1098 width: calc(100% - 16px);
1099 padding-top: calc(50% - 16px);
1100 margin: 0 0 16px 16px;
1101 background-size: cover;
1102 background-repeat: no-repeat;
1103 background-position: center;
1104 overflow: hidden;
1105 //cursor: pointer;
1106 float: left;
1107
1108 &:first-child {
1109 border-top-right-radius: 8px;
1110 }
1111
1112 &:last-of-type {
1113 border-bottom-right-radius: 8px;
1114 margin-bottom: 0;
1115 }
1116
1117 &__wrapper {
1118 width: 100%;
1119 max-width: 264px;
1120 position: relative;
1121
1122 &:after,
1123 &:before {
1124 content: '';
1125 display: block;
1126 clear: both;
1127 }
1128 }
1129
1130 &.am-one-thumb {
1131 padding-top: calc(100% - 16px);
1132 }
1133 }
1134
1135 &-btn {
1136 position: absolute;
1137 bottom: 12px;
1138 right: 24px;
1139 display: flex;
1140 align-items: center;
1141 justify-content: center;
1142 width: calc(264px - 40px);
1143
1144 &.am-mobile {
1145 width: calc(100% - 48px);
1146 }
1147
1148 &.am-button.am-button--filled {
1149 --am-c-btn-bgr: var(--am-c-btn-second);
1150 --am-c-btn-text: var(--am-c-btn-first);
1151 --am-c-btn-border: var(--am-c-fcis-btn-op50);
1152
1153 &:not(.is-disabled) {
1154 &:hover {
1155 --am-c-btn-bgr: var(--am-c-btn-second);
1156 --am-c-btn-text: var(--am-c-btn-first);
1157 --am-c-btn-border: var(--am-c-fcis-btn-op50);
1158 }
1159 }
1160 }
1161
1162 .am-icon-gallery {
1163 font-size: 24px;
1164 margin-right: 4px;
1165 }
1166 }
1167 }
1168
1169 &__info {
1170 padding: 0 12px;
1171 margin: 0 0 32px;
1172
1173 &-tab {
1174 font-size: 14px;
1175 font-weight: 500;
1176 color: var(--am-c-fcis-text);
1177 padding: 12px 16px;
1178 cursor: pointer;
1179
1180 &:hover {
1181 color: var(--am-c-fcis-primary);
1182 }
1183
1184 &.am-active {
1185 color: var(--am-c-fcis-primary);
1186 border-bottom: 3px solid var(--am-c-fcis-primary);
1187 padding-bottom: 9px;
1188 }
1189
1190 &__wrapper {
1191 display: flex;
1192 align-items: center;
1193 justify-content: flex-start;
1194 position: relative;
1195 }
1196 }
1197
1198 &-content {
1199 padding: 24px 0;
1200
1201 .am-collapse-item {
1202 $count: 100;
1203 @for $i from 0 through $count {
1204 &:nth-child(#{$i + 1}) {
1205 animation: 600ms
1206 cubic-bezier(0.45, 1, 0.4, 1.2)
1207 #{$i *
1208 100}ms
1209 am-animation-slide-up;
1210 animation-fill-mode: both;
1211 }
1212 }
1213
1214 &__heading {
1215 padding: 12px;
1216 transition-delay: 0.5s;
1217
1218 &-side {
1219 transition-delay: 0s;
1220 }
1221 }
1222 }
1223 }
1224
1225 &-service {
1226 &__desc {
1227 font-size: 15px;
1228 line-height: 2;
1229 word-break: break-word;
1230 white-space: break-spaces;
1231 color: var(--am-c-fcis-text-op80);
1232
1233 * {
1234 font-size: 15px;
1235 line-height: 2;
1236 word-break: break-word;
1237 white-space: break-spaces;
1238 color: var(--am-c-fcis-text-op80);
1239 }
1240
1241 a {
1242 color: var(--am-c-fcis-primary);
1243 }
1244
1245 &.ql-description {
1246 @include quill-styles;
1247 }
1248 }
1249 }
1250
1251 &-employee {
1252 width: 100%;
1253 display: flex;
1254 align-items: center;
1255 justify-content: space-between;
1256
1257 &:last-child {
1258 margin: 0;
1259 }
1260
1261 &__hero {
1262 display: flex;
1263 align-items: center;
1264 width: 100%;
1265 }
1266
1267 &__img {
1268 width: 54px;
1269 height: 54px;
1270 display: flex;
1271 flex: 0 0 auto;
1272 align-items: center;
1273 justify-content: center;
1274 background-position: center;
1275 background-size: cover;
1276 border-radius: 4px;
1277 border: 1px solid var(--am-c-inp-border);
1278 color: var(--am-c-fcis-bgr);
1279 font-size: 18px;
1280 font-weight: 500;
1281 }
1282
1283 &__heading {
1284 width: 100%;
1285 display: flex;
1286 flex-wrap: wrap;
1287 align-items: center;
1288 justify-content: space-between;
1289 }
1290
1291 &__name {
1292 font-size: 15px;
1293 font-weight: 500;
1294 color: var(--am-c-fcis-text);
1295 margin: 0 0 0 12px;
1296 }
1297
1298 &__badge {
1299 color: #fff;
1300 border-radius: 4px;
1301 padding: 0 4px;
1302 font-size: 13px;
1303 line-height: 19px;
1304 }
1305
1306 &__price {
1307 display: flex;
1308 align-items: center;
1309 justify-content: center;
1310 flex: 0 0 auto;
1311 height: 24px;
1312 font-size: 14px;
1313 font-weight: 500;
1314 line-height: 1;
1315 color: var(--am-c-fcis-primary);
1316 background-color: var(--am-c-fcis-primary-op20);
1317 padding: 0 8px;
1318 border-radius: 12px;
1319 margin: 0 0 0 12px;
1320 }
1321
1322 &__description {
1323 color: var(--am-c-fcis-text);
1324
1325 &.ql-description {
1326 @include quill-styles;
1327 }
1328 }
1329 }
1330 }
1331
1332 &__include {
1333 display: flex;
1334 align-items: flex-start;
1335 justify-content: space-between;
1336 border-radius: 6px;
1337 border: 1px solid var(--am-c-inp-border);
1338 background-color: var(--am-c-fcis-bgr);
1339 padding: 12px;
1340 margin: 12px 0 0;
1341 cursor: pointer;
1342
1343 &-wrapper {
1344 padding: 12px;
1345 background-color: var(--am-c-fcis-text-op03);
1346 border-radius: 8px;
1347 }
1348
1349 &-heading {
1350 display: flex;
1351 align-items: center;
1352 justify-content: space-between;
1353
1354 &__text {
1355 font-size: 18px;
1356 font-weight: 500;
1357 line-height: 1.55555;
1358 color: var(--am-c-fcis-text);
1359 }
1360
1361 &__btn {
1362 font-size: 15px;
1363 font-weight: 500;
1364 color: var(--am-c-fcis-primary);
1365 cursor: pointer;
1366 padding: 4px 10px;
1367 border-radius: 4px;
1368
1369 &:hover {
1370 transition: background-color 0.3s ease-in-out;
1371 background-color: var(--am-c-fcis-primary-op20);
1372 }
1373 }
1374 }
1375
1376 &-hero {
1377 display: flex;
1378 align-items: flex-start;
1379 justify-content: flex-start;
1380 width: 100%;
1381 }
1382
1383 &-img {
1384 width: 76px;
1385 height: 76px;
1386 display: flex;
1387 flex: 0 0 auto;
1388 align-items: center;
1389 justify-content: center;
1390 background-position: center;
1391 background-size: cover;
1392 border-radius: 4px;
1393 border: 1px solid var(--am-c-inp-border);
1394 color: var(--am-c-fcis-bgr);
1395 font-size: 28px;
1396 }
1397
1398 &-text {
1399 width: 100%;
1400 margin: 0 0 0 12px;
1401
1402 &.am-mobile {
1403 margin: 0;
1404 }
1405 }
1406
1407 &-header {
1408 display: flex;
1409 align-items: center;
1410 justify-content: space-between;
1411 width: 100%;
1412
1413 &.am-mobile {
1414 flex-wrap: wrap;
1415 }
1416 }
1417
1418 &-name {
1419 font-size: 15px;
1420 font-weight: 500;
1421 line-height: 1.6;
1422 color: var(--am-c-fcis-text);
1423 margin: 0 0 4px;
1424
1425 &.am-mobile {
1426 width: 100%;
1427 }
1428 }
1429
1430 &-cost {
1431 display: flex;
1432 align-items: center;
1433 justify-content: space-between;
1434 flex: 0 0 auto;
1435
1436 & > span {
1437 display: inline-flex;
1438 height: 24px;
1439 font-size: 14px;
1440 font-weight: 500;
1441 padding: 2px 8px;
1442 border-radius: 24px;
1443 margin-right: 8px;
1444 flex: 0 1 auto;
1445
1446 &:last-child {
1447 margin-right: 0;
1448 }
1449 }
1450 }
1451
1452 &-price {
1453 color: var(--am-c-fcis-primary);
1454 background-color: var(--am-c-fcis-primary-op20);
1455 }
1456
1457 &-discount {
1458 color: var(--am-c-fcis-success);
1459 background-color: var(--am-c-fcis-success-op20);
1460 }
1461
1462 &-info {
1463 display: flex;
1464 flex-wrap: wrap;
1465 align-items: center;
1466
1467 &__inner {
1468 display: inline-flex;
1469 align-items: center;
1470 justify-content: center;
1471 max-width: 100%;
1472 height: auto;
1473 line-height: 20px;
1474 padding: 0 8px 0 0;
1475 margin: 0 0 8px;
1476
1477 &:last-child {
1478 padding: 0;
1479 }
1480
1481 span {
1482 font-size: 13px;
1483 font-weight: 400;
1484 line-height: unset;
1485 color: var(--am-c-fcis-text-op80);
1486 flex-wrap: wrap;
1487
1488 &[class*='am-icon']*='am-icon'] {
1489 flex: 0 0 auto;
1490 font-size: 24px;
1491 color: var(--am-c-fcis-primary);
1492 }
1493 }
1494 }
1495
1496 &__services {
1497 width: 100%;
1498 height: auto;
1499 display: flex;
1500 flex-wrap: wrap;
1501 justify-content: flex-start;
1502 margin: 0;
1503
1504 span {
1505 position: relative;
1506 display: inline-flex;
1507 flex: 0 1 auto;
1508 font-size: 13px;
1509 font-weight: 400;
1510 line-height: 1.384615;
1511 word-break: break-word;
1512 color: var(--am-c-fcis-text-op80);
1513 padding: 0 0 0 8px;
1514
1515 &::after {
1516 content: '';
1517 position: absolute;
1518 top: 50%;
1519 left: 2px;
1520 transform: translateY(-50%);
1521 border: 2px solid var(--am-c-fcis-text-op80);
1522 border-radius: 50%;
1523 }
1524
1525 &:first-child,
1526 &:nth-child(2) {
1527 padding-right: 2px;
1528
1529 &::after {
1530 display: none;
1531 }
1532 }
1533 }
1534 }
1535 }
1536 }
1537 }
1538 }
1539 }
1540
1541 // - sgd - service gallery dialog
1542 .amelia-v2-booking.amelia-v2-sgd {
1543 z-index: 9999999 !important;
1544
1545 .el-overlay-dialog {
1546 background-color: rgba(26, 44, 55, 0.5);
1547 }
1548
1549 .el-dialog {
1550 max-width: var(--el-dialog-width);
1551 width: 100%;
1552 border-radius: 8px;
1553 background-color: transparent;
1554 margin-top: var(--el-dialog-margin-top);
1555 }
1556
1557 .am-gd {
1558 background-color: var(--am-c-fcis-bgr);
1559 border-radius: 8px;
1560 padding: 0 0 8px;
1561
1562 * {
1563 font-family: var(--am-font-family);
1564 }
1565
1566 &__display {
1567 display: flex;
1568 align-items: center;
1569 justify-content: center;
1570
1571 img {
1572 width: 100%;
1573 border-radius: 8px;
1574 }
1575
1576 &-wrapper {
1577 position: relative;
1578 padding: 24px 60px 12px;
1579 }
1580 }
1581
1582 &__arrows {
1583 width: 100%;
1584 height: 100%;
1585 position: absolute;
1586 top: 0;
1587 left: 0;
1588 z-index: 100;
1589
1590 span {
1591 position: absolute;
1592 width: 60px;
1593 height: 100%;
1594 font-size: 38px;
1595 color: var(--am-c-fcis-text);
1596 cursor: pointer;
1597
1598 &::before {
1599 position: absolute;
1600 top: 50%;
1601 left: 50%;
1602 transform: translate(-50%, -50%);
1603 }
1604
1605 &:first-child {
1606 left: 0;
1607 }
1608
1609 &:last-child {
1610 right: 0;
1611 }
1612 }
1613 }
1614
1615 &__selection {
1616 display: flex;
1617 align-items: center;
1618 justify-content: center;
1619 font-size: 14px;
1620 line-height: 1.42857;
1621 color: var(--am-c-fcis-text);
1622 }
1623
1624 &__thumb {
1625 position: relative;
1626 width: 100px;
1627 height: 100px;
1628 flex: 0 0 auto;
1629 cursor: pointer;
1630 margin: 0 8px 8px 0;
1631 background-size: cover;
1632 background-repeat: no-repeat;
1633 background-position: center;
1634
1635 &:last-child {
1636 margin-right: 0;
1637 }
1638
1639 &.am-active {
1640 &:before {
1641 content: '';
1642 position: absolute;
1643 bottom: -8px;
1644 left: 0;
1645 width: 100%;
1646 height: 4px;
1647 background-color: var(--am-c-fcis-primary);
1648 }
1649 }
1650
1651 &-wrapper {
1652 display: flex;
1653 max-width: calc(100% - 48px);
1654 width: calc(100% - 48px);
1655 white-space: nowrap;
1656 margin: 0 24px;
1657 overflow-y: hidden;
1658 padding-bottom: 8px;
1659
1660 // Main Scroll styles
1661 &::-webkit-scrollbar {
1662 height: 6px;
1663 }
1664
1665 &::-webkit-scrollbar-thumb {
1666 border-radius: 6px;
1667 background: var(--am-c-scroll-op30);
1668 }
1669
1670 &::-webkit-scrollbar-track {
1671 border-radius: 6px;
1672 background: var(--am-c-scroll-op10);
1673 }
1674 }
1675 }
1676 }
1677 }
1678 </style>
1679