adata-ui 2.1.40-beta.18 → 2.1.40-beta.19

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 (211) hide show
  1. package/.playground/app.vue +102 -0
  2. package/assets/styles/index.scss +67 -5
  3. package/components/elements/a-select-row/ASelectRowV2.vue +214 -0
  4. package/components/elements/a-select-row/index.vue +3 -5
  5. package/components/elements/accordion/AAccordion.vue +5 -3
  6. package/components/elements/accordion/AAccordionGroup/AAccordionGroup.vue +3 -3
  7. package/components/elements/alert/AAlert.vue +34 -47
  8. package/components/elements/bg-block/ABgBlock.vue +1 -1
  9. package/components/elements/button/AButton.vue +3 -3
  10. package/components/elements/button/AButtonV2.vue +133 -0
  11. package/components/elements/button-login/index.vue +6 -10
  12. package/components/elements/chip-wrapper/AChipWrapper.vue +1 -1
  13. package/components/elements/chips/AChips.vue +2 -2
  14. package/components/elements/companies/AOurClients.vue +3 -1
  15. package/components/elements/curve-block-v2/ACurveBlockV2.vue +85 -0
  16. package/components/elements/digit-badge/ADigitBadge.vue +24 -22
  17. package/components/elements/feature-description/AFeatureDescription.vue +1 -1
  18. package/components/elements/leave-note/ALeaveNote.vue +39 -18
  19. package/components/elements/pagination/APagination.vue +7 -7
  20. package/components/elements/segmented/ASegmentedV2.vue +151 -0
  21. package/components/elements/select/ASelect.vue +4 -4
  22. package/components/elements/select/ASelectMobile.vue +2 -2
  23. package/components/elements/select/ASelectV2.vue +588 -0
  24. package/components/elements/select/ui/select-button.vue +1 -1
  25. package/components/elements/show-more/AShowMoreV2.vue +26 -0
  26. package/components/elements/slider/ASlider.vue +174 -0
  27. package/components/elements/slider/ASliderItem.vue +31 -0
  28. package/components/elements/slider/types.ts +21 -0
  29. package/components/elements/star-rating/AStarRating.vue +12 -4
  30. package/components/elements/status-badge/AStatusBadge.vue +91 -44
  31. package/components/elements/step-slider/AStepSliderColCard.vue +232 -0
  32. package/components/elements/step-slider/AStepSliderColNumber.vue +178 -0
  33. package/components/elements/table/ATable.vue +1 -1
  34. package/components/elements/table/table.config.ts +2 -2
  35. package/components/elements/tree-select/ATreeSelect.vue +97 -113
  36. package/components/elements/tree-select/TreeService.ts +142 -207
  37. package/components/elements/tree-select/components/ATreeSelectNode.vue +104 -0
  38. package/components/elements/tree-select/types.ts +40 -11
  39. package/components/elements/tree-select/utils.ts +30 -0
  40. package/components/elements/tree-select-modal/ATreeSelectModal.vue +217 -0
  41. package/components/features/color-mode/AColorMode.client.vue +74 -32
  42. package/components/features/dropdown/ADropdownV2.vue +140 -0
  43. package/components/features/lang-switcher/lang-switcher.vue +125 -40
  44. package/components/features/payment/banner/BasicPlusLimitBanner.vue +3 -3
  45. package/components/features/payment/banner/PaymentBanner.vue +3 -3
  46. package/components/features/payment/banner/UpSellBanner.vue +3 -3
  47. package/components/features/payment/process/PaymentKaspiQrSidePanel.vue +45 -27
  48. package/components/features/payment/process/PaymentKaspiRedirectSidePanel.vue +34 -23
  49. package/components/features/payment/process/PaymentMethodSidePanel.vue +66 -49
  50. package/components/features/payment/process/PaymentProcess.vue +6 -6
  51. package/components/features/payment/process/PaymentTopUpSidePanel.vue +49 -63
  52. package/components/features/pk-mobile-services/APkMobileServices.vue +6 -28
  53. package/components/features//321/201hange-version/AChangeVersion.vue +2 -2
  54. package/components/forms/checkbox/ACheckbox.vue +1 -1
  55. package/components/forms/checkbox/ACheckboxV2.vue +229 -0
  56. package/components/forms/feedback-form/FeedbackForm.vue +8 -8
  57. package/components/forms/feedback-form/FeedbackFormV2.vue +182 -0
  58. package/components/forms/input/AInputV2.vue +542 -0
  59. package/components/forms/input/date/AInputDate.vue +2 -2
  60. package/components/forms/input/password/AInputPassword.vue +8 -2
  61. package/components/forms/input/standard/AInputStandard.vue +3 -3
  62. package/components/forms/input/textarea/ATextarea.vue +2 -2
  63. package/components/forms/input/textarea/ATextareaV2.vue +248 -0
  64. package/components/forms/toggle/AToggle.vue +2 -3
  65. package/components/forms/toggle/AToggleV2.vue +71 -0
  66. package/components/modals/AnotherDeviceModal.vue +22 -18
  67. package/components/modals/ApplicationAcceptedModal.vue +12 -15
  68. package/components/modals/ConnectingTariffModal.vue +13 -20
  69. package/components/modals/ContactsMobileModel.vue +1 -1
  70. package/components/modals/ContentNavigationModal.vue +77 -333
  71. package/components/modals/Insufficient-funds-modal.vue +18 -33
  72. package/components/modals/LimitReachedModal.vue +17 -14
  73. package/components/modals/NoAccessModal.vue +9 -11
  74. package/components/modals/PaymentMethodModal.vue +1 -1
  75. package/components/modals/ReportBugConfirmModal.vue +12 -10
  76. package/components/modals/ReportBugModal.vue +46 -38
  77. package/components/modals/Resend.vue +9 -10
  78. package/components/modals/SubmitApplicationModal.vue +27 -24
  79. package/components/modals/id/IdBanner.vue +3 -3
  80. package/components/modals/id/IdConfirmAccountOtpModal.vue +4 -9
  81. package/components/modals/id/IdLoginModal.vue +3 -8
  82. package/components/modals/id/IdModals.vue +23 -10
  83. package/components/modals/id/IdRecoveryModal.vue +1 -1
  84. package/components/modals/id/IdTwoFactorModal.vue +3 -8
  85. package/components/navigation/bottom-navigation/ABottomNavigation.vue +1 -1
  86. package/components/navigation/breadcrumbs/ABreadcrumbs.vue +106 -45
  87. package/components/navigation/breadcrumbs/types.ts +3 -0
  88. package/components/navigation/footer/AFooter.vue +39 -40
  89. package/components/navigation/footer/ui/a-footer-accordion.vue +9 -9
  90. package/components/navigation/header/AHeader.vue +68 -51
  91. package/components/navigation/header/AlmatyContacts.vue +78 -78
  92. package/components/navigation/header/CardGallery.vue +9 -7
  93. package/components/navigation/header/ContactMenu.vue +26 -92
  94. package/components/navigation/header/HeaderLink.vue +181 -213
  95. package/components/navigation/header/HeaderUsage.vue +139 -0
  96. package/components/navigation/header/ListItem.vue +2 -2
  97. package/components/navigation/header/NavCard.vue +1 -1
  98. package/components/navigation/header/NavList.vue +33 -92
  99. package/components/navigation/header/NotificationsMenu.vue +2 -3
  100. package/components/navigation/header/ProductMenu.vue +81 -127
  101. package/components/navigation/header/ProfileMenu.vue +122 -151
  102. package/components/navigation/header/SystemNotification.vue +108 -0
  103. package/components/navigation/mobile-navigation/AMobileNavigation.vue +23 -15
  104. package/components/navigation/pill-tabs/APillTabs.vue +2 -2
  105. package/components/navigation/pill-tabs/APillTabsV2.vue +226 -0
  106. package/components/overlays/drawer/ADrawerV2.vue +335 -0
  107. package/components/overlays/modal/AModal.vue +4 -4
  108. package/components/overlays/modal/AModalV2.vue +397 -0
  109. package/components/overlays/side-panel/ASidePanel.vue +10 -7
  110. package/components/overlays/sideover/ASlideover.vue +6 -6
  111. package/components/overlays/tooltip/ATooltip.vue +1 -1
  112. package/components/overlays/tooltip/ATooltipV2.vue +223 -0
  113. package/components/overlays/tooltip/types.ts +26 -0
  114. package/components/overlays/tooltip/useTooltipTrigger.ts +101 -0
  115. package/components/transitions/ATransitionHeight.vue +1 -1
  116. package/composables/useAccessTokenCookie.ts +25 -0
  117. package/composables/useActiveNavigation.ts +84 -0
  118. package/composables/useChipOverflow.ts +92 -0
  119. package/composables/useHeaderNavigationLinks.ts +140 -98
  120. package/icons/archive.vue +16 -0
  121. package/icons/arrow/arrow-left-right.vue +8 -0
  122. package/icons/arrow/arrow-right.vue +14 -0
  123. package/icons/arrow/arrows-in.vue +11 -0
  124. package/icons/arrow/arrows-out.vue +11 -0
  125. package/icons/arrow/arrows-resize-in.vue +38 -0
  126. package/icons/arrow/arrows-resize-out.vue +17 -0
  127. package/icons/bill.vue +3 -0
  128. package/icons/bot.vue +52 -0
  129. package/icons/briefcase.vue +14 -0
  130. package/icons/building.vue +9 -0
  131. package/icons/car-side.vue +16 -0
  132. package/icons/cart.vue +15 -0
  133. package/icons/chart-no-axes-column.vue +3 -0
  134. package/icons/clock-time.vue +24 -0
  135. package/icons/cloud/cloud-upload.vue +3 -0
  136. package/icons/code.vue +9 -0
  137. package/icons/compare-outlined.vue +8 -0
  138. package/icons/dots-horizontal.vue +31 -0
  139. package/icons/download-line.vue +13 -0
  140. package/icons/download-rounded.vue +15 -0
  141. package/icons/egov.vue +41 -0
  142. package/icons/elicense.vue +38 -0
  143. package/icons/favourite-bookmark-outline.vue +17 -0
  144. package/icons/file/file-check-corner.vue +3 -0
  145. package/icons/file/file-spreadsheet.vue +3 -0
  146. package/icons/file-pen.vue +31 -0
  147. package/icons/file-stack.vue +31 -0
  148. package/icons/file-types/excel.vue +131 -0
  149. package/icons/file-types/html.vue +13 -0
  150. package/icons/file-types/jpeg.vue +16 -0
  151. package/icons/file-types/pdf.vue +11 -0
  152. package/icons/file-types/png.vue +11 -0
  153. package/icons/file-types/rar.vue +11 -0
  154. package/icons/file-types/word.vue +50 -0
  155. package/icons/file-types/zip.vue +11 -0
  156. package/icons/gauge.vue +17 -0
  157. package/icons/git-compare.vue +38 -0
  158. package/icons/git-fork.vue +3 -0
  159. package/icons/graduation-cap.vue +31 -0
  160. package/icons/graph-loading.vue +34 -0
  161. package/icons/headset.vue +6 -0
  162. package/icons/help-question-circle.vue +26 -0
  163. package/icons/in-row-type.vue +46 -0
  164. package/icons/in-table-type.vue +29 -0
  165. package/icons/landmark.vue +3 -0
  166. package/icons/layers.vue +3 -0
  167. package/icons/letter/letter-a.vue +6 -0
  168. package/icons/letter/letter-b.vue +6 -0
  169. package/icons/letter/letter-c.vue +6 -0
  170. package/icons/letter/letter-d.vue +6 -0
  171. package/icons/letter/letter-e.vue +6 -0
  172. package/icons/link-url.vue +3 -0
  173. package/icons/list-tree.vue +3 -0
  174. package/icons/mail-question-mark.vue +8 -0
  175. package/icons/message/message-square.vue +3 -0
  176. package/icons/message-dotted.vue +30 -0
  177. package/icons/network.vue +3 -0
  178. package/icons/newspaper.vue +3 -0
  179. package/icons/notification-error.vue +17 -0
  180. package/icons/person.vue +22 -0
  181. package/icons/phone-call.vue +6 -0
  182. package/icons/phone-reversed.vue +3 -0
  183. package/icons/route.vue +7 -0
  184. package/icons/scan-search.vue +3 -0
  185. package/icons/settings.vue +26 -0
  186. package/icons/shield-alert.vue +31 -0
  187. package/icons/shield-verified.vue +14 -0
  188. package/icons/socials/facebook-color.vue +16 -0
  189. package/icons/socials/globe-color.vue +16 -0
  190. package/icons/socials/instagram-color.vue +46 -0
  191. package/icons/socials/linkedin-color.vue +14 -0
  192. package/icons/socials/telegram-color.vue +16 -0
  193. package/icons/socials/tiktok-color.vue +14 -0
  194. package/icons/socials/vk-color.vue +16 -0
  195. package/icons/socials/youtube-color.vue +16 -0
  196. package/icons/sparkles.vue +3 -0
  197. package/icons/sun.vue +13 -3
  198. package/icons/users-round.vue +3 -0
  199. package/icons/view-eye-open.vue +13 -0
  200. package/icons/workflow.vue +3 -0
  201. package/icons/zap.vue +3 -0
  202. package/lang/en.ts +49 -5
  203. package/lang/kk.ts +50 -6
  204. package/lang/ru.ts +51 -7
  205. package/package.json +1 -1
  206. package/plugins/toast.client.ts +38 -55
  207. package/shared/constans/pages.ts +8 -2
  208. package/tailwind.config.ts +147 -116
  209. package/utils/twMerge.ts +34 -0
  210. package/components/elements/tree-select/components/tree-select-nodes.vue +0 -91
  211. package/components/navigation/header/TopHeader.vue +0 -196
