|
@@ -1,39 +1,16 @@
|
|
|
|
|
+<!-- eslint-disable @intlify/vue-i18n/no-raw-text -->
|
|
|
<template>
|
|
<template>
|
|
|
<q-page class="login-page bg-surface-dark">
|
|
<q-page class="login-page bg-surface-dark">
|
|
|
<Transition name="fade-slide" mode="out-in">
|
|
<Transition name="fade-slide" mode="out-in">
|
|
|
-
|
|
|
|
|
<div v-if="!clicked" key="splash" class="splash-screen" @click="clicked = true">
|
|
<div v-if="!clicked" key="splash" class="splash-screen" @click="clicked = true">
|
|
|
<img :src="BackgroundLogin" class="splash-layer splash-layer--bg" />
|
|
<img :src="BackgroundLogin" class="splash-layer splash-layer--bg" />
|
|
|
<img :src="FotoDiarista" class="splash-layer splash-layer--photo" />
|
|
<img :src="FotoDiarista" class="splash-layer splash-layer--photo" />
|
|
|
<img :src="LogoLogin" class="splash-layer splash-layer--logo" />
|
|
<img :src="LogoLogin" class="splash-layer splash-layer--logo" />
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div v-else-if="steps === 4" key="step4" class="splash-screen">
|
|
|
|
|
- <img :src="BackgroundLogin" class="splash-layer splash-layer--bg" />
|
|
|
|
|
- <img :src="FotoDiarista" class="splash-layer splash-layer--photo" />
|
|
|
|
|
- <img :src="LogoLogin" class="splash-layer splash-layer--logo-small" />
|
|
|
|
|
- <div class="step4-card-wrapper">
|
|
|
|
|
- <LoginStepFourPanel v-model:cep="stepFourCep" @back="steps = 3" />
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
-
|
|
|
|
|
<div v-else key="flow" class="flow-screen">
|
|
<div v-else key="flow" class="flow-screen">
|
|
|
-
|
|
|
|
|
- <div class="flow-header">
|
|
|
|
|
- <q-btn
|
|
|
|
|
- v-if="steps === 3"
|
|
|
|
|
- flat
|
|
|
|
|
- dense
|
|
|
|
|
- color="primary"
|
|
|
|
|
- :label="$t('auth.register_later')"
|
|
|
|
|
- icon-right="mdi-chevron-right-circle-outline"
|
|
|
|
|
- class="text-caption"
|
|
|
|
|
- @click="steps = 4"
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
-
|
|
|
|
|
- <div class="flow-logo">
|
|
|
|
|
- <q-img :src="LogoDiariaCampos" style="max-width: 180px;" />
|
|
|
|
|
|
|
+ <div v-if="!showSubStep" class="flow-logo q-my-xl">
|
|
|
|
|
+ <q-img :src="LogoDiariaCampos" style="max-width: 180px" />
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<q-form
|
|
<q-form
|
|
@@ -45,18 +22,25 @@
|
|
|
spellcheck="false"
|
|
spellcheck="false"
|
|
|
@submit="onSubmit"
|
|
@submit="onSubmit"
|
|
|
>
|
|
>
|
|
|
- <div class="flow-content" :class="{ 'flow-content--centered': steps < 3 }">
|
|
|
|
|
|
|
+ <div class="flow-content" :class="{ 'flow-content--centered': steps <= 2 && !showSubStep }">
|
|
|
<LoginStepOnePanel v-if="steps === 1" v-model:email="email" v-model:phone="phone" />
|
|
<LoginStepOnePanel v-if="steps === 1" v-model:email="email" v-model:phone="phone" />
|
|
|
<LoginStepTwoPanel v-else-if="steps === 2" v-model:code="code" />
|
|
<LoginStepTwoPanel v-else-if="steps === 2" v-model:code="code" />
|
|
|
<LoginStepThreePanel v-else-if="steps === 3" v-model="stepThreeForm" />
|
|
<LoginStepThreePanel v-else-if="steps === 3" v-model="stepThreeForm" />
|
|
|
|
|
+ <LoginStepFourPanel
|
|
|
|
|
+ v-else-if="steps === 4"
|
|
|
|
|
+ v-model="stepFourForm"
|
|
|
|
|
+ @update:show-sub-step="showSubStep = $event"
|
|
|
|
|
+ />
|
|
|
|
|
+ <LoginStepFivePanel v-else-if="steps === 5" v-model="stepFiveForm" />
|
|
|
|
|
+ <LoginStepSixPanel v-else-if="steps === 6" v-model="stepSixForm" />
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div class="flow-footer">
|
|
|
|
|
|
|
+ <div v-if="!showSubStep" class="flow-footer">
|
|
|
<q-btn
|
|
<q-btn
|
|
|
color="primary-button"
|
|
color="primary-button"
|
|
|
- :label="$t('auth.continue')"
|
|
|
|
|
|
|
+ :label="actionLabel"
|
|
|
rounded
|
|
rounded
|
|
|
- padding="14px 16px"
|
|
|
|
|
|
|
+ padding="8px 16px"
|
|
|
type="submit"
|
|
type="submit"
|
|
|
class="full-width"
|
|
class="full-width"
|
|
|
:loading="submitting"
|
|
:loading="submitting"
|
|
@@ -67,18 +51,18 @@
|
|
|
</q-btn>
|
|
</q-btn>
|
|
|
</div>
|
|
</div>
|
|
|
</q-form>
|
|
</q-form>
|
|
|
-
|
|
|
|
|
</div>
|
|
</div>
|
|
|
-
|
|
|
|
|
</Transition>
|
|
</Transition>
|
|
|
</q-page>
|
|
</q-page>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
-import { ref } from 'vue';
|
|
|
|
|
|
|
+import { computed, ref } from 'vue';
|
|
|
|
|
+import { useQuasar } from 'quasar';
|
|
|
|
|
+import { useRouter } from 'vue-router';
|
|
|
|
|
+import { useI18n } from 'vue-i18n';
|
|
|
import { createUserAndProvider, sendCode, validateCode } from 'src/api/user';
|
|
import { createUserAndProvider, sendCode, validateCode } from 'src/api/user';
|
|
|
import { useAuth } from 'src/composables/useAuth';
|
|
import { useAuth } from 'src/composables/useAuth';
|
|
|
-import { useRouter } from 'vue-router';
|
|
|
|
|
|
|
|
|
|
import BackgroundLogin from 'src/assets/background-login.svg';
|
|
import BackgroundLogin from 'src/assets/background-login.svg';
|
|
|
import FotoDiarista from 'src/assets/foto_diarista_login.svg';
|
|
import FotoDiarista from 'src/assets/foto_diarista_login.svg';
|
|
@@ -89,76 +73,223 @@ import LoginStepOnePanel from 'src/components/login/LoginStepOnePanel.vue';
|
|
|
import LoginStepTwoPanel from 'src/components/login/LoginStepTwoPanel.vue';
|
|
import LoginStepTwoPanel from 'src/components/login/LoginStepTwoPanel.vue';
|
|
|
import LoginStepThreePanel from 'src/components/login/LoginStepThreePanel.vue';
|
|
import LoginStepThreePanel from 'src/components/login/LoginStepThreePanel.vue';
|
|
|
import LoginStepFourPanel from 'src/components/login/LoginStepFourPanel.vue';
|
|
import LoginStepFourPanel from 'src/components/login/LoginStepFourPanel.vue';
|
|
|
|
|
+import LoginStepFivePanel from 'src/components/login/LoginStepFivePanel.vue';
|
|
|
|
|
+import LoginStepSixPanel from 'src/components/login/LoginStepSixPanel.vue';
|
|
|
|
|
|
|
|
|
|
+const { t } = useI18n();
|
|
|
|
|
+const $q = useQuasar();
|
|
|
const router = useRouter();
|
|
const router = useRouter();
|
|
|
const { setAuthDataFromPayload } = useAuth();
|
|
const { setAuthDataFromPayload } = useAuth();
|
|
|
|
|
|
|
|
|
|
+const clicked = ref(false);
|
|
|
|
|
+const showSubStep = ref(false);
|
|
|
|
|
+const steps = ref(1);
|
|
|
|
|
+const submitting = ref(false);
|
|
|
|
|
+const loginForm = ref(null);
|
|
|
|
|
+const isLogin = ref(false);
|
|
|
|
|
+
|
|
|
const email = ref('');
|
|
const email = ref('');
|
|
|
const phone = ref('');
|
|
const phone = ref('');
|
|
|
const code = ref('');
|
|
const code = ref('');
|
|
|
-const stepFourCep = ref('');
|
|
|
|
|
|
|
|
|
|
const stepThreeForm = ref({
|
|
const stepThreeForm = ref({
|
|
|
name: '',
|
|
name: '',
|
|
|
|
|
+ phone: '',
|
|
|
|
|
+ email: '',
|
|
|
|
|
+ rg: '',
|
|
|
document: '',
|
|
document: '',
|
|
|
|
|
+ birth_date: '',
|
|
|
zip_code: '',
|
|
zip_code: '',
|
|
|
address: '',
|
|
address: '',
|
|
|
complement: '',
|
|
complement: '',
|
|
|
- nickname: '',
|
|
|
|
|
- instructions: '',
|
|
|
|
|
- address_type: 'home',
|
|
|
|
|
no_complement: false,
|
|
no_complement: false,
|
|
|
city: '',
|
|
city: '',
|
|
|
state: '',
|
|
state: '',
|
|
|
|
|
+ address_type: 'home',
|
|
|
|
|
+ nickname: 'Principal',
|
|
|
|
|
+ instructions: '',
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
-const steps = ref(1); // 1 = credentials | 2 = code | 3 = user fields | 4 = cep only
|
|
|
|
|
-const clicked = ref(false);
|
|
|
|
|
-const submitting = ref(false);
|
|
|
|
|
-const loginForm = ref(null);
|
|
|
|
|
|
|
+const stepFourForm = ref({
|
|
|
|
|
+ selfie_file: null,
|
|
|
|
|
+ selfie_base64: '',
|
|
|
|
|
+ document_front_file: null,
|
|
|
|
|
+ document_front_base64: '',
|
|
|
|
|
+ document_back_file: null,
|
|
|
|
|
+ document_back_base64: '',
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+const stepFiveForm = ref({
|
|
|
|
|
+ daily_price_8h: null,
|
|
|
|
|
+ daily_price_6h: null,
|
|
|
|
|
+ daily_price_4h: null,
|
|
|
|
|
+ daily_price_2h: null,
|
|
|
|
|
+ services_types_ids: [],
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+const stepSixForm = ref({
|
|
|
|
|
+ working_days: {},
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+const actionLabel = computed(() => {
|
|
|
|
|
+ if (steps.value === 1) return t('provider.login.steps.step_1.action');
|
|
|
|
|
+ if (steps.value === 2) return t('provider.login.steps.step_2.action');
|
|
|
|
|
+ if (steps.value === 6) return t('provider.login.steps.step_6.action');
|
|
|
|
|
+ return t('provider.login.steps.step_3.action');
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+const toISODate = (value) => {
|
|
|
|
|
+ const matches = /^(\d{2})\/(\d{2})\/(\d{4})$/.exec(value || '');
|
|
|
|
|
+ if (!matches) return null;
|
|
|
|
|
+
|
|
|
|
|
+ return `${matches[3]}-${matches[2]}-${matches[1]}`;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const mapWorkingDays = () => {
|
|
|
|
|
+ const mapped = [];
|
|
|
|
|
+ const workingDays = stepSixForm.value.working_days || {};
|
|
|
|
|
+
|
|
|
|
|
+ Object.entries(workingDays).forEach(([dayKey, periods]) => {
|
|
|
|
|
+ if (periods?.morning) {
|
|
|
|
|
+ mapped.push({ day: Number(dayKey), period: 'morning' });
|
|
|
|
|
+ }
|
|
|
|
|
+ if (periods?.afternoon) {
|
|
|
|
|
+ mapped.push({ day: Number(dayKey), period: 'afternoon' });
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ return mapped;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const hasWorkingDaySelected = () => {
|
|
|
|
|
+ return mapWorkingDays().length > 0;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const validateCurrentStep = async () => {
|
|
|
|
|
+ const isValid = await loginForm.value?.validate();
|
|
|
|
|
+
|
|
|
|
|
+ if (!isValid) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (steps.value === 6 && !hasWorkingDaySelected()) {
|
|
|
|
|
+ $q.notify({
|
|
|
|
|
+ type: 'negative',
|
|
|
|
|
+ message: t('provider.login.steps.step_6.select_at_least_one'),
|
|
|
|
|
+ });
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
const sendValidationCode = async () => {
|
|
const sendValidationCode = async () => {
|
|
|
const response = await sendCode(email.value, phone.value);
|
|
const response = await sendCode(email.value, phone.value);
|
|
|
if (response.status === 201) {
|
|
if (response.status === 201) {
|
|
|
steps.value = 2;
|
|
steps.value = 2;
|
|
|
- } else {
|
|
|
|
|
- console.error('Failed to send validation code');
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+ return response;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const validateCodeInput = async () => {
|
|
const validateCodeInput = async () => {
|
|
|
- const response = await validateCode(email.value, phone.value, code.value);
|
|
|
|
|
|
|
+ const response = await validateCode(email.value, phone.value, code.value, isLogin.value);
|
|
|
|
|
+
|
|
|
if (response.status === 200) {
|
|
if (response.status === 200) {
|
|
|
|
|
+ if (isLogin.value === true) {
|
|
|
|
|
+ await setAuthDataFromPayload(response.data.payload);
|
|
|
|
|
+ router.push({ name: 'DashboardPage' });
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ stepThreeForm.value.email = email.value;
|
|
|
|
|
+ stepThreeForm.value.phone = phone.value;
|
|
|
steps.value = 3;
|
|
steps.value = 3;
|
|
|
- } else {
|
|
|
|
|
- console.error('Invalid validation code');
|
|
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const registerUserAndProvider = async () => {
|
|
const registerUserAndProvider = async () => {
|
|
|
|
|
+ const workingDays = mapWorkingDays();
|
|
|
|
|
+
|
|
|
const payload = {
|
|
const payload = {
|
|
|
...stepThreeForm.value,
|
|
...stepThreeForm.value,
|
|
|
- email: email.value,
|
|
|
|
|
- phone: phone.value,
|
|
|
|
|
|
|
+ email: stepThreeForm.value.email || email.value,
|
|
|
|
|
+ phone: stepThreeForm.value.phone || phone.value,
|
|
|
code: code.value,
|
|
code: code.value,
|
|
|
|
|
+ birth_date: toISODate(stepThreeForm.value.birth_date),
|
|
|
has_complement: !stepThreeForm.value.no_complement,
|
|
has_complement: !stepThreeForm.value.no_complement,
|
|
|
|
|
+ complement: stepThreeForm.value.no_complement ? null : stepThreeForm.value.complement,
|
|
|
|
|
+
|
|
|
|
|
+ selfie_base64: stepFourForm.value.selfie_base64,
|
|
|
|
|
+ document_front_base64: stepFourForm.value.document_front_base64,
|
|
|
|
|
+ document_back_base64: stepFourForm.value.document_back_base64,
|
|
|
|
|
+
|
|
|
|
|
+ daily_price_8h: Number(stepFiveForm.value.daily_price_8h),
|
|
|
|
|
+ daily_price_6h: Number(stepFiveForm.value.daily_price_6h),
|
|
|
|
|
+ daily_price_4h: Number(stepFiveForm.value.daily_price_4h),
|
|
|
|
|
+ daily_price_2h: Number(stepFiveForm.value.daily_price_2h),
|
|
|
|
|
+ services_types_ids: stepFiveForm.value.services_types_ids,
|
|
|
|
|
+
|
|
|
|
|
+ working_days: workingDays,
|
|
|
|
|
+
|
|
|
|
|
+ is_approved: false,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const response = await createUserAndProvider(payload);
|
|
const response = await createUserAndProvider(payload);
|
|
|
if (response.status === 200) {
|
|
if (response.status === 200) {
|
|
|
await setAuthDataFromPayload(response.data.payload);
|
|
await setAuthDataFromPayload(response.data.payload);
|
|
|
router.push({ name: 'DashboardPage' });
|
|
router.push({ name: 'DashboardPage' });
|
|
|
- } else {
|
|
|
|
|
- console.error('Failed to create user and provider');
|
|
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const onSubmit = async () => {
|
|
const onSubmit = async () => {
|
|
|
- switch (steps.value) {
|
|
|
|
|
- case 1: await sendValidationCode(); break;
|
|
|
|
|
- case 2: await validateCodeInput(); break;
|
|
|
|
|
- case 3: await registerUserAndProvider(); break;
|
|
|
|
|
- default: break;
|
|
|
|
|
|
|
+ if (showSubStep.value) return; // Não submete o form principal se estiver em um sub-passo
|
|
|
|
|
+
|
|
|
|
|
+ const isValid = await loginForm.value.validate();
|
|
|
|
|
+ if (!isValid) return;
|
|
|
|
|
+
|
|
|
|
|
+ submitting.value = true;
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ switch (steps.value) {
|
|
|
|
|
+ case 1: {
|
|
|
|
|
+ const response = await sendValidationCode();
|
|
|
|
|
+ isLogin.value = response?.data?.payload?.isLogin === true;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ case 2:
|
|
|
|
|
+ await validateCodeInput();
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 3: {
|
|
|
|
|
+ if (await validateCurrentStep()) {
|
|
|
|
|
+ steps.value = 4;
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ case 4: {
|
|
|
|
|
+ if (await validateCurrentStep()) {
|
|
|
|
|
+ steps.value = 5;
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ case 5: {
|
|
|
|
|
+ if (await validateCurrentStep()) {
|
|
|
|
|
+ steps.value = 6;
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ case 6: {
|
|
|
|
|
+ if (await validateCurrentStep()) {
|
|
|
|
|
+ await registerUserAndProvider();
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ default:
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error(error);
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ submitting.value = false;
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
</script>
|
|
</script>
|
|
@@ -168,8 +299,14 @@ const onSubmit = async () => {
|
|
|
.fade-slide-leave-active {
|
|
.fade-slide-leave-active {
|
|
|
transition: opacity 0.35s ease, transform 0.35s ease;
|
|
transition: opacity 0.35s ease, transform 0.35s ease;
|
|
|
}
|
|
}
|
|
|
-.fade-slide-enter-from { opacity: 0; transform: translateY(6px); }
|
|
|
|
|
-.fade-slide-leave-to { opacity: 0; transform: translateY(-6px); }
|
|
|
|
|
|
|
+.fade-slide-enter-from {
|
|
|
|
|
+ opacity: 0;
|
|
|
|
|
+ transform: translateY(6px);
|
|
|
|
|
+}
|
|
|
|
|
+.fade-slide-leave-to {
|
|
|
|
|
+ opacity: 0;
|
|
|
|
|
+ transform: translateY(-6px);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
.login-page {
|
|
.login-page {
|
|
|
min-height: 100vh;
|
|
min-height: 100vh;
|
|
@@ -211,27 +348,9 @@ const onSubmit = async () => {
|
|
|
width: 180px;
|
|
width: 180px;
|
|
|
z-index: 1;
|
|
z-index: 1;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- &--logo-small {
|
|
|
|
|
- top: 18%;
|
|
|
|
|
- left: 50%;
|
|
|
|
|
- transform: translate(-50%, -50%);
|
|
|
|
|
- width: 100px;
|
|
|
|
|
- z-index: 1;
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.step4-card-wrapper {
|
|
|
|
|
- position: absolute;
|
|
|
|
|
- top: 50%;
|
|
|
|
|
- left: 50%;
|
|
|
|
|
- transform: translate(-50%, -30%);
|
|
|
|
|
- z-index: 2;
|
|
|
|
|
- width: 90%;
|
|
|
|
|
- max-width: 360px;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
.flow-screen {
|
|
.flow-screen {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
@@ -244,25 +363,24 @@ const onSubmit = async () => {
|
|
|
|
|
|
|
|
.flow-header {
|
|
.flow-header {
|
|
|
min-height: 36px;
|
|
min-height: 36px;
|
|
|
- display: flex;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- justify-content: flex-end;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.flow-logo {
|
|
.flow-logo {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
justify-content: center;
|
|
justify-content: center;
|
|
|
- padding: 12px 0 24px;
|
|
|
|
|
|
|
+ padding: 12px 0 20px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.flow-form {
|
|
.flow-form {
|
|
|
flex: 1;
|
|
flex: 1;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
|
|
+ min-height: 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.flow-content {
|
|
.flow-content {
|
|
|
flex: 1;
|
|
flex: 1;
|
|
|
|
|
+ overflow-y: auto;
|
|
|
|
|
|
|
|
&--centered {
|
|
&--centered {
|
|
|
display: flex;
|
|
display: flex;
|