adata-ui 2.1.40-beta.11 → 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/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 +3 -3
- package/components/features/payment/process/PaymentKaspiRedirectSidePanel.vue +1 -1
- package/components/features/payment/process/PaymentMethodSidePanel.vue +3 -3
- package/components/features/payment/process/PaymentTopUpSidePanel.vue +2 -2
- 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 +3 -3
- 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/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 +2 -4
- 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 +1 -1
- 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 +5 -5
- package/components/overlays/drawer/ADrawerV2.vue +335 -0
- package/components/overlays/modal/AModal.vue +4 -4
- package/components/overlays/modal/AModalV2.vue +4 -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/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,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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
173
|
-
<div class="flex flex-col gap-8
|
|
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-
|
|
180
|
+
<p class="text-body-md">
|
|
182
181
|
{{ t('footer.subtitle') }}
|
|
183
182
|
</p>
|
|
184
183
|
|
|
185
|
-
<div class="hidden lg:flex
|
|
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
|
|
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:
|
|
210
|
-
<div class="flex gap-[18px] lg:
|
|
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
|
|
221
|
+
<!-- noindex -->
|
|
222
|
+
<div class="flex flex-col items-start gap-2" data-nosnippet>
|
|
224
223
|
<nuxt-link
|
|
225
|
-
class="
|
|
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
|
|
234
|
+
class="flex items-center gap-2"
|
|
236
235
|
>
|
|
237
236
|
<nuxt-link
|
|
238
|
-
class="
|
|
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
|
-
|
|
258
|
+
<!-- /noindex -->
|
|
260
259
|
</div>
|
|
261
260
|
|
|
262
|
-
<div class="
|
|
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
|
|
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
|
|
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
|
|
41
|
-
<div class="flex
|
|
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="
|
|
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
|
|
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:
|
|
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
|
|
80
|
+
class="flex items-center gap-2"
|
|
81
81
|
>
|
|
82
82
|
<nuxt-link
|
|
83
|
-
class="
|
|
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="
|
|
91
|
+
class="rounded-xs bg-white/20 px-1 py-[2px] text-body-sm font-bold"
|
|
92
92
|
>
|
|
93
93
|
NEW
|
|
94
94
|
</div>
|
|
@@ -56,8 +56,6 @@ const langIsOn = myLayer.langIsOn
|
|
|
56
56
|
const contacts = useContacts()
|
|
57
57
|
const { loginModal } = useIdModals()
|
|
58
58
|
|
|
59
|
-
// Anchor the navigation mega-menu to the actual bottom of the header bar so it
|
|
60
|
-
// stays aligned even when the system-notification banner is shown above it.
|
|
61
59
|
const headerRef = ref<HTMLElement | null>(null)
|
|
62
60
|
const { bottom: headerBottom } = useElementBounding(headerRef)
|
|
63
61
|
|
|
@@ -142,7 +140,7 @@ onMounted(() => {
|
|
|
142
140
|
@click="$emit('search')"
|
|
143
141
|
>
|
|
144
142
|
<a-icon-search class="text-gray-400 dark:text-gray-500" />
|
|
145
|
-
<span class="body-
|
|
143
|
+
<span class="text-body-md text-gray-500 dark:text-gray-400">{{ t('header.search') }}</span>
|
|
146
144
|
</button>
|
|
147
145
|
</div>
|
|
148
146
|
</section>
|
|
@@ -199,7 +197,7 @@ onMounted(() => {
|
|
|
199
197
|
<template #default="{ toggle, isOpen }">
|
|
200
198
|
<button
|
|
201
199
|
type="button"
|
|
202
|
-
class="hidden h-8 cursor-pointer items-center gap-1.5 rounded-full px-3 text-
|
|
200
|
+
class="hidden h-8 cursor-pointer items-center gap-1.5 rounded-full px-3 text-body-md-medium transition-colors duration-150 hover:bg-deepblue-900/5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/50 focus-visible:ring-offset-1 dark:hover:bg-white/10 dark:focus-visible:ring-offset-gray-900 lg:inline-flex"
|
|
203
201
|
:class="isOpen
|
|
204
202
|
? 'bg-deepblue-900/10 text-deepblue-900 dark:bg-white/15 dark:text-white'
|
|
205
203
|
: 'text-gray-900 dark:text-gray-100'"
|
|
@@ -1,16 +1,64 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { useContacts } from '#adata-ui/composables/projectState'
|
|
3
|
+
import Clock from '#adata-ui/icons/clock.vue'
|
|
4
|
+
import ExpandWindow from '#adata-ui/icons/expand-window.vue'
|
|
5
|
+
import Location from '#adata-ui/icons/location.vue'
|
|
6
|
+
import Mail from '#adata-ui/icons/mail.vue'
|
|
7
|
+
import Phone from '#adata-ui/icons/phone.vue'
|
|
8
|
+
import Whatsapp from '#adata-ui/icons/whatsapp.vue'
|
|
9
|
+
|
|
10
|
+
const { t } = useI18n()
|
|
11
|
+
const contacts = useContacts()
|
|
12
|
+
const AlmatyItems = computed(() => ([
|
|
13
|
+
{
|
|
14
|
+
title: t('header.contacts.almaty.adress.title'),
|
|
15
|
+
subtitle: t('header.contacts.almaty.adress.subtitle'),
|
|
16
|
+
icon: Location,
|
|
17
|
+
to: 'https://yandex.kz/maps/ru/org/avrora_kholding/1099794306/?ll=76.912479%2C43.208928&z=17.72',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
title: t('header.contacts.almaty.email.title'),
|
|
21
|
+
subtitle: 'info@adata.kz',
|
|
22
|
+
icon: Mail,
|
|
23
|
+
to: 'mailto:info@adata.kz',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
title: t('header.contacts.almaty.schedule.title'),
|
|
27
|
+
subtitle: t('header.contacts.almaty.schedule.subtitle'),
|
|
28
|
+
icon: Clock,
|
|
29
|
+
},
|
|
30
|
+
]))
|
|
31
|
+
|
|
32
|
+
const technicalSupport = computed(() => ([
|
|
33
|
+
{
|
|
34
|
+
subtitle: t('header.contacts.almaty.support.linkTitle'),
|
|
35
|
+
icon: ExpandWindow,
|
|
36
|
+
to: 'https://api.whatsapp.com/send/?phone=77712289041',
|
|
37
|
+
},
|
|
38
|
+
]))
|
|
39
|
+
|
|
40
|
+
const newContacts = computed(() => contacts.value.map(item => ({
|
|
41
|
+
subtitle: item.contact,
|
|
42
|
+
icon: item.platform_code === 'telephone' ? Phone : Whatsapp,
|
|
43
|
+
to: item.platform_code === 'telephone'
|
|
44
|
+
? `tel:${item.contact}`
|
|
45
|
+
: `https://api.whatsapp.com/send/?phone=${item.contact.replace(/\D/g, '')}`,
|
|
46
|
+
})))
|
|
47
|
+
</script>
|
|
48
|
+
|
|
1
49
|
<template>
|
|
2
|
-
<!--noindex-->
|
|
50
|
+
<!-- noindex -->
|
|
3
51
|
<div class="h-[272px]" data-nosnippet>
|
|
4
|
-
<h2 class="
|
|
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 />
|