@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
@@ -39,23 +39,23 @@ const StyledAccordionContainer = styled_1.default.div `
39
39
  ? theme.color.backgroundSecondary.lighten(80).alpha(0.12).toString()
40
40
  : theme.color.backgroundSecondary.lighten(50).alpha(0.12).toString()}
41
41
  0px 1px 3px 0px;
42
- margin-top: 1px;
43
42
 
44
- &:has(+ div[class*='StyledAccordionContainer']) {
45
- border-radius: ${({ theme }) => theme.shape.radiusFactor}em
46
- ${({ theme }) => theme.shape.radiusFactor}em 0 0;
43
+ /*
44
+ * Adjacent accordions form a group: the inner corners are square.
45
+ * Data attributes, not class names: emotion labels are absent in the published package
46
+ */
47
+ &:has(+ [data-accordion]) {
48
+ border-bottom-left-radius: 0;
49
+ border-bottom-right-radius: 0;
47
50
  }
48
51
 
49
- & + div[class*='StyledAccordionContainer'] {
50
- border-radius: 0 0 0 0;
51
- }
52
- &:not(:has(+ div[class*='StyledAccordionContainer'])) {
53
- border-radius: 0 0 ${({ theme }) => theme.shape.radiusFactor}em
54
- ${({ theme }) => theme.shape.radiusFactor}em;
52
+ [data-accordion] + & {
53
+ border-top-left-radius: 0;
54
+ border-top-right-radius: 0;
55
55
  }
56
56
  `;
57
57
  const AccordionContainer = (props, ref) => {
58
58
  const { inline, children } = props, nativeProps = __rest(props, ["inline", "children"]);
59
- return (react_1.default.createElement(StyledAccordionContainer, Object.assign({ "$inline": inline }, nativeProps, { ref: ref }), children));
59
+ return (react_1.default.createElement(StyledAccordionContainer, Object.assign({ "data-accordion": "", "$inline": inline }, nativeProps, { ref: ref }), children));
60
60
  };
61
61
  exports.default = react_1.default.forwardRef(AccordionContainer);
@@ -16,12 +16,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  const react_1 = __importDefault(require("react"));
18
18
  const styled_1 = __importDefault(require("@emotion/styled"));
19
+ /**
20
+ * Animates the height with grid rows 0fr -> 1fr: no fixed max-height, so the tall content is not cut.
21
+ * `visibility: hidden` of the collapsed content removes it from the tab order and the accessibility tree
22
+ */
19
23
  const StyledAccordionContent = styled_1.default.div `
20
- flex: 1;
21
- overflow: auto;
22
- transition: all 0.3s ease-out;
23
- max-height: ${({ $isOpen }) => (!$isOpen ? '0px' : '90vh')};
24
- box-sizing: content-box;
24
+ display: grid;
25
+ grid-template-rows: ${({ $isOpen }) => ($isOpen ? '1fr' : '0fr')};
26
+ visibility: ${({ $isOpen }) => ($isOpen ? 'visible' : 'hidden')};
27
+ transition:
28
+ grid-template-rows 0.3s ease-out,
29
+ visibility 0s linear ${({ $isOpen }) => ($isOpen ? '0s' : '0.3s')};
30
+ `;
31
+ const Clip = styled_1.default.div `
32
+ min-height: 0;
25
33
  overflow: hidden;
26
34
  `;
