adata-ui 2.1.40-beta.10 → 2.1.40-beta.12

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 (139) hide show
  1. package/.claude/settings.local.json +19 -0
  2. package/assets/styles/index.scss +67 -5
  3. package/components/elements/a-select-row/ASelectRowV2.vue +8 -8
  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 +7 -5
  11. package/components/elements/button-login/index.vue +1 -1
  12. package/components/elements/chip-wrapper/AChipWrapper.vue +1 -1
  13. package/components/elements/chips/AChips.vue +2 -2
  14. package/components/elements/digit-badge/ADigitBadge.vue +21 -19
  15. package/components/elements/feature-description/AFeatureDescription.vue +1 -1
  16. package/components/elements/leave-note/ALeaveNote.vue +1 -1
  17. package/components/elements/pagination/APagination.vue +7 -7
  18. package/components/elements/segmented/ASegmentedV2.vue +103 -10
  19. package/components/elements/select/ASelect.vue +4 -4
  20. package/components/elements/select/ASelectMobile.vue +2 -2
  21. package/components/elements/select/ASelectV2.vue +10 -11
  22. package/components/elements/select/ui/select-button.vue +1 -1
  23. package/components/elements/status-badge/AStatusBadge.vue +22 -19
  24. package/components/elements/status-badge-v2/StatusBadgeV2.vue +1 -3
  25. package/components/elements/table/ATable.vue +1 -1
  26. package/components/elements/table/table.config.ts +2 -2
  27. package/components/elements/tree-select/ATreeSelect.vue +97 -113
  28. package/components/elements/tree-select/TreeService.ts +142 -207
  29. package/components/elements/tree-select/components/ATreeSelectNode.vue +104 -0
  30. package/components/elements/tree-select/types.ts +40 -11
  31. package/components/elements/tree-select/utils.ts +30 -0
  32. package/components/elements/tree-select-modal/ATreeSelectModal.vue +217 -0
  33. package/components/features/color-mode/AColorMode.client.vue +1 -1
  34. package/components/features/dropdown/ADropdownV2.vue +1 -2
  35. package/components/features/lang-switcher/lang-switcher.vue +9 -4
  36. package/components/features/payment/banner/BasicPlusLimitBanner.vue +3 -3
  37. package/components/features/payment/banner/PaymentBanner.vue +3 -3
  38. package/components/features/payment/banner/UpSellBanner.vue +3 -3
  39. package/components/features/payment/process/PaymentKaspiQrSidePanel.vue +43 -27
  40. package/components/features/payment/process/PaymentKaspiRedirectSidePanel.vue +34 -23
  41. package/components/features/payment/process/PaymentMethodSidePanel.vue +61 -49
  42. package/components/features/payment/process/PaymentProcess.vue +6 -6
  43. package/components/features/payment/process/PaymentTopUpSidePanel.vue +44 -63
  44. package/components/features/pk-mobile-services/APkMobileServices.vue +1 -1
  45. package/components/features//321/201hange-version/AChangeVersion.vue +2 -2
  46. package/components/forms/checkbox/ACheckbox.vue +1 -1
  47. package/components/forms/checkbox/ACheckboxV2.vue +5 -5
  48. package/components/forms/input/AInputV2.vue +4 -4
  49. package/components/forms/input/date/AInputDate.vue +2 -2
  50. package/components/forms/input/password/AInputPassword.vue +8 -2
  51. package/components/forms/input/standard/AInputStandard.vue +3 -3
  52. package/components/forms/input/textarea/ATextarea.vue +2 -2
  53. package/components/forms/toggle/AToggle.vue +2 -3
  54. package/components/forms/toggle/AToggleV2.vue +3 -3
  55. package/components/modals/AnotherDeviceModal.vue +1 -1
  56. package/components/modals/ContactsMobileModel.vue +1 -1
  57. package/components/modals/ContentNavigationModal.vue +77 -333
  58. package/components/modals/Insufficient-funds-modal.vue +1 -1
  59. package/components/modals/PaymentMethodModal.vue +1 -1
  60. package/components/modals/id/IdBanner.vue +3 -3
  61. package/components/modals/id/IdRecoveryModal.vue +1 -1
  62. package/components/navigation/bottom-navigation/ABottomNavigation.vue +1 -1
  63. package/components/navigation/breadcrumbs/ABreadcrumbs.vue +106 -45
  64. package/components/navigation/breadcrumbs/types.ts +3 -0
  65. package/components/navigation/footer/AFooter.vue +39 -40
  66. package/components/navigation/footer/ui/a-footer-accordion.vue +9 -9
  67. package/components/navigation/header/AHeader.vue +13 -19
  68. package/components/navigation/header/AlmatyContacts.vue +78 -78
  69. package/components/navigation/header/CardGallery.vue +4 -4
  70. package/components/navigation/header/HeaderUsage.vue +4 -6
  71. package/components/navigation/header/ListItem.vue +2 -2
  72. package/components/navigation/header/NavCard.vue +1 -1
  73. package/components/navigation/header/NavList.vue +2 -2
  74. package/components/navigation/header/NotificationsMenu.vue +2 -3
  75. package/components/navigation/header/ProductMenu.vue +7 -7
  76. package/components/navigation/header/ProfileMenu.vue +26 -35
  77. package/components/navigation/header/SystemNotification.vue +1 -3
  78. package/components/navigation/pill-tabs/APillTabs.vue +2 -2
  79. package/components/navigation/pill-tabs/APillTabsV2.vue +22 -6
  80. package/components/overlays/drawer/ADrawerV2.vue +335 -0
  81. package/components/overlays/modal/AModal.vue +4 -4
  82. package/components/overlays/modal/AModalV2.vue +7 -4
  83. package/components/overlays/side-panel/ASidePanel.vue +6 -6
  84. package/components/overlays/sideover/ASlideover.vue +6 -6
  85. package/components/overlays/tooltip/ATooltip.vue +1 -1
  86. package/components/overlays/tooltip/ATooltipV2.vue +2 -12
  87. package/components/transitions/ATransitionHeight.vue +1 -1
  88. package/composables/useHeaderNavigationLinks.ts +100 -94
  89. package/icons/archive.vue +16 -0
  90. package/icons/arrow/arrows-in.vue +11 -0
  91. package/icons/arrow/arrows-out.vue +11 -0
  92. package/icons/arrow/arrows-resize-in.vue +38 -0
  93. package/icons/arrow/arrows-resize-out.vue +17 -0
  94. package/icons/bot.vue +52 -0
  95. package/icons/clock-time.vue +24 -0
  96. package/icons/compare-outlined.vue +8 -0
  97. package/icons/dots-horizontal.vue +31 -0
  98. package/icons/download-line.vue +13 -0
  99. package/icons/egov.vue +41 -0
  100. package/icons/elicense.vue +38 -0
  101. package/icons/favourite-bookmark-outline.vue +17 -0
  102. package/icons/file-pen.vue +31 -0
  103. package/icons/file-stack.vue +31 -0
  104. package/icons/file-types/excel.vue +131 -0
  105. package/icons/file-types/html.vue +13 -0
  106. package/icons/file-types/jpeg.vue +16 -0
  107. package/icons/file-types/pdf.vue +11 -0
  108. package/icons/file-types/png.vue +11 -0
  109. package/icons/file-types/rar.vue +11 -0
  110. package/icons/file-types/word.vue +50 -0
  111. package/icons/file-types/zip.vue +11 -0
  112. package/icons/git-compare.vue +38 -0
  113. package/icons/graduation-cap.vue +31 -0
  114. package/icons/graph-loading.vue +34 -0
  115. package/icons/help-question-circle.vue +26 -0
  116. package/icons/in-row-type.vue +46 -0
  117. package/icons/in-table-type.vue +29 -0
  118. package/icons/message-dotted.vue +30 -0
  119. package/icons/notification-error.vue +17 -0
  120. package/icons/person.vue +22 -0
  121. package/icons/settings.vue +26 -0
  122. package/icons/shield-alert.vue +31 -0
  123. package/icons/socials/facebook-color.vue +16 -0
  124. package/icons/socials/globe-color.vue +16 -0
  125. package/icons/socials/instagram-color.vue +46 -0
  126. package/icons/socials/linkedin-color.vue +14 -0
  127. package/icons/socials/telegram-color.vue +16 -0
  128. package/icons/socials/tiktok-color.vue +14 -0
  129. package/icons/socials/vk-color.vue +16 -0
  130. package/icons/socials/youtube-color.vue +16 -0
  131. package/icons/view-eye-open.vue +13 -0
  132. package/lang/en.ts +1 -0
  133. package/lang/kk.ts +1 -0
  134. package/lang/ru.ts +1 -0
  135. package/package.json +1 -1
  136. package/plugins/toast.client.ts +38 -55
  137. package/tailwind.config.ts +147 -116
  138. package/utils/twMerge.ts +34 -0
  139. package/components/elements/tree-select/components/tree-select-nodes.vue +0 -91
