adata-ui 2.1.40-beta.17 → 2.1.40-beta.19

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 (527) 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 +3 -3
  9. package/README.md +75 -75
  10. package/app.config.ts +28 -28
  11. package/app.vue +8 -8
  12. package/assets/styles/index.scss +166 -166
  13. package/assets/styles/modules/_base.scss +5 -5
  14. package/assets/styles/modules/_typography.scss +152 -152
  15. package/components/elements/README.md +1 -1
  16. package/components/elements/a-select-row/ASelectRowV2.vue +214 -214
  17. package/components/elements/a-select-row/index.vue +138 -138
  18. package/components/elements/accordion/AAccordion.vue +199 -199
  19. package/components/elements/accordion/AAccordionGroup/AAccordionGroup.vue +145 -145
  20. package/components/elements/accordion/AAccordionGroup/types.ts +20 -20
  21. package/components/elements/accordion/AAccordionGroup/ui.config.ts +22 -22
  22. package/components/elements/accordion/types.ts +14 -14
  23. package/components/elements/accordion/ui.config.ts +22 -22
  24. package/components/elements/alert/AAlert.vue +52 -52
  25. package/components/elements/banner/ABanner.vue +49 -49
  26. package/components/elements/bg-block/ABgBlock.vue +11 -11
  27. package/components/elements/button/AButton.vue +188 -188
  28. package/components/elements/button/AButtonV2.vue +133 -114
  29. package/components/elements/button/types.ts +24 -24
  30. package/components/elements/button-login/index.vue +18 -18
  31. package/components/elements/calendar/ACalendar.vue +83 -83
  32. package/components/elements/carousel/ACarousel.vue +159 -159
  33. package/components/elements/carousel/config.ui.ts +15 -15
  34. package/components/elements/carousel/types.ts +18 -18
  35. package/components/elements/chip-wrapper/AChipWrapper.vue +80 -80
  36. package/components/elements/chip-wrapper/types.ts +12 -12
  37. package/components/elements/chips/AChips.vue +32 -32
  38. package/components/elements/companies/AOurClients.vue +47 -45
  39. package/components/elements/curve-block/ACurveBlock.vue +292 -292
  40. package/components/elements/curve-block-v2/ACurveBlockV2.vue +85 -0
  41. package/components/elements/digit-badge/ADigitBadge.vue +85 -85
  42. package/components/elements/error-template/index.vue +48 -48
  43. package/components/elements/error-template/types.ts +23 -23
  44. package/components/elements/feature-description/AFeatureDescription.vue +112 -112
  45. package/components/elements/illustrations/noAccess.vue +71 -71
  46. package/components/elements/infinite-carousel/AInfiniteCarousel.vue +57 -57
  47. package/components/elements/infinite-scroll/AInfiniteScroll.vue +33 -33
  48. package/components/elements/leave-note/ALeaveNote.vue +99 -99
  49. package/components/elements/pagination/APagination.vue +110 -110
  50. package/components/elements/photos-animation/APhotosAnimation.vue +85 -85
  51. package/components/elements/segmented/ASegmentedV2.vue +151 -151
  52. package/components/elements/select/ASelect.vue +447 -447
  53. package/components/elements/select/ASelectMobile.vue +186 -186
  54. package/components/elements/select/ASelectV2.vue +588 -588
  55. package/components/elements/select/ui/select-button.vue +112 -112
  56. package/components/elements/select/ui/select-list.vue +99 -99
  57. package/components/elements/show-more/AShowMore.vue +35 -35
  58. package/components/elements/show-more/AShowMoreV2.vue +26 -26
  59. package/components/elements/skeleton/ASkeleton.vue +44 -44
  60. package/components/elements/slider/ASlider.vue +174 -0
  61. package/components/elements/slider/ASliderItem.vue +31 -0
  62. package/components/elements/slider/types.ts +21 -0
  63. package/components/elements/star-rating/AStarRating.vue +189 -189
  64. package/components/elements/star-rating/types.ts +7 -7
  65. package/components/elements/star-rating/ui/Star.vue +74 -74
  66. package/components/elements/status-badge/AStatusBadge.vue +121 -105
  67. package/components/elements/step-slider/AStepSliderColCard.vue +232 -0
  68. package/components/elements/step-slider/AStepSliderColNumber.vue +178 -0
  69. package/components/elements/table/ATable.vue +93 -93
  70. package/components/elements/table/table.config.ts +32 -32
  71. package/components/elements/tree-select/ATreeSelect.vue +157 -157
  72. package/components/elements/tree-select/TreeService.ts +184 -184
  73. package/components/elements/tree-select/components/ATreeSelectNode.vue +104 -104
  74. package/components/elements/tree-select/types.ts +63 -63
  75. package/components/elements/tree-select/utils.ts +30 -30
  76. package/components/elements/tree-select-mobile/ATreeSelectMobile.vue +79 -79
  77. package/components/elements/tree-select-mobile/components/ATreeSelectNodesMobile.vue +175 -175
  78. package/components/elements/tree-select-modal/ATreeSelectModal.vue +217 -217
  79. package/components/features/color-mode/AColorMode.client.vue +96 -96
  80. package/components/features/dropdown/ADropdown.vue +127 -127
  81. package/components/features/dropdown/ADropdownV2.vue +140 -140
  82. package/components/features/go-top/GoTop.vue +63 -63
  83. package/components/features/lang-switcher/lang-switcher.vue +158 -158
  84. package/components/features/payment/banner/BasicPlusLimitBanner.vue +104 -104
  85. package/components/features/payment/banner/PaymentBanner.vue +108 -108
  86. package/components/features/payment/banner/UpSellBanner.vue +125 -125
  87. package/components/features/payment/process/PaymentKaspiQrSidePanel.vue +179 -179
  88. package/components/features/payment/process/PaymentKaspiRedirectSidePanel.vue +123 -123
  89. package/components/features/payment/process/PaymentMethodSidePanel.vue +138 -138
  90. package/components/features/payment/process/PaymentProcess.vue +158 -158
  91. package/components/features/payment/process/PaymentTopUpSidePanel.vue +119 -119
  92. package/components/features/pk-mobile-services/APkMobileServices.vue +136 -136
  93. package/components/features//321/201hange-version/AChangeVersion.vue +20 -20
  94. package/components/forms/README.md +1 -1
  95. package/components/forms/checkbox/ACheckbox.vue +149 -149
  96. package/components/forms/checkbox/ACheckboxV2.vue +229 -229
  97. package/components/forms/feedback-form/FeedbackForm.vue +177 -177
  98. package/components/forms/feedback-form/FeedbackFormV2.vue +182 -0
  99. package/components/forms/input/AInputV2.vue +542 -542
  100. package/components/forms/input/button/AInputButton.vue +53 -53
  101. package/components/forms/input/date/AInputDate.vue +213 -213
  102. package/components/forms/input/password/AInputPassword.vue +59 -59
  103. package/components/forms/input/standard/AInputStandard.vue +415 -415
  104. package/components/forms/input/textarea/ATextarea.vue +203 -203
  105. package/components/forms/input/textarea/ATextareaV2.vue +248 -248
  106. package/components/forms/radio-button/ARadioButton.vue +95 -95
  107. package/components/forms/request-demo/ARequestDemo.vue +108 -108
  108. package/components/forms/toggle/AToggle.vue +156 -156
  109. package/components/forms/toggle/AToggleV2.vue +71 -71
  110. package/components/forms/toggle/types.ts +16 -16
  111. package/components/modals/AConfirmationEmail.vue +40 -40
  112. package/components/modals/AboutTariffModal.vue +114 -114
  113. package/components/modals/AnotherDeviceModal.vue +64 -64
  114. package/components/modals/ApplicationAcceptedModal.vue +44 -44
  115. package/components/modals/ConnectingTariffModal.vue +60 -60
  116. package/components/modals/ContactsMobileModel.vue +182 -182
  117. package/components/modals/ContentNavigationModal.vue +99 -99
  118. package/components/modals/Insufficient-funds-modal.vue +62 -62
  119. package/components/modals/LimitReachedModal.vue +33 -31
  120. package/components/modals/NoAccessModal.vue +35 -35
  121. package/components/modals/PaymentMethodModal.vue +101 -101
  122. package/components/modals/RedirectsBanksModal.vue +69 -69
  123. package/components/modals/ReplenishModal.vue +132 -132
  124. package/components/modals/ReportBugConfirmModal.vue +32 -32
  125. package/components/modals/ReportBugModal.vue +172 -172
  126. package/components/modals/Resend.vue +81 -81
  127. package/components/modals/SubmitApplicationModal.vue +126 -126
  128. package/components/modals/id/AuthModal.vue +92 -92
  129. package/components/modals/id/IdAutoLogoutModal.vue +45 -45
  130. package/components/modals/id/IdBanner.vue +61 -61
  131. package/components/modals/id/IdConfirmAccountOtpModal.vue +181 -181
  132. package/components/modals/id/IdConfirmSuccessfulModal.vue +41 -41
  133. package/components/modals/id/IdLoginModal.vue +336 -336
  134. package/components/modals/id/IdModals.vue +127 -127
  135. package/components/modals/id/IdNewPasswordModal.vue +129 -129
  136. package/components/modals/id/IdOtpInput.vue +156 -156
  137. package/components/modals/id/IdPasswordSuccessfulModal.vue +25 -25
  138. package/components/modals/id/IdRecoveryModal.vue +117 -117
  139. package/components/modals/id/IdRegistrationModal.vue +215 -215
  140. package/components/modals/id/IdResetPasswordOtpModal.vue +158 -158
  141. package/components/modals/id/IdTwoFactorModal.vue +125 -125
  142. package/components/navigation/README.md +1 -1
  143. package/components/navigation/bottom-navigation/ABottomNavigation.vue +106 -106
  144. package/components/navigation/breadcrumbs/ABreadcrumbs.vue +128 -128
  145. package/components/navigation/breadcrumbs/types.ts +8 -8
  146. package/components/navigation/footer/AFooter.vue +283 -283
  147. package/components/navigation/footer/ui/a-footer-accordion.vue +118 -118
  148. package/components/navigation/header/AHeader.vue +237 -237
  149. package/components/navigation/header/AlmatyContacts.vue +145 -145
  150. package/components/navigation/header/AstanaContacts.vue +67 -67
  151. package/components/navigation/header/CardGallery.vue +251 -251
  152. package/components/navigation/header/ContactMenu.vue +48 -48
  153. package/components/navigation/header/HeaderLink.vue +254 -254
  154. package/components/navigation/header/HeaderUsage.vue +139 -139
  155. package/components/navigation/header/ListItem.vue +31 -31
  156. package/components/navigation/header/NavCard.vue +41 -41
  157. package/components/navigation/header/NavList.vue +72 -72
  158. package/components/navigation/header/NotificationsMenu.vue +50 -50
  159. package/components/navigation/header/ProductMenu.vue +100 -100
  160. package/components/navigation/header/ProfileMenu.vue +167 -167
  161. package/components/navigation/header/SystemNotification.vue +108 -108
  162. package/components/navigation/header/types.ts +28 -28
  163. package/components/navigation/line-tabs/ALineTabs.vue +111 -111
  164. package/components/navigation/line-tabs/types.ts +21 -21
  165. package/components/navigation/mobile-navigation/AMobileNavigation.vue +112 -112
  166. package/components/navigation/pill-tabs/APillTabs.vue +177 -177
  167. package/components/navigation/pill-tabs/APillTabsV2.vue +226 -154
  168. package/components/navigation/pill-tabs/types.ts +24 -24
  169. package/components/navigation/side-navigation/ASideNavigation.vue +406 -406
  170. package/components/overlays/README.md +1 -1
  171. package/components/overlays/drawer/ADrawerV2.vue +335 -335
  172. package/components/overlays/modal/AModal.vue +335 -335
  173. package/components/overlays/modal/AModalV2.vue +397 -397
  174. package/components/overlays/side-panel/ASidePanel.vue +442 -442
  175. package/components/overlays/sideover/ASlideover.vue +351 -351
  176. package/components/overlays/tooltip/ATooltip.vue +237 -237
  177. package/components/overlays/tooltip/ATooltipV2.vue +223 -223
  178. package/components/overlays/tooltip/types.ts +26 -26
  179. package/components/overlays/tooltip/useTooltipTrigger.ts +101 -101
  180. package/components/transitions/ATransitionHeight.vue +67 -67
  181. package/components/utils/index.ts +19 -19
  182. package/components/utils/removeTrailingSlash.ts +7 -7
  183. package/composables/highlight.ts +18 -18
  184. package/composables/modalsState.ts +8 -8
  185. package/composables/projectState.ts +2 -2
  186. package/composables/useAccessTokenCookie.ts +25 -25
  187. package/composables/useActiveNavigation.ts +84 -84
  188. package/composables/useAdaptive.ts +46 -46
  189. package/composables/useBuyTariffs.ts +91 -91
  190. package/composables/useCarouselScroll.ts +49 -49
  191. package/composables/useChipOverflow.ts +92 -92
  192. package/composables/useHeaderNavigationLinks.ts +519 -519
  193. package/composables/useIdModals.ts +36 -36
  194. package/composables/usePayment.ts +78 -78
  195. package/composables/useUIValidation.ts +16 -16
  196. package/composables/useUrls.ts +23 -23
  197. package/eslint.config.mjs +45 -45
  198. package/i18n/i18n.config.ts +21 -21
  199. package/i18n.config.ts +21 -21
  200. package/icons/adata-logo.vue +17 -17
  201. package/icons/ai-assistant.vue +13 -13
  202. package/icons/akimat.vue +20 -20
  203. package/icons/archive.vue +16 -16
  204. package/icons/arrow/arrow-bottom-left-on-square.vue +5 -5
  205. package/icons/arrow/arrow-circle-down.vue +16 -16
  206. package/icons/arrow/arrow-circle-reset.vue +16 -16
  207. package/icons/arrow/arrow-corner.vue +9 -9
  208. package/icons/arrow/arrow-graph-down.vue +13 -13
  209. package/icons/arrow/arrow-graph-up.vue +14 -14
  210. package/icons/arrow/arrow-left-right.vue +8 -0
  211. package/icons/arrow/arrow-right.vue +14 -14
  212. package/icons/arrow/arrow-square-down.vue +15 -15
  213. package/icons/arrow/arrow-top-right-on-square.vue +6 -6
  214. package/icons/arrow/arrows-in.vue +11 -11
  215. package/icons/arrow/arrows-out.vue +11 -11
  216. package/icons/arrow/arrows-resize-in.vue +38 -38
  217. package/icons/arrow/arrows-resize-out.vue +17 -17
  218. package/icons/arrow-currency-gray.vue +5 -5
  219. package/icons/arrow-currency-green.vue +5 -5
  220. package/icons/arrow-currency-red.vue +5 -5
  221. package/icons/arrow-side-up.vue +6 -6
  222. package/icons/avatar.vue +12 -12
  223. package/icons/bank.vue +5 -5
  224. package/icons/bill.vue +3 -0
  225. package/icons/block.vue +16 -16
  226. package/icons/bookmark/bookmark-filled.vue +18 -18
  227. package/icons/bookmark/bookmark.vue +5 -5
  228. package/icons/bot.vue +52 -52
  229. package/icons/briefcase.vue +14 -14
  230. package/icons/browsers/browser-duck.vue +65 -65
  231. package/icons/browsers/browser-google.vue +30 -30
  232. package/icons/browsers/browser-yandex.vue +13 -13
  233. package/icons/building-vector.vue +7 -7
  234. package/icons/building.vue +9 -0
  235. package/icons/calculator.vue +7 -7
  236. package/icons/calendar.vue +24 -24
  237. package/icons/car-side.vue +16 -16
  238. package/icons/car.vue +7 -7
  239. package/icons/cart.vue +15 -15
  240. package/icons/chart-bar.vue +5 -5
  241. package/icons/chart-no-axes-column.vue +3 -0
  242. package/icons/chart-pie.vue +16 -16
  243. package/icons/check/check-circle.vue +6 -6
  244. package/icons/check/check-shield.vue +14 -14
  245. package/icons/check/check.vue +17 -17
  246. package/icons/check/checkmark-circle.vue +6 -6
  247. package/icons/check-sb.vue +7 -7
  248. package/icons/checkbox/checkbox-active.vue +17 -17
  249. package/icons/checkbox/checkbox-empty.vue +10 -10
  250. package/icons/checkbox/checkbox-intermediate.vue +7 -7
  251. package/icons/chevron/chevron-down.vue +5 -5
  252. package/icons/chevron/chevron-left.vue +5 -5
  253. package/icons/chevron/chevron-right.vue +5 -5
  254. package/icons/chevron/chevron-up.vue +5 -5
  255. package/icons/chevron/double-chevron-right.vue +12 -12
  256. package/icons/clipboard-text.vue +7 -7
  257. package/icons/clock-time.vue +24 -24
  258. package/icons/clock.vue +25 -25
  259. package/icons/close.vue +16 -16
  260. package/icons/cloud/cloud-upload.vue +3 -0
  261. package/icons/code.vue +9 -0
  262. package/icons/company/company-bazis.vue +21 -21
  263. package/icons/company/company-bereke.vue +25 -25
  264. package/icons/company/company-bigroup.vue +16 -16
  265. package/icons/company/company-erg.vue +17 -17
  266. package/icons/company/company-forte.vue +21 -21
  267. package/icons/company/company-halyk.vue +15 -15
  268. package/icons/company/company-jusan.vue +31 -31
  269. package/icons/company/company-kaspi.vue +14 -14
  270. package/icons/company/company-kazzinc.vue +22 -22
  271. package/icons/company/company-mycar.vue +13 -13
  272. package/icons/company/company-samruk.vue +21 -21
  273. package/icons/company-egov-small.vue +15 -15
  274. package/icons/company.vue +8 -8
  275. package/icons/compare-outlined.vue +8 -8
  276. package/icons/copy.vue +7 -7
  277. package/icons/currency/currency-dollar.vue +16 -16
  278. package/icons/currency/currency-down.vue +22 -22
  279. package/icons/currency/currency-eur.vue +57 -57
  280. package/icons/currency/currency-rub.vue +7 -7
  281. package/icons/currency/currency-tenge.vue +9 -9
  282. package/icons/currency/currency-usd.vue +221 -221
  283. package/icons/currency/currency-yuan.vue +25 -25
  284. package/icons/default-avatar.vue +20 -20
  285. package/icons/delete.vue +7 -7
  286. package/icons/document.vue +5 -5
  287. package/icons/dots-horizontal.vue +31 -31
  288. package/icons/download-line.vue +13 -13
  289. package/icons/download-rounded.vue +15 -15
  290. package/icons/download.vue +11 -11
  291. package/icons/edit.vue +7 -7
  292. package/icons/education.vue +16 -16
  293. package/icons/egov-small.vue +7 -7
  294. package/icons/egov.vue +41 -41
  295. package/icons/elicense.vue +38 -38
  296. package/icons/excel-icon.vue +14 -14
  297. package/icons/expand-window.vue +7 -7
  298. package/icons/eye-closed.vue +26 -26
  299. package/icons/eye-open.vue +7 -7
  300. package/icons/eye-opened.vue +23 -23
  301. package/icons/favourite-bookmark-outline.vue +17 -17
  302. package/icons/file/file-check-corner.vue +3 -0
  303. package/icons/file/file-spreadsheet.vue +3 -0
  304. package/icons/file/file.vue +16 -16
  305. package/icons/file/files.vue +16 -16
  306. package/icons/file-pen.vue +31 -31
  307. package/icons/file-stack.vue +31 -31
  308. package/icons/file-types/excel.vue +131 -131
  309. package/icons/file-types/html.vue +13 -13
  310. package/icons/file-types/jpeg.vue +16 -16
  311. package/icons/file-types/pdf.vue +11 -11
  312. package/icons/file-types/png.vue +11 -11
  313. package/icons/file-types/rar.vue +11 -11
  314. package/icons/file-types/word.vue +50 -50
  315. package/icons/file-types/zip.vue +11 -11
  316. package/icons/filter.vue +5 -5
  317. package/icons/flag.vue +7 -7
  318. package/icons/gauge.vue +17 -17
  319. package/icons/gift.vue +8 -8
  320. package/icons/git-compare.vue +38 -38
  321. package/icons/git-fork.vue +3 -0
  322. package/icons/globe.vue +16 -16
  323. package/icons/google.vue +41 -41
  324. package/icons/gradiend-icons/files-gradient.vue +22 -22
  325. package/icons/gradiend-icons/hammer-gradient.vue +62 -62
  326. package/icons/graduation-cap.vue +31 -31
  327. package/icons/graph-loading.vue +34 -34
  328. package/icons/graph-pie.vue +14 -14
  329. package/icons/hand/hand-thumb-up-filled.vue +5 -5
  330. package/icons/hand/hand-thumb-up.vue +5 -5
  331. package/icons/hand-with-phone/hand-with-phone-dark.vue +52 -52
  332. package/icons/hand-with-phone/hand-with-phone-light.vue +52 -52
  333. package/icons/handshake.vue +5 -5
  334. package/icons/hcheck.vue +14 -14
  335. package/icons/hdocument.vue +7 -7
  336. package/icons/headset.vue +6 -0
  337. package/icons/help-question-circle.vue +26 -26
  338. package/icons/history.vue +5 -5
  339. package/icons/horizontal-more.vue +13 -13
  340. package/icons/hot-line.vue +6 -6
  341. package/icons/hummer.vue +16 -16
  342. package/icons/id.vue +7 -7
  343. package/icons/in-row-type.vue +46 -46
  344. package/icons/in-table-type.vue +29 -29
  345. package/icons/info/info-circle.vue +29 -29
  346. package/icons/invoice.vue +7 -7
  347. package/icons/judge.vue +14 -14
  348. package/icons/kaspi-qr.vue +13 -13
  349. package/icons/landmark.vue +3 -0
  350. package/icons/layers.vue +3 -0
  351. package/icons/letter/letter-a.vue +6 -0
  352. package/icons/letter/letter-b.vue +6 -0
  353. package/icons/letter/letter-c.vue +6 -0
  354. package/icons/letter/letter-d.vue +6 -0
  355. package/icons/letter/letter-e.vue +6 -0
  356. package/icons/link-chain.vue +28 -28
  357. package/icons/link-url.vue +3 -0
  358. package/icons/link.vue +7 -7
  359. package/icons/linkedin.vue +24 -24
  360. package/icons/list-tree.vue +3 -0
  361. package/icons/loader-circle.vue +27 -27
  362. package/icons/location.vue +8 -8
  363. package/icons/lock.vue +5 -5
  364. package/icons/logo.vue +15 -15
  365. package/icons/logout.vue +16 -16
  366. package/icons/magnify/magnifying-glass-minus.vue +8 -8
  367. package/icons/magnify/magnifying-glass-plus.vue +9 -9
  368. package/icons/magnify/magnifying-glass.vue +9 -9
  369. package/icons/mail-question-mark.vue +8 -0
  370. package/icons/mail.vue +7 -7
  371. package/icons/mailru.vue +34 -34
  372. package/icons/main-filter.vue +5 -5
  373. package/icons/map/map-pin-filled.vue +7 -7
  374. package/icons/map/map-pin-rect.vue +15 -15
  375. package/icons/map/map-pin.vue +7 -7
  376. package/icons/map-marker-start.vue +7 -7
  377. package/icons/map-paper.vue +5 -5
  378. package/icons/medal.vue +7 -7
  379. package/icons/menu-filled.vue +20 -20
  380. package/icons/menu.vue +8 -8
  381. package/icons/message/message-square.vue +3 -0
  382. package/icons/message/message.vue +12 -12
  383. package/icons/message-dotted.vue +30 -30
  384. package/icons/minus/minus-circle.vue +10 -10
  385. package/icons/money.vue +5 -5
  386. package/icons/monitoring.vue +10 -10
  387. package/icons/moon.vue +8 -8
  388. package/icons/more.vue +29 -29
  389. package/icons/network.vue +3 -0
  390. package/icons/newspaper.vue +3 -0
  391. package/icons/note-pencil.vue +14 -14
  392. package/icons/note.vue +14 -14
  393. package/icons/notification-error.vue +17 -17
  394. package/icons/notification.vue +16 -16
  395. package/icons/paperclip.vue +7 -7
  396. package/icons/payment/payment-card.vue +6 -6
  397. package/icons/payment/payment-kaspi.vue +11 -11
  398. package/icons/person-vector.vue +7 -7
  399. package/icons/person-with-briefcase.vue +10 -10
  400. package/icons/person.vue +22 -22
  401. package/icons/phone-call.vue +6 -0
  402. package/icons/phone-filled.vue +5 -5
  403. package/icons/phone-reversed.vue +3 -0
  404. package/icons/phone.vue +7 -7
  405. package/icons/plus/plus-circle.vue +8 -8
  406. package/icons/plus/plus.vue +13 -13
  407. package/icons/profile.vue +5 -5
  408. package/icons/radio/radio-check.vue +8 -8
  409. package/icons/radio/radio-empty.vue +10 -10
  410. package/icons/receipt.vue +8 -8
  411. package/icons/robot.vue +14 -14
  412. package/icons/route.vue +7 -0
  413. package/icons/sanctions.vue +8 -8
  414. package/icons/scales/scale.vue +16 -16
  415. package/icons/scales/scales.vue +5 -5
  416. package/icons/scales/standing-scales.vue +15 -15
  417. package/icons/scan-search.vue +3 -0
  418. package/icons/search.vue +27 -27
  419. package/icons/settings.vue +26 -26
  420. package/icons/share/share-alt.vue +5 -5
  421. package/icons/share/share.vue +14 -14
  422. package/icons/shield-alert.vue +31 -31
  423. package/icons/shield-verified.vue +14 -14
  424. package/icons/ship.vue +8 -8
  425. package/icons/socials/face-book.vue +15 -15
  426. package/icons/socials/facebook-color.vue +16 -16
  427. package/icons/socials/globe-color.vue +16 -16
  428. package/icons/socials/instagram-color.vue +46 -46
  429. package/icons/socials/instagram.vue +19 -19
  430. package/icons/socials/linkedin-color.vue +14 -14
  431. package/icons/socials/telegram-color.vue +16 -16
  432. package/icons/socials/telegram.vue +15 -15
  433. package/icons/socials/tik-tok.vue +15 -15
  434. package/icons/socials/tiktok-color.vue +14 -14
  435. package/icons/socials/vk-color.vue +16 -16
  436. package/icons/socials/youtube-color.vue +16 -16
  437. package/icons/socials/youtube.vue +16 -16
  438. package/icons/sort/sort-asc.vue +15 -15
  439. package/icons/sort/sort-desc.vue +15 -15
  440. package/icons/sparkles.vue +3 -0
  441. package/icons/splitting-arrows.vue +8 -8
  442. package/icons/star/star-filled.vue +40 -40
  443. package/icons/star/star-half-filled.vue +20 -20
  444. package/icons/star/star.vue +25 -25
  445. package/icons/sun.vue +24 -24
  446. package/icons/sviazi.vue +5 -5
  447. package/icons/tag.vue +30 -30
  448. package/icons/tasks.vue +10 -10
  449. package/icons/tender-search.vue +11 -11
  450. package/icons/toasts/check-circle-toast.vue +6 -6
  451. package/icons/toasts/warning-triangle-toast.vue +7 -7
  452. package/icons/trash.vue +13 -13
  453. package/icons/triangle.vue +10 -10
  454. package/icons/truck.vue +7 -7
  455. package/icons/user-square.vue +14 -14
  456. package/icons/user.vue +22 -22
  457. package/icons/users-focus.vue +8 -8
  458. package/icons/users-round.vue +3 -0
  459. package/icons/users-three.vue +7 -7
  460. package/icons/users.vue +8 -8
  461. package/icons/view-eye-open.vue +13 -13
  462. package/icons/warning/warning-circle.vue +29 -29
  463. package/icons/warning/warning-triangle-filled.vue +12 -12
  464. package/icons/warning/warning-triangle.vue +28 -28
  465. package/icons/whatsapp.vue +8 -8
  466. package/icons/work-bag.vue +11 -11
  467. package/icons/work-case.vue +9 -9
  468. package/icons/work-search.vue +10 -10
  469. package/icons/work.vue +5 -5
  470. package/icons/workflow.vue +3 -0
  471. package/icons/x-mark.vue +15 -15
  472. package/icons/yandex.vue +28 -28
  473. package/icons/zap.vue +3 -0
  474. package/illustrations/address-location.vue +38 -38
  475. package/illustrations/ball-with-chain.vue +120 -120
  476. package/illustrations/bill.vue +133 -133
  477. package/illustrations/buildings.vue +82 -82
  478. package/illustrations/calendar.vue +156 -156
  479. package/illustrations/chains.vue +152 -152
  480. package/illustrations/coin-percent.vue +126 -126
  481. package/illustrations/coins-stack.vue +202 -202
  482. package/illustrations/delete-dark.vue +31 -31
  483. package/illustrations/delete.vue +32 -32
  484. package/illustrations/doc-with-stamp.vue +126 -126
  485. package/illustrations/document.vue +64 -64
  486. package/illustrations/door.vue +74 -74
  487. package/illustrations/empty-box.vue +77 -77
  488. package/illustrations/empty-wallet.vue +161 -161
  489. package/illustrations/graph-in-coin.vue +119 -119
  490. package/illustrations/hammer.vue +156 -156
  491. package/illustrations/hand-cash.vue +108 -108
  492. package/illustrations/info.vue +39 -39
  493. package/illustrations/mail.vue +68 -68
  494. package/illustrations/ok.vue +62 -62
  495. package/illustrations/people-group.vue +237 -237
  496. package/illustrations/person-with-phone.vue +187 -187
  497. package/illustrations/person.vue +159 -159
  498. package/illustrations/phone-check.vue +90 -90
  499. package/illustrations/phone-payment-method.vue +223 -223
  500. package/illustrations/search.vue +14 -14
  501. package/illustrations/stop-hand.vue +77 -77
  502. package/illustrations/stop-sign.vue +34 -34
  503. package/illustrations/suit.vue +111 -111
  504. package/illustrations/suitcase.vue +105 -105
  505. package/illustrations/terminal-dark.vue +48 -48
  506. package/illustrations/terminal.vue +234 -234
  507. package/illustrations/trash-can.vue +108 -108
  508. package/illustrations/turn-on-tariff.vue +38 -38
  509. package/illustrations/two-persons.vue +169 -169
  510. package/lang/en.ts +881 -878
  511. package/lang/kk.ts +883 -880
  512. package/lang/ru.ts +884 -881
  513. package/layouts/default.vue +13 -13
  514. package/nuxt.config.ts +88 -88
  515. package/package.json +69 -69
  516. package/plugins/maska.ts +4 -4
  517. package/plugins/toast.client.ts +41 -41
  518. package/public/kaspi/logo.svg +4 -4
  519. package/shared/constans/pages.ts +96 -96
  520. package/tailwind.config.ts +194 -194
  521. package/tests/AButton.test.ts +81 -81
  522. package/tsconfig.json +6 -6
  523. package/utils/getMaxZindex.ts +25 -25
  524. package/utils/localizedNavigation.ts +36 -36
  525. package/utils/twMerge.ts +34 -34
  526. package/vitest.config.ts +14 -14
  527. package/.claude/settings.local.json +0 -19