27
35
  const Wrapper = styled_1.default.div `
@@ -29,7 +37,8 @@ const Wrapper = styled_1.default.div `
29
37
  `;
30
38
  const AccordionContent = (props, ref) => {
31
39
  const { children, noPadding, isOpen } = props, nativeProps = __rest(props, ["children", "noPadding", "isOpen"]);
32
- return (react_1.default.createElement(StyledAccordionContent, Object.assign({ "$isOpen": isOpen }, nativeProps, { ref: ref }),
33
- react_1.default.createElement(Wrapper, { "$noPadding": Boolean(noPadding) }, children)));
40
+ return (react_1.default.createElement(StyledAccordionContent, Object.assign({ role: "region" }, nativeProps, { "$isOpen": isOpen, ref: ref }),
41
+ react_1.default.createElement(Clip, null,
42
+ react_1.default.createElement(Wrapper, { "$noPadding": Boolean(noPadding) }, children))));
34
43
  };
35
44
  exports.default = react_1.default.forwardRef(AccordionContent);
@@ -1,10 +1,32 @@
1
1
  import React from 'react';
2
2
  export type AccordionHeaderProps = React.HTMLAttributes<HTMLDivElement> & {
3
3
  readonly isOpen: boolean;
4
+ /**
5
+ * Toggles the accordion
6
+ */
4
7
  readonly onOpen: () => void;
8
+ /**
9
+ * The id of the header button (the content is labelled by it)
10
+ */
11
+ readonly headerID?: string;
12
+ /**
13
+ * The id of the content (the header button controls it)
14
+ */
15
+ readonly contentID?: string;
5
16
  };
6
17
  declare const _default: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & {
7
18
  readonly isOpen: boolean;
19
+ /**
20
+ * Toggles the accordion
21
+ */
8
22
  readonly onOpen: () => void;
23
+ /**
24
+ * The id of the header button (the content is labelled by it)
25
+ */
26
+ readonly headerID?: string | undefined;
27
+ /**
28
+ * The id of the content (the header button controls it)
29
+ */
30
+ readonly contentID?: string | undefined;
9
31
  } & React.RefAttributes<HTMLDivElement>>;
10
32
  export default _default;
@@ -16,38 +16,55 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  const react_1 = __importDefault(require("react"));
18
18
  const styled_1 = __importDefault(require("@emotion/styled"));
19
- const Button_1 = __importDefault(require("../Button"));
20
19
  const Chevron_1 = __importDefault(require("./Chevron"));
21
20
  const StyledHeader = styled_1.default.div `
22
- padding: 1rem 1rem 1rem 1rem;
23
21
  font-size: 1.3rem;
24
22
  font-weight: 600;
25
23
  border-top-left-radius: inherit;
26
24
  border-top-right-radius: inherit;
25
+ `;
26
+ /**
27
+ * The whole header is the button: it is clickable, focusable and announced as expanded/collapsed
28
+ */
29
+ const HeaderButton = styled_1.default.button `
27
30
  display: flex;
28
- cursor: pointer;
29
31
  flex-direction: row;
30
32
  flex-wrap: nowrap;
31
33
  align-items: center;
34
+ gap: 1rem;
35
+ width: 100%;
36
+ margin: 0;
37
+ padding: 1rem;
38
+ border: 0;
39
+ border-radius: inherit;
40
+ background: none;
41
+ color: inherit;
42
+ font: inherit;
43
+ text-align: start;
44
+ cursor: pointer;
45
+
46
+ &:focus-visible {
47
+ outline: 0.1em solid ${({ theme }) => theme.color.accentPrimary.toString()};
48
+ outline-offset: -0.1em;
49
+ }
50
+ `;
51
+ const HeaderCell = styled_1.default.span `
52
+ flex: 1;
53
+ display: flex;
54
+ align-items: center;
55
+ gap: 0.5em;
32
56
  `;
33
57
  const StyledChevron = (0, styled_1.default)(Chevron_1.default, { shouldForwardProp: p => p[0] !== '$' }) `
58
+ flex-shrink: 0;
59
+ color: ${({ theme }) => theme.color.accentSecondary.toString()};
34
60
  transform: ${({ $isOpen }) => (!$isOpen ? 'rotate(180deg)' : 'rotate(0)')};
35
- transition: all 0.3s ease-out;
36
- `;
37
- const StyledButton = (0, styled_1.default)(Button_1.default) `
38
- width: 1rem;
39
- height: 1rem;
40
- `;
41
- const HeaderCell = styled_1.default.div `
42
- flex: 1;
61
+ transition: transform 0.3s ease-out;
43
62
  `;
44
- const Actions = styled_1.default.div ``;
45
63
  const AccordionHeader = (props, ref) => {
46
- const { children, isOpen, onOpen } = props, nativeProps = __rest(props, ["children", "isOpen", "onOpen"]);
47
- return (react_1.default.createElement(StyledHeader, Object.assign({}, nativeProps, { ref: ref, onClick: () => onOpen() }),
48
- react_1.default.createElement(HeaderCell, null, children),
49
- react_1.default.createElement(Actions, null,
50
- react_1.default.createElement(StyledButton, { iconOnly: true, onClick: () => onOpen() },
51
- react_1.default.createElement(StyledChevron, { "$isOpen": isOpen })))));
64
+ const { children, isOpen, onOpen, headerID, contentID } = props, nativeProps = __rest(props, ["children", "isOpen", "onOpen", "headerID", "contentID"]);
65
+ return (react_1.default.createElement(StyledHeader, Object.assign({}, nativeProps, { ref: ref }),
66
+ react_1.default.createElement(HeaderButton, { type: "button", id: headerID, "aria-expanded": isOpen, "aria-controls": contentID, onClick: () => onOpen() },
67
+ react_1.default.createElement(HeaderCell, null, children),
68
+ react_1.default.createElement(StyledChevron, { "$isOpen": isOpen }))));
52
69
  };
53
70
  exports.default = react_1.default.forwardRef(AccordionHeader);
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
7
  const styled_1 = __importDefault(require("@emotion/styled"));
8
8
  const Path = styled_1.default.path `
9
- fill: ${({ theme }) => theme.color.accentSecondary.toString()};
9
+ fill: currentColor;
10
10
  `;
11
- const Spinner = (props, ref) => (react_1.default.createElement("svg", Object.assign({ xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24" }, props, { ref: ref }),
11
+ const Chevron = (props, ref) => (react_1.default.createElement("svg", Object.assign({ xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", "aria-hidden": true }, props, { ref: ref }),
12
12
  react_1.default.createElement(Path, { d: "M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z" })));
13
- exports.default = react_1.default.forwardRef(Spinner);
13
+ exports.default = react_1.default.forwardRef(Chevron);
@@ -18,17 +18,19 @@ export type AccordionProps = React.HTMLAttributes<HTMLDivElement> & {
18
18
  */
19
19
  readonly overrides?: AccordionOverrides;
20
20
  /**
21
- * This props ovveride default component open state
21
+ * The state of the controlled accordion. Pass it together with `onOpen`
22
22
  */
23
23
  readonly isOpen?: boolean;
24
24
  /**
25
- * If `true` accordion will be opened by default
25
+ * The initial state of the uncontrolled accordion
26
+ * Default: false
26
27
  */
27
28
  readonly defaultOpened?: boolean;
28
29
  /**
29
- * Callback function witch should open the accordion. You can forward your own function to make accordion controlled
30
+ * Called when the user clicks the header, both to open and to close the accordion.\
31
+ * Receives the next state: `true` - should be opened, `false` - should be closed
30
32
  */
31
- readonly onOpen?: () => void;
33
+ readonly onOpen?: (isOpen: boolean) => void;
32
34
  /**
33
35
  * If `true` initial padding of accorion content would be disabled
34
36
  */
@@ -67,17 +69,19 @@ declare const _default: React.ForwardRefExoticComponent<React.HTMLAttributes<HTM
67
69
  */
68
70
  readonly overrides?: AccordionOverrides | undefined;
69
71
  /**
70
- * This props ovveride default component open state
72
+ * The state of the controlled accordion. Pass it together with `onOpen`
71
73
  */
72
74
  readonly isOpen?: boolean | undefined;
73
75
  /**
74
- * If `true` accordion will be opened by default
76
+ * The initial state of the uncontrolled accordion
77
+ * Default: false
75
78
  */
76
79
  readonly defaultOpened?: boolean | undefined;
77
80
  /**
78
- * Callback function witch should open the accordion. You can forward your own function to make accordion controlled
81
+ * Called when the user clicks the header, both to open and to close the accordion.\
82
+ * Receives the next state: `true` - should be opened, `false` - should be closed
79
83
  */
80
- readonly onOpen?: (() => void) | undefined;
84
+ readonly onOpen?: ((isOpen: boolean) => void) | undefined;
81
85
  /**
82
86
  * If `true` initial padding of accorion content would be disabled
83
87
  */
@@ -46,19 +46,34 @@ const Accordion = (props, ref) => {
46
46
  const { children, header, actions, isOpen, onOpen, overrides, noPadding, defaultOpened } = props, nativeProps = __rest(props, ["children", "header", "actions", "isOpen", "onOpen", "overrides", "noPadding", "defaultOpened"]);
47
47
  const hasActions = typeof actions !== 'undefined' && actions !== null;
48
48
  const hasHeader = typeof header !== 'undefined' && header !== null;
49
- const [opened, setOpened] = React.useState(typeof defaultOpened !== 'undefined' ? defaultOpened : false);
49
+ const [internalOpened, setInternalOpened] = React.useState(Boolean(defaultOpened));
50
+ const isControlled = typeof isOpen !== 'undefined';
51
+ const opened = isControlled ? Boolean(isOpen) : internalOpened;
52
+ const id = React.useId().replace(/:/g, '');
53
+ const headerID = `accordion-${id}-header`;
54
+ const contentID = `accordion-${id}-content`;
50
55
  const overridesMap = React.useMemo(() => ({
51
56
  Container: (overrides === null || overrides === void 0 ? void 0 : overrides.Container) || AccordionContainer_1.default,
52
57
  Header: (overrides === null || overrides === void 0 ? void 0 : overrides.Header) || AccordionHeader_1.default,
53
58
  Content: (overrides === null || overrides === void 0 ? void 0 : overrides.Content) || AccordionContent_1.default,
54
59
  Actions: (overrides === null || overrides === void 0 ? void 0 : overrides.Actions) || AccordionActions_1.default,
55
60
  }), [overrides]);
56
- if (!hasHeader) {
57
- console.warn(`[@via-profit/ui-kit] Accordion component. If you use a subheader, then you should add a header`);
58
- }
61
+ // Warn once, not on every render
62
+ React.useEffect(() => {
63
+ if (!hasHeader) {
64
+ console.warn('[@via-profit/ui-kit] Accordion component. The accordion without the «header» can not be opened by the user');
65
+ }
66
+ }, [hasHeader]);
67
+ // In the uncontrolled mode the own state is updated even when onOpen is passed
68
+ const handleToggle = () => {
69
+ if (!isControlled) {
70
+ setInternalOpened(!opened);
71
+ }
72
+ onOpen === null || onOpen === void 0 ? void 0 : onOpen(!opened);
73
+ };
59
74
  return (React.createElement(overridesMap.Container, Object.assign({}, nativeProps, { ref: ref }),
60
- hasHeader && (React.createElement(overridesMap.Header, { isOpen: typeof isOpen !== 'undefined' ? isOpen : opened, onOpen: onOpen ? onOpen : () => setOpened(typeof isOpen !== 'undefined' ? !isOpen : !opened) }, header)),
61
- React.createElement(overridesMap.Content, { noPadding: noPadding, isOpen: typeof isOpen !== 'undefined' ? isOpen : opened },
75
+ hasHeader && (React.createElement(overridesMap.Header, { isOpen: opened, onOpen: handleToggle, headerID: headerID, contentID: contentID }, header)),
76
+ React.createElement(overridesMap.Content, { id: contentID, "aria-labelledby": hasHeader ? headerID : undefined, noPadding: noPadding, isOpen: opened },
62
77
  children,
63
78
  hasActions && React.createElement(overridesMap.Actions, { noPadding: noPadding }, actions))));
64
79
  };
@@ -15,14 +15,10 @@ export interface AutocompleteProps<T, Multiple extends boolean | undefined = und
15
15
  * If `true` then menu is open, otherwise - closed
16
16
  */
17
17
  readonly isOpen?: boolean;
18
- /**
19
- * Loading indicator visibility\
20
- * If `true` then visible, otherwise - hidden
21
- */
22
18
  /**
23
19
  * Anchor position\
24
20
  * \
25
- * Default: `bottom`
21
+ * Default: `bottom-fill`
26
22
  */
27
23
  readonly anchorPos?: AnchorPos;
28
24
  /**
@@ -50,8 +46,7 @@ export interface AutocompleteProps<T, Multiple extends boolean | undefined = und
50
46
  * Used to prevent the popper from being positioned too close to the screen boundaries.
51
47
  * The popper will try to flip to another placement if it cannot maintain this margin.
52
48
  *
53
- * **Default**: `8`
54
- * ```
49
+ * **Default**: `30`
55
50
  */
56
51
  readonly viewportMargin?: number;
57
52
  /**
@@ -97,7 +92,8 @@ export interface AutocompleteProps<T, Multiple extends boolean | undefined = und
97
92
  */
98
93
  readonly onChange?: OnChange<T, Multiple>;
99
94
  /**
100
- * A function that transforms the selected item into a string
95
+ * A function that transforms the selected item into a string.\
96
+ * With `multiple` it is called for every selected item to get the label of its tag
101
97
  * Example:
102
98
  * ```tsx
103
99
  * <Autocomplete
@@ -146,7 +142,7 @@ export type Children<T> = (data: {
146
142
  index: number;
147
143
  inputValue: string;
148
144
  }, itemProps: MenuItemProps) => React.ReactNode;
149
- export type ItemToString<T, Multiple extends boolean | undefined = undefined> = (item: Multiple extends undefined ? T : readonly T[]) => string;
145
+ export type ItemToString<T, Multiple extends boolean | undefined = undefined> = (item: T) => string;
150
146
  export type OnChange<T, Multiple extends boolean | undefined = undefined> = (item: Value<T, Multiple>) => void;
151
147
  export type FilterItems<T> = (items: readonly T[], data: {
152
148
  readonly query: string;
@@ -1,4 +1,27 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __rest = (this && this.__rest) || function (s, e) {
3
26
  var t = {};
4
27
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
@@ -17,11 +40,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
40
  const react_1 = __importDefault(require("react"));
18
41
  const TextField_1 = __importDefault(require("../TextField"));
19
42
  const Button_1 = __importDefault(require("../Button"));
20
- const LoadingIndicator_1 = require("../LoadingIndicator");
43
+ const Spinner_1 = __importDefault(require("../LoadingIndicator/Spinner"));
21
44
  const context_1 = require("./context");
22
45
  const IconClear_1 = __importDefault(require("./IconClear"));
46
+ const AutocompleteTagsInput_1 = __importStar(require("./AutocompleteTagsInput"));
23
47
  const ClickOutside_1 = require("../ClickOutside");
24
- const Menu_1 = __importDefault(require("../Menu"));
48
+ const Menu_1 = __importStar(require("../Menu"));
49
+ // Module level, so the input keeps its identity between renders and does not lose the focus
50
+ const MULTIPLE_TEXT_FIELD_OVERRIDES = { Input: AutocompleteTagsInput_1.default };
51
+ // The list must not take the focus on a click: the user keeps typing in the field
52
+ const AutocompleteMenuList = react_1.default.forwardRef((props, ref) => (react_1.default.createElement(Menu_1.MenuList, Object.assign({}, props, { onMouseDown: event => {
53
+ var _a;
54
+ event.preventDefault();
55
+ (_a = props.onMouseDown) === null || _a === void 0 ? void 0 : _a.call(props, event);
56
+ }, ref: ref }))));
57
+ AutocompleteMenuList.displayName = 'AutocompleteMenuList';
58
+ const MENU_OVERRIDES = { List: AutocompleteMenuList };
25
59
  const Autocomplete = react_1.default.forwardRef((props, ref) => {
26
60
  const { items, value, multiple, isOpen = false, isLoading = false, clearOnBlur = true, anchorPos = 'bottom-fill', alternativePlacements = ['bottom-fill', 'top-fill'], openOnFocus = true, autoFlip = true, viewportMargin, positionStrategy, requiredAsterisk, startIcon, fullWidth, placeholder, label, error, errorText, inputRef, filterItems, children, onChange, selectedItemToString, clearable = true, onInputChange, getOptionSelected, onRequestOpen = () => undefined, onRequestClose = () => undefined, overrides } = props, nativeInputProps = __rest(props, ["items", "value", "multiple", "isOpen", "isLoading", "clearOnBlur", "anchorPos", "alternativePlacements", "openOnFocus", "autoFlip", "viewportMargin", "positionStrategy", "requiredAsterisk", "startIcon", "fullWidth", "placeholder", "label", "error", "errorText", "inputRef", "filterItems", "children", "onChange", "selectedItemToString", "clearable", "onInputChange", "getOptionSelected", "onRequestOpen", "onRequestClose", "overrides"]);
27
61
  const menuRef = react_1.default.useRef(null);
@@ -52,6 +86,25 @@ const Autocomplete = react_1.default.forwardRef((props, ref) => {
52
86
  react_1.default.useImperativeHandle(ref, () => ({
53
87
  clear: () => clear(),
54
88
  }), [clear]);
89
+ const applyFilterForItems = react_1.default.useCallback((inputValue, itemList) => {
90
+ const query = inputValue.toLowerCase().trim();
91
+ // Apply filter
92
+ return typeof filterItems !== 'function' || query.length === 0
93
+ ? itemList
94
+ : filterItems(itemList, { query, inputValue });
95
+ }, [filterItems]);
96
+ /**
97
+ * Restore the input text from the current value (used by clearOnBlur)
98
+ */
99
+ const restoreInputValue = react_1.default.useCallback(() => {
100
+ // With multiple the field holds only the search text, the selected items are tags
101
+ const newInputValue = multiple || currentValue === null ? '' : selectedItemToString(currentValue);
102
+ const newFilteredItems = applyFilterForItems(newInputValue, items);
103
+ dispatch((0, context_1.actionSetPartial)({
104
+ filteredItems: newFilteredItems,
105
+ inputValue: newInputValue,
106
+ }));
107
+ }, [currentValue, selectedItemToString, multiple, applyFilterForItems, items, dispatch]);
55
108
  const inputKeydownEvent = react_1.default.useCallback((event) => {
56
109
  var _a, _b, _c, _d, _e;
57
110
  if (!isFocusedRef.current) {
@@ -98,8 +151,25 @@ const Autocomplete = react_1.default.forwardRef((props, ref) => {
98
151
  // case 'PageDown':
99
152
  // event.preventDefault();
100
153
  // break;
101
- case 'Escape':
154
+ case 'Backspace':
155
+ // An empty field with tags: Backspace removes the last tag
156
+ if (multiple && event.currentTarget.value === '' && Array.isArray(currentValue)) {
157
+ if (currentValue.length > 0 && typeof onChange === 'function') {
158
+ event.preventDefault();
159
+ onChange(currentValue.slice(0, -1));
160
+ }
161
+ }
162
+ break;
102
163
  case 'Tab':
164
+ // Focus leaves the field, so clearOnBlur applies as for the outside click
165
+ if (clearOnBlur) {
166
+ restoreInputValue();
167
+ }
168
+ if (currentOpen) {
169
+ onRequestClose(event);
170
+ }
171
+ break;
172
+ case 'Escape':
103
173
  if (currentOpen) {
104
174
  onRequestClose(event);
105
175
  }
@@ -108,14 +178,17 @@ const Autocomplete = react_1.default.forwardRef((props, ref) => {
108
178
  // do nothing
109
179
  break;
110
180
  }
111
- }, [currentOpen, onRequestClose, onRequestOpen, filteredItems.length]);
112
- const applyFilterForItems = react_1.default.useCallback((inputValue, itemList) => {
113
- const query = inputValue.toLowerCase().trim();
114
- // Apply filter
115
- return typeof filterItems !== 'function' || query.length === 0
116
- ? itemList
117
- : filterItems(itemList, { query, inputValue });
118
- }, [filterItems]);
181
+ }, [
182
+ currentOpen,
183
+ onRequestClose,
184
+ onRequestOpen,
185
+ filteredItems.length,
186
+ clearOnBlur,
187
+ restoreInputValue,
188
+ multiple,
189
+ currentValue,
190
+ onChange,
191
+ ]);
119
192
  const renderChildren = react_1.default.useCallback(({ index, item }, itemProps) => children({ index, item: item, inputValue }, itemProps), [children, inputValue]);
120
193
  /**
121
194
  * Only affected value change action
@@ -124,12 +197,13 @@ const Autocomplete = react_1.default.forwardRef((props, ref) => {
124
197
  if (value === currentValue) {
125
198
  return;
126
199
  }
127
- dispatch((0, context_1.actionSetPartial)({
128
- currentValue: value,
129
- inputValue: value === null
130
- ? ''
131
- : selectedItemToString(value),
132
- }));
200
+ // With multiple the selected items are shown as tags and the search text is kept
201
+ dispatch((0, context_1.actionSetPartial)(multiple
202
+ ? { currentValue: value }
203
+ : {
204
+ currentValue: value,
205
+ inputValue: value === null ? '' : selectedItemToString(value),
206
+ }));
133
207
  }, [value, multiple, currentValue, inputValue, dispatch, selectedItemToString]);
134
208
  react_1.default.useEffect(() => {
135
209
  if (currentOpen && menuRef.current) {
@@ -175,19 +249,11 @@ const Autocomplete = react_1.default.forwardRef((props, ref) => {
175
249
  }
176
250
  parentElem = parentElem.parentNode;
177
251
  }
178
- // Click outside
179
- if (needToClose && currentOpen) {
252
+ // Click outside. The menu can be already closed (no matches, Escape),
253
+ // but the user still leaves the field with an unfinished text
254
+ if (needToClose && (currentOpen || isFocusedRef.current)) {
180
255
  if (clearOnBlur) {
181
- const newInputValue = currentValue === null
182
- ? ''
183
- : selectedItemToString(currentValue);
184
- const newFilteredItems = multiple
185
- ? filteredItems
186
- : applyFilterForItems(newInputValue, items);
187
- dispatch((0, context_1.actionSetPartial)({
188
- filteredItems: newFilteredItems,
189
- inputValue: newInputValue,
190
- }));
256
+ restoreInputValue();
191
257
  }
192
258
  if (isOpen) {
193
259
  onRequestClose(event);
@@ -198,31 +264,12 @@ const Autocomplete = react_1.default.forwardRef((props, ref) => {
198
264
  return () => {
199
265
  window.document.removeEventListener(ClickOutside_1.mouseEventMap.onMouseDown, mouseDownEvent);
200
266
  };
201
- }, [
202
- onRequestClose,
203
- anchorElement,
204
- filteredItems,
205
- items,
206
- isOpen,
207
- clearOnBlur,
208
- currentOpen,
209
- dispatch,
210
- value,
211
- selectedItemToString,
212
- currentValue,
213
- applyFilterForItems,
214
- inputValue,
215
- multiple,
216
- ]);
267
+ }, [onRequestClose, anchorElement, isOpen, clearOnBlur, currentOpen, restoreInputValue]);
217
268
  const onSelectMenuItem = react_1.default.useCallback(item => {
218
- if (!multiple) {
219
- dispatch({
220
- type: 'setPartial',
221
- payload: {
222
- filteredItems: applyFilterForItems(selectedItemToString(item), items),
223
- },
224
- });
225
- }
269
+ dispatch((0, context_1.actionSetPartial)(multiple
270
+ ? // The search text is done, the whole list is shown again for the next choice
271
+ { inputValue: '', filteredItems: applyFilterForItems('', items) }
272
+ : { filteredItems: applyFilterForItems(selectedItemToString(item), items) }));
226
273
  if (typeof onChange === 'function') {
227
274
  onChange(item);
228
275
  }
@@ -230,7 +277,7 @@ const Autocomplete = react_1.default.forwardRef((props, ref) => {
230
277
  const endIconMemo = react_1.default.useMemo(() => {
231
278
  if (currentLoading) {
232
279
  return (react_1.default.createElement(Button_1.default, { iconOnly: true, type: "button", variant: "plain", disabled: true },
233
- react_1.default.createElement(LoadingIndicator_1.StaticLoadingIndicator, null)));
280
+ react_1.default.createElement(Spinner_1.default, { size: "1.2em" })));
234
281
  }
235
282
  if (!clearable) {
236
283
  return undefined;
@@ -307,6 +354,24 @@ const Autocomplete = react_1.default.forwardRef((props, ref) => {
307
354
  dispatch((0, context_1.actionSetPartial)({ anchorElement: el }));
308
355
  }
309
356
  }, [anchorElement, dispatch]);
357
+ const tags = react_1.default.useMemo(() => {
358
+ if (!multiple || !Array.isArray(currentValue)) {
359
+ return [];
360
+ }
361
+ const selected = currentValue;
362
+ return selected.map((item, index) => {
363
+ const tagLabel = selectedItemToString(item);
364
+ return {
365
+ key: `${index}:${tagLabel}`,
366
+ label: tagLabel,
367
+ onDelete: () => {
368
+ if (typeof onChange === 'function') {
369
+ onChange(selected.filter((_, i) => i !== index));
370
+ }
371
+ },
372
+ };
373
+ });
374
+ }, [multiple, currentValue, selectedItemToString, onChange]);
310
375
  const inputRefRef = react_1.default.useRef(inputRef);
311
376
  react_1.default.useEffect(() => {
312
377
  inputRefRef.current = inputRef;
@@ -321,11 +386,14 @@ const Autocomplete = react_1.default.forwardRef((props, ref) => {
321
386
  currentInputRef.current = el;
322
387
  }
323
388
  }, []);
324
- return (react_1.default.createElement(react_1.default.Fragment, null,
325
- react_1.default.useMemo(() => (react_1.default.createElement(overridesMap.TextField, Object.assign({ placeholder: placeholder, label: label, error: error, requiredAsterisk: requiredAsterisk, errorText: errorText, fullWidth: fullWidth, startIcon: startIcon, endIcon: endIconMemo }, nativeInputProps, { onKeyDown: textFieldOnKeyDown, ref: setAnchorElementRef, inputRef: setInputElementRef, value: inputValue, onBlur: textFieldBlur, onFocus: textFieldFocus, onClick: textFieldClick, onChange: textFieldOnChange }))), [
389
+ return (react_1.default.createElement(AutocompleteTagsInput_1.AutocompleteTagsContext.Provider, { value: tags },
390
+ react_1.default.useMemo(() => (react_1.default.createElement(overridesMap.TextField, Object.assign({ overrides: multiple ? MULTIPLE_TEXT_FIELD_OVERRIDES : undefined, placeholder: placeholder, label: label, error: error, requiredAsterisk: requiredAsterisk, errorText: errorText, fullWidth: fullWidth, startIcon: startIcon, endIcon: endIconMemo,
391
+ // The browser suggestions would be shown over the menu; can be overridden by the props
392
+ autoComplete: "off" }, nativeInputProps, { onKeyDown: textFieldOnKeyDown, ref: setAnchorElementRef, inputRef: setInputElementRef, value: inputValue, onBlur: textFieldBlur, onFocus: textFieldFocus, onClick: textFieldClick, onChange: textFieldOnChange }))), [
326
393
  setAnchorElementRef,
327
394
  setInputElementRef,
328
395
  overridesMap,
396
+ multiple,
329
397
  placeholder,
330
398
  label,
331
399
  error,
@@ -342,7 +410,7 @@ const Autocomplete = react_1.default.forwardRef((props, ref) => {
342
410
  textFieldClick,
343
411
  textFieldOnChange,
344
412
  ]),
345
- react_1.default.useMemo(() => (react_1.default.createElement(Menu_1.default, { ref: menuRef, anchorPos: anchorPos, alternativePlacements: alternativePlacements, multiple: multiple, items: filteredItems, value: currentValue, isOpen: currentOpen, autofocus: false, autoFlip: autoFlip, viewportMargin: viewportMargin, offset: 0, positionStrategy: positionStrategy, anchorElement: anchorElement, closeOutsideClick: false, getOptionSelected: getOptionSelected, onRequestClose: onRequestClose, closeOnSelect: !multiple, onSelectItem: onSelectMenuItem }, renderChildren)), [
413
+ react_1.default.useMemo(() => (react_1.default.createElement(Menu_1.default, { ref: menuRef, overrides: MENU_OVERRIDES, anchorPos: anchorPos, alternativePlacements: alternativePlacements, multiple: multiple, items: filteredItems, value: currentValue, isOpen: currentOpen, autofocus: false, autoFlip: autoFlip, viewportMargin: viewportMargin, offset: 0, positionStrategy: positionStrategy, anchorElement: anchorElement, closeOutsideClick: false, getOptionSelected: getOptionSelected, onRequestClose: onRequestClose, closeOnSelect: !multiple, onSelectItem: onSelectMenuItem }, renderChildren)), [
346
414
  anchorPos,
347
415
  alternativePlacements,
348
416
  multiple,
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { TextFieldInputProps } from '../TextField/TextFieldInput';
3
+ export type AutocompleteTag = {
4
+ readonly key: React.Key;
5
+ readonly label: string;
6
+ readonly onDelete: () => void;
7
+ };
8
+ /**
9
+ * Selected items of the multiple <Autocomplete>.
10
+ * The input override must keep its identity between renders (otherwise the input is remounted
11
+ * and loses the focus), so the tags are passed through the context instead of the props
12
+ */
13
+ export declare const AutocompleteTagsContext: React.Context<readonly AutocompleteTag[]>;
14
+ declare const AutocompleteTagsInput: React.ForwardRefExoticComponent<TextFieldInputProps & React.RefAttributes<HTMLInputElement>>;
15
+ export default AutocompleteTagsInput;