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