@@ -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>
@@ -1,23 +1,26 @@
1
1
  <script lang="ts" setup>
2
2
  import type { ProjectKeys } from '#adata-ui/components/navigation/header/types'
3
3
  import AColorMode from '#adata-ui/components/features/color-mode/AColorMode.client.vue'
4
+ import ADropdownV2 from '#adata-ui/components/features/dropdown/ADropdownV2.vue'
4
5
  import LangSwitcher from '#adata-ui/components/features/lang-switcher/lang-switcher.vue'
5
6
  import AChangeVersion from '#adata-ui/components/features/сhange-version/AChangeVersion.vue'
7
+ import HeaderUsage from '#adata-ui/components/navigation/header/HeaderUsage.vue'
6
8
  import ProfileMenu from '#adata-ui/components/navigation/header/ProfileMenu.vue'
7
- import TopHeader from '#adata-ui/components/navigation/header/TopHeader.vue'
9
+ import SystemNotification from '#adata-ui/components/navigation/header/SystemNotification.vue'
8
10
  import { useContacts, useCurrentModule } from '#adata-ui/composables/projectState'
11
+ import { useUrls } from '#adata-ui/composables/useUrls'
9
12
  import AdataLogo from '#adata-ui/icons/adata-logo.vue'
10
- import Arrow from '#adata-ui/icons/chevron/chevron-down.vue'
11
13
  import Logo from '#adata-ui/icons/logo.vue'
