adata-ui 2.1.40-beta.11 → 2.1.40-beta.13

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 (133) hide show
  1. package/assets/styles/index.scss +67 -5
  2. package/components/elements/a-select-row/ASelectRowV2.vue +8 -8
  3. package/components/elements/a-select-row/index.vue +3 -5
  4. package/components/elements/accordion/AAccordion.vue +5 -3
  5. package/components/elements/accordion/AAccordionGroup/AAccordionGroup.vue +3 -3
  6. package/components/elements/alert/AAlert.vue +34 -47
  7. package/components/elements/bg-block/ABgBlock.vue +1 -1
  8. package/components/elements/button/AButton.vue +3 -3
  9. package/components/elements/button/AButtonV2.vue +7 -5
  10. package/components/elements/button-login/index.vue +1 -1
  11. package/components/elements/chip-wrapper/AChipWrapper.vue +1 -1
  12. package/components/elements/chips/AChips.vue +2 -2
  13. package/components/elements/digit-badge/ADigitBadge.vue +21 -19
  14. package/components/elements/feature-description/AFeatureDescription.vue +1 -1
  15. package/components/elements/leave-note/ALeaveNote.vue +1 -1
  16. package/components/elements/pagination/APagination.vue +7 -7
  17. package/components/elements/segmented/ASegmentedV2.vue +103 -10
  18. package/components/elements/select/ASelect.vue +4 -4
  19. package/components/elements/select/ASelectMobile.vue +2 -2
  20. package/components/elements/select/ASelectV2.vue +10 -11
  21. package/components/elements/select/ui/select-button.vue +1 -1
  22. package/components/elements/status-badge/AStatusBadge.vue +22 -19
  23. package/components/elements/status-badge-v2/StatusBadgeV2.vue +1 -3
  24. package/components/elements/table/ATable.vue +1 -1
  25. package/components/elements/table/table.config.ts +2 -2
  26. package/components/elements/tree-select/ATreeSelect.vue +97 -113
  27. package/components/elements/tree-select/TreeService.ts +142 -207
  28. package/components/elements/tree-select/components/ATreeSelectNode.vue +104 -0
  29. package/components/elements/tree-select/types.ts +40 -11
  30. package/components/elements/tree-select/utils.ts +30 -0
  31. package/components/elements/tree-select-modal/ATreeSelectModal.vue +217 -0
  32. package/components/features/color-mode/AColorMode.client.vue +1 -1
  33. package/components/features/dropdown/ADropdownV2.vue +1 -2
  34. package/components/features/lang-switcher/lang-switcher.vue +9 -4
  35. package/components/features/payment/banner/BasicPlusLimitBanner.vue +3 -3
  36. package/components/features/payment/banner/PaymentBanner.vue +3 -3
  37. package/components/features/payment/banner/UpSellBanner.vue +3 -3
  38. package/components/features/payment/process/PaymentKaspiQrSidePanel.vue +3 -3
  39. package/components/features/payment/process/PaymentKaspiRedirectSidePanel.vue +1 -1
  40. package/components/features/payment/process/PaymentMethodSidePanel.vue +3 -3
  41. package/components/features/payment/process/PaymentTopUpSidePanel.vue +2 -2
  42. package/components/features/pk-mobile-services/APkMobileServices.vue +1 -1
  43. package/components/features//321/201hange-version/AChangeVersion.vue +2 -2
  44. package/components/forms/checkbox/ACheckbox.vue +1 -1
  45. package/components/forms/checkbox/ACheckboxV2.vue +5 -5
  46. package/components/forms/input/AInputV2.vue +4 -4
  47. package/components/forms/input/date/AInputDate.vue +2 -2
  48. package/components/forms/input/password/AInputPassword.vue +8 -2
  49. package/components/forms/input/standard/AInputStandard.vue +3 -3
  50. package/components/forms/input/textarea/ATextarea.vue +2 -2
  51. package/components/forms/toggle/AToggle.vue +2 -3
  52. package/components/forms/toggle/AToggleV2.vue +3 -3
  53. package/components/modals/AnotherDeviceModal.vue +1 -1
  54. package/components/modals/ContactsMobileModel.vue +1 -1
  55. package/components/modals/ContentNavigationModal.vue +3 -3
  56. package/components/modals/Insufficient-funds-modal.vue +1 -1
  57. package/components/modals/PaymentMethodModal.vue +1 -1
  58. package/components/modals/id/IdBanner.vue +3 -3
  59. package/components/modals/id/IdRecoveryModal.vue +1 -1
  60. package/components/navigation/breadcrumbs/ABreadcrumbs.vue +106 -45
  61. package/components/navigation/breadcrumbs/types.ts +3 -0
  62. package/components/navigation/footer/AFooter.vue +39 -40
  63. package/components/navigation/footer/ui/a-footer-accordion.vue +9 -9
  64. package/components/navigation/header/AHeader.vue +2 -4
  65. package/components/navigation/header/AlmatyContacts.vue +78 -78
  66. package/components/navigation/header/CardGallery.vue +4 -4
  67. package/components/navigation/header/HeaderUsage.vue +29 -15
  68. package/components/navigation/header/ListItem.vue +2 -2
  69. package/components/navigation/header/NavCard.vue +1 -1
  70. package/components/navigation/header/NavList.vue +2 -2
  71. package/components/navigation/header/NotificationsMenu.vue +2 -3
  72. package/components/navigation/header/ProductMenu.vue +1 -1
  73. package/components/navigation/header/ProfileMenu.vue +26 -35
  74. package/components/navigation/header/SystemNotification.vue +1 -3
  75. package/components/navigation/pill-tabs/APillTabs.vue +2 -2
  76. package/components/navigation/pill-tabs/APillTabsV2.vue +5 -5
  77. package/components/overlays/drawer/ADrawerV2.vue +335 -0
  78. package/components/overlays/modal/AModal.vue +4 -4
  79. package/components/overlays/modal/AModalV2.vue +10 -4
  80. package/components/overlays/side-panel/ASidePanel.vue +6 -6
  81. package/components/overlays/sideover/ASlideover.vue +6 -6
  82. package/components/overlays/tooltip/ATooltip.vue +1 -1
  83. package/components/overlays/tooltip/ATooltipV2.vue +2 -12
  84. package/components/transitions/ATransitionHeight.vue +1 -1
  85. package/composables/useHeaderNavigationLinks.ts +100 -94
  86. package/icons/archive.vue +16 -0
  87. package/icons/arrow/arrows-in.vue +11 -0
  88. package/icons/arrow/arrows-out.vue +11 -0
  89. package/icons/arrow/arrows-resize-in.vue +38 -0
  90. package/icons/arrow/arrows-resize-out.vue +17 -0
  91. package/icons/bot.vue +52 -0
  92. package/icons/clock-time.vue +24 -0
  93. package/icons/compare-outlined.vue +8 -0
  94. package/icons/dots-horizontal.vue +31 -0
  95. package/icons/download-line.vue +13 -0
  96. package/icons/egov.vue +41 -0
  97. package/icons/elicense.vue +38 -0
  98. package/icons/favourite-bookmark-outline.vue +17 -0
  99. package/icons/file-pen.vue +31 -0
  100. package/icons/file-stack.vue +31 -0
  101. package/icons/file-types/excel.vue +131 -0
  102. package/icons/file-types/html.vue +13 -0
  103. package/icons/file-types/jpeg.vue +16 -0
  104. package/icons/file-types/pdf.vue +11 -0
  105. package/icons/file-types/png.vue +11 -0
  106. package/icons/file-types/rar.vue +11 -0
  107. package/icons/file-types/word.vue +50 -0
  108. package/icons/file-types/zip.vue +11 -0
  109. package/icons/git-compare.vue +38 -0
  110. package/icons/graduation-cap.vue +31 -0
  111. package/icons/graph-loading.vue +34 -0
  112. package/icons/help-question-circle.vue +26 -0
  113. package/icons/in-row-type.vue +46 -0
  114. package/icons/in-table-type.vue +29 -0
  115. package/icons/message-dotted.vue +30 -0
  116. package/icons/notification-error.vue +17 -0
  117. package/icons/person.vue +22 -0
  118. package/icons/settings.vue +26 -0
  119. package/icons/shield-alert.vue +31 -0
  120. package/icons/socials/facebook-color.vue +16 -0
  121. package/icons/socials/globe-color.vue +16 -0
  122. package/icons/socials/instagram-color.vue +46 -0
  123. package/icons/socials/linkedin-color.vue +14 -0
  124. package/icons/socials/telegram-color.vue +16 -0
  125. package/icons/socials/tiktok-color.vue +14 -0
  126. package/icons/socials/vk-color.vue +16 -0
  127. package/icons/socials/youtube-color.vue +16 -0
  128. package/icons/view-eye-open.vue +13 -0
  129. package/package.json +1 -1
  130. package/plugins/toast.client.ts +38 -55
  131. package/tailwind.config.ts +147 -116
  132. package/utils/twMerge.ts +34 -0
  133. package/components/elements/tree-select/components/tree-select-nodes.vue +0 -91