@@ -1,351 +1,351 @@
1
- <script setup lang="ts">
2
-
3
- import { twJoin, twMerge } from '#adata-ui/utils/twMerge'
4
- import { onClickOutside, useWindowSize } from '@vueuse/core'
5
- import {disableBodyScroll, enableBodyScroll} from "body-scroll-lock";
6
-
7
- const uiConfig = {
8
- wrapper: 'modal-wrapper relative z-[10000]',
9
- inner: 'modal-inner fixed inset-0 overflow-y-auto',
10
- overlay: {
11
- base: 'fixed inset-0 transition-opacity',
12
- background: 'bg-deepblue-900/20 dark:bg-gray-800/20 blur-lg',
13
- transition: {
14
- 'enter-active-class': 'ease-out duration-300',
15
- 'enter-from-class': 'opacity-0',
16
- 'enter-to-class': 'opacity-100',
17
- 'leave-active-class': 'ease-in duration-200',
18
- 'leave-from-class': 'opacity-100',
19
- 'leave-to-class': 'opacity-0'
20
- }
21
- },
22
- base: 'base-modal fixed transition-transform max-w-full overflow-auto',
23
- 'base-container': 'text-deepblue-900 dark:text-gray-200 flex flex-col gap-5 bg-white dark:bg-gray-900 h-full w-full',
24
- before: {
25
- base: 'absolute cursor-col-resize',
26
- position: {
27
- top: 'hidden',
28
- left: 'top-0 right-0 h-full w-1',
29
- right: 'top-0 left-0 h-full w-1',
30
- bottom: 'hidden'
31
- }
32
- },
33
- position: {
34
- top: 'top-0 left-0 w-full',
35
- left: 'top-0 left-0 h-full',
36
- right: 'top-0 right-0 h-full',
37
- bottom: 'bottom-0 left-0 w-full'
38
- },
39
- rounded: {
40
- top: 'rounded-b-md',
41
- bottom: 'rounded-t-md',
42
- left: 'rounded-r-md',
43
- right: 'rounded-l-md'
44
- },
45
- fullscreen: 'w-screen h-screen rounded-none',
46
- transition: {
47
- 'enter-active-class': 'transition transform ease-in-out duration-300',
48
- 'leave-active-class': 'transition transform ease-in-out duration-200',
49
- 'enter-from-class': {
50
- top: 'translate-y-[-100%]',
51
- left: 'translate-x-[-100%]',
52
- right: 'translate-x-[100%]',
53
- bottom: 'translate-y-[100%]'
54
- },
55
- 'leave-to-class': {
56
- top: 'translate-y-[-100%]',
57
- left: 'translate-x-[-100%]',
58
- right: 'translate-x-[100%]',
59
- bottom: 'translate-y-[100%]'
60
- }
61
- }
62
- }
63
-
64
- interface Props {
65
- title?: string
66
- transition?: boolean
67
- overlay?: boolean
68
- preventClose?: boolean
69
- fullscreen?: boolean
70
- name?: string
71
- size?: string | number
72
- position?: 'top' | 'left' | 'right' | 'bottom'
73
- resizable?: boolean
74
- }
75
-
76
- const props = withDefaults(defineProps<Props>(), {
77
- title: '',
78
- transition: true,
79
- overlay: true,
80
- preventClose: false,
81
- fullscreen: false,
82
- name: 'slideover',
83
- size: 424,
84
- position: 'right',
85
- resizable: false
86
- })
87
-
88
- const slots = useSlots()
89
- const { width } = useWindowSize()
90
- const isMobile = computed(() => width.value < 640)
91
-
92
-
93
- const modelValue = defineModel<boolean>()
94
-
95
- let teleportContainer: HTMLBodyElement | HTMLDivElement | undefined
96
- const slideover = ref<HTMLDivElement | null>(null)
97
-
98
- const wrapperClasses = uiConfig.wrapper
99
- const innerClasses = uiConfig.inner
100
- const baseContainerClasses = uiConfig['base-container']
101
- const overlayClasses = computed(() => !props.overlay || twMerge(twJoin(uiConfig.overlay.base, uiConfig.overlay.background)))
102
- const beforeClasses = computed(() => twMerge(twJoin(
103
- uiConfig.before.base,
104
- props.resizable ? uiConfig.before.position[props.position] : 'hidden'
105
- )))
106
- const baseClasses = computed(() => twMerge(twJoin(
107
- uiConfig.base,
108
- uiConfig.rounded[props.position],
109
- uiConfig.position[props.position],
110
- props.fullscreen ? uiConfig.fullscreen : ''
111
- )))
112
- const transitionClasses = computed(() => {
113
- return {
114
- overlay: props.transition ? uiConfig.overlay.transition : {},
115
- base: props.transition ? {
116
- ...uiConfig.transition,
117
- 'enter-from-class': uiConfig.transition['enter-from-class'][props.position],
118
- 'leave-to-class': uiConfig.transition['leave-to-class'][props.position]
119
- } : {}
120
- }
121
- })
122
-
123
- const slideoverSize = computed(() => {
124
- let sideType = 'height'
125
- if (['left', 'right'].includes(props.position)) {
126
- sideType = 'width'
127
- }
128
- if (props.fullscreen) return
129
- return ` ${sideType}: ${props.size}${typeof props.size === 'number' ? 'px' : ''}`
130
- })
131
-
132
- const onClose = () => {
133
- modelValue.value = false
134
- }
135
-
136
- onClickOutside(slideover, () => props.preventClose || onClose())
137
-
138
-
139
- type Slot = 'footer' | 'header' | 'content'
140
-
141
- const hasSlot = (name: Slot): boolean => {
142
- return Boolean(slots[name])
143
- }
144
-
145
- const hasFooter = computed(() => {
146
- return hasSlot('footer')
147
- })
148
-
149
- const hasHeader = computed(() => {
150
- return props.title || hasSlot('header')
151
- })
152
-
153
- const hasContent = computed(() => {
154
- return Boolean(slots.default)
155
- })
156
-
157
- onBeforeMount(() => {
158
- const alreadyCreatedTarget = document.getElementById(props.name)
159
- if (alreadyCreatedTarget) return
160
- teleportContainer = document.createElement('div')
161
- teleportContainer.setAttribute('id', props.name)
162
- document.body.appendChild(teleportContainer)
163
- })
164
-
165
-
166
- // resize
167
- const BORDER_SIZE = 4
168
- let M_POS: number
169
- const C_POS = ref<number>(-1)
170
-
171
- const onResize = (e: MouseEvent) => {
172
- const panel = slideover.value
173
- if (!panel) return
174
-
175
- let size: number
176
- const dx = M_POS - e.x
177
- M_POS = e.x
178
-
179
- if (props.position === 'left') {
180
- size = (parseInt(getComputedStyle(panel, '').width) - dx)
181
- } else if (props.position === 'right') {
182
- size = (parseInt(getComputedStyle(panel, '').width) + dx)
183
- }
184
-
185
- if (size >= initialWith.value) {
186
- C_POS.value = size
187
- panel.style.width = size + 'px'
188
- }
189
- }
190
-
191
- const onMouseDown = (e: MouseEvent) => {
192
- if (!process.client && !props.resizable) return
193
-
194
- if (['left', 'right'].includes(props.position) && e.offsetX < BORDER_SIZE) {
195
- M_POS = e.x
196
- document.addEventListener('mousemove', onResize, false)
197
- }
198
- }
199
-
200
- const onMouseUp = () => {
201
- if (!process.client && !props.resizable) return
202
-
203
- document.removeEventListener('mousemove', onResize, false)
204
- }
205
-
206
- const initialWith = computed<number>(() => {
207
- if (typeof props.size === 'number') return props.size
208
- return parseInt(props.size.replace('px', ''))
209
- })
210
-
211
-
212
-
213
- // Mobile swipe close
214
-
215
- const positionStart = ref<number>(0)
216
- const isClose = ref<boolean>(false)
217
- const modalHeight = ref(0)
218
-
219
- const touchstart = (event: TouchEvent) => {
220
- isClose.value = false
221
- positionStart.value = event.touches[0].clientY
222
- modalHeight.value = slideover.value?.offsetHeight || 0
223
- }
224
-
225
- const touchmove = (event: TouchEvent) => {
226
- if (!isMobile.value) return;
227
- event.preventDefault();
228
- const touchPosition = event.touches[0].clientY
229
- const step = touchPosition - positionStart.value
230
-
231
- if (step < 0) return // предотвратить движение вверх
232
-
233
- const newHeight = modalHeight.value - step
234
- slideover.value.style.height = `${newHeight}px`
235
- isClose.value = step > 65
236
- }
237
-
238
- const touchend = () => {
239
- if (isClose.value) {
240
- onClose()
241
- } else {
242
- slideover.value.style.height = `${modalHeight.value}px`
243
- }
244
- }
245
- const toggleBodyScroll = (lock: boolean) => {
246
- if (!slideover.value) return
247
- if (lock) {
248
- setTimeout(() => {
249
- disableBodyScroll(slideover.value, {
250
- reserveScrollBarGap: true,
251
- allowTouchMove: (el: EventTarget | null): boolean => {
252
- return el && slideover.value?.contains(el as Node);
253
- }
254
- })
255
- }, 0)
256
-
257
- } else {
258
- enableBodyScroll(slideover.value)
259
- }
260
- }
261
-
262
- watch(modelValue, async (newValue) => {
263
- if (newValue) {
264
- await nextTick()
265
- toggleBodyScroll(true)
266
- } else {
267
- toggleBodyScroll(false)
268
- }
269
- })
270
- </script>
271
-
272
- <template>
273
- <client-only>
274
- <teleport :to="`#${name}`">
275
- <div
276
- :class="wrapperClasses"
277
- >
278
- <Transition
279
- name="overlay"
280
- v-bind="transitionClasses.overlay"
281
- >
282
- <div
283
- v-show="modelValue"
284
- :class="overlayClasses"
285
- />
286
- </Transition>
287
- <Transition
288
- name="slideover"
289
- v-bind="transitionClasses.base"
290
- >
291
- <div
292
- v-if="modelValue"
293
- :class="innerClasses"
294
- >
295
- <div
296
- ref="slideover"
297
- :class="baseClasses"
298
- :style="slideoverSize"
299
- @mousedown="onMouseDown"
300
- @mouseup="onMouseUp"
301
- >
302
- <div :class="beforeClasses" />
303
- <div :class="baseContainerClasses">
304
- <div
305
- v-if="isMobile && position === 'bottom'"
306
- class="w-full flex justify-center items-center mb-2 pt-2 absolute cursor-row-resize "
307
- @touchmove="touchmove"
308
- @touchstart="touchstart"
309
- @touchend="touchend"
310
- >
311
- <div class="h-1 w-10 bg-[#D9D9D9] rounded m-1" />
312
- </div>
313
- <div
314
- v-if="hasHeader"
315
- class="top mt-4"
316
- @touchmove="touchmove"
317
- @touchstart="touchstart"
318
- @touchend="touchend">
319
- <h4
320
- v-if="title"
321
- class="heading-02 text-center"
322
- >
323
- {{ title }}
324
- </h4>
325
- <div v-if="!!$slots.header">
326
- <slot name="header" />
327
- </div>
328
- </div>
329
- <div
330
- v-if="hasContent"
331
- class="grow"
332
- >
333
- <slot />
334
- </div>
335
- <div
336
- v-if="hasFooter"
337
- >
338
- <slot name="footer" />
339
- </div>
340
- </div>
341
- </div>
342
- </div>
343
- </Transition>
344
- </div>
345
- </teleport>
346
- </client-only>
347
- </template>
348
-
349
- <style scoped>
350
-
351
- </style>
1
+ <script setup lang="ts">
2
+
3
+ import { twJoin, twMerge } from '#adata-ui/utils/twMerge'
4
+ import { onClickOutside, useWindowSize } from '@vueuse/core'
5
+ import {disableBodyScroll, enableBodyScroll} from "body-scroll-lock";
6
+
7
+ const uiConfig = {
8
+ wrapper: 'modal-wrapper relative z-[10000]',
9
+ inner: 'modal-inner fixed inset-0 overflow-y-auto',
10
+ overlay: {
11
+ base: 'fixed inset-0 transition-opacity',
12
+ background: 'bg-deepblue-900/20 dark:bg-gray-800/20 blur-lg',
13
+ transition: {
14
+ 'enter-active-class': 'ease-out duration-300',
15
+ 'enter-from-class': 'opacity-0',
16
+ 'enter-to-class': 'opacity-100',
17
+ 'leave-active-class': 'ease-in duration-200',
18
+ 'leave-from-class': 'opacity-100',
19
+ 'leave-to-class': 'opacity-0'
20
+ }
21
+ },
22
+ base: 'base-modal fixed transition-transform max-w-full overflow-auto',
23
+ 'base-container': 'text-deepblue-900 dark:text-gray-200 flex flex-col gap-5 bg-white dark:bg-gray-900 h-full w-full',
24
+ before: {
25
+ base: 'absolute cursor-col-resize',
26
+ position: {
27
+ top: 'hidden',
28
+ left: 'top-0 right-0 h-full w-1',
29
+ right: 'top-0 left-0 h-full w-1',
30
+ bottom: 'hidden'
31
+ }
32
+ },
33
+ position: {
34
+ top: 'top-0 left-0 w-full',
35
+ left: 'top-0 left-0 h-full',
36
+ right: 'top-0 right-0 h-full',
37
+ bottom: 'bottom-0 left-0 w-full'
38
+ },
39
+ rounded: {
40
+ top: 'rounded-b-md',
41
+ bottom: 'rounded-t-md',
42
+ left: 'rounded-r-md',
43
+ right: 'rounded-l-md'
44
+ },
45
+ fullscreen: 'w-screen h-screen rounded-none',
46
+ transition: {
47
+ 'enter-active-class': 'transition transform ease-in-out duration-300',
48
+ 'leave-active-class': 'transition transform ease-in-out duration-200',
49
+ 'enter-from-class': {
50
+ top: 'translate-y-[-100%]',
51
+ left: 'translate-x-[-100%]',
52
+ right: 'translate-x-[100%]',
53
+ bottom: 'translate-y-[100%]'
54
+ },
55
+ 'leave-to-class': {
56
+ top: 'translate-y-[-100%]',
57
+ left: 'translate-x-[-100%]',
58
+ right: 'translate-x-[100%]',
59
+ bottom: 'translate-y-[100%]'
60
+ }
61
+ }
62
+ }
63
+
64
+ interface Props {
65
+ title?: string
66
+ transition?: boolean
67
+ overlay?: boolean
68
+ preventClose?: boolean
69
+ fullscreen?: boolean
70
+ name?: string
71
+ size?: string | number
72
+ position?: 'top' | 'left' | 'right' | 'bottom'
73
+ resizable?: boolean
74
+ }
75
+
76
+ const props = withDefaults(defineProps<Props>(), {
77
+ title: '',
78
+ transition: true,
79
+ overlay: true,
80
+ preventClose: false,
81
+ fullscreen: false,
82
+ name: 'slideover',
83
+ size: 424,
84
+ position: 'right',
85
+ resizable: false
86
+ })
87
+
88
+ const slots = useSlots()
89
+ const { width } = useWindowSize()
90
+ const isMobile = computed(() => width.value < 640)
91
+
92
+
93
+ const modelValue = defineModel<boolean>()
94
+
95
+ let teleportContainer: HTMLBodyElement | HTMLDivElement | undefined
96
+ const slideover = ref<HTMLDivElement | null>(null)
97
+
98
+ const wrapperClasses = uiConfig.wrapper
99
+ const innerClasses = uiConfig.inner
100
+ const baseContainerClasses = uiConfig['base-container']
101
+ const overlayClasses = computed(() => !props.overlay || twMerge(twJoin(uiConfig.overlay.base, uiConfig.overlay.background)))
102
+ const beforeClasses = computed(() => twMerge(twJoin(
103
+ uiConfig.before.base,
104
+ props.resizable ? uiConfig.before.position[props.position] : 'hidden'
105
+ )))
106
+ const baseClasses = computed(() => twMerge(twJoin(
107
+ uiConfig.base,
108
+ uiConfig.rounded[props.position],
109
+ uiConfig.position[props.position],
110
+ props.fullscreen ? uiConfig.fullscreen : ''
111
+ )))
112
+ const transitionClasses = computed(() => {
113
+ return {
114
+ overlay: props.transition ? uiConfig.overlay.transition : {},
115
+ base: props.transition ? {
116
+ ...uiConfig.transition,
117
+ 'enter-from-class': uiConfig.transition['enter-from-class'][props.position],
118
+ 'leave-to-class': uiConfig.transition['leave-to-class'][props.position]
119
+ } : {}
120
+ }
121
+ })
122
+
123
+ const slideoverSize = computed(() => {
124
+ let sideType = 'height'
125
+ if (['left', 'right'].includes(props.position)) {
126
+ sideType = 'width'
127
+ }
128
+ if (props.fullscreen) return
129
+ return ` ${sideType}: ${props.size}${typeof props.size === 'number' ? 'px' : ''}`
130
+ })
131
+
132
+ const onClose = () => {
133
+ modelValue.value = false
134
+ }
135
+
136
+ onClickOutside(slideover, () => props.preventClose || onClose())
137
+
138
+
139
+ type Slot = 'footer' | 'header' | 'content'
140
+
141
+ const hasSlot = (name: Slot): boolean => {
142
+ return Boolean(slots[name])
143
+ }
144
+
145
+ const hasFooter = computed(() => {
146
+ return hasSlot('footer')
147
+ })
148
+
149
+ const hasHeader = computed(() => {
150
+ return props.title || hasSlot('header')
151
+ })
152
+
153
+ const hasContent = computed(() => {
154
+ return Boolean(slots.default)
155
+ })
156
+
157
+ onBeforeMount(() => {
158
+ const alreadyCreatedTarget = document.getElementById(props.name)
159
+ if (alreadyCreatedTarget) return
160
+ teleportContainer = document.createElement('div')
161
+ teleportContainer.setAttribute('id', props.name)
162
+ document.body.appendChild(teleportContainer)
163
+ })
164
+
165
+
166
+ // resize
167
+ const BORDER_SIZE = 4
168
+ let M_POS: number
169
+ const C_POS = ref<number>(-1)
170
+
171
+ const onResize = (e: MouseEvent) => {
172
+ const panel = slideover.value
173
+ if (!panel) return
174
+
175
+ let size: number
176
+ const dx = M_POS - e.x
177
+ M_POS = e.x
178
+
179
+ if (props.position === 'left') {
180
+ size = (parseInt(getComputedStyle(panel, '').width) - dx)
181
+ } else if (props.position === 'right') {
182
+ size = (parseInt(getComputedStyle(panel, '').width) + dx)
183
+ }
184
+
185
+ if (size >= initialWith.value) {
186
+ C_POS.value = size
187
+ panel.style.width = size + 'px'
188
+ }
189
+ }
190
+
191
+ const onMouseDown = (e: MouseEvent) => {
192
+ if (!process.client && !props.resizable) return
193
+
194
+ if (['left', 'right'].includes(props.position) && e.offsetX < BORDER_SIZE) {
195
+ M_POS = e.x
196
+ document.addEventListener('mousemove', onResize, false)
197
+ }
198
+ }
199
+
200
+ const onMouseUp = () => {
201
+ if (!process.client && !props.resizable) return
202
+
203
+ document.removeEventListener('mousemove', onResize, false)
204
+ }
205
+
206
+ const initialWith = computed<number>(() => {
207
+ if (typeof props.size === 'number') return props.size
208
+ return parseInt(props.size.replace('px', ''))
209
+ })
210
+
211
+
212
+
213
+ // Mobile swipe close
214
+
215
+ const positionStart = ref<number>(0)
216
+ const isClose = ref<boolean>(false)
217
+ const modalHeight = ref(0)
218
+
219
+ const touchstart = (event: TouchEvent) => {
220
+ isClose.value = false
221
+ positionStart.value = event.touches[0].clientY
222
+ modalHeight.value = slideover.value?.offsetHeight || 0
223
+ }
224
+
225
+ const touchmove = (event: TouchEvent) => {
226
+ if (!isMobile.value) return;
227
+ event.preventDefault();
228
+ const touchPosition = event.touches[0].clientY
229
+ const step = touchPosition - positionStart.value
230
+
231
+ if (step < 0) return // предотвратить движение вверх
232
+
233
+ const newHeight = modalHeight.value - step
234
+ slideover.value.style.height = `${newHeight}px`
235
+ isClose.value = step > 65
236
+ }
237
+
238
+ const touchend = () => {
239
+ if (isClose.value) {
240
+ onClose()
241
+ } else {
242
+ slideover.value.style.height = `${modalHeight.value}px`
243
+ }
244
+ }
245
+ const toggleBodyScroll = (lock: boolean) => {
246
+ if (!slideover.value) return
247
+ if (lock) {
248
+ setTimeout(() => {
249
+ disableBodyScroll(slideover.value, {
250
+ reserveScrollBarGap: true,
251
+ allowTouchMove: (el: EventTarget | null): boolean => {
252
+ return el && slideover.value?.contains(el as Node);
253
+ }
254
+ })
255
+ }, 0)
256
+
257
+ } else {
258
+ enableBodyScroll(slideover.value)
259
+ }
260
+ }
261
+
262
+ watch(modelValue, async (newValue) => {
263
+ if (newValue) {
264
+ await nextTick()
265
+ toggleBodyScroll(true)
266
+ } else {
267
+ toggleBodyScroll(false)
268
+ }
269
+ })
270
+ </script>
271
+
272
+ <template>
273
+ <client-only>
274
+ <teleport :to="`#${name}`">
275
+ <div
276
+ :class="wrapperClasses"
277
+ >
278
+ <Transition
279
+ name="overlay"
280
+ v-bind="transitionClasses.overlay"
281
+ >
282
+ <div
283
+ v-show="modelValue"
284
+ :class="overlayClasses"
285
+ />
286
+ </Transition>
287
+ <Transition
288
+ name="slideover"
289
+ v-bind="transitionClasses.base"
290
+ >
291
+ <div
292
+ v-if="modelValue"
293
+ :class="innerClasses"
294
+ >
295
+ <div
296
+ ref="slideover"
297
+ :class="baseClasses"
298
+ :style="slideoverSize"
299
+ @mousedown="onMouseDown"
300
+ @mouseup="onMouseUp"
301
+ >
302
+ <div :class="beforeClasses" />
303
+ <div :class="baseContainerClasses">
304
+ <div
305
+ v-if="isMobile && position === 'bottom'"
306
+ class="w-full flex justify-center items-center mb-2 pt-2 absolute cursor-row-resize "
307
+ @touchmove="touchmove"
308
+ @touchstart="touchstart"
309
+ @touchend="touchend"
310
+ >
311
+ <div class="h-1 w-10 bg-[#D9D9D9] rounded m-1" />
312
+ </div>
313
+ <div
314
+ v-if="hasHeader"
315
+ class="top mt-4"
316
+ @touchmove="touchmove"
317
+ @touchstart="touchstart"
318
+ @touchend="touchend">
319
+ <h4
320
+ v-if="title"
321
+ class="heading-02 text-center"
322
+ >
323
+ {{ title }}
324
+ </h4>
325
+ <div v-if="!!$slots.header">
326
+ <slot name="header" />
327
+ </div>
328
+ </div>
329
+ <div
330
+ v-if="hasContent"
331
+ class="grow"
332
+ >
333
+ <slot />
334
+ </div>
335
+ <div
336
+ v-if="hasFooter"
337
+ >
338
+ <slot name="footer" />
339
+ </div>
340
+ </div>
341
+ </div>
342
+ </div>
343
+ </Transition>
344
+ </div>
345
+ </teleport>
346
+ </client-only>
347
+ </template>
348
+
349
+ <style scoped>
350
+
351
+ </style>