12
14
  import { buildLocalizedUrl, navigateToLocalizedPage } from '#adata-ui/utils/localizedNavigation'
15
+ import { useElementBounding } from '@vueuse/core'
13
16
  import HeaderLink from './HeaderLink.vue'
14
- import { useUrls } from '#adata-ui/composables/useUrls'
15
17
 
16
18
  defineOptions({ name: 'AHeader' })
17
19
 
18
20
  const props = withDefaults(defineProps<Props>(), {
19
21
  limitRemaining: 0,
20
22
  daysRemaining: 0,
23
+ maxLimit: 0,
21
24
  balance: 0,
22
25
  rate: 'Базовый',
23
26
  showLogIn: true,
@@ -31,10 +34,11 @@ interface Props {
31
34
  replenish?: string
32
35
  hasNotification?: boolean
33
36
  email: string | undefined
34
- rate: string
35
- daysRemaining: number
36
- limitRemaining: number
37
- balance: number
37
+ rate?: string
38
+ daysRemaining?: number
39
+ limitRemaining?: number
40
+ maxLimit?: number
41
+ balance?: number
38
42
  isAuthenticated: boolean
39
43
  showLogIn?: boolean
40
44
  mobileHeaderType?: 'search' | 'default'
@@ -42,18 +46,19 @@ interface Props {
42
46
  oldVersion?: string
43
47
  }
44
48
 
45
- const { t } = useI18n()
46
- const { locale } = useI18n()
49
+ const { locale, t } = useI18n()
47
50
 
48
51
  useCurrentModule().value = props.module
49
- const appConfig = useAppConfig()
50
52
  const { myLayer }: any = useAppConfig()
51
53
  const urls = useUrls()
52
54
 
53
- const langIsOn = appConfig.myLayer.langIsOn
54
- const contacts = ref(useContacts())
55
+ const langIsOn = myLayer.langIsOn
56
+ const contacts = useContacts()
55
57
  const { loginModal } = useIdModals()
56
58
 
59
+ const headerRef = ref<HTMLElement | null>(null)
60
+ const { bottom: headerBottom } = useElementBounding(headerRef)
61
+
57
62
  function goAuth() {
58
63
  if (myLayer.authMode !== 'local') {
59
64
  if (window) {
@@ -82,14 +87,13 @@ function goToAnotherModule() {
82
87
 
83
88
  async function fetchContacts() {
84
89
  try {
85
- const response = await fetch(
90
+ const { data } = await $fetch<{ data: unknown }>(
86
91
  'https://pk-api.adata.kz/api/v1/data/counterparty/contacts/sales-department',
87
92
  )
88
- const { data } = await response.json()
89
93
  contacts.value = data
90
94
  }
91
95
  catch (e) {
92
- console.error(e.message)
96
+ console.error(e instanceof Error ? e.message : e)
93
97
  }
94
98
  }
95
99
 
@@ -100,14 +104,10 @@ onMounted(() => {
100
104
 
101
105
  <template>
102
106
  <div>
103
- <top-header
104
- :days-remaining="daysRemaining"
105
- :is-authenticated="isAuthenticated"
106
- :module-name="module"
107
- :limit-remaining="limitRemaining"
108
- />
107
+ <system-notification />
109
108
  <header
110
- class="relative h-16 border-b border-deepblue-900/10 bg-white dark:border-gray-200/10 dark:bg-gray-900"
109
+ ref="headerRef"
110
+ class="relative h-16 border-b border-deepblue-900/10 bg-gray-50/20 backdrop-blur-lg dark:border-gray-200/10 dark:bg-gray-900/30"
111
111
  >
112
112
  <div class="a-container mobile-padding flex h-full items-center justify-between gap-2">
113
113
  <!-- Desktop hidden -->
@@ -117,46 +117,47 @@ onMounted(() => {
117
117
  >
118
118
  <div
119
119
  v-if="mobileHeaderType === 'default'"
120
- class="flex justify-center"
120
+ class="text-deepblue dark:text-[#E3E5E8]"
121
+ @click="goToAnotherModule"
121
122
  >
122
- <div
123
- class="text-deepblue dark:text-[#E3E5E8]"
124
- @click="goToAnotherModule"
125
- >
126
- <span class="visually-hidden"> Сервисы Adata.kz</span>
123
+ <span class="visually-hidden"> Сервисы Adata.kz</span>
127
124
 
128
- <adata-logo
129
- :font-controlled="false"
130
- filled
131
- />
132
- </div>
125
+ <adata-logo
126
+ :font-controlled="false"
127
+ filled
128
+ />
133
129
  </div>
134
130
  <div
135
131
  v-else-if="mobileHeaderType === 'search'"
136
- class="flex w-full items-center gap-2 bg-white dark:bg-gray-900 lg:hidden"
132
+ class="flex w-full items-center gap-2 lg:hidden"
137
133
  >
138
134
  <logo
139
135
  class="dark:text-gray-200"
140
136
  @click="goToAnotherModule"
141
137
  />
142
138
  <button
143
- class="flex w-full items-center gap-2 rounded bg-gray-50 px-4 py-1.5 dark:bg-gray-800 dark:text-gray-500"
139
+ class="flex w-full items-center gap-2 rounded-full border border-gray-300/50 bg-white/30 px-4 py-1.5 backdrop-blur-sm dark:border-gray-600/50 dark:bg-white/5 dark:text-gray-300"
144
140
  @click="$emit('search')"
145
141
  >
146
- <a-icon-search />
147
- <span class="body-400">Найти</span>
142
+ <a-icon-search class="text-gray-400 dark:text-gray-500" />
143
+ <span class="text-body-md text-gray-500 dark:text-gray-400">{{ t('header.search') }}</span>
148
144
  </button>
149
145
  </div>
150
146
  </section>
151
- <div class="lg:hidden">
147
+ <div class="flex items-center gap-1 lg:hidden">
148
+ <a-color-mode />
152
149
  <lang-switcher
153
150
  v-if="langIsOn || module === 'fea'"
154
- class="lg:hidden"
155
151
  is-mobile
156
152
  />
157
153
  </div>
158
154
  <!-- Mobile hidden -->
159
- <nav class="hidden items-center gap-4 lg:flex" itemscope itemtype="https://schema.org/SiteNavigationElement" role="list">
155
+ <nav
156
+ class="hidden items-center gap-4 lg:flex"
157
+ itemscope
158
+ itemtype="https://schema.org/SiteNavigationElement"
159
+ role="list"
160
+ >
160
161
  <nuxt-link-locale
161
162
  aria-label="Adata-logo"
162
163
  :to="buildLocalizedUrl(locale, urls.landing)"
@@ -169,11 +170,18 @@ onMounted(() => {
169
170
  filled
170
171
  />
171
172
  </nuxt-link-locale>
172
- <header-link />
173
+ <header-link :menu-top="headerBottom || 64" />
173
174
  </nav>
174
175
  <div class="text-deepblue hidden items-center gap-4 dark:text-[#E3E5E8] lg:flex">
176
+ <header-usage
177
+ v-if="isAuthenticated"
178
+ :limit-remaining="limitRemaining"
179
+ :max-limit="maxLimit"
180
+ :days-remaining="daysRemaining"
181
+ />
182
+
175
183
  <!-- Mobile hidden -->
176
- <div class="hidden items-center gap-4 lg:flex">
184
+ <div class="hidden items-center gap-2 lg:flex">
177
185
  <a-change-version
178
186
  v-if="oldVersion"
179
187
  :url="oldVersion"
@@ -182,22 +190,31 @@ onMounted(() => {
182
190
  <lang-switcher v-if="langIsOn || module === 'fea'" />
183
191
  </div>
184
192
 
185
- <a-dropdown
193
+ <a-dropdown-v2
186
194
  v-show="isAuthenticated"
187
- placement="right"
195
+ placement="bottom-end"
188
196
  >
189
- <template #default="{ onExpand, expanded }">
190
- <div
191
- class="hidden cursor-pointer items-center gap-2 text-sm font-semibold lg:flex"
197
+ <template #default="{ toggle, isOpen }">
198
+ <button
199
+ type="button"
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"
201
+ :class="isOpen
202
+ ? 'bg-deepblue-900/10 text-deepblue-900 dark:bg-white/15 dark:text-white'
203
+ : 'text-gray-900 dark:text-gray-100'"
192
204
  data-test-id="header-email-text"
193
- @click.stop="onExpand"
205
+ :aria-label="email"
206
+ @click.stop="toggle"
194
207
  >
195
208
  <span>{{ email }}</span>
196
- <arrow :class="{ 'rotate-180': expanded }" />
197
- </div>
209
+ <a-icon-chevron-down
210
+ class="shrink-0 transition-transform duration-200"
211
+ :class="{ 'rotate-180': isOpen }"
212
+ />
213
+ </button>
198
214
  </template>
199
215
  <template #content>
200
216
  <profile-menu
217
+ :email="email"
201
218
  :balance="balance"
202
219
  :days-remaining="daysRemaining"
203
220
  :limit-remaining="limitRemaining"
@@ -206,7 +223,7 @@ onMounted(() => {
206
223
  @logout="$emit('logout')"
207
224
  />
208
225
  </template>
209
- </a-dropdown>
226
+ </a-dropdown-v2>
210
227
  <a-button-login
211
228
  v-show="!isAuthenticated && showLogIn"
212
229
  @click="goAuth"