@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.
Files changed (485) hide show
  1. package/Accordion/AccordionContainer.js +11 -11
  2. package/Accordion/AccordionContent.js +16 -7
  3. package/Accordion/AccordionHeader.d.ts +22 -0
  4. package/Accordion/AccordionHeader.js +35 -18
  5. package/Accordion/Chevron.js +3 -3
  6. package/Accordion/index.d.ts +12 -8
  7. package/Accordion/index.js +21 -6
  8. package/Autocomplete/AutocompleteContainer.d.ts +5 -9
  9. package/Autocomplete/AutocompleteContainer.js +91 -35
  10. package/Autocomplete/AutocompleteTagsInput.d.ts +15 -0
  11. package/Autocomplete/AutocompleteTagsInput.js +65 -0
  12. package/Autocomplete/context.d.ts +1 -0
  13. package/Autocomplete/context.js +5 -5
  14. package/Autocomplete/index.js +1 -0
  15. package/Avatar/AvatarBase.js +1 -1
  16. package/Avatar/AvatarContainer.js +6 -11
  17. package/Avatar/AvatarPicture.d.ts +9 -1
  18. package/Avatar/AvatarPicture.js +4 -3
  19. package/Avatar/index.js +10 -10
  20. package/Badge/BadgeBase.d.ts +9 -0
  21. package/Badge/BadgeBase.js +21 -3
  22. package/Badge/BadgeContainer.js +2 -1
  23. package/Badge/BadgeDeleteButton.d.ts +1 -1
  24. package/Badge/BadgeOutlined.d.ts +1 -1
  25. package/Badge/BadgeOutlined.js +5 -80
  26. package/Badge/BadgeStandard.d.ts +1 -1
  27. package/Badge/BadgeStandard.js +5 -91
  28. package/Badge/BadgeStyled.d.ts +5 -0
  29. package/Badge/BadgeStyled.js +125 -0
  30. package/Badge/index.d.ts +2 -2
  31. package/Badge/index.js +3 -20
  32. package/Button/ButtonBase.js +8 -4
  33. package/Button/ButtonContainer.js +2 -0
  34. package/Button/ButtonIconWrapper.d.ts +1 -1
  35. package/Button/ButtonOutlined.d.ts +1 -1
  36. package/Button/ButtonOutlined.js +5 -80
  37. package/Button/ButtonPlain.d.ts +1 -1
  38. package/Button/ButtonPlain.js +5 -85
  39. package/Button/ButtonStandard.d.ts +1 -1
  40. package/Button/ButtonStandard.js +5 -97
  41. package/Button/ButtonStyled.d.ts +10 -0
  42. package/Button/ButtonStyled.js +205 -0
  43. package/Button/index.d.ts +5 -5
  44. package/Button/index.js +3 -24
  45. package/ButtonGroup/ButtonGroupContext.d.ts +21 -0
  46. package/ButtonGroup/ButtonGroupContext.js +11 -0
  47. package/ButtonGroup/index.d.ts +76 -0
  48. package/ButtonGroup/index.js +132 -0
  49. package/CHANGELOG.md +122 -0
  50. package/Calendar/CalendarCell.js +11 -4
  51. package/Calendar/CalendarComponent.d.ts +15 -4
  52. package/Calendar/CalendarComponent.js +150 -55
  53. package/Calendar/CalendarDayBadge.d.ts +1 -1
  54. package/Calendar/CalendarMonthCell.js +1 -11
  55. package/Calendar/CalendarWeekDayLabel.js +3 -1
  56. package/Calendar/CalendarWeekDaysBar.js +6 -1
  57. package/Calendar/CalendarYearCell.js +1 -16
  58. package/Calendar/CalendarYearsSelector.d.ts +0 -1
  59. package/Calendar/CalendarYearsSelector.js +33 -35
  60. package/Calendar/use-calendar.d.ts +1 -1
  61. package/Checkbox/CheckboxAsterisk.d.ts +13 -0
  62. package/{Autocomplete2/Autocomplete2TextField.js → Checkbox/CheckboxAsterisk.js} +24 -10
  63. package/Checkbox/CheckboxBox.d.ts +22 -0
  64. package/Checkbox/CheckboxBox.js +88 -0
  65. package/Checkbox/CheckboxContainer.d.ts +27 -0
  66. package/Checkbox/CheckboxContainer.js +38 -0
  67. package/Checkbox/CheckboxErrorText.d.ts +6 -0
  68. package/Checkbox/CheckboxErrorText.js +76 -0
  69. package/Checkbox/CheckboxIcon.d.ts +10 -0
  70. package/Checkbox/CheckboxIcon.js +57 -0
  71. package/Checkbox/CheckboxTextWrapper.d.ts +4 -0
  72. package/Checkbox/CheckboxTextWrapper.js +29 -0
  73. package/Checkbox/CheckboxWrapper.d.ts +4 -0
  74. package/Checkbox/CheckboxWrapper.js +29 -0
  75. package/Checkbox/index.d.ts +144 -0
  76. package/Checkbox/index.js +71 -0
  77. package/Checkbox/useCheckboxColor.d.ts +6 -0
  78. package/Checkbox/useCheckboxColor.js +33 -0
  79. package/ClickOutside/index.d.ts +6 -0
  80. package/ClickOutside/index.js +7 -2
  81. package/Color/Color.d.ts +4 -4
  82. package/Color/Color.js +9 -5
  83. package/Color/ColorGenerator.d.ts +5 -1
  84. package/CountryFlags/AC.js +5 -1
  85. package/CountryFlags/AD.js +5 -1
  86. package/CountryFlags/AE.js +5 -1
  87. package/CountryFlags/AF.js +5 -1
  88. package/CountryFlags/AG.js +5 -1
  89. package/CountryFlags/AI.js +5 -1
  90. package/CountryFlags/AL.js +5 -1
  91. package/CountryFlags/AM.js +5 -1
  92. package/CountryFlags/AO.js +5 -1
  93. package/CountryFlags/AQ.js +5 -1
  94. package/CountryFlags/AR.js +5 -1
  95. package/CountryFlags/AS.js +5 -1
  96. package/CountryFlags/AT.js +5 -1
  97. package/CountryFlags/AU.js +5 -1
  98. package/CountryFlags/AW.js +5 -1
  99. package/CountryFlags/AX.js +5 -1
  100. package/CountryFlags/AZ.js +5 -1
  101. package/CountryFlags/BA.js +5 -1
  102. package/CountryFlags/BB.js +5 -1
  103. package/CountryFlags/BD.js +5 -1
  104. package/CountryFlags/BE.js +5 -1
  105. package/CountryFlags/BF.js +5 -1
  106. package/CountryFlags/BG.js +5 -1
  107. package/CountryFlags/BH.js +5 -1
  108. package/CountryFlags/BI.js +5 -1
  109. package/CountryFlags/BJ.js +5 -1
  110. package/CountryFlags/BL.js +5 -1
  111. package/CountryFlags/BM.js +5 -1
  112. package/CountryFlags/BN.js +5 -1
  113. package/CountryFlags/BO.js +5 -1
  114. package/CountryFlags/BQ.js +5 -1
  115. package/CountryFlags/BR.js +5 -1
  116. package/CountryFlags/BS.js +5 -1
  117. package/CountryFlags/BT.js +5 -1
  118. package/CountryFlags/BV.js +5 -1
  119. package/CountryFlags/BW.js +5 -1
  120. package/CountryFlags/BY.js +5 -1
  121. package/CountryFlags/BZ.js +5 -1
  122. package/CountryFlags/CA.js +5 -1
  123. package/CountryFlags/CC.js +5 -1
  124. package/CountryFlags/CD.js +5 -1
  125. package/CountryFlags/CF.js +5 -1
  126. package/CountryFlags/CG.js +5 -1
  127. package/CountryFlags/CH.js +5 -1
  128. package/CountryFlags/CI.js +5 -1
  129. package/CountryFlags/CK.js +5 -1
  130. package/CountryFlags/CL.js +5 -1
  131. package/CountryFlags/CM.js +5 -1
  132. package/CountryFlags/CN.js +5 -1
  133. package/CountryFlags/CO.js +5 -1
  134. package/CountryFlags/CR.js +5 -1
  135. package/CountryFlags/CU.js +5 -1
  136. package/CountryFlags/CV.js +5 -1
  137. package/CountryFlags/CW.js +5 -1
  138. package/CountryFlags/CX.js +5 -1
  139. package/CountryFlags/CY.js +5 -1
  140. package/CountryFlags/CZ.js +5 -1
  141. package/CountryFlags/DE.js +5 -1
  142. package/CountryFlags/DJ.js +5 -1
  143. package/CountryFlags/DK.js +5 -1
  144. package/CountryFlags/DM.js +5 -1
  145. package/CountryFlags/DO.js +5 -1
  146. package/CountryFlags/DZ.js +5 -1
  147. package/CountryFlags/EC.js +5 -1
  148. package/CountryFlags/EE.js +5 -1
  149. package/CountryFlags/EG.js +5 -1
  150. package/CountryFlags/EH.js +5 -1
  151. package/CountryFlags/ER.js +5 -1
  152. package/CountryFlags/ES.js +5 -1
  153. package/CountryFlags/ET.js +5 -1
  154. package/CountryFlags/EU.js +5 -1
  155. package/CountryFlags/FI.js +5 -1
  156. package/CountryFlags/FJ.js +5 -1
  157. package/CountryFlags/FK.js +5 -1
  158. package/CountryFlags/FM.js +5 -1
  159. package/CountryFlags/FO.js +5 -1
  160. package/CountryFlags/FR.js +5 -1
  161. package/CountryFlags/GA.js +5 -1
  162. package/CountryFlags/GB.js +5 -1
  163. package/CountryFlags/GD.js +5 -1
  164. package/CountryFlags/GE.js +5 -1
  165. package/CountryFlags/GEAB.js +5 -1
  166. package/CountryFlags/GEOS.js +5 -1
  167. package/CountryFlags/GF.js +5 -1
  168. package/CountryFlags/GG.js +5 -1
  169. package/CountryFlags/GH.js +5 -1
  170. package/CountryFlags/GI.js +5 -1
  171. package/CountryFlags/GL.js +5 -1
  172. package/CountryFlags/GM.js +5 -1
  173. package/CountryFlags/GN.js +5 -1
  174. package/CountryFlags/GP.js +5 -1
  175. package/CountryFlags/GQ.js +5 -1
  176. package/CountryFlags/GR.js +5 -1
  177. package/CountryFlags/GS.js +5 -1
  178. package/CountryFlags/GT.js +5 -1
  179. package/CountryFlags/GU.js +5 -1
  180. package/CountryFlags/GW.js +5 -1
  181. package/CountryFlags/GY.js +5 -1
  182. package/CountryFlags/HK.js +5 -1
  183. package/CountryFlags/HM.js +5 -1
  184. package/CountryFlags/HN.js +5 -1
  185. package/CountryFlags/HR.js +5 -1
  186. package/CountryFlags/HT.js +5 -1
  187. package/CountryFlags/HU.js +5 -1
  188. package/CountryFlags/IC.js +5 -1
  189. package/CountryFlags/ID.js +5 -1
  190. package/CountryFlags/IE.js +5 -1
  191. package/CountryFlags/IL.js +5 -1
  192. package/CountryFlags/IM.js +5 -1
  193. package/CountryFlags/IN.js +5 -1
  194. package/CountryFlags/IO.js +5 -1
  195. package/CountryFlags/IQ.js +5 -1
  196. package/CountryFlags/IR.js +5 -1
  197. package/CountryFlags/IS.js +5 -1
  198. package/CountryFlags/IT.js +5 -1
  199. package/CountryFlags/JE.js +5 -1
  200. package/CountryFlags/JM.js +5 -1
  201. package/CountryFlags/JO.js +5 -1
  202. package/CountryFlags/JP.js +5 -1
  203. package/CountryFlags/KE.js +5 -1
  204. package/CountryFlags/KG.js +5 -1
  205. package/CountryFlags/KH.js +5 -1
  206. package/CountryFlags/KI.js +5 -1
  207. package/CountryFlags/KM.js +5 -1
  208. package/CountryFlags/KN.js +5 -1
  209. package/CountryFlags/KP.js +5 -1
  210. package/CountryFlags/KR.js +5 -1
  211. package/CountryFlags/KW.js +5 -1
  212. package/CountryFlags/KY.js +5 -1
  213. package/CountryFlags/KZ.js +5 -1
  214. package/CountryFlags/LA.js +5 -1
  215. package/CountryFlags/LB.js +5 -1
  216. package/CountryFlags/LC.js +5 -1
  217. package/CountryFlags/LI.js +5 -1
  218. package/CountryFlags/LK.js +5 -1
  219. package/CountryFlags/LR.js +5 -1
  220. package/CountryFlags/LS.js +5 -1
  221. package/CountryFlags/LT.js +5 -1
  222. package/CountryFlags/LU.js +5 -1
  223. package/CountryFlags/LV.js +5 -1
  224. package/CountryFlags/LY.js +5 -1
  225. package/CountryFlags/MA.js +5 -1
  226. package/CountryFlags/MC.js +5 -1
  227. package/CountryFlags/MD.js +5 -1
  228. package/CountryFlags/ME.js +5 -1
  229. package/CountryFlags/MF.js +5 -1
  230. package/CountryFlags/MG.js +5 -1
  231. package/CountryFlags/MH.js +5 -1
  232. package/CountryFlags/MK.js +5 -1
  233. package/CountryFlags/ML.js +5 -1
  234. package/CountryFlags/MM.js +5 -1
  235. package/CountryFlags/MN.js +5 -1
  236. package/CountryFlags/MO.js +5 -1
  237. package/CountryFlags/MP.js +5 -1
  238. package/CountryFlags/MQ.js +5 -1
  239. package/CountryFlags/MR.js +5 -1
  240. package/CountryFlags/MS.js +5 -1
  241. package/CountryFlags/MT.js +5 -1
  242. package/CountryFlags/MU.js +5 -1
  243. package/CountryFlags/MV.js +5 -1
  244. package/CountryFlags/MW.js +5 -1
  245. package/CountryFlags/MX.js +5 -1
  246. package/CountryFlags/MY.js +5 -1
  247. package/CountryFlags/MZ.js +5 -1
  248. package/CountryFlags/NA.js +5 -1
  249. package/CountryFlags/NC.js +5 -1
  250. package/CountryFlags/NE.js +5 -1
  251. package/CountryFlags/NF.js +5 -1
  252. package/CountryFlags/NG.js +5 -1
  253. package/CountryFlags/NI.js +5 -1
  254. package/CountryFlags/NL.js +5 -1
  255. package/CountryFlags/NO.js +5 -1
  256. package/CountryFlags/NP.js +5 -1
  257. package/CountryFlags/NR.js +5 -1
  258. package/CountryFlags/NU.js +5 -1
  259. package/CountryFlags/NZ.js +5 -1
  260. package/CountryFlags/OM.js +5 -1
  261. package/CountryFlags/PA.js +5 -1
  262. package/CountryFlags/PE.js +5 -1
  263. package/CountryFlags/PF.js +5 -1
  264. package/CountryFlags/PG.js +5 -1
  265. package/CountryFlags/PH.js +5 -1
  266. package/CountryFlags/PK.js +5 -1
  267. package/CountryFlags/PL.js +5 -1
  268. package/CountryFlags/PM.js +5 -1
  269. package/CountryFlags/PN.js +5 -1
  270. package/CountryFlags/PR.js +5 -1
  271. package/CountryFlags/PS.js +5 -1
  272. package/CountryFlags/PT.js +5 -1
  273. package/CountryFlags/PW.js +5 -1
  274. package/CountryFlags/PY.js +5 -1
  275. package/CountryFlags/QA.js +5 -1
  276. package/CountryFlags/RE.js +5 -1
  277. package/CountryFlags/RO.js +5 -1
  278. package/CountryFlags/RS.js +5 -1
  279. package/CountryFlags/RU.js +5 -1
  280. package/CountryFlags/RW.js +5 -1
  281. package/CountryFlags/SA.js +5 -1
  282. package/CountryFlags/SB.js +5 -1
  283. package/CountryFlags/SC.js +5 -1
  284. package/CountryFlags/SD.js +5 -1
  285. package/CountryFlags/SE.js +5 -1
  286. package/CountryFlags/SG.js +5 -1
  287. package/CountryFlags/SH.js +5 -1
  288. package/CountryFlags/SI.js +5 -1
  289. package/CountryFlags/SJ.js +5 -1
  290. package/CountryFlags/SK.js +5 -1
  291. package/CountryFlags/SL.js +5 -1
  292. package/CountryFlags/SM.js +5 -1
  293. package/CountryFlags/SN.js +5 -1
  294. package/CountryFlags/SO.js +5 -1
  295. package/CountryFlags/SR.js +5 -1
  296. package/CountryFlags/SS.js +5 -1
  297. package/CountryFlags/ST.js +5 -1
  298. package/CountryFlags/SV.js +5 -1
  299. package/CountryFlags/SX.js +5 -1
  300. package/CountryFlags/SY.js +5 -1
  301. package/CountryFlags/SZ.js +5 -1
  302. package/CountryFlags/TA.js +5 -1
  303. package/CountryFlags/TC.js +5 -1
  304. package/CountryFlags/TD.js +5 -1
  305. package/CountryFlags/TF.js +5 -1
  306. package/CountryFlags/TG.js +5 -1
  307. package/CountryFlags/TH.js +5 -1
  308. package/CountryFlags/TJ.js +5 -1
  309. package/CountryFlags/TK.js +5 -1
  310. package/CountryFlags/TL.js +5 -1
  311. package/CountryFlags/TM.js +5 -1
  312. package/CountryFlags/TN.js +5 -1
  313. package/CountryFlags/TO.js +5 -1
  314. package/CountryFlags/TR.js +5 -1
  315. package/CountryFlags/TT.js +5 -1
  316. package/CountryFlags/TV.js +5 -1
  317. package/CountryFlags/TW.js +5 -1
  318. package/CountryFlags/TZ.js +5 -1
  319. package/CountryFlags/UA.js +5 -1
  320. package/CountryFlags/UG.js +5 -1
  321. package/CountryFlags/UM.js +5 -1
  322. package/CountryFlags/US.js +5 -1
  323. package/CountryFlags/UY.js +5 -1
  324. package/CountryFlags/UZ.js +5 -1
  325. package/CountryFlags/Uknown.d.ts +7 -3
  326. package/CountryFlags/Uknown.js +9 -31
  327. package/CountryFlags/Unknown.d.ts +3 -0
  328. package/CountryFlags/Unknown.js +42 -0
  329. package/CountryFlags/VA.js +5 -1
  330. package/CountryFlags/VC.js +5 -1
  331. package/CountryFlags/VE.js +5 -1
  332. package/CountryFlags/VG.js +5 -1
  333. package/CountryFlags/VI.js +5 -1
  334. package/CountryFlags/VN.js +5 -1
  335. package/CountryFlags/VU.js +5 -1
  336. package/CountryFlags/WF.js +5 -1
  337. package/CountryFlags/WS.js +5 -1
  338. package/CountryFlags/XK.js +5 -1
  339. package/CountryFlags/YE.js +5 -1
  340. package/CountryFlags/YT.js +5 -1
  341. package/CountryFlags/ZA.js +5 -1
  342. package/CountryFlags/ZM.js +5 -1
  343. package/CountryFlags/ZW.js +5 -1
  344. package/CountryFlags/index.d.ts +2 -1
  345. package/CountryFlags/index.js +3 -1
  346. package/CountryFlags/isLabelled.d.ts +6 -0
  347. package/CountryFlags/isLabelled.js +7 -0
  348. package/DatePicker/index.d.ts +19 -6
  349. package/DatePicker/index.js +59 -12
  350. package/Grid/index.d.ts +60 -0
  351. package/Grid/index.js +43 -0
  352. package/Highlighted/index.d.ts +1 -1
  353. package/Highlighted/index.js +14 -10
  354. package/LoadingIndicator/LoadingOverlay.d.ts +11 -0
  355. package/LoadingIndicator/LoadingOverlay.js +63 -0
  356. package/LoadingIndicator/Spinner.d.ts +34 -5
  357. package/LoadingIndicator/Spinner.js +48 -37
  358. package/LoadingIndicator/SpinnerCircle.d.ts +14 -0
  359. package/LoadingIndicator/SpinnerCircle.js +34 -0
  360. package/LoadingIndicator/index.d.ts +8 -3
  361. package/LoadingIndicator/index.js +9 -15
  362. package/MaskedField/index.d.ts +3 -2
  363. package/MaskedField/index.js +7 -2
  364. package/MaskedField/templates.js +2 -0
  365. package/MaskedField/useMasked.js +9 -6
  366. package/Menu/MenuContainer.d.ts +8 -0
  367. package/Menu/MenuContainer.js +101 -30
  368. package/Menu/MenuItem.js +1 -1
  369. package/Menu/context.js +5 -0
  370. package/Modal/BaseModal/useDialogID.d.ts +6 -0
  371. package/Modal/BaseModal/useDialogID.js +12 -0
  372. package/Modal/ConfirmBox/ConfirmBoxContainer.js +5 -1
  373. package/Modal/ConfirmBox/index.js +2 -1
  374. package/Modal/Dialog/DialogInner.js +1 -1
  375. package/Modal/Dialog/index.js +12 -7
  376. package/Modal/Drawer/DrawerHeader.d.ts +20 -0
  377. package/Modal/Drawer/DrawerHeader.js +3 -3
  378. package/Modal/Drawer/DrawerInner.js +9 -1
  379. package/Modal/Drawer/index.d.ts +7 -0
  380. package/Modal/Drawer/index.js +12 -10
  381. package/Modal/MessageBox/MessageBoxContainer.js +1 -1
  382. package/Modal/MessageBox/index.js +2 -1
  383. package/PhoneField/CountryFlagComponent.js +2 -2
  384. package/PhoneField/UnknownFlag.d.ts +6 -3
  385. package/PhoneField/UnknownFlag.js +8 -31
  386. package/PhoneField/index.js +45 -55
  387. package/PhoneField/templates.js +13 -14
  388. package/PhoneField/usePhoneUtils.d.ts +15 -0
  389. package/PhoneField/usePhoneUtils.js +30 -37
  390. package/Popper/Popper.d.ts +28 -8
  391. package/Popper/usePopper.d.ts +21 -31
  392. package/README.md +27 -10
  393. package/Radio/RadioBox.d.ts +14 -0
  394. package/Radio/RadioBox.js +100 -0
  395. package/Radio/RadioContainer.d.ts +27 -0
  396. package/Radio/RadioContainer.js +38 -0
  397. package/Radio/RadioTextWrapper.d.ts +4 -0
  398. package/Radio/RadioTextWrapper.js +29 -0
  399. package/Radio/index.d.ts +64 -0
  400. package/Radio/index.js +49 -0
  401. package/Radio/useRadioColor.d.ts +6 -0
  402. package/Radio/useRadioColor.js +33 -0
  403. package/RadioGroup/RadioGroupAsterisk.d.ts +13 -0
  404. package/RadioGroup/RadioGroupAsterisk.js +53 -0
  405. package/RadioGroup/RadioGroupContainer.d.ts +4 -0
  406. package/RadioGroup/RadioGroupContainer.js +36 -0
  407. package/RadioGroup/RadioGroupContext.d.ts +20 -0
  408. package/RadioGroup/RadioGroupContext.js +11 -0
  409. package/RadioGroup/RadioGroupErrorText.d.ts +6 -0
  410. package/RadioGroup/RadioGroupErrorText.js +76 -0
  411. package/RadioGroup/RadioGroupItems.d.ts +9 -0
  412. package/RadioGroup/RadioGroupItems.js +30 -0
  413. package/RadioGroup/RadioGroupLegend.d.ts +4 -0
  414. package/RadioGroup/RadioGroupLegend.js +37 -0
  415. package/RadioGroup/index.d.ts +134 -0
  416. package/RadioGroup/index.js +62 -0
  417. package/Selectbox/index.d.ts +18 -2
  418. package/Selectbox/index.js +23 -7
  419. package/Stack/index.d.ts +62 -0
  420. package/Stack/index.js +38 -0
  421. package/Surface/SurfaceContainer.js +6 -0
  422. package/Surface/index.js +7 -3
  423. package/Swiper/Swiper.d.ts +28 -2
  424. package/Swiper/Swiper.js +233 -90
  425. package/Swiper/SwiperContainer.js +0 -2
  426. package/Swiper/SwiperSlidesRenderer.d.ts +8 -0
  427. package/Swiper/SwiperSlidesRenderer.js +17 -14
  428. package/Swiper/SwiperTrack.d.ts +8 -0
  429. package/Swiper/SwiperTrack.js +8 -3
  430. package/Swiper/SwiperWrapper.js +9 -1
  431. package/Switch/SwitchContainer.d.ts +1 -1
  432. package/Switch/SwitchContainer.js +5 -5
  433. package/Switch/SwitchDot.js +13 -53
  434. package/Switch/SwitchToggleWrapper.d.ts +1 -1
  435. package/Switch/SwitchToggleWrapper.js +5 -6
  436. package/Switch/SwitchTrack.js +5 -41
  437. package/Switch/index.d.ts +4 -4
  438. package/Switch/index.js +21 -11
  439. package/Switch/useSwitchColor.d.ts +7 -0
  440. package/Switch/useSwitchColor.js +33 -0
  441. package/Table/Table.d.ts +6 -0
  442. package/Table/Table.js +7 -62
  443. package/Table/TableBody.d.ts +1 -1
  444. package/Table/TableBody.js +4 -2
  445. package/Table/TableCaption.d.ts +2 -2
  446. package/Table/TableCaption.js +2 -3
  447. package/Table/TableCell.js +2 -5
  448. package/Table/TableFooter.js +8 -7
  449. package/Table/TableHeader.js +6 -2
  450. package/Table/TableHeaderCell.js +8 -9
  451. package/Table/TableRow.js +1 -5
  452. package/TextArea/TextAreaIconWrapper.d.ts +1 -1
  453. package/TextArea/TextAreaInput.js +2 -0
  454. package/TextArea/index.js +1 -1
  455. package/TextField/TextFieldInput.js +2 -0
  456. package/TextField/TextFieldInputWrapper.d.ts +2 -0
  457. package/TextField/TextFieldInputWrapper.js +12 -2
  458. package/TextField/index.js +1 -1
  459. package/ThemeProvider/createTheme.js +2 -3
  460. package/ThemeProvider/index.d.ts +19 -2
  461. package/Typography/Base.d.ts +1 -1
  462. package/Typography/Base.js +1 -1
  463. package/Typography/Blockquote.js +1 -1
  464. package/Typography/Del.js +2 -2
  465. package/Typography/H4.js +1 -1
  466. package/Typography/H5.js +2 -2
  467. package/Typography/H6.d.ts +4 -0
  468. package/Typography/H6.js +28 -0
  469. package/Typography/SectionDescription.js +0 -1
  470. package/Typography/SectionTitle.d.ts +4 -7
  471. package/Typography/SectionTitle.js +26 -8
  472. package/Typography/index.d.ts +27 -0
  473. package/Typography/index.js +35 -0
  474. package/package.json +2 -4
  475. package/utils/spacing.d.ts +11 -0
  476. package/utils/spacing.js +14 -0
  477. package/Autocomplete/OverrideMenuList.d.ts +0 -4
  478. package/Autocomplete/OverrideMenuList.js +0 -39
  479. package/Autocomplete2/Autocomplete2.d.ts +0 -12
  480. package/Autocomplete2/Autocomplete2.js +0 -83
  481. package/Autocomplete2/Autocomplete2TextField.d.ts +0 -7
  482. package/Autocomplete2/index.d.ts +0 -2
  483. package/Autocomplete2/index.js +0 -7
  484. package/CountryFlags/SwiperOverview.d.ts +0 -257
  485. 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
