adata-ui 2.1.40-beta.8 → 2.1.41-beta.0

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 (575) hide show
  1. package/-error.vue +170 -170
  2. package/.editorconfig +12 -12
  3. package/.gitlab-ci.yml +16 -16
  4. package/.nuxtrc +1 -1
  5. package/.nvmrc +1 -1
  6. package/.playground/app.config.ts +5 -5
  7. package/.playground/app.vue +102 -102
  8. package/.playground/nuxt.config.ts +4 -4
  9. package/CLAUDE.md +62 -0
  10. package/README.md +75 -75
  11. package/app.config.ts +28 -28
  12. package/app.vue +8 -8
  13. package/assets/styles/main.css +11 -0
  14. package/assets/styles/theme.css +576 -0
  15. package/assets/styles/ui.css +170 -0
  16. package/components/elements/README.md +1 -1
  17. package/components/elements/a-select-row/ASelectRowV2.vue +210 -214
  18. package/components/elements/a-select-row/index.vue +139 -140
  19. package/components/elements/accordion/AAccordion.vue +199 -197
  20. package/components/elements/accordion/AAccordionGroup/AAccordionGroup.vue +145 -145
  21. package/components/elements/accordion/AAccordionGroup/types.ts +20 -20
  22. package/components/elements/accordion/AAccordionGroup/ui.config.ts +22 -22
  23. package/components/elements/accordion/types.ts +14 -14
  24. package/components/elements/accordion/ui.config.ts +22 -22
  25. package/components/elements/alert/AAlert.vue +52 -65
  26. package/components/elements/banner/ABanner.vue +49 -49
  27. package/components/elements/bg-block/ABgBlock.vue +11 -11
  28. package/components/elements/button/AButton.vue +191 -188
  29. package/components/elements/button/AButtonV2.vue +134 -112
  30. package/components/elements/button/types.ts +24 -24
  31. package/components/elements/button-login/index.vue +19 -18
  32. package/components/elements/calendar/ACalendar.vue +83 -83
  33. package/components/elements/carousel/ACarousel.vue +159 -159
  34. package/components/elements/carousel/config.ui.ts +15 -15
  35. package/components/elements/carousel/types.ts +18 -18
  36. package/components/elements/chip-wrapper/AChipWrapper.vue +81 -80
  37. package/components/elements/chip-wrapper/types.ts +12 -12
  38. package/components/elements/chips/AChips.vue +33 -32
  39. package/components/elements/companies/AOurClients.vue +47 -45
  40. package/components/elements/curve-block/ACurveBlock.vue +259 -292
  41. package/components/elements/curve-block-v2/ACurveBlockV2.vue +84 -0
  42. package/components/elements/digit-badge/ADigitBadge.vue +86 -83
  43. package/components/elements/empty-box/empty-box-V2.vue +92 -0
  44. package/components/elements/error-template/index.vue +116 -48
  45. package/components/elements/feature-description/AFeatureDescription.vue +112 -112
  46. package/components/elements/illustrations/noAccess.vue +71 -71
  47. package/components/elements/infinite-carousel/AInfiniteCarousel.vue +47 -57
  48. package/components/elements/infinite-scroll/AInfiniteScroll.vue +33 -33
  49. package/components/elements/leave-note/ALeaveNote.vue +102 -99
  50. package/components/elements/pagination/APagination.vue +110 -110
  51. package/components/elements/photos-animation/APhotosAnimation.vue +85 -85
  52. package/components/elements/segmented/ASegmentedV2.vue +154 -58
  53. package/components/elements/select/ASelect.vue +448 -447
  54. package/components/elements/select/ASelectMobile.vue +186 -186
  55. package/components/elements/select/ASelectV2.vue +580 -589
  56. package/components/elements/select/ui/select-button.vue +112 -112
  57. package/components/elements/select/ui/select-list.vue +99 -99
  58. package/components/elements/show-more/AShowMore.vue +35 -35
  59. package/components/elements/show-more/AShowMoreV2.vue +26 -26
  60. package/components/elements/skeleton/ASkeleton.vue +44 -44
  61. package/components/elements/slider/ASlider.vue +175 -0
  62. package/components/elements/slider/ASliderItem.vue +31 -0
  63. package/components/elements/slider/ASliderV2.vue +182 -0
  64. package/components/elements/slider/types.ts +21 -0
  65. package/components/elements/star-rating/AStarRating.vue +189 -189
  66. package/components/elements/star-rating/types.ts +7 -7
  67. package/components/elements/star-rating/ui/Star.vue +74 -74
  68. package/components/elements/status-badge/AStatusBadge.vue +125 -74
  69. package/components/elements/step-slider/AStepSliderColCard.vue +233 -0
  70. package/components/elements/step-slider/AStepSliderColNumber.vue +178 -0
  71. package/components/elements/table/ATable.vue +93 -93
  72. package/components/elements/table/table.config.ts +32 -32
  73. package/components/elements/tree-select/ATreeSelect.vue +157 -173
  74. package/components/elements/tree-select/TreeService.ts +184 -249
  75. package/components/elements/tree-select/components/ATreeSelectNode.vue +104 -0
  76. package/components/elements/tree-select/types.ts +63 -34
  77. package/components/elements/tree-select/utils.ts +30 -0
  78. package/components/elements/tree-select-mobile/ATreeSelectMobile.vue +79 -79
  79. package/components/elements/tree-select-mobile/components/ATreeSelectNodesMobile.vue +175 -175
  80. package/components/elements/tree-select-modal/ATreeSelectModal.vue +217 -0
  81. package/components/features/color-mode/AColorMode.client.vue +96 -96
  82. package/components/features/dropdown/ADropdown.vue +127 -127
  83. package/components/features/dropdown/ADropdownV2.vue +140 -141
  84. package/components/features/go-top/GoTop.vue +63 -63
  85. package/components/features/lang-switcher/lang-switcher.vue +158 -153
  86. package/components/features/payment/banner/BasicPlusLimitBanner.vue +84 -104
  87. package/components/features/payment/banner/PaymentBanner.vue +88 -108
  88. package/components/features/payment/banner/UpSellBanner.vue +105 -125
  89. package/components/features/payment/process/PaymentKaspiQrSidePanel.vue +180 -161
  90. package/components/features/payment/process/PaymentKaspiRedirectSidePanel.vue +123 -112
  91. package/components/features/payment/process/PaymentMethodSidePanel.vue +138 -121
  92. package/components/features/payment/process/PaymentProcess.vue +158 -158
  93. package/components/features/payment/process/PaymentTopUpSidePanel.vue +119 -133
  94. package/components/features/pk-mobile-services/APkMobileServices.vue +107 -136
  95. package/components/features//321/201hange-version/AChangeVersion.vue +20 -20
  96. package/components/forms/README.md +1 -1
  97. package/components/forms/checkbox/ACheckbox.vue +149 -149
  98. package/components/forms/checkbox/ACheckboxV2.vue +229 -229
  99. package/components/forms/feedback-form/FeedbackForm.vue +177 -177
  100. package/components/forms/feedback-form/FeedbackFormV2.vue +183 -0
  101. package/components/forms/input/AInputV2.vue +538 -542
  102. package/components/forms/input/button/AInputButton.vue +53 -53
  103. package/components/forms/input/date/AInputDate.vue +217 -213
  104. package/components/forms/input/password/AInputPassword.vue +59 -53
  105. package/components/forms/input/standard/AInputStandard.vue +424 -415
  106. package/components/forms/input/textarea/ATextarea.vue +207 -203
  107. package/components/forms/input/textarea/ATextareaV2.vue +248 -248
  108. package/components/forms/radio-button/ARadioButton.vue +95 -95
  109. package/components/forms/request-demo/ARequestDemo.vue +108 -108
  110. package/components/forms/toggle/AToggle.vue +157 -157
  111. package/components/forms/toggle/AToggleV2.vue +72 -71
  112. package/components/forms/toggle/types.ts +16 -16
  113. package/components/modals/AConfirmationEmail.vue +40 -40
  114. package/components/modals/AboutTariffModal.vue +115 -114
  115. package/components/modals/AnotherDeviceModal.vue +65 -59
  116. package/components/modals/ApplicationAcceptedModal.vue +45 -44
  117. package/components/modals/ConnectingTariffModal.vue +60 -60
  118. package/components/modals/ContactsMobileModel.vue +182 -182
  119. package/components/modals/ContentNavigationModal.vue +100 -355
  120. package/components/modals/Insufficient-funds-modal.vue +62 -62
  121. package/components/modals/LimitReachedModal.vue +44 -31
  122. package/components/modals/NoAccessModal.vue +39 -35
  123. package/components/modals/PaymentMethodModal.vue +101 -101
  124. package/components/modals/RedirectsBanksModal.vue +69 -69
  125. package/components/modals/ReplenishModal.vue +132 -132
  126. package/components/modals/ReportBugConfirmModal.vue +32 -32
  127. package/components/modals/ReportBugModal.vue +172 -170
  128. package/components/modals/Resend.vue +81 -81
  129. package/components/modals/SubmitApplicationModal.vue +126 -126
  130. package/components/modals/id/AuthModal.vue +72 -92
  131. package/components/modals/id/IdAutoLogoutModal.vue +44 -45
  132. package/components/modals/id/IdBanner.vue +41 -61
  133. package/components/modals/id/IdConfirmAccountOtpModal.vue +182 -181
  134. package/components/modals/id/IdConfirmSuccessfulModal.vue +41 -41
  135. package/components/modals/id/IdLoginModal.vue +336 -336
  136. package/components/modals/id/IdModals.vue +125 -127
  137. package/components/modals/id/IdNewPasswordModal.vue +129 -129
  138. package/components/modals/id/IdOtpInput.vue +156 -156
  139. package/components/modals/id/IdPasswordSuccessfulModal.vue +25 -25
  140. package/components/modals/id/IdRecoveryModal.vue +117 -117
  141. package/components/modals/id/IdRegistrationModal.vue +215 -215
  142. package/components/modals/id/IdResetPasswordOtpModal.vue +159 -158
  143. package/components/modals/id/IdTwoFactorModal.vue +126 -125
  144. package/components/navigation/README.md +1 -1
  145. package/components/navigation/bottom-navigation/ABottomNavigation.vue +106 -106
  146. package/components/navigation/breadcrumbs/ABreadcrumbs.vue +128 -67
  147. package/components/navigation/breadcrumbs/types.ts +8 -5
  148. package/components/navigation/footer/AFooter.vue +283 -284
  149. package/components/navigation/footer/ui/a-footer-accordion.vue +118 -118
  150. package/components/navigation/header/AHeader.vue +237 -243
  151. package/components/navigation/header/AlmatyContacts.vue +145 -145
  152. package/components/navigation/header/AstanaContacts.vue +67 -67
  153. package/components/navigation/header/CardGallery.vue +252 -251
  154. package/components/navigation/header/ContactMenu.vue +48 -48
  155. package/components/navigation/header/HeaderLink.vue +250 -254
  156. package/components/navigation/header/HeaderUsage.vue +139 -125
  157. package/components/navigation/header/ListItem.vue +32 -31
  158. package/components/navigation/header/NavCard.vue +42 -41
  159. package/components/navigation/header/NavList.vue +73 -72
  160. package/components/navigation/header/NotificationsMenu.vue +50 -51
  161. package/components/navigation/header/ProductMenu.vue +101 -100
  162. package/components/navigation/header/ProfileMenu.vue +168 -176
  163. package/components/navigation/header/SystemNotification.vue +108 -110
  164. package/components/navigation/header/types.ts +28 -28
  165. package/components/navigation/line-tabs/ALineTabs.vue +112 -111
  166. package/components/navigation/line-tabs/types.ts +21 -21
  167. package/components/navigation/mobile-navigation/AMobileNavigation.vue +112 -112
  168. package/components/navigation/pill-tabs/APillTabs.vue +179 -177
  169. package/components/navigation/pill-tabs/APillTabsV2.vue +226 -118
  170. package/components/navigation/pill-tabs/types.ts +24 -24
  171. package/components/navigation/side-navigation/ASideNavigation.vue +406 -406
  172. package/components/overlays/README.md +1 -1
  173. package/components/overlays/drawer/ADrawerV2.vue +335 -0
  174. package/components/overlays/modal/AModal.vue +335 -335
  175. package/components/overlays/modal/AModalV2.vue +400 -389
  176. package/components/overlays/side-panel/ASidePanel.vue +445 -439
  177. package/components/overlays/sideover/ASlideover.vue +351 -351
  178. package/components/overlays/tooltip/ATooltip.vue +238 -237
  179. package/components/overlays/tooltip/ATooltipV2.vue +226 -233
  180. package/components/overlays/tooltip/types.ts +26 -26
  181. package/components/overlays/tooltip/useTooltipTrigger.ts +101 -101
  182. package/components/transitions/ATransitionHeight.vue +67 -67
  183. package/components/utils/index.ts +19 -19
  184. package/components/utils/removeTrailingSlash.ts +7 -7
  185. package/composables/highlight.ts +19 -18
  186. package/composables/modalsState.ts +8 -8
  187. package/composables/projectState.ts +2 -2
  188. package/composables/useAccessTokenCookie.ts +25 -25
  189. package/composables/useActiveNavigation.ts +84 -84
  190. package/composables/useAdaptive.ts +46 -46
  191. package/composables/useBuyTariffs.ts +91 -91
  192. package/composables/useCarouselScroll.ts +49 -49
  193. package/composables/useChipOverflow.ts +92 -92
  194. package/composables/useHeaderNavigationLinks.ts +519 -507
  195. package/composables/useIdModals.ts +36 -36
  196. package/composables/usePayment.ts +78 -78
  197. package/composables/useUIValidation.ts +16 -16
  198. package/composables/useUrls.ts +23 -23
  199. package/eslint.config.mjs +58 -45
  200. package/i18n/i18n.config.ts +21 -21
  201. package/i18n.config.ts +21 -21
  202. package/icons/adata-logo.vue +17 -17
  203. package/icons/ai-assistant.vue +13 -13
  204. package/icons/akimat.vue +20 -20
  205. package/icons/archive.vue +16 -0
  206. package/icons/arrow/arrow-bottom-left-on-square.vue +5 -5
  207. package/icons/arrow/arrow-circle-down.vue +16 -16
  208. package/icons/arrow/arrow-circle-reset.vue +16 -16
  209. package/icons/arrow/arrow-corner.vue +9 -9
  210. package/icons/arrow/arrow-graph-down.vue +13 -13
  211. package/icons/arrow/arrow-graph-up.vue +14 -14
  212. package/icons/arrow/arrow-left-right.vue +8 -0
  213. package/icons/arrow/arrow-left.vue +14 -0
  214. package/icons/arrow/arrow-right.vue +14 -14
  215. package/icons/arrow/arrow-square-down.vue +15 -15
  216. package/icons/arrow/arrow-top-right-on-square.vue +6 -6
  217. package/icons/arrow/arrows-in.vue +11 -0
  218. package/icons/arrow/arrows-out.vue +11 -0
  219. package/icons/arrow/arrows-resize-in.vue +38 -0
  220. package/icons/arrow/arrows-resize-out.vue +17 -0
  221. package/icons/arrow-currency-gray.vue +5 -5
  222. package/icons/arrow-currency-green.vue +5 -5
  223. package/icons/arrow-currency-red.vue +5 -5
  224. package/icons/arrow-side-up.vue +6 -6
  225. package/icons/avatar.vue +12 -12
  226. package/icons/bank.vue +5 -5
  227. package/icons/bar-chart-3.vue +3 -0
  228. package/icons/bill.vue +3 -0
  229. package/icons/block.vue +16 -16
  230. package/icons/book-open.vue +3 -0
  231. package/icons/bookmark/bookmark-filled.vue +19 -18
  232. package/icons/bookmark/bookmark.vue +5 -5
  233. package/icons/bot.vue +52 -0
  234. package/icons/braces.vue +3 -0
  235. package/icons/briefcase.vue +14 -14
  236. package/icons/browsers/browser-duck.vue +65 -65
  237. package/icons/browsers/browser-google.vue +30 -30
  238. package/icons/browsers/browser-yandex.vue +13 -13
  239. package/icons/building-vector.vue +7 -7
  240. package/icons/building.vue +9 -0
  241. package/icons/calculator.vue +7 -7
  242. package/icons/calendar.vue +24 -24
  243. package/icons/car-side.vue +16 -16
  244. package/icons/car.vue +7 -7
  245. package/icons/cart.vue +15 -15
  246. package/icons/chart-bar.vue +5 -5
  247. package/icons/chart-no-axes-column.vue +3 -0
  248. package/icons/chart-pie.vue +16 -16
  249. package/icons/check/check-circle.vue +6 -6
  250. package/icons/check/check-outline.vue +3 -0
  251. package/icons/check/check-shield.vue +14 -14
  252. package/icons/check/check.vue +17 -17
  253. package/icons/check/checkmark-circle.vue +6 -6
  254. package/icons/check-sb.vue +7 -7
  255. package/icons/checkbox/checkbox-active.vue +17 -17
  256. package/icons/checkbox/checkbox-empty.vue +10 -10
  257. package/icons/checkbox/checkbox-intermediate.vue +7 -7
  258. package/icons/chevron/chevron-down-outline.vue +3 -0
  259. package/icons/chevron/chevron-down.vue +5 -5
  260. package/icons/chevron/chevron-left.vue +5 -5
  261. package/icons/chevron/chevron-right.vue +5 -5
  262. package/icons/chevron/chevron-up.vue +5 -5
  263. package/icons/chevron/double-chevron-right.vue +12 -12
  264. package/icons/clipboard-list.vue +3 -0
  265. package/icons/clipboard-text.vue +7 -7
  266. package/icons/clock-outline.vue +3 -0
  267. package/icons/clock-time.vue +24 -0
  268. package/icons/clock.vue +25 -25
  269. package/icons/close.vue +16 -16
  270. package/icons/cloud/cloud-upload.vue +3 -0
  271. package/icons/code.vue +9 -0
  272. package/icons/company/company-bazis.vue +21 -21
  273. package/icons/company/company-bereke.vue +25 -25
  274. package/icons/company/company-bigroup.vue +16 -16
  275. package/icons/company/company-erg.vue +17 -17
  276. package/icons/company/company-forte.vue +21 -21
  277. package/icons/company/company-halyk.vue +15 -15
  278. package/icons/company/company-jusan.vue +31 -31
  279. package/icons/company/company-kaspi.vue +14 -14
  280. package/icons/company/company-kazzinc.vue +22 -22
  281. package/icons/company/company-mycar.vue +13 -13
  282. package/icons/company/company-samruk.vue +21 -21
  283. package/icons/company-egov-small.vue +15 -15
  284. package/icons/company.vue +8 -8
  285. package/icons/compare-outlined.vue +8 -0
  286. package/icons/copy.vue +7 -7
  287. package/icons/currency/currency-dollar.vue +16 -16
  288. package/icons/currency/currency-down.vue +22 -22
  289. package/icons/currency/currency-eur.vue +57 -57
  290. package/icons/currency/currency-rub.vue +7 -7
  291. package/icons/currency/currency-tenge.vue +9 -9
  292. package/icons/currency/currency-usd.vue +221 -221
  293. package/icons/currency/currency-yuan.vue +25 -25
  294. package/icons/database.vue +3 -0
  295. package/icons/default-avatar.vue +20 -20
  296. package/icons/delete.vue +7 -7
  297. package/icons/document.vue +5 -5
  298. package/icons/dots-horizontal.vue +31 -0
  299. package/icons/download-line.vue +13 -0
  300. package/icons/download-outline.vue +3 -0
  301. package/icons/download-rounded.vue +15 -15
  302. package/icons/download.vue +11 -11
  303. package/icons/edit.vue +7 -7
  304. package/icons/education.vue +16 -16
  305. package/icons/egov-small.vue +7 -7
  306. package/icons/egov.vue +41 -0
  307. package/icons/elicense.vue +38 -0
  308. package/icons/excel-icon.vue +14 -14
  309. package/icons/expand-window.vue +7 -7
  310. package/icons/eye-closed.vue +26 -26
  311. package/icons/eye-open.vue +7 -7
  312. package/icons/eye-opened.vue +23 -23
  313. package/icons/favourite-bookmark-outline.vue +17 -0
  314. package/icons/file/file-check-corner.vue +3 -0
  315. package/icons/file/file-spreadsheet.vue +3 -0
  316. package/icons/file/file.vue +16 -16
  317. package/icons/file/files.vue +16 -16
  318. package/icons/file-json.vue +3 -0
  319. package/icons/file-pen.vue +31 -0
  320. package/icons/file-search.vue +3 -0
  321. package/icons/file-stack.vue +31 -0
  322. package/icons/file-text.vue +3 -0
  323. package/icons/file-types/excel.vue +131 -0
  324. package/icons/file-types/html.vue +13 -0
  325. package/icons/file-types/jpeg.vue +16 -0
  326. package/icons/file-types/pdf.vue +11 -0
  327. package/icons/file-types/png.vue +11 -0
  328. package/icons/file-types/rar.vue +11 -0
  329. package/icons/file-types/word.vue +50 -0
  330. package/icons/file-types/zip.vue +11 -0
  331. package/icons/filter.vue +5 -5
  332. package/icons/flag.vue +7 -7
  333. package/icons/flask-conical.vue +3 -0
  334. package/icons/folder-open.vue +3 -0
  335. package/icons/gauge.vue +17 -17
  336. package/icons/gift-outline.vue +3 -0
  337. package/icons/gift.vue +8 -8
  338. package/icons/git-compare.vue +38 -0
  339. package/icons/git-fork.vue +3 -0
  340. package/icons/globe-2.vue +3 -0
  341. package/icons/globe.vue +16 -16
  342. package/icons/google.vue +41 -41
  343. package/icons/gradiend-icons/files-gradient.vue +22 -22
  344. package/icons/gradiend-icons/hammer-gradient.vue +62 -62
  345. package/icons/graduation-cap.vue +31 -0
  346. package/icons/graph-loading.vue +34 -0
  347. package/icons/graph-pie.vue +14 -14
  348. package/icons/hand/hand-thumb-up-filled.vue +5 -5
  349. package/icons/hand/hand-thumb-up.vue +5 -5
  350. package/icons/hand-with-phone/hand-with-phone-dark.vue +52 -52
  351. package/icons/hand-with-phone/hand-with-phone-light.vue +52 -52
  352. package/icons/handshake.vue +5 -5
  353. package/icons/hcheck.vue +14 -14
  354. package/icons/hdocument.vue +7 -7
  355. package/icons/headset.vue +6 -0
  356. package/icons/help-question-circle.vue +26 -0
  357. package/icons/history.vue +5 -5
  358. package/icons/home.vue +14 -0
  359. package/icons/horizontal-more.vue +13 -13
  360. package/icons/hot-line.vue +6 -6
  361. package/icons/hummer.vue +16 -16
  362. package/icons/id.vue +7 -7
  363. package/icons/in-row-type.vue +46 -0
  364. package/icons/in-table-type.vue +29 -0
  365. package/icons/info/info-circle.vue +29 -29
  366. package/icons/invoice.vue +8 -7
  367. package/icons/judge.vue +14 -14
  368. package/icons/kaspi-qr.vue +13 -13
  369. package/icons/key-round.vue +3 -0
  370. package/icons/landmark.vue +3 -0
  371. package/icons/layers.vue +3 -0
  372. package/icons/letter/letter-a.vue +6 -0
  373. package/icons/letter/letter-b.vue +6 -0
  374. package/icons/letter/letter-c.vue +6 -0
  375. package/icons/letter/letter-d.vue +6 -0
  376. package/icons/letter/letter-e.vue +6 -0
  377. package/icons/link-chain.vue +28 -28
  378. package/icons/link-url.vue +3 -0
  379. package/icons/link.vue +7 -7
  380. package/icons/linkedin.vue +24 -24
  381. package/icons/list-tree.vue +3 -0
  382. package/icons/loader-circle.vue +27 -27
  383. package/icons/location.vue +8 -8
  384. package/icons/lock.vue +5 -5
  385. package/icons/logo.vue +15 -15
  386. package/icons/logout.vue +16 -16
  387. package/icons/magnify/magnifying-glass-minus.vue +8 -8
  388. package/icons/magnify/magnifying-glass-plus.vue +9 -9
  389. package/icons/magnify/magnifying-glass.vue +9 -9
  390. package/icons/mail-question-mark.vue +8 -0
  391. package/icons/mail.vue +7 -7
  392. package/icons/mailru.vue +34 -34
  393. package/icons/main-filter.vue +5 -5
  394. package/icons/map/map-pin-filled.vue +7 -7
  395. package/icons/map/map-pin-rect.vue +15 -15
  396. package/icons/map/map-pin.vue +7 -7
  397. package/icons/map-marker-start.vue +7 -7
  398. package/icons/map-paper.vue +5 -5
  399. package/icons/medal.vue +7 -7
  400. package/icons/menu-filled.vue +20 -20
  401. package/icons/menu.vue +8 -8
  402. package/icons/message/message-square.vue +3 -0
  403. package/icons/message/message.vue +12 -12
  404. package/icons/message-dotted.vue +30 -0
  405. package/icons/messages-square.vue +3 -0
  406. package/icons/minus/minus-circle.vue +10 -10
  407. package/icons/money.vue +5 -5
  408. package/icons/monitoring.vue +10 -10
  409. package/icons/moon.vue +8 -8
  410. package/icons/more.vue +29 -29
  411. package/icons/network.vue +3 -0
  412. package/icons/newspaper.vue +3 -0
  413. package/icons/note-pencil.vue +14 -14
  414. package/icons/note.vue +14 -14
  415. package/icons/notification-error.vue +17 -0
  416. package/icons/notification.vue +16 -16
  417. package/icons/paperclip.vue +7 -7
  418. package/icons/payment/payment-card.vue +6 -6
  419. package/icons/payment/payment-kaspi.vue +11 -11
  420. package/icons/person-vector.vue +7 -7
  421. package/icons/person-with-briefcase.vue +10 -10
  422. package/icons/person.vue +22 -0
  423. package/icons/phone-call.vue +6 -0
  424. package/icons/phone-filled.vue +5 -5
  425. package/icons/phone-reversed.vue +3 -0
  426. package/icons/phone.vue +7 -7
  427. package/icons/plus/plus-circle.vue +8 -8
  428. package/icons/plus/plus.vue +13 -13
  429. package/icons/profile.vue +5 -5
  430. package/icons/radio/radio-check.vue +8 -8
  431. package/icons/radio/radio-empty.vue +10 -10
  432. package/icons/receipt.vue +8 -8
  433. package/icons/robot-outline.vue +3 -0
  434. package/icons/robot.vue +14 -14
  435. package/icons/route.vue +7 -0
  436. package/icons/sanctions.vue +8 -8
  437. package/icons/scales/scale-outline.vue +3 -0
  438. package/icons/scales/scale.vue +16 -16
  439. package/icons/scales/scales.vue +5 -5
  440. package/icons/scales/standing-scales.vue +15 -15
  441. package/icons/scan-search.vue +3 -0
  442. package/icons/search-outline.vue +3 -0
  443. package/icons/search.vue +27 -27
  444. package/icons/send.vue +3 -0
  445. package/icons/settings.vue +26 -0
  446. package/icons/share/share-alt.vue +5 -5
  447. package/icons/share/share.vue +14 -14
  448. package/icons/shield-alert.vue +31 -0
  449. package/icons/shield-verified.vue +14 -14
  450. package/icons/ship.vue +8 -8
  451. package/icons/socials/face-book.vue +15 -15
  452. package/icons/socials/facebook-color.vue +16 -0
  453. package/icons/socials/globe-color.vue +16 -0
  454. package/icons/socials/instagram-color.vue +46 -0
  455. package/icons/socials/instagram.vue +19 -19
  456. package/icons/socials/linkedin-color.vue +14 -0
  457. package/icons/socials/telegram-color.vue +16 -0
  458. package/icons/socials/telegram.vue +15 -15
  459. package/icons/socials/tik-tok.vue +15 -15
  460. package/icons/socials/tiktok-color.vue +14 -0
  461. package/icons/socials/vk-color.vue +16 -0
  462. package/icons/socials/youtube-color.vue +16 -0
  463. package/icons/socials/youtube.vue +16 -16
  464. package/icons/sort/sort-asc.vue +15 -15
  465. package/icons/sort/sort-desc.vue +15 -15
  466. package/icons/sparkles.vue +3 -0
  467. package/icons/splitting-arrows.vue +8 -8
  468. package/icons/star/star-filled.vue +41 -40
  469. package/icons/star/star-half-filled.vue +21 -20
  470. package/icons/star/star.vue +25 -25
  471. package/icons/sun.vue +25 -24
  472. package/icons/sviazi.vue +5 -5
  473. package/icons/tag.vue +30 -30
  474. package/icons/tasks.vue +10 -10
  475. package/icons/tender-search.vue +11 -11
  476. package/icons/terminal.vue +3 -0
  477. package/icons/toasts/check-circle-toast.vue +6 -6
  478. package/icons/toasts/warning-triangle-toast.vue +8 -7
  479. package/icons/trash.vue +13 -13
  480. package/icons/triangle-alert.vue +3 -0
  481. package/icons/triangle.vue +10 -10
  482. package/icons/truck.vue +7 -7
  483. package/icons/user-square.vue +14 -14
  484. package/icons/user.vue +22 -22
  485. package/icons/users-focus.vue +8 -8
  486. package/icons/users-outline.vue +3 -0
  487. package/icons/users-round.vue +3 -0
  488. package/icons/users-three.vue +7 -7
  489. package/icons/users.vue +8 -8
  490. package/icons/view-eye-open.vue +13 -0
  491. package/icons/warning/warning-circle.vue +29 -29
  492. package/icons/warning/warning-triangle-filled.vue +12 -12
  493. package/icons/warning/warning-triangle.vue +28 -28
  494. package/icons/webhook.vue +3 -0
  495. package/icons/whatsapp.vue +8 -8
  496. package/icons/work-bag.vue +11 -11
  497. package/icons/work-case.vue +9 -9
  498. package/icons/work-search.vue +10 -10
  499. package/icons/work.vue +5 -5
  500. package/icons/workflow.vue +3 -0
  501. package/icons/x-mark.vue +15 -15
  502. package/icons/x-outline.vue +3 -0
  503. package/icons/yandex.vue +29 -28
  504. package/icons/zap.vue +3 -0
  505. package/illustrations/address-location.vue +38 -38
  506. package/illustrations/award-badge.vue +105 -0
  507. package/illustrations/ball-with-chain.vue +120 -120
  508. package/illustrations/bill.vue +133 -133
  509. package/illustrations/buildings.vue +82 -82
  510. package/illustrations/calendar.vue +156 -156
  511. package/illustrations/chains.vue +152 -152
  512. package/illustrations/coin-percent.vue +126 -126
  513. package/illustrations/coins-stack.vue +202 -202
  514. package/illustrations/delete-dark.vue +32 -31
  515. package/illustrations/delete.vue +33 -32
  516. package/illustrations/doc-with-stamp.vue +126 -126
  517. package/illustrations/document.vue +64 -64
  518. package/illustrations/door.vue +85 -74
  519. package/illustrations/empty-badge-check.vue +20 -0
  520. package/illustrations/empty-ban.vue +18 -0
  521. package/illustrations/empty-box.vue +77 -77
  522. package/illustrations/empty-filter.vue +20 -0
  523. package/illustrations/empty-inbox.vue +19 -0
  524. package/illustrations/empty-scale.vue +22 -0
  525. package/illustrations/empty-search-x.vue +21 -0
  526. package/illustrations/empty-shopping-cart.vue +21 -0
  527. package/illustrations/empty-users-round.vue +20 -0
  528. package/illustrations/empty-wallet.vue +127 -161
  529. package/illustrations/graph-in-coin.vue +119 -119
  530. package/illustrations/hammer.vue +156 -156
  531. package/illustrations/hand-cash.vue +108 -108
  532. package/illustrations/info.vue +52 -39
  533. package/illustrations/mail-active.vue +86 -0
  534. package/illustrations/mail.vue +68 -68
  535. package/illustrations/no-access.vue +92 -0
  536. package/illustrations/ok.vue +90 -62
  537. package/illustrations/people-group.vue +237 -237
  538. package/illustrations/person-with-phone.vue +187 -187
  539. package/illustrations/person.vue +159 -159
  540. package/illustrations/phone-check.vue +110 -90
  541. package/illustrations/phone-payment-method.vue +223 -223
  542. package/illustrations/search.vue +14 -14
  543. package/illustrations/shield-user.vue +94 -0
  544. package/illustrations/stop-hand.vue +84 -77
  545. package/illustrations/stop-sign.vue +34 -34
  546. package/illustrations/suit.vue +97 -111
  547. package/illustrations/suitcase.vue +105 -105
  548. package/illustrations/terminal.vue +100 -234
  549. package/illustrations/trash-can.vue +66 -108
  550. package/illustrations/turn-on-tariff.vue +38 -38
  551. package/illustrations/two-persons.vue +169 -169
  552. package/lang/en.ts +877 -873
  553. package/lang/kk.ts +879 -875
  554. package/lang/ru.ts +879 -876
  555. package/layouts/default.vue +13 -13
  556. package/nuxt.config.ts +92 -88
  557. package/package.json +64 -69
  558. package/plugins/maska.ts +4 -4
  559. package/plugins/toast.client.ts +41 -58
  560. package/public/kaspi/logo.svg +4 -4
  561. package/shared/constans/pages.ts +96 -96
  562. package/tsconfig.json +6 -6
  563. package/utils/getMaxZindex.ts +25 -25
  564. package/utils/localizedNavigation.ts +36 -36
  565. package/utils/twMerge.ts +34 -0
  566. package/vitest.config.ts +14 -14
  567. package/assets/styles/index.scss +0 -104
  568. package/assets/styles/modules/_base.scss +0 -5
  569. package/assets/styles/modules/_typography.scss +0 -152
  570. package/components/elements/error-template/types.ts +0 -23
  571. package/components/elements/status-badge-v2/StatusBadgeV2.vue +0 -78
  572. package/components/elements/tree-select/components/tree-select-nodes.vue +0 -91
  573. package/illustrations/terminal-dark.vue +0 -48
  574. package/tailwind.config.ts +0 -163
  575. package/tests/AButton.test.ts +0 -81
