@via-profit/ui-kit 0.3.0 → 0.4.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/Accordion/AccordionContainer.js +11 -11
- package/Accordion/AccordionContent.js +16 -7
- package/Accordion/AccordionHeader.d.ts +22 -0
- package/Accordion/AccordionHeader.js +35 -18
- package/Accordion/Chevron.js +3 -3
- package/Accordion/index.d.ts +12 -8
- package/Accordion/index.js +21 -6
- package/Autocomplete/AutocompleteContainer.d.ts +5 -9
- package/Autocomplete/AutocompleteContainer.js +91 -35
- package/Autocomplete/AutocompleteTagsInput.d.ts +15 -0
- package/Autocomplete/AutocompleteTagsInput.js +65 -0
- package/Autocomplete/context.d.ts +1 -0
- package/Autocomplete/context.js +5 -5
- package/Autocomplete/index.js +1 -0
- package/Avatar/AvatarBase.js +1 -1
- package/Avatar/AvatarContainer.js +6 -11
- package/Avatar/AvatarPicture.d.ts +9 -1
- package/Avatar/AvatarPicture.js +4 -3
- package/Avatar/index.js +10 -10
- package/Badge/BadgeBase.d.ts +9 -0
- package/Badge/BadgeBase.js +21 -3
- package/Badge/BadgeContainer.js +2 -1
- package/Badge/BadgeDeleteButton.d.ts +1 -1
- package/Badge/BadgeOutlined.d.ts +1 -1
- package/Badge/BadgeOutlined.js +5 -80
- package/Badge/BadgeStandard.d.ts +1 -1
- package/Badge/BadgeStandard.js +5 -91
- package/Badge/BadgeStyled.d.ts +5 -0
- package/Badge/BadgeStyled.js +125 -0
- package/Badge/index.d.ts +2 -2
- package/Badge/index.js +3 -20
- package/Button/ButtonBase.js +8 -4
- package/Button/ButtonContainer.js +2 -0
- package/Button/ButtonIconWrapper.d.ts +1 -1
- package/Button/ButtonOutlined.d.ts +1 -1
- package/Button/ButtonOutlined.js +5 -80
- package/Button/ButtonPlain.d.ts +1 -1
- package/Button/ButtonPlain.js +5 -85
- package/Button/ButtonStandard.d.ts +1 -1
- package/Button/ButtonStandard.js +5 -97
- package/Button/ButtonStyled.d.ts +10 -0
- package/Button/ButtonStyled.js +205 -0
- package/Button/index.d.ts +5 -5
- package/Button/index.js +3 -24
- package/ButtonGroup/ButtonGroupContext.d.ts +21 -0
- package/ButtonGroup/ButtonGroupContext.js +11 -0
- package/ButtonGroup/index.d.ts +76 -0
- package/ButtonGroup/index.js +132 -0
- package/CHANGELOG.md +122 -0
- package/Calendar/CalendarCell.js +11 -4
- package/Calendar/CalendarComponent.d.ts +15 -4
- package/Calendar/CalendarComponent.js +150 -55
- package/Calendar/CalendarDayBadge.d.ts +1 -1
- package/Calendar/CalendarMonthCell.js +1 -11
- package/Calendar/CalendarWeekDayLabel.js +3 -1
- package/Calendar/CalendarWeekDaysBar.js +6 -1
- package/Calendar/CalendarYearCell.js +1 -16
- package/Calendar/CalendarYearsSelector.d.ts +0 -1
- package/Calendar/CalendarYearsSelector.js +33 -35
- package/Calendar/use-calendar.d.ts +1 -1
- package/Checkbox/CheckboxAsterisk.d.ts +13 -0
- package/{Autocomplete2/Autocomplete2TextField.js → Checkbox/CheckboxAsterisk.js} +24 -10
- package/Checkbox/CheckboxBox.d.ts +22 -0
- package/Checkbox/CheckboxBox.js +88 -0
- package/Checkbox/CheckboxContainer.d.ts +27 -0
- package/Checkbox/CheckboxContainer.js +38 -0
- package/Checkbox/CheckboxErrorText.d.ts +6 -0
- package/Checkbox/CheckboxErrorText.js +76 -0
- package/Checkbox/CheckboxIcon.d.ts +10 -0
- package/Checkbox/CheckboxIcon.js +57 -0
- package/Checkbox/CheckboxTextWrapper.d.ts +4 -0
- package/Checkbox/CheckboxTextWrapper.js +29 -0
- package/Checkbox/CheckboxWrapper.d.ts +4 -0
- package/Checkbox/CheckboxWrapper.js +29 -0
- package/Checkbox/index.d.ts +144 -0
- package/Checkbox/index.js +71 -0
- package/Checkbox/useCheckboxColor.d.ts +6 -0
- package/Checkbox/useCheckboxColor.js +33 -0
- package/ClickOutside/index.d.ts +6 -0
- package/ClickOutside/index.js +7 -2
- package/Color/Color.d.ts +4 -4
- package/Color/Color.js +9 -5
- package/Color/ColorGenerator.d.ts +5 -1
- package/CountryFlags/AC.js +5 -1
- package/CountryFlags/AD.js +5 -1
- package/CountryFlags/AE.js +5 -1
- package/CountryFlags/AF.js +5 -1
- package/CountryFlags/AG.js +5 -1
- package/CountryFlags/AI.js +5 -1
- package/CountryFlags/AL.js +5 -1
- package/CountryFlags/AM.js +5 -1
- package/CountryFlags/AO.js +5 -1
- package/CountryFlags/AQ.js +5 -1
- package/CountryFlags/AR.js +5 -1
- package/CountryFlags/AS.js +5 -1
- package/CountryFlags/AT.js +5 -1
- package/CountryFlags/AU.js +5 -1
- package/CountryFlags/AW.js +5 -1
- package/CountryFlags/AX.js +5 -1
- package/CountryFlags/AZ.js +5 -1
- package/CountryFlags/BA.js +5 -1
- package/CountryFlags/BB.js +5 -1
- package/CountryFlags/BD.js +5 -1
- package/CountryFlags/BE.js +5 -1
- package/CountryFlags/BF.js +5 -1
- package/CountryFlags/BG.js +5 -1
- package/CountryFlags/BH.js +5 -1
- package/CountryFlags/BI.js +5 -1
- package/CountryFlags/BJ.js +5 -1
- package/CountryFlags/BL.js +5 -1
- package/CountryFlags/BM.js +5 -1
- package/CountryFlags/BN.js +5 -1
- package/CountryFlags/BO.js +5 -1
- package/CountryFlags/BQ.js +5 -1
- package/CountryFlags/BR.js +5 -1
- package/CountryFlags/BS.js +5 -1
- package/CountryFlags/BT.js +5 -1
- package/CountryFlags/BV.js +5 -1
- package/CountryFlags/BW.js +5 -1
- package/CountryFlags/BY.js +5 -1
- package/CountryFlags/BZ.js +5 -1
- package/CountryFlags/CA.js +5 -1
- package/CountryFlags/CC.js +5 -1
- package/CountryFlags/CD.js +5 -1
- package/CountryFlags/CF.js +5 -1
- package/CountryFlags/CG.js +5 -1
- package/CountryFlags/CH.js +5 -1
- package/CountryFlags/CI.js +5 -1
- package/CountryFlags/CK.js +5 -1
- package/CountryFlags/CL.js +5 -1
- package/CountryFlags/CM.js +5 -1
- package/CountryFlags/CN.js +5 -1
- package/CountryFlags/CO.js +5 -1
- package/CountryFlags/CR.js +5 -1
- package/CountryFlags/CU.js +5 -1
- package/CountryFlags/CV.js +5 -1
- package/CountryFlags/CW.js +5 -1
- package/CountryFlags/CX.js +5 -1
- package/CountryFlags/CY.js +5 -1
- package/CountryFlags/CZ.js +5 -1
- package/CountryFlags/DE.js +5 -1
- package/CountryFlags/DJ.js +5 -1
- package/CountryFlags/DK.js +5 -1
- package/CountryFlags/DM.js +5 -1
- package/CountryFlags/DO.js +5 -1
- package/CountryFlags/DZ.js +5 -1
- package/CountryFlags/EC.js +5 -1
- package/CountryFlags/EE.js +5 -1
- package/CountryFlags/EG.js +5 -1
- package/CountryFlags/EH.js +5 -1
- package/CountryFlags/ER.js +5 -1
- package/CountryFlags/ES.js +5 -1
- package/CountryFlags/ET.js +5 -1
- package/CountryFlags/EU.js +5 -1
- package/CountryFlags/FI.js +5 -1
- package/CountryFlags/FJ.js +5 -1
- package/CountryFlags/FK.js +5 -1
- package/CountryFlags/FM.js +5 -1
- package/CountryFlags/FO.js +5 -1
- package/CountryFlags/FR.js +5 -1
- package/CountryFlags/GA.js +5 -1
- package/CountryFlags/GB.js +5 -1
- package/CountryFlags/GD.js +5 -1
- package/CountryFlags/GE.js +5 -1
- package/CountryFlags/GEAB.js +5 -1
- package/CountryFlags/GEOS.js +5 -1
- package/CountryFlags/GF.js +5 -1
- package/CountryFlags/GG.js +5 -1
- package/CountryFlags/GH.js +5 -1
- package/CountryFlags/GI.js +5 -1
- package/CountryFlags/GL.js +5 -1
- package/CountryFlags/GM.js +5 -1
- package/CountryFlags/GN.js +5 -1
- package/CountryFlags/GP.js +5 -1
- package/CountryFlags/GQ.js +5 -1
- package/CountryFlags/GR.js +5 -1
- package/CountryFlags/GS.js +5 -1
- package/CountryFlags/GT.js +5 -1
- package/CountryFlags/GU.js +5 -1
- package/CountryFlags/GW.js +5 -1
- package/CountryFlags/GY.js +5 -1
- package/CountryFlags/HK.js +5 -1
- package/CountryFlags/HM.js +5 -1
- package/CountryFlags/HN.js +5 -1
- package/CountryFlags/HR.js +5 -1
- package/CountryFlags/HT.js +5 -1
- package/CountryFlags/HU.js +5 -1
- package/CountryFlags/IC.js +5 -1
- package/CountryFlags/ID.js +5 -1
- package/CountryFlags/IE.js +5 -1
- package/CountryFlags/IL.js +5 -1
- package/CountryFlags/IM.js +5 -1
- package/CountryFlags/IN.js +5 -1
- package/CountryFlags/IO.js +5 -1
- package/CountryFlags/IQ.js +5 -1
- package/CountryFlags/IR.js +5 -1
- package/CountryFlags/IS.js +5 -1
- package/CountryFlags/IT.js +5 -1
- package/CountryFlags/JE.js +5 -1
- package/CountryFlags/JM.js +5 -1
- package/CountryFlags/JO.js +5 -1
- package/CountryFlags/JP.js +5 -1
- package/CountryFlags/KE.js +5 -1
- package/CountryFlags/KG.js +5 -1
- package/CountryFlags/KH.js +5 -1
- package/CountryFlags/KI.js +5 -1
- package/CountryFlags/KM.js +5 -1
- package/CountryFlags/KN.js +5 -1
- package/CountryFlags/KP.js +5 -1
- package/CountryFlags/KR.js +5 -1
- package/CountryFlags/KW.js +5 -1
- package/CountryFlags/KY.js +5 -1
- package/CountryFlags/KZ.js +5 -1
- package/CountryFlags/LA.js +5 -1
- package/CountryFlags/LB.js +5 -1
- package/CountryFlags/LC.js +5 -1
- package/CountryFlags/LI.js +5 -1
- package/CountryFlags/LK.js +5 -1
- package/CountryFlags/LR.js +5 -1
- package/CountryFlags/LS.js +5 -1
- package/CountryFlags/LT.js +5 -1
- package/CountryFlags/LU.js +5 -1
- package/CountryFlags/LV.js +5 -1
- package/CountryFlags/LY.js +5 -1
- package/CountryFlags/MA.js +5 -1
- package/CountryFlags/MC.js +5 -1
- package/CountryFlags/MD.js +5 -1
- package/CountryFlags/ME.js +5 -1
- package/CountryFlags/MF.js +5 -1
- package/CountryFlags/MG.js +5 -1
- package/CountryFlags/MH.js +5 -1
- package/CountryFlags/MK.js +5 -1
- package/CountryFlags/ML.js +5 -1
- package/CountryFlags/MM.js +5 -1
- package/CountryFlags/MN.js +5 -1
- package/CountryFlags/MO.js +5 -1
- package/CountryFlags/MP.js +5 -1
- package/CountryFlags/MQ.js +5 -1
- package/CountryFlags/MR.js +5 -1
- package/CountryFlags/MS.js +5 -1
- package/CountryFlags/MT.js +5 -1
- package/CountryFlags/MU.js +5 -1
- package/CountryFlags/MV.js +5 -1
- package/CountryFlags/MW.js +5 -1
- package/CountryFlags/MX.js +5 -1
- package/CountryFlags/MY.js +5 -1
- package/CountryFlags/MZ.js +5 -1
- package/CountryFlags/NA.js +5 -1
- package/CountryFlags/NC.js +5 -1
- package/CountryFlags/NE.js +5 -1
- package/CountryFlags/NF.js +5 -1
- package/CountryFlags/NG.js +5 -1
- package/CountryFlags/NI.js +5 -1
- package/CountryFlags/NL.js +5 -1
- package/CountryFlags/NO.js +5 -1
- package/CountryFlags/NP.js +5 -1
- package/CountryFlags/NR.js +5 -1
- package/CountryFlags/NU.js +5 -1
- package/CountryFlags/NZ.js +5 -1
- package/CountryFlags/OM.js +5 -1
- package/CountryFlags/PA.js +5 -1
- package/CountryFlags/PE.js +5 -1
- package/CountryFlags/PF.js +5 -1
- package/CountryFlags/PG.js +5 -1
- package/CountryFlags/PH.js +5 -1
- package/CountryFlags/PK.js +5 -1
- package/CountryFlags/PL.js +5 -1
- package/CountryFlags/PM.js +5 -1
- package/CountryFlags/PN.js +5 -1
- package/CountryFlags/PR.js +5 -1
- package/CountryFlags/PS.js +5 -1
- package/CountryFlags/PT.js +5 -1
- package/CountryFlags/PW.js +5 -1
- package/CountryFlags/PY.js +5 -1
- package/CountryFlags/QA.js +5 -1
- package/CountryFlags/RE.js +5 -1
- package/CountryFlags/RO.js +5 -1
- package/CountryFlags/RS.js +5 -1
- package/CountryFlags/RU.js +5 -1
- package/CountryFlags/RW.js +5 -1
- package/CountryFlags/SA.js +5 -1
- package/CountryFlags/SB.js +5 -1
- package/CountryFlags/SC.js +5 -1
- package/CountryFlags/SD.js +5 -1
- package/CountryFlags/SE.js +5 -1
- package/CountryFlags/SG.js +5 -1
- package/CountryFlags/SH.js +5 -1
- package/CountryFlags/SI.js +5 -1
- package/CountryFlags/SJ.js +5 -1
- package/CountryFlags/SK.js +5 -1
- package/CountryFlags/SL.js +5 -1
- package/CountryFlags/SM.js +5 -1
- package/CountryFlags/SN.js +5 -1
- package/CountryFlags/SO.js +5 -1
- package/CountryFlags/SR.js +5 -1
- package/CountryFlags/SS.js +5 -1
- package/CountryFlags/ST.js +5 -1
- package/CountryFlags/SV.js +5 -1
- package/CountryFlags/SX.js +5 -1
- package/CountryFlags/SY.js +5 -1
- package/CountryFlags/SZ.js +5 -1
- package/CountryFlags/TA.js +5 -1
- package/CountryFlags/TC.js +5 -1
- package/CountryFlags/TD.js +5 -1
- package/CountryFlags/TF.js +5 -1
- package/CountryFlags/TG.js +5 -1
- package/CountryFlags/TH.js +5 -1
- package/CountryFlags/TJ.js +5 -1
- package/CountryFlags/TK.js +5 -1
- package/CountryFlags/TL.js +5 -1
- package/CountryFlags/TM.js +5 -1
- package/CountryFlags/TN.js +5 -1
- package/CountryFlags/TO.js +5 -1
- package/CountryFlags/TR.js +5 -1
- package/CountryFlags/TT.js +5 -1
- package/CountryFlags/TV.js +5 -1
- package/CountryFlags/TW.js +5 -1
- package/CountryFlags/TZ.js +5 -1
- package/CountryFlags/UA.js +5 -1
- package/CountryFlags/UG.js +5 -1
- package/CountryFlags/UM.js +5 -1
- package/CountryFlags/US.js +5 -1
- package/CountryFlags/UY.js +5 -1
- package/CountryFlags/UZ.js +5 -1
- package/CountryFlags/Uknown.d.ts +7 -3
- package/CountryFlags/Uknown.js +9 -31
- package/CountryFlags/Unknown.d.ts +3 -0
- package/CountryFlags/Unknown.js +42 -0
- package/CountryFlags/VA.js +5 -1
- package/CountryFlags/VC.js +5 -1
- package/CountryFlags/VE.js +5 -1
- package/CountryFlags/VG.js +5 -1
- package/CountryFlags/VI.js +5 -1
- package/CountryFlags/VN.js +5 -1
- package/CountryFlags/VU.js +5 -1
- package/CountryFlags/WF.js +5 -1
- package/CountryFlags/WS.js +5 -1
- package/CountryFlags/XK.js +5 -1
- package/CountryFlags/YE.js +5 -1
- package/CountryFlags/YT.js +5 -1
- package/CountryFlags/ZA.js +5 -1
- package/CountryFlags/ZM.js +5 -1
- package/CountryFlags/ZW.js +5 -1
- package/CountryFlags/index.d.ts +2 -1
- package/CountryFlags/index.js +3 -1
- package/CountryFlags/isLabelled.d.ts +6 -0
- package/CountryFlags/isLabelled.js +7 -0
- package/DatePicker/index.d.ts +19 -6
- package/DatePicker/index.js +59 -12
- package/Grid/index.d.ts +60 -0
- package/Grid/index.js +43 -0
- package/Highlighted/index.d.ts +1 -1
- package/Highlighted/index.js +14 -10
- package/LoadingIndicator/LoadingOverlay.d.ts +11 -0
- package/LoadingIndicator/LoadingOverlay.js +63 -0
- package/LoadingIndicator/Spinner.d.ts +34 -5
- package/LoadingIndicator/Spinner.js +48 -37
- package/LoadingIndicator/SpinnerCircle.d.ts +14 -0
- package/LoadingIndicator/SpinnerCircle.js +34 -0
- package/LoadingIndicator/index.d.ts +8 -3
- package/LoadingIndicator/index.js +9 -15
- package/MaskedField/index.d.ts +3 -2
- package/MaskedField/index.js +7 -2
- package/MaskedField/templates.js +2 -0
- package/MaskedField/useMasked.js +9 -6
- package/Menu/MenuContainer.d.ts +8 -0
- package/Menu/MenuContainer.js +101 -30
- package/Menu/MenuItem.js +1 -1
- package/Menu/context.js +5 -0
- package/Modal/BaseModal/useDialogID.d.ts +6 -0
- package/Modal/BaseModal/useDialogID.js +12 -0
- package/Modal/ConfirmBox/ConfirmBoxContainer.js +5 -1
- package/Modal/ConfirmBox/index.js +2 -1
- package/Modal/Dialog/DialogInner.js +1 -1
- package/Modal/Dialog/index.js +12 -7
- package/Modal/Drawer/DrawerHeader.d.ts +20 -0
- package/Modal/Drawer/DrawerHeader.js +3 -3
- package/Modal/Drawer/DrawerInner.js +9 -1
- package/Modal/Drawer/index.d.ts +7 -0
- package/Modal/Drawer/index.js +12 -10
- package/Modal/MessageBox/MessageBoxContainer.js +1 -1
- package/Modal/MessageBox/index.js +2 -1
- package/PhoneField/CountryFlagComponent.js +2 -2
- package/PhoneField/UnknownFlag.d.ts +6 -3
- package/PhoneField/UnknownFlag.js +8 -31
- package/PhoneField/index.js +45 -55
- package/PhoneField/templates.js +13 -14
- package/PhoneField/usePhoneUtils.d.ts +15 -0
- package/PhoneField/usePhoneUtils.js +30 -37
- package/Popper/Popper.d.ts +28 -8
- package/Popper/usePopper.d.ts +21 -31
- package/README.md +27 -10
- package/Radio/RadioBox.d.ts +14 -0
- package/Radio/RadioBox.js +100 -0
- package/Radio/RadioContainer.d.ts +27 -0
- package/Radio/RadioContainer.js +38 -0
- package/Radio/RadioTextWrapper.d.ts +4 -0
- package/Radio/RadioTextWrapper.js +29 -0
- package/Radio/index.d.ts +64 -0
- package/Radio/index.js +49 -0
- package/Radio/useRadioColor.d.ts +6 -0
- package/Radio/useRadioColor.js +33 -0
- package/RadioGroup/RadioGroupAsterisk.d.ts +13 -0
- package/RadioGroup/RadioGroupAsterisk.js +53 -0
- package/RadioGroup/RadioGroupContainer.d.ts +4 -0
- package/RadioGroup/RadioGroupContainer.js +36 -0
- package/RadioGroup/RadioGroupContext.d.ts +20 -0
- package/RadioGroup/RadioGroupContext.js +11 -0
- package/RadioGroup/RadioGroupErrorText.d.ts +6 -0
- package/RadioGroup/RadioGroupErrorText.js +76 -0
- package/RadioGroup/RadioGroupItems.d.ts +9 -0
- package/RadioGroup/RadioGroupItems.js +30 -0
- package/RadioGroup/RadioGroupLegend.d.ts +4 -0
- package/RadioGroup/RadioGroupLegend.js +37 -0
- package/RadioGroup/index.d.ts +134 -0
- package/RadioGroup/index.js +62 -0
- package/Selectbox/index.d.ts +18 -2
- package/Selectbox/index.js +23 -7
- package/Stack/index.d.ts +62 -0
- package/Stack/index.js +38 -0
- package/Surface/SurfaceContainer.js +6 -0
- package/Surface/index.js +7 -3
- package/Swiper/Swiper.d.ts +28 -2
- package/Swiper/Swiper.js +233 -90
- package/Swiper/SwiperContainer.js +0 -2
- package/Swiper/SwiperSlidesRenderer.d.ts +8 -0
- package/Swiper/SwiperSlidesRenderer.js +17 -14
- package/Swiper/SwiperTrack.d.ts +8 -0
- package/Swiper/SwiperTrack.js +8 -3
- package/Swiper/SwiperWrapper.js +9 -1
- package/Switch/SwitchContainer.d.ts +1 -1
- package/Switch/SwitchContainer.js +5 -5
- package/Switch/SwitchDot.js +13 -53
- package/Switch/SwitchToggleWrapper.d.ts +1 -1
- package/Switch/SwitchToggleWrapper.js +5 -6
- package/Switch/SwitchTrack.js +5 -41
- package/Switch/index.d.ts +4 -4
- package/Switch/index.js +21 -11
- package/Switch/useSwitchColor.d.ts +7 -0
- package/Switch/useSwitchColor.js +33 -0
- package/Table/Table.d.ts +6 -0
- package/Table/Table.js +7 -62
- package/Table/TableBody.d.ts +1 -1
- package/Table/TableBody.js +4 -2
- package/Table/TableCaption.d.ts +2 -2
- package/Table/TableCaption.js +2 -3
- package/Table/TableCell.js +2 -5
- package/Table/TableFooter.js +8 -7
- package/Table/TableHeader.js +6 -2
- package/Table/TableHeaderCell.js +8 -9
- package/Table/TableRow.js +1 -5
- package/TextArea/TextAreaIconWrapper.d.ts +1 -1
- package/TextArea/TextAreaInput.js +2 -0
- package/TextArea/index.js +1 -1
- package/TextField/TextFieldInput.js +2 -0
- package/TextField/TextFieldInputWrapper.d.ts +2 -0
- package/TextField/TextFieldInputWrapper.js +12 -2
- package/TextField/index.js +1 -1
- package/ThemeProvider/createTheme.js +2 -3
- package/ThemeProvider/index.d.ts +19 -2
- package/Typography/Base.d.ts +1 -1
- package/Typography/Base.js +1 -1
- package/Typography/Blockquote.js +1 -1
- package/Typography/Del.js +2 -2
- package/Typography/H4.js +1 -1
- package/Typography/H5.js +2 -2
- package/Typography/H6.d.ts +4 -0
- package/Typography/H6.js +28 -0
- package/Typography/SectionDescription.js +0 -1
- package/Typography/SectionTitle.d.ts +4 -7
- package/Typography/SectionTitle.js +26 -8
- package/Typography/index.d.ts +27 -0
- package/Typography/index.js +35 -0
- package/package.json +2 -4
- package/utils/spacing.d.ts +11 -0
- package/utils/spacing.js +14 -0
- package/Autocomplete/OverrideMenuList.d.ts +0 -4
- package/Autocomplete/OverrideMenuList.js +0 -39
- package/Autocomplete2/Autocomplete2.d.ts +0 -12
- package/Autocomplete2/Autocomplete2.js +0 -83
- package/Autocomplete2/Autocomplete2TextField.d.ts +0 -7
- package/Autocomplete2/index.d.ts +0 -2
- package/Autocomplete2/index.js +0 -7
- package/CountryFlags/SwiperOverview.d.ts +0 -257
- package/CountryFlags/SwiperOverview.js +0 -524
package/Swiper/Swiper.js
CHANGED
|
@@ -47,13 +47,14 @@ const SwiperWrapper_1 = __importDefault(require("./SwiperWrapper"));
|
|
|
47
47
|
const SwiperTrack_1 = __importDefault(require("./SwiperTrack"));
|
|
48
48
|
const SwiperSlidesRenderer_1 = __importDefault(require("./SwiperSlidesRenderer"));
|
|
49
49
|
__exportStar(require("./SwiperSlide"), exports);
|
|
50
|
+
const defaultSlideLabel = (index, total) => `${index + 1} / ${total}`;
|
|
50
51
|
exports.Swiper = React.forwardRef((props, ref) => {
|
|
51
|
-
const { children, dragThreshold = 240, snap = true, draggable = true, overrides, initialIndex = 0, infinite = false, onSlideChange, autoplay = false, autoplayInterval = 3000, pauseOnHover = true, threshold = 20, resistance = true, slidesPerView = 1 } = props, restProps = __rest(props, ["children", "dragThreshold", "snap", "draggable", "overrides", "initialIndex", "infinite", "onSlideChange", "autoplay", "autoplayInterval", "pauseOnHover", "threshold", "resistance", "slidesPerView"]);
|
|
52
|
+
const { children, dragThreshold = 240, snap = true, draggable = true, overrides, initialIndex = 0, infinite = false, onSlideChange, autoplay = false, autoplayInterval = 3000, pauseOnHover = true, threshold = 20, resistance = true, slidesPerView = 1, keyboardControl = true, slideLabel = defaultSlideLabel } = props, restProps = __rest(props, ["children", "dragThreshold", "snap", "draggable", "overrides", "initialIndex", "infinite", "onSlideChange", "autoplay", "autoplayInterval", "pauseOnHover", "threshold", "resistance", "slidesPerView", "keyboardControl", "slideLabel"]);
|
|
52
53
|
// #region Slides
|
|
53
54
|
const slides = React.useMemo(() => {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
// toArray skips null/false and keeps the user keys (prefixed), so the slides are not remounted
|
|
56
|
+
// when a slide is added to the start
|
|
57
|
+
const childrenSlides = React.Children.toArray(children).filter(React.isValidElement);
|
|
57
58
|
if (infinite) {
|
|
58
59
|
if (childrenSlides.length < 2) {
|
|
59
60
|
console.error('To infinite loop counts of the slides must be greater than 2');
|
|
@@ -72,14 +73,9 @@ exports.Swiper = React.forwardRef((props, ref) => {
|
|
|
72
73
|
key: `clone-tail-${i}`,
|
|
73
74
|
'data-clone': 'tail',
|
|
74
75
|
}));
|
|
75
|
-
|
|
76
|
-
key: `slide-${idx}`,
|
|
77
|
-
}));
|
|
78
|
-
return [...headClones, ...mainSlides, ...tailClones];
|
|
76
|
+
return [...headClones, ...childrenSlides, ...tailClones];
|
|
79
77
|
}
|
|
80
|
-
return childrenSlides
|
|
81
|
-
key: `slide-${idx}`,
|
|
82
|
-
}));
|
|
78
|
+
return childrenSlides;
|
|
83
79
|
}, [children, infinite, slidesPerView]);
|
|
84
80
|
const total = slides.length;
|
|
85
81
|
const realSlidesCount = infinite ? total - 2 * slidesPerView : total;
|
|
@@ -92,9 +88,15 @@ exports.Swiper = React.forwardRef((props, ref) => {
|
|
|
92
88
|
return initialIndex + slidesPerView;
|
|
93
89
|
});
|
|
94
90
|
const [offset, setOffset] = React.useState(0);
|
|
91
|
+
// The long decelerating transition after a free swipe (snap=false)
|
|
92
|
+
const [isMomentum, setIsMomentum] = React.useState(false);
|
|
95
93
|
const [isDragging, setIsDragging] = React.useState(false);
|
|
96
94
|
const [disableAnimation, setDisableAnimation] = React.useState(false);
|
|
97
|
-
const [
|
|
95
|
+
const [isPausedByApi, setIsPausedByApi] = React.useState(false);
|
|
96
|
+
const [isHovered, setIsHovered] = React.useState(false);
|
|
97
|
+
const [isFocused, setIsFocused] = React.useState(false);
|
|
98
|
+
// The pause by the API is not cancelled when the mouse leaves the swiper
|
|
99
|
+
const isPaused = isPausedByApi || isHovered || isFocused;
|
|
98
100
|
// #region Refs
|
|
99
101
|
const dragging = React.useRef(false);
|
|
100
102
|
const startX = React.useRef(0);
|
|
@@ -104,8 +106,8 @@ exports.Swiper = React.forwardRef((props, ref) => {
|
|
|
104
106
|
const wrapperRef = React.useRef(null);
|
|
105
107
|
const trackRef = React.useRef(null);
|
|
106
108
|
const isAnimating = React.useRef(false);
|
|
107
|
-
const autoplayTimer = React.useRef();
|
|
108
109
|
const mounted = React.useRef(true);
|
|
110
|
+
const suppressClick = React.useRef(false);
|
|
109
111
|
// #region Real Index
|
|
110
112
|
const realIndex = React.useMemo(() => {
|
|
111
113
|
if (!infinite) {
|
|
@@ -118,7 +120,8 @@ exports.Swiper = React.forwardRef((props, ref) => {
|
|
|
118
120
|
if (realIndex >= realSlidesCount) {
|
|
119
121
|
return realIndex - realSlidesCount;
|
|
120
122
|
}
|
|
121
|
-
|
|
123
|
+
// In the infinite mode any slide can be the first visible one, so there is no clamp
|
|
124
|
+
return realIndex;
|
|
122
125
|
}, [index, infinite, slidesPerView, realSlidesCount]);
|
|
123
126
|
const prevRealIndex = React.useRef(realIndex);
|
|
124
127
|
// #region Effects
|
|
@@ -131,11 +134,13 @@ exports.Swiper = React.forwardRef((props, ref) => {
|
|
|
131
134
|
React.useEffect(() => {
|
|
132
135
|
if (!mounted.current)
|
|
133
136
|
return;
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
+
// The slides were removed: keep the index inside the allowed range
|
|
138
|
+
const lastIndex = infinite ? total - slidesPerView : maxIndex;
|
|
139
|
+
if (index > lastIndex) {
|
|
140
|
+
setIndex(infinite ? slidesPerView : maxIndex);
|
|
141
|
+
setOffset(0);
|
|
137
142
|
}
|
|
138
|
-
}, [
|
|
143
|
+
}, [index, infinite, total, slidesPerView, maxIndex]);
|
|
139
144
|
// #region Normalization
|
|
140
145
|
const normalizeIndex = React.useCallback(() => {
|
|
141
146
|
if (!infinite || !mounted.current)
|
|
@@ -143,15 +148,17 @@ exports.Swiper = React.forwardRef((props, ref) => {
|
|
|
143
148
|
const firstRealIndex = slidesPerView;
|
|
144
149
|
const lastRealIndex = total - slidesPerView - 1;
|
|
145
150
|
if (index < firstRealIndex || index > lastRealIndex) {
|
|
146
|
-
|
|
151
|
+
// A clone position shows the same slides as the real position shifted by the slides count.
|
|
152
|
+
// Not always the first/last real slide: after several fast clicks the index may be deeper in the clones
|
|
153
|
+
const target = index < firstRealIndex ? index + realSlidesCount : index - realSlidesCount;
|
|
147
154
|
setDisableAnimation(true);
|
|
148
155
|
requestAnimationFrame(() => {
|
|
149
156
|
var _a;
|
|
150
157
|
if (!mounted.current)
|
|
151
158
|
return;
|
|
152
159
|
(_a = trackRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
|
|
160
|
+
// The offset is kept: in the free mode (snap=false) the track stops between the slides
|
|
153
161
|
setIndex(target);
|
|
154
|
-
setOffset(0);
|
|
155
162
|
requestAnimationFrame(() => {
|
|
156
163
|
if (mounted.current) {
|
|
157
164
|
setDisableAnimation(false);
|
|
@@ -159,7 +166,7 @@ exports.Swiper = React.forwardRef((props, ref) => {
|
|
|
159
166
|
});
|
|
160
167
|
});
|
|
161
168
|
}
|
|
162
|
-
}, [index, infinite, slidesPerView, total]);
|
|
169
|
+
}, [index, infinite, slidesPerView, total, realSlidesCount]);
|
|
163
170
|
// #region Navigation API
|
|
164
171
|
const indexRef = React.useRef(index);
|
|
165
172
|
React.useEffect(() => {
|
|
@@ -184,16 +191,21 @@ exports.Swiper = React.forwardRef((props, ref) => {
|
|
|
184
191
|
return; // никуда не едем — флаг не трогаем
|
|
185
192
|
}
|
|
186
193
|
setDisableAnimation(false);
|
|
194
|
+
setIsMomentum(false);
|
|
195
|
+
setOffset(0);
|
|
187
196
|
setIndex(targetIndex);
|
|
188
197
|
isAnimating.current = true;
|
|
189
198
|
}, [infinite, slidesPerView, realSlidesCount, maxIndex]);
|
|
190
199
|
const next = React.useCallback(() => {
|
|
191
|
-
// if (isAnimating.current) return;
|
|
192
200
|
setDisableAnimation(false);
|
|
201
|
+
setIsMomentum(false);
|
|
202
|
+
setOffset(0);
|
|
193
203
|
setIndex(prev => {
|
|
194
204
|
let nextIndex;
|
|
195
205
|
if (infinite) {
|
|
196
|
-
|
|
206
|
+
// The last position is the first tail clone: it mirrors the first real slide.
|
|
207
|
+
// Further positions would show the empty space when slidesPerView > 1
|
|
208
|
+
nextIndex = Math.min(prev + 1, total - slidesPerView);
|
|
197
209
|
}
|
|
198
210
|
else {
|
|
199
211
|
nextIndex = Math.min(prev + 1, maxIndex);
|
|
@@ -205,10 +217,11 @@ exports.Swiper = React.forwardRef((props, ref) => {
|
|
|
205
217
|
isAnimating.current = true;
|
|
206
218
|
return nextIndex;
|
|
207
219
|
});
|
|
208
|
-
}, [infinite, maxIndex, total]);
|
|
220
|
+
}, [infinite, maxIndex, total, slidesPerView]);
|
|
209
221
|
const prev = React.useCallback(() => {
|
|
210
|
-
// if (isAnimating.current) return;
|
|
211
222
|
setDisableAnimation(false);
|
|
223
|
+
setIsMomentum(false);
|
|
224
|
+
setOffset(0);
|
|
212
225
|
setIndex(prev => {
|
|
213
226
|
const nextIndex = Math.max(prev - 1, 0);
|
|
214
227
|
if (nextIndex === prev) {
|
|
@@ -218,22 +231,70 @@ exports.Swiper = React.forwardRef((props, ref) => {
|
|
|
218
231
|
return nextIndex;
|
|
219
232
|
});
|
|
220
233
|
}, []);
|
|
234
|
+
// #region Position
|
|
235
|
+
// The position is the distance in pixels from the start of the track to the left edge of the view.
|
|
236
|
+
// The state keeps it as index (whole slides) + offset (pixels), the track is translated by both
|
|
237
|
+
const getSlideWidth = React.useCallback(() => { var _a; return (((_a = wrapperRef.current) === null || _a === void 0 ? void 0 : _a.clientWidth) || 0) / slidesPerView; }, [slidesPerView]);
|
|
238
|
+
// The last allowed position. In the infinite mode it is the first tail clone
|
|
239
|
+
const maxPosition = React.useCallback(() => (infinite ? total - slidesPerView : maxIndex) * getSlideWidth(), [infinite, total, slidesPerView, maxIndex, getSlideWidth]);
|
|
240
|
+
// The position on the screen right now, also in the middle of a transition
|
|
241
|
+
const readPosition = React.useCallback(() => {
|
|
242
|
+
const track = trackRef.current;
|
|
243
|
+
if (track && typeof DOMMatrixReadOnly !== 'undefined') {
|
|
244
|
+
const { transform } = getComputedStyle(track);
|
|
245
|
+
if (transform && transform !== 'none') {
|
|
246
|
+
return -new DOMMatrixReadOnly(transform).m41;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return index * getSlideWidth() - offset;
|
|
250
|
+
}, [index, offset, getSlideWidth]);
|
|
251
|
+
// Infinite mode: the same view is shown by the real slides and by the clones,
|
|
252
|
+
// so the position is moved by the whole slides count when it comes close to the edge of the track
|
|
253
|
+
const wrapPosition = React.useCallback((position) => {
|
|
254
|
+
const width = getSlideWidth();
|
|
255
|
+
const span = realSlidesCount * width;
|
|
256
|
+
if (!infinite || width === 0)
|
|
257
|
+
return 0;
|
|
258
|
+
if (position < width * 0.5)
|
|
259
|
+
return span;
|
|
260
|
+
if (position > maxPosition() - width * 0.5)
|
|
261
|
+
return -span;
|
|
262
|
+
return 0;
|
|
263
|
+
}, [infinite, realSlidesCount, getSlideWidth, maxPosition]);
|
|
264
|
+
const dragBasePosition = React.useRef(0);
|
|
265
|
+
const dragAnchorIndex = React.useRef(0);
|
|
266
|
+
const dragPosition = React.useRef(0);
|
|
221
267
|
// #region Pointer Events
|
|
222
268
|
const onPointerDown = React.useCallback((e) => {
|
|
223
269
|
if (!wrapperRef.current || !draggable)
|
|
224
270
|
return;
|
|
271
|
+
// Only the main mouse button, the touch or the pen
|
|
272
|
+
if (e.pointerType === 'mouse' && e.button !== 0)
|
|
273
|
+
return;
|
|
274
|
+
const width = getSlideWidth();
|
|
275
|
+
// Grab the track where it is now: a running transition stops under the finger instead of jumping
|
|
276
|
+
let position = readPosition();
|
|
277
|
+
position += wrapPosition(position);
|
|
278
|
+
const anchor = width > 0 ? Math.round(position / width) : index;
|
|
279
|
+
dragBasePosition.current = position;
|
|
280
|
+
dragPosition.current = position;
|
|
281
|
+
dragAnchorIndex.current = anchor;
|
|
282
|
+
suppressClick.current = false;
|
|
225
283
|
dragging.current = true;
|
|
226
284
|
isAnimating.current = false;
|
|
227
285
|
setDisableAnimation(true);
|
|
286
|
+
setIsMomentum(false);
|
|
228
287
|
setIsDragging(true);
|
|
288
|
+
setIndex(anchor);
|
|
289
|
+
setOffset(anchor * width - position);
|
|
229
290
|
startX.current = e.clientX;
|
|
230
291
|
lastX.current = e.clientX;
|
|
231
292
|
lastTime.current = performance.now();
|
|
232
293
|
velocity.current = 0;
|
|
233
294
|
e.target.setPointerCapture(e.pointerId);
|
|
234
|
-
}, [draggable]);
|
|
295
|
+
}, [draggable, getSlideWidth, readPosition, wrapPosition, index]);
|
|
235
296
|
const onPointerMove = React.useCallback((e) => {
|
|
236
|
-
if (!dragging.current
|
|
297
|
+
if (!dragging.current)
|
|
237
298
|
return;
|
|
238
299
|
const now = performance.now();
|
|
239
300
|
const dx = e.clientX - lastX.current;
|
|
@@ -243,102 +304,172 @@ exports.Swiper = React.forwardRef((props, ref) => {
|
|
|
243
304
|
}
|
|
244
305
|
lastX.current = e.clientX;
|
|
245
306
|
lastTime.current = now;
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
307
|
+
const width = getSlideWidth();
|
|
308
|
+
let position = dragBasePosition.current - (e.clientX - startX.current);
|
|
309
|
+
// Endless drag in the infinite mode: move the base together with the position
|
|
310
|
+
const shift = wrapPosition(position);
|
|
311
|
+
if (shift !== 0) {
|
|
312
|
+
dragBasePosition.current += shift;
|
|
313
|
+
dragAnchorIndex.current += Math.round(shift / width);
|
|
314
|
+
position += shift;
|
|
315
|
+
}
|
|
316
|
+
if (!infinite) {
|
|
317
|
+
const max = maxPosition();
|
|
318
|
+
if (position < 0) {
|
|
319
|
+
position = resistance ? position * 0.3 : 0;
|
|
250
320
|
}
|
|
251
|
-
if (
|
|
252
|
-
|
|
321
|
+
else if (position > max) {
|
|
322
|
+
position = resistance ? max + (position - max) * 0.3 : max;
|
|
253
323
|
}
|
|
254
324
|
}
|
|
255
|
-
|
|
256
|
-
|
|
325
|
+
dragPosition.current = position;
|
|
326
|
+
// snap: the index stays the same during the drag, the slide changes after the release.
|
|
327
|
+
// free: the index follows the position, so onSlideChange reports the slide under the view
|
|
328
|
+
const nextIndex = snap ? dragAnchorIndex.current : Math.round(position / width);
|
|
329
|
+
setIndex(nextIndex);
|
|
330
|
+
setOffset(nextIndex * width - position);
|
|
331
|
+
}, [getSlideWidth, wrapPosition, infinite, maxPosition, resistance, snap]);
|
|
257
332
|
const onPointerUp = React.useCallback((e) => {
|
|
258
333
|
if (!dragging.current)
|
|
259
334
|
return;
|
|
335
|
+
const width = getSlideWidth();
|
|
336
|
+
const position = dragPosition.current;
|
|
260
337
|
const delta = lastX.current - startX.current;
|
|
261
|
-
|
|
262
|
-
const
|
|
263
|
-
const
|
|
264
|
-
|
|
265
|
-
if (Math.abs(delta) >
|
|
266
|
-
|
|
267
|
-
}
|
|
268
|
-
if (!infinite) {
|
|
269
|
-
nextIndex = Math.max(0, Math.min(maxIndex, nextIndex));
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
nextIndex = Math.max(0, Math.min(total - 1, nextIndex));
|
|
338
|
+
// The pointer stopped before the release: no inertia
|
|
339
|
+
const v = performance.now() - lastTime.current > 100 ? 0 : velocity.current;
|
|
340
|
+
const lastIndex = infinite ? total - slidesPerView : maxIndex;
|
|
341
|
+
// It was a drag, not a click: the click on a link or a button inside the slide must not fire
|
|
342
|
+
if (Math.abs(delta) > threshold) {
|
|
343
|
+
suppressClick.current = true;
|
|
273
344
|
}
|
|
274
345
|
setDisableAnimation(false);
|
|
275
346
|
if (snap) {
|
|
347
|
+
const anchor = dragAnchorIndex.current;
|
|
348
|
+
const displacement = position - anchor * width;
|
|
349
|
+
const velocityFactor = Math.min(Math.abs(v) * 250, 0.65);
|
|
350
|
+
const dynamicThreshold = Math.max(threshold, Math.min(dragThreshold * (1 - velocityFactor), dragThreshold));
|
|
351
|
+
let nextIndex = anchor;
|
|
352
|
+
if (Math.abs(displacement) > dynamicThreshold) {
|
|
353
|
+
// At least one slide, more if the slide was dragged further
|
|
354
|
+
nextIndex =
|
|
355
|
+
displacement > 0
|
|
356
|
+
? Math.max(anchor + 1, Math.round(position / width))
|
|
357
|
+
: Math.min(anchor - 1, Math.round(position / width));
|
|
358
|
+
}
|
|
359
|
+
nextIndex = Math.max(0, Math.min(lastIndex, nextIndex));
|
|
276
360
|
setIndex(nextIndex);
|
|
277
361
|
setOffset(0);
|
|
362
|
+
// A click without movement does not start a transition, so transitionend never comes
|
|
363
|
+
// and the flag would block autoplay and goToIndex forever
|
|
364
|
+
isAnimating.current = Math.abs(nextIndex * width - position) > 0.5;
|
|
278
365
|
}
|
|
279
366
|
else {
|
|
367
|
+
// Free mode: the track keeps moving by inertia and stops where it stops
|
|
368
|
+
const projected = Math.max(0, Math.min(lastIndex * width, position - v * 300));
|
|
369
|
+
const nextIndex = width > 0 ? Math.round(projected / width) : index;
|
|
370
|
+
setIsMomentum(true);
|
|
280
371
|
setIndex(nextIndex);
|
|
372
|
+
setOffset(nextIndex * width - projected);
|
|
373
|
+
isAnimating.current = Math.abs(projected - position) > 0.5;
|
|
281
374
|
}
|
|
282
|
-
// A click without movement does not start a transition, so transitionend never comes
|
|
283
|
-
// and the flag would block autoplay and goToIndex forever
|
|
284
|
-
isAnimating.current = nextIndex !== index || (snap && offset !== 0);
|
|
285
375
|
dragging.current = false;
|
|
286
376
|
setIsDragging(false);
|
|
287
377
|
e.target.releasePointerCapture(e.pointerId);
|
|
288
|
-
}, [
|
|
378
|
+
}, [
|
|
379
|
+
getSlideWidth,
|
|
380
|
+
infinite,
|
|
381
|
+
total,
|
|
382
|
+
slidesPerView,
|
|
383
|
+
maxIndex,
|
|
384
|
+
threshold,
|
|
385
|
+
snap,
|
|
386
|
+
dragThreshold,
|
|
387
|
+
index,
|
|
388
|
+
]);
|
|
289
389
|
const onLostPointerCapture = React.useCallback((e) => {
|
|
290
390
|
if (dragging.current) {
|
|
291
391
|
onPointerUp(e);
|
|
292
392
|
}
|
|
293
393
|
}, [onPointerUp]);
|
|
294
394
|
// #region Autoplay
|
|
295
|
-
const
|
|
395
|
+
const autoplayStep = React.useRef(() => undefined);
|
|
396
|
+
autoplayStep.current = () => {
|
|
397
|
+
// Without the infinite loop the autoplay returns to the first slide instead of stopping at the end
|
|
398
|
+
if (!infinite && indexRef.current >= maxIndex) {
|
|
399
|
+
goToIndex(0);
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
next();
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
const pause = React.useCallback(() => setIsPausedByApi(true), []);
|
|
406
|
+
const resume = React.useCallback(() => setIsPausedByApi(false), []);
|
|
407
|
+
React.useEffect(() => {
|
|
296
408
|
if (!autoplay || isPaused)
|
|
297
|
-
return;
|
|
298
|
-
|
|
299
|
-
if (!
|
|
300
|
-
|
|
409
|
+
return undefined;
|
|
410
|
+
const timer = setInterval(() => {
|
|
411
|
+
if (!dragging.current && !isAnimating.current && mounted.current) {
|
|
412
|
+
autoplayStep.current();
|
|
301
413
|
}
|
|
302
414
|
}, autoplayInterval);
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
autoplayTimer.current = undefined;
|
|
309
|
-
}
|
|
310
|
-
}, []);
|
|
311
|
-
const resume = React.useCallback(() => {
|
|
312
|
-
setIsPaused(false);
|
|
313
|
-
}, []);
|
|
314
|
-
// #region Hover
|
|
415
|
+
return () => clearInterval(timer);
|
|
416
|
+
}, [autoplay, autoplayInterval, isPaused]);
|
|
417
|
+
// #region Hover and focus
|
|
418
|
+
// The autoplay pauses while the pointer is over the swiper (pauseOnHover)
|
|
419
|
+
// and always while the focus is inside it, so the keyboard user is not interrupted
|
|
315
420
|
React.useEffect(() => {
|
|
316
|
-
if (!autoplay || !pauseOnHover)
|
|
317
|
-
return;
|
|
318
421
|
const wrapper = wrapperRef.current;
|
|
319
|
-
if (!wrapper)
|
|
320
|
-
return;
|
|
321
|
-
const handleMouseEnter = () =>
|
|
322
|
-
const handleMouseLeave = () =>
|
|
422
|
+
if (!autoplay || !wrapper)
|
|
423
|
+
return undefined;
|
|
424
|
+
const handleMouseEnter = () => pauseOnHover && setIsHovered(true);
|
|
425
|
+
const handleMouseLeave = () => setIsHovered(false);
|
|
426
|
+
const handleFocusIn = () => setIsFocused(true);
|
|
427
|
+
const handleFocusOut = (event) => {
|
|
428
|
+
if (!wrapper.contains(event.relatedTarget)) {
|
|
429
|
+
setIsFocused(false);
|
|
430
|
+
}
|
|
431
|
+
};
|
|
323
432
|
wrapper.addEventListener('mouseenter', handleMouseEnter);
|
|
324
433
|
wrapper.addEventListener('mouseleave', handleMouseLeave);
|
|
434
|
+
wrapper.addEventListener('focusin', handleFocusIn);
|
|
435
|
+
wrapper.addEventListener('focusout', handleFocusOut);
|
|
325
436
|
return () => {
|
|
326
437
|
wrapper.removeEventListener('mouseenter', handleMouseEnter);
|
|
327
438
|
wrapper.removeEventListener('mouseleave', handleMouseLeave);
|
|
439
|
+
wrapper.removeEventListener('focusin', handleFocusIn);
|
|
440
|
+
wrapper.removeEventListener('focusout', handleFocusOut);
|
|
328
441
|
};
|
|
329
|
-
}, [autoplay, pauseOnHover
|
|
330
|
-
// #region
|
|
331
|
-
React.
|
|
332
|
-
if (
|
|
333
|
-
|
|
442
|
+
}, [autoplay, pauseOnHover]);
|
|
443
|
+
// #region Keyboard
|
|
444
|
+
const onKeyDown = React.useCallback((event) => {
|
|
445
|
+
if (!keyboardControl)
|
|
446
|
+
return;
|
|
447
|
+
// Do not steal the arrows from the fields inside the slides
|
|
448
|
+
const target = event.target;
|
|
449
|
+
if (target.closest('input, textarea, select, [contenteditable="true"]'))
|
|
450
|
+
return;
|
|
451
|
+
if (event.key === 'ArrowLeft') {
|
|
452
|
+
event.preventDefault();
|
|
453
|
+
prev();
|
|
334
454
|
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
455
|
+
if (event.key === 'ArrowRight') {
|
|
456
|
+
event.preventDefault();
|
|
457
|
+
next();
|
|
458
|
+
}
|
|
459
|
+
}, [keyboardControl, prev, next]);
|
|
460
|
+
const onClickCapture = React.useCallback((event) => {
|
|
461
|
+
if (suppressClick.current) {
|
|
462
|
+
suppressClick.current = false;
|
|
463
|
+
event.preventDefault();
|
|
464
|
+
event.stopPropagation();
|
|
465
|
+
}
|
|
466
|
+
}, []);
|
|
467
|
+
// The images and the links are dragged by the browser as files, it breaks the swipe
|
|
468
|
+
const onDragStart = React.useCallback((event) => {
|
|
469
|
+
if (draggable) {
|
|
470
|
+
event.preventDefault();
|
|
471
|
+
}
|
|
472
|
+
}, [draggable]);
|
|
342
473
|
// #region Transition End
|
|
343
474
|
React.useEffect(() => {
|
|
344
475
|
const track = trackRef.current;
|
|
@@ -398,10 +529,22 @@ exports.Swiper = React.forwardRef((props, ref) => {
|
|
|
398
529
|
}
|
|
399
530
|
return domIndex - slidesPerView;
|
|
400
531
|
}, [infinite, realSlidesCount, slidesPerView, total]);
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
532
|
+
// The slides at least partially in the view: they are not inert, so a partially visible slide
|
|
533
|
+
// can be clicked. Between the slides (drag, free mode) one more slide is partially visible
|
|
534
|
+
const slideWidth = wrapperRef.current ? wrapperRef.current.clientWidth / slidesPerView : 0;
|
|
535
|
+
let firstVisibleDomIndex = index;
|
|
536
|
+
let visibleCount = slidesPerView;
|
|
537
|
+
if (slideWidth > 0 && Math.abs(offset) > 0.5) {
|
|
538
|
+
const position = index * slideWidth - offset;
|
|
539
|
+
firstVisibleDomIndex = Math.floor(position / slideWidth + 0.001);
|
|
540
|
+
const lastVisibleDomIndex = Math.ceil((position + slidesPerView * slideWidth) / slideWidth - 0.001) - 1;
|
|
541
|
+
visibleCount = lastVisibleDomIndex - firstVisibleDomIndex + 1;
|
|
542
|
+
}
|
|
543
|
+
firstVisibleDomIndex = Math.max(0, Math.min(total - 1, firstVisibleDomIndex));
|
|
544
|
+
return (React.createElement(overridesMap.Container, Object.assign({ role: "region", "aria-roledescription": "carousel" }, restProps),
|
|
545
|
+
React.createElement(overridesMap.Wrapper, { ref: wrapperRef, draggable: draggable, slidesPerView: slidesPerView, tabIndex: keyboardControl ? 0 : undefined, "aria-live": autoplay && !isPaused ? 'off' : 'polite', onKeyDown: onKeyDown, onClickCapture: onClickCapture, onDragStart: onDragStart, onPointerDown: onPointerDown, onPointerMove: onPointerMove, onPointerUp: onPointerUp, onLostPointerCapture: onLostPointerCapture },
|
|
546
|
+
React.createElement(overridesMap.Track, { ref: trackRef, dragging: isDragging, index: index, offset: offset, disableAnimation: disableAnimation, momentum: isMomentum, slidesPerView: slidesPerView },
|
|
547
|
+
React.createElement(SwiperSlidesRenderer_1.default, { slides: slides, slidesPerView: slidesPerView, realIndex: realIndex, firstVisibleIndex: getSlideRealIndex(firstVisibleDomIndex), visibleCount: visibleCount, realSlidesCount: realSlidesCount, getSlideRealIndex: getSlideRealIndex, slideLabel: slideLabel })))));
|
|
405
548
|
});
|
|
406
549
|
exports.Swiper.displayName = 'Swiper';
|
|
407
550
|
exports.default = exports.Swiper;
|
|
@@ -4,8 +4,16 @@ export type SwiperSlidesRendererProps = {
|
|
|
4
4
|
readonly slides: readonly SwiperSlideElement[];
|
|
5
5
|
readonly slidesPerView: number;
|
|
6
6
|
readonly realIndex: number;
|
|
7
|
+
/**
|
|
8
|
+
* The real index of the first slide that is at least partially in the view
|
|
9
|
+
* and the count of such slides. In the free mode (snap=false) the track stops between the slides,
|
|
10
|
+
* then one more slide is partially visible
|
|
11
|
+
*/
|
|
12
|
+
readonly firstVisibleIndex?: number;
|
|
13
|
+
readonly visibleCount?: number;
|
|
7
14
|
readonly realSlidesCount: number;
|
|
8
15
|
readonly getSlideRealIndex: (index: number) => number;
|
|
16
|
+
readonly slideLabel: (index: number, total: number) => string;
|
|
9
17
|
};
|
|
10
18
|
declare const _default: React.NamedExoticComponent<SwiperSlidesRendererProps>;
|
|
11
19
|
export default _default;
|
|
@@ -24,23 +24,24 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
const React = __importStar(require("react"));
|
|
27
|
+
// React 19 supports the boolean `inert`, React 18 passes only the string value to the DOM
|
|
28
|
+
const INERT_VALUE = parseInt(React.version, 10) >= 19 ? true : '';
|
|
27
29
|
const SwiperSlidesRenderer = props => {
|
|
28
|
-
const { slides, slidesPerView, realIndex, realSlidesCount, getSlideRealIndex } = props;
|
|
29
|
-
// Мемоизируем вычисления видимости
|
|
30
|
+
const { slides, slidesPerView, realIndex, realSlidesCount, getSlideRealIndex, slideLabel, firstVisibleIndex = realIndex, visibleCount = slidesPerView, } = props;
|
|
30
31
|
const visibilityMap = React.useMemo(() => {
|
|
31
32
|
const map = new Map();
|
|
32
|
-
if (realSlidesCount <=
|
|
33
|
+
if (realSlidesCount <= visibleCount) {
|
|
33
34
|
slides.forEach((_, i) => {
|
|
34
35
|
map.set(i, { isVisible: true, isNearby: false });
|
|
35
36
|
});
|
|
36
37
|
}
|
|
37
38
|
else {
|
|
38
39
|
const visibleIndices = [];
|
|
39
|
-
for (let j = 0; j <
|
|
40
|
-
visibleIndices.push((
|
|
40
|
+
for (let j = 0; j < visibleCount; j++) {
|
|
41
|
+
visibleIndices.push((firstVisibleIndex + j) % realSlidesCount);
|
|
41
42
|
}
|
|
42
|
-
const prevIndex = (
|
|
43
|
-
const nextIndex = (
|
|
43
|
+
const prevIndex = (firstVisibleIndex - 1 + realSlidesCount) % realSlidesCount;
|
|
44
|
+
const nextIndex = (firstVisibleIndex + visibleCount) % realSlidesCount;
|
|
44
45
|
slides.forEach((_, i) => {
|
|
45
46
|
const slideRealIndex = getSlideRealIndex(i);
|
|
46
47
|
const isVisible = visibleIndices.includes(slideRealIndex);
|
|
@@ -49,23 +50,25 @@ const SwiperSlidesRenderer = props => {
|
|
|
49
50
|
});
|
|
50
51
|
}
|
|
51
52
|
return map;
|
|
52
|
-
}, [slides,
|
|
53
|
+
}, [slides, visibleCount, firstVisibleIndex, realSlidesCount, getSlideRealIndex]);
|
|
53
54
|
return (React.createElement(React.Fragment, null, slides.map((slide, i) => {
|
|
54
55
|
const { isVisible, isNearby } = visibilityMap.get(i) || {
|
|
55
56
|
isVisible: false,
|
|
56
57
|
isNearby: false,
|
|
57
58
|
};
|
|
58
59
|
const slideRealIndex = getSlideRealIndex(i);
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
slide.props.isNearby === isNearby) {
|
|
63
|
-
return slide;
|
|
64
|
-
}
|
|
60
|
+
const isClone = typeof slide.props['data-clone'] !== 'undefined';
|
|
61
|
+
// The slides out of the view are inert: Tab does not go into them (it would scroll the track)
|
|
62
|
+
// and screen readers skip them. The clones are always hidden from screen readers
|
|
65
63
|
return React.cloneElement(slide, {
|
|
66
64
|
slidesPerView,
|
|
67
65
|
isVisible,
|
|
68
66
|
isNearby,
|
|
67
|
+
role: 'group',
|
|
68
|
+
'aria-roledescription': 'slide',
|
|
69
|
+
'aria-label': slideLabel(slideRealIndex, realSlidesCount),
|
|
70
|
+
'aria-hidden': isClone || !isVisible ? true : undefined,
|
|
71
|
+
inert: isVisible && !isClone ? undefined : INERT_VALUE,
|
|
69
72
|
'data-index': i,
|
|
70
73
|
'data-real-index': slideRealIndex,
|
|
71
74
|
});
|
package/Swiper/SwiperTrack.d.ts
CHANGED
|
@@ -5,6 +5,10 @@ export type SwiperTrackProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
|
5
5
|
readonly offset: number;
|
|
6
6
|
readonly dragging: boolean;
|
|
7
7
|
readonly disableAnimation?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* The long decelerating transition after a free swipe (snap=false)
|
|
10
|
+
*/
|
|
11
|
+
readonly momentum?: boolean;
|
|
8
12
|
readonly slidesPerView: number;
|
|
9
13
|
};
|
|
10
14
|
export declare const SwiperTrack: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & {
|
|
@@ -13,6 +17,10 @@ export declare const SwiperTrack: React.ForwardRefExoticComponent<React.HTMLAttr
|
|
|
13
17
|
readonly offset: number;
|
|
14
18
|
readonly dragging: boolean;
|
|
15
19
|
readonly disableAnimation?: boolean | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* The long decelerating transition after a free swipe (snap=false)
|
|
22
|
+
*/
|
|
23
|
+
readonly momentum?: boolean | undefined;
|
|
16
24
|
readonly slidesPerView: number;
|
|
17
25
|
} & React.RefAttributes<HTMLDivElement>>;
|
|
18
26
|
export default SwiperTrack;
|
package/Swiper/SwiperTrack.js
CHANGED
|
@@ -43,13 +43,18 @@ const styled_1 = __importDefault(require("@emotion/styled"));
|
|
|
43
43
|
const StyledTrack = styled_1.default.div `
|
|
44
44
|
display: flex;
|
|
45
45
|
height: 100%;
|
|
46
|
-
transition: ${({ $dragging, $disableAnimation }) =>
|
|
46
|
+
transition: ${({ $dragging, $disableAnimation, $momentum }) => {
|
|
47
|
+
if ($dragging || $disableAnimation) {
|
|
48
|
+
return 'none';
|
|
49
|
+
}
|
|
50
|
+
return $momentum ? 'transform 0.6s cubic-bezier(0.25, 1, 0.5, 1)' : 'transform 0.3s ease';
|
|
51
|
+
}};
|
|
47
52
|
will-change: transform;
|
|
48
53
|
transform: ${({ $index, $offset, $slidesPerView }) => `translateX(calc(${-(($index * 100) / $slidesPerView)}% + ${$offset}px))`};
|
|
49
54
|
`;
|
|
50
55
|
exports.SwiperTrack = React.forwardRef((props, ref) => {
|
|
51
|
-
const { children, index, offset, dragging, disableAnimation, slidesPerView } = props, restProps = __rest(props, ["children", "index", "offset", "dragging", "disableAnimation", "slidesPerView"]);
|
|
52
|
-
return (React.createElement(StyledTrack, Object.assign({ "$dragging": dragging, "$index": index, "$offset": offset, "$disableAnimation": disableAnimation, "$slidesPerView": slidesPerView }, restProps, { ref: ref }), children));
|
|
56
|
+
const { children, index, offset, dragging, disableAnimation, momentum, slidesPerView } = props, restProps = __rest(props, ["children", "index", "offset", "dragging", "disableAnimation", "momentum", "slidesPerView"]);
|
|
57
|
+
return (React.createElement(StyledTrack, Object.assign({ "$dragging": dragging, "$index": index, "$offset": offset, "$disableAnimation": disableAnimation, "$momentum": momentum, "$slidesPerView": slidesPerView }, restProps, { ref: ref }), children));
|
|
53
58
|
});
|
|
54
59
|
exports.SwiperTrack.displayName = 'SwiperTrack';
|
|
55
60
|
exports.default = exports.SwiperTrack;
|
package/Swiper/SwiperWrapper.js
CHANGED
|
@@ -51,9 +51,17 @@ exports.StyledWrapper = styled_1.default.div `
|
|
|
51
51
|
(0, react_1.css) `
|
|
52
52
|
touch-action: pan-y;
|
|
53
53
|
`};
|
|
54
|
+
|
|
55
|
+
/* Inside: the container clips the outer outline */
|
|
56
|
+
&:focus-visible {
|
|
57
|
+
outline: 0.14em solid ${({ theme }) => theme.color.accentPrimary.toString()};
|
|
58
|
+
outline-offset: -0.14em;
|
|
59
|
+
}
|
|
54
60
|
`;
|
|
55
61
|
const SwiperWrapper = React.forwardRef((props, ref) => {
|
|
56
|
-
|
|
62
|
+
// slidesPerView is for the overrides only, it is not a DOM attribute
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
64
|
+
const { children, draggable, slidesPerView } = props, restProps = __rest(props, ["children", "draggable", "slidesPerView"]);
|
|
57
65
|
return (React.createElement(exports.StyledWrapper, Object.assign({}, restProps, { ref: ref, "$draggable": draggable }), children));
|
|
58
66
|
});
|
|
59
67
|
SwiperWrapper.displayName = 'SwiperWrapper';
|