hl-core 0.0.7-beta.1 → 0.0.7-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/.prettierrc +2 -1
  2. package/api/index.ts +545 -0
  3. package/api/interceptors.ts +38 -0
  4. package/components/Button/Btn.vue +57 -0
  5. package/components/Button/BtnIcon.vue +47 -0
  6. package/components/Button/SortArrow.vue +21 -0
  7. package/components/Complex/Content.vue +5 -0
  8. package/components/Complex/ContentBlock.vue +5 -0
  9. package/components/Complex/Page.vue +43 -0
  10. package/components/Input/FormInput.vue +136 -0
  11. package/components/Input/RoundedInput.vue +136 -0
  12. package/components/Layout/Dialog.vue +84 -0
  13. package/components/Layout/Drawer.vue +42 -0
  14. package/components/Layout/Header.vue +48 -0
  15. package/components/Layout/Loader.vue +35 -0
  16. package/components/Layout/SettingsPanel.vue +33 -0
  17. package/components/Menu/MenuNav.vue +125 -0
  18. package/components/Menu/MenuNavItem.vue +27 -0
  19. package/components/Panel/PanelItem.vue +5 -0
  20. package/components/Transitions/FadeTransition.vue +5 -0
  21. package/composables/axios.ts +11 -0
  22. package/composables/classes.ts +1081 -0
  23. package/composables/constants.ts +61 -0
  24. package/composables/index.ts +133 -2
  25. package/composables/models.ts +43 -0
  26. package/composables/styles.ts +34 -8
  27. package/layouts/clear.vue +3 -0
  28. package/layouts/default.vue +37 -0
  29. package/layouts/full.vue +6 -0
  30. package/nuxt.config.ts +23 -4
  31. package/package.json +15 -4
  32. package/pages/500.vue +48 -0
  33. package/plugins/helperFunctionsPlugins.ts +11 -2
  34. package/plugins/storePlugin.ts +0 -2
  35. package/plugins/vuetifyPlugin.ts +10 -0
  36. package/store/data.store.js +2632 -6
  37. package/store/form.store.js +8 -0
  38. package/store/messages.ts +118 -27
  39. package/store/rules.js +7 -26
  40. package/tailwind.config.js +10 -0
  41. package/components/Button/GreenBtn.vue +0 -33
  42. package/store/app.store.js +0 -12
@@ -0,0 +1,61 @@
1
+ export const constants = Object.freeze({
2
+ products: {
3
+ pensionannuity: 1,
4
+ baiterek: 3,
5
+ halykmycar: 5,
6
+ lifetrip: 7,
7
+ bolashak: 8,
8
+ liferenta: 9,
9
+ gons: 10,
10
+ },
11
+
12
+ editableStatuses: ['StartForm', 'EditBeneficiaryForm', 'EditForm'],
13
+ documentsLinkVisibleStatuses: ['DocumentsSignedFrom', 'UnderwriterForm', 'AffilationResolutionForm', 'Completed', 'InsurancePremiumOnlinePaid'],
14
+ gbdErrors: ['INVALID', 'TIMEOUT', 'ERROR', 'NOT_FOUND'],
15
+ types: {
16
+ string: 'string',
17
+ array: 'object',
18
+ object: 'object',
19
+ },
20
+ roles: {
21
+ manager: 'Manager',
22
+ admin: 'Admin',
23
+ underwriter: 'Underwriter',
24
+ agent: 'Agent',
25
+ compliance: 'Compliance',
26
+ agentMycar: 'AgentMycar',
27
+ analyst: 'Analyst',
28
+ upk: 'UPK',
29
+ financeCenter: 'FinanceCenter',
30
+ supervisor: 'Supervisor',
31
+ },
32
+ actions: {
33
+ accept: 'accept',
34
+ rejectclient: 'rejectclient',
35
+ reject: 'reject',
36
+ return: 'return',
37
+ claim: 'claim',
38
+ signed: 'signed',
39
+ payed: 'payed',
40
+ },
41
+ yearCases: [2, 0, 1, 1, 1, 2],
42
+ yearTitles: ['год', 'года', 'лет'],
43
+ panelActions: {
44
+ accept: 'accept',
45
+ claim: 'claim',
46
+ return: 'return',
47
+ reject: 'reject',
48
+ rejectclient: 'rejectclient',
49
+ },
50
+ postActions: {
51
+ route: 'route',
52
+ applicationCreated: 'applicationCreated',
53
+ clipboard: 'clipboard',
54
+ toHomePage: 'toHomePage',
55
+ toStatementHistory: 'toStatementHistory',
56
+ toAuth: 'toAuth',
57
+ DOMevent: 'DOMevent',
58
+ Error401: 'Error401',
59
+ Error500: 'Error500',
60
+ },
61
+ });
@@ -1,6 +1,137 @@
1
1
  import { useDisplay } from 'vuetify';
