PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / trunk
Booking for Appointments and Events Calendar – Amelia vtrunk
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 / pages / CustomizeCustomerPanel.vue
ameliabooking / v3 / src / views / admin / customize / pages Last commit date
CustomizeCatalog.vue 5 days ago CustomizeCustomerPanel.vue 5 days ago CustomizeEmployeePanel.vue 5 days ago CustomizeEventCalendar.vue 5 days ago CustomizeEventList.vue 5 days ago CustomizeStepNew.vue 5 days ago
CustomizeCustomerPanel.vue
760 lines
1 <template>
2 <div
3 v-if="isLoaded"
4 id="amelia-container"
5 ref="ameliaContainer"
6 class="am-cap__wrapper"
7 :class="[{ 'am-collapsed': sidebarCollapsed }, { 'am-auth': pagesType === 'auth' }]"
8 :style="cssVars"
9 >
10 <template v-if="pagesType === 'auth'">
11 <component :is="stepsArray[stepIndex]"></component>
12 </template>
13 <template v-if="pagesType === 'panel'">
14 <SideBar
15 v-if="sidebarVisibility"
16 class="am-fs-sb"
17 :class="{ 'am-collapsed': sidebarCollapsed }"
18 :style="{
19 width: !sidebarCollapsed ? '240px' : '72px',
20 paddingBottom: `${sidebarFooterHeight + 16}px`,
21 }"
22 >
23 <template #step-list>
24 <div class="am-fs-sb__page-wrapper">
25 <template v-for="(step, index) in sidebarSteps" :key="step.key">
26 <div
27 class="am-fs-sb__page"
28 :class="[
29 { selected: stepName === step.key },
30 {
31 selected:
32 (stepName === 'packagesList' || stepName === 'packageAppointmentsList') &&
33 step.key === 'packages',
34 },
35 ]"
36 >
37 <div class="am-fs-sb__page-inner" :class="{ 'am-collapsed': sidebarCollapsed }">
38 <div class="am-fs-sb__page-icon">
39 <span :class="`am-icon-${step.icon}`"></span>
40 </div>
41 <transition name="fade">
42 <p
43 v-if="!sidebarCollapsed"
44 class="am-fs-sb__page-heading"
45 :class="sidebarCollapseItemsClass"
46 >
47 {{ step.label }}
48 </p>
49 </transition>
50 <transition name="fade">
51 <div
52 v-if="!sidebarCollapsed"
53 class="am-fs-sb__page-indicator"
54 :class="sidebarCollapseItemsClass"
55 >
56 <span class="am-icon-arrow-big-right"></span>
57 </div>
58 </transition>
59 </div>
60 </div>
61 <div v-if="index === 0" class="am-fs-sb__page-divider"></div>
62 </template>
63 </div>
64 </template>
65 <template #support-info>
66 <div ref="sidebarFooterRef" class="am-fs-sb__footer">
67 <div class="am-fs-sb__page" @click="sidebarCollapsed = !sidebarCollapsed">
68 <div class="am-fs-sb__page-inner">
69 <div class="am-fs-sb__page-icon">
70 <span class="am-icon-dashboard"></span>
71 </div>
72 <transition name="fade">
73 <p
74 v-if="!sidebarCollapsed"
75 class="am-fs-sb__page-heading"
76 :class="sidebarCollapseItemsClass"
77 >
78 {{ labelsDisplay('toggle_sidebar', 'sidebar') }}
79 </p>
80 </transition>
81 </div>
82 </div>
83 <div class="am-fs-sb__page-divider"></div>
84 <div class="am-fs-sb__page">
85 <div class="am-fs-sb__page-inner">
86 <div class="am-fs-sb__page-icon">
87 <span class="am-icon-logout"></span>
88 </div>
89 <transition name="fade">
90 <p
91 v-if="!sidebarCollapsed"
92 class="am-fs-sb__page-heading"
93 :class="sidebarCollapseItemsClass"
94 >
95 {{ labelsDisplay('log_out', 'sidebar') }}
96 </p>
97 </transition>
98 </div>
99 </div>
100 </div>
101 </template>
102 </SideBar>
103 <MainContent :max-width="786" :old-responsive="false">
104 <template #header>
105 <MainPanelHeader>
106 <template #default>
107 <div class="am-caph">
108 <div class="am-caph__text">
109 <template v-if="stepIndex === 4">
110 {{ sidebarSteps[3].label }}
111 </template>
112 <template v-else-if="sidebarSteps[stepIndex].key === 'profile'">
113 {{ sidebarSteps[stepIndex].pageLabel }}
114 </template>
115 <template v-else>
116 {{ sidebarSteps[stepIndex].label }}
117 </template>
118 </div>
119 <div
120 v-if="!sidebarVisibility"
121 class="am-cap__menu"
122 @click="() => (menuVisibility = !menuVisibility)"
123 >
124 <span class="am-icon-menu"></span>
125 </div>
126 <TimeZoneSelect
127 v-if="
128 sidebarVisibility &&
129 stepName !== 'profile' &&
130 customizedOptions.timeZone.visibility
131 "
132 />
133 <MenuSlideDialog
134 :menu-items="sidebarSteps"
135 :monitor="stepName"
136 :visibility="menuVisibility"
137 :custom-css="cssSideMenu"
138 :width="240"
139 :customized-labels="globalStepLabels('sidebar')"
140 position="right"
141 @update:visibility="(e) => (menuVisibility = e)"
142 @logout="menuLogout"
143 />
144 </div>
145 </template>
146 </MainPanelHeader>
147 </template>
148 <template #step>
149 <component :is="stepsArray[stepIndex]" class="am-fs__main-content"></component>
150 </template>
151 </MainContent>
152 </template>
153 </div>
154 </template>
155
156 <script setup>
157 // * Form construction
158 import MainContent from '../../../common/SbsFormConstruction/MainContent/MainContent.vue'
159 import SideBar from '../../../common/SbsFormConstruction/SideBar/SideBar.vue'
160 import MainPanelHeader from '../../../common/SbsFormConstruction/MainContent/parts/MainPanelHeader.vue'
161
162 // * Form Component Collection
163 // authentication
164 import SignIn from '../steps/Cabinet/common/Authentication/SignIn.vue'
165 import SendAccessLink from '../steps/Cabinet/common/Authentication/SendAccessLink.vue'
166 import SendAccessLinkSuccess from '../steps/Cabinet/common/Authentication/SendAccessLinkSuccess.vue'
167 import SetPass from '../steps/Cabinet/common/Authentication/SetPass.vue'
168 // panel
169 import Profile from '../steps/Cabinet/common/Profile/Profile.vue'
170 import Appointments from '../steps/Cabinet/common/Appointments/Appointments.vue'
171 import Events from '../steps/Cabinet/common/Events/Events.vue'
172 import PackageAppointmentsList from '../steps/Cabinet/common/Packages/PackageAppointmentsList.vue'
173 import PackagesList from '../steps/Cabinet/common/Packages/PackagesList.vue'
174
175 // * Dedicated Components
176 import TimeZoneSelect from '../steps/Cabinet/common/parts/TimeZoneSelect.vue'
177 import MenuSlideDialog from '../../../common/SbsFormConstruction/MenuSlideDialog/MenuSlideDialog.vue'
178
179 // * import from Vue
180 import {
181 ref,
182 provide,
183 inject,
184 markRaw,
185 computed,
186 onBeforeMount,
187 onMounted,
188 readonly,
189 watchEffect,
190 onUnmounted,
191 nextTick,
192 } from 'vue'
193
194 // * + this has to be tested for responsive usage
195 // import { useElementSize } from "@vueuse/core";
196
197 // * import composable
198 import { defaultCustomizeSettings } from '../../../../assets/js/common/defaultCustomize.js'
199 import { useColorTransparency } from '../../../../assets/js/common/colorManipulation.js'
200 import { useReactiveCustomize } from '../../../../assets/js/admin/useReactiveCustomize.js'
201
202 // * Plugin Licence
203 // let licence = inject('licence')
204
205 // * Root Settings
206 let amSettings = inject('settings')
207
208 // * Features
209 let features = useReactiveCustomize().features
210 provide('features', features)
211
212 // * Step index
213 let stepIndex = useReactiveCustomize().stepIndex
214 provide('stepIndex', stepIndex)
215
216 // * Page Type
217 let pagesType = useReactiveCustomize().pagesType
218 provide('pagesType', pagesType)
219
220 const amLabels = inject('labels')
221 // * Language Key
222 let langKey = useReactiveCustomize().langKey
223 provide('langKey', langKey)
224
225 // * Step name
226 let stepName = useReactiveCustomize().stepName
227 provide('stepName', stepName)
228
229 // * Sub Step name
230 let subStepName = useReactiveCustomize().subStepName
231 provide('subStepName', subStepName)
232
233 // * Page render key
234 let pageRenderKey = ref('capc')
235 provide('pageRenderKey', pageRenderKey)
236
237 // * Customize data
238 const { amCustomize } = useReactiveCustomize()
239 provide('customize', amCustomize)
240
241 let amFonts = computed(() => {
242 return amCustomize.value.fonts
243 })
244 provide('amFonts', amFonts)
245
246 // * Cabinet Type
247 let cabinetType = ref('customer')
248 provide('cabinetType', cabinetType)
249
250 // * Autehtication steps
251 let signIn = markRaw(SignIn)
252 let sendAccessLink = markRaw(SendAccessLink)
253 let sendAccessLinkSuccess = markRaw(SendAccessLinkSuccess)
254 let setPass = markRaw(SetPass)
255
256 let authFlow = ref([signIn, sendAccessLink, sendAccessLinkSuccess, setPass])
257
258 // * Panel steps
259 let profile = markRaw(Profile)
260 let appointments = markRaw(Appointments)
261 let events = markRaw(Events)
262 let packagesList = markRaw(PackagesList)
263 let packageAppointmentsList = markRaw(PackageAppointmentsList)
264
265 let panelFlow = ref([profile, appointments, events, packagesList, packageAppointmentsList])
266
267 let stepsArray = computed(() => {
268 if (pagesType.value === 'auth') return authFlow.value
269
270 return panelFlow.value
271 })
272
273 // * Component reference
274 let ameliaContainer = ref(null)
275
276 let isLoaded = ref(false)
277
278 onMounted(() => {
279 window.customizeComponentLoaded = true
280
281 if (typeof window.stylesInjectedV3 === 'function') {
282 if (window.v3.componentToMount === 'CustomizeCustomerPanel') {
283 window.stylesInjectedV3 = () => {
284 nextTick().then(() => {
285 isLoaded.value = true
286 })
287 }
288 }
289 }
290 })
291
292 onUnmounted(() => {
293 window.customizeComponentLoaded = false
294 // Reset to no-op function
295 window.stylesInjectedV3 = async function () {}
296 })
297
298 // * Plugin wrapper width
299 let containerWidth = ref()
300 provide('containerWidth', containerWidth)
301
302 // * Mobile menu
303 let menuVisibility = ref(false)
304
305 function menuLogout() {
306 menuVisibility.value = false
307 }
308
309 // * Form Sidebar Collapse
310 let sidebarCollapsed = ref(false)
311 provide('sidebarCollapsed', readonly(sidebarCollapsed))
312
313 let sidebarCollapseItemsClass = ref('')
314
315 watchEffect(() => {
316 if (sidebarCollapsed.value) {
317 setTimeout(() => {
318 sidebarCollapseItemsClass.value = 'am-collapsed'
319 }, 1000)
320 } else {
321 sidebarCollapseItemsClass.value = ''
322 }
323 })
324
325 let toggleSidebar = computed(() => {
326 return amCustomize.value.capc.sidebar.options.toggle.visibility
327 })
328
329 watchEffect(() => {
330 sidebarCollapsed.value = toggleSidebar.value
331 })
332
333 let sidebarFooterRef = ref(null)
334 let sidebarFooterHeight = ref(0)
335
336 // * Form Sidebar Visibility
337 let sidebarVisibility = ref(true)
338
339 onMounted(() => {
340 if (sidebarFooterRef.value) {
341 setTimeout(() => {
342 sidebarFooterHeight.value = sidebarFooterRef.value.offsetHeight
343 }, 200)
344 }
345
346 if (ameliaContainer.value) {
347 containerWidth.value = ameliaContainer.value.offsetWidth
348 sidebarCollapsed.value = !toggleSidebar.value
349 ? ameliaContainer.value.offsetWidth <= 600
350 : toggleSidebar.value
351 sidebarVisibility.value = ameliaContainer.value.offsetWidth > 480
352 }
353 })
354
355 // * window resize listener
356 window.addEventListener('resize', resize)
357 // * resize function
358 function resize() {
359 if (ameliaContainer.value) {
360 containerWidth.value = ameliaContainer.value.offsetWidth
361 sidebarCollapsed.value = !toggleSidebar.value
362 ? ameliaContainer.value.offsetWidth <= 600
363 : toggleSidebar.value
364 sidebarVisibility.value = ameliaContainer.value.offsetWidth > 480
365 menuVisibility.value = ameliaContainer.value.offsetWidth > 481 ? false : menuVisibility.value
366 }
367 }
368
369 // * Root Urls
370 const baseUrls = inject('baseUrls')
371
372 // * Array of Sidebar steps
373 const sidebarSteps = computed(() => {
374 let arr = [
375 {
376 key: 'profile',
377 icon: 'user',
378 pageLabel: labelsDisplay('my_profile', 'profile'),
379 label: amCustomize.value.capc.profile.options.lastName.visibility ? 'John Doe' : 'John',
380 },
381 {
382 key: 'appointments',
383 icon: 'service',
384 label: labelsDisplay('appointments', 'appointments'),
385 },
386 {
387 key: 'events',
388 icon: 'star-outline',
389 label: labelsDisplay('events', 'events'),
390 },
391 {
392 key: 'packages',
393 icon: 'shipment',
394 label: labelsDisplay('packages', 'packagesList'),
395 },
396 ]
397
398 if (!features.value.packages) {
399 arr = arr.filter((step) => step.key !== 'packages')
400 }
401
402 return arr
403 })
404 provide('sidebarSteps', sidebarSteps)
405
406 let sidebarIndex = ref(0)
407
408 onMounted(() => {
409 sidebarIndex.value = sidebarSteps.value.findIndex((a) => a.key === stepName.value)
410 })
411
412 watchEffect(() => {
413 if (amCustomize.value.fonts.customFontSelected) {
414 activateCustomFontStyles()
415 } else {
416 importDefaultFonts()
417 }
418 })
419
420 function activateCustomFontStyles() {
421 let head = document.head || document.getElementsByTagName('head')[0]
422 if (head.querySelector('#amCustomFont')) {
423 head.querySelector('#amCustomFont').remove()
424 }
425
426 if (head.querySelector('#amDefaultFontImport')) {
427 head.querySelector('#amDefaultFontImport').remove()
428 }
429
430 let css = `@font-face {font-family: '${amCustomize.value.fonts.fontFamily}'; src: url(${amCustomize.value.fonts.fontUrl});}`
431 let style = document.createElement('style')
432 head.appendChild(style)
433 style.setAttribute('type', 'text/css')
434 style.setAttribute('id', 'amCustomFont')
435 style.appendChild(document.createTextNode(css))
436 }
437
438 function importDefaultFonts() {
439 const head = document.head || document.getElementsByTagName('head')[0]
440 if (head.querySelector('#amDefaultFontImport')) {
441 return
442 }
443
444 const base = baseUrls.value.wpAmeliaPluginURL
445 const style = document.createElement('style')
446 style.setAttribute('type', 'text/css')
447 style.setAttribute('id', 'amDefaultFontImport')
448 style.textContent = `@import url("${base}v3/src/assets/scss/common/fonts/font.css");`
449 head.appendChild(style)
450 }
451
452 /**
453 * Lifecycle Hooks
454 */
455 onBeforeMount(() => {
456 window.scrollTo({
457 top: 0,
458 left: 0,
459 behavior: 'smooth',
460 })
461 })
462
463 // * Label computed function
464 function labelsDisplay(label, stepKey) {
465 let computedLabel = computed(() => {
466 return amCustomize.value[pageRenderKey.value][stepKey].translations &&
467 amCustomize.value[pageRenderKey.value][stepKey].translations[label] &&
468 amCustomize.value[pageRenderKey.value][stepKey].translations[label][langKey.value]
469 ? amCustomize.value[pageRenderKey.value][stepKey].translations[label][langKey.value]
470 : amLabels[label]
471 })
472
473 return computedLabel.value
474 }
475
476 // * Step labels passed to inner components
477 function globalStepLabels(step) {
478 let stepLabels = {}
479 let customizedLabels = step ? amCustomize.value[pageRenderKey.value][step].translations : null
480 if (customizedLabels && Object.keys(customizedLabels)) {
481 Object.keys(amCustomize.value[pageRenderKey.value][step].translations).forEach((label) => {
482 stepLabels[label] =
483 amCustomize.value[pageRenderKey.value][step].translations[label][langKey.value]
484 })
485 } else {
486 stepLabels = {}
487 }
488
489 return stepLabels
490 }
491
492 // * Custmozes Options
493 let customizedOptions = computed(() => {
494 if (stepName.value === 'packageAppointmentsList')
495 return amCustomize.value[pageRenderKey.value].packagesList.options
496 return amCustomize.value[pageRenderKey.value][stepName.value].options
497 })
498
499 onBeforeMount(() => {})
500
501 // * Colors block
502 let amColors = computed(() => {
503 const colors = amCustomize.value[pageRenderKey.value]
504 ? amCustomize.value[pageRenderKey.value].colors
505 : defaultCustomizeSettings[pageRenderKey.value].colors
506
507 return { ...colors }
508 })
509 provide('amColors', amColors)
510
511 let cssVars = computed(() => {
512 return {
513 '--am-c-primary': amColors.value.colorPrimary,
514 '--am-c-success': amColors.value.colorSuccess,
515 '--am-c-error': amColors.value.colorError,
516 '--am-c-warning': amColors.value.colorWarning,
517 '--am-c-main-bgr': amColors.value.colorMainBgr,
518 '--am-c-main-heading-text': amColors.value.colorMainHeadingText,
519 '--am-c-main-text': amColors.value.colorMainText,
520 '--am-c-main-text-op10': useColorTransparency(amColors.value.colorMainText, 0.1),
521 '--am-c-sb-bgr': amColors.value.colorSbBgr,
522 '--am-c-sb-text': amColors.value.colorSbText,
523 '--am-c-inp-bgr': amColors.value.colorInpBgr,
524 '--am-c-inp-border': amColors.value.colorInpBorder,
525 '--am-c-inp-text': amColors.value.colorInpText,
526 '--am-c-inp-placeholder': amColors.value.colorInpPlaceHolder,
527 '--am-c-drop-bgr': amColors.value.colorDropBgr,
528 '--am-c-drop-text': amColors.value.colorDropText,
529 '--am-c-btn-prim': amColors.value.colorBtnPrim,
530 '--am-c-btn-prim-text': amColors.value.colorBtnPrimText,
531 '--am-c-btn-sec': amColors.value.colorBtnSec,
532 '--am-c-btn-sec-text': amColors.value.colorBtnSecText,
533 '--am-c-skeleton-op20': useColorTransparency(amColors.value.colorMainText, 0.2),
534 '--am-c-skeleton-op60': useColorTransparency(amColors.value.colorMainText, 0.6),
535 '--am-c-skeleton-sb-op20': useColorTransparency(amColors.value.colorSbText, 0.2),
536 '--am-c-skeleton-sb-op60': useColorTransparency(amColors.value.colorSbText, 0.6),
537 '--am-font-family': amFonts.value.fontFamily,
538
539 // css properties
540 '--am-rad-inp': '6px',
541 '--am-fs-inp': '15px',
542 // -mw- max width
543 // -brad- border-radius
544 '--am-mw-main': sidebarVisibility.value
545 ? sidebarCollapsed.value
546 ? '858px'
547 : '1024px'
548 : '520px',
549 '--am-brad-main': sidebarVisibility.value ? '0 0.5rem 0.5rem 0' : '0.5rem',
550 }
551 })
552
553 let cssSideMenu = computed(() => {
554 return {
555 '--am-c-msd-bgr': amColors.value.colorSbBgr,
556 '--am-c-msd-text': amColors.value.colorSbText,
557 '--am-c-msd-text-op05': useColorTransparency(amColors.value.colorSbText, 0.05),
558 '--am-c-msd-text-op10': useColorTransparency(amColors.value.colorSbText, 0.1),
559 '--am-c-msd-text-op60': useColorTransparency(amColors.value.colorSbText, 0.6),
560 }
561 })
562 </script>
563
564 <script>
565 export default {
566 name: 'CustomerPanel',
567 }
568 </script>
569
570 <style lang="scss">
571 @import '../../../../assets/scss/public/overides/overides';
572 @import '../../../../assets/scss/common/empty-state/_empty-state-mixin.scss';
573 @import '../../../../assets/scss/common/transitions/_transitions-mixin.scss';
574
575 #amelia-app-backend-new {
576 background-color: transparent;
577
578 #amelia-container {
579 background-color: transparent;
580
581 * {
582 font-family: var(--am-font-family);
583 font-style: initial;
584 box-sizing: border-box;
585 word-break: break-word;
586 letter-spacing: normal;
587 }
588
589 // cap - cabinet panel
590 &.am-cap {
591 // Container Wrapper
592 &__wrapper {
593 display: flex;
594 justify-content: center;
595 max-width: var(--am-mw-main);
596 width: 100%;
597 height: 700px;
598 margin: 16px auto 100px;
599 border-radius: 8px;
600 box-shadow: 0 30px 40px rgba(0, 0, 0, 0.12);
601 transition: max-width 0.3s ease-in-out;
602
603 &.am-auth {
604 box-shadow: unset;
605 height: auto;
606 }
607
608 &.am-collapsed {
609 transition-delay: 1s;
610 }
611
612 // overrides for element plus components
613 // tabs
614 .el-tabs {
615 display: flex;
616 flex-direction: column-reverse;
617 gap: 16px 0;
618
619 &__nav {
620 gap: 0 40px;
621
622 &-wrap {
623 &:after {
624 background-color: var(--am-c-main-text-op10);
625 }
626
627 &.is-scrollable {
628 padding: 0 24px;
629 }
630 }
631
632 &-next,
633 &-prev {
634 color: var(--am-c-main-text);
635 top: 11px;
636 }
637 }
638
639 &__active-bar {
640 background-color: var(--am-c-primary);
641 }
642
643 &__item {
644 padding: 0;
645 line-height: 40px;
646 color: var(--am-c-main-text);
647 transition: color 0.2s ease-in-out;
648
649 &:nth-child(2) {
650 padding-left: 0;
651 }
652
653 &:last-child {
654 padding-right: 0;
655 }
656
657 &.is-active {
658 color: var(--am-c-primary);
659 }
660
661 &:focus-visible {
662 box-shadow: none;
663 }
664
665 &:hover {
666 color: var(--am-c-primary);
667 }
668
669 &.is-focus {
670 color: var(--am-c-main-text);
671
672 &.is-active {
673 color: var(--am-c-primary);
674 }
675 }
676 }
677
678 &__content {
679 overflow: unset;
680 position: static;
681 }
682 }
683
684 // collapse
685 .el-collapse-item {
686 &__wrap {
687 overflow: visible;
688 }
689
690 &__header {
691 border: none;
692 font-size: var(--am-fs-label);
693 line-height: 1.6;
694 height: unset;
695 }
696 }
697
698 * {
699 font-family: var(--am-font-family);
700 box-sizing: border-box;
701 }
702 }
703 }
704
705 .am-cap {
706 &__header {
707 display: flex;
708 align-items: center;
709 justify-content: space-between;
710
711 .am-select-wrapper {
712 max-width: 250px;
713 }
714 }
715 }
716
717 .am-asi {
718 .el-form {
719 &-item {
720 display: block;
721 font-family: var(--am-font-family);
722 font-size: var(--am-fs-label);
723 margin-bottom: 24px;
724
725 &__label {
726 flex: 0 0 auto;
727 text-align: left;
728 font-size: var(--am-fs-label);
729 line-height: 1.3;
730 color: var(--am-c-main-text);
731 box-sizing: border-box;
732 margin: 0;
733
734 &:before {
735 color: var(--am-c-error);
736 }
737 }
738
739 &__content {
740 display: flex;
741 flex-wrap: wrap;
742 align-items: center;
743 flex: 1;
744 position: relative;
745 font-size: var(--am-fs-inp);
746 min-width: 0;
747 }
748
749 &__error {
750 font-size: 12px;
751 color: var(--am-c-error);
752 padding-top: 4px;
753 }
754 }
755 }
756 }
757 }
758 }
759 </style>
760