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.
Files changed (133) hide show
  1. package/assets/styles/index.scss +67 -5
  2. package/components/elements/a-select-row/ASelectRowV2.vue +8 -8
  3. package/components/elements/a-select-row/index.vue +3 -5
  4. package/components/elements/accordion/AAccordion.vue +5 -3
  5. package/components/elements/accordion/AAccordionGroup/AAccordionGroup.vue +3 -3
  6. package/components/elements/alert/AAlert.vue +34 -47
  7. package/components/elements/bg-block/ABgBlock.vue +1 -1
  8. package/components/elements/button/AButton.vue +3 -3
  9. package/components/elements/button/AButtonV2.vue +7 -5
  10. package/components/elements/button-login/index.vue +1 -1
  11. package/components/elements/chip-wrapper/AChipWrapper.vue +1 -1
  12. package/components/elements/chips/AChips.vue +2 -2
  13. package/components/elements/digit-badge/ADigitBadge.vue +21 -19
  14. package/components/elements/feature-description/AFeatureDescription.vue +1 -1
  15. package/components/elements/leave-note/ALeaveNote.vue +1 -1
  16. package/components/elements/pagination/APagination.vue +7 -7
  17. package/components/elements/segmented/ASegmentedV2.vue +103 -10
  18. package/components/elements/select/ASelect.vue +4 -4
  19. package/components/elements/select/ASelectMobile.vue +2 -2
  20. package/components/elements/select/ASelectV2.vue +10 -11
  21. package/components/elements/select/ui/select-button.vue +1 -1
  22. package/components/elements/status-badge/AStatusBadge.vue +22 -19
  23. package/components/elements/status-badge-v2/StatusBadgeV2.vue +1 -3
  24. package/components/elements/table/ATable.vue +1 -1
  25. package/components/elements/table/table.config.ts +2 -2
  26. package/components/elements/tree-select/ATreeSelect.vue +97 -113
  27. package/components/elements/tree-select/TreeService.ts +142 -207
  28. package/components/elements/tree-select/components/ATreeSelectNode.vue +104 -0
  29. package/components/elements/tree-select/types.ts +40 -11
  30. package/components/elements/tree-select/utils.ts +30 -0
  31. package/components/elements/tree-select-modal/ATreeSelectModal.vue +217 -0
  32. package/components/features/color-mode/AColorMode.client.vue +1 -1
  33. package/components/features/dropdown/ADropdownV2.vue +1 -2
  34. package/components/features/lang-switcher/lang-switcher.vue +9 -4
  35. package/components/features/payment/banner/BasicPlusLimitBanner.vue +3 -3
  36. package/components/features/payment/banner/PaymentBanner.vue +3 -3
  37. package/components/features/payment/banner/UpSellBanner.vue +3 -3
  38. package/components/features/payment/process/PaymentKaspiQrSidePanel.vue +3 -3
  39. package/components/features/payment/process/PaymentKaspiRedirectSidePanel.vue +1 -1
  40. package/components/features/payment/process/PaymentMethodSidePanel.vue +3 -3
  41. package/components/features/payment/process/PaymentTopUpSidePanel.vue +2 -2
  42. package/components/features/pk-mobile-services/APkMobileServices.vue +1 -1
  43. package/components/features//321/201hange-version/AChangeVersion.vue +2 -2
  44. package/components/forms/checkbox/ACheckbox.vue +1 -1
  45. package/components/forms/checkbox/ACheckboxV2.vue +5 -5
  46. package/components/forms/input/AInputV2.vue +4 -4
  47. package/components/forms/input/date/AInputDate.vue +2 -2
  48. package/components/forms/input/password/AInputPassword.vue +8 -2
  49. package/components/forms/input/standard/AInputStandard.vue +3 -3
  50. package/components/forms/input/textarea/ATextarea.vue +2 -2
  51. package/components/forms/toggle/AToggle.vue +2 -3
  52. package/components/forms/toggle/AToggleV2.vue +3 -3
  53. package/components/modals/AnotherDeviceModal.vue +1 -1
  54. package/components/modals/ContactsMobileModel.vue +1 -1
  55. package/components/modals/ContentNavigationModal.vue +3 -3
  56. package/components/modals/Insufficient-funds-modal.vue +1 -1
  57. package/components/modals/PaymentMethodModal.vue +1 -1
  58. package/components/modals/id/IdBanner.vue +3 -3
  59. package/components/modals/id/IdRecoveryModal.vue +1 -1
  60. package/components/navigation/breadcrumbs/ABreadcrumbs.vue +106 -45
  61. package/components/navigation/breadcrumbs/types.ts +3 -0
  62. package/components/navigation/footer/AFooter.vue +39 -40
  63. package/components/navigation/footer/ui/a-footer-accordion.vue +9 -9
  64. package/components/navigation/header/AHeader.vue +2 -4
  65. package/components/navigation/header/AlmatyContacts.vue +78 -78
  66. package/components/navigation/header/CardGallery.vue +4 -4
  67. package/components/navigation/header/HeaderUsage.vue +4 -6
  68. package/components/navigation/header/ListItem.vue +2 -2
  69. package/components/navigation/header/NavCard.vue +1 -1
  70. package/components/navigation/header/NavList.vue +2 -2
  71. package/components/navigation/header/NotificationsMenu.vue +2 -3
  72. package/components/navigation/header/ProductMenu.vue +1 -1
  73. package/components/navigation/header/ProfileMenu.vue +26 -35
  74. package/components/navigation/header/SystemNotification.vue +1 -3
  75. package/components/navigation/pill-tabs/APillTabs.vue +2 -2
  76. package/components/navigation/pill-tabs/APillTabsV2.vue +5 -5
  77. package/components/overlays/drawer/ADrawerV2.vue +335 -0
  78. package/components/overlays/modal/AModal.vue +4 -4
  79. package/components/overlays/modal/AModalV2.vue +4 -4
  80. package/components/overlays/side-panel/ASidePanel.vue +6 -6
  81. package/components/overlays/sideover/ASlideover.vue +6 -6
  82. package/components/overlays/tooltip/ATooltip.vue +1 -1
  83. package/components/overlays/tooltip/ATooltipV2.vue +2 -12
  84. package/components/transitions/ATransitionHeight.vue +1 -1
  85. package/composables/useHeaderNavigationLinks.ts +100 -94
  86. package/icons/archive.vue +16 -0
  87. package/icons/arrow/arrows-in.vue +11 -0
  88. package/icons/arrow/arrows-out.vue +11 -0
  89. package/icons/arrow/arrows-resize-in.vue +38 -0
  90. package/icons/arrow/arrows-resize-out.vue +17 -0
  91. package/icons/bot.vue +52 -0
  92. package/icons/clock-time.vue +24 -0
  93. package/icons/compare-outlined.vue +8 -0
  94. package/icons/dots-horizontal.vue +31 -0
  95. package/icons/download-line.vue +13 -0
  96. package/icons/egov.vue +41 -0
  97. package/icons/elicense.vue +38 -0
  98. package/icons/favourite-bookmark-outline.vue +17 -0
  99. package/icons/file-pen.vue +31 -0
  100. package/icons/file-stack.vue +31 -0
  101. package/icons/file-types/excel.vue +131 -0
  102. package/icons/file-types/html.vue +13 -0
  103. package/icons/file-types/jpeg.vue +16 -0
  104. package/icons/file-types/pdf.vue +11 -0
  105. package/icons/file-types/png.vue +11 -0
  106. package/icons/file-types/rar.vue +11 -0
  107. package/icons/file-types/word.vue +50 -0
  108. package/icons/file-types/zip.vue +11 -0
  109. package/icons/git-compare.vue +38 -0
  110. package/icons/graduation-cap.vue +31 -0
  111. package/icons/graph-loading.vue +34 -0
  112. package/icons/help-question-circle.vue +26 -0
  113. package/icons/in-row-type.vue +46 -0
  114. package/icons/in-table-type.vue +29 -0
  115. package/icons/message-dotted.vue +30 -0
  116. package/icons/notification-error.vue +17 -0
  117. package/icons/person.vue +22 -0
  118. package/icons/settings.vue +26 -0
  119. package/icons/shield-alert.vue +31 -0
  120. package/icons/socials/facebook-color.vue +16 -0
  121. package/icons/socials/globe-color.vue +16 -0
  122. package/icons/socials/instagram-color.vue +46 -0
  123. package/icons/socials/linkedin-color.vue +14 -0
  124. package/icons/socials/telegram-color.vue +16 -0
  125. package/icons/socials/tiktok-color.vue +14 -0
  126. package/icons/socials/vk-color.vue +16 -0
  127. package/icons/socials/youtube-color.vue +16 -0
  128. package/icons/view-eye-open.vue +13 -0
  129. package/package.json +1 -1
  130. package/plugins/toast.client.ts +38 -55
  131. package/tailwind.config.ts +147 -116
  132. package/utils/twMerge.ts +34 -0
  133. package/components/elements/tree-select/components/tree-select-nodes.vue +0 -91