@@ -1,16 +1,16 @@
1
1
  <script setup lang="ts">
2
+ import AFooterAccordion from '#adata-ui/components/navigation/footer/ui/a-footer-accordion.vue'
3
+ import { useUrls } from '#adata-ui/composables/useUrls'
2
4
  import AdataLogo from '#adata-ui/icons/adata-logo.vue'
3
5
  import LinkedinIcon from '#adata-ui/icons/linkedin.vue'
4
- import YouTubeIcon from '#adata-ui/icons/socials/youtube.vue'
6
+ import FaceBookIcon from '#adata-ui/icons/socials/face-book.vue'
5
7
  import InstagramIcon from '#adata-ui/icons/socials/instagram.vue'
6
8
  import TelegramIcon from '#adata-ui/icons/socials/telegram.vue'
7
- import FaceBookIcon from '#adata-ui/icons/socials/face-book.vue'
8
9
  import TikTokIcon from '#adata-ui/icons/socials/tik-tok.vue'
9
- import AFooterAccordion from '#adata-ui/components/navigation/footer/ui/a-footer-accordion.vue'
10
- import { buildLocalizedUrl } from '#adata-ui/utils/localizedNavigation'
10
+ import YouTubeIcon from '#adata-ui/icons/socials/youtube.vue'
11
11
  import { PAGES } from '#adata-ui/shared/constans/pages'