@@ -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
@@ -69,7 +67,7 @@ const valueColorClass = computed(() =>
69
67
  </div>
70
68
 
71
69
  <span
72
- class="text-sm tabular-nums leading-none"
70
+ class="text-body-md tabular-nums leading-none"
73
71
  data-test-id="header-usage-requests"
74
72
  >
75
73
  <span
@@ -79,7 +77,7 @@ const valueColorClass = computed(() =>
79
77
  </span>
80
78
 
81
79
  <template #content>
82
- <span class="whitespace-nowrap text-[11px] leading-none text-deepblue-900 dark:text-gray-100">
80
+ <span class="whitespace-nowrap text-body-sm leading-none text-deepblue-900 dark:text-gray-100">
83
81
  Лимит запросов: {{ limitRemaining }}
84
82
  </span>
85
83
  </template>
@@ -99,11 +97,11 @@ const valueColorClass = computed(() =>
99
97
  data-test-id="header-usage-days"
100
98
  >
101
99
  <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>
100
+ <span class="text-body-md font-bold tabular-nums text-gray-900 dark:text-gray-100">{{ daysRemaining }}</span>
103
101
  </div>
104
102
 
105
103
  <template #content>
106
- <span class="whitespace-nowrap text-[11px] leading-none text-deepblue-900 dark:text-gray-100">
104
+ <span class="whitespace-nowrap text-body-sm leading-none text-deepblue-900 dark:text-gray-100">
107
105
  Остаток дней: {{ daysRemaining }}
108
106
  </span>
109
107
  </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
@@ -34,7 +34,7 @@ function isActive(itemPath: string) {
34
34
  class="group/title flex min-w-0 items-center gap-2 text-base font-semibold text-deepblue-900 transition-colors hover:text-blue-700 dark:text-gray-100 dark:hover:text-blue-500"
35
35
  >
36
36
  <span
37
- class="flex size-8 shrink-0 items-center justify-center rounded-lg bg-blue-50 text-blue-500 transition-colors group-hover/title:bg-blue-700 group-hover/title:text-white dark:bg-blue-500/10 dark:text-blue-500 dark:group-hover/title:bg-blue-500">
37
+ class="flex size-8 shrink-0 items-center justify-center rounded-md bg-blue-50 text-blue-500 transition-colors group-hover/title:bg-blue-700 group-hover/title:text-white dark:bg-blue-500/10 dark:text-blue-500 dark:group-hover/title:bg-blue-500">
38
38
  <component
39
39
  :is="icon"
40
40
  class="size-4"
@@ -53,7 +53,7 @@ function isActive(itemPath: string) {
53
53
  v-if="item.to"
54
54
  :to="item.to"
55
55
  itemprop="name"
56
- class="group/item flex items-center gap-2 rounded-lg px-2 py-1.5 transition-colors hover:bg-gray-50 dark:hover:bg-gray-200/10"
56
+ class="group/item flex items-center gap-2 rounded-md px-2 py-1.5 transition-colors hover:bg-gray-50 dark:hover:bg-gray-200/10"
57
57
  :class="{ 'bg-blue-100 dark:bg-gray-200/10': isActive(item.to) }"
58
58
  >
59
59
  <a-icon-chevron-right class="size-[14px] shrink-0 text-gray-300 group-hover/item:text-blue-500 dark:group-hover/item:text-blue-700" />
@@ -14,9 +14,8 @@ defineProps<{
14
14
  }>()
15
15
  </script>
16
16
  <template>
17
- <div class="flex w-[423px] flex-col gap-4 rounded-lg bg-white p-4 dark:bg-gray-900">
17
+ <div class="flex w-[423px] flex-col gap-4 rounded-md bg-white p-4 dark:bg-gray-900">
18
18
  <div class="flex items-center justify-between">
19
- <!-- <h4 class="heading-04">{{ $t('header.notifications.title') }}</h4>-->
20
19
  <h4 class="heading-04">Уведомления</h4>
21
20
  <ADigitBadge :value="`${notifications?.length} новых`" size="lg" />
22
21
  </div>
@@ -26,7 +25,7 @@ defineProps<{
26
25
  <li
27
26
  v-for="(notification, idx) in notifications"
28
27
  :key="idx"
29
- class="flex items-center justify-between gap-2.5 rounded-md bg-gray-50 px-4 py-2 dark:bg-gray-950"
28
+ class="flex items-center justify-between gap-2.5 rounded-sm bg-gray-50 px-4 py-2 dark:bg-gray-950"
30
29
  >
31
30
  <div class="rounded-full bg-blue-500 p-2">
32
31
  <icon-user />
@@ -2,10 +2,10 @@
2
2
  import NavList from '#adata-ui/components/navigation/header/NavList.vue'
3
3
  import { useActiveNavigation } from '#adata-ui/composables/useActiveNavigation'
4
4
  import { useHeaderNavigationLinks } from '#adata-ui/composables/useHeaderNavigationLinks'
5
- import { PAGES } from '#adata-ui/shared/constans/pages'
6
5
  import { useUrls } from '#adata-ui/composables/useUrls'
7
6
  import AIconArrowRight from '#adata-ui/icons/arrow/arrow-right.vue'
8
7
  import AIconDownloadRounded from '#adata-ui/icons/download-rounded.vue'
8
+ import { PAGES } from '#adata-ui/shared/constans/pages'
9
9
 
10
10
  defineProps<{ url?: string }>()
11
11
  defineEmits(['outerClick', 'mouseOver'])
@@ -38,7 +38,7 @@ function handleExportClick() {
38
38
  <div class="relative bg-white dark:bg-gray-950">
39
39
  <div class="a-container max-h-[calc(100dvh-4rem)] overflow-y-auto overscroll-contain py-8">
40
40
  <div class="flex justify-between gap-5">
41
- <div class="grid min-w-0 flex-1 grid-cols-5 gap-x-3 gap-y-3">
41
+ <div class="grid min-w-0 flex-1 grid-cols-5 gap-3">
42
42
  <div
43
43
  v-for="(column, index) in catalogColumns"
44
44
  :key="index"
@@ -62,10 +62,10 @@ function handleExportClick() {
62
62
  v-if="module.key === 'edo'"
63
63
  #bottom
64
64
  >
65
- <div class="mt-4 flex flex-col gap-4 rounded-xl bg-blue-700 dark:bg-blue-500 p-4 text-white normal-case">
65
+ <div class="mt-4 flex flex-col gap-4 rounded-lg bg-blue-700 p-4 normal-case text-white dark:bg-blue-500">
66
66
  <div class="flex items-center gap-3">
67
- <span class="p-[10px] bg-white rounded-[10px] dark:bg-gray-950">
68
- <AIconDownloadRounded class="size-5 text-blue-700 dark:text-blue-500" />
67
+ <span class="rounded-[10px] bg-white p-[10px] dark:bg-gray-950">
68
+ <a-icon-download-rounded class="size-5 text-blue-700 dark:text-blue-500" />
69
69
  </span>
70
70
  <span class="font-semibold text-white dark:text-gray-950">
71
71
  {{ t('header.products.exportCard.title') }}
@@ -78,14 +78,14 @@ function handleExportClick() {
78
78
 
79
79
  <a-button-v2
80
80
  view="soft"
81
- class="!h-9 w-fit !bg-white dark:!bg-gray-950 text-blue-700 dark:text-blue-500"
81
+ class="!h-9 w-fit !bg-white text-blue-700 dark:!bg-gray-950 dark:text-blue-500"
82
82
  size="sm"
83
83
  :icon="AIconArrowRight"
84
84
  icon-right
85
85
  @click="handleExportClick"
86
86
  >
87
87
  <span class="text-sm">
88
- {{ t('header.products.exportCard.receive') }}
88
+ {{ t('header.products.exportCard.receive') }}
89
89
  </span>
90
90
  </a-button-v2>
91
91
  </div>
@@ -39,23 +39,20 @@ function onReplenish() {
39
39
  </script>
40
40
 
41
41
  <template>
42
- <div class="w-full overflow-hidden bg-white text-deepblue-900 dark:bg-gray-900 dark:text-gray-200 lg:w-[320px] lg:rounded-xl lg:border lg:border-gray-200 lg:dark:border-gray-800">
43
- <!-- Subscription & balance card -->
42
+ <div class="w-full overflow-hidden bg-white text-deepblue-900 dark:bg-gray-900 dark:text-gray-200 lg:w-[320px] lg:rounded-lg lg:border lg:border-gray-200 lg:dark:border-gray-800">
44
43
  <div class="p-2">
45
- <div class="relative overflow-hidden rounded-xl bg-gradient-to-br from-blue-700/95 to-blue-500/85 p-3 text-white">
46
- <!-- decorative glow for a "living" feel -->
44
+ <div class="relative overflow-hidden rounded-lg bg-gradient-to-br from-blue-700/95 to-blue-500/85 p-3 text-white">
47
45
  <div class="pointer-events-none absolute -right-8 -top-10 size-28 rounded-full bg-white/20 blur-2xl" aria-hidden="true" />
48
46
 
49
47
  <div class="relative">
50
- <!-- Tariff -->
51
- <p class="text-[11px] font-medium uppercase tracking-wide text-white/70">
48
+ <p class="text-overline-medium uppercase text-white/70">
52
49
  {{ t('header.profile.tariff') }}
53
50
  </p>
54
51
  <div class="mt-0.5 flex items-center justify-between gap-2">
55
- <p class="truncate text-lg font-bold leading-tight">
52
+ <p class="truncate text-h4">
56
53
  {{ rate }}
57
54
  </p>
58
- <span class="inline-flex shrink-0 items-center gap-1.5 rounded-full px-2 py-0.5 text-[11px] font-medium text-white ring-1 ring-inset ring-white/20">
55
+ <span class="inline-flex shrink-0 items-center gap-1.5 rounded-full px-2 py-0.5 text-body-sm-medium text-white ring-1 ring-inset ring-white/20">
59
56
  <span class="relative flex size-1.5 items-center justify-center">
60
57
  <span class="absolute inline-flex size-full animate-ping rounded-full bg-green-400/80" />
61
58
  <span class="relative inline-flex size-1.5 rounded-full bg-green-400" />
@@ -64,10 +61,9 @@ function onReplenish() {
64
61
  </span>
65
62
  </div>
66
63
 
67
- <!-- Email (mobile only — desktop shows it in the header trigger) -->
68
64
  <p
69
65
  v-if="email"
70
- class="mt-1 truncate text-xs text-white/75 lg:hidden"
66
+ class="mt-1 truncate text-body-sm text-white/75 lg:hidden"
71
67
  data-test-id="profile-menu-email"
72
68
  >
73
69
  {{ email }}
@@ -75,42 +71,39 @@ function onReplenish() {
75
71
 
76
72
  <div class="my-2 h-px bg-white/15" />
77
73
 
78
- <!-- Balance -->
79
74
  <div class="flex items-center justify-between gap-2">
80
- <span class="text-xs text-white/80">{{ t('header.profile.currentBalance') }}</span>
81
- <span class="text-base font-bold tabular-nums">{{ formattedBalance }} ₸</span>
75
+ <span class="text-body-sm text-white/80">{{ t('header.profile.currentBalance') }}</span>
76
+ <span class="text-body-lg font-bold tabular-nums">{{ formattedBalance }} ₸</span>
82
77
  </div>
83
78
 
84
- <!-- Usage stats (mobile only — desktop shows them in the header bar) -->
85
79
  <div class="mt-2 grid grid-cols-2 gap-2 lg:hidden">
86
- <div class="flex items-center gap-2 rounded-lg px-2 py-1.5 ring-1 ring-inset ring-white/15">
80
+ <div class="flex items-center gap-2 rounded-md px-2 py-1.5 ring-1 ring-inset ring-white/15">
87
81
  <gauge class="size-4 shrink-0 text-white/80" />
88
82
  <div class="min-w-0">
89
- <p class="truncate text-[10px] uppercase leading-none text-white/70">
83
+ <p class="truncate text-body-sm uppercase leading-none text-white/70">
90
84
  {{ t('header.profile.requests') }}
91
85
  </p>
92
- <p class="mt-1 text-sm font-bold tabular-nums leading-none">
86
+ <p class="mt-1 text-body-md font-bold tabular-nums leading-none">
93
87
  {{ limitRemaining }}
94
88
  </p>
95
89
  </div>
96
90
  </div>
97
- <div class="flex items-center gap-2 rounded-lg px-2 py-1.5 ring-1 ring-inset ring-white/15">
91
+ <div class="flex items-center gap-2 rounded-md px-2 py-1.5 ring-1 ring-inset ring-white/15">
98
92
  <calendar class="size-4 shrink-0 text-white/80" />
99
93
  <div class="min-w-0">
100
- <p class="truncate text-[10px] uppercase leading-none text-white/70">
94
+ <p class="truncate text-body-sm uppercase leading-none text-white/70">
101
95
  {{ t('header.profile.daysLeft') }}
102
96
  </p>
103
- <p class="mt-1 text-sm font-bold tabular-nums leading-none">
97
+ <p class="mt-1 text-body-md font-bold tabular-nums leading-none">
104
98
  {{ daysRemaining }}
105
99
  </p>
106
100
  </div>
107
101
  </div>
108
102
  </div>
109
103
 
110
- <!-- Top up -->
111
104
  <button
112
105
  type="button"
113
- class="mt-2.5 inline-flex h-8 w-full cursor-pointer items-center justify-center gap-1.5 rounded-full bg-white px-3 text-sm font-semibold text-blue-700 shadow-sm transition-all duration-150 hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/70 focus-visible:ring-offset-2 focus-visible:ring-offset-blue-600 active:scale-[0.98]"
106
+ class="mt-2.5 inline-flex h-8 w-full cursor-pointer items-center justify-center gap-1.5 rounded-full bg-white px-3 text-body-md-strong text-blue-700 shadow-sm transition-all duration-150 hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/70 focus-visible:ring-offset-2 focus-visible:ring-offset-blue-600 active:scale-[0.98]"
114
107
  @click="onReplenish"
115
108
  >
116
109
  <a-icon-plus-circle class="size-4" />
@@ -122,31 +115,29 @@ function onReplenish() {
122
115
  </div>
123
116
  </div>
124
117
 
125
- <!-- Menu links -->
126
118
  <nav class="flex flex-col px-2 pb-2">
127
119
  <nuxt-link-locale
128
120
  v-for="item in items"
129
121
  :key="item.title"
130
- class="group flex items-center gap-3 rounded-lg px-2.5 py-2 text-sm transition-colors hover:bg-gray-50 dark:hover:bg-gray-800/60"
122
+ class="group flex items-center gap-3 rounded-md px-2.5 py-2 text-body-md transition-colors hover:bg-gray-50 dark:hover:bg-gray-800/60"
131
123
  :to="item.to"
132
124
  :data-test-id="item?.dataTestId"
133
125
  target="_blank"
134
126
  >
135
- <!-- <span-->
136
- <!-- class="flex size-8 shrink-0 items-center justify-center rounded-lg border border-blue-100 bg-blue-50 text-blue-700 dark:border-blue-900/40 dark:bg-blue-900/30 dark:text-blue-400"-->
137
- <!-- >-->
138
- <!-- <component-->
139
- <!-- :is="item.icon"-->
140
- <!-- class="size-4"-->
141
- <!-- />-->
142
- <!-- </span>-->
127
+ <!-- <span -->
128
+ <!-- class="flex size-8 shrink-0 items-center justify-center rounded-md border border-blue-100 bg-blue-50 text-blue-700 dark:border-blue-900/40 dark:bg-blue-900/30 dark:text-blue-400" -->
129
+ <!-- > -->
130
+ <!-- <component -->
131
+ <!-- :is="item.icon" -->
132
+ <!-- class="size-4" -->
133
+ <!-- /> -->
134
+ <!-- </span> -->
143
135
  <span class="truncate text-deepblue-900 group-hover:text-blue-700 dark:text-gray-200 dark:group-hover:text-blue-400">
144
136
  {{ item.title }}
145
137
  </span>
146
138
  </nuxt-link-locale>
147
139
  </nav>
148
140
 
149
- <!-- Footer: old version, theme (mobile), logout -->
150
141
  <div class="border-t border-gray-100 p-2 dark:border-gray-800">
151
142
  <a-change-version
152
143
  v-if="oldVersion"
@@ -156,7 +147,7 @@ function onReplenish() {
156
147
 
157
148
  <div
158
149
  v-if="!isLargeScreen"
159
- class="flex items-center justify-between rounded-lg px-2.5 py-2 text-sm text-deepblue-900 dark:text-gray-200"
150
+ class="flex items-center justify-between rounded-md px-2.5 py-2 text-body-md text-deepblue-900 dark:text-gray-200"
160
151
  >
161
152
  <span>{{ t('header.profile.colorScheme') }}</span>
162
153
  <a-color-mode />
@@ -164,7 +155,7 @@ function onReplenish() {
164
155
 
165
156
  <button
166
157
  type="button"
167
- class="flex w-full cursor-pointer items-center gap-3 rounded-lg px-2.5 py-2 text-sm font-medium text-red-600 transition-colors hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20"
158
+ class="flex w-full cursor-pointer items-center gap-3 rounded-md px-2.5 py-2 text-body-md-medium text-red-600 transition-colors hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20"
168
159
  data-test-id="logout-button"
169
160
  @click="$emit('logout')"
170
161
  >
@@ -19,7 +19,6 @@ const message = useCookie('message')
19
19
  const systemMessage = ref<string | null>(null)
20
20
  const isOpen = ref(false)
21
21
 
22
- // API expects the legacy "counterparty" code instead of "pk".
23
22
  const moduleName = computed(() => (currentModule.value === 'pk' ? 'counterparty' : currentModule.value))
24
23
 
25
24
  function localizedMessage(detail: SystemMessageDetail): string {
@@ -34,7 +33,6 @@ function localizedMessage(detail: SystemMessageDetail): string {
34
33
  }
35
34
 
36
35
  async function fetchNotification() {
37
- // The cookie is set once the user dismisses the banner — skip the request afterwards.
38
36
  if (message.value !== undefined) return
39
37
 
40
38
  try {
@@ -74,7 +72,7 @@ onMounted(fetchNotification)
74
72
  <a-icon-info-circle
75
73
  class="max-h-[16px] w-full max-w-[16px] shrink-0 stroke-orange-500"
76
74
  />
77
- <span class="text-sm font-semibold text-orange-500">{{ systemMessage }}</span>
75
+ <span class="text-body-md-strong text-orange-500">{{ systemMessage }}</span>
78
76
  </div>
79
77
  <a-icon-x-mark
80
78
  class="max-h-[16px] w-full max-w-[16px] shrink-0 cursor-pointer stroke-orange-500"
@@ -115,14 +115,14 @@ const viewTypeValues: ViewType = {
115
115
  }
116
116
 
117
117
  const defaultClasses = (isDisabled: boolean) => [
118
- 'text-sm rounded-md outline-none select-none focus-visible:shadow-[0_0_0_4px#1B64B3]',
118
+ 'text-sm rounded-sm outline-none select-none focus-visible:shadow-[0_0_0_4px#1B64B3]',
119
119
  isDisabled ? 'bg-deepblue-900/5 dark:bg-gray-200/5 text-gray-500 dark:text-gray-500' : '',
120
120
  props.view === 'transparent' && isDisabled ? 'bg-transparent' : '',
121
121
  viewTypeValues[props.view]['default'],
122
122
  props.block ? 'w-full' : ''
123
123
  ]
124
124
  const selectedClasses = () => [
125
- 'text-sm rounded-md select-none focus-visible:shadow-[0_0_0_4px#1B64B3]',
125
+ 'text-sm rounded-sm select-none focus-visible:shadow-[0_0_0_4px#1B64B3]',
126
126
  viewTypeValues[props.view]['selected'],
127
127
  props.block ? 'w-full' : ''
128
128
  ]