- const childrenSlides = Array.isArray(children)
55
- ? children
56
- : [children];
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
- const mainSlides = childrenSlides.map((slide, idx) => React.cloneElement(slide, {
76
- key: `slide-${idx}`,
77
- }));
78
- return [...headClones, ...mainSlides, ...tailClones];
76
+ return [...headClones, ...childrenSlides, ...tailClones];
79
77
  }
80
- return childrenSlides.map((slide, idx) => React.cloneElement(slide, {
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 [isPaused, setIsPaused] = React.useState(false);
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
- return Math.min(realIndex, realSlidesCount - slidesPerView);
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
- const newTotal = slides.length;
135
- if (index >= newTotal) {
136
- setIndex(Math.max(0, newTotal - 1));
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
- }, [slides.length, index]);
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
- const target = index < firstRealIndex ? lastRealIndex : firstRealIndex;
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
- nextIndex = Math.min(prev + 1, total - 1);
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 || isAnimating.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
- let delta = lastX.current - startX.current;
247
- if (resistance && !infinite) {
248
- if (index === 0 && delta > 0) {
249
- delta *= 0.3;
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 (index === maxIndex && delta < 0) {
252
- delta *= 0.3;
321
+ else if (position > max) {
322
+ position = resistance ? max + (position - max) * 0.3 : max;
253
323
  }
254
324
  }
255
- setOffset(delta);
256
- }, [resistance, infinite, index, maxIndex]);
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
- const v = Math.abs(velocity.current);
262
- const velocityFactor = Math.min(v * 250, 0.65);
263
- const dynamicThreshold = Math.max(threshold, Math.min(dragThreshold * (1 - velocityFactor), dragThreshold));
264
- let nextIndex = index;
265
- if (Math.abs(delta) > dynamicThreshold) {
266
- nextIndex = delta < 0 ? index + 1 : index - 1;
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
- }, [threshold, dragThreshold, index, maxIndex, snap, infinite, total, offset]);
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 startAutoplay = React.useCallback(() => {
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
- autoplayTimer.current = setInterval(() => {
299
- if (!isDragging && !isAnimating.current && mounted.current) {
300
- next();
409
+ return undefined;
410
+ const timer = setInterval(() => {
411
+ if (!dragging.current && !isAnimating.current && mounted.current) {
412
+ autoplayStep.current();
301
413
  }
302
414
  }, autoplayInterval);
303
- }, [autoplay, autoplayInterval, isDragging, isPaused, next]);
304
- const pause = React.useCallback(() => {
305
- setIsPaused(true);
306
- if (autoplayTimer.current) {
307
- clearInterval(autoplayTimer.current);
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 = () => pause();
322
- const handleMouseLeave = () => resume();
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, pause, resume]);
330
- // #region Autoplay Effect
331
- React.useEffect(() => {
332
- if (autoplay) {
333
- startAutoplay();
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
- return () => {
336
- if (autoplayTimer.current) {
337
- clearInterval(autoplayTimer.current);
338
- autoplayTimer.current = undefined;
339
- }
340
- };
341
- }, [autoplay, startAutoplay, isPaused]);
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
- return (React.createElement(overridesMap.Container, Object.assign({}, restProps),
402
- React.createElement(overridesMap.Wrapper, { ref: wrapperRef, draggable: draggable, slidesPerView: slidesPerView, onPointerDown: onPointerDown, onPointerMove: onPointerMove, onPointerUp: onPointerUp, onLostPointerCapture: onLostPointerCapture },
403
- React.createElement(overridesMap.Track, { ref: trackRef, dragging: isDragging, index: index, offset: offset, disableAnimation: disableAnimation, slidesPerView: slidesPerView },
404
- React.createElement(SwiperSlidesRenderer_1.default, { slides: slides, slidesPerView: slidesPerView, realIndex: realIndex, realSlidesCount: realSlidesCount, getSlideRealIndex: getSlideRealIndex })))));
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;
@@ -7,8 +7,6 @@ exports.SwiperContainer = void 0;
7
7
  const styled_1 = __importDefault(require("@emotion/styled"));
8
8
  exports.SwiperContainer = styled_1.default.div `
9
9
  width: 100%;
10
- max-width: 1200px;
11
- margin: 0 auto;
12
10
  overflow: hidden;
13
11
  position: relative;
14
12
  `;
@@ -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 <= slidesPerView) {
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 < slidesPerView; j++) {
40
- visibleIndices.push((realIndex + j) % realSlidesCount);
40
+ for (let j = 0; j < visibleCount; j++) {
41
+ visibleIndices.push((firstVisibleIndex + j) % realSlidesCount);
41
42
  }
42
- const prevIndex = (realIndex - 1 + realSlidesCount) % realSlidesCount;
43
- const nextIndex = (realIndex + slidesPerView) % realSlidesCount;
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, slidesPerView, realIndex, realSlidesCount, getSlideRealIndex]);
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
- if (slide.props.slidesPerView === slidesPerView &&
61
- slide.props.isVisible === isVisible &&
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
  });
@@ -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;
@@ -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 }) => $dragging || $disableAnimation ? 'none' : 'transform 0.3s ease'};
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;
@@ -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
- const { children, draggable } = props, restProps = __rest(props, ["children", "draggable"]);
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';