2
+ import jwt_decode from 'jwt-decode';
3
+ import { XMLParser } from 'fast-xml-parser';
2
4
 
3
5
  export const useDisplayInfo = useDisplay;
4
6
 
5
- export const capitalize = (word: string): string =>
6
- word ? word.charAt(0).toUpperCase() + word.slice(1) : word;
7
+ export const capitalize = (word: string): string => (word ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() : word);
8
+
9
+ const xmlParser = new XMLParser({
10
+ // numberParseOptions: {
11
+ // leadingZeros: true,
12
+ // skipLike: /[0-9]+/,
13
+ // },
14
+ });
15
+
16
+ export const formatDate = (date: string) => {
17
+ if (date) {
18
+ const data = date.split('.');
19
+ const day = data[0];
20
+ const month = data[1];
21
+ const year = data[2];
22
+ return new Date(`${year}-${month}-${day}`);
23
+ } else {
24
+ return null;
25
+ }
26
+ };
27
+
28
+ export const reformatDate = (date: string) => {
29
+ if (date) {
30
+ const data = new Date(date);
31
+ let day: string | number = data.getDate();
32
+ let month: string | number = data.getMonth() + 1;
33
+ if (month < 10) {
34
+ month = '0' + month;
35
+ }
36
+ if (day < 10) {
37
+ day = '0' + day;
38
+ }
39
+ const year = data.getFullYear();
40
+ return `${day}.${month}.${year}`;
41
+ } else {
42
+ return null;
43
+ }
44
+ };
45
+
46
+ export const reformatIin = (iin: string) => {
47
+ if (!!iin) {
48
+ const matched = iin.match(/.{1,3}/g);
49
+ return matched ? matched.join('-') : '';
50
+ } else {
51
+ return '';
52
+ }
53
+ };
54
+
55
+ export const formatPhone = (phone: string) => {
56
+ return phone?.replace(/(\(|\)|\+| )/g, '');
57
+ };
58
+
59
+ export const jwtDecode = (token: string): any => {
60
+ if (token) return jwt_decode(token);
61
+ else return null;
62
+ };
63
+
64
+ export const isValidToken = (token: string) => {
65
+ return (new Date(jwtDecode(token).exp * 1000).getTime() - Date.now()) / 1000 > 0;
66
+ };
67
+
68
+ export const isValidGUID = (value: string) => {
69
+ return !!value && value.length > 0 && /^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$/.test(value);
70
+ };
71
+
72
+ export const getKeyWithPattern = (obj: any, key: string) => {
73
+ return Object.keys(obj).find(i => i.match(new RegExp(key, 'i'))) || null;
74
+ };
75
+
76
+ export const getFullNameShorted = (text: string | null, fromWhichWord: number = 1) => {
77
+ if (text) {
78
+ const names = text.split(' ');
79
+ if (names.length > 1) {
80
+ let fullName = '';
81
+ names.forEach((name, index) => {
82
+ if (index >= fromWhichWord) fullName += ` ${name.charAt(0)}.`;
83
+ else fullName += `${name} `;
84
+ });
85
+ return fullName;
86
+ }
87
+ return text;
88
+ } else {
89
+ return '';
90
+ }
91
+ };
92
+
93
+ export const parseProcents = (val: string | number) => (val ? Number(((val as number) * 100).toFixed(0)) : val);
94
+
95
+ export const formatProcents = (val: string | number) => (val ? Number(((val as number) / 100).toFixed(2)) : Number(val));
96
+
97
+ export const sanitizeURL = (text: string) => (text ? text.replace(/\r?\n|\r|\\|"/g, '') : '');
98
+
99
+ export const yearEnding = (number: number, titles: string[], cases: number[]) => {
100
+ return titles[number % 100 > 4 && number % 100 < 20 ? 2 : cases[number % 10 < 5 ? number % 10 : 5]];
101
+ };
102
+
103
+ export const parseXML = (xml: boolean | string = true, withTag = false, tag: string | null = null) => {
104
+ if (xml) {
105
+ const localXml = xml as string;
106
+ if (withTag && tag !== null) {
107
+ const DOMparser = new DOMParser();
108
+ const xmLSerializer = new XMLSerializer();
109
+ const tagDOM = DOMparser.parseFromString(localXml, 'text/xml').getElementsByTagName(tag);
110
+ const tagXml = xmLSerializer.serializeToString(tagDOM[0]);
111
+ return xmlParser.parse(tagXml);
112
+ } else {
113
+ return xmlParser.parse(localXml);
114
+ }
115
+ }
116
+ };
117
+
118
+ export const ESBDMessage = (ESBDObject: any, initialPoint: any) => {
119
+ let result;
120
+ if (ESBDObject.errorCode === 2) {
121
+ if (ESBDObject.errorMsg.indexOf('EMSG') === -1) {
122
+ result = 'Клиент не является резидентом РК!';
123
+ } else {
124
+ result = ESBDObject.errorMsg.substring(ESBDObject.errorMsg.indexOf('EMSG') + 6, ESBDObject.errorMsg.lastIndexOf('EWS-100')).replace(initialPoint, '');
125
+ }
126
+ }
127
+ if (ESBDObject.errorCode === 3) {
128
+ return false;
129
+ }
130
+ if (ESBDObject.errorCode === 1) {
131
+ result = ESBDObject.errorMsg.substring(ESBDObject.errorMsg.indexOf(initialPoint), ESBDObject.errorMsg.lastIndexOf('ECL-0001')).replace(initialPoint, '');
132
+ }
133
+ if (ESBDObject.errorCode === 4) {
134
+ result = ESBDObject.errorMsg;
135
+ }
136
+ return result;
137
+ };
@@ -0,0 +1,43 @@
1
+ export type InputTypes =
2
+ | 'button'
3
+ | 'checkbox'
4
+ | 'color'
5
+ | 'date'
6
+ | 'datetime-local'
7
+ | 'email'
8
+ | 'file'
9
+ | 'hidden'
10
+ | 'image'
11
+ | 'month'
12
+ | 'number'
13
+ | 'password'
14
+ | 'radio'
15
+ | 'range'
16
+ | 'reset'
17
+ | 'search'
18
+ | 'submit'
19
+ | 'tel'
20
+ | 'text'
21
+ | 'time'
22
+ | 'url'
23
+ | 'week';
24
+
25
+ export type TaskListItem = {
26
+ addRegNumber: string | number;
27
+ applicationTaskId: string;
28
+ dateCreated: string;
29
+ historyStatus: string;
30
+ historyStatusTitle: string;
31
+ id: string;
32
+ iin: string;
33
+ insurerIin: string;
34
+ insurerLongName: string;
35
+ isTask: boolean | number;
36
+ longName: string;
37
+ number: string;
38
+ processCode: number;
39
+ processCodeTitle: string;
40
+ status: string;
41
+ userId: string;
42
+ userName: string;
43
+ };
@@ -5,28 +5,38 @@ export class Styles {
5
5
  blackText: string = 'text-black';
6
6
  bodyBg: string = '!bg-[#F5F5F5]';
7
7
 
8
+ whiteTextHover: string = 'hover:text-[#FFFFFF]';
8
9
  // Blue
9
10
  blueBg: string = 'bg-[#A0B3D8]';
11
+ blueBgHover: string = 'hover:bg-[#96abd6]';
10
12
  blueBgLight: string = 'bg-[#F3F6FC]';
13
+ blueBgLightHover: string = 'hover:bg-[#F3F6FC]';
11
14
  blueText: string = 'text-[#A0B3D8]';
12
15
  blueTextLight: string = 'text-[#F3F6FC]';
13
16
 
14
17
  // Green
15
18
  greenBg: string = 'bg-[#009C73]';
19
+ greenBgHover: string = 'hover:bg-[#00a277]';
16
20
  greenBgLight: string = 'bg-[#009C73]';
21
+ greenText: string = 'text-[#009C73]';
22
+ greenTextHover: string = 'hover:text-[#009C73]';
17
23
 
18
24
  // Grey
19
- greyBg: string = 'bg-[#A9ACAE]';
20
- greyText: string = 'text-[#A9ACAE]';
21
- greyTextLight: string = 'text-[#A5A5A5]';
25
+ greyBg: string = 'bg-[#B8B8B8]';
26
+ greyText: string = 'text-[#B8B8B8]';
27
+ greyTextLight: string = 'text-[#B8B8B8]';
22
28
  greyIcon: string = 'text-[#DADADA]';
23
29
  greyIconBg: string = 'bg-[#DADADA]';
24
30
  greyBtnBg: string = 'bg-[#EEE6E6]';
25
31
  greyBtnDisabledBg: string = 'bg-[#919191]';
26
-
32
+ blueLightBgHover: string = 'hover:bg-[#F3F6FC]';
27
33
  // Red
28
- redText: string = 'text-[#E46962]';
29
- redBg: string = 'bg-[#E46962]';
34
+ redText: string = 'text-[#FF897D]';
35
+ redBg: string = 'bg-[#FF897D]';
36
+ redBgHover: string = 'hover:bg-[#ff9b91]';
37
+ // Error
38
+ errorBg: string = 'bg-[#FF5449]';
39
+ errorText: string = 'text-[#FF5449]';
30
40
 
31
41
  // Border
32
42
  rounded: string = 'rounded-[8px]';
@@ -37,14 +47,30 @@ export class Styles {
37
47
  textBold: string = 'font-bold';
38
48
 
39
49
  // Button
50
+ btnHSm: string = 'h-[40px]';
40
51
  btnHMd: string = 'h-[60px]';
41
52
  btnHLg: string = 'h-[60px]';
53
+ greenBtn: string;
54
+ blueBtn: string;
55
+ redBtn: string;
56
+ whiteBtn: string;
57
+ blueLightBtn: string;
42
58
 
43
59
  // Complex
44
- greenBtn: string;
60
+ flexColNav: string;
61
+
62
+ // Muted or disabled
63
+ mutedText: string = 'text-[#99A3B3]';
45
64
 
46
65
  constructor() {
66
+ // Button
67
+ this.greenBtn = `${this.greenBg} ${this.whiteText} ${this.textTitle} ${this.rounded} w-full ${this.greenBgHover}`;
68
+ this.redBtn = `${this.redBg} ${this.whiteText} ${this.textTitle} ${this.rounded} w-full ${this.redBgHover}`;
69
+ this.blueBtn = `${this.blueBg} ${this.whiteText} ${this.textTitle} ${this.rounded} w-full ${this.blueBgHover}`;
70
+ this.whiteBtn = ` ${this.blackText} ${this.textTitle} ${this.rounded} w-full ${this.blueLightBgHover}`;
71
+ this.blueLightBtn = `${this.blueBgLight} ${this.greyTextLight} ${this.textTitle} ${this.rounded} w-full ${this.blueBgLightHover}`;
72
+
47
73
  // Complex
48
- this.greenBtn = `${this.greenBg} ${this.whiteText} ${this.textTitle} ${this.rounded} w-full`;
74
+ this.flexColNav = 'flex flex-col gap-[10px] px-2 pt-[14px]';
49
75
  }
50
76
  }
@@ -0,0 +1,3 @@
1
+ <template>
2
+ <div class="h-full w-full"><slot></slot></div>
3
+ </template>
@@ -0,0 +1,37 @@
1
+ <template>
2
+ <div class="h-full z-[1]" :class="[$dataStore.hasLayoutMargins ? 'lg:mx-[22px] lg:my-[33px] lg:shadow-xl' : '']">
3
+ <div :class="[$libStyles.greenBg]" class="hidden z-[-1] lg:block absolute left-0 top-0 h-[200px] w-full"></div>
4
+ <section class="flex h-full" :class="$libStyles.blueBgLight">
5
+ <base-menu-nav
6
+ v-if="$dataStore.showNav"
7
+ v-model="$dataStore.menu.selectedItem"
8
+ :selected="$dataStore.menu.selectedItem"
9
+ :title="$dataStore.menu.title ?? 'Страховые продукты'"
10
+ :has-back="$dataStore.menu.hasBack ?? false"
11
+ :back-icon="$dataStore.menu.backIcon ?? 'mdi-arrow-left'"
12
+ :has-more="'hasMore' in $route.meta && $route.meta.hasMore ? !!$route.meta.hasMore : false"
13
+ :hide-more-on-lg="true"
14
+ :class="{
15
+ '!hidden': !$display().lgAndUp.value && !!$dataStore.menu.selectedItem.title,
16
+ }"
17
+ @onBack="$dataStore.menu.onBack"
18
+ @onMore="openSettings"
19
+ @onLink="$dataStore.menu.onLink"
20
+ >
21
+ <template #end>
22
+ <base-loader v-if="$dataStore.menu.loading" class="self-center m-5 opacity-70"></base-loader>
23
+ </template>
24
+ </base-menu-nav>
25
+ <slot> </slot>
26
+ <base-settings-panel></base-settings-panel>
27
+ </section>
28
+ </div>
29
+ </template>
30
+
31
+ <script setup lang="ts">
32
+ const dataStore = useDataStore();
33
+
34
+ const openSettings = async () => {
35
+ dataStore.settings.open = true;
36
+ };
37
+ </script>
@@ -0,0 +1,6 @@
1
+ <template>
2
+ <div class="h-full z-[1]" :class="[$dataStore.hasLayoutMargins ? 'lg:mx-[22px] lg:my-[33px] lg:shadow-xl' : '']">
3
+ <div :class="[$libStyles.greenBg]" class="hidden lg:block absolute z-[-1] left-0 top-0 h-[200px] w-full"></div>
4
+ <slot></slot>
5
+ </div>
6
+ </template>
package/nuxt.config.ts CHANGED
@@ -1,14 +1,33 @@
1
+ import path from 'path';
2
+
1
3
  export default defineNuxtConfig({
2
4
  ssr: false,
3
5
 
4
- modules: [
5
- '@pinia/nuxt',
6
- '@nuxtjs/tailwindcss',
7
- ],
6
+ modules: ['@pinia/nuxt', '@nuxtjs/tailwindcss', '@nuxt/devtools'],
8
7
 
9
8
  imports: {
10
9
  dirs: ['store', 'composables'],
11
10
  },
12
11
 
12
+ vite: {
13
+ resolve: {
14
+ alias: [
15
+ {
16
+ find: '@',
17
+ replacement: path.resolve(__dirname, '.'),
18
+ },
19
+ ],
20
+ },
21
+ vue: {
22
+ template: {
23
+ compilerOptions: {
24
+ isCustomElement: tag => {
25
+ return tag.startsWith('Base');
26
+ },
27
+ },
28
+ },
29
+ },
30
+ },
31
+
13
32
  components: [{ path: './components', prefix: 'Base', pathPrefix: false }],
14
33
  });
package/package.json CHANGED
@@ -1,15 +1,19 @@
1
1
  {
2
2
  "name": "hl-core",
3
- "version": "0.0.7-beta.1",
3
+ "version": "0.0.7-beta.11",
4
4
  "license": "MIT",
5
5
  "private": false,
6
6
  "main": "nuxt.config.ts",
7
7
  "files": [
8
+ "api/",
8
9
  "store/",
10
+ "layouts/",
9
11
  "composables/",
10
12
  "components/",
11
13
  "plugins/",
14
+ "pages/",
12
15
  "nuxt.config.ts",
16
+ "tailwind.config.js",
13
17
  ".prettierrc"
14
18
  ],
15
19
  "scripts": {
@@ -19,16 +23,23 @@
19
23
  "preview": "nuxt preview"
20
24
  },
21
25
  "devDependencies": {
22
- "nuxt": "^3.2.3",
26
+ "@nuxt/devtools": "^0.2.5",
27
+ "nuxt": "^3.3.1",
23
28
  "prettier": "^2.8.4",
24
29
  "typescript": "^4.9.5"
25
30
  },
26
31
  "dependencies": {
27
32
  "@mdi/font": "^7.1.96",
28
- "@nuxtjs/tailwindcss": "^6.4.1",
33
+ "@nuxtjs/tailwindcss": "^6.6.0",
29
34
  "@pinia/nuxt": "^0.4.7",
35
+ "animate.css": "^4.1.1",
36
+ "axios": "^1.3.4",
37
+ "fast-xml-parser": "4.0.12",
38
+ "jwt-decode": "^3.1.2",
39
+ "maska": "1.5.0",
30
40
  "pinia": "^2.0.33",
41
+ "v-idle-3": "^0.3.14",
31
42
  "vue-toastification": "^2.0.0-rc.5",
32
- "vuetify": "^3.1.8"
43
+ "vuetify": "^3.1.10"
33
44
  }
34
45
  }
package/pages/500.vue ADDED
@@ -0,0 +1,48 @@
1
+ <template>
2
+ <base-content class="!w-full flex-col justify-center items-center gap-[100px]" :class="[$libStyles.blueBgLight]">
3
+ <img src="~/assets/logo-clear.svg" class="w-[240px] lg:w-[330px]" draggable="false" />
4
+ <div class="text-center">
5
+ <h2 :class="[$libStyles.blackText]" class="text-[26px] leading-5 mb-5">Сервис временно не доступен</h2>
6
+ <p v-if="errorStack.length" class="mt-4 flex flex-col">
7
+ <span v-for="(error, index) of errorStack" :key="error">
8
+ <i v-if="index !== 0" class="mdi mdi-arrow-right"></i>
9
+ {{ error }}</span
10
+ >
11
+ </p>
12
+ </div>
13
+ <base-btn text="На главную" @click="goBack" class="!w-fit px-14"></base-btn>
14
+ </base-content>
15
+ </template>
16
+
17
+ <script lang="ts">
18
+ export default defineComponent({
19
+ setup() {
20
+ definePageMeta({ layout: 'full' });
21
+
22
+ const dataStore = useDataStore();
23
+ const router = useRouter();
24
+ const route = useRoute();
25
+ const errorStack = ref([] as string[]);
26
+
27
+ onMounted(() => {
28
+ if (route.query && route.query.stack) {
29
+ const queryError = (route.query.stack as string).split(' at ');
30
+ errorStack.value = queryError;
31
+ }
32
+ });
33
+
34
+ const goBack = () => {
35
+ if (dataStore.isEFO) {
36
+ router.push({ name: 'Auth' });
37
+ } else {
38
+ dataStore.sendToParent(constants.postActions.Error500, 500);
39
+ }
40
+ };
41
+
42
+ return {
43
+ errorStack,
44
+ goBack,
45
+ };
46
+ },
47
+ });
48
+ </script>
@@ -1,9 +1,18 @@
1
- import { capitalize } from '../composables';
1
+ import { capitalize, getFullNameShorted, reformatIin } from '../composables';
2
+ import { constants } from '../composables/constants';
3
+ import Vidle from 'v-idle-3';
4
+ import Maska from 'maska';
5
+
6
+ export default defineNuxtPlugin(nuxtApp => {
7
+ nuxtApp.vueApp.use(Vidle, {});
8
+ nuxtApp.vueApp.use(Maska);
2
9
 
3
- export default defineNuxtPlugin(() => {
4
10
  return {
5
11
  provide: {
6
12
  capitalize: capitalize,
13
+ getFullNameShorted: getFullNameShorted,
14
+ reformatIin: reformatIin,
15
+ constants: constants,
7
16
  },
8
17
  };
9
18
  });
@@ -1,4 +1,3 @@
1
- import { useAppStore } from '../store/app.store';
2
1
  import { useDataStore } from '../store/data.store';
3
2
  import { Styles } from '../composables/styles';
4
3
 
@@ -11,7 +10,6 @@ export default defineNuxtPlugin(nuxtApp => {
11
10
 
12
11
  return {
13
12
  provide: {
14
- appStore: useAppStore(),
15
13
  dataStore: useDataStore(),
16
14
  libStyles: new Styles(),
17
15
  t: useDataStore().t,
@@ -1,4 +1,5 @@
1
1
  import '@mdi/font/css/materialdesignicons.css';
2
+ import 'animate.css';
2
3
  import 'vuetify/styles';
3
4
  import { createVuetify } from 'vuetify';
4
5
  import * as components from 'vuetify/components';
@@ -9,6 +10,15 @@ export default defineNuxtPlugin(nuxtApp => {
9
10
  ssr: false,
10
11
  components,
11
12
  directives,
13
+ theme: {
14
+ themes: {
15
+ light: {
16
+ colors: {
17
+ error: '#FF5449',
18
+ },
19
+ },
20
+ },
21
+ },
12
22
  });
13
23
 
14
24
  nuxtApp.vueApp.use(vuetify);