adata-ui 3.1.15 → 3.1.16
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/dist/module.json +1 -1
- package/dist/runtime/components/NewFooter.vue +4 -1
- package/dist/runtime/components/feature-description/FeatureDescription.vue +105 -0
- package/dist/runtime/components/feature-description/FeatureDescription.vue.d.ts +18 -0
- package/dist/runtime/components/header/AlmatyContacts.vue +3 -1
- package/dist/runtime/components/header/AstanaContacts.vue +3 -1
- package/dist/runtime/components/header/CardGallery.vue +8 -5
- package/dist/runtime/components/header/ProductMenu.vue +3 -3
- package/dist/runtime/components/photos-animation/PhotosAnimation.vue +26 -0
- package/dist/runtime/components/photos-animation/PhotosAnimation.vue.d.ts +9 -0
- package/dist/runtime/components/transitions/TransitionHeight.vue +58 -0
- package/dist/runtime/components/transitions/TransitionHeight.vue.d.ts +18 -0
- package/package.json +1 -1
package/dist/module.json
CHANGED
|
@@ -201,7 +201,9 @@ const contactLinks = {
|
|
|
201
201
|
</div>
|
|
202
202
|
|
|
203
203
|
<!-- contactLinks -->
|
|
204
|
-
|
|
204
|
+
<!--noindex-->
|
|
205
|
+
|
|
206
|
+
<div class="flex flex-col gap-2 items-start" data-nosnippet>
|
|
205
207
|
<nuxt-link-locale
|
|
206
208
|
class="text-sm font-semibold pb-3 pr-4 border-b border-b-[0.5px] border-white cursor-default"
|
|
207
209
|
:class="{ 'cursor-pointer': contactLinks.link }"
|
|
@@ -242,6 +244,7 @@ const contactLinks = {
|
|
|
242
244
|
</div>
|
|
243
245
|
</div>
|
|
244
246
|
</div>
|
|
247
|
+
<!--/noindex-->
|
|
245
248
|
</div>
|
|
246
249
|
|
|
247
250
|
<div class="lg:hidden flex gap-8 flex-wrap">
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { onMounted, onUnmounted } from "#imports";
|
|
3
|
+
const props = defineProps({
|
|
4
|
+
features: { type: Array, required: true }
|
|
5
|
+
});
|
|
6
|
+
const selected = defineModel({ type: Number, ...{ default: 0 } });
|
|
7
|
+
const duration = 5e3;
|
|
8
|
+
let timer = null;
|
|
9
|
+
const nextFeature = () => {
|
|
10
|
+
selected.value = (selected.value + 1) % props.features.length;
|
|
11
|
+
startTimer();
|
|
12
|
+
};
|
|
13
|
+
const startTimer = () => {
|
|
14
|
+
clearTimer();
|
|
15
|
+
timer = setTimeout(() => {
|
|
16
|
+
nextFeature();
|
|
17
|
+
}, duration);
|
|
18
|
+
};
|
|
19
|
+
const clearTimer = () => {
|
|
20
|
+
if (timer) {
|
|
21
|
+
clearTimeout(timer);
|
|
22
|
+
timer = null;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
function selectFeature(idx) {
|
|
26
|
+
selected.value = idx;
|
|
27
|
+
startTimer();
|
|
28
|
+
}
|
|
29
|
+
onMounted(() => startTimer());
|
|
30
|
+
onUnmounted(() => clearTimer());
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
<template>
|
|
34
|
+
<div
|
|
35
|
+
v-for="(item, idx) in features"
|
|
36
|
+
:key="idx"
|
|
37
|
+
class="relative flex flex-col pl-3 cursor-pointer"
|
|
38
|
+
@click="selectFeature(idx)"
|
|
39
|
+
>
|
|
40
|
+
<div
|
|
41
|
+
v-if="selected === idx"
|
|
42
|
+
class="absolute left-0 top-0 w-[2px] bg-blue-700 dark:bg-blue-500 z-20 h-full rounded-full"
|
|
43
|
+
:class="{ 'fill-animation': selected === idx }"
|
|
44
|
+
/>
|
|
45
|
+
|
|
46
|
+
<div
|
|
47
|
+
class="absolute left-0 top-0 w-[2px] bg-gray-500/50 z-10 h-full rounded-full"
|
|
48
|
+
/>
|
|
49
|
+
|
|
50
|
+
<div class="flex items-center gap-2 relative z-10">
|
|
51
|
+
<div
|
|
52
|
+
:class="[
|
|
53
|
+
'transition-all duration-300 ease-in-out',
|
|
54
|
+
selected === idx ? 'rounded-md bg-blue-700 dark:bg-blue-500 p-2 icon-bg' : 'size-fit'
|
|
55
|
+
]"
|
|
56
|
+
>
|
|
57
|
+
<component
|
|
58
|
+
:is="item.icon"
|
|
59
|
+
class="shrink-0 size-6 transition-colors duration-300 ease-in-out"
|
|
60
|
+
:class="selected === idx ? 'text-white dark:text-gray-900' : 'text-gray-600 dark:text-gray-200'"
|
|
61
|
+
/>
|
|
62
|
+
</div>
|
|
63
|
+
<p
|
|
64
|
+
class="font-semibold text-base lg:text-xl transition-colors duration-300 ease-in-out"
|
|
65
|
+
:class="selected === idx ? 'dark:text-[#E3E5E8]' : 'text-gray-600 dark:text-gray-200'"
|
|
66
|
+
>
|
|
67
|
+
{{ item.title }}
|
|
68
|
+
</p>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<adt-transitions-transition-height
|
|
72
|
+
:transition="{
|
|
73
|
+
enterActiveClass: 'overflow-hidden transition-[height] duration-[1s] ease-in-out',
|
|
74
|
+
leaveActiveClass: 'overflow-hidden transition-[height] duration-[1s] ease-in-out'
|
|
75
|
+
}"
|
|
76
|
+
>
|
|
77
|
+
<div
|
|
78
|
+
v-if="selected === idx"
|
|
79
|
+
>
|
|
80
|
+
<p class="text-xs lg:text-sm pt-3">
|
|
81
|
+
{{ item.description }}
|
|
82
|
+
</p>
|
|
83
|
+
</div>
|
|
84
|
+
</adt-transitions-transition-height>
|
|
85
|
+
</div>
|
|
86
|
+
</template>
|
|
87
|
+
|
|
88
|
+
<style scoped>
|
|
89
|
+
.icon-bg {
|
|
90
|
+
box-shadow: -4px 4px 0px 0px rgba(0, 122, 255, 0.1019607843);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.fill-animation {
|
|
94
|
+
animation: borderFill 5s linear forwards;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@keyframes borderFill {
|
|
98
|
+
0% {
|
|
99
|
+
height: 0;
|
|
100
|
+
}
|
|
101
|
+
100% {
|
|
102
|
+
height: 100%;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
</style>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Component } from 'vue';
|
|
2
|
+
interface FeatureInfo {
|
|
3
|
+
icon: Component;
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
}
|
|
7
|
+
type __VLS_Props = {
|
|
8
|
+
features: FeatureInfo[];
|
|
9
|
+
};
|
|
10
|
+
type __VLS_PublicProps = __VLS_Props & {
|
|
11
|
+
modelValue?: number;
|
|
12
|
+
};
|
|
13
|
+
declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
14
|
+
"update:modelValue": (value: number) => any;
|
|
15
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
16
|
+
"onUpdate:modelValue"?: ((value: number) => any) | undefined;
|
|
17
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
18
|
+
export default _default;
|
|
@@ -43,7 +43,8 @@ const newContacts = computed(() => contacts.value.map((item) => ({
|
|
|
43
43
|
</script>
|
|
44
44
|
|
|
45
45
|
<template>
|
|
46
|
-
|
|
46
|
+
<!--noindex-->
|
|
47
|
+
<div class="h-[272px]" data-nosnippet>
|
|
47
48
|
<h2 class="heading-02 mb-4">
|
|
48
49
|
{{ t("header.contacts.almaty.title") }}
|
|
49
50
|
</h2>
|
|
@@ -117,4 +118,5 @@ const newContacts = computed(() => contacts.value.map((item) => ({
|
|
|
117
118
|
</div>
|
|
118
119
|
</div>
|
|
119
120
|
</div>
|
|
121
|
+
<!--/noindex-->
|
|
120
122
|
</template>
|
|
@@ -33,7 +33,8 @@ const AstanaItems = [
|
|
|
33
33
|
</script>
|
|
34
34
|
|
|
35
35
|
<template>
|
|
36
|
-
|
|
36
|
+
<!--noindex-->
|
|
37
|
+
<div class="h-[272px]" data-nosnippet>
|
|
37
38
|
<h2 class="heading-02 mb-4">
|
|
38
39
|
{{ t("header.contacts.astana.title") }}
|
|
39
40
|
</h2>
|
|
@@ -62,4 +63,5 @@ const AstanaItems = [
|
|
|
62
63
|
</div>
|
|
63
64
|
</div>
|
|
64
65
|
</div>
|
|
66
|
+
<!--/noindex-->
|
|
65
67
|
</template>
|
|
@@ -1,28 +1,31 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import {
|
|
2
|
+
import { PAGES } from "../../shared/constants/pages";
|
|
3
|
+
import { computed, onMounted, onUnmounted, ref, useAppConfig, useI18n } from "#imports";
|
|
3
4
|
import ArrowSideUp from "#icons/arrow/arrow-side-up.vue";
|
|
4
5
|
import { IArrowCircleDown, IGlobe, IId } from "#components";
|
|
5
6
|
const { t } = useI18n();
|
|
7
|
+
const appConfig = useAppConfig();
|
|
8
|
+
const mode = appConfig.adataUI.mode;
|
|
6
9
|
const items = computed(() => {
|
|
7
10
|
return [
|
|
8
11
|
{
|
|
9
12
|
title: "header.products.galleryCards.unload.title",
|
|
10
13
|
subtitle: "header.products.galleryCards.unload.subtitle",
|
|
11
|
-
to:
|
|
14
|
+
to: `https://pk.${mode}.kz` + PAGES.pk.unload,
|
|
12
15
|
image: "/header/unload.webp",
|
|
13
16
|
icon: IArrowCircleDown
|
|
14
17
|
},
|
|
15
18
|
{
|
|
16
19
|
title: "header.products.galleryCards.compliance.title",
|
|
17
20
|
subtitle: "header.products.galleryCards.compliance.subtitle",
|
|
18
|
-
to:
|
|
21
|
+
to: `https://ac.${mode}.kz`,
|
|
19
22
|
image: "/header/compliance.webp",
|
|
20
23
|
icon: IId
|
|
21
24
|
},
|
|
22
25
|
{
|
|
23
26
|
title: "header.products.galleryCards.ved.title",
|
|
24
27
|
subtitle: "header.products.galleryCards.ved.subtitle",
|
|
25
|
-
to:
|
|
28
|
+
to: `https://tnved.${mode}.kz`,
|
|
26
29
|
image: "/header/ved.webp",
|
|
27
30
|
icon: IGlobe
|
|
28
31
|
}
|
|
@@ -103,7 +106,7 @@ onUnmounted(() => clearTimer());
|
|
|
103
106
|
<img
|
|
104
107
|
:src="items[currentIndex].image"
|
|
105
108
|
class="size-full object-cover rounded-2xl"
|
|
106
|
-
|
|
109
|
+
>
|
|
107
110
|
<nuxt-link :to="items[currentIndex].to">
|
|
108
111
|
<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">
|
|
109
112
|
<div class="flex flex-col gap-2">
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { PAGES } from "../../shared/constants/pages";
|
|
3
3
|
import NavList from "./NavList.vue";
|
|
4
4
|
import CardGallery from "./CardGallery.vue";
|
|
5
|
-
import { useI18n, useAppConfig, useRequestURL } from "#imports";
|
|
5
|
+
import { useI18n, useAppConfig, useRequestURL, computed } from "#imports";
|
|
6
6
|
import IUsersThree from "#icons/users/users-three.vue";
|
|
7
7
|
import ISearch from "#icons/search.vue";
|
|
8
8
|
import IArrowCircleDown from "#icons/arrow/arrow-circle-down.vue";
|
|
@@ -42,7 +42,7 @@ const appConfig = useAppConfig();
|
|
|
42
42
|
const mode = appConfig.adataUI.mode;
|
|
43
43
|
const pageUrl = useRequestURL();
|
|
44
44
|
defineEmits(["outerClick", "mouseOver"]);
|
|
45
|
-
const filteredItems = [
|
|
45
|
+
const filteredItems = computed(() => [
|
|
46
46
|
{
|
|
47
47
|
key: "edo",
|
|
48
48
|
is_new: true,
|
|
@@ -274,7 +274,7 @@ const filteredItems = [
|
|
|
274
274
|
}
|
|
275
275
|
]
|
|
276
276
|
}
|
|
277
|
-
];
|
|
277
|
+
]);
|
|
278
278
|
function isCurrentModule(currentModule) {
|
|
279
279
|
if (currentModule === "fines") return "avto";
|
|
280
280
|
if (currentModule === "analytics") return "analytics-new";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
const props = defineProps({
|
|
3
|
+
photos: { type: Array, required: true }
|
|
4
|
+
});
|
|
5
|
+
const getAnimationClass = (index) => {
|
|
6
|
+
if (props.photos.length === 1) return "fade-in";
|
|
7
|
+
const directions = ["from-top", "from-right", "from-bottom", "from-left"];
|
|
8
|
+
return directions[index % 4];
|
|
9
|
+
};
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<template>
|
|
13
|
+
<div class="relative size-full">
|
|
14
|
+
<img
|
|
15
|
+
v-for="(photo, index) in photos"
|
|
16
|
+
:key="index"
|
|
17
|
+
:src="photo.src"
|
|
18
|
+
:alt="photo.src"
|
|
19
|
+
:class="['photo', getAnimationClass(index), photo.classes]"
|
|
20
|
+
>
|
|
21
|
+
</div>
|
|
22
|
+
</template>
|
|
23
|
+
|
|
24
|
+
<style scoped>
|
|
25
|
+
.photo{animation:fadeSlide 1s forwards;opacity:0;position:absolute;transform:translate(0)}.fade-in{animation:fadeOnly 1s forwards}.from-top{animation-name:slideFromTop}.from-right{animation-name:slideFromRight}.from-bottom{animation-name:slideFromBottom}.from-left{animation-name:slideFromLeft}@keyframes fadeOnly{0%{opacity:0}to{opacity:1}}@keyframes slideFromTop{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}@keyframes slideFromRight{0%{opacity:0;transform:translateX(20px)}to{opacity:1;transform:translateX(0)}}@keyframes slideFromBottom{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes slideFromLeft{0%{opacity:0;transform:translateX(-20px)}to{opacity:1;transform:translateX(0)}}.photo{animation-duration:1s;animation-fill-mode:forwards}
|
|
26
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Photo {
|
|
2
|
+
src: string;
|
|
3
|
+
classes: string;
|
|
4
|
+
}
|
|
5
|
+
type __VLS_Props = {
|
|
6
|
+
photos: Photo[];
|
|
7
|
+
};
|
|
8
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
9
|
+
export default _default;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { twMerge } from "tailwind-merge";
|
|
3
|
+
import { computed } from "#imports";
|
|
4
|
+
const props = defineProps({
|
|
5
|
+
transition: { type: Object, required: false }
|
|
6
|
+
});
|
|
7
|
+
const ui = {
|
|
8
|
+
transition: {
|
|
9
|
+
enterActiveClass: "overflow-hidden transition-[height] duration-200 ease-out",
|
|
10
|
+
leaveActiveClass: "overflow-hidden transition-[height] duration-200 ease-out"
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
const mergedUi = computed(() => ({
|
|
14
|
+
transition: {
|
|
15
|
+
enterActiveClass: twMerge(
|
|
16
|
+
ui.transition.enterActiveClass,
|
|
17
|
+
props.transition?.enterActiveClass
|
|
18
|
+
),
|
|
19
|
+
leaveActiveClass: twMerge(
|
|
20
|
+
ui.transition.leaveActiveClass,
|
|
21
|
+
props.transition?.leaveActiveClass
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
}));
|
|
25
|
+
function onEnter(_el, done) {
|
|
26
|
+
const el = _el;
|
|
27
|
+
el.style.height = "0";
|
|
28
|
+
el.offsetHeight;
|
|
29
|
+
el.style.height = el.scrollHeight + "px";
|
|
30
|
+
el.addEventListener("transitionend", done, { once: true });
|
|
31
|
+
}
|
|
32
|
+
function onBeforeLeave(_el) {
|
|
33
|
+
const el = _el;
|
|
34
|
+
el.style.height = el.scrollHeight + "px";
|
|
35
|
+
el.offsetHeight;
|
|
36
|
+
}
|
|
37
|
+
function onAfterEnter(_el) {
|
|
38
|
+
const el = _el;
|
|
39
|
+
el.style.height = "auto";
|
|
40
|
+
}
|
|
41
|
+
function onLeave(_el, done) {
|
|
42
|
+
const el = _el;
|
|
43
|
+
el.style.height = "0";
|
|
44
|
+
el.addEventListener("transitionend", done, { once: true });
|
|
45
|
+
}
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<template>
|
|
49
|
+
<Transition
|
|
50
|
+
v-bind="mergedUi.transition"
|
|
51
|
+
@enter="onEnter"
|
|
52
|
+
@after-enter="onAfterEnter"
|
|
53
|
+
@before-leave="onBeforeLeave"
|
|
54
|
+
@leave="onLeave"
|
|
55
|
+
>
|
|
56
|
+
<slot />
|
|
57
|
+
</Transition>
|
|
58
|
+
</template>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
transition?: {
|
|
3
|
+
enterActiveClass?: string;
|
|
4
|
+
leaveActiveClass?: string;
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
declare var __VLS_12: {};
|
|
8
|
+
type __VLS_Slots = {} & {
|
|
9
|
+
default?: (props: typeof __VLS_12) => any;
|
|
10
|
+
};
|
|
11
|
+
declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
12
|
+
declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
|
|
13
|
+
export default _default;
|
|
14
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
15
|
+
new (): {
|
|
16
|
+
$slots: S;
|
|
17
|
+
};
|
|
18
|
+
};
|