@@ -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-sm">
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-md border border-gray-200 bg-gray-50 px-2 py-0.5 text-xs dark:border-gray-700 dark:bg-white/[0.06]"
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-gray-200 dark:hover:bg-white/[0.12]"
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-md border border-blue-200 bg-blue-50 px-2 py-0.5 text-xs font-medium text-blue-700 dark:border-blue-800 dark:bg-blue-900/30 dark:text-blue-400"
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-md border border-gray-200 bg-gray-50 px-2 py-0.5 text-xs"
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-md border px-2 py-0.5 text-xs font-medium">
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.gray.100');
182
+ background-color: theme('colors.blue.100');
183
183
  }
184
184
 
185
185
  :is(.dark) .select-row-v2__chip:hover {
186
- background-color: rgb(255 255 255 / 0.08);
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 AChips from '~/components/elements/chips/AChips.vue'
2
+ import { twMerge } from '#adata-ui/utils/twMerge'
3
3
  import {isEqual} from 'lodash-es'
4
- import { twMerge } from 'tailwind-merge'
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-md
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 ui from './ui.config'
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 type {Size, Props} from "./types";
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
- withDefaults(defineProps<Props>(), {
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-base p-2',
43
- sm: 'text-sm px-2 py-[3.5px]',
44
- xs: 'text-xs px-2 py-[3.5px]'
18
+ lg: 'text-body-lg',
19
+ sm: 'text-body-md',
20
+ xs: 'text-body-sm',
45
21
  }
46
22
 
47
23
  const colorOptions = {
48
- icon: {
49
- blue: 'bg-blue-700 text-white dark:bg-blue-500 dark:text-gray-900',
50
- green: 'bg-green-500 text-white dark:text-gray-900',
51
- orange: 'bg-[#FCA204] text-white dark:text-gray-900',
52
- deepblue: 'bg-deepblue-900 text-white dark:text-gray-900',
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,7 +1,7 @@
1
1
  <script setup lang="ts"></script>
2
2
 
3
3
  <template>
4
- <div class="md:rounded-lg p-4 bg-white dark:bg-gray-900">
4
+ <div class="md:rounded-md p-4 bg-white dark:bg-gray-900">
5
5
  <slot />
6
6
  </div>
7
7
  </template>
@@ -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-600 rounded-md cursor-pointer outline-none transition duration-200 select-none',
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-600 rounded-md outline-none transition duration-200 select-none',
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
- sm: 'h-8 gap-1.5 px-3 text-xs',
60
- md: 'h-10 gap-2 px-4 text-sm',
61
- lg: 'h-12 gap-2.5 px-5 text-base',
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 rounded-xl font-semibold transition-all duration-150 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50"
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-xl 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"
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,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import type {Props} from './types'
3
- import {twJoin, twMerge} from "tailwind-merge";
3
+ import {twJoin, twMerge} from '#adata-ui/utils/twMerge';
4
4
 
5
5
  defineOptions({
6
6
  inheritAttrs: false
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import {twMerge} from "tailwind-merge";
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-3xl 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)"
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 "tailwind-merge";
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
- type ViewType = {
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-xs font-semibold'
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-md bg-blue-700 dark:bg-blue-500 p-2 icon-bg' : 'size-fit'
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
@@ -53,7 +53,7 @@ defineExpose({
53
53
  </script>
54
54
 
55
55
  <template>
56
- <div class="flex flex-col items-start rounded-md">
56
+ <div class="flex flex-col items-start rounded-sm">
57
57
  <p class="text-sm font-semibold mb-4">
58
58
  {{ t('forms.leaveNote.title') }}
59
59
  </p>
@@ -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-lg transition hover:bg-[#2C3E500D] dark:hover:bg-[#E3E5E80D]"
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-lg transition hover:bg-[#2C3E500D] dark:text-white"
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-lg transition hover:bg-[#2C3E500D] dark:hover:bg-[#E3E5E80D]'
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-lg transition'
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-lg transition hover:bg-[#2C3E500D] dark:hover:bg-[#E3E5E80D]'
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-lg hover:bg-[#2C3E500D] dark:hover:bg-[#E3E5E80D]"
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-lg hover:bg-[#2C3E500D] dark:hover:bg-[#E3E5E80D]"
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" />