@sberbusiness/triplex-next 0.51.0 → 0.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/chunks/{AlertProcessSpoiler-Ctx-2wgy.js → AlertProcessSpoiler-STpCfJuF.js} +16 -16
- package/chunks/{AlertProcessSpoiler-Ctx-2wgy.js.map → AlertProcessSpoiler-STpCfJuF.js.map} +1 -1
- package/chunks/{CalendarViewItem-CvdMWlYm.js → CalendarViewItem-BDetBtIJ.js} +20 -20
- package/chunks/{CalendarViewItem-CvdMWlYm.js.map → CalendarViewItem-BDetBtIJ.js.map} +1 -1
- package/chunks/Card.module-BDKegNQB.js +32 -0
- package/chunks/Card.module-BDKegNQB.js.map +1 -0
- package/chunks/Carousel.module-ugT1KfWo.js +26 -0
- package/chunks/Carousel.module-ugT1KfWo.js.map +1 -0
- package/chunks/CheckboxTreeExtended.module-DIkMbiFc.js +24 -0
- package/chunks/CheckboxTreeExtended.module-DIkMbiFc.js.map +1 -0
- package/chunks/{Chip-SVIdZjNC.js → Chip-DOtRbYR5.js} +16 -16
- package/chunks/{Chip-SVIdZjNC.js.map → Chip-DOtRbYR5.js.map} +1 -1
- package/chunks/Confirm.module-Bd5pQ3Lp.js +24 -0
- package/chunks/Confirm.module-Bd5pQ3Lp.js.map +1 -0
- package/chunks/{DropdownListItem-DbG8a_Rw.js → DropdownListItem-DtBDNMDu.js} +10 -10
- package/chunks/{DropdownListItem-DbG8a_Rw.js.map → DropdownListItem-DtBDNMDu.js.map} +1 -1
- package/chunks/Footer.module-D6LiswG5.js +12 -0
- package/chunks/Footer.module-D6LiswG5.js.map +1 -0
- package/chunks/{HeaderLayoutSidebar.module-BvCPxkNk.js → HeaderLayoutSidebar.module-DvuWrb8r.js} +4 -4
- package/chunks/HeaderLayoutSidebar.module-DvuWrb8r.js.map +1 -0
- package/chunks/HeaderTabs.module-49s0no12.js +12 -0
- package/chunks/HeaderTabs.module-49s0no12.js.map +1 -0
- package/chunks/{HeaderTitle.module-gbla84yG.js → HeaderTitle.module-BoICKOHo.js} +4 -4
- package/chunks/HeaderTitle.module-BoICKOHo.js.map +1 -0
- package/chunks/ImageGalleryExtendedMain.module-CJbkuDsY.js +28 -0
- package/chunks/ImageGalleryExtendedMain.module-CJbkuDsY.js.map +1 -0
- package/chunks/{ImageGalleryExtendedThumb-eZ1U9hun.js → ImageGalleryExtendedThumb-DaYWIal7.js} +5 -5
- package/chunks/{ImageGalleryExtendedThumb-eZ1U9hun.js.map → ImageGalleryExtendedThumb-DaYWIal7.js.map} +1 -1
- package/chunks/IslandAccordion.module-DulT1VwH.js +44 -0
- package/chunks/IslandAccordion.module-DulT1VwH.js.map +1 -0
- package/chunks/IslandWidgetFooter.module-DTifP3wy.js +18 -0
- package/chunks/IslandWidgetFooter.module-DTifP3wy.js.map +1 -0
- package/chunks/IslandWidgetHeader.module-E-Y7Ydgr.js +28 -0
- package/chunks/IslandWidgetHeader.module-E-Y7Ydgr.js.map +1 -0
- package/chunks/{LightBoxContent-CWtp-PJm.js → LightBoxContent-Cb1g3JDX.js} +16 -16
- package/chunks/{LightBoxContent-CWtp-PJm.js.map → LightBoxContent-Cb1g3JDX.js.map} +1 -1
- package/chunks/LightBoxControls.module-CKff0gTS.js +26 -0
- package/chunks/LightBoxControls.module-CKff0gTS.js.map +1 -0
- package/chunks/{LightBoxSideOverlayClose.module-Bu0mbQ2E.js → LightBoxSideOverlayClose.module-DWKvzJvF.js} +4 -4
- package/chunks/LightBoxSideOverlayClose.module-DWKvzJvF.js.map +1 -0
- package/chunks/{ListItemControlsButton-EF-ovU6G.js → ListItemControlsButton-CTZwACLC.js} +9 -9
- package/chunks/{ListItemControlsButton-EF-ovU6G.js.map → ListItemControlsButton-CTZwACLC.js.map} +1 -1
- package/chunks/ListItemTail.module-Dj4lU9aU.js +18 -0
- package/chunks/ListItemTail.module-Dj4lU9aU.js.map +1 -0
- package/chunks/ListMasterFooter.module-MxUcjmi_.js +14 -0
- package/chunks/ListMasterFooter.module-MxUcjmi_.js.map +1 -0
- package/chunks/ModalWindow.module-DACUI-Ug.js +28 -0
- package/chunks/ModalWindow.module-DACUI-Ug.js.map +1 -0
- package/chunks/Notification.module-DvJpk7mJ.js +34 -0
- package/chunks/Notification.module-DvJpk7mJ.js.map +1 -0
- package/chunks/Overlay.module-BUiSNz4S.js +30 -0
- package/chunks/Overlay.module-BUiSNz4S.js.map +1 -0
- package/chunks/Page.module-BcGCfrAq.js +17 -0
- package/chunks/Page.module-BcGCfrAq.js.map +1 -0
- package/chunks/Puller.module-D99aZDfb.js +38 -0
- package/chunks/Puller.module-D99aZDfb.js.map +1 -0
- package/chunks/SMSField.module-DsssNQ7k.js +30 -0
- package/chunks/SMSField.module-DsssNQ7k.js.map +1 -0
- package/chunks/SliderExtendedMarks.module-DqaV_gtD.js +24 -0
- package/chunks/SliderExtendedMarks.module-DqaV_gtD.js.map +1 -0
- package/chunks/{SliderExtendedRail-BLBXp_mr.js → SliderExtendedRail-C9_AzU7r.js} +5 -5
- package/chunks/{SliderExtendedRail-BLBXp_mr.js.map → SliderExtendedRail-C9_AzU7r.js.map} +1 -1
- package/chunks/StatusTracker.module-BlqC0dZw.js +44 -0
- package/chunks/StatusTracker.module-BlqC0dZw.js.map +1 -0
- package/chunks/{StepperStepArrowBorder-BAh7ttCH.js → StepperStepArrowBorder-DxBecxv9.js} +16 -16
- package/chunks/{StepperStepArrowBorder-BAh7ttCH.js.map → StepperStepArrowBorder-DxBecxv9.js.map} +1 -1
- package/chunks/{SuggestFieldMobileDropdownHint-Dwl6zzq8.js → SuggestFieldMobileDropdownHint-MIGePHD9.js} +3 -3
- package/chunks/{SuggestFieldMobileDropdownHint-Dwl6zzq8.js.map → SuggestFieldMobileDropdownHint-MIGePHD9.js.map} +1 -1
- package/chunks/TableFooter.module-CtnIdZfR.js +22 -0
- package/chunks/TableFooter.module-CtnIdZfR.js.map +1 -0
- package/chunks/TabsExtended.module-CUIB5d3J.js +26 -0
- package/chunks/TabsExtended.module-CUIB5d3J.js.map +1 -0
- package/chunks/TabsLine.module-eEenlMUm.js +36 -0
- package/chunks/TabsLine.module-eEenlMUm.js.map +1 -0
- package/chunks/TooltipDesktop.module-DItC194g.js +32 -0
- package/chunks/TooltipDesktop.module-DItC194g.js.map +1 -0
- package/chunks/TreeView.module-D7TFEY8e.js +12 -0
- package/chunks/TreeView.module-D7TFEY8e.js.map +1 -0
- package/chunks/{UploadZoneInput-dlRcClcR.js → UploadZoneInput-CEMLfPD2.js} +5 -5
- package/chunks/{UploadZoneInput-dlRcClcR.js.map → UploadZoneInput-CEMLfPD2.js.map} +1 -1
- package/chunks/{constants-D9y0PXCn.js → constants-C_cUBgTm.js} +27 -27
- package/chunks/{constants-D9y0PXCn.js.map → constants-C_cUBgTm.js.map} +1 -1
- package/chunks/{utils-C5ANP-lJ.js → utils-CR7AKWB9.js} +6 -6
- package/chunks/{utils-C5ANP-lJ.js.map → utils-CR7AKWB9.js.map} +1 -1
- package/chunks/{utils-EB3nf6Gq.js → utils-CjT9HwBp.js} +10 -10
- package/chunks/{utils-EB3nf6Gq.js.map → utils-CjT9HwBp.js.map} +1 -1
- package/chunks/{utils-TRZEn9vv.js → utils-CrdZr25q.js} +27 -27
- package/chunks/{utils-TRZEn9vv.js.map → utils-CrdZr25q.js.map} +1 -1
- package/chunks/{utils-NWb0RM-6.js → utils-CuHxUheL.js} +11 -11
- package/chunks/{utils-NWb0RM-6.js.map → utils-CuHxUheL.js.map} +1 -1
- package/components/Alert/AlertContext/AlertContext.js +7 -7
- package/components/Alert/AlertProcess/AlertProcess.js +2 -2
- package/components/Alert/AlertProcess/components/AlertProcessSpoiler.js +1 -1
- package/components/Amount/Amount.js +2 -2
- package/components/AmountField/AmountField.js +8 -8
- package/components/Avatar/Avatar.js +13 -13
- package/components/Badge/Badge.js +4 -4
- package/components/Badge/BadgeDot.js +4 -4
- package/components/Badge/components/BadgeContent.js +6 -6
- package/components/Badge/components/BadgePostfix.js +1 -1
- package/components/Badge/components/BadgePrefix.js +1 -1
- package/components/Body/Body.js +3 -3
- package/components/Button/Button.js +20 -20
- package/components/Button/ButtonBase.js +1 -1
- package/components/Button/ButtonDropdown.js +22 -28
- package/components/Button/ButtonDropdown.js.map +1 -1
- package/components/Button/ButtonDropdownExtended.js +2 -2
- package/components/Button/ButtonIcon.js +3 -3
- package/components/Calendar/Calendar.js +4 -4
- package/components/Calendar/components/CalendarControls.js +1 -1
- package/components/Calendar/components/CalendarFooter.js +1 -1
- package/components/Calendar/components/CalendarViewDays.js +1 -1
- package/components/Calendar/components/CalendarViewItem.js +1 -1
- package/components/Calendar/components/CalendarViewMonths.js +1 -1
- package/components/Calendar/components/CalendarViewYears.js +1 -1
- package/components/Card/CardAction.js +5 -5
- package/components/Card/CardStatic.js +2 -2
- package/components/Card/components/CardContent/CardContent.js +1 -1
- package/components/Card/components/CardContent/components/CardContentBody.js +1 -1
- package/components/Card/components/CardContent/components/CardContentFooter.js +1 -1
- package/components/Card/components/CardContent/components/CardContentHeader.js +1 -1
- package/components/Card/components/CardMedia.js +1 -1
- package/components/Card/utils.js +1 -1
- package/components/Carousel/Carousel.js +10 -6
- package/components/Carousel/Carousel.js.map +1 -1
- package/components/Carousel/CarouselButton.js +40 -35
- package/components/Carousel/CarouselButton.js.map +1 -1
- package/components/Carousel/CarouselIndicators.js +1 -1
- package/components/Carousel/CarouselItem.js +2 -2
- package/components/Carousel/CarouselItem.js.map +1 -1
- package/components/Carousel/CarouselTrack.js +1 -1
- package/components/Carousel/CarouselViewport.js +75 -105
- package/components/Carousel/CarouselViewport.js.map +1 -1
- package/components/CarouselExtended/CarouselExtended.js +1 -1
- package/components/Checkbox/Checkbox.js +10 -10
- package/components/Checkbox/CheckboxXGroup.js +8 -8
- package/components/Checkbox/CheckboxYGroup.js +1 -1
- package/components/CheckboxTreeExtended/CheckboxTreeExtended.js +1 -1
- package/components/CheckboxTreeExtended/components/CheckboxTreeExtendedArrow.js +1 -1
- package/components/CheckboxTreeExtended/components/CheckboxTreeExtendedCheckbox.js +1 -1
- package/components/CheckboxTreeExtended/components/CheckboxTreeExtendedNode.js +1 -1
- package/components/Chip/Chip.js +1 -1
- package/components/Chip/ChipClearButton.js +1 -1
- package/components/Chip/ChipDatePicker/ChipDatePicker.js +5 -5
- package/components/Chip/ChipDatePicker/ChipDatePicker.js.map +1 -1
- package/components/Chip/ChipDatePicker/ChipDatePickerTarget.js +1 -1
- package/components/Chip/ChipDatePicker/ChipDatePickerTarget.js.map +1 -1
- package/components/Chip/ChipDropdownArrow.js +2 -2
- package/components/Chip/ChipIcon.js +1 -1
- package/components/Chip/ChipMonthYearPicker/ChipMonthYearPicker.js +1 -1
- package/components/Chip/ChipMonthYearPicker/ChipMonthYearPickerTarget.js +1 -1
- package/components/Chip/ChipMultiselect.js +1 -1
- package/components/Chip/ChipOptions.js +2 -2
- package/components/Chip/ChipSelect/ChipSelect.js +1 -1
- package/components/Chip/ChipSelect/ChipSelect.js.map +1 -1
- package/components/Chip/ChipSelect/ChipSelectTarget.js +1 -1
- package/components/Chip/ChipSort.js +1 -1
- package/components/Chip/ChipSuggest/ChipSuggest.js +1 -1
- package/components/Chip/ChipSuggest/ChipSuggestDropdown.js +2 -13
- package/components/Chip/ChipSuggest/ChipSuggestDropdown.js.map +1 -1
- package/components/Chip/ChipSuggest/ChipSuggestTarget.js +1 -1
- package/components/Chip/ChipSuggest/desktop/ChipSuggestDesktopDropdownField.js +1 -1
- package/components/Chip/index.js +1 -1
- package/components/ChipGroup/ChipGroup.js +7 -7
- package/components/Col/Col.js +132 -132
- package/components/CollapsibleTree/CollapsibleTree.js +1 -1
- package/components/CollapsibleTree/components/CollapsibleTreeLeafContent.js +1 -1
- package/components/CollapsibleTree/components/CollapsibleTreeLeafNode.js +1 -1
- package/components/CollapsibleTree/components/CollapsibleTreeNodeHeader.js +4 -4
- package/components/CollapsibleTreeExtended/components/CollapsibleTreeExtendedNode.js +1 -1
- package/components/Confirm/Confirm.js +1 -1
- package/components/Confirm/components/ConfirmCloseButton.js +1 -1
- package/components/Confirm/components/ConfirmContent.js +1 -1
- package/components/Confirm/components/ConfirmContentTitle.js +1 -1
- package/components/Confirm/components/ConfirmControls.js +1 -1
- package/components/DateField/DateField.js +3 -3
- package/components/DateField/DateField.js.map +1 -1
- package/components/DateField/DateFieldTarget.js +4 -4
- package/components/DatePickerExtended/DatePickerExtended.js +3 -14
- package/components/DatePickerExtended/DatePickerExtended.js.map +1 -1
- package/components/DatePickerExtended/DatePickerExtendedDropdown.js +13 -13
- package/components/DatePickerExtended/DatePickerExtendedDropdown.js.map +1 -1
- package/components/DateRange/DateRange.js +20 -16
- package/components/DateRange/DateRange.js.map +1 -1
- package/components/DateRange/utils.js +10 -3
- package/components/DateRange/utils.js.map +1 -1
- package/components/DesignTokens/DesignTokenUtils.js +1 -1
- package/components/DesignTokens/DesignTokensComponents.js +9 -10
- package/components/DesignTokens/DesignTokensComponents.js.map +1 -1
- package/components/DesignTokens/DesignTokensComponentsThemeDark.js +9 -10
- package/components/DesignTokens/DesignTokensComponentsThemeDark.js.map +1 -1
- package/components/DesignTokens/components/Puller.js +24 -0
- package/components/DesignTokens/components/Puller.js.map +1 -0
- package/components/DesignTokens/components/PullerList.js +12 -0
- package/components/DesignTokens/components/PullerList.js.map +1 -0
- package/components/DesignTokens/components/SmartSpot.js +57 -0
- package/components/DesignTokens/components/SmartSpot.js.map +1 -0
- package/components/DesignTokens/components/index.js +9 -6
- package/components/DesignTokens/components/index.js.map +1 -1
- package/components/DesignTokens/types/DesignTokensTypes.js.map +1 -1
- package/components/Divider/Divider.js +17 -17
- package/components/DocumentNumberEdit/DocumentNumberEdit.js +3 -3
- package/components/Dropdown/Dropdown.js +4 -4
- package/components/Dropdown/Dropdown.js.map +1 -1
- package/components/Dropdown/desktop/DropdownDesktop.js +10 -10
- package/components/Dropdown/desktop/DropdownDesktop.js.map +1 -1
- package/components/Dropdown/desktop/DropdownList.js +1 -1
- package/components/Dropdown/desktop/DropdownListItem.js +1 -1
- package/components/Dropdown/desktop/index.js +1 -1
- package/components/Dropdown/index.js +1 -21
- package/components/Dropdown/index.js.map +1 -1
- package/components/Ellipsis/Ellipsis.js +3 -3
- package/components/EmptyView/EmptyView.js +4 -4
- package/components/ExpandAnimation/ExpandAnimation.js +1 -1
- package/components/Footer/Footer.js +1 -1
- package/components/Footer/components/FooterDescription.js +1 -1
- package/components/Footer/components/FooterDescriptionContent.js +1 -1
- package/components/Footer/components/FooterDescriptionControls.js +1 -1
- package/components/FormField/FormField.js +11 -11
- package/components/FormField/FormFieldContext.js +1 -1
- package/components/FormField/FormFieldContext.js.map +1 -1
- package/components/FormField/components/FormFieldClear.js +1 -1
- package/components/FormField/components/FormFieldCounter.js +1 -1
- package/components/FormField/components/FormFieldDescription.js +2 -2
- package/components/FormField/components/FormFieldInput.js +4 -4
- package/components/FormField/components/FormFieldLabel.js +7 -7
- package/components/FormField/components/FormFieldMaskedInput.js +8 -8
- package/components/FormField/components/FormFieldPostfix.js +1 -1
- package/components/FormField/components/FormFieldPrefix.js +1 -1
- package/components/FormField/components/FormFieldTarget.js +8 -8
- package/components/FormField/components/FormFieldTextarea.js +4 -4
- package/components/Gap/Gap.js +8 -8
- package/components/Header/Header.js +1 -1
- package/components/Header/components/HeaderLayoutSidebar/HeaderLayoutSidebar.js +1 -1
- package/components/Header/components/HeaderLayoutSidebar/HeaderLayoutSidebarContent.js +1 -1
- package/components/Header/components/HeaderLayoutSidebar/HeaderLayoutSidebarSidebar.js +1 -1
- package/components/Header/components/HeaderSubheader/HeaderSubheader.js +2 -2
- package/components/Header/components/HeaderTabs/HeaderTabs.js +1 -1
- package/components/Header/components/HeaderTabs/HeaderTabsContent.js +1 -1
- package/components/Header/components/HeaderTabs/HeaderTabsControls.js +1 -1
- package/components/Header/components/HeaderTitle/HeaderTitle.js +1 -1
- package/components/Header/components/HeaderTitle/HeaderTitleContent.js +1 -1
- package/components/Header/components/HeaderTitle/HeaderTitleControls.js +1 -1
- package/components/HelpBox/HelpBox.js +1 -1
- package/components/IconWrapper/IconWrapper.js +2 -2
- package/components/ImageGallery/ImageGallery.js +1 -1
- package/components/ImageGalleryExtended/ImageGalleryExtended.js +2 -2
- package/components/ImageGalleryExtended/components/ImageGalleryExtendedArrow.js +1 -1
- package/components/ImageGalleryExtended/components/ImageGalleryExtendedMain.js +1 -1
- package/components/ImageGalleryExtended/components/ImageGalleryExtendedPageIndicators.js +1 -1
- package/components/ImageGalleryExtended/components/ImageGalleryExtendedSlide.js +1 -1
- package/components/ImageGalleryExtended/components/ImageGalleryExtendedSwipeTrack.js +1 -1
- package/components/ImageGalleryExtended/components/ImageGalleryExtendedThumb.js +1 -1
- package/components/ImageGalleryExtended/components/ImageGalleryExtendedThumbnails.js +1 -1
- package/components/ImageGalleryExtended/components/index.js +1 -1
- package/components/ImageGalleryExtended/index.js +1 -1
- package/components/Island/Island.js +1 -1
- package/components/Island/components/IslandBody.js +1 -1
- package/components/Island/components/IslandFooter.js +1 -1
- package/components/Island/components/IslandHeader.js +1 -1
- package/components/Island/utils.js +1 -1
- package/components/IslandAccordion/IslandAccordion.js +2 -2
- package/components/IslandAccordion/components/IslandAccordionContent.js +1 -1
- package/components/IslandAccordion/components/IslandAccordionFooter.js +1 -1
- package/components/IslandAccordion/components/IslandAccordionItem.js +2 -2
- package/components/IslandWidget/IslandWidget.js +3 -3
- package/components/IslandWidget/components/IslandWidgetBody.js +4 -4
- package/components/IslandWidget/components/IslandWidgetExtraFooter.js +1 -1
- package/components/IslandWidget/components/IslandWidgetFooter.js +1 -1
- package/components/IslandWidget/components/IslandWidgetFooterContent.js +1 -1
- package/components/IslandWidget/components/IslandWidgetFooterControls.js +1 -1
- package/components/IslandWidget/components/IslandWidgetHeader.js +1 -1
- package/components/IslandWidget/components/IslandWidgetHeaderControls.js +1 -1
- package/components/IslandWidget/components/IslandWidgetHeaderDescription.js +1 -1
- package/components/IslandWidget/components/IslandWidgetHeaderTitle.js +1 -1
- package/components/IslandWidget/components/IslandWidgetWrapper.js +1 -1
- package/components/LightBox/LightBox.js +5 -5
- package/components/LightBox/LightBoxContent.js +1 -1
- package/components/LightBox/LightBoxControls/LightBoxArrow.js +1 -1
- package/components/LightBox/LightBoxControls/LightBoxClose.js +1 -1
- package/components/LightBox/LightBoxControls/LightBoxControls.js +1 -1
- package/components/LightBox/LightBoxControls/LightBoxNext.js +1 -1
- package/components/LightBox/LightBoxControls/LightBoxPrev.js +1 -1
- package/components/LightBox/LightBoxSideOverlay/LightBoxSideOverlay.js +12 -12
- package/components/LightBox/LightBoxSideOverlay/LightBoxSideOverlayCloseDesktop.js +1 -1
- package/components/LightBox/LightBoxSideOverlay/LightBoxSideOverlayCloseMobile.js +1 -1
- package/components/LightBox/LightBoxSideOverlay/LightBoxSideOverlayLoader.js +1 -1
- package/components/LightBox/LightBoxSidebars/LightBoxLeftSidebar.js +3 -3
- package/components/LightBox/LightBoxSidebars/LightBoxRightSidebar.js +3 -3
- package/components/Link/Link.js +5 -5
- package/components/List/List.js +3 -3
- package/components/List/components/ListActionItem.js +1 -1
- package/components/List/components/ListEmptyState.js +1 -1
- package/components/List/components/ListItem.js +1 -1
- package/components/List/components/ListItemContent.js +4 -4
- package/components/List/components/ListItemControls.js +1 -1
- package/components/List/components/ListItemControlsButton.js +1 -1
- package/components/List/components/ListItemControlsButtonDropdown.js +15 -21
- package/components/List/components/ListItemControlsButtonDropdown.js.map +1 -1
- package/components/List/components/ListItemLoading.js +1 -1
- package/components/List/components/ListItemSelectable.js +6 -6
- package/components/List/components/ListItemTailLeft.js +1 -1
- package/components/List/components/ListItemTailRight.js +1 -1
- package/components/List/components/ListSortableItem.js +2 -2
- package/components/List/components/ListSortableItemControls.js +1 -1
- package/components/List/components/ListSortableItemTarget.js +4 -4
- package/components/List/components/ListTableItem.js +3 -3
- package/components/List/index.js +1 -1
- package/components/ListMaster/ListMaster.js +1 -1
- package/components/ListMaster/components/ListMasterBody.js +1 -1
- package/components/ListMaster/components/ListMasterChipGroup.js +1 -1
- package/components/ListMaster/components/ListMasterFooter.js +1 -1
- package/components/ListMaster/components/ListMasterFooterControls.js +1 -1
- package/components/ListMaster/components/ListMasterFooterDescription.js +1 -1
- package/components/ListMaster/components/ListMasterHeader.js +2 -2
- package/components/ListMaster/components/SelectionControls.js +2 -2
- package/components/Loader/LoaderMiddle/LoaderMiddle.js +8 -8
- package/components/Loader/LoaderSmall/LoaderSmall.js +10 -10
- package/components/LoaderScreen/LoaderScreen.js +5 -5
- package/components/Marker/Marker.js +1 -1
- package/components/Marker/utils.js +1 -1
- package/components/MarkerStatus/MarkerStatus.js +7 -7
- package/components/ModalWindow/ModalWindow.js +1 -1
- package/components/ModalWindow/components/ModalWindowBody.js +1 -1
- package/components/ModalWindow/components/ModalWindowClose.js +1 -1
- package/components/ModalWindow/components/ModalWindowContent.js +1 -1
- package/components/ModalWindow/components/ModalWindowHeader.js +1 -1
- package/components/ModalWindow/components/ModalWindowViewManager.js +1 -1
- package/components/MonthYearField/MonthYearFieldTarget.js +4 -4
- package/components/MonthYearRange/MonthYearRange.js +19 -24
- package/components/MonthYearRange/MonthYearRange.js.map +1 -1
- package/components/MonthYearRange/types.js +2 -0
- package/components/MonthYearRange/types.js.map +1 -0
- package/components/MultiselectField/components/MultiselectFieldDropdown.js +4 -15
- package/components/MultiselectField/components/MultiselectFieldDropdown.js.map +1 -1
- package/components/MultiselectField/components/MultiselectFieldDropdownContent.js +5 -5
- package/components/MultiselectField/components/MultiselectFieldDropdownFooter.js +1 -1
- package/components/MultiselectField/components/MultiselectFieldDropdownHeader.js +1 -1
- package/components/Notification/Notification.js +2 -2
- package/components/Notification/NotificationGrouped.js +1 -1
- package/components/Notification/components/NotificationBody.js +1 -1
- package/components/Notification/components/NotificationBodyList.js +1 -1
- package/components/Notification/components/NotificationClose.js +1 -1
- package/components/Notification/components/NotificationFooter.js +1 -1
- package/components/Notification/components/NotificationGroupedFooter.js +1 -1
- package/components/Notification/components/NotificationHeader.js +1 -1
- package/components/Notification/components/NotificationIcon.js +1 -1
- package/components/Notification/components/NotificationTime.js +1 -1
- package/components/OrderedList/OrderedList.js +2 -2
- package/components/OrderedList/OrderedListItem.js +2 -2
- package/components/Overlay/Overlay.js +1 -1
- package/components/Overlay/OverlayMask.js +1 -1
- package/components/Overlay/OverlayPanel.js +1 -1
- package/components/Page/Page.js +1 -1
- package/components/Page/components/BodyPage.js +7 -7
- package/components/Page/components/FooterPage.js +1 -1
- package/components/Page/components/HeaderPage.js +1 -1
- package/components/PageIndicators/PageIndicators.js +5 -5
- package/components/Pagination/components/PaginationExtended.js +2 -2
- package/components/Pagination/components/PaginationNavigationButton.js +2 -2
- package/components/Pagination/components/PaginationNavigationExtended.js +1 -1
- package/components/Pagination/components/PaginationPageButton.js +2 -2
- package/components/Pagination/components/PaginationPageEllipsis.js +1 -1
- package/components/Pagination/components/PaginationSelect.js +2 -2
- package/components/Puller/Puller.js +21 -0
- package/components/Puller/Puller.js.map +1 -0
- package/components/Puller/PullerBody.js +12 -0
- package/components/Puller/PullerBody.js.map +1 -0
- package/components/Puller/PullerClose.js +10 -0
- package/components/Puller/PullerClose.js.map +1 -0
- package/components/Puller/PullerFooter.js +12 -0
- package/components/Puller/PullerFooter.js.map +1 -0
- package/components/Puller/PullerHeader.js +15 -0
- package/components/Puller/PullerHeader.js.map +1 -0
- package/components/{Dropdown/mobile/DropdownMobileInner.js → Puller/PullerInner.js} +18 -25
- package/components/Puller/PullerInner.js.map +1 -0
- package/components/Puller/PullerInput.js +13 -0
- package/components/Puller/PullerInput.js.map +1 -0
- package/components/Puller/PullerList.js +18 -0
- package/components/Puller/PullerList.js.map +1 -0
- package/components/{Dropdown/mobile/DropdownMobileListItem.js → Puller/PullerListItem.js} +15 -14
- package/components/Puller/PullerListItem.js.map +1 -0
- package/components/Puller/PullerLoader.js +20 -0
- package/components/Puller/PullerLoader.js.map +1 -0
- package/components/Puller/PullerMaskedInput.js +19 -0
- package/components/Puller/PullerMaskedInput.js.map +1 -0
- package/components/Puller/index.js +23 -0
- package/components/Radio/Radio.js +9 -9
- package/components/Radio/RadioXGroup.js +8 -8
- package/components/Radio/RadioYGroup.js +1 -1
- package/components/Row/Row.js +4 -4
- package/components/SMSField/SMSField.js +2 -2
- package/components/SMSField/components/RefreshIcon.js +1 -1
- package/components/SMSField/components/SMSFieldInput.js +1 -1
- package/components/SMSField/components/SMSFieldRefresh.js +1 -1
- package/components/SMSField/components/SMSFieldSubmit.js +1 -1
- package/components/SegmentedControl/SegmentedControl.js +9 -9
- package/components/SegmentedControl/SegmentedControlSegment.js +3 -3
- package/components/SelectExtendedField/SelectExtendedField.js +1 -1
- package/components/SelectExtendedField/components/SelectExtendedFieldDropdown.js +1 -12
- package/components/SelectExtendedField/components/SelectExtendedFieldDropdown.js.map +1 -1
- package/components/SelectExtendedField/components/SelectExtendedFieldDropdownDefault.js +12 -17
- package/components/SelectExtendedField/components/SelectExtendedFieldDropdownDefault.js.map +1 -1
- package/components/SelectExtendedField/components/SelectExtendedFieldTarget.js +7 -7
- package/components/SelectField/SelectField.js +1 -12
- package/components/SelectField/SelectField.js.map +1 -1
- package/components/Skeleton/Skeleton.js +5 -5
- package/components/SliderExtended/SliderExtended.js +2 -2
- package/components/SliderExtended/components/SliderExtendedDot/SliderExtendedDot.js +5 -5
- package/components/SliderExtended/components/SliderExtendedMarks/SliderExtendedMark.js +1 -1
- package/components/SliderExtended/components/SliderExtendedMarks/SliderExtendedMarks.js +1 -1
- package/components/SliderExtended/components/SliderExtendedRail.js +1 -1
- package/components/SliderExtended/components/SliderExtendedTooltip/SliderExtendedTooltip.js +4 -4
- package/components/SliderExtended/components/SliderExtendedTrack/SliderExtendedTrack.js +6 -6
- package/components/SmallInput/SmallInput.js +1 -1
- package/components/SmartSpot/SmartSpot.js +110 -0
- package/components/SmartSpot/SmartSpot.js.map +1 -0
- package/components/SmartSpot/consts.js +47 -0
- package/components/SmartSpot/consts.js.map +1 -0
- package/components/SmartSpot/enums.js +26 -0
- package/components/SmartSpot/enums.js.map +1 -0
- package/components/SmartSpot/index.js +9 -0
- package/components/SmartSpot/index.js.map +1 -0
- package/components/SmartSpot/utils.js +36 -0
- package/components/SmartSpot/utils.js.map +1 -0
- package/components/Spoiler/Spoiler.js +10 -10
- package/components/StatusTracker/StatusTracker.js +2 -2
- package/components/StatusTracker/components/StatusTrackerAlert.js +1 -1
- package/components/StatusTracker/components/StatusTrackerBody.js +1 -1
- package/components/StatusTracker/components/StatusTrackerButton.js +1 -1
- package/components/StatusTracker/components/StatusTrackerDescription.js +1 -1
- package/components/StatusTracker/components/StatusTrackerFooter.js +1 -1
- package/components/StatusTracker/components/StatusTrackerHeader.js +1 -1
- package/components/StatusTracker/components/StatusTrackerMedia.js +1 -1
- package/components/StatusTracker/components/StatusTrackerStatus.js +1 -1
- package/components/StatusTracker/components/StatusTrackerStatusGroup.js +1 -1
- package/components/StatusTracker/components/StatusTrackerSum.js +1 -1
- package/components/StatusTracker/components/StatusTrackerTitle.js +1 -1
- package/components/Step/Step.js +10 -10
- package/components/Stepper/Stepper.js +8 -8
- package/components/Stepper/StepperExtended.js +1 -1
- package/components/Stepper/StepperStep.js +2 -2
- package/components/Stepper/StepperStepArrowBorder.js +1 -1
- package/components/Suggest/SuggestMobileDropdownContent.js +19 -24
- package/components/Suggest/SuggestMobileDropdownContent.js.map +1 -1
- package/components/SuggestField/SuggestField.js +1 -1
- package/components/SuggestField/desktop/SuggestFieldDesktop.js +1 -10
- package/components/SuggestField/desktop/SuggestFieldDesktop.js.map +1 -1
- package/components/SuggestField/desktop/SuggestFieldDesktopDropdown.js +1 -12
- package/components/SuggestField/desktop/SuggestFieldDesktopDropdown.js.map +1 -1
- package/components/SuggestField/index.js +1 -1
- package/components/SuggestField/mobile/SuggestFieldMobile.js +1 -1
- package/components/SuggestField/mobile/SuggestFieldMobileDropdown.js +19 -19
- package/components/SuggestField/mobile/SuggestFieldMobileDropdown.js.map +1 -1
- package/components/SuggestField/mobile/SuggestFieldMobileDropdownHint.js +1 -1
- package/components/SuggestField/mobile/index.js +1 -1
- package/components/SwipeableArea/SwipeableArea.js +8 -8
- package/components/Table/ChipPanel.js +1 -1
- package/components/Table/ChipPanelLinks.js +1 -1
- package/components/Table/FilterPanel.js +2 -2
- package/components/Table/MasterTable.js +2 -2
- package/components/Table/NoColumns.js +2 -2
- package/components/Table/PaginationPanel.js +2 -2
- package/components/Table/TableBasic/TableBasic.js +1 -1
- package/components/Table/TableBasic/components/TableBasicBody.js +1 -1
- package/components/Table/TableBasic/components/TableBasicHeader.js +1 -1
- package/components/Table/TableBasic/components/TableBasicRow.js +1 -1
- package/components/Table/TableBasicSettings/TableBasicSettings.js +2 -2
- package/components/Table/TableBasicSettings/components/ColumnSettingsSortableListItemTarget.js +2 -2
- package/components/Table/TableBasicSettings/components/ColumnSettingsStaticListItem.js +1 -1
- package/components/Table/TableBasicSettings/components/TableBasicSettingsBody.js +1 -1
- package/components/Table/TableBasicSettings/components/TableBasicSettingsFooter.js +1 -1
- package/components/Table/TableBasicSettings/components/TableBasicSettingsHeader.js +1 -1
- package/components/Table/TableFooter/TableFooter.js +1 -1
- package/components/Table/TableFooter/components/TableFooterSummary.js +1 -1
- package/components/Table/TableFooter/components/TableFooterSummaryAmount.js +1 -1
- package/components/Table/TableFooter/components/TableFooterSummarySelectAllButton.js +1 -1
- package/components/Table/TableFooter/components/TableFooterSummarySelectedCount.js +1 -1
- package/components/Table/utils.js +1 -1
- package/components/Tabs/Tabs.js +8 -8
- package/components/TabsExtended/TabsExtended.js +2 -2
- package/components/TabsExtended/components/TabsExtendedContent.js +1 -1
- package/components/TabsExtended/components/TabsExtendedDropdownWrapper.js +1 -1
- package/components/TabsExtended/components/TabsExtendedTab.js +1 -1
- package/components/TabsExtended/components/TabsExtendedTabButton.js +1 -1
- package/components/TabsExtended/components/TabsExtendedTabsWrapper.js +1 -1
- package/components/TabsExtended/utils.js +1 -1
- package/components/TabsLine/TabsLine.js +1 -1
- package/components/TabsLine/components/TabsLineDesktop.js +1 -1
- package/components/TabsLine/components/TabsLineDropdown.js +2 -13
- package/components/TabsLine/components/TabsLineDropdown.js.map +1 -1
- package/components/TabsLine/components/TabsLineItem.js +1 -1
- package/components/TabsLine/components/TabsLineMobile.js +2 -2
- package/components/Tag/Tag.js +5 -5
- package/components/TagColor/TagColor.js +10 -10
- package/components/TagGroup/TagGroup.js +4 -4
- package/components/Tooltip/components/common/TooltipBody.js +1 -1
- package/components/Tooltip/components/common/TooltipLink.js +4 -4
- package/components/Tooltip/components/common/TooltipXButton.js +1 -1
- package/components/Tooltip/components/desktop/components/TooltipDesktopBase.js +1 -1
- package/components/Tooltip/components/desktop/components/TooltipDesktopTip.js +1 -1
- package/components/Tooltip/components/mobile/TooltipMobile.js +10 -10
- package/components/Tooltip/components/mobile/TooltipMobile.js.map +1 -1
- package/components/Tooltip/components/mobile/components/TooltipMobileCloseButton.js +2 -2
- package/components/Tooltip/components/mobile/components/TooltipMobileCloseButton.js.map +1 -1
- package/components/Tooltip/components/mobile/components/TooltipMobileHeader.js +2 -2
- package/components/Tooltip/components/mobile/components/TooltipMobileHeader.js.map +1 -1
- package/components/TopOverlay/TopOverlay.js +6 -6
- package/components/TreeView/TreeView.js +1 -1
- package/components/TreeView/components/TreeViewGroup.js +1 -1
- package/components/TreeView/components/TreeViewNode.js +1 -1
- package/components/Typography/Caption.js +7 -7
- package/components/Typography/CodeText.js +2 -2
- package/components/Typography/Text.js +9 -9
- package/components/Typography/Title.js +9 -9
- package/components/Typography/constants.js +1 -1
- package/components/UnorderedListExtended/UnorderedListExtended.js +2 -2
- package/components/UnorderedListExtended/UnorderedListExtendedItem.js +2 -2
- package/components/UnorderedListExtended/UnorderedListExtendedItemMarker.js +3 -3
- package/components/UploadZone/UploadZone.js +2 -2
- package/components/UploadZone/components/UploadZoneInput.js +1 -1
- package/components/UploadZone/index.js +1 -1
- package/components/index.js +32 -26
- package/components/index.js.map +1 -1
- package/index.d.ts +233 -134
- package/index.js +32 -26
- package/index.js.map +1 -1
- package/package.json +9 -1
- package/styles/triplex-next.css +3139 -3038
- package/utils/scroll/bodyScrollLock.js +23 -0
- package/utils/scroll/bodyScrollLock.js.map +1 -0
- package/chunks/Card.module-C7xz0eKx.js +0 -32
- package/chunks/Card.module-C7xz0eKx.js.map +0 -1
- package/chunks/Carousel.module-CXIfk_97.js +0 -26
- package/chunks/Carousel.module-CXIfk_97.js.map +0 -1
- package/chunks/CheckboxTreeExtended.module-DLKb2rTf.js +0 -24
- package/chunks/CheckboxTreeExtended.module-DLKb2rTf.js.map +0 -1
- package/chunks/Confirm.module-YWhb2Ve3.js +0 -24
- package/chunks/Confirm.module-YWhb2Ve3.js.map +0 -1
- package/chunks/DropdownMobile.module-CHJp6QN5.js +0 -40
- package/chunks/DropdownMobile.module-CHJp6QN5.js.map +0 -1
- package/chunks/Footer.module-52DeBs5u.js +0 -12
- package/chunks/Footer.module-52DeBs5u.js.map +0 -1
- package/chunks/HeaderLayoutSidebar.module-BvCPxkNk.js.map +0 -1
- package/chunks/HeaderTabs.module-DcnxvYN-.js +0 -12
- package/chunks/HeaderTabs.module-DcnxvYN-.js.map +0 -1
- package/chunks/HeaderTitle.module-gbla84yG.js.map +0 -1
- package/chunks/ImageGalleryExtendedMain.module-DEMmSVQp.js +0 -28
- package/chunks/ImageGalleryExtendedMain.module-DEMmSVQp.js.map +0 -1
- package/chunks/IslandAccordion.module-bwQFP0tP.js +0 -44
- package/chunks/IslandAccordion.module-bwQFP0tP.js.map +0 -1
- package/chunks/IslandWidgetFooter.module-CP5njAOS.js +0 -18
- package/chunks/IslandWidgetFooter.module-CP5njAOS.js.map +0 -1
- package/chunks/IslandWidgetHeader.module-Czxumpj0.js +0 -28
- package/chunks/IslandWidgetHeader.module-Czxumpj0.js.map +0 -1
- package/chunks/LightBoxControls.module-CCqAYXOp.js +0 -26
- package/chunks/LightBoxControls.module-CCqAYXOp.js.map +0 -1
- package/chunks/LightBoxSideOverlayClose.module-Bu0mbQ2E.js.map +0 -1
- package/chunks/ListItemTail.module-DNcipOgP.js +0 -18
- package/chunks/ListItemTail.module-DNcipOgP.js.map +0 -1
- package/chunks/ListMasterFooter.module-BO7_lx0S.js +0 -14
- package/chunks/ListMasterFooter.module-BO7_lx0S.js.map +0 -1
- package/chunks/ModalWindow.module-Bb8wLMOR.js +0 -28
- package/chunks/ModalWindow.module-Bb8wLMOR.js.map +0 -1
- package/chunks/Notification.module-C27U0YZV.js +0 -34
- package/chunks/Notification.module-C27U0YZV.js.map +0 -1
- package/chunks/Overlay.module-BzjO-w78.js +0 -30
- package/chunks/Overlay.module-BzjO-w78.js.map +0 -1
- package/chunks/Page.module-BkhV9GYk.js +0 -17
- package/chunks/Page.module-BkhV9GYk.js.map +0 -1
- package/chunks/SMSField.module-ro6oGp6K.js +0 -30
- package/chunks/SMSField.module-ro6oGp6K.js.map +0 -1
- package/chunks/SliderExtendedMarks.module-kZFbIl0G.js +0 -24
- package/chunks/SliderExtendedMarks.module-kZFbIl0G.js.map +0 -1
- package/chunks/StatusTracker.module-C20aPMTU.js +0 -44
- package/chunks/StatusTracker.module-C20aPMTU.js.map +0 -1
- package/chunks/TableFooter.module-0fRaQavw.js +0 -22
- package/chunks/TableFooter.module-0fRaQavw.js.map +0 -1
- package/chunks/TabsExtended.module-edmUKSS3.js +0 -26
- package/chunks/TabsExtended.module-edmUKSS3.js.map +0 -1
- package/chunks/TabsLine.module-0jeKJFx6.js +0 -36
- package/chunks/TabsLine.module-0jeKJFx6.js.map +0 -1
- package/chunks/TooltipDesktop.module-B4l074WB.js +0 -32
- package/chunks/TooltipDesktop.module-B4l074WB.js.map +0 -1
- package/chunks/TreeView.module-6Cj379Bu.js +0 -12
- package/chunks/TreeView.module-6Cj379Bu.js.map +0 -1
- package/components/DesignTokens/components/DropdownMobile.js +0 -24
- package/components/DesignTokens/components/DropdownMobile.js.map +0 -1
- package/components/DesignTokens/components/DropdownMobileList.js +0 -12
- package/components/DesignTokens/components/DropdownMobileList.js.map +0 -1
- package/components/Dropdown/mobile/DropdownMobile.js +0 -33
- package/components/Dropdown/mobile/DropdownMobile.js.map +0 -1
- package/components/Dropdown/mobile/DropdownMobileBody.js +0 -12
- package/components/Dropdown/mobile/DropdownMobileBody.js.map +0 -1
- package/components/Dropdown/mobile/DropdownMobileClose.js +0 -14
- package/components/Dropdown/mobile/DropdownMobileClose.js.map +0 -1
- package/components/Dropdown/mobile/DropdownMobileFooter.js +0 -12
- package/components/Dropdown/mobile/DropdownMobileFooter.js.map +0 -1
- package/components/Dropdown/mobile/DropdownMobileHeader.js +0 -15
- package/components/Dropdown/mobile/DropdownMobileHeader.js.map +0 -1
- package/components/Dropdown/mobile/DropdownMobileInner.js.map +0 -1
- package/components/Dropdown/mobile/DropdownMobileInput.js +0 -15
- package/components/Dropdown/mobile/DropdownMobileInput.js.map +0 -1
- package/components/Dropdown/mobile/DropdownMobileList.js +0 -24
- package/components/Dropdown/mobile/DropdownMobileList.js.map +0 -1
- package/components/Dropdown/mobile/DropdownMobileListItem.js.map +0 -1
- package/components/Dropdown/mobile/DropdownMobileLoader.js +0 -20
- package/components/Dropdown/mobile/DropdownMobileLoader.js.map +0 -1
- package/components/Dropdown/mobile/DropdownMobileMaskedInput.js +0 -19
- package/components/Dropdown/mobile/DropdownMobileMaskedInput.js.map +0 -1
- package/components/Dropdown/mobile/index.js +0 -23
- /package/components/{Dropdown/mobile → Puller}/index.js.map +0 -0
|
@@ -6,7 +6,7 @@ import { ECarouselScrollMode } from "./enums.js";
|
|
|
6
6
|
import { EOrientation } from "../../enums/EOrientation.js";
|
|
7
7
|
import { resolveViewportPadding } from "./utils.js";
|
|
8
8
|
import { useLatestRef } from "../../utils/refs.js";
|
|
9
|
-
import { s as styles } from "../../chunks/Carousel.module-
|
|
9
|
+
import { s as styles } from "../../chunks/Carousel.module-ugT1KfWo.js";
|
|
10
10
|
import { CarouselViewport } from "./CarouselViewport.js";
|
|
11
11
|
import { CarouselTrack } from "./CarouselTrack.js";
|
|
12
12
|
import { CarouselItem } from "./CarouselItem.js";
|
|
@@ -118,6 +118,7 @@ const CarouselRoot = React.forwardRef(
|
|
|
118
118
|
const { start: startKey, end: endKey } = ORIENTATION_TO_PADDING_KEY[orientation];
|
|
119
119
|
const startP = normalizedPadding[startKey];
|
|
120
120
|
const endP = normalizedPadding[endKey];
|
|
121
|
+
const pageSize = Math.max(0, containerSize - startP - endP);
|
|
121
122
|
const calculatedMaxOffset = Math.max(0, totalContentSize + startP + endP - containerSize);
|
|
122
123
|
maxOffsetRef.current = calculatedMaxOffset;
|
|
123
124
|
let targetOffset = 0;
|
|
@@ -128,7 +129,7 @@ const CarouselRoot = React.forwardRef(
|
|
|
128
129
|
for (let i = 0; i < slidesCount; i++) {
|
|
129
130
|
const slideSize = getSlideSize(i);
|
|
130
131
|
const addedSize = currentPage.length > 0 ? slideSize + gap : slideSize;
|
|
131
|
-
if (currentGroupSize + addedSize <=
|
|
132
|
+
if (currentGroupSize + addedSize <= pageSize + 1) {
|
|
132
133
|
currentPage.push(i);
|
|
133
134
|
currentGroupSize += addedSize;
|
|
134
135
|
} else {
|
|
@@ -161,7 +162,7 @@ const CarouselRoot = React.forwardRef(
|
|
|
161
162
|
const lastSlideSize = getSlideSize(lastSlideIndex);
|
|
162
163
|
const groupEnd = getSlideStart(lastSlideIndex) + lastSlideSize;
|
|
163
164
|
const groupSize = groupEnd - groupStart;
|
|
164
|
-
targetOffset = groupStart - (
|
|
165
|
+
targetOffset = groupStart - (pageSize - groupSize) / 2;
|
|
165
166
|
}
|
|
166
167
|
} else {
|
|
167
168
|
setActiveIndices((prev) => prev.length === 0 ? prev : []);
|
|
@@ -206,7 +207,8 @@ const CarouselRoot = React.forwardRef(
|
|
|
206
207
|
normalizedPadding,
|
|
207
208
|
pageMode,
|
|
208
209
|
getSlideSize,
|
|
209
|
-
getSlideStart
|
|
210
|
+
getSlideStart,
|
|
211
|
+
offsetRef
|
|
210
212
|
]
|
|
211
213
|
);
|
|
212
214
|
const nextSlide = useCallback(() => {
|
|
@@ -292,7 +294,7 @@ const CarouselRoot = React.forwardRef(
|
|
|
292
294
|
observer.observe(viewportRef.current);
|
|
293
295
|
observer.observe(trackRef.current);
|
|
294
296
|
return () => observer.disconnect();
|
|
295
|
-
}, [updateOffsetAndPages]);
|
|
297
|
+
}, [updateOffsetAndPages, currentIndexRef]);
|
|
296
298
|
useEffect(() => {
|
|
297
299
|
setCurrentIndex(0);
|
|
298
300
|
}, [gap, scrollMode, orientation]);
|
|
@@ -342,7 +344,9 @@ const CarouselRoot = React.forwardRef(
|
|
|
342
344
|
atEnd,
|
|
343
345
|
nextSlide,
|
|
344
346
|
prevSlide,
|
|
345
|
-
goToSlide
|
|
347
|
+
goToSlide,
|
|
348
|
+
orientationRef,
|
|
349
|
+
offsetRef
|
|
346
350
|
]
|
|
347
351
|
);
|
|
348
352
|
return /* @__PURE__ */ jsx(CarouselContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx("div", { className: classNames, ...restProps, ref, children }) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Carousel.js","sources":["../../../src/components/Carousel/Carousel.tsx"],"sourcesContent":["import React, { useState, useMemo, useRef, useLayoutEffect, useCallback, useEffect } from \"react\";\nimport clsx from \"clsx\";\nimport { CarouselContext } from \"./CarouselContext\";\nimport { ICarouselProps } from \"./types\";\nimport { ECarouselScrollMode } from \"./enums\";\nimport { EOrientation } from \"../../enums\";\nimport { resolveViewportPadding } from \"./utils\";\nimport { useLatestRef } from \"../../utils/refs\";\nimport styles from \"./styles/Carousel.module.less\";\nimport { CarouselViewport } from \"./CarouselViewport\";\nimport { CarouselTrack } from \"./CarouselTrack\";\nimport { CarouselItem } from \"./CarouselItem\";\nimport { CarouselPrevButton, CarouselNextButton } from \"./CarouselButton\";\nimport { CarouselIndicators } from \"./CarouselIndicators\";\n\nconst ORIENTATION_TO_PADDING_KEY = {\n [EOrientation.HORIZONTAL]: { start: \"left\", end: \"right\" },\n [EOrientation.VERTICAL]: { start: \"top\", end: \"bottom\" },\n} as const;\n\nconst ORIENTATION_TO_RECT_SIZE_KEY = {\n [EOrientation.HORIZONTAL]: \"width\",\n [EOrientation.VERTICAL]: \"height\",\n} as const;\n\nconst ORIENTATION_TO_CLIENT_SIZE_KEY = {\n [EOrientation.HORIZONTAL]: \"clientWidth\",\n [EOrientation.VERTICAL]: \"clientHeight\",\n} as const;\n\nconst CarouselRoot = React.forwardRef<HTMLDivElement, ICarouselProps>(\n (\n {\n children,\n orientation = EOrientation.HORIZONTAL,\n scrollMode = ECarouselScrollMode.ITEM,\n gap = 16,\n viewportPadding = 0,\n className,\n ...restProps\n },\n ref,\n ) => {\n const [offset, setOffset] = useState(0);\n const [maxOffset, setMaxOffset] = useState(0);\n const [activeIndices, setActiveIndices] = useState<number[]>([]);\n const [currentIndex, setCurrentIndex] = useState(0);\n\n const paddingKey = Array.isArray(viewportPadding) ? viewportPadding.join(\",\") : String(viewportPadding);\n const { metrics: normalizedPadding, style: viewportPaddingStyle } = useMemo(\n () => resolveViewportPadding(viewportPadding),\n // eslint-disable-next-line react-hooks/exhaustive-deps -- мемоизация по значению, а не по ссылке\n [paddingKey],\n );\n\n // Защита от пересоздания обработчиков жестов во Viewport при смене ориентации\n const orientationRef = useLatestRef(orientation);\n // Защита от бесконечного цикла рендеров в updateOffsetAndPages\n const offsetRef = useLatestRef(offset);\n // Защита от stale closures в ResizeObserver\n const currentIndexRef = useLatestRef(currentIndex);\n\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const trackRef = useRef<HTMLDivElement | null>(null);\n const slideRefs = useRef<Map<number, HTMLDivElement>>(new Map());\n const maxOffsetRef = useRef(maxOffset);\n\n // Реф для отслеживания запланированного кадра анимации\n const pageRafIdRef = useRef<number | null>(null);\n // Хранит настройки предыдущего успешного расчёта для авто-сброса кэша\n const lastConfigRef = useRef({ gap, scrollMode, orientation });\n\n const geometryCacheRef = useRef<{\n sizes: Map<number, number>;\n starts: Map<number, number>;\n }>({ sizes: new Map(), starts: new Map() });\n\n const pageMode = scrollMode === ECarouselScrollMode.PAGE;\n\n const getSlideSize = useCallback(\n (index: number) => {\n if (geometryCacheRef.current.sizes.has(index)) {\n // Безопасно: строка выше гарантирует наличие значения в кэше.\n return geometryCacheRef.current.sizes.get(index)!;\n }\n\n const slide = slideRefs.current.get(index);\n if (!slide) return 0;\n\n const rect = slide.getBoundingClientRect();\n const key = ORIENTATION_TO_RECT_SIZE_KEY[orientation];\n const size = rect[key];\n\n geometryCacheRef.current.sizes.set(index, size);\n return size;\n },\n [orientation],\n );\n\n const getSlidesCount = useCallback(() => slideRefs.current.size, []);\n\n const getSlideStart = useCallback(\n (index: number): number => {\n if (index <= 0) {\n return 0;\n }\n\n if (geometryCacheRef.current.starts.has(index)) {\n // Безопасно: строка выше гарантирует наличие значения в кэше.\n return geometryCacheRef.current.starts.get(index)!;\n }\n\n const prevIndex = index - 1;\n const start = getSlideStart(prevIndex) + getSlideSize(prevIndex) + gap;\n\n geometryCacheRef.current.starts.set(index, start);\n return start;\n },\n [gap, getSlideSize],\n );\n\n const getSlideEnd = useCallback(\n (index: number) => {\n return getSlideStart(index) + getSlideSize(index);\n },\n [getSlideStart, getSlideSize],\n );\n\n const getViewportSize = useCallback(() => {\n if (!viewportRef.current) return 0;\n const key = ORIENTATION_TO_CLIENT_SIZE_KEY[orientation];\n return viewportRef.current[key];\n }, [orientation]);\n\n const updateOffsetAndPages = useCallback(\n (index: number) => {\n const lastConfig = lastConfigRef.current;\n if (\n lastConfig.gap !== gap ||\n lastConfig.scrollMode !== scrollMode ||\n lastConfig.orientation !== orientation\n ) {\n geometryCacheRef.current.sizes.clear();\n geometryCacheRef.current.starts.clear();\n lastConfigRef.current = { gap, scrollMode, orientation };\n }\n\n const slidesCount = getSlidesCount();\n if (slidesCount === 0) {\n maxOffsetRef.current = 0;\n setOffset((prev) => (prev !== 0 ? 0 : prev));\n setMaxOffset((prev) => (prev !== 0 ? 0 : prev));\n setActiveIndices(Array.of());\n return;\n }\n\n const totalContentSize = getSlideEnd(slidesCount - 1);\n const containerSize = getViewportSize();\n\n const { start: startKey, end: endKey } = ORIENTATION_TO_PADDING_KEY[orientation];\n const startP = normalizedPadding[startKey];\n const endP = normalizedPadding[endKey];\n\n const calculatedMaxOffset = Math.max(0, totalContentSize + startP + endP - containerSize);\n maxOffsetRef.current = calculatedMaxOffset;\n\n let targetOffset = 0;\n\n if (pageMode && containerSize > 0) {\n const pagesMatrix: number[][] = [];\n let currentPage: number[] = [];\n let currentGroupSize = 0;\n\n for (let i = 0; i < slidesCount; i++) {\n const slideSize = getSlideSize(i);\n const addedSize = currentPage.length > 0 ? slideSize + gap : slideSize;\n\n if (currentGroupSize + addedSize <= containerSize + 1) {\n currentPage.push(i);\n currentGroupSize += addedSize;\n } else {\n if (currentPage.length > 0) pagesMatrix.push(currentPage);\n currentPage = [i];\n currentGroupSize = slideSize;\n }\n }\n\n if (currentPage.length > 0) pagesMatrix.push(currentPage);\n\n const clampedIndex = Math.max(0, Math.min(index, pagesMatrix.length - 1));\n\n if (clampedIndex !== index) {\n if (pageRafIdRef.current !== null) {\n cancelAnimationFrame(pageRafIdRef.current);\n }\n\n pageRafIdRef.current = requestAnimationFrame(() => {\n setCurrentIndex(clampedIndex);\n pageRafIdRef.current = null;\n });\n }\n\n const validPageIndices = Array.from({ length: pagesMatrix.length }, (_, i) => i);\n\n setActiveIndices((prev) => {\n if (prev.length === validPageIndices.length) return prev;\n return validPageIndices;\n });\n\n const currentGroup = pagesMatrix[clampedIndex];\n if (currentGroup && currentGroup.length > 0) {\n const firstSlideIndex = currentGroup[0];\n const lastSlideIndex = currentGroup[currentGroup.length - 1];\n const groupStart = getSlideStart(firstSlideIndex);\n\n const lastSlideSize = getSlideSize(lastSlideIndex);\n const groupEnd = getSlideStart(lastSlideIndex) + lastSlideSize;\n const groupSize = groupEnd - groupStart;\n\n targetOffset = groupStart - (containerSize - groupSize) / 2;\n }\n } else {\n setActiveIndices((prev) => (prev.length === 0 ? prev : []));\n\n const slideStart = getSlideStart(index);\n const slideEnd = getSlideEnd(index);\n\n const currentOffset = offsetRef.current;\n const containerEnd = currentOffset + containerSize;\n\n // Ситуация 1: Слайд шире, чем сам контейнер (огромный слайд)\n if (slideEnd - slideStart > containerSize) {\n if (currentOffset < slideStart - startP) {\n targetOffset = slideStart - startP;\n } else if (currentOffset + containerSize > slideEnd + endP) {\n targetOffset = slideEnd - containerSize + endP;\n } else {\n targetOffset = currentOffset;\n }\n }\n // Ситуация 2: Стандартный слайд (меньше или равен размеру контейнера)\n else {\n if (slideEnd > containerEnd + 1) {\n targetOffset = slideEnd - containerSize + startP + endP;\n } else if (slideStart < currentOffset - 1) {\n targetOffset = slideStart - startP;\n } else {\n targetOffset = currentOffset;\n }\n }\n }\n\n if (targetOffset <= 0 || calculatedMaxOffset === 0) {\n setOffset(0);\n } else if (targetOffset >= calculatedMaxOffset) {\n setOffset(calculatedMaxOffset);\n } else {\n setOffset(targetOffset);\n }\n\n // Обновляем реактивный стейт для синхронизации с кнопками (стрелками)\n setMaxOffset((prev) => (prev !== calculatedMaxOffset ? calculatedMaxOffset : prev));\n },\n [\n gap,\n scrollMode,\n orientation,\n getSlidesCount,\n getSlideEnd,\n getViewportSize,\n normalizedPadding,\n pageMode,\n getSlideSize,\n getSlideStart,\n ],\n );\n\n const nextSlide = useCallback(() => {\n if (pageMode) {\n setCurrentIndex((prev) => (prev === activeIndices.length - 1 ? prev : prev + 1));\n return;\n }\n\n const slidesCount = getSlidesCount();\n const containerSize = getViewportSize();\n\n const currentSlideEnd = getSlideEnd(currentIndex);\n\n const { end: endKey } = ORIENTATION_TO_PADDING_KEY[orientation];\n const endP = normalizedPadding[endKey];\n\n // Случай 1: Мы на огромном слайде, и его правый край всё еще скрыт за экраном\n if (currentSlideEnd + endP > offset + containerSize + 1) {\n // Вычисляем следующий шаг (не дальше, чем правый край слайда с учётом endP)\n const maxSlideOffset = currentSlideEnd - containerSize + endP;\n const nextOffset = Math.min(offset + containerSize, maxSlideOffset);\n const clampedOffset = Math.min(nextOffset, maxOffsetRef.current);\n\n setOffset(clampedOffset);\n return; // Индекс не меняем, просто продвинули скролл внутри слайда\n }\n\n // Случай 2: Текущий слайд закончился, ищем следующий скрытый элемент\n for (let i = currentIndex + 1; i < slidesCount; i++) {\n const slideEnd = getSlideEnd(i);\n\n if (slideEnd + endP > offset + containerSize + 1) {\n setCurrentIndex(i);\n return;\n }\n }\n setCurrentIndex(Math.max(0, slidesCount - 1));\n }, [\n pageMode,\n activeIndices.length,\n getSlidesCount,\n getViewportSize,\n getSlideEnd,\n orientation,\n normalizedPadding,\n offset,\n currentIndex,\n ]);\n\n const prevSlide = useCallback(() => {\n if (pageMode) {\n setCurrentIndex((prev) => (prev === 0 ? prev : prev - 1));\n return;\n }\n\n const containerSize = getViewportSize();\n const currentSlideStart = getSlideStart(currentIndex);\n\n const { start: startKey } = ORIENTATION_TO_PADDING_KEY[orientation];\n const startP = normalizedPadding[startKey];\n\n // Случай 1: Мы на огромном слайде, и его левый край скрыт слева за экраном\n if (currentSlideStart - startP < offset - 1) {\n // Вычисляем шаг назад (не дальше, чем левый край слайда с учётом startP)\n const minSlideOffset = currentSlideStart - startP;\n const prevOffset = Math.max(offset - containerSize, minSlideOffset);\n const clampedOffset = Math.max(0, prevOffset);\n\n setOffset(clampedOffset);\n return; // Индекс не меняем, скроллим назад внутри слайда\n }\n\n // Случай 2: Левый край текущего слайда полностью виден, ищем предыдущие скрытые элементы\n for (let i = currentIndex - 1; i >= 0; i--) {\n const slideStart = getSlideStart(i);\n\n if (slideStart - startP < offset - 1) {\n setCurrentIndex(i);\n return;\n }\n }\n\n setCurrentIndex(0);\n }, [pageMode, getViewportSize, getSlideStart, orientation, normalizedPadding, offset, currentIndex]);\n\n const goToSlide = useCallback(\n (slideIndex: number) => {\n const slidesCount = getSlidesCount();\n if (slidesCount === 0) {\n setCurrentIndex(0);\n return;\n }\n\n const clampedIndex = Math.max(0, Math.min(slideIndex, slidesCount - 1));\n setCurrentIndex(clampedIndex);\n },\n [getSlidesCount],\n );\n\n // ResizeObserver для адаптивности при изменении размеров экрана или контента\n useLayoutEffect(() => {\n if (!viewportRef.current || !trackRef.current) return;\n\n const observer = new ResizeObserver(() => {\n geometryCacheRef.current.sizes.clear();\n geometryCacheRef.current.starts.clear();\n\n updateOffsetAndPages(currentIndexRef.current);\n });\n\n observer.observe(viewportRef.current);\n observer.observe(trackRef.current);\n\n return () => observer.disconnect();\n }, [updateOffsetAndPages]);\n\n // Сброс индекса при изменении ключевых настроек карусели\n useEffect(() => {\n setCurrentIndex(0);\n }, [gap, scrollMode, orientation]);\n\n // Синхронизация смещения при изменении индекса\n useEffect(() => {\n updateOffsetAndPages(currentIndex);\n }, [currentIndex, updateOffsetAndPages]);\n\n // Очистка запланированных анимационных фреймов при размонтировании карусели\n useEffect(() => {\n return () => {\n if (pageRafIdRef.current !== null) {\n cancelAnimationFrame(pageRafIdRef.current);\n }\n };\n }, []);\n\n // Вычисление граничных состояний (актуально для отключения стрелок навигации)\n const atStart = pageMode ? currentIndex === 0 : offset <= 1;\n const atEnd = pageMode\n ? activeIndices.length === 0 || currentIndex >= activeIndices.length - 1\n : maxOffset > 0\n ? offset >= maxOffset - 1\n : true;\n\n const classNames = clsx(styles.carousel, styles[orientation], className);\n\n const contextValue = useMemo(\n () => ({\n gap,\n orientation,\n scrollMode,\n offset,\n activeIndices,\n currentIndex,\n viewportPaddingStyle,\n atStart,\n atEnd,\n nextSlide,\n prevSlide,\n goToSlide,\n orientationRef,\n offsetRef,\n maxOffsetRef,\n viewportRef,\n trackRef,\n slideRefs,\n }),\n [\n gap,\n orientation,\n scrollMode,\n offset,\n activeIndices,\n currentIndex,\n viewportPaddingStyle,\n atStart,\n atEnd,\n nextSlide,\n prevSlide,\n goToSlide,\n ],\n );\n\n return (\n <CarouselContext.Provider value={contextValue}>\n <div className={classNames} {...restProps} ref={ref}>\n {children}\n </div>\n </CarouselContext.Provider>\n );\n },\n);\n\nCarouselRoot.displayName = \"Carousel\";\n\n/** Карусель. */\nexport const Carousel = Object.assign(CarouselRoot, {\n Viewport: CarouselViewport,\n Track: CarouselTrack,\n Item: CarouselItem,\n PrevButton: CarouselPrevButton,\n NextButton: CarouselNextButton,\n Indicators: CarouselIndicators,\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Carousel.js","sources":["../../../src/components/Carousel/Carousel.tsx"],"sourcesContent":["import React, { useState, useMemo, useRef, useLayoutEffect, useCallback, useEffect } from \"react\";\nimport clsx from \"clsx\";\nimport { CarouselContext } from \"./CarouselContext\";\nimport { ICarouselProps } from \"./types\";\nimport { ECarouselScrollMode } from \"./enums\";\nimport { EOrientation } from \"../../enums\";\nimport { resolveViewportPadding } from \"./utils\";\nimport { useLatestRef } from \"../../utils/refs\";\nimport styles from \"./styles/Carousel.module.less\";\nimport { CarouselViewport } from \"./CarouselViewport\";\nimport { CarouselTrack } from \"./CarouselTrack\";\nimport { CarouselItem } from \"./CarouselItem\";\nimport { CarouselPrevButton, CarouselNextButton } from \"./CarouselButton\";\nimport { CarouselIndicators } from \"./CarouselIndicators\";\n\nconst ORIENTATION_TO_PADDING_KEY = {\n [EOrientation.HORIZONTAL]: { start: \"left\", end: \"right\" },\n [EOrientation.VERTICAL]: { start: \"top\", end: \"bottom\" },\n} as const;\n\nconst ORIENTATION_TO_RECT_SIZE_KEY = {\n [EOrientation.HORIZONTAL]: \"width\",\n [EOrientation.VERTICAL]: \"height\",\n} as const;\n\nconst ORIENTATION_TO_CLIENT_SIZE_KEY = {\n [EOrientation.HORIZONTAL]: \"clientWidth\",\n [EOrientation.VERTICAL]: \"clientHeight\",\n} as const;\n\n/** Контейнер составной карусели: управляет геометрией, текущим слайдом и состоянием навигации. */\nconst CarouselRoot = React.forwardRef<HTMLDivElement, ICarouselProps>(\n (\n {\n children,\n orientation = EOrientation.HORIZONTAL,\n scrollMode = ECarouselScrollMode.ITEM,\n gap = 16,\n viewportPadding = 0,\n className,\n ...restProps\n },\n ref,\n ) => {\n const [offset, setOffset] = useState(0);\n const [maxOffset, setMaxOffset] = useState(0);\n const [activeIndices, setActiveIndices] = useState<number[]>([]);\n const [currentIndex, setCurrentIndex] = useState(0);\n\n const paddingKey = Array.isArray(viewportPadding) ? viewportPadding.join(\",\") : String(viewportPadding);\n const { metrics: normalizedPadding, style: viewportPaddingStyle } = useMemo(\n () => resolveViewportPadding(viewportPadding),\n // eslint-disable-next-line react-hooks/exhaustive-deps -- мемоизация по значению, а не по ссылке\n [paddingKey],\n );\n\n // Защита от пересоздания обработчиков жестов во Viewport при смене ориентации\n const orientationRef = useLatestRef(orientation);\n // Защита от бесконечного цикла рендеров в updateOffsetAndPages\n const offsetRef = useLatestRef(offset);\n // Защита от stale closures в ResizeObserver\n const currentIndexRef = useLatestRef(currentIndex);\n\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const trackRef = useRef<HTMLDivElement | null>(null);\n const slideRefs = useRef<Map<number, HTMLDivElement>>(new Map());\n const maxOffsetRef = useRef(maxOffset);\n\n // Реф для отслеживания запланированного кадра анимации\n const pageRafIdRef = useRef<number | null>(null);\n // Хранит настройки предыдущего успешного расчёта для авто-сброса кэша\n const lastConfigRef = useRef({ gap, scrollMode, orientation });\n\n const geometryCacheRef = useRef<{\n sizes: Map<number, number>;\n starts: Map<number, number>;\n }>({ sizes: new Map(), starts: new Map() });\n\n const pageMode = scrollMode === ECarouselScrollMode.PAGE;\n\n const getSlideSize = useCallback(\n (index: number) => {\n if (geometryCacheRef.current.sizes.has(index)) {\n // Безопасно: строка выше гарантирует наличие значения в кэше.\n return geometryCacheRef.current.sizes.get(index)!;\n }\n\n const slide = slideRefs.current.get(index);\n if (!slide) return 0;\n\n const rect = slide.getBoundingClientRect();\n const key = ORIENTATION_TO_RECT_SIZE_KEY[orientation];\n const size = rect[key];\n\n geometryCacheRef.current.sizes.set(index, size);\n return size;\n },\n [orientation],\n );\n\n const getSlidesCount = useCallback(() => slideRefs.current.size, []);\n\n const getSlideStart = useCallback(\n (index: number): number => {\n if (index <= 0) {\n return 0;\n }\n\n if (geometryCacheRef.current.starts.has(index)) {\n // Безопасно: строка выше гарантирует наличие значения в кэше.\n return geometryCacheRef.current.starts.get(index)!;\n }\n\n const prevIndex = index - 1;\n const start = getSlideStart(prevIndex) + getSlideSize(prevIndex) + gap;\n\n geometryCacheRef.current.starts.set(index, start);\n return start;\n },\n [gap, getSlideSize],\n );\n\n const getSlideEnd = useCallback(\n (index: number) => {\n return getSlideStart(index) + getSlideSize(index);\n },\n [getSlideStart, getSlideSize],\n );\n\n const getViewportSize = useCallback(() => {\n if (!viewportRef.current) return 0;\n const key = ORIENTATION_TO_CLIENT_SIZE_KEY[orientation];\n return viewportRef.current[key];\n }, [orientation]);\n\n const updateOffsetAndPages = useCallback(\n (index: number) => {\n const lastConfig = lastConfigRef.current;\n if (\n lastConfig.gap !== gap ||\n lastConfig.scrollMode !== scrollMode ||\n lastConfig.orientation !== orientation\n ) {\n geometryCacheRef.current.sizes.clear();\n geometryCacheRef.current.starts.clear();\n lastConfigRef.current = { gap, scrollMode, orientation };\n }\n\n const slidesCount = getSlidesCount();\n if (slidesCount === 0) {\n maxOffsetRef.current = 0;\n setOffset((prev) => (prev !== 0 ? 0 : prev));\n setMaxOffset((prev) => (prev !== 0 ? 0 : prev));\n setActiveIndices(Array.of());\n return;\n }\n\n const totalContentSize = getSlideEnd(slidesCount - 1);\n const containerSize = getViewportSize();\n\n const { start: startKey, end: endKey } = ORIENTATION_TO_PADDING_KEY[orientation];\n const startP = normalizedPadding[startKey];\n const endP = normalizedPadding[endKey];\n // Видимая область для группировки и центрирования страниц — без отступов Viewport\n const pageSize = Math.max(0, containerSize - startP - endP);\n\n const calculatedMaxOffset = Math.max(0, totalContentSize + startP + endP - containerSize);\n maxOffsetRef.current = calculatedMaxOffset;\n\n let targetOffset = 0;\n\n if (pageMode && containerSize > 0) {\n const pagesMatrix: number[][] = [];\n let currentPage: number[] = [];\n let currentGroupSize = 0;\n\n for (let i = 0; i < slidesCount; i++) {\n const slideSize = getSlideSize(i);\n const addedSize = currentPage.length > 0 ? slideSize + gap : slideSize;\n\n if (currentGroupSize + addedSize <= pageSize + 1) {\n currentPage.push(i);\n currentGroupSize += addedSize;\n } else {\n if (currentPage.length > 0) pagesMatrix.push(currentPage);\n currentPage = [i];\n currentGroupSize = slideSize;\n }\n }\n\n if (currentPage.length > 0) pagesMatrix.push(currentPage);\n\n const clampedIndex = Math.max(0, Math.min(index, pagesMatrix.length - 1));\n\n if (clampedIndex !== index) {\n if (pageRafIdRef.current !== null) {\n cancelAnimationFrame(pageRafIdRef.current);\n }\n\n pageRafIdRef.current = requestAnimationFrame(() => {\n setCurrentIndex(clampedIndex);\n pageRafIdRef.current = null;\n });\n }\n\n const validPageIndices = Array.from({ length: pagesMatrix.length }, (_, i) => i);\n\n setActiveIndices((prev) => {\n if (prev.length === validPageIndices.length) return prev;\n return validPageIndices;\n });\n\n const currentGroup = pagesMatrix[clampedIndex];\n if (currentGroup && currentGroup.length > 0) {\n const firstSlideIndex = currentGroup[0];\n const lastSlideIndex = currentGroup[currentGroup.length - 1];\n const groupStart = getSlideStart(firstSlideIndex);\n\n const lastSlideSize = getSlideSize(lastSlideIndex);\n const groupEnd = getSlideStart(lastSlideIndex) + lastSlideSize;\n const groupSize = groupEnd - groupStart;\n\n targetOffset = groupStart - (pageSize - groupSize) / 2;\n }\n } else {\n setActiveIndices((prev) => (prev.length === 0 ? prev : []));\n\n const slideStart = getSlideStart(index);\n const slideEnd = getSlideEnd(index);\n\n const currentOffset = offsetRef.current;\n const containerEnd = currentOffset + containerSize;\n\n // Ситуация 1: Слайд шире, чем сам контейнер (огромный слайд)\n if (slideEnd - slideStart > containerSize) {\n if (currentOffset < slideStart - startP) {\n targetOffset = slideStart - startP;\n } else if (currentOffset + containerSize > slideEnd + endP) {\n targetOffset = slideEnd - containerSize + endP;\n } else {\n targetOffset = currentOffset;\n }\n }\n // Ситуация 2: Стандартный слайд (меньше или равен размеру контейнера)\n else {\n if (slideEnd > containerEnd + 1) {\n targetOffset = slideEnd - containerSize + startP + endP;\n } else if (slideStart < currentOffset - 1) {\n targetOffset = slideStart - startP;\n } else {\n targetOffset = currentOffset;\n }\n }\n }\n\n if (targetOffset <= 0 || calculatedMaxOffset === 0) {\n setOffset(0);\n } else if (targetOffset >= calculatedMaxOffset) {\n setOffset(calculatedMaxOffset);\n } else {\n setOffset(targetOffset);\n }\n\n // Обновляем реактивный стейт для синхронизации с кнопками (стрелками)\n setMaxOffset((prev) => (prev !== calculatedMaxOffset ? calculatedMaxOffset : prev));\n },\n [\n gap,\n scrollMode,\n orientation,\n getSlidesCount,\n getSlideEnd,\n getViewportSize,\n normalizedPadding,\n pageMode,\n getSlideSize,\n getSlideStart,\n offsetRef,\n ],\n );\n\n const nextSlide = useCallback(() => {\n if (pageMode) {\n setCurrentIndex((prev) => (prev === activeIndices.length - 1 ? prev : prev + 1));\n return;\n }\n\n const slidesCount = getSlidesCount();\n const containerSize = getViewportSize();\n\n const currentSlideEnd = getSlideEnd(currentIndex);\n\n const { end: endKey } = ORIENTATION_TO_PADDING_KEY[orientation];\n const endP = normalizedPadding[endKey];\n\n // Случай 1: Мы на огромном слайде, и его правый край всё еще скрыт за экраном\n if (currentSlideEnd + endP > offset + containerSize + 1) {\n // Вычисляем следующий шаг (не дальше, чем правый край слайда с учётом endP)\n const maxSlideOffset = currentSlideEnd - containerSize + endP;\n const nextOffset = Math.min(offset + containerSize, maxSlideOffset);\n const clampedOffset = Math.min(nextOffset, maxOffsetRef.current);\n\n setOffset(clampedOffset);\n return; // Индекс не меняем, просто продвинули скролл внутри слайда\n }\n\n // Случай 2: Текущий слайд закончился, ищем следующий скрытый элемент\n for (let i = currentIndex + 1; i < slidesCount; i++) {\n const slideEnd = getSlideEnd(i);\n\n if (slideEnd + endP > offset + containerSize + 1) {\n setCurrentIndex(i);\n return;\n }\n }\n setCurrentIndex(Math.max(0, slidesCount - 1));\n }, [\n pageMode,\n activeIndices.length,\n getSlidesCount,\n getViewportSize,\n getSlideEnd,\n orientation,\n normalizedPadding,\n offset,\n currentIndex,\n ]);\n\n const prevSlide = useCallback(() => {\n if (pageMode) {\n setCurrentIndex((prev) => (prev === 0 ? prev : prev - 1));\n return;\n }\n\n const containerSize = getViewportSize();\n const currentSlideStart = getSlideStart(currentIndex);\n\n const { start: startKey } = ORIENTATION_TO_PADDING_KEY[orientation];\n const startP = normalizedPadding[startKey];\n\n // Случай 1: Мы на огромном слайде, и его левый край скрыт слева за экраном\n if (currentSlideStart - startP < offset - 1) {\n // Вычисляем шаг назад (не дальше, чем левый край слайда с учётом startP)\n const minSlideOffset = currentSlideStart - startP;\n const prevOffset = Math.max(offset - containerSize, minSlideOffset);\n const clampedOffset = Math.max(0, prevOffset);\n\n setOffset(clampedOffset);\n return; // Индекс не меняем, скроллим назад внутри слайда\n }\n\n // Случай 2: Левый край текущего слайда полностью виден, ищем предыдущие скрытые элементы\n for (let i = currentIndex - 1; i >= 0; i--) {\n const slideStart = getSlideStart(i);\n\n if (slideStart - startP < offset - 1) {\n setCurrentIndex(i);\n return;\n }\n }\n\n setCurrentIndex(0);\n }, [pageMode, getViewportSize, getSlideStart, orientation, normalizedPadding, offset, currentIndex]);\n\n const goToSlide = useCallback(\n (slideIndex: number) => {\n const slidesCount = getSlidesCount();\n if (slidesCount === 0) {\n setCurrentIndex(0);\n return;\n }\n\n const clampedIndex = Math.max(0, Math.min(slideIndex, slidesCount - 1));\n setCurrentIndex(clampedIndex);\n },\n [getSlidesCount],\n );\n\n // ResizeObserver для адаптивности при изменении размеров экрана или контента\n useLayoutEffect(() => {\n if (!viewportRef.current || !trackRef.current) return;\n\n const observer = new ResizeObserver(() => {\n geometryCacheRef.current.sizes.clear();\n geometryCacheRef.current.starts.clear();\n\n updateOffsetAndPages(currentIndexRef.current);\n });\n\n observer.observe(viewportRef.current);\n observer.observe(trackRef.current);\n\n return () => observer.disconnect();\n }, [updateOffsetAndPages, currentIndexRef]);\n\n // Сброс индекса при изменении ключевых настроек карусели\n useEffect(() => {\n setCurrentIndex(0);\n }, [gap, scrollMode, orientation]);\n\n // Синхронизация смещения при изменении индекса\n useEffect(() => {\n updateOffsetAndPages(currentIndex);\n }, [currentIndex, updateOffsetAndPages]);\n\n // Очистка запланированных анимационных фреймов при размонтировании карусели\n useEffect(() => {\n return () => {\n if (pageRafIdRef.current !== null) {\n cancelAnimationFrame(pageRafIdRef.current);\n }\n };\n }, []);\n\n // Вычисление граничных состояний (актуально для отключения стрелок навигации)\n const atStart = pageMode ? currentIndex === 0 : offset <= 1;\n const atEnd = pageMode\n ? activeIndices.length === 0 || currentIndex >= activeIndices.length - 1\n : maxOffset > 0\n ? offset >= maxOffset - 1\n : true;\n\n const classNames = clsx(styles.carousel, styles[orientation], className);\n\n const contextValue = useMemo(\n () => ({\n gap,\n orientation,\n scrollMode,\n offset,\n activeIndices,\n currentIndex,\n viewportPaddingStyle,\n atStart,\n atEnd,\n nextSlide,\n prevSlide,\n goToSlide,\n orientationRef,\n offsetRef,\n maxOffsetRef,\n viewportRef,\n trackRef,\n slideRefs,\n }),\n [\n gap,\n orientation,\n scrollMode,\n offset,\n activeIndices,\n currentIndex,\n viewportPaddingStyle,\n atStart,\n atEnd,\n nextSlide,\n prevSlide,\n goToSlide,\n orientationRef,\n offsetRef,\n ],\n );\n\n return (\n <CarouselContext.Provider value={contextValue}>\n <div className={classNames} {...restProps} ref={ref}>\n {children}\n </div>\n </CarouselContext.Provider>\n );\n },\n);\n\nCarouselRoot.displayName = \"Carousel\";\n\n/** Составная карусель с прокруткой по элементам или страницам в горизонтальной или вертикальной ориентации. */\nexport const Carousel = Object.assign(CarouselRoot, {\n Viewport: CarouselViewport,\n Track: CarouselTrack,\n Item: CarouselItem,\n PrevButton: CarouselPrevButton,\n NextButton: CarouselNextButton,\n Indicators: CarouselIndicators,\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,21 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
|
-
import React, {
|
|
2
|
+
import React, { useCallback, useContext } from "react";
|
|
3
3
|
import { c as clsx } from "../../chunks/vendor-Bf_-FiU6.js";
|
|
4
|
-
import { CarouselContext } from "./CarouselContext.js";
|
|
5
|
-
import { useMatchMedia } from "../MediaWidth/useMatchMedia.js";
|
|
6
|
-
import { ButtonIcon } from "../Button/ButtonIcon.js";
|
|
7
4
|
import { CaretupStrokeSrvIcon20, CaretleftStrokeSrvIcon20, CaretdownStrokeSrvIcon20, CaretrightStrokeSrvIcon20 } from "@sberbusiness/icons-next";
|
|
8
5
|
import { EOrientation } from "../../enums/EOrientation.js";
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
({ children, className, onClick, ...restProps }, ref) => {
|
|
16
|
-
const { orientation, atStart, prevSlide } = useContext(CarouselContext);
|
|
6
|
+
import { ButtonIcon } from "../Button/ButtonIcon.js";
|
|
7
|
+
import { useMatchMedia } from "../MediaWidth/useMatchMedia.js";
|
|
8
|
+
import { CarouselContext } from "./CarouselContext.js";
|
|
9
|
+
import { s as styles } from "../../chunks/Carousel.module-ugT1KfWo.js";
|
|
10
|
+
const CarouselNavButton = React.forwardRef(
|
|
11
|
+
({ atBoundary, slide, onClick, className, children, defaultIcon, ...restProps }, ref) => {
|
|
17
12
|
const touchDevice = useMatchMedia("(pointer: coarse)");
|
|
18
13
|
const handleClick = useCallback(
|
|
19
14
|
(event) => {
|
|
20
|
-
if (!
|
|
15
|
+
if (!atBoundary) slide();
|
|
21
16
|
onClick == null ? void 0 : onClick(event);
|
|
22
17
|
},
|
|
23
|
-
[
|
|
18
|
+
[atBoundary, slide, onClick]
|
|
24
19
|
);
|
|
25
20
|
if (touchDevice) {
|
|
26
21
|
return null;
|
|
@@ -29,11 +24,32 @@ const CarouselPrevButton = React.forwardRef(
|
|
|
29
24
|
ButtonIcon,
|
|
30
25
|
{
|
|
31
26
|
...restProps,
|
|
32
|
-
className: clsx(styles.navButton,
|
|
33
|
-
"aria-disabled":
|
|
27
|
+
className: clsx(styles.navButton, className),
|
|
28
|
+
"aria-disabled": atBoundary,
|
|
34
29
|
onClick: handleClick,
|
|
35
30
|
ref,
|
|
36
|
-
children: children ||
|
|
31
|
+
children: children || defaultIcon
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
CarouselNavButton.displayName = "CarouselNavButton";
|
|
37
|
+
const ORIENTATION_TO_PREV_ICON_MAP = {
|
|
38
|
+
[EOrientation.HORIZONTAL]: /* @__PURE__ */ jsx(CaretleftStrokeSrvIcon20, { paletteIndex: 7 }),
|
|
39
|
+
[EOrientation.VERTICAL]: /* @__PURE__ */ jsx(CaretupStrokeSrvIcon20, { paletteIndex: 7 })
|
|
40
|
+
};
|
|
41
|
+
const CarouselPrevButton = React.forwardRef(
|
|
42
|
+
({ className, ...restProps }, ref) => {
|
|
43
|
+
const { orientation, atStart, prevSlide } = useContext(CarouselContext);
|
|
44
|
+
return /* @__PURE__ */ jsx(
|
|
45
|
+
CarouselNavButton,
|
|
46
|
+
{
|
|
47
|
+
...restProps,
|
|
48
|
+
className: clsx(styles.prev, className),
|
|
49
|
+
atBoundary: atStart,
|
|
50
|
+
slide: prevSlide,
|
|
51
|
+
defaultIcon: ORIENTATION_TO_PREV_ICON_MAP[orientation],
|
|
52
|
+
ref
|
|
37
53
|
}
|
|
38
54
|
);
|
|
39
55
|
}
|
|
@@ -44,28 +60,17 @@ const ORIENTATION_TO_NEXT_ICON_MAP = {
|
|
|
44
60
|
[EOrientation.VERTICAL]: /* @__PURE__ */ jsx(CaretdownStrokeSrvIcon20, { paletteIndex: 7 })
|
|
45
61
|
};
|
|
46
62
|
const CarouselNextButton = React.forwardRef(
|
|
47
|
-
({
|
|
63
|
+
({ className, ...restProps }, ref) => {
|
|
48
64
|
const { orientation, atEnd, nextSlide } = useContext(CarouselContext);
|
|
49
|
-
const touchDevice = useMatchMedia("(pointer: coarse)");
|
|
50
|
-
const handleClick = useCallback(
|
|
51
|
-
(event) => {
|
|
52
|
-
if (!atEnd) nextSlide();
|
|
53
|
-
onClick == null ? void 0 : onClick(event);
|
|
54
|
-
},
|
|
55
|
-
[atEnd, nextSlide, onClick]
|
|
56
|
-
);
|
|
57
|
-
if (touchDevice) {
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
65
|
return /* @__PURE__ */ jsx(
|
|
61
|
-
|
|
66
|
+
CarouselNavButton,
|
|
62
67
|
{
|
|
63
68
|
...restProps,
|
|
64
|
-
className: clsx(styles.
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
+
className: clsx(styles.next, className),
|
|
70
|
+
atBoundary: atEnd,
|
|
71
|
+
slide: nextSlide,
|
|
72
|
+
defaultIcon: ORIENTATION_TO_NEXT_ICON_MAP[orientation],
|
|
73
|
+
ref
|
|
69
74
|
}
|
|
70
75
|
);
|
|
71
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CarouselButton.js","sources":["../../../src/components/Carousel/CarouselButton.tsx"],"sourcesContent":["import React, { useContext, useCallback } from \"react\";\nimport clsx from \"clsx\";\nimport {
|
|
1
|
+
{"version":3,"file":"CarouselButton.js","sources":["../../../src/components/Carousel/CarouselButton.tsx"],"sourcesContent":["import React, { useContext, useCallback } from \"react\";\nimport clsx from \"clsx\";\nimport {\n CaretleftStrokeSrvIcon20,\n CaretupStrokeSrvIcon20,\n CaretrightStrokeSrvIcon20,\n CaretdownStrokeSrvIcon20,\n} from \"@sberbusiness/icons-next\";\nimport { EOrientation } from \"../../enums\";\nimport { ButtonIcon, IButtonIconProps } from \"../Button/ButtonIcon\";\nimport { useMatchMedia } from \"../MediaWidth/useMatchMedia\";\nimport { CarouselContext } from \"./CarouselContext\";\nimport styles from \"./styles/Carousel.module.less\";\n\n/** Свойства компонента CarouselNavButton. */\ninterface ICarouselNavButtonProps extends IButtonIconProps {\n /** Карусель у края в направлении кнопки: переход не выполняется, `aria-disabled` равен `true`. */\n atBoundary: boolean;\n /** Переход к соседнему слайду в направлении кнопки. */\n slide: () => void;\n /** Иконка, когда `children` не заданы. */\n defaultIcon: React.ReactElement;\n}\n\n/** Общая реализация `Carousel.PrevButton` и `Carousel.NextButton`. */\nconst CarouselNavButton = React.forwardRef<HTMLButtonElement, ICarouselNavButtonProps>(\n ({ atBoundary, slide, onClick, className, children, defaultIcon, ...restProps }, ref) => {\n const touchDevice = useMatchMedia(\"(pointer: coarse)\");\n\n const handleClick = useCallback<React.MouseEventHandler<HTMLButtonElement>>(\n (event) => {\n if (!atBoundary) slide();\n onClick?.(event);\n },\n [atBoundary, slide, onClick],\n );\n\n if (touchDevice) {\n return null;\n }\n\n return (\n <ButtonIcon\n {...restProps}\n className={clsx(styles.navButton, className)}\n aria-disabled={atBoundary}\n onClick={handleClick}\n ref={ref}\n >\n {children || defaultIcon}\n </ButtonIcon>\n );\n },\n);\n\nCarouselNavButton.displayName = \"CarouselNavButton\";\n\nconst ORIENTATION_TO_PREV_ICON_MAP: Record<EOrientation, React.ReactElement> = {\n [EOrientation.HORIZONTAL]: <CaretleftStrokeSrvIcon20 paletteIndex={7} />,\n [EOrientation.VERTICAL]: <CaretupStrokeSrvIcon20 paletteIndex={7} />,\n};\n\n/** Кнопка перехода к предыдущему слайду Carousel. При (pointer: coarse) не рендерится. */\nexport const CarouselPrevButton = React.forwardRef<HTMLButtonElement, IButtonIconProps>(\n ({ className, ...restProps }, ref) => {\n const { orientation, atStart, prevSlide } = useContext(CarouselContext);\n\n return (\n <CarouselNavButton\n {...restProps}\n className={clsx(styles.prev, className)}\n atBoundary={atStart}\n slide={prevSlide}\n defaultIcon={ORIENTATION_TO_PREV_ICON_MAP[orientation]}\n ref={ref}\n />\n );\n },\n);\n\nCarouselPrevButton.displayName = \"Carousel.PrevButton\";\n\nconst ORIENTATION_TO_NEXT_ICON_MAP: Record<EOrientation, React.ReactElement> = {\n [EOrientation.HORIZONTAL]: <CaretrightStrokeSrvIcon20 paletteIndex={7} />,\n [EOrientation.VERTICAL]: <CaretdownStrokeSrvIcon20 paletteIndex={7} />,\n};\n\n/** Кнопка перехода к следующему слайду Carousel. При (pointer: coarse) не рендерится. */\nexport const CarouselNextButton = React.forwardRef<HTMLButtonElement, IButtonIconProps>(\n ({ className, ...restProps }, ref) => {\n const { orientation, atEnd, nextSlide } = useContext(CarouselContext);\n\n return (\n <CarouselNavButton\n {...restProps}\n className={clsx(styles.next, className)}\n atBoundary={atEnd}\n slide={nextSlide}\n defaultIcon={ORIENTATION_TO_NEXT_ICON_MAP[orientation]}\n ref={ref}\n />\n );\n },\n);\n\nCarouselNextButton.displayName = \"Carousel.NextButton\";\n"],"names":[],"mappings":";;;;;;;;;AAyBA,MAAM,oBAAoB,MAAM;AAAA,EAC5B,CAAC,EAAE,YAAY,OAAO,SAAS,WAAW,UAAU,aAAa,GAAG,UAAA,GAAa,QAAQ;AACrF,UAAM,cAAc,cAAc,mBAAmB;AAErD,UAAM,cAAc;AAAA,MAChB,CAAC,UAAU;AACP,YAAI,CAAC,WAAY,OAAA;AACjB,2CAAU;AAAA,MACd;AAAA,MACA,CAAC,YAAY,OAAO,OAAO;AAAA,IAAA;AAG/B,QAAI,aAAa;AACb,aAAO;AAAA,IACX;AAEA,WACI;AAAA,MAAC;AAAA,MAAA;AAAA,QACI,GAAG;AAAA,QACJ,WAAW,KAAK,OAAO,WAAW,SAAS;AAAA,QAC3C,iBAAe;AAAA,QACf,SAAS;AAAA,QACT;AAAA,QAEC,UAAA,YAAY;AAAA,MAAA;AAAA,IAAA;AAAA,EAGzB;AACJ;AAEA,kBAAkB,cAAc;AAEhC,MAAM,+BAAyE;AAAA,EAC3E,CAAC,aAAa,UAAU,GAAG,oBAAC,0BAAA,EAAyB,cAAc,GAAG;AAAA,EACtE,CAAC,aAAa,QAAQ,GAAG,oBAAC,wBAAA,EAAuB,cAAc,EAAA,CAAG;AACtE;AAGO,MAAM,qBAAqB,MAAM;AAAA,EACpC,CAAC,EAAE,WAAW,GAAG,UAAA,GAAa,QAAQ;AAClC,UAAM,EAAE,aAAa,SAAS,UAAA,IAAc,WAAW,eAAe;AAEtE,WACI;AAAA,MAAC;AAAA,MAAA;AAAA,QACI,GAAG;AAAA,QACJ,WAAW,KAAK,OAAO,MAAM,SAAS;AAAA,QACtC,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,aAAa,6BAA6B,WAAW;AAAA,QACrD;AAAA,MAAA;AAAA,IAAA;AAAA,EAGZ;AACJ;AAEA,mBAAmB,cAAc;AAEjC,MAAM,+BAAyE;AAAA,EAC3E,CAAC,aAAa,UAAU,GAAG,oBAAC,2BAAA,EAA0B,cAAc,GAAG;AAAA,EACvE,CAAC,aAAa,QAAQ,GAAG,oBAAC,0BAAA,EAAyB,cAAc,EAAA,CAAG;AACxE;AAGO,MAAM,qBAAqB,MAAM;AAAA,EACpC,CAAC,EAAE,WAAW,GAAG,UAAA,GAAa,QAAQ;AAClC,UAAM,EAAE,aAAa,OAAO,UAAA,IAAc,WAAW,eAAe;AAEpE,WACI;AAAA,MAAC;AAAA,MAAA;AAAA,QACI,GAAG;AAAA,QACJ,WAAW,KAAK,OAAO,MAAM,SAAS;AAAA,QACtC,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,aAAa,6BAA6B,WAAW;AAAA,QACrD;AAAA,MAAA;AAAA,IAAA;AAAA,EAGZ;AACJ;AAEA,mBAAmB,cAAc;"}
|
|
@@ -4,7 +4,7 @@ import { c as clsx } from "../../chunks/vendor-Bf_-FiU6.js";
|
|
|
4
4
|
import { CarouselContext } from "./CarouselContext.js";
|
|
5
5
|
import { ECarouselScrollMode } from "./enums.js";
|
|
6
6
|
import { PageIndicators } from "../PageIndicators/PageIndicators.js";
|
|
7
|
-
import { s as styles } from "../../chunks/Carousel.module-
|
|
7
|
+
import { s as styles } from "../../chunks/Carousel.module-ugT1KfWo.js";
|
|
8
8
|
const CarouselIndicators = React.forwardRef(
|
|
9
9
|
({ className, ...restProps }, ref) => {
|
|
10
10
|
const { currentIndex, orientation, scrollMode, activeIndices, goToSlide } = useContext(CarouselContext);
|
|
@@ -3,7 +3,7 @@ import React, { useContext, useRef, useCallback } from "react";
|
|
|
3
3
|
import { c as clsx } from "../../chunks/vendor-Bf_-FiU6.js";
|
|
4
4
|
import { CarouselContext } from "./CarouselContext.js";
|
|
5
5
|
import { mergeRefs } from "../../utils/refs.js";
|
|
6
|
-
import { s as styles } from "../../chunks/Carousel.module-
|
|
6
|
+
import { s as styles } from "../../chunks/Carousel.module-ugT1KfWo.js";
|
|
7
7
|
const CarouselItem = React.forwardRef(
|
|
8
8
|
({ children, className, index, ...restProps }, ref) => {
|
|
9
9
|
const { slideRefs } = useContext(CarouselContext);
|
|
@@ -21,7 +21,7 @@ const CarouselItem = React.forwardRef(
|
|
|
21
21
|
lastRegisteredIndexRef.current = null;
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
|
-
[index]
|
|
24
|
+
[index, slideRefs]
|
|
25
25
|
);
|
|
26
26
|
const combinedRef = mergeRefs(ref, registerItemRef);
|
|
27
27
|
return /* @__PURE__ */ jsx("div", { className: clsx(styles.slide, className), role: "group", ...restProps, ref: combinedRef, children });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CarouselItem.js","sources":["../../../src/components/Carousel/CarouselItem.tsx"],"sourcesContent":["import React, { useContext, useRef, useCallback } from \"react\";\nimport clsx from \"clsx\";\nimport { ICarouselItemProps } from \"./types\";\nimport { CarouselContext } from \"./CarouselContext\";\nimport { mergeRefs } from \"../../utils/refs\";\nimport styles from \"./styles/Carousel.module.less\";\n\nexport const CarouselItem = React.forwardRef<HTMLDivElement, ICarouselItemProps>(\n ({ children, className, index, ...restProps }, ref) => {\n const { slideRefs } = useContext(CarouselContext);\n\n const lastRegisteredIndexRef = useRef<number | null>(null);\n\n const registerItemRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (node) {\n if (lastRegisteredIndexRef.current !== null && lastRegisteredIndexRef.current !== index) {\n slideRefs.current.delete(lastRegisteredIndexRef.current);\n }\n slideRefs.current.set(index, node);\n lastRegisteredIndexRef.current = index;\n } else if (lastRegisteredIndexRef.current !== null) {\n slideRefs.current.delete(lastRegisteredIndexRef.current);\n lastRegisteredIndexRef.current = null;\n }\n },\n [index],\n );\n\n const combinedRef = mergeRefs(ref, registerItemRef);\n\n return (\n <div className={clsx(styles.slide, className)} role=\"group\" {...restProps} ref={combinedRef}>\n {children}\n </div>\n );\n },\n);\n\nCarouselItem.displayName = \"Carousel.Item\";\n"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"CarouselItem.js","sources":["../../../src/components/Carousel/CarouselItem.tsx"],"sourcesContent":["import React, { useContext, useRef, useCallback } from \"react\";\nimport clsx from \"clsx\";\nimport { ICarouselItemProps } from \"./types\";\nimport { CarouselContext } from \"./CarouselContext\";\nimport { mergeRefs } from \"../../utils/refs\";\nimport styles from \"./styles/Carousel.module.less\";\n\n/** Слайд карусели: регистрирует свой DOM-узел по индексу для измерения и навигации. */\nexport const CarouselItem = React.forwardRef<HTMLDivElement, ICarouselItemProps>(\n ({ children, className, index, ...restProps }, ref) => {\n const { slideRefs } = useContext(CarouselContext);\n\n const lastRegisteredIndexRef = useRef<number | null>(null);\n\n const registerItemRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (node) {\n if (lastRegisteredIndexRef.current !== null && lastRegisteredIndexRef.current !== index) {\n slideRefs.current.delete(lastRegisteredIndexRef.current);\n }\n slideRefs.current.set(index, node);\n lastRegisteredIndexRef.current = index;\n } else if (lastRegisteredIndexRef.current !== null) {\n slideRefs.current.delete(lastRegisteredIndexRef.current);\n lastRegisteredIndexRef.current = null;\n }\n },\n [index, slideRefs],\n );\n\n const combinedRef = mergeRefs(ref, registerItemRef);\n\n return (\n <div className={clsx(styles.slide, className)} role=\"group\" {...restProps} ref={combinedRef}>\n {children}\n </div>\n );\n },\n);\n\nCarouselItem.displayName = \"Carousel.Item\";\n"],"names":[],"mappings":";;;;;;AAQO,MAAM,eAAe,MAAM;AAAA,EAC9B,CAAC,EAAE,UAAU,WAAW,OAAO,GAAG,UAAA,GAAa,QAAQ;AACnD,UAAM,EAAE,UAAA,IAAc,WAAW,eAAe;AAEhD,UAAM,yBAAyB,OAAsB,IAAI;AAEzD,UAAM,kBAAkB;AAAA,MACpB,CAAC,SAAgC;AAC7B,YAAI,MAAM;AACN,cAAI,uBAAuB,YAAY,QAAQ,uBAAuB,YAAY,OAAO;AACrF,sBAAU,QAAQ,OAAO,uBAAuB,OAAO;AAAA,UAC3D;AACA,oBAAU,QAAQ,IAAI,OAAO,IAAI;AACjC,iCAAuB,UAAU;AAAA,QACrC,WAAW,uBAAuB,YAAY,MAAM;AAChD,oBAAU,QAAQ,OAAO,uBAAuB,OAAO;AACvD,iCAAuB,UAAU;AAAA,QACrC;AAAA,MACJ;AAAA,MACA,CAAC,OAAO,SAAS;AAAA,IAAA;AAGrB,UAAM,cAAc,UAAU,KAAK,eAAe;AAElD,WACI,oBAAC,OAAA,EAAI,WAAW,KAAK,OAAO,OAAO,SAAS,GAAG,MAAK,SAAS,GAAG,WAAW,KAAK,aAC3E,UACL;AAAA,EAER;AACJ;AAEA,aAAa,cAAc;"}
|
|
@@ -4,7 +4,7 @@ import { c as clsx } from "../../chunks/vendor-Bf_-FiU6.js";
|
|
|
4
4
|
import { CarouselContext } from "./CarouselContext.js";
|
|
5
5
|
import { mergeRefs } from "../../utils/refs.js";
|
|
6
6
|
import { ORIENTATION_TRANSFORM } from "./constants.js";
|
|
7
|
-
import { s as styles } from "../../chunks/Carousel.module-
|
|
7
|
+
import { s as styles } from "../../chunks/Carousel.module-ugT1KfWo.js";
|
|
8
8
|
const CarouselTrack = React.forwardRef(
|
|
9
9
|
({ children, className, style, ...restProps }, ref) => {
|
|
10
10
|
const { gap, orientation, offset, trackRef } = useContext(CarouselContext);
|
|
@@ -2,18 +2,17 @@ import { jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import React, { useContext, useRef, useCallback, useEffect } from "react";
|
|
3
3
|
import { c as clsx } from "../../chunks/vendor-Bf_-FiU6.js";
|
|
4
4
|
import { CarouselContext } from "./CarouselContext.js";
|
|
5
|
-
import { mergeRefs } from "../../utils/refs.js";
|
|
5
|
+
import { mergeRefs, useLatestRef } from "../../utils/refs.js";
|
|
6
6
|
import { ORIENTATION_TRANSFORM } from "./constants.js";
|
|
7
7
|
import { EOrientation } from "../../enums/EOrientation.js";
|
|
8
|
-
import { s as styles } from "../../chunks/Carousel.module-
|
|
9
|
-
const
|
|
10
|
-
[EOrientation.HORIZONTAL]: "clientX",
|
|
11
|
-
[EOrientation.VERTICAL]: "clientY"
|
|
12
|
-
};
|
|
13
|
-
const ORIENTATION_TO_CROSS_TOUCH_KEY = {
|
|
14
|
-
[EOrientation.HORIZONTAL]: "clientY",
|
|
15
|
-
[EOrientation.VERTICAL]: "clientX"
|
|
8
|
+
import { s as styles } from "../../chunks/Carousel.module-ugT1KfWo.js";
|
|
9
|
+
const ORIENTATION_TOUCH_KEYS = {
|
|
10
|
+
[EOrientation.HORIZONTAL]: { main: "clientX", cross: "clientY" },
|
|
11
|
+
[EOrientation.VERTICAL]: { main: "clientY", cross: "clientX" }
|
|
16
12
|
};
|
|
13
|
+
const AXIS_LOCK_THRESHOLD = 5;
|
|
14
|
+
const SWIPE_THRESHOLD = 50;
|
|
15
|
+
const RUBBER_BAND_RESISTANCE = 3;
|
|
17
16
|
const CarouselViewport = React.forwardRef(
|
|
18
17
|
({ children, className, style, onTouchStart, ...restProps }, ref) => {
|
|
19
18
|
const {
|
|
@@ -27,112 +26,83 @@ const CarouselViewport = React.forwardRef(
|
|
|
27
26
|
trackRef
|
|
28
27
|
} = useContext(CarouselContext);
|
|
29
28
|
const combinedRef = mergeRefs(ref, viewportRef);
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
const startOffsetRef = useRef(0);
|
|
34
|
-
const dragDistanceRef = useRef(0);
|
|
35
|
-
const touchMoveHandlerRef = useRef(null);
|
|
36
|
-
const touchEndHandlerRef = useRef(null);
|
|
29
|
+
const nextSlideRef = useLatestRef(nextSlide);
|
|
30
|
+
const prevSlideRef = useLatestRef(prevSlide);
|
|
31
|
+
const removeTouchListenersRef = useRef(null);
|
|
37
32
|
const clearTouchListeners = useCallback(() => {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
if (touchEndHandlerRef.current) {
|
|
43
|
-
window.removeEventListener("touchend", touchEndHandlerRef.current);
|
|
44
|
-
window.removeEventListener("touchcancel", touchEndHandlerRef.current);
|
|
45
|
-
touchEndHandlerRef.current = null;
|
|
46
|
-
}
|
|
33
|
+
var _a;
|
|
34
|
+
(_a = removeTouchListenersRef.current) == null ? void 0 : _a.call(removeTouchListenersRef);
|
|
35
|
+
removeTouchListenersRef.current = null;
|
|
47
36
|
}, []);
|
|
48
|
-
const
|
|
49
|
-
if (!draggingRef.current || !trackRef.current) return;
|
|
50
|
-
const touch = event.targetTouches[0];
|
|
51
|
-
if (!touch) return;
|
|
37
|
+
const startGesture = (touch) => {
|
|
52
38
|
const orientation = orientationRef.current;
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
if (
|
|
61
|
-
|
|
39
|
+
const { main: mainKey, cross: crossKey } = ORIENTATION_TOUCH_KEYS[orientation];
|
|
40
|
+
const startMain = touch[mainKey];
|
|
41
|
+
const startCross = touch[crossKey];
|
|
42
|
+
const startOffset = offsetRef.current;
|
|
43
|
+
let scrolling = null;
|
|
44
|
+
let dragDistance = 0;
|
|
45
|
+
const handleTouchMove = (moveEvent) => {
|
|
46
|
+
if (!trackRef.current) return;
|
|
47
|
+
const moveTouch = moveEvent.targetTouches[0];
|
|
48
|
+
if (!moveTouch) return;
|
|
49
|
+
const mainDistance = moveTouch[mainKey] - startMain;
|
|
50
|
+
const crossDistance = moveTouch[crossKey] - startCross;
|
|
51
|
+
if (scrolling === null) {
|
|
52
|
+
const absMain = Math.abs(mainDistance);
|
|
53
|
+
const absCross = Math.abs(crossDistance);
|
|
54
|
+
if (absMain <= AXIS_LOCK_THRESHOLD && absCross <= AXIS_LOCK_THRESHOLD) return;
|
|
55
|
+
scrolling = absCross > absMain;
|
|
56
|
+
if (scrolling) {
|
|
57
|
+
window.removeEventListener("touchmove", handleTouchMove);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
trackRef.current.style.transition = "none";
|
|
62
61
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
trackRef.current.style.transform = ORIENTATION_TRANSFORM[orientation](currentTranslate);
|
|
80
|
-
trackRef.current.style.transition = "none";
|
|
81
|
-
}, []);
|
|
82
|
-
const handleTouchEnd = useCallback(
|
|
83
|
-
(event) => {
|
|
84
|
-
if (!draggingRef.current) return;
|
|
85
|
-
draggingRef.current = false;
|
|
86
|
-
const scrolling = scrollingRef.current;
|
|
87
|
-
scrollingRef.current = null;
|
|
62
|
+
if (moveEvent.cancelable) {
|
|
63
|
+
moveEvent.preventDefault();
|
|
64
|
+
}
|
|
65
|
+
dragDistance = mainDistance;
|
|
66
|
+
const maxOffset = maxOffsetRef.current;
|
|
67
|
+
const targetOffset = startOffset - mainDistance;
|
|
68
|
+
let currentTranslate = -targetOffset;
|
|
69
|
+
if (targetOffset < 0) {
|
|
70
|
+
currentTranslate = -targetOffset / RUBBER_BAND_RESISTANCE;
|
|
71
|
+
} else if (targetOffset > maxOffset) {
|
|
72
|
+
currentTranslate = -(maxOffset + (targetOffset - maxOffset) / RUBBER_BAND_RESISTANCE);
|
|
73
|
+
}
|
|
74
|
+
trackRef.current.style.transform = ORIENTATION_TRANSFORM[orientation](currentTranslate);
|
|
75
|
+
};
|
|
76
|
+
const handleTouchEnd = (endEvent) => {
|
|
88
77
|
clearTouchListeners();
|
|
89
78
|
if (!trackRef.current) return;
|
|
90
79
|
trackRef.current.style.transition = "";
|
|
91
|
-
if (event.type === "touchcancel" || scrolling) {
|
|
92
|
-
trackRef.current.style.transform = "";
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
const finalDrag = dragDistanceRef.current;
|
|
96
|
-
const threshold = 50;
|
|
97
|
-
if (finalDrag > threshold) {
|
|
98
|
-
prevSlide();
|
|
99
|
-
} else if (finalDrag < -threshold) {
|
|
100
|
-
nextSlide();
|
|
101
|
-
}
|
|
102
80
|
trackRef.current.style.transform = "";
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
const touch = event.targetTouches[0];
|
|
109
|
-
if (!touch) return;
|
|
110
|
-
draggingRef.current = true;
|
|
111
|
-
scrollingRef.current = null;
|
|
112
|
-
startCoordsRef.current = {
|
|
113
|
-
clientX: touch.clientX,
|
|
114
|
-
clientY: touch.clientY
|
|
115
|
-
};
|
|
116
|
-
startOffsetRef.current = offsetRef.current;
|
|
117
|
-
dragDistanceRef.current = 0;
|
|
118
|
-
if (trackRef.current) {
|
|
119
|
-
trackRef.current.style.transition = "none";
|
|
81
|
+
if (endEvent.type === "touchcancel" || scrolling) return;
|
|
82
|
+
if (dragDistance > SWIPE_THRESHOLD) {
|
|
83
|
+
prevSlideRef.current();
|
|
84
|
+
} else if (dragDistance < -SWIPE_THRESHOLD) {
|
|
85
|
+
nextSlideRef.current();
|
|
120
86
|
}
|
|
121
|
-
clearTouchListeners();
|
|
122
|
-
touchMoveHandlerRef.current = handleTouchMove;
|
|
123
|
-
touchEndHandlerRef.current = handleTouchEnd;
|
|
124
|
-
window.addEventListener("touchmove", handleTouchMove, { passive: false });
|
|
125
|
-
window.addEventListener("touchend", handleTouchEnd);
|
|
126
|
-
window.addEventListener("touchcancel", handleTouchEnd);
|
|
127
|
-
onTouchStart == null ? void 0 : onTouchStart(event);
|
|
128
|
-
},
|
|
129
|
-
[handleTouchMove, handleTouchEnd, clearTouchListeners, onTouchStart]
|
|
130
|
-
);
|
|
131
|
-
useEffect(() => {
|
|
132
|
-
return () => {
|
|
133
|
-
clearTouchListeners();
|
|
134
87
|
};
|
|
135
|
-
|
|
88
|
+
clearTouchListeners();
|
|
89
|
+
window.addEventListener("touchmove", handleTouchMove, { passive: false });
|
|
90
|
+
window.addEventListener("touchend", handleTouchEnd);
|
|
91
|
+
window.addEventListener("touchcancel", handleTouchEnd);
|
|
92
|
+
removeTouchListenersRef.current = () => {
|
|
93
|
+
window.removeEventListener("touchmove", handleTouchMove);
|
|
94
|
+
window.removeEventListener("touchend", handleTouchEnd);
|
|
95
|
+
window.removeEventListener("touchcancel", handleTouchEnd);
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
const handleTouchStart = (event) => {
|
|
99
|
+
const touch = event.targetTouches[0];
|
|
100
|
+
if (touch) {
|
|
101
|
+
startGesture(touch);
|
|
102
|
+
}
|
|
103
|
+
onTouchStart == null ? void 0 : onTouchStart(event);
|
|
104
|
+
};
|
|
105
|
+
useEffect(() => clearTouchListeners, [clearTouchListeners]);
|
|
136
106
|
const runtimeStyle = {
|
|
137
107
|
"--triplex-next-runtime-carousel-viewport-padding": viewportPaddingStyle
|
|
138
108
|
};
|