adata-ui 2.1.40 → 2.1.41-beta.1

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 (258) hide show
  1. package/-error.vue +2 -2
  2. package/.playground/app.vue +13 -13
  3. package/.playground/nuxt.config.ts +1 -1
  4. package/CLAUDE.md +63 -0
  5. package/assets/styles/main.css +12 -0
  6. package/assets/styles/theme.css +583 -0
  7. package/assets/styles/ui.css +247 -0
  8. package/components/elements/a-select-row/ASelectRowV2.vue +13 -17
  9. package/components/elements/a-select-row/index.vue +13 -12
  10. package/components/elements/accordion/AAccordion.vue +2 -2
  11. package/components/elements/accordion/AAccordionGroup/AAccordionGroup.vue +1 -1
  12. package/components/elements/accordion/AAccordionGroup/ui.config.ts +4 -4
  13. package/components/elements/accordion/ui.config.ts +4 -4
  14. package/components/elements/alert/AAlert.vue +5 -5
  15. package/components/elements/bg-block/ABgBlock.vue +1 -1
  16. package/components/elements/button/AButton.vue +48 -45
  17. package/components/elements/button/AButtonV2.vue +74 -30
  18. package/components/elements/button-login/index.vue +2 -1
  19. package/components/elements/carousel/config.ui.ts +2 -2
  20. package/components/elements/chip-wrapper/AChipWrapper.vue +4 -3
  21. package/components/elements/chips/AChips.vue +4 -3
  22. package/components/elements/companies/AOurClients.vue +1 -1
  23. package/components/elements/count-up/ACountUp.vue +54 -0
  24. package/components/elements/curve-block/ACurveBlock.vue +15 -48
  25. package/components/elements/curve-block-v2/ACurveBlockV2.vue +60 -25
  26. package/components/elements/digit-badge/ADigitBadge.vue +17 -16
  27. package/components/elements/empty-box/empty-box-V2.vue +92 -0
  28. package/components/elements/error-template/index.vue +99 -31
  29. package/components/elements/feature-description/AFeatureDescription.vue +8 -8
  30. package/components/elements/illustrations/noAccess.vue +1 -1
  31. package/components/elements/infinite-carousel/AInfiniteCarousel.vue +44 -16
  32. package/components/elements/leave-note/ALeaveNote.vue +2 -2
  33. package/components/elements/pagination/APagination.vue +8 -8
  34. package/components/elements/section-heading/ASectionHeading.vue +35 -0
  35. package/components/elements/segmented/ASegmentedV2.vue +24 -21
  36. package/components/elements/select/ASelect.vue +28 -27
  37. package/components/elements/select/ASelectMobile.vue +5 -5
  38. package/components/elements/select/ASelectV2.vue +20 -28
  39. package/components/elements/select/ui/select-button.vue +8 -8
  40. package/components/elements/select/ui/select-list.vue +2 -2
  41. package/components/elements/show-more/AShowMore.vue +2 -2
  42. package/components/elements/show-more/AShowMoreV2.vue +3 -3
  43. package/components/elements/skeleton/ASkeleton.vue +1 -1
  44. package/components/elements/slider/ASlider.vue +3 -2
  45. package/components/elements/slider/ASliderV2.vue +182 -0
  46. package/components/elements/star-rating/AStarRating.vue +2 -2
  47. package/components/elements/status-badge/AStatusBadge.vue +40 -36
  48. package/components/elements/step-slider/AStepSliderColCard.vue +77 -39
  49. package/components/elements/step-slider/AStepSliderColNumber.vue +74 -53
  50. package/components/elements/table/table.config.ts +8 -8
  51. package/components/elements/tree-select/components/ATreeSelectNode.vue +4 -4
  52. package/components/elements/tree-select-mobile/components/ATreeSelectNodesMobile.vue +3 -3
  53. package/components/elements/tree-select-modal/ATreeSelectModal.vue +4 -4
  54. package/components/features/color-mode/AColorMode.client.vue +2 -24
  55. package/components/features/dropdown/ADropdownV2.vue +1 -1
  56. package/components/features/lang-switcher/lang-switcher.vue +6 -6
  57. package/components/features/payment/banner/BasicPlusLimitBanner.vue +3 -23
  58. package/components/features/payment/banner/PaymentBanner.vue +3 -23
  59. package/components/features/payment/banner/UpSellBanner.vue +1 -21
  60. package/components/features/payment/process/PaymentKaspiQrSidePanel.vue +8 -7
  61. package/components/features/payment/process/PaymentKaspiRedirectSidePanel.vue +5 -5
  62. package/components/features/payment/process/PaymentMethodSidePanel.vue +12 -12
  63. package/components/features/payment/process/PaymentTopUpSidePanel.vue +6 -6
  64. package/components/features/pk-mobile-services/APkMobileServices.vue +14 -43
  65. package/components/features//321/201hange-version/AChangeVersion.vue +1 -1
  66. package/components/forms/checkbox/ACheckbox.vue +8 -8
  67. package/components/forms/checkbox/ACheckboxV2.vue +8 -8
  68. package/components/forms/feedback-form/FeedbackForm.vue +8 -8
  69. package/components/forms/feedback-form/FeedbackFormV2.vue +9 -8
  70. package/components/forms/input/AInputV2.vue +39 -25
  71. package/components/forms/input/button/AInputButton.vue +1 -1
  72. package/components/forms/input/date/AInputDate.vue +13 -9
  73. package/components/forms/input/password/AInputPassword.vue +1 -1
  74. package/components/forms/input/standard/AInputStandard.vue +23 -14
  75. package/components/forms/input/textarea/ATextarea.vue +15 -11
  76. package/components/forms/input/textarea/ATextareaV2.vue +18 -13
  77. package/components/forms/radio-button/ARadioButton.vue +4 -4
  78. package/components/forms/request-demo/ARequestDemo.vue +5 -5
  79. package/components/forms/toggle/AToggle.vue +8 -7
  80. package/components/forms/toggle/AToggleV2.vue +7 -6
  81. package/components/modals/AConfirmationEmail.vue +3 -3
  82. package/components/modals/AboutTariffModal.vue +10 -9
  83. package/components/modals/AnotherDeviceModal.vue +11 -10
  84. package/components/modals/ApplicationAcceptedModal.vue +3 -2
  85. package/components/modals/ConnectingTariffModal.vue +1 -1
  86. package/components/modals/ContactsMobileModel.vue +5 -5
  87. package/components/modals/ContentNavigationModal.vue +8 -7
  88. package/components/modals/Insufficient-funds-modal.vue +4 -4
  89. package/components/modals/LimitReachedModal.vue +18 -7
  90. package/components/modals/NoAccessModal.vue +7 -3
  91. package/components/modals/PaymentMethodModal.vue +4 -4
  92. package/components/modals/RedirectsBanksModal.vue +4 -4
  93. package/components/modals/ReplenishModal.vue +2 -2
  94. package/components/modals/ReportBugConfirmModal.vue +2 -2
  95. package/components/modals/ReportBugModal.vue +2 -2
  96. package/components/modals/Resend.vue +4 -4
  97. package/components/modals/SubmitApplicationModal.vue +1 -5
  98. package/components/modals/id/AuthModal.vue +27 -47
  99. package/components/modals/id/IdAutoLogoutModal.vue +23 -24
  100. package/components/modals/id/IdBanner.vue +4 -24
  101. package/components/modals/id/IdConfirmAccountOtpModal.vue +5 -4
  102. package/components/modals/id/IdConfirmSuccessfulModal.vue +3 -3
  103. package/components/modals/id/IdLoginModal.vue +8 -8
  104. package/components/modals/id/IdModals.vue +1 -3
  105. package/components/modals/id/IdNewPasswordModal.vue +3 -3
  106. package/components/modals/id/IdOtpInput.vue +3 -3
  107. package/components/modals/id/IdPasswordSuccessfulModal.vue +3 -3
  108. package/components/modals/id/IdRecoveryModal.vue +3 -3
  109. package/components/modals/id/IdRegistrationModal.vue +4 -4
  110. package/components/modals/id/IdResetPasswordOtpModal.vue +5 -4
  111. package/components/modals/id/IdTwoFactorModal.vue +3 -2
  112. package/components/navigation/bottom-navigation/ABottomNavigation.vue +7 -7
  113. package/components/navigation/breadcrumbs/ABreadcrumbs.vue +4 -4
  114. package/components/navigation/footer/AFooter.vue +2 -2
  115. package/components/navigation/footer/ui/a-footer-accordion.vue +1 -1
  116. package/components/navigation/header/AHeader.vue +11 -11
  117. package/components/navigation/header/AlmatyContacts.vue +7 -7
  118. package/components/navigation/header/AstanaContacts.vue +4 -4
  119. package/components/navigation/header/CardGallery.vue +8 -7
  120. package/components/navigation/header/ContactMenu.vue +1 -1
  121. package/components/navigation/header/HeaderLink.vue +5 -5
  122. package/components/navigation/header/HeaderUsage.vue +14 -14
  123. package/components/navigation/header/ListItem.vue +4 -3
  124. package/components/navigation/header/NavCard.vue +6 -5
  125. package/components/navigation/header/NavList.vue +9 -8
  126. package/components/navigation/header/NotificationsMenu.vue +10 -10
  127. package/components/navigation/header/ProductMenu.vue +10 -9
  128. package/components/navigation/header/ProfileMenu.vue +13 -12
  129. package/components/navigation/header/SystemNotification.vue +4 -4
  130. package/components/navigation/line-tabs/ALineTabs.vue +10 -9
  131. package/components/navigation/pill-tabs/APillTabs.vue +18 -16
  132. package/components/navigation/pill-tabs/APillTabsV2.vue +40 -25
  133. package/components/navigation/side-navigation/ASideNavigation.vue +3 -3
  134. package/components/overlays/drawer/ADrawerV2.vue +12 -11
  135. package/components/overlays/modal/AModal.vue +4 -4
  136. package/components/overlays/modal/AModalV2.vue +17 -13
  137. package/components/overlays/side-panel/ASidePanel.vue +7 -7
  138. package/components/overlays/sideover/ASlideover.vue +4 -4
  139. package/components/overlays/tooltip/ATooltip.vue +3 -2
  140. package/components/overlays/tooltip/ATooltipV2.vue +2 -2
  141. package/composables/highlight.ts +2 -1
  142. package/eslint.config.mjs +14 -1
  143. package/icons/arrow/arrow-left.vue +14 -0
  144. package/icons/arrow-currency-gray.vue +1 -1
  145. package/icons/arrow-currency-green.vue +1 -1
  146. package/icons/arrow-currency-red.vue +1 -1
  147. package/icons/avatar.vue +1 -1
  148. package/icons/bar-chart-3.vue +3 -0
  149. package/icons/book-open.vue +3 -0
  150. package/icons/bookmark/bookmark-filled.vue +1 -0
  151. package/icons/braces.vue +3 -0
  152. package/icons/check/check-outline.vue +3 -0
  153. package/icons/chevron/chevron-down-outline.vue +3 -0
  154. package/icons/clipboard-list.vue +3 -0
  155. package/icons/clock-outline.vue +3 -0
  156. package/icons/company-egov-small.vue +1 -1
  157. package/icons/database.vue +3 -0
  158. package/icons/download-outline.vue +3 -0
  159. package/icons/download.vue +1 -1
  160. package/icons/egov.vue +1 -1
  161. package/icons/elicense.vue +1 -1
  162. package/icons/file-json.vue +3 -0
  163. package/icons/file-search.vue +3 -0
  164. package/icons/file-text.vue +3 -0
  165. package/icons/flask-conical.vue +3 -0
  166. package/icons/folder-open.vue +3 -0
  167. package/icons/gift-outline.vue +3 -0
  168. package/icons/globe-2.vue +3 -0
  169. package/icons/graph-loading.vue +2 -2
  170. package/icons/hand/hand-thumb-up-filled.vue +1 -1
  171. package/icons/home.vue +14 -0
  172. package/icons/invoice.vue +1 -0
  173. package/icons/key-round.vue +3 -0
  174. package/icons/letter/letter-a.vue +4 -2
  175. package/icons/letter/letter-b.vue +2 -2
  176. package/icons/letter/letter-c.vue +2 -2
  177. package/icons/letter/letter-d.vue +2 -2
  178. package/icons/letter/letter-e.vue +2 -2
  179. package/icons/logo.vue +1 -1
  180. package/icons/main-filter.vue +1 -1
  181. package/icons/menu.vue +4 -4
  182. package/icons/message/message.vue +1 -1
  183. package/icons/messages-square.vue +3 -0
  184. package/icons/more.vue +1 -1
  185. package/icons/payment/payment-card.vue +2 -2
  186. package/icons/radio/radio-check.vue +1 -1
  187. package/icons/robot-outline.vue +3 -0
  188. package/icons/scales/scale-outline.vue +3 -0
  189. package/icons/search-outline.vue +3 -0
  190. package/icons/send.vue +3 -0
  191. package/icons/star/star-filled.vue +1 -0
  192. package/icons/star/star-half-filled.vue +1 -0
  193. package/icons/sun.vue +1 -0
  194. package/icons/terminal.vue +3 -0
  195. package/icons/toasts/warning-triangle-toast.vue +1 -0
  196. package/icons/triangle-alert.vue +3 -0
  197. package/icons/users-outline.vue +3 -0
  198. package/icons/webhook.vue +3 -0
  199. package/icons/x-outline.vue +3 -0
  200. package/icons/yandex.vue +2 -1
  201. package/illustrations/address-location.vue +2 -2
  202. package/illustrations/award-badge.vue +105 -0
  203. package/illustrations/ball-with-chain.vue +7 -7
  204. package/illustrations/bill.vue +5 -5
  205. package/illustrations/buildings.vue +4 -4
  206. package/illustrations/calendar.vue +11 -11
  207. package/illustrations/chains.vue +12 -12
  208. package/illustrations/coin-percent.vue +3 -3
  209. package/illustrations/coins-stack.vue +4 -4
  210. package/illustrations/delete-dark.vue +1 -0
  211. package/illustrations/delete.vue +1 -0
  212. package/illustrations/doc-with-stamp.vue +5 -5
  213. package/illustrations/document.vue +3 -3
  214. package/illustrations/door.vue +79 -68
  215. package/illustrations/empty-badge-check.vue +20 -0
  216. package/illustrations/empty-ban.vue +18 -0
  217. package/illustrations/empty-box.vue +5 -5
  218. package/illustrations/empty-filter.vue +20 -0
  219. package/illustrations/empty-inbox.vue +19 -0
  220. package/illustrations/empty-scale.vue +22 -0
  221. package/illustrations/empty-search-x.vue +21 -0
  222. package/illustrations/empty-shopping-cart.vue +21 -0
  223. package/illustrations/empty-users-round.vue +20 -0
  224. package/illustrations/empty-wallet.vue +121 -155
  225. package/illustrations/graph-in-coin.vue +2 -2
  226. package/illustrations/hammer.vue +5 -5
  227. package/illustrations/hand-cash.vue +1 -1
  228. package/illustrations/info.vue +49 -36
  229. package/illustrations/mail-active.vue +86 -0
  230. package/illustrations/mail.vue +4 -4
  231. package/illustrations/no-access.vue +92 -0
  232. package/illustrations/ok.vue +86 -58
  233. package/illustrations/people-group.vue +1 -1
  234. package/illustrations/person-with-phone.vue +5 -5
  235. package/illustrations/person.vue +3 -3
  236. package/illustrations/phone-check.vue +104 -84
  237. package/illustrations/phone-payment-method.vue +1 -1
  238. package/illustrations/shield-user.vue +94 -0
  239. package/illustrations/stop-hand.vue +78 -71
  240. package/illustrations/stop-sign.vue +1 -1
  241. package/illustrations/suit.vue +93 -107
  242. package/illustrations/suitcase.vue +6 -6
  243. package/illustrations/terminal.vue +94 -228
  244. package/illustrations/trash-can.vue +60 -102
  245. package/illustrations/turn-on-tariff.vue +2 -2
  246. package/illustrations/two-persons.vue +2 -2
  247. package/lang/en.ts +25 -29
  248. package/lang/kk.ts +24 -28
  249. package/lang/ru.ts +24 -29
  250. package/nuxt.config.ts +11 -4
  251. package/package.json +7 -12
  252. package/assets/styles/index.scss +0 -166
  253. package/assets/styles/modules/_base.scss +0 -5
  254. package/assets/styles/modules/_typography.scss +0 -152
  255. package/components/elements/error-template/types.ts +0 -23
  256. package/illustrations/terminal-dark.vue +0 -48
  257. package/tailwind.config.ts +0 -194
  258. package/tests/AButton.test.ts +0 -81
