adata-ui 2.1.41-beta.6 → 2.1.41-beta.8
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.
- package/-error.vue +170 -170
- package/.editorconfig +12 -12
- package/.gitlab-ci.yml +16 -16
- package/.nuxtrc +1 -1
- package/.nvmrc +1 -1
- package/.playground/app.config.ts +5 -5
- package/.playground/app.vue +102 -102
- package/.playground/nuxt.config.ts +4 -4
- package/CLAUDE.md +63 -63
- package/README.md +75 -75
- package/app.config.ts +28 -28
- package/app.vue +8 -8
- package/assets/styles/main.css +12 -12
- package/assets/styles/theme.css +590 -583
- package/assets/styles/ui.css +247 -247
- package/components/elements/README.md +1 -1
- package/components/elements/a-select-row/ASelectRowV2.vue +210 -210
- package/components/elements/a-select-row/index.vue +139 -139
- package/components/elements/accordion/AAccordion.vue +199 -199
- package/components/elements/accordion/AAccordionGroup/AAccordionGroup.vue +145 -145
- package/components/elements/accordion/AAccordionGroup/types.ts +20 -20
- package/components/elements/accordion/AAccordionGroup/ui.config.ts +22 -22
- package/components/elements/accordion/types.ts +14 -14
- package/components/elements/accordion/ui.config.ts +22 -22
- package/components/elements/alert/AAlert.vue +52 -52
- package/components/elements/banner/ABanner.vue +49 -49
- package/components/elements/bg-block/ABgBlock.vue +11 -11
- package/components/elements/button/AButton.vue +191 -191
- package/components/elements/button/AButtonV2.vue +179 -179
- package/components/elements/button/types.ts +24 -24
- package/components/elements/button-login/index.vue +19 -19
- package/components/elements/calendar/ACalendar.vue +83 -83
- package/components/elements/carousel/ACarousel.vue +159 -159
- package/components/elements/carousel/config.ui.ts +15 -15
- package/components/elements/carousel/types.ts +18 -18
- package/components/elements/chip-wrapper/AChipWrapper.vue +81 -81
- package/components/elements/chip-wrapper/types.ts +12 -12
- package/components/elements/chips/AChips.vue +33 -33
- package/components/elements/companies/AOurClients.vue +47 -47
- package/components/elements/count-up/ACountUp.vue +54 -54
- package/components/elements/curve-block/ACurveBlock.vue +259 -259
- package/components/elements/curve-block-v2/ACurveBlockV2.vue +122 -122
- package/components/elements/digit-badge/ADigitBadge.vue +86 -86
- package/components/elements/empty-box/empty-box-V2.vue +92 -92
- package/components/elements/error-template/index.vue +121 -119
- package/components/elements/feature-description/AFeatureDescription.vue +112 -112
- package/components/elements/illustrations/noAccess.vue +71 -71
- package/components/elements/infinite-carousel/AInfiniteCarousel.vue +85 -85
- package/components/elements/infinite-scroll/AInfiniteScroll.vue +33 -33
- package/components/elements/leave-note/ALeaveNote.vue +102 -102
- package/components/elements/pagination/APagination.vue +110 -110
- package/components/elements/photos-animation/APhotosAnimation.vue +85 -85
- package/components/elements/section-heading/ASectionHeading.vue +35 -35
- package/components/elements/segmented/ASegmentedV2.vue +154 -154
- package/components/elements/select/ACascadeSelectV2.vue +710 -0
- package/components/elements/select/ASelect.vue +448 -448
- package/components/elements/select/ASelectMobile.vue +186 -186
- package/components/elements/select/ASelectV2.vue +507 -580
- package/components/elements/select/cascade-utils.ts +115 -0
- package/components/elements/select/types.ts +27 -0
- package/components/elements/select/ui/cascade-drawer.vue +146 -0
- package/components/elements/select/ui/cascade-panel.vue +237 -0
- package/components/elements/select/ui/select-button.vue +112 -112
- package/components/elements/select/ui/select-list.vue +99 -99
- package/components/elements/select/ui/select-trigger.vue +167 -0
- package/components/elements/show-more/AShowMore.vue +35 -35
- package/components/elements/show-more/AShowMoreV2.vue +26 -26
- package/components/elements/skeleton/ASkeleton.vue +44 -44
- package/components/elements/slider/ASlider.vue +175 -175
- package/components/elements/slider/ASliderItem.vue +31 -31
- package/components/elements/slider/ASliderV2.vue +182 -182
- package/components/elements/slider/types.ts +21 -21
- package/components/elements/star-rating/AStarRating.vue +189 -189
- package/components/elements/star-rating/types.ts +7 -7
- package/components/elements/star-rating/ui/Star.vue +74 -74
- package/components/elements/status-badge/AStatusBadge.vue +125 -125
- package/components/elements/step-slider/AStepSliderColCard.vue +270 -270
- package/components/elements/step-slider/AStepSliderColNumber.vue +199 -199
- package/components/elements/table/ATable.vue +93 -93
- package/components/elements/table/table.config.ts +32 -32
- package/components/elements/tree-select/ATreeSelect.vue +157 -157
- package/components/elements/tree-select/TreeService.ts +184 -184
- package/components/elements/tree-select/components/ATreeSelectNode.vue +104 -104
- package/components/elements/tree-select/types.ts +63 -63
- package/components/elements/tree-select/utils.ts +30 -30
- package/components/elements/tree-select-mobile/ATreeSelectMobile.vue +79 -79
- package/components/elements/tree-select-mobile/components/ATreeSelectNodesMobile.vue +175 -175
- package/components/elements/tree-select-modal/ATreeSelectModal.vue +217 -217
- package/components/features/color-mode/AColorMode.client.vue +74 -74
- package/components/features/dropdown/ADropdown.vue +127 -127
- package/components/features/dropdown/ADropdownV2.vue +140 -140
- package/components/features/go-top/GoTop.vue +67 -67
- package/components/features/lang-switcher/lang-switcher.vue +158 -158
- package/components/features/payment/banner/BasicPlusLimitBanner.vue +84 -84
- package/components/features/payment/banner/PaymentBanner.vue +88 -88
- package/components/features/payment/banner/UpSellBanner.vue +105 -105
- package/components/features/payment/process/PaymentKaspiQrSidePanel.vue +180 -180
- package/components/features/payment/process/PaymentKaspiRedirectSidePanel.vue +123 -123
- package/components/features/payment/process/PaymentMethodSidePanel.vue +138 -138
- package/components/features/payment/process/PaymentProcess.vue +158 -158
- package/components/features/payment/process/PaymentTopUpSidePanel.vue +119 -119
- package/components/features/pk-mobile-services/APkMobileServices.vue +107 -107
- package/components/features//321/201hange-version/AChangeVersion.vue +20 -20
- package/components/forms/README.md +1 -1
- package/components/forms/checkbox/ACheckbox.vue +149 -149
- package/components/forms/checkbox/ACheckboxV2.vue +229 -229
- package/components/forms/feedback-form/FeedbackForm.vue +177 -177
- package/components/forms/feedback-form/FeedbackFormV2.vue +183 -183
- package/components/forms/input/AInputV2.vue +560 -560
- package/components/forms/input/button/AInputButton.vue +53 -53
- package/components/forms/input/date/AInputDate.vue +217 -217
- package/components/forms/input/password/AInputPassword.vue +59 -59
- package/components/forms/input/standard/AInputStandard.vue +424 -424
- package/components/forms/input/textarea/ATextarea.vue +207 -207
- package/components/forms/input/textarea/ATextareaV2.vue +253 -253
- package/components/forms/radio-button/ARadioButton.vue +95 -95
- package/components/forms/request-demo/ARequestDemo.vue +108 -108
- package/components/forms/toggle/AToggle.vue +157 -157
- package/components/forms/toggle/AToggleV2.vue +72 -72
- package/components/forms/toggle/types.ts +16 -16
- package/components/modals/AConfirmationEmail.vue +40 -40
- package/components/modals/AboutTariffModal.vue +115 -115
- package/components/modals/AnotherDeviceModal.vue +65 -65
- package/components/modals/ApplicationAcceptedModal.vue +45 -45
- package/components/modals/ConnectingTariffModal.vue +60 -60
- package/components/modals/ContactsMobileModel.vue +182 -182
- package/components/modals/ContentNavigationModal.vue +100 -100
- package/components/modals/Insufficient-funds-modal.vue +62 -62
- package/components/modals/LimitReachedModal.vue +44 -44
- package/components/modals/NoAccessModal.vue +39 -39
- package/components/modals/PaymentMethodModal.vue +101 -101
- package/components/modals/RedirectsBanksModal.vue +69 -69
- package/components/modals/ReplenishModal.vue +132 -132
- package/components/modals/ReportBugConfirmModal.vue +32 -32
- package/components/modals/ReportBugModal.vue +172 -172
- package/components/modals/Resend.vue +81 -81
- package/components/modals/SubmitApplicationModal.vue +126 -126
- package/components/modals/id/AuthModal.vue +72 -72
- package/components/modals/id/IdAutoLogoutModal.vue +44 -44
- package/components/modals/id/IdBanner.vue +41 -41
- package/components/modals/id/IdConfirmAccountOtpModal.vue +182 -182
- package/components/modals/id/IdConfirmSuccessfulModal.vue +41 -41
- package/components/modals/id/IdLoginModal.vue +336 -336
- package/components/modals/id/IdModals.vue +129 -129
- package/components/modals/id/IdNewPasswordModal.vue +129 -129
- package/components/modals/id/IdOtpInput.vue +156 -156
- package/components/modals/id/IdPasswordSuccessfulModal.vue +25 -25
- package/components/modals/id/IdRecoveryModal.vue +117 -117
- package/components/modals/id/IdRegistrationModal.vue +215 -215
- package/components/modals/id/IdResetPasswordOtpModal.vue +159 -159
- package/components/modals/id/IdTwoFactorModal.vue +126 -126
- package/components/navigation/README.md +1 -1
- package/components/navigation/bottom-navigation/ABottomNavigation.vue +106 -106
- package/components/navigation/breadcrumbs/ABreadcrumbs.vue +128 -128
- package/components/navigation/breadcrumbs/types.ts +8 -8
- package/components/navigation/footer/AFooter.vue +283 -283
- package/components/navigation/footer/ui/a-footer-accordion.vue +118 -118
- package/components/navigation/header/AHeader.vue +241 -241
- package/components/navigation/header/AlmatyContacts.vue +145 -145
- package/components/navigation/header/AstanaContacts.vue +67 -67
- package/components/navigation/header/CardGallery.vue +252 -252
- package/components/navigation/header/ContactMenu.vue +48 -48
- package/components/navigation/header/HeaderLink.vue +250 -250
- package/components/navigation/header/HeaderUsage.vue +139 -139
- package/components/navigation/header/ListItem.vue +32 -32
- package/components/navigation/header/NavCard.vue +42 -42
- package/components/navigation/header/NavList.vue +73 -73
- package/components/navigation/header/NotificationsMenu.vue +50 -50
- package/components/navigation/header/ProductMenu.vue +101 -101
- package/components/navigation/header/ProfileMenu.vue +168 -168
- package/components/navigation/header/SystemNotification.vue +108 -108
- package/components/navigation/header/types.ts +28 -28
- package/components/navigation/line-tabs/ALineTabs.vue +112 -112
- package/components/navigation/line-tabs/types.ts +21 -21
- package/components/navigation/mobile-navigation/AMobileNavigation.vue +112 -112
- package/components/navigation/pill-tabs/APillTabs.vue +179 -179
- package/components/navigation/pill-tabs/APillTabsV2.vue +241 -241
- package/components/navigation/pill-tabs/types.ts +24 -24
- package/components/navigation/side-navigation/ASideNavigation.vue +406 -406
- package/components/overlays/README.md +1 -1
- package/components/overlays/drawer/ADrawerV2.vue +342 -335
- package/components/overlays/modal/AModal.vue +335 -335
- package/components/overlays/modal/AModalV2.vue +401 -400
- package/components/overlays/side-panel/ASidePanel.vue +445 -445
- package/components/overlays/sideover/ASlideover.vue +351 -351
- package/components/overlays/tooltip/ATooltip.vue +238 -238
- package/components/overlays/tooltip/ATooltipV2.vue +226 -226
- package/components/overlays/tooltip/types.ts +26 -26
- package/components/overlays/tooltip/useTooltipTrigger.ts +101 -101
- package/components/transitions/ATransitionHeight.vue +67 -67
- package/components/utils/index.ts +19 -19
- package/components/utils/removeTrailingSlash.ts +7 -7
- package/composables/highlight.ts +19 -19
- package/composables/modalsState.ts +8 -8
- package/composables/projectState.ts +2 -2
- package/composables/useAccessTokenCookie.ts +25 -25
- package/composables/useActiveNavigation.ts +84 -84
- package/composables/useAdaptive.ts +46 -46
- package/composables/useBuyTariffs.ts +91 -91
- package/composables/useCarouselScroll.ts +49 -49
- package/composables/useChipOverflow.ts +92 -92
- package/composables/useHeaderNavigationLinks.ts +519 -519
- package/composables/useIdModals.ts +36 -36
- package/composables/usePayment.ts +78 -78
- package/composables/useUIValidation.ts +16 -16
- package/composables/useUrls.ts +23 -23
- package/eslint.config.mjs +58 -58
- package/i18n/i18n.config.ts +21 -21
- package/i18n.config.ts +21 -21
- package/icons/adata-logo.vue +17 -17
- package/icons/ai-assistant.vue +13 -13
- package/icons/akimat.vue +20 -20
- package/icons/archive.vue +16 -16
- package/icons/arrow/arrow-bottom-left-on-square.vue +5 -5
- package/icons/arrow/arrow-circle-down.vue +16 -16
- package/icons/arrow/arrow-circle-reset.vue +16 -16
- package/icons/arrow/arrow-corner.vue +9 -9
- package/icons/arrow/arrow-down-left.vue +6 -0
- package/icons/arrow/arrow-graph-down.vue +13 -13
- package/icons/arrow/arrow-graph-up.vue +14 -14
- package/icons/arrow/arrow-left-right.vue +8 -8
- package/icons/arrow/arrow-left.vue +14 -14
- package/icons/arrow/arrow-right.vue +14 -14
- package/icons/arrow/arrow-square-down.vue +15 -15
- package/icons/arrow/arrow-top-right-on-square.vue +6 -6
- package/icons/arrow/arrow-up-right.vue +6 -0
- package/icons/arrow/arrows-in.vue +11 -11
- package/icons/arrow/arrows-out.vue +11 -11
- package/icons/arrow/arrows-resize-in.vue +38 -38
- package/icons/arrow/arrows-resize-out.vue +17 -17
- package/icons/arrow-currency-gray.vue +5 -5
- package/icons/arrow-currency-green.vue +5 -5
- package/icons/arrow-currency-red.vue +5 -5
- package/icons/arrow-side-up.vue +6 -6
- package/icons/avatar.vue +12 -12
- package/icons/bank.vue +5 -5
- package/icons/bar-chart-3.vue +3 -3
- package/icons/bill.vue +3 -3
- package/icons/block.vue +16 -16
- package/icons/book-open.vue +3 -3
- package/icons/bookmark/bookmark-filled.vue +19 -19
- package/icons/bookmark/bookmark.vue +5 -5
- package/icons/bot.vue +52 -52
- package/icons/braces.vue +3 -3
- package/icons/briefcase.vue +14 -14
- package/icons/browsers/browser-duck.vue +65 -65
- package/icons/browsers/browser-google.vue +30 -30
- package/icons/browsers/browser-yandex.vue +13 -13
- package/icons/building-vector.vue +7 -7
- package/icons/building.vue +9 -9
- package/icons/calculator.vue +7 -7
- package/icons/calendar.vue +24 -24
- package/icons/car-side.vue +16 -16
- package/icons/car.vue +7 -7
- package/icons/cart.vue +15 -15
- package/icons/chart-bar.vue +5 -5
- package/icons/chart-no-axes-column.vue +3 -3
- package/icons/chart-pie.vue +16 -16
- package/icons/check/check-circle.vue +6 -6
- package/icons/check/check-outline.vue +3 -3
- package/icons/check/check-shield.vue +14 -14
- package/icons/check/check.vue +17 -17
- package/icons/check/checkmark-circle.vue +6 -6
- package/icons/check-sb.vue +7 -7
- package/icons/checkbox/checkbox-active.vue +17 -17
- package/icons/checkbox/checkbox-empty.vue +10 -10
- package/icons/checkbox/checkbox-intermediate.vue +7 -7
- package/icons/chevron/chevron-down-outline.vue +3 -3
- package/icons/chevron/chevron-down.vue +5 -5
- package/icons/chevron/chevron-left.vue +5 -5
- package/icons/chevron/chevron-right.vue +5 -5
- package/icons/chevron/chevron-up.vue +5 -5
- package/icons/chevron/double-chevron-right.vue +12 -12
- package/icons/clipboard-list.vue +3 -3
- package/icons/clipboard-text.vue +7 -7
- package/icons/clock-outline.vue +3 -3
- package/icons/clock-time.vue +24 -24
- package/icons/clock.vue +25 -25
- package/icons/close.vue +16 -16
- package/icons/cloud/cloud-upload.vue +3 -3
- package/icons/code.vue +9 -9
- package/icons/company/company-bazis.vue +21 -21
- package/icons/company/company-bereke.vue +25 -25
- package/icons/company/company-bigroup.vue +16 -16
- package/icons/company/company-erg.vue +17 -17
- package/icons/company/company-forte.vue +21 -21
- package/icons/company/company-halyk.vue +15 -15
- package/icons/company/company-jusan.vue +31 -31
- package/icons/company/company-kaspi.vue +14 -14
- package/icons/company/company-kazzinc.vue +22 -22
- package/icons/company/company-mycar.vue +13 -13
- package/icons/company/company-samruk.vue +21 -21
- package/icons/company-egov-small.vue +15 -15
- package/icons/company.vue +8 -8
- package/icons/compare-outlined.vue +8 -8
- package/icons/copy.vue +7 -7
- package/icons/crown.vue +6 -0
- package/icons/currency/currency-dollar.vue +16 -16
- package/icons/currency/currency-down.vue +22 -22
- package/icons/currency/currency-eur.vue +57 -57
- package/icons/currency/currency-rub.vue +7 -7
- package/icons/currency/currency-tenge.vue +9 -9
- package/icons/currency/currency-usd.vue +221 -221
- package/icons/currency/currency-yuan.vue +25 -25
- package/icons/database.vue +3 -3
- package/icons/default-avatar.vue +20 -20
- package/icons/delete.vue +7 -7
- package/icons/document.vue +5 -5
- package/icons/dots-horizontal.vue +31 -31
- package/icons/download-line.vue +13 -13
- package/icons/download-outline.vue +3 -3
- package/icons/download-rounded.vue +15 -15
- package/icons/download.vue +11 -11
- package/icons/edit.vue +7 -7
- package/icons/education.vue +16 -16
- package/icons/egov-small.vue +7 -7
- package/icons/egov.vue +41 -41
- package/icons/elicense.vue +38 -38
- package/icons/excel-icon.vue +14 -14
- package/icons/expand-window.vue +7 -7
- package/icons/eye-closed.vue +26 -26
- package/icons/eye-open.vue +7 -7
- package/icons/eye-opened.vue +23 -23
- package/icons/favourite-bookmark-outline.vue +17 -17
- package/icons/file/file-check-corner.vue +3 -3
- package/icons/file/file-spreadsheet.vue +3 -3
- package/icons/file/file.vue +16 -16
- package/icons/file/files.vue +16 -16
- package/icons/file-json.vue +3 -3
- package/icons/file-pen.vue +31 -31
- package/icons/file-search.vue +3 -3
- package/icons/file-stack.vue +31 -31
- package/icons/file-text.vue +3 -3
- package/icons/file-types/excel.vue +131 -131
- package/icons/file-types/html.vue +13 -13
- package/icons/file-types/jpeg.vue +16 -16
- package/icons/file-types/pdf.vue +11 -11
- package/icons/file-types/png.vue +11 -11
- package/icons/file-types/rar.vue +11 -11
- package/icons/file-types/word.vue +50 -50
- package/icons/file-types/zip.vue +11 -11
- package/icons/filter.vue +5 -5
- package/icons/flag.vue +7 -7
- package/icons/flask-conical.vue +3 -3
- package/icons/folder-open.vue +3 -3
- package/icons/gauge.vue +17 -17
- package/icons/gift-outline.vue +3 -3
- package/icons/gift.vue +8 -8
- package/icons/git-compare.vue +38 -38
- package/icons/git-fork.vue +3 -3
- package/icons/globe-2.vue +3 -3
- package/icons/globe.vue +16 -16
- package/icons/google.vue +41 -41
- package/icons/gradiend-icons/files-gradient.vue +22 -22
- package/icons/gradiend-icons/hammer-gradient.vue +62 -62
- package/icons/graduation-cap.vue +31 -31
- package/icons/graph-loading.vue +34 -34
- package/icons/graph-pie.vue +14 -14
- package/icons/hand/hand-thumb-up-filled.vue +5 -5
- package/icons/hand/hand-thumb-up.vue +5 -5
- package/icons/hand-with-phone/hand-with-phone-dark.vue +52 -52
- package/icons/hand-with-phone/hand-with-phone-light.vue +52 -52
- package/icons/handshake.vue +5 -5
- package/icons/hcheck.vue +14 -14
- package/icons/hdocument.vue +7 -7
- package/icons/headset.vue +6 -6
- package/icons/help-question-circle.vue +26 -26
- package/icons/history.vue +5 -5
- package/icons/home.vue +14 -14
- package/icons/horizontal-more.vue +13 -13
- package/icons/hot-line.vue +6 -6
- package/icons/hummer.vue +16 -16
- package/icons/id.vue +7 -7
- package/icons/in-row-type.vue +46 -46
- package/icons/in-table-type.vue +29 -29
- package/icons/info/info-circle.vue +29 -29
- package/icons/invoice.vue +8 -8
- package/icons/judge.vue +14 -14
- package/icons/kaspi-qr.vue +13 -13
- package/icons/key-round.vue +3 -3
- package/icons/landmark.vue +3 -3
- package/icons/layers.vue +3 -3
- package/icons/letter/letter-a.vue +8 -8
- package/icons/letter/letter-b.vue +6 -6
- package/icons/letter/letter-c.vue +6 -6
- package/icons/letter/letter-d.vue +6 -6
- package/icons/letter/letter-e.vue +6 -6
- package/icons/link-chain.vue +28 -28
- package/icons/link-url.vue +3 -3
- package/icons/link.vue +7 -7
- package/icons/linkedin.vue +24 -24
- package/icons/list-tree.vue +3 -3
- package/icons/loader-circle.vue +27 -27
- package/icons/location.vue +8 -8
- package/icons/lock.vue +5 -5
- package/icons/log-out.vue +21 -0
- package/icons/logo.vue +15 -15
- package/icons/logout.vue +16 -16
- package/icons/magnify/magnifying-glass-minus.vue +8 -8
- package/icons/magnify/magnifying-glass-plus.vue +9 -9
- package/icons/magnify/magnifying-glass.vue +9 -9
- package/icons/mail-question-mark.vue +8 -8
- package/icons/mail.vue +7 -7
- package/icons/mailru.vue +34 -34
- package/icons/main-filter.vue +10 -10
- package/icons/map/map-pin-filled.vue +7 -7
- package/icons/map/map-pin-rect.vue +15 -15
- package/icons/map/map-pin.vue +7 -7
- package/icons/map-marker-start.vue +7 -7
- package/icons/map-paper.vue +5 -5
- package/icons/medal.vue +7 -7
- package/icons/menu-filled.vue +20 -20
- package/icons/menu.vue +8 -8
- package/icons/message/message-square.vue +3 -3
- package/icons/message/message.vue +12 -12
- package/icons/message-dotted.vue +30 -30
- package/icons/messages-square.vue +3 -3
- package/icons/minus/minus-circle.vue +10 -10
- package/icons/money.vue +5 -5
- package/icons/monitoring.vue +10 -10
- package/icons/moon.vue +8 -8
- package/icons/more.vue +29 -29
- package/icons/network.vue +3 -3
- package/icons/newspaper.vue +3 -3
- package/icons/note-pencil.vue +14 -14
- package/icons/note.vue +14 -14
- package/icons/notification-error.vue +17 -17
- package/icons/notification.vue +16 -16
- package/icons/paperclip.vue +7 -7
- package/icons/payment/payment-card.vue +6 -6
- package/icons/payment/payment-kaspi.vue +11 -11
- package/icons/person-vector.vue +7 -7
- package/icons/person-with-briefcase.vue +10 -10
- package/icons/person.vue +22 -22
- package/icons/phone-call.vue +6 -6
- package/icons/phone-filled.vue +5 -5
- package/icons/phone-reversed.vue +3 -3
- package/icons/phone.vue +7 -7
- package/icons/plus/plus-circle.vue +8 -8
- package/icons/plus/plus.vue +13 -13
- package/icons/profile.vue +5 -5
- package/icons/radio/radio-check.vue +8 -8
- package/icons/radio/radio-empty.vue +10 -10
- package/icons/receipt.vue +8 -8
- package/icons/refresh-cw.vue +8 -0
- package/icons/robot-outline.vue +3 -3
- package/icons/robot.vue +14 -14
- package/icons/route.vue +7 -7
- package/icons/sanctions.vue +8 -8
- package/icons/scales/scale-outline.vue +3 -3
- package/icons/scales/scale.vue +16 -16
- package/icons/scales/scales.vue +5 -5
- package/icons/scales/standing-scales.vue +15 -15
- package/icons/scan-search.vue +3 -3
- package/icons/search-outline.vue +3 -3
- package/icons/search.vue +27 -27
- package/icons/send.vue +3 -3
- package/icons/settings.vue +26 -26
- package/icons/share/share-alt.vue +5 -5
- package/icons/share/share.vue +14 -14
- package/icons/shield-alert.vue +31 -31
- package/icons/shield-check.vue +20 -0
- package/icons/shield-verified.vue +14 -14
- package/icons/ship.vue +8 -8
- package/icons/socials/face-book.vue +15 -15
- package/icons/socials/facebook-color.vue +16 -16
- package/icons/socials/globe-color.vue +16 -16
- package/icons/socials/instagram-color.vue +46 -46
- package/icons/socials/instagram.vue +19 -19
- package/icons/socials/linkedin-color.vue +14 -14
- package/icons/socials/telegram-color.vue +16 -16
- package/icons/socials/telegram.vue +15 -15
- package/icons/socials/tik-tok.vue +15 -15
- package/icons/socials/tiktok-color.vue +14 -14
- package/icons/socials/vk-color.vue +16 -16
- package/icons/socials/youtube-color.vue +16 -16
- package/icons/socials/youtube.vue +16 -16
- package/icons/sort/sort-asc.vue +15 -15
- package/icons/sort/sort-desc.vue +15 -15
- package/icons/sparkles.vue +3 -3
- package/icons/splitting-arrows.vue +8 -8
- package/icons/star/star-filled.vue +41 -41
- package/icons/star/star-half-filled.vue +21 -21
- package/icons/star/star.vue +25 -25
- package/icons/sun.vue +25 -25
- package/icons/sviazi.vue +5 -5
- package/icons/tag.vue +30 -30
- package/icons/tasks.vue +10 -10
- package/icons/tender-search.vue +11 -11
- package/icons/terminal.vue +3 -3
- package/icons/toasts/check-circle-toast.vue +6 -6
- package/icons/toasts/warning-triangle-toast.vue +8 -8
- package/icons/trash.vue +13 -13
- package/icons/triangle-alert.vue +3 -3
- package/icons/triangle.vue +10 -10
- package/icons/truck.vue +7 -7
- package/icons/user-plus.vue +3 -3
- package/icons/user-square.vue +14 -14
- package/icons/user.vue +22 -22
- package/icons/users-focus.vue +8 -8
- package/icons/users-outline.vue +3 -3
- package/icons/users-round.vue +3 -3
- package/icons/users-three.vue +7 -7
- package/icons/users.vue +8 -8
- package/icons/view-eye-open.vue +13 -13
- package/icons/warning/warning-circle.vue +29 -29
- package/icons/warning/warning-triangle-filled.vue +12 -12
- package/icons/warning/warning-triangle.vue +28 -28
- package/icons/webhook.vue +3 -3
- package/icons/whatsapp.vue +8 -8
- package/icons/work-bag.vue +11 -11
- package/icons/work-case.vue +9 -9
- package/icons/work-search.vue +10 -10
- package/icons/work.vue +5 -5
- package/icons/workflow.vue +3 -3
- package/icons/x-mark.vue +15 -15
- package/icons/x-outline.vue +3 -3
- package/icons/yandex.vue +29 -29
- package/icons/zap.vue +3 -3
- package/illustrations/address-location.vue +38 -38
- package/illustrations/award-badge.vue +105 -105
- package/illustrations/ball-with-chain.vue +120 -120
- package/illustrations/bill.vue +133 -133
- package/illustrations/buildings.vue +82 -82
- package/illustrations/calendar.vue +156 -156
- package/illustrations/chains.vue +152 -152
- package/illustrations/coin-percent.vue +126 -126
- package/illustrations/coins-stack.vue +202 -202
- package/illustrations/delete-dark.vue +32 -32
- package/illustrations/delete.vue +33 -33
- package/illustrations/doc-with-stamp.vue +126 -126
- package/illustrations/document.vue +64 -64
- package/illustrations/door.vue +85 -85
- package/illustrations/empty-badge-check.vue +20 -20
- package/illustrations/empty-ban.vue +18 -18
- package/illustrations/empty-box.vue +77 -77
- package/illustrations/empty-filter.vue +20 -20
- package/illustrations/empty-inbox.vue +19 -19
- package/illustrations/empty-scale.vue +22 -22
- package/illustrations/empty-search-x.vue +21 -21
- package/illustrations/empty-shopping-cart.vue +21 -21
- package/illustrations/empty-users-round.vue +20 -20
- package/illustrations/empty-wallet.vue +127 -127
- package/illustrations/graph-in-coin.vue +119 -119
- package/illustrations/hammer.vue +156 -156
- package/illustrations/hand-cash.vue +108 -108
- package/illustrations/info.vue +52 -52
- package/illustrations/mail-active.vue +86 -86
- package/illustrations/mail.vue +68 -68
- package/illustrations/no-access.vue +92 -92
- package/illustrations/notes-search.vue +20 -20
- package/illustrations/notes-sticky.vue +20 -20
- package/illustrations/ok.vue +90 -90
- package/illustrations/people-group.vue +237 -237
- package/illustrations/person-with-phone.vue +187 -187
- package/illustrations/person.vue +159 -159
- package/illustrations/phone-check.vue +110 -110
- package/illustrations/phone-payment-method.vue +223 -223
- package/illustrations/scheme-notes.vue +21 -0
- package/illustrations/scheme-waypoints.vue +25 -0
- package/illustrations/search.vue +14 -14
- package/illustrations/shield-user.vue +94 -94
- package/illustrations/stop-hand.vue +84 -84
- package/illustrations/stop-sign.vue +34 -34
- package/illustrations/suit.vue +97 -97
- package/illustrations/suitcase.vue +105 -105
- package/illustrations/terminal.vue +100 -100
- package/illustrations/trash-can.vue +66 -66
- package/illustrations/turn-on-tariff.vue +38 -38
- package/illustrations/two-persons.vue +169 -169
- package/lang/en.ts +878 -878
- package/lang/kk.ts +880 -880
- package/lang/ru.ts +880 -880
- package/layouts/default.vue +13 -13
- package/nuxt.config.ts +95 -95
- package/package.json +64 -64
- package/plugins/maska.ts +4 -4
- package/plugins/toast.client.ts +41 -41
- package/public/kaspi/logo.svg +4 -4
- package/shared/constans/pages.ts +96 -96
- package/tsconfig.json +6 -6
- package/utils/getMaxZindex.ts +25 -25
- package/utils/localizedNavigation.ts +36 -36
- package/utils/toCssSize.ts +11 -0
- package/utils/twMerge.ts +34 -34
- package/vitest.config.ts +14 -14
- package/.claude/settings.local.json +0 -19
|
@@ -1,182 +1,182 @@
|
|
|
1
|
-
<script setup lang="ts" generic="T">
|
|
2
|
-
import { useElementHover } from '@vueuse/core'
|
|
3
|
-
import { computed, ref, watch } from 'vue'
|
|
4
|
-
|
|
5
|
-
interface Props {
|
|
6
|
-
/** Slides. The slider only uses their count and the current one. */
|
|
7
|
-
slides: readonly T[]
|
|
8
|
-
/** Time each slide stays active, in ms. Also the progress-bar duration. */
|
|
9
|
-
interval?: number
|
|
10
|
-
/** Advance automatically. */
|
|
11
|
-
autoplay?: boolean
|
|
12
|
-
/** Freeze autoplay while the cursor is over the slider. */
|
|
13
|
-
pauseOnHover?: boolean
|
|
14
|
-
/** Render the built-in progress indicators. */
|
|
15
|
-
indicators?: boolean
|
|
16
|
-
/**
|
|
17
|
-
* CSS transition name for the built-in slide swap, e.g. `"fade"`.
|
|
18
|
-
* The slider only passes the name through to `<transition>` — the CSS
|
|
19
|
-
* itself stays with the slide. Without it slides swap instantly.
|
|
20
|
-
* Ignored when the default slot is used: taking over the rendering means
|
|
21
|
-
* taking over the transition too.
|
|
22
|
-
*/
|
|
23
|
-
transition?: string
|
|
24
|
-
/** Transition mode, as on Vue's `<transition>`. */
|
|
25
|
-
transitionMode?: 'out-in' | 'in-out' | 'default'
|
|
26
|
-
/** Explicit transition duration in ms, as on Vue's `<transition>`. */
|
|
27
|
-
transitionDuration?: number | { enter: number, leave: number }
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const props = withDefaults(defineProps<Props>(), {
|
|
31
|
-
interval: 5000,
|
|
32
|
-
autoplay: true,
|
|
33
|
-
pauseOnHover: true,
|
|
34
|
-
indicators: true,
|
|
35
|
-
transition: undefined,
|
|
36
|
-
transitionMode: 'out-in',
|
|
37
|
-
transitionDuration: undefined,
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
/** Active slide index — usable as `v-model:index`. */
|
|
41
|
-
const index = defineModel<number>('index', { default: 0 })
|
|
42
|
-
|
|
43
|
-
const root = ref<HTMLElement>()
|
|
44
|
-
const count = computed(() => props.slides.length)
|
|
45
|
-
|
|
46
|
-
/* ---- navigation (always wraps around) ---- */
|
|
47
|
-
function goTo(to: number) {
|
|
48
|
-
if (count.value === 0)
|
|
49
|
-
return
|
|
50
|
-
index.value = ((to % count.value) + count.value) % count.value
|
|
51
|
-
}
|
|
52
|
-
function next() {
|
|
53
|
-
goTo(index.value + 1)
|
|
54
|
-
}
|
|
55
|
-
function prev() {
|
|
56
|
-
goTo(index.value - 1)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/* ---- autoplay ----
|
|
60
|
-
* Timing is driven by an invisible "clock" element's CSS animation.
|
|
61
|
-
* `animation-play-state: paused` freezes both the clock and the visible
|
|
62
|
-
* progress bar in one place, so the pause stays perfectly in sync and
|
|
63
|
-
* resumes from where it stopped — no JS timers to keep aligned. */
|
|
64
|
-
|
|
65
|
-
// Bumping this key remounts the clock/progress element, restarting the timing.
|
|
66
|
-
// Watched rather than bumped inside `goTo`, so writing to `v-model:index`
|
|
67
|
-
// from the outside restarts the timing too.
|
|
68
|
-
const tick = ref(0)
|
|
69
|
-
watch(index, () => {
|
|
70
|
-
tick.value++
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
// The slide list may have shrunk under the current index.
|
|
74
|
-
watch(count, (n) => {
|
|
75
|
-
if (index.value >= n)
|
|
76
|
-
goTo(0)
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
const hovered = useElementHover(root)
|
|
80
|
-
|
|
81
|
-
const running = computed(() => props.autoplay && count.value > 1)
|
|
82
|
-
const timingStyle = computed(() => ({
|
|
83
|
-
animationDuration: `${props.interval}ms`,
|
|
84
|
-
animationPlayState: props.pauseOnHover && hovered.value ? 'paused' : 'running',
|
|
85
|
-
}))
|
|
86
|
-
|
|
87
|
-
defineExpose({ next, prev, goTo })
|
|
88
|
-
</script>
|
|
89
|
-
|
|
90
|
-
<template>
|
|
91
|
-
<div
|
|
92
|
-
ref="root"
|
|
93
|
-
class="relative overflow-hidden"
|
|
94
|
-
role="group"
|
|
95
|
-
aria-roledescription="carousel"
|
|
96
|
-
>
|
|
97
|
-
<!-- Invisible clock: fires `next` when a slide's time elapses. -->
|
|
98
|
-
<div
|
|
99
|
-
v-if="running"
|
|
100
|
-
:key="tick"
|
|
101
|
-
class="a-slider-clock"
|
|
102
|
-
:style="timingStyle"
|
|
103
|
-
@animationend="next"
|
|
104
|
-
/>
|
|
105
|
-
|
|
106
|
-
<!-- Rendered once, for the active slide. Markup and animations are the
|
|
107
|
-
consumer's job — the slider only says which slide is active.
|
|
108
|
-
Without a slot the slider still works on its own: it renders the
|
|
109
|
-
active slide as-is, optionally wrapped in a named transition. -->
|
|
110
|
-
<slot
|
|
111
|
-
v-if="$slots.default"
|
|
112
|
-
:slide="slides[index]"
|
|
113
|
-
:index="index"
|
|
114
|
-
:count="count"
|
|
115
|
-
:go-to="goTo"
|
|
116
|
-
/>
|
|
117
|
-
|
|
118
|
-
<!-- БЕЗ `appear` — это принципиально. Под SSR `<transition appear>`
|
|
119
|
-
сериализует содержимое в литеральный `<template>`: браузер такой узел
|
|
120
|
-
не рендерит, слайдер стоит пустым до гидратации, а сама гидратация
|
|
121
|
-
падает с mismatch (проверено на Nuxt 3.18 / Vue 3.5).
|
|
122
|
-
Вход первого слайда всё равно задаётся обычной CSS-анимацией на
|
|
123
|
-
монтировании — `appear` при SSR-гидратации Vue и так не проигрывает. -->
|
|
124
|
-
<transition
|
|
125
|
-
v-else-if="transition && slides[index]"
|
|
126
|
-
:name="transition"
|
|
127
|
-
:mode="transitionMode"
|
|
128
|
-
:duration="transitionDuration"
|
|
129
|
-
>
|
|
130
|
-
<component :is="slides[index]" :key="index" />
|
|
131
|
-
</transition>
|
|
132
|
-
|
|
133
|
-
<component
|
|
134
|
-
:is="slides[index]"
|
|
135
|
-
v-else-if="slides[index]"
|
|
136
|
-
:key="index"
|
|
137
|
-
/>
|
|
138
|
-
|
|
139
|
-
<div
|
|
140
|
-
v-if="indicators && count > 1"
|
|
141
|
-
class="absolute bottom-0 left-1/2 z-10 flex -translate-x-1/2 gap-2"
|
|
142
|
-
>
|
|
143
|
-
<!-- пастельный бренд-трек: семантического токена нет, dark-компенсация вручную -->
|
|
144
|
-
<button
|
|
145
|
-
v-for="(_, i) in count"
|
|
146
|
-
:key="i"
|
|
147
|
-
type="button"
|
|
148
|
-
:aria-label="`Слайд ${i + 1}`"
|
|
149
|
-
:aria-current="index === i"
|
|
150
|
-
class="relative h-[6px] cursor-pointer overflow-hidden rounded-full bg-brand-200 transition-all duration-300 dark:bg-brand-500/30"
|
|
151
|
-
:class="index === i ? 'w-[30px]' : 'w-[20px]'"
|
|
152
|
-
@click="goTo(i)"
|
|
153
|
-
>
|
|
154
|
-
<span
|
|
155
|
-
v-if="index === i && running"
|
|
156
|
-
:key="tick"
|
|
157
|
-
class="a-slider-progress absolute inset-0 rounded-full bg-brand"
|
|
158
|
-
:style="timingStyle"
|
|
159
|
-
/>
|
|
160
|
-
</button>
|
|
161
|
-
</div>
|
|
162
|
-
</div>
|
|
163
|
-
</template>
|
|
164
|
-
|
|
165
|
-
<style scoped>
|
|
166
|
-
.a-slider-clock {
|
|
167
|
-
position: absolute;
|
|
168
|
-
height: 1px;
|
|
169
|
-
opacity: 0;
|
|
170
|
-
pointer-events: none;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
.a-slider-clock,
|
|
174
|
-
.a-slider-progress {
|
|
175
|
-
animation: a-slider-run linear forwards;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
@keyframes a-slider-run {
|
|
179
|
-
from { width: 0; }
|
|
180
|
-
to { width: 100%; }
|
|
181
|
-
}
|
|
182
|
-
</style>
|
|
1
|
+
<script setup lang="ts" generic="T">
|
|
2
|
+
import { useElementHover } from '@vueuse/core'
|
|
3
|
+
import { computed, ref, watch } from 'vue'
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
/** Slides. The slider only uses their count and the current one. */
|
|
7
|
+
slides: readonly T[]
|
|
8
|
+
/** Time each slide stays active, in ms. Also the progress-bar duration. */
|
|
9
|
+
interval?: number
|
|
10
|
+
/** Advance automatically. */
|
|
11
|
+
autoplay?: boolean
|
|
12
|
+
/** Freeze autoplay while the cursor is over the slider. */
|
|
13
|
+
pauseOnHover?: boolean
|
|
14
|
+
/** Render the built-in progress indicators. */
|
|
15
|
+
indicators?: boolean
|
|
16
|
+
/**
|
|
17
|
+
* CSS transition name for the built-in slide swap, e.g. `"fade"`.
|
|
18
|
+
* The slider only passes the name through to `<transition>` — the CSS
|
|
19
|
+
* itself stays with the slide. Without it slides swap instantly.
|
|
20
|
+
* Ignored when the default slot is used: taking over the rendering means
|
|
21
|
+
* taking over the transition too.
|
|
22
|
+
*/
|
|
23
|
+
transition?: string
|
|
24
|
+
/** Transition mode, as on Vue's `<transition>`. */
|
|
25
|
+
transitionMode?: 'out-in' | 'in-out' | 'default'
|
|
26
|
+
/** Explicit transition duration in ms, as on Vue's `<transition>`. */
|
|
27
|
+
transitionDuration?: number | { enter: number, leave: number }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
31
|
+
interval: 5000,
|
|
32
|
+
autoplay: true,
|
|
33
|
+
pauseOnHover: true,
|
|
34
|
+
indicators: true,
|
|
35
|
+
transition: undefined,
|
|
36
|
+
transitionMode: 'out-in',
|
|
37
|
+
transitionDuration: undefined,
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
/** Active slide index — usable as `v-model:index`. */
|
|
41
|
+
const index = defineModel<number>('index', { default: 0 })
|
|
42
|
+
|
|
43
|
+
const root = ref<HTMLElement>()
|
|
44
|
+
const count = computed(() => props.slides.length)
|
|
45
|
+
|
|
46
|
+
/* ---- navigation (always wraps around) ---- */
|
|
47
|
+
function goTo(to: number) {
|
|
48
|
+
if (count.value === 0)
|
|
49
|
+
return
|
|
50
|
+
index.value = ((to % count.value) + count.value) % count.value
|
|
51
|
+
}
|
|
52
|
+
function next() {
|
|
53
|
+
goTo(index.value + 1)
|
|
54
|
+
}
|
|
55
|
+
function prev() {
|
|
56
|
+
goTo(index.value - 1)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* ---- autoplay ----
|
|
60
|
+
* Timing is driven by an invisible "clock" element's CSS animation.
|
|
61
|
+
* `animation-play-state: paused` freezes both the clock and the visible
|
|
62
|
+
* progress bar in one place, so the pause stays perfectly in sync and
|
|
63
|
+
* resumes from where it stopped — no JS timers to keep aligned. */
|
|
64
|
+
|
|
65
|
+
// Bumping this key remounts the clock/progress element, restarting the timing.
|
|
66
|
+
// Watched rather than bumped inside `goTo`, so writing to `v-model:index`
|
|
67
|
+
// from the outside restarts the timing too.
|
|
68
|
+
const tick = ref(0)
|
|
69
|
+
watch(index, () => {
|
|
70
|
+
tick.value++
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
// The slide list may have shrunk under the current index.
|
|
74
|
+
watch(count, (n) => {
|
|
75
|
+
if (index.value >= n)
|
|
76
|
+
goTo(0)
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
const hovered = useElementHover(root)
|
|
80
|
+
|
|
81
|
+
const running = computed(() => props.autoplay && count.value > 1)
|
|
82
|
+
const timingStyle = computed(() => ({
|
|
83
|
+
animationDuration: `${props.interval}ms`,
|
|
84
|
+
animationPlayState: props.pauseOnHover && hovered.value ? 'paused' : 'running',
|
|
85
|
+
}))
|
|
86
|
+
|
|
87
|
+
defineExpose({ next, prev, goTo })
|
|
88
|
+
</script>
|
|
89
|
+
|
|
90
|
+
<template>
|
|
91
|
+
<div
|
|
92
|
+
ref="root"
|
|
93
|
+
class="relative overflow-hidden"
|
|
94
|
+
role="group"
|
|
95
|
+
aria-roledescription="carousel"
|
|
96
|
+
>
|
|
97
|
+
<!-- Invisible clock: fires `next` when a slide's time elapses. -->
|
|
98
|
+
<div
|
|
99
|
+
v-if="running"
|
|
100
|
+
:key="tick"
|
|
101
|
+
class="a-slider-clock"
|
|
102
|
+
:style="timingStyle"
|
|
103
|
+
@animationend="next"
|
|
104
|
+
/>
|
|
105
|
+
|
|
106
|
+
<!-- Rendered once, for the active slide. Markup and animations are the
|
|
107
|
+
consumer's job — the slider only says which slide is active.
|
|
108
|
+
Without a slot the slider still works on its own: it renders the
|
|
109
|
+
active slide as-is, optionally wrapped in a named transition. -->
|
|
110
|
+
<slot
|
|
111
|
+
v-if="$slots.default"
|
|
112
|
+
:slide="slides[index]"
|
|
113
|
+
:index="index"
|
|
114
|
+
:count="count"
|
|
115
|
+
:go-to="goTo"
|
|
116
|
+
/>
|
|
117
|
+
|
|
118
|
+
<!-- БЕЗ `appear` — это принципиально. Под SSR `<transition appear>`
|
|
119
|
+
сериализует содержимое в литеральный `<template>`: браузер такой узел
|
|
120
|
+
не рендерит, слайдер стоит пустым до гидратации, а сама гидратация
|
|
121
|
+
падает с mismatch (проверено на Nuxt 3.18 / Vue 3.5).
|
|
122
|
+
Вход первого слайда всё равно задаётся обычной CSS-анимацией на
|
|
123
|
+
монтировании — `appear` при SSR-гидратации Vue и так не проигрывает. -->
|
|
124
|
+
<transition
|
|
125
|
+
v-else-if="transition && slides[index]"
|
|
126
|
+
:name="transition"
|
|
127
|
+
:mode="transitionMode"
|
|
128
|
+
:duration="transitionDuration"
|
|
129
|
+
>
|
|
130
|
+
<component :is="slides[index]" :key="index" />
|
|
131
|
+
</transition>
|
|
132
|
+
|
|
133
|
+
<component
|
|
134
|
+
:is="slides[index]"
|
|
135
|
+
v-else-if="slides[index]"
|
|
136
|
+
:key="index"
|
|
137
|
+
/>
|
|
138
|
+
|
|
139
|
+
<div
|
|
140
|
+
v-if="indicators && count > 1"
|
|
141
|
+
class="absolute bottom-0 left-1/2 z-10 flex -translate-x-1/2 gap-2"
|
|
142
|
+
>
|
|
143
|
+
<!-- пастельный бренд-трек: семантического токена нет, dark-компенсация вручную -->
|
|
144
|
+
<button
|
|
145
|
+
v-for="(_, i) in count"
|
|
146
|
+
:key="i"
|
|
147
|
+
type="button"
|
|
148
|
+
:aria-label="`Слайд ${i + 1}`"
|
|
149
|
+
:aria-current="index === i"
|
|
150
|
+
class="relative h-[6px] cursor-pointer overflow-hidden rounded-full bg-brand-200 transition-all duration-300 dark:bg-brand-500/30"
|
|
151
|
+
:class="index === i ? 'w-[30px]' : 'w-[20px]'"
|
|
152
|
+
@click="goTo(i)"
|
|
153
|
+
>
|
|
154
|
+
<span
|
|
155
|
+
v-if="index === i && running"
|
|
156
|
+
:key="tick"
|
|
157
|
+
class="a-slider-progress absolute inset-0 rounded-full bg-brand"
|
|
158
|
+
:style="timingStyle"
|
|
159
|
+
/>
|
|
160
|
+
</button>
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
</template>
|
|
164
|
+
|
|
165
|
+
<style scoped>
|
|
166
|
+
.a-slider-clock {
|
|
167
|
+
position: absolute;
|
|
168
|
+
height: 1px;
|
|
169
|
+
opacity: 0;
|
|
170
|
+
pointer-events: none;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.a-slider-clock,
|
|
174
|
+
.a-slider-progress {
|
|
175
|
+
animation: a-slider-run linear forwards;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
@keyframes a-slider-run {
|
|
179
|
+
from { width: 0; }
|
|
180
|
+
to { width: 100%; }
|
|
181
|
+
}
|
|
182
|
+
</style>
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import type { ComputedRef, InjectionKey, Ref } from 'vue'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Context provided by <ASlider> and consumed by <ASliderItem>.
|
|
5
|
-
* The slider owns the mechanism (active index, count, direction);
|
|
6
|
-
* items only read from it and render their own animations.
|
|
7
|
-
*/
|
|
8
|
-
export interface SliderContext {
|
|
9
|
-
/** Index of the currently active slide. */
|
|
10
|
-
index: Readonly<Ref<number>>
|
|
11
|
-
/** Total number of registered slides. */
|
|
12
|
-
count: Readonly<Ref<number>>
|
|
13
|
-
/** Direction of the last transition: 1 = forward, -1 = backward. */
|
|
14
|
-
direction: Readonly<Ref<1 | -1>>
|
|
15
|
-
/** Register an item and get back its live index. */
|
|
16
|
-
register: (id: symbol) => ComputedRef<number>
|
|
17
|
-
/** Unregister an item on unmount. */
|
|
18
|
-
unregister: (id: symbol) => void
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export const SLIDER_CONTEXT: InjectionKey<SliderContext> = Symbol('a-slider')
|
|
1
|
+
import type { ComputedRef, InjectionKey, Ref } from 'vue'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Context provided by <ASlider> and consumed by <ASliderItem>.
|
|
5
|
+
* The slider owns the mechanism (active index, count, direction);
|
|
6
|
+
* items only read from it and render their own animations.
|
|
7
|
+
*/
|
|
8
|
+
export interface SliderContext {
|
|
9
|
+
/** Index of the currently active slide. */
|
|
10
|
+
index: Readonly<Ref<number>>
|
|
11
|
+
/** Total number of registered slides. */
|
|
12
|
+
count: Readonly<Ref<number>>
|
|
13
|
+
/** Direction of the last transition: 1 = forward, -1 = backward. */
|
|
14
|
+
direction: Readonly<Ref<1 | -1>>
|
|
15
|
+
/** Register an item and get back its live index. */
|
|
16
|
+
register: (id: symbol) => ComputedRef<number>
|
|
17
|
+
/** Unregister an item on unmount. */
|
|
18
|
+
unregister: (id: symbol) => void
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const SLIDER_CONTEXT: InjectionKey<SliderContext> = Symbol('a-slider')
|