12
+ import { buildLocalizedUrl } from '#adata-ui/utils/localizedNavigation'
12
13
  import { AIconExpandWindow, AIconLocation, AIconMail, AIconPhone } from '#components'
13
- import { useUrls } from '#adata-ui/composables/useUrls'
14
14
 
15
15
  const year = new Date().getFullYear()
16
16
  const { t, locale } = useI18n()
@@ -20,33 +20,33 @@ const socialMedia = [
20
20
  {
21
21
  icon: LinkedinIcon,
22
22
  link: 'https://www.linkedin.com/company/adata-kz/?viewAsMember=true',
23
- name: 'Linkedin'
23
+ name: 'Linkedin',
24
24
  },
25
25
  {
26
26
  icon: YouTubeIcon,
27
27
  link: 'https://www.youtube.com/channel/UCPkbtgwgTZbMJXjmTi3R8Uw/featured',
28
- name: 'YouTube'
28
+ name: 'YouTube',
29
29
  },
30
30
  {
31
31
  icon: InstagramIcon,
32
32
  link: 'https://www.instagram.com/adata.kz/?igshid=253i4qxg3els',
33
- name: 'Instagram'
33
+ name: 'Instagram',
34
34
  },
35
35
  {
36
36
  icon: TelegramIcon,
37
37
  link: 'https://t.me/adatakz_official',
38
- name: 'Telegram'
38
+ name: 'Telegram',
39
39
  },
40
40
  {
41
41
  icon: FaceBookIcon,
42
42
  link: 'https://www.facebook.com/adata.kz',
43
- name: 'Facebook'
43
+ name: 'Facebook',
44
44
  },
45
45
  {
46
46
  icon: TikTokIcon,
47
47
  link: 'https://www.tiktok.com/@adata.kz?lang=ru-RU',
48
- name: 'Tiktok'
49
- }
48
+ name: 'Tiktok',
49
+ },
50
50
  ]
51
51
 
52
52
  const mainLinks = computed(() => ({
@@ -74,27 +74,27 @@ const mainLinks = computed(() => ({
74
74
  {
75
75
  title: t('footer.zakupki.title'),
76
76
  link: urls.zakupki + PAGES.tender.main,
77
- isNew: true
78
- }
77
+ isNew: true,
78
+ },
79
79
  ],
80
80
  [
81
81
  {
82
82
  title: t('footer.compliance.title'),
83
83
  link: buildLocalizedUrl(locale.value, urls.compliance, PAGES.compliance.l),
84
- isNew: true
84
+ isNew: true,
85
85
  },
86
86
  {
87
87
  title: t('header.products.edo.label'),
88
88
  link: urls.edo_docs,
89
- isNew: true
89
+ isNew: true,
90
90
  },
91
91
  {
92
92
  title: t('footer.fea.title'),
93
93
  link: buildLocalizedUrl(locale.value, urls.tnved, PAGES.fea.main),
94
- isNew: true
94
+ isNew: true,
95
95
  },
96
- ]
97
- ]
96
+ ],
97
+ ],
98
98
  },
99
99
  useful: {
100
100
  title: t('footer.useful'),
@@ -123,11 +123,11 @@ const mainLinks = computed(() => ({
123
123
  },
124
124
  {
125
125
  title: t('footer.info.onlineServices'),
126
- link: buildLocalizedUrl(locale.value, urls.pk, PAGES.services + '/taxpayer'),
126
+ link: buildLocalizedUrl(locale.value, urls.pk, `${PAGES.services}/taxpayer`),
127
127
  },
128
- ]
129
- ]
130
- }
128
+ ],
129
+ ],
130
+ },
131
131
  }))
132
132
 