@@ -1,74 +1,125 @@
1
- <script lang="ts" setup>
2
- import {twMerge} from "tailwind-merge";
3
-
4
- defineOptions({ name: 'AStatusBadge' })
5
-
6
- interface Props {
7
- type?: 'primary' | 'success' | 'danger' | 'gray' | 'orange' | 'warning'
8
- view?: 'default' | 'inverted' | 'transparent'
9
- size?: 'xs' | 'sm' | 'lg'
10
- customClasses?: string
11
- }
12
-
13
- const props = withDefaults(defineProps<Props>(), {
14
- type: 'primary',
15
- view: 'default',
16
- size: 'lg',
17
- customClasses: ''
18
- })
19
-
20
- const classes = computed(() =>
21
- [
22
- 'text-sm rounded-md select-none inline-flex gap-[5.5px] justify-center items-center',
23
- typeSwitchValues[props.view][props.type],
24
- props.size === 'xs'? 'px-4 py-[2px] text-xs font-bold' : '',
25
- props.size === 'sm'? 'text-xs font-semibold px-4 py-[2px] h-6' : '',
26
- props.size === 'lg'? 'px-4 py-[7.5px] font-semibold' : '',
27
- ])
28
-
29
-
30
- const typeSwitchValues: ViewType = {
31
- default: {
32
- primary: 'bg-blue-700 text-white dark:text-gray-900 dark:bg-blue-500',
33
- success: 'bg-green-500 text-white dark:text-gray-200 dark:bg-green-400',
34
- danger: 'bg-red-500 text-white dark:text-gray-200 ',
35
- warning: 'bg-yellow-400 text-white dark:text-gray-200 ',
36
- gray: 'bg-deepblue-900 text-white dark:text-gray-200 dark:bg-gray-200/10',
37
- orange: 'bg-orange-600 text-white dark:text-gray-200'
38
- },
39
- inverted: {
40
- primary: 'bg-blue-700/10 text-blue-700 dark:text-blue-500 dark:bg-[#1EABFF1A]',
41
- success: 'bg-green-500/20 text-green-500 dark:text-green-400 dark:bg-green-400/20',
42
- danger: 'bg-red-500/10 text-red-500 dark:text-red-400 dark:bg-red-400/10',
43
- warning: 'bg-yellow-400/10 text-yellow-400',
44
- gray: 'bg-deepblue-900/10 text-gray-600 dark:text-gray-200 dark:bg-gray-200/10',
45
- orange: 'bg-orange-600/10 text-orange-600'
46
- },
47
- transparent: {
48
- success: 'bg-green-500/10 text-green-500 dark:bg-green-400/10 dark:text-green-400',
49
- danger: 'bg-red-500/10 text-red-500 dark:bg-red-400/10 dark:text-red-400'
50
- }
51
- }
52
-
53
-
54
-
55
-
56
- type StateType = {
57
- [key in 'primary' | 'success' | 'danger' | 'gray' | 'orange' | 'warning']?: string
58
- }
59
-
60
- type ViewType = {
61
- default: StateType
62
- inverted: StateType
63
- transparent: StateType
64
- };
65
-
66
-
67
-
68
- </script>
69
- <template>
70
- <div :class="[[classes], customClasses]">
71
- <slot name="point"/>
72
- <slot />
73
- </div>
74
- </template>
1
+ <script lang="ts" setup>
2
+ type BadgeType = 'primary' | 'success' | 'danger' | 'gray' | 'warning'
3
+ type BadgeView = 'default' | 'inverted' | 'transparent' | 'subtle'
4
+ type BadgeSize = 'xs' | 'sm' | 'md' | 'lg'
5
+
6
+ type StateType = {
7
+ [key in BadgeType]?: string
8
+ }
9
+
10
+ interface ViewType {
11
+ default: StateType
12
+ inverted: StateType
13
+ transparent: StateType
14
+ subtle: StateType
15
+ }
16
+
17
+ interface Props {
18
+ type?: BadgeType
19
+ view?: BadgeView
20
+ size?: BadgeSize
21
+ point?: boolean
22
+ customClasses?: string
23
+ }
24
+
25
+ defineOptions({ name: 'AStatusBadge' })
26
+
27
+ const props = withDefaults(defineProps<Props>(), {
28
+ type: 'primary',
29
+ view: 'default',
30
+ size: 'lg',
31
+ point: false,
32
+ customClasses: '',
33
+ })
34
+
35
+ const typeSwitchValues: ViewType = {
36
+ default: {
37
+ primary: 'bg-brand text-white border-transparent',
38
+ success: 'bg-success text-white border-transparent',
39
+ danger: 'bg-danger text-white border-transparent',
40
+ warning: 'bg-warning text-white border-transparent',
41
+ /* solid-серый бейдж: токена нет, константный примитив */
42
+ gray: 'bg-gray-600 text-white border-transparent',
43
+ },
44
+ inverted: {
45
+ primary: 'bg-brand-subtle text-brand border-transparent',
46
+ success: 'bg-success-subtle text-success border-transparent',
47
+ danger: 'bg-danger-subtle text-danger border-transparent',
48
+ warning: 'bg-warning-subtle text-warning border-transparent',
49
+ gray: 'bg-muted text-quaternary border-transparent',
50
+ },
51
+ /* бордеры: для brand/green/yellow пастельных токенов нет — примитивы осознанно */
52
+ transparent: {
53
+ primary: 'bg-main border-brand-200 text-brand dark:bg-transparent',
54
+ success: 'bg-main border-green-300 text-success dark:bg-transparent',
55
+ danger: 'bg-main border-red text-danger dark:bg-transparent',
56
+ warning: 'bg-main border-yellow-300 text-warning dark:bg-transparent',
57
+ gray: 'bg-main border-strong text-quaternary dark:bg-transparent',
58
+ },
59
+ /* тинты и пастельные бордеры subtle-вью: токенов нет — примитивы + dark:-пары осознанно */
60
+ subtle: {
61
+ primary: 'bg-brand-500/5 border-brand-200 text-brand dark:bg-brand-500/10 dark:border-brand-500/40',
62
+ success: 'bg-green-600/5 border-green-300 text-success dark:bg-green-500/10 dark:border-green-600/40',
63
+ danger: 'bg-red-600/5 border-red text-danger dark:bg-red-500/10 dark:border-red-600/40',
64
+ warning: 'bg-amber-600/5 border-yellow-300 text-warning dark:bg-yellow-500/10 dark:border-amber-600/40',
65
+ gray: 'bg-gray-600/5 border-strong text-quaternary dark:bg-gray-500/10 dark:border-gray-600/40',
66
+ },
67
+ }
68
+
69
+ const pointSwitchValues: ViewType = {
70
+ default: {
71
+ /* белая точка на цветной плашке — осознанно константный white */
72
+ primary: 'bg-white',
73
+ success: 'bg-white',
74
+ danger: 'bg-white',
75
+ warning: 'bg-white',
76
+ gray: 'bg-white',
77
+ },
78
+ inverted: {
79
+ primary: 'bg-brand',
80
+ success: 'bg-success',
81
+ danger: 'bg-danger',
82
+ warning: 'bg-warning',
83
+ gray: 'bg-icon-default',
84
+ },
85
+ transparent: {
86
+ primary: 'bg-brand',
87
+ success: 'bg-success',
88
+ danger: 'bg-danger',
89
+ warning: 'bg-warning',
90
+ gray: 'bg-icon-default',
91
+ },
92
+ subtle: {
93
+ primary: 'bg-brand',
94
+ success: 'bg-success',
95
+ danger: 'bg-danger',
96
+ warning: 'bg-warning',
97
+ gray: 'bg-icon-default',
98
+ },
99
+ }
100
+
101
+ const classes = computed(() =>
102
+ [
103
+ 'text-body-md rounded-2xl select-none inline-flex gap-[5.5px] justify-center items-center border',
104
+ typeSwitchValues[props.view][props.type],
105
+ props.size === 'xs' ? 'px-2 py-[2px] text-body-sm font-bold' : '',
106
+ props.size === 'sm' ? 'px-[10px] py-1 text-body-sm font-semibold h-6' : '',
107
+ props.size === 'md' ? 'px-3 py-[6px] text-body-sm font-semibold h-7' : '',
108
+ props.size === 'lg' ? 'px-4 py-[6px] font-semibold' : '',
109
+ ])
110
+
111
+ const pointClasses = computed(() =>
112
+ [
113
+ 'w-1.5 h-1.5 rounded-full shrink-0',
114
+ pointSwitchValues[props.view][props.type],
115
+ ])
116
+ </script>
117
+
118
+ <template>
119
+ <div :class="[[classes], customClasses]">
120
+ <slot name="point">
121
+ <span v-if="point" :class="pointClasses" />
122
+ </slot>
123
+ <slot />
124
+ </div>
125
+ </template>
@@ -0,0 +1,233 @@
1
+ <script setup lang="ts">
2
+ import type { Component } from 'vue'
3
+
4
+ interface Step {
5
+ title: string
6
+ description: string
7
+ icon?: Component
8
+ iconBg?: string
9
+ iconColor?: string
10
+ chips?: string[]
11
+ }
12
+
13
+ const props = withDefaults(defineProps<{
14
+ steps: Step[]
15
+ interval?: number
16
+ autoplay?: boolean
17
+ pauseOnHover?: boolean
18
+ modelValue?: number
19
+ colsClass?: string
20
+ expandable?: boolean
21
+ }>(), {
22
+ interval: 5000,
23
+ autoplay: true,
24
+ pauseOnHover: true,
25
+ modelValue: undefined,
26
+ colsClass: 'lg:grid-cols-2',
27
+ expandable: true,
28
+ })
29
+
30
+ const emit = defineEmits<{
31
+ (e: 'update:modelValue', value: number): void
32
+ (e: 'change', value: number): void
33
+ }>()
34
+
35
+ const TICK = 50
36
+
37
+ const internal = ref(props.modelValue ?? 0)
38
+
39
+ const active = computed<number>({
40
+ get: () => props.modelValue ?? internal.value,
41
+ set: (value) => {
42
+ internal.value = value
43
+ emit('update:modelValue', value)
44
+ emit('change', value)
45
+ },
46
+ })
47
+
48
+ const elapsed = ref(0)
49
+ let ticker: ReturnType<typeof setInterval> | null = null
50
+ let lastTs = 0
51
+
52
+ const progress = computed(() => {
53
+ if (!props.autoplay || props.steps.length <= 1)
54
+ return 1
55
+ return Math.min(1, elapsed.value / props.interval)
56
+ })
57
+
58
+ const fillWidth = computed(() => `${progress.value * 100}%`)
59
+
60
+ function stopTicker() {
61
+ if (ticker) {
62
+ clearInterval(ticker)
63
+ ticker = null
64
+ }
65
+ lastTs = 0
66
+ }
67
+
68
+ function startTicker() {
69
+ stopTicker()
70
+ if (!props.autoplay || props.steps.length <= 1)
71
+ return
72
+ ticker = setInterval(() => {
73
+ const now = Date.now()
74
+ const dt = lastTs ? now - lastTs : TICK
75
+ lastTs = now
76
+ elapsed.value += dt
77
+ if (elapsed.value >= props.interval) {
78
+ elapsed.value = 0
79
+ active.value = (active.value + 1) % props.steps.length
80
+ }
81
+ }, TICK)
82
+ }
83
+
84
+ function goTo(index: number) {
85
+ active.value = index
86
+ elapsed.value = 0
87
+ startTicker()
88
+ }
89
+
90
+ function onMouseEnter() {
91
+ if (props.pauseOnHover)
92
+ stopTicker()
93
+ }
94
+
95
+ function onMouseLeave() {
96
+ if (props.pauseOnHover)
97
+ startTicker()
98
+ }
99
+
100
+ onMounted(startTicker)
101
+ onBeforeUnmount(stopTicker)
102
+ watch(() => [props.interval, props.autoplay, props.steps.length], () => {
103
+ elapsed.value = 0
104
+ startTicker()
105
+ })
106
+ </script>
107
+
108
+ <template>
109
+ <div
110
+ class="grid grid-cols-1 gap-4 lg:gap-10"
111
+ :class="colsClass"
112
+ >
113
+ <ol class="flex flex-col gap-3">
114
+ <li
115
+ v-for="(step, i) in steps"
116
+ :key="i"
117
+ class="ss-card group relative cursor-pointer overflow-hidden rounded-2xl border bg-main transition-all duration-300"
118
+ :class="i === active
119
+ ? 'ss-card-active border-brand-200 dark:border-brand-500/40'
120
+ : 'border-default hover:border-brand-100 dark:hover:border-brand-500/25'"
121
+ @click="goTo(i)"
122
+ >
123
+ <div class="p-4">
124
+ <div
125
+ class="flex gap-4"
126
+ :class="expandable ? 'items-center' : 'items-start'"
127
+ >
128
+ <span
129
+ class="flex size-11 shrink-0 items-center justify-center rounded-xl"
130
+ :class="step.iconBg || 'bg-brand-subtle'"
131
+ >
132
+ <component
133
+ :is="step.icon"
134
+ v-if="step.icon"
135
+ class="size-5"
136
+ :class="step.iconColor || 'text-brand'"
137
+ />
138
+ </span>
139
+ <div class="min-w-0 flex-1">
140
+ <p class="text-body-md-strong md:text-body-lg-strong text-primary">
141
+ {{ step.title }}
142
+ </p>
143
+
144
+ <div v-if="!expandable">
145
+ <p class="mt-1 text-body-sm text-secondary">
146
+ {{ step.description }}
147
+ </p>
148
+ <div
149
+ v-if="step.chips?.length"
150
+ class="mt-3 flex flex-wrap gap-2"
151
+ >
152
+ <a-status-badge
153
+ v-for="(chip, ci) in step.chips"
154
+ :key="ci"
155
+ type="primary"
156
+ view="inverted"
157
+ size="xs"
158
+ custom-classes="!text-body-sm-medium"
159
+ >
160
+ {{ chip }}
161
+ </a-status-badge>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </div>
166
+
167
+ <div
168
+ v-if="expandable"
169
+ class="grid transition-all duration-500 ease-out"
170
+ :class="i === active
171
+ ? 'mt-3 grid-rows-[1fr] opacity-100'
172
+ : 'grid-rows-[0fr] opacity-0'"
173
+ >
174
+ <div class="overflow-hidden">
175
+ <p class="text-body-sm text-secondary">
176
+ {{ step.description }}
177
+ </p>
178
+ <div
179
+ v-if="step.chips?.length"
180
+ class="mt-3 flex flex-wrap gap-2"
181
+ >
182
+ <a-status-badge
183
+ v-for="(chip, ci) in step.chips"
184
+ :key="ci"
185
+ type="primary"
186
+ view="inverted"
187
+ size="xs"
188
+ custom-classes="!text-body-sm-medium"
189
+ >
190
+ {{ chip }}
191
+ </a-status-badge>
192
+ </div>
193
+ </div>
194
+ </div>
195
+ </div>
196
+
197
+ <span
198
+ v-if="i === active && autoplay && steps.length > 1"
199
+ class="absolute inset-x-0 bottom-0 h-1 bg-muted"
200
+ >
201
+ <!-- осознанно константный: фирменный бренд-градиент прогресса, одинаков в темах -->
202
+ <span
203
+ class="block h-full rounded-r-full bg-linear-to-r from-brand-500 to-brand-400 transition-[width] duration-100 ease-linear"
204
+ :style="{ width: fillWidth }"
205
+ />
206
+ </span>
207
+ </li>
208
+ </ol>
209
+
210
+ <div
211
+ @mouseenter="onMouseEnter"
212
+ @mouseleave="onMouseLeave"
213
+ >
214
+ <div class="flex justify-center">
215
+ <slot
216
+ name="panel"
217
+ :active="active"
218
+ :step="steps[active]"
219
+ :progress="progress"
220
+ :count="steps.length"
221
+ :fill-width="fillWidth"
222
+ :go-to="goTo"
223
+ />
224
+ </div>
225
+ </div>
226
+ </div>
227
+ </template>
228
+
229
+ <style scoped>
230
+ .ss-card-active {
231
+ box-shadow: 0 22px 60px -18px color-mix(in srgb, var(--color-brand-500) 22%, transparent);
232
+ }
233
+ </style>
@@ -0,0 +1,178 @@
1
+ <script setup lang="ts">
2
+ interface Step {
3
+ title: string
4
+ description: string
5
+ }
6
+
7
+ const props = withDefaults(defineProps<{
8
+ steps: Step[]
9
+ interval?: number
10
+ autoplay?: boolean
11
+ pauseOnHover?: boolean
12
+ modelValue?: number
13
+ colsClass?: string
14
+ }>(), {
15
+ interval: 5000,
16
+ autoplay: true,
17
+ pauseOnHover: true,
18
+ modelValue: undefined,
19
+ colsClass: 'lg:grid-cols-2',
20
+ })
21
+
22
+ const emit = defineEmits<{
23
+ (e: 'update:modelValue', value: number): void
24
+ (e: 'change', value: number): void
25
+ }>()
26
+
27
+ const TICK = 50
28
+
29
+ const internal = ref(props.modelValue ?? 0)
30
+
31
+ const active = computed<number>({
32
+ get: () => props.modelValue ?? internal.value,
33
+ set: (value) => {
34
+ internal.value = value
35
+ emit('update:modelValue', value)
36
+ emit('change', value)
37
+ },
38
+ })
39
+
40
+ const elapsed = ref(0)
41
+ let ticker: ReturnType<typeof setInterval> | null = null
42
+ let lastTs = 0
43
+
44
+ const progress = computed(() => {
45
+ if (!props.autoplay || props.steps.length <= 1)
46
+ return 1
47
+ return Math.min(1, elapsed.value / props.interval)
48
+ })
49
+
50
+ const fillWidth = computed(() => `${progress.value * 100}%`)
51
+
52
+ function stopTicker() {
53
+ if (ticker) {
54
+ clearInterval(ticker)
55
+ ticker = null
56
+ }
57
+ lastTs = 0
58
+ }
59
+
60
+ function startTicker() {
61
+ stopTicker()
62
+ if (!props.autoplay || props.steps.length <= 1)
63
+ return
64
+ ticker = setInterval(() => {
65
+ const now = Date.now()
66
+ const dt = lastTs ? now - lastTs : TICK
67
+ lastTs = now
68
+ elapsed.value += dt
69
+ if (elapsed.value >= props.interval) {
70
+ elapsed.value = 0
71
+ active.value = (active.value + 1) % props.steps.length
72
+ }
73
+ }, TICK)
74
+ }
75
+
76
+ function goTo(index: number) {
77
+ active.value = index
78
+ elapsed.value = 0
79
+ startTicker()
80
+ }
81
+
82
+ function onMouseEnter() {
83
+ if (props.pauseOnHover)
84
+ stopTicker()
85
+ }
86
+
87
+ function onMouseLeave() {
88
+ if (props.pauseOnHover)
89
+ startTicker()
90
+ }
91
+
92
+ onMounted(startTicker)
93
+ onBeforeUnmount(stopTicker)
94
+ watch(() => [props.interval, props.autoplay, props.steps.length], () => {
95
+ elapsed.value = 0
96
+ startTicker()
97
+ })
98
+ </script>
99
+
100
+ <template>
101
+ <div
102
+ class="grid grid-cols-1 items-center gap-4 lg:gap-16"
103
+ :class="colsClass"
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
+ >
112
+ <span
113
+ v-if="i === active"
114
+ class="ss-card-glow absolute inset-0 z-[1] rounded-2xl bg-main"
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-brand' : 'bg-badge'"
120
+ />
121
+ <span class="relative z-10 flex w-9 shrink-0 justify-center">
122
+ <span
123
+ class="text-body-md flex items-center justify-center rounded-full font-bold transition-all duration-300"
124
+ :class="i === active
125
+ ? 'ss-num-glow size-9 bg-brand text-action-primary-fg'
126
+ : i < active
127
+ ? 'size-[34px] bg-brand-subtle text-brand group-hover:bg-blue-subtle'
128
+ : 'size-[34px] bg-muted text-disabled group-hover:bg-badge'"
129
+ >
130
+ {{ i + 1 }}
131
+ </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-primary'
138
+ : i < active
139
+ ? 'text-quaternary'
140
+ : 'text-disabled'"
141
+ >
142
+ {{ step.title }}
143
+ </p>
144
+ <p class="text-body-md text-secondary">
145
+ {{ step.description }}
146
+ </p>
147
+ </div>
148
+ </li>
149
+ </ol>
150
+
151
+ <div
152
+ @mouseenter="onMouseEnter"
153
+ @mouseleave="onMouseLeave"
154
+ >
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>
166
+ </div>
167
+ </div>
168
+ </template>
169
+
170
+ <style scoped>
171
+ .ss-num-glow {
172
+ box-shadow: 0 4px 12px color-mix(in srgb, var(--color-brand-500) 45%, transparent);
173
+ }
174
+
175
+ .ss-card-glow {
176
+ box-shadow: 0 22px 60px -18px color-mix(in srgb, var(--color-brand-500) 32%, transparent);
177
+ }
178
+ </style>