adata-ui 2.0.26 → 2.0.28

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.
@@ -4,8 +4,8 @@ import * as z from 'zod'
4
4
  import { useUIValidation } from '#adata-ui/composables/useUIValidation'
5
5
 
6
6
  const props = defineProps<{
7
- name: string
8
- email: string
7
+ name?: string
8
+ email?: string
9
9
  }>()
10
10
 
11
11
  const emit = defineEmits<{
@@ -16,7 +16,7 @@ const { t } = useI18n()
16
16
 
17
17
  const mask = new Mask({ mask: '# (###) ### ## ##' })
18
18
 
19
- const isOpen = defineModel<boolean>('isOpen', { required: true })
19
+ const isOpen = defineModel<boolean>()
20
20
  const form: any = reactive({
21
21
  name: '',
22
22
  email: '',
@@ -1,19 +1,20 @@
1
1
  <script setup lang="ts">
2
2
  import AdataLogo from '#adata-ui/icons/adata-logo.vue'
3
+ import LinkedinIcon from '#adata-ui/icons/linkedin.vue'
3
4
  import YouTubeIcon from '#adata-ui/icons/socials/youtube.vue'
4
5
  import InstagramIcon from '#adata-ui/icons/socials/instagram.vue'
5
6
  import TelegramIcon from '#adata-ui/icons/socials/telegram.vue'
6
7
  import FaceBookIcon from '#adata-ui/icons/socials/face-book.vue'
7
8
  import TikTokIcon from '#adata-ui/icons/socials/tik-tok.vue'
8
- import LinkedinIcon from '#adata-ui/icons/linkedin.vue'
9
- import FooterAccordion from './ui/footer-acccordion.vue'
10
- import { PAGES } from '#adata-ui/shared/constans/pages'
9
+ import AFooterAccordion from '#adata-ui/components/navigation/footer/ui/a-footer-accordion.vue'
11
10
  import { buildLocalizedUrl } from '#adata-ui/utils/localizedNavigation'
12
- import { useFooterInfoLinks, useFooterNavigationLinks } from '#adata-ui/composables/useHeaderNavigationLinks'
11
+ import { PAGES } from '#adata-ui/shared/constans/pages'
12
+ import { AIconExpandWindow, AIconLocation, AIconMail, AIconPhone } from '#components'
13
13
 
14
- const { myLayer }: any = useAppConfig()
15
- const { t, locale } = useI18n()
16
14
  const year = new Date().getFullYear()
15
+ const { t, locale } = useI18n()
16
+ const { myLayer } = useAppConfig()
17
+ const mode = myLayer.mode
17
18
 
18
19
  const socialMedia = [
19
20
  {
@@ -48,35 +49,212 @@ const socialMedia = [
48
49
  }
49
50
  ]
50
51
 
51
- const info = useFooterInfoLinks()
52
+ const mainLinks = computed(() => ({
53
+ services: {
54
+ title: t('footer.services'),
55
+ link: buildLocalizedUrl(locale.value, `https://${mode}.kz`, PAGES.allServices),
56
+ items: [
57
+ [
58
+ {
59
+ title: t('footer.counterparties.title'),
60
+ link: buildLocalizedUrl(locale.value, `https://pk.${mode}.kz`, ''),
61
+ },
62
+ {
63
+ title: t('footer.fines.title'),
64
+ link: buildLocalizedUrl(locale.value, `https://avto.${mode}.kz`, PAGES.fines.main),
65
+ },
66
+ {
67
+ title: t('footer.work.title'),
68
+ link: `https://work.${mode}.kz` + PAGES.work.vacancy,
69
+ },
70
+ {
71
+ title: t('footer.analytics.title'),
72
+ link: buildLocalizedUrl(locale.value, `https://analytics-new.${mode}.kz`, PAGES.analytics.main),
73
+ },
74
+ {
75
+ title: t('footer.tenders.title'),
76
+ link: `https://tender.${mode}.kz` + PAGES.tender.main,
77
+ }
78
+ ],
79
+ [
80
+ {
81
+ title: t('footer.compliance.title'),
82
+ link: `https://ac.${mode}.kz` + PAGES.compliance.l,
83
+ isNew: true
84
+ },
85
+ {
86
+ title: t('header.products.edo.label'),
87
+ link: `https://edo.${mode}.kz` + PAGES.edo.l,
88
+ isNew: true
89
+ },
90
+ {
91
+ title: t('footer.fea.title'),
92
+ link: buildLocalizedUrl(locale.value, `https://tnved.${mode}.kz`, PAGES.fea.main),
93
+ isNew: true
94
+ },
95
+ ]
96
+ ]
97
+ },
98
+ useful: {
99
+ title: t('footer.useful'),
100
+ link: buildLocalizedUrl(locale.value, `https://${mode}.kz`, PAGES.usefulMain),
101
+ items: [
102
+ [
103
+ {
104
+ title: t('footer.info.api'),
105
+ link: buildLocalizedUrl(locale.value, `https://${mode}.kz`, PAGES.apiDescription),
106
+ },
107
+ {
108
+ title: t('footer.info.userAgreement'),
109
+ link: buildLocalizedUrl(locale.value, `https://${mode}.kz`, PAGES.userAgreement),
110
+ },
111
+ {
112
+ title: t('footer.info.privacyPolicy'),
113
+ link: buildLocalizedUrl(locale.value, `https://${mode}.kz`, PAGES.privacy),
114
+ },
115
+ {
116
+ title: t('footer.info.vacancy'),
117
+ link: buildLocalizedUrl(locale.value, `https://${mode}.kz`, PAGES.vacancy),
118
+ },
119
+ {
120
+ title: t('footer.info.counterparty'),
121
+ link: buildLocalizedUrl(locale.value, `https://pk.${mode}.kz`, PAGES.pk.counterparty),
122
+ },
123
+ ]
124
+ ]
125
+ }
126
+ }))
127
+
128
+ const contactLinks = computed(() => ({
129
+ title: t('footer.contacts.title'),
130
+ link: buildLocalizedUrl(locale.value, `https://${mode}.kz`, PAGES.contacts),
131
+ items: [
132
+ {
133
+ title: t('footer.contacts.address'),
134
+ link: 'https://go.2gis.com/30j2f',
135
+ startIcon: AIconLocation,
136
+ endIcon: null,
137
+ },
138
+ {
139
+ title: '+7 (747) 120 34 67',
140
+ link: 'tel:+77471203467',
141
+ startIcon: AIconPhone,
142
+ endIcon: null,
143
+ },
144
+ {
145
+ title: 'info@adata.kz',
146
+ link: 'mailto:info@adata.kz',
147
+ startIcon: AIconMail,
148
+ endIcon: null,
149
+ },
150
+ {
151
+ title: t('footer.contacts.goToChat'),
152
+ link: 'https://api.whatsapp.com/send?phone=77712289041',
153
+ startIcon: null,
154
+ endIcon: AIconExpandWindow,
155
+ class: 'font-bold',
156
+ },
157
+ ],
158
+ }))
52
159
 
53
- const links = useFooterNavigationLinks()
54
160
  </script>
55
161
 
56
162
  <template>
57
- <div
163
+ <footer
58
164
  id="footer"
59
- class="bg-deepblue-900 dark:bg-gray-900 lg:pt-10"
165
+ class="bg-deepblue-900 dark:bg-gray-900 py-4 lg:py-5 rounded-t-3xl"
60
166
  >
61
- <div class="a-container mobile-padding py-5 text-white">
62
- <adata-logo
63
- filled
64
- :font-controlled="false"
65
- class="mb-8 h-[26px] w-[92px] lg:hidden"
66
- />
67
- <div class="grid gap-5 lg:grid-cols-5 lg:gap-10 xl:grid-cols-6">
68
- <div
69
- v-for="(link, key) in links"
70
- :key="key"
71
- >
72
- <footer-accordion
73
- :content="link.items"
74
- :label="t(link.title)"
75
- :link="link.link.replace(/\/$/, '')"
167
+ <div class="a-container mobile-padding py-5 text-white flex flex-col lg:flex-row justify-between gap-8">
168
+ <div class="flex flex-col gap-8 justify-between">
169
+ <div class="flex flex-col gap-4">
170
+ <adata-logo
171
+ filled
172
+ :font-controlled="false"
173
+ class="shrink-0"
76
174
  />
175
+
176
+ <p class="text-sm">
177
+ {{ t('footer.subtitle') }}
178
+ </p>
179
+
180
+ <div class="hidden lg:flex gap-8">
181
+ <nuxt-link
182
+ v-for="(social, idx) in socialMedia"
183
+ :key="idx"
184
+ target="_blank"
185
+ :to="social.link"
186
+ :aria-label="social.name"
187
+ >
188
+ <span class="visually-hidden"> {{ social.name }}</span>
189
+ <component
190
+ :is="social.icon"
191
+ filled
192
+ :font-controlled="false"
193
+ class="social-icon size-7"
194
+ />
195
+ </nuxt-link>
196
+ </div>
77
197
  </div>
198
+
199
+ <p class="hidden lg:block text-[10px]">
200
+ {{ year }} © {{ t('footer.LLP') }} "Alldata"
201
+ </p>
78
202
  </div>
79
- <div class="flex grow justify-end gap-8 py-5">
203
+
204
+ <div class="flex gap-6 lg:gap-[75px] flex-col lg:flex-row">
205
+ <div class="flex gap-[18px] lg:gap-[75px] flex-col lg:flex-row">
206
+ <div
207
+ v-for="(item, idx) in mainLinks"
208
+ :key="idx"
209
+ >
210
+ <a-footer-accordion
211
+ :label="item.title"
212
+ :link="item?.link?.replace(/\/$/, '')"
213
+ :content="item.items"
214
+ />
215
+ </div>
216
+ </div>
217
+ <!--noindex-->
218
+ <div class="flex flex-col gap-2 items-start" data-nosnippet>
219
+ <nuxt-link
220
+ class="text-sm font-semibold pb-3 pr-4 border-b-[0.5px] border-white cursor-pointer"
221
+ :to="contactLinks.link?.replace(/\/$/, '')"
222
+ >
223
+ {{ contactLinks.title }}
224
+ </nuxt-link>
225
+
226
+ <div class="flex flex-col gap-3 lg:gap-2">
227
+ <div
228
+ v-for="(link, idx) in contactLinks.items"
229
+ :key="idx"
230
+ class="flex gap-2 items-center"
231
+ >
232
+ <nuxt-link
233
+ class="text-xs font-medium flex gap-2 items-center cursor-pointer"
234
+ :class="link.class"
235
+ :to="link.link?.replace(/\/$/, '')"
236
+ >
237
+ <component
238
+ :is="link.startIcon"
239
+ v-if="link.startIcon"
240
+ class="size-4 shrink-0"
241
+ />
242
+
243
+ <p>{{ link.title }}</p>
244
+
245
+ <component
246
+ :is="link.endIcon"
247
+ v-if="link.endIcon"
248
+ class="size-4 shrink-0"
249
+ />
250
+ </nuxt-link>
251
+ </div>
252
+ </div>
253
+ </div>
254
+ <!--/noindex-->
255
+ </div>
256
+
257
+ <div class="lg:hidden flex gap-8 flex-wrap">
80
258
  <nuxt-link
81
259
  v-for="(social, idx) in socialMedia"
82
260
  :key="idx"
@@ -88,39 +266,14 @@ const links = useFooterNavigationLinks()
88
266
  :is="social.icon"
89
267
  filled
90
268
  :font-controlled="false"
91
- class="social-icon h-[28px] w-[28px]"
269
+ class="social-icon size-7"
92
270
  />
93
271
  </nuxt-link>
94
272
  </div>
273
+
274
+ <p class="lg:hidden text-[10px]">
275
+ {{ year }} © {{ t('footer.LLP') }} "Alldata"
276
+ </p>
95
277
  </div>
96
- <div class="relative">
97
- <div class="a-container mobile-padding py-5">
98
- <div
99
- class="flex flex-col gap-10 text-xs text-white before:absolute before:left-0 before:top-0 before:h-[0.5px] before:w-full before:bg-white lg:flex-row lg:items-center lg:gap-5"
100
- >
101
- <div class="flex flex-col gap-4 lg:flex-row lg:gap-6">
102
- <nuxt-link-locale
103
- v-for="(item, idx) in info"
104
- :key="idx"
105
- target="_blank"
106
- class="text-[10px]"
107
- :to="item.link"
108
- >
109
- {{ t(item.title) }}
110
- </nuxt-link-locale>
111
- </div>
112
- <div class="flex justify-center lg:grow lg:items-center lg:justify-end lg:gap-4">
113
- <div class="flex flex-col gap-1">
114
- <span>{{ year }} © {{ t('footer.LLP') }} "Alldata"</span>
115
- </div>
116
- <adata-logo
117
- filled
118
- :font-controlled="false"
119
- class="hidden h-[26px] w-[92px] lg:block"
120
- />
121
- </div>
122
- </div>
123
- </div>
124
- </div>
125
- </div>
278
+ </footer>
126
279
  </template>
@@ -16,8 +16,6 @@ const props = defineProps<Props>()
16
16
 
17
17
  const isDesktop = useMediaQuery('(max-width: 1024px)')
18
18
 
19
- const { t } = useI18n()
20
-
21
19
  const open = ref(false)
22
20
  function toFinalValues(el: HTMLDivElement) {
23
21
  el.style.height = el.scrollHeight + 'px'
@@ -46,7 +44,7 @@ const filterCheck = computed(() => {
46
44
  :class="{ 'cursor-pointer': link }"
47
45
  :to="link?.replace(/\/$/, '')"
48
46
  >
49
- {{ t(label) }}
47
+ {{ label }}
50
48
  </nuxt-link>
51
49
 
52
50
  <div class="transition-all lg:hidden cursor-pointer">
@@ -85,7 +83,7 @@ const filterCheck = computed(() => {
85
83
  class="text-xs lg:font-medium flex gap-2 items-center cursor-pointer"
86
84
  :to="link.link?.replace(/\/$/, '')"
87
85
  >
88
- {{ t(link.title) }}
86
+ {{ link.title }}
89
87
  </nuxt-link>
90
88
 
91
89
  <div
@@ -11,7 +11,7 @@
11
11
  class="flex flex-col gap-2 "
12
12
  >
13
13
  <div class="heading-04">
14
- {{ t(item.title) }}
14
+ {{ item.title }}
15
15
  </div>
16
16
  <a
17
17
  class="flex items-center gap-1 text-deepblue-900 dark:text-white"
@@ -22,7 +22,7 @@
22
22
  class="shrink-0"
23
23
  />
24
24
  <div class=" body-400">
25
- {{ t(item.subtitle) }}
25
+ {{ item.subtitle }}
26
26
  </div>
27
27
  </a>
28
28
  </div>
@@ -61,7 +61,7 @@
61
61
  target="_blank"
62
62
  >
63
63
  <div class="body-400 line-clamp-1 text-blue-600">
64
- {{ t(link.subtitle) }}
64
+ {{ link.subtitle }}
65
65
  </div>
66
66
  <component
67
67
  :is="link.icon"
@@ -105,33 +105,33 @@ import {useContacts} from "#adata-ui/composables/projectState";
105
105
 
106
106
  const {t} = useI18n()
107
107
  const contacts = ref(useContacts())
108
- const AlmatyItems = [
108
+ const AlmatyItems = computed(() => ([
109
109
  {
110
- title: 'header.contacts.almaty.adress.title',
111
- subtitle: 'header.contacts.almaty.adress.subtitle',
110
+ title: t('header.contacts.almaty.adress.title'),
111
+ subtitle: t('header.contacts.almaty.adress.subtitle'),
112
112
  icon: Location,
113
113
  to: 'https://yandex.kz/maps/ru/org/avrora_kholding/1099794306/?ll=76.912479%2C43.208928&z=17.72'
114
114
  },
115
115
  {
116
- title: 'header.contacts.almaty.email.title',
116
+ title: t('header.contacts.almaty.email.title'),
117
117
  subtitle: 'info@adata.kz',
118
118
  icon: Mail,
119
119
  to: 'mailto:info@adata.kz'
120
120
  },
121
121
  {
122
- title: 'header.contacts.almaty.schedule.title',
123
- subtitle: 'header.contacts.almaty.schedule.subtitle',
122
+ title: t('header.contacts.almaty.schedule.title'),
123
+ subtitle: t('header.contacts.almaty.schedule.subtitle'),
124
124
  icon: Clock,
125
125
  },
126
- ]
126
+ ]))
127
127
 
128
- const technicalSupport = [
128
+ const technicalSupport = computed(() => ([
129
129
  {
130
- subtitle: 'header.contacts.almaty.support.linkTitle',
130
+ subtitle: t('header.contacts.almaty.support.linkTitle'),
131
131
  icon: ExpandWindow,
132
132
  to: "https://api.whatsapp.com/send/?phone=77712289041"
133
133
  }
134
- ]
134
+ ]))
135
135
 
136
136
  const newContacts = computed(()=> contacts.value.map(item => ({
137
137
  subtitle: item.contact,
@@ -8,7 +8,7 @@
8
8
  <div class="xl:grid grid-cols-2 grid-rows-3 flex flex-wrap gap-4 ">
9
9
  <div v-for="(item, index) in AstanaItems" class="flex flex-col gap-2 " :class="{'col-span-2':index===0 }">
10
10
  <div class="heading-04">
11
- {{ t(item.title) }}
11
+ {{ item.title }}
12
12
  </div>
13
13
  <a
14
14
  class="flex items-center gap-1 text-deepblue-900 dark:text-white"
@@ -17,7 +17,7 @@
17
17
  >
18
18
  <component :is="item.icon"/>
19
19
  <div class=" body-400">
20
- {{ t(item.subtitle) }}
20
+ {{ item.subtitle }}
21
21
  </div>
22
22
  </a>
23
23
  </div>
@@ -35,31 +35,31 @@ import Clock from "#adata-ui/icons/clock.vue";
35
35
  import Whatsapp from "#adata-ui/icons/whatsapp.vue";
36
36
 
37
37
  const {t} = useI18n()
38
- const AstanaItems = [
38
+ const AstanaItems = computed(() => ([
39
39
  {
40
- title: 'header.contacts.astana.adress.title',
41
- subtitle: 'header.contacts.astana.adress.subtitle',
40
+ title: t('header.contacts.astana.adress.title'),
41
+ subtitle: t('header.contacts.astana.adress.subtitle'),
42
42
  icon: Location,
43
43
  to: 'https://yandex.kz/maps/ru/org/adata_consulting/214484722242/?ll=71.429573%2C51.131319&z=20.56'
44
44
  },
45
45
  {
46
- title: 'header.contacts.astana.email.title',
46
+ title: t('header.contacts.astana.email.title'),
47
47
  subtitle: 'info@adata-c.kz',
48
48
  icon: Mail,
49
49
  to: 'mailto:info@adata-c.kz'
50
50
  },
51
51
  {
52
- title: 'header.contacts.astana.schedule.title',
53
- subtitle: 'header.contacts.astana.schedule.subtitle',
52
+ title: t('header.contacts.astana.schedule.title'),
53
+ subtitle: t('header.contacts.astana.schedule.subtitle'),
54
54
  icon: Clock,
55
55
  },
56
56
  {
57
- title: 'header.contacts.astana.sellDep.title',
57
+ title: t('header.contacts.astana.sellDep.title'),
58
58
  subtitle: '+7 700 744 00 10',
59
59
  icon: Whatsapp,
60
60
  to: "https://api.whatsapp.com/send/?phone=77007440010"
61
61
  },
62
- ]
62
+ ]))
63
63
  </script>
64
64
 
65
65
  <style scoped>
@@ -1,33 +1,4 @@
1
1
  <script setup lang="ts">
2
- import NavCard from '#adata-ui/components/navigation/header/NavCard.vue'
3
- import { PAGES } from '#adata-ui/shared/constans/pages'
4
- import ListItem from '#adata-ui/components/navigation/header/ListItem.vue'
5
- import IconSearch from '#adata-ui/icons/search.vue'
6
- import IconUsers from '#adata-ui/icons/users.vue'
7
- import IconScales from '#adata-ui/icons/scales/scale.vue'
8
- import IconLink from '#adata-ui/icons/link-chain.vue'
9
- import IconArrowCircle from '#adata-ui/icons/arrow/arrow-circle-down.vue'
10
- import IconBlock from '#adata-ui/icons/block.vue'
11
- import IconDollar from '#adata-ui/icons/currency/currency-dollar.vue'
12
- import IconWork from '#adata-ui/icons/work-bag.vue'
13
- import IconDocument from '#adata-ui/icons/hdocument.vue'
14
- import IconCheck from '#adata-ui/icons/hcheck.vue'
15
- import IconCalc from '#adata-ui/icons/calculator.vue'
16
- import IconGlobe from '#adata-ui/icons/globe.vue'
17
- import IconFile from '#adata-ui/icons/file/file.vue'
18
- import IconCheckCircle from '#adata-ui/icons/check/check-circle.vue'
19
- import IconCar from '#adata-ui/icons/car.vue'
20
- import IconTruck from '#adata-ui/icons/truck.vue'
21
- import IconArrowGraph from '#adata-ui/icons/arrow/arrow-graph-up.vue'
22
- import IconMedal from '#adata-ui/icons/medal.vue'
23
- import IconHandshake from '#adata-ui/icons/handshake.vue'
24
- import IconClipboardText from '#adata-ui/icons/clipboard-text.vue'
25
- import IconUsersFocus from '#adata-ui/icons/users-focus.vue'
26
- import IconCompany from '#adata-ui/icons/company.vue'
27
- import IconProfile from '#adata-ui/icons/profile.vue'
28
- import Connections from '#adata-ui/icons/sviazi.vue'
29
-
30
- import { useCurrentModule } from '#adata-ui/composables/projectState'
31
2
  import { useHeaderNavigationLinks } from '#adata-ui/composables/useHeaderNavigationLinks'
32
3
  import NavList from '#adata-ui/components/navigation/header/NavList.vue'
33
4
  import CardGallery from '#adata-ui/components/navigation/header/CardGallery.vue'
@@ -46,55 +17,9 @@ const props = withDefaults(
46
17
  )
47
18
 
48
19
  defineEmits(['outerClick', 'mouseOver'])
49
- const { myLayer }: any = useAppConfig()
50
- const colorMode = useColorMode()
51
- const activeTab = ref(useCurrentModule().value)
52
- const localePath = useLocalePath()
53
-
54
- const { t, locale } = useI18n()
55
20
 
56
21
  const pageUrl = useRequestURL()
57
-
58
- const allImages = computed(() => {
59
- if (activeTab.value === 'pk' || activeTab.value === 'counterparty') {
60
- return colorMode.value === 'dark'
61
- ? `/mode/dark-pk-${locale.value}.webp`
62
- : `/mode/light-pk-${locale.value}.webp`
63
- }
64
- if (activeTab.value === 'work') {
65
- return colorMode.value === 'dark'
66
- ? `/mode/dark-work-${locale.value}.webp`
67
- : `/mode/light-work-${locale.value}.webp`
68
- }
69
- if (activeTab.value === 'tenders') {
70
- return colorMode.value === 'dark'
71
- ? `/mode/dark-tenders-${locale.value}.webp`
72
- : `/mode/light-tenders-${locale.value}.webp`
73
- }
74
- if (activeTab.value === 'fines') {
75
- return colorMode.value === 'dark'
76
- ? `/mode/dark-fines-${locale.value}.webp`
77
- : `/mode/light-fines-${locale.value}.webp`
78
- }
79
- if (activeTab.value === 'analytics') {
80
- return colorMode.value === 'dark'
81
- ? `/mode/dark-analytics-${locale.value}.webp`
82
- : `/mode/light-analytics-${locale.value}.webp`
83
- }
84
- if (activeTab.value === 'fea') {
85
- return colorMode.value === 'dark'
86
- ? `/mode/dark-fea-${locale.value}.webp`
87
- : `/mode/light-fea-${locale.value}.webp`
88
- }
89
- if (activeTab.value === 'compliance') {
90
- return colorMode.value === 'dark'
91
- ? `/mode/dark-complience-${locale.value}.webp`
92
- : `/mode/light-complience-${locale.value}.webp`
93
- }
94
- })
95
-
96
22
  const filteredItems = useHeaderNavigationLinks()
97
- const someHovered = ref(false)
98
23
 
99
24
  function isCurrentModule(currentModule: string) {
100
25
  if (currentModule === 'fines') return 'avto'