adata-ui 2.1.41-beta.0 → 2.1.41-beta.2

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