@@ -99,80 +99,101 @@ watch(() => [props.interval, props.autoplay, props.steps.length], () => {
99
99
 
100
100
  <template>
101
101
  <div
102
- class="grid grid-cols-1 items-center gap-4 lg:gap-16"
102
+ class="grid grid-cols-1 items-start gap-[34px] lg:gap-13"
103
103
  :class="colsClass"
104
104
  >
105
- <ol class="flex flex-col gap-4">
106
- <li
107
- v-for="(step, i) in steps"
108
- :key="i"
109
- class="group relative flex cursor-pointer items-start gap-4 px-4 py-3"
110
- @click="goTo(i)"
111
- >
105
+ <div class="flex flex-col">
106
+ <ol class="relative flex flex-col gap-1.5">
107
+ <!-- Одна непрерывная линия с прогрессивной заливкой (как в макете),
108
+ а не дискретные сегменты между шагами. Линия проходит ЗА кружками,
109
+ поэтому их фон обязан быть непрозрачным (см. ниже). -->
112
110
  <span
113
- v-if="i === active"
114
- class="ss-card-glow absolute inset-0 z-[1] rounded-2xl bg-white"
115
- />
116
- <span
117
- v-if="i < steps.length - 1"
118
- class="absolute left-[34px] top-[46px] z-0 h-[calc(100%_-_18px)] w-0.5 -translate-x-1/2 rounded transition-colors"
119
- :class="i < active ? 'bg-blue-600' : 'bg-gray-200'"
120
- />
121
- <span class="relative z-10 flex w-9 shrink-0 justify-center">
111
+ v-if="steps.length > 1"
112
+ class="absolute inset-y-9 left-[31px] z-0 w-0.5 overflow-hidden rounded bg-badge"
113
+ aria-hidden="true"
114
+ >
115
+ <span
116
+ class="ss-line-fill absolute inset-x-0 top-0 rounded bg-brand"
117
+ :style="{ height: `${(active / (steps.length - 1)) * 100}%` }"
118
+ />
119
+ </span>
120
+
121
+ <li
122
+ v-for="(step, i) in steps"
123
+ :key="i"
124
+ class="ss-step relative z-10 flex cursor-pointer gap-[15px] rounded-14 px-4 py-3.5"
125
+ :class="i === active ? 'ss-step-on bg-main' : ''"
126
+ @click="goTo(i)"
127
+ >
128
+ <!-- Фон кружка только НЕПРОЗРАЧНЫМИ токенами: bg-brand-subtle в тёмной
129
+ теме = #068DFF1A (10% альфы), и линия прогресса просвечивала
130
+ сквозь пройденный шаг. Для дарка берём непрозрачный brand-900. -->
122
131
  <span
123
- class="text-body-md flex items-center justify-center rounded-full font-bold transition-all duration-300"
132
+ class="relative z-10 flex size-[34px] shrink-0 items-center justify-center rounded-full text-body-md font-bold transition-all duration-300"
124
133
  :class="i === active
125
- ? 'ss-num-glow size-9 bg-blue-600 text-white'
134
+ ? 'ss-num-glow scale-[1.08] bg-brand text-inverted'
126
135
  : i < active
127
- ? 'size-[34px] bg-blue-50 text-blue-600 group-hover:bg-blue-100'
128
- : 'size-[34px] bg-gray-100 text-gray-400 group-hover:bg-gray-200'"
136
+ ? 'bg-brand-100 text-brand dark:bg-brand-900 dark:text-brand-300'
137
+ : 'bg-canvas text-secondary'"
129
138
  >
130
139
  {{ i + 1 }}
131
140
  </span>
132
- </span>
133
- <div class="relative z-10">
134
- <p
135
- class="text-body-lg-strong transition-colors"
136
- :class="i === active
137
- ? 'text-gray-900'
138
- : i < active
139
- ? 'text-[#5b6472]'
140
- : 'text-gray-400'"
141
- >
142
- {{ step.title }}
143
- </p>
144
- <p class="text-body-md text-[#9ca3af]">
145
- {{ step.description }}
146
- </p>
147
- </div>
148
- </li>
149
- </ol>
141
+ <div>
142
+ <p
143
+ class="text-body-md-strong transition-colors"
144
+ :class="i === active ? 'text-primary' : 'text-secondary'"
145
+ >
146
+ {{ step.title }}
147
+ </p>
148
+ <p class="mt-[3px] text-body-sm leading-normal text-secondary">
149
+ {{ step.description }}
150
+ </p>
151
+ </div>
152
+ </li>
153
+ </ol>
154
+
155
+ <slot name="steps-footer" />
156
+ </div>
150
157
 
151
158
  <div
152
159
  @mouseenter="onMouseEnter"
153
160
  @mouseleave="onMouseLeave"
154
161
  >
155
- <div class="flex justify-center">
156
- <slot
157
- name="panel"
158
- :active="active"
159
- :step="steps[active]"
160
- :progress="progress"
161
- :count="steps.length"
162
- :fill-width="fillWidth"
163
- :go-to="goTo"
164
- />
165
- </div>
162
+ <slot
163
+ name="panel"
164
+ :active="active"
165
+ :step="steps[active]"
166
+ :progress="progress"
167
+ :count="steps.length"
168
+ :fill-width="fillWidth"
169
+ :go-to="goTo"
170
+ />
166
171
  </div>
167
172
  </div>
168
173
  </template>
169
174
 
170
175
  <style scoped>
176
+ .ss-line-fill {
177
+ transition: height .6s cubic-bezier(.4, 0, .2, 1);
178
+ }
179
+
180
+ .ss-step {
181
+ background: transparent;
182
+ transition: background .4s, box-shadow .4s;
183
+ }
184
+
185
+ .ss-step-on {
186
+ box-shadow: 0 14px 34px -18px color-mix(in srgb, var(--color-brand-500) 30%, transparent);
187
+ }
188
+
171
189
  .ss-num-glow {
172
- box-shadow: 0 4px 12px rgb(6 141 255 / 45%);
190
+ box-shadow: 0 6px 16px -4px color-mix(in srgb, var(--color-brand-500) 55%, transparent);
173
191
  }
174
192
 
175
- .ss-card-glow {
176
- box-shadow: 0 22px 60px -18px rgb(6 141 255 / 32%);
193
+ @media (prefers-reduced-motion: reduce) {
194
+ .ss-line-fill,
195
+ .ss-step {
196
+ transition: none;
197
+ }
177
198
  }
178
199
  </style>
@@ -1,18 +1,18 @@
1
1
  export const ui = {
2
- wrapper: 'relative overflow-x-auto rounded bg-white dark:bg-gray-900',
2
+ wrapper: 'relative overflow-x-auto rounded bg-main',
3
3
  base: 'min-w-full table-fixed ',
4
4
  divide: '',
5
- thead: 'relative bg-gray-100 dark:bg-[#E3E5E81A]',
5
+ thead: 'relative bg-badge',
6
6
  tbody: '',
7
7
  tr: {
8
- base: 'even:bg-gray-50 dark:even:bg-[#E3E5E81A]',
9
- selected: 'bg-gray-50 dark:bg-gray-800/50',
10
- active: 'hover:bg-gray-50 dark:hover:bg-gray-800/50 cursor-pointer',
8
+ base: 'even:bg-muted',
9
+ selected: 'bg-muted',
10
+ active: 'hover:bg-action-secondary-hover cursor-pointer',
11
11
  },
12
12
  th: {
13
13
  base: 'text-left rtl:text-right',
14
14
  padding: 'px-4 py-3.5',
15
- color: 'text-deepblue-900 dark:text-gray-200',
15
+ color: 'text-primary',
16
16
  font: 'font-semibold',
17
17
  size: 'text-body-sm',
18
18
  },
@@ -22,11 +22,11 @@ export const ui = {
22
22
  sm: 'px-3 py-2',
23
23
  md: 'px-4 py-4'
24
24
  },
25
- color: 'text-deepblue-900 dark:text-gray-200',
25
+ color: 'text-primary',
26
26
  font: '',
27
27
  size: 'text-body-md',
28
28
  },
29
29
  progress: {
30
- wrapper: 'absolute h-[2px] bg-deepblue-700 inset-x-0 animate-pulse',
30
+ wrapper: 'absolute inset-x-0 h-[2px] animate-pulse bg-action-primary',
31
31
  },
32
32
  }
@@ -25,17 +25,17 @@ function onSelectToggle() {
25
25
  <template>
26
26
  <li
27
27
  :style="{ paddingLeft: `${node.level * 20}px` }"
28
- :class="[{ 'bg-[#2C3E500D] dark:bg-[#E3E5E80D]': node.state === 'checked' && type === 'select' }]"
28
+ :class="[{ 'bg-muted': node.state === 'checked' && type === 'select' }]"
29
29
  >
30
30
  <div
31
31
  v-if="!node.hidden"
32
32
  class="flex items-center gap-1 p-2"
33
- :class="{ 'bg-deepblue-50 dark:bg-gray-200/5': isDisabled }"
33
+ :class="{ 'bg-action-disabled': isDisabled }"
34
34
  >
35
35
  <div class="flex min-w-4 items-center">
36
36
  <a-icon-loader-circle
37
37
  v-if="node.loading"
38
- class="size-4 animate-spin text-gray-400 dark:text-gray-500"
38
+ class="size-4 animate-spin text-icon-disabled"
39
39
  />
40
40
  <a-icon-chevron-down
41
41
  v-else-if="node.expandable"
@@ -78,7 +78,7 @@ function onSelectToggle() {
78
78
  </slot>
79
79
  <a-icon-check
80
80
  v-if="node.state === 'checked'"
81
- class="min-w-4 text-blue-700 dark:text-blue-400"
81
+ class="min-w-4 text-brand"
82
82
  />
83
83
  </div>
84
84
  </div>
@@ -3,7 +3,7 @@
3
3
  :key="node.id"
4
4
  >
5
5
  <li
6
- :class="[`flex gap-2 items-center px-4 py-3 `, {'bg-[#2C3E500D]': isChecked}]"
6
+ :class="['flex gap-2 items-center px-4 py-3', { 'bg-muted': isChecked }]"
7
7
  :style="{ 'padding-left': `${getIndent(deep)}px` }"
8
8
  >
9
9
  <div class="min-w-4 cursor-pointer">
@@ -27,12 +27,12 @@
27
27
  type="checkbox"
28
28
  @change="handelChange"
29
29
  >
30
- <p class="text-deepblue-900 dark:text-gray-200 heading-03 w-full ">
30
+ <p class="text-primary text-h3 w-full ">
31
31
  {{ node.name }}
32
32
  </p>
33
33
  <a-icon-check
34
34
  v-if="isChecked"
35
- class="text-blue-700 min-w-4"
35
+ class="text-brand min-w-4"
36
36
  />
37
37
  </label>
38
38
  </li>
@@ -133,14 +133,14 @@ defineExpose({ open: openModal, close: () => (isOpen.value = false) })
133
133
  >
134
134
  <template #header>
135
135
  <slot name="header" :title="title">
136
- <h2 class="text-h5 text-gray-900 dark:text-gray-100">
136
+ <h2 class="text-h5 text-primary">
137
137
  {{ title }}
138
138
  </h2>
139
139
  </slot>
140
140
  </template>
141
141
 
142
142
  <div class="flex flex-col">
143
- <div class="sticky top-0 z-[1] flex flex-col gap-4 bg-white px-5 pb-4 pt-4 dark:bg-gray-900">
143
+ <div class="sticky top-0 z-[1] flex flex-col gap-4 bg-main px-5 pb-4 pt-4">
144
144
  <a-input-v2
145
145
  v-model="search"
146
146
  type="search"
@@ -149,7 +149,7 @@ defineExpose({ open: openModal, close: () => (isOpen.value = false) })
149
149
  clearable
150
150
  />
151
151
 
152
- <p v-if="filteringLabel" class="text-body-sm text-gray-500 dark:text-gray-400">
152
+ <p v-if="filteringLabel" class="text-body-sm text-secondary">
153
153
  {{ filteringLabel }}
154
154
  </p>
155
155
  </div>
@@ -182,7 +182,7 @@ defineExpose({ open: openModal, close: () => (isOpen.value = false) })
182
182
  </template>
183
183
  </a-tree-select>
184
184
 
185
- <div v-else class="flex items-center justify-center py-10 text-gray-400 dark:text-gray-500">
185
+ <div v-else class="flex items-center justify-center py-10 text-icon-disabled">
186
186
  <a-icon-loader-circle class="size-6 animate-spin" />
187
187
  </div>
188
188
  </div>
@@ -1,43 +1,21 @@
1
1
  <script setup lang="ts">
2
2
  import Moon from '#adata-ui/icons/moon.vue'
3
3
  import Sun from '#adata-ui/icons/sun.vue'
4
- import { useEventListener } from '@vueuse/core'
5
4
 
6
5
  const colorMode = useColorMode()
7
- const setColorMode = useCookie('colorMode')
8
-
9
- if (setColorMode.value) {
10
- colorMode.preference = setColorMode.value
11
- }
12
-
13
- const ONE_YEAR_SECONDS = 60 * 60 * 24 * 365
14
-
15
- function cookieDomainAttr(): string {
16
- const parts = location.hostname.split('.').reverse()
17
- if (parts.length < 2) return ''
18
- return `; domain=.${parts[1]}.${parts[0]}`
19
- }
20
6
 
21
7
  const isDark = computed(() => colorMode.value === 'dark')
22
8
 
23
9
  function toggle() {
24
- const value = isDark.value ? 'light' : 'dark'
25
- colorMode.preference = value
26
- document.cookie = `colorMode=${value}; max-age=${ONE_YEAR_SECONDS}${cookieDomainAttr()}; path=/`
10
+ colorMode.preference = isDark.value ? 'light' : 'dark'
27
11
  }
28
-
29
- useEventListener(window, 'storage', (event: StorageEvent) => {
30
- if (event.key === 'nuxt-color-mode' && event.newValue) {
31
- colorMode.preference = event.newValue
32
- }
33
- })
34
12
  </script>
35
13
 
36
14
  <template>
37
15
  <client-only>
38
16
  <button
39
17
  type="button"
40
- class="relative inline-flex size-8 items-center justify-center overflow-hidden rounded-lg text-deepblue-900/80 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:text-gray-200 dark:hover:bg-white/10 dark:focus-visible:ring-offset-gray-900"
18
+ class="relative inline-flex size-8 items-center justify-center overflow-hidden rounded-lg text-primary/80 transition-colors duration-150 hover:bg-action-secondary-hover focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-brand-500/50 focus-visible:ring-offset-1"
41
19
  :aria-label="isDark ? 'Switch to light mode' : 'Switch to dark mode'"
42
20
  data-test-id="header-switch-theme-toggle"
43
21
  @click="toggle"
@@ -84,7 +84,7 @@ onKeyStroke('Escape', () => {
84
84
  <div
85
85
  v-if="isOpen"
86
86
  ref="floating"
87
- class="z-[60] overflow-hidden rounded-lg shadow-lg shadow-gray-900/10 dark:shadow-black/30"
87
+ class="z-[60] overflow-hidden rounded-lg shadow-lg shadow-surface-dark/10 dark:shadow-surface-dark/30"
88
88
  :style="{
89
89
  position: strategy,
90
90
  left: x != null ? `${x}px` : '',
@@ -66,10 +66,10 @@ function onSelect(loc: LocaleItem) {
66
66
  <button
67
67
  ref="reference"
68
68
  type="button"
69
- class="inline-flex size-8 items-center justify-center rounded-lg text-body-sm font-semibold text-gray-900 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:text-gray-100 dark:hover:bg-white/10 dark:focus-visible:ring-offset-gray-900"
69
+ class="inline-flex size-8 items-center justify-center rounded-lg text-body-sm font-semibold text-primary transition-colors duration-150 hover:bg-action-secondary-hover focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-brand-500/50 focus-visible:ring-offset-1"
70
70
  :class="[
71
71
  isOpen
72
- ? 'bg-blue-50 text-blue-700 ring-2 ring-blue-500/20 dark:bg-blue-900/40 dark:text-blue-300'
72
+ ? 'bg-brand-subtle text-brand ring-2 ring-brand-500/20'
73
73
  : '',
74
74
  ]"
75
75
  :data-test-id="`header-switch-language-button${testIdSuffix}`"
@@ -91,7 +91,7 @@ function onSelect(loc: LocaleItem) {
91
91
  <div
92
92
  v-if="isOpen"
93
93
  ref="floating"
94
- class="z-[10000] w-fit rounded-lg border border-gray-200 bg-white shadow-lg shadow-gray-900/10 dark:border-gray-700 dark:bg-gray-900 dark:shadow-black/30"
94
+ class="z-[10000] w-fit rounded-lg border border-default bg-main shadow-lg shadow-surface-dark/10 dark:shadow-surface-dark/30"
95
95
  :style="{
96
96
  position: strategy,
97
97
  left: x != null ? `${x}px` : '',
@@ -111,15 +111,15 @@ function onSelect(loc: LocaleItem) {
111
111
  class="flex w-full items-center justify-between gap-3 rounded-md px-3 py-2 text-body-md transition-colors duration-100"
112
112
  :class="[
113
113
  localeCode(loc) === locale
114
- ? 'bg-blue-50 font-medium text-blue-700 dark:bg-blue-900/30 dark:text-blue-400'
115
- : 'text-gray-700 hover:bg-gray-50 dark:text-gray-200 dark:hover:bg-gray-800/60',
114
+ ? 'bg-brand-subtle font-medium text-brand'
115
+ : 'text-quaternary hover:bg-action-secondary-hover',
116
116
  ]"
117
117
  @click.prevent="onSelect(loc)"
118
118
  >
119
119
  <span>{{ t(`lang.${localeCode(loc)}.long`) }}</span>
120
120
  <check
121
121
  v-if="localeCode(loc) === locale"
122
- class="size-4 shrink-0 text-blue-600 dark:text-blue-400"
122
+ class="size-4 shrink-0 text-brand"
123
123
  />
124
124
  </nuxt-link>
125
125
  </li>
@@ -51,7 +51,7 @@ function onUpdate() {
51
51
  </script>
52
52
 
53
53
  <template>
54
- <div class="gradient flex justify-between rounded-md p-4 ring-1 ring-inset ring-blue-700/80 dark:bg-gray-800">
54
+ <div class="bg-gradient-banner flex justify-between rounded-md p-4 ring-1 ring-inset ring-(--border-color-brand)/80">
55
55
  <div>
56
56
  <p class="mb-2 text-h5">
57
57
  {{ t('modals.id.banners.basicPlusLimit.title') }}
@@ -59,11 +59,11 @@ function onUpdate() {
59
59
  <i18n-t
60
60
  keypath="modals.id.banners.basicPlusLimit.subtitle"
61
61
  tag="p"
62
- class="text-body-md text-gray-600 dark:text-gray-200"
62
+ class="text-body-md text-quaternary"
63
63
  >
64
64
  <template #topUp>
65
65
  <button
66
- class="font-semibold text-blue-700 dark:text-blue-500"
66
+ class="font-semibold text-brand"
67
67
  @click="topUpSidePanel = true"
68
68
  >
69
69
  {{ t('modals.id.banners.basicPlusLimit.topUp') }}
@@ -82,23 +82,3 @@ function onUpdate() {
82
82
  </a-button>
83
83
  </div>
84
84
  </template>
85
-
86
- <style scoped>
87
- .gradient {
88
- background: linear-gradient(
89
- 239.71deg,
90
- #B3D5F9 -7.48%,
91
- #E6F1FD 39.62%,
92
- #CCE2FB 85.82%
93
- );
94
- }
95
-
96
- .dark .gradient {
97
- background: linear-gradient(
98
- 239.71deg,
99
- #17303F -7.48%,
100
- #161617 39.62%,
101
- #17303F 85.82%
102
- );
103
- }
104
- </style>
@@ -56,7 +56,7 @@ function onBuy() {
56
56
  </script>
57
57
 
58
58
  <template>
59
- <div class="gradient flex justify-between rounded-md p-4 ring-1 ring-inset ring-blue-700/80 dark:bg-gray-800">
59
+ <div class="bg-gradient-banner flex justify-between rounded-md p-4 ring-1 ring-inset ring-(--border-color-brand)/80">
60
60
  <div>
61
61
  <p class="mb-2 text-h5">
62
62
  {{ t('payment.banner.title') }}
@@ -64,11 +64,11 @@ function onBuy() {
64
64
  <i18n-t
65
65
  keypath="payment.banner.subtitle"
66
66
  tag="p"
67
- class="text-body-md text-gray-600 dark:text-gray-200"
67
+ class="text-body-md text-quaternary"
68
68
  >
69
69
  <template #tariffs>
70
70
  <nuxt-link
71
- class="font-semibold text-blue-700 dark:text-blue-500"
71
+ class="font-semibold text-brand"
72
72
  :to="buildLocalizedUrl(locale, landing, '/tariffs')"
73
73
  >
74
74
  {{ t('payment.banner.tariffs') }}
@@ -86,23 +86,3 @@ function onBuy() {
86
86
  </a-button>
87
87
  </div>
88
88
  </template>
89
-
90
- <style scoped>
91
- .gradient {
92
- background: linear-gradient(
93
- 239.71deg,
94
- #B3D5F9 -7.48%,
95
- #E6F1FD 39.62%,
96
- #CCE2FB 85.82%
97
- );
98
- }
99
-
100
- .dark .gradient {
101
- background: linear-gradient(
102
- 239.71deg,
103
- #17303F -7.48%,
104
- #161617 39.62%,
105
- #17303F 85.82%
106
- );
107
- }
108
- </style>
@@ -72,7 +72,7 @@ function onBuy() {
72
72
  </script>
73
73
 
74
74
  <template>
75
- <div class="relative gradient flex justify-between rounded-md p-4 ring-1 ring-inset ring-blue-700/80 dark:bg-gray-800">
75
+ <div class="relative bg-gradient-banner flex justify-between rounded-md p-4 ring-1 ring-inset ring-(--border-color-brand)/80">
76
76
  <div class="flex flex-col gap-3">
77
77
  <p class="text-h5">
78
78
  {{ t(`payment.upsell.${code}.title`) }}
@@ -103,23 +103,3 @@ function onBuy() {
103
103
  </a-button>
104
104
  </div>
105
105
  </template>
106
-
107
- <style scoped>
108
- .gradient {
109
- background: linear-gradient(
110
- 239.71deg,
111
- #B3D5F9 -7.48%,
112
- #E6F1FD 39.62%,
113
- #CCE2FB 85.82%
114
- );
115
- }
116
-
117
- .dark .gradient {
118
- background: linear-gradient(
119
- 239.71deg,
120
- #17303F -7.48%,
121
- #161617 39.62%,
122
- #17303F 85.82%
123
- );
124
- }
125
- </style>
@@ -72,6 +72,7 @@ watch(isOpen, async (value) => {
72
72
  errorCorrectionLevel: 'H',
73
73
  width: 300,
74
74
  margin: 0,
75
+ /* Canvas API: CSS-переменные недоступны — hex обязателен */
75
76
  color: {
76
77
  dark: colorMode.value === 'dark' ? '#FFFFFF' : '#000000', // квадраты
77
78
  light: colorMode.value === 'dark' ? '#000000' : '#FFFFFF', // фон
@@ -121,32 +122,32 @@ watch(isOpen, async (value) => {
121
122
  <div class="flex items-center gap-2">
122
123
  <button
123
124
  type="button"
124
- class="rounded-md p-1 transition-colors hover:bg-gray-100 dark:hover:bg-white/[0.06]"
125
+ class="rounded-md p-1 transition-colors hover:bg-badge"
125
126
  data-test-id="kaspi-qr-back-button"
126
127
  @click="onBack"
127
128
  >
128
129
  <a-icon-chevron-left class="size-6" />
129
130
  </button>
130
- <p class="text-xl font-semibold text-deepblue-900 dark:text-gray-100" data-test-id="kaspi-qr-title">
131
+ <p class="text-h3 text-primary" data-test-id="kaspi-qr-title">
131
132
  {{ t('payment.kaspi.title') }}
132
133
  </p>
133
134
  </div>
134
135
  </template>
135
136
 
136
137
  <div class="flex flex-col gap-6">
137
- <p class="text-center text-sm font-medium text-gray-600 dark:text-gray-300">
138
+ <p class="text-center text-body-md-medium text-quaternary">
138
139
  {{ t('payment.kaspi.description') }}
139
140
  </p>
140
141
 
141
- <div class="flex flex-col items-center gap-5 rounded-xl border border-gray-200 bg-white p-6 dark:border-gray-700 dark:bg-gray-900" data-test-id="kaspi-qr-payment-block">
142
+ <div class="flex flex-col items-center gap-5 rounded-xl border border-default bg-main p-6" data-test-id="kaspi-qr-payment-block">
142
143
  <div class="flex items-center gap-3">
143
144
  <a-icon-kaspi-qr class="size-14" />
144
- <span class="text-[40px] font-bold leading-none text-deepblue-900 dark:text-white">
145
+ <span class="text-[40px] font-bold leading-none text-primary">
145
146
  {{ t('payment.kaspi.qr') }}
146
147
  </span>
147
148
  </div>
148
149
 
149
- <p class="text-center text-xl font-bold text-deepblue-900 dark:text-white">
150
+ <p class="text-center text-h3 font-bold text-primary">
150
151
  {{ t('payment.kaspi.scan') }}
151
152
  </p>
152
153
 
@@ -155,7 +156,7 @@ watch(isOpen, async (value) => {
155
156
  class="rounded-md"
156
157
  />
157
158
 
158
- <p class="text-center text-base text-gray-600 dark:text-gray-300">
159
+ <p class="text-center text-body-lg text-quaternary">
159
160
  {{ t('payment.kaspi.adata') }}
160
161
  </p>
161
162
  </div>
@@ -79,20 +79,20 @@ watch(isOpen, async (value) => {
79
79
  width="484px"
80
80
  >
81
81
  <div class="flex flex-col gap-6">
82
- <p class="whitespace-pre-wrap text-center text-xl font-bold text-deepblue-900 dark:text-gray-100">
82
+ <p class="whitespace-pre-wrap text-center text-h3 font-bold text-primary">
83
83
  {{ t('payment.redirect.title') }}
84
84
  </p>
85
85
 
86
- <div class="flex flex-col items-center gap-1 rounded-xl bg-gray-50 p-5 text-center dark:bg-white/[0.03]">
87
- <span class="text-xs text-gray-500 dark:text-gray-400">
86
+ <div class="flex flex-col items-center gap-1 rounded-xl bg-muted p-5 text-center">
87
+ <span class="text-body-sm text-secondary">
88
88
  {{ t('payment.redirect.paymentId') }}
89
89
  </span>
90
- <span class="text-2xl font-bold text-deepblue-900 dark:text-gray-100">
90
+ <span class="text-h2 text-primary">
91
91
  {{ requestId }}
92
92
  </span>
93
93
  </div>
94
94
 
95
- <p class="text-center text-sm text-gray-600 dark:text-gray-300">
95
+ <p class="text-center text-body-md text-quaternary">
96
96
  {{ t('payment.redirect.description') }}
97
97
  </p>
98
98
  </div>