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
package/assets/styles/index.scss
CHANGED
|
@@ -68,18 +68,80 @@ input::-webkit-inner-spin-button {
|
|
|
68
68
|
-webkit-appearance: none;
|
|
69
69
|
margin: 0;
|
|
70
70
|
}
|
|
71
|
-
.toast__body{
|
|
72
|
-
padding:0 16px 0 0 !important;
|
|
73
|
-
margin:0 !important;
|
|
74
|
-
align-items: stretch !important;
|
|
75
|
-
}
|
|
76
71
|
.Toastify__toast-container {
|
|
77
72
|
z-index: 10002 !important;
|
|
78
73
|
}
|
|
74
|
+
|
|
75
|
+
@media (min-width: 481px) {
|
|
76
|
+
.Toastify__toast-container {
|
|
77
|
+
width: 600px;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.Toastify__toast-container .Toastify__toast {
|
|
82
|
+
min-height: 71px;
|
|
83
|
+
padding: 14px 16px;
|
|
84
|
+
border: 1px solid transparent;
|
|
85
|
+
border-left-width: 4px; /* акцентная полоса слева */
|
|
86
|
+
border-radius: 12px;
|
|
87
|
+
box-shadow: none;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.Toastify__toast-container .Toastify__toast-body {
|
|
91
|
+
margin: 0;
|
|
92
|
+
padding: 0;
|
|
93
|
+
gap: 12px;
|
|
94
|
+
align-items: center;
|
|
95
|
+
font-size: 16px;
|
|
96
|
+
font-weight: 500;
|
|
97
|
+
line-height: 24px;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.Toastify__toast-container .Toastify__toast-icon {
|
|
101
|
+
width: 24px;
|
|
102
|
+
height: 24px;
|
|
103
|
+
margin-inline-end: 0;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.Toastify__toast-container .Toastify__toast-icon svg {
|
|
107
|
+
width: 24px;
|
|
108
|
+
height: 24px;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.Toastify__toast-container .Toastify__close-button {
|
|
112
|
+
align-self: center;
|
|
113
|
+
color: #2c3e50;
|
|
114
|
+
opacity: 0.6;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.Toastify__toast-container .Toastify__close-button:hover {
|
|
118
|
+
opacity: 1;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.Toastify__toast-container .Toastify__toast--info { background: #eff6ff; border-color: #068dff; color: #068dff; }
|
|
122
|
+
.Toastify__toast-container .Toastify__toast--success { background: #f0fdf4; border-color: #00a63e; color: #00a63e; }
|
|
123
|
+
.Toastify__toast-container .Toastify__toast--warning { background: #fffbeb; border-color: #e17100; color: #e17100; }
|
|
124
|
+
.Toastify__toast-container .Toastify__toast--error { background: #fef2f2; border-color: #e7000b; color: #e7000b; }
|
|
125
|
+
|
|
126
|
+
.Toastify__toast-container .Toastify__toast--info .Toastify__progress-bar { background: #068dff; }
|
|
127
|
+
.Toastify__toast-container .Toastify__toast--success .Toastify__progress-bar { background: #00a63e; }
|
|
128
|
+
.Toastify__toast-container .Toastify__toast--warning .Toastify__progress-bar { background: #e17100; }
|
|
129
|
+
.Toastify__toast-container .Toastify__toast--error .Toastify__progress-bar { background: #e7000b; }
|
|
130
|
+
|
|
131
|
+
/* Тёмная тема (нежная): фон = тинт solid-хекса тона /10, но непрозрачный (тост плавает
|
|
132
|
+
над контентом) — композит поверх #161617; бордер rgba(solid,0.4); текст/иконка -400. */
|
|
133
|
+
.dark .Toastify__toast-container .Toastify__close-button { color: #e3e5e8; }
|
|
134
|
+
|
|
135
|
+
.dark .Toastify__toast-container .Toastify__toast--info { background: #14222e; border-color: rgba(6, 141, 255, 0.4); color: #43afed; }
|
|
136
|
+
.dark .Toastify__toast-container .Toastify__toast--success { background: #14241b; border-color: rgba(0, 166, 62, 0.4); color: #6bbd6e; }
|
|
137
|
+
.dark .Toastify__toast-container .Toastify__toast--warning { background: #2a1f15; border-color: rgba(225, 113, 0, 0.4); color: #ffc31e; }
|
|
138
|
+
.dark .Toastify__toast-container .Toastify__toast--error { background: #2b1416; border-color: rgba(231, 0, 11, 0.4); color: #f47e75; }
|
|
139
|
+
|
|
79
140
|
input[type="search"]::-webkit-search-cancel-button {
|
|
80
141
|
-webkit-appearance: none;
|
|
81
142
|
appearance: none;
|
|
82
143
|
}
|
|
144
|
+
|
|
83
145
|
input[type="search"]::-ms-clear {
|
|
84
146
|
display: none;
|
|
85
147
|
width: 0;
|
|
@@ -73,7 +73,7 @@ defineExpose({ onClear })
|
|
|
73
73
|
</script>
|
|
74
74
|
|
|
75
75
|
<template>
|
|
76
|
-
<div class="select-row-v2 relative w-full text-
|
|
76
|
+
<div class="select-row-v2 relative w-full text-body-md">
|
|
77
77
|
<button
|
|
78
78
|
type="button"
|
|
79
79
|
:disabled="disabled"
|
|
@@ -102,21 +102,21 @@ defineExpose({ onClear })
|
|
|
102
102
|
<span
|
|
103
103
|
v-for="item in visibleItems"
|
|
104
104
|
:key="item.id"
|
|
105
|
-
class="select-row-v2__chip inline-flex min-w-0 items-center gap-1 rounded-
|
|
105
|
+
class="select-row-v2__chip inline-flex min-w-0 items-center gap-1 rounded-sm bg-[#F0F8FF] px-2 py-0.5 text-body-sm text-blue-600 dark:bg-blue-600/15 dark:text-blue-400"
|
|
106
106
|
@click.stop="deletable ? deleteItem(item) : (isOpen = true)"
|
|
107
107
|
>
|
|
108
108
|
<span class="truncate">{{ item.name }}</span>
|
|
109
109
|
<button
|
|
110
110
|
v-if="deletable"
|
|
111
111
|
type="button"
|
|
112
|
-
class="flex shrink-0 items-center justify-center rounded-full p-0.5 transition-colors hover:bg-
|
|
112
|
+
class="flex shrink-0 items-center justify-center rounded-full p-0.5 transition-colors hover:bg-blue-100 dark:hover:bg-blue-500/20"
|
|
113
113
|
>
|
|
114
114
|
<a-icon-x-mark class="size-2.5" />
|
|
115
115
|
</button>
|
|
116
116
|
</span>
|
|
117
117
|
<span
|
|
118
118
|
v-if="hiddenCount > 0"
|
|
119
|
-
class="inline-flex shrink-0 items-center whitespace-nowrap rounded-
|
|
119
|
+
class="inline-flex shrink-0 items-center whitespace-nowrap rounded-sm bg-[#DBEFFF] px-2 py-0.5 text-body-sm-medium text-[#0066BD] dark:bg-blue-600/25 dark:text-blue-300"
|
|
120
120
|
>
|
|
121
121
|
+{{ hiddenCount }}
|
|
122
122
|
</span>
|
|
@@ -129,7 +129,7 @@ defineExpose({ onClear })
|
|
|
129
129
|
<span
|
|
130
130
|
v-for="item in selectedItems"
|
|
131
131
|
:key="`measure-${item.id}`"
|
|
132
|
-
class="inline-flex items-center gap-1 whitespace-nowrap rounded-
|
|
132
|
+
class="inline-flex items-center gap-1 whitespace-nowrap rounded-sm bg-gray-50 px-2 py-0.5 text-body-sm"
|
|
133
133
|
>
|
|
134
134
|
<span>{{ item.name }}</span>
|
|
135
135
|
<span
|
|
@@ -139,7 +139,7 @@ defineExpose({ onClear })
|
|
|
139
139
|
<a-icon-x-mark class="size-2.5" />
|
|
140
140
|
</span>
|
|
141
141
|
</span>
|
|
142
|
-
<span class="inline-flex shrink-0 items-center whitespace-nowrap rounded-
|
|
142
|
+
<span class="inline-flex shrink-0 items-center whitespace-nowrap rounded-sm px-2 py-0.5 text-body-sm-medium">
|
|
143
143
|
+{{ itemCount }}
|
|
144
144
|
</span>
|
|
145
145
|
</span>
|
|
@@ -179,11 +179,11 @@ defineExpose({ onClear })
|
|
|
179
179
|
}
|
|
180
180
|
|
|
181
181
|
.select-row-v2__chip:hover {
|
|
182
|
-
background-color: theme('colors.
|
|
182
|
+
background-color: theme('colors.blue.100');
|
|
183
183
|
}
|
|
184
184
|
|
|
185
185
|
:is(.dark) .select-row-v2__chip:hover {
|
|
186
|
-
background-color: rgb(
|
|
186
|
+
background-color: rgb(6 141 255 / 0.25);
|
|
187
187
|
}
|
|
188
188
|
|
|
189
189
|
.select-row-v2__label {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import
|
|
2
|
+
import { twMerge } from '#adata-ui/utils/twMerge'
|
|
3
3
|
import {isEqual} from 'lodash-es'
|
|
4
|
-
import
|
|
4
|
+
import AChips from '~/components/elements/chips/AChips.vue'
|
|
5
5
|
|
|
6
6
|
type Item = {
|
|
7
7
|
id: number | string
|
|
@@ -17,8 +17,6 @@ interface Props {
|
|
|
17
17
|
btnClass?: string
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
// const items = defineModel<Item[]>('selectedItems', {required: true})
|
|
21
|
-
|
|
22
20
|
type Emits = {
|
|
23
21
|
(e: 'delete', item: Item): void
|
|
24
22
|
}
|
|
@@ -83,7 +81,7 @@ const onClear = () => {
|
|
|
83
81
|
<button
|
|
84
82
|
ref="buttonElement"
|
|
85
83
|
class="hover:border-blue focus-visible:outline-blue
|
|
86
|
-
relative flex w-full items-center justify-between gap-2 rounded-
|
|
84
|
+
relative flex w-full items-center justify-between gap-2 rounded-sm
|
|
87
85
|
border border-solid border-deepblue-50 bg-deepblue-50 min-h-[40px] text-gray-500 body-400 px-4 py-1.5
|
|
88
86
|
focus-visible:shadow-[0_0_0_4px#1B64B3] dark:border-gray-900 dark:bg-gray-200/5
|
|
89
87
|
dark:hover:border-blue-700"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
// REFACTOR @Iskander
|
|
3
|
-
import ui from './ui.config'
|
|
4
|
-
import {Disclosure, DisclosureButton, DisclosurePanel} from '@headlessui/vue'
|
|
5
|
-
import {twJoin, twMerge} from 'tailwind-merge'
|
|
6
3
|
import type {Color, Size} from "#adata-ui/components/elements/accordion/types";
|
|
4
|
+
import {twJoin, twMerge} from '#adata-ui/utils/twMerge'
|
|
5
|
+
import {Disclosure, DisclosureButton, DisclosurePanel} from '@headlessui/vue'
|
|
6
|
+
import ui from './ui.config'
|
|
7
7
|
|
|
8
8
|
export interface Props {
|
|
9
9
|
label: string
|
|
@@ -16,6 +16,7 @@ export interface Props {
|
|
|
16
16
|
contentClass?: string
|
|
17
17
|
bodyClass?: string
|
|
18
18
|
activateOpenBg?: boolean
|
|
19
|
+
iconChevronTestId?: string
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
interface Emits {
|
|
@@ -160,6 +161,7 @@ defineExpose({
|
|
|
160
161
|
<a-icon-chevron-down
|
|
161
162
|
:arrow-attrs="{ class: 'stroke-deepblue-900' }"
|
|
162
163
|
:class="[{ 'rotate-180': open }, 'max-h-[16px] min-h-[16px] min-w-[16px] max-w-[16px]', ui.item.icon]"
|
|
164
|
+
:data-test-id="iconChevronTestId"
|
|
163
165
|
/>
|
|
164
166
|
</button>
|
|
165
167
|
</slot>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import
|
|
2
|
+
import type {Props, Size} from "./types";
|
|
3
|
+
import {twJoin, twMerge} from '#adata-ui/utils/twMerge';
|
|
3
4
|
import {
|
|
4
5
|
Disclosure,
|
|
5
6
|
DisclosureButton,
|
|
6
7
|
DisclosurePanel
|
|
7
8
|
} from '@headlessui/vue'
|
|
8
|
-
import
|
|
9
|
-
import {twJoin, twMerge} from "tailwind-merge";
|
|
9
|
+
import ui from './ui.config'
|
|
10
10
|
|
|
11
11
|
defineOptions({
|
|
12
12
|
inheritAttrs: false
|
|
@@ -1,65 +1,52 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div
|
|
3
|
-
class="inline-flex w-full rounded-md"
|
|
4
|
-
:class="twMerge(colorOptions.description[color])"
|
|
5
|
-
>
|
|
6
|
-
<div
|
|
7
|
-
class="flex items-center justify-center rounded-l-md"
|
|
8
|
-
:class="twMerge([colorOptions.icon[color], sizeOptions[size]])"
|
|
9
|
-
>
|
|
10
|
-
<slot name="icon">
|
|
11
|
-
<a-icon-info-circle v-if="iconType == 'circle'" :class="`w-[${iconSize}] h-[${iconSize}]`" />
|
|
12
|
-
<a-icon-warning-triangle v-if="iconType == 'triangle'" :class="`w-[${iconSize}] h-[${iconSize}]`" />
|
|
13
|
-
</slot>
|
|
14
|
-
</div>
|
|
15
|
-
<div
|
|
16
|
-
:class="sizeOptions[size]"
|
|
17
|
-
class="rounded-r-md flex items-center"
|
|
18
|
-
>
|
|
19
|
-
<slot name="default" />
|
|
20
|
-
</div>
|
|
21
|
-
</div>
|
|
22
|
-
</template>
|
|
23
|
-
|
|
24
1
|
<script setup lang="ts">
|
|
25
|
-
import {twMerge} from "tailwind-merge";
|
|
26
|
-
|
|
27
|
-
defineOptions({ name: 'AAlert' })
|
|
28
|
-
|
|
29
2
|
interface Props {
|
|
30
3
|
size?: 'lg' | 'sm' | 'xs'
|
|
31
4
|
color?: 'blue' | 'green' | 'red' | 'deepblue' | 'orange'
|
|
32
|
-
iconType?:'triangle' |'circle'
|
|
5
|
+
iconType?: 'triangle' | 'circle'
|
|
33
6
|
iconSize?: string
|
|
34
7
|
}
|
|
35
|
-
|
|
8
|
+
defineOptions({ name: 'AAlert' })
|
|
9
|
+
|
|
10
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
36
11
|
size: 'sm',
|
|
37
12
|
color: 'blue',
|
|
38
|
-
iconType:'circle',
|
|
13
|
+
iconType: 'circle',
|
|
39
14
|
iconSize: '16px',
|
|
40
15
|
})
|
|
16
|
+
|
|
41
17
|
const sizeOptions = {
|
|
42
|
-
lg: 'text-
|
|
43
|
-
sm: 'text-
|
|
44
|
-
xs: 'text-
|
|
18
|
+
lg: 'text-body-lg',
|
|
19
|
+
sm: 'text-body-md',
|
|
20
|
+
xs: 'text-body-sm',
|
|
45
21
|
}
|
|
46
22
|
|
|
47
23
|
const colorOptions = {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
red: 'bg-red-500 text-white dark:bg-red-400 dark:text-gray-900'
|
|
54
|
-
},
|
|
55
|
-
description: {
|
|
56
|
-
blue: 'bg-blue-100 dark:bg-gray-200/10 text-blue-700 dark:text-blue-500',
|
|
57
|
-
green: 'bg-green-100 text-green-500',
|
|
58
|
-
orange: 'bg-[#FFF5E6] dark:bg-[#FCA2041A] text-[#FCA204]',
|
|
59
|
-
deepblue: 'bg-deepblue-100 text-deepblue-900',
|
|
60
|
-
red: 'bg-red-100 text-red-500 dark:bg-[#3A3133] dark:text-red-400'
|
|
61
|
-
}
|
|
24
|
+
blue: 'bg-[#EFF6FF] border-[#068DFF] text-[#068DFF] dark:bg-[#068DFF]/10 dark:border-[#068DFF]/40 dark:text-blue-400',
|
|
25
|
+
green: 'bg-[#F0FDF4] border-[#00A63E] text-[#00A63E] dark:bg-[#00A63E]/10 dark:border-[#00A63E]/40 dark:text-green-400',
|
|
26
|
+
orange: 'bg-[#FFFBEB] border-[#E17100] text-[#E17100] dark:bg-[#E17100]/10 dark:border-[#E17100]/40 dark:text-orange-400',
|
|
27
|
+
red: 'bg-[#FEF2F2] border-[#E7000B] text-[#E7000B] dark:bg-[#E7000B]/10 dark:border-[#E7000B]/40 dark:text-red-400',
|
|
28
|
+
deepblue: 'bg-deepblue-100 border-deepblue-900 text-deepblue-900 dark:bg-gray-500/10 dark:border-gray-500/40 dark:text-gray-300',
|
|
62
29
|
}
|
|
30
|
+
|
|
31
|
+
const rootClass = computed(() => [colorOptions[props.color], sizeOptions[props.size]])
|
|
32
|
+
const iconStyle = computed(() => ({ width: props.iconSize, height: props.iconSize }))
|
|
63
33
|
</script>
|
|
64
34
|
|
|
35
|
+
<template>
|
|
36
|
+
<div
|
|
37
|
+
class="flex w-full items-center gap-2 rounded-lg border border-l-4 p-2"
|
|
38
|
+
:class="rootClass"
|
|
39
|
+
>
|
|
40
|
+
<span class="flex shrink-0 items-center justify-center">
|
|
41
|
+
<slot name="icon">
|
|
42
|
+
<a-icon-info-circle v-if="iconType === 'circle'" :style="iconStyle" />
|
|
43
|
+
<a-icon-warning-triangle v-else :style="iconStyle" />
|
|
44
|
+
</slot>
|
|
45
|
+
</span>
|
|
46
|
+
<div class="min-w-0 flex-1">
|
|
47
|
+
<slot name="default" />
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
</template>
|
|
51
|
+
|
|
65
52
|
<style scoped></style>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<script lang="ts" setup>
|
|
2
2
|
// TODO: refactor Ilkham
|
|
3
|
-
import { twJoin, twMerge } from 'tailwind-merge'
|
|
4
3
|
import type { Component } from 'vue'
|
|
5
4
|
import type { DisabledViewSwitchValues, SizeSwitchValues, ViewSwitchValues } from './types'
|
|
5
|
+
import { twJoin, twMerge } from '#adata-ui/utils/twMerge'
|
|
6
6
|
import { NuxtLinkLocale} from '#components'
|
|
7
7
|
|
|
8
8
|
defineOptions({ name: 'AButton' })
|
|
@@ -35,13 +35,13 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
35
35
|
})
|
|
36
36
|
|
|
37
37
|
const classes = computed(() => [
|
|
38
|
-
'body-
|
|
38
|
+
'text-body-md-strong rounded-sm cursor-pointer outline-none transition duration-200 select-none',
|
|
39
39
|
props.block ? 'w-full' : '',
|
|
40
40
|
typeSwitchValues[props.view][props.variant],
|
|
41
41
|
sizeSwitchValues[props.form][props.size]
|
|
42
42
|
])
|
|
43
43
|
const disabledClasses = computed(() => [
|
|
44
|
-
'body-
|
|
44
|
+
'text-body-md-strong rounded-sm outline-none transition duration-200 select-none',
|
|
45
45
|
props.block ? 'w-full' : '',
|
|
46
46
|
disabledTypeSwitchValues[props.view],
|
|
47
47
|
sizeSwitchValues[props.form][props.size]
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import type { Component } from 'vue'
|
|
3
3
|
|
|
4
4
|
type View = 'solid' | 'outline' | 'ghost' | 'soft'
|
|
5
|
-
type Size = 'sm' | 'md' | 'lg'
|
|
5
|
+
type Size = 'xs' | 'sm' | 'md' | 'lg'
|
|
6
6
|
type Color = 'blue' | 'green' | 'red' | 'gray'
|
|
7
7
|
|
|
8
8
|
const props = withDefaults(defineProps<{
|
|
@@ -56,12 +56,14 @@ const VIEW_CLASS: Record<Color, Record<View, string>> = {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
const SIZE_CLASS: Record<Size, string> = {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
xs: 'h-6 gap-1 rounded-md px-2 text-body-sm',
|
|
60
|
+
sm: 'h-8 gap-1.5 rounded-lg px-3 text-body-sm',
|
|
61
|
+
md: 'h-10 gap-2 rounded-lg px-4 text-body-md',
|
|
62
|
+
lg: 'h-12 gap-2.5 rounded-lg px-5 text-body-lg',
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
const ICON_SIZE: Record<Size, string> = {
|
|
66
|
+
xs: 'size-3.5',
|
|
65
67
|
sm: 'size-4',
|
|
66
68
|
md: 'size-5',
|
|
67
69
|
lg: 'size-5',
|
|
@@ -77,7 +79,7 @@ function onClick(event: MouseEvent) {
|
|
|
77
79
|
<button
|
|
78
80
|
:type="type"
|
|
79
81
|
:disabled="disabled || loading"
|
|
80
|
-
class="button-v2 inline-flex select-none items-center justify-center
|
|
82
|
+
class="button-v2 inline-flex select-none items-center justify-center font-semibold transition-all duration-150 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50"
|
|
81
83
|
:class="[
|
|
82
84
|
VIEW_CLASS[color][view],
|
|
83
85
|
SIZE_CLASS[size],
|
|
@@ -7,7 +7,7 @@ const { t } = useI18n()
|
|
|
7
7
|
<template>
|
|
8
8
|
<button
|
|
9
9
|
type="button"
|
|
10
|
-
class="hidden h-8 cursor-pointer items-center rounded-
|
|
10
|
+
class="hidden h-8 cursor-pointer items-center rounded-lg bg-blue-700 px-3.5 text-sm font-semibold text-white transition-colors duration-150 hover:bg-blue-800 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/50 focus-visible:ring-offset-1 dark:bg-blue-500 dark:text-gray-900 dark:hover:bg-blue-600 dark:focus-visible:ring-offset-gray-900 lg:inline-flex"
|
|
11
11
|
data-test-id="header-login-button"
|
|
12
12
|
@click="$emit('click')"
|
|
13
13
|
>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import {twMerge} from
|
|
2
|
+
import {twMerge} from '#adata-ui/utils/twMerge';
|
|
3
3
|
|
|
4
4
|
type Props = {
|
|
5
5
|
size?: 'sm' | 'md' | 'lg'
|
|
@@ -23,7 +23,7 @@ const sizeOptions = {
|
|
|
23
23
|
|
|
24
24
|
<template>
|
|
25
25
|
<button
|
|
26
|
-
:class="twMerge(['flex items-center gap-2 rounded-
|
|
26
|
+
:class="twMerge(['flex items-center gap-2 rounded-2xl border border-solid px-2.5 text-xs hover:bg-deepblue-100 dark:hover:bg-[#E3E5E80D] focus-visible:shadow-[0_0_0_4px#1B64B3] active:bg-blue active:text-white disabled:border-deepblue-200 disabled:text-deepblue-200', chipView[view], sizeOptions[size]], $attrs.class)"
|
|
27
27
|
>
|
|
28
28
|
<slot/>
|
|
29
29
|
</button>
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
<script lang='ts' setup>
|
|
2
|
-
import {twMerge} from
|
|
2
|
+
import { twMerge } from '#adata-ui/utils/twMerge'
|
|
3
3
|
|
|
4
|
-
defineOptions({name: 'ADigitBadge'})
|
|
4
|
+
defineOptions({ name: 'ADigitBadge' })
|
|
5
|
+
|
|
6
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
7
|
+
type: 'primary',
|
|
8
|
+
view: 'default',
|
|
9
|
+
size: 'lg',
|
|
10
|
+
disabled: false,
|
|
11
|
+
customClasses: '',
|
|
12
|
+
prefix: '',
|
|
13
|
+
})
|
|
5
14
|
|
|
6
15
|
interface Props {
|
|
7
16
|
type?: 'primary' | 'success' | 'danger' | 'gray' | 'orange' | 'warning'
|
|
@@ -13,17 +22,9 @@ interface Props {
|
|
|
13
22
|
prefix?: string
|
|
14
23
|
}
|
|
15
24
|
|
|
16
|
-
const props = withDefaults(defineProps<Props>(), {
|
|
17
|
-
type: 'primary',
|
|
18
|
-
view: 'default',
|
|
19
|
-
size: 'lg',
|
|
20
|
-
disabled: false,
|
|
21
|
-
customClasses: '',
|
|
22
|
-
prefix: ''
|
|
23
|
-
})
|
|
24
25
|
const formattedValue = computed(() => {
|
|
25
|
-
return Number(props.value).toLocaleString('ru-RU')
|
|
26
|
-
})
|
|
26
|
+
return Number(props.value).toLocaleString('ru-RU')
|
|
27
|
+
})
|
|
27
28
|
const classes = computed(() =>
|
|
28
29
|
[
|
|
29
30
|
props.disabled ? 'text-gray-500 bg-deepblue-900/5' : typeSwitchValues[props.view][props.type],
|
|
@@ -34,16 +35,16 @@ const classes = computed(() =>
|
|
|
34
35
|
|
|
35
36
|
export type StateType = {
|
|
36
37
|
[key in 'primary' | 'success' | 'danger' | 'gray' | 'orange' | 'warning']?: string;
|
|
37
|
-
}
|
|
38
|
-
|
|
38
|
+
}
|
|
39
|
+
interface ViewType {
|
|
39
40
|
default: StateType
|
|
40
41
|
inverted: StateType
|
|
41
42
|
transparent: StateType
|
|
42
|
-
}
|
|
43
|
+
}
|
|
43
44
|
|
|
44
45
|
type SizeSwitchValues = {
|
|
45
46
|
[key in 'sm' | 'md' | 'lg']: string;
|
|
46
|
-
}
|
|
47
|
+
}
|
|
47
48
|
|
|
48
49
|
const typeSwitchValues: ViewType = {
|
|
49
50
|
default: {
|
|
@@ -52,7 +53,7 @@ const typeSwitchValues: ViewType = {
|
|
|
52
53
|
danger: 'bg-red-500 text-white dark:bg-red-400 dark:text-gray-900',
|
|
53
54
|
warning: 'bg-yellow-400 text-white dark:text-gray-900',
|
|
54
55
|
gray: 'bg-gray-50 text-gray-500 dark:text-gray-900',
|
|
55
|
-
orange: 'bg-orange-600 text-white dark:bg-orange-500 dark:text-gray-900'
|
|
56
|
+
orange: 'bg-orange-600 text-white dark:bg-orange-500 dark:text-gray-900',
|
|
56
57
|
},
|
|
57
58
|
inverted: {
|
|
58
59
|
primary: 'bg-white text-blue-700 dark:text-blue-500 dark:bg-gray-900',
|
|
@@ -65,15 +66,16 @@ const typeSwitchValues: ViewType = {
|
|
|
65
66
|
transparent: {
|
|
66
67
|
success: 'bg-green-500/20 text-green-500',
|
|
67
68
|
danger: 'bg-red-500/20 text-red-500 dark:text-red-400',
|
|
68
|
-
}
|
|
69
|
+
},
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
const sizeSwitchValues: SizeSwitchValues = {
|
|
72
73
|
sm: 'w-4 h-4 px-1 text-[9.5px]',
|
|
73
74
|
md: 'w-5 h-5 px-1 text-[10px]',
|
|
74
|
-
lg: 'px-2 w-6 h-6 text-
|
|
75
|
+
lg: 'px-2 w-6 h-6 text-body-sm font-semibold',
|
|
75
76
|
}
|
|
76
77
|
</script>
|
|
78
|
+
|
|
77
79
|
<template>
|
|
78
80
|
<div
|
|
79
81
|
:class="twMerge(...classes, customClasses)"
|
|
@@ -62,7 +62,7 @@ onUnmounted(() => clearTimer())
|
|
|
62
62
|
<div
|
|
63
63
|
:class="[
|
|
64
64
|
'transition-all duration-300 ease-in-out',
|
|
65
|
-
selected === idx ? 'rounded-
|
|
65
|
+
selected === idx ? 'rounded-sm bg-blue-700 dark:bg-blue-500 p-2 icon-bg' : 'size-fit'
|
|
66
66
|
]"
|
|
67
67
|
>
|
|
68
68
|
<component
|
|
@@ -38,14 +38,14 @@ const showFirstPageIndex = computed(() => modelValue.value > 3)
|
|
|
38
38
|
{ 'bg-blue-700 text-white hover:bg-blue-900': modelValue === 1 },
|
|
39
39
|
!!activeClasses && 1 === modelValue ? activeClasses : ''
|
|
40
40
|
]"
|
|
41
|
-
class="flex size-[40px] cursor-pointer items-center justify-center rounded-
|
|
41
|
+
class="flex size-[40px] cursor-pointer items-center justify-center rounded-md transition hover:bg-[#2C3E500D] dark:hover:bg-[#E3E5E80D]"
|
|
42
42
|
@click="modelValue = 1"
|
|
43
43
|
>
|
|
44
44
|
<double-chevron-right class="rotate-180 text-base" />
|
|
45
45
|
</li>
|
|
46
46
|
<li
|
|
47
47
|
v-show="prevPage"
|
|
48
|
-
class="flex size-[40px] cursor-pointer items-center justify-center rounded-
|
|
48
|
+
class="flex size-[40px] cursor-pointer items-center justify-center rounded-md transition hover:bg-[#2C3E500D] dark:text-white"
|
|
49
49
|
@click="modelValue -= 1"
|
|
50
50
|
>
|
|
51
51
|
<a-icon-chevron-left />
|
|
@@ -56,7 +56,7 @@ const showFirstPageIndex = computed(() => modelValue.value > 3)
|
|
|
56
56
|
:key="page"
|
|
57
57
|
:class="[
|
|
58
58
|
defaultClasses,
|
|
59
|
-
'flex size-[40px] cursor-pointer items-center justify-center rounded-
|
|
59
|
+
'flex size-[40px] cursor-pointer items-center justify-center rounded-md transition hover:bg-[#2C3E500D] dark:hover:bg-[#E3E5E80D]'
|
|
60
60
|
]"
|
|
61
61
|
@click="modelValue = page"
|
|
62
62
|
>
|
|
@@ -67,7 +67,7 @@ const showFirstPageIndex = computed(() => modelValue.value > 3)
|
|
|
67
67
|
:class="[
|
|
68
68
|
defaultClasses,
|
|
69
69
|
'bg-blue-700 text-white hover:bg-blue-900',
|
|
70
|
-
'flex size-[40px] cursor-pointer items-center justify-center rounded-
|
|
70
|
+
'flex size-[40px] cursor-pointer items-center justify-center rounded-md transition'
|
|
71
71
|
]"
|
|
72
72
|
>
|
|
73
73
|
{{ modelValue }}
|
|
@@ -78,7 +78,7 @@ const showFirstPageIndex = computed(() => modelValue.value > 3)
|
|
|
78
78
|
:key="idx"
|
|
79
79
|
:class="[
|
|
80
80
|
defaultClasses,
|
|
81
|
-
'flex size-[40px] cursor-pointer items-center justify-center rounded-
|
|
81
|
+
'flex size-[40px] cursor-pointer items-center justify-center rounded-md transition hover:bg-[#2C3E500D] dark:hover:bg-[#E3E5E80D]'
|
|
82
82
|
]"
|
|
83
83
|
@click="modelValue = n"
|
|
84
84
|
>
|
|
@@ -88,7 +88,7 @@ const showFirstPageIndex = computed(() => modelValue.value > 3)
|
|
|
88
88
|
<li
|
|
89
89
|
v-show="nextPage"
|
|
90
90
|
:class="{ disabled: disabled }"
|
|
91
|
-
class="flex size-[40px] cursor-pointer items-center justify-center rounded-
|
|
91
|
+
class="flex size-[40px] cursor-pointer items-center justify-center rounded-md hover:bg-[#2C3E500D] dark:hover:bg-[#E3E5E80D]"
|
|
92
92
|
@click="modelValue += 1"
|
|
93
93
|
>
|
|
94
94
|
<a-icon-chevron-right />
|
|
@@ -100,7 +100,7 @@ const showFirstPageIndex = computed(() => modelValue.value > 3)
|
|
|
100
100
|
{ disabled: disabled },
|
|
101
101
|
!!activeClasses && lastPage === modelValue ? activeClasses : ''
|
|
102
102
|
]"
|
|
103
|
-
class="flex size-[40px] cursor-pointer items-center justify-center rounded-
|
|
103
|
+
class="flex size-[40px] cursor-pointer items-center justify-center rounded-md hover:bg-[#2C3E500D] dark:hover:bg-[#E3E5E80D]"
|
|
104
104
|
@click="modelValue = lastPage"
|
|
105
105
|
>
|
|
106
106
|
<double-chevron-right class="text-base" />
|