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.
- package/.claude/settings.local.json +19 -0
- package/assets/styles/index.scss +67 -5
- package/components/elements/a-select-row/ASelectRowV2.vue +8 -8
- package/components/elements/a-select-row/index.vue +3 -5
- package/components/elements/accordion/AAccordion.vue +5 -3
- package/components/elements/accordion/AAccordionGroup/AAccordionGroup.vue +3 -3
- package/components/elements/alert/AAlert.vue +34 -47
- package/components/elements/bg-block/ABgBlock.vue +1 -1
- package/components/elements/button/AButton.vue +3 -3
- package/components/elements/button/AButtonV2.vue +7 -5
- package/components/elements/button-login/index.vue +1 -1
- package/components/elements/chip-wrapper/AChipWrapper.vue +1 -1
- package/components/elements/chips/AChips.vue +2 -2
- package/components/elements/digit-badge/ADigitBadge.vue +21 -19
- package/components/elements/feature-description/AFeatureDescription.vue +1 -1
- package/components/elements/leave-note/ALeaveNote.vue +1 -1
- package/components/elements/pagination/APagination.vue +7 -7
- package/components/elements/segmented/ASegmentedV2.vue +103 -10
- package/components/elements/select/ASelect.vue +4 -4
- package/components/elements/select/ASelectMobile.vue +2 -2
- package/components/elements/select/ASelectV2.vue +10 -11
- package/components/elements/select/ui/select-button.vue +1 -1
- package/components/elements/status-badge/AStatusBadge.vue +22 -19
- package/components/elements/status-badge-v2/StatusBadgeV2.vue +1 -3
- package/components/elements/table/ATable.vue +1 -1
- package/components/elements/table/table.config.ts +2 -2
- package/components/elements/tree-select/ATreeSelect.vue +97 -113
- package/components/elements/tree-select/TreeService.ts +142 -207
- package/components/elements/tree-select/components/ATreeSelectNode.vue +104 -0
- package/components/elements/tree-select/types.ts +40 -11
- package/components/elements/tree-select/utils.ts +30 -0
- package/components/elements/tree-select-modal/ATreeSelectModal.vue +217 -0
- package/components/features/color-mode/AColorMode.client.vue +1 -1
- package/components/features/dropdown/ADropdownV2.vue +1 -2
- package/components/features/lang-switcher/lang-switcher.vue +9 -4
- package/components/features/payment/banner/BasicPlusLimitBanner.vue +3 -3
- package/components/features/payment/banner/PaymentBanner.vue +3 -3
- package/components/features/payment/banner/UpSellBanner.vue +3 -3
- package/components/features/payment/process/PaymentKaspiQrSidePanel.vue +43 -27
- package/components/features/payment/process/PaymentKaspiRedirectSidePanel.vue +34 -23
- package/components/features/payment/process/PaymentMethodSidePanel.vue +61 -49
- package/components/features/payment/process/PaymentProcess.vue +6 -6
- package/components/features/payment/process/PaymentTopUpSidePanel.vue +44 -63
- package/components/features/pk-mobile-services/APkMobileServices.vue +1 -1
- package/components/features//321/201hange-version/AChangeVersion.vue +2 -2
- package/components/forms/checkbox/ACheckbox.vue +1 -1
- package/components/forms/checkbox/ACheckboxV2.vue +5 -5
- package/components/forms/input/AInputV2.vue +4 -4
- package/components/forms/input/date/AInputDate.vue +2 -2
- package/components/forms/input/password/AInputPassword.vue +8 -2
- package/components/forms/input/standard/AInputStandard.vue +3 -3
- package/components/forms/input/textarea/ATextarea.vue +2 -2
- package/components/forms/toggle/AToggle.vue +2 -3
- package/components/forms/toggle/AToggleV2.vue +3 -3
- package/components/modals/AnotherDeviceModal.vue +1 -1
- package/components/modals/ContactsMobileModel.vue +1 -1
- package/components/modals/ContentNavigationModal.vue +77 -333
- package/components/modals/Insufficient-funds-modal.vue +1 -1
- package/components/modals/PaymentMethodModal.vue +1 -1
- package/components/modals/id/IdBanner.vue +3 -3
- package/components/modals/id/IdRecoveryModal.vue +1 -1
- package/components/navigation/bottom-navigation/ABottomNavigation.vue +1 -1
- package/components/navigation/breadcrumbs/ABreadcrumbs.vue +106 -45
- package/components/navigation/breadcrumbs/types.ts +3 -0
- package/components/navigation/footer/AFooter.vue +39 -40
- package/components/navigation/footer/ui/a-footer-accordion.vue +9 -9
- package/components/navigation/header/AHeader.vue +13 -19
- package/components/navigation/header/AlmatyContacts.vue +78 -78
- package/components/navigation/header/CardGallery.vue +4 -4
- package/components/navigation/header/HeaderUsage.vue +4 -6
- package/components/navigation/header/ListItem.vue +2 -2
- package/components/navigation/header/NavCard.vue +1 -1
- package/components/navigation/header/NavList.vue +2 -2
- package/components/navigation/header/NotificationsMenu.vue +2 -3
- package/components/navigation/header/ProductMenu.vue +7 -7
- package/components/navigation/header/ProfileMenu.vue +26 -35
- package/components/navigation/header/SystemNotification.vue +1 -3
- package/components/navigation/pill-tabs/APillTabs.vue +2 -2
- package/components/navigation/pill-tabs/APillTabsV2.vue +22 -6
- package/components/overlays/drawer/ADrawerV2.vue +335 -0
- package/components/overlays/modal/AModal.vue +4 -4
- package/components/overlays/modal/AModalV2.vue +7 -4
- package/components/overlays/side-panel/ASidePanel.vue +6 -6
- package/components/overlays/sideover/ASlideover.vue +6 -6
- package/components/overlays/tooltip/ATooltip.vue +1 -1
- package/components/overlays/tooltip/ATooltipV2.vue +2 -12
- package/components/transitions/ATransitionHeight.vue +1 -1
- package/composables/useHeaderNavigationLinks.ts +100 -94
- package/icons/archive.vue +16 -0
- package/icons/arrow/arrows-in.vue +11 -0
- package/icons/arrow/arrows-out.vue +11 -0
- package/icons/arrow/arrows-resize-in.vue +38 -0
- package/icons/arrow/arrows-resize-out.vue +17 -0
- package/icons/bot.vue +52 -0
- package/icons/clock-time.vue +24 -0
- package/icons/compare-outlined.vue +8 -0
- package/icons/dots-horizontal.vue +31 -0
- package/icons/download-line.vue +13 -0
- package/icons/egov.vue +41 -0
- package/icons/elicense.vue +38 -0
- package/icons/favourite-bookmark-outline.vue +17 -0
- package/icons/file-pen.vue +31 -0
- package/icons/file-stack.vue +31 -0
- package/icons/file-types/excel.vue +131 -0
- package/icons/file-types/html.vue +13 -0
- package/icons/file-types/jpeg.vue +16 -0
- package/icons/file-types/pdf.vue +11 -0
- package/icons/file-types/png.vue +11 -0
- package/icons/file-types/rar.vue +11 -0
- package/icons/file-types/word.vue +50 -0
- package/icons/file-types/zip.vue +11 -0
- package/icons/git-compare.vue +38 -0
- package/icons/graduation-cap.vue +31 -0
- package/icons/graph-loading.vue +34 -0
- package/icons/help-question-circle.vue +26 -0
- package/icons/in-row-type.vue +46 -0
- package/icons/in-table-type.vue +29 -0
- package/icons/message-dotted.vue +30 -0
- package/icons/notification-error.vue +17 -0
- package/icons/person.vue +22 -0
- package/icons/settings.vue +26 -0
- package/icons/shield-alert.vue +31 -0
- package/icons/socials/facebook-color.vue +16 -0
- package/icons/socials/globe-color.vue +16 -0
- package/icons/socials/instagram-color.vue +46 -0
- package/icons/socials/linkedin-color.vue +14 -0
- package/icons/socials/telegram-color.vue +16 -0
- package/icons/socials/tiktok-color.vue +14 -0
- package/icons/socials/vk-color.vue +16 -0
- package/icons/socials/youtube-color.vue +16 -0
- package/icons/view-eye-open.vue +13 -0
- package/lang/en.ts +1 -0
- package/lang/kk.ts +1 -0
- package/lang/ru.ts +1 -0
- package/package.json +1 -1
- package/plugins/toast.client.ts +38 -55
- package/tailwind.config.ts +147 -116
- package/utils/twMerge.ts +34 -0
- 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="
|
|
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="
|
|
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="
|
|
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
|
|
79
|
+
<div class="flex h-full flex-col justify-between gap-4">
|
|
32
80
|
<div class="flex flex-col gap-2 ">
|
|
33
|
-
<div class="
|
|
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))]
|
|
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
|
|
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="
|
|
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="
|
|
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
|
|
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="
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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="
|
|
68
|
-
<
|
|
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
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
81
|
-
<span class="text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
]
|