133
133
  const contactLinks = computed(() => ({
@@ -161,16 +161,15 @@ const contactLinks = computed(() => ({
161
161
  },
162
162
  ],
163
163
  }))
164
-
165
164
  </script>
166
165
 
167
166
  <template>
168
167
  <footer
169
168
  id="footer"
170
- class="bg-deepblue-900 dark:bg-gray-900 py-4 lg:py-5 rounded-t-3xl"
169
+ class="rounded-t-2xl bg-deepblue-900 py-4 dark:bg-gray-900 lg:py-5"
171
170
  >
172
- <div class="a-container mobile-padding py-5 text-white flex flex-col lg:flex-row justify-between gap-8">
173
- <div class="flex flex-col gap-8 justify-between">
171
+ <div class="a-container mobile-padding flex flex-col justify-between gap-8 py-5 text-white lg:flex-row">
172
+ <div class="flex flex-col justify-between gap-8">
174
173
  <div class="flex flex-col gap-4">
175
174
  <adata-logo
176
175
  filled
@@ -178,11 +177,11 @@ const contactLinks = computed(() => ({
178
177
  class="shrink-0"
179
178
  />
180
179
 
181
- <p class="text-sm">
180
+ <p class="text-body-md">
182
181
  {{ t('footer.subtitle') }}
183
182
  </p>
184
183
 
185
- <div class="hidden lg:flex gap-8">
184
+ <div class="hidden gap-8 lg:flex">
186
185
  <nuxt-link
187
186
  v-for="(social, idx) in socialMedia"
188
187
  :key="idx"
@@ -201,13 +200,13 @@ const contactLinks = computed(() => ({
201
200
  </div>
202
201
  </div>
203
202
 
204
- <p class="hidden lg:block text-[10px]">
203
+ <p class="hidden text-body-sm lg:block">
205
204
  {{ year }} © {{ t('footer.LLP') }} "Alldata"
206
205
  </p>
207
206
  </div>
208
207
 
209
- <div class="flex gap-6 lg:gap-[75px] flex-col lg:flex-row">
210
- <div class="flex gap-[18px] lg:gap-[75px] flex-col lg:flex-row">
208
+ <div class="flex flex-col gap-6 lg:flex-row lg:gap-[75px]">
209
+ <div class="flex flex-col gap-[18px] lg:flex-row lg:gap-[75px]">
211
210
  <div
212
211
  v-for="(item, idx) in mainLinks"
213
212
  :key="idx"
@@ -219,10 +218,10 @@ const contactLinks = computed(() => ({
219
218
  />
220
219
  </div>
221
220
  </div>
222
- <!--noindex-->
223
- <div class="flex flex-col gap-2 items-start" data-nosnippet>
221
+ <!-- noindex -->
222
+ <div class="flex flex-col items-start gap-2" data-nosnippet>
224
223
  <nuxt-link
225
- class="text-sm font-semibold pb-3 pr-4 border-b-[0.5px] border-white cursor-pointer"
224
+ class="cursor-pointer border-b-[0.5px] border-white pb-3 pr-4 text-body-md-strong"
226
225
  :to="contactLinks.link?.replace(/\/$/, '')"
227
226
  >
228
227
  {{ contactLinks.title }}
@@ -232,10 +231,10 @@ const contactLinks = computed(() => ({
232
231
  <div
233
232
  v-for="(link, idx) in contactLinks.items"
234
233
  :key="idx"
235
- class="flex gap-2 items-center"
234
+ class="flex items-center gap-2"
236
235
  >
237
236
  <nuxt-link
238
- class="text-xs font-medium flex gap-2 items-center cursor-pointer"
237
+ class="flex cursor-pointer items-center gap-2 text-body-sm-medium"
239
238
  :class="link.class"
240
239
  :to="link.link?.replace(/\/$/, '')"
241
240
  >
@@ -256,10 +255,10 @@ const contactLinks = computed(() => ({
256
255
  </div>
257
256
  </div>
258
257
  </div>
259
- <!--/noindex-->
258
+ <!-- /noindex -->
260
259
  </div>
261
260
 
262
- <div class="lg:hidden flex gap-8 flex-wrap">
261
+ <div class="flex flex-wrap gap-8 lg:hidden">
263
262
  <nuxt-link
264
263
  v-for="(social, idx) in socialMedia"
265
264
  :key="idx"
@@ -276,7 +275,7 @@ const contactLinks = computed(() => ({
276
275
  </nuxt-link>
277
276
  </div>
278
277
 
279
- <p class="lg:hidden text-[10px]">
278
+ <p class="text-body-sm lg:hidden">
280
279
  {{ year }} © {{ t('footer.LLP') }} "Alldata"
281
280
  </p>
282
281
  </div>
@@ -18,7 +18,7 @@ const isDesktop = useMediaQuery('(max-width: 1024px)')
18
18
 
19
19
  const open = ref(false)
20
20
  function toFinalValues(el: HTMLDivElement) {
21
- el.style.height = el.scrollHeight + 'px'
21
+ el.style.height = `${el.scrollHeight}px`
22
22
  el.style.opacity = '1'
23
23
  }
24
24
 
@@ -37,17 +37,17 @@ const filterCheck = computed(() => {
37
37
  </script>
38
38
 
39
39
  <template>
40
- <div class="flex flex-col gap-2 items-start">
41
- <div class="flex gap-2 justify-between w-full">
40
+ <div class="flex flex-col items-start gap-2">
41
+ <div class="flex w-full justify-between gap-2">
42
42
  <nuxt-link
43
- class="text-sm font-semibold lg:pb-3 lg:pr-4 lg:border-b-[0.5px] lg:border-white cursor-default"
43
+ class="cursor-default text-body-md-strong lg:border-b-[0.5px] lg:border-white lg:pb-3 lg:pr-4"
44
44
  :class="{ 'cursor-pointer': link }"
45
45
  :to="link?.replace(/\/$/, '')"
46
46
  >
47
47
  {{ label }}
48
48
  </nuxt-link>
49
49
 
50
- <div class="transition-all lg:hidden cursor-pointer">
50
+ <div class="cursor-pointer transition-all lg:hidden">
51
51
  <a-icon-chevron-down
52
52
  v-if="content.length"
53
53
  filled
@@ -67,7 +67,7 @@ const filterCheck = computed(() => {
67
67
  >
68
68
  <div
69
69
  v-if="filterCheck"
70
- class="flex gap-3 lg:gap-6 flex-col lg:flex-row"
70
+ class="flex flex-col gap-3 lg:flex-row lg:gap-6"
71
71
  >
72
72
  <div
73
73
  v-for="(subItem, subIdx) in content"
@@ -77,10 +77,10 @@ const filterCheck = computed(() => {
77
77
  <div
78
78
  v-for="(link, idx) in subItem"
79
79
  :key="idx"
80
- class="flex gap-2 items-center"
80
+ class="flex items-center gap-2"
81
81
  >
82
82
  <nuxt-link
83
- class="text-xs lg:font-medium flex gap-2 items-center cursor-pointer"
83
+ class="flex cursor-pointer items-center gap-2 text-body-sm lg:font-medium"
84
84
  :to="link.link?.replace(/\/$/, '')"
85
85
  >
86
86
  {{ link.title }}
@@ -88,7 +88,7 @@ const filterCheck = computed(() => {
88
88
 
89
89
  <div
90
90
  v-if="link.isNew"
91
- class="text-[9px] font-bold px-1 py-[2px] rounded-sm bg-white/20"
91
+ class="rounded-xs bg-white/20 px-1 py-[2px] text-body-sm font-bold"
92
92
  >
93
93
  NEW
94
94
  </div>
@@ -56,8 +56,6 @@ const langIsOn = myLayer.langIsOn
56
56
  const contacts = useContacts()
57
57
  const { loginModal } = useIdModals()
58
58
 
59
- // Anchor the navigation mega-menu to the actual bottom of the header bar so it
60
- // stays aligned even when the system-notification banner is shown above it.
61
59
  const headerRef = ref<HTMLElement | null>(null)
62
60
  const { bottom: headerBottom } = useElementBounding(headerRef)
63
61
 
@@ -142,7 +140,7 @@ onMounted(() => {
142
140
  @click="$emit('search')"
143
141
  >
144
142
  <a-icon-search class="text-gray-400 dark:text-gray-500" />
145
- <span class="body-400 text-gray-500 dark:text-gray-400">{{ t('header.search') }}</span>
143
+ <span class="text-body-md text-gray-500 dark:text-gray-400">{{ t('header.search') }}</span>
146
144
  </button>
147
145
  </div>
148
146
  </section>
@@ -199,7 +197,7 @@ onMounted(() => {
199
197
  <template #default="{ toggle, isOpen }">
200
198
  <button
201
199
  type="button"
202
- class="hidden h-8 cursor-pointer items-center gap-1.5 rounded-full px-3 text-sm font-medium transition-colors duration-150 hover:bg-deepblue-900/5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/50 focus-visible:ring-offset-1 dark:hover:bg-white/10 dark:focus-visible:ring-offset-gray-900 lg:inline-flex"
200
+ class="hidden h-8 cursor-pointer items-center gap-1.5 rounded-full px-3 text-body-md-medium transition-colors duration-150 hover:bg-deepblue-900/5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/50 focus-visible:ring-offset-1 dark:hover:bg-white/10 dark:focus-visible:ring-offset-gray-900 lg:inline-flex"
203
201
  :class="isOpen
204
202
  ? 'bg-deepblue-900/10 text-deepblue-900 dark:bg-white/15 dark:text-white'
205
203
  : 'text-gray-900 dark:text-gray-100'"
@@ -1,16 +1,64 @@
1
+ <script setup lang="ts">
2
+ import { useContacts } from '#adata-ui/composables/projectState'
3
+ import Clock from '#adata-ui/icons/clock.vue'
4
+ import ExpandWindow from '#adata-ui/icons/expand-window.vue'
5
+ import Location from '#adata-ui/icons/location.vue'
6
+ import Mail from '#adata-ui/icons/mail.vue'
7
+ import Phone from '#adata-ui/icons/phone.vue'
8
+ import Whatsapp from '#adata-ui/icons/whatsapp.vue'
9
+
10
+ const { t } = useI18n()
11
+ const contacts = useContacts()
12
+ const AlmatyItems = computed(() => ([
13
+ {
14
+ title: t('header.contacts.almaty.adress.title'),
15
+ subtitle: t('header.contacts.almaty.adress.subtitle'),
16
+ icon: Location,
17
+ to: 'https://yandex.kz/maps/ru/org/avrora_kholding/1099794306/?ll=76.912479%2C43.208928&z=17.72',
18
+ },
19
+ {
20
+ title: t('header.contacts.almaty.email.title'),
21
+ subtitle: 'info@adata.kz',
22
+ icon: Mail,
23
+ to: 'mailto:info@adata.kz',
24
+ },
25
+ {
26
+ title: t('header.contacts.almaty.schedule.title'),
27
+ subtitle: t('header.contacts.almaty.schedule.subtitle'),
28
+ icon: Clock,
29
+ },
30
+ ]))
31
+
32
+ const technicalSupport = computed(() => ([
33
+ {
34
+ subtitle: t('header.contacts.almaty.support.linkTitle'),
35
+ icon: ExpandWindow,
36
+ to: 'https://api.whatsapp.com/send/?phone=77712289041',
37
+ },
38
+ ]))
39
+
40
+ const newContacts = computed(() => contacts.value.map(item => ({
41
+ subtitle: item.contact,
42
+ icon: item.platform_code === 'telephone' ? Phone : Whatsapp,
43
+ to: item.platform_code === 'telephone'
44
+ ? `tel:${item.contact}`
45
+ : `https://api.whatsapp.com/send/?phone=${item.contact.replace(/\D/g, '')}`,
46
+ })))
47
+ </script>
48
+
1
49
  <template>
2
- <!--noindex-->
50
+ <!-- noindex -->
3
51
  <div class="h-[272px]" data-nosnippet>
4
- <h2 class="heading-02 mb-4">
52
+ <h2 class="mb-4 text-h2">
5
53
  {{ t('header.contacts.almaty.title') }}
6
54
  </h2>
7
55
  <div class="flex gap-10">
8
56
  <div class="flex flex-col gap-4">
9
57
  <div
10
- v-for="item in AlmatyItems.slice(0,3)"
58
+ v-for="item in AlmatyItems.slice(0, 3)"
11
59
  class="flex flex-col gap-2 "
12
60
  >
13
- <div class="heading-04">
61
+ <div class="text-h5">
14
62
  {{ item.title }}
15
63
  </div>
16
64
  <a
@@ -21,46 +69,46 @@
21
69
  :is="item.icon"
22
70
  class="shrink-0"
23
71
  />
24
- <div class=" body-400">
72
+ <div class="text-body-md">
25
73
  {{ item.subtitle }}
26
74
  </div>
27
75
  </a>
28
76
  </div>
29
77
  </div>
30
78
  <div class="flex flex-col gap-2 2xl:gap-4">
31
- <div class="flex flex-col gap-4 h-full justify-between">
79
+ <div class="flex h-full flex-col justify-between gap-4">
32
80
  <div class="flex flex-col gap-2 ">
33
- <div class="heading-04">
81
+ <div class="text-h5">
34
82
  {{ t('header.contacts.almaty.contactUs.title') }}
35
83
  </div>
36
- <div class="grid grid-cols-[repeat(auto-fit,minmax(140px,1fr))] max-w-[484px] gap-x-8 gap-y-2">
84
+ <div class="grid max-w-[484px] grid-cols-[repeat(auto-fit,minmax(140px,1fr))] gap-x-8 gap-y-2">
37
85
  <a
38
86
  v-for="link in newContacts"
39
87
  :key="link.subtitle"
40
- class="flex 2xl:items-center gap-1 text-deepblue-900 dark:text-white"
88
+ class="flex gap-1 text-deepblue-900 dark:text-white 2xl:items-center"
41
89
  :href="link.to"
42
90
  :target="link.icon === Whatsapp ? '_blank' : '_self'"
43
91
  >
44
92
  <component :is="link.icon" />
45
- <div class="body-400 line-clamp-1">
93
+ <div class="line-clamp-1 text-body-md">
46
94
  {{ link.subtitle }}
47
95
  </div>
48
96
  </a>
49
97
  </div>
50
98
  </div>
51
99
  <div class="flex flex-col gap-2 ">
52
- <div class="heading-04 whitespace-nowrap">
100
+ <div class="whitespace-nowrap text-h5">
53
101
  {{ t('header.contacts.almaty.support.title') }}
54
102
  </div>
55
103
  <div class="flex flex-col lg:gap-y-5">
56
104
  <a
57
105
  v-for="link in technicalSupport"
58
106
  :key="link.subtitle"
59
- class="flex 2xl:items-center gap-1 text-deepblue-900 dark:text-white"
107
+ class="flex gap-1 text-deepblue-900 dark:text-white 2xl:items-center"
60
108
  :href="link.to"
61
109
  target="_blank"
62
110
  >
63
- <div class="body-400 line-clamp-1 text-blue-600">
111
+ <div class="line-clamp-1 text-body-md text-blue-600">
64
112
  {{ link.subtitle }}
65
113
  </div>
66
114
  <component
@@ -72,74 +120,26 @@
72
120
  </div>
73
121
  </div>
74
122
  </div>
75
- <!-- Here is the financial department-->
76
- <!-- <div class="flex flex-col gap-2 self-end">-->
77
- <!-- <div class="heading-04 whitespace-nowrap">-->
78
- <!-- {{ t('header.contacts.almaty.financeDep.title') }}-->
79
- <!-- </div>-->
80
- <!-- <nuxt-link-->
81
- <!-- class="flex gap-1 items-center"-->
82
- <!-- to="https://api.whatsapp.com/send?phone=77713954561"-->
83
- <!-- target="_blank"-->
84
- <!-- >-->
85
- <!-- <div class="body-400 line-clamp-1 text-blue-600">-->
86
- <!-- {{ t('header.contacts.almaty.financeDep.linkTitle') }}-->
87
- <!-- </div>-->
88
- <!-- <a-icon-expand-window class="stroke-blue-600"/>-->
89
- <!-- </nuxt-link>-->
90
- <!-- </div>-->
123
+ <!-- Here is the financial department -->
124
+ <!-- <div class="flex flex-col gap-2 self-end"> -->
125
+ <!-- <div class="heading-04 whitespace-nowrap"> -->
126
+ <!-- {{ t('header.contacts.almaty.financeDep.title') }} -->
127
+ <!-- </div> -->
128
+ <!-- <nuxt-link -->
129
+ <!-- class="flex gap-1 items-center" -->
130
+ <!-- to="https://api.whatsapp.com/send?phone=77713954561" -->
131
+ <!-- target="_blank" -->
132
+ <!-- > -->
133
+ <!-- <div class="body-400 line-clamp-1 text-blue-600"> -->
134
+ <!-- {{ t('header.contacts.almaty.financeDep.linkTitle') }} -->
135
+ <!-- </div> -->
136
+ <!-- <a-icon-expand-window class="stroke-blue-600"/> -->
137
+ <!-- </nuxt-link> -->
138
+ <!-- </div> -->
91
139
  </div>
92
140
  </div>
93
- <!--/noindex-->
141
+ <!-- /noindex -->
94
142
  </template>
95
143
 
96
- <script setup lang="ts">
97
-
98
- import Location from "#adata-ui/icons/location.vue";
99
- import Mail from "#adata-ui/icons/mail.vue";
100
- import Clock from "#adata-ui/icons/clock.vue";
101
- import Whatsapp from "#adata-ui/icons/whatsapp.vue";
102
- import Phone from "#adata-ui/icons/phone.vue";
103
- import ExpandWindow from "#adata-ui/icons/expand-window.vue";
104
- import {useContacts} from "#adata-ui/composables/projectState";
105
-
106
- const {t} = useI18n()
107
- const contacts = useContacts()
108
- const AlmatyItems = computed(() => ([
109
- {
110
- title: t('header.contacts.almaty.adress.title'),
111
- subtitle: t('header.contacts.almaty.adress.subtitle'),
112
- icon: Location,
113
- to: 'https://yandex.kz/maps/ru/org/avrora_kholding/1099794306/?ll=76.912479%2C43.208928&z=17.72'
114
- },
115
- {
116
- title: t('header.contacts.almaty.email.title'),
117
- subtitle: 'info@adata.kz',
118
- icon: Mail,
119
- to: 'mailto:info@adata.kz'
120
- },
121
- {
122
- title: t('header.contacts.almaty.schedule.title'),
123
- subtitle: t('header.contacts.almaty.schedule.subtitle'),
124
- icon: Clock,
125
- },
126
- ]))
127
-
128
- const technicalSupport = computed(() => ([
129
- {
130
- subtitle: t('header.contacts.almaty.support.linkTitle'),
131
- icon: ExpandWindow,
132
- to: "https://api.whatsapp.com/send/?phone=77712289041"
133
- }
134
- ]))
135
-
136
- const newContacts = computed(()=> contacts.value.map(item => ({
137
- subtitle: item.contact,
138
- icon: item.platform_code === 'telephone' ? Phone : Whatsapp,
139
- to: item.platform_code === 'telephone' ? `tel:${item.contact}`
140
- : `https://api.whatsapp.com/send/?phone=${item.contact.replace(/[^0-9]/g, '')}`
141
- })))
142
- </script>
143
-
144
144
  <style scoped>
145
145
  </style>
@@ -109,7 +109,7 @@ onUnmounted(() => clearTimer())
109
109
 
110
110
  <template>
111
111
  <div
112
- class="overflow-hidden relative w-[320px] h-[480px] rounded-2xl"
112
+ class="overflow-hidden relative w-[320px] h-[480px] rounded-xl"
113
113
  @mouseover="handleMouseOver"
114
114
  @mouseout="handleMouseOut"
115
115
  >
@@ -120,14 +120,14 @@ onUnmounted(() => clearTimer())
120
120
  >
121
121
  <img
122
122
  :src="items[currentIndex].image"
123
- class="size-full object-cover rounded-2xl"
123
+ class="size-full object-cover rounded-xl"
124
124
  />
125
125
  <nuxt-link-locale :to="items[currentIndex].to">
126
- <div class="absolute bottom-0 rounded-2xl w-full bg-blue-700/80 dark:bg-blue-500/80 px-4 pt-4 pb-12 shadow-[0_-2px_4px_0_rgba(0,0,0,0.25)] backdrop-blur-md flex flex-col gap-6">
126
+ <div class="absolute bottom-0 rounded-xl w-full bg-blue-700/80 dark:bg-blue-500/80 px-4 pt-4 pb-12 shadow-[0_-2px_4px_0_rgba(0,0,0,0.25)] backdrop-blur-md flex flex-col gap-6">
127
127
  <div class="flex flex-col gap-2">
128
128
  <div class="flex items-center justify-between">
129
129
  <div class="flex items-center gap-2">
130
- <div class="flex items-center justify-center bg-white dark:bg-gray-900 text-blue-700 dark:text-blue-500 size-8 rounded-lg">
130
+ <div class="flex items-center justify-center bg-white dark:bg-gray-900 text-blue-700 dark:text-blue-500 size-8 rounded-md">
131
131
  <component
132
132
  :is="items[currentIndex].icon"
133
133
  class="size-6"
@@ -16,14 +16,12 @@ interface Props {
16
16
  daysRemaining?: number
17
17
  }
18
18
 
19
- // Bar fill represents the remaining quota: full bar = plenty of requests left.
20
19
  const percent = computed(() => {
21
20
  if (props.maxLimit <= 0) return 0
22
21
  const ratio = (props.limitRemaining / props.maxLimit) * 100
23
22
  return Math.min(100, Math.max(0, ratio))
24
23
  })
25
24
 
26
- // Animate the fill from 0 on mount and on every value change.
27
25
  const displayPercent = ref(0)
28
26
  onMounted(() => {
29
27
  displayPercent.value = percent.value
@@ -32,17 +30,33 @@ watch(percent, (value) => {
32
30
  displayPercent.value = value
33
31
  })
34
32
 
35
- const isLow = computed(() => percent.value < 20)
33
+ const usageLevel = computed<'normal' | 'warning' | 'critical'>(() => {
34
+ if (percent.value < 20) return 'critical'
35
+ if (percent.value < 40) return 'warning'
36
+ return 'normal'
37
+ })
36
38
 
37
- const barColorClass = computed(() =>
38
- isLow.value
39
- ? 'bg-red-500 dark:bg-red-400'
40
- : 'bg-blue-600 dark:bg-blue-500',
41
- )
39
+ const barColorClass = computed(() => {
40
+ switch (usageLevel.value) {
41
+ case 'critical':
42
+ return 'bg-red-500 dark:bg-red-400'
43
+ case 'warning':
44
+ return 'bg-yellow-500 dark:bg-yellow-400'
45
+ default:
46
+ return 'bg-blue-600 dark:bg-blue-500'
47
+ }
48
+ })
42
49
 
43
- const valueColorClass = computed(() =>
44
- isLow.value ? 'text-red-600 dark:text-red-400' : 'text-gray-900 dark:text-gray-100',
45
- )
50
+ const valueColorClass = computed(() => {
51
+ switch (usageLevel.value) {
52
+ case 'critical':
53
+ return 'text-red-600 dark:text-red-400'
54
+ case 'warning':
55
+ return 'text-yellow-600 dark:text-yellow-400'
56
+ default:
57
+ return 'text-gray-900 dark:text-gray-100'
58
+ }
59
+ })
46
60
  </script>
47
61
 
48
62
  <template>
@@ -69,7 +83,7 @@ const valueColorClass = computed(() =>
69
83
  </div>
70
84
 
71
85
  <span
72
- class="text-sm tabular-nums leading-none"
86
+ class="text-body-md tabular-nums leading-none"
73
87
  data-test-id="header-usage-requests"
74
88
  >
75
89
  <span
@@ -79,7 +93,7 @@ const valueColorClass = computed(() =>
79
93
  </span>
80
94
 
81
95
  <template #content>
82
- <span class="whitespace-nowrap text-[11px] leading-none text-deepblue-900 dark:text-gray-100">
96
+ <span class="whitespace-nowrap text-body-sm leading-none text-deepblue-900 dark:text-gray-100">
83
97
  Лимит запросов: {{ limitRemaining }}
84
98
  </span>
85
99
  </template>
@@ -99,11 +113,11 @@ const valueColorClass = computed(() =>
99
113
  data-test-id="header-usage-days"
100
114
  >
101
115
  <calendar class="size-4 shrink-0 text-gray-600 dark:text-gray-300" />
102
- <span class="text-sm font-bold tabular-nums text-gray-900 dark:text-gray-100">{{ daysRemaining }}</span>
116
+ <span class="text-body-md font-bold tabular-nums text-gray-900 dark:text-gray-100">{{ daysRemaining }}</span>
103
117
  </div>
104
118
 
105
119
  <template #content>
106
- <span class="whitespace-nowrap text-[11px] leading-none text-deepblue-900 dark:text-gray-100">
120
+ <span class="whitespace-nowrap text-body-sm leading-none text-deepblue-900 dark:text-gray-100">
107
121
  Остаток дней: {{ daysRemaining }}
108
122
  </span>
109
123
  </template>
@@ -4,9 +4,9 @@
4
4
  @mouseenter="hover = true"
5
5
  @mouseleave="hover = false"
6
6
  :class="{'opacity-30' : !hover && someHovered}"
7
- class="flex items-center gap-4 px-2.5 py-2 hover:bg-gray-50 rounded-lg dark:hover:bg-gray-800 normal-case transition-all "
7
+ class="flex items-center gap-4 px-2.5 py-2 hover:bg-gray-50 rounded-md dark:hover:bg-gray-800 normal-case transition-all "
8
8
  >
9
- <div class="min-w-8 h-8 rounded-lg flex items-center justify-center dark:text-gray-900 text-white bg-gradient-blue">
9
+ <div class="min-w-8 h-8 rounded-md flex items-center justify-center dark:text-gray-900 text-white bg-gradient-blue">
10
10
  <component
11
11
  :is="item.icon"
12
12
  class="h-5 w-5"
@@ -29,7 +29,7 @@ const hover = ref(false)
29
29
  </p>
30
30
  </div>
31
31
  <div
32
- class="flex items-center justify-center self-end rounded-lg bg-gradient-blue dark:text-gray-900 text-white"
32
+ class="flex items-center justify-center self-end rounded-md bg-gradient-blue dark:text-gray-900 text-white"
33
33
  :class="{'h-8 min-w-8' : size==='sm', 'h-16 min-w-16' : size==='lg'}"
34
34
  >